From 9c6cdb39e81bdbd9897cdc6f6d8fea5dfeb9615d Mon Sep 17 00:00:00 2001 From: Dylan Nelson Date: Mon, 20 Oct 2025 14:26:52 -0400 Subject: [PATCH 1/4] Fix CSS var & tweak theme --- dist/bundle.js | 4 +- dist/main.css | 4 +- docs/bundle.js | 219 +++++++++++++++++++++++++++++-------------- docs/main.css | 8 +- src/ToolbarPlugin.ts | 1 - src/styles.css | 6 +- 6 files changed, 160 insertions(+), 82 deletions(-) diff --git a/dist/bundle.js b/dist/bundle.js index 8fe91b1..f4ba3c1 100644 --- a/dist/bundle.js +++ b/dist/bundle.js @@ -1,2 +1,2 @@ -(()=>{var e={92:e=>{self,e.exports=(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n,r,i,o;var s;e.d(t,{default:()=>S}),function(e){e.SetSize="set-size",e.StreamItems="stream-items",e.StreamContextItem="stream-context-item",e.SaveItems="save-items",e.SelectItem="select-item",e.AssociateItem="associate-item",e.DeassociateItem="deassociate-item",e.ClearSelection="clear-selection",e.CreateItem="create-item",e.CreateItems="create-items",e.DeleteItems="delete-items",e.SetComponentData="set-component-data",e.InstallLocalComponent="install-local-component",e.ToggleActivateComponent="toggle-activate-component",e.RequestPermissions="request-permissions",e.PresentConflictResolution="present-conflict-resolution",e.DuplicateItem="duplicate-item",e.ComponentRegistered="component-registered",e.ActivateThemes="themes",e.Reply="reply",e.SaveSuccess="save-success",e.SaveError="save-error",e.ThemesActivated="themes-activated",e.KeyDown="key-down",e.KeyUp="key-up",e.Click="click"}(n||(n={})),function(e){e[e.Web=1]="Web",e[e.Desktop=2]="Desktop",e[e.Mobile=3]="Mobile"}(r||(r={})),function(e){e.Any="*",e.Item="SF|Item",e.RootKey="SN|RootKey|NoSync",e.ItemsKey="SN|ItemsKey",e.EncryptedStorage="SN|EncryptedStorage",e.Note="Note",e.Tag="Tag",e.SmartTag="SN|SmartTag",e.Component="SN|Component",e.Editor="SN|Editor",e.ActionsExtension="Extension",e.UserPrefs="SN|UserPreferences",e.HistorySession="SN|HistorySession",e.Theme="SN|Theme",e.Mfa="SF|MFA",e.ServerExtension="SF|Extension",e.FilesafeCredentials="SN|FileSafe|Credentials",e.FilesafeFileMetadata="SN|FileSafe|FileMetadata",e.FilesafeIntegration="SN|FileSafe|Integration",e.ExtensionRepo="SN|ExtensionRepo"}(i||(i={})),function(e){e.Pinned="pinned",e.Archived="archived",e.Locked="locked",e.UserModifiedDate="client_updated_at",e.DefaultEditor="defaultEditor",e.MobileRules="mobileRules",e.NotAvailableOnMobile="notAvailableOnMobile",e.MobileActive="mobileActive",e.LastSize="lastSize",e.PrefersPlainEditor="prefersPlainEditor",e.ComponentInstallError="installError"}(o||(o={}));var l=new Uint8Array(16);function a(){if(!s&&!(s="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return s(l)}const c=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,h=function(e){return"string"==typeof e&&c.test(e)};for(var u=[],d=0;d<256;++d)u.push((d+256).toString(16).substr(1));const p=function(e,t,n){var r=(e=e||{}).random||(e.rng||a)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var i=0;i<16;++i)t[n+i]=r[i];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!h(n))throw TypeError("Stringified UUID is invalid");return n}(r)},f=e=>{var t;const n={[r.Web]:"web",[r.Desktop]:"desktop",[r.Mobile]:"mobile"};return null!==(t=n[e])&&void 0!==t?t:n[r.Web]},m=e=>null!=e,g=()=>{};class y{static get isSupported(){return!(!window.console&&!console)}static get info(){return y.isSupported&&this.enabled?console.log.bind(console):g}static get error(){return y.isSupported?console.error.bind(console):g}}var k,b,v,w;function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function C(e){for(var t=1;t0&&(this.initialPermissions=n),m(null==r?void 0:r.coallesedSaving)&&(this.coallesedSaving=r.coallesedSaving),m(null==r?void 0:r.coallesedSavingDelay)&&(this.coallesedSavingDelay=r.coallesedSavingDelay),m(null==r?void 0:r.acceptsThemes)&&(this.component.acceptsThemes=null===(s=null==r?void 0:r.acceptsThemes)||void 0===s||s),m(i)&&(this.onReadyCallback=i),m(o)&&(this.onThemesChangeCallback=o),y.enabled=null!==(t=null==r?void 0:r.debug)&&void 0!==t&&t}deinit(){this.onReadyCallback=void 0,this.component={acceptsThemes:!0,activeThemes:[]},this.messageQueue=[],this.sentMessages=[],this.lastStreamedItem=void 0,this.pendingSaveItems=void 0,this.pendingSaveTimeout=void 0,this.pendingSaveParams=void 0,this.messageHandler&&(this.contentWindow.document.removeEventListener("message",this.messageHandler),this.contentWindow.removeEventListener("message",this.messageHandler)),this.keyDownEventListener&&this.contentWindow.removeEventListener("keydown",this.keyDownEventListener),this.keyUpEventListener&&this.contentWindow.removeEventListener("keyup",this.keyUpEventListener),this.clickEventListener&&this.contentWindow.removeEventListener("click",this.clickEventListener)}registerMessageHandler(){this.messageHandler=e=>{if(y.info("Components API Message received:",e.data),document.referrer&&new URL(document.referrer).origin!==new URL(e.origin).origin)return;const{data:t}=e,r=(e=>{if("string"!=typeof e)return!1;try{const t=JSON.parse(e),n=Object.prototype.toString.call(t);return"[object Object]"===n||"[object Array]"===n}catch(e){return!1}})(t)?JSON.parse(t):t;if(r){if(void 0===this.component.origin&&r.action===n.ComponentRegistered)this.component.origin=e.origin;else if(e.origin!==this.component.origin)return;this.handleMessage(r)}else y.error("Invalid data received. Skipping...")},this.contentWindow.document.addEventListener("message",this.messageHandler,!1),this.contentWindow.addEventListener("message",this.messageHandler,!1),y.info("Waiting for messages...")}registerKeyboardEventListeners(){this.keyDownEventListener=e=>{y.info("A key has been pressed: ".concat(e.key)),e.ctrlKey?this.keyDownEvent(w.Ctrl):e.shiftKey?this.keyDownEvent(w.Shift):(e.metaKey||"Meta"===e.key)&&this.keyDownEvent(w.Meta)},this.keyUpEventListener=e=>{y.info("A key has been released: ".concat(e.key)),"Control"===e.key?this.keyUpEvent(w.Ctrl):"Shift"===e.key?this.keyUpEvent(w.Shift):"Meta"===e.key&&this.keyUpEvent(w.Meta)},this.contentWindow.addEventListener("keydown",this.keyDownEventListener,!1),this.contentWindow.addEventListener("keyup",this.keyUpEventListener,!1)}registerMouseEventListeners(){this.clickEventListener=e=>{y.info("A click has been performed."),this.mouseClickEvent()},this.contentWindow.addEventListener("click",this.clickEventListener,!1)}handleMessage(e){switch(e.action){case n.ComponentRegistered:this.component.sessionKey=e.sessionKey,e.componentData&&(this.component.data=e.componentData),this.onReady(e.data),y.info("Component successfully registered with payload:",e);break;case n.ActivateThemes:this.activateThemes(e.data.themes);break;default:{var t,r;if(!e.original)return;const n=null===(t=this.sentMessages)||void 0===t?void 0:t.filter((t=>{var n;return t.messageId===(null===(n=e.original)||void 0===n?void 0:n.messageId)}))[0];if(!n){const e=this.contentWindow.document.title,t=("The extension '".concat(e,"' is attempting to communicate with Standard Notes, ")+"but an error is preventing it from doing so. Please restart this extension and try again.").replace(" "," ");return void y.info(t)}null==n||null===(r=n.callback)||void 0===r||r.call(n,e.data);break}}}onReady(e){this.component.environment=e.environment,this.component.platform=e.platform,this.component.uuid=e.uuid,this.initialPermissions&&this.initialPermissions.length>0&&this.requestPermissions(this.initialPermissions);for(const e of this.messageQueue)this.postMessage(e.action,e.data,e.callback);this.messageQueue=[],y.info("Data passed to onReady:",e),this.activateThemes(e.activeThemeUrls||[]),this.postMessage(n.ThemesActivated,{}),this.onReadyCallback&&this.onReadyCallback()}getSelfComponentUUID(){return this.component.uuid}isRunningInDesktopApplication(){return this.component.environment===f(r.Desktop)}isRunningInMobileApplication(){return this.component.environment===f(r.Mobile)}getComponentDataValueForKey(e){if(this.component.data)return this.component.data[e]}setComponentDataValueForKey(e,t){if(!this.component.data)throw new Error("The component has not been initialized.");if(!e||e&&0===e.length)throw new Error("The key for the data value should be a valid string.");this.component.data=C(C({},this.component.data),{},{[e]:t}),this.postMessage(n.SetComponentData,{componentData:this.component.data})}clearComponentData(){this.component.data={},this.postMessage(n.SetComponentData,{componentData:this.component.data})}postMessage(e,t,n){if(!this.component.sessionKey)return void this.messageQueue.push({action:e,data:t,api:v.Component,callback:n});const r={action:e,data:t,messageId:this.generateUUID(),sessionKey:this.component.sessionKey,api:v.Component},i=JSON.parse(JSON.stringify(r));let o;i.callback=n,this.sentMessages.push(i),o=this.isRunningInMobileApplication()?JSON.stringify(r):r,y.info("Posting message:",o),this.contentWindow.parent.postMessage(o,this.component.origin)}requestPermissions(e,t){this.postMessage(n.RequestPermissions,{permissions:e},(()=>{t&&t()}))}activateThemes(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(!this.component.acceptsThemes)return;y.info("Incoming themes:",e);const{activeThemes:t}=this.component;if(t&&t.sort().toString()==e.sort().toString())return;let n=e;const r=[];for(const i of t)e.includes(i)?n=n.filter((e=>e!==i)):r.push(i);y.info("Deactivating themes:",r),y.info("Activating themes:",n);for(const e of r)this.deactivateTheme(e);this.component.activeThemes=e;for(const e of n){if(!e)continue;const t=this.contentWindow.document.createElement("link");t.id=btoa(e),t.href=e,t.type="text/css",t.rel="stylesheet",t.media="screen,print",t.className="custom-theme",this.contentWindow.document.getElementsByTagName("head")[0].appendChild(t)}this.onThemesChangeCallback&&this.onThemesChangeCallback()}themeElementForUrl(e){return Array.from(this.contentWindow.document.getElementsByClassName("custom-theme")).slice().find((t=>t.id==btoa(e)))}deactivateTheme(e){const t=this.themeElementForUrl(e);t&&t.parentNode&&(t.setAttribute("disabled","true"),t.parentNode.removeChild(t))}generateUUID(){return p()}get platform(){return this.component.platform}get environment(){return this.component.environment}streamItems(e,t){this.postMessage(n.StreamItems,{content_types:e},(e=>{t(e.items)}))}streamContextItem(e){this.postMessage(n.StreamContextItem,{},(t=>{const{item:n}=t;(!this.lastStreamedItem||this.lastStreamedItem.uuid!==n.uuid)&&this.pendingSaveTimeout&&(clearTimeout(this.pendingSaveTimeout),this.performSavingOfItems(this.pendingSaveParams),this.pendingSaveTimeout=void 0,this.pendingSaveParams=void 0),this.lastStreamedItem=n,e(this.lastStreamedItem)}))}selectItem(e){this.postMessage(n.SelectItem,{item:this.jsonObjectForItem(e)})}clearSelection(){this.postMessage(n.ClearSelection,{content_type:i.Tag})}createItem(e,t){this.postMessage(n.CreateItem,{item:this.jsonObjectForItem(e)},(e=>{let{item:n}=e;!n&&e.items&&e.items.length>0&&(n=e.items[0]),this.associateItem(n),t&&t(n)}))}createItems(e,t){const r=e.map((e=>this.jsonObjectForItem(e)));this.postMessage(n.CreateItems,{items:r},(e=>{t&&t(e.items)}))}associateItem(e){this.postMessage(n.AssociateItem,{item:this.jsonObjectForItem(e)})}deassociateItem(e){this.postMessage(n.DeassociateItem,{item:this.jsonObjectForItem(e)})}deleteItem(e,t){this.deleteItems([e],t)}deleteItems(e,t){const r={items:e.map((e=>this.jsonObjectForItem(e)))};this.postMessage(n.DeleteItems,r,(e=>{t&&t(e)}))}sendCustomEvent(e,t,n){this.postMessage(e,t,(e=>{n&&n(e)}))}saveItem(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.saveItems([e],t,n)}saveItemWithPresave(e,t,n){this.saveItemsWithPresave([e],t,n)}saveItemsWithPresave(e,t,n){this.saveItems(e,n,!1,t)}performSavingOfItems(e){let{items:t,presave:r,callback:i}=e;const o=setTimeout((()=>{this.concernTimeouts.forEach((e=>clearTimeout(e))),alert("This editor is unable to communicate with Standard Notes. Your changes may not be saved. Please backup your changes, then restart the application and try again.")}),5e3);this.concernTimeouts.push(o),r&&r();const s=[];for(const e of t)s.push(this.jsonObjectForItem(e));this.postMessage(n.SaveItems,{items:s},(()=>{this.concernTimeouts.forEach((e=>clearTimeout(e))),null==i||i()}))}saveItems(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3?arguments[3]:void 0;if(this.pendingSaveItems||(this.pendingSaveItems=[]),this.coallesedSaving&&!n){this.pendingSaveTimeout&&clearTimeout(this.pendingSaveTimeout);const n=e.map((e=>e.uuid)),i=this.pendingSaveItems.filter((e=>!n.includes(e.uuid)));this.pendingSaveItems=i.concat(e),this.pendingSaveParams={items:this.pendingSaveItems,presave:r,callback:t},this.pendingSaveTimeout=setTimeout((()=>{this.performSavingOfItems(this.pendingSaveParams),this.pendingSaveItems=[],this.pendingSaveTimeout=void 0,this.pendingSaveParams=null}),this.coallesedSavingDelay)}else this.performSavingOfItems({items:e,presave:r,callback:t})}setSize(e,t){this.postMessage(n.SetSize,{type:"container",width:e,height:t})}keyDownEvent(e){this.postMessage(n.KeyDown,{keyboardModifier:e})}keyUpEvent(e){this.postMessage(n.KeyUp,{keyboardModifier:e})}mouseClickEvent(){this.postMessage(n.Click,{})}jsonObjectForItem(e){const t=Object.assign({},e);return t.children=null,t.parent=null,t}getItemAppDataValue(e,t){var n,r;return null==e||null===(n=e.content)||void 0===n||null===(r=n.appData)||void 0===r?void 0:r["org.standardnotes.sn"][t]}}return t.default})()},115:e=>{e.exports=''},415:e=>{e.exports=''}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};n.r(e),n.d(e,{decode:()=>cl,encode:()=>dl,format:()=>pl,parse:()=>_l});var t={};n.r(t),n.d(t,{Any:()=>Ml,Cc:()=>Ol,Cf:()=>Tl,P:()=>El,S:()=>Al,Z:()=>Nl});var r={};n.r(r),n.d(r,{arrayReplaceAt:()=>sa,assign:()=>oa,escapeHtml:()=>ka,escapeRE:()=>va,fromCodePoint:()=>aa,has:()=>ia,isMdAsciiPunct:()=>Da,isPunctChar:()=>Ca,isSpace:()=>wa,isString:()=>na,isValidEntityCode:()=>la,isWhiteSpace:()=>xa,lib:()=>_a,normalizeReference:()=>Sa,unescapeAll:()=>pa,unescapeMd:()=>da});var i={};function o(e){this.content=e}n.r(i),n.d(i,{parseLinkDestination:()=>Aa,parseLinkLabel:()=>Ea,parseLinkTitle:()=>Ma}),o.prototype={constructor:o,find:function(e){for(var t=0;t>1}},o.from=function(e){if(e instanceof o)return e;var t=[];if(e)for(var n in e)t.push(n,e[n]);return new o(t)};const s=o;function l(e,t,n){for(let r=0;;r++){if(r==e.childCount||r==t.childCount)return e.childCount==t.childCount?null:n;let i=e.child(r),o=t.child(r);if(i!=o){if(!i.sameMarkup(o))return n;if(i.isText&&i.text!=o.text){for(let e=0;i.text[e]==o.text[e];e++)n++;return n}if(i.content.size||o.content.size){let e=l(i.content,o.content,n+1);if(null!=e)return e}n+=i.nodeSize}else n+=i.nodeSize}}function a(e,t,n,r){for(let i=e.childCount,o=t.childCount;;){if(0==i||0==o)return i==o?null:{a:n,b:r};let s=e.child(--i),l=t.child(--o),c=s.nodeSize;if(s!=l){if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let e=0,t=Math.min(s.text.length,l.text.length);for(;ee&&!1!==n(l,r+s,i||null,o)&&l.content.size){let i=s+1;l.nodesBetween(Math.max(0,e-i),Math.min(l.content.size,t-i),n,r+i)}s=a}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,r){let i="",o=!0;return this.nodesBetween(e,t,((s,l)=>{let a=s.isText?s.text.slice(Math.max(e,l)-l,t-l):s.isLeaf?r?"function"==typeof r?r(s):r:s.type.spec.leafText?s.type.spec.leafText(s):"":"";s.isBlock&&(s.isLeaf&&a||s.isTextblock)&&n&&(o?o=!1:i+=n),i+=a}),0),i}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,n=e.firstChild,r=this.content.slice(),i=0;for(t.isText&&t.sameMarkup(n)&&(r[r.length-1]=t.withText(t.text+n.text),i=1);ie)for(let i=0,o=0;oe&&((ot)&&(s=s.isText?s.cut(Math.max(0,e-o),Math.min(s.text.length,t-o)):s.cut(Math.max(0,e-o-1),Math.min(s.content.size,t-o-1))),n.push(s),r+=s.nodeSize),o=l}return new c(n,r)}cutByIndex(e,t){return e==t?c.empty:0==e&&t==this.content.length?this:new c(this.content.slice(e,t))}replaceChild(e,t){let n=this.content[e];if(n==t)return this;let r=this.content.slice(),i=this.size+t.nodeSize-n.nodeSize;return r[e]=t,new c(r,i)}addToStart(e){return new c([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new c(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let n=0,r=0;;n++){let i=r+this.child(n).nodeSize;if(i>=e)return i==e||t>0?u(n+1,i):u(n,r);r=i}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map((e=>e.toJSON())):null}static fromJSON(e,t){if(!t)return c.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return new c(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return c.empty;let t,n=0;for(let r=0;rthis.type.rank&&(t||(t=e.slice(0,r)),t.push(this),n=!0),t&&t.push(i)}}return t||(t=e.slice()),n||t.push(this),t}removeFromSet(e){for(let t=0;te.type.rank-t.type.rank)),t}}p.none=[];class f extends Error{}class m{constructor(e,t,n){this.content=e,this.openStart=t,this.openEnd=n}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,t){let n=y(this.content,e+this.openStart,t);return n&&new m(n,this.openStart,this.openEnd)}removeBetween(e,t){return new m(g(this.content,e+this.openStart,t+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return m.empty;let n=t.openStart||0,r=t.openEnd||0;if("number"!=typeof n||"number"!=typeof r)throw new RangeError("Invalid input for Slice.fromJSON");return new m(c.fromJSON(e,t.content),n,r)}static maxOpen(e,t=!0){let n=0,r=0;for(let r=e.firstChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.firstChild)n++;for(let n=e.lastChild;n&&!n.isLeaf&&(t||!n.type.spec.isolating);n=n.lastChild)r++;return new m(e,n,r)}}function g(e,t,n){let{index:r,offset:i}=e.findIndex(t),o=e.maybeChild(r),{index:s,offset:l}=e.findIndex(n);if(i==t||o.isText){if(l!=n&&!e.child(s).isText)throw new RangeError("Removing non-flat range");return e.cut(0,t).append(e.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return e.replaceChild(r,o.copy(g(o.content,t-i-1,n-i-1)))}function y(e,t,n,r){let{index:i,offset:o}=e.findIndex(t),s=e.maybeChild(i);if(o==t||s.isText)return r&&!r.canReplace(i,i,n)?null:e.cut(0,t).append(n).append(e.cut(t));let l=y(s.content,t-o-1,n);return l&&e.replaceChild(i,s.copy(l))}function k(e,t,n){if(n.openStart>e.depth)throw new f("Inserted content deeper than insertion position");if(e.depth-n.openStart!=t.depth-n.openEnd)throw new f("Inconsistent open depths");return b(e,t,n,0)}function b(e,t,n,r){let i=e.index(r),o=e.node(r);if(i==t.index(r)&&r=0;e--)r=t.node(e).copy(c.from(r));return{start:r.resolveNoCache(e.openStart+n),end:r.resolveNoCache(r.content.size-e.openEnd-n)}}(n,e);return D(o,S(e,i,s,t,r))}{let r=e.parent,i=r.content;return D(r,i.cut(0,e.parentOffset).append(n.content).append(i.cut(t.parentOffset)))}}return D(o,_(e,t,r))}function v(e,t){if(!t.type.compatibleContent(e.type))throw new f("Cannot join "+t.type.name+" onto "+e.type.name)}function w(e,t,n){let r=e.node(n);return v(r,t.node(n)),r}function x(e,t){let n=t.length-1;n>=0&&e.isText&&e.sameMarkup(t[n])?t[n]=e.withText(t[n].text+e.text):t.push(e)}function C(e,t,n,r){let i=(t||e).node(n),o=0,s=t?t.index(n):i.childCount;e&&(o=e.index(n),e.depth>n?o++:e.textOffset&&(x(e.nodeAfter,r),o++));for(let e=o;ei&&w(e,t,i+1),s=r.depth>i&&w(n,r,i+1),l=[];return C(null,e,i,l),o&&s&&t.index(i)==n.index(i)?(v(o,s),x(D(o,S(e,t,n,r,i+1)),l)):(o&&x(D(o,_(e,t,i+1)),l),C(t,n,i,l),s&&x(D(s,_(n,r,i+1)),l)),C(r,null,i,l),new c(l)}function _(e,t,n){let r=[];if(C(null,e,n,r),e.depth>n){x(D(w(e,t,n+1),_(e,t,n+1)),r)}return C(t,null,n,r),new c(r)}m.empty=new m(c.empty,0,0);class E{constructor(e,t,n){this.pos=e,this.path=t,this.parentOffset=n,this.depth=t.length/3-1}resolveDepth(e){return null==e?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[3*this.resolveDepth(e)]}index(e){return this.path[3*this.resolveDepth(e)+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e!=this.depth||this.textOffset?1:0)}start(e){return 0==(e=this.resolveDepth(e))?0:this.path[3*e-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(!(e=this.resolveDepth(e)))throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[3*e-1]}after(e){if(!(e=this.resolveDepth(e)))throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[3*e-1]+this.path[3*e].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let n=this.pos-this.path[this.path.length-1],r=e.child(t);return n?e.child(t).cut(n):r}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):0==e?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let n=this.path[3*t],r=0==t?0:this.path[3*t-1]+1;for(let t=0;t0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos=0;n--)if(e.pos<=this.end(n)&&(!t||t(this.node(n))))return new T(this,e,n);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&t<=e.content.size))throw new RangeError("Position "+t+" out of range");let n=[],r=0,i=t;for(let t=e;;){let{index:e,offset:o}=t.content.findIndex(i),s=i-o;if(n.push(t,e,r+o),!s)break;if(t=t.child(e),t.isText)break;i=s-1,r+=o+1}return new E(t,n,i)}static resolveCached(e,t){let n=O.get(e);if(n)for(let e=0;ee&&this.nodesBetween(e,t,(e=>(n.isInSet(e.marks)&&(r=!0),!r))),r}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),R(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw new Error("Called contentMatchAt on a node with invalid content");return t}canReplace(e,t,n=c.empty,r=0,i=n.childCount){let o=this.contentMatchAt(e).matchFragment(n,r,i),s=o&&o.matchFragment(this.content,t);if(!s||!s.validEnd)return!1;for(let e=r;ee.type.name))}`);this.content.forEach((e=>e.check()))}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map((e=>e.toJSON()))),e}static fromJSON(e,t){if(!t)throw new RangeError("Invalid input for Node.fromJSON");let n;if(t.marks){if(!Array.isArray(t.marks))throw new RangeError("Invalid mark data for Node.fromJSON");n=t.marks.map(e.markFromJSON)}if("text"==t.type){if("string"!=typeof t.text)throw new RangeError("Invalid text node in JSON");return e.text(t.text,n)}let r=c.fromJSON(e,t.content),i=e.nodeType(t.type).create(t.attrs,r,n);return i.type.checkAttrs(i.attrs),i}}F.prototype.text=void 0;class I extends F{constructor(e,t,n,r){if(super(e,t,null,r),!n)throw new RangeError("Empty text nodes are not allowed");this.text=n}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):R(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new I(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new I(this.type,this.attrs,e,this.marks)}cut(e=0,t=this.text.length){return 0==e&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}}function R(e,t){for(let n=e.length-1;n>=0;n--)t=e[n].type.name+"("+t+")";return t}class B{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,t){let n=new z(e,t);if(null==n.next)return B.empty;let r=L(n);n.next&&n.err("Unexpected trailing text");let i=function(e){let t=Object.create(null);return n(U(e,0));function n(r){let i=[];r.forEach((t=>{e[t].forEach((({term:t,to:n})=>{if(!t)return;let r;for(let e=0;e{r||i.push([t,r=[]]),-1==r.indexOf(e)&&r.push(e)}))}))}));let o=t[r.join(",")]=new B(r.indexOf(e.length-1)>-1);for(let e=0;ee.to=t))}function o(e,t){if("choice"==e.type)return e.exprs.reduce(((e,n)=>e.concat(o(n,t))),[]);if("seq"!=e.type){if("star"==e.type){let s=n();return r(t,s),i(o(e.expr,s),s),[r(s)]}if("plus"==e.type){let s=n();return i(o(e.expr,t),s),i(o(e.expr,s),s),[r(s)]}if("opt"==e.type)return[r(t)].concat(o(e.expr,t));if("range"==e.type){let s=t;for(let t=0;te.createAndFill())));for(let e=0;e=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];return function t(n){e.push(n);for(let r=0;r{let r=n+(t.validEnd?"*":" ")+" ";for(let n=0;n"+e.indexOf(t.next[n].next);return r})).join("\n")}}B.empty=new B(!0);class z{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),""==this.tokens[this.tokens.length-1]&&this.tokens.pop(),""==this.tokens[0]&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}}function L(e){let t=[];do{t.push(P(e))}while(e.eat("|"));return 1==t.length?t[0]:{type:"choice",exprs:t}}function P(e){let t=[];do{t.push(q(e))}while(e.next&&")"!=e.next&&"|"!=e.next);return 1==t.length?t[0]:{type:"seq",exprs:t}}function q(e){let t=function(e){if(e.eat("(")){let t=L(e);return e.eat(")")||e.err("Missing closing paren"),t}if(!/\W/.test(e.next)){let t=function(e,t){let n=e.nodeTypes,r=n[t];if(r)return[r];let i=[];for(let e in n){let r=n[e];r.isInGroup(t)&&i.push(r)}0==i.length&&e.err("No node type or group '"+t+"' found");return i}(e,e.next).map((t=>(null==e.inline?e.inline=t.isInline:e.inline!=t.isInline&&e.err("Mixing inline and block content"),{type:"name",value:t})));return e.pos++,1==t.length?t[0]:{type:"choice",exprs:t}}e.err("Unexpected token '"+e.next+"'")}(e);for(;;)if(e.eat("+"))t={type:"plus",expr:t};else if(e.eat("*"))t={type:"star",expr:t};else if(e.eat("?"))t={type:"opt",expr:t};else{if(!e.eat("{"))break;t=V(e,t)}return t}function $(e){/\D/.test(e.next)&&e.err("Expected number, got '"+e.next+"'");let t=Number(e.next);return e.pos++,t}function V(e,t){let n=$(e),r=n;return e.eat(",")&&(r="}"!=e.next?$(e):-1),e.eat("}")||e.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:t}}function j(e,t){return t-e}function U(e,t){let n=[];return function t(r){let i=e[r];if(1==i.length&&!i[0].term)return t(i[0].to);n.push(r);for(let e=0;e-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:H(this.attrs,e)}create(e=null,t,n){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new F(this,this.computeAttrs(e),c.from(t),p.setFrom(n))}createChecked(e=null,t,n){return t=c.from(t),this.checkContent(t),new F(this,this.computeAttrs(e),t,p.setFrom(n))}createAndFill(e=null,t,n){if(e=this.computeAttrs(e),(t=c.from(t)).size){let e=this.contentMatch.fillBefore(t);if(!e)return null;t=e.append(t)}let r=this.contentMatch.matchFragment(t),i=r&&r.fillBefore(c.empty,!0);return i?new F(this,e,t.append(i),p.setFrom(n)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let t=0;t-1}allowsMarks(e){if(null==this.markSet)return!0;for(let t=0;tn[e]=new G(e,t,r)));let r=t.spec.topNode||"doc";if(!n[r])throw new RangeError("Schema is missing its top node type ('"+r+"')");if(!n.text)throw new RangeError("Every schema needs a 'text' type");for(let e in n.text.attrs)throw new RangeError("The text node type should not have attributes");return n}}class Z{constructor(e,t,n){this.hasDefault=Object.prototype.hasOwnProperty.call(n,"default"),this.default=n.default,this.validate="string"==typeof n.validate?function(e,t,n){let r=n.split("|");return n=>{let i=null===n?"null":typeof n;if(r.indexOf(i)<0)throw new RangeError(`Expected value of type ${r} for attribute ${t} on type ${e}, got ${i}`)}}(e,t,n.validate):n.validate}get isRequired(){return!this.hasDefault}}class Y{constructor(e,t,n,r){this.name=e,this.rank=t,this.schema=n,this.spec=r,this.attrs=K(e,r.attrs),this.excluded=null;let i=W(this.attrs);this.instance=i?new p(this,i):null}create(e=null){return!e&&this.instance?this.instance:new p(this,H(this.attrs,e))}static compile(e,t){let n=Object.create(null),r=0;return e.forEach(((e,i)=>n[e]=new Y(e,r++,t,i))),n}removeFromSet(e){for(var t=0;t-1}}class Q{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let n in e)t[n]=e[n];t.nodes=s.from(e.nodes),t.marks=s.from(e.marks||{}),this.nodes=G.compile(this.spec.nodes,this),this.marks=Y.compile(this.spec.marks,this);let n=Object.create(null);for(let e in this.nodes){if(e in this.marks)throw new RangeError(e+" can not be both a node and a mark");let t=this.nodes[e],r=t.spec.content||"",i=t.spec.marks;if(t.contentMatch=n[r]||(n[r]=B.parse(r,this.nodes)),t.inlineContent=t.contentMatch.inlineContent,t.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!t.isInline||!t.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=t}t.markSet="_"==i?null:i?X(this,i.split(" ")):""!=i&&t.inlineContent?null:[]}for(let e in this.marks){let t=this.marks[e],n=t.spec.excludes;t.excluded=null==n?[t]:""==n?[]:X(this,n.split(" "))}this.nodeFromJSON=this.nodeFromJSON.bind(this),this.markFromJSON=this.markFromJSON.bind(this),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,t=null,n,r){if("string"==typeof e)e=this.nodeType(e);else{if(!(e instanceof G))throw new RangeError("Invalid node type: "+e);if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}return e.createChecked(t,n,r)}text(e,t){let n=this.nodes.text;return new I(n,n.defaultAttrs,e,p.setFrom(t))}mark(e,t){return"string"==typeof e&&(e=this.marks[e]),e.create(t)}nodeFromJSON(e){return F.fromJSON(this,e)}markFromJSON(e){return p.fromJSON(this,e)}nodeType(e){let t=this.nodes[e];if(!t)throw new RangeError("Unknown node type: "+e);return t}}function X(e,t){let n=[];for(let r=0;r-1)&&n.push(s=r)}if(!s)throw new SyntaxError("Unknown mark type: '"+t[r]+"'")}return n}class ee{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let n=this.matchedStyles=[];t.forEach((e=>{if(function(e){return null!=e.tag}(e))this.tags.push(e);else if(function(e){return null!=e.style}(e)){let t=/[^=]*/.exec(e.style)[0];n.indexOf(t)<0&&n.push(t),this.styles.push(e)}})),this.normalizeLists=!this.tags.some((t=>{if(!/^(ul|ol)\b/.test(t.tag)||!t.node)return!1;let n=e.nodes[t.node];return n.contentMatch.matchType(n)}))}parse(e,t={}){let n=new se(this,t,!1);return n.addAll(e,p.none,t.from,t.to),n.finish()}parseSlice(e,t={}){let n=new se(this,t,!0);return n.addAll(e,p.none,t.from,t.to),m.maxOpen(n.finish())}matchTag(e,t,n){for(let r=n?this.tags.indexOf(n)+1:0;re.length&&(61!=o.charCodeAt(e.length)||o.slice(e.length+1)!=t))){if(r.getAttrs){let e=r.getAttrs(t);if(!1===e)continue;r.attrs=e||void 0}return r}}}static schemaRules(e){let t=[];function n(e){let n=null==e.priority?50:e.priority,r=0;for(;r{n(e=ae(e)),e.mark||e.ignore||e.clearMark||(e.mark=t)}))}for(let t in e.nodes){let r=e.nodes[t].spec.parseDOM;r&&r.forEach((e=>{n(e=ae(e)),e.node||e.ignore||e.mark||(e.node=t)}))}return t}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new ee(e,ee.schemaRules(e)))}}const te={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},ne={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},re={ol:!0,ul:!0};function ie(e,t,n){return null!=t?(t?1:0)|("full"===t?2:0):e&&"pre"==e.whitespace?3:-5&n}class oe{constructor(e,t,n,r,i,o){this.type=e,this.attrs=t,this.marks=n,this.solid=r,this.options=o,this.content=[],this.activeMarks=p.none,this.match=i||(4&o?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(c.from(e));if(!t){let t,n=this.type.contentMatch;return(t=n.findWrapping(e.type))?(this.match=n,t):null}this.match=this.type.contentMatch.matchFragment(t)}return this.match.findWrapping(e.type)}finish(e){if(!(1&this.options)){let e,t=this.content[this.content.length-1];if(t&&t.isText&&(e=/[ \t\r\n\u000c]+$/.exec(t.text))){let n=t;t.text.length==e[0].length?this.content.pop():this.content[this.content.length-1]=n.withText(n.text.slice(0,n.text.length-e[0].length))}}let t=c.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(c.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!te.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}}class se{constructor(e,t,n){this.parser=e,this.options=t,this.isOpen=n,this.open=0,this.localPreserveWS=!1;let r,i=t.topNode,o=ie(null,t.preserveWhitespace,0)|(n?4:0);r=i?new oe(i.type,i.attrs,p.none,!0,t.topMatch||i.type.contentMatch,o):new oe(n?null:e.schema.topNodeType,null,p.none,!0,null,o),this.nodes=[r],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){3==e.nodeType?this.addTextNode(e,t):1==e.nodeType&&this.addElement(e,t)}addTextNode(e,t){let n=e.nodeValue,r=this.top,i=2&r.options?"full":this.localPreserveWS||(1&r.options)>0;if("full"===i||r.inlineContext(e)||/[^ \t\r\n\u000c]/.test(n)){if(i)n="full"!==i?n.replace(/\r?\n|\r/g," "):n.replace(/\r\n?/g,"\n");else if(n=n.replace(/[ \t\r\n\u000c]+/g," "),/^[ \t\r\n\u000c]/.test(n)&&this.open==this.nodes.length-1){let t=r.content[r.content.length-1],i=e.previousSibling;(!t||i&&"BR"==i.nodeName||t.isText&&/[ \t\r\n\u000c]$/.test(t.text))&&(n=n.slice(1))}n&&this.insertNode(this.parser.schema.text(n),t,!/\S/.test(n)),this.findInText(e)}else this.findInside(e)}addElement(e,t,n){let r=this.localPreserveWS,i=this.top;("PRE"==e.tagName||/pre/.test(e.style&&e.style.whiteSpace))&&(this.localPreserveWS=!0);let o,s=e.nodeName.toLowerCase();re.hasOwnProperty(s)&&this.parser.normalizeLists&&function(e){for(let t=e.firstChild,n=null;t;t=t.nextSibling){let e=1==t.nodeType?t.nodeName.toLowerCase():null;e&&re.hasOwnProperty(e)&&n?(n.appendChild(t),t=n):"li"==e?n=t:e&&(n=null)}}(e);let l=this.options.ruleFromNode&&this.options.ruleFromNode(e)||(o=this.parser.matchTag(e,this,n));e:if(l?l.ignore:ne.hasOwnProperty(s))this.findInside(e),this.ignoreFallback(e,t);else if(!l||l.skip||l.closeParent){l&&l.closeParent?this.open=Math.max(0,this.open-1):l&&l.skip.nodeType&&(e=l.skip);let n,r=this.needsBlock;if(te.hasOwnProperty(s))i.content.length&&i.content[0].isInline&&this.open&&(this.open--,i=this.top),n=!0,i.type||(this.needsBlock=!0);else if(!e.firstChild){this.leafFallback(e,t);break e}let o=l&&l.skip?t:this.readStyles(e,t);o&&this.addAll(e,o),n&&this.sync(i),this.needsBlock=r}else{let n=this.readStyles(e,t);n&&this.addElementByRule(e,l,n,!1===l.consuming?o:void 0)}this.localPreserveWS=r}leafFallback(e,t){"BR"==e.nodeName&&this.top.type&&this.top.type.inlineContent&&this.addTextNode(e.ownerDocument.createTextNode("\n"),t)}ignoreFallback(e,t){"BR"!=e.nodeName||this.top.type&&this.top.type.inlineContent||this.findPlace(this.parser.schema.text("-"),t,!0)}readStyles(e,t){let n=e.style;if(n&&n.length)for(let e=0;e!n.clearMark(e))):t.concat(this.parser.schema.marks[n.mark].create(n.attrs)),!1!==n.consuming)break;e=n}}return t}addElementByRule(e,t,n,r){let i,o;if(t.node)if(o=this.parser.schema.nodes[t.node],o.isLeaf)this.insertNode(o.create(t.attrs),n,"BR"==e.nodeName)||this.leafFallback(e,n);else{let e=this.enter(o,t.attrs||null,n,t.preserveWhitespace);e&&(i=!0,n=e)}else{let e=this.parser.schema.marks[t.mark];n=n.concat(e.create(t.attrs))}let s=this.top;if(o&&o.isLeaf)this.findInside(e);else if(r)this.addElement(e,n,r);else if(t.getContent)this.findInside(e),t.getContent(e,this.parser.schema).forEach((e=>this.insertNode(e,n,!1)));else{let r=e;"string"==typeof t.contentElement?r=e.querySelector(t.contentElement):"function"==typeof t.contentElement?r=t.contentElement(e):t.contentElement&&(r=t.contentElement),this.findAround(e,r,!0),this.addAll(r,n),this.findAround(e,r,!1)}i&&this.sync(s)&&this.open--}addAll(e,t,n,r){let i=n||0;for(let o=n?e.childNodes[n]:e.firstChild,s=null==r?null:e.childNodes[r];o!=s;o=o.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(o,t);this.findAtPoint(e,i)}findPlace(e,t,n){let r,i;for(let t=this.open,o=0;t>=0;t--){let s=this.nodes[t],l=s.findWrapping(e);if(l&&(!r||r.length>l.length+o)&&(r=l,i=s,!l.length))break;if(s.solid){if(n)break;o+=2}}if(!r)return null;this.sync(i);for(let e=0;e!(o.type?o.type.allowsMarkType(t.type):ce(t.type,e))||(l=t.addToSet(l),!1))),this.nodes.push(new oe(e,t,l,r,null,s)),this.open++,n}closeExtra(e=!1){let t=this.nodes.length-1;if(t>this.open){for(;t>this.open;t--)this.nodes[t-1].content.push(this.nodes[t].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!(!this.isOpen&&!this.options.topOpen))}sync(e){for(let t=this.open;t>=0;t--){if(this.nodes[t]==e)return this.open=t,!0;this.localPreserveWS&&(this.nodes[t].options|=1)}return!1}get currentPos(){this.closeExtra();let e=0;for(let t=this.open;t>=0;t--){let n=this.nodes[t].content;for(let t=n.length-1;t>=0;t--)e+=n[t].nodeSize;t&&e++}return e}findAtPoint(e,t){if(this.find)for(let n=0;n-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let t=e.split("/"),n=this.options.context,r=!(this.isOpen||n&&n.parent.type!=this.nodes[0].type),i=-(n?n.depth+1:0)+(r?0:1),o=(e,s)=>{for(;e>=0;e--){let l=t[e];if(""==l){if(e==t.length-1||0==e)continue;for(;s>=i;s--)if(o(e-1,s))return!0;return!1}{let e=s>0||0==s&&r?this.nodes[s].type:n&&s>=i?n.node(s-i).type:null;if(!e||e.name!=l&&!e.isInGroup(l))return!1;s--}}return!0};return o(t.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let t=e.depth;t>=0;t--){let n=e.node(t).contentMatchAt(e.indexAfter(t)).defaultType;if(n&&n.isTextblock&&n.defaultAttrs)return n}for(let e in this.parser.schema.nodes){let t=this.parser.schema.nodes[e];if(t.isTextblock&&t.defaultAttrs)return t}}}function le(e,t){return(e.matches||e.msMatchesSelector||e.webkitMatchesSelector||e.mozMatchesSelector).call(e,t)}function ae(e){let t={};for(let n in e)t[n]=e[n];return t}function ce(e,t){let n=t.schema.nodes;for(let r in n){let i=n[r];if(!i.allowsMarkType(e))continue;let o=[],s=e=>{o.push(e);for(let n=0;n{if(i.length||e.marks.length){let n=0,o=0;for(;n=0;r--){let i=this.serializeMark(e.marks[r],e.isInline,t);i&&((i.contentDOM||i.dom).appendChild(n),n=i.dom)}return n}serializeMark(e,t,n={}){let r=this.marks[e.type.name];return r&&me(de(n),r(e,t),null,e.attrs)}static renderSpec(e,t,n=null,r){return me(e,t,n,r)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new he(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let t=ue(e.nodes);return t.text||(t.text=e=>e.text),t}static marksFromSchema(e){return ue(e.marks)}}function ue(e){let t={};for(let n in e){let r=e[n].spec.toDOM;r&&(t[n]=r)}return t}function de(e){return e.document||window.document}const pe=new WeakMap;function fe(e){let t=pe.get(e);return void 0===t&&pe.set(e,t=function(e){let t=null;function n(e){if(e&&"object"==typeof e)if(Array.isArray(e))if("string"==typeof e[0])t||(t=[]),t.push(e);else for(let t=0;t-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let s,l=o.indexOf(" ");l>0&&(n=o.slice(0,l),o=o.slice(l+1));let a=n?e.createElementNS(n,o):e.createElement(o),c=t[1],h=1;if(c&&"object"==typeof c&&null==c.nodeType&&!Array.isArray(c)){h=2;for(let e in c)if(null!=c[e]){let t=e.indexOf(" ");t>0?a.setAttributeNS(e.slice(0,t),e.slice(t+1),c[e]):a.setAttribute(e,c[e])}}for(let i=h;ih)throw new RangeError("Content hole must be the only child of its parent node");return{dom:a,contentDOM:a}}{let{dom:t,contentDOM:i}=me(e,o,n,r);if(a.appendChild(t),i){if(s)throw new RangeError("Multiple content holes");s=i}}}return{dom:a,contentDOM:s}}const ge=Math.pow(2,16);function ye(e){return 65535&e}class ke{constructor(e,t,n){this.pos=e,this.delInfo=t,this.recover=n}get deleted(){return(8&this.delInfo)>0}get deletedBefore(){return(5&this.delInfo)>0}get deletedAfter(){return(6&this.delInfo)>0}get deletedAcross(){return(4&this.delInfo)>0}}class be{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&be.empty)return be.empty}recover(e){let t=0,n=ye(e);if(!this.inverted)for(let e=0;ee)break;let a=this.ranges[s+i],c=this.ranges[s+o],h=l+a;if(e<=h){let i=l+r+((a?e==l?-1:e==h?1:t:t)<0?0:c);if(n)return i;let o=e==(t<0?l:h)?null:s/3+(e-l)*ge,u=e==l?2:e==h?1:4;return(t<0?e!=l:e!=h)&&(u|=8),new ke(i,u,o)}r+=c-a}return n?e+r:new ke(e+r,0,null)}touches(e,t){let n=0,r=ye(t),i=this.inverted?2:1,o=this.inverted?1:2;for(let t=0;te)break;let l=this.ranges[t+i];if(e<=s+l&&t==3*r)return!0;n+=this.ranges[t+o]-l}return!1}forEach(e){let t=this.inverted?2:1,n=this.inverted?1:2;for(let r=0,i=0;r=0;t--){let r=e.getMirror(t);this.appendMap(e._maps[t].invert(),null!=r&&r>t?n-r-1:void 0)}}invert(){let e=new ve;return e.appendMappingInverted(this),e}map(e,t=1){if(this.mirror)return this._map(e,t,!0);for(let n=this.from;nn&&te.isAtom&&t.type.allowsMarkType(this.mark.type)?e.mark(this.mark.addToSet(e.marks)):e),r),t.openStart,t.openEnd);return Ce.fromReplace(e,this.from,this.to,i)}invert(){return new _e(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new Se(t.pos,n.pos,this.mark)}merge(e){return e instanceof Se&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new Se(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to)throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new Se(t.from,t.to,e.markFromJSON(t.mark))}}xe.jsonID("addMark",Se);class _e extends xe{constructor(e,t,n){super(),this.from=e,this.to=t,this.mark=n}apply(e){let t=e.slice(this.from,this.to),n=new m(De(t.content,(e=>e.mark(this.mark.removeFromSet(e.marks))),e),t.openStart,t.openEnd);return Ce.fromReplace(e,this.from,this.to,n)}invert(){return new Se(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new _e(t.pos,n.pos,this.mark)}merge(e){return e instanceof _e&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new _e(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to)throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new _e(t.from,t.to,e.markFromJSON(t.mark))}}xe.jsonID("removeMark",_e);class Ee extends xe{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return Ce.fail("No node at mark step's position");let n=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return Ce.fromReplace(e,this.pos,this.pos+1,new m(c.from(n),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let e=this.mark.addToSet(t.marks);if(e.length==t.marks.length){for(let n=0;nn.pos?null:new Oe(t.pos,n.pos,r,i,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to||"number"!=typeof t.gapFrom||"number"!=typeof t.gapTo||"number"!=typeof t.insert)throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new Oe(t.from,t.to,t.gapFrom,t.gapTo,m.fromJSON(e,t.slice),t.insert,!!t.structure)}}function Te(e,t,n){let r=e.resolve(t),i=n-t,o=r.depth;for(;i>0&&o>0&&r.indexAfter(o)==r.node(o).childCount;)o--,i--;if(i>0){let e=r.node(o).maybeChild(r.indexAfter(o));for(;i>0;){if(!e||e.isLeaf)return!0;e=e.firstChild,i--}}return!1}function Ne(e,t,n,r=n.contentMatch,i=!0){let o=e.doc.nodeAt(t),s=[],l=t+1;for(let t=0;t=0;t--)e.step(s[t])}function Fe(e,t,n){return(0==t||e.canReplace(t,e.childCount))&&(n==e.childCount||e.canReplace(0,n))}function Ie(e){let t=e.parent.content.cutByIndex(e.startIndex,e.endIndex);for(let n=e.depth;;--n){let r=e.$from.node(n),i=e.$from.index(n),o=e.$to.indexAfter(n);if(n{if(i.isText){let s,l=/\r?\n|\r/g;for(;s=l.exec(i.text);){let i=e.mapping.slice(r).map(n+1+o+s.index);e.replaceWith(i,i+1,t.type.schema.linebreakReplacement.create())}}}))}function ze(e,t,n,r){t.forEach(((i,o)=>{if(i.type==i.type.schema.linebreakReplacement){let i=e.mapping.slice(r).map(n+1+o);e.replaceWith(i,i+1,t.type.schema.text("\n"))}}))}function Le(e,t,n=1,r){let i=e.resolve(t),o=i.depth-n,s=r&&r[r.length-1]||i.parent;if(o<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!s.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let e=i.depth-1,t=n-2;e>o;e--,t--){let n=i.node(e),o=i.index(e);if(n.type.spec.isolating)return!1;let s=n.content.cutByIndex(o,n.childCount),l=r&&r[t+1];l&&(s=s.replaceChild(0,l.type.create(l.attrs)));let a=r&&r[t]||n;if(!n.canReplace(o+1,n.childCount)||!a.type.validContent(s))return!1}let l=i.indexAfter(o),a=r&&r[0];return i.node(o).canReplaceWith(l,l,a?a.type:i.node(o+1).type)}function Pe(e,t){let n=e.resolve(t),r=n.index();return qe(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function qe(e,t){return!(!e||!t||e.isLeaf||!function(e,t){t.content.size||e.type.compatibleContent(t.type);let n=e.contentMatchAt(e.childCount),{linebreakReplacement:r}=e.type.schema;for(let i=0;i0;t--)this.placed=c.from(e.node(t).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let e=this.findFittable();e?this.placeNodes(e):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),t=this.placed.size-this.depth-this.$from.depth,n=this.$from,r=this.close(e<0?this.$to:n.doc.resolve(e));if(!r)return null;let i=this.placed,o=n.depth,s=r.depth;for(;o&&s&&1==i.childCount;)i=i.firstChild.content,o--,s--;let l=new m(i,o,s);return e>-1?new Oe(n.pos,e,this.$to.pos,this.$to.end(),l,t):l.size||n.pos!=this.$to.pos?new Me(n.pos,r.pos,l):null}findFittable(){let e=this.unplaced.openStart;for(let t=this.unplaced.content,n=0,r=this.unplaced.openEnd;n1&&(r=0),i.type.spec.isolating&&r<=n){e=n;break}t=i.content}for(let t=1;t<=2;t++)for(let n=1==t?e:this.unplaced.openStart;n>=0;n--){let e,r=null;n?(r=He(this.unplaced.content,n-1).firstChild,e=r.content):e=this.unplaced.content;let i=e.firstChild;for(let e=this.depth;e>=0;e--){let o,{type:s,match:l}=this.frontier[e],a=null;if(1==t&&(i?l.matchType(i.type)||(a=l.fillBefore(c.from(i),!1)):r&&s.compatibleContent(r.type)))return{sliceDepth:n,frontierDepth:e,parent:r,inject:a};if(2==t&&i&&(o=l.findWrapping(i.type)))return{sliceDepth:n,frontierDepth:e,parent:r,wrap:o};if(r&&l.matchType(r.type))break}}}openMore(){let{content:e,openStart:t,openEnd:n}=this.unplaced,r=He(e,t);return!(!r.childCount||r.firstChild.isLeaf)&&(this.unplaced=new m(e,t+1,Math.max(n,r.size+t>=e.size-n?t+1:0)),!0)}dropNode(){let{content:e,openStart:t,openEnd:n}=this.unplaced,r=He(e,t);if(r.childCount<=1&&t>0){let i=e.size-t<=t+r.size;this.unplaced=new m(Ue(e,t-1,1),t-1,i?t-1:n)}else this.unplaced=new m(Ue(e,t,1),t,n)}placeNodes({sliceDepth:e,frontierDepth:t,parent:n,inject:r,wrap:i}){for(;this.depth>t;)this.closeFrontierNode();if(i)for(let e=0;e1||0==l||e.content.size)&&(u=t,h.push(Je(e.mark(d.allowedMarks(e.marks)),1==a?l:0,a==s.childCount?p:-1)))}let f=a==s.childCount;f||(p=-1),this.placed=We(this.placed,t,c.from(h)),this.frontier[t].match=u,f&&p<0&&n&&n.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let e=0,t=s;e1&&r==this.$to.end(--n);)++r;return r}findCloseLevel(e){e:for(let t=Math.min(this.depth,e.depth);t>=0;t--){let{match:n,type:r}=this.frontier[t],i=t=0;n--){let{match:t,type:r}=this.frontier[n],i=Ke(e,n,r,t,!0);if(!i||i.childCount)continue e}return{depth:t,fit:o,move:i?e.doc.resolve(e.after(t+1)):e}}}}close(e){let t=this.findCloseLevel(e);if(!t)return null;for(;this.depth>t.depth;)this.closeFrontierNode();t.fit.childCount&&(this.placed=We(this.placed,t.depth,t.fit)),e=t.move;for(let n=t.depth+1;n<=e.depth;n++){let t=e.node(n),r=t.type.contentMatch.fillBefore(t.content,!0,e.index(n));this.openFrontierNode(t.type,t.attrs,r)}return e}openFrontierNode(e,t=null,n){let r=this.frontier[this.depth];r.match=r.match.matchType(e),this.placed=We(this.placed,this.depth,c.from(e.create(t,n))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let e=this.frontier.pop().match.fillBefore(c.empty,!0);e.childCount&&(this.placed=We(this.placed,this.frontier.length,e))}}function Ue(e,t,n){return 0==t?e.cutByIndex(n,e.childCount):e.replaceChild(0,e.firstChild.copy(Ue(e.firstChild.content,t-1,n)))}function We(e,t,n){return 0==t?e.append(n):e.replaceChild(e.childCount-1,e.lastChild.copy(We(e.lastChild.content,t-1,n)))}function He(e,t){for(let n=0;n1&&(r=r.replaceChild(0,Je(r.firstChild,t-1,1==r.childCount?n-1:0))),t>0&&(r=e.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(e.type.contentMatch.matchFragment(r).fillBefore(c.empty,!0)))),e.copy(r)}function Ke(e,t,n,r,i){let o=e.node(t),s=i?e.indexAfter(t):e.index(t);if(s==o.childCount&&!n.compatibleContent(o.type))return null;let l=r.fillBefore(o.content,!0,s);return l&&!function(e,t,n){for(let r=n;rr){let t=i.contentMatchAt(0),n=t.fillBefore(e).append(e);e=n.append(t.matchFragment(n).fillBefore(c.empty,!0))}return e}function Ze(e,t){let n=[];for(let r=Math.min(e.depth,t.depth);r>=0;r--){let i=e.start(r);if(it.pos+(t.depth-r)||e.node(r).type.spec.isolating||t.node(r).type.spec.isolating)break;(i==t.start(r)||r==e.depth&&r==t.depth&&e.parent.inlineContent&&t.parent.inlineContent&&r&&t.start(r-1)==i-1)&&n.push(r)}return n}class Ye extends xe{constructor(e,t,n){super(),this.pos=e,this.attr=t,this.value=n}apply(e){let t=e.nodeAt(this.pos);if(!t)return Ce.fail("No node at attribute step's position");let n=Object.create(null);for(let e in t.attrs)n[e]=t.attrs[e];n[this.attr]=this.value;let r=t.type.create(n,null,t.marks);return Ce.fromReplace(e,this.pos,this.pos+1,new m(c.from(r),0,t.isLeaf?0:1))}getMap(){return be.empty}invert(e){return new Ye(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new Ye(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if("number"!=typeof t.pos||"string"!=typeof t.attr)throw new RangeError("Invalid input for AttrStep.fromJSON");return new Ye(t.pos,t.attr,t.value)}}xe.jsonID("attr",Ye);class Qe extends xe{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let n in e.attrs)t[n]=e.attrs[n];t[this.attr]=this.value;let n=e.type.create(t,e.content,e.marks);return Ce.ok(n)}getMap(){return be.empty}invert(e){return new Qe(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if("string"!=typeof t.attr)throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new Qe(t.attr,t.value)}}xe.jsonID("docAttr",Qe);let Xe=class extends Error{};Xe=function e(t){let n=Error.call(this,t);return n.__proto__=e.prototype,n},(Xe.prototype=Object.create(Error.prototype)).constructor=Xe,Xe.prototype.name="TransformError";class et{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new ve}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let t=this.maybeStep(e);if(t.failed)throw new Xe(t.failed);return this}maybeStep(e){let t=e.apply(this.doc);return t.failed||this.addStep(e,t.doc),t}get docChanged(){return this.steps.length>0}addStep(e,t){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=t}replace(e,t=e,n=m.empty){let r=$e(this.doc,e,t,n);return r&&this.step(r),this}replaceWith(e,t,n){return this.replace(e,t,new m(c.from(n),0,0))}delete(e,t){return this.replace(e,t,m.empty)}insert(e,t){return this.replaceWith(e,e,t)}replaceRange(e,t,n){return function(e,t,n,r){if(!r.size)return e.deleteRange(t,n);let i=e.doc.resolve(t),o=e.doc.resolve(n);if(Ve(i,o,r))return e.step(new Me(t,n,r));let s=Ze(i,e.doc.resolve(n));0==s[s.length-1]&&s.pop();let l=-(i.depth+1);s.unshift(l);for(let e=i.depth,t=i.pos-1;e>0;e--,t--){let n=i.node(e).type.spec;if(n.defining||n.definingAsContext||n.isolating)break;s.indexOf(e)>-1?l=e:i.before(e)==t&&s.splice(1,0,-e)}let a=s.indexOf(l),c=[],h=r.openStart;for(let e=r.content,t=0;;t++){let n=e.firstChild;if(c.push(n),t==r.openStart)break;e=n.content}for(let e=h-1;e>=0;e--){let t=c[e],n=(u=t.type).spec.defining||u.spec.definingForContent;if(n&&!t.sameMarkup(i.node(Math.abs(l)-1)))h=e;else if(n||!t.type.isTextblock)break}var u;for(let t=r.openStart;t>=0;t--){let l=(t+h+1)%(r.openStart+1),u=c[l];if(u)for(let t=0;t=0&&(e.replace(t,n,r),!(e.steps.length>d));l--){let e=s[l];e<0||(t=i.before(e),n=o.after(e))}}(this,e,t,n),this}replaceRangeWith(e,t,n){return function(e,t,n,r){if(!r.isInline&&t==n&&e.doc.resolve(t).parent.content.size){let i=function(e,t,n){let r=e.resolve(t);if(r.parent.canReplaceWith(r.index(),r.index(),n))return t;if(0==r.parentOffset)for(let e=r.depth-1;e>=0;e--){let t=r.index(e);if(r.node(e).canReplaceWith(t,t,n))return r.before(e+1);if(t>0)return null}if(r.parentOffset==r.parent.content.size)for(let e=r.depth-1;e>=0;e--){let t=r.indexAfter(e);if(r.node(e).canReplaceWith(t,t,n))return r.after(e+1);if(t0&&(s||r.node(n-1).canReplace(r.index(n-1),i.indexAfter(n-1))))return e.delete(r.before(n),i.after(n))}for(let o=1;o<=r.depth&&o<=i.depth;o++)if(t-r.start(o)==r.depth-o&&n>r.end(o)&&i.end(o)-n!=i.depth-o&&r.start(o-1)==i.start(o-1)&&r.node(o-1).canReplace(r.index(o-1),i.index(o-1)))return e.delete(r.before(o),n);e.delete(t,n)}(this,e,t),this}lift(e,t){return function(e,t,n){let{$from:r,$to:i,depth:o}=t,s=r.before(o+1),l=i.after(o+1),a=s,h=l,u=c.empty,d=0;for(let e=o,t=!1;e>n;e--)t||r.index(e)>0?(t=!0,u=c.from(r.node(e).copy(u)),d++):a--;let p=c.empty,f=0;for(let e=o,t=!1;e>n;e--)t||i.after(e+1)=0;e--){if(r.size){let t=n[e].type.contentMatch.matchFragment(r);if(!t||!t.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=c.from(n[e].type.create(n[e].attrs,r))}let i=t.start,o=t.end;e.step(new Oe(i,o,i,o,new m(r,0,0),n.length,!0))}(this,e,t),this}setBlockType(e,t=e,n,r=null){return function(e,t,n,r,i){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let o=e.steps.length;e.doc.nodesBetween(t,n,((t,n)=>{let s="function"==typeof i?i(t):i;if(t.isTextblock&&!t.hasMarkup(r,s)&&function(e,t,n){let r=e.resolve(t),i=r.index();return r.parent.canReplaceWith(i,i+1,n)}(e.doc,e.mapping.slice(o).map(n),r)){let i=null;if(r.schema.linebreakReplacement){let e="pre"==r.whitespace,t=!!r.contentMatch.matchType(r.schema.linebreakReplacement);e&&!t?i=!1:!e&&t&&(i=!0)}!1===i&&ze(e,t,n,o),Ne(e,e.mapping.slice(o).map(n,1),r,void 0,null===i);let l=e.mapping.slice(o),a=l.map(n,1),h=l.map(n+t.nodeSize,1);return e.step(new Oe(a,h,a+1,h-1,new m(c.from(r.create(s,null,t.marks)),0,0),1,!0)),!0===i&&Be(e,t,n,o),!1}}))}(this,e,t,n,r),this}setNodeMarkup(e,t,n=null,r){return function(e,t,n,r,i){let o=e.doc.nodeAt(t);if(!o)throw new RangeError("No node at given position");n||(n=o.type);let s=n.create(r,null,i||o.marks);if(o.isLeaf)return e.replaceWith(t,t+o.nodeSize,s);if(!n.validContent(o.content))throw new RangeError("Invalid content for node type "+n.name);e.step(new Oe(t,t+o.nodeSize,t+1,t+o.nodeSize-1,new m(c.from(s),0,0),1,!0))}(this,e,t,n,r),this}setNodeAttribute(e,t,n){return this.step(new Ye(e,t,n)),this}setDocAttribute(e,t){return this.step(new Qe(e,t)),this}addNodeMark(e,t){return this.step(new Ee(e,t)),this}removeNodeMark(e,t){let n=this.doc.nodeAt(e);if(!n)throw new RangeError("No node at position "+e);if(t instanceof p)t.isInSet(n.marks)&&this.step(new Ae(e,t));else{let r,i=n.marks,o=[];for(;r=t.isInSet(i);)o.push(new Ae(e,r)),i=r.removeFromSet(i);for(let e=o.length-1;e>=0;e--)this.step(o[e])}return this}split(e,t=1,n){return function(e,t,n=1,r){let i=e.doc.resolve(t),o=c.empty,s=c.empty;for(let e=i.depth,t=i.depth-n,l=n-1;e>t;e--,l--){o=c.from(i.node(e).copy(o));let t=r&&r[l];s=c.from(t?t.type.create(t.attrs,s):i.node(e).copy(s))}e.step(new Me(t,t,new m(o.append(s),n,n),!0))}(this,e,t,n),this}addMark(e,t,n){return function(e,t,n,r){let i,o,s=[],l=[];e.doc.nodesBetween(t,n,((e,a,c)=>{if(!e.isInline)return;let h=e.marks;if(!r.isInSet(h)&&c.type.allowsMarkType(r.type)){let c=Math.max(a,t),u=Math.min(a+e.nodeSize,n),d=r.addToSet(h);for(let e=0;ee.step(t))),l.forEach((t=>e.step(t)))}(this,e,t,n),this}removeMark(e,t,n){return function(e,t,n,r){let i=[],o=0;e.doc.nodesBetween(t,n,((e,s)=>{if(!e.isInline)return;o++;let l=null;if(r instanceof Y){let t,n=e.marks;for(;t=r.isInSet(n);)(l||(l=[])).push(t),n=t.removeFromSet(n)}else r?r.isInSet(e.marks)&&(l=[r]):l=e.marks;if(l&&l.length){let r=Math.min(s+e.nodeSize,n);for(let e=0;ee.step(new _e(t.from,t.to,t.style))))}(this,e,t,n),this}clearIncompatible(e,t,n){return Ne(this,e,t,n),this}}const tt=Object.create(null);class nt{constructor(e,t,n){this.$anchor=e,this.$head=t,this.ranges=n||[new rt(e.min(t),e.max(t))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let t=0;t=0;r--){let i=t<0?dt(e.node(0),e.node(r),e.before(r+1),e.index(r),t,n):dt(e.node(0),e.node(r),e.after(r+1),e.index(r)+1,t,n);if(i)return i}return null}static near(e,t=1){return this.findFrom(e,t)||this.findFrom(e,-t)||new ht(e.node(0))}static atStart(e){return dt(e,e,0,0,1)||new ht(e)}static atEnd(e){return dt(e,e,e.content.size,e.childCount,-1)||new ht(e)}static fromJSON(e,t){if(!t||!t.type)throw new RangeError("Invalid input for Selection.fromJSON");let n=tt[t.type];if(!n)throw new RangeError(`No selection type ${t.type} defined`);return n.fromJSON(e,t)}static jsonID(e,t){if(e in tt)throw new RangeError("Duplicate use of selection JSON ID "+e);return tt[e]=t,t.prototype.jsonID=e,t}getBookmark(){return st.between(this.$anchor,this.$head).getBookmark()}}nt.prototype.visible=!0;class rt{constructor(e,t){this.$from=e,this.$to=t}}let it=!1;function ot(e){it||e.parent.inlineContent||(it=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+e.parent.type.name+")"))}class st extends nt{constructor(e,t=e){ot(e),ot(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let n=e.resolve(t.map(this.head));if(!n.parent.inlineContent)return nt.near(n);let r=e.resolve(t.map(this.anchor));return new st(r.parent.inlineContent?r:n,n)}replace(e,t=m.empty){if(super.replace(e,t),t==m.empty){let t=this.$from.marksAcross(this.$to);t&&e.ensureMarks(t)}}eq(e){return e instanceof st&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new lt(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if("number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid input for TextSelection.fromJSON");return new st(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,n=t){let r=e.resolve(t);return new this(r,n==t?r:e.resolve(n))}static between(e,t,n){let r=e.pos-t.pos;if(n&&!r||(n=r>=0?1:-1),!t.parent.inlineContent){let e=nt.findFrom(t,n,!0)||nt.findFrom(t,-n,!0);if(!e)return nt.near(t,n);t=e.$head}return e.parent.inlineContent||(0==r||(e=(nt.findFrom(e,-n,!0)||nt.findFrom(e,n,!0)).$anchor).posnew ht(e)};function dt(e,t,n,r,i,o=!1){if(t.inlineContent)return st.create(e,n);for(let s=r-(i>0?0:1);i>0?s=0;s+=i){let r=t.child(s);if(r.isAtom){if(!o&&at.isSelectable(r))return at.create(e,n-(i<0?r.nodeSize:0))}else{let t=dt(e,r,n+i,i<0?r.childCount:0,i,o);if(t)return t}n+=r.nodeSize*i}return null}function pt(e,t,n){let r=e.steps.length-1;if(r{null==i&&(i=r)})),e.setSelection(nt.near(e.doc.resolve(i),n)))}class ft extends et{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=2,this}ensureMarks(e){return p.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(2&this.updated)>0}addStep(e,t){super.addStep(e,t),this.updated=-3&this.updated,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,t=!0){let n=this.selection;return t&&(e=e.mark(this.storedMarks||(n.empty?n.$from.marks():n.$from.marksAcross(n.$to)||p.none))),n.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,t,n){let r=this.doc.type.schema;if(null==t)return e?this.replaceSelectionWith(r.text(e),!0):this.deleteSelection();{if(null==n&&(n=t),n=null==n?t:n,!e)return this.deleteRange(t,n);let i=this.storedMarks;if(!i){let e=this.doc.resolve(t);i=n==t?e.marks():e.marksAcross(this.doc.resolve(n))}return this.replaceRangeWith(t,n,r.text(e,i)),this.selection.empty||this.setSelection(nt.near(this.selection.$to)),this}}setMeta(e,t){return this.meta["string"==typeof e?e:e.key]=t,this}getMeta(e){return this.meta["string"==typeof e?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=4,this}get scrolledIntoView(){return(4&this.updated)>0}}function mt(e,t){return t&&e?e.bind(t):e}class gt{constructor(e,t,n){this.name=e,this.init=mt(t.init,n),this.apply=mt(t.apply,n)}}const yt=[new gt("doc",{init:e=>e.doc||e.schema.topNodeType.createAndFill(),apply:e=>e.doc}),new gt("selection",{init:(e,t)=>e.selection||nt.atStart(t.doc),apply:e=>e.selection}),new gt("storedMarks",{init:e=>e.storedMarks||null,apply:(e,t,n,r)=>r.selection.$cursor?e.storedMarks:null}),new gt("scrollToSelection",{init:()=>0,apply:(e,t)=>e.scrolledIntoView?t+1:t})];class kt{constructor(e,t){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=yt.slice(),t&&t.forEach((e=>{if(this.pluginsByKey[e.key])throw new RangeError("Adding different instances of a keyed plugin ("+e.key+")");this.plugins.push(e),this.pluginsByKey[e.key]=e,e.spec.state&&this.fields.push(new gt(e.key,e.spec.state,e))}))}}class bt{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,t=-1){for(let n=0;ne.toJSON()))),e&&"object"==typeof e)for(let n in e){if("doc"==n||"selection"==n)throw new RangeError("The JSON fields `doc` and `selection` are reserved");let r=e[n],i=r.spec.state;i&&i.toJSON&&(t[n]=i.toJSON.call(r,this[r.key]))}return t}static fromJSON(e,t,n){if(!t)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let r=new kt(e.schema,e.plugins),i=new bt(r);return r.fields.forEach((r=>{if("doc"==r.name)i.doc=F.fromJSON(e.schema,t.doc);else if("selection"==r.name)i.selection=nt.fromJSON(i.doc,t.selection);else if("storedMarks"==r.name)t.storedMarks&&(i.storedMarks=t.storedMarks.map(e.schema.markFromJSON));else{if(n)for(let o in n){let s=n[o],l=s.spec.state;if(s.key==r.name&&l&&l.fromJSON&&Object.prototype.hasOwnProperty.call(t,o))return void(i[r.name]=l.fromJSON.call(s,e,t[o],i))}i[r.name]=r.init(e,i)}})),i}}function vt(e,t,n){for(let r in e){let i=e[r];i instanceof Function?i=i.bind(t):"handleDOMEvents"==r&&(i=vt(i,t,{})),n[r]=i}return n}class wt{constructor(e){this.spec=e,this.props={},e.props&&vt(e.props,this,this.props),this.key=e.key?e.key.key:Ct("plugin")}getState(e){return e[this.key]}}const xt=Object.create(null);function Ct(e){return e in xt?e+"$"+ ++xt[e]:(xt[e]=0,e+"$")}class Dt{constructor(e="key"){this.key=Ct(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}}const St=function(e){for(var t=0;;t++)if(!(e=e.previousSibling))return t},_t=function(e){let t=e.assignedSlot||e.parentNode;return t&&11==t.nodeType?t.host:t};let Et=null;const At=function(e,t,n){let r=Et||(Et=document.createRange());return r.setEnd(e,null==n?e.nodeValue.length:n),r.setStart(e,t||0),r},Mt=function(e,t,n,r){return n&&(Tt(e,t,n,r,-1)||Tt(e,t,n,r,1))},Ot=/^(img|br|input|textarea|hr)$/i;function Tt(e,t,n,r,i){for(;;){if(e==n&&t==r)return!0;if(t==(i<0?0:Nt(e))){let n=e.parentNode;if(!n||1!=n.nodeType||Ft(e)||Ot.test(e.nodeName)||"false"==e.contentEditable)return!1;t=St(e)+(i<0?0:1),e=n}else{if(1!=e.nodeType)return!1;if("false"==(e=e.childNodes[t+(i<0?-1:0)]).contentEditable)return!1;t=i<0?Nt(e):0}}}function Nt(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function Ft(e){let t;for(let n=e;n&&!(t=n.pmViewDesc);n=n.parentNode);return t&&t.node&&t.node.isBlock&&(t.dom==e||t.contentDOM==e)}const It=function(e){return e.focusNode&&Mt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)};function Rt(e,t){let n=document.createEvent("Event");return n.initEvent("keydown",!0,!0),n.keyCode=e,n.key=n.code=t,n}const Bt="undefined"!=typeof navigator?navigator:null,zt="undefined"!=typeof document?document:null,Lt=Bt&&Bt.userAgent||"",Pt=/Edge\/(\d+)/.exec(Lt),qt=/MSIE \d/.exec(Lt),$t=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Lt),Vt=!!(qt||$t||Pt),jt=qt?document.documentMode:$t?+$t[1]:Pt?+Pt[1]:0,Ut=!Vt&&/gecko\/(\d+)/i.test(Lt);Ut&&(/Firefox\/(\d+)/.exec(Lt)||[0,0])[1];const Wt=!Vt&&/Chrome\/(\d+)/.exec(Lt),Ht=!!Wt,Jt=Wt?+Wt[1]:0,Kt=!Vt&&!!Bt&&/Apple Computer/.test(Bt.vendor),Gt=Kt&&(/Mobile\/\w+/.test(Lt)||!!Bt&&Bt.maxTouchPoints>2),Zt=Gt||!!Bt&&/Mac/.test(Bt.platform),Yt=!!Bt&&/Win/.test(Bt.platform),Qt=/Android \d/.test(Lt),Xt=!!zt&&"webkitFontSmoothing"in zt.documentElement.style,en=Xt?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function tn(e){let t=e.defaultView&&e.defaultView.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:e.documentElement.clientWidth,top:0,bottom:e.documentElement.clientHeight}}function nn(e,t){return"number"==typeof e?e:e[t]}function rn(e){let t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,r=t.height/e.offsetHeight||1;return{left:t.left,right:t.left+e.clientWidth*n,top:t.top,bottom:t.top+e.clientHeight*r}}function on(e,t,n){let r=e.someProp("scrollThreshold")||0,i=e.someProp("scrollMargin")||5,o=e.dom.ownerDocument;for(let s=n||e.dom;s;){if(1!=s.nodeType){s=_t(s);continue}let e=s,n=e==o.body,l=n?tn(o):rn(e),a=0,c=0;if(t.topl.bottom-nn(r,"bottom")&&(c=t.bottom-t.top>l.bottom-l.top?t.top+nn(i,"top")-l.top:t.bottom-l.bottom+nn(i,"bottom")),t.leftl.right-nn(r,"right")&&(a=t.right-l.right+nn(i,"right")),a||c)if(n)o.defaultView.scrollBy(a,c);else{let n=e.scrollLeft,r=e.scrollTop;c&&(e.scrollTop+=c),a&&(e.scrollLeft+=a);let i=e.scrollLeft-n,o=e.scrollTop-r;t={left:t.left-i,top:t.top-o,right:t.right-i,bottom:t.bottom-o}}let h=n?"fixed":getComputedStyle(s).position;if(/^(fixed|sticky)$/.test(h))break;s="absolute"==h?s.offsetParent:_t(s)}}function sn(e){let t=[],n=e.ownerDocument;for(let r=e;r&&(t.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),e!=n);r=_t(r));return t}function ln(e,t){for(let n=0;n=c){a=Math.max(p.bottom,a),c=Math.min(p.top,c);let e=p.left>t.left?p.left-t.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>t.top&&!i&&p.left<=t.left&&p.right>=t.left&&(i=h,o={left:Math.max(p.left,Math.min(p.right,t.left)),top:p.top});!n&&(t.left>=p.right&&t.top>=p.top||t.left>=p.left&&t.top>=p.bottom)&&(l=u+1)}}return!n&&i&&(n=i,r=o,s=0),n&&3==n.nodeType?function(e,t){let n=e.nodeValue.length,r=document.createRange();for(let i=0;i=(n.left+n.right)/2?1:0)}}return{node:e,offset:0}}(n,r):!n||s&&1==n.nodeType?{node:e,offset:l}:cn(n,r)}function hn(e,t){return e.left>=t.left-1&&e.left<=t.right+1&&e.top>=t.top-1&&e.top<=t.bottom+1}function un(e,t,n){let r=e.childNodes.length;if(r&&n.topt.top&&i++}let r;Xt&&i&&1==n.nodeType&&1==(r=n.childNodes[i-1]).nodeType&&"false"==r.contentEditable&&r.getBoundingClientRect().top>=t.top&&i--,n==e.dom&&i==n.childNodes.length-1&&1==n.lastChild.nodeType&&t.top>n.lastChild.getBoundingClientRect().bottom?s=e.state.doc.content.size:0!=i&&1==n.nodeType&&"BR"==n.childNodes[i-1].nodeName||(s=function(e,t,n,r){let i=-1;for(let n=t,o=!1;n!=e.dom;){let t,s=e.docView.nearestDesc(n,!0);if(!s)return null;if(1==s.dom.nodeType&&(s.node.isBlock&&s.parent||!s.contentDOM)&&((t=s.dom.getBoundingClientRect()).width||t.height)&&(s.node.isBlock&&s.parent&&(!o&&t.left>r.left||t.top>r.top?i=s.posBefore:(!o&&t.right-1?i:e.docView.posFromDOM(t,n,-1)}(e,n,i,t))}null==s&&(s=function(e,t,n){let{node:r,offset:i}=cn(t,n),o=-1;if(1==r.nodeType&&!r.firstChild){let e=r.getBoundingClientRect();o=e.left!=e.right&&n.left>(e.left+e.right)/2?1:-1}return e.docView.posFromDOM(r,i,o)}(e,l,t));let a=e.docView.nearestDesc(l,!0);return{pos:s,inside:a?a.posAtStart-a.border:-1}}function pn(e){return e.top=0&&i==r.nodeValue.length?(e--,o=1):n<0?e--:t++,yn(fn(At(r,e,t),o),o<0)}{let e=fn(At(r,i,i),n);if(Ut&&i&&/\s/.test(r.nodeValue[i-1])&&i=0)}if(null==o&&i&&(n<0||i==Nt(r))){let e=r.childNodes[i-1],t=3==e.nodeType?At(e,Nt(e)-(s?0:1)):1!=e.nodeType||"BR"==e.nodeName&&e.nextSibling?null:e;if(t)return yn(fn(t,1),!1)}if(null==o&&i=0)}function yn(e,t){if(0==e.width)return e;let n=t?e.left:e.right;return{top:e.top,bottom:e.bottom,left:n,right:n}}function kn(e,t){if(0==e.height)return e;let n=t?e.top:e.bottom;return{top:n,bottom:n,left:e.left,right:e.right}}function bn(e,t,n){let r=e.state,i=e.root.activeElement;r!=t&&e.updateState(t),i!=e.dom&&e.focus();try{return n()}finally{r!=t&&e.updateState(r),i!=e.dom&&i&&i.focus()}}const vn=/[\u0590-\u08ac]/;let wn=null,xn=null,Cn=!1;function Dn(e,t,n){return wn==t&&xn==n?Cn:(wn=t,xn=n,Cn="up"==n||"down"==n?function(e,t,n){let r=t.selection,i="up"==n?r.$from:r.$to;return bn(e,t,(()=>{let{node:t}=e.docView.domFromPos(i.pos,"up"==n?-1:1);for(;;){let n=e.docView.nearestDesc(t,!0);if(!n)break;if(n.node.isBlock){t=n.contentDOM||n.dom;break}t=n.dom.parentNode}let r=gn(e,i.pos,1);for(let e=t.firstChild;e;e=e.nextSibling){let t;if(1==e.nodeType)t=e.getClientRects();else{if(3!=e.nodeType)continue;t=At(e,0,e.nodeValue.length).getClientRects()}for(let e=0;ei.top+1&&("up"==n?r.top-i.top>2*(i.bottom-r.top):i.bottom-r.bottom>2*(r.bottom-i.top)))return!1}}return!0}))}(e,t,n):function(e,t,n){let{$head:r}=t.selection;if(!r.parent.isTextblock)return!1;let i=r.parentOffset,o=!i,s=i==r.parent.content.size,l=e.domSelection();return l?vn.test(r.parent.textContent)&&l.modify?bn(e,t,(()=>{let{focusNode:t,focusOffset:i,anchorNode:o,anchorOffset:s}=e.domSelectionRange(),a=l.caretBidiLevel;l.modify("move",n,"character");let c=r.depth?e.docView.domAfterPos(r.before()):e.dom,{focusNode:h,focusOffset:u}=e.domSelectionRange(),d=h&&!c.contains(1==h.nodeType?h:h.parentNode)||t==h&&i==u;try{l.collapse(o,s),t&&(t!=o||i!=s)&&l.extend&&l.extend(t,i)}catch(e){}return null!=a&&(l.caretBidiLevel=a),d})):"left"==n||"backward"==n?o:s:r.pos==r.start()||r.pos==r.end()}(e,t,n))}class Sn{constructor(e,t,n,r){this.parent=e,this.children=t,this.dom=n,this.contentDOM=r,this.dirty=0,n.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,t,n){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let t=0;tSt(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))r=2&e.compareDocumentPosition(this.contentDOM);else if(this.dom.firstChild){if(0==t)for(let t=e;;t=t.parentNode){if(t==this.dom){r=!1;break}if(t.previousSibling)break}if(null==r&&t==e.childNodes.length)for(let t=e;;t=t.parentNode){if(t==this.dom){r=!0;break}if(t.nextSibling)break}}return(null==r?n>0:r)?this.posAtEnd:this.posAtStart}nearestDesc(e,t=!1){for(let n=!0,r=e;r;r=r.parentNode){let i,o=this.getDesc(r);if(o&&(!t||o.node)){if(!n||!(i=o.nodeDOM)||(1==i.nodeType?i.contains(1==e.nodeType?e:e.parentNode):i==e))return o;n=!1}}}getDesc(e){let t=e.pmViewDesc;for(let e=t;e;e=e.parent)if(e==this)return t}posFromDOM(e,t,n){for(let r=e;r;r=r.parentNode){let i=this.getDesc(r);if(i)return i.localPosFromDOM(e,t,n)}return-1}descAt(e){for(let t=0,n=0;te||i instanceof Nn){r=e-t;break}t=o}if(r)return this.children[n].domFromPos(r-this.children[n].border,t);for(let e;n&&!(e=this.children[n-1]).size&&e instanceof _n&&e.side>=0;n--);if(t<=0){let e,r=!0;for(;e=n?this.children[n-1]:null,e&&e.dom.parentNode!=this.contentDOM;n--,r=!1);return e&&t&&r&&!e.border&&!e.domAtom?e.domFromPos(e.size,t):{node:this.contentDOM,offset:e?St(e.dom)+1:0}}{let e,r=!0;for(;e=n=i&&t<=l-n.border&&n.node&&n.contentDOM&&this.contentDOM.contains(n.contentDOM))return n.parseRange(e,t,i);e=o;for(let t=s;t>0;t--){let n=this.children[t-1];if(n.size&&n.dom.parentNode==this.contentDOM&&!n.emptyChildAt(1)){r=St(n.dom)+1;break}e-=n.size}-1==r&&(r=0)}if(r>-1&&(l>t||s==this.children.length-1)){t=l;for(let e=s+1;el&&ot){let e=s;s=l,l=e}let n=document.createRange();n.setEnd(l.node,l.offset),n.setStart(s.node,s.offset),a.removeAllRanges(),a.addRange(n)}}ignoreMutation(e){return!this.contentDOM&&"selection"!=e.type}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,t){for(let n=0,r=0;r=n:en){let r=n+i.border,s=o-i.border;if(e>=r&&t<=s)return this.dirty=e==n||t==o?2:1,void(e!=r||t!=s||!i.contentLost&&i.dom.parentNode==this.contentDOM?i.markDirty(e-r,t-r):i.dirty=3);i.dirty=i.dom!=i.contentDOM||i.dom.parentNode!=this.contentDOM||i.children.length?3:2}n=o}this.dirty=2}markParentsDirty(){let e=1;for(let t=this.parent;t;t=t.parent,e++){let n=1==e?2:1;t.dirtyi?i.parent?i.parent.posBeforeChild(i):void 0:r))),!t.type.spec.raw){if(1!=o.nodeType){let e=document.createElement("span");e.appendChild(o),o=e}o.contentEditable="false",o.classList.add("ProseMirror-widget")}super(e,[],o,null),this.widget=t,this.widget=t,i=this}matchesWidget(e){return 0==this.dirty&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let t=this.widget.spec.stopEvent;return!!t&&t(e)}ignoreMutation(e){return"selection"!=e.type||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get side(){return this.widget.type.side}}class En extends Sn{constructor(e,t,n,r){super(e,[],t,null),this.textDOM=n,this.text=r}get size(){return this.text.length}localPosFromDOM(e,t){return e!=this.textDOM?this.posAtStart+(t?this.size:0):this.posAtStart+t}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return"characterData"===e.type&&e.target.nodeValue==e.oldValue}}class An extends Sn{constructor(e,t,n,r,i){super(e,[],n,r),this.mark=t,this.spec=i}static create(e,t,n,r){let i=r.nodeViews[t.type.name],o=i&&i(t,r,n);return o&&o.dom||(o=he.renderSpec(document,t.type.spec.toDOM(t,n),null,t.attrs)),new An(e,t,o.dom,o.contentDOM||o.dom,o)}parseRule(){return 3&this.dirty||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return 3!=this.dirty&&this.mark.eq(e)}markDirty(e,t){if(super.markDirty(e,t),0!=this.dirty){let e=this.parent;for(;!e.node;)e=e.parent;e.dirty0&&(i=Wn(i,0,e,n));for(let e=0;es?s.parent?s.parent.posBeforeChild(s):void 0:o),n,r),c=a&&a.dom,h=a&&a.contentDOM;if(t.isText)if(c){if(3!=c.nodeType)throw new RangeError("Text must be rendered as a DOM text node")}else c=document.createTextNode(t.text);else if(!c){let e=he.renderSpec(document,t.type.spec.toDOM(t),null,t.attrs);({dom:c,contentDOM:h}=e)}h||t.isText||"BR"==c.nodeName||(c.hasAttribute("contenteditable")||(c.contentEditable="false"),t.type.spec.draggable&&(c.draggable=!0));let u=c;return c=qn(c,n,t),a?s=new Fn(e,t,n,r,c,h||null,u,a,i,o+1):t.isText?new Tn(e,t,n,r,c,u,i):new Mn(e,t,n,r,c,h||null,u,i,o+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if("pre"==this.node.type.whitespace&&(e.preserveWhitespace="full"),this.contentDOM)if(this.contentLost){for(let t=this.children.length-1;t>=0;t--){let n=this.children[t];if(this.dom.contains(n.dom.parentNode)){e.contentElement=n.dom.parentNode;break}}e.contentElement||(e.getContent=()=>c.empty)}else e.contentElement=this.contentDOM;else e.getContent=()=>this.node.content;return e}matchesNode(e,t,n){return 0==this.dirty&&e.eq(this.node)&&$n(t,this.outerDeco)&&n.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,t){let n=this.node.inlineContent,r=t,i=e.composing?this.localCompositionInfo(e,t):null,o=i&&i.pos>-1?i:null,s=i&&i.pos<0,l=new jn(this,o&&o.node,e);!function(e,t,n,r){let i=t.locals(e),o=0;if(0==i.length){for(let n=0;no;)l.push(i[s++]);let f=o+d.nodeSize;if(d.isText){let e=f;s!e.inline)):l.slice(),t.forChild(o,d),p),o=f}}(this.node,this.innerDeco,((t,i,o)=>{t.spec.marks?l.syncToMarks(t.spec.marks,n,e):t.type.side>=0&&!o&&l.syncToMarks(i==this.node.childCount?p.none:this.node.child(i).marks,n,e),l.placeWidget(t,e,r)}),((t,o,a,c)=>{let h;l.syncToMarks(t.marks,n,e),l.findNodeMatch(t,o,a,c)||s&&e.state.selection.from>r&&e.state.selection.to-1&&l.updateNodeAt(t,o,a,h,e)||l.updateNextNode(t,o,a,e,c,r)||l.addNode(t,o,a,e,r),r+=t.nodeSize})),l.syncToMarks([],n,e),this.node.isTextblock&&l.addTextblockHacks(),l.destroyRest(),(l.changed||2==this.dirty)&&(o&&this.protectLocalComposition(e,o),In(this.contentDOM,this.children,e),Gt&&function(e){if("UL"==e.nodeName||"OL"==e.nodeName){let t=e.style.cssText;e.style.cssText=t+"; list-style: square !important",window.getComputedStyle(e).listStyle,e.style.cssText=t}}(this.dom))}localCompositionInfo(e,t){let{from:n,to:r}=e.state.selection;if(!(e.state.selection instanceof st)||nt+this.node.content.size)return null;let i=e.input.compositionNode;if(!i||!this.dom.contains(i.parentNode))return null;if(this.node.inlineContent){let e=i.nodeValue,o=function(e,t,n,r){for(let i=0,o=0;i=n){if(o>=r&&a.slice(r-t.length-l,r-l)==t)return r-t.length;let e=l=0&&e+t.length+l>=n)return l+e;if(n==r&&a.length>=r+t.length-l&&a.slice(r-l,r-l+t.length)==t)return r}}return-1}(this.node.content,e,n-t,r-t);return o<0?null:{node:i,pos:o,text:e}}return{node:i,pos:-1,text:""}}protectLocalComposition(e,{node:t,pos:n,text:r}){if(this.getDesc(t))return;let i=t;for(;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=void 0)}let o=new En(this,i,t,r);e.input.compositionNodes.push(o),this.children=Wn(this.children,n,n+r.length,e,o)}update(e,t,n,r){return!(3==this.dirty||!e.sameMarkup(this.node))&&(this.updateInner(e,t,n,r),!0)}updateInner(e,t,n,r){this.updateOuterDeco(t),this.node=e,this.innerDeco=n,this.contentDOM&&this.updateChildren(r,this.posAtStart),this.dirty=0}updateOuterDeco(e){if($n(e,this.outerDeco))return;let t=1!=this.nodeDOM.nodeType,n=this.dom;this.dom=Ln(this.dom,this.nodeDOM,zn(this.outerDeco,this.node,t),zn(e,this.node,t)),this.dom!=n&&(n.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){1==this.nodeDOM.nodeType&&this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)}deselectNode(){1==this.nodeDOM.nodeType&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}}function On(e,t,n,r,i){qn(r,t,e);let o=new Mn(void 0,e,t,n,r,r,r,i,0);return o.contentDOM&&o.updateChildren(i,0),o}class Tn extends Mn{constructor(e,t,n,r,i,o,s){super(e,t,n,r,i,null,o,s,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,t,n,r){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!e.sameMarkup(this.node))&&(this.updateOuterDeco(t),0==this.dirty&&e.text==this.node.text||e.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=e.text,r.trackWrites==this.nodeDOM&&(r.trackWrites=null)),this.node=e,this.dirty=0,!0)}inParent(){let e=this.parent.contentDOM;for(let t=this.nodeDOM;t;t=t.parentNode)if(t==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,t,n){return e==this.nodeDOM?this.posAtStart+Math.min(t,this.node.text.length):super.localPosFromDOM(e,t,n)}ignoreMutation(e){return"characterData"!=e.type&&"selection"!=e.type}slice(e,t,n){let r=this.node.cut(e,t),i=document.createTextNode(r.text);return new Tn(this.parent,r,this.outerDeco,this.innerDeco,i,i,n)}markDirty(e,t){super.markDirty(e,t),this.dom==this.nodeDOM||0!=e&&t!=this.nodeDOM.nodeValue.length||(this.dirty=3)}get domAtom(){return!1}isText(e){return this.node.text==e}}class Nn extends Sn{parseRule(){return{ignore:!0}}matchesHack(e){return 0==this.dirty&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return"IMG"==this.dom.nodeName}}class Fn extends Mn{constructor(e,t,n,r,i,o,s,l,a,c){super(e,t,n,r,i,o,s,a,c),this.spec=l}update(e,t,n,r){if(3==this.dirty)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let i=this.spec.update(e,t,n);return i&&this.updateInner(e,t,n,r),i}return!(!this.contentDOM&&!e.isLeaf)&&super.update(e,t,n,r)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,t,n,r){this.spec.setSelection?this.spec.setSelection(e,t,n.root):super.setSelection(e,t,n,r)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return!!this.spec.stopEvent&&this.spec.stopEvent(e)}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}}function In(e,t,n){let r=e.firstChild,i=!1;for(let o=0;o0;){let l;for(;;)if(r){let e=n.children[r-1];if(!(e instanceof An)){l=e,r--;break}n=e,r=e.children.length}else{if(n==t)break e;r=n.parent.children.indexOf(n),n=n.parent}let a=l.node;if(a){if(a!=e.child(i-1))break;--i,o.set(l,i),s.push(l)}}return{index:i,matched:o,matches:s.reverse()}}(e.node.content,e)}destroyBetween(e,t){if(e!=t){for(let n=e;n>1,o=Math.min(i,e.length);for(;r-1)r>this.index&&(this.changed=!0,this.destroyBetween(this.index,r)),this.top=this.top.children[this.index];else{let r=An.create(this.top,e[i],t,n);this.top.children.splice(this.index,0,r),this.top=r,this.changed=!0}this.index=0,i++}}findNodeMatch(e,t,n,r){let i,o=-1;if(r>=this.preMatch.index&&(i=this.preMatch.matches[r-this.preMatch.index]).parent==this.top&&i.matchesNode(e,t,n))o=this.top.children.indexOf(i,this.index);else for(let r=this.index,i=Math.min(this.top.children.length,r+5);r=n||h<=t?o.push(a):(cn&&o.push(a.slice(n-c,a.size,r)))}return o}function Hn(e,t=null){let n=e.domSelectionRange(),r=e.state.doc;if(!n.focusNode)return null;let i=e.docView.nearestDesc(n.focusNode),o=i&&0==i.size,s=e.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l,a,c=r.resolve(s);if(It(n)){for(l=s;i&&!i.node;)i=i.parent;let e=i.node;if(i&&e.isAtom&&at.isSelectable(e)&&i.parent&&(!e.isInline||!function(e,t,n){for(let r=0==t,i=t==Nt(e);r||i;){if(e==n)return!0;let t=St(e);if(!(e=e.parentNode))return!1;r=r&&0==t,i=i&&t==Nt(e)}}(n.focusNode,n.focusOffset,i.dom))){let e=i.posBefore;a=new at(s==e?c:r.resolve(e))}}else{if(n instanceof e.dom.ownerDocument.defaultView.Selection&&n.rangeCount>1){let t=s,i=s;for(let r=0;r{n.anchorNode==r&&n.anchorOffset==i||(t.removeEventListener("selectionchange",e.input.hideSelectionGuard),setTimeout((()=>{Jn(e)&&!e.state.selection.visible||e.dom.classList.remove("ProseMirror-hideselection")}),20))})}(e))}e.domObserver.setCurSelection(),e.domObserver.connectSelection()}}const Gn=Kt||Ht&&Jt<63;function Zn(e,t){let{node:n,offset:r}=e.docView.domFromPos(t,0),i=rr(e,t,n)))||st.between(t,n,r)}function nr(e){return!(e.editable&&!e.hasFocus())&&rr(e)}function rr(e){let t=e.domSelectionRange();if(!t.anchorNode)return!1;try{return e.dom.contains(3==t.anchorNode.nodeType?t.anchorNode.parentNode:t.anchorNode)&&(e.editable||e.dom.contains(3==t.focusNode.nodeType?t.focusNode.parentNode:t.focusNode))}catch(e){return!1}}function ir(e,t){let{$anchor:n,$head:r}=e.selection,i=t>0?n.max(r):n.min(r),o=i.parent.inlineContent?i.depth?e.doc.resolve(t>0?i.after():i.before()):null:i;return o&&nt.findFrom(o,t)}function or(e,t){return e.dispatch(e.state.tr.setSelection(t).scrollIntoView()),!0}function sr(e,t,n){let r=e.state.selection;if(!(r instanceof st)){if(r instanceof at&&r.node.isInline)return or(e,new st(t>0?r.$to:r.$from));{let n=ir(e.state,t);return!!n&&or(e,n)}}if(n.indexOf("s")>-1){let{$head:n}=r,i=n.textOffset?null:t<0?n.nodeBefore:n.nodeAfter;if(!i||i.isText||!i.isLeaf)return!1;let o=e.state.doc.resolve(n.pos+i.nodeSize*(t<0?-1:1));return or(e,new st(r.$anchor,o))}if(!r.empty)return!1;if(e.endOfTextblock(t>0?"forward":"backward")){let n=ir(e.state,t);return!!(n&&n instanceof at)&&or(e,n)}if(!(Zt&&n.indexOf("m")>-1)){let n,i=r.$head,o=i.textOffset?null:t<0?i.nodeBefore:i.nodeAfter;if(!o||o.isText)return!1;let s=t<0?i.pos-o.nodeSize:i.pos;return!!(o.isAtom||(n=e.docView.descAt(s))&&!n.contentDOM)&&(at.isSelectable(o)?or(e,new at(t<0?e.state.doc.resolve(i.pos-o.nodeSize):i)):!!Xt&&or(e,new st(e.state.doc.resolve(t<0?s:s+o.nodeSize))))}}function lr(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function ar(e,t){let n=e.pmViewDesc;return n&&0==n.size&&(t<0||e.nextSibling||"BR"!=e.nodeName)}function cr(e,t){return t<0?function(e){let t=e.domSelectionRange(),n=t.focusNode,r=t.focusOffset;if(!n)return;let i,o,s=!1;Ut&&1==n.nodeType&&r0){if(1!=n.nodeType)break;{let e=n.childNodes[r-1];if(ar(e,-1))i=n,o=--r;else{if(3!=e.nodeType)break;n=e,r=n.nodeValue.length}}}else{if(hr(n))break;{let t=n.previousSibling;for(;t&&ar(t,-1);)i=n.parentNode,o=St(t),t=t.previousSibling;if(t)n=t,r=lr(n);else{if(n=n.parentNode,n==e.dom)break;r=0}}}s?ur(e,n,r):i&&ur(e,i,o)}(e):function(e){let t=e.domSelectionRange(),n=t.focusNode,r=t.focusOffset;if(!n)return;let i,o,s=lr(n);for(;;)if(r{e.state==i&&Kn(e)}),50)}function dr(e,t){let n=e.state.doc.resolve(t);if(!Ht&&!Yt&&n.parent.inlineContent){let r=e.coordsAtPos(t);if(t>n.start()){let n=e.coordsAtPos(t-1),i=(n.top+n.bottom)/2;if(i>r.top&&i1)return n.leftr.top&&i1)return n.left>r.left?"ltr":"rtl"}}return"rtl"==getComputedStyle(e.dom).direction?"rtl":"ltr"}function pr(e,t,n){let r=e.state.selection;if(r instanceof st&&!r.empty||n.indexOf("s")>-1)return!1;if(Zt&&n.indexOf("m")>-1)return!1;let{$from:i,$to:o}=r;if(!i.parent.inlineContent||e.endOfTextblock(t<0?"up":"down")){let n=ir(e.state,t);if(n&&n instanceof at)return or(e,n)}if(!i.parent.inlineContent){let n=t<0?i:o,s=r instanceof ht?nt.near(n,t):nt.findFrom(n,t);return!!s&&or(e,s)}return!1}function fr(e,t){if(!(e.state.selection instanceof st))return!0;let{$head:n,$anchor:r,empty:i}=e.state.selection;if(!n.sameParent(r))return!0;if(!i)return!1;if(e.endOfTextblock(t>0?"forward":"backward"))return!0;let o=!n.textOffset&&(t<0?n.nodeBefore:n.nodeAfter);if(o&&!o.isText){let r=e.state.tr;return t<0?r.delete(n.pos-o.nodeSize,n.pos):r.delete(n.pos,n.pos+o.nodeSize),e.dispatch(r),!0}return!1}function mr(e,t,n){e.domObserver.stop(),t.contentEditable=n,e.domObserver.start()}function gr(e,t){let n=t.keyCode,r=function(e){let t="";return e.ctrlKey&&(t+="c"),e.metaKey&&(t+="m"),e.altKey&&(t+="a"),e.shiftKey&&(t+="s"),t}(t);if(8==n||Zt&&72==n&&"c"==r)return fr(e,-1)||cr(e,-1);if(46==n&&!t.shiftKey||Zt&&68==n&&"c"==r)return fr(e,1)||cr(e,1);if(13==n||27==n)return!0;if(37==n||Zt&&66==n&&"c"==r){let t=37==n?"ltr"==dr(e,e.state.selection.from)?-1:1:-1;return sr(e,t,r)||cr(e,t)}if(39==n||Zt&&70==n&&"c"==r){let t=39==n?"ltr"==dr(e,e.state.selection.from)?1:-1:1;return sr(e,t,r)||cr(e,t)}return 38==n||Zt&&80==n&&"c"==r?pr(e,-1,r)||cr(e,-1):40==n||Zt&&78==n&&"c"==r?function(e){if(!Kt||e.state.selection.$head.parentOffset>0)return!1;let{focusNode:t,focusOffset:n}=e.domSelectionRange();if(t&&1==t.nodeType&&0==n&&t.firstChild&&"false"==t.firstChild.contentEditable){let n=t.firstChild;mr(e,n,"true"),setTimeout((()=>mr(e,n,"false")),20)}return!1}(e)||pr(e,1,r)||cr(e,1):r==(Zt?"m":"c")&&(66==n||73==n||89==n||90==n)}function yr(e,t){e.someProp("transformCopied",(n=>{t=n(t,e)}));let n=[],{content:r,openStart:i,openEnd:o}=t;for(;i>1&&o>1&&1==r.childCount&&1==r.firstChild.childCount;){i--,o--;let e=r.firstChild;n.push(e.type.name,e.attrs!=e.type.defaultAttrs?e.attrs:null),r=e.content}let s=e.someProp("clipboardSerializer")||he.fromSchema(e.state.schema),l=Er(),a=l.createElement("div");a.appendChild(s.serializeFragment(r,{document:l}));let c,h=a.firstChild,u=0;for(;h&&1==h.nodeType&&(c=Sr[h.nodeName.toLowerCase()]);){for(let e=c.length-1;e>=0;e--){let t=l.createElement(c[e]);for(;a.firstChild;)t.appendChild(a.firstChild);a.appendChild(t),u++}h=a.firstChild}return h&&1==h.nodeType&&h.setAttribute("data-pm-slice",`${i} ${o}${u?` -${u}`:""} ${JSON.stringify(n)}`),{dom:a,text:e.someProp("clipboardTextSerializer",(n=>n(t,e)))||t.content.textBetween(0,t.content.size,"\n\n"),slice:t}}function kr(e,t,n,r,i){let o,s,l=i.parent.type.spec.code;if(!n&&!t)return null;let a=t&&(r||l||!n);if(a){if(e.someProp("transformPastedText",(n=>{t=n(t,l||r,e)})),l)return t?new m(c.from(e.state.schema.text(t.replace(/\r\n?/g,"\n"))),0,0):m.empty;let n=e.someProp("clipboardTextParser",(n=>n(t,i,r,e)));if(n)s=n;else{let n=i.marks(),{schema:r}=e.state,s=he.fromSchema(r);o=document.createElement("div"),t.split(/(?:\r\n?|\n)+/).forEach((e=>{let t=o.appendChild(document.createElement("p"));e&&t.appendChild(s.serializeNode(r.text(e,n)))}))}}else e.someProp("transformPastedHTML",(t=>{n=t(n,e)})),o=function(e){let t=/^(\s*]*>)*/.exec(e);t&&(e=e.slice(t[0].length));let n,r=Er().createElement("div"),i=/<([a-z][^>\s]+)/i.exec(e);(n=i&&Sr[i[1].toLowerCase()])&&(e=n.map((e=>"<"+e+">")).join("")+e+n.map((e=>"")).reverse().join(""));if(r.innerHTML=function(e){let t=window.trustedTypes;if(!t)return e;Ar||(Ar=t.defaultPolicy||t.createPolicy("ProseMirrorClipboard",{createHTML:e=>e}));return Ar.createHTML(e)}(e),n)for(let e=0;e0;e--){let e=o.firstChild;for(;e&&1!=e.nodeType;)e=e.nextSibling;if(!e)break;o=e}if(!s){let t=e.someProp("clipboardParser")||e.someProp("domParser")||ee.fromSchema(e.state.schema);s=t.parseSlice(o,{preserveWhitespace:!(!a&&!u),context:i,ruleFromNode:e=>"BR"!=e.nodeName||e.nextSibling||!e.parentNode||br.test(e.parentNode.nodeName)?null:{ignore:!0}})}if(u)s=function(e,t){if(!e.size)return e;let n,r=e.content.firstChild.type.schema;try{n=JSON.parse(t)}catch(t){return e}let{content:i,openStart:o,openEnd:s}=e;for(let e=n.length-2;e>=0;e-=2){let t=r.nodes[n[e]];if(!t||t.hasRequiredAttrs())break;i=c.from(t.create(n[e+1],i)),o++,s++}return new m(i,o,s)}(Dr(s,+u[1],+u[2]),u[4]);else if(s=m.maxOpen(function(e,t){if(e.childCount<2)return e;for(let n=t.depth;n>=0;n--){let r,i=t.node(n).contentMatchAt(t.index(n)),o=[];if(e.forEach((e=>{if(!o)return;let t,n=i.findWrapping(e.type);if(!n)return o=null;if(t=o.length&&r.length&&wr(n,r,e,o[o.length-1],0))o[o.length-1]=t;else{o.length&&(o[o.length-1]=xr(o[o.length-1],r.length));let t=vr(e,n);o.push(t),i=i.matchType(t.type),r=n}})),o)return c.from(o)}return e}(s.content,i),!0),s.openStart||s.openEnd){let e=0,t=0;for(let t=s.content.firstChild;e{s=t(s,e)})),s}const br=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function vr(e,t,n=0){for(let r=t.length-1;r>=n;r--)e=t[r].create(null,c.from(e));return e}function wr(e,t,n,r,i){if(i1&&(o=0),i=n&&(l=t<0?s.contentMatchAt(0).fillBefore(l,o<=i).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(c.empty,!0))),e.replaceChild(t<0?0:e.childCount-1,s.copy(l))}function Dr(e,t,n){return t{for(let n in t)e.input.eventHandlers[n]||e.dom.addEventListener(n,e.input.eventHandlers[n]=t=>Rr(e,t))}))}function Rr(e,t){return e.someProp("handleDOMEvents",(n=>{let r=n[t.type];return!!r&&(r(e,t)||t.defaultPrevented)}))}function Br(e,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let n=t.target;n!=e.dom;n=n.parentNode)if(!n||11==n.nodeType||n.pmViewDesc&&n.pmViewDesc.stopEvent(t))return!1;return!0}function zr(e){return{left:e.clientX,top:e.clientY}}function Lr(e,t,n,r,i){if(-1==r)return!1;let o=e.state.doc.resolve(r);for(let r=o.depth+1;r>0;r--)if(e.someProp(t,(t=>r>o.depth?t(e,n,o.nodeAfter,o.before(r),i,!0):t(e,n,o.node(r),o.before(r),i,!1))))return!0;return!1}function Pr(e,t,n){if(e.focused||e.focus(),e.state.selection.eq(t))return;let r=e.state.tr.setSelection(t);"pointer"==n&&r.setMeta("pointer",!0),e.dispatch(r)}function qr(e,t,n,r,i){return Lr(e,"handleClickOn",t,n,r)||e.someProp("handleClick",(n=>n(e,t,r)))||(i?function(e,t){if(-1==t)return!1;let n,r,i=e.state.selection;i instanceof at&&(n=i.node);let o=e.state.doc.resolve(t);for(let e=o.depth+1;e>0;e--){let t=e>o.depth?o.nodeAfter:o.node(e);if(at.isSelectable(t)){r=n&&i.$from.depth>0&&e>=i.$from.depth&&o.before(i.$from.depth+1)==i.$from.pos?o.before(i.$from.depth):o.before(e);break}}return null!=r&&(Pr(e,at.create(e.state.doc,r),"pointer"),!0)}(e,n):function(e,t){if(-1==t)return!1;let n=e.state.doc.resolve(t),r=n.nodeAfter;return!!(r&&r.isAtom&&at.isSelectable(r))&&(Pr(e,new at(n),"pointer"),!0)}(e,n))}function $r(e,t,n,r){return Lr(e,"handleDoubleClickOn",t,n,r)||e.someProp("handleDoubleClick",(n=>n(e,t,r)))}function Vr(e,t,n,r){return Lr(e,"handleTripleClickOn",t,n,r)||e.someProp("handleTripleClick",(n=>n(e,t,r)))||function(e,t,n){if(0!=n.button)return!1;let r=e.state.doc;if(-1==t)return!!r.inlineContent&&(Pr(e,st.create(r,0,r.content.size),"pointer"),!0);let i=r.resolve(t);for(let t=i.depth+1;t>0;t--){let n=t>i.depth?i.nodeAfter:i.node(t),o=i.before(t);if(n.inlineContent)Pr(e,st.create(r,o+1,o+1+n.content.size),"pointer");else{if(!at.isSelectable(n))continue;Pr(e,at.create(r,o),"pointer")}return!0}}(e,n,r)}function jr(e){return Yr(e)}Or.keydown=(e,t)=>{let n=t;if(e.input.shiftKey=16==n.keyCode||n.shiftKey,!Hr(e,n)&&(e.input.lastKeyCode=n.keyCode,e.input.lastKeyCodeTime=Date.now(),!Qt||!Ht||13!=n.keyCode))if(229!=n.keyCode&&e.domObserver.forceFlush(),!Gt||13!=n.keyCode||n.ctrlKey||n.altKey||n.metaKey)e.someProp("handleKeyDown",(t=>t(e,n)))||gr(e,n)?n.preventDefault():Fr(e,"key");else{let t=Date.now();e.input.lastIOSEnter=t,e.input.lastIOSEnterFallbackTimeout=setTimeout((()=>{e.input.lastIOSEnter==t&&(e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))),e.input.lastIOSEnter=0)}),200)}},Or.keyup=(e,t)=>{16==t.keyCode&&(e.input.shiftKey=!1)},Or.keypress=(e,t)=>{let n=t;if(Hr(e,n)||!n.charCode||n.ctrlKey&&!n.altKey||Zt&&n.metaKey)return;if(e.someProp("handleKeyPress",(t=>t(e,n))))return void n.preventDefault();let r=e.state.selection;if(!(r instanceof st&&r.$from.sameParent(r.$to))){let t=String.fromCharCode(n.charCode);/[\r\n]/.test(t)||e.someProp("handleTextInput",(n=>n(e,r.$from.pos,r.$to.pos,t)))||e.dispatch(e.state.tr.insertText(t).scrollIntoView()),n.preventDefault()}};const Ur=Zt?"metaKey":"ctrlKey";Mr.mousedown=(e,t)=>{let n=t;e.input.shiftKey=n.shiftKey;let r=jr(e),i=Date.now(),o="singleClick";i-e.input.lastClick.time<500&&function(e,t){let n=t.x-e.clientX,r=t.y-e.clientY;return n*n+r*r<100}(n,e.input.lastClick)&&!n[Ur]&&e.input.lastClick.button==n.button&&("singleClick"==e.input.lastClick.type?o="doubleClick":"doubleClick"==e.input.lastClick.type&&(o="tripleClick")),e.input.lastClick={time:i,x:n.clientX,y:n.clientY,type:o,button:n.button};let s=e.posAtCoords(zr(n));s&&("singleClick"==o?(e.input.mouseDown&&e.input.mouseDown.done(),e.input.mouseDown=new Wr(e,s,n,!!r)):("doubleClick"==o?$r:Vr)(e,s.pos,s.inside,n)?n.preventDefault():Fr(e,"pointer"))};class Wr{constructor(e,t,n,r){let i,o;if(this.view=e,this.pos=t,this.event=n,this.flushed=r,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!n[Ur],this.allowDefault=n.shiftKey,t.inside>-1)i=e.state.doc.nodeAt(t.inside),o=t.inside;else{let n=e.state.doc.resolve(t.pos);i=n.parent,o=n.depth?n.before():0}const s=r?null:n.target,l=s?e.docView.nearestDesc(s,!0):null;this.target=l&&1==l.dom.nodeType?l.dom:null;let{selection:a}=e.state;(0==n.button&&i.type.spec.draggable&&!1!==i.type.spec.selectable||a instanceof at&&a.from<=o&&a.to>o)&&(this.mightDrag={node:i,pos:o,addAttr:!(!this.target||this.target.draggable),setUneditable:!(!this.target||!Ut||this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),Fr(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout((()=>Kn(this.view))),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let t=this.pos;this.view.state.doc!=this.startDoc&&(t=this.view.posAtCoords(zr(e))),this.updateAllowDefault(e),this.allowDefault||!t?Fr(this.view,"pointer"):qr(this.view,t.pos,t.inside,e,this.selectNode)?e.preventDefault():0==e.button&&(this.flushed||Kt&&this.mightDrag&&!this.mightDrag.node.isAtom||Ht&&!this.view.state.selection.visible&&Math.min(Math.abs(t.pos-this.view.state.selection.from),Math.abs(t.pos-this.view.state.selection.to))<=2)?(Pr(this.view,nt.near(this.view.state.doc.resolve(t.pos)),"pointer"),e.preventDefault()):Fr(this.view,"pointer")}move(e){this.updateAllowDefault(e),Fr(this.view,"pointer"),0==e.buttons&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}}function Hr(e,t){return!!e.composing||!!(Kt&&Math.abs(t.timeStamp-e.input.compositionEndedAt)<500)&&(e.input.compositionEndedAt=-2e8,!0)}Mr.touchstart=e=>{e.input.lastTouch=Date.now(),jr(e),Fr(e,"pointer")},Mr.touchmove=e=>{e.input.lastTouch=Date.now(),Fr(e,"pointer")},Mr.contextmenu=e=>jr(e);const Jr=Qt?5e3:-1;function Kr(e,t){clearTimeout(e.input.composingTimeout),t>-1&&(e.input.composingTimeout=setTimeout((()=>Yr(e)),t))}function Gr(e){for(e.composing&&(e.input.composing=!1,e.input.compositionEndedAt=function(){let e=document.createEvent("Event");return e.initEvent("event",!0,!0),e.timeStamp}());e.input.compositionNodes.length>0;)e.input.compositionNodes.pop().markParentsDirty()}function Zr(e){let t=e.domSelectionRange();if(!t.focusNode)return null;let n=function(e,t){for(;;){if(3==e.nodeType&&t)return e;if(1==e.nodeType&&t>0){if("false"==e.contentEditable)return null;t=Nt(e=e.childNodes[t-1])}else{if(!e.parentNode||Ft(e))return null;t=St(e),e=e.parentNode}}}(t.focusNode,t.focusOffset),r=function(e,t){for(;;){if(3==e.nodeType&&t=0)){if(e.domObserver.forceFlush(),Gr(e),t||e.docView&&e.docView.dirty){let n=Hn(e),r=e.state.selection;return n&&!n.eq(r)?e.dispatch(e.state.tr.setSelection(n)):!e.markCursor&&!t||r.$from.node(r.$from.sharedDepth(r.to)).inlineContent?e.updateState(e.state):e.dispatch(e.state.tr.deleteSelection()),!0}return!1}}Or.compositionstart=Or.compositionupdate=e=>{if(!e.composing){e.domObserver.flush();let{state:t}=e,n=t.selection.$to;if(t.selection instanceof st&&(t.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some((e=>!1===e.type.spec.inclusive))))e.markCursor=e.state.storedMarks||n.marks(),Yr(e,!0),e.markCursor=null;else if(Yr(e,!t.selection.empty),Ut&&t.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let t=e.domSelectionRange();for(let n=t.focusNode,r=t.focusOffset;n&&1==n.nodeType&&0!=r;){let t=r<0?n.lastChild:n.childNodes[r-1];if(!t)break;if(3==t.nodeType){let n=e.domSelection();n&&n.collapse(t,t.nodeValue.length);break}n=t,r=-1}}e.input.composing=!0}Kr(e,Jr)},Or.compositionend=(e,t)=>{e.composing&&(e.input.composing=!1,e.input.compositionEndedAt=t.timeStamp,e.input.compositionPendingChanges=e.domObserver.pendingRecords().length?e.input.compositionID:0,e.input.compositionNode=null,e.input.compositionPendingChanges&&Promise.resolve().then((()=>e.domObserver.flush())),e.input.compositionID++,Kr(e,20))};const Qr=Vt&&jt<15||Gt&&en<604;function Xr(e,t,n,r,i){let o=kr(e,t,n,r,e.state.selection.$from);if(e.someProp("handlePaste",(t=>t(e,i,o||m.empty))))return!0;if(!o)return!1;let s=function(e){return 0==e.openStart&&0==e.openEnd&&1==e.content.childCount?e.content.firstChild:null}(o),l=s?e.state.tr.replaceSelectionWith(s,r):e.state.tr.replaceSelection(o);return e.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function ei(e){let t=e.getData("text/plain")||e.getData("Text");if(t)return t;let n=e.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}Mr.copy=Or.cut=(e,t)=>{let n=t,r=e.state.selection,i="cut"==n.type;if(r.empty)return;let o=Qr?null:n.clipboardData,s=r.content(),{dom:l,text:a}=yr(e,s);o?(n.preventDefault(),o.clearData(),o.setData("text/html",l.innerHTML),o.setData("text/plain",a)):function(e,t){if(!e.dom.parentNode)return;let n=e.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(t),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),i=document.createRange();i.selectNodeContents(t),e.dom.blur(),r.removeAllRanges(),r.addRange(i),setTimeout((()=>{n.parentNode&&n.parentNode.removeChild(n),e.focus()}),50)}(e,l),i&&e.dispatch(e.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))},Or.paste=(e,t)=>{let n=t;if(e.composing&&!Qt)return;let r=Qr?null:n.clipboardData,i=e.input.shiftKey&&45!=e.input.lastKeyCode;r&&Xr(e,ei(r),r.getData("text/html"),i,n)?n.preventDefault():function(e,t){if(!e.dom.parentNode)return;let n=e.input.shiftKey||e.state.selection.$from.parent.type.spec.code,r=e.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let i=e.input.shiftKey&&45!=e.input.lastKeyCode;setTimeout((()=>{e.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Xr(e,r.value,null,i,t):Xr(e,r.textContent,r.innerHTML,i,t)}),50)}(e,n)};class ti{constructor(e,t,n){this.slice=e,this.move=t,this.node=n}}const ni=Zt?"altKey":"ctrlKey";function ri(e,t){let n=e.someProp("dragCopies",(e=>!e(t)));return null!=n?n:!t[ni]}Mr.dragstart=(e,t)=>{let n=t,r=e.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let i,o=e.state.selection,s=o.empty?null:e.posAtCoords(zr(n));if(s&&s.pos>=o.from&&s.pos<=(o instanceof at?o.to-1:o.to));else if(r&&r.mightDrag)i=at.create(e.state.doc,r.mightDrag.pos);else if(n.target&&1==n.target.nodeType){let t=e.docView.nearestDesc(n.target,!0);t&&t.node.type.spec.draggable&&t!=e.docView&&(i=at.create(e.state.doc,t.posBefore))}let l=(i||e.state.selection).content(),{dom:a,text:c,slice:h}=yr(e,l);(!n.dataTransfer.files.length||!Ht||Jt>120)&&n.dataTransfer.clearData(),n.dataTransfer.setData(Qr?"Text":"text/html",a.innerHTML),n.dataTransfer.effectAllowed="copyMove",Qr||n.dataTransfer.setData("text/plain",c),e.dragging=new ti(h,ri(e,n),i)},Mr.dragend=e=>{let t=e.dragging;window.setTimeout((()=>{e.dragging==t&&(e.dragging=null)}),50)},Or.dragover=Or.dragenter=(e,t)=>t.preventDefault(),Or.drop=(e,t)=>{let n=t,r=e.dragging;if(e.dragging=null,!n.dataTransfer)return;let i=e.posAtCoords(zr(n));if(!i)return;let o=e.state.doc.resolve(i.pos),s=r&&r.slice;s?e.someProp("transformPasted",(t=>{s=t(s,e)})):s=kr(e,ei(n.dataTransfer),Qr?null:n.dataTransfer.getData("text/html"),!1,o);let l=!(!r||!ri(e,n));if(e.someProp("handleDrop",(t=>t(e,n,s||m.empty,l))))return void n.preventDefault();if(!s)return;n.preventDefault();let a=s?function(e,t,n){let r=e.resolve(t);if(!n.content.size)return t;let i=n.content;for(let e=0;e=0;t--){let n=t==r.depth?0:r.pos<=(r.start(t+1)+r.end(t+1))/2?-1:1,o=r.index(t)+(n>0?1:0),s=r.node(t),l=!1;if(1==e)l=s.canReplace(o,o,i);else{let e=s.contentMatchAt(o).findWrapping(i.firstChild.type);l=e&&s.canReplaceWith(o,o,e[0])}if(l)return 0==n?r.pos:n<0?r.before(t+1):r.after(t+1)}return null}(e.state.doc,o.pos,s):o.pos;null==a&&(a=o.pos);let c=e.state.tr;if(l){let{node:e}=r;e?e.replace(c):c.deleteSelection()}let h=c.mapping.map(a),u=0==s.openStart&&0==s.openEnd&&1==s.content.childCount,d=c.doc;if(u?c.replaceRangeWith(h,h,s.content.firstChild):c.replaceRange(h,h,s),c.doc.eq(d))return;let p=c.doc.resolve(h);if(u&&at.isSelectable(s.content.firstChild)&&p.nodeAfter&&p.nodeAfter.sameMarkup(s.content.firstChild))c.setSelection(new at(p));else{let t=c.mapping.map(a);c.mapping.maps[c.mapping.maps.length-1].forEach(((e,n,r,i)=>t=i)),c.setSelection(tr(e,p,c.doc.resolve(t)))}e.focus(),e.dispatch(c.setMeta("uiEvent","drop"))},Mr.focus=e=>{e.input.lastFocus=Date.now(),e.focused||(e.domObserver.stop(),e.dom.classList.add("ProseMirror-focused"),e.domObserver.start(),e.focused=!0,setTimeout((()=>{e.docView&&e.hasFocus()&&!e.domObserver.currentSelection.eq(e.domSelectionRange())&&Kn(e)}),20))},Mr.blur=(e,t)=>{let n=t;e.focused&&(e.domObserver.stop(),e.dom.classList.remove("ProseMirror-focused"),e.domObserver.start(),n.relatedTarget&&e.dom.contains(n.relatedTarget)&&e.domObserver.currentSelection.clear(),e.focused=!1)},Mr.beforeinput=(e,t)=>{if(Ht&&Qt&&"deleteContentBackward"==t.inputType){e.domObserver.flushSoon();let{domChangeCount:t}=e.input;setTimeout((()=>{if(e.input.domChangeCount!=t)return;if(e.dom.blur(),e.focus(),e.someProp("handleKeyDown",(t=>t(e,Rt(8,"Backspace")))))return;let{$cursor:n}=e.state.selection;n&&n.pos>0&&e.dispatch(e.state.tr.delete(n.pos-1,n.pos).scrollIntoView())}),50)}};for(let e in Or)Mr[e]=Or[e];function ii(e,t){if(e==t)return!0;for(let n in e)if(e[n]!==t[n])return!1;for(let n in t)if(!(n in e))return!1;return!0}class oi{constructor(e,t){this.toDOM=e,this.spec=t||hi,this.side=this.spec.side||0}map(e,t,n,r){let{pos:i,deleted:o}=e.mapResult(t.from+r,this.side<0?-1:1);return o?null:new ai(i-n,i-n,this)}valid(){return!0}eq(e){return this==e||e instanceof oi&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&ii(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}}class si{constructor(e,t){this.attrs=e,this.spec=t||hi}map(e,t,n,r){let i=e.map(t.from+r,this.spec.inclusiveStart?-1:1)-n,o=e.map(t.to+r,this.spec.inclusiveEnd?1:-1)-n;return i>=o?null:new ai(i,o,this)}valid(e,t){return t.from=e&&(!i||i(s.spec))&&n.push(s.copy(s.from+r,s.to+r))}for(let o=0;oe){let s=this.children[o]+1;this.children[o+2].findInner(e-s,t-s,n,r+s,i)}}map(e,t,n){return this==di||0==e.maps.length?this:this.mapInner(e,t,0,0,n||hi)}mapInner(e,t,n,r,i){let o;for(let s=0;s{let s=o-i-(n-e);for(let i=0;io+t-r)continue;let a=l[i]+t-r;n>=a?l[i+1]=e<=a?-2:-1:e>=t&&s&&(l[i]+=s,l[i+1]+=s)}r+=s})),t=n.maps[e].map(t,-1)}let a=!1;for(let t=0;t=r.content.size){a=!0;continue}let u=n.map(e[t+1]+o,-1)-i,{index:d,offset:p}=r.content.findIndex(h),f=r.maybeChild(d);if(f&&p==h&&p+f.nodeSize==u){let r=l[t+2].mapInner(n,f,c+1,e[t]+o+1,s);r!=di?(l[t]=h,l[t+1]=u,l[t+2]=r):(l[t+1]=-2,a=!0)}else a=!0}if(a){let a=function(e,t,n,r,i,o,s){function l(e,t){for(let o=0;o{let s,l=o+n;if(s=mi(t,e,l)){for(r||(r=this.children.slice());io&&t.to=e){this.children[t]==e&&(n=this.children[t+2]);break}let i=e+1,o=i+t.content.size;for(let e=0;ei&&t.type instanceof si){let e=Math.max(i,t.from)-i,n=Math.min(o,t.to)-i;en.map(e,t,hi)));return pi.from(n)}forChild(e,t){if(t.isLeaf)return ui.empty;let n=[];for(let r=0;re instanceof ui))?e:e.reduce(((e,t)=>e.concat(t instanceof ui?t:t.members)),[]))}}forEachSet(e){for(let t=0;tn&&t.to{let l=mi(e,t,s+n);if(l){o=!0;let e=yi(l,t,n+s+1,r);e!=di&&i.push(s,s+t.nodeSize,e)}}));let s=fi(o?gi(e):e,-n).sort(ki);for(let e=0;e0;)t++;e.splice(t,0,n)}function wi(e){let t=[];return e.someProp("decorations",(n=>{let r=n(e.state);r&&r!=di&&t.push(r)})),e.cursorWrapper&&t.push(ui.create(e.state.doc,[e.cursorWrapper.deco])),pi.from(t)}const xi={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},Ci=Vt&&jt<=11;class Di{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}}class Si{constructor(e,t){this.view=e,this.handleDOMChange=t,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Di,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver((e=>{for(let t=0;t"childList"==e.type&&e.removedNodes.length||"characterData"==e.type&&e.oldValue.length>e.target.nodeValue.length))?this.flushSoon():this.flush()})),Ci&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((()=>{this.flushingSoon=-1,this.flush()}),20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,xi)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let t=0;tthis.flush()),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout((()=>this.suppressingSelectionUpdates=!1),50)}onSelectionChange(){if(nr(this.view)){if(this.suppressingSelectionUpdates)return Kn(this.view);if(Vt&&jt<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Mt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let t,n=new Set;for(let t=e.focusNode;t;t=_t(t))n.add(t);for(let r=e.anchorNode;r;r=_t(r))if(n.has(r)){t=r;break}let r=t&&this.view.docView.nearestDesc(t);return r&&r.ignoreMutation({type:"selection",target:3==t.nodeType?t.parentNode:t})?(this.setCurSelection(),!0):void 0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let t=this.pendingRecords();t.length&&(this.queue=[]);let n=e.domSelectionRange(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(n)&&nr(e)&&!this.ignoreSelectionChange(n),i=-1,o=-1,s=!1,l=[];if(e.editable)for(let e=0;e"BR"==e.nodeName));if(2==t.length){let[e,n]=t;e.parentNode&&e.parentNode.parentNode==n.parentNode?n.remove():e.remove()}else{let{focusNode:n}=this.currentSelection;for(let r of t){let t=r.parentNode;!t||"LI"!=t.nodeName||n&&Mi(e,n)==t||r.remove()}}}let a=null;i<0&&r&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||r)&&(i>-1&&(e.docView.markDirty(i,o),function(e){if(_i.has(e))return;if(_i.set(e,null),-1!==["normal","nowrap","pre-line"].indexOf(getComputedStyle(e.dom).whiteSpace)){if(e.requiresGeckoHackNode=Ut,Ei)return;console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package."),Ei=!0}}(e)),this.handleDOMChange(i,o,s,l),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(n)||Kn(e),this.currentSelection.set(n))}registerMutation(e,t){if(t.indexOf(e.target)>-1)return null;let n=this.view.docView.nearestDesc(e.target);if("attributes"==e.type&&(n==this.view.docView||"contenteditable"==e.attributeName||"style"==e.attributeName&&!e.oldValue&&!e.target.getAttribute("style")))return null;if(!n||n.ignoreMutation(e))return null;if("childList"==e.type){for(let n=0;nDate.now()-50?e.input.lastSelectionOrigin:null,n=Hn(e,t);if(n&&!e.state.selection.eq(n)){if(Ht&&Qt&&13===e.input.lastKeyCode&&Date.now()-100t(e,Rt(13,"Enter")))))return;let r=e.state.tr.setSelection(n);"pointer"==t?r.setMeta("pointer",!0):"key"==t&&r.scrollIntoView(),o&&r.setMeta("composition",o),e.dispatch(r)}return}let s=e.state.doc.resolve(t),l=s.sharedDepth(n);t=s.before(l+1),n=e.state.doc.resolve(n).after(l+1);let a,h,u=e.state.selection,d=function(e,t,n){let r,{node:i,fromOffset:o,toOffset:s,from:l,to:a}=e.docView.parseRange(t,n),c=e.domSelectionRange(),h=c.anchorNode;if(h&&e.dom.contains(1==h.nodeType?h:h.parentNode)&&(r=[{node:h,offset:c.anchorOffset}],It(c)||r.push({node:c.focusNode,offset:c.focusOffset})),Ht&&8===e.input.lastKeyCode)for(let e=s;e>o;e--){let t=i.childNodes[e-1],n=t.pmViewDesc;if("BR"==t.nodeName&&!n){s=e;break}if(!n||n.size)break}let u=e.state.doc,d=e.someProp("domParser")||ee.fromSchema(e.state.schema),p=u.resolve(l),f=null,m=d.parse(i,{topNode:p.parent,topMatch:p.parent.contentMatchAt(p.index()),topOpen:!0,from:o,to:s,preserveWhitespace:"pre"!=p.parent.type.whitespace||"full",findPositions:r,ruleFromNode:Oi,context:p});if(r&&null!=r[0].pos){let e=r[0].pos,t=r[1]&&r[1].pos;null==t&&(t=e),f={anchor:e+l,head:t+l}}return{doc:m,sel:f,from:l,to:a}}(e,t,n),p=e.state.doc,f=p.slice(d.from,d.to);8===e.input.lastKeyCode&&Date.now()-100=s?o-r:0;o-=e,o&&o=l?o-r:0;o-=t,o&&oDate.now()-225||Qt)&&i.some((e=>1==e.nodeType&&!Ti.test(e.nodeName)))&&(!m||m.endA>=m.endB)&&e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))))return void(e.input.lastIOSEnter=0);if(!m){if(!(r&&u instanceof st&&!u.empty&&u.$head.sameParent(u.$anchor))||e.composing||d.sel&&d.sel.anchor!=d.sel.head){if(d.sel){let t=Fi(e,e.state.doc,d.sel);if(t&&!t.eq(e.state.selection)){let n=e.state.tr.setSelection(t);o&&n.setMeta("composition",o),e.dispatch(n)}}return}m={start:u.from,endA:u.to,endB:u.to}}e.state.selection.frome.state.selection.from&&m.start<=e.state.selection.from+2&&e.state.selection.from>=d.from?m.start=e.state.selection.from:m.endA=e.state.selection.to-2&&e.state.selection.to<=d.to&&(m.endB+=e.state.selection.to-m.endA,m.endA=e.state.selection.to)),Vt&&jt<=11&&m.endB==m.start+1&&m.endA==m.start&&m.start>d.from&&"  "==d.doc.textBetween(m.start-d.from-1,m.start-d.from+1)&&(m.start--,m.endA--,m.endB--);let g,y=d.doc.resolveNoCache(m.start-d.from),k=d.doc.resolveNoCache(m.endB-d.from),b=p.resolve(m.start),v=y.sameParent(k)&&y.parent.inlineContent&&b.end()>=m.endA;if((Gt&&e.input.lastIOSEnter>Date.now()-225&&(!v||i.some((e=>"DIV"==e.nodeName||"P"==e.nodeName)))||!v&&y.posy.pos)&&e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))))return void(e.input.lastIOSEnter=0);if(e.state.selection.anchor>m.start&&function(e,t,n,r,i){if(n-t<=i.pos-r.pos||Ii(r,!0,!1)n||Ii(s,!0,!1)t(e,Rt(8,"Backspace")))))return void(Qt&&Ht&&e.domObserver.suppressSelectionUpdates());Ht&&m.endB==m.start&&(e.input.lastChromeDelete=Date.now()),Qt&&!v&&y.start()!=k.start()&&0==k.parentOffset&&y.depth==k.depth&&d.sel&&d.sel.anchor==d.sel.head&&d.sel.head==m.endA&&(m.endB-=2,k=d.doc.resolveNoCache(m.endB-d.from),setTimeout((()=>{e.someProp("handleKeyDown",(function(t){return t(e,Rt(13,"Enter"))}))}),20));let w,x,C,D=m.start,S=m.endA;if(v)if(y.pos==k.pos)Vt&&jt<=11&&0==y.parentOffset&&(e.domObserver.suppressSelectionUpdates(),setTimeout((()=>Kn(e)),20)),w=e.state.tr.delete(D,S),x=p.resolve(m.start).marksAcross(p.resolve(m.endA));else if(m.endA==m.endB&&(C=function(e,t){let n,r,i,o=e.firstChild.marks,s=t.firstChild.marks,l=o,a=s;for(let e=0;ee.mark(r.addToSet(e.marks));else{if(0!=l.length||1!=a.length)return null;r=a[0],n="remove",i=e=>e.mark(r.removeFromSet(e.marks))}let h=[];for(let e=0;en(e,D,S,t))))return;w=e.state.tr.insertText(t,D,S)}if(w||(w=e.state.tr.replace(D,S,d.doc.slice(m.start-d.from,m.endB-d.from))),d.sel){let t=Fi(e,w.doc,d.sel);t&&!(Ht&&e.composing&&t.empty&&(m.start!=m.endB||e.input.lastChromeDeletet.content.size?null:tr(e,t.resolve(n.anchor),t.resolve(n.head))}function Ii(e,t,n){let r=e.depth,i=t?e.end():e.pos;for(;r>0&&(t||e.indexAfter(r)==e.node(r).childCount);)r--,i++,t=!1;if(n){let t=e.node(r).maybeChild(e.indexAfter(r));for(;t&&!t.isLeaf;)t=t.firstChild,i++}return i}function Ri(e){if(2!=e.length)return!1;let t=e.charCodeAt(0),n=e.charCodeAt(1);return t>=56320&&t<=57343&&n>=55296&&n<=56319}class Bi{constructor(e,t){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new Nr,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=t,this.state=t.state,this.directPlugins=t.plugins||[],this.directPlugins.forEach($i),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):"function"==typeof e?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Pi(this),Li(this),this.nodeViews=qi(this),this.docView=On(this.state.doc,zi(this),wi(this),this.dom,this),this.domObserver=new Si(this,((e,t,n,r)=>Ni(this,e,t,n,r))),this.domObserver.start(),function(e){for(let t in Mr){let n=Mr[t];e.dom.addEventListener(t,e.input.eventHandlers[t]=t=>{!Br(e,t)||Rr(e,t)||!e.editable&&t.type in Or||n(e,t)},Tr[t]?{passive:!0}:void 0)}Kt&&e.dom.addEventListener("input",(()=>null)),Ir(e)}(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let t in e)this._props[t]=e[t];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Ir(this);let t=this._props;this._props=e,e.plugins&&(e.plugins.forEach($i),this.directPlugins=e.plugins),this.updateStateInner(e.state,t)}setProps(e){let t={};for(let e in this._props)t[e]=this._props[e];t.state=this.state;for(let n in e)t[n]=e[n];this.update(t)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,t){var n;let r=this.state,i=!1,o=!1;e.storedMarks&&this.composing&&(Gr(this),o=!0),this.state=e;let s=r.plugins!=e.plugins||this._props.plugins!=t.plugins;if(s||this._props.plugins!=t.plugins||this._props.nodeViews!=t.nodeViews){let e=qi(this);(function(e,t){let n=0,r=0;for(let r in e){if(e[r]!=t[r])return!0;n++}for(let e in t)r++;return n!=r})(e,this.nodeViews)&&(this.nodeViews=e,i=!0)}(s||t.handleDOMEvents!=this._props.handleDOMEvents)&&Ir(this),this.editable=Pi(this),Li(this);let l=wi(this),a=zi(this),c=r.plugins==e.plugins||r.doc.eq(e.doc)?e.scrollToSelection>r.scrollToSelection?"to selection":"preserve":"reset",h=i||!this.docView.matchesNode(e.doc,a,l);!h&&e.selection.eq(r.selection)||(o=!0);let u="preserve"==c&&o&&null==this.dom.style.overflowAnchor&&function(e){let t,n,r=e.dom.getBoundingClientRect(),i=Math.max(0,r.top);for(let o=(r.left+r.right)/2,s=i+1;s=i-20){t=r,n=l.top;break}}return{refDOM:t,refTop:n,stack:sn(e.dom)}}(this);if(o){this.domObserver.stop();let t=h&&(Vt||Ht)&&!this.composing&&!r.selection.empty&&!e.selection.empty&&function(e,t){let n=Math.min(e.$anchor.sharedDepth(e.head),t.$anchor.sharedDepth(t.head));return e.$anchor.start(n)!=t.$anchor.start(n)}(r.selection,e.selection);if(h){let n=Ht?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=Zr(this)),!i&&this.docView.update(e.doc,a,l,this)||(this.docView.updateOuterDeco(a),this.docView.destroy(),this.docView=On(e.doc,a,l,this.dom,this)),n&&!this.trackWrites&&(t=!0)}t||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&function(e){let t=e.docView.domFromPos(e.state.selection.anchor,0),n=e.domSelectionRange();return Mt(t.node,t.offset,n.anchorNode,n.anchorOffset)}(this))?Kn(this,t):(Xn(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(r),(null===(n=this.dragging)||void 0===n?void 0:n.node)&&!r.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,r),"reset"==c?this.dom.scrollTop=0:"to selection"==c?this.scrollToSelection():u&&function({refDOM:e,refTop:t,stack:n}){let r=e?e.getBoundingClientRect().top:0;ln(n,0==r?0:r-t)}(u)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(e&&this.dom.contains(1==e.nodeType?e:e.parentNode))if(this.someProp("handleScrollToSelection",(e=>e(this))));else if(this.state.selection instanceof at){let t=this.docView.domAfterPos(this.state.selection.from);1==t.nodeType&&on(this,t.getBoundingClientRect(),e)}else on(this,this.coordsAtPos(this.state.selection.head,1),e);else;}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(e&&e.plugins==this.state.plugins&&this.directPlugins==this.prevDirectPlugins)for(let t=0;t0&&this.state.doc.nodeAt(e))==n.node&&(r=e)}this.dragging=new ti(e.slice,e.move,r<0?void 0:at.create(this.state.doc,r))}someProp(e,t){let n,r=this._props&&this._props[e];if(null!=r&&(n=t?t(r):r))return n;for(let r=0;re.ownerDocument.getSelection()),this._root=e;return e||document}updateRoot(){this._root=null}posAtCoords(e){return dn(this,e)}coordsAtPos(e,t=1){return gn(this,e,t)}domAtPos(e,t=0){return this.docView.domFromPos(e,t)}nodeDOM(e){let t=this.docView.descAt(e);return t?t.nodeDOM:null}posAtDOM(e,t,n=-1){let r=this.docView.posFromDOM(e,t,n);if(null==r)throw new RangeError("DOM position not inside the editor");return r}endOfTextblock(e,t){return Dn(this,t||this.state,e)}pasteHTML(e,t){return Xr(this,"",e,!1,t||new ClipboardEvent("paste"))}pasteText(e,t){return Xr(this,e,null,!0,t||new ClipboardEvent("paste"))}serializeForClipboard(e){return yr(this,e)}destroy(){this.docView&&(!function(e){e.domObserver.stop();for(let t in e.input.eventHandlers)e.dom.removeEventListener(t,e.input.eventHandlers[t]);clearTimeout(e.input.composingTimeout),clearTimeout(e.input.lastIOSEnterFallbackTimeout)}(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],wi(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,Et=null)}get isDestroyed(){return null==this.docView}dispatchEvent(e){return function(e,t){Rr(e,t)||!Mr[t.type]||!e.editable&&t.type in Or||Mr[t.type](e,t)}(this,e)}dispatch(e){let t=this._props.dispatchTransaction;t?t.call(this,e):this.updateState(this.state.apply(e))}domSelectionRange(){let e=this.domSelection();return e?Kt&&11===this.root.nodeType&&function(e){let t=e.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}(this.dom.ownerDocument)==this.dom&&function(e,t){if(t.getComposedRanges){let n=t.getComposedRanges(e.root)[0];if(n)return Ai(e,n)}let n;function r(e){e.preventDefault(),e.stopImmediatePropagation(),n=e.getTargetRanges()[0]}return e.dom.addEventListener("beforeinput",r,!0),document.execCommand("indent"),e.dom.removeEventListener("beforeinput",r,!0),n?Ai(e,n):null}(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}}function zi(e){let t=Object.create(null);return t.class="ProseMirror",t.contenteditable=String(e.editable),e.someProp("attributes",(n=>{if("function"==typeof n&&(n=n(e.state)),n)for(let e in n)"class"==e?t.class+=" "+n[e]:"style"==e?t.style=(t.style?t.style+";":"")+n[e]:t[e]||"contenteditable"==e||"nodeName"==e||(t[e]=String(n[e]))})),t.translate||(t.translate="no"),[ai.node(0,e.state.doc.content.size,t)]}function Li(e){if(e.markCursor){let t=document.createElement("img");t.className="ProseMirror-separator",t.setAttribute("mark-placeholder","true"),t.setAttribute("alt",""),e.cursorWrapper={dom:t,deco:ai.widget(e.state.selection.from,t,{raw:!0,marks:e.markCursor})}}else e.cursorWrapper=null}function Pi(e){return!e.someProp("editable",(t=>!1===t(e.state)))}function qi(e){let t=Object.create(null);function n(e){for(let n in e)Object.prototype.hasOwnProperty.call(t,n)||(t[n]=e[n])}return e.someProp("nodeViews",n),e.someProp("markViews",n),t}function $i(e){if(e.spec.state||e.spec.filterTransaction||e.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var Vi=200,ji=function(){};ji.prototype.append=function(e){return e.length?(e=ji.from(e),!this.length&&e||e.length=t?ji.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,t))},ji.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)},ji.prototype.forEach=function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=this.length),t<=n?this.forEachInner(e,t,n,0):this.forEachInvertedInner(e,t,n,0)},ji.prototype.map=function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=this.length);var r=[];return this.forEach((function(t,n){return r.push(e(t,n))}),t,n),r},ji.from=function(e){return e instanceof ji?e:e&&e.length?new Ui(e):ji.empty};var Ui=function(e){function t(t){e.call(this),this.values=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={length:{configurable:!0},depth:{configurable:!0}};return t.prototype.flatten=function(){return this.values},t.prototype.sliceInner=function(e,n){return 0==e&&n==this.length?this:new t(this.values.slice(e,n))},t.prototype.getInner=function(e){return this.values[e]},t.prototype.forEachInner=function(e,t,n,r){for(var i=t;i=n;i--)if(!1===e(this.values[i],r+i))return!1},t.prototype.leafAppend=function(e){if(this.length+e.length<=Vi)return new t(this.values.concat(e.flatten()))},t.prototype.leafPrepend=function(e){if(this.length+e.length<=Vi)return new t(e.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(t.prototype,n),t}(ji);ji.empty=new Ui([]);var Wi=function(e){function t(t,n){e.call(this),this.left=t,this.right=n,this.length=t.length+n.length,this.depth=Math.max(t.depth,n.depth)+1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},t.prototype.getInner=function(e){return ei&&!1===this.right.forEachInner(e,Math.max(t-i,0),Math.min(this.length,n)-i,r+i))&&void 0)},t.prototype.forEachInvertedInner=function(e,t,n,r){var i=this.left.length;return!(t>i&&!1===this.right.forEachInvertedInner(e,t-i,Math.max(n,i)-i,r+i))&&(!(n=n?this.right.slice(e-n,t-n):this.left.slice(e,n).append(this.right.slice(0,t-n))},t.prototype.leafAppend=function(e){var n=this.right.leafAppend(e);if(n)return new t(this.left,n)},t.prototype.leafPrepend=function(e){var n=this.left.leafPrepend(e);if(n)return new t(n,this.right)},t.prototype.appendInner=function(e){return this.left.depth>=Math.max(this.right.depth,e.depth)+1?new t(this.left,new t(this.right,e)):new t(this,e)},t}(ji);const Hi=ji;class Ji{constructor(e,t){this.items=e,this.eventCount=t}popEvent(e,t){if(0==this.eventCount)return null;let n,r,i=this.items.length;for(;;i--){if(this.items.get(i-1).selection){--i;break}}t&&(n=this.remapping(i,this.items.length),r=n.maps.length);let o,s,l=e.tr,a=[],c=[];return this.items.forEach(((e,t)=>{if(!e.step)return n||(n=this.remapping(i,t+1),r=n.maps.length),r--,void c.push(e);if(n){c.push(new Ki(e.map));let t,i=e.step.map(n.slice(r));i&&l.maybeStep(i).doc&&(t=l.mapping.maps[l.mapping.maps.length-1],a.push(new Ki(t,void 0,void 0,a.length+c.length))),r--,t&&n.appendMap(t,r)}else l.maybeStep(e.step);return e.selection?(o=n?e.selection.map(n.slice(r)):e.selection,s=new Ji(this.items.slice(0,i).append(c.reverse().concat(a)),this.eventCount-1),!1):void 0}),this.items.length,0),{remaining:s,transform:l,selection:o}}addTransform(e,t,n,r){let i=[],o=this.eventCount,s=this.items,l=!r&&s.length?s.get(s.length-1):null;for(let n=0;nZi&&(s=function(e,t){let n;return e.forEach(((e,r)=>{if(e.selection&&0==t--)return n=r,!1})),e.slice(n)}(s,a),o-=a),new Ji(s.append(i),o)}remapping(e,t){let n=new ve;return this.items.forEach(((t,r)=>{let i=null!=t.mirrorOffset&&r-t.mirrorOffset>=e?n.maps.length-t.mirrorOffset:void 0;n.appendMap(t.map,i)}),e,t),n}addMaps(e){return 0==this.eventCount?this:new Ji(this.items.append(e.map((e=>new Ki(e)))),this.eventCount)}rebased(e,t){if(!this.eventCount)return this;let n=[],r=Math.max(0,this.items.length-t),i=e.mapping,o=e.steps.length,s=this.eventCount;this.items.forEach((e=>{e.selection&&s--}),r);let l=t;this.items.forEach((t=>{let r=i.getMirror(--l);if(null==r)return;o=Math.min(o,r);let a=i.maps[r];if(t.step){let o=e.steps[r].invert(e.docs[r]),c=t.selection&&t.selection.map(i.slice(l+1,r));c&&s++,n.push(new Ki(a,o,c))}else n.push(new Ki(a))}),r);let a=[];for(let e=t;e500&&(h=h.compress(this.items.length-n.length)),h}emptyItemCount(){let e=0;return this.items.forEach((t=>{t.step||e++})),e}compress(e=this.items.length){let t=this.remapping(0,e),n=t.maps.length,r=[],i=0;return this.items.forEach(((o,s)=>{if(s>=e)r.push(o),o.selection&&i++;else if(o.step){let e=o.step.map(t.slice(n)),s=e&&e.getMap();if(n--,s&&t.appendMap(s,n),e){let l=o.selection&&o.selection.map(t.slice(n));l&&i++;let a,c=new Ki(s.invert(),e,l),h=r.length-1;(a=r.length&&r[h].merge(c))?r[h]=a:r.push(c)}}else o.map&&n--}),this.items.length,0),new Ji(Hi.from(r.reverse()),i)}}Ji.empty=new Ji(Hi.empty,0);class Ki{constructor(e,t,n,r){this.map=e,this.step=t,this.selection=n,this.mirrorOffset=r}merge(e){if(this.step&&e.step&&!e.selection){let t=e.step.merge(this.step);if(t)return new Ki(t.getMap().invert(),t,this.selection)}}}class Gi{constructor(e,t,n,r,i){this.done=e,this.undone=t,this.prevRanges=n,this.prevTime=r,this.prevComposition=i}}const Zi=20;function Yi(e){let t=[];for(let n=e.length-1;n>=0&&0==t.length;n--)e[n].forEach(((e,n,r,i)=>t.push(r,i)));return t}function Qi(e,t){if(!e)return null;let n=[];for(let r=0;rnew Gi(Ji.empty,Ji.empty,null,0,-1),apply:(t,n,r)=>function(e,t,n,r){let i,o=n.getMeta(no);if(o)return o.historyState;n.getMeta(ro)&&(e=new Gi(e.done,e.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(0==n.steps.length)return e;if(s&&s.getMeta(no))return s.getMeta(no).redo?new Gi(e.done.addTransform(n,void 0,r,to(t)),e.undone,Yi(n.mapping.maps),e.prevTime,e.prevComposition):new Gi(e.done,e.undone.addTransform(n,void 0,r,to(t)),null,e.prevTime,e.prevComposition);if(!1===n.getMeta("addToHistory")||s&&!1===s.getMeta("addToHistory"))return(i=n.getMeta("rebased"))?new Gi(e.done.rebased(n,i),e.undone.rebased(n,i),Qi(e.prevRanges,n.mapping),e.prevTime,e.prevComposition):new Gi(e.done.addMaps(n.mapping.maps),e.undone.addMaps(n.mapping.maps),Qi(e.prevRanges,n.mapping),e.prevTime,e.prevComposition);{let i=n.getMeta("composition"),o=0==e.prevTime||!s&&e.prevComposition!=i&&(e.prevTime<(n.time||0)-r.newGroupDelay||!function(e,t){if(!t)return!1;if(!e.docChanged)return!0;let n=!1;return e.mapping.maps[0].forEach(((e,r)=>{for(let i=0;i=t[i]&&(n=!0)})),n}(n,e.prevRanges)),l=s?Qi(e.prevRanges,n.mapping):Yi(n.mapping.maps);return new Gi(e.done.addTransform(n,o?t.selection.getBookmark():void 0,r,to(t)),Ji.empty,l,n.time,null==i?e.prevComposition:i)}}(n,r,t,e)},config:e,props:{handleDOMEvents:{beforeinput(e,t){let n=t.inputType,r="historyUndo"==n?so:"historyRedo"==n?lo:null;return!!r&&(t.preventDefault(),r(e.state,e.dispatch))}}}})}function oo(e,t){return(n,r)=>{let i=no.getState(n);if(!i||0==(e?i.undone:i.done).eventCount)return!1;if(r){let o=function(e,t,n){let r=to(t),i=no.get(t).spec.config,o=(n?e.undone:e.done).popEvent(t,r);if(!o)return null;let s=o.selection.resolve(o.transform.doc),l=(n?e.done:e.undone).addTransform(o.transform,t.selection.getBookmark(),i,r),a=new Gi(n?l:o.remaining,n?o.remaining:l,null,0,-1);return o.transform.setSelection(s).setMeta(no,{redo:n,historyState:a})}(i,n,e);o&&r(t?o.scrollIntoView():o)}return!0}}const so=oo(!1,!0),lo=oo(!0,!0);oo(!1,!1),oo(!0,!1);class ao{constructor(e,t,n={}){var r;this.match=e,this.match=e,this.handler="string"==typeof t?(r=t,function(e,t,n,i){let o=r;if(t[1]){let e=t[0].lastIndexOf(t[1]);o+=t[0].slice(e+t[1].length);let r=(n+=e)-i;r>0&&(o=t[0].slice(e-r,e)+o,n=i)}return e.tr.insertText(o,n,i)}):t,this.undoable=!1!==n.undoable,this.inCode=n.inCode||!1,this.inCodeMark=!1!==n.inCodeMark}}function co(e,t,n,r,i,o){if(e.composing)return!1;let s=e.state,l=s.doc.resolve(t),a=l.parent.textBetween(Math.max(0,l.parentOffset-500),l.parentOffset,null,"")+r;for(let c=0;ce.type.spec.code)))continue;if(l.parent.type.spec.code){if(!h.inCode)continue}else if("only"===h.inCode)continue;let u=h.match.exec(a),d=u&&u[0].length>=r.length&&h.handler(s,u,t-(u[0].length-r.length),n);if(d)return h.undoable&&d.setMeta(o,{transform:d,from:t,to:n,text:r}),e.dispatch(d),!0}return!1}new ao(/--$/,"—",{inCodeMark:!1});const ho=new ao(/\.\.\.$/,"…",{inCodeMark:!1}),uo=[new ao(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(")$/,"“",{inCodeMark:!1}),new ao(/"$/,"”",{inCodeMark:!1}),new ao(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(')$/,"‘",{inCodeMark:!1}),new ao(/'$/,"’",{inCodeMark:!1})];function po(e,t,n=null){return new ao(e,((e,r,i,o)=>{let s=e.doc.resolve(i),l=n instanceof Function?n(r):n;return s.node(-1).canReplaceWith(s.index(-1),s.indexAfter(-1),t)?e.tr.delete(i,o).setBlockType(i,i,t,l):null}))}const fo=["ol",0],mo=["ul",0],go=["li",0],yo={attrs:{order:{default:1,validate:"number"}},parseDOM:[{tag:"ol",getAttrs:e=>({order:e.hasAttribute("start")?+e.getAttribute("start"):1})}],toDOM:e=>1==e.attrs.order?fo:["ol",{start:e.attrs.order},0]},ko={parseDOM:[{tag:"ul"}],toDOM:()=>mo},bo={parseDOM:[{tag:"li"}],toDOM:()=>go,defining:!0};function vo(e,t=null){return function(n,r){let{$from:i,$to:o}=n.selection,s=i.blockRange(o);if(!s)return!1;let l=r?n.tr:null;return!!function(e,t,n,r=null){let i=!1,o=t,s=t.$from.doc;if(t.depth>=2&&t.$from.node(t.depth-1).type.compatibleContent(n)&&0==t.startIndex){if(0==t.$from.index(t.depth-1))return!1;let e=s.resolve(t.start-2);o=new T(e,e,t.depth),t.endIndex=0;e--)o=c.from(n[e].type.create(n[e].attrs,o));e.step(new Oe(t.start-(r?2:0),t.end,t.start,t.end,new m(o,0,0),n.length,!0));let s=0;for(let e=0;e=i.depth-3;e--)t=c.from(i.node(e).copy(t));let s=i.indexAfter(-1){if(h>-1)return!1;e.isTextblock&&0==e.content.size&&(h=t+1)})),h>-1&&a.setSelection(nt.near(a.doc.resolve(h))),r(a.scrollIntoView())}return!0}let a=o.pos==i.end()?l.contentMatchAt(0).defaultType:null,h=n.tr.delete(i.pos,o.pos),u=a?[t?{type:e,attrs:t}:null,{type:a}]:void 0;return!!Le(h.doc,i.pos,2,u)&&(r&&r(h.split(i.pos,2,u).scrollIntoView()),!0)}}function xo(e){return function(t,n){let{$from:r,$to:i}=t.selection,o=r.blockRange(i,(t=>t.childCount>0&&t.firstChild.type==e));return!!o&&(!n||(r.node(o.depth-1).type==e?function(e,t,n,r){let i=e.tr,o=r.end,s=r.$to.end(r.depth);oo;t--)e-=i.child(t).nodeSize,r.delete(e-1,e+1);let o=r.doc.resolve(n.start),s=o.nodeAfter;if(r.mapping.map(n.end)!=n.start+o.nodeAfter.nodeSize)return!1;let l=0==n.startIndex,a=n.endIndex==i.childCount,h=o.node(-1),u=o.index(-1);if(!h.canReplace(u+(l?0:1),u+1,s.content.append(a?c.empty:c.from(i))))return!1;let d=o.pos,p=d+s.nodeSize;return r.step(new Oe(d-(l?1:0),p+(a?1:0),d+1,p-1,new m((l?c.empty:c.from(i.copy(c.empty))).append(a?c.empty:c.from(i.copy(c.empty))),l?0:1,a?0:1),l?0:1)),t(r.scrollIntoView()),!0}(t,n,o)))}}const Co=["p",0],Do=["blockquote",0],So=["hr"],_o=["pre",["code",0]],Eo=["br"],Ao={doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM:()=>Co},blockquote:{content:"block+",group:"block",defining:!0,parseDOM:[{tag:"blockquote"}],toDOM:()=>Do},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM:()=>So},heading:{attrs:{level:{default:1,validate:"number"}},content:"inline*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM:e=>["h"+e.attrs.level,0]},code_block:{content:"text*",marks:"",group:"block",code:!0,defining:!0,parseDOM:[{tag:"pre",preserveWhitespace:"full"}],toDOM:()=>_o},text:{group:"inline"},image:{inline:!0,attrs:{src:{validate:"string"},alt:{default:null,validate:"string|null"},title:{default:null,validate:"string|null"}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs:e=>({src:e.getAttribute("src"),title:e.getAttribute("title"),alt:e.getAttribute("alt")})}],toDOM(e){let{src:t,alt:n,title:r}=e.attrs;return["img",{src:t,alt:n,title:r}]}},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM:()=>Eo}},Mo=["em",0],Oo=["strong",0],To=["code",0],No={link:{attrs:{href:{validate:"string"},title:{default:null,validate:"string|null"}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}],toDOM(e){let{href:t,title:n}=e.attrs;return["a",{href:t,title:n},0]}},em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:e=>"em"==e.type.name}],toDOM:()=>Mo},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:e=>"normal"!=e.style.fontWeight&&null},{style:"font-weight=400",clearMark:e=>"strong"==e.type.name},{style:"font-weight",getAttrs:e=>/^(bold(er)?|[5-9]\d{2,})$/.test(e)&&null}],toDOM:()=>Oo},code:{code:!0,parseDOM:[{tag:"code"}],toDOM:()=>To}},Fo=(new Q({nodes:Ao,marks:No}),"markdown_escaped"),Io="auto_link",Ro="sn-editor",Bo={content:"block+",toDOM:e=>["main",{class:Ro},0],parseDOM:[{tag:"main"}]},zo={content:"inline*",defining:!0,group:"block",toDOM:e=>["h1",{class:Ro},0],parseDOM:[{tag:"h1"}]},Lo={content:"inline*",defining:!0,group:"block",toDOM:e=>["h2",{class:Ro},0],parseDOM:[{tag:"h2"}]},Po={content:"inline*",defining:!0,group:"block",toDOM:e=>["h3",{class:Ro},0],parseDOM:[{tag:"h3"}]},qo={content:"inline*",group:"block",marks:"_",toDOM:e=>["p",{class:Ro},0],parseDOM:[{tag:"p"}]};var $o;!function(e){e[e.DONE=0]="DONE",e[e.EMPTY=1]="EMPTY"}($o||($o={}));const Vo={attrs:{status:{default:$o.EMPTY}},content:"inline*",defining:!0,group:"block",marks:"_",toDOM:e=>["div",{class:"checklist-item"},["input",Object.assign({type:"checkbox"},e.attrs.status===$o.DONE&&{checked:"true"})],["p",0]],parseDOM:[{contentElement:"p",tag:"div.checklist-item",getAttrs:e=>({status:e.querySelector("input").checked?$o.DONE:$o.EMPTY})}]},jo=Object.assign(Object.assign({},Ao.code_block),{attrs:Object.assign(Object.assign({},Ao.code_block.attrs),{[Fo]:{default:!1}}),toDOM(e){const t={[`data-${Fo}`]:e.attrs[Fo]};return e.attrs[Fo]?["pre",t,["div",{class:"info"},"i"],["code",0]]:["pre",t,["code",0]]}}),Uo=new Q({nodes:{doc:Bo,paragraph:qo,checklist_item:Vo,unordered_list:Object.assign(Object.assign({},ko),{content:"list_item+",group:"block",selectable:!1}),ordered_list:Object.assign(Object.assign({},yo),{content:"list_item+",group:"block",selectable:!1}),list_item:Object.assign(Object.assign({},bo),{content:"paragraph (paragraph | ordered_list | unordered_list)*",selectable:!1}),heading1:zo,heading2:Lo,heading3:Po,text:{group:"inline"},code_block:jo},marks:{link:{attrs:{href:{default:""},title:{default:null},[Io]:{default:!1}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title"),[`data-${Io}`]:e.getAttribute(`data-${Io}`)})}],toDOM(e){let{href:t,title:n}=e.attrs;return["a",{href:t,title:n,[`data-${Io}`]:e.attrs[Io]},0]}},em:Object.assign({},No.em),strong:Object.assign({},No.strong),code:Object.assign(Object.assign({},No.code),{attrs:Object.assign(Object.assign({},No.code.attrs),{[Fo]:{default:!1}})})}});function Wo(e,t,n){return new ao(new RegExp(`${e}(\\S+(\\s+\\S+)*?)${e}$`),((e,n,r,i)=>{const[o,s]=n,{tr:l}=e;if(!s)return;const a=e.doc.resolve(r).marksAcross(e.doc.resolve(i));return l.replaceRangeWith(r,i,Uo.text(s,[...a,t.create()])).insert(l.selection.from,Uo.text(" ",[...a])).setMeta("has-forced-space-from-input-rule",{endPos:l.selection.from})}),{inCodeMark:n})}function Ho(e,t){return new ao(new RegExp(`^${e}$`),((e,n,r,i)=>{const o=e.doc.resolve(i);if(o.depth>1)return;const s=[i,r+o.parent.nodeSize-2],l=e.doc.slice(...s),{tr:a}=e;return a.deleteRange(...s),a.replaceRangeWith(r,i,t.createAndFill()),a.setSelection(nt.near(a.doc.resolve(r))),a.insert(a.selection.from,l.content),a.setSelection(nt.near(a.doc.resolve(r))),a}))}const Jo=function({rules:e}){let t=new wt({state:{init:()=>null,apply(e,t){let n=e.getMeta(this);return n||(e.selectionSet||e.docChanged?null:t)}},props:{handleTextInput:(n,r,i,o)=>co(n,r,i,o,e,t),handleDOMEvents:{compositionend:n=>{setTimeout((()=>{let{$cursor:r}=n.state.selection;r&&co(n,r.pos,r.pos,"",e,t)}))}}},isInputRules:!0});return t}({rules:[...uo,ho,...[new ao(new RegExp("<\\->$"),"↔",{inCodeMark:!1}),new ao(new RegExp("\\->$"),"→",{inCodeMark:!1})],po(/^# $/,Uo.nodes.heading1),po(/^## $/,Uo.nodes.heading2),po(/^### $/,Uo.nodes.heading3),po(/^```$/,Uo.nodes.code_block),Wo("`",Uo.marks.code,!1),Wo("\\*",Uo.marks.strong,!1),Wo("_",Uo.marks.em,!1),Ho("1. ",Uo.nodes.ordered_list),Ho("- ",Uo.nodes.unordered_list)]}),Ko="reset-has-forced-space-meta",Go=new wt({state:{init:()=>({hasForcedSpace:!1}),apply(e,t){if(e.getMeta(Ko))return{hasForcedSpace:!1};if(t.hasForcedSpace&&(e.selectionSet||e.docChanged))return{hasForcedSpace:!1};const n=e.getMeta("has-forced-space-from-input-rule");return n?{hasForcedSpace:!0,forcedSpacePos:n.endPos}:t}},props:{handleTextInput(e,t,n,r){if(this.getState(e.state).hasForcedSpace&&" "===r)return e.dispatch(e.state.tr.setMeta(Ko,!0)),!0}}}),Zo=(e,t)=>!e.selection.empty&&(t&&t(e.tr.deleteSelection().scrollIntoView()),!0);function Yo(e,t){let{$cursor:n}=e.selection;return!n||(t?!t.endOfTextblock("backward",e):n.parentOffset>0)?null:n}function Qo(e,t,n=!1){for(let r=e;r;r="start"==t?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(n&&1!=r.childCount)return!1}return!1}function Xo(e){if(!e.parent.type.spec.isolating)for(let t=e.depth-1;t>=0;t--){if(e.index(t)>0)return e.doc.resolve(e.before(t+1));if(e.node(t).type.spec.isolating)break}return null}function es(e,t){let{$cursor:n}=e.selection;return!n||(t?!t.endOfTextblock("forward",e):n.parentOffset=0;t--){let n=e.node(t);if(e.index(t)+1{let{$from:n,$to:r}=e.selection;if(e.selection instanceof at&&e.selection.node.isBlock)return!(!n.parentOffset||!Le(e.doc,n.pos)||(t&&t(e.tr.split(n.pos).scrollIntoView()),0));if(!n.depth)return!1;let i,o,s=[],l=!1,a=!1;for(let e=n.depth;;e--){if(n.node(e).isBlock){l=n.end(e)==n.pos+(n.depth-e),a=n.start(e)==n.pos-(n.depth-e),o=ns(n.node(e-1).contentMatchAt(n.indexAfter(e-1)));let t=is&&is(r.parent,l,n);s.unshift(t||(l&&o?{type:o}:null)),i=e;break}if(1==e)return!1;s.unshift(null)}let c=e.tr;(e.selection instanceof st||e.selection instanceof ht)&&c.deleteSelection();let h=c.mapping.map(n.pos),u=Le(c.doc,h,s.length,s);if(u||(s[0]=o?{type:o}:null,u=Le(c.doc,h,s.length,s)),!u)return!1;if(c.split(h,s.length,s),!l&&a&&n.node(i).type!=o){let e=c.mapping.map(n.before(i)),t=c.doc.resolve(e);o&&n.node(i-1).canReplaceWith(t.index(),t.index()+1,o)&&c.setNodeMarkup(c.mapping.map(n.before(i)),o)}return t&&t(c.scrollIntoView()),!0};var is;function ss(e,t,n,r){let i,o,s=t.nodeBefore,l=t.nodeAfter,a=s.type.spec.isolating||l.type.spec.isolating;if(!a&&function(e,t,n){let r=t.nodeBefore,i=t.nodeAfter,o=t.index();return!(!(r&&i&&r.type.compatibleContent(i.type))||(!r.content.size&&t.parent.canReplace(o-1,o)?(n&&n(e.tr.delete(t.pos-r.nodeSize,t.pos).scrollIntoView()),0):!t.parent.canReplace(o,o+1)||!i.isTextblock&&!Pe(e.doc,t.pos)||(n&&n(e.tr.join(t.pos).scrollIntoView()),0)))}(e,t,n))return!0;let h=!a&&t.parent.canReplace(t.index(),t.index()+1);if(h&&(i=(o=s.contentMatchAt(s.childCount)).findWrapping(l.type))&&o.matchType(i[0]||l.type).validEnd){if(n){let r=t.pos+l.nodeSize,o=c.empty;for(let e=i.length-1;e>=0;e--)o=c.from(i[e].create(null,o));o=c.from(s.copy(o));let a=e.tr.step(new Oe(t.pos-1,r,t.pos,r,new m(o,1,0),i.length,!0)),h=a.doc.resolve(r+2*i.length);h.nodeAfter&&h.nodeAfter.type==s.type&&Pe(a.doc,h.pos)&&a.join(h.pos),n(a.scrollIntoView())}return!0}let u=l.type.spec.isolating||r>0&&a?null:nt.findFrom(t,1),d=u&&u.$from.blockRange(u.$to),p=d&&Ie(d);if(null!=p&&p>=t.depth)return n&&n(e.tr.lift(d,p).scrollIntoView()),!0;if(h&&Qo(l,"start",!0)&&Qo(s,"end")){let r=s,i=[];for(;i.push(r),!r.isTextblock;)r=r.lastChild;let o=l,a=1;for(;!o.isTextblock;o=o.firstChild)a++;if(r.canReplace(r.childCount,r.childCount,o.content)){if(n){let r=c.empty;for(let e=i.length-1;e>=0;e--)r=c.from(i[e].copy(r));n(e.tr.step(new Oe(t.pos-i.length,t.pos+l.nodeSize,t.pos+a,t.pos+l.nodeSize-a,new m(r,i.length,0),0,!0)).scrollIntoView())}return!0}}return!1}function ls(e){return function(t,n){let r=t.selection,i=e<0?r.$from:r.$to,o=i.depth;for(;i.node(o).isInline;){if(!o)return!1;o--}return!!i.node(o).isTextblock&&(n&&n(t.tr.setSelection(st.create(t.doc,e<0?i.start(o):i.end(o)))),!0)}}const as=ls(-1),cs=ls(1);function hs(e,t=null,n){let r=!1!==(n&&n.removeWhenPresent),i=!1!==(n&&n.enterInlineAtoms),o=!(n&&n.includeWhitespace);return function(n,s){let{empty:l,$cursor:a,ranges:c}=n.selection;if(l&&!a||!function(e,t,n,r){for(let i=0;i{if(l||!r&&e.isAtom&&e.isInline&&t>=o.pos&&t+e.nodeSize<=s.pos)return!1;l=e.inlineContent&&e.type.allowsMarkType(n)})),l)return!0}return!1}(n.doc,c,e,i))return!1;if(s)if(a)e.isInSet(n.storedMarks||a.marks())?s(n.tr.removeStoredMark(e)):s(n.tr.addStoredMark(e.create(t)));else{let l,a=n.tr;i||(c=function(e){let t=[];for(let n=0;n{if(e.isAtom&&e.content.size&&e.isInline&&n>=r.pos&&n+e.nodeSize<=i.pos)return n+1>r.pos&&t.push(new rt(r,r.doc.resolve(n+1))),r=r.doc.resolve(n+1+e.content.size),!1})),r.posn.doc.rangeHasMark(t.$from.pos,t.$to.pos,e))):!c.every((t=>{let n=!1;return a.doc.nodesBetween(t.$from.pos,t.$to.pos,((r,i,o)=>{if(n)return!1;n=!e.isInSet(r.marks)&&!!o&&o.type.allowsMarkType(e)&&!(r.isText&&/^\s*$/.test(r.textBetween(Math.max(0,t.$from.pos-i),Math.min(r.nodeSize,t.$to.pos-i))))})),!n}));for(let n=0;n{let r=Yo(e,n);if(!r)return!1;let i=Xo(r);if(!i){let n=r.blockRange(),i=n&&Ie(n);return null!=i&&(t&&t(e.tr.lift(n,i).scrollIntoView()),!0)}let o=i.nodeBefore;if(ss(e,i,t,-1))return!0;if(0==r.parent.content.size&&(Qo(o,"end")||at.isSelectable(o)))for(let n=r.depth;;n--){let s=$e(e.doc,r.before(n),r.after(n),m.empty);if(s&&s.slice.size1)break}return!(!o.isAtom||i.depth!=r.depth-1)&&(t&&t(e.tr.delete(i.pos-o.nodeSize,i.pos).scrollIntoView()),!0)}),((e,t,n)=>{let{$head:r,empty:i}=e.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",e):r.parentOffset>0)return!1;o=Xo(r)}let s=o&&o.nodeBefore;return!(!s||!at.isSelectable(s))&&(t&&t(e.tr.setSelection(at.create(e.doc,o.pos-s.nodeSize)).scrollIntoView()),!0)})),ps=us(Zo,((e,t,n)=>{let r=es(e,n);if(!r)return!1;let i=ts(r);if(!i)return!1;let o=i.nodeAfter;if(ss(e,i,t,1))return!0;if(0==r.parent.content.size&&(Qo(o,"start")||at.isSelectable(o))){let n=$e(e.doc,r.before(),r.after(),m.empty);if(n&&n.slice.size{let{$head:r,empty:i}=e.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",e):r.parentOffset{let{$head:n,$anchor:r}=e.selection;return!(!n.parent.type.spec.code||!n.sameParent(r))&&(t&&t(e.tr.insertText("\n").scrollIntoView()),!0)}),((e,t)=>{let n=e.selection,{$from:r,$to:i}=n;if(n instanceof ht||r.parent.inlineContent||i.parent.inlineContent)return!1;let o=ns(i.parent.contentMatchAt(i.indexAfter()));if(!o||!o.isTextblock)return!1;if(t){let n=(!r.parentOffset&&i.index(){let{$cursor:n}=e.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let r=n.before();if(Le(e.doc,r))return t&&t(e.tr.split(r).scrollIntoView()),!0}let r=n.blockRange(),i=r&&Ie(r);return null!=i&&(t&&t(e.tr.lift(r,i).scrollIntoView()),!0)}),rs),"Mod-Enter":(e,t)=>{let{$head:n,$anchor:r}=e.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let i=n.node(-1),o=n.indexAfter(-1),s=ns(i.contentMatchAt(o));if(!s||!i.canReplaceWith(o,o,s))return!1;if(t){let r=n.after(),i=e.tr.replaceWith(r,r,s.createAndFill());i.setSelection(nt.near(i.doc.resolve(r),1)),t(i.scrollIntoView())}return!0},Backspace:ds,"Mod-Backspace":ds,"Shift-Backspace":ds,Delete:ps,"Mod-Delete":ps,"Mod-a":(e,t)=>(t&&t(e.tr.setSelection(new ht(e.doc))),!0)},ms={"Ctrl-h":fs.Backspace,"Alt-Backspace":fs["Mod-Backspace"],"Ctrl-d":fs.Delete,"Ctrl-Alt-Backspace":fs["Mod-Delete"],"Alt-Delete":fs["Mod-Delete"],"Alt-d":fs["Mod-Delete"],"Ctrl-a":as,"Ctrl-e":cs};for(let e in fs)ms[e]=fs[e];const gs=("undefined"!=typeof navigator?/Mac|iP(hone|[oa]d)/.test(navigator.platform):!("undefined"==typeof os||!os.platform)&&"darwin"==os.platform())?ms:fs,ys="data-format";function ks(e,t){let{dispatch:n,state:r}=e,{tr:i}=r;t!==Uo.nodes.unordered_list&&t!==Uo.nodes.ordered_list&&xo(Uo.nodes.list_item)(r,n),({dispatch:n,state:r}=e),({tr:i}=r);const{selection:{from:o,to:s}}=r;i.setBlockType(o,s,t),n(i)}const bs=function(e,t){return(n=Uo.nodes.list_item,function(e,t){let{$from:r,$to:i}=e.selection,o=r.blockRange(i,(e=>e.childCount>0&&e.firstChild.type==n));if(!o)return!1;let s=o.startIndex;if(0==s)return!1;let l=o.parent,a=l.child(s-1);if(a.type!=n)return!1;if(t){let r=a.lastChild&&a.lastChild.type==l.type,i=c.from(r?n.create():null),s=new m(c.from(n.create(null,c.from(l.type.create(null,i)))),r?3:1,0),h=o.start,u=o.end;t(e.tr.step(new Oe(h-(r?3:1),u,h,u,s,1,!0)).scrollIntoView())}return!0})(e,t)||vo(Uo.nodes.unordered_list)(e,t);var n},vs=function(e,t){return xo(Uo.nodes.list_item)(e,t)};class ws{constructor(e,{onConfirm:t,onClear:n,text:r,url:i}){this.showCls="active",this.destroy=()=>{this.confirmBtn.removeEventListener("click",this.handleConfirm),this.cancelBtn.removeEventListener("click",this.handleCancel),this.clearBtn.removeEventListener("click",this.handleClear),document.removeEventListener("keydown",this.handleGlobalKeydown),this.el.classList.remove(this.showCls)},this.handleConfirm=()=>{this.onConfirm({text:this.textInput.value,url:this.urlInput.value}),this.destroy()},this.handleClear=()=>{this.onClear(),this.destroy()},this.handleCancel=()=>{this.destroy()},this.handleGlobalKeydown=e=>{const t="Enter"===e.key;if(document.activeElement===this.textInput||document.activeElement===this.urlInput&&t)return void this.handleConfirm();"Escape"===e.key&&this.handleCancel()},this.handleGlobalClick=e=>{!1===this.frameEl.contains(e.target)&&this.destroy()},this.el=e,this.textInput.value=this.text=r,this.urlInput.value=this.url=i,this.onConfirm=t,this.onClear=n,this.frameEl=e.querySelector("#frame"),n?this.clearBtn.classList.add(this.showCls):this.clearBtn.classList.remove(this.showCls),this.el.classList.add(this.showCls),this.confirmBtn.addEventListener("click",this.handleConfirm),this.cancelBtn.addEventListener("click",this.handleCancel),this.clearBtn.addEventListener("click",this.handleClear),document.addEventListener("keydown",this.handleGlobalKeydown),document.addEventListener("click",this.handleGlobalClick),this.urlInput.focus()}get textInput(){return this.el.querySelector("input#text")}get urlInput(){return this.el.querySelector("input#url")}get confirmBtn(){return this.el.querySelector("button#confirm")}get cancelBtn(){return this.el.querySelector("button#cancel")}get clearBtn(){return this.el.querySelector("button#clear")}}class xs extends wt{constructor(e,t){super({view:n=>(this.view=n,this.modalEl=t,this.toolbarEl=e,e.addEventListener("click",this.handleToolbarClick),{destroy:()=>{var t;e.removeEventListener("click",this.handleToolbarClick),this.unhighlightSelectedAttrs(),null===(t=this.modal)||void 0===t||t.destroy()},update:(e,t)=>{this.updateToolbarForSelection(e.state)}}),props:{handleKeyDown:(e,t)=>{const n=t.ctrlKey,r=t.metaKey,i=t.shiftKey;return n&&"l"===t.key?(bs(this.view.state,this.view.dispatch),!0):n&&"h"===t.key?(vs(this.view.state,this.view.dispatch),!0):"Tab"!==t.key||n||r?n&&"t"===t.key?(this.toggleChecklistItem(),!0):r&&"7"===t.key||n&&"u"===t.key?(this.toggleList(Uo.nodes.unordered_list,Uo.nodes.list_item),!0):n&&"o"===t.key?(this.toggleList(Uo.nodes.ordered_list,Uo.nodes.list_item),!0):n&&"="===t.key?(this.promoteHeading(this.view.state,this.view.dispatch),!0):n&&"j"===t.key?(this.swapTextBlock(Uo.nodes.paragraph),!0):n&&"Space"===t.code?function(e,t){const{$from:n,$to:r}=e.selection,i=n.blockRange(r);let o=!1;for(let e=i.startIndex,t=i.parent.child(e);e{ks(this.view,e),this.view.focus()},this.promoteHeading=(e,t)=>{const{selection:n}=e;if(!n.empty)return;const{$from:{parent:{type:r}}}=n;let i;i=r===Uo.nodes.heading2?Uo.nodes.heading1:r===Uo.nodes.heading3?Uo.nodes.heading2:r===Uo.nodes.heading1?Uo.nodes.paragraph:Uo.nodes.heading3,this.swapTextBlock(i)},this.toggleList=(e,t)=>{!function(e,t,n){const{state:{selection:{$from:r,$to:i}}}=e,o=r.blockRange(i,(e=>e.type===t));if(o){if(o.depth>2)return;const{dispatch:t,state:r}=e;let i=!1;const s=r.doc.resolve(o.start),l=r.doc.resolve(o.end);if(o.parent.nodesBetween(s.parentOffset,l.parentOffset,(e=>(console.log("node",e.type.name,e.textContent),!i&&!e.isTextblock&&(e.type===Uo.nodes.unordered_list||e.type===Uo.nodes.ordered_list?(i=!0,!1):void 0)))),i)return;xo(n)(r,t)}else{const n=r.blockRange(i);for(let e=n.startIndex;e{const{dispatch:e,state:t}=this.view,{doc:n,tr:r}=t,{$from:i,$to:o}=t.selection,s=i.blockRange(o);for(let e=s.startIndex;e{const{doc:n,selection:r}=e,{$from:i,$to:o}=r,s=i.marks().find((e=>e.type===Uo.marks.link&&!e.attrs[Io])),l=o.marks().find((e=>e.type===Uo.marks.link&&!e.attrs[Io])),a=s&&l;if(r.empty&&!a)return!1;if(s!==l)return!1;if(!t)return!0;const c=s;let h,u,d,p;if(c){const r=i.parent.nodeAt(i.parentOffset-i.textOffset);u=i.pos-i.textOffset,h=u+r.nodeSize,d=r.text,p=c.attrs.href;const o=new st(n.resolve(u),n.resolve(h));t(e.tr.setSelection(o))}else h=o.pos,u=i.pos,d=e.doc.textBetween(i.pos,o.pos),p="";const f=c&&(()=>this.view.dispatch(this.view.state.tr.step(new _e(u,h,c))));return this.modal=new ws(this.modalEl,{onClear:f,onConfirm:({text:e,url:t})=>{const n=Uo.marks.link.create({href:t}),r=Uo.text(e,[n]);this.view.dispatch(this.view.state.tr.replaceSelectionWith(r,!1))},text:d,url:p}),!0},this.toggleMark=e=>{hs(e)(this.view.state,this.view.dispatch),this.view.focus()},this.updateToolbarForSelection=e=>{this.unhighlightSelectedAttrs();const t=this.getSelectedFormatAttrs(e);t&&t.forEach((e=>{const t=this.toolbarEl.querySelector(`[data-format=${e}]`);t&&t.classList.add("selected")}))},this.unhighlightSelectedAttrs=()=>{this.toolbarEl.querySelectorAll(".selected").forEach((e=>{e.classList.remove("selected")}))},this.getSelectedFormatAndMarks=e=>{if(!e.selection)return;const t=[],{$from:n,$to:r}=e.selection,i=n.blockRange(r,(e=>e.type!==Uo.nodes.list_item));let o=null;for(let e=i.startIndex;ee.type))),t},this.getSelectedFormatAttrs=e=>{const[t,...n]=this.getSelectedFormatAndMarks(e),r=[];switch(t){case Uo.nodes.heading1:case Uo.nodes.heading2:r.push("heading");break;case Uo.nodes.paragraph:r.push("paragraph");break;case Uo.nodes.unordered_list:r.push("unordered_list");break;case Uo.nodes.ordered_list:r.push("ordered_list");break;case Uo.nodes.checklist_item:r.push("checklist_item");break;default:r.push(null)}return n.forEach((e=>{switch(e){case Uo.marks.link:case Uo.marks.inline_link:r.push("link");break;case Uo.marks.em:r.push("em");break;case Uo.marks.strong:r.push("strong");break;case Uo.marks.code:r.push("code")}})),r},this.handleToolbarClick=e=>{const t=e.target.closest(`[${ys}]`);t&&(e.stopPropagation(),this.applyFormat(t.getAttribute(ys)))},this.applyFormat=e=>{switch(e){case"undo":so(this.view.state,this.view.dispatch);break;case"redo":lo(this.view.state,this.view.dispatch);break;case"paragraph":this.swapTextBlock(Uo.nodes.paragraph);break;case"code_block":this.swapTextBlock(Uo.nodes.code_block);break;case"heading":this.promoteHeading(this.view.state,this.view.dispatch);break;case"unordered_list":this.toggleList(Uo.nodes.unordered_list,Uo.nodes.list_item);break;case"ordered_list":this.toggleList(Uo.nodes.ordered_list,Uo.nodes.list_item);break;case"checklist_item":this.toggleChecklistItem();break;case"strong":case"em":case"code":this.toggleMark(Uo.marks[e]);break;case"link":this.activateLinkModal(this.view.state,this.view.dispatch);break;case"indent":bs(this.view.state,this.view.dispatch);break;case"outdent":vs(this.view.state,this.view.dispatch)}}}}const Cs="show",Ds=new RegExp("^https?://"),Ss=new RegExp("^mailto:");class _s extends wt{static nodeToAnchorHref(e){return Ds.test(e)||Ss.test(e)?e:`http://${e}`}constructor(e){super({view:e=>(this.view=e,{destroy:()=>{this.hide()},update:(e,t)=>{this.checkSelection()}})}),this.checkSelection=()=>{const e=this.view.state.selection;if(!(e instanceof st))return;const{$cursor:t}=e,n=Boolean(t&&t.nodeBefore&&t.nodeAfter&&t.nodeBefore.marks.some((e=>e.type===Uo.marks.link))&&t.nodeAfter.marks.some((e=>e.type===Uo.marks.link)));if(!1===n)return void this.hide();const r=t.nodeBefore.marks.find((e=>e.type===Uo.marks.link));this.show(t,r.attrs.href,r.attrs[Io])},this.hide=()=>{this.tooltipEl.classList.remove(Cs)},this.show=(e,t,n)=>{this.linkTextEl.innerText=t,this.anchorEl.href=_s.nodeToAnchorHref(t),this.tooltipEl.classList.toggle("yes-auto-link",n),this.tooltipEl.classList.add(Cs);const{left:r,top:i}=this.view.coordsAtPos(e.pos),o=this.tooltipEl.offsetWidth,s=document.documentElement.clientWidth;this.tooltipEl.style.left=r+o>s?`${Math.max(5,r-o)}px`:`${Math.max(5,r)}px`;const l=this.view.root.body;this.tooltipEl.style.top=`${i-36+l.scrollTop}px`},this.tooltipEl=e}get linkTextEl(){return this.tooltipEl.querySelector("div.text")}get anchorEl(){return this.tooltipEl.querySelector("a.link-anchor")}}class Es extends wt{constructor(e){super({view:t=>(this.view=t,this.el=e,this.el.addEventListener("click",this.handleClick),{destroy:()=>{this.el.removeEventListener("click",this.handleClick)}})}),this.handleClick=()=>{const{state:e}=this.view,{doc:t,tr:n}=e,r=t.nodeSize-2,i=e.doc.lastChild.type;(i===Uo.nodes.code_block||i.isLeaf)&&n.insert(r,Uo.nodes.paragraph.createAndFill()),n.setSelection(nt.atEnd(n.doc)),this.view.dispatch(n),this.view.focus()}}}const As={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let Ms;const Os=new Uint8Array(16);const Ts=[];for(let e=0;e<256;++e)Ts.push((e+256).toString(16).slice(1));function Ns(e,t=0){return(Ts[e[t+0]]+Ts[e[t+1]]+Ts[e[t+2]]+Ts[e[t+3]]+"-"+Ts[e[t+4]]+Ts[e[t+5]]+"-"+Ts[e[t+6]]+Ts[e[t+7]]+"-"+Ts[e[t+8]]+Ts[e[t+9]]+"-"+Ts[e[t+10]]+Ts[e[t+11]]+Ts[e[t+12]]+Ts[e[t+13]]+Ts[e[t+14]]+Ts[e[t+15]]).toLowerCase()}const Fs=function(e,t,n){if(As.randomUUID&&!t&&!e)return As.randomUUID();const r=(e=e||{}).random??e.rng?.()??function(){if(!Ms){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");Ms=crypto.getRandomValues.bind(crypto)}return Ms(Os)}();if(r.length<16)throw new Error("Random bytes length must be >= 16");if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){if((n=n||0)<0||n+16>t.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[n+e]=r[e];return t}return Ns(r)};var Is=n(92),Rs=n.n(Is);const Bs="com.dylanonelson.sn-editor";function zs(e){return e&&e.content&&e.content[Bs]||null}function Ls(e){return e?e.uuid:null}class Ps{constructor(){let e;this._item=null,this.shouldCallListeners=(e,t)=>!e.isMetadataUpdate&&(Ls(e)!==Ls(t)||function(e){const t=zs(e);return t&&t.lastSavedBy?t.lastSavedBy:null}(e)!==this._id),this._id=Fs(),this._listeners=[],this._ready=new Promise((t=>{e=t})),this.componentManager=new(Rs())({targetWindow:window,options:{debug:!0,acceptsThemes:!0},onReady:()=>{this.componentManager.streamContextItem((t=>{console.debug("streamContextItem update:",t);const n=this.shouldCallListeners(t,this._item);this._item=t,n&&this._listeners.forEach((e=>{e(t)})),e()}))}})}get latestDoc(){return function(e){const t=zs(e);return t&&t.doc?t.doc:null}(this._item)}get latestText(){return(e=this._item)&&e.content&&e.content.text?e.content.text:null;var e}onUpdate(e){return this._listeners.push(e),()=>{this._listeners=this._listeners.filter((t=>t!==e))}}ready(){return this._ready}saveNote(e,t,n){const r=Object.assign(Object.assign({},this._item),{content:Object.assign(Object.assign({},this._item.content),{[Bs]:{doc:e,lastSavedBy:this._id},text:t,preview_plain:n})});this.componentManager.saveItemWithPresave(r,(()=>{}),(()=>{}))}}Ps.SN_ITEM_SAVE_KEY="com.dylanonelson.sn-editor",Ps.itemSelectors={};const qs=new Ps;var $s=n(415),Vs=n.n($s),js=n(115),Us=n.n(js);const Ws="is-checked",Hs={checklist_item(e,t,n){const r=document.createElement("div");r.classList.add("checklist-item");const i=document.createElement("div");i.classList.add("checkbox"),e.attrs.status===$o.DONE?(i.classList.add(Ws),i.innerHTML=Vs()):i.innerHTML=Us();const o=document.createElement("div");o.classList.add("click-target"),o.contentEditable="false",o.tabIndex=0;const s=document.createElement("p");o.appendChild(i),r.appendChild(o),r.appendChild(s);const l=e=>{const{relatedTarget:n,target:r}=e;if(!1===o.contains(n))return;r===t.dom&&t.focus()},a=e=>{if(!1===o.contains(e.target))return;const r=i.classList.contains(Ws),{tr:s}=t.state,l=n();s.setNodeMarkup(l,void 0,{status:r?$o.EMPTY:$o.DONE}),t.dispatch(s)};return t.dom.addEventListener("blur",l),t.dom.addEventListener("click",a),{dom:r,contentDOM:s,destroy(){t.dom.removeEventListener("blur",l),t.dom.removeEventListener("click",a)}}}};for(var Js={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Ks={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Gs="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),Zs="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),Ys=0;Ys<10;Ys++)Js[48+Ys]=Js[96+Ys]=String(Ys);for(Ys=1;Ys<=24;Ys++)Js[Ys+111]="F"+Ys;for(Ys=65;Ys<=90;Ys++)Js[Ys]=String.fromCharCode(Ys+32),Ks[Ys]=String.fromCharCode(Ys);for(var Qs in Js)Ks.hasOwnProperty(Qs)||(Ks[Qs]=Js[Qs]);const Xs="undefined"!=typeof navigator&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),el="undefined"!=typeof navigator&&/Win/.test(navigator.platform);function tl(e){let t,n,r,i,o=e.split(/-(?!$)/),s=o[o.length-1];"Space"==s&&(s=" ");for(let e=0;e!1!==function(e){const{$cursor:t}=e.selection;return Boolean(t&&t.parent.type===Uo.nodes.checklist_item)}(e)&&(!1!==n.endOfTextblock("left")&&void(0===e.selection.$cursor.index(0)&&function(e,t=null){return function(n,r){let i=!1;for(let r=0;r{if(i)return!1;if(r.isTextblock&&!r.hasMarkup(e,t))if(r.type==e)i=!0;else{let t=n.doc.resolve(o),r=t.index();i=t.parent.canReplaceWith(r,r+1,e)}}))}if(!i)return!1;if(r){let i=n.tr;for(let r=0;r=55296&&e<=57343?"���":String.fromCharCode(e),r+=6;continue}}if(240==(248&o)&&r+91114111?t+="����":(e-=65536,t+=String.fromCharCode(55296+(e>>10),56320+(1023&e))),r+=9;continue}}t+="�"}}return t}))}al.defaultChars=";/?:@&=+$,#",al.componentChars="";const cl=al,hl={};function ul(e,t,n){"string"!=typeof t&&(n=t,t=ul.defaultChars),void 0===n&&(n=!0);const r=function(e){let t=hl[e];if(t)return t;t=hl[e]=[];for(let e=0;e<128;e++){const n=String.fromCharCode(e);/^[0-9a-z]$/i.test(n)?t.push(n):t.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2))}for(let n=0;n=55296&&s<=57343){if(s>=55296&&s<=56319&&t+1=56320&&n<=57343){i+=encodeURIComponent(e[t]+e[t+1]),t++;continue}}i+="%EF%BF%BD"}else i+=encodeURIComponent(e[t])}return i}ul.defaultChars=";/?:@&=+$,-_.!~*'()#",ul.componentChars="-_.!~*'()";const dl=ul;function pl(e){let t="";return t+=e.protocol||"",t+=e.slashes?"//":"",t+=e.auth?e.auth+"@":"",e.hostname&&-1!==e.hostname.indexOf(":")?t+="["+e.hostname+"]":t+=e.hostname||"",t+=e.port?":"+e.port:"",t+=e.pathname||"",t+=e.search||"",t+=e.hash||"",t}function fl(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}const ml=/^([a-z0-9.+-]+:)/i,gl=/:[0-9]*$/,yl=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,kl=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),bl=["'"].concat(kl),vl=["%","/","?",";","#"].concat(bl),wl=["/","?","#"],xl=/^[+a-z0-9A-Z_-]{0,63}$/,Cl=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,Dl={javascript:!0,"javascript:":!0},Sl={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};fl.prototype.parse=function(e,t){let n,r,i,o=e;if(o=o.trim(),!t&&1===e.split("#").length){const e=yl.exec(o);if(e)return this.pathname=e[1],e[2]&&(this.search=e[2]),this}let s=ml.exec(o);if(s&&(s=s[0],n=s.toLowerCase(),this.protocol=s,o=o.substr(s.length)),(t||s||o.match(/^\/\/[^@\/]+@[^@\/]+/))&&(i="//"===o.substr(0,2),!i||s&&Dl[s]||(o=o.substr(2),this.slashes=!0)),!Dl[s]&&(i||s&&!Sl[s])){let e,t,n=-1;for(let e=0;e127?r+="x":r+=n[e];if(!r.match(xl)){const r=e.slice(0,t),i=e.slice(t+1),s=n.match(Cl);s&&(r.push(s[1]),i.unshift(s[2])),i.length&&(o=i.join(".")+o),this.hostname=r.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),s&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}const l=o.indexOf("#");-1!==l&&(this.hash=o.substr(l),o=o.slice(0,l));const a=o.indexOf("?");return-1!==a&&(this.search=o.substr(a),o=o.slice(0,a)),o&&(this.pathname=o),Sl[n]&&this.hostname&&!this.pathname&&(this.pathname=""),this},fl.prototype.parseHost=function(e){let t=gl.exec(e);t&&(t=t[0],":"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};const _l=function(e,t){if(e&&e instanceof fl)return e;const n=new fl;return n.parse(e,t),n},El=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,Al=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/,Ml=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Ol=/[\0-\x1F\x7F-\x9F]/,Tl=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/,Nl=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/,Fl=new Uint16Array('ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms„‹•˜¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\0\0⵼\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'.split("").map((e=>e.charCodeAt(0)))),Il=new Uint16Array("Ȁaglq\tɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map((e=>e.charCodeAt(0))));var Rl;const Bl=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),zl=null!==(Rl=String.fromCodePoint)&&void 0!==Rl?Rl:function(e){let t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e),t};function Ll(e){var t;return e>=55296&&e<=57343||e>1114111?65533:null!==(t=Bl.get(e))&&void 0!==t?t:e}var Pl;!function(e){e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z"}(Pl||(Pl={}));var ql,$l,Vl;function jl(e){return e>=Pl.ZERO&&e<=Pl.NINE}function Ul(e){return e>=Pl.UPPER_A&&e<=Pl.UPPER_F||e>=Pl.LOWER_A&&e<=Pl.LOWER_F}function Wl(e){return e===Pl.EQUALS||function(e){return e>=Pl.UPPER_A&&e<=Pl.UPPER_Z||e>=Pl.LOWER_A&&e<=Pl.LOWER_Z||jl(e)}(e)}!function(e){e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(ql||(ql={})),function(e){e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity"}($l||($l={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute"}(Vl||(Vl={}));class Hl{constructor(e,t,n){this.decodeTree=e,this.emitCodePoint=t,this.errors=n,this.state=$l.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=Vl.Strict}startEntity(e){this.decodeMode=e,this.state=$l.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(e,t){switch(this.state){case $l.EntityStart:return e.charCodeAt(t)===Pl.NUM?(this.state=$l.NumericStart,this.consumed+=1,this.stateNumericStart(e,t+1)):(this.state=$l.NamedEntity,this.stateNamedEntity(e,t));case $l.NumericStart:return this.stateNumericStart(e,t);case $l.NumericDecimal:return this.stateNumericDecimal(e,t);case $l.NumericHex:return this.stateNumericHex(e,t);case $l.NamedEntity:return this.stateNamedEntity(e,t)}}stateNumericStart(e,t){return t>=e.length?-1:(32|e.charCodeAt(t))===Pl.LOWER_X?(this.state=$l.NumericHex,this.consumed+=1,this.stateNumericHex(e,t+1)):(this.state=$l.NumericDecimal,this.stateNumericDecimal(e,t))}addToNumericResult(e,t,n,r){if(t!==n){const i=n-t;this.result=this.result*Math.pow(r,i)+parseInt(e.substr(t,i),r),this.consumed+=i}}stateNumericHex(e,t){const n=t;for(;t>14;for(;t>14,0!==i){if(o===Pl.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==Vl.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var e;const{result:t,decodeTree:n}=this,r=(n[t]&ql.VALUE_LENGTH)>>14;return this.emitNamedEntityData(t,r,this.consumed),null===(e=this.errors)||void 0===e||e.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(e,t,n){const{decodeTree:r}=this;return this.emitCodePoint(1===t?r[e]&~ql.VALUE_LENGTH:r[e+1],n),3===t&&this.emitCodePoint(r[e+2],n),n}end(){var e;switch(this.state){case $l.NamedEntity:return 0===this.result||this.decodeMode===Vl.Attribute&&this.result!==this.treeIndex?0:this.emitNotTerminatedNamedEntity();case $l.NumericDecimal:return this.emitNumericEntity(0,2);case $l.NumericHex:return this.emitNumericEntity(0,3);case $l.NumericStart:return null===(e=this.errors)||void 0===e||e.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case $l.EntityStart:return 0}}}function Jl(e){let t="";const n=new Hl(e,(e=>t+=zl(e)));return function(e,r){let i=0,o=0;for(;(o=e.indexOf("&",o))>=0;){t+=e.slice(i,o),n.startEntity(r);const s=n.write(e,o+1);if(s<0){i=o+n.end();break}i=o+s,o=0===s?i+1:i}const s=t+e.slice(i);return t="",s}}function Kl(e,t,n,r){const i=(t&ql.BRANCH_LENGTH)>>7,o=t&ql.JUMP_TABLE;if(0===i)return 0!==o&&r===o?n:-1;if(o){const t=r-o;return t<0||t>=i?-1:e[n+t]-1}let s=n,l=s+i-1;for(;s<=l;){const t=s+l>>>1,n=e[t];if(nr))return e[t+i];l=t-1}}return-1}const Gl=Jl(Fl);Jl(Il);function Zl(e,t=Vl.Legacy){return Gl(e,t)}function Yl(e){for(let t=1;t'"]/g,Ql),Xl(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),Xl(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]));var ea,ta;function na(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)}!function(e){e[e.XML=0]="XML",e[e.HTML=1]="HTML"}(ea||(ea={})),function(e){e[e.UTF8=0]="UTF8",e[e.ASCII=1]="ASCII",e[e.Extensive=2]="Extensive",e[e.Attribute=3]="Attribute",e[e.Text=4]="Text"}(ta||(ta={}));const ra=Object.prototype.hasOwnProperty;function ia(e,t){return ra.call(e,t)}function oa(e){return Array.prototype.slice.call(arguments,1).forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}function sa(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function la(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(!!(65535&~e&&65534!=(65535&e))&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function aa(e){if(e>65535){const t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}const ca=/\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g,ha=new RegExp(ca.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),ua=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;function da(e){return e.indexOf("\\")<0?e:e.replace(ca,"$1")}function pa(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(ha,(function(e,t,n){return t||function(e,t){if(35===t.charCodeAt(0)&&ua.test(t)){const n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10);return la(n)?aa(n):e}const n=Zl(e);return n!==e?n:e}(e,n)}))}const fa=/[&<>"]/,ma=/[&<>"]/g,ga={"&":"&","<":"<",">":">",'"':"""};function ya(e){return ga[e]}function ka(e){return fa.test(e)?e.replace(ma,ya):e}const ba=/[.?*+^$[\]\\(){}|-]/g;function va(e){return e.replace(ba,"\\$&")}function wa(e){switch(e){case 9:case 32:return!0}return!1}function xa(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function Ca(e){return El.test(e)||Al.test(e)}function Da(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function Sa(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}const _a={mdurl:e,ucmicro:t};function Ea(e,t,n){let r,i,o,s;const l=e.posMax,a=e.pos;for(e.pos=t+1,r=1;e.pos32))return o;if(41===r){if(0===s)break;s--}i++}return t===i||0!==s||(o.str=pa(e.slice(t,i)),o.pos=i,o.ok=!0),o}function Ma(e,t,n,r){let i,o=t;const s={ok:!1,can_continue:!1,pos:0,str:"",marker:0};if(r)s.str=r.str,s.marker=r.marker;else{if(o>=n)return s;let r=e.charCodeAt(o);if(34!==r&&39!==r&&40!==r)return s;t++,o++,40===r&&(r=41),s.marker=r}for(;o"+ka(o.content)+""},Oa.code_block=function(e,t,n,r,i){const o=e[t];return""+ka(e[t].content)+"\n"},Oa.fence=function(e,t,n,r,i){const o=e[t],s=o.info?pa(o.info).trim():"";let l,a="",c="";if(s){const e=s.split(/(\s+)/g);a=e[0],c=e.slice(2).join("")}if(l=n.highlight&&n.highlight(o.content,a,c)||ka(o.content),0===l.indexOf("${l}\n`}return`
${l}
\n`},Oa.image=function(e,t,n,r,i){const o=e[t];return o.attrs[o.attrIndex("alt")][1]=i.renderInlineAsText(o.children,n,r),i.renderToken(e,t,n)},Oa.hardbreak=function(e,t,n){return n.xhtmlOut?"
\n":"
\n"},Oa.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?"
\n":"
\n":"\n"},Oa.text=function(e,t){return ka(e[t].content)},Oa.html_block=function(e,t){return e[t].content},Oa.html_inline=function(e,t){return e[t].content},Ta.prototype.renderAttrs=function(e){let t,n,r;if(!e.attrs)return"";for(r="",t=0,n=e.attrs.length;t\n":">",i},Ta.prototype.renderInline=function(e,t,n){let r="";const i=this.rules;for(let o=0,s=e.length;o=0&&(n=this.attrs[t][1]),n},Ra.prototype.attrJoin=function(e,t){const n=this.attrIndex(e);n<0?this.attrPush([e,t]):this.attrs[n][1]=this.attrs[n][1]+" "+t};const Ba=Ra;function za(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}za.prototype.Token=Ba;const La=za,Pa=/\r\n?|\n/g,qa=/\0/g;function $a(e){return/^<\/a\s*>/i.test(e)}const Va=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,ja=/\((c|tm|r)\)/i,Ua=/\((c|tm|r)\)/gi,Wa={c:"©",r:"®",tm:"™"};function Ha(e,t){return Wa[t.toLowerCase()]}function Ja(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];"text"!==r.type||t||(r.content=r.content.replace(Ua,Ha)),"link_open"===r.type&&"auto"===r.info&&t--,"link_close"===r.type&&"auto"===r.info&&t++}}function Ka(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];"text"!==r.type||t||Va.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/gm,"$1—").replace(/(^|\s)--(?=\s|$)/gm,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/gm,"$1–")),"link_open"===r.type&&"auto"===r.info&&t--,"link_close"===r.type&&"auto"===r.info&&t++}}const Ga=/['"]/,Za=/['"]/g;function Ya(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function Qa(e,t){let n;const r=[];for(let i=0;i=0&&!(r[n].level<=s);n--);if(r.length=n+1,"text"!==o.type)continue;let l=o.content,a=0,c=l.length;e:for(;a=0)f=l.charCodeAt(h.index-1);else for(n=i-1;n>=0&&("softbreak"!==e[n].type&&"hardbreak"!==e[n].type);n--)if(e[n].content){f=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a=48&&f<=57&&(d=u=!1),u&&d&&(u=g,d=y),u||d){if(d)for(n=r.length-1;n>=0;n--){let u=r[n];if(r[n].level=0;s--){const l=i[s];if("link_close"!==l.type){if("html_inline"===l.type&&(n=l.content,/^\s]/i.test(n)&&o>0&&o--,$a(l.content)&&o++),!(o>0)&&"text"===l.type&&e.md.linkify.test(l.content)){const n=l.content;let o=e.md.linkify.match(n);const a=[];let c=l.level,h=0;o.length>0&&0===o[0].index&&s>0&&"text_special"===i[s-1].type&&(o=o.slice(1));for(let t=0;th){const t=new e.Token("text","",0);t.content=n.slice(h,l),t.level=c,a.push(t)}const u=new e.Token("link_open","a",1);u.attrs=[["href",i]],u.level=c++,u.markup="linkify",u.info="auto",a.push(u);const d=new e.Token("text","",0);d.content=s,d.level=c,a.push(d);const p=new e.Token("link_close","a",-1);p.level=--c,p.markup="linkify",p.info="auto",a.push(p),h=o[t].lastIndex}if(h=0;t--)"inline"===e.tokens[t].type&&(ja.test(e.tokens[t].content)&&Ja(e.tokens[t].children),Va.test(e.tokens[t].content)&&Ka(e.tokens[t].children))}],["smartquotes",function(e){if(e.md.options.typographer)for(let t=e.tokens.length-1;t>=0;t--)"inline"===e.tokens[t].type&&Ga.test(e.tokens[t].content)&&Qa(e.tokens[t].children,e)}],["text_join",function(e){let t,n;const r=e.tokens,i=r.length;for(let e=0;e0&&this.level++,this.tokens.push(r),r},nc.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},nc.prototype.skipEmptyLines=function(e){for(let t=this.lineMax;et;)if(!wa(this.src.charCodeAt(--e)))return e+1;return e},nc.prototype.skipChars=function(e,t){for(let n=this.src.length;en;)if(t!==this.src.charCodeAt(--e))return e+1;return e},nc.prototype.getLines=function(e,t,n,r){if(e>=t)return"";const i=new Array(t-e);for(let o=0,s=e;sn?new Array(e-n+1).join(" ")+this.src.slice(c,a):this.src.slice(c,a)}return i.join("")},nc.prototype.Token=Ba;const rc=nc;function ic(e,t){const n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function oc(e){const t=[],n=e.length;let r=0,i=e.charCodeAt(r),o=!1,s=0,l="";for(;r=r)return-1;let o=e.src.charCodeAt(i++);if(o<48||o>57)return-1;for(;;){if(i>=r)return-1;if(o=e.src.charCodeAt(i++),!(o>=48&&o<=57)){if(41===o||46===o)break;return-1}if(i-n>=10)return-1}return i`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",cc="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",hc=new RegExp("^(?:"+ac+"|"+cc+"|\x3c!---?>|\x3c!--(?:[^-]|-[^-]|--[^>])*--\x3e|<[?][\\s\\S]*?[?]>|]*>|)"),uc=new RegExp("^(?:"+ac+"|"+cc+")"),dc=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(uc.source+"\\s*$"),/^$/,!1]];const pc=[["table",function(e,t,n,r){if(t+2>n)return!1;let i=t+1;if(e.sCount[i]=4)return!1;let o=e.bMarks[i]+e.tShift[i];if(o>=e.eMarks[i])return!1;const s=e.src.charCodeAt(o++);if(124!==s&&45!==s&&58!==s)return!1;if(o>=e.eMarks[i])return!1;const l=e.src.charCodeAt(o++);if(124!==l&&45!==l&&58!==l&&!wa(l))return!1;if(45===s&&wa(l))return!1;for(;o=4)return!1;c=oc(a),c.length&&""===c[0]&&c.shift(),c.length&&""===c[c.length-1]&&c.pop();const u=c.length;if(0===u||u!==h.length)return!1;if(r)return!0;const d=e.parentType;e.parentType="table";const p=e.md.block.ruler.getRules("blockquote"),f=[t,0];e.push("table_open","table",1).map=f,e.push("thead_open","thead",1).map=[t,t+1],e.push("tr_open","tr",1).map=[t,t+1];for(let t=0;t=4)break;if(c=oc(a),c.length&&""===c[0]&&c.shift(),c.length&&""===c[c.length-1]&&c.pop(),g+=u-c.length,g>65536)break;if(i===t+2){e.push("tbody_open","tbody",1).map=m=[t+2,0]}e.push("tr_open","tr",1).map=[i,i+1];for(let t=0;t=4))break;r++,i=r}e.line=i;const o=e.push("code_block","code",0);return o.content=e.getLines(t,i,4+e.blkIndent,!1)+"\n",o.map=[t,e.line],!0}],["fence",function(e,t,n,r){let i=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(i+3>o)return!1;const s=e.src.charCodeAt(i);if(126!==s&&96!==s)return!1;let l=i;i=e.skipChars(i,s);let a=i-l;if(a<3)return!1;const c=e.src.slice(l,i),h=e.src.slice(i,o);if(96===s&&h.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let u=t,d=!1;for(;(u++,!(u>=n))&&(i=l=e.bMarks[u]+e.tShift[u],o=e.eMarks[u],!(i=4||(i=e.skipChars(i,s),i-l=4)return!1;if(62!==e.src.charCodeAt(i))return!1;if(r)return!0;const l=[],a=[],c=[],h=[],u=e.md.block.ruler.getRules("blockquote"),d=e.parentType;e.parentType="blockquote";let p,f=!1;for(p=t;p=o)break;if(62===e.src.charCodeAt(i++)&&!t){let t,n,r=e.sCount[p]+1;32===e.src.charCodeAt(i)?(i++,r++,n=!1,t=!0):9===e.src.charCodeAt(i)?(t=!0,(e.bsCount[p]+r)%4==3?(i++,r++,n=!1):n=!0):t=!1;let s=r;for(l.push(e.bMarks[p]),e.bMarks[p]=i;i=o,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(t?1:0),c.push(e.sCount[p]),e.sCount[p]=s-r,h.push(e.tShift[p]),e.tShift[p]=i-e.bMarks[p];continue}if(f)break;let r=!1;for(let t=0,i=u.length;t";const y=[t,0];g.map=y,e.md.block.tokenize(e,t,p),e.push("blockquote_close","blockquote",-1).markup=">",e.lineMax=s,e.parentType=d,y[1]=e.line;for(let n=0;n=4)return!1;let o=e.bMarks[t]+e.tShift[t];const s=e.src.charCodeAt(o++);if(42!==s&&45!==s&&95!==s)return!1;let l=1;for(;o=4)return!1;if(e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]=e.blkIndent&&(p=!0),(d=lc(e,a))>=0){if(h=!0,s=e.bMarks[a]+e.tShift[a],u=Number(e.src.slice(s,d-1)),p&&1!==u)return!1}else{if(!((d=sc(e,a))>=0))return!1;h=!1}if(p&&e.skipSpaces(d)>=e.eMarks[a])return!1;if(r)return!0;const f=e.src.charCodeAt(d-1),m=e.tokens.length;h?(l=e.push("ordered_list_open","ol",1),1!==u&&(l.attrs=[["start",u]])):l=e.push("bullet_list_open","ul",1);const g=[a,0];l.map=g,l.markup=String.fromCharCode(f);let y=!1;const k=e.md.block.ruler.getRules("list"),b=e.parentType;for(e.parentType="list";a=i?1:r-t,p>4&&(p=1);const m=t+p;l=e.push("list_item_open","li",1),l.markup=String.fromCharCode(f);const g=[a,0];l.map=g,h&&(l.info=e.src.slice(s,d-1));const b=e.tight,v=e.tShift[a],w=e.sCount[a],x=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=m,e.tight=!0,e.tShift[a]=u-e.bMarks[a],e.sCount[a]=r,u>=i&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),e.tight&&!y||(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=x,e.tShift[a]=v,e.sCount[a]=w,e.tight=b,l=e.push("list_item_close","li",-1),l.markup=String.fromCharCode(f),a=e.line,g[1]=a,a>=n)break;if(e.sCount[a]=4)break;let C=!1;for(let t=0,r=k.length;t=4)return!1;if(91!==e.src.charCodeAt(i))return!1;function l(t){const n=e.lineMax;if(t>=n||e.isEmpty(t))return null;let r=!1;if(e.sCount[t]-e.blkIndent>3&&(r=!0),e.sCount[t]<0&&(r=!0),!r){const r=e.md.block.ruler.getRules("reference"),i=e.parentType;e.parentType="reference";let o=!1;for(let i=0,s=r.length;i=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(i))return!1;let s=e.src.slice(i,o),l=0;for(;l=4)return!1;let s=e.src.charCodeAt(i);if(35!==s||i>=o)return!1;let l=1;for(s=e.src.charCodeAt(++i);35===s&&i6||ii&&wa(e.src.charCodeAt(a-1))&&(o=a),e.line=t+1;const c=e.push("heading_open","h"+String(l),1);c.markup="########".slice(0,l),c.map=[t,e.line];const h=e.push("inline","",0);return h.content=e.src.slice(i,o).trim(),h.map=[t,e.line],h.children=[],e.push("heading_close","h"+String(l),-1).markup="########".slice(0,l),!0},["paragraph","reference","blockquote"]],["lheading",function(e,t,n){const r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;const i=e.parentType;e.parentType="paragraph";let o,s=0,l=t+1;for(;l3)continue;if(e.sCount[l]>=e.blkIndent){let t=e.bMarks[l]+e.tShift[l];const n=e.eMarks[l];if(t=n))){s=61===o?1:2;break}}if(e.sCount[l]<0)continue;let t=!1;for(let i=0,o=r.length;i3)continue;if(e.sCount[o]<0)continue;let t=!1;for(let i=0,s=r.length;i=n))&&!(e.sCount[s]=o){e.line=n;break}const t=e.line;let a=!1;for(let o=0;o=e.line)throw new Error("block rule didn't increment state.line");break}if(!a)throw new Error("none of the block rules matched");e.tight=!l,e.isEmpty(e.line-1)&&(l=!0),s=e.line,s0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(i),r},gc.prototype.scanDelims=function(e,t){const n=this.posMax,r=this.src.charCodeAt(e),i=e>0?this.src.charCodeAt(e-1):32;let o=e;for(;o?@[]^_`{|}~-".split("").forEach((function(e){vc[e.charCodeAt(0)]=1}));const xc={tokenize:function(e,t){const n=e.pos,r=e.src.charCodeAt(n);if(t)return!1;if(126!==r)return!1;const i=e.scanDelims(e.pos,!0);let o=i.length;const s=String.fromCharCode(r);if(o<2)return!1;let l;o%2&&(l=e.push("text","",0),l.content=s,o--);for(let t=0;t=0;n--){const r=t[n];if(95!==r.marker&&42!==r.marker)continue;if(-1===r.end)continue;const i=t[r.end],o=n>0&&t[n-1].end===r.end+1&&t[n-1].marker===r.marker&&t[n-1].token===r.token-1&&t[r.end+1].token===i.token+1,s=String.fromCharCode(r.marker),l=e.tokens[r.token];l.type=o?"strong_open":"em_open",l.tag=o?"strong":"em",l.nesting=1,l.markup=o?s+s:s,l.content="";const a=e.tokens[i.token];a.type=o?"strong_close":"em_close",a.tag=o?"strong":"em",a.nesting=-1,a.markup=o?s+s:s,a.content="",o&&(e.tokens[t[n-1].token].content="",e.tokens[t[r.end+1].token].content="",n--)}}const Dc={tokenize:function(e,t){const n=e.pos,r=e.src.charCodeAt(n);if(t)return!1;if(95!==r&&42!==r)return!1;const i=e.scanDelims(e.pos,42===r);for(let t=0;t\x00-\x20]*)$/;const Ec=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,Ac=/^&([a-z][a-z0-9]{1,31});/i;function Mc(e){const t={},n=e.length;if(!n)return;let r=0,i=-2;const o=[];for(let s=0;sl;a-=o[a]+1){const t=e[a];if(t.marker===n.marker&&(t.open&&t.end<0)){let r=!1;if((t.close||n.open)&&(t.length+n.length)%3==0&&(t.length%3==0&&n.length%3==0||(r=!0)),!r){const r=a>0&&!e[a-1].open?o[a-1]+1:0;o[s]=s-a+r,o[a]=r,n.open=!1,t.end=s,t.close=!1,c=-1,i=-2;break}}}-1!==c&&(t[n.marker][(n.open?3:0)+(n.length||0)%3]=c)}}const Oc=[["text",function(e,t){let n=e.pos;for(;n0)return!1;const n=e.pos;if(n+3>e.posMax)return!1;if(58!==e.src.charCodeAt(n))return!1;if(47!==e.src.charCodeAt(n+1))return!1;if(47!==e.src.charCodeAt(n+2))return!1;const r=e.pending.match(bc);if(!r)return!1;const i=r[1],o=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!o)return!1;let s=o.url;if(s.length<=i.length)return!1;s=s.replace(/\*+$/,"");const l=e.md.normalizeLink(s);if(!e.md.validateLink(l))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);const t=e.push("link_open","a",1);t.attrs=[["href",l]],t.markup="linkify",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(s);const n=e.push("link_close","a",-1);n.markup="linkify",n.info="auto"}return e.pos+=s.length-i.length,!0}],["newline",function(e,t){let n=e.pos;if(10!==e.src.charCodeAt(n))return!1;const r=e.pending.length-1,i=e.posMax;if(!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){let t=r-1;for(;t>=1&&32===e.pending.charCodeAt(t-1);)t--;e.pending=e.pending.slice(0,t),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n=r)return!1;let i=e.src.charCodeAt(n);if(10===i){for(t||e.push("hardbreak","br",0),n++;n=55296&&i<=56319&&n+1=56320&&t<=57343&&(o+=e.src[n+1],n++)}const s="\\"+o;if(!t){const t=e.push("text_special","",0);i<256&&0!==vc[i]?t.content=o:t.content=s,t.markup=s,t.info="escape"}return e.pos=n+1,!0}],["backticks",function(e,t){let n=e.pos;if(96!==e.src.charCodeAt(n))return!1;const r=n;n++;const i=e.posMax;for(;n=u)return!1;if(a=f,i=e.md.helpers.parseLinkDestination(e.src,f,e.posMax),i.ok){for(s=e.md.normalizeLink(i.str),e.md.validateLink(s)?f=i.pos:s="",a=f;f=u||41!==e.src.charCodeAt(f))&&(c=!0),f++}if(c){if(void 0===e.env.references)return!1;if(f=0?r=e.src.slice(a,f++):f=p+1):f=p+1,r||(r=e.src.slice(d,p)),o=e.env.references[Sa(r)],!o)return e.pos=h,!1;s=o.href,l=o.title}if(!t){e.pos=d,e.posMax=p;const t=[["href",s]];e.push("link_open","a",1).attrs=t,l&&t.push(["title",l]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=f,e.posMax=u,!0}],["image",function(e,t){let n,r,i,o,s,l,a,c,h="";const u=e.pos,d=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;const p=e.pos+2,f=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(f<0)return!1;if(o=f+1,o=d)return!1;for(c=o,l=e.md.helpers.parseLinkDestination(e.src,o,e.posMax),l.ok&&(h=e.md.normalizeLink(l.str),e.md.validateLink(h)?o=l.pos:h=""),c=o;o=d||41!==e.src.charCodeAt(o))return e.pos=u,!1;o++}else{if(void 0===e.env.references)return!1;if(o=0?i=e.src.slice(c,o++):o=f+1):o=f+1,i||(i=e.src.slice(p,f)),s=e.env.references[Sa(i)],!s)return e.pos=u,!1;h=s.href,a=s.title}if(!t){r=e.src.slice(p,f);const t=[];e.md.inline.parse(r,e.md,e.env,t);const n=e.push("image","img",0),i=[["src",h],["alt",""]];n.attrs=i,n.children=t,n.content=r,a&&i.push(["title",a])}return e.pos=o,e.posMax=d,!0}],["autolink",function(e,t){let n=e.pos;if(60!==e.src.charCodeAt(n))return!1;const r=e.pos,i=e.posMax;for(;;){if(++n>=i)return!1;const t=e.src.charCodeAt(n);if(60===t)return!1;if(62===t)break}const o=e.src.slice(r+1,n);if(_c.test(o)){const n=e.md.normalizeLink(o);if(!e.md.validateLink(n))return!1;if(!t){const t=e.push("link_open","a",1);t.attrs=[["href",n]],t.markup="autolink",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(o);const r=e.push("link_close","a",-1);r.markup="autolink",r.info="auto"}return e.pos+=o.length+2,!0}if(Sc.test(o)){const n=e.md.normalizeLink("mailto:"+o);if(!e.md.validateLink(n))return!1;if(!t){const t=e.push("link_open","a",1);t.attrs=[["href",n]],t.markup="autolink",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(o);const r=e.push("link_close","a",-1);r.markup="autolink",r.info="auto"}return e.pos+=o.length+2,!0}return!1}],["html_inline",function(e,t){if(!e.md.options.html)return!1;const n=e.posMax,r=e.pos;if(60!==e.src.charCodeAt(r)||r+2>=n)return!1;const i=e.src.charCodeAt(r+1);if(33!==i&&63!==i&&47!==i&&!function(e){const t=32|e;return t>=97&&t<=122}(i))return!1;const o=e.src.slice(r).match(hc);if(!o)return!1;if(!t){const t=e.push("html_inline","",0);t.content=o[0],s=t.content,/^\s]/i.test(s)&&e.linkLevel++,function(e){return/^<\/a\s*>/i.test(e)}(t.content)&&e.linkLevel--}var s;return e.pos+=o[0].length,!0}],["entity",function(e,t){const n=e.pos,r=e.posMax;if(38!==e.src.charCodeAt(n))return!1;if(n+1>=r)return!1;if(35===e.src.charCodeAt(n+1)){const r=e.src.slice(n).match(Ec);if(r){if(!t){const t="x"===r[1][0].toLowerCase()?parseInt(r[1].slice(1),16):parseInt(r[1],10),n=e.push("text_special","",0);n.content=la(t)?aa(t):aa(65533),n.markup=r[0],n.info="entity"}return e.pos+=r[0].length,!0}}else{const r=e.src.slice(n).match(Ac);if(r){const n=Zl(r[0]);if(n!==r[0]){if(!t){const t=e.push("text_special","",0);t.content=n,t.markup=r[0],t.info="entity"}return e.pos+=r[0].length,!0}}}return!1}]],Tc=[["balance_pairs",function(e){const t=e.tokens_meta,n=e.tokens_meta.length;Mc(e.delimiters);for(let e=0;e0&&r++,"text"===i[t].type&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;s||e.pos++,o[t]=e.pos},Nc.prototype.tokenize=function(e){const t=this.ruler.getRules(""),n=t.length,r=e.posMax,i=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}if(s){if(e.pos>=r)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},Nc.prototype.parse=function(e,t,n,r){const i=new this.State(e,t,n,r);this.tokenize(i);const o=this.ruler2.getRules(""),s=o.length;for(let e=0;e=3&&":"===e[t-3]||t>=3&&"/"===e[t-3]?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){const r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},qc="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function $c(e){const t=e.re=function(e){const t={};e=e||{},t.src_Any=Ml.source,t.src_Cc=Ol.source,t.src_Z=Nl.source,t.src_P=El.source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");const n="[><|]";return t.src_pseudo_letter="(?:(?![><|]|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|[><|]|"+t.src_ZPCc+")(?!"+(e["---"]?"-(?!--)|":"-|")+"_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|"+n+"|[()[\\]{}.,\"'?!\\-;]).|\\[(?:(?!"+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-])|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+t.src_ZCc+"|[.]|$)|"+(e["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+",(?!"+t.src_ZCc+"|$)|;(?!"+t.src_ZCc+"|$)|\\!+(?!"+t.src_ZCc+"|[!]|$)|\\?(?!"+t.src_ZCc+"|[?]|$))+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy='(^|[><|]|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}(e.__opts__),n=e.__tlds__.slice();function r(e){return e.replace("%TLDS%",t.src_tlds)}e.onCompile(),e.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(t.src_xn),t.src_tlds=n.join("|"),t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");const i=[];function o(e,t){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+t)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(t){const n=e.__schemas__[t];if(null===n)return;const r={validate:null,link:null};if(e.__compiled__[t]=r,"[object Object]"===Rc(n))return!function(e){return"[object RegExp]"===Rc(e)}(n.validate)?Bc(n.validate)?r.validate=n.validate:o(t,n):r.validate=function(e){return function(t,n){const r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}(n.validate),void(Bc(n.normalize)?r.normalize=n.normalize:n.normalize?o(t,n):r.normalize=function(e,t){t.normalize(e)});!function(e){return"[object String]"===Rc(e)}(n)?o(t,n):i.push(t)})),i.forEach((function(t){e.__compiled__[e.__schemas__[t]]&&(e.__compiled__[t].validate=e.__compiled__[e.__schemas__[t]].validate,e.__compiled__[t].normalize=e.__compiled__[e.__schemas__[t]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,t){t.normalize(e)}};const s=Object.keys(e.__compiled__).filter((function(t){return t.length>0&&e.__compiled__[t]})).map(zc).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+s+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+s+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function Vc(e,t){const n=e.__index__,r=e.__last_index__,i=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=i,this.text=i,this.url=i}function jc(e,t){const n=new Vc(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function Uc(e,t){if(!(this instanceof Uc))return new Uc(e,t);var n;t||(n=e,Object.keys(n||{}).reduce((function(e,t){return e||Lc.hasOwnProperty(t)}),!1)&&(t=e,e={})),this.__opts__=Ic({},Lc,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=Ic({},Pc,e),this.__compiled__={},this.__tlds__=qc,this.__tlds_replaced__=!1,this.re={},$c(this)}Uc.prototype.add=function(e,t){return this.__schemas__[e]=t,$c(this),this},Uc.prototype.set=function(e){return this.__opts__=Ic(this.__opts__,e),this},Uc.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;let t,n,r,i,o,s,l,a,c;if(this.re.schema_test.test(e))for(l=this.re.schema_search,l.lastIndex=0;null!==(t=l.exec(e));)if(i=this.testSchemaAt(e,t[2],l.lastIndex),i){this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+i;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(a=e.search(this.re.host_fuzzy_test),a>=0&&(this.__index__<0||a=0&&null!==(r=e.match(this.re.email_fuzzy))&&(o=r.index+r[1].length,s=r.index+r[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=s))),this.__index__>=0},Uc.prototype.pretest=function(e){return this.re.pretest.test(e)},Uc.prototype.testSchemaAt=function(e,t,n){return this.__compiled__[t.toLowerCase()]?this.__compiled__[t.toLowerCase()].validate(e,n,this):0},Uc.prototype.match=function(e){const t=[];let n=0;this.__index__>=0&&this.__text_cache__===e&&(t.push(jc(this,n)),n=this.__last_index__);let r=n?e.slice(n):e;for(;this.test(r);)t.push(jc(this,n)),r=r.slice(this.__last_index__),n+=this.__last_index__;return t.length?t:null},Uc.prototype.matchAtStart=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return null;const t=this.re.schema_at_start.exec(e);if(!t)return null;const n=this.testSchemaAt(e,t[2],t[0].length);return n?(this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+n,jc(this,0)):null},Uc.prototype.tlds=function(e,t){return e=Array.isArray(e)?e:[e],t?(this.__tlds__=this.__tlds__.concat(e).sort().filter((function(e,t,n){return e!==n[t-1]})).reverse(),$c(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,$c(this),this)},Uc.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},Uc.prototype.onCompile=function(){};const Wc=Uc,Hc=2147483647,Jc=36,Kc=/^xn--/,Gc=/[^\0-\x7F]/,Zc=/[\x2E\u3002\uFF0E\uFF61]/g,Yc={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},Qc=Math.floor,Xc=String.fromCharCode;function eh(e){throw new RangeError(Yc[e])}function th(e,t){const n=e.split("@");let r="";n.length>1&&(r=n[0]+"@",e=n[1]);const i=function(e,t){const n=[];let r=e.length;for(;r--;)n[r]=t(e[r]);return n}((e=e.replace(Zc,".")).split("."),t).join(".");return r+i}function nh(e){const t=[];let n=0;const r=e.length;for(;n=55296&&i<=56319&&n>1,e+=Qc(e/t);e>455;r+=Jc)e=Qc(e/35);return Qc(r+36*e/(e+38))},oh=function(e){const t=[],n=e.length;let r=0,i=128,o=72,s=e.lastIndexOf("-");s<0&&(s=0);for(let n=0;n=128&&eh("not-basic"),t.push(e.charCodeAt(n));for(let a=s>0?s+1:0;a=n&&eh("invalid-input");const s=(l=e.charCodeAt(a++))>=48&&l<58?l-48+26:l>=65&&l<91?l-65:l>=97&&l<123?l-97:Jc;s>=Jc&&eh("invalid-input"),s>Qc((Hc-r)/t)&&eh("overflow"),r+=s*t;const c=i<=o?1:i>=o+26?26:i-o;if(sQc(Hc/h)&&eh("overflow"),t*=h}const c=t.length+1;o=ih(r-s,c,0==s),Qc(r/c)>Hc-i&&eh("overflow"),i+=Qc(r/c),r%=c,t.splice(r++,0,i)}var l;return String.fromCodePoint(...t)},sh=function(e){const t=[],n=(e=nh(e)).length;let r=128,i=0,o=72;for(const n of e)n<128&&t.push(Xc(n));const s=t.length;let l=s;for(s&&t.push("-");l=r&&tQc((Hc-i)/a)&&eh("overflow"),i+=(n-r)*a,r=n;for(const n of e)if(nHc&&eh("overflow"),n===r){let e=i;for(let n=Jc;;n+=Jc){const r=n<=o?1:n>=o+26?26:n-o;if(eString.fromCodePoint(...e)},decode:oh,encode:sh,toASCII:function(e){return th(e,(function(e){return Gc.test(e)?"xn--"+sh(e):e}))},toUnicode:function(e){return th(e,(function(e){return Kc.test(e)?oh(e.slice(4).toLowerCase()):e}))}},ah={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}},zero:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","fragments_join"]}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","fragments_join"]}}}},ch=/^(vbscript|javascript|file|data):/,hh=/^data:image\/(gif|png|jpeg|webp);/;function uh(e){const t=e.trim().toLowerCase();return!ch.test(t)||hh.test(t)}const dh=["http:","https:","mailto:"];function ph(e){const t=_l(e,!0);if(t.hostname&&(!t.protocol||dh.indexOf(t.protocol)>=0))try{t.hostname=lh.toASCII(t.hostname)}catch(e){}return dl(pl(t))}function fh(e){const t=_l(e,!0);if(t.hostname&&(!t.protocol||dh.indexOf(t.protocol)>=0))try{t.hostname=lh.toUnicode(t.hostname)}catch(e){}return cl(pl(t),cl.defaultChars+"%")}function mh(e,t){if(!(this instanceof mh))return new mh(e,t);t||na(e)||(t=e||{},e="default"),this.inline=new Fc,this.block=new mc,this.core=new tc,this.renderer=new Na,this.linkify=new Wc,this.validateLink=uh,this.normalizeLink=ph,this.normalizeLinkText=fh,this.utils=r,this.helpers=oa({},i),this.options={},this.configure(e),t&&this.set(t)}mh.prototype.set=function(e){return oa(this.options,e),this},mh.prototype.configure=function(e){const t=this;if(na(e)){const t=e;if(!(e=ah[t]))throw new Error('Wrong `markdown-it` preset "'+t+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach((function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)})),this},mh.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.enable(e,!0))}),this),n=n.concat(this.inline.ruler2.enable(e,!0));const r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this},mh.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.disable(e,!0))}),this),n=n.concat(this.inline.ruler2.disable(e,!0));const r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this},mh.prototype.use=function(e){const t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this},mh.prototype.parse=function(e,t){if("string"!=typeof e)throw new Error("Input data should be a String");const n=new this.core.State(e,this,t);return this.core.process(n),n.tokens},mh.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},mh.prototype.parseInline=function(e,t){const n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens},mh.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};const gh=mh,yh=new Q({nodes:{doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM:()=>["p",0]},blockquote:{content:"block+",group:"block",parseDOM:[{tag:"blockquote"}],toDOM:()=>["blockquote",0]},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM:()=>["div",["hr"]]},heading:{attrs:{level:{default:1}},content:"(text | image)*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM:e=>["h"+e.attrs.level,0]},code_block:{content:"text*",group:"block",code:!0,defining:!0,marks:"",attrs:{params:{default:""}},parseDOM:[{tag:"pre",preserveWhitespace:"full",getAttrs:e=>({params:e.getAttribute("data-params")||""})}],toDOM:e=>["pre",e.attrs.params?{"data-params":e.attrs.params}:{},["code",0]]},ordered_list:{content:"list_item+",group:"block",attrs:{order:{default:1},tight:{default:!1}},parseDOM:[{tag:"ol",getAttrs:e=>({order:e.hasAttribute("start")?+e.getAttribute("start"):1,tight:e.hasAttribute("data-tight")})}],toDOM:e=>["ol",{start:1==e.attrs.order?null:e.attrs.order,"data-tight":e.attrs.tight?"true":null},0]},bullet_list:{content:"list_item+",group:"block",attrs:{tight:{default:!1}},parseDOM:[{tag:"ul",getAttrs:e=>({tight:e.hasAttribute("data-tight")})}],toDOM:e=>["ul",{"data-tight":e.attrs.tight?"true":null},0]},list_item:{content:"block+",defining:!0,parseDOM:[{tag:"li"}],toDOM:()=>["li",0]},text:{group:"inline"},image:{inline:!0,attrs:{src:{},alt:{default:null},title:{default:null}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs:e=>({src:e.getAttribute("src"),title:e.getAttribute("title"),alt:e.getAttribute("alt")})}],toDOM:e=>["img",e.attrs]},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM:()=>["br"]}},marks:{em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:e=>"em"==e.type.name}],toDOM:()=>["em"]},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:e=>"normal"!=e.style.fontWeight&&null},{style:"font-weight=400",clearMark:e=>"strong"==e.type.name},{style:"font-weight",getAttrs:e=>/^(bold(er)?|[5-9]\d{2,})$/.test(e)&&null}],toDOM:()=>["strong"]},link:{attrs:{href:{},title:{default:null}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}],toDOM:e=>["a",e.attrs]},code:{code:!0,parseDOM:[{tag:"code"}],toDOM:()=>["code"]}}});class kh{constructor(e,t){this.schema=e,this.tokenHandlers=t,this.stack=[{type:e.topNodeType,attrs:null,content:[],marks:p.none}]}top(){return this.stack[this.stack.length-1]}push(e){this.stack.length&&this.top().content.push(e)}addText(e){if(!e)return;let t,n=this.top(),r=n.content,i=r[r.length-1],o=this.schema.text(e,n.marks);i&&(t=function(e,t){if(e.isText&&t.isText&&p.sameSet(e.marks,t.marks))return e.withText(e.text+t.text)}(i,o))?r[r.length-1]=t:r.push(o)}openMark(e){let t=this.top();t.marks=e.addToSet(t.marks)}closeMark(e){let t=this.top();t.marks=e.removeFromSet(t.marks)}parseTokens(e){for(let t=0;t{e.openNode(t,bh(i,n,r,o)),e.addText(wh(n.content)),e.closeNode()}:(n[r+"_open"]=(e,n,r,o)=>e.openNode(t,bh(i,n,r,o)),n[r+"_close"]=e=>e.closeNode())}else if(i.node){let t=e.nodeType(i.node);n[r]=(e,n,r,o)=>e.addNode(t,bh(i,n,r,o))}else if(i.mark){let t=e.marks[i.mark];vh(i,r)?n[r]=(e,n,r,o)=>{e.openMark(t.create(bh(i,n,r,o))),e.addText(wh(n.content)),e.closeMark(t)}:(n[r+"_open"]=(e,n,r,o)=>e.openMark(t.create(bh(i,n,r,o))),n[r+"_close"]=e=>e.closeMark(t))}else{if(!i.ignore)throw new RangeError("Unrecognized parsing spec "+JSON.stringify(i));vh(i,r)?n[r]=xh:(n[r+"_open"]=xh,n[r+"_close"]=xh)}}return n.text=(e,t)=>e.addText(t.content),n.inline=(e,t)=>e.parseTokens(t.children),n.softbreak=n.softbreak||(e=>e.addText(" ")),n}(e,n)}parse(e,t={}){let n,r=new kh(this.schema,this.tokenHandlers);r.parseTokens(this.tokenizer.parse(e,t));do{n=r.closeNode()}while(r.stack.length);return n||this.schema.topNodeType.createAndFill()}}function Dh(e,t){for(;++t({tight:Dh(t,n)})},ordered_list:{block:"ordered_list",getAttrs:(e,t,n)=>({order:+e.attrGet("start")||1,tight:Dh(t,n)})},heading:{block:"heading",getAttrs:e=>({level:+e.tag.slice(1)})},code_block:{block:"code_block",noCloseToken:!0},fence:{block:"code_block",getAttrs:e=>({params:e.info||""}),noCloseToken:!0},hr:{node:"horizontal_rule"},image:{node:"image",getAttrs:e=>({src:e.attrGet("src"),title:e.attrGet("title")||null,alt:e.children[0]&&e.children[0].content||null})},hardbreak:{node:"hard_break"},em:{mark:"em"},strong:{mark:"strong"},link:{mark:"link",getAttrs:e=>({href:e.attrGet("href"),title:e.attrGet("title")||null})},code_inline:{mark:"code",noCloseToken:!0}});const Sh={open:"",close:"",mixable:!0};class _h{constructor(e,t,n={}){this.nodes=e,this.marks=t,this.options=n}serialize(e,t={}){t=Object.assign({},this.options,t);let n=new Mh(this.nodes,this.marks,t);return n.renderContent(e),n.out}}const Eh=new _h({blockquote(e,t){e.wrapBlock("> ",null,t,(()=>e.renderContent(t)))},code_block(e,t){const n=t.textContent.match(/`{3,}/gm),r=n?n.sort().slice(-1)[0]+"`":"```";e.write(r+(t.attrs.params||"")+"\n"),e.text(t.textContent,!1),e.write("\n"),e.write(r),e.closeBlock(t)},heading(e,t){e.write(e.repeat("#",t.attrs.level)+" "),e.renderInline(t,!1),e.closeBlock(t)},horizontal_rule(e,t){e.write(t.attrs.markup||"---"),e.closeBlock(t)},bullet_list(e,t){e.renderList(t," ",(()=>(t.attrs.bullet||"*")+" "))},ordered_list(e,t){let n=t.attrs.order||1,r=String(n+t.childCount-1).length,i=e.repeat(" ",r+2);e.renderList(t,i,(t=>{let i=String(n+t);return e.repeat(" ",r-i.length)+i+". "}))},list_item(e,t){e.renderContent(t)},paragraph(e,t){e.renderInline(t),e.closeBlock(t)},image(e,t){e.write("!["+e.esc(t.attrs.alt||"")+"]("+t.attrs.src.replace(/[\(\)]/g,"\\$&")+(t.attrs.title?' "'+t.attrs.title.replace(/"/g,'\\"')+'"':"")+")")},hard_break(e,t,n,r){for(let i=r+1;i(e.inAutolink=function(e,t,n){if(e.attrs.title||!/^\w+:/.test(e.attrs.href))return!1;let r=t.child(n);return!(!r.isText||r.text!=e.attrs.href||r.marks[r.marks.length-1]!=e)&&(n==t.childCount-1||!e.isInSet(t.child(n+1).marks))}(t,n,r),e.inAutolink?"<":"["),close(e,t,n,r){let{inAutolink:i}=e;return e.inAutolink=void 0,i?">":"]("+t.attrs.href.replace(/[\(\)"]/g,"\\$&")+(t.attrs.title?` "${t.attrs.title.replace(/"/g,'\\"')}"`:"")+")"},mixable:!0},code:{open:(e,t,n,r)=>Ah(n.child(r),-1),close:(e,t,n,r)=>Ah(n.child(r-1),1),escape:!1}});function Ah(e,t){let n,r=/`+/g,i=0;if(e.isText)for(;n=r.exec(e.text);)i=Math.max(i,n[0].length);let o=i>0&&t>0?" `":"`";for(let e=0;e0&&t<0&&(o+=" "),o}class Mh{constructor(e,t,n){this.nodes=e,this.marks=t,this.options=n,this.delim="",this.out="",this.closed=null,this.inAutolink=void 0,this.atBlockStart=!1,this.inTightList=!1,void 0===this.options.tightLists&&(this.options.tightLists=!1),void 0===this.options.hardBreakNodeName&&(this.options.hardBreakNodeName="hard_break")}flushClose(e=2){if(this.closed){if(this.atBlank()||(this.out+="\n"),e>1){let t=this.delim,n=/\s+$/.exec(t);n&&(t=t.slice(0,t.length-n[0].length));for(let n=1;nthis.render(t,e,r)))}renderInline(e,t=!0){this.atBlockStart=t;let n=[],r="",i=(t,i,o)=>{let s=t?t.marks:[];t&&t.type.name===this.options.hardBreakNodeName&&(s=s.filter((t=>{if(o+1==e.childCount)return!1;let n=e.child(o+1);return t.isInSet(n.marks)&&(!n.isText||/\S/.test(n.text))})));let l=r;if(r="",t&&t.isText&&s.some((e=>{let t=this.getMark(e.type.name);return t&&t.expelEnclosingWhitespace&&!e.isInSet(n)}))){let[e,r,i]=/^(\s*)(.*)$/m.exec(t.text);r&&(l+=r,(t=i?t.withText(i):null)||(s=n))}if(t&&t.isText&&s.some((t=>{let n=this.getMark(t.type.name);return n&&n.expelEnclosingWhitespace&&(o==e.childCount-1||!t.isInSet(e.child(o+1).marks))}))){let[e,i,o]=/^(.*?)(\s*)$/m.exec(t.text);o&&(r=o,(t=i?t.withText(i):null)||(s=n))}let a=s.length?s[s.length-1]:null,c=a&&!1===this.getMark(a.type.name).escape,h=s.length-(c?1:0);e:for(let e=0;er?s=s.slice(0,r).concat(t).concat(s.slice(r,e)).concat(s.slice(e+1,h)):r>e&&(s=s.slice(0,e).concat(s.slice(e+1,r)).concat(t).concat(s.slice(r,h)));continue e}}}let u=0;for(;u0&&(this.atBlockStart=!1)};e.forEach(i),i(null,0,e.childCount),this.atBlockStart=!1}renderList(e,t,n){this.closed&&this.closed.type==e.type?this.flushClose(3):this.inTightList&&this.flushClose(1);let r=void 0!==e.attrs.tight?e.attrs.tight:this.options.tightLists,i=this.inTightList;this.inTightList=r,e.forEach(((i,o,s)=>{s&&r&&this.flushClose(1),this.wrapBlock(t,n(s),e,(()=>this.render(i,e,s)))})),this.inTightList=i}esc(e,t=!1){return e=e.replace(/[`*\\~\[\]_]/g,((t,n)=>"_"==t&&n>0&&n+1])/,"\\$&").replace(/^(\s*)(#{1,6})(\s|$)/,"$1\\$2$3").replace(/^(\s*\d+)\.\s/,"$1\\. ")),this.options.escapeExtraCharacters&&(e=e.replace(this.options.escapeExtraCharacters,"\\$&")),e}quote(e){let t=-1==e.indexOf('"')?'""':-1==e.indexOf("'")?"''":"()";return t[0]+e+t[1]}repeat(e,t){let n="";for(let r=0;rt.attrs[Fo]?"":"`",escape:!1,open:(e,t)=>t.attrs[Fo]?"":"`"}})),Th=gh(),Nh=Th.core.State.prototype.Token,Fh=Th.inline.ruler.__find__("image"),Ih=Th.inline.ruler.__rules__[Fh].fn,Rh=["[x]","[X]","[ ]"];Th.use((e=>{e.core.ruler.after("block","checklist_item",(e=>{const t=e.src.split("\n");let n=!1,r=!1;return e.tokens=e.tokens.map((i=>{if(n&&"inline"===i.type&&(i.content=i.content.slice(3).trimLeft()),"paragraph_open"===i.type){const[o,s]=i.map,l=t[o];if(Rh.includes(l.slice(0,3))){r=!0,n=!0;const{Token:t}=e,i=new t("checklist_item_open","div",1);return i.attrPush(["status","x"===l[1].toLowerCase()?$o.DONE.toString():$o.EMPTY.toString()]),i}}else if(n&&"paragraph_close"===i.type)return n=!1,new e.Token("checklist_item_close","div",-1);return i})),r})),e.inline.ruler.at("image",(e=>{const{pos:t}=e,n=Ih(e);if(n){const n=new e.Token("code_inline","code",0);n.markup="`",n.content=e.src.slice(t,e.pos),n.attrSet(Fo,"true"),e.tokens[e.tokens.length-1]=n}return n}))}));class Bh{static getTypeName(e){return e.replace("_open","").replace("_close","")}constructor(e){this.getTokens=()=>{const{fullTokenList:e,parseable:t}=this;if(!1===t){const{map:[t,n]}=e[0],r=new Nh("fence","code",0);return r.content=this.src.split("\n").slice(t,n).join("\n"),r.attrPush([Fo,"true"]),[r]}return e},this.resetInternalState=()=>{this.fullTokenList=[],this.tokenStack=[],this.parseable=!0},this.resetInternalState(),this.src=e}take(e){const{nesting:t}=e;let{type:n}=e;if(n=Bh.getTypeName(n),this.fullTokenList.push(e),!1===Bh.DOCUMENT_MAP.has(n)&&"inline"!==n&&(this.parseable=!1),this.parseable&&this.tokenStack.length&&t>=0){const e=Bh.getTypeName(this.tokenStack[this.tokenStack.length-1].type);!1===Bh.DOCUMENT_MAP.get(e).includes(n)&&(this.parseable=!1)}if(t>0&&this.tokenStack.push(e),t<0&&this.tokenStack.pop(),0===this.tokenStack.length){const e=this.getTokens();return this.resetInternalState(),e}return null}}Bh.DOCUMENT_MAP=new Map([["heading1",["inline"]],["heading2",["inline"]],["heading3",["inline"]],["paragraph",["inline"]],["fence",["inline"]],["bullet_list",["list_item","inline"]],["ordered_list",["list_item","inline"]],["list_item",["paragraph","ordered_list","bullet_list"]],["checklist_item",["inline"]],["inline",[]]]);const zh=new Ch(Uo,{parse(...e){window.mip=Th;const t=Th.parse(...e),n=[],r=new Bh(e[0]);for(let e=0;e"true"===e.attrGet(Fo)?{[Fo]:!0}:{}},heading1:{block:"heading1"},heading2:{block:"heading2"},heading3:{block:"heading3"},list_item:{block:"list_item"},ordered_list:{block:"ordered_list"},paragraph:{block:"paragraph"},checklist_item:{block:"checklist_item",getAttrs:e=>({status:e.attrGet("status")===$o.DONE.toString()?$o.DONE:$o.EMPTY})},em:{mark:"em"},strong:{mark:"strong"},code_inline:{getAttrs:e=>"true"===e.attrGet(Fo)?{[Fo]:!0}:{},mark:"code",noCloseToken:!0},link:{mark:"link",getAttrs:e=>Object.assign({href:e.attrGet("href"),title:e.attrGet("title")||null},"auto"===e.info&&{[Io]:!0})}}),Lh=new Wc;class Ph extends wt{constructor(){super({appendTransaction:(e,t,n)=>(e=>{const{tr:t}=e;return t.doc.descendants(((e,n,r)=>{if(!e.isTextblock)return;const i=n+1,o=[];e.forEach(((e,t,r)=>{if(!e.isText)return;let s=e.marks.find((e=>e.type===Uo.marks.link));if(s&&!0===s.attrs[Io])if(o.length){const r=o[o.length-1];r.endPos===i+t&&(r.endPos=n+t+e.nodeSize)}else o.push({startPos:i+t,endPos:i+t+e.nodeSize})}));for(const e of o){const n=t.doc.textBetween(e.startPos,e.endPos);Lh.test(n)?t.addMark(e.startPos,e.endPos,Uo.marks.link.create({href:n,[Io]:!0})):t.removeMark(e.startPos,e.endPos,Uo.marks.link)}const s=Lh.match(e.textContent);if(s)for(const e of s){const r=n+1+e.index,i=r+e.text.length;if(!t.doc.rangeHasMark(r,i,Uo.marks.code)){if(t.doc.rangeHasMark(r,i,Uo.marks.link)){let e=[];if(t.doc.nodesBetween(r,i,(t=>{if(t.isText){const n=t.marks.find((e=>e.type===Uo.marks.link));n&&!1===n.attrs[Io]&&e.push(n)}})),e.length)continue}t.addMark(r,i,Uo.marks.link.create({href:e.url,[Io]:!0}))}}})),t})(n)})}}var qh=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function l(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,l)}a((r=r.apply(e,t||[])).next())}))};function $h(){return qs.latestText?zh.parse(qs.latestText):qs.latestDoc?Uo.nodeFromJSON(qs.latestDoc):Uo.topNodeType.createAndFill()}!function(){qh(this,void 0,void 0,(function*(){yield qs.ready();const e=window.view=new Bi(document.querySelector("#editor"),{state:bt.create({doc:$h(),plugins:[...sl,new xs(document.querySelector("#toolbar"),document.querySelector("#link-modal")),new _s(document.querySelector("#link-tooltip")),new Es(document.querySelector("#extender")),new wt({props:{nodeViews:Hs}}),new Ph,Jo,Go,io()]}),dispatchTransaction(t){const n=e.state.apply(t);e.updateState(n),t.docChanged&&qs.saveNote(n.doc.toJSON(),Oh.serialize(n.doc),n.doc.textBetween(0,n.doc.nodeSize-2," "))}});qs.onUpdate((t=>{const n=e.state.plugins.filter((e=>e instanceof xs==!1));e.setProps({state:bt.create({doc:$h(),plugins:[...n,new xs(document.querySelector("#toolbar"),document.querySelector("#link-modal"))]})})}))}))}()})()})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxXQUFXLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsYUFBYSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsS0FBSyxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsMkJBQTJCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLDBCQUEwQixDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSx5QkFBeUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBa0MsR0FBWSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBa0MsR0FBWSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLDJCQUEyQixDQUFDLEVBQUUsMkJBQTJCLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsMEJBQTBCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsd0JBQXdCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLEVBQUUsd0JB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QUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLENBQUMsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksSUFBa0MsR0FBWSxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxlQUFlLENBQUMsS0FBSyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxlQUFyOXRCLE1DZE0sR0FBYSxJQUFJLElBQUksQ0FDdkIsQ0FBQyxHQUFJLFVBQ0wsQ0FBQyxHQUFJLFNBQ0wsQ0FBQyxHQUFJLFVBQ0wsQ0FBQyxHQUFJLFFBQ0wsQ0FBQyxHQUFJLFVBTUwsT0FBTyxVQUFVLFlBbUVyQixTQUFTLEdBQ0ws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YSxFQUFHcUUsWUFDTGl5QyxHQUFPUCxTQUNMdndELEVBQUtWLElBQUk5RSxTQUNUcTlFLEdBQW1CL0MsVUFBVTkwRSxFQUFLVixLQUNsQ1UsRUFBS1YsSUFBSTlHLFlBQVksRUFBR3dILEVBQUtWLElBQUloSSxTQUFXLEVBQUcsS0FHckQsSUFJSnc1RCxHQUFPVCxVQUFVL3dELElBRWYsTUFBTXNuQixFQUFVa0csRUFBSzNvQixNQUFNeWlCLFFBQVF4NUIsUUFDaEMyNUIsR0FBV0EsYUFBa0Jna0MsS0FBa0IsSUFHbERqK0IsRUFBSzZxQixTQUFTLENBQ1p4ekMsTUFBTzZpQixHQUFZaHJCLE9BQU8sQ0FDeEJzRCxJQUFLNDZFLEtBQ0x0ekQsUUFBUyxJQUNKQSxFQUNILElBQUlta0MsR0FDRm5nRSxTQUFTeW5CLGNBQWMsWUFDdkJ6bkIsU0FBU3luQixjQUFjLG9CQUk3QixHQUVOLEcsQ0FFQWdVLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9saWIvc25qc1R5cGVzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JlZ2V4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL2xpYi91dGlscy50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL2xpYi9sb2dnZXIudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9saWIvY29tcG9uZW50UmVsYXkudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvYXNzZXRzL2NoZWNrX2JveF9vdXRsaW5lX2JsYW5rLTI0cHguc3ZnIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2Fzc2V0cy9jaGVja19ib3gtMjRweC5zdmciLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9vcmRlcmVkbWFwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci10cmFuc2Zvcm0vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zdGF0ZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXZpZXcvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9yb3BlLXNlcXVlbmNlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaGlzdG9yeS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWlucHV0cnVsZXMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtbGlzdC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXNjaGVtYS1iYXNpYy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3NjaGVtYS50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9pbnB1dFJ1bGVzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWNvbW1hbmRzL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvVG9vbGJhclBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9Ub29sdGlwUGx1Z2luLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL0VkaXRvckV4dGVuZGVyUGx1Z2luLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uYXRpdmUuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9jbGllbnQudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvbm9kZVZpZXdzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3czYy1rZXluYW1lL2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWtleW1hcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2tleW1hcHMudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2RlY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2VuY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2Zvcm1hdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL3BhcnNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL1AvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvUy9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vcHJvcGVydGllcy9BbnkvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvQ2MvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvQ2YvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvWi9yZWdleC5tanMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS14bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9kZWNvZGVfY29kZXBvaW50LnRzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvZGVjb2RlLnRzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvZ2VuZXJhdGVkL2VuY29kZS1odG1sLnRzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvZXNjYXBlLnRzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2NvbW1vbi91dGlscy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2hlbHBlcnMvcGFyc2VfbGlua19sYWJlbC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2hlbHBlcnMvcGFyc2VfbGlua19kZXN0aW5hdGlvbi5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2hlbHBlcnMvcGFyc2VfbGlua190aXRsZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3JlbmRlcmVyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXIubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi90b2tlbi5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvc3RhdGVfY29yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvbm9ybWFsaXplLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9saW5raWZ5Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9yZXBsYWNlbWVudHMubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL3NtYXJ0cXVvdGVzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcGFyc2VyX2NvcmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL3RleHRfam9pbi5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3N0YXRlX2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svdGFibGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9saXN0Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvY29tbW9uL2h0bWxfYmxvY2tzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvY29tbW9uL2h0bWxfcmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9odG1sX2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcGFyc2VyX2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2ZlbmNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svYmxvY2txdW90ZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2hyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svcmVmZXJlbmNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaGVhZGluZy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2xoZWFkaW5nLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svcGFyYWdyYXBoLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL3N0YXRlX2lubGluZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS90ZXh0Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2xpbmtpZnkubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZXNjYXBlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL3N0cmlrZXRocm91Z2gubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZW1waGFzaXMubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvYXV0b2xpbmsubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZW50aXR5Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2JhbGFuY2VfcGFpcnMubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9wYXJzZXJfaW5saW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL25ld2xpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvYmFja3RpY2tzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2xpbmsubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaW1hZ2UubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaHRtbF9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZnJhZ21lbnRzX2pvaW4ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL2xpbmtpZnktaXQvaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL2xpbmtpZnktaXQvbGliL3JlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wdW55Y29kZS5qcy9wdW55Y29kZS5lczYuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcHJlc2V0cy9kZWZhdWx0Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcHJlc2V0cy96ZXJvLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcHJlc2V0cy9jb21tb25tYXJrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1tYXJrZG93bi9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL21hcmtkb3duLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL0lubGluZUxpbmtQbHVnaW4udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJDb21wb25lbnRSZWxheVwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJDb21wb25lbnRSZWxheVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJDb21wb25lbnRSZWxheVwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIi8vIFRoZSByZXF1aXJlIHNjb3BlXG52YXIgX193ZWJwYWNrX3JlcXVpcmVfXyA9IHt9O1xuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLyoqXG4gKiBEZWNsYXJpbmcgdHlwZXMgbmVlZGVkIGZyb20gc25qcy5cbiAqIFRoaXMgZmlsZSB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgc25qcyBiZWNvbWVzIGEgbW9ub3JlcG8gYW5kIHByb3ZpZGVzIHN1Y2ggdHlwZXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgYXZhaWxhYmxlIGFjdGlvbnMgdGhhdCBhIGNvbXBvbmVudCBjYW4gcGVyZm9ybS5cbiAqL1xuZXhwb3J0IGVudW0gQ29tcG9uZW50QWN0aW9uIHtcbiAgU2V0U2l6ZSA9ICdzZXQtc2l6ZScsXG4gIFN0cmVhbUl0ZW1zID0gJ3N0cmVhbS1pdGVtcycsXG4gIFN0cmVhbUNvbnRleHRJdGVtID0gJ3N0cmVhbS1jb250ZXh0LWl0ZW0nLFxuICBTYXZlSXRlbXMgPSAnc2F2ZS1pdGVtcycsXG4gIFNlbGVjdEl0ZW0gPSAnc2VsZWN0LWl0ZW0nLFxuICBBc3NvY2lhdGVJdGVtID0gJ2Fzc29jaWF0ZS1pdGVtJyxcbiAgRGVhc3NvY2lhdGVJdGVtID0gJ2RlYXNzb2NpYXRlLWl0ZW0nLFxuICBDbGVhclNlbGVjdGlvbiA9ICdjbGVhci1zZWxlY3Rpb24nLFxuICBDcmVhdGVJdGVtID0gJ2NyZWF0ZS1pdGVtJyxcbiAgQ3JlYXRlSXRlbXMgPSAnY3JlYXRlLWl0ZW1zJyxcbiAgRGVsZXRlSXRlbXMgPSAnZGVsZXRlLWl0ZW1zJyxcbiAgU2V0Q29tcG9uZW50RGF0YSA9ICdzZXQtY29tcG9uZW50LWRhdGEnLFxuICBJbnN0YWxsTG9jYWxDb21wb25lbnQgPSAnaW5zdGFsbC1sb2NhbC1jb21wb25lbnQnLFxuICBUb2dnbGVBY3RpdmF0ZUNvbXBvbmVudCA9ICd0b2dnbGUtYWN0aXZhdGUtY29tcG9uZW50JyxcbiAgUmVxdWVzdFBlcm1pc3Npb25zID0gJ3JlcXVlc3QtcGVybWlzc2lvbnMnLFxuICBQcmVzZW50Q29uZmxpY3RSZXNvbHV0aW9uID0gJ3ByZXNlbnQtY29uZmxpY3QtcmVzb2x1dGlvbicsXG4gIER1cGxpY2F0ZUl0ZW0gPSAnZHVwbGljYXRlLWl0ZW0nLFxuICBDb21wb25lbnRSZWdpc3RlcmVkID0gJ2NvbXBvbmVudC1yZWdpc3RlcmVkJyxcbiAgQWN0aXZhdGVUaGVtZXMgPSAndGhlbWVzJyxcbiAgUmVwbHkgPSAncmVwbHknLFxuICBTYXZlU3VjY2VzcyA9ICdzYXZlLXN1Y2Nlc3MnLFxuICBTYXZlRXJyb3IgPSAnc2F2ZS1lcnJvcicsXG4gIFRoZW1lc0FjdGl2YXRlZCA9ICd0aGVtZXMtYWN0aXZhdGVkJyxcbiAgS2V5RG93biA9ICdrZXktZG93bicsXG4gIEtleVVwID0gJ2tleS11cCcsXG4gIENsaWNrID0gJ2NsaWNrJ1xufVxuXG5leHBvcnQgZW51bSBFbnZpcm9ubWVudCB7XG4gIFdlYiA9IDEsXG4gIERlc2t0b3AgPSAyLFxuICBNb2JpbGUgPSAzXG59XG5cbmV4cG9ydCBlbnVtIENvbnRlbnRUeXBlIHtcbiAgQW55ID0gJyonLFxuICBJdGVtID0gJ1NGfEl0ZW0nLFxuICBSb290S2V5ID0gJ1NOfFJvb3RLZXl8Tm9TeW5jJyxcbiAgSXRlbXNLZXkgPSAnU058SXRlbXNLZXknLFxuICBFbmNyeXB0ZWRTdG9yYWdlID0gJ1NOfEVuY3J5cHRlZFN0b3JhZ2UnLFxuICBOb3RlID0gJ05vdGUnLFxuICBUYWcgPSAnVGFnJyxcbiAgU21hcnRUYWcgPSAnU058U21hcnRUYWcnLFxuICBDb21wb25lbnQgPSAnU058Q29tcG9uZW50JyxcbiAgRWRpdG9yID0gJ1NOfEVkaXRvcicsXG4gIEFjdGlvbnNFeHRlbnNpb24gPSAnRXh0ZW5zaW9uJyxcbiAgVXNlclByZWZzID0gJ1NOfFVzZXJQcmVmZXJlbmNlcycsXG4gIEhpc3RvcnlTZXNzaW9uID0gJ1NOfEhpc3RvcnlTZXNzaW9uJyxcbiAgVGhlbWUgPSAnU058VGhlbWUnLFxuICBNZmEgPSAnU0Z8TUZBJyxcbiAgU2VydmVyRXh0ZW5zaW9uID0gJ1NGfEV4dGVuc2lvbicsXG4gIEZpbGVzYWZlQ3JlZGVudGlhbHMgPSAnU058RmlsZVNhZmV8Q3JlZGVudGlhbHMnLFxuICBGaWxlc2FmZUZpbGVNZXRhZGF0YSA9ICdTTnxGaWxlU2FmZXxGaWxlTWV0YWRhdGEnLFxuICBGaWxlc2FmZUludGVncmF0aW9uID0gJ1NOfEZpbGVTYWZlfEludGVncmF0aW9uJyxcbiAgRXh0ZW5zaW9uUmVwbyA9ICdTTnxFeHRlbnNpb25SZXBvJyxcbn1cblxuZXhwb3J0IGVudW0gQXBwRGF0YUZpZWxkIHtcbiAgUGlubmVkID0gJ3Bpbm5lZCcsXG4gIEFyY2hpdmVkID0gJ2FyY2hpdmVkJyxcbiAgTG9ja2VkID0gJ2xvY2tlZCcsXG4gIFVzZXJNb2RpZmllZERhdGUgPSAnY2xpZW50X3VwZGF0ZWRfYXQnLFxuICBEZWZhdWx0RWRpdG9yID0gJ2RlZmF1bHRFZGl0b3InLFxuICBNb2JpbGVSdWxlcyA9ICdtb2JpbGVSdWxlcycsXG4gIE5vdEF2YWlsYWJsZU9uTW9iaWxlID0gJ25vdEF2YWlsYWJsZU9uTW9iaWxlJyxcbiAgTW9iaWxlQWN0aXZlID0gJ21vYmlsZUFjdGl2ZScsXG4gIExhc3RTaXplID0gJ2xhc3RTaXplJyxcbiAgUHJlZmVyc1BsYWluRWRpdG9yID0gJ3ByZWZlcnNQbGFpbkVkaXRvcicsXG4gIENvbXBvbmVudEluc3RhbGxFcnJvciA9ICdpbnN0YWxsRXJyb3InXG59XG4iLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbiAgICAvLyBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gKG1zQ3J5cHRvKSBvbiBJRTExLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykgfHwgdHlwZW9mIG1zQ3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiZXhwb3J0IGRlZmF1bHQgL14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pOyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4LnB1c2goKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShhcnIpIHtcbiAgdmFyIG9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgLy8gTm90ZTogQmUgY2FyZWZ1bCBlZGl0aW5nIHRoaXMgY29kZSEgIEl0J3MgYmVlbiB0dW5lZCBmb3IgcGVyZm9ybWFuY2VcbiAgLy8gYW5kIHdvcmtzIGluIHdheXMgeW91IG1heSBub3QgZXhwZWN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkL3B1bGwvNDM0XG4gIHZhciB1dWlkID0gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpOyAvLyBDb25zaXN0ZW5jeSBjaGVjayBmb3IgdmFsaWQgVVVJRC4gIElmIHRoaXMgdGhyb3dzLCBpdCdzIGxpa2VseSBkdWUgdG8gb25lXG4gIC8vIG9mIHRoZSBmb2xsb3dpbmc6XG4gIC8vIC0gT25lIG9yIG1vcmUgaW5wdXQgYXJyYXkgdmFsdWVzIGRvbid0IG1hcCB0byBhIGhleCBvY3RldCAobGVhZGluZyB0b1xuICAvLyBcInVuZGVmaW5lZFwiIGluIHRoZSB1dWlkKVxuICAvLyAtIEludmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgUkZDIGB2ZXJzaW9uYCBvciBgdmFyaWFudGAgZmllbGRzXG5cbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICByZXR1cm4gdXVpZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5naWZ5OyIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi9zbmpzVHlwZXMnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cgeyBtc0NyeXB0bzogdW5rbm93bjsgfVxufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVVdWlkID0gKCkgOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gdXVpZHY0KClcbn1cblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRKc29uU3RyaW5nID0gKHN0cjogdW5rbm93bikgOiBib29sZWFuID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHN0cilcbiAgICBjb25zdCB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHJlc3VsdClcbiAgICByZXR1cm4gdHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgdHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGVudmlyb25tZW50VG9TdHJpbmcgPSAoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KSA6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG1hcCA9IHtcbiAgICBbRW52aXJvbm1lbnQuV2ViXTogJ3dlYicsXG4gICAgW0Vudmlyb25tZW50LkRlc2t0b3BdOiAnZGVza3RvcCcsXG4gICAgW0Vudmlyb25tZW50Lk1vYmlsZV06ICdtb2JpbGUnLFxuICB9XG4gIHJldHVybiBtYXBbZW52aXJvbm1lbnRdID8/IG1hcFtFbnZpcm9ubWVudC5XZWJdXG59XG5cbmV4cG9ydCBjb25zdCBpc05vdFVuZGVmaW5lZE9yTnVsbCA9ICh2YWx1ZTogYW55KSA6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZFxufVxuIiwiY29uc3Qgbm9vcCA9ICgpID0+IHVuZGVmaW5lZFxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXIge1xuICBzdGF0aWMgZW5hYmxlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldCBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKHdpbmRvdy5jb25zb2xlIHx8IGNvbnNvbGUpID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgZ2V0IGluZm8gKCkgOiBhbnkge1xuICAgIGlmICghTG9nZ2VyLmlzU3VwcG9ydGVkIHx8ICF0aGlzLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBub29wXG4gICAgfVxuICAgIHJldHVybiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpXG4gIH1cblxuICBzdGF0aWMgZ2V0IGVycm9yICgpIDogYW55IHtcbiAgICBpZiAoIUxvZ2dlci5pc1N1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIG5vb3BcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBBcHBEYXRhRmllbGQsXG4gIENvbXBvbmVudEFjdGlvbixcbiAgQ29udGVudFR5cGUsXG4gIEVudmlyb25tZW50LFxufSBmcm9tICcuL3NuanNUeXBlcydcbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50UGVybWlzc2lvbixcbiAgSXRlbU1lc3NhZ2VQYXlsb2FkLFxuICBNZXNzYWdlRGF0YSxcbiAgU05JdGVtLFxuICBVdWlkU3RyaW5nLFxufSBmcm9tICdAc3RhbmRhcmRub3Rlcy9zbmpzJ1xuaW1wb3J0IHtcbiAgZW52aXJvbm1lbnRUb1N0cmluZyxcbiAgZ2VuZXJhdGVVdWlkLFxuICBpc1ZhbGlkSnNvblN0cmluZyxcbiAgaXNOb3RVbmRlZmluZWRPck51bGwsXG59IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4vbG9nZ2VyJ1xuXG5jb25zdCBERUZBVUxUX0NPQUxMRVNFRF9TQVZJTkdfREVMQVkgPSAyNTBcblxuZW51bSBNZXNzYWdlUGF5bG9hZEFwaSB7XG4gIENvbXBvbmVudCA9ICdjb21wb25lbnQnLFxufVxuXG50eXBlIENvbXBvbmVudCA9IHtcbiAgdXVpZD86IHN0cmluZ1xuICBvcmlnaW4/OiBzdHJpbmdcbiAgZGF0YT86IENvbXBvbmVudERhdGFcbiAgc2Vzc2lvbktleT86IHN0cmluZ1xuICBlbnZpcm9ubWVudD86IHN0cmluZ1xuICBwbGF0Zm9ybT86IHN0cmluZ1xuICBpc01vYmlsZT86IGJvb2xlYW5cbiAgYWNjZXB0c1RoZW1lczogYm9vbGVhblxuICBhY3RpdmVUaGVtZXM6IHN0cmluZ1tdXG59XG5cbnR5cGUgQ29tcG9uZW50RGF0YSA9IHtcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgTWVzc2FnZVBheWxvYWQgPSB7XG4gIGFjdGlvbjogQ29tcG9uZW50QWN0aW9uXG4gIGRhdGE6IE1lc3NhZ2VEYXRhXG4gIGNvbXBvbmVudERhdGE/OiBDb21wb25lbnREYXRhXG4gIG1lc3NhZ2VJZD86IFV1aWRTdHJpbmdcbiAgc2Vzc2lvbktleT86IFV1aWRTdHJpbmdcbiAgYXBpOiBNZXNzYWdlUGF5bG9hZEFwaVxuICBvcmlnaW5hbD86IE1lc3NhZ2VQYXlsb2FkXG4gIGNhbGxiYWNrPzogKC4uLnBhcmFtczogYW55KSA9PiB2b2lkXG59XG5cbnR5cGUgQ29tcG9uZW50UmVsYXlPcHRpb25zID0ge1xuICBjb2FsbGVzZWRTYXZpbmc/OiBib29sZWFuXG4gIGNvYWxsZXNlZFNhdmluZ0RlbGF5PzogbnVtYmVyXG4gIC8qKlxuICAgKiBPdXRwdXRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBjb25zb2xlLlxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGNvbXBvbmVudCBhY2NlcHRzIHRoZW1lcy5cbiAgICovXG4gIGFjY2VwdHNUaGVtZXM/OiBib29sZWFuXG59XG5cbnR5cGUgQ29tcG9uZW50UmVsYXlQYXJhbXMgPSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSB3aW5kb3cgb2JqZWN0IHRoYXQgdGhlIGNvbXBvbmVudCBpcyBydW5uaW5nIGluLlxuICAgKi9cbiAgdGFyZ2V0V2luZG93OiBXaW5kb3dcbiAgLyoqXG4gICAqIEEgY29sbGVjdGlvbiBvZiBwZXJtaXNzaW9ucyB0aGF0IHRoZSBjb21wb25lbnQgY2FuIHJlcXVlc3RcbiAgICogYWNjZXNzIG9uY2UgaXQncyByZWFkeS5cbiAgICovXG4gIGluaXRpYWxQZXJtaXNzaW9ucz86IENvbXBvbmVudFBlcm1pc3Npb25bXVxuICAvKipcbiAgICogVGhlIG9wdGlvbnMgdG8gaW5pdGlhbGl6ZVxuICAgKi9cbiAgb3B0aW9ucz86IENvbXBvbmVudFJlbGF5T3B0aW9uc1xuICAvKipcbiAgICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gcmVnaXN0ZXJlZC5cbiAgICovXG4gIG9uUmVhZHk/OiAoKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlbWVzIGhhdmUgYmVlbiBjaGFuZ2VkLlxuICAgKi9cbiAgb25UaGVtZXNDaGFuZ2U/OiAoKSA9PiB2b2lkXG59XG5cbnR5cGUgSXRlbVBheWxvYWQgPSB7XG4gIGNvbnRlbnRfdHlwZT86IENvbnRlbnRUeXBlXG4gIGNvbnRlbnQ/OiBhbnlcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmVudW0gS2V5Ym9hcmRNb2RpZmllciB7XG4gIFNoaWZ0ID0gJ1NoaWZ0JyxcbiAgQ3RybCA9ICdDb250cm9sJyxcbiAgTWV0YSA9ICdNZXRhJyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tcG9uZW50UmVsYXkge1xuICBwcml2YXRlIGNvbnRlbnRXaW5kb3c6IFdpbmRvd1xuICBwcml2YXRlIGluaXRpYWxQZXJtaXNzaW9ucz86IENvbXBvbmVudFBlcm1pc3Npb25bXVxuICBwcml2YXRlIG9uUmVhZHlDYWxsYmFjaz86ICgpID0+IHZvaWRcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IENvbXBvbmVudCA9IHsgYWN0aXZlVGhlbWVzOiBbXSwgYWNjZXB0c1RoZW1lczogdHJ1ZSB9XG4gIHByaXZhdGUgc2VudE1lc3NhZ2VzOiBNZXNzYWdlUGF5bG9hZFtdID0gW11cbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IE1lc3NhZ2VQYXlsb2FkW10gPSBbXVxuICBwcml2YXRlIGxhc3RTdHJlYW1lZEl0ZW0/OiBJdGVtUGF5bG9hZFxuICBwcml2YXRlIHBlbmRpbmdTYXZlSXRlbXM/OiBJdGVtUGF5bG9hZFtdXG4gIHByaXZhdGUgcGVuZGluZ1NhdmVUaW1lb3V0PzogTm9kZUpTLlRpbWVvdXRcbiAgcHJpdmF0ZSBwZW5kaW5nU2F2ZVBhcmFtcz86IGFueVxuICBwcml2YXRlIGNvYWxsZXNlZFNhdmluZyA9IHRydWVcbiAgcHJpdmF0ZSBjb2FsbGVzZWRTYXZpbmdEZWxheSA9IERFRkFVTFRfQ09BTExFU0VEX1NBVklOR19ERUxBWVxuICBwcml2YXRlIG1lc3NhZ2VIYW5kbGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWRcbiAgcHJpdmF0ZSBrZXlEb3duRXZlbnRMaXN0ZW5lcj86IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZFxuICBwcml2YXRlIGtleVVwRXZlbnRMaXN0ZW5lcj86IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZFxuICBwcml2YXRlIGNsaWNrRXZlbnRMaXN0ZW5lcj86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZFxuICBwcml2YXRlIG9uVGhlbWVzQ2hhbmdlQ2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gIHByaXZhdGUgY29uY2VyblRpbWVvdXRzOiBOb2RlSlMuVGltZW91dFtdID0gW11cblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IENvbXBvbmVudFJlbGF5UGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy50YXJnZXRXaW5kb3cpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29udGVudFdpbmRvdyBtdXN0IGJlIGEgdmFsaWQgV2luZG93IG9iamVjdC4nKVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRXaW5kb3cgPSBwYXJhbXMudGFyZ2V0V2luZG93XG4gICAgdGhpcy5wcm9jZXNzUGFyYW1ldGVycyhwYXJhbXMpXG4gICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKClcbiAgICB0aGlzLnJlZ2lzdGVyS2V5Ym9hcmRFdmVudExpc3RlbmVycygpXG4gICAgdGhpcy5yZWdpc3Rlck1vdXNlRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzUGFyYW1ldGVycyhwYXJhbXM6IENvbXBvbmVudFJlbGF5UGFyYW1zKSB7XG4gICAgY29uc3QgeyBpbml0aWFsUGVybWlzc2lvbnMsIG9wdGlvbnMsIG9uUmVhZHksIG9uVGhlbWVzQ2hhbmdlIH0gPSBwYXJhbXNcblxuICAgIGlmIChpbml0aWFsUGVybWlzc2lvbnMgJiYgaW5pdGlhbFBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW5pdGlhbFBlcm1pc3Npb25zID0gaW5pdGlhbFBlcm1pc3Npb25zXG4gICAgfVxuXG4gICAgaWYgKGlzTm90VW5kZWZpbmVkT3JOdWxsKG9wdGlvbnM/LmNvYWxsZXNlZFNhdmluZykpIHtcbiAgICAgIHRoaXMuY29hbGxlc2VkU2F2aW5nID0gb3B0aW9ucyEuY29hbGxlc2VkU2F2aW5nIVxuICAgIH1cbiAgICBpZiAoaXNOb3RVbmRlZmluZWRPck51bGwob3B0aW9ucz8uY29hbGxlc2VkU2F2aW5nRGVsYXkpKSB7XG4gICAgICB0aGlzLmNvYWxsZXNlZFNhdmluZ0RlbGF5ID0gb3B0aW9ucyEuY29hbGxlc2VkU2F2aW5nRGVsYXkhXG4gICAgfVxuICAgIGlmIChpc05vdFVuZGVmaW5lZE9yTnVsbChvcHRpb25zPy5hY2NlcHRzVGhlbWVzKSkge1xuICAgICAgdGhpcy5jb21wb25lbnQuYWNjZXB0c1RoZW1lcyA9IG9wdGlvbnM/LmFjY2VwdHNUaGVtZXMgPz8gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaXNOb3RVbmRlZmluZWRPck51bGwob25SZWFkeSkpIHtcbiAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gb25SZWFkeVxuICAgIH1cbiAgICBpZiAoaXNOb3RVbmRlZmluZWRPck51bGwob25UaGVtZXNDaGFuZ2UpKSB7XG4gICAgICB0aGlzLm9uVGhlbWVzQ2hhbmdlQ2FsbGJhY2sgPSBvblRoZW1lc0NoYW5nZVxuICAgIH1cblxuICAgIExvZ2dlci5lbmFibGVkID0gb3B0aW9ucz8uZGVidWcgPz8gZmFsc2VcbiAgfVxuXG4gIHB1YmxpYyBkZWluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vblJlYWR5Q2FsbGJhY2sgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbXBvbmVudCA9IHtcbiAgICAgIGFjY2VwdHNUaGVtZXM6IHRydWUsXG4gICAgICBhY3RpdmVUaGVtZXM6IFtdLFxuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdXG4gICAgdGhpcy5zZW50TWVzc2FnZXMgPSBbXVxuICAgIHRoaXMubGFzdFN0cmVhbWVkSXRlbSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucGVuZGluZ1NhdmVJdGVtcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMucGVuZGluZ1NhdmVUaW1lb3V0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wZW5kaW5nU2F2ZVBhcmFtcyA9IHVuZGVmaW5lZFxuXG4gICAgaWYgKHRoaXMubWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuY29udGVudFdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXIsXG4gICAgICApXG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubWVzc2FnZUhhbmRsZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2V5RG93bkV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuY29udGVudFdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAna2V5ZG93bicsXG4gICAgICAgIHRoaXMua2V5RG93bkV2ZW50TGlzdGVuZXIsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2V5VXBFdmVudExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmtleVVwRXZlbnRMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbGlja0V2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuY29udGVudFdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2tFdmVudExpc3RlbmVyKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcigpIHtcbiAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIExvZ2dlci5pbmZvKCdDb21wb25lbnRzIEFQSSBNZXNzYWdlIHJlY2VpdmVkOicsIGV2ZW50LmRhdGEpXG5cbiAgICAgIC8qKlxuICAgICAgICogV2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gd2luZG93LnBhcmVudC5vcmlnaW4gZHVlIHRvIGNyb3NzLWRvbWFpbiByZXN0cmljdGlvbnMuXG4gICAgICAgKiBDaGVjayByZWZlcnJlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBkZWZlciB0byBjaGVja2luZyBmb3IgZmlyc3QtcnVuIHZhbHVlLlxuICAgICAgICogQ3JhZnQgVVJMIG9iamVjdHMgc28gdGhhdCBleGFtcGxlLmNvbSA9PT0gZXhhbXBsZS5jb20vXG4gICAgICAgKi9cbiAgICAgIGlmIChkb2N1bWVudC5yZWZlcnJlcikge1xuICAgICAgICBjb25zdCByZWZlcnJlciA9IG5ldyBVUkwoZG9jdW1lbnQucmVmZXJyZXIpLm9yaWdpblxuICAgICAgICBjb25zdCBldmVudE9yaWdpbiA9IG5ldyBVUkwoZXZlbnQub3JpZ2luKS5vcmlnaW5cblxuICAgICAgICBpZiAocmVmZXJyZXIgIT09IGV2ZW50T3JpZ2luKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTW9iaWxlIGVudmlyb25tZW50IHNlbmRzIGRhdGEgYXMgSlNPTiBzdHJpbmcuXG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGV2ZW50XG4gICAgICBjb25zdCBwYXJzZWREYXRhID0gaXNWYWxpZEpzb25TdHJpbmcoZGF0YSkgPyBKU09OLnBhcnNlKGRhdGEpIDogZGF0YVxuXG4gICAgICBpZiAoIXBhcnNlZERhdGEpIHtcbiAgICAgICAgTG9nZ2VyLmVycm9yKCdJbnZhbGlkIGRhdGEgcmVjZWl2ZWQuIFNraXBwaW5nLi4uJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIENvbXBvbmVudCBSZWdpc3RlcmVkIG1lc3NhZ2Ugd2lsbCBiZSB0aGUgbW9zdCByZWxpYWJsZSBvbmUsIHNvIHdlIHdvbid0IGNoYW5nZSBpdCBhZnRlciBhbnkgc3Vic2VxdWVudCBldmVudHMsXG4gICAgICAgKiBpbiBjYXNlIHlvdSByZWNlaXZlIGFuIGV2ZW50IGZyb20gYW5vdGhlciB3aW5kb3cuXG4gICAgICAgKi9cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHRoaXMuY29tcG9uZW50Lm9yaWdpbiA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgcGFyc2VkRGF0YS5hY3Rpb24gPT09IENvbXBvbmVudEFjdGlvbi5Db21wb25lbnRSZWdpc3RlcmVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQub3JpZ2luID0gZXZlbnQub3JpZ2luXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5jb21wb25lbnQub3JpZ2luKSB7XG4gICAgICAgIC8vIElmIGV2ZW50IG9yaWdpbiBkb2Vzbid0IG1hdGNoIGZpcnN0LXJ1biB2YWx1ZSwgcmV0dXJuLlxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVNZXNzYWdlKHBhcnNlZERhdGEpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9iaWxlIChSZWFjdCBOYXRpdmUpIHVzZXMgYGRvY3VtZW50YCwgd2ViL2Rlc2t0b3AgdXNlcyBgd2luZG93YC5hZGRFdmVudExpc3RlbmVyXG4gICAgICogZm9yIHBvc3RNZXNzYWdlIEFQSSB0byB3b3JrIHByb3Blcmx5LlxuICAgICAqIFVwZGF0ZSBNYXkgMjAxOTpcbiAgICAgKiBBcyBwYXJ0IG9mIHRyYW5zaXRpb25pbmcgUmVhY3QgTmF0aXZlIHdlYnZpZXcgaW50byB0aGUgY29tbXVuaXR5IHBhY2thZ2UsXG4gICAgICogd2UnbGwgbm93IG9ubHkgbmVlZCB0byB1c2Ugd2luZG93LmFkZEV2ZW50TGlzdGVuZXIuXG4gICAgICogSG93ZXZlciwgd2Ugd2FudCB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBNb2JpbGUgPCB2My4wLjUsIHNvIHdlJ2xsIGtlZXAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lclxuICAgICAqIEFsc28sIGV2ZW4gd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgcmVhY3QtbmF0aXZlLXdlYnZpZXcsIEFuZHJvaWQgbWF5IHN0aWxsIHJlcXVpcmUgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAod2hpbGUgaU9TIHN0aWxsIG9ubHkgcmVxdWlyZXMgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LW5hdGl2ZS1jb21tdW5pdHkvcmVhY3QtbmF0aXZlLXdlYnZpZXcvaXNzdWVzLzMyMyNpc3N1ZWNvbW1lbnQtNDY3NzY3OTMzXG4gICAgICovXG4gICAgdGhpcy5jb250ZW50V2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnbWVzc2FnZScsXG4gICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyLFxuICAgICAgZmFsc2UsXG4gICAgKVxuICAgIHRoaXMuY29udGVudFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlSGFuZGxlciwgZmFsc2UpXG5cbiAgICBMb2dnZXIuaW5mbygnV2FpdGluZyBmb3IgbWVzc2FnZXMuLi4nKVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcktleWJvYXJkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5rZXlEb3duRXZlbnRMaXN0ZW5lciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgTG9nZ2VyLmluZm8oYEEga2V5IGhhcyBiZWVuIHByZXNzZWQ6ICR7ZXZlbnQua2V5fWApXG5cbiAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICAgIHRoaXMua2V5RG93bkV2ZW50KEtleWJvYXJkTW9kaWZpZXIuQ3RybClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgdGhpcy5rZXlEb3duRXZlbnQoS2V5Ym9hcmRNb2RpZmllci5TaGlmdClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5rZXkgPT09ICdNZXRhJykge1xuICAgICAgICB0aGlzLmtleURvd25FdmVudChLZXlib2FyZE1vZGlmaWVyLk1ldGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5rZXlVcEV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIExvZ2dlci5pbmZvKGBBIGtleSBoYXMgYmVlbiByZWxlYXNlZDogJHtldmVudC5rZXl9YClcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVja2luZyB1c2luZyBldmVudC5rZXkgaW5zdGVhZCBvZiB0aGUgY29ycmVzcG9uZGluZyBib29sZWFuIHByb3BlcnRpZXMuXG4gICAgICAgKi9cbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdDb250cm9sJykge1xuICAgICAgICB0aGlzLmtleVVwRXZlbnQoS2V5Ym9hcmRNb2RpZmllci5DdHJsKVxuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdTaGlmdCcpIHtcbiAgICAgICAgdGhpcy5rZXlVcEV2ZW50KEtleWJvYXJkTW9kaWZpZXIuU2hpZnQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgIHRoaXMua2V5VXBFdmVudChLZXlib2FyZE1vZGlmaWVyLk1ldGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAna2V5ZG93bicsXG4gICAgICB0aGlzLmtleURvd25FdmVudExpc3RlbmVyLFxuICAgICAgZmFsc2UsXG4gICAgKVxuICAgIHRoaXMuY29udGVudFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMua2V5VXBFdmVudExpc3RlbmVyLCBmYWxzZSlcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3VzZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMuY2xpY2tFdmVudExpc3RlbmVyID0gKF9ldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgTG9nZ2VyLmluZm8oJ0EgY2xpY2sgaGFzIGJlZW4gcGVyZm9ybWVkLicpXG5cbiAgICAgIHRoaXMubW91c2VDbGlja0V2ZW50KClcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrRXZlbnRMaXN0ZW5lciwgZmFsc2UpXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lc3NhZ2UocGF5bG9hZDogTWVzc2FnZVBheWxvYWQpIHtcbiAgICBzd2l0Y2ggKHBheWxvYWQuYWN0aW9uKSB7XG4gICAgICBjYXNlIENvbXBvbmVudEFjdGlvbi5Db21wb25lbnRSZWdpc3RlcmVkOlxuICAgICAgICB0aGlzLmNvbXBvbmVudC5zZXNzaW9uS2V5ID0gcGF5bG9hZC5zZXNzaW9uS2V5XG4gICAgICAgIGlmIChwYXlsb2FkLmNvbXBvbmVudERhdGEpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0gcGF5bG9hZC5jb21wb25lbnREYXRhXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblJlYWR5KHBheWxvYWQuZGF0YSlcbiAgICAgICAgTG9nZ2VyLmluZm8oJ0NvbXBvbmVudCBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCB3aXRoIHBheWxvYWQ6JywgcGF5bG9hZClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBDb21wb25lbnRBY3Rpb24uQWN0aXZhdGVUaGVtZXM6XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUaGVtZXMocGF5bG9hZC5kYXRhLnRoZW1lcylcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAoIXBheWxvYWQub3JpZ2luYWwpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgY2FsbGJhY2sgZnJvbSBxdWV1ZS5cbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXNzYWdlID0gdGhpcy5zZW50TWVzc2FnZXM/LmZpbHRlcihcbiAgICAgICAgICAobWVzc2FnZTogTWVzc2FnZVBheWxvYWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLm1lc3NhZ2VJZCA9PT0gcGF5bG9hZC5vcmlnaW5hbD8ubWVzc2FnZUlkXG4gICAgICAgICAgfSxcbiAgICAgICAgKVswXVxuXG4gICAgICAgIGlmICghb3JpZ2luYWxNZXNzYWdlKSB7XG4gICAgICAgICAgLy8gQ29ubmVjdGlvbiBtdXN0IGhhdmUgYmVlbiByZXNldC4gV2Ugc2hvdWxkIGFsZXJ0IHRoZSB1c2VyIHVubGVzcyBpdCdzIGEgcmVwbHksXG4gICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBtYXkgaGF2ZSBiZWVuIGRlYWxsb2NhdGVkIGFuZCByZWluaXRpYWxpemVkIGFuZCBsb3N0IHRoZVxuICAgICAgICAgIC8vIG9yaWdpbmFsIG1lc3NhZ2VcbiAgICAgICAgICBjb25zdCBleHRlbnNpb25OYW1lID0gdGhpcy5jb250ZW50V2luZG93LmRvY3VtZW50LnRpdGxlXG4gICAgICAgICAgY29uc3QgYWxlcnRNZXNzYWdlID0gKFxuICAgICAgICAgICAgYFRoZSBleHRlbnNpb24gJyR7ZXh0ZW5zaW9uTmFtZX0nIGlzIGF0dGVtcHRpbmcgdG8gY29tbXVuaWNhdGUgd2l0aCBTdGFuZGFyZCBOb3RlcywgYCArXG4gICAgICAgICAgICAnYnV0IGFuIGVycm9yIGlzIHByZXZlbnRpbmcgaXQgZnJvbSBkb2luZyBzby4gUGxlYXNlIHJlc3RhcnQgdGhpcyBleHRlbnNpb24gYW5kIHRyeSBhZ2Fpbi4nXG4gICAgICAgICAgKS5yZXBsYWNlKCcgICcsICcgJylcblxuICAgICAgICAgIExvZ2dlci5pbmZvKGFsZXJ0TWVzc2FnZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZT8uY2FsbGJhY2s/LihwYXlsb2FkLmRhdGEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvblJlYWR5KGRhdGE6IE1lc3NhZ2VEYXRhKSB7XG4gICAgdGhpcy5jb21wb25lbnQuZW52aXJvbm1lbnQgPSBkYXRhLmVudmlyb25tZW50XG4gICAgdGhpcy5jb21wb25lbnQucGxhdGZvcm0gPSBkYXRhLnBsYXRmb3JtXG4gICAgdGhpcy5jb21wb25lbnQudXVpZCA9IGRhdGEudXVpZFxuXG4gICAgaWYgKHRoaXMuaW5pdGlhbFBlcm1pc3Npb25zICYmIHRoaXMuaW5pdGlhbFBlcm1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVxdWVzdFBlcm1pc3Npb25zKHRoaXMuaW5pdGlhbFBlcm1pc3Npb25zKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0aGlzLm1lc3NhZ2VRdWV1ZSkge1xuICAgICAgdGhpcy5wb3N0TWVzc2FnZShtZXNzYWdlLmFjdGlvbiwgbWVzc2FnZS5kYXRhLCBtZXNzYWdlLmNhbGxiYWNrKVxuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZVF1ZXVlID0gW11cblxuICAgIExvZ2dlci5pbmZvKCdEYXRhIHBhc3NlZCB0byBvblJlYWR5OicsIGRhdGEpXG5cbiAgICB0aGlzLmFjdGl2YXRlVGhlbWVzKGRhdGEuYWN0aXZlVGhlbWVVcmxzIHx8IFtdKVxuXG4gICAgLy8gQWZ0ZXIgYWN0aXZhdGVUaGVtZXMgaXMgZG9uZSwgd2Ugd2FudCB0byBzZW5kIGEgbWVzc2FnZSB3aXRoIHRoZSBUaGVtZXNBY3RpdmF0ZWQgYWN0aW9uLlxuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLlRoZW1lc0FjdGl2YXRlZCwge30pXG5cbiAgICBpZiAodGhpcy5vblJlYWR5Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29tcG9uZW50IFVVSUQuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2VsZkNvbXBvbmVudFVVSUQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQudXVpZFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcgaW4gYSBEZXNrdG9wIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIGlzUnVubmluZ0luRGVza3RvcEFwcGxpY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbXBvbmVudC5lbnZpcm9ubWVudCA9PT0gZW52aXJvbm1lbnRUb1N0cmluZyhFbnZpcm9ubWVudC5EZXNrdG9wKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbXBvbmVudCBpcyBydW5uaW5nIGluIGEgTW9iaWxlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcHVibGljIGlzUnVubmluZ0luTW9iaWxlQXBwbGljYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29tcG9uZW50LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudFRvU3RyaW5nKEVudmlyb25tZW50Lk1vYmlsZSlcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29tcG9uZW50J3MgZGF0YSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QuIFJldHVybnMgdGhlIHN0b3JlZCB2YWx1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcG9uZW50RGF0YVZhbHVlRm9yS2V5KGtleTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50LmRhdGEpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZGF0YVtrZXldXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29tcG9uZW50J3MgZGF0YSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIGRhdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHN0b3JlIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKi9cbiAgcHVibGljIHNldENvbXBvbmVudERhdGFWYWx1ZUZvcktleShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb21wb25lbnQuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29tcG9uZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4nKVxuICAgIH1cbiAgICBpZiAoIWtleSB8fCAoa2V5ICYmIGtleS5sZW5ndGggPT09IDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBrZXkgZm9yIHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBhIHZhbGlkIHN0cmluZy4nKVxuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0ge1xuICAgICAgLi4udGhpcy5jb21wb25lbnQuZGF0YSxcbiAgICAgIFtrZXldOiB2YWx1ZSxcbiAgICB9XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uU2V0Q29tcG9uZW50RGF0YSwge1xuICAgICAgY29tcG9uZW50RGF0YTogdGhpcy5jb21wb25lbnQuZGF0YSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY29tcG9uZW50J3MgZGF0YSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJDb21wb25lbnREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50LmRhdGEgPSB7fVxuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLlNldENvbXBvbmVudERhdGEsIHtcbiAgICAgIGNvbXBvbmVudERhdGE6IHRoaXMuY29tcG9uZW50LmRhdGEsXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcG9zdE1lc3NhZ2UoXG4gICAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb24sXG4gICAgZGF0YTogTWVzc2FnZURhdGEsXG4gICAgY2FsbGJhY2s/OiAoLi4ucGFyYW1zOiBhbnkpID0+IHZvaWQsXG4gICkge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBzZXNzaW9uS2V5IGlzIG5vdCBzZXQsIHdlIHB1c2ggdGhlIG1lc3NhZ2UgdG8gcXVldWVcbiAgICAgKiB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGxhdGVyIG9uLlxuICAgICAqL1xuICAgIGlmICghdGhpcy5jb21wb25lbnQuc2Vzc2lvbktleSkge1xuICAgICAgdGhpcy5tZXNzYWdlUXVldWUucHVzaCh7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgZGF0YSxcbiAgICAgICAgYXBpOiBNZXNzYWdlUGF5bG9hZEFwaS5Db21wb25lbnQsXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgYWN0aW9uLFxuICAgICAgZGF0YSxcbiAgICAgIG1lc3NhZ2VJZDogdGhpcy5nZW5lcmF0ZVVVSUQoKSxcbiAgICAgIHNlc3Npb25LZXk6IHRoaXMuY29tcG9uZW50LnNlc3Npb25LZXksXG4gICAgICBhcGk6IE1lc3NhZ2VQYXlsb2FkQXBpLkNvbXBvbmVudCxcbiAgICB9XG5cbiAgICBjb25zdCBzZW50TWVzc2FnZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpXG4gICAgc2VudE1lc3NhZ2UuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuc2VudE1lc3NhZ2VzLnB1c2goc2VudE1lc3NhZ2UpXG5cbiAgICBsZXQgcG9zdE1lc3NhZ2VQYXlsb2FkXG5cbiAgICAvLyBNb2JpbGUgKFJlYWN0IE5hdGl2ZSkgcmVxdWlyZXMgYSBzdHJpbmcgZm9yIHRoZSBwb3N0TWVzc2FnZSBBUEkuXG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nSW5Nb2JpbGVBcHBsaWNhdGlvbigpKSB7XG4gICAgICBwb3N0TWVzc2FnZVBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0TWVzc2FnZVBheWxvYWQgPSBtZXNzYWdlXG4gICAgfVxuXG4gICAgTG9nZ2VyLmluZm8oJ1Bvc3RpbmcgbWVzc2FnZTonLCBwb3N0TWVzc2FnZVBheWxvYWQpXG4gICAgdGhpcy5jb250ZW50V2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShcbiAgICAgIHBvc3RNZXNzYWdlUGF5bG9hZCxcbiAgICAgIHRoaXMuY29tcG9uZW50Lm9yaWdpbiEsXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0UGVybWlzc2lvbnMoXG4gICAgcGVybWlzc2lvbnM6IENvbXBvbmVudFBlcm1pc3Npb25bXSxcbiAgICBjYWxsYmFjaz86ICguLi5wYXJhbXM6IGFueSkgPT4gdm9pZCxcbiAgKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShcbiAgICAgIENvbXBvbmVudEFjdGlvbi5SZXF1ZXN0UGVybWlzc2lvbnMsXG4gICAgICB7IHBlcm1pc3Npb25zIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZVRoZW1lcyhpbmNvbWluZ1VybHM6IHN0cmluZ1tdID0gW10pIHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50LmFjY2VwdHNUaGVtZXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIExvZ2dlci5pbmZvKCdJbmNvbWluZyB0aGVtZXM6JywgaW5jb21pbmdVcmxzKVxuXG4gICAgY29uc3QgeyBhY3RpdmVUaGVtZXMgfSA9IHRoaXMuY29tcG9uZW50XG5cbiAgICBpZiAoXG4gICAgICBhY3RpdmVUaGVtZXMgJiZcbiAgICAgIGFjdGl2ZVRoZW1lcy5zb3J0KCkudG9TdHJpbmcoKSA9PSBpbmNvbWluZ1VybHMuc29ydCgpLnRvU3RyaW5nKClcbiAgICApIHtcbiAgICAgIC8vIEluY29taW5nIHRoZW1lIFVSTHMgYXJlIHNhbWUgYXMgYWN0aXZlLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IHRoZW1lc1RvQWN0aXZhdGUgPSBpbmNvbWluZ1VybHNcbiAgICBjb25zdCB0aGVtZXNUb0RlYWN0aXZhdGUgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhY3RpdmVVcmwgb2YgYWN0aXZlVGhlbWVzKSB7XG4gICAgICBpZiAoIWluY29taW5nVXJscy5pbmNsdWRlcyhhY3RpdmVVcmwpKSB7XG4gICAgICAgIC8vIEFjdGl2ZSBub3QgcHJlc2VudCBpbiBpbmNvbWluZywgZGVhY3RpdmF0ZSBpdC5cbiAgICAgICAgdGhlbWVzVG9EZWFjdGl2YXRlLnB1c2goYWN0aXZlVXJsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWxyZWFkeSBwcmVzZW50IGluIGFjdGl2ZSB0aGVtZXMsIHJlbW92ZSBpdCBmcm9tIHRoZW1lc1RvQWN0aXZhdGUuXG4gICAgICAgIHRoZW1lc1RvQWN0aXZhdGUgPSB0aGVtZXNUb0FjdGl2YXRlLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gYWN0aXZlVXJsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgTG9nZ2VyLmluZm8oJ0RlYWN0aXZhdGluZyB0aGVtZXM6JywgdGhlbWVzVG9EZWFjdGl2YXRlKVxuICAgIExvZ2dlci5pbmZvKCdBY3RpdmF0aW5nIHRoZW1lczonLCB0aGVtZXNUb0FjdGl2YXRlKVxuXG4gICAgZm9yIChjb25zdCB0aGVtZVVybCBvZiB0aGVtZXNUb0RlYWN0aXZhdGUpIHtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZVRoZW1lKHRoZW1lVXJsKVxuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50LmFjdGl2ZVRoZW1lcyA9IGluY29taW5nVXJsc1xuXG4gICAgZm9yIChjb25zdCB0aGVtZVVybCBvZiB0aGVtZXNUb0FjdGl2YXRlKSB7XG4gICAgICBpZiAoIXRoZW1lVXJsKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpXG4gICAgICBsaW5rLmlkID0gYnRvYSh0aGVtZVVybClcbiAgICAgIGxpbmsuaHJlZiA9IHRoZW1lVXJsXG4gICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnXG4gICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0J1xuICAgICAgbGluay5tZWRpYSA9ICdzY3JlZW4scHJpbnQnXG4gICAgICBsaW5rLmNsYXNzTmFtZSA9ICdjdXN0b20tdGhlbWUnXG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnRcbiAgICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF1cbiAgICAgICAgLmFwcGVuZENoaWxkKGxpbmspXG4gICAgfVxuXG4gICAgdGhpcy5vblRoZW1lc0NoYW5nZUNhbGxiYWNrICYmIHRoaXMub25UaGVtZXNDaGFuZ2VDYWxsYmFjaygpXG4gIH1cblxuICBwcml2YXRlIHRoZW1lRWxlbWVudEZvclVybCh0aGVtZVVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5jb250ZW50V2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2N1c3RvbS10aGVtZScpLFxuICAgICkuc2xpY2UoKVxuICAgIHJldHVybiBlbGVtZW50cy5maW5kKChlbGVtZW50KSA9PiB7XG4gICAgICAvLyBXZSB1c2VkIHRvIHNlYXJjaCBoZXJlIGJ5IGBocmVmYCwgYnV0IG9uIGRlc2t0b3AsIHdpdGggbG9jYWwgZmlsZTovLyB1cmxzLCB0aGF0IGRpZG4ndCB3b3JrIGZvciBzb21lIHJlYXNvbi5cbiAgICAgIHJldHVybiBlbGVtZW50LmlkID09IGJ0b2EodGhlbWVVcmwpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZGVhY3RpdmF0ZVRoZW1lKHRoZW1lVXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50aGVtZUVsZW1lbnRGb3JVcmwodGhlbWVVcmwpXG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAndHJ1ZScpXG4gICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlVVVJRCgpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVVdWlkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHBsYXRmb3JtIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgcnVubmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhdGZvcm0oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQucGxhdGZvcm1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHdoZXJlIHRoZSBjb21wb25lbnQgaXMgcnVubmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuZW52aXJvbm1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW1zIGEgY29sbGVjdGlvbiBvZiBJdGVtcywgZmlsdGVyZWQgYnkgY29udGVudCB0eXBlLlxuICAgKiBOZXcgaXRlbXMgYXJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYXMgdGhleSBjb21lLlxuICAgKiBAcGFyYW0gY29udGVudFR5cGVzIEEgY29sbGVjdGlvbiBvZiBDb250ZW50IFR5cGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSBzdHJlYW1lZCBpdGVtcy5cbiAgICovXG4gIHB1YmxpYyBzdHJlYW1JdGVtcyhcbiAgICBjb250ZW50VHlwZXM6IENvbnRlbnRUeXBlW10sXG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoXG4gICAgICBDb21wb25lbnRBY3Rpb24uU3RyZWFtSXRlbXMsXG4gICAgICB7IGNvbnRlbnRfdHlwZXM6IGNvbnRlbnRUeXBlcyB9LFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjYWxsYmFjayhkYXRhLml0ZW1zKVxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtcyB0aGUgY3VycmVudCBJdGVtIGluIGNvbnRleHQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlIHN0cmVhbWVkIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgc3RyZWFtQ29udGV4dEl0ZW0oY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5TdHJlYW1Db250ZXh0SXRlbSwge30sIChkYXRhKSA9PiB7XG4gICAgICBjb25zdCB7IGl0ZW0gfSA9IGRhdGFcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhpcyBpcyBhIG5ldyBjb250ZXh0IGl0ZW0gdGhhbiB0aGUgY29udGV4dCBpdGVtIHRoZSBjb21wb25lbnQgd2FzIGN1cnJlbnRseSBlbnRlcnRhaW5pbmcsXG4gICAgICAgKiB3ZSB3YW50IHRvIGltbWVkaWF0ZWx5IGNvbW1pdCBhbnkgcGVuZGluZyBzYXZlcywgYmVjYXVzZSBpZiB5b3Ugc2VuZCB0aGUgbmV3IGNvbnRleHQgaXRlbSB0byB0aGVcbiAgICAgICAqIGNvbXBvbmVudCBiZWZvcmUgaXQgaGFzIGNvbW1pdGVkIGl0cyBwcmVzYXZlLCBpdCB3aWxsIGVuZCB1cCBmaXJzdCByZXBsYWNpbmcgdGhlIFVJIHdpdGggbmV3IGNvbnRleHQgaXRlbSxcbiAgICAgICAqIGFuZCB3aGVuIHRoZSBkZWJvdW5jZXIgZXhlY3V0ZXMgdG8gcmVhZCB0aGUgY29tcG9uZW50IFVJLCBpdCB3aWxsIGJlIHJlYWRpbmcgdGhlIG5ldyBVSSBmb3IgdGhlIHByZXZpb3VzIGl0ZW0uXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlzTmV3SXRlbSA9XG4gICAgICAgICF0aGlzLmxhc3RTdHJlYW1lZEl0ZW0gfHwgdGhpcy5sYXN0U3RyZWFtZWRJdGVtLnV1aWQgIT09IGl0ZW0udXVpZFxuXG4gICAgICBpZiAoaXNOZXdJdGVtICYmIHRoaXMucGVuZGluZ1NhdmVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdTYXZlVGltZW91dClcbiAgICAgICAgdGhpcy5wZXJmb3JtU2F2aW5nT2ZJdGVtcyh0aGlzLnBlbmRpbmdTYXZlUGFyYW1zKVxuICAgICAgICB0aGlzLnBlbmRpbmdTYXZlVGltZW91dCA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLnBlbmRpbmdTYXZlUGFyYW1zID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFN0cmVhbWVkSXRlbSA9IGl0ZW1cbiAgICAgIGNhbGxiYWNrKHRoaXMubGFzdFN0cmVhbWVkSXRlbSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYSBgVGFnYCBpdGVtLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgSXRlbSAoYFRhZ2Agb3IgYFNtYXJ0VGFnYCkgdG8gc2VsZWN0LlxuICAgKi9cbiAgcHVibGljIHNlbGVjdEl0ZW0oaXRlbTogSXRlbVBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5TZWxlY3RJdGVtLCB7XG4gICAgICBpdGVtOiB0aGlzLmpzb25PYmplY3RGb3JJdGVtKGl0ZW0pLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGN1cnJlbnQgc2VsZWN0ZWQgYFRhZ2AgKGlmIGFueSkuXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uQ2xlYXJTZWxlY3Rpb24sIHtcbiAgICAgIGNvbnRlbnRfdHlwZTogQ29udGVudFR5cGUuVGFnLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc3RvcmVzIGFuIEl0ZW0gaW4gdGhlIGl0ZW0gc3RvcmUuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBJdGVtJ3MgcGF5bG9hZCBjb250ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlIGNyZWF0ZWQgSXRlbS5cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVJdGVtKGl0ZW06IEl0ZW1QYXlsb2FkLCBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoXG4gICAgICBDb21wb25lbnRBY3Rpb24uQ3JlYXRlSXRlbSxcbiAgICAgIHsgaXRlbTogdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSB9LFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBsZXQgeyBpdGVtIH0gPSBkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIFNOIGFwcCBoYWQgYW4gaXNzdWUgd2hlcmUgdGhlIGl0ZW0gaW4gdGhlIHJlcGx5IHRvIENvbXBvbmVudEFjdGlvbnMuQ3JlYXRlSXRlbXNcbiAgICAgICAgICogd291bGQgYmUgbmVzdGVkIGluc2lkZSBcIml0ZW1zXCIgYW5kIG5vdCBcIml0ZW1cIi4gU28gaGFuZGxlIGJvdGggY2FzZXMgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIGlmICghaXRlbSAmJiBkYXRhLml0ZW1zICYmIGRhdGEuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGl0ZW0gPSBkYXRhLml0ZW1zWzBdXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NvY2lhdGVJdGVtKGl0ZW0pXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGl0ZW0pXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzdG9yZXMgYSBjb2xsZWN0aW9uIG9mIEl0ZW1zIGluIHRoZSBpdGVtIHN0b3JlLlxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIEl0ZW0ocykgcGF5bG9hZCBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlIGNyZWF0ZWQgSXRlbShzKS5cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVJdGVtcyhcbiAgICBpdGVtczogSXRlbVBheWxvYWRbXSxcbiAgICBjYWxsYmFjazogKGRhdGE6IGFueSkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWFwcGVkID0gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLmpzb25PYmplY3RGb3JJdGVtKGl0ZW0pKVxuICAgIHRoaXMucG9zdE1lc3NhZ2UoXG4gICAgICBDb21wb25lbnRBY3Rpb24uQ3JlYXRlSXRlbXMsXG4gICAgICB7IGl0ZW1zOiBtYXBwZWQgfSxcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZGF0YS5pdGVtcylcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc29jaWF0ZXMgYSBgVGFnYCB3aXRoIHRoZSBjdXJyZW50IE5vdGUuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBgVGFnYCBpdGVtIHRvIGFzc29jaWF0ZS5cbiAgICovXG4gIHB1YmxpYyBhc3NvY2lhdGVJdGVtKGl0ZW06IEl0ZW1QYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uQXNzb2NpYXRlSXRlbSwge1xuICAgICAgaXRlbTogdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIERlYXNzb2NpYXRlcyBhIGBUYWdgIHdpdGggdGhlIGN1cnJlbnQgTm90ZS5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGBUYWdgIGl0ZW0gdG8gZGVhc3NvY2lhdGUuXG4gICAqL1xuICBwdWJsaWMgZGVhc3NvY2lhdGVJdGVtKGl0ZW06IEl0ZW1QYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uRGVhc3NvY2lhdGVJdGVtLCB7XG4gICAgICBpdGVtOiB0aGlzLmpzb25PYmplY3RGb3JJdGVtKGl0ZW0pLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiBJdGVtIGZyb20gdGhlIGl0ZW0gc3RvcmUuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBJdGVtIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVJdGVtKFxuICAgIGl0ZW06IEl0ZW1QYXlsb2FkLFxuICAgIGNhbGxiYWNrOiAoZGF0YTogSXRlbU1lc3NhZ2VQYXlsb2FkKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRlbGV0ZUl0ZW1zKFtpdGVtXSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIGNvbGxlY3Rpb24gb2YgSXRlbXMgZnJvbSB0aGUgaXRlbSBzdG9yZS5cbiAgICogQHBhcmFtIGl0ZW1zIFRoZSBJdGVtKHMpIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVJdGVtcyhcbiAgICBpdGVtczogSXRlbVBheWxvYWRbXSxcbiAgICBjYWxsYmFjazogKGRhdGE6IEl0ZW1NZXNzYWdlUGF5bG9hZCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgaXRlbXM6IGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKVxuICAgICAgfSksXG4gICAgfVxuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLkRlbGV0ZUl0ZW1zLCBwYXJhbXMsIChkYXRhKSA9PiB7XG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhkYXRhKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSBjdXN0b20gYWN0aW9uIHRvIHRoZSBjb21wb25lbnQgbWFuYWdlci5cbiAgICogQHBhcmFtIGFjdGlvblxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHNlbmRDdXN0b21FdmVudChcbiAgICBhY3Rpb246IENvbXBvbmVudEFjdGlvbixcbiAgICBkYXRhOiBhbnksXG4gICAgY2FsbGJhY2s/OiAoZGF0YTogYW55KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKGFjdGlvbiwgZGF0YSwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGFuIGV4aXN0aW5nIEl0ZW0gaW4gdGhlIGl0ZW0gc3RvcmUuXG4gICAqIEBwYXJhbSBpdGVtIEFuIGV4aXN0aW5nIEl0ZW0gdG8gYmUgc2F2ZWQuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gc2tpcERlYm91bmNlclxuICAgKi9cbiAgcHVibGljIHNhdmVJdGVtKFxuICAgIGl0ZW06IEl0ZW1QYXlsb2FkLFxuICAgIGNhbGxiYWNrPzogKCkgPT4gdm9pZCxcbiAgICBza2lwRGVib3VuY2VyID0gZmFsc2UsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUl0ZW1zKFtpdGVtXSwgY2FsbGJhY2ssIHNraXBEZWJvdW5jZXIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIGJlZm9yZSBzYXZpbmcgYW4gSXRlbS5cbiAgICogQHBhcmFtIGl0ZW0gQW4gZXhpc3RpbmcgSXRlbSB0byBiZSBzYXZlZC5cbiAgICogQHBhcmFtIHByZXNhdmUgQWxsb3dzIGNsaWVudHMgdG8gcGVyZm9ybSBhbnkgYWN0aW9ucyBsYXN0IHNlY29uZCBiZWZvcmUgdGhlIHNhdmUgYWN0dWFsbHkgb2NjdXJzIChsaWtlIHNldHRpbmcgcHJldmlld3MpLlxuICAgKiBTYXZlcyBkZWJvdW5jZSBieSBkZWZhdWx0LCBzbyBpZiBhIGNsaWVudCBuZWVkcyB0byBjb21wdXRlIGEgcHJvcGVydHkgb24gYW4gaXRlbSBiZWZvcmUgc2F2aW5nLCBpdCdzIGJlc3QgdG9cbiAgICogaG9vayBpbnRvIHRoZSBkZWJvdW5jZSBjeWNsZSBzbyB0aGF0IGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhlaXIgb3duIGRlYm91bmNpbmcuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIHNhdmVJdGVtV2l0aFByZXNhdmUoXG4gICAgaXRlbTogSXRlbVBheWxvYWQsXG4gICAgcHJlc2F2ZTogYW55LFxuICAgIGNhbGxiYWNrPzogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlSXRlbXNXaXRoUHJlc2F2ZShbaXRlbV0sIHByZXNhdmUsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBiZWZvcmUgc2F2aW5nIGEgY29sbGVjdGlvbiBvZiBJdGVtcy5cbiAgICogQHBhcmFtIGl0ZW1zIEEgY29sbGVjdGlvbiBvZiBleGlzdGluZyBJdGVtcyB0byBiZSBzYXZlZC5cbiAgICogQHBhcmFtIHByZXNhdmUgQWxsb3dzIGNsaWVudHMgdG8gcGVyZm9ybSBhbnkgYWN0aW9ucyBsYXN0IHNlY29uZCBiZWZvcmUgdGhlIHNhdmUgYWN0dWFsbHkgb2NjdXJzIChsaWtlIHNldHRpbmcgcHJldmlld3MpLlxuICAgKiBTYXZlcyBkZWJvdW5jZSBieSBkZWZhdWx0LCBzbyBpZiBhIGNsaWVudCBuZWVkcyB0byBjb21wdXRlIGEgcHJvcGVydHkgb24gYW4gaXRlbSBiZWZvcmUgc2F2aW5nLCBpdCdzIGJlc3QgdG9cbiAgICogaG9vayBpbnRvIHRoZSBkZWJvdW5jZSBjeWNsZSBzbyB0aGF0IGNsaWVudHMgZG9uJ3QgaGF2ZSB0byBpbXBsZW1lbnQgdGhlaXIgb3duIGRlYm91bmNpbmcuXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIHNhdmVJdGVtc1dpdGhQcmVzYXZlKFxuICAgIGl0ZW1zOiBJdGVtUGF5bG9hZFtdLFxuICAgIHByZXNhdmU6IGFueSxcbiAgICBjYWxsYmFjaz86ICgpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUl0ZW1zKGl0ZW1zLCBjYWxsYmFjaywgZmFsc2UsIHByZXNhdmUpXG4gIH1cblxuICBwcml2YXRlIHBlcmZvcm1TYXZpbmdPZkl0ZW1zKHtcbiAgICBpdGVtcyxcbiAgICBwcmVzYXZlLFxuICAgIGNhbGxiYWNrLFxuICB9OiB7XG4gICAgaXRlbXM6IEl0ZW1QYXlsb2FkW11cbiAgICBwcmVzYXZlOiAoKSA9PiB2b2lkXG4gICAgY2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gIH0pIHtcbiAgICBjb25zdCBDb25jZXJuSW50ZXJ2YWxNUyA9IDUwMDBcbiAgICBjb25zdCBjb25jZXJuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb25jZXJuVGltZW91dHMuZm9yRWFjaCgodGltZW91dCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKVxuICAgICAgYWxlcnQoXG4gICAgICAgICdUaGlzIGVkaXRvciBpcyB1bmFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBTdGFuZGFyZCBOb3Rlcy4gJyArXG4gICAgICAgICAgJ1lvdXIgY2hhbmdlcyBtYXkgbm90IGJlIHNhdmVkLiBQbGVhc2UgYmFja3VwIHlvdXIgY2hhbmdlcywgdGhlbiByZXN0YXJ0IHRoZSAnICtcbiAgICAgICAgICAnYXBwbGljYXRpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgKVxuICAgIH0sIENvbmNlcm5JbnRlcnZhbE1TKVxuXG4gICAgdGhpcy5jb25jZXJuVGltZW91dHMucHVzaChjb25jZXJuVGltZW91dClcblxuICAgIC8qKlxuICAgICAqIFByZXNhdmUgYmxvY2sgYWxsb3dzIGNsaWVudCB0byBnYWluIHRoZSBiZW5lZml0IG9mIHBlcmZvcm1pbmcgc29tZXRoaW5nIGluIHRoZSBkZWJvdW5jZSBjeWNsZS5cbiAgICAgKi9cbiAgICBwcmVzYXZlICYmIHByZXNhdmUoKVxuXG4gICAgY29uc3QgbWFwcGVkSXRlbXMgPSBbXVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgbWFwcGVkSXRlbXMucHVzaCh0aGlzLmpzb25PYmplY3RGb3JJdGVtKGl0ZW0pKVxuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuY29uY2VyblRpbWVvdXRzLmZvckVhY2goKHRpbWVvdXQpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSlcbiAgICAgIGNhbGxiYWNrPy4oKVxuICAgIH1cblxuICAgIHRoaXMucG9zdE1lc3NhZ2UoXG4gICAgICBDb21wb25lbnRBY3Rpb24uU2F2ZUl0ZW1zLFxuICAgICAgeyBpdGVtczogbWFwcGVkSXRlbXMgfSxcbiAgICAgIHdyYXBwZWRDYWxsYmFjayxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgYSBjb2xsZWN0aW9uIG9mIGV4aXN0aW5nIEl0ZW1zLlxuICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGJlIHNhdmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIHNraXBEZWJvdW5jZXIgQWxsb3dzIHNhdmVzIHRvIGdvIHRocm91Z2ggcmlnaHQgYXdheSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aW1lb3V0LlxuICAgKiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gc2F2aW5nIGl0ZW1zIHZpYSBvdGhlciBtZWFucyBiZXNpZGVzIGtleXN0cm9rZXMuXG4gICAqIEBwYXJhbSBwcmVzYXZlXG4gICAqL1xuICBwdWJsaWMgc2F2ZUl0ZW1zKFxuICAgIGl0ZW1zOiBJdGVtUGF5bG9hZFtdLFxuICAgIGNhbGxiYWNrPzogKCkgPT4gdm9pZCxcbiAgICBza2lwRGVib3VuY2VyID0gZmFsc2UsXG4gICAgcHJlc2F2ZT86IGFueSxcbiAgKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlIGNsZWFyIGEgcGVuZGluZyBzYXZlIHRpbWVvdXQsXG4gICAgICogd2UgY2Fycnkgb3ZlciB0aG9zZSBwZW5kaW5nIGl0ZW1zIGludG8gdGhlIG5ldyBzYXZlLlxuICAgICAqL1xuICAgIGlmICghdGhpcy5wZW5kaW5nU2F2ZUl0ZW1zKSB7XG4gICAgICB0aGlzLnBlbmRpbmdTYXZlSXRlbXMgPSBbXVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvYWxsZXNlZFNhdmluZyAmJiAhc2tpcERlYm91bmNlcikge1xuICAgICAgaWYgKHRoaXMucGVuZGluZ1NhdmVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdTYXZlVGltZW91dClcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5jb21pbmdJZHMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0udXVpZClcbiAgICAgIC8qKlxuICAgICAgICogUmVwbGFjZSBhbnkgZXhpc3Rpbmcgc2F2ZSBpdGVtcyB3aXRoIGluY29taW5nIHZhbHVlcy5cbiAgICAgICAqIE9ubHkga2VlcCBpdGVtcyBoZXJlIHdobyBhcmUgbm90IGluIGluY29taW5nSWRzLlxuICAgICAgICovXG4gICAgICBjb25zdCBwcmVleGlzdGluZ0l0ZW1zID0gdGhpcy5wZW5kaW5nU2F2ZUl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gIWluY29taW5nSWRzLmluY2x1ZGVzKGl0ZW0udXVpZClcbiAgICAgIH0pXG5cbiAgICAgIC8vIEFkZCBuZXcgaXRlbXMsIG5vdyB0aGF0IHdlJ3ZlIG1hZGUgc3VyZSBpdCdzIGNsZWFyZWQgb2YgaW5jb21pbmcgaXRlbXMuXG4gICAgICB0aGlzLnBlbmRpbmdTYXZlSXRlbXMgPSBwcmVleGlzdGluZ0l0ZW1zLmNvbmNhdChpdGVtcylcblxuICAgICAgLy8gV2UnbGwgcG90ZW50aWFsbHkgbmVlZCB0byBjb21taXQgZWFybHkgaWYgc3RyZWFtLWNvbnRleHQtaXRlbSBtZXNzYWdlIGNvbWVzIGluLlxuICAgICAgdGhpcy5wZW5kaW5nU2F2ZVBhcmFtcyA9IHtcbiAgICAgICAgaXRlbXM6IHRoaXMucGVuZGluZ1NhdmVJdGVtcyxcbiAgICAgICAgcHJlc2F2ZSxcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICB9XG5cbiAgICAgIHRoaXMucGVuZGluZ1NhdmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVyZm9ybVNhdmluZ09mSXRlbXModGhpcy5wZW5kaW5nU2F2ZVBhcmFtcylcbiAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZUl0ZW1zID0gW11cbiAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZVRpbWVvdXQgPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZVBhcmFtcyA9IG51bGxcbiAgICAgIH0sIHRoaXMuY29hbGxlc2VkU2F2aW5nRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVyZm9ybVNhdmluZ09mSXRlbXMoeyBpdGVtcywgcHJlc2F2ZSwgY2FsbGJhY2sgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG5ldyBjb250YWluZXIgc2l6ZSBmb3IgdGhlIGN1cnJlbnQgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gd2lkdGggVGhlIG5ldyB3aWR0aC5cbiAgICogQHBhcmFtIGhlaWdodCBUaGUgbmV3IGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyBzZXRTaXplKHdpZHRoOiBzdHJpbmcgfCBudW1iZXIsIGhlaWdodDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uU2V0U2l6ZSwge1xuICAgICAgdHlwZTogJ2NvbnRhaW5lcicsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBLZXlEb3duIGtleWJvYXJkIGV2ZW50IHRvIHRoZSBTdGFuZGFyZCBOb3RlcyBwYXJlbnQgYXBwbGljYXRpb24uXG4gICAqIEBwYXJhbSBrZXlib2FyZE1vZGlmaWVyIFRoZSBrZXlib2FyZCBtb2RpZmllciB0aGF0IHdhcyBwcmVzc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBrZXlEb3duRXZlbnQoa2V5Ym9hcmRNb2RpZmllcjogS2V5Ym9hcmRNb2RpZmllcik6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLktleURvd24sIHsga2V5Ym9hcmRNb2RpZmllciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBLZXlVcCBrZXlib2FyZCBldmVudCB0byB0aGUgU3RhbmRhcmQgTm90ZXMgcGFyZW50IGFwcGxpY2F0aW9uLlxuICAgKiBAcGFyYW0ga2V5Ym9hcmRNb2RpZmllciBUaGUga2V5Ym9hcmQgbW9kaWZpZXIgdGhhdCB3YXMgcmVsZWFzZWQuXG4gICAqL1xuICBwcml2YXRlIGtleVVwRXZlbnQoa2V5Ym9hcmRNb2RpZmllcjogS2V5Ym9hcmRNb2RpZmllcik6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLktleVVwLCB7IGtleWJvYXJkTW9kaWZpZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgQ2xpY2sgbW91c2UgZXZlbnQgdG8gdGhlIFN0YW5kYXJkIE5vdGVzIHBhcmVudCBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgbW91c2VDbGlja0V2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLkNsaWNrLCB7fSlcbiAgfVxuXG4gIHByaXZhdGUganNvbk9iamVjdEZvckl0ZW0oaXRlbTogU05JdGVtIHwgSXRlbVBheWxvYWQpIHtcbiAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSkgYXMgYW55XG4gICAgY29weS5jaGlsZHJlbiA9IG51bGxcbiAgICBjb3B5LnBhcmVudCA9IG51bGxcbiAgICByZXR1cm4gY29weVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIEl0ZW0ncyBhcHBEYXRhIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICogVXNlcyB0aGUgZGVmYXVsdCBkb21haW4gKG9yZy5zdGFuZGFyZG5vdGVzLnNuKS5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdpdGggSXRlbXMgcmV0dXJuZWQgZnJvbSBzdHJlYW1Db250ZXh0SXRlbSgpIGFuZCBzdHJlYW1JdGVtcygpXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBJdGVtIHRvIGdldCB0aGUgYXBwRGF0YSB2YWx1ZSBmcm9tLlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLlxuICAgKi9cbiAgcHVibGljIGdldEl0ZW1BcHBEYXRhVmFsdWUoXG4gICAgaXRlbTogSXRlbU1lc3NhZ2VQYXlsb2FkIHwgdW5kZWZpbmVkLFxuICAgIGtleTogQXBwRGF0YUZpZWxkIHwgc3RyaW5nLFxuICApOiBhbnkge1xuICAgIGNvbnN0IGRlZmF1bHREb21haW4gPSAnb3JnLnN0YW5kYXJkbm90ZXMuc24nXG4gICAgcmV0dXJuIGl0ZW0/LmNvbnRlbnQ/LmFwcERhdGE/LltkZWZhdWx0RG9tYWluXVtrZXldXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgdmlld0JveD1cXFwiMCAwIDI0IDI0XFxcIj48cGF0aCBkPVxcXCJNMTkgNXYxNEg1VjVoMTRtMC0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMCAwaDI0djI0SDB6XFxcIiBmaWxsPVxcXCJub25lXFxcIj48L3BhdGg+PC9zdmc+XCIiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS05IDE0bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6XFxcIj48L3BhdGg+PC9zdmc+XCIiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLy8gOjotIFBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGFuIG9yZGVyZWQgbWFwcGluZyBmcm9tXG4vLyBzdHJpbmdzIHRvIHZhbHVlcywgd2l0aCBzb21lIGNvbnZlbmllbnQgdXBkYXRlIG1ldGhvZHMuXG5mdW5jdGlvbiBPcmRlcmVkTWFwKGNvbnRlbnQpIHtcbiAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbn1cblxuT3JkZXJlZE1hcC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBPcmRlcmVkTWFwLFxuXG4gIGZpbmQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSArPSAyKVxuICAgICAgaWYgKHRoaXMuY29udGVudFtpXSA9PT0ga2V5KSByZXR1cm4gaVxuICAgIHJldHVybiAtMVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcpIOKGkiA/YW55XG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIgYGtleWAsIG9yIHJldHVybiB1bmRlZmluZWQgd2hlblxuICAvLyBubyBzdWNoIGtleSBleGlzdHMuXG4gIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgcmV0dXJuIGZvdW5kID09IC0xID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50W2ZvdW5kICsgMV1cbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnksID9zdHJpbmcpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgcmVwbGFjaW5nIHRoZSB2YWx1ZSBvZiBga2V5YCB3aXRoIGEgbmV3XG4gIC8vIHZhbHVlLCBvciBhZGRpbmcgYSBiaW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIG1hcC4gSWYgYG5ld0tleWAgaXNcbiAgLy8gZ2l2ZW4sIHRoZSBrZXkgb2YgdGhlIGJpbmRpbmcgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoYXQga2V5LlxuICB1cGRhdGU6IGZ1bmN0aW9uKGtleSwgdmFsdWUsIG5ld0tleSkge1xuICAgIHZhciBzZWxmID0gbmV3S2V5ICYmIG5ld0tleSAhPSBrZXkgPyB0aGlzLnJlbW92ZShuZXdLZXkpIDogdGhpcztcbiAgICB2YXIgZm91bmQgPSBzZWxmLmZpbmQoa2V5KSwgY29udGVudCA9IHNlbGYuY29udGVudC5zbGljZSgpO1xuICAgIGlmIChmb3VuZCA9PSAtMSkge1xuICAgICAgY29udGVudC5wdXNoKG5ld0tleSB8fCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudFtmb3VuZCArIDFdID0gdmFsdWU7XG4gICAgICBpZiAobmV3S2V5KSBjb250ZW50W2ZvdW5kXSA9IG5ld0tleTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZykg4oaSIE9yZGVyZWRNYXBcbiAgLy8gUmV0dXJuIGEgbWFwIHdpdGggdGhlIGdpdmVuIGtleSByZW1vdmVkLCBpZiBpdCBleGlzdGVkLlxuICByZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChrZXkpO1xuICAgIGlmIChmb3VuZCA9PSAtMSkgcmV0dXJuIHRoaXNcbiAgICB2YXIgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgIGNvbnRlbnQuc3BsaWNlKGZvdW5kLCAyKTtcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIG5ldyBrZXkgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXAuXG4gIGFkZFRvU3RhcnQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoW2tleSwgdmFsdWVdLmNvbmNhdCh0aGlzLnJlbW92ZShrZXkpLmNvbnRlbnQpKVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSkg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQWRkIGEgbmV3IGtleSB0byB0aGUgZW5kIG9mIHRoZSBtYXAuXG4gIGFkZFRvRW5kOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLnJlbW92ZShrZXkpLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBjb250ZW50LnB1c2goa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgc3RyaW5nLCBhbnkpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIGtleSBhZnRlciB0aGUgZ2l2ZW4ga2V5LiBJZiBgcGxhY2VgIGlzIG5vdCBmb3VuZCwgdGhlIG5ld1xuICAvLyBrZXkgaXMgYWRkZWQgdG8gdGhlIGVuZC5cbiAgYWRkQmVmb3JlOiBmdW5jdGlvbihwbGFjZSwga2V5LCB2YWx1ZSkge1xuICAgIHZhciB3aXRob3V0ID0gdGhpcy5yZW1vdmUoa2V5KSwgY29udGVudCA9IHdpdGhvdXQuY29udGVudC5zbGljZSgpO1xuICAgIHZhciBmb3VuZCA9IHdpdGhvdXQuZmluZChwbGFjZSk7XG4gICAgY29udGVudC5zcGxpY2UoZm91bmQgPT0gLTEgPyBjb250ZW50Lmxlbmd0aCA6IGZvdW5kLCAwLCBrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbiAgfSxcblxuICAvLyA6OiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSlcbiAgLy8gQ2FsbCB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2gga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIG1hcCwgaW5cbiAgLy8gb3JkZXIuXG4gIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGYodGhpcy5jb250ZW50W2ldLCB0aGlzLmNvbnRlbnRbaSArIDFdKTtcbiAgfSxcblxuICAvLyA6OiAodW5pb248T2JqZWN0LCBPcmRlcmVkTWFwPikg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQ3JlYXRlIGEgbmV3IG1hcCBieSBwcmVwZW5kaW5nIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgIGJlZm9yZSB0aGUga2V5cyBpbiBgbWFwYC5cbiAgcHJlcGVuZDogZnVuY3Rpb24obWFwKSB7XG4gICAgbWFwID0gT3JkZXJlZE1hcC5mcm9tKG1hcCk7XG4gICAgaWYgKCFtYXAuc2l6ZSkgcmV0dXJuIHRoaXNcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAobWFwLmNvbnRlbnQuY29uY2F0KHRoaXMuc3VidHJhY3QobWFwKS5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAodW5pb248T2JqZWN0LCBPcmRlcmVkTWFwPikg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQ3JlYXRlIGEgbmV3IG1hcCBieSBhcHBlbmRpbmcgdGhlIGtleXMgaW4gdGhpcyBtYXAgdGhhdCBkb24ndFxuICAvLyBhcHBlYXIgaW4gYG1hcGAgYWZ0ZXIgdGhlIGtleXMgaW4gYG1hcGAuXG4gIGFwcGVuZDogZnVuY3Rpb24obWFwKSB7XG4gICAgbWFwID0gT3JkZXJlZE1hcC5mcm9tKG1hcCk7XG4gICAgaWYgKCFtYXAuc2l6ZSkgcmV0dXJuIHRoaXNcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAodGhpcy5zdWJ0cmFjdChtYXApLmNvbnRlbnQuY29uY2F0KG1hcC5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAodW5pb248T2JqZWN0LCBPcmRlcmVkTWFwPikg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQ3JlYXRlIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgLlxuICBzdWJ0cmFjdDogZnVuY3Rpb24obWFwKSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgbWFwID0gT3JkZXJlZE1hcC5mcm9tKG1hcCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXAuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZW1vdmUobWFwLmNvbnRlbnRbaV0pO1xuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICAvLyA6OiAoKSDihpIgT2JqZWN0XG4gIC8vIFR1cm4gb3JkZXJlZCBtYXAgaW50byBhIHBsYWluIG9iamVjdC5cbiAgdG9PYmplY3Q6IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkgeyByZXN1bHRba2V5XSA9IHZhbHVlOyB9KTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLy8gOjogbnVtYmVyXG4gIC8vIFRoZSBhbW91bnQgb2Yga2V5cyBpbiB0aGlzIG1hcC5cbiAgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPj4gMVxuICB9XG59O1xuXG4vLyA6OiAoP3VuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4vLyBSZXR1cm4gYSBtYXAgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4gSWYgbnVsbCwgY3JlYXRlIGFuIGVtcHR5XG4vLyBtYXAuIElmIGdpdmVuIGFuIG9yZGVyZWQgbWFwLCByZXR1cm4gdGhhdCBtYXAgaXRzZWxmLiBJZiBnaXZlbiBhblxuLy8gb2JqZWN0LCBjcmVhdGUgYSBtYXAgZnJvbSB0aGUgb2JqZWN0J3MgcHJvcGVydGllcy5cbk9yZGVyZWRNYXAuZnJvbSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9yZGVyZWRNYXApIHJldHVybiB2YWx1ZVxuICB2YXIgY29udGVudCA9IFtdO1xuICBpZiAodmFsdWUpIGZvciAodmFyIHByb3AgaW4gdmFsdWUpIGNvbnRlbnQucHVzaChwcm9wLCB2YWx1ZVtwcm9wXSk7XG4gIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxufTtcblxuZXhwb3J0IGRlZmF1bHQgT3JkZXJlZE1hcDtcbiIsImltcG9ydCBPcmRlcmVkTWFwIGZyb20gJ29yZGVyZWRtYXAnO1xuXG5mdW5jdGlvbiBmaW5kRGlmZlN0YXJ0KGEsIGIsIHBvcykge1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGlmIChpID09IGEuY2hpbGRDb3VudCB8fCBpID09IGIuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBhLmNoaWxkQ291bnQgPT0gYi5jaGlsZENvdW50ID8gbnVsbCA6IHBvcztcbiAgICAgICAgbGV0IGNoaWxkQSA9IGEuY2hpbGQoaSksIGNoaWxkQiA9IGIuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBjaGlsZEEudGV4dFtqXSA9PSBjaGlsZEIudGV4dFtqXTsgaisrKVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRBLmNvbnRlbnQuc2l6ZSB8fCBjaGlsZEIuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBmaW5kRGlmZlN0YXJ0KGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcG9zICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRGlmZkVuZChhLCBiLCBwb3NBLCBwb3NCKSB7XG4gICAgZm9yIChsZXQgaUEgPSBhLmNoaWxkQ291bnQsIGlCID0gYi5jaGlsZENvdW50OzspIHtcbiAgICAgICAgaWYgKGlBID09IDAgfHwgaUIgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBpQSA9PSBpQiA/IG51bGwgOiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgbGV0IGNoaWxkQSA9IGEuY2hpbGQoLS1pQSksIGNoaWxkQiA9IGIuY2hpbGQoLS1pQiksIHNpemUgPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgICAgICBwb3NCIC09IHNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICAgICAgICBsZXQgc2FtZSA9IDAsIG1pblNpemUgPSBNYXRoLm1pbihjaGlsZEEudGV4dC5sZW5ndGgsIGNoaWxkQi50ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB3aGlsZSAoc2FtZSA8IG1pblNpemUgJiYgY2hpbGRBLnRleHRbY2hpbGRBLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdID09IGNoaWxkQi50ZXh0W2NoaWxkQi50ZXh0Lmxlbmd0aCAtIHNhbWUgLSAxXSkge1xuICAgICAgICAgICAgICAgIHNhbWUrKztcbiAgICAgICAgICAgICAgICBwb3NBLS07XG4gICAgICAgICAgICAgICAgcG9zQi0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmRW5kKGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcG9zQSAtIDEsIHBvc0IgLSAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIH1cbiAgICAgICAgcG9zQSAtPSBzaXplO1xuICAgICAgICBwb3NCIC09IHNpemU7XG4gICAgfVxufVxuXG4vKipcbkEgZnJhZ21lbnQgcmVwcmVzZW50cyBhIG5vZGUncyBjb2xsZWN0aW9uIG9mIGNoaWxkIG5vZGVzLlxuXG5MaWtlIG5vZGVzLCBmcmFnbWVudHMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLCBhbmQgeW91XG5zaG91bGQgbm90IG11dGF0ZSB0aGVtIG9yIHRoZWlyIGNvbnRlbnQuIFJhdGhlciwgeW91IGNyZWF0ZSBuZXdcbmluc3RhbmNlcyB3aGVuZXZlciBuZWVkZWQuIFRoZSBBUEkgdHJpZXMgdG8gbWFrZSB0aGlzIGVhc3kuXG4qL1xuY2xhc3MgRnJhZ21lbnQge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGNoaWxkIG5vZGVzIGluIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjb250ZW50LCBzaXplKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemUgfHwgMDtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLnNpemUgKz0gY29udGVudFtpXS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW52b2tlIGEgY2FsbGJhY2sgZm9yIGFsbCBkZXNjZW5kYW50IG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuIHR3b1xuICAgIHBvc2l0aW9ucyAocmVsYXRpdmUgdG8gc3RhcnQgb2YgdGhpcyBmcmFnbWVudCkuIERvZXNuJ3QgZGVzY2VuZFxuICAgIGludG8gYSBub2RlIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgYGZhbHNlYC5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgbm9kZVN0YXJ0ID0gMCwgcGFyZW50KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20gJiYgZihjaGlsZCwgbm9kZVN0YXJ0ICsgcG9zLCBwYXJlbnQgfHwgbnVsbCwgaSkgIT09IGZhbHNlICYmIGNoaWxkLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHBvcyArIDE7XG4gICAgICAgICAgICAgICAgY2hpbGQubm9kZXNCZXR3ZWVuKE1hdGgubWF4KDAsIGZyb20gLSBzdGFydCksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBzdGFydCksIGYsIG5vZGVTdGFydCArIHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDYWxsIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgZXZlcnkgZGVzY2VuZGFudCBub2RlLiBgcG9zYCB3aWxsIGJlXG4gICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudC4gVGhlIGNhbGxiYWNrIG1heSByZXR1cm5cbiAgICBgZmFsc2VgIHRvIHByZXZlbnQgdHJhdmVyc2FsIG9mIGEgZ2l2ZW4gbm9kZSdzIGNoaWxkcmVuLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLnNpemUsIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRyYWN0IHRoZSB0ZXh0IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBTZWUgdGhlIHNhbWUgbWV0aG9kIG9uXG4gICAgW2BOb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUudGV4dEJldHdlZW4pLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCIsIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGxldCBub2RlVGV4dCA9IG5vZGUuaXNUZXh0ID8gbm9kZS50ZXh0LnNsaWNlKE1hdGgubWF4KGZyb20sIHBvcykgLSBwb3MsIHRvIC0gcG9zKVxuICAgICAgICAgICAgICAgIDogIW5vZGUuaXNMZWFmID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICA6IGxlYWZUZXh0ID8gKHR5cGVvZiBsZWFmVGV4dCA9PT0gXCJmdW5jdGlvblwiID8gbGVhZlRleHQobm9kZSkgOiBsZWFmVGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbm9kZS50eXBlLnNwZWMubGVhZlRleHQgPyBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dChub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2sgJiYgKG5vZGUuaXNMZWFmICYmIG5vZGVUZXh0IHx8IG5vZGUuaXNUZXh0YmxvY2spICYmIGJsb2NrU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBibG9ja1NlcGFyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gbm9kZVRleHQ7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGNvbWJpbmVkIGNvbnRlbnQgb2YgdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgb3RoZXIuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlci5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubGFzdENoaWxkLCBmaXJzdCA9IG90aGVyLmZpcnN0Q2hpbGQsIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKSwgaSA9IDA7XG4gICAgICAgIGlmIChsYXN0LmlzVGV4dCAmJiBsYXN0LnNhbWVNYXJrdXAoZmlyc3QpKSB7XG4gICAgICAgICAgICBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gPSBsYXN0LndpdGhUZXh0KGxhc3QudGV4dCArIGZpcnN0LnRleHQpO1xuICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBvdGhlci5jb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY29udGVudC5wdXNoKG90aGVyLmNvbnRlbnRbaV0pO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQsIHRoaXMuc2l6ZSArIG90aGVyLnNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBzdWItZnJhZ21lbnQgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHNpemUgPSAwO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tIHx8IGVuZCA+IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCBNYXRoLm1pbihjaGlsZC50ZXh0Lmxlbmd0aCwgdG8gLSBwb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dChNYXRoLm1heCgwLCBmcm9tIC0gcG9zIC0gMSksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBwb3MgLSAxKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBzaXplICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQocmVzdWx0LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXRCeUluZGV4KGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGluIHdoaWNoIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBpc1xuICAgIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLlxuICAgICovXG4gICAgcmVwbGFjZUNoaWxkKGluZGV4LCBub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUgLSBjdXJyZW50Lm5vZGVTaXplO1xuICAgICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29weSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBwcmVwZW5kaW5nIHRoZSBnaXZlbiBub2RlIHRvIHRoaXNcbiAgICBmcmFnbWVudC5cbiAgICAqL1xuICAgIGFkZFRvU3RhcnQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2RlXS5jb25jYXQodGhpcy5jb250ZW50KSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9FbmQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5jb25jYXQobm9kZSksIHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgZnJhZ21lbnQgdG8gYW5vdGhlciBvbmUuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCAhPSBvdGhlci5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFtpXS5lcShvdGhlci5jb250ZW50W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4gUmFpc2UgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgb3V0IG9mIHJhbmdlIGZvciBcIiArIHRoaXMpO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgICAgICBmKGNoaWxkLCBwLCBpKTtcbiAgICAgICAgICAgIHAgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhpcyBmcmFnbWVudCBhbmQgYW5vdGhlclxuICAgIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICovXG4gICAgZmluZERpZmZTdGFydChvdGhlciwgcG9zID0gMCkge1xuICAgICAgICByZXR1cm4gZmluZERpZmZTdGFydCh0aGlzLCBvdGhlciwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIHRoaXNcbiAgICBmcmFnbWVudCBhbmQgdGhlIGdpdmVuIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlXG4gICAgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb24gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aFxuICAgIG5vZGVzLCBhbiBvYmplY3Qgd2l0aCB0d28gc2VwYXJhdGUgcG9zaXRpb25zIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZmluZERpZmZFbmQob3RoZXIsIHBvcyA9IHRoaXMuc2l6ZSwgb3RoZXJQb3MgPSBvdGhlci5zaXplKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZkVuZCh0aGlzLCBvdGhlciwgcG9zLCBvdGhlclBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGV4IGFuZCBpbm5lciBvZmZzZXQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHJlbGF0aXZlXG4gICAgcG9zaXRpb24gaW4gdGhpcyBmcmFnbWVudC4gVGhlIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSByZXVzZWRcbiAgICAob3ZlcndyaXR0ZW4pIHRoZSBuZXh0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kSW5kZXgocG9zLCByb3VuZCA9IC0xKSB7XG4gICAgICAgIGlmIChwb3MgPT0gMClcbiAgICAgICAgICAgIHJldHVybiByZXRJbmRleCgwLCBwb3MpO1xuICAgICAgICBpZiAocG9zID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiByZXRJbmRleCh0aGlzLmNvbnRlbnQubGVuZ3RoLCBwb3MpO1xuICAgICAgICBpZiAocG9zID4gdGhpcy5zaXplIHx8IHBvcyA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IG91dHNpZGUgb2YgZnJhZ21lbnQgKCR7dGhpc30pYCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjdXJQb3MgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gdGhpcy5jaGlsZChpKSwgZW5kID0gY3VyUG9zICsgY3VyLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID09IHBvcyB8fCByb3VuZCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRJbmRleChpICsgMSwgZW5kKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSwgY3VyUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1clBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBkZWJ1Z2dpbmcgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIFwiPFwiICsgdGhpcy50b1N0cmluZ0lubmVyKCkgKyBcIj5cIjsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmdJbm5lcigpIHsgcmV0dXJuIHRoaXMuY29udGVudC5qb2luKFwiLCBcIik7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnQubWFwKG4gPT4gbi50b0pTT04oKSkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIGZyYWdtZW50IGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBGcmFnbWVudC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh2YWx1ZS5tYXAoc2NoZW1hLm5vZGVGcm9tSlNPTikpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIGZyYWdtZW50IGZyb20gYW4gYXJyYXkgb2Ygbm9kZXMuIEVuc3VyZXMgdGhhdCBhZGphY2VudFxuICAgIHRleHQgbm9kZXMgd2l0aCB0aGUgc2FtZSBtYXJrcyBhcmUgam9pbmVkIHRvZ2V0aGVyLlxuICAgICovXG4gICAgc3RhdGljIGZyb21BcnJheShhcnJheSkge1xuICAgICAgICBpZiAoIWFycmF5Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgbGV0IGpvaW5lZCwgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gYXJyYXlbaV07XG4gICAgICAgICAgICBzaXplICs9IG5vZGUubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaSAmJiBub2RlLmlzVGV4dCAmJiBhcnJheVtpIC0gMV0uc2FtZU1hcmt1cChub2RlKSkge1xuICAgICAgICAgICAgICAgIGlmICgham9pbmVkKVxuICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSBhcnJheS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICBqb2luZWRbam9pbmVkLmxlbmd0aCAtIDFdID0gbm9kZVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRleHQoam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXS50ZXh0ICsgbm9kZS50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGpvaW5lZCkge1xuICAgICAgICAgICAgICAgIGpvaW5lZC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoam9pbmVkIHx8IGFycmF5LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZnJhZ21lbnQgZnJvbSBzb21ldGhpbmcgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYVxuICAgIHNldCBvZiBub2Rlcy4gRm9yIGBudWxsYCwgaXQgcmV0dXJucyB0aGUgZW1wdHkgZnJhZ21lbnQuIEZvciBhXG4gICAgZnJhZ21lbnQsIHRoZSBmcmFnbWVudCBpdHNlbGYuIEZvciBhIG5vZGUgb3IgYXJyYXkgb2Ygbm9kZXMsIGFcbiAgICBmcmFnbWVudCBjb250YWluaW5nIHRob3NlIG5vZGVzLlxuICAgICovXG4gICAgc3RhdGljIGZyb20obm9kZXMpIHtcbiAgICAgICAgaWYgKCFub2RlcylcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKG5vZGVzIGluc3RhbmNlb2YgRnJhZ21lbnQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheShub2Rlcyk7XG4gICAgICAgIGlmIChub2Rlcy5hdHRycylcbiAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoW25vZGVzXSwgbm9kZXMubm9kZVNpemUpO1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbiBub3QgY29udmVydCBcIiArIG5vZGVzICsgXCIgdG8gYSBGcmFnbWVudFwiICtcbiAgICAgICAgICAgIChub2Rlcy5ub2Rlc0JldHdlZW4gPyBcIiAobG9va3MgbGlrZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBwcm9zZW1pcnJvci1tb2RlbCB3ZXJlIGxvYWRlZClcIiA6IFwiXCIpKTtcbiAgICB9XG59XG4vKipcbkFuIGVtcHR5IGZyYWdtZW50LiBJbnRlbmRlZCB0byBiZSByZXVzZWQgd2hlbmV2ZXIgYSBub2RlIGRvZXNuJ3RcbmNvbnRhaW4gYW55dGhpbmcgKHJhdGhlciB0aGFuIGFsbG9jYXRpbmcgYSBuZXcgZW1wdHkgZnJhZ21lbnQgZm9yXG5lYWNoIGxlYWYgbm9kZSkuXG4qL1xuRnJhZ21lbnQuZW1wdHkgPSBuZXcgRnJhZ21lbnQoW10sIDApO1xuY29uc3QgZm91bmQgPSB7IGluZGV4OiAwLCBvZmZzZXQ6IDAgfTtcbmZ1bmN0aW9uIHJldEluZGV4KGluZGV4LCBvZmZzZXQpIHtcbiAgICBmb3VuZC5pbmRleCA9IGluZGV4O1xuICAgIGZvdW5kLm9mZnNldCA9IG9mZnNldDtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVEZWVwKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEoYSAmJiB0eXBlb2YgYSA9PSBcIm9iamVjdFwiKSB8fFxuICAgICAgICAhKGIgJiYgdHlwZW9mIGIgPT0gXCJvYmplY3RcIikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXJyYXkgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGIpICE9IGFycmF5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFjb21wYXJlRGVlcChhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBwIGluIGEpXG4gICAgICAgICAgICBpZiAoIShwIGluIGIpIHx8ICFjb21wYXJlRGVlcChhW3BdLCBiW3BdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHAgaW4gYilcbiAgICAgICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG5BIG1hcmsgaXMgYSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGUsXG5zdWNoIGFzIGl0IGJlaW5nIGVtcGhhc2l6ZWQsIGluIGNvZGUgZm9udCwgb3IgYSBsaW5rLiBJdCBoYXMgYVxudHlwZSBhbmQgb3B0aW9uYWxseSBhIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBmdXJ0aGVyXG5pbmZvcm1hdGlvbiAoc3VjaCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rKS4gTWFya3MgYXJlIGNyZWF0ZWRcbnRocm91Z2ggYSBgU2NoZW1hYCwgd2hpY2ggY29udHJvbHMgd2hpY2ggdHlwZXMgZXhpc3QgYW5kIHdoaWNoXG5hdHRyaWJ1dGVzIHRoZXkgaGF2ZS5cbiovXG5jbGFzcyBNYXJrIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoaXMgbWFyay5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICBhdHRycykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEdpdmVuIGEgc2V0IG9mIG1hcmtzLCBjcmVhdGUgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIHRoaXMgb25lIGFzXG4gICAgd2VsbCwgaW4gdGhlIHJpZ2h0IHBvc2l0aW9uLiBJZiB0aGlzIG1hcmsgaXMgYWxyZWFkeSBpbiB0aGUgc2V0LFxuICAgIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLiBJZiBhbnkgbWFya3MgdGhhdCBhcmUgc2V0IHRvIGJlXG4gICAgW2V4Y2x1c2l2ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmV4Y2x1ZGVzKSB3aXRoIHRoaXMgbWFyayBhcmUgcHJlc2VudCxcbiAgICB0aG9zZSBhcmUgcmVwbGFjZWQgYnkgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhZGRUb1NldChzZXQpIHtcbiAgICAgICAgbGV0IGNvcHksIHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG90aGVyID0gc2V0W2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuZXEob3RoZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlLmV4Y2x1ZGVzKG90aGVyLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIudHlwZS5leGNsdWRlcyh0aGlzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcGxhY2VkICYmIG90aGVyLnR5cGUucmFuayA+IHRoaXMudHlwZS5yYW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvcHkpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChvdGhlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgpO1xuICAgICAgICBpZiAoIXBsYWNlZClcbiAgICAgICAgICAgIGNvcHkucHVzaCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZSB0aGlzIG1hcmsgZnJvbSB0aGUgZ2l2ZW4gc2V0LCByZXR1cm5pbmcgYSBuZXcgc2V0LiBJZiB0aGlzXG4gICAgbWFyayBpcyBub3QgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldC5zbGljZSgwLCBpKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaXMgaW4gdGhlIGdpdmVuIHNldCBvZiBtYXJrcy5cbiAgICAqL1xuICAgIGlzSW5TZXQoc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMuZXEoc2V0W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGhhcyB0aGUgc2FtZSB0eXBlIGFuZCBhdHRyaWJ1dGVzIGFzXG4gICAgYW5vdGhlciBtYXJrLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgICh0aGlzLnR5cGUgPT0gb3RoZXIudHlwZSAmJiBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBvdGhlci5hdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoaXMgbWFyayB0byBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgdHlwZTogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICBvYmouYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBtYXJrIGZyb20gSlNPTi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBNYXJrLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgdHlwZSA9IHNjaGVtYS5tYXJrc1tqc29uLnR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlcmUgaXMgbm8gbWFyayB0eXBlICR7anNvbi50eXBlfSBpbiB0aGlzIHNjaGVtYWApO1xuICAgICAgICBsZXQgbWFyayA9IHR5cGUuY3JlYXRlKGpzb24uYXR0cnMpO1xuICAgICAgICB0eXBlLmNoZWNrQXR0cnMobWFyay5hdHRycyk7XG4gICAgICAgIHJldHVybiBtYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIHNldHMgb2YgbWFya3MgYXJlIGlkZW50aWNhbC5cbiAgICAqL1xuICAgIHN0YXRpYyBzYW1lU2V0KGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPT0gYilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICAgICovXG4gICAgc3RhdGljIHNldEZyb20obWFya3MpIHtcbiAgICAgICAgaWYgKCFtYXJrcyB8fCBBcnJheS5pc0FycmF5KG1hcmtzKSAmJiBtYXJrcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspXG4gICAgICAgICAgICByZXR1cm4gW21hcmtzXTtcbiAgICAgICAgbGV0IGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgICBjb3B5LnNvcnQoKGEsIGIpID0+IGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbmspO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgbWFya3MuXG4qL1xuTWFyay5ub25lID0gW107XG5cbi8qKlxuRXJyb3IgdHlwZSByYWlzZWQgYnkgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aGVuXG5naXZlbiBhbiBpbnZhbGlkIHJlcGxhY2VtZW50LlxuKi9cbmNsYXNzIFJlcGxhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qXG5SZXBsYWNlRXJyb3IgPSBmdW5jdGlvbih0aGlzOiBhbnksIG1lc3NhZ2U6IHN0cmluZykge1xuICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKVxuICA7KGVyciBhcyBhbnkpLl9fcHJvdG9fXyA9IFJlcGxhY2VFcnJvci5wcm90b3R5cGVcbiAgcmV0dXJuIGVyclxufSBhcyBhbnlcblxuUmVwbGFjZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlcGxhY2VFcnJvclxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJSZXBsYWNlRXJyb3JcIlxuKi9cbi8qKlxuQSBzbGljZSByZXByZXNlbnRzIGEgcGllY2UgY3V0IG91dCBvZiBhIGxhcmdlciBkb2N1bWVudC4gSXRcbnN0b3JlcyBub3Qgb25seSBhIGZyYWdtZW50LCBidXQgYWxzbyB0aGUgZGVwdGggdXAgdG8gd2hpY2ggbm9kZXMgb25cbmJvdGggc2lkZSBhcmUg4oCYb3BlbuKAmSAoY3V0IHRocm91Z2gpLlxuKi9cbmNsYXNzIFNsaWNlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzbGljZS4gV2hlbiBzcGVjaWZ5aW5nIGEgbm9uLXplcm8gb3BlbiBkZXB0aCwgeW91IG11c3RcbiAgICBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm9kZXMgb2YgYXQgbGVhc3QgdGhhdCBkZXB0aCBhdCB0aGVcbiAgICBhcHByb3ByaWF0ZSBzaWRlIG9mIHRoZSBmcmFnbWVudOKAlGkuZS4gaWYgdGhlIGZyYWdtZW50IGlzIGFuXG4gICAgZW1wdHkgcGFyYWdyYXBoIG5vZGUsIGBvcGVuU3RhcnRgIGFuZCBgb3BlbkVuZGAgY2FuJ3QgYmUgZ3JlYXRlclxuICAgIHRoYW4gMS5cbiAgICBcbiAgICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgY29udGVudCBvZiBvcGVuIG5vZGVzIHRvIGNvbmZvcm0gdG9cbiAgICB0aGUgc2NoZW1hJ3MgY29udGVudCBjb25zdHJhaW50cywgdGhvdWdoIGl0IHNob3VsZCBiZSBhIHZhbGlkXG4gICAgc3RhcnQvZW5kL21pZGRsZSBmb3Igc3VjaCBhIG5vZGUsIGRlcGVuZGluZyBvbiB3aGljaCBzaWRlcyBhcmVcbiAgICBvcGVuLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBvcGVuU3RhcnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBvcGVuRW5kKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSBvcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSB0aGlzIHNsaWNlIHdvdWxkIGFkZCB3aGVuIGluc2VydGVkIGludG8gYSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemUgLSB0aGlzLm9wZW5TdGFydCAtIHRoaXMub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRBdChwb3MsIGZyYWdtZW50KSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gaW5zZXJ0SW50byh0aGlzLmNvbnRlbnQsIHBvcyArIHRoaXMub3BlblN0YXJ0LCBmcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBjb250ZW50ICYmIG5ldyBTbGljZShjb250ZW50LCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZW1vdmVCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UocmVtb3ZlUmFuZ2UodGhpcy5jb250ZW50LCBmcm9tICsgdGhpcy5vcGVuU3RhcnQsIHRvICsgdGhpcy5vcGVuU3RhcnQpLCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGlzIHNsaWNlIGlzIGVxdWFsIHRvIGFub3RoZXIgc2xpY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpICYmIHRoaXMub3BlblN0YXJ0ID09IG90aGVyLm9wZW5TdGFydCAmJiB0aGlzLm9wZW5FbmQgPT0gb3RoZXIub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudCArIFwiKFwiICsgdGhpcy5vcGVuU3RhcnQgKyBcIixcIiArIHRoaXMub3BlbkVuZCArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgc2xpY2UgdG8gYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQganNvbiA9IHsgY29udGVudDogdGhpcy5jb250ZW50LnRvSlNPTigpIH07XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5TdGFydCA9IHRoaXMub3BlblN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5vcGVuRW5kID4gMClcbiAgICAgICAgICAgIGpzb24ub3BlbkVuZCA9IHRoaXMub3BlbkVuZDtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgc2xpY2UgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0ganNvbi5vcGVuU3RhcnQgfHwgMCwgb3BlbkVuZCA9IGpzb24ub3BlbkVuZCB8fCAwO1xuICAgICAgICBpZiAodHlwZW9mIG9wZW5TdGFydCAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBvcGVuRW5kICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFNsaWNlLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UgZnJvbSBhIGZyYWdtZW50IGJ5IHRha2luZyB0aGUgbWF4aW11bSBwb3NzaWJsZVxuICAgIG9wZW4gdmFsdWUgb24gYm90aCBzaWRlIG9mIHRoZSBmcmFnbWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXhPcGVuKGZyYWdtZW50LCBvcGVuSXNvbGF0aW5nID0gdHJ1ZSkge1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IG4gPSBmcmFnbWVudC5maXJzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQubGFzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4ubGFzdENoaWxkKVxuICAgICAgICAgICAgb3BlbkVuZCsrO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGZyYWdtZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNsaWNlLlxuKi9cblNsaWNlLmVtcHR5ID0gbmV3IFNsaWNlKEZyYWdtZW50LmVtcHR5LCAwLCAwKTtcbmZ1bmN0aW9uIHJlbW92ZVJhbmdlKGNvbnRlbnQsIGZyb20sIHRvKSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZnJvbSksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBsZXQgeyBpbmRleDogaW5kZXhUbywgb2Zmc2V0OiBvZmZzZXRUbyB9ID0gY29udGVudC5maW5kSW5kZXgodG8pO1xuICAgIGlmIChvZmZzZXQgPT0gZnJvbSB8fCBjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgaWYgKG9mZnNldFRvICE9IHRvICYmICFjb250ZW50LmNoaWxkKGluZGV4VG8pLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBjb250ZW50LmN1dCgwLCBmcm9tKS5hcHBlbmQoY29udGVudC5jdXQodG8pKTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9IGluZGV4VG8pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBjaGlsZC5jb3B5KHJlbW92ZVJhbmdlKGNoaWxkLmNvbnRlbnQsIGZyb20gLSBvZmZzZXQgLSAxLCB0byAtIG9mZnNldCAtIDEpKSk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbnRvKGNvbnRlbnQsIGRpc3QsIGluc2VydCwgcGFyZW50KSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZGlzdCksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBpZiAob2Zmc2V0ID09IGRpc3QgfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCwgaW5zZXJ0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZGlzdCkuYXBwZW5kKGluc2VydCkuYXBwZW5kKGNvbnRlbnQuY3V0KGRpc3QpKTtcbiAgICB9XG4gICAgbGV0IGlubmVyID0gaW5zZXJ0SW50byhjaGlsZC5jb250ZW50LCBkaXN0IC0gb2Zmc2V0IC0gMSwgaW5zZXJ0KTtcbiAgICByZXR1cm4gaW5uZXIgJiYgY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGNoaWxkLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2UoJGZyb20sICR0bywgc2xpY2UpIHtcbiAgICBpZiAoc2xpY2Uub3BlblN0YXJ0ID4gJGZyb20uZGVwdGgpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJJbnNlcnRlZCBjb250ZW50IGRlZXBlciB0aGFuIGluc2VydGlvbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQgIT0gJHRvLmRlcHRoIC0gc2xpY2Uub3BlbkVuZClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluY29uc2lzdGVudCBvcGVuIGRlcHRoc1wiKTtcbiAgICByZXR1cm4gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCAwKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGgpIHtcbiAgICBsZXQgaW5kZXggPSAkZnJvbS5pbmRleChkZXB0aCksIG5vZGUgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gJHRvLmluZGV4KGRlcHRoKSAmJiBkZXB0aCA8ICRmcm9tLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGggKyAxKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY29weShub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBpbm5lcikpO1xuICAgIH1cbiAgICBlbHNlIGlmICghc2xpY2UuY29udGVudC5zaXplKSB7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uZGVwdGggPT0gZGVwdGggJiYgJHRvLmRlcHRoID09IGRlcHRoKSB7IC8vIFNpbXBsZSwgZmxhdCBjYXNlXG4gICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5wYXJlbnQsIGNvbnRlbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNsb3NlKHBhcmVudCwgY29udGVudC5jdXQoMCwgJGZyb20ucGFyZW50T2Zmc2V0KS5hcHBlbmQoc2xpY2UuY29udGVudCkuYXBwZW5kKGNvbnRlbnQuY3V0KCR0by5wYXJlbnRPZmZzZXQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBwcmVwYXJlU2xpY2VGb3JSZXBsYWNlKHNsaWNlLCAkZnJvbSk7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVGhyZWVXYXkoJGZyb20sIHN0YXJ0LCBlbmQsICR0bywgZGVwdGgpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0pvaW4obWFpbiwgc3ViKSB7XG4gICAgaWYgKCFzdWIudHlwZS5jb21wYXRpYmxlQ29udGVudChtYWluLnR5cGUpKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiQ2Fubm90IGpvaW4gXCIgKyBzdWIudHlwZS5uYW1lICsgXCIgb250byBcIiArIG1haW4udHlwZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKCRiZWZvcmUsICRhZnRlciwgZGVwdGgpIHtcbiAgICBsZXQgbm9kZSA9ICRiZWZvcmUubm9kZShkZXB0aCk7XG4gICAgY2hlY2tKb2luKG5vZGUsICRhZnRlci5ub2RlKGRlcHRoKSk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBhZGROb2RlKGNoaWxkLCB0YXJnZXQpIHtcbiAgICBsZXQgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAodGFyZ2V0W2xhc3RdKSlcbiAgICAgICAgdGFyZ2V0W2xhc3RdID0gY2hpbGQud2l0aFRleHQodGFyZ2V0W2xhc3RdLnRleHQgKyBjaGlsZC50ZXh0KTtcbiAgICBlbHNlXG4gICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIHRhcmdldCkge1xuICAgIGxldCBub2RlID0gKCRlbmQgfHwgJHN0YXJ0KS5ub2RlKGRlcHRoKTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4ID0gJGVuZCA/ICRlbmQuaW5kZXgoZGVwdGgpIDogbm9kZS5jaGlsZENvdW50O1xuICAgIGlmICgkc3RhcnQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9ICRzdGFydC5pbmRleChkZXB0aCk7XG4gICAgICAgIGlmICgkc3RhcnQuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRzdGFydC50ZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICBhZGROb2RlKCRzdGFydC5ub2RlQWZ0ZXIsIHRhcmdldCk7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKVxuICAgICAgICBhZGROb2RlKG5vZGUuY2hpbGQoaSksIHRhcmdldCk7XG4gICAgaWYgKCRlbmQgJiYgJGVuZC5kZXB0aCA9PSBkZXB0aCAmJiAkZW5kLnRleHRPZmZzZXQpXG4gICAgICAgIGFkZE5vZGUoJGVuZC5ub2RlQmVmb3JlLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gY2xvc2Uobm9kZSwgY29udGVudCkge1xuICAgIG5vZGUudHlwZS5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgcmV0dXJuIG5vZGUuY29weShjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IG9wZW5TdGFydCA9ICRmcm9tLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKTtcbiAgICBsZXQgb3BlbkVuZCA9ICR0by5kZXB0aCA+IGRlcHRoICYmIGpvaW5hYmxlKCRlbmQsICR0bywgZGVwdGggKyAxKTtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmICRzdGFydC5pbmRleChkZXB0aCkgPT0gJGVuZC5pbmRleChkZXB0aCkpIHtcbiAgICAgICAgY2hlY2tKb2luKG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlblN0YXJ0LCByZXBsYWNlVGhyZWVXYXkoJGZyb20sICRzdGFydCwgJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlblN0YXJ0KVxuICAgICAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUd29XYXkoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgICAgICBhZGRSYW5nZSgkc3RhcnQsICRlbmQsIGRlcHRoLCBjb250ZW50KTtcbiAgICAgICAgaWYgKG9wZW5FbmQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5FbmQsIHJlcGxhY2VUd29XYXkoJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGFkZFJhbmdlKCR0bywgbnVsbCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCk7XG59XG5mdW5jdGlvbiByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXTtcbiAgICBhZGRSYW5nZShudWxsLCAkZnJvbSwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIGlmICgkZnJvbS5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgIGxldCB0eXBlID0gam9pbmFibGUoJGZyb20sICR0bywgZGVwdGggKyAxKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZSh0eXBlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRhbG9uZykge1xuICAgIGxldCBleHRyYSA9ICRhbG9uZy5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCwgcGFyZW50ID0gJGFsb25nLm5vZGUoZXh0cmEpO1xuICAgIGxldCBub2RlID0gcGFyZW50LmNvcHkoc2xpY2UuY29udGVudCk7XG4gICAgZm9yIChsZXQgaSA9IGV4dHJhIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIG5vZGUgPSAkYWxvbmcubm9kZShpKS5jb3B5KEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBub2RlLnJlc29sdmVOb0NhY2hlKHNsaWNlLm9wZW5TdGFydCArIGV4dHJhKSxcbiAgICAgICAgZW5kOiBub2RlLnJlc29sdmVOb0NhY2hlKG5vZGUuY29udGVudC5zaXplIC0gc2xpY2Uub3BlbkVuZCAtIGV4dHJhKSB9O1xufVxuXG4vKipcbllvdSBjYW4gW19yZXNvbHZlX10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVzb2x2ZSkgYSBwb3NpdGlvbiB0byBnZXQgbW9yZVxuaW5mb3JtYXRpb24gYWJvdXQgaXQuIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgc3VjaCBhXG5yZXNvbHZlZCBwb3NpdGlvbiwgcHJvdmlkaW5nIHZhcmlvdXMgcGllY2VzIG9mIGNvbnRleHRcbmluZm9ybWF0aW9uLCBhbmQgc29tZSBoZWxwZXIgbWV0aG9kcy5cblxuVGhyb3VnaG91dCB0aGlzIGludGVyZmFjZSwgbWV0aG9kcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgYGRlcHRoYFxucGFyYW1ldGVyIHdpbGwgaW50ZXJwcmV0IHVuZGVmaW5lZCBhcyBgdGhpcy5kZXB0aGAgYW5kIG5lZ2F0aXZlXG5udW1iZXJzIGFzIGB0aGlzLmRlcHRoICsgdmFsdWVgLlxuKi9cbmNsYXNzIFJlc29sdmVkUG9zIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiB0aGF0IHdhcyByZXNvbHZlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwYXRoLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IHRoaXMgcG9zaXRpb24gaGFzIGludG8gaXRzIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgcGFyZW50T2Zmc2V0KSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnBhcmVudE9mZnNldCA9IHBhcmVudE9mZnNldDtcbiAgICAgICAgdGhpcy5kZXB0aCA9IHBhdGgubGVuZ3RoIC8gMyAtIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZURlcHRoKHZhbCkge1xuICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aDtcbiAgICAgICAgaWYgKHZhbCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aCArIHZhbDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHBvc2l0aW9uIHBvaW50cyBpbnRvLiBOb3RlIHRoYXQgZXZlbiBpZlxuICAgIGEgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIHRoYXQgbm9kZSBpcyBub3QgY29uc2lkZXJlZFxuICAgIHRoZSBwYXJlbnTigJR0ZXh0IG5vZGVzIGFyZSDigJhmbGF04oCZIGluIHRoaXMgbW9kZWwsIGFuZCBoYXZlIG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgcGFyZW50KCkgeyByZXR1cm4gdGhpcy5ub2RlKHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIHJvb3Qgbm9kZSBpbiB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgZ2V0IGRvYygpIHsgcmV0dXJuIHRoaXMubm9kZSgwKTsgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNlc3RvciBub2RlIGF0IHRoZSBnaXZlbiBsZXZlbC4gYHAubm9kZShwLmRlcHRoKWAgaXMgdGhlXG4gICAgc2FtZSBhcyBgcC5wYXJlbnRgLlxuICAgICovXG4gICAgbm9kZShkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDNdOyB9XG4gICAgLyoqXG4gICAgVGhlIGluZGV4IGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZSBnaXZlbiBsZXZlbC4gSWYgdGhpcyBwb2ludHNcbiAgICBhdCB0aGUgM3JkIG5vZGUgaW4gdGhlIDJuZCBwYXJhZ3JhcGggb24gdGhlIHRvcCBsZXZlbCwgZm9yXG4gICAgZXhhbXBsZSwgYHAuaW5kZXgoMClgIGlzIDEgYW5kIGBwLmluZGV4KDEpYCBpcyAyLlxuICAgICovXG4gICAgaW5kZXgoZGVwdGgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnJlc29sdmVEZXB0aChkZXB0aCkgKiAzICsgMV07IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggcG9pbnRpbmcgYWZ0ZXIgdGhpcyBwb3NpdGlvbiBpbnRvIHRoZSBhbmNlc3RvciBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbC5cbiAgICAqL1xuICAgIGluZGV4QWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4KGRlcHRoKSArIChkZXB0aCA9PSB0aGlzLmRlcHRoICYmICF0aGlzLnRleHRPZmZzZXQgPyAwIDogMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW5cbiAgICBsZXZlbC5cbiAgICAqL1xuICAgIHN0YXJ0KGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gMCA/IDAgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgZW5kKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydChkZXB0aCkgKyB0aGlzLm5vZGUoZGVwdGgpLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYmVmb3JlIHRoZSB3cmFwcGluZyBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLCBvciwgd2hlbiBgZGVwdGhgIGlzIGB0aGlzLmRlcHRoICsgMWAsIHRoZSBvcmlnaW5hbFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgYmVmb3JlKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBiZWZvcmUgdGhlIHRvcC1sZXZlbCBub2RlXCIpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gdGhpcy5kZXB0aCArIDEgPyB0aGlzLnBvcyA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYWZ0ZXIgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYC5cbiAgICAqL1xuICAgIGFmdGVyKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBhZnRlciB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgdGhpcy5wYXRoW2RlcHRoICogM10ubm9kZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhpcyBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhpcyByZXR1cm5zIHRoZVxuICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgbm9kZS5cbiAgICBXaWxsIGJlIHplcm8gZm9yIHBvc2l0aW9ucyB0aGF0IHBvaW50IGJldHdlZW4gbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgdGV4dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlIHBvc2l0aW9uXG4gICAgcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlIGFmdGVyIHRoZVxuICAgIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZ2V0IG5vZGVBZnRlcigpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50LCBpbmRleCA9IHRoaXMuaW5kZXgodGhpcy5kZXB0aCk7XG4gICAgICAgIGlmIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXSwgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gZE9mZiA/IHBhcmVudC5jaGlsZChpbmRleCkuY3V0KGRPZmYpIDogY2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBiZWZvcmUgdGhlIHBvc2l0aW9uLCBpZiBhbnkuIElmIHRoZVxuICAgIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IG9mIHRoYXQgbm9kZVxuICAgIGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUJlZm9yZSgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgbGV0IGRPZmYgPSB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChkT2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkKGluZGV4KS5jdXQoMCwgZE9mZik7XG4gICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gbnVsbCA6IHRoaXMucGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcG9zaXRpb24gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBwYXJlbnQgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBkZXB0aCAod2hpY2ggZGVmYXVsdHMgdG8gYHRoaXMuZGVwdGhgKS5cbiAgICAqL1xuICAgIHBvc0F0SW5kZXgoaW5kZXgsIGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMucGF0aFtkZXB0aCAqIDNdLCBwb3MgPSBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgIHBvcyArPSBub2RlLmNoaWxkKGkpLm5vZGVTaXplO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGF0IHRoaXMgcG9zaXRpb24sIGZhY3RvcmluZyBpbiB0aGUgc3Vycm91bmRpbmdcbiAgICBtYXJrcycgW2BpbmNsdXNpdmVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuaW5jbHVzaXZlKSBwcm9wZXJ0eS4gSWYgdGhlXG4gICAgcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRoZSBtYXJrcyBvZiB0aGVcbiAgICBub2RlIGFmdGVyIGl0IChpZiBhbnkpIGFyZSByZXR1cm5lZC5cbiAgICAqL1xuICAgIG1hcmtzKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgICAvLyBJbiBhbiBlbXB0eSBwYXJlbnQsIHJldHVybiB0aGUgZW1wdHkgYXJyYXlcbiAgICAgICAgaWYgKHBhcmVudC5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIC8vIFdoZW4gaW5zaWRlIGEgdGV4dCBub2RlLCBqdXN0IHJldHVybiB0aGUgdGV4dCBub2RlJ3MgbWFya3NcbiAgICAgICAgaWYgKHRoaXMudGV4dE9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY2hpbGQoaW5kZXgpLm1hcmtzO1xuICAgICAgICBsZXQgbWFpbiA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4IC0gMSksIG90aGVyID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAvLyBJZiB0aGUgYGFmdGVyYCBmbGFnIGlzIHRydWUgb2YgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUsIG1ha2VcbiAgICAgICAgLy8gdGhlIG5vZGUgYWZ0ZXIgdGhpcyBwb3NpdGlvbiB0aGUgbWFpbiByZWZlcmVuY2UuXG4gICAgICAgIGlmICghbWFpbikge1xuICAgICAgICAgICAgbGV0IHRtcCA9IG1haW47XG4gICAgICAgICAgICBtYWluID0gb3RoZXI7XG4gICAgICAgICAgICBvdGhlciA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgYWxsIG1hcmtzIGluIHRoZSBtYWluIG5vZGUsIGV4Y2VwdCB0aG9zZSB0aGF0IGhhdmVcbiAgICAgICAgLy8gYGluY2x1c2l2ZWAgc2V0IHRvIGZhbHNlIGFuZCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG90aGVyIG5vZGUuXG4gICAgICAgIGxldCBtYXJrcyA9IG1haW4ubWFya3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFvdGhlciB8fCAhbWFya3NbaV0uaXNJblNldChvdGhlci5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpZiBhbnksIGV4Y2VwdCB0aG9zZVxuICAgIHRoYXQgYXJlIG5vbi1pbmNsdXNpdmUgYW5kIG5vdCBwcmVzZW50IGF0IHBvc2l0aW9uIGAkZW5kYC4gVGhpc1xuICAgIGlzIG1vc3RseSB1c2VmdWwgZm9yIGdldHRpbmcgdGhlIHNldCBvZiBtYXJrcyB0byBwcmVzZXJ2ZSBhZnRlciBhXG4gICAgZGVsZXRpb24uIFdpbGwgcmV0dXJuIGBudWxsYCBpZiB0aGlzIHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGUgb3IgaXRzIHBhcmVudCBub2RlIGlzbid0IGEgdGV4dGJsb2NrIChpbiB3aGljaFxuICAgIGNhc2Ugbm8gbWFya3Mgc2hvdWxkIGJlIHByZXNlcnZlZCkuXG4gICAgKi9cbiAgICBtYXJrc0Fjcm9zcygkZW5kKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMucGFyZW50Lm1heWJlQ2hpbGQodGhpcy5pbmRleCgpKTtcbiAgICAgICAgaWYgKCFhZnRlciB8fCAhYWZ0ZXIuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG1hcmtzID0gYWZ0ZXIubWFya3MsIG5leHQgPSAkZW5kLnBhcmVudC5tYXliZUNoaWxkKCRlbmQuaW5kZXgoKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFuZXh0IHx8ICFtYXJrc1tpXS5pc0luU2V0KG5leHQubWFya3MpKSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzW2ktLV0ucmVtb3ZlRnJvbVNldChtYXJrcyk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIHVwIHRvIHdoaWNoIHRoaXMgcG9zaXRpb24gYW5kIHRoZSBnaXZlbiAobm9uLXJlc29sdmVkKVxuICAgIHBvc2l0aW9uIHNoYXJlIHRoZSBzYW1lIHBhcmVudCBub2Rlcy5cbiAgICAqL1xuICAgIHNoYXJlZERlcHRoKHBvcykge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGgtLSlcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0KGRlcHRoKSA8PSBwb3MgJiYgdGhpcy5lbmQoZGVwdGgpID49IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcmFuZ2UgYmFzZWQgb24gdGhlIHBsYWNlIHdoZXJlIHRoaXMgcG9zaXRpb24gYW5kIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uIGRpdmVyZ2UgYXJvdW5kIGJsb2NrIGNvbnRlbnQuIElmIGJvdGggcG9pbnQgaW50b1xuICAgIHRoZSBzYW1lIHRleHRibG9jaywgZm9yIGV4YW1wbGUsIGEgcmFuZ2UgYXJvdW5kIHRoYXQgdGV4dGJsb2NrXG4gICAgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhleSBwb2ludCBpbnRvIGRpZmZlcmVudCBibG9ja3MsIHRoZSByYW5nZVxuICAgIGFyb3VuZCB0aG9zZSBibG9ja3MgaW4gdGhlaXIgc2hhcmVkIGFuY2VzdG9yIGlzIHJldHVybmVkLiBZb3UgY2FuXG4gICAgcGFzcyBpbiBhbiBvcHRpb25hbCBwcmVkaWNhdGUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcGFyZW50XG4gICAgbm9kZSB0byBzZWUgaWYgYSByYW5nZSBpbnRvIHRoYXQgcGFyZW50IGlzIGFjY2VwdGFibGUuXG4gICAgKi9cbiAgICBibG9ja1JhbmdlKG90aGVyID0gdGhpcywgcHJlZCkge1xuICAgICAgICBpZiAob3RoZXIucG9zIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuYmxvY2tSYW5nZSh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZCA9IHRoaXMuZGVwdGggLSAodGhpcy5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB0aGlzLnBvcyA9PSBvdGhlci5wb3MgPyAxIDogMCk7IGQgPj0gMDsgZC0tKVxuICAgICAgICAgICAgaWYgKG90aGVyLnBvcyA8PSB0aGlzLmVuZChkKSAmJiAoIXByZWQgfHwgcHJlZCh0aGlzLm5vZGUoZCkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVSYW5nZSh0aGlzLCBvdGhlciwgZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiBzaGFyZXMgdGhlIHNhbWUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBzYW1lUGFyZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyAtIHRoaXMucGFyZW50T2Zmc2V0ID09IG90aGVyLnBvcyAtIG90aGVyLnBhcmVudE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1heChvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zID4gdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgc21hbGxlciBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBtaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLnBvcyA8IHRoaXMucG9zID8gb3RoZXIgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy5kZXB0aDsgaSsrKVxuICAgICAgICAgICAgc3RyICs9IChzdHIgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy5ub2RlKGkpLnR5cGUubmFtZSArIFwiX1wiICsgdGhpcy5pbmRleChpIC0gMSk7XG4gICAgICAgIHJldHVybiBzdHIgKyBcIjpcIiArIHRoaXMucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKGRvYywgcG9zKSB7XG4gICAgICAgIGlmICghKHBvcyA+PSAwICYmIHBvcyA8PSBkb2MuY29udGVudC5zaXplKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIGxldCBwYXRoID0gW107XG4gICAgICAgIGxldCBzdGFydCA9IDAsIHBhcmVudE9mZnNldCA9IHBvcztcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IGRvYzs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBsZXQgcmVtID0gcGFyZW50T2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUsIGluZGV4LCBzdGFydCArIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoIXJlbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBhcmVudE9mZnNldCA9IHJlbSAtIDE7XG4gICAgICAgICAgICBzdGFydCArPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQb3MocG9zLCBwYXRoLCBwYXJlbnRPZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlQ2FjaGVkKGRvYywgcG9zKSB7XG4gICAgICAgIGxldCBjYWNoZSA9IHJlc29sdmVDYWNoZS5nZXQoZG9jKTtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLmVsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZWx0ID0gY2FjaGUuZWx0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZWx0LnBvcyA9PSBwb3MpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlQ2FjaGUuc2V0KGRvYywgY2FjaGUgPSBuZXcgUmVzb2x2ZUNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gY2FjaGUuZWx0c1tjYWNoZS5pXSA9IFJlc29sdmVkUG9zLnJlc29sdmUoZG9jLCBwb3MpO1xuICAgICAgICBjYWNoZS5pID0gKGNhY2hlLmkgKyAxKSAlIHJlc29sdmVDYWNoZVNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuY2xhc3MgUmVzb2x2ZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbHRzID0gW107XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgfVxufVxuY29uc3QgcmVzb2x2ZUNhY2hlU2l6ZSA9IDEyLCByZXNvbHZlQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG5SZXByZXNlbnRzIGEgZmxhdCByYW5nZSBvZiBjb250ZW50LCBpLmUuIG9uZSB0aGF0IHN0YXJ0cyBhbmRcbmVuZHMgaW4gdGhlIHNhbWUgbm9kZS5cbiovXG5jbGFzcyBOb2RlUmFuZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5vZGUgcmFuZ2UuIGAkZnJvbWAgYW5kIGAkdG9gIHNob3VsZCBwb2ludCBpbnRvIHRoZVxuICAgIHNhbWUgbm9kZSB1bnRpbCBhdCBsZWFzdCB0aGUgZ2l2ZW4gYGRlcHRoYCwgc2luY2UgYSBub2RlIHJhbmdlXG4gICAgZGVub3RlcyBhbiBhZGphY2VudCBzZXQgb2Ygbm9kZXMgaW4gYSBzaW5nbGUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBBIHJlc29sdmVkIHBvc2l0aW9uIGFsb25nIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gTWF5IGhhdmUgYVxuICAgIGBkZXB0aGAgZ3JlYXRlciB0aGFuIHRoaXMgb2JqZWN0J3MgYGRlcHRoYCBwcm9wZXJ0eSwgc2luY2VcbiAgICB0aGVzZSBhcmUgdGhlIHBvc2l0aW9ucyB0aGF0IHdlcmUgdXNlZCB0byBjb21wdXRlIHRoZSByYW5nZSxcbiAgICBub3QgcmUtcmVzb2x2ZWQgcG9zaXRpb25zIGRpcmVjdGx5IGF0IGl0cyBib3VuZGFyaWVzLlxuICAgICovXG4gICAgJGZyb20sIFxuICAgIC8qKlxuICAgIEEgcG9zaXRpb24gYWxvbmcgdGhlIGVuZCBvZiB0aGUgY29udGVudC4gU2VlXG4gICAgY2F2ZWF0IGZvciBbYCRmcm9tYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZS4kZnJvbSkuXG4gICAgKi9cbiAgICAkdG8sIFxuICAgIC8qKlxuICAgIFRoZSBkZXB0aCBvZiB0aGUgbm9kZSB0aGF0IHRoaXMgcmFuZ2UgcG9pbnRzIGludG8uXG4gICAgKi9cbiAgICBkZXB0aCkge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgICAgICB0aGlzLmRlcHRoID0gZGVwdGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy4kZnJvbS5iZWZvcmUodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuJHRvLmFmdGVyKHRoaXMuZGVwdGggKyAxKTsgfVxuICAgIC8qKlxuICAgIFRoZSBwYXJlbnQgbm9kZSB0aGF0IHRoZSByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLm5vZGUodGhpcy5kZXB0aCk7IH1cbiAgICAvKipcbiAgICBUaGUgc3RhcnQgaW5kZXggb2YgdGhlIHJhbmdlIGluIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBzdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy4kZnJvbS5pbmRleCh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBlbmQgaW5kZXggb2YgdGhlIHJhbmdlIGluIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBlbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuJHRvLmluZGV4QWZ0ZXIodGhpcy5kZXB0aCk7IH1cbn1cblxuY29uc3QgZW1wdHlBdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcblRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIHRyZWUgdGhhdCBtYWtlcyB1cCBhXG5Qcm9zZU1pcnJvciBkb2N1bWVudC4gU28gYSBkb2N1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAsIHdpdGhcbmNoaWxkcmVuIHRoYXQgYXJlIGFsc28gaW5zdGFuY2VzIG9mIGBOb2RlYC5cblxuTm9kZXMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLiBJbnN0ZWFkIG9mIGNoYW5naW5nIHRoZW0sIHlvdVxuY3JlYXRlIG5ldyBvbmVzIHdpdGggdGhlIGNvbnRlbnQgeW91IHdhbnQuIE9sZCBvbmVzIGtlZXAgcG9pbnRpbmdcbmF0IHRoZSBvbGQgZG9jdW1lbnQgc2hhcGUuIFRoaXMgaXMgbWFkZSBjaGVhcGVyIGJ5IHNoYXJpbmdcbnN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBvbGQgYW5kIG5ldyBkYXRhIGFzIG11Y2ggYXMgcG9zc2libGUsIHdoaWNoIGFcbnRyZWUgc2hhcGUgbGlrZSB0aGlzICh3aXRob3V0IGJhY2sgcG9pbnRlcnMpIG1ha2VzIGVhc3kuXG5cbioqRG8gbm90KiogZGlyZWN0bHkgbXV0YXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGEgYE5vZGVgIG9iamVjdC4gU2VlXG5bdGhlIGd1aWRlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyNkb2MpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuKi9cbmNsYXNzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgaXMuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLiBUaGUga2luZCBvZlxuICAgIGF0dHJpYnV0ZXMgYWxsb3dlZCBhbmQgcmVxdWlyZWQgYXJlXG4gICAgW2RldGVybWluZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5hdHRycykgYnkgdGhlIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGF0dHJzLCBcbiAgICAvLyBBIGZyYWdtZW50IGhvbGRpbmcgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgbWFya3MgKHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQgaXMgZW1waGFzaXplZCBvciBwYXJ0IG9mIGFcbiAgICBsaW5rKSBhcHBsaWVkIHRvIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIG1hcmtzID0gTWFyay5ub25lKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IEZyYWdtZW50LmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgYXJyYXkgb2YgdGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudDsgfVxuICAgIC8qKlxuICAgIFRoZSBzaXplIG9mIHRoaXMgbm9kZSwgYXMgZGVmaW5lZCBieSB0aGUgaW50ZWdlci1iYXNlZCBbaW5kZXhpbmdcbiAgICBzY2hlbWVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI2RvYy5pbmRleGluZykuIEZvciB0ZXh0IG5vZGVzLCB0aGlzIGlzIHRoZVxuICAgIGFtb3VudCBvZiBjaGFyYWN0ZXJzLiBGb3Igb3RoZXIgbGVhZiBub2RlcywgaXQgaXMgb25lLiBGb3JcbiAgICBub24tbGVhZiBub2RlcywgaXQgaXMgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcGx1cyB0d28gKHRoZVxuICAgIHN0YXJ0IGFuZCBlbmQgdG9rZW4pLlxuICAgICovXG4gICAgZ2V0IG5vZGVTaXplKCkgeyByZXR1cm4gdGhpcy5pc0xlYWYgPyAxIDogMiArIHRoaXMuY29udGVudC5zaXplOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IHRoZSBub2RlIGhhcy5cbiAgICAqL1xuICAgIGdldCBjaGlsZENvdW50KCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkQ291bnQ7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LiBSYWlzZXMgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkKGluZGV4KTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5tYXliZUNoaWxkKGluZGV4KTsgfVxuICAgIC8qKlxuICAgIENhbGwgYGZgIGZvciBldmVyeSBjaGlsZCBub2RlLCBwYXNzaW5nIHRoZSBub2RlLCBpdHMgb2Zmc2V0XG4gICAgaW50byB0aGlzIHBhcmVudCBub2RlLCBhbmQgaXRzIGluZGV4LlxuICAgICovXG4gICAgZm9yRWFjaChmKSB7IHRoaXMuY29udGVudC5mb3JFYWNoKGYpOyB9XG4gICAgLyoqXG4gICAgSW52b2tlIGEgY2FsbGJhY2sgZm9yIGFsbCBkZXNjZW5kYW50IG5vZGVzIHJlY3Vyc2l2ZWx5IGJldHdlZW5cbiAgICB0aGUgZ2l2ZW4gdHdvIHBvc2l0aW9ucyB0aGF0IGFyZSByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzXG4gICAgbm9kZSdzIGNvbnRlbnQuIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggdGhlIG5vZGUsIGl0c1xuICAgIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBub2RlIChtZXRob2QgcmVjZWl2ZXIpLFxuICAgIGl0cyBwYXJlbnQgbm9kZSwgYW5kIGl0cyBjaGlsZCBpbmRleC4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGZhbHNlIGZvciBhIGdpdmVuIG5vZGUsIHRoYXQgbm9kZSdzIGNoaWxkcmVuIHdpbGwgbm90IGJlXG4gICAgcmVjdXJzZWQgb3Zlci4gVGhlIGxhc3QgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYVxuICAgIHN0YXJ0aW5nIHBvc2l0aW9uIHRvIGNvdW50IGZyb20uXG4gICAgKi9cbiAgICBub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zID0gMCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBzdGFydFBvcywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIERvZXNuJ3RcbiAgICBkZXNjZW5kIGludG8gYSBub2RlIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgYGZhbHNlYC5cbiAgICAqL1xuICAgIGRlc2NlbmRhbnRzKGYpIHtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb25jYXRlbmF0ZXMgYWxsIHRoZSB0ZXh0IG5vZGVzIGZvdW5kIGluIHRoaXMgZnJhZ21lbnQgYW5kIGl0c1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IHRleHRDb250ZW50KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNMZWFmICYmIHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KVxuICAgICAgICAgICAgPyB0aGlzLnR5cGUuc3BlYy5sZWFmVGV4dCh0aGlzKVxuICAgICAgICAgICAgOiB0aGlzLnRleHRCZXR3ZWVuKDAsIHRoaXMuY29udGVudC5zaXplLCBcIlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGFsbCB0ZXh0IGJldHdlZW4gcG9zaXRpb25zIGBmcm9tYCBhbmQgYHRvYC4gV2hlblxuICAgIGBibG9ja1NlcGFyYXRvcmAgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgaW5zZXJ0ZWQgdG8gc2VwYXJhdGUgdGV4dFxuICAgIGZyb20gZGlmZmVyZW50IGJsb2NrIG5vZGVzLiBJZiBgbGVhZlRleHRgIGlzIGdpdmVuLCBpdCdsbCBiZVxuICAgIGluc2VydGVkIGZvciBldmVyeSBub24tdGV4dCBsZWFmIG5vZGUgZW5jb3VudGVyZWQsIG90aGVyd2lzZVxuICAgIFtgbGVhZlRleHRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWNebGVhZlRleHQpIHdpbGwgYmUgdXNlZC5cbiAgICAqL1xuICAgIHRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhpcyBub2RlJ3MgbGFzdCBjaGlsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sYXN0Q2hpbGQ7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIG5vZGVzIHJlcHJlc2VudCB0aGUgc2FtZSBwaWVjZSBvZiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8ICh0aGlzLnNhbWVNYXJrdXAob3RoZXIpICYmIHRoaXMuY29udGVudC5lcShvdGhlci5jb250ZW50KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIG1hcmt1cCAodHlwZSwgYXR0cmlidXRlcywgYW5kIG1hcmtzKSBvZiB0aGlzIG5vZGUgdG9cbiAgICB0aG9zZSBvZiBhbm90aGVyLiBSZXR1cm5zIGB0cnVlYCBpZiBib3RoIGhhdmUgdGhlIHNhbWUgbWFya3VwLlxuICAgICovXG4gICAgc2FtZU1hcmt1cChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNNYXJrdXAob3RoZXIudHlwZSwgb3RoZXIuYXR0cnMsIG90aGVyLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIG5vZGUncyBtYXJrdXAgY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gdHlwZSxcbiAgICBhdHRyaWJ1dGVzLCBhbmQgbWFya3MuXG4gICAgKi9cbiAgICBoYXNNYXJrdXAodHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gdHlwZSAmJlxuICAgICAgICAgICAgY29tcGFyZURlZXAodGhpcy5hdHRycywgYXR0cnMgfHwgdHlwZS5kZWZhdWx0QXR0cnMgfHwgZW1wdHlBdHRycykgJiZcbiAgICAgICAgICAgIE1hcmsuc2FtZVNldCh0aGlzLm1hcmtzLCBtYXJrcyB8fCBNYXJrLm5vbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSBzYW1lIG1hcmt1cCBhcyB0aGlzIG5vZGUsIGNvbnRhaW5pbmdcbiAgICB0aGUgZ2l2ZW4gY29udGVudCAob3IgZW1wdHksIGlmIG5vIGNvbnRlbnQgaXMgZ2l2ZW4pLlxuICAgICovXG4gICAgY29weShjb250ZW50ID0gbnVsbCkge1xuICAgICAgICBpZiAoY29udGVudCA9PSB0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgY29udGVudCwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlLCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgaW5zdGVhZFxuICAgIG9mIHRoZSBub2RlJ3Mgb3duIG1hcmtzLlxuICAgICovXG4gICAgbWFyayhtYXJrcykge1xuICAgICAgICByZXR1cm4gbWFya3MgPT0gdGhpcy5tYXJrcyA/IHRoaXMgOiBuZXcgTm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMuY29udGVudCwgbWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbnMuIElmIGB0b2AgaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mXG4gICAgdGhlIG5vZGUuXG4gICAgKi9cbiAgICBjdXQoZnJvbSwgdG8gPSB0aGlzLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LmN1dChmcm9tLCB0bykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMsIGFuZFxuICAgIHJldHVybiBpdCBhcyBhIGBTbGljZWAgb2JqZWN0LlxuICAgICovXG4gICAgc2xpY2UoZnJvbSwgdG8gPSB0aGlzLmNvbnRlbnQuc2l6ZSwgaW5jbHVkZVBhcmVudHMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSB0bylcbiAgICAgICAgICAgIHJldHVybiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0aGlzLnJlc29sdmUodG8pO1xuICAgICAgICBsZXQgZGVwdGggPSBpbmNsdWRlUGFyZW50cyA/IDAgOiAkZnJvbS5zaGFyZWREZXB0aCh0byk7XG4gICAgICAgIGxldCBzdGFydCA9ICRmcm9tLnN0YXJ0KGRlcHRoKSwgbm9kZSA9ICRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgICBsZXQgY29udGVudCA9IG5vZGUuY29udGVudC5jdXQoJGZyb20ucG9zIC0gc3RhcnQsICR0by5wb3MgLSBzdGFydCk7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UoY29udGVudCwgJGZyb20uZGVwdGggLSBkZXB0aCwgJHRvLmRlcHRoIC0gZGVwdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMgd2l0aFxuICAgIHRoZSBnaXZlbiBzbGljZS4gVGhlIHNsaWNlIG11c3QgJ2ZpdCcsIG1lYW5pbmcgaXRzIG9wZW4gc2lkZXNcbiAgICBtdXN0IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc3Vycm91bmRpbmcgY29udGVudCwgYW5kIGl0c1xuICAgIGNvbnRlbnQgbm9kZXMgbXVzdCBiZSB2YWxpZCBjaGlsZHJlbiBmb3IgdGhlIG5vZGUgdGhleSBhcmUgcGxhY2VkXG4gICAgaW50by4gSWYgYW55IG9mIHRoaXMgaXMgdmlvbGF0ZWQsIGFuIGVycm9yIG9mIHR5cGVcbiAgICBbYFJlcGxhY2VFcnJvcmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5SZXBsYWNlRXJyb3IpIGlzIHRocm93bi5cbiAgICAqL1xuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlKHRoaXMucmVzb2x2ZShmcm9tKSwgdGhpcy5yZXNvbHZlKHRvKSwgc2xpY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBub2RlIGRpcmVjdGx5IGFmdGVyIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG5vZGVBdChwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRoaXM7Oykge1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IHBvcyB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIHBvcyAtPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIChkaXJlY3QpIGNoaWxkIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQWZ0ZXIocG9zKSB7XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpLCBpbmRleCwgb2Zmc2V0IH07XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIChkaXJlY3QpIGNoaWxkIG5vZGUgYmVmb3JlIHRoZSBnaXZlbiBvZmZzZXQsIGlmIGFueSxcbiAgICBhbmQgcmV0dXJuIGl0IGFsb25nIHdpdGggaXRzIGluZGV4IGFuZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhpc1xuICAgIG5vZGUuXG4gICAgKi9cbiAgICBjaGlsZEJlZm9yZShwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbnVsbCwgaW5kZXg6IDAsIG9mZnNldDogMCB9O1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSB0aGlzLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgIGlmIChvZmZzZXQgPCBwb3MpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpLCBpbmRleCwgb2Zmc2V0IH07XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5jb250ZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgIHJldHVybiB7IG5vZGUsIGluZGV4OiBpbmRleCAtIDEsIG9mZnNldDogb2Zmc2V0IC0gbm9kZS5ub2RlU2l6ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNvbHZlIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQsIHJldHVybmluZyBhblxuICAgIFtvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5SZXNvbHZlZFBvcykgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY29udGV4dC5cbiAgICAqL1xuICAgIHJlc29sdmUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlQ2FjaGVkKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc29sdmVOb0NhY2hlKHBvcykgeyByZXR1cm4gUmVzb2x2ZWRQb3MucmVzb2x2ZSh0aGlzLCBwb3MpOyB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gbWFyayBvciBtYXJrIHR5cGUgb2NjdXJzIGluIHRoaXMgZG9jdW1lbnRcbiAgICBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgICovXG4gICAgcmFuZ2VIYXNNYXJrKGZyb20sIHRvLCB0eXBlKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWZvdW5kO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBibG9jayAobm9uLWlubGluZSBub2RlKVxuICAgICovXG4gICAgZ2V0IGlzQmxvY2soKSB7IHJldHVybiB0aGlzLnR5cGUuaXNCbG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dGJsb2NrIG5vZGUsIGEgYmxvY2sgbm9kZSB3aXRoIGlubGluZVxuICAgIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0YmxvY2soKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0YmxvY2s7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGFsbG93cyBpbmxpbmUgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpbmxpbmVDb250ZW50KCkgeyByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhbiBpbmxpbmUgbm9kZSAoYSB0ZXh0IG5vZGUgb3IgYSBub2RlIHRoYXQgY2FuXG4gICAgYXBwZWFyIGFtb25nIHRleHQpLlxuICAgICovXG4gICAgZ2V0IGlzSW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzSW5saW5lOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0IG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0KCkgeyByZXR1cm4gdGhpcy50eXBlLmlzVGV4dDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzTGVhZigpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0xlYWY7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhbiBhdG9tLCBpLmUuIHdoZW4gaXQgZG9lcyBub3QgaGF2ZSBkaXJlY3RseVxuICAgIGVkaXRhYmxlIGNvbnRlbnQuIFRoaXMgaXMgdXN1YWxseSB0aGUgc2FtZSBhcyBgaXNMZWFmYCwgYnV0IGNhblxuICAgIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgW2BhdG9tYCBwcm9wZXJ0eV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmF0b20pXG4gICAgb24gYSBub2RlJ3Mgc3BlYyAodHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBpcyBkaXNwbGF5ZWQgYXNcbiAgICBhbiB1bmVkaXRhYmxlIFtub2RlIHZpZXddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3Lk5vZGVWaWV3KSkuXG4gICAgKi9cbiAgICBnZXQgaXNBdG9tKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzQXRvbTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgZm9yIGRlYnVnZ2luZ1xuICAgIHB1cnBvc2VzLlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcodGhpcyk7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy50eXBlLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG5hbWUgKz0gXCIoXCIgKyB0aGlzLmNvbnRlbnQudG9TdHJpbmdJbm5lcigpICsgXCIpXCI7XG4gICAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgbmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29udGVudCBtYXRjaCBpbiB0aGlzIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICovXG4gICAgY29udGVudE1hdGNoQXQoaW5kZXgpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgMCwgaW5kZXgpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGVkIGNvbnRlbnRNYXRjaEF0IG9uIGEgbm9kZSB3aXRoIGludmFsaWQgY29udGVudFwiKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgcmVwbGFjaW5nIHRoZSByYW5nZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCAoYnlcbiAgICBjaGlsZCBpbmRleCkgd2l0aCB0aGUgZ2l2ZW4gcmVwbGFjZW1lbnQgZnJhZ21lbnQgKHdoaWNoIGRlZmF1bHRzXG4gICAgdG8gdGhlIGVtcHR5IGZyYWdtZW50KSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuIFlvdVxuICAgIGNhbiBvcHRpb25hbGx5IHBhc3MgYHN0YXJ0YCBhbmQgYGVuZGAgaW5kaWNlcyBpbnRvIHRoZVxuICAgIHJlcGxhY2VtZW50IGZyYWdtZW50LlxuICAgICovXG4gICAgY2FuUmVwbGFjZShmcm9tLCB0bywgcmVwbGFjZW1lbnQgPSBGcmFnbWVudC5lbXB0eSwgc3RhcnQgPSAwLCBlbmQgPSByZXBsYWNlbWVudC5jaGlsZENvdW50KSB7XG4gICAgICAgIGxldCBvbmUgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoRnJhZ21lbnQocmVwbGFjZW1lbnQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICBsZXQgdHdvID0gb25lICYmIG9uZS5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgdG8pO1xuICAgICAgICBpZiAoIXR3byB8fCAhdHdvLnZhbGlkRW5kKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlLmFsbG93c01hcmtzKHJlcGxhY2VtZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgcmVwbGFjaW5nIHRoZSByYW5nZSBgZnJvbWAgdG8gYHRvYCAoYnkgaW5kZXgpIHdpdGhcbiAgICBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgd291bGQgbGVhdmUgdGhlIG5vZGUncyBjb250ZW50IHZhbGlkLlxuICAgICovXG4gICAgY2FuUmVwbGFjZVdpdGgoZnJvbSwgdG8sIHR5cGUsIG1hcmtzKSB7XG4gICAgICAgIGlmIChtYXJrcyAmJiAhdGhpcy50eXBlLmFsbG93c01hcmtzKG1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jb250ZW50TWF0Y2hBdChmcm9tKS5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydCAmJiBzdGFydC5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgdG8pO1xuICAgICAgICByZXR1cm4gZW5kID8gZW5kLnZhbGlkRW5kIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSdzIGNvbnRlbnQgY291bGQgYmUgYXBwZW5kZWQgdG8gdGhpc1xuICAgIG5vZGUuIElmIHRoYXQgbm9kZSBpcyBlbXB0eSwgdGhpcyB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlcmVcbiAgICBpcyBhdCBsZWFzdCBvbmUgbm9kZSB0eXBlIHRoYXQgY2FuIGFwcGVhciBpbiBib3RoIG5vZGVzICh0byBhdm9pZFxuICAgIG1lcmdpbmcgY29tcGxldGVseSBpbmNvbXBhdGlibGUgbm9kZXMpLlxuICAgICovXG4gICAgY2FuQXBwZW5kKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlci5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW5SZXBsYWNlKHRoaXMuY2hpbGRDb3VudCwgdGhpcy5jaGlsZENvdW50LCBvdGhlci5jb250ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5jb21wYXRpYmxlQ29udGVudChvdGhlci50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyBjb25mb3JtIHRvIHRoZVxuICAgIHNjaGVtYSwgYW5kIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZXkgZG8gbm90LlxuICAgICovXG4gICAgY2hlY2soKSB7XG4gICAgICAgIHRoaXMudHlwZS5jaGVja0NvbnRlbnQodGhpcy5jb250ZW50KTtcbiAgICAgICAgdGhpcy50eXBlLmNoZWNrQXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIGxldCBjb3B5ID0gTWFyay5ub25lO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXJrID0gdGhpcy5tYXJrc1tpXTtcbiAgICAgICAgICAgIG1hcmsudHlwZS5jaGVja0F0dHJzKG1hcmsuYXR0cnMpO1xuICAgICAgICAgICAgY29weSA9IG1hcmsuYWRkVG9TZXQoY29weSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQoY29weSwgdGhpcy5tYXJrcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb2xsZWN0aW9uIG9mIG1hcmtzIGZvciBub2RlICR7dGhpcy50eXBlLm5hbWV9OiAke3RoaXMubWFya3MubWFwKG0gPT4gbS50eXBlLm5hbWUpfWApO1xuICAgICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChub2RlID0+IG5vZGUuY2hlY2soKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG9iai5jb250ZW50ID0gdGhpcy5jb250ZW50LnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICBvYmoubWFya3MgPSB0aGlzLm1hcmtzLm1hcChuID0+IG4udG9KU09OKCkpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgbWFya3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChqc29uLm1hcmtzKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbi5tYXJrcykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIG1hcmsgZGF0YSBmb3IgTm9kZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgICAgIG1hcmtzID0ganNvbi5tYXJrcy5tYXAoc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb24udHlwZSA9PSBcInRleHRcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uLnRleHQgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGV4dCBub2RlIGluIEpTT05cIik7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLnRleHQoanNvbi50ZXh0LCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCk7XG4gICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSkuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICAgICAgbm9kZS50eXBlLmNoZWNrQXR0cnMobm9kZS5hdHRycyk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbk5vZGUucHJvdG90eXBlLnRleHQgPSB1bmRlZmluZWQ7XG5jbGFzcyBUZXh0Tm9kZSBleHRlbmRzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIGF0dHJzLCBudWxsLCBtYXJrcyk7XG4gICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRW1wdHkgdGV4dCBub2RlcyBhcmUgbm90IGFsbG93ZWRcIik7XG4gICAgICAgIHRoaXMudGV4dCA9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKHRoaXMpO1xuICAgICAgICByZXR1cm4gd3JhcE1hcmtzKHRoaXMubWFya3MsIEpTT04uc3RyaW5naWZ5KHRoaXMudGV4dCkpO1xuICAgIH1cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7IHJldHVybiB0aGlzLnRleHQ7IH1cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bykgeyByZXR1cm4gdGhpcy50ZXh0LnNsaWNlKGZyb20sIHRvKTsgfVxuICAgIGdldCBub2RlU2l6ZSgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMudGV4dCwgbWFya3MpO1xuICAgIH1cbiAgICB3aXRoVGV4dCh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ID09IHRoaXMudGV4dClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGV4dCwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICAgIGN1dChmcm9tID0gMCwgdG8gPSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy50ZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoVGV4dCh0aGlzLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy50ZXh0ID09IG90aGVyLnRleHQ7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGJhc2UgPSBzdXBlci50b0pTT04oKTtcbiAgICAgICAgYmFzZS50ZXh0ID0gdGhpcy50ZXh0O1xuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3MobWFya3MsIHN0cikge1xuICAgIGZvciAobGV0IGkgPSBtYXJrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgc3RyID0gbWFya3NbaV0udHlwZS5uYW1lICsgXCIoXCIgKyBzdHIgKyBcIilcIjtcbiAgICByZXR1cm4gc3RyO1xufVxuXG4vKipcbkluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIG1hdGNoIHN0YXRlIG9mIGEgbm9kZSB0eXBlJ3Ncbltjb250ZW50IGV4cHJlc3Npb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5jb250ZW50KSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5maW5kIG91dCB3aGV0aGVyIGZ1cnRoZXIgY29udGVudCBtYXRjaGVzIGhlcmUsIGFuZCB3aGV0aGVyIGEgZ2l2ZW5cbnBvc2l0aW9uIGlzIGEgdmFsaWQgZW5kIG9mIHRoZSBub2RlLlxuKi9cbmNsYXNzIENvbnRlbnRNYXRjaCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBtYXRjaCBzdGF0ZSByZXByZXNlbnRzIGEgdmFsaWQgZW5kIG9mIHRoZSBub2RlLlxuICAgICovXG4gICAgdmFsaWRFbmQpIHtcbiAgICAgICAgdGhpcy52YWxpZEVuZCA9IHZhbGlkRW5kO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubmV4dCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMud3JhcENhY2hlID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHBhcnNlKHN0cmluZywgbm9kZVR5cGVzKSB7XG4gICAgICAgIGxldCBzdHJlYW0gPSBuZXcgVG9rZW5TdHJlYW0oc3RyaW5nLCBub2RlVHlwZXMpO1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBDb250ZW50TWF0Y2guZW1wdHk7XG4gICAgICAgIGxldCBleHByID0gcGFyc2VFeHByKHN0cmVhbSk7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dClcbiAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJVbmV4cGVjdGVkIHRyYWlsaW5nIHRleHRcIik7XG4gICAgICAgIGxldCBtYXRjaCA9IGRmYShuZmEoZXhwcikpO1xuICAgICAgICBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIGEgbm9kZSB0eXBlLCByZXR1cm5pbmcgYSBtYXRjaCBhZnRlciB0aGF0IG5vZGUgaWZcbiAgICBzdWNjZXNzZnVsLlxuICAgICovXG4gICAgbWF0Y2hUeXBlKHR5cGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0W2ldLnR5cGUgPT0gdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0W2ldLm5leHQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gbWF0Y2ggYSBmcmFnbWVudC4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIG1hdGNoIHdoZW5cbiAgICBzdWNjZXNzZnVsLlxuICAgICovXG4gICAgbWF0Y2hGcmFnbWVudChmcmFnLCBzdGFydCA9IDAsIGVuZCA9IGZyYWcuY2hpbGRDb3VudCkge1xuICAgICAgICBsZXQgY3VyID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBjdXIgJiYgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgY3VyID0gY3VyLm1hdGNoVHlwZShmcmFnLmNoaWxkKGkpLnR5cGUpO1xuICAgICAgICByZXR1cm4gY3VyO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBpbmxpbmVDb250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Lmxlbmd0aCAhPSAwICYmIHRoaXMubmV4dFswXS50eXBlLmlzSW5saW5lO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGZpcnN0IG1hdGNoaW5nIG5vZGUgdHlwZSBhdCB0aGlzIG1hdGNoIHBvc2l0aW9uIHRoYXQgY2FuXG4gICAgYmUgZ2VuZXJhdGVkLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRUeXBlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSB9ID0gdGhpcy5uZXh0W2ldO1xuICAgICAgICAgICAgaWYgKCEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhdGlibGUob3RoZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG90aGVyLm5leHQubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV4dFtpXS50eXBlID09IG90aGVyLm5leHRbal0udHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1hdGNoIHRoZSBnaXZlbiBmcmFnbWVudCwgYW5kIGlmIHRoYXQgZmFpbHMsIHNlZSBpZiBpdCBjYW5cbiAgICBiZSBtYWRlIHRvIG1hdGNoIGJ5IGluc2VydGluZyBub2RlcyBpbiBmcm9udCBvZiBpdC4gV2hlblxuICAgIHN1Y2Nlc3NmdWwsIHJldHVybiBhIGZyYWdtZW50IG9mIGluc2VydGVkIG5vZGVzICh3aGljaCBtYXkgYmVcbiAgICBlbXB0eSBpZiBub3RoaW5nIGhhZCB0byBiZSBpbnNlcnRlZCkuIFdoZW4gYHRvRW5kYCBpcyB0cnVlLCBvbmx5XG4gICAgcmV0dXJuIGEgZnJhZ21lbnQgaWYgdGhlIHJlc3VsdGluZyBtYXRjaCBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlXG4gICAgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZmlsbEJlZm9yZShhZnRlciwgdG9FbmQgPSBmYWxzZSwgc3RhcnRJbmRleCA9IDApIHtcbiAgICAgICAgbGV0IHNlZW4gPSBbdGhpc107XG4gICAgICAgIGZ1bmN0aW9uIHNlYXJjaChtYXRjaCwgdHlwZXMpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IG1hdGNoLm1hdGNoRnJhZ21lbnQoYWZ0ZXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkICYmICghdG9FbmQgfHwgZmluaXNoZWQudmFsaWRFbmQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tKHR5cGVzLm1hcCh0cCA9PiB0cC5jcmVhdGVBbmRGaWxsKCkpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2gubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLm5leHRbaV07XG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpICYmIHNlZW4uaW5kZXhPZihuZXh0KSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHNlYXJjaChuZXh0LCB0eXBlcy5jb25jYXQodHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlYXJjaCh0aGlzLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYSBzZXQgb2Ygd3JhcHBpbmcgbm9kZSB0eXBlcyB0aGF0IHdvdWxkIGFsbG93IGEgbm9kZSBvZiB0aGVcbiAgICBnaXZlbiB0eXBlIHRvIGFwcGVhciBhdCB0aGlzIHBvc2l0aW9uLiBUaGUgcmVzdWx0IG1heSBiZSBlbXB0eVxuICAgICh3aGVuIGl0IGZpdHMgZGlyZWN0bHkpIGFuZCB3aWxsIGJlIG51bGwgd2hlbiBubyBzdWNoIHdyYXBwaW5nXG4gICAgZXhpc3RzLlxuICAgICovXG4gICAgZmluZFdyYXBwaW5nKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud3JhcENhY2hlLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKHRoaXMud3JhcENhY2hlW2ldID09IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwQ2FjaGVbaSArIDFdO1xuICAgICAgICBsZXQgY29tcHV0ZWQgPSB0aGlzLmNvbXB1dGVXcmFwcGluZyh0YXJnZXQpO1xuICAgICAgICB0aGlzLndyYXBDYWNoZS5wdXNoKHRhcmdldCwgY29tcHV0ZWQpO1xuICAgICAgICByZXR1cm4gY29tcHV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcHV0ZVdyYXBwaW5nKHRhcmdldCkge1xuICAgICAgICBsZXQgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGFjdGl2ZSA9IFt7IG1hdGNoOiB0aGlzLCB0eXBlOiBudWxsLCB2aWE6IG51bGwgfV07XG4gICAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGFjdGl2ZS5zaGlmdCgpLCBtYXRjaCA9IGN1cnJlbnQubWF0Y2g7XG4gICAgICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2JqID0gY3VycmVudDsgb2JqLnR5cGU7IG9iaiA9IG9iai52aWEpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9iai50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2gubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLm5leHRbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzTGVhZiAmJiAhdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkgJiYgISh0eXBlLm5hbWUgaW4gc2VlbikgJiYgKCFjdXJyZW50LnR5cGUgfHwgbmV4dC52YWxpZEVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlLnB1c2goeyBtYXRjaDogdHlwZS5jb250ZW50TWF0Y2gsIHR5cGUsIHZpYTogY3VycmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2Vlblt0eXBlLm5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgZWRnZXMgdGhpcyBub2RlIGhhcyBpbiB0aGUgZmluaXRlXG4gICAgYXV0b21hdG9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBnZXQgZWRnZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBfbl/igIt0aCBvdXRnb2luZyBlZGdlIGZyb20gdGhpcyBub2RlIGluIHRoZSBmaW5pdGVcbiAgICBhdXRvbWF0b24gdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGVkZ2Uobikge1xuICAgICAgICBpZiAobiA+PSB0aGlzLm5leHQubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlJ3Mgbm8gJHtufXRoIGVkZ2UgaW4gdGhpcyBjb250ZW50IG1hdGNoYCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRbbl07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBzZWVuID0gW107XG4gICAgICAgIGZ1bmN0aW9uIHNjYW4obSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihtLm5leHRbaV0ubmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHNjYW4obS5uZXh0W2ldLm5leHQpO1xuICAgICAgICB9XG4gICAgICAgIHNjYW4odGhpcyk7XG4gICAgICAgIHJldHVybiBzZWVuLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IG91dCA9IGkgKyAobS52YWxpZEVuZCA/IFwiKlwiIDogXCIgXCIpICsgXCIgXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBvdXQgKz0gKGkgPyBcIiwgXCIgOiBcIlwiKSArIG0ubmV4dFtpXS50eXBlLm5hbWUgKyBcIi0+XCIgKyBzZWVuLmluZGV4T2YobS5uZXh0W2ldLm5leHQpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSkuam9pbihcIlxcblwiKTtcbiAgICB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbkNvbnRlbnRNYXRjaC5lbXB0eSA9IG5ldyBDb250ZW50TWF0Y2godHJ1ZSk7XG5jbGFzcyBUb2tlblN0cmVhbSB7XG4gICAgY29uc3RydWN0b3Ioc3RyaW5nLCBub2RlVHlwZXMpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMubm9kZVR5cGVzID0gbm9kZVR5cGVzO1xuICAgICAgICB0aGlzLmlubGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBzdHJpbmcuc3BsaXQoL1xccyooPz1cXGJ8XFxXfCQpLyk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vuc1t0aGlzLnRva2Vucy5sZW5ndGggLSAxXSA9PSBcIlwiKVxuICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vuc1swXSA9PSBcIlwiKVxuICAgICAgICAgICAgdGhpcy50b2tlbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLnBvc107IH1cbiAgICBlYXQodG9rKSB7IHJldHVybiB0aGlzLm5leHQgPT0gdG9rICYmICh0aGlzLnBvcysrIHx8IHRydWUpOyB9XG4gICAgZXJyKHN0cikgeyB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3RyICsgXCIgKGluIGNvbnRlbnQgZXhwcmVzc2lvbiAnXCIgKyB0aGlzLnN0cmluZyArIFwiJylcIik7IH1cbn1cbmZ1bmN0aW9uIHBhcnNlRXhwcihzdHJlYW0pIHtcbiAgICBsZXQgZXhwcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICAgIGV4cHJzLnB1c2gocGFyc2VFeHByU2VxKHN0cmVhbSkpO1xuICAgIH0gd2hpbGUgKHN0cmVhbS5lYXQoXCJ8XCIpKTtcbiAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJjaG9pY2VcIiwgZXhwcnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclNlcShzdHJlYW0pIHtcbiAgICBsZXQgZXhwcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICAgIGV4cHJzLnB1c2gocGFyc2VFeHByU3Vic2NyaXB0KHN0cmVhbSkpO1xuICAgIH0gd2hpbGUgKHN0cmVhbS5uZXh0ICYmIHN0cmVhbS5uZXh0ICE9IFwiKVwiICYmIHN0cmVhbS5uZXh0ICE9IFwifFwiKTtcbiAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJzZXFcIiwgZXhwcnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclN1YnNjcmlwdChzdHJlYW0pIHtcbiAgICBsZXQgZXhwciA9IHBhcnNlRXhwckF0b20oc3RyZWFtKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiK1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwicGx1c1wiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJzdGFyXCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIj9cIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcIm9wdFwiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCJ7XCIpKVxuICAgICAgICAgICAgZXhwciA9IHBhcnNlRXhwclJhbmdlKHN0cmVhbSwgZXhwcik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbn1cbmZ1bmN0aW9uIHBhcnNlTnVtKHN0cmVhbSkge1xuICAgIGlmICgvXFxELy50ZXN0KHN0cmVhbS5uZXh0KSlcbiAgICAgICAgc3RyZWFtLmVycihcIkV4cGVjdGVkIG51bWJlciwgZ290ICdcIiArIHN0cmVhbS5uZXh0ICsgXCInXCIpO1xuICAgIGxldCByZXN1bHQgPSBOdW1iZXIoc3RyZWFtLm5leHQpO1xuICAgIHN0cmVhbS5wb3MrKztcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByUmFuZ2Uoc3RyZWFtLCBleHByKSB7XG4gICAgbGV0IG1pbiA9IHBhcnNlTnVtKHN0cmVhbSksIG1heCA9IG1pbjtcbiAgICBpZiAoc3RyZWFtLmVhdChcIixcIikpIHtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0ICE9IFwifVwiKVxuICAgICAgICAgICAgbWF4ID0gcGFyc2VOdW0oc3RyZWFtKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF4ID0gLTE7XG4gICAgfVxuICAgIGlmICghc3RyZWFtLmVhdChcIn1cIikpXG4gICAgICAgIHN0cmVhbS5lcnIoXCJVbmNsb3NlZCBicmFjZWQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyYW5nZVwiLCBtaW4sIG1heCwgZXhwciB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZU5hbWUoc3RyZWFtLCBuYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gc3RyZWFtLm5vZGVUeXBlcywgdHlwZSA9IHR5cGVzW25hbWVdO1xuICAgIGlmICh0eXBlKVxuICAgICAgICByZXR1cm4gW3R5cGVdO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB0eXBlTmFtZSBpbiB0eXBlcykge1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW3R5cGVOYW1lXTtcbiAgICAgICAgaWYgKHR5cGUuaXNJbkdyb3VwKG5hbWUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApXG4gICAgICAgIHN0cmVhbS5lcnIoXCJObyBub2RlIHR5cGUgb3IgZ3JvdXAgJ1wiICsgbmFtZSArIFwiJyBmb3VuZFwiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByQXRvbShzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLmVhdChcIihcIikpIHtcbiAgICAgICAgbGV0IGV4cHIgPSBwYXJzZUV4cHIoc3RyZWFtKTtcbiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KFwiKVwiKSlcbiAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXNzaW5nIGNsb3NpbmcgcGFyZW5cIik7XG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICBlbHNlIGlmICghL1xcVy8udGVzdChzdHJlYW0ubmV4dCkpIHtcbiAgICAgICAgbGV0IGV4cHJzID0gcmVzb2x2ZU5hbWUoc3RyZWFtLCBzdHJlYW0ubmV4dCkubWFwKHR5cGUgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5pbmxpbmUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBzdHJlYW0uaW5saW5lID0gdHlwZS5pc0lubGluZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5pbmxpbmUgIT0gdHlwZS5pc0lubGluZSlcbiAgICAgICAgICAgICAgICBzdHJlYW0uZXJyKFwiTWl4aW5nIGlubGluZSBhbmQgYmxvY2sgY29udGVudFwiKTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwibmFtZVwiLCB2YWx1ZTogdHlwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLnBvcysrO1xuICAgICAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJjaG9pY2VcIiwgZXhwcnMgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0cmVhbS5lcnIoXCJVbmV4cGVjdGVkIHRva2VuICdcIiArIHN0cmVhbS5uZXh0ICsgXCInXCIpO1xuICAgIH1cbn1cbi8vIENvbnN0cnVjdCBhbiBORkEgZnJvbSBhbiBleHByZXNzaW9uIGFzIHJldHVybmVkIGJ5IHRoZSBwYXJzZXIuIFRoZVxuLy8gTkZBIGlzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHN0YXRlcywgd2hpY2ggYXJlIHRoZW1zZWx2ZXNcbi8vIGFycmF5cyBvZiBlZGdlcywgd2hpY2ggYXJlIGB7dGVybSwgdG99YCBvYmplY3RzLiBUaGUgZmlyc3Qgc3RhdGUgaXNcbi8vIHRoZSBlbnRyeSBzdGF0ZSBhbmQgdGhlIGxhc3Qgbm9kZSBpcyB0aGUgc3VjY2VzcyBzdGF0ZS5cbi8vXG4vLyBOb3RlIHRoYXQgdW5saWtlIHR5cGljYWwgTkZBcywgdGhlIGVkZ2Ugb3JkZXJpbmcgaW4gdGhpcyBvbmUgaXNcbi8vIHNpZ25pZmljYW50LCBpbiB0aGF0IGl0IGlzIHVzZWQgdG8gY29udHJ1Y3QgZmlsbGVyIGNvbnRlbnQgd2hlblxuLy8gbmVjZXNzYXJ5LlxuZnVuY3Rpb24gbmZhKGV4cHIpIHtcbiAgICBsZXQgbmZhID0gW1tdXTtcbiAgICBjb25uZWN0KGNvbXBpbGUoZXhwciwgMCksIG5vZGUoKSk7XG4gICAgcmV0dXJuIG5mYTtcbiAgICBmdW5jdGlvbiBub2RlKCkgeyByZXR1cm4gbmZhLnB1c2goW10pIC0gMTsgfVxuICAgIGZ1bmN0aW9uIGVkZ2UoZnJvbSwgdG8sIHRlcm0pIHtcbiAgICAgICAgbGV0IGVkZ2UgPSB7IHRlcm0sIHRvIH07XG4gICAgICAgIG5mYVtmcm9tXS5wdXNoKGVkZ2UpO1xuICAgICAgICByZXR1cm4gZWRnZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29ubmVjdChlZGdlcywgdG8pIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChlZGdlID0+IGVkZ2UudG8gPSB0byk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJvbSkge1xuICAgICAgICBpZiAoZXhwci50eXBlID09IFwiY2hvaWNlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByLmV4cHJzLnJlZHVjZSgob3V0LCBleHByKSA9PiBvdXQuY29uY2F0KGNvbXBpbGUoZXhwciwgZnJvbSkpLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwic2VxXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjb21waWxlKGV4cHIuZXhwcnNbaV0sIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChpID09IGV4cHIuZXhwcnMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgY29ubmVjdChuZXh0LCBmcm9tID0gbm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzdGFyXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgZWRnZShmcm9tLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicGx1c1wiKSB7XG4gICAgICAgICAgICBsZXQgbG9vcCA9IG5vZGUoKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGZyb20pLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwib3B0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShmcm9tKV0uY29uY2F0KGNvbXBpbGUoZXhwci5leHByLCBmcm9tKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicmFuZ2VcIikge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubWluOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIubWF4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBleHByLm1pbjsgaSA8IGV4cHIubWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2UoY3VyLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGN1cildO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20sIHVuZGVmaW5lZCwgZXhwci52YWx1ZSldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBleHByIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH1cbi8vIEdldCB0aGUgc2V0IG9mIG5vZGVzIHJlYWNoYWJsZSBieSBudWxsIGVkZ2VzIGZyb20gYG5vZGVgLiBPbWl0XG4vLyBub2RlcyB3aXRoIG9ubHkgYSBzaW5nbGUgbnVsbC1vdXQtZWRnZSwgc2luY2UgdGhleSBtYXkgbGVhZCB0b1xuLy8gbmVlZGxlc3MgZHVwbGljYXRlZCBub2Rlcy5cbmZ1bmN0aW9uIG51bGxGcm9tKG5mYSwgbm9kZSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBzY2FuKG5vZGUpO1xuICAgIHJldHVybiByZXN1bHQuc29ydChjbXApO1xuICAgIGZ1bmN0aW9uIHNjYW4obm9kZSkge1xuICAgICAgICBsZXQgZWRnZXMgPSBuZmFbbm9kZV07XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGggPT0gMSAmJiAhZWRnZXNbMF0udGVybSlcbiAgICAgICAgICAgIHJldHVybiBzY2FuKGVkZ2VzWzBdLnRvKTtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHRlcm0sIHRvIH0gPSBlZGdlc1tpXTtcbiAgICAgICAgICAgIGlmICghdGVybSAmJiByZXN1bHQuaW5kZXhPZih0bykgPT0gLTEpXG4gICAgICAgICAgICAgICAgc2Nhbih0byk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBDb21waWxlcyBhbiBORkEgYXMgcHJvZHVjZWQgYnkgYG5mYWAgaW50byBhIERGQSwgbW9kZWxlZCBhcyBhIHNldFxuLy8gb2Ygc3RhdGUgb2JqZWN0cyAoYENvbnRlbnRNYXRjaGAgaW5zdGFuY2VzKSB3aXRoIHRyYW5zaXRpb25zXG4vLyBiZXR3ZWVuIHRoZW0uXG5mdW5jdGlvbiBkZmEobmZhKSB7XG4gICAgbGV0IGxhYmVsZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHJldHVybiBleHBsb3JlKG51bGxGcm9tKG5mYSwgMCkpO1xuICAgIGZ1bmN0aW9uIGV4cGxvcmUoc3RhdGVzKSB7XG4gICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgc3RhdGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBuZmFbbm9kZV0uZm9yRWFjaCgoeyB0ZXJtLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXJtKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IHNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFtpXVswXSA9PSB0ZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gb3V0W2ldWzFdO1xuICAgICAgICAgICAgICAgIG51bGxGcm9tKG5mYSwgdG8pLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goW3Rlcm0sIHNldCA9IFtdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXQuaW5kZXhPZihub2RlKSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc3RhdGUgPSBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gPSBuZXcgQ29udGVudE1hdGNoKHN0YXRlcy5pbmRleE9mKG5mYS5sZW5ndGggLSAxKSA+IC0xKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZXMgPSBvdXRbaV1bMV0uc29ydChjbXApO1xuICAgICAgICAgICAgc3RhdGUubmV4dC5wdXNoKHsgdHlwZTogb3V0W2ldWzBdLCBuZXh0OiBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gfHwgZXhwbG9yZShzdGF0ZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgd29yayA9IFttYXRjaF07IGkgPCB3b3JrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHdvcmtbaV0sIGRlYWQgPSAhc3RhdGUudmFsaWRFbmQsIG5vZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RhdGUubmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gc3RhdGUubmV4dFtqXTtcbiAgICAgICAgICAgIG5vZGVzLnB1c2godHlwZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZWFkICYmICEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIGRlYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh3b3JrLmluZGV4T2YobmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgd29yay5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWFkKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk9ubHkgbm9uLWdlbmVyYXRhYmxlIG5vZGVzIChcIiArIG5vZGVzLmpvaW4oXCIsIFwiKSArIFwiKSBpbiBhIHJlcXVpcmVkIHBvc2l0aW9uIChzZWUgaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZ2VuZXJhdGFibGUpXCIpO1xuICAgIH1cbn1cblxuLy8gRm9yIG5vZGUgdHlwZXMgd2hlcmUgYWxsIGF0dHJzIGhhdmUgYSBkZWZhdWx0IHZhbHVlIChvciB3aGljaCBkb24ndFxuLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4vLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbi8vIGF0dHJpYnV0ZXMuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgZGVmYXVsdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoIWF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0c1thdHRyTmFtZV0gPSBhdHRyLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVBdHRycyhhdHRycywgdmFsdWUpIHtcbiAgICBsZXQgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGdpdmVuID0gdmFsdWUgJiYgdmFsdWVbbmFtZV07XG4gICAgICAgIGlmIChnaXZlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBnaXZlbiA9IGF0dHIuZGVmYXVsdDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsdFtuYW1lXSA9IGdpdmVuO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHQ7XG59XG5mdW5jdGlvbiBjaGVja0F0dHJzKGF0dHJzLCB2YWx1ZXMsIHR5cGUsIG5hbWUpIHtcbiAgICBmb3IgKGxldCBuYW1lIGluIHZhbHVlcylcbiAgICAgICAgaWYgKCEobmFtZSBpbiBhdHRycykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5zdXBwb3J0ZWQgYXR0cmlidXRlICR7bmFtZX0gZm9yICR7dHlwZX0gb2YgdHlwZSAke25hbWV9YCk7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICBpZiAoYXR0ci52YWxpZGF0ZSlcbiAgICAgICAgICAgIGF0dHIudmFsaWRhdGUodmFsdWVzW25hbWVdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbml0QXR0cnModHlwZU5hbWUsIGF0dHJzKSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gbmV3IEF0dHJpYnV0ZSh0eXBlTmFtZSwgbmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbk5vZGUgdHlwZXMgYXJlIG9iamVjdHMgYWxsb2NhdGVkIG9uY2UgcGVyIGBTY2hlbWFgIGFuZCB1c2VkIHRvXG5bdGFnXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50eXBlKSBgTm9kZWAgaW5zdGFuY2VzLiBUaGV5IGNvbnRhaW4gaW5mb3JtYXRpb25cbmFib3V0IHRoZSBub2RlIHR5cGUsIHN1Y2ggYXMgaXRzIG5hbWUgYW5kIHdoYXQga2luZCBvZiBub2RlIGl0XG5yZXByZXNlbnRzLlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIHRoZSBub2RlIHR5cGUgaGFzIGluIHRoaXMgc2NoZW1hLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQSBsaW5rIGJhY2sgdG8gdGhlIGBTY2hlbWFgIHRoZSBub2RlIHR5cGUgYmVsb25ncyB0by5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNwZWMgdGhhdCB0aGlzIHR5cGUgaXMgYmFzZWQgb25cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc2V0IG9mIG1hcmtzIGFsbG93ZWQgaW4gdGhpcyBub2RlLiBgbnVsbGAgbWVhbnMgYWxsIG1hcmtzXG4gICAgICAgIGFyZSBhbGxvd2VkLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcmtTZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IHNwZWMuZ3JvdXAgPyBzcGVjLmdyb3VwLnNwbGl0KFwiIFwiKSA6IFtdO1xuICAgICAgICB0aGlzLmF0dHJzID0gaW5pdEF0dHJzKG5hbWUsIHNwZWMuYXR0cnMpO1xuICAgICAgICB0aGlzLmRlZmF1bHRBdHRycyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5jb250ZW50TWF0Y2ggPSBudWxsO1xuICAgICAgICB0aGlzLmlubGluZUNvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQmxvY2sgPSAhKHNwZWMuaW5saW5lIHx8IG5hbWUgPT0gXCJ0ZXh0XCIpO1xuICAgICAgICB0aGlzLmlzVGV4dCA9IG5hbWUgPT0gXCJ0ZXh0XCI7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgdGhpcyBpcyBhbiBpbmxpbmUgdHlwZS5cbiAgICAqL1xuICAgIGdldCBpc0lubGluZSgpIHsgcmV0dXJuICF0aGlzLmlzQmxvY2s7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHRoaXMgaXMgYSB0ZXh0YmxvY2sgdHlwZSwgYSBibG9jayB0aGF0IGNvbnRhaW5zIGlubGluZVxuICAgIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0YmxvY2soKSB7IHJldHVybiB0aGlzLmlzQmxvY2sgJiYgdGhpcy5pbmxpbmVDb250ZW50OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBmb3Igbm9kZSB0eXBlcyB0aGF0IGFsbG93IG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy5jb250ZW50TWF0Y2ggPT0gQ29udGVudE1hdGNoLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBhbiBhdG9tLCBpLmUuIHdoZW4gaXQgZG9lcyBub3QgaGF2ZVxuICAgIGRpcmVjdGx5IGVkaXRhYmxlIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNBdG9tKCkgeyByZXR1cm4gdGhpcy5pc0xlYWYgfHwgISF0aGlzLnNwZWMuYXRvbTsgfVxuICAgIC8qKlxuICAgIFJldHVybiB0cnVlIHdoZW4gdGhpcyBub2RlIHR5cGUgaXMgcGFydCBvZiB0aGUgZ2l2ZW5cbiAgICBbZ3JvdXBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5ncm91cCkuXG4gICAgKi9cbiAgICBpc0luR3JvdXAoZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLmluZGV4T2YoZ3JvdXApID4gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGUncyBbd2hpdGVzcGFjZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLndoaXRlc3BhY2UpIG9wdGlvbi5cbiAgICAqL1xuICAgIGdldCB3aGl0ZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLndoaXRlc3BhY2UgfHwgKHRoaXMuc3BlYy5jb2RlID8gXCJwcmVcIiA6IFwibm9ybWFsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGlzIG5vZGUgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBoYXNSZXF1aXJlZEF0dHJzKCkge1xuICAgICAgICBmb3IgKGxldCBuIGluIHRoaXMuYXR0cnMpXG4gICAgICAgICAgICBpZiAodGhpcy5hdHRyc1tuXS5pc1JlcXVpcmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbm9kZSBhbGxvd3Mgc29tZSBvZiB0aGUgc2FtZSBjb250ZW50IGFzXG4gICAgdGhlIGdpdmVuIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGNvbXBhdGlibGVDb250ZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29udGVudE1hdGNoLmNvbXBhdGlibGUob3RoZXIuY29udGVudE1hdGNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wdXRlQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgaWYgKCFhdHRycyAmJiB0aGlzLmRlZmF1bHRBdHRycylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdHRycztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBOb2RlYCBvZiB0aGlzIHR5cGUuIFRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZVxuICAgIGNoZWNrZWQgYW5kIGRlZmF1bHRlZCAoeW91IGNhbiBwYXNzIGBudWxsYCB0byB1c2UgdGhlIHR5cGUnc1xuICAgIGRlZmF1bHRzIGVudGlyZWx5LCBpZiBubyByZXF1aXJlZCBhdHRyaWJ1dGVzIGV4aXN0KS4gYGNvbnRlbnRgXG4gICAgbWF5IGJlIGEgYEZyYWdtZW50YCwgYSBub2RlLCBhbiBhcnJheSBvZiBub2Rlcywgb3JcbiAgICBgbnVsbGAuIFNpbWlsYXJseSBgbWFya3NgIG1heSBiZSBgbnVsbGAgdG8gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBjcmVhdGUoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5pc1RleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlVHlwZS5jcmVhdGUgY2FuJ3QgY29uc3RydWN0IHRleHQgbm9kZXNcIik7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyksIEZyYWdtZW50LmZyb20oY29udGVudCksIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgY3JlYXRlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlLmNyZWF0ZSksIGJ1dCBjaGVjayB0aGUgZ2l2ZW4gY29udGVudFxuICAgIGFnYWluc3QgdGhlIG5vZGUgdHlwZSdzIGNvbnRlbnQgcmVzdHJpY3Rpb25zLCBhbmQgdGhyb3cgYW4gZXJyb3JcbiAgICBpZiBpdCBkb2Vzbid0IG1hdGNoLlxuICAgICovXG4gICAgY3JlYXRlQ2hlY2tlZChhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKGNvbnRlbnQpO1xuICAgICAgICB0aGlzLmNoZWNrQ29udGVudChjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKSwgY29udGVudCwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2BjcmVhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUuY3JlYXRlKSwgYnV0IHNlZSBpZiBpdCBpc1xuICAgIG5lY2Vzc2FyeSB0byBhZGQgbm9kZXMgdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZ2l2ZW4gZnJhZ21lbnRcbiAgICB0byBtYWtlIGl0IGZpdCB0aGUgbm9kZS4gSWYgbm8gZml0dGluZyB3cmFwcGluZyBjYW4gYmUgZm91bmQsXG4gICAgcmV0dXJuIG51bGwuIE5vdGUgdGhhdCwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmVxdWlyZWQgbm9kZXMgY2FuXG4gICAgYWx3YXlzIGJlIGNyZWF0ZWQsIHRoaXMgd2lsbCBhbHdheXMgc3VjY2VlZCBpZiB5b3UgcGFzcyBudWxsIG9yXG4gICAgYEZyYWdtZW50LmVtcHR5YCBhcyBjb250ZW50LlxuICAgICovXG4gICAgY3JlYXRlQW5kRmlsbChhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGF0dHJzID0gdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpO1xuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgICAgICAgaWYgKGNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoY29udGVudCk7XG4gICAgICAgICAgICBpZiAoIWJlZm9yZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBiZWZvcmUuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gdGhpcy5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgbGV0IGFmdGVyID0gbWF0Y2hlZCAmJiBtYXRjaGVkLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCBhdHRycywgY29udGVudC5hcHBlbmQoYWZ0ZXIpLCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyB2YWxpZCBjb250ZW50IGZvciB0aGlzIG5vZGVcbiAgICB0eXBlLlxuICAgICovXG4gICAgdmFsaWRDb250ZW50KGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya3MoY29udGVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhyb3dzIGEgUmFuZ2VFcnJvciBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgbm90IHZhbGlkIGNvbnRlbnQgZm9yIHRoaXNcbiAgICBub2RlIHR5cGUuXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0NvbnRlbnQoY29udGVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRDb250ZW50KGNvbnRlbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY29udGVudCBmb3Igbm9kZSAke3RoaXMubmFtZX06ICR7Y29udGVudC50b1N0cmluZygpLnNsaWNlKDAsIDUwKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0F0dHJzKGF0dHJzKSB7XG4gICAgICAgIGNoZWNrQXR0cnModGhpcy5hdHRycywgYXR0cnMsIFwibm9kZVwiLCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrIHR5cGUgaXMgYWxsb3dlZCBpbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBhbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXJrU2V0ID09IG51bGwgfHwgdGhpcy5tYXJrU2V0LmluZGV4T2YobWFya1R5cGUpID4gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtzIGFyZSBhbGxvd2VkIGluIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIGFsbG93c01hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtTZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93c01hcmtUeXBlKG1hcmtzW2ldLnR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZXMgdGhlIG1hcmtzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgbm9kZSBmcm9tIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBhbGxvd2VkTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya1NldCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgICAgICBsZXQgY29weTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93c01hcmtUeXBlKG1hcmtzW2ldLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbWFya3Muc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3B5KSB7XG4gICAgICAgICAgICAgICAgY29weS5wdXNoKG1hcmtzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWNvcHkgPyBtYXJrcyA6IGNvcHkubGVuZ3RoID8gY29weSA6IE1hcmsubm9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGlsZShub2Rlcywgc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTm9kZVR5cGUobmFtZSwgc2NoZW1hLCBzcGVjKSk7XG4gICAgICAgIGxldCB0b3BUeXBlID0gc2NoZW1hLnNwZWMudG9wTm9kZSB8fCBcImRvY1wiO1xuICAgICAgICBpZiAoIXJlc3VsdFt0b3BUeXBlXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2NoZW1hIGlzIG1pc3NpbmcgaXRzIHRvcCBub2RlIHR5cGUgKCdcIiArIHRvcFR5cGUgKyBcIicpXCIpO1xuICAgICAgICBpZiAoIXJlc3VsdC50ZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAndGV4dCcgdHlwZVwiKTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiByZXN1bHQudGV4dC5hdHRycylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHRleHQgbm9kZSB0eXBlIHNob3VsZCBub3QgaGF2ZSBhdHRyaWJ1dGVzXCIpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZSh0eXBlTmFtZSwgYXR0ck5hbWUsIHR5cGUpIHtcbiAgICBsZXQgdHlwZXMgPSB0eXBlLnNwbGl0KFwifFwiKTtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVzLmluZGV4T2YobmFtZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdGVkIHZhbHVlIG9mIHR5cGUgJHt0eXBlc30gZm9yIGF0dHJpYnV0ZSAke2F0dHJOYW1lfSBvbiB0eXBlICR7dHlwZU5hbWV9LCBnb3QgJHtuYW1lfWApO1xuICAgIH07XG59XG4vLyBBdHRyaWJ1dGUgZGVzY3JpcHRvcnNcbmNsYXNzIEF0dHJpYnV0ZSB7XG4gICAgY29uc3RydWN0b3IodHlwZU5hbWUsIGF0dHJOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaGFzRGVmYXVsdCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBcImRlZmF1bHRcIik7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09IFwic3RyaW5nXCIgPyB2YWxpZGF0ZVR5cGUodHlwZU5hbWUsIGF0dHJOYW1lLCBvcHRpb25zLnZhbGlkYXRlKSA6IG9wdGlvbnMudmFsaWRhdGU7XG4gICAgfVxuICAgIGdldCBpc1JlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzRGVmYXVsdDtcbiAgICB9XG59XG4vLyBNYXJrc1xuLyoqXG5MaWtlIG5vZGVzLCBtYXJrcyAod2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlcyB0byBzaWduaWZ5XG50aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlXG5bdGFnZ2VkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFyay50eXBlKSB3aXRoIHR5cGUgb2JqZWN0cywgd2hpY2ggYXJlXG5pbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG4qL1xuY2xhc3MgTWFya1R5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuaywgXG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSB0aGF0IHRoaXMgbWFyayB0eXBlIGluc3RhbmNlIGlzIHBhcnQgb2YuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIG9uIHdoaWNoIHRoZSB0eXBlIGlzIGJhc2VkLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhuYW1lLCBzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZCA9IG51bGw7XG4gICAgICAgIGxldCBkZWZhdWx0cyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzID8gbmV3IE1hcmsodGhpcywgZGVmYXVsdHMpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCkge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrKHRoaXMsIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCksIHJhbmsgPSAwO1xuICAgICAgICBtYXJrcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTWFya1R5cGUobmFtZSwgcmFuaysrLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQsIGEgbmV3IHNldFxuICAgIHdpdGhvdXQgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0IHNldCBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBzZXQgPSBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRbaV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hlY2tBdHRycyhhdHRycykge1xuICAgICAgICBjaGVja0F0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCBcIm1hcmtcIiwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcmllcyB3aGV0aGVyIGEgZ2l2ZW4gbWFyayB0eXBlIGlzXG4gICAgW2V4Y2x1ZGVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuZXhjbHVkZXMpIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgZXhjbHVkZXMob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjbHVkZWQuaW5kZXhPZihvdGhlcikgPiAtMTtcbiAgICB9XG59XG4vKipcbkEgZG9jdW1lbnQgc2NoZW1hLiBIb2xkcyBbbm9kZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlKSBhbmQgW21hcmtcbnR5cGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrVHlwZSkgb2JqZWN0cyBmb3IgdGhlIG5vZGVzIGFuZCBtYXJrcyB0aGF0IG1heVxub2NjdXIgaW4gY29uZm9ybWluZyBkb2N1bWVudHMsIGFuZCBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvclxuY3JlYXRpbmcgYW5kIGRlc2VyaWFsaXppbmcgc3VjaCBkb2N1bWVudHMuXG5cbldoZW4gZ2l2ZW4sIHRoZSB0eXBlIHBhcmFtZXRlcnMgcHJvdmlkZSB0aGUgbmFtZXMgb2YgdGhlIG5vZGVzIGFuZFxubWFya3MgaW4gdGhpcyBzY2hlbWEuXG4qL1xuY2xhc3MgU2NoZW1hIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBzY2hlbWEgZnJvbSBhIHNjaGVtYSBbc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlNjaGVtYVNwZWMpLlxuICAgICovXG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIFtsaW5lYnJlYWtcbiAgICAgICAgcmVwbGFjZW1lbnRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5saW5lYnJlYWtSZXBsYWNlbWVudCkgbm9kZSBkZWZpbmVkXG4gICAgICAgIGluIHRoaXMgc2NoZW1hLCBpZiBhbnkuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQW4gb2JqZWN0IGZvciBzdG9yaW5nIHdoYXRldmVyIHZhbHVlcyBtb2R1bGVzIG1heSB3YW50IHRvXG4gICAgICAgIGNvbXB1dGUgYW5kIGNhY2hlIHBlciBzY2hlbWEuIChJZiB5b3Ugd2FudCB0byBzdG9yZSBzb21ldGhpbmdcbiAgICAgICAgaW4gaXQsIHRyeSB0byB1c2UgcHJvcGVydHkgbmFtZXMgdW5saWtlbHkgdG8gY2xhc2guKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBpbnN0YW5jZVNwZWMgPSB0aGlzLnNwZWMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKVxuICAgICAgICAgICAgaW5zdGFuY2VTcGVjW3Byb3BdID0gc3BlY1twcm9wXTtcbiAgICAgICAgaW5zdGFuY2VTcGVjLm5vZGVzID0gT3JkZXJlZE1hcC5mcm9tKHNwZWMubm9kZXMpLFxuICAgICAgICAgICAgaW5zdGFuY2VTcGVjLm1hcmtzID0gT3JkZXJlZE1hcC5mcm9tKHNwZWMubWFya3MgfHwge30pLFxuICAgICAgICAgICAgdGhpcy5ub2RlcyA9IE5vZGVUeXBlLmNvbXBpbGUodGhpcy5zcGVjLm5vZGVzLCB0aGlzKTtcbiAgICAgICAgdGhpcy5tYXJrcyA9IE1hcmtUeXBlLmNvbXBpbGUodGhpcy5zcGVjLm1hcmtzLCB0aGlzKTtcbiAgICAgICAgbGV0IGNvbnRlbnRFeHByQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wIGluIHRoaXMubWFya3MpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IocHJvcCArIFwiIGNhbiBub3QgYmUgYm90aCBhIG5vZGUgYW5kIGEgbWFya1wiKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5ub2Rlc1twcm9wXSwgY29udGVudEV4cHIgPSB0eXBlLnNwZWMuY29udGVudCB8fCBcIlwiLCBtYXJrRXhwciA9IHR5cGUuc3BlYy5tYXJrcztcbiAgICAgICAgICAgIHR5cGUuY29udGVudE1hdGNoID0gY29udGVudEV4cHJDYWNoZVtjb250ZW50RXhwcl0gfHxcbiAgICAgICAgICAgICAgICAoY29udGVudEV4cHJDYWNoZVtjb250ZW50RXhwcl0gPSBDb250ZW50TWF0Y2gucGFyc2UoY29udGVudEV4cHIsIHRoaXMubm9kZXMpKTtcbiAgICAgICAgICAgIHR5cGUuaW5saW5lQ29udGVudCA9IHR5cGUuY29udGVudE1hdGNoLmlubGluZUNvbnRlbnQ7XG4gICAgICAgICAgICBpZiAodHlwZS5zcGVjLmxpbmVicmVha1JlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVsdGlwbGUgbGluZWJyZWFrIG5vZGVzIGRlZmluZWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzSW5saW5lIHx8ICF0eXBlLmlzTGVhZilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lYnJlYWsgcmVwbGFjZW1lbnQgbm9kZXMgbXVzdCBiZSBpbmxpbmUgbGVhZiBub2Rlc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVicmVha1JlcGxhY2VtZW50ID0gdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGUubWFya1NldCA9IG1hcmtFeHByID09IFwiX1wiID8gbnVsbCA6XG4gICAgICAgICAgICAgICAgbWFya0V4cHIgPyBnYXRoZXJNYXJrcyh0aGlzLCBtYXJrRXhwci5zcGxpdChcIiBcIikpIDpcbiAgICAgICAgICAgICAgICAgICAgbWFya0V4cHIgPT0gXCJcIiB8fCAhdHlwZS5pbmxpbmVDb250ZW50ID8gW10gOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gdGhpcy5tYXJrcykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm1hcmtzW3Byb3BdLCBleGNsID0gdHlwZS5zcGVjLmV4Y2x1ZGVzO1xuICAgICAgICAgICAgdHlwZS5leGNsdWRlZCA9IGV4Y2wgPT0gbnVsbCA/IFt0eXBlXSA6IGV4Y2wgPT0gXCJcIiA/IFtdIDogZ2F0aGVyTWFya3ModGhpcywgZXhjbC5zcGxpdChcIiBcIikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZUZyb21KU09OID0gdGhpcy5ub2RlRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5tYXJrRnJvbUpTT04gPSB0aGlzLm1hcmtGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRvcE5vZGVUeXBlID0gdGhpcy5ub2Rlc1t0aGlzLnNwZWMudG9wTm9kZSB8fCBcImRvY1wiXTtcbiAgICAgICAgdGhpcy5jYWNoZWQud3JhcHBpbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBpbiB0aGlzIHNjaGVtYS4gVGhlIGB0eXBlYCBtYXkgYmUgYSBzdHJpbmcgb3IgYVxuICAgIGBOb2RlVHlwZWAgaW5zdGFuY2UuIEF0dHJpYnV0ZXMgd2lsbCBiZSBleHRlbmRlZCB3aXRoIGRlZmF1bHRzLFxuICAgIGBjb250ZW50YCBtYXkgYmUgYSBgRnJhZ21lbnRgLCBgbnVsbGAsIGEgYE5vZGVgLCBvciBhbiBhcnJheSBvZlxuICAgIG5vZGVzLlxuICAgICovXG4gICAgbm9kZSh0eXBlLCBhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubm9kZVR5cGUodHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5vZGVUeXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBub2RlIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUuc2NoZW1hICE9IHRoaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vZGUgdHlwZSBmcm9tIGRpZmZlcmVudCBzY2hlbWEgdXNlZCAoXCIgKyB0eXBlLm5hbWUgKyBcIilcIik7XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZUNoZWNrZWQoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBub2RlIGluIHRoZSBzY2hlbWEuIEVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdFxuICAgIGFsbG93ZWQuXG4gICAgKi9cbiAgICB0ZXh0KHRleHQsIG1hcmtzKSB7XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5ub2Rlcy50ZXh0O1xuICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKHR5cGUsIHR5cGUuZGVmYXVsdEF0dHJzLCB0ZXh0LCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgbWFyayh0eXBlLCBhdHRycykge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLm1hcmtzW3R5cGVdO1xuICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGUoYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICBib3VuZC5cbiAgICAqL1xuICAgIG5vZGVGcm9tSlNPTihqc29uKSB7XG4gICAgICAgIHJldHVybiBOb2RlLmZyb21KU09OKHRoaXMsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG1hcmsgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICBib3VuZC5cbiAgICAqL1xuICAgIG1hcmtGcm9tSlNPTihqc29uKSB7XG4gICAgICAgIHJldHVybiBNYXJrLmZyb21KU09OKHRoaXMsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5vZGVUeXBlKG5hbWUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5ub2Rlc1tuYW1lXTtcbiAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVW5rbm93biBub2RlIHR5cGU6IFwiICsgbmFtZSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG59XG5mdW5jdGlvbiBnYXRoZXJNYXJrcyhzY2hlbWEsIG1hcmtzKSB7XG4gICAgbGV0IGZvdW5kID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmFtZSA9IG1hcmtzW2ldLCBtYXJrID0gc2NoZW1hLm1hcmtzW25hbWVdLCBvayA9IG1hcms7XG4gICAgICAgIGlmIChtYXJrKSB7XG4gICAgICAgICAgICBmb3VuZC5wdXNoKG1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IHNjaGVtYS5tYXJrc1twcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcIl9cIiB8fCAobWFyay5zcGVjLmdyb3VwICYmIG1hcmsuc3BlYy5ncm91cC5zcGxpdChcIiBcIikuaW5kZXhPZihuYW1lKSA+IC0xKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQucHVzaChvayA9IG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghb2spXG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJVbmtub3duIG1hcmsgdHlwZTogJ1wiICsgbWFya3NbaV0gKyBcIidcIik7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gaXNUYWdSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUudGFnICE9IG51bGw7IH1cbmZ1bmN0aW9uIGlzU3R5bGVSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUuc3R5bGUgIT0gbnVsbDsgfVxuLyoqXG5BIERPTSBwYXJzZXIgcmVwcmVzZW50cyBhIHN0cmF0ZWd5IGZvciBwYXJzaW5nIERPTSBjb250ZW50IGludG8gYVxuUHJvc2VNaXJyb3IgZG9jdW1lbnQgY29uZm9ybWluZyB0byBhIGdpdmVuIHNjaGVtYS4gSXRzIGJlaGF2aW9yIGlzXG5kZWZpbmVkIGJ5IGFuIGFycmF5IG9mIFtydWxlc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlBhcnNlUnVsZSkuXG4qL1xuY2xhc3MgRE9NUGFyc2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwYXJzZXIgdGhhdCB0YXJnZXRzIHRoZSBnaXZlbiBzY2hlbWEsIHVzaW5nIHRoZSBnaXZlblxuICAgIHBhcnNpbmcgcnVsZXMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIGludG8gd2hpY2ggdGhlIHBhcnNlciBwYXJzZXMuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzZXQgb2YgW3BhcnNlIHJ1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKSB0aGF0IHRoZSBwYXJzZXJcbiAgICB1c2VzLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgcnVsZXMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0eWxlcyA9IFtdO1xuICAgICAgICBsZXQgbWF0Y2hlZFN0eWxlcyA9IHRoaXMubWF0Y2hlZFN0eWxlcyA9IFtdO1xuICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVGFnUnVsZShydWxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTdHlsZVJ1bGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcCA9IC9bXj1dKi8uZXhlYyhydWxlLnN0eWxlKVswXTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFN0eWxlcy5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFN0eWxlcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IG5vcm1hbGl6ZSBsaXN0IGVsZW1lbnRzIHdoZW4gbGlzdHMgaW4gdGhlIHNjaGVtYSBjYW4ndCBkaXJlY3RseSBjb250YWluIHRoZW1zZWx2ZXNcbiAgICAgICAgdGhpcy5ub3JtYWxpemVMaXN0cyA9ICF0aGlzLnRhZ3Muc29tZShyID0+IHtcbiAgICAgICAgICAgIGlmICghL14odWx8b2wpXFxiLy50ZXN0KHIudGFnKSB8fCAhci5ub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVzW3Iubm9kZV07XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IG9mIGEgRE9NIG5vZGUuXG4gICAgKi9cbiAgICBwYXJzZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIE1hcmsubm9uZSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFBhcnNlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIG5vZGUsIGxpa2VcbiAgICBbYHBhcnNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVBhcnNlci5wYXJzZSksIGFuZCB0YWtlcyB0aGUgc2FtZSBzZXQgb2ZcbiAgICBvcHRpb25zLiBCdXQgdW5saWtlIHRoYXQgbWV0aG9kLCB3aGljaCBwcm9kdWNlcyBhIHdob2xlIG5vZGUsXG4gICAgdGhpcyBvbmUgcmV0dXJucyBhIHNsaWNlIHRoYXQgaXMgb3BlbiBhdCB0aGUgc2lkZXMsIG1lYW5pbmcgdGhhdFxuICAgIHRoZSBzY2hlbWEgY29uc3RyYWludHMgYXJlbid0IGFwcGxpZWQgdG8gdGhlIHN0YXJ0IG9mIG5vZGVzIHRvXG4gICAgdGhlIGxlZnQgb2YgdGhlIGlucHV0IGFuZCB0aGUgZW5kIG9mIG5vZGVzIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBwYXJzZVNsaWNlKGRvbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gbmV3IFBhcnNlQ29udGV4dCh0aGlzLCBvcHRpb25zLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRBbGwoZG9tLCBNYXJrLm5vbmUsIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBTbGljZS5tYXhPcGVuKGNvbnRleHQuZmluaXNoKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoVGFnKGRvbSwgY29udGV4dCwgYWZ0ZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFmdGVyID8gdGhpcy50YWdzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy50YWdzW2ldO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMoZG9tLCBydWxlLnRhZykgJiZcbiAgICAgICAgICAgICAgICAocnVsZS5uYW1lc3BhY2UgPT09IHVuZGVmaW5lZCB8fCBkb20ubmFtZXNwYWNlVVJJID09IHJ1bGUubmFtZXNwYWNlKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZS5jb250ZXh0IHx8IGNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5nZXRBdHRycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyhkb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaFN0eWxlKHByb3AsIHZhbHVlLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnN0eWxlcy5pbmRleE9mKGFmdGVyKSArIDEgOiAwOyBpIDwgdGhpcy5zdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy5zdHlsZXNbaV0sIHN0eWxlID0gcnVsZS5zdHlsZTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5pbmRleE9mKHByb3ApICE9IDAgfHxcbiAgICAgICAgICAgICAgICBydWxlLmNvbnRleHQgJiYgIWNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgc3R5bGUgc3RyaW5nIGVpdGhlciBwcmVjaXNlbHkgbWF0Y2hlcyB0aGUgcHJvcCxcbiAgICAgICAgICAgICAgICAvLyBvciBoYXMgYW4gJz0nIHNpZ24gYWZ0ZXIgdGhlIHByb3AsIGZvbGxvd2VkIGJ5IHRoZSBnaXZlblxuICAgICAgICAgICAgICAgIC8vIHZhbHVlLlxuICAgICAgICAgICAgICAgIHN0eWxlLmxlbmd0aCA+IHByb3AubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChzdHlsZS5jaGFyQ29kZUF0KHByb3AubGVuZ3RoKSAhPSA2MSB8fCBzdHlsZS5zbGljZShwcm9wLmxlbmd0aCArIDEpICE9IHZhbHVlKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJ1bGUuZ2V0QXR0cnModmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHNjaGVtYVJ1bGVzKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGluc2VydChydWxlKSB7XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBydWxlLnByaW9yaXR5ID09IG51bGwgPyA1MCA6IHJ1bGUucHJpb3JpdHksIGkgPSAwO1xuICAgICAgICAgICAgZm9yICg7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHJlc3VsdFtpXSwgbmV4dFByaW9yaXR5ID0gbmV4dC5wcmlvcml0eSA9PSBudWxsID8gNTAgOiBuZXh0LnByaW9yaXR5O1xuICAgICAgICAgICAgICAgIGlmIChuZXh0UHJpb3JpdHkgPCBwcmlvcml0eSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKGksIDAsIHJ1bGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubWFya3NbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm1hcmsgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5jbGVhck1hcmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5tYXJrID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2NoZW1hLm5vZGVzW25hbWVdLnNwZWMucGFyc2VET007XG4gICAgICAgICAgICBpZiAocnVsZXMpXG4gICAgICAgICAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KHJ1bGUgPSBjb3B5KHJ1bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocnVsZS5ub2RlIHx8IHJ1bGUuaWdub3JlIHx8IHJ1bGUubWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm5vZGUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIERPTSBwYXJzZXIgdXNpbmcgdGhlIHBhcnNpbmcgcnVsZXMgbGlzdGVkIGluIGFcbiAgICBzY2hlbWEncyBbbm9kZSBzcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnBhcnNlRE9NKSwgcmVvcmRlcmVkIGJ5XG4gICAgW3ByaW9yaXR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlLnByaW9yaXR5KS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC5kb21QYXJzZXIgfHxcbiAgICAgICAgICAgIChzY2hlbWEuY2FjaGVkLmRvbVBhcnNlciA9IG5ldyBET01QYXJzZXIoc2NoZW1hLCBET01QYXJzZXIuc2NoZW1hUnVsZXMoc2NoZW1hKSkpO1xuICAgIH1cbn1cbmNvbnN0IGJsb2NrVGFncyA9IHtcbiAgICBhZGRyZXNzOiB0cnVlLCBhcnRpY2xlOiB0cnVlLCBhc2lkZTogdHJ1ZSwgYmxvY2txdW90ZTogdHJ1ZSwgY2FudmFzOiB0cnVlLFxuICAgIGRkOiB0cnVlLCBkaXY6IHRydWUsIGRsOiB0cnVlLCBmaWVsZHNldDogdHJ1ZSwgZmlnY2FwdGlvbjogdHJ1ZSwgZmlndXJlOiB0cnVlLFxuICAgIGZvb3RlcjogdHJ1ZSwgZm9ybTogdHJ1ZSwgaDE6IHRydWUsIGgyOiB0cnVlLCBoMzogdHJ1ZSwgaDQ6IHRydWUsIGg1OiB0cnVlLFxuICAgIGg2OiB0cnVlLCBoZWFkZXI6IHRydWUsIGhncm91cDogdHJ1ZSwgaHI6IHRydWUsIGxpOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2w6IHRydWUsXG4gICAgb3V0cHV0OiB0cnVlLCBwOiB0cnVlLCBwcmU6IHRydWUsIHNlY3Rpb246IHRydWUsIHRhYmxlOiB0cnVlLCB0Zm9vdDogdHJ1ZSwgdWw6IHRydWVcbn07XG5jb25zdCBpZ25vcmVUYWdzID0ge1xuICAgIGhlYWQ6IHRydWUsIG5vc2NyaXB0OiB0cnVlLCBvYmplY3Q6IHRydWUsIHNjcmlwdDogdHJ1ZSwgc3R5bGU6IHRydWUsIHRpdGxlOiB0cnVlXG59O1xuY29uc3QgbGlzdFRhZ3MgPSB7IG9sOiB0cnVlLCB1bDogdHJ1ZSB9O1xuLy8gVXNpbmcgYSBiaXRmaWVsZCBmb3Igbm9kZSBjb250ZXh0IG9wdGlvbnNcbmNvbnN0IE9QVF9QUkVTRVJWRV9XUyA9IDEsIE9QVF9QUkVTRVJWRV9XU19GVUxMID0gMiwgT1BUX09QRU5fTEVGVCA9IDQ7XG5mdW5jdGlvbiB3c09wdGlvbnNGb3IodHlwZSwgcHJlc2VydmVXaGl0ZXNwYWNlLCBiYXNlKSB7XG4gICAgaWYgKHByZXNlcnZlV2hpdGVzcGFjZSAhPSBudWxsKVxuICAgICAgICByZXR1cm4gKHByZXNlcnZlV2hpdGVzcGFjZSA/IE9QVF9QUkVTRVJWRV9XUyA6IDApIHxcbiAgICAgICAgICAgIChwcmVzZXJ2ZVdoaXRlc3BhY2UgPT09IFwiZnVsbFwiID8gT1BUX1BSRVNFUlZFX1dTX0ZVTEwgOiAwKTtcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiA/IE9QVF9QUkVTRVJWRV9XUyB8IE9QVF9QUkVTRVJWRV9XU19GVUxMIDogYmFzZSAmIH5PUFRfT1BFTl9MRUZUO1xufVxuY2xhc3MgTm9kZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGF0dHJzLCBtYXJrcywgc29saWQsIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnNvbGlkID0gc29saWQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICAvLyBNYXJrcyBhcHBsaWVkIHRvIHRoZSBub2RlJ3MgY2hpbGRyZW5cbiAgICAgICAgdGhpcy5hY3RpdmVNYXJrcyA9IE1hcmsubm9uZTtcbiAgICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoIHx8IChvcHRpb25zICYgT1BUX09QRU5fTEVGVCA/IG51bGwgOiB0eXBlLmNvbnRlbnRNYXRjaCk7XG4gICAgfVxuICAgIGZpbmRXcmFwcGluZyhub2RlKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGZpbGwgPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZnJvbShub2RlKSk7XG4gICAgICAgICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoZmlsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLCB3cmFwO1xuICAgICAgICAgICAgICAgIGlmICh3cmFwID0gc3RhcnQuZmluZFdyYXBwaW5nKG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaC5maW5kV3JhcHBpbmcobm9kZS50eXBlKTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKCEodGhpcy5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSkgeyAvLyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0sIG07XG4gICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LmlzVGV4dCAmJiAobSA9IC9bIFxcdFxcclxcblxcdTAwMGNdKyQvLmV4ZWMobGFzdC50ZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QudGV4dC5sZW5ndGggPT0gbVswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gPSB0ZXh0LndpdGhUZXh0KHRleHQudGV4dC5zbGljZSgwLCB0ZXh0LnRleHQubGVuZ3RoIC0gbVswXS5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmZyb20odGhpcy5jb250ZW50KTtcbiAgICAgICAgaWYgKCFvcGVuRW5kICYmIHRoaXMubWF0Y2gpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5hcHBlbmQodGhpcy5tYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPyB0aGlzLnR5cGUuY3JlYXRlKHRoaXMuYXR0cnMsIGNvbnRlbnQsIHRoaXMubWFya3MpIDogY29udGVudDtcbiAgICB9XG4gICAgaW5saW5lQ29udGV4dChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFswXS5pc0lubGluZTtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiAhYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG59XG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBwYXJzZXIgd2UgYXJlIHVzaW5nLlxuICAgIHBhcnNlciwgXG4gICAgLy8gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgb3B0aW9ucywgaXNPcGVuKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgdGhpcy5sb2NhbFByZXNlcnZlV1MgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRvcE5vZGUgPSBvcHRpb25zLnRvcE5vZGUsIHRvcENvbnRleHQ7XG4gICAgICAgIGxldCB0b3BPcHRpb25zID0gd3NPcHRpb25zRm9yKG51bGwsIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlLCAwKSB8IChpc09wZW4gPyBPUFRfT1BFTl9MRUZUIDogMCk7XG4gICAgICAgIGlmICh0b3BOb2RlKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dCh0b3BOb2RlLnR5cGUsIHRvcE5vZGUuYXR0cnMsIE1hcmsubm9uZSwgdHJ1ZSwgb3B0aW9ucy50b3BNYXRjaCB8fCB0b3BOb2RlLnR5cGUuY29udGVudE1hdGNoLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZSBpZiAoaXNPcGVuKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChudWxsLCBudWxsLCBNYXJrLm5vbmUsIHRydWUsIG51bGwsIHRvcE9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KHBhcnNlci5zY2hlbWEudG9wTm9kZVR5cGUsIG51bGwsIE1hcmsubm9uZSwgdHJ1ZSwgbnVsbCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdG9wQ29udGV4dF07XG4gICAgICAgIHRoaXMuZmluZCA9IG9wdGlvbnMuZmluZFBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCB0b3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMub3Blbl07XG4gICAgfVxuICAgIC8vIEFkZCBhIERPTSBub2RlIHRvIHRoZSBjb250ZW50LiBUZXh0IGlzIGluc2VydGVkIGFzIHRleHQgbm9kZSxcbiAgICAvLyBvdGhlcndpc2UsIHRoZSBub2RlIGlzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAgb3IsIGlmIGl0IGhhcyBhXG4gICAgLy8gYHN0eWxlYCBhdHRyaWJ1dGUsIGBhZGRFbGVtZW50V2l0aFN0eWxlc2AuXG4gICAgYWRkRE9NKGRvbSwgbWFya3MpIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5hZGRUZXh0Tm9kZShkb20sIG1hcmtzKTtcbiAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnQoZG9tLCBtYXJrcyk7XG4gICAgfVxuICAgIGFkZFRleHROb2RlKGRvbSwgbWFya3MpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZG9tLm5vZGVWYWx1ZTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wLCBwcmVzZXJ2ZVdTID0gKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwpID8gXCJmdWxsXCJcbiAgICAgICAgICAgIDogdGhpcy5sb2NhbFByZXNlcnZlV1MgfHwgKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSA+IDA7XG4gICAgICAgIGlmIChwcmVzZXJ2ZVdTID09PSBcImZ1bGxcIiB8fFxuICAgICAgICAgICAgdG9wLmlubGluZUNvbnRleHQoZG9tKSB8fFxuICAgICAgICAgICAgL1teIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZVdTKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bIFxcdFxcclxcblxcdTAwMGNdKy9nLCBcIiBcIik7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlLCBhbmQgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUgaXQsIG9yXG4gICAgICAgICAgICAgICAgLy8gYSBoYXJkIGJyZWFrLCBvciBhIHRleHQgbm9kZSB0aGF0IGVuZHMgd2l0aCB3aGl0ZXNwYWNlLCBzdHJpcCB0aGVcbiAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIHNwYWNlLlxuICAgICAgICAgICAgICAgIGlmICgvXlsgXFx0XFxyXFxuXFx1MDAwY10vLnRlc3QodmFsdWUpICYmIHRoaXMub3BlbiA9PSB0aGlzLm5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVCZWZvcmUgPSB0b3AuY29udGVudFt0b3AuY29udGVudC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbU5vZGVCZWZvcmUgPSBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVCZWZvcmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkb21Ob2RlQmVmb3JlICYmIGRvbU5vZGVCZWZvcmUubm9kZU5hbWUgPT0gJ0JSJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChub2RlQmVmb3JlLmlzVGV4dCAmJiAvWyBcXHRcXHJcXG5cXHUwMDBjXSQvLnRlc3Qobm9kZUJlZm9yZS50ZXh0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXNlcnZlV1MgIT09IFwiZnVsbFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnROb2RlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KHZhbHVlKSwgbWFya3MsICEvXFxTLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLmZpbmRJblRleHQoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHRhZyBhbmQgdXNlIHRoYXQgdG8gcGFyc2UuIElmXG4gICAgLy8gbm9uZSBpcyBmb3VuZCwgdGhlIGVsZW1lbnQncyBjb250ZW50IG5vZGVzIGFyZSBhZGRlZCBkaXJlY3RseS5cbiAgICBhZGRFbGVtZW50KGRvbSwgbWFya3MsIG1hdGNoQWZ0ZXIpIHtcbiAgICAgICAgbGV0IG91dGVyV1MgPSB0aGlzLmxvY2FsUHJlc2VydmVXUywgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChkb20udGFnTmFtZSA9PSBcIlBSRVwiIHx8IC9wcmUvLnRlc3QoZG9tLnN0eWxlICYmIGRvbS5zdHlsZS53aGl0ZVNwYWNlKSlcbiAgICAgICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5hbWUgPSBkb20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcnVsZUlEO1xuICAgICAgICBpZiAobGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgdGhpcy5wYXJzZXIubm9ybWFsaXplTGlzdHMpXG4gICAgICAgICAgICBub3JtYWxpemVMaXN0KGRvbSk7XG4gICAgICAgIGxldCBydWxlID0gKHRoaXMub3B0aW9ucy5ydWxlRnJvbU5vZGUgJiYgdGhpcy5vcHRpb25zLnJ1bGVGcm9tTm9kZShkb20pKSB8fFxuICAgICAgICAgICAgKHJ1bGVJRCA9IHRoaXMucGFyc2VyLm1hdGNoVGFnKGRvbSwgdGhpcywgbWF0Y2hBZnRlcikpO1xuICAgICAgICBvdXQ6IGlmIChydWxlID8gcnVsZS5pZ25vcmUgOiBpZ25vcmVUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXJ1bGUgfHwgcnVsZS5za2lwIHx8IHJ1bGUuY2xvc2VQYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUuY2xvc2VQYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuID0gTWF0aC5tYXgoMCwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlICYmIHJ1bGUuc2tpcC5ub2RlVHlwZSlcbiAgICAgICAgICAgICAgICBkb20gPSBydWxlLnNraXA7XG4gICAgICAgICAgICBsZXQgc3luYywgb2xkTmVlZHNCbG9jayA9IHRoaXMubmVlZHNCbG9jaztcbiAgICAgICAgICAgIGlmIChibG9ja1RhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wLmNvbnRlbnQubGVuZ3RoICYmIHRvcC5jb250ZW50WzBdLmlzSW5saW5lICYmIHRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGhpcy50b3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdG9wLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZGYWxsYmFjayhkb20sIG1hcmtzKTtcbiAgICAgICAgICAgICAgICBicmVhayBvdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHJ1bGUgJiYgcnVsZS5za2lwID8gbWFya3MgOiB0aGlzLnJlYWRTdHlsZXMoZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICBpZiAoaW5uZXJNYXJrcylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFsbChkb20sIGlubmVyTWFya3MpO1xuICAgICAgICAgICAgaWYgKHN5bmMpXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRvcCk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQmxvY2sgPSBvbGROZWVkc0Jsb2NrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlubmVyTWFya3MgPSB0aGlzLnJlYWRTdHlsZXMoZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICBpZiAoaW5uZXJNYXJrcylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRCeVJ1bGUoZG9tLCBydWxlLCBpbm5lck1hcmtzLCBydWxlLmNvbnN1bWluZyA9PT0gZmFsc2UgPyBydWxlSUQgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gb3V0ZXJXUztcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGZvciBsZWFmIERPTSBub2RlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBpZ25vcmVkXG4gICAgbGVhZkZhbGxiYWNrKGRvbSwgbWFya3MpIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgdGhpcy50b3AudHlwZSAmJiB0aGlzLnRvcC50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXFxuXCIpLCBtYXJrcyk7XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgaWdub3JlZCBub2Rlc1xuICAgIGlnbm9yZUZhbGxiYWNrKGRvbSwgbWFya3MpIHtcbiAgICAgICAgLy8gSWdub3JlZCBCUiBub2RlcyBzaG91bGQgYXQgbGVhc3QgY3JlYXRlIGFuIGlubGluZSBjb250ZXh0XG4gICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmICghdGhpcy50b3AudHlwZSB8fCAhdGhpcy50b3AudHlwZS5pbmxpbmVDb250ZW50KSlcbiAgICAgICAgICAgIHRoaXMuZmluZFBsYWNlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KFwiLVwiKSwgbWFya3MsIHRydWUpO1xuICAgIH1cbiAgICAvLyBSdW4gYW55IHN0eWxlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUncyBzdHlsZXMuIEVpdGhlclxuICAgIC8vIHJldHVybiBhbiB1cGRhdGVkIGFycmF5IG9mIG1hcmtzLCBvciBudWxsIHRvIGluZGljYXRlIHNvbWUgb2YgdGhlXG4gICAgLy8gc3R5bGVzIGhhZCBhIHJ1bGUgd2l0aCBgaWdub3JlYCBzZXQuXG4gICAgcmVhZFN0eWxlcyhkb20sIG1hcmtzKSB7XG4gICAgICAgIGxldCBzdHlsZXMgPSBkb20uc3R5bGU7XG4gICAgICAgIC8vIEJlY2F1c2UgbWFueSBwcm9wZXJ0aWVzIHdpbGwgb25seSBzaG93IHVwIGluICdub3JtYWxpemVkJyBmb3JtXG4gICAgICAgIC8vIGluIGBzdHlsZS5pdGVtYCAoaS5lLiB0ZXh0LWRlY29yYXRpb24gYmVjb21lc1xuICAgICAgICAvLyB0ZXh0LWRlY29yYXRpb24tbGluZSwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBldGMpLCB3ZSBkaXJlY3RseVxuICAgICAgICAvLyBxdWVyeSB0aGUgc3R5bGVzIG1lbnRpb25lZCBpbiBvdXIgcnVsZXMgaW5zdGVhZCBvZiBpdGVyYXRpbmdcbiAgICAgICAgLy8gb3ZlciB0aGUgaXRlbXMuXG4gICAgICAgIGlmIChzdHlsZXMgJiYgc3R5bGVzLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZXIubWF0Y2hlZFN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYXJzZXIubWF0Y2hlZFN0eWxlc1tpXSwgdmFsdWUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFmdGVyID0gdW5kZWZpbmVkOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy5wYXJzZXIubWF0Y2hTdHlsZShuYW1lLCB2YWx1ZSwgdGhpcywgYWZ0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFydWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaWdub3JlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY2xlYXJNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4gIXJ1bGUuY2xlYXJNYXJrKG0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmNvbmNhdCh0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXS5jcmVhdGUocnVsZS5hdHRycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY29uc3VtaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IHJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBMb29rIHVwIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIG5vZGUuIElmIG5vbmUgYXJlIGZvdW5kLCByZXR1cm5cbiAgICAvLyBmYWxzZS4gT3RoZXJ3aXNlLCBhcHBseSBpdCwgdXNlIGl0cyByZXR1cm4gdmFsdWUgdG8gZHJpdmUgdGhlIHdheVxuICAgIC8vIHRoZSBub2RlJ3MgY29udGVudCBpcyB3cmFwcGVkLCBhbmQgcmV0dXJuIHRydWUuXG4gICAgYWRkRWxlbWVudEJ5UnVsZShkb20sIHJ1bGUsIG1hcmtzLCBjb250aW51ZUFmdGVyKSB7XG4gICAgICAgIGxldCBzeW5jLCBub2RlVHlwZTtcbiAgICAgICAgaWYgKHJ1bGUubm9kZSkge1xuICAgICAgICAgICAgbm9kZVR5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXNbcnVsZS5ub2RlXTtcbiAgICAgICAgICAgIGlmICghbm9kZVR5cGUuaXNMZWFmKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlubmVyID0gdGhpcy5lbnRlcihub2RlVHlwZSwgcnVsZS5hdHRycyB8fCBudWxsLCBtYXJrcywgcnVsZS5wcmVzZXJ2ZVdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lcikge1xuICAgICAgICAgICAgICAgICAgICBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBpbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5pbnNlcnROb2RlKG5vZGVUeXBlLmNyZWF0ZShydWxlLmF0dHJzKSwgbWFya3MsIGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWFmRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFya1R5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXTtcbiAgICAgICAgICAgIG1hcmtzID0gbWFya3MuY29uY2F0KG1hcmtUeXBlLmNyZWF0ZShydWxlLmF0dHJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0SW4gPSB0aGlzLnRvcDtcbiAgICAgICAgaWYgKG5vZGVUeXBlICYmIG5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGludWVBZnRlcikge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSwgbWFya3MsIGNvbnRpbnVlQWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUuZ2V0Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQoZG9tLCB0aGlzLnBhcnNlci5zY2hlbWEpLmZvckVhY2gobm9kZSA9PiB0aGlzLmluc2VydE5vZGUobm9kZSwgbWFya3MsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudERPTSA9IGRvbTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBkb20ucXVlcnlTZWxlY3RvcihydWxlLmNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBydWxlLmNvbnRlbnRFbGVtZW50ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gcnVsZS5jb250ZW50RWxlbWVudChkb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocnVsZS5jb250ZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gcnVsZS5jb250ZW50RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuZmluZEFyb3VuZChkb20sIGNvbnRlbnRET00sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRBbGwoY29udGVudERPTSwgbWFya3MpO1xuICAgICAgICAgICAgdGhpcy5maW5kQXJvdW5kKGRvbSwgY29udGVudERPTSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW5jICYmIHRoaXMuc3luYyhzdGFydEluKSlcbiAgICAgICAgICAgIHRoaXMub3Blbi0tO1xuICAgIH1cbiAgICAvLyBBZGQgYWxsIGNoaWxkIG5vZGVzIGJldHdlZW4gYHN0YXJ0SW5kZXhgIGFuZCBgZW5kSW5kZXhgIChvciB0aGVcbiAgICAvLyB3aG9sZSBub2RlLCBpZiBub3QgZ2l2ZW4pLiBJZiBgc3luY2AgaXMgcGFzc2VkLCB1c2UgaXQgdG9cbiAgICAvLyBzeW5jaHJvbml6ZSBhZnRlciBldmVyeSBibG9jayBlbGVtZW50LlxuICAgIGFkZEFsbChwYXJlbnQsIG1hcmtzLCBzdGFydEluZGV4LCBlbmRJbmRleCkge1xuICAgICAgICBsZXQgaW5kZXggPSBzdGFydEluZGV4IHx8IDA7XG4gICAgICAgIGZvciAobGV0IGRvbSA9IHN0YXJ0SW5kZXggPyBwYXJlbnQuY2hpbGROb2Rlc1tzdGFydEluZGV4XSA6IHBhcmVudC5maXJzdENoaWxkLCBlbmQgPSBlbmRJbmRleCA9PSBudWxsID8gbnVsbCA6IHBhcmVudC5jaGlsZE5vZGVzW2VuZEluZGV4XTsgZG9tICE9IGVuZDsgZG9tID0gZG9tLm5leHRTaWJsaW5nLCArK2luZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRBdFBvaW50KHBhcmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5hZGRET00oZG9tLCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpbmQgYSB3YXkgdG8gZml0IHRoZSBnaXZlbiBub2RlIHR5cGUgaW50byB0aGUgY3VycmVudFxuICAgIC8vIGNvbnRleHQuIE1heSBhZGQgaW50ZXJtZWRpYXRlIHdyYXBwZXJzIGFuZC9vciBsZWF2ZSBub24tc29saWRcbiAgICAvLyBub2RlcyB0aGF0IHdlJ3JlIGluLlxuICAgIGZpbmRQbGFjZShub2RlLCBtYXJrcywgY2F1dGlvdXMpIHtcbiAgICAgICAgbGV0IHJvdXRlLCBzeW5jO1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMub3BlbiwgcGVuYWx0eSA9IDA7IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBjeCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY3guZmluZFdyYXBwaW5nKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZvdW5kICYmICghcm91dGUgfHwgcm91dGUubGVuZ3RoID4gZm91bmQubGVuZ3RoICsgcGVuYWx0eSkpIHtcbiAgICAgICAgICAgICAgICByb3V0ZSA9IGZvdW5kO1xuICAgICAgICAgICAgICAgIHN5bmMgPSBjeDtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3guc29saWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F1dGlvdXMpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuc3luYyhzeW5jKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG1hcmtzID0gdGhpcy5lbnRlcklubmVyKHJvdXRlW2ldLCBudWxsLCBtYXJrcywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8vIFRyeSB0byBpbnNlcnQgdGhlIGdpdmVuIG5vZGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuIG5lZWRlZC5cbiAgICBpbnNlcnROb2RlKG5vZGUsIG1hcmtzLCBjYXV0aW91cykge1xuICAgICAgICBpZiAobm9kZS5pc0lubGluZSAmJiB0aGlzLm5lZWRzQmxvY2sgJiYgIXRoaXMudG9wLnR5cGUpIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IHRoaXMudGV4dGJsb2NrRnJvbUNvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChibG9jaylcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRoaXMuZW50ZXJJbm5lcihibG9jaywgbnVsbCwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lck1hcmtzID0gdGhpcy5maW5kUGxhY2Uobm9kZSwgbWFya3MsIGNhdXRpb3VzKTtcbiAgICAgICAgaWYgKGlubmVyTWFya3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgaWYgKHRvcC5tYXRjaClcbiAgICAgICAgICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2gubWF0Y2hUeXBlKG5vZGUudHlwZSk7XG4gICAgICAgICAgICBsZXQgbm9kZU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBpbm5lck1hcmtzLmNvbmNhdChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICBpZiAodG9wLnR5cGUgPyB0b3AudHlwZS5hbGxvd3NNYXJrVHlwZShtLnR5cGUpIDogbWFya01heUFwcGx5KG0udHlwZSwgbm9kZS50eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZU1hcmtzID0gbS5hZGRUb1NldChub2RlTWFya3MpO1xuICAgICAgICAgICAgdG9wLmNvbnRlbnQucHVzaChub2RlLm1hcmsobm9kZU1hcmtzKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRyeSB0byBzdGFydCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuXG4gICAgLy8gbmVjZXNzYXJ5LlxuICAgIGVudGVyKHR5cGUsIGF0dHJzLCBtYXJrcywgcHJlc2VydmVXUykge1xuICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHRoaXMuZmluZFBsYWNlKHR5cGUuY3JlYXRlKGF0dHJzKSwgbWFya3MsIGZhbHNlKTtcbiAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICBpbm5lck1hcmtzID0gdGhpcy5lbnRlcklubmVyKHR5cGUsIGF0dHJzLCBtYXJrcywgdHJ1ZSwgcHJlc2VydmVXUyk7XG4gICAgICAgIHJldHVybiBpbm5lck1hcmtzO1xuICAgIH1cbiAgICAvLyBPcGVuIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICAgIGVudGVySW5uZXIodHlwZSwgYXR0cnMsIG1hcmtzLCBzb2xpZCA9IGZhbHNlLCBwcmVzZXJ2ZVdTKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaCAmJiB0b3AubWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdTLCB0b3Aub3B0aW9ucyk7XG4gICAgICAgIGlmICgodG9wLm9wdGlvbnMgJiBPUFRfT1BFTl9MRUZUKSAmJiB0b3AuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUX09QRU5fTEVGVDtcbiAgICAgICAgbGV0IGFwcGx5TWFya3MgPSBNYXJrLm5vbmU7XG4gICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgaWYgKHRvcC50eXBlID8gdG9wLnR5cGUuYWxsb3dzTWFya1R5cGUobS50eXBlKSA6IG1hcmtNYXlBcHBseShtLnR5cGUsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlNYXJrcyA9IG0uYWRkVG9TZXQoYXBwbHlNYXJrcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobmV3IE5vZGVDb250ZXh0KHR5cGUsIGF0dHJzLCBhcHBseU1hcmtzLCBzb2xpZCwgbnVsbCwgb3B0aW9ucykpO1xuICAgICAgICB0aGlzLm9wZW4rKztcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgYWxsIG5vZGVzIGFib3ZlIHRoaXMub3BlbiBhcmUgZmluaXNoZWQgYW5kIGFkZGVkIHRvXG4gICAgLy8gdGhlaXIgcGFyZW50c1xuICAgIGNsb3NlRXh0cmEob3BlbkVuZCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaSA+IHRoaXMub3Blbikge1xuICAgICAgICAgICAgZm9yICg7IGkgPiB0aGlzLm9wZW47IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzW2kgLSAxXS5jb250ZW50LnB1c2godGhpcy5ub2Rlc1tpXS5maW5pc2gob3BlbkVuZCkpO1xuICAgICAgICAgICAgdGhpcy5ub2Rlcy5sZW5ndGggPSB0aGlzLm9wZW4gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgdGhpcy5jbG9zZUV4dHJhKHRoaXMuaXNPcGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF0uZmluaXNoKCEhKHRoaXMuaXNPcGVuIHx8IHRoaXMub3B0aW9ucy50b3BPcGVuKSk7XG4gICAgfVxuICAgIHN5bmModG8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzW2ldID09IHRvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuID0gaTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9jYWxQcmVzZXJ2ZVdTKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpXS5vcHRpb25zIHw9IE9QVF9QUkVTRVJWRV9XUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBjdXJyZW50UG9zKCkge1xuICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW47IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMubm9kZXNbaV0uY29udGVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBjb250ZW50Lmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKVxuICAgICAgICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgZmluZEF0UG9pbnQocGFyZW50LCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5ub2RlID09IHBhcmVudCAmJiB0aGlzLmZpbmRbaV0ub2Zmc2V0ID09IG9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEluc2lkZShwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5wb3MgPT0gbnVsbCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMSAmJiBwYXJlbnQuY29udGFpbnModGhpcy5maW5kW2ldLm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kQXJvdW5kKHBhcmVudCwgY29udGVudCwgYmVmb3JlKSB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gY29udGVudCAmJiB0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ucG9zID09IG51bGwgJiYgcGFyZW50Lm5vZGVUeXBlID09IDEgJiYgcGFyZW50LmNvbnRhaW5zKHRoaXMuZmluZFtpXS5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLmZpbmRbaV0ubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgJiAoYmVmb3JlID8gMiA6IDQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRJblRleHQodGV4dE5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5ub2RlID09IHRleHROb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zIC0gKHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGggLSB0aGlzLmZpbmRbaV0ub2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZXh0IHN0cmluZyBtYXRjaGVzIHRoaXMgY29udGV4dC5cbiAgICBtYXRjaGVzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCJ8XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5zcGxpdCgvXFxzKlxcfFxccyovKS5zb21lKHRoaXMubWF0Y2hlc0NvbnRleHQsIHRoaXMpO1xuICAgICAgICBsZXQgcGFydHMgPSBjb250ZXh0LnNwbGl0KFwiL1wiKTtcbiAgICAgICAgbGV0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBsZXQgdXNlUm9vdCA9ICF0aGlzLmlzT3BlbiAmJiAoIW9wdGlvbiB8fCBvcHRpb24ucGFyZW50LnR5cGUgPT0gdGhpcy5ub2Rlc1swXS50eXBlKTtcbiAgICAgICAgbGV0IG1pbkRlcHRoID0gLShvcHRpb24gPyBvcHRpb24uZGVwdGggKyAxIDogMCkgKyAodXNlUm9vdCA/IDAgOiAxKTtcbiAgICAgICAgbGV0IG1hdGNoID0gKGksIGRlcHRoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gcGFydHMubGVuZ3RoIC0gMSB8fCBpID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGRlcHRoID49IG1pbkRlcHRoOyBkZXB0aC0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKGkgLSAxLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gZGVwdGggPiAwIHx8IChkZXB0aCA9PSAwICYmIHVzZVJvb3QpID8gdGhpcy5ub2Rlc1tkZXB0aF0udHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb24gJiYgZGVwdGggPj0gbWluRGVwdGggPyBvcHRpb24ubm9kZShkZXB0aCAtIG1pbkRlcHRoKS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgKG5leHQubmFtZSAhPSBwYXJ0ICYmICFuZXh0LmlzSW5Hcm91cChwYXJ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYXRjaChwYXJ0cy5sZW5ndGggLSAxLCB0aGlzLm9wZW4pO1xuICAgIH1cbiAgICB0ZXh0YmxvY2tGcm9tQ29udGV4dCgpIHtcbiAgICAgICAgbGV0ICRjb250ZXh0ID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmICgkY29udGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVmbHQgPSAkY29udGV4dC5ub2RlKGQpLmNvbnRlbnRNYXRjaEF0KCRjb250ZXh0LmluZGV4QWZ0ZXIoZCkpLmRlZmF1bHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jayAmJiBkZWZsdC5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXMpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgZGlyZWN0bHkgbmVzdGVkIGxpc3Qgbm9kZXMgcHJvZHVjZWQgYnkgc29tZVxuLy8gdG9vbHMgYW5kIGFsbG93ZWQgYnkgYnJvd3NlcnMgdG8gbWVhbiB0aGF0IHRoZSBuZXN0ZWQgbGlzdCBpc1xuLy8gYWN0dWFsbHkgcGFydCBvZiB0aGUgbGlzdCBpdGVtIGFib3ZlIGl0LlxuZnVuY3Rpb24gbm9ybWFsaXplTGlzdChkb20pIHtcbiAgICBmb3IgKGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkLCBwcmV2SXRlbSA9IG51bGw7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBuYW1lID0gY2hpbGQubm9kZVR5cGUgPT0gMSA/IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICBpZiAobmFtZSAmJiBsaXN0VGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBwcmV2SXRlbSkge1xuICAgICAgICAgICAgcHJldkl0ZW0uYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgY2hpbGQgPSBwcmV2SXRlbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09IFwibGlcIikge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBwcmV2SXRlbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBBcHBseSBhIENTUyBzZWxlY3Rvci5cbmZ1bmN0aW9uIG1hdGNoZXMoZG9tLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiAoZG9tLm1hdGNoZXMgfHwgZG9tLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZG9tLm1vek1hdGNoZXNTZWxlY3RvcikuY2FsbChkb20sIHNlbGVjdG9yKTtcbn1cbmZ1bmN0aW9uIGNvcHkob2JqKSB7XG4gICAgbGV0IGNvcHkgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iailcbiAgICAgICAgY29weVtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICByZXR1cm4gY29weTtcbn1cbi8vIFVzZWQgd2hlbiBmaW5kaW5nIGEgbWFyayBhdCB0aGUgdG9wIGxldmVsIG9mIGEgZnJhZ21lbnQgcGFyc2UuXG4vLyBDaGVja3Mgd2hldGhlciBpdCB3b3VsZCBiZSByZWFzb25hYmxlIHRvIGFwcGx5IGEgZ2l2ZW4gbWFyayB0eXBlIHRvXG4vLyBhIGdpdmVuIG5vZGUsIGJ5IGxvb2tpbmcgYXQgdGhlIHdheSB0aGUgbWFyayBvY2N1cnMgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG1hcmtNYXlBcHBseShtYXJrVHlwZSwgbm9kZVR5cGUpIHtcbiAgICBsZXQgbm9kZXMgPSBub2RlVHlwZS5zY2hlbWEubm9kZXM7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBub2Rlcykge1xuICAgICAgICBsZXQgcGFyZW50ID0gbm9kZXNbbmFtZV07XG4gICAgICAgIGlmICghcGFyZW50LmFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc2VlbiA9IFtdLCBzY2FuID0gKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBzZWVuLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5lZGdlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbm9kZVR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmluZGV4T2YobmV4dCkgPCAwICYmIHNjYW4obmV4dCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2NhbihwYXJlbnQuY29udGVudE1hdGNoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuLyoqXG5BIERPTSBzZXJpYWxpemVyIGtub3dzIGhvdyB0byBjb252ZXJ0IFByb3NlTWlycm9yIG5vZGVzIGFuZFxubWFya3Mgb2YgdmFyaW91cyB0eXBlcyB0byBET00gbm9kZXMuXG4qL1xuY2xhc3MgRE9NU2VyaWFsaXplciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VyaWFsaXplci4gYG5vZGVzYCBzaG91bGQgbWFwIG5vZGUgbmFtZXMgdG8gZnVuY3Rpb25zXG4gICAgdGhhdCB0YWtlIGEgbm9kZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICBET00uIGBtYXJrc2AgZG9lcyB0aGUgc2FtZSBmb3IgbWFyayBuYW1lcywgYnV0IGFsc28gZ2V0cyBhblxuICAgIGFyZ3VtZW50IHRoYXQgdGVsbHMgaXQgd2hldGhlciB0aGUgbWFyaydzIGNvbnRlbnQgaXMgYmxvY2sgb3JcbiAgICBpbmxpbmUgY29udGVudCAoZm9yIHR5cGljYWwgdXNlLCBpdCdsbCBhbHdheXMgYmUgaW5saW5lKS4gQSBtYXJrXG4gICAgc2VyaWFsaXplciBtYXkgYmUgYG51bGxgIHRvIGluZGljYXRlIHRoYXQgbWFya3Mgb2YgdGhhdCB0eXBlXG4gICAgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMuXG4gICAgKi9cbiAgICBub2RlcywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMuXG4gICAgKi9cbiAgICBtYXJrcykge1xuICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhZ21lbnQgdG8gYSBET00gZnJhZ21lbnQuIFdoZW5cbiAgICBub3QgaW4gdGhlIGJyb3dzZXIsIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiwgY29udGFpbmluZyBhIERPTVxuICAgIGRvY3VtZW50LCBzaG91bGQgYmUgcGFzc2VkIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZXIgY2FuIGNyZWF0ZVxuICAgIG5vZGVzLlxuICAgICovXG4gICAgc2VyaWFsaXplRnJhZ21lbnQoZnJhZ21lbnQsIG9wdGlvbnMgPSB7fSwgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gZG9jKG9wdGlvbnMpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgbGV0IHRvcCA9IHRhcmdldCwgYWN0aXZlID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlLmxlbmd0aCB8fCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBrZWVwID0gMCwgcmVuZGVyZWQgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aCAmJiByZW5kZXJlZCA8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5tYXJrc1tyZW5kZXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrc1tuZXh0LnR5cGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQuZXEoYWN0aXZlW2tlZXBdWzBdKSB8fCBuZXh0LnR5cGUuc3BlYy5zcGFubmluZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAga2VlcCsrO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IGFjdGl2ZS5wb3AoKVsxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0gbm9kZS5tYXJrc1tyZW5kZXJlZCsrXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtET00gPSB0aGlzLnNlcmlhbGl6ZU1hcmsoYWRkLCBub2RlLmlzSW5saW5lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKFthZGQsIHRvcF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmFwcGVuZENoaWxkKG1hcmtET00uZG9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IG1hcmtET00uY29udGVudERPTSB8fCBtYXJrRE9NLmRvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB7IGRvbSwgY29udGVudERPTSB9ID0gcmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKG5vZGUpLCBudWxsLCBub2RlLmF0dHJzKTtcbiAgICAgICAgaWYgKGNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBub3QgYWxsb3dlZCBpbiBhIGxlYWYgbm9kZSBzcGVjXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVGcmFnbWVudChub2RlLmNvbnRlbnQsIG9wdGlvbnMsIGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIG5vZGUgdG8gYSBET00gbm9kZS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91XG4gICAgbmVlZCB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4gICAgZG9jdW1lbnQuIFRvIHNlcmlhbGl6ZSBhIHdob2xlIGRvY3VtZW50LCB1c2VcbiAgICBbYHNlcmlhbGl6ZUZyYWdtZW50YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQpIG9uXG4gICAgaXRzIFtjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5jb250ZW50KS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBkb20gPSB0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwID0gdGhpcy5zZXJpYWxpemVNYXJrKG5vZGUubWFya3NbaV0sIG5vZGUuaXNJbmxpbmUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHdyYXApIHtcbiAgICAgICAgICAgICAgICAod3JhcC5jb250ZW50RE9NIHx8IHdyYXAuZG9tKS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXAuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2VyaWFsaXplTWFyayhtYXJrLCBpbmxpbmUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgdG9ET00gPSB0aGlzLm1hcmtzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgcmV0dXJuIHRvRE9NICYmIHJlbmRlclNwZWMoZG9jKG9wdGlvbnMpLCB0b0RPTShtYXJrLCBpbmxpbmUpLCBudWxsLCBtYXJrLmF0dHJzKTtcbiAgICB9XG4gICAgc3RhdGljIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TID0gbnVsbCwgYmxvY2tBcnJheXNJbikge1xuICAgICAgICByZXR1cm4gcmVuZGVyU3BlYyhkb2MsIHN0cnVjdHVyZSwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHNlcmlhbGl6ZXIgdXNpbmcgdGhlIFtgdG9ET01gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMudG9ET00pXG4gICAgcHJvcGVydGllcyBpbiBhIHNjaGVtYSdzIG5vZGUgYW5kIG1hcmsgc3BlY3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKHRoaXMubm9kZXNGcm9tU2NoZW1hKHNjaGVtYSksIHRoaXMubWFya3NGcm9tU2NoZW1hKHNjaGVtYSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2F0aGVyIHRoZSBzZXJpYWxpemVycyBpbiBhIHNjaGVtYSdzIG5vZGUgc3BlY3MgaW50byBhbiBvYmplY3QuXG4gICAgVGhpcyBjYW4gYmUgdXNlZnVsIGFzIGEgYmFzZSB0byBidWlsZCBhIGN1c3RvbSBzZXJpYWxpemVyIGZyb20uXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZXNGcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZ2F0aGVyVG9ET00oc2NoZW1hLm5vZGVzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ID0gbm9kZSA9PiBub2RlLnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBtYXJrIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIG1hcmtzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIGdhdGhlclRvRE9NKHNjaGVtYS5tYXJrcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2F0aGVyVG9ET00ob2JqKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2JqKSB7XG4gICAgICAgIGxldCB0b0RPTSA9IG9ialtuYW1lXS5zcGVjLnRvRE9NO1xuICAgICAgICBpZiAodG9ET00pXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB0b0RPTTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvYyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50O1xufVxuY29uc3Qgc3VzcGljaW91c0F0dHJpYnV0ZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHN1c3BpY2lvdXNBdHRyaWJ1dGVzKGF0dHJzKSB7XG4gICAgbGV0IHZhbHVlID0gc3VzcGljaW91c0F0dHJpYnV0ZUNhY2hlLmdldChhdHRycyk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZS5zZXQoYXR0cnMsIHZhbHVlID0gc3VzcGljaW91c0F0dHJpYnV0ZXNJbm5lcihhdHRycykpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHN1c3BpY2lvdXNBdHRyaWJ1dGVzSW5uZXIoYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmdW5jdGlvbiBzY2FuKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FuKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBzY2FuKHZhbHVlW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuKGF0dHJzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcmVuZGVyU3BlYyhkb2MsIHN0cnVjdHVyZSwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pIHtcbiAgICBpZiAodHlwZW9mIHN0cnVjdHVyZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4geyBkb206IGRvYy5jcmVhdGVUZXh0Tm9kZShzdHJ1Y3R1cmUpIH07XG4gICAgaWYgKHN0cnVjdHVyZS5ub2RlVHlwZSAhPSBudWxsKVxuICAgICAgICByZXR1cm4geyBkb206IHN0cnVjdHVyZSB9O1xuICAgIGlmIChzdHJ1Y3R1cmUuZG9tICYmIHN0cnVjdHVyZS5kb20ubm9kZVR5cGUgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcbiAgICBsZXQgdGFnTmFtZSA9IHN0cnVjdHVyZVswXSwgc3VzcGljaW91cztcbiAgICBpZiAodHlwZW9mIHRhZ05hbWUgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFycmF5IHBhc3NlZCB0byByZW5kZXJTcGVjXCIpO1xuICAgIGlmIChibG9ja0FycmF5c0luICYmIChzdXNwaWNpb3VzID0gc3VzcGljaW91c0F0dHJpYnV0ZXMoYmxvY2tBcnJheXNJbikpICYmXG4gICAgICAgIHN1c3BpY2lvdXMuaW5kZXhPZihzdHJ1Y3R1cmUpID4gLTEpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNpbmcgYW4gYXJyYXkgZnJvbSBhbiBhdHRyaWJ1dGUgb2JqZWN0IGFzIGEgRE9NIHNwZWMuIFRoaXMgbWF5IGJlIGFuIGF0dGVtcHRlZCBjcm9zcyBzaXRlIHNjcmlwdGluZyBhdHRhY2suXCIpO1xuICAgIGxldCBzcGFjZSA9IHRhZ05hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgaWYgKHNwYWNlID4gMCkge1xuICAgICAgICB4bWxOUyA9IHRhZ05hbWUuc2xpY2UoMCwgc3BhY2UpO1xuICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS5zbGljZShzcGFjZSArIDEpO1xuICAgIH1cbiAgICBsZXQgY29udGVudERPTTtcbiAgICBsZXQgZG9tID0gKHhtbE5TID8gZG9jLmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgdGFnTmFtZSkgOiBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7XG4gICAgbGV0IGF0dHJzID0gc3RydWN0dXJlWzFdLCBzdGFydCA9IDE7XG4gICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PSBcIm9iamVjdFwiICYmIGF0dHJzLm5vZGVUeXBlID09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoYXR0cnMpKSB7XG4gICAgICAgIHN0YXJ0ID0gMjtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycylcbiAgICAgICAgICAgIGlmIChhdHRyc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwYWNlID0gbmFtZS5pbmRleE9mKFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2UgPiAwKVxuICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlTlMobmFtZS5zbGljZSgwLCBzcGFjZSksIG5hbWUuc2xpY2Uoc3BhY2UgKyAxKSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBzdHJ1Y3R1cmVbaV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGkgPCBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSB8fCBpID4gc3RhcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbXVzdCBiZSB0aGUgb25seSBjaGlsZCBvZiBpdHMgcGFyZW50IG5vZGVcIik7XG4gICAgICAgICAgICByZXR1cm4geyBkb20sIGNvbnRlbnRET006IGRvbSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgZG9tOiBpbm5lciwgY29udGVudERPTTogaW5uZXJDb250ZW50IH0gPSByZW5kZXJTcGVjKGRvYywgY2hpbGQsIHhtbE5TLCBibG9ja0FycmF5c0luKTtcbiAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChpbm5lcik7XG4gICAgICAgICAgICBpZiAoaW5uZXJDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVsdGlwbGUgY29udGVudCBob2xlc1wiKTtcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gaW5uZXJDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTSB9O1xufVxuXG5leHBvcnQgeyBDb250ZW50TWF0Y2gsIERPTVBhcnNlciwgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIE1hcmtUeXBlLCBOb2RlLCBOb2RlUmFuZ2UsIE5vZGVUeXBlLCBSZXBsYWNlRXJyb3IsIFJlc29sdmVkUG9zLCBTY2hlbWEsIFNsaWNlIH07XG4iLCJpbXBvcnQgeyBSZXBsYWNlRXJyb3IsIFNsaWNlLCBGcmFnbWVudCwgTWFya1R5cGUsIE1hcmsgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbi8vIFJlY292ZXJ5IHZhbHVlcyBlbmNvZGUgYSByYW5nZSBpbmRleCBhbmQgYW4gb2Zmc2V0LiBUaGV5IGFyZVxuLy8gcmVwcmVzZW50ZWQgYXMgbnVtYmVycywgYmVjYXVzZSB0b25zIG9mIHRoZW0gd2lsbCBiZSBjcmVhdGVkIHdoZW5cbi8vIG1hcHBpbmcsIGZvciBleGFtcGxlLCBhIGxhcmdlIG51bWJlciBvZiBkZWNvcmF0aW9ucy4gVGhlIG51bWJlcidzXG4vLyBsb3dlciAxNiBiaXRzIHByb3ZpZGUgdGhlIGluZGV4LCB0aGUgcmVtYWluaW5nIGJpdHMgdGhlIG9mZnNldC5cbi8vXG4vLyBOb3RlOiBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBiaXQgc2hpZnQgb3BlcmF0b3JzIHRvIGVuLSBhbmRcbi8vIGRlY29kZSB0aGVzZSwgc2luY2UgdGhvc2UgY2xpcCB0byAzMiBiaXRzLCB3aGljaCB3ZSBtaWdodCBpbiByYXJlXG4vLyBjYXNlcyB3YW50IHRvIG92ZXJmbG93LiBBIDY0LWJpdCBmbG9hdCBjYW4gcmVwcmVzZW50IDQ4LWJpdFxuLy8gaW50ZWdlcnMgcHJlY2lzZWx5LlxuY29uc3QgbG93ZXIxNiA9IDB4ZmZmZjtcbmNvbnN0IGZhY3RvcjE2ID0gTWF0aC5wb3coMiwgMTYpO1xuZnVuY3Rpb24gbWFrZVJlY292ZXIoaW5kZXgsIG9mZnNldCkgeyByZXR1cm4gaW5kZXggKyBvZmZzZXQgKiBmYWN0b3IxNjsgfVxuZnVuY3Rpb24gcmVjb3ZlckluZGV4KHZhbHVlKSB7IHJldHVybiB2YWx1ZSAmIGxvd2VyMTY7IH1cbmZ1bmN0aW9uIHJlY292ZXJPZmZzZXQodmFsdWUpIHsgcmV0dXJuICh2YWx1ZSAtICh2YWx1ZSAmIGxvd2VyMTYpKSAvIGZhY3RvcjE2OyB9XG5jb25zdCBERUxfQkVGT1JFID0gMSwgREVMX0FGVEVSID0gMiwgREVMX0FDUk9TUyA9IDQsIERFTF9TSURFID0gODtcbi8qKlxuQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIG1hcHBlZCBwb3NpdGlvbiB3aXRoIGV4dHJhXG5pbmZvcm1hdGlvbi5cbiovXG5jbGFzcyBNYXBSZXN1bHQge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG1hcHBlZCB2ZXJzaW9uIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkZWxJbmZvLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXIpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZGVsSW5mbyA9IGRlbEluZm87XG4gICAgICAgIHRoaXMucmVjb3ZlciA9IHJlY292ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBwb3NpdGlvbiB3YXMgZGVsZXRlZCwgdGhhdCBpcywgd2hldGhlciB0aGVcbiAgICBzdGVwIHJlbW92ZWQgdGhlIHRva2VuIG9uIHRoZSBzaWRlIHF1ZXJpZWQgKHZpYSB0aGUgYGFzc29jYClcbiAgICBhcmd1bWVudCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkZWxldGVkKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIERFTF9TSURFKSA+IDA7IH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgdG9rZW4gYmVmb3JlIHRoZSBtYXBwZWQgcG9zaXRpb24gd2FzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEJlZm9yZSgpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiAoREVMX0JFRk9SRSB8IERFTF9BQ1JPU1MpKSA+IDA7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIHRva2VuIGFmdGVyIHRoZSBtYXBwZWQgcG9zaXRpb24gd2FzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEFmdGVyKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIChERUxfQUZURVIgfCBERUxfQUNST1NTKSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVGVsbHMgd2hldGhlciBhbnkgb2YgdGhlIHN0ZXBzIG1hcHBlZCB0aHJvdWdoIGRlbGV0ZXMgYWNyb3NzIHRoZVxuICAgIHBvc2l0aW9uIChpbmNsdWRpbmcgYm90aCB0aGUgdG9rZW4gYmVmb3JlIGFuZCBhZnRlciB0aGVcbiAgICBwb3NpdGlvbikuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEFjcm9zcygpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiBERUxfQUNST1NTKSA+IDA7IH1cbn1cbi8qKlxuQSBtYXAgZGVzY3JpYmluZyB0aGUgZGVsZXRpb25zIGFuZCBpbnNlcnRpb25zIG1hZGUgYnkgYSBzdGVwLCB3aGljaFxuY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBwb3NpdGlvbnMgaW4gdGhlXG5wcmUtc3RlcCB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQgYW5kIHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZVxucG9zdC1zdGVwIHZlcnNpb24uXG4qL1xuY2xhc3MgU3RlcE1hcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcG9zaXRpb24gbWFwLiBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9jdW1lbnQgYXJlXG4gICAgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgbnVtYmVycywgaW4gd2hpY2ggZWFjaCBncm91cCBvZiB0aHJlZVxuICAgIHJlcHJlc2VudHMgYSBtb2RpZmllZCBjaHVuayBhcyBgW3N0YXJ0LCBvbGRTaXplLCBuZXdTaXplXWAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJhbmdlcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnZlcnRlZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLmludmVydGVkID0gaW52ZXJ0ZWQ7XG4gICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aCAmJiBTdGVwTWFwLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBNYXAuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVjb3Zlcih2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IDAsIGluZGV4ID0gcmVjb3ZlckluZGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKCF0aGlzLmludmVydGVkKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgIGRpZmYgKz0gdGhpcy5yYW5nZXNbaSAqIDMgKyAyXSAtIHRoaXMucmFuZ2VzW2kgKiAzICsgMV07XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1tpbmRleCAqIDNdICsgZGlmZiArIHJlY292ZXJPZmZzZXQodmFsdWUpO1xuICAgIH1cbiAgICBtYXBSZXN1bHQocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCBmYWxzZSk7IH1cbiAgICBtYXAocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgX21hcChwb3MsIGFzc29jLCBzaW1wbGUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBvbGRJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAyIDogMSwgbmV3SW5kZXggPSB0aGlzLmludmVydGVkID8gMSA6IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldIC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPiBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgb2xkU2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBvbGRJbmRleF0sIG5ld1NpemUgPSB0aGlzLnJhbmdlc1tpICsgbmV3SW5kZXhdLCBlbmQgPSBzdGFydCArIG9sZFNpemU7XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzaWRlID0gIW9sZFNpemUgPyBhc3NvYyA6IHBvcyA9PSBzdGFydCA/IC0xIDogcG9zID09IGVuZCA/IDEgOiBhc3NvYztcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gc3RhcnQgKyBkaWZmICsgKHNpZGUgPCAwID8gMCA6IG5ld1NpemUpO1xuICAgICAgICAgICAgICAgIGlmIChzaW1wbGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgbGV0IHJlY292ZXIgPSBwb3MgPT0gKGFzc29jIDwgMCA/IHN0YXJ0IDogZW5kKSA/IG51bGwgOiBtYWtlUmVjb3ZlcihpIC8gMywgcG9zIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgIGxldCBkZWwgPSBwb3MgPT0gc3RhcnQgPyBERUxfQUZURVIgOiBwb3MgPT0gZW5kID8gREVMX0JFRk9SRSA6IERFTF9BQ1JPU1M7XG4gICAgICAgICAgICAgICAgaWYgKGFzc29jIDwgMCA/IHBvcyAhPSBzdGFydCA6IHBvcyAhPSBlbmQpXG4gICAgICAgICAgICAgICAgICAgIGRlbCB8PSBERUxfU0lERTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcFJlc3VsdChyZXN1bHQsIGRlbCwgcmVjb3Zlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaWZmICs9IG5ld1NpemUgLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW1wbGUgPyBwb3MgKyBkaWZmIDogbmV3IE1hcFJlc3VsdChwb3MgKyBkaWZmLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b3VjaGVzKHBvcywgcmVjb3Zlcikge1xuICAgICAgICBsZXQgZGlmZiA9IDAsIGluZGV4ID0gcmVjb3ZlckluZGV4KHJlY292ZXIpO1xuICAgICAgICBsZXQgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBlbmQgPSBzdGFydCArIG9sZFNpemU7XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZCAmJiBpID09IGluZGV4ICogMylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRpZmYgKz0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XSAtIG9sZFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gZWFjaCBvZiB0aGUgY2hhbmdlZCByYW5nZXMgaW5jbHVkZWQgaW5cbiAgICB0aGlzIG1hcC5cbiAgICAqL1xuICAgIGZvckVhY2goZikge1xuICAgICAgICBsZXQgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgZGlmZiA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0sIG9sZFN0YXJ0ID0gc3RhcnQgLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKSwgbmV3U3RhcnQgPSBzdGFydCArICh0aGlzLmludmVydGVkID8gMCA6IGRpZmYpO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBuZXdTaXplID0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XTtcbiAgICAgICAgICAgIGYob2xkU3RhcnQsIG9sZFN0YXJ0ICsgb2xkU2l6ZSwgbmV3U3RhcnQsIG5ld1N0YXJ0ICsgbmV3U2l6ZSk7XG4gICAgICAgICAgICBkaWZmICs9IG5ld1NpemUgLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFwLiBUaGUgcmVzdWx0IGNhbiBiZSB1c2VkIHRvXG4gICAgbWFwIHBvc2l0aW9ucyBpbiB0aGUgcG9zdC1zdGVwIGRvY3VtZW50IHRvIHRoZSBwcmUtc3RlcCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKHRoaXMucmFuZ2VzLCAhdGhpcy5pbnZlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbnZlcnRlZCA/IFwiLVwiIDogXCJcIikgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnJhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcCB0aGF0IG1vdmVzIGFsbCBwb3NpdGlvbnMgYnkgb2Zmc2V0IGBuYCAod2hpY2ggbWF5IGJlXG4gICAgbmVnYXRpdmUpLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBhcHBseWluZyBzdGVwcyBtZWFudCBmb3IgYVxuICAgIHN1Yi1kb2N1bWVudCB0byBhIGxhcmdlciBkb2N1bWVudCwgb3IgdmljZS12ZXJzYS5cbiAgICAqL1xuICAgIHN0YXRpYyBvZmZzZXQobikge1xuICAgICAgICByZXR1cm4gbiA9PSAwID8gU3RlcE1hcC5lbXB0eSA6IG5ldyBTdGVwTWFwKG4gPCAwID8gWzAsIC1uLCAwXSA6IFswLCAwLCBuXSk7XG4gICAgfVxufVxuLyoqXG5BIFN0ZXBNYXAgdGhhdCBjb250YWlucyBubyBjaGFuZ2VkIHJhbmdlcy5cbiovXG5TdGVwTWFwLmVtcHR5ID0gbmV3IFN0ZXBNYXAoW10pO1xuLyoqXG5BIG1hcHBpbmcgcmVwcmVzZW50cyBhIHBpcGVsaW5lIG9mIHplcm8gb3IgbW9yZSBbc3RlcFxubWFwc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwTWFwKS4gSXQgaGFzIHNwZWNpYWwgcHJvdmlzaW9ucyBmb3IgbG9zc2xlc3NseVxuaGFuZGxpbmcgbWFwcGluZyBwb3NpdGlvbnMgdGhyb3VnaCBhIHNlcmllcyBvZiBzdGVwcyBpbiB3aGljaCBzb21lXG5zdGVwcyBhcmUgaW52ZXJ0ZWQgdmVyc2lvbnMgb2YgZWFybGllciBzdGVwcy4gKFRoaXMgY29tZXMgdXAgd2hlblxu4oCYW3JlYmFzaW5nXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyN0cmFuc2Zvcm0ucmViYXNpbmcp4oCZIHN0ZXBzIGZvclxuY29sbGFib3JhdGlvbiBvciBoaXN0b3J5IG1hbmFnZW1lbnQuKVxuKi9cbmNsYXNzIE1hcHBpbmcge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBtYXBwaW5nIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIG1hcHMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXBzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1pcnJvciwgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXksIHVzZWQgd2hlbiBgbWFwYCBvclxuICAgIGBtYXBSZXN1bHRgIGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIGZyb20gPSAwLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXkuXG4gICAgKi9cbiAgICB0byA9IG1hcHMgPyBtYXBzLmxlbmd0aCA6IDApIHtcbiAgICAgICAgdGhpcy5taXJyb3IgPSBtaXJyb3I7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5fbWFwcyA9IG1hcHMgfHwgW107XG4gICAgICAgIHRoaXMub3duRGF0YSA9ICEobWFwcyB8fCBtaXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3RlcCBtYXBzIGluIHRoaXMgbWFwcGluZy5cbiAgICAqL1xuICAgIGdldCBtYXBzKCkgeyByZXR1cm4gdGhpcy5fbWFwczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcHBpbmcgdGhhdCBtYXBzIG9ubHkgdGhyb3VnaCBhIHBhcnQgb2YgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBzbGljZShmcm9tID0gMCwgdG8gPSB0aGlzLm1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwcGluZyh0aGlzLl9tYXBzLCB0aGlzLm1pcnJvciwgZnJvbSwgdG8pO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBzdGVwIG1hcCB0byB0aGUgZW5kIG9mIHRoaXMgbWFwcGluZy4gSWYgYG1pcnJvcnNgIGlzXG4gICAgZ2l2ZW4sIGl0IHNob3VsZCBiZSB0aGUgaW5kZXggb2YgdGhlIHN0ZXAgbWFwIHRoYXQgaXMgdGhlIG1pcnJvclxuICAgIGltYWdlIG9mIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kTWFwKG1hcCwgbWlycm9ycykge1xuICAgICAgICBpZiAoIXRoaXMub3duRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwcyA9IHRoaXMuX21hcHMuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gdGhpcy5taXJyb3IgJiYgdGhpcy5taXJyb3Iuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMub3duRGF0YSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50byA9IHRoaXMuX21hcHMucHVzaChtYXApO1xuICAgICAgICBpZiAobWlycm9ycyAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZXRNaXJyb3IodGhpcy5fbWFwcy5sZW5ndGggLSAxLCBtaXJyb3JzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGFsbCB0aGUgc3RlcCBtYXBzIGluIGEgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZSAocHJlc2VydmluZ1xuICAgIG1pcnJvcmluZyBpbmZvcm1hdGlvbikuXG4gICAgKi9cbiAgICBhcHBlbmRNYXBwaW5nKG1hcHBpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0U2l6ZSA9IHRoaXMuX21hcHMubGVuZ3RoOyBpIDwgbWFwcGluZy5fbWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1pcnIgPSBtYXBwaW5nLmdldE1pcnJvcihpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kTWFwKG1hcHBpbmcuX21hcHNbaV0sIG1pcnIgIT0gbnVsbCAmJiBtaXJyIDwgaSA/IHN0YXJ0U2l6ZSArIG1pcnIgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmRzIHRoZSBvZmZzZXQgb2YgdGhlIHN0ZXAgbWFwIHRoYXQgbWlycm9ycyB0aGUgbWFwIGF0IHRoZVxuICAgIGdpdmVuIG9mZnNldCwgaW4gdGhpcyBtYXBwaW5nIChhcyBwZXIgdGhlIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGBhcHBlbmRNYXBgKS5cbiAgICAqL1xuICAgIGdldE1pcnJvcihuKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5taXJyb3IubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yW2ldID09IG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pcnJvcltpICsgKGkgJSAyID8gLTEgOiAxKV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2V0TWlycm9yKG4sIG0pIHtcbiAgICAgICAgaWYgKCF0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gW107XG4gICAgICAgIHRoaXMubWlycm9yLnB1c2gobiwgbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCB0aGUgaW52ZXJzZSBvZiB0aGUgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcHBpbmdJbnZlcnRlZChtYXBwaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXBwaW5nLm1hcHMubGVuZ3RoIC0gMSwgdG90YWxTaXplID0gdGhpcy5fbWFwcy5sZW5ndGggKyBtYXBwaW5nLl9tYXBzLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBtaXJyID0gbWFwcGluZy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZE1hcChtYXBwaW5nLl9tYXBzW2ldLmludmVydCgpLCBtaXJyICE9IG51bGwgJiYgbWlyciA+IGkgPyB0b3RhbFNpemUgLSBtaXJyIC0gMSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGludmVydGVkIHZlcnNpb24gb2YgdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgaW52ZXJ0KCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IG5ldyBNYXBwaW5nO1xuICAgICAgICBpbnZlcnNlLmFwcGVuZE1hcHBpbmdJbnZlcnRlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGludmVyc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyb207IGkgPCB0aGlzLnRvOyBpKyspXG4gICAgICAgICAgICBwb3MgPSB0aGlzLl9tYXBzW2ldLm1hcChwb3MsIGFzc29jKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdGhyb3VnaCB0aGlzIG1hcHBpbmcsIHJldHVybmluZyBhIG1hcHBpbmdcbiAgICByZXN1bHQuXG4gICAgKi9cbiAgICBtYXBSZXN1bHQocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCBmYWxzZSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIF9tYXAocG9zLCBhc3NvYywgc2ltcGxlKSB7XG4gICAgICAgIGxldCBkZWxJbmZvID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZnJvbTsgaSA8IHRoaXMudG87IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuX21hcHNbaV0sIHJlc3VsdCA9IG1hcC5tYXBSZXN1bHQocG9zLCBhc3NvYyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlY292ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3JyID0gdGhpcy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcnIgIT0gbnVsbCAmJiBjb3JyID4gaSAmJiBjb3JyIDwgdGhpcy50bykge1xuICAgICAgICAgICAgICAgICAgICBpID0gY29ycjtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gdGhpcy5fbWFwc1tjb3JyXS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsSW5mbyB8PSByZXN1bHQuZGVsSW5mbztcbiAgICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZSA/IHBvcyA6IG5ldyBNYXBSZXN1bHQocG9zLCBkZWxJbmZvLCBudWxsKTtcbiAgICB9XG59XG5cbmNvbnN0IHN0ZXBzQnlJRCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkEgc3RlcCBvYmplY3QgcmVwcmVzZW50cyBhbiBhdG9taWMgY2hhbmdlLiBJdCBnZW5lcmFsbHkgYXBwbGllc1xub25seSB0byB0aGUgZG9jdW1lbnQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBzaW5jZSB0aGUgcG9zaXRpb25zXG5zdG9yZWQgaW4gaXQgd2lsbCBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHRoYXQgZG9jdW1lbnQuXG5cbk5ldyBzdGVwcyBhcmUgZGVmaW5lZCBieSBjcmVhdGluZyBjbGFzc2VzIHRoYXQgZXh0ZW5kIGBTdGVwYCxcbm92ZXJyaWRpbmcgdGhlIGBhcHBseWAsIGBpbnZlcnRgLCBgbWFwYCwgYGdldE1hcGAgYW5kIGBmcm9tSlNPTmBcbm1ldGhvZHMsIGFuZCByZWdpc3RlcmluZyB5b3VyIGNsYXNzIHdpdGggYSB1bmlxdWVcbkpTT04tc2VyaWFsaXphdGlvbiBpZGVudGlmaWVyIHVzaW5nXG5bYFN0ZXAuanNvbklEYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwXmpzb25JRCkuXG4qL1xuY2xhc3MgU3RlcCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGVwIG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgbWFkZSBieSB0aGlzIHN0ZXAsXG4gICAgYW5kIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4gICAgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXRNYXAoKSB7IHJldHVybiBTdGVwTWFwLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1lcmdlIHRoaXMgc3RlcCB3aXRoIGFub3RoZXIgb25lLCB0byBiZSBhcHBsaWVkIGRpcmVjdGx5XG4gICAgYWZ0ZXIgaXQuIFJldHVybnMgdGhlIG1lcmdlZCBzdGVwIHdoZW4gcG9zc2libGUsIG51bGwgaWYgdGhlXG4gICAgc3RlcHMgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICovXG4gICAgbWVyZ2Uob3RoZXIpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0ZXAgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gV2lsbCBjYWxsXG4gICAgdGhyb3VnaCB0byB0aGUgc3RlcCBjbGFzcycgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24uc3RlcFR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCB0eXBlID0gc3RlcHNCeUlEW2pzb24uc3RlcFR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc3RlcCB0eXBlICR7anNvbi5zdGVwVHlwZX0gZGVmaW5lZGApO1xuICAgICAgICByZXR1cm4gdHlwZS5mcm9tSlNPTihzY2hlbWEsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIHNlcmlhbGl6ZSBzdGVwcyB0byBKU09OLCBlYWNoIHN0ZXAgbmVlZHMgYSBzdHJpbmdcbiAgICBJRCB0byBhdHRhY2ggdG8gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFVzZSB0aGlzIG1ldGhvZCB0b1xuICAgIHJlZ2lzdGVyIGFuIElEIGZvciB5b3VyIHN0ZXAgY2xhc3Nlcy4gVHJ5IHRvIHBpY2sgc29tZXRoaW5nXG4gICAgdGhhdCdzIHVubGlrZWx5IHRvIGNsYXNoIHdpdGggc3RlcHMgZnJvbSBvdGhlciBtb2R1bGVzLlxuICAgICovXG4gICAgc3RhdGljIGpzb25JRChpZCwgc3RlcENsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBzdGVwc0J5SUQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkR1cGxpY2F0ZSB1c2Ugb2Ygc3RlcCBKU09OIElEIFwiICsgaWQpO1xuICAgICAgICBzdGVwc0J5SURbaWRdID0gc3RlcENsYXNzO1xuICAgICAgICBzdGVwQ2xhc3MucHJvdG90eXBlLmpzb25JRCA9IGlkO1xuICAgICAgICByZXR1cm4gc3RlcENsYXNzO1xuICAgIH1cbn1cbi8qKlxuVGhlIHJlc3VsdCBvZiBbYXBwbHlpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcC5hcHBseSkgYSBzdGVwLiBDb250YWlucyBlaXRoZXIgYVxubmV3IGRvY3VtZW50IG9yIGEgZmFpbHVyZSB2YWx1ZS5cbiovXG5jbGFzcyBTdGVwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCwgaWYgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGZhaWx1cmUgbWVzc2FnZSwgaWYgdW5zdWNjZXNzZnVsLlxuICAgICovXG4gICAgZmFpbGVkKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IGZhaWxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3VjY2Vzc2Z1bCBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIHN0YXRpYyBvayhkb2MpIHsgcmV0dXJuIG5ldyBTdGVwUmVzdWx0KGRvYywgbnVsbCk7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmYWlsZWQgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmFpbChtZXNzYWdlKSB7IHJldHVybiBuZXcgU3RlcFJlc3VsdChudWxsLCBtZXNzYWdlKTsgfVxuICAgIC8qKlxuICAgIENhbGwgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aXRoIHRoZSBnaXZlblxuICAgIGFyZ3VtZW50cy4gQ3JlYXRlIGEgc3VjY2Vzc2Z1bCByZXN1bHQgaWYgaXQgc3VjY2VlZHMsIGFuZCBhXG4gICAgZmFpbGVkIG9uZSBpZiBpdCB0aHJvd3MgYSBgUmVwbGFjZUVycm9yYC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tUmVwbGFjZShkb2MsIGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQub2soZG9jLnJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVwbGFjZUVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcEZyYWdtZW50KGZyYWdtZW50LCBmLCBwYXJlbnQpIHtcbiAgICBsZXQgbWFwcGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFnbWVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZ21lbnQuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZC5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmNvcHkobWFwRnJhZ21lbnQoY2hpbGQuY29udGVudCwgZiwgY2hpbGQpKTtcbiAgICAgICAgaWYgKGNoaWxkLmlzSW5saW5lKVxuICAgICAgICAgICAgY2hpbGQgPSBmKGNoaWxkLCBwYXJlbnQsIGkpO1xuICAgICAgICBtYXBwZWQucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkobWFwcGVkKTtcbn1cbi8qKlxuQWRkIGEgbWFyayB0byBhbGwgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLlxuKi9cbmNsYXNzIEFkZE1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gYWRkLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKSwgJGZyb20gPSBkb2MucmVzb2x2ZSh0aGlzLmZyb20pO1xuICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSgkZnJvbS5zaGFyZWREZXB0aCh0aGlzLnRvKSk7XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShtYXBGcmFnbWVudChvbGRTbGljZS5jb250ZW50LCAobm9kZSwgcGFyZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNBdG9tIHx8ICFwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZSh0aGlzLm1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIHBhcmVudCksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBBZGRNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGRNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhZGRNYXJrXCIsIEFkZE1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGFsbCBpbmxpbmUgY29udGVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmVtb3ZlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVubWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5tYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gcmVtb3ZlLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKG1hcEZyYWdtZW50KG9sZFNsaWNlLmNvbnRlbnQsIG5vZGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFyayh0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIGRvYyksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBSZW1vdmVNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcInJlbW92ZU1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZW1vdmVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVNYXJrXCIsIFJlbW92ZU1hcmtTdGVwKTtcbi8qKlxuQWRkIGEgbWFyayB0byBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgQWRkTm9kZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBtYXJrIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byBhZGQuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcyk7XG4gICAgICAgICAgICBpZiAobmV3U2V0Lmxlbmd0aCA9PSBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCBub2RlLm1hcmtzW2ldKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IEFkZE5vZGVNYXJrU3RlcChwb3MucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE5vZGVNYXJrXCIsIHBvczogdGhpcy5wb3MsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGROb2RlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKGpzb24ucG9zLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYWRkTm9kZU1hcmtcIiwgQWRkTm9kZU1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBSZW1vdmVOb2RlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byByZW1vdmUuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMubWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwicmVtb3ZlTm9kZU1hcmtcIiwgcG9zOiB0aGlzLnBvcywgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlbW92ZU5vZGVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAoanNvbi5wb3MsIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVOb2RlTWFya1wiLCBSZW1vdmVOb2RlTWFya1N0ZXApO1xuXG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgbmV3IGNvbnRlbnQuXG4qL1xuY2xhc3MgUmVwbGFjZVN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBUaGUgZ2l2ZW4gYHNsaWNlYCBzaG91bGQgZml0IHRoZSAnZ2FwJyBiZXR3ZWVuIGBmcm9tYCBhbmRcbiAgICBgdG9g4oCUdGhlIGRlcHRocyBtdXN0IGxpbmUgdXAsIGFuZCB0aGUgc3Vycm91bmRpbmcgbm9kZXMgbXVzdCBiZVxuICAgIGFibGUgdG8gYmUgam9pbmVkIHdpdGggdGhlIG9wZW4gc2lkZXMgb2YgdGhlIHNsaWNlLiBXaGVuXG4gICAgYHN0cnVjdHVyZWAgaXMgdHJ1ZSwgdGhlIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZSBjb250ZW50IGJldHdlZW5cbiAgICBmcm9tIGFuZCB0byBpcyBub3QganVzdCBhIHNlcXVlbmNlIG9mIGNsb3NpbmcgYW5kIHRoZW4gb3BlbmluZ1xuICAgIHRva2VucyAodGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHJlYmFzZWQgcmVwbGFjZSBzdGVwc1xuICAgIG92ZXJ3cml0aW5nIHNvbWV0aGluZyB0aGV5IHdlcmVuJ3Qgc3VwcG9zZWQgdG8pLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMudG8pKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSByZXBsYWNlIHdvdWxkIG92ZXJ3cml0ZSBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5zbGljZSk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMudG8gLSB0aGlzLmZyb20sIHRoaXMuc2xpY2Uuc2l6ZV0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZEFjcm9zcyAmJiB0by5kZWxldGVkQWNyb3NzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbS5wb3MsIE1hdGgubWF4KGZyb20ucG9zLCB0by5wb3MpLCB0aGlzLnNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXApIHx8IG90aGVyLnN0cnVjdHVyZSB8fCB0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplID09IG90aGVyLmZyb20gJiYgIXRoaXMuc2xpY2Uub3BlbkVuZCAmJiAhb3RoZXIuc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnNsaWNlLnNpemUgKyBvdGhlci5zbGljZS5zaXplID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKHRoaXMuc2xpY2UuY29udGVudC5hcHBlbmQob3RoZXIuc2xpY2UuY29udGVudCksIHRoaXMuc2xpY2Uub3BlblN0YXJ0LCBvdGhlci5zbGljZS5vcGVuRW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLnRvICsgKG90aGVyLnRvIC0gb3RoZXIuZnJvbSksIHNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3RoZXIudG8gPT0gdGhpcy5mcm9tICYmICF0aGlzLnNsaWNlLm9wZW5TdGFydCAmJiAhb3RoZXIuc2xpY2Uub3BlbkVuZCkge1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5zbGljZS5zaXplICsgb3RoZXIuc2xpY2Uuc2l6ZSA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZShvdGhlci5zbGljZS5jb250ZW50LmFwcGVuZCh0aGlzLnNsaWNlLmNvbnRlbnQpLCBvdGhlci5zbGljZS5vcGVuU3RhcnQsIHRoaXMuc2xpY2Uub3BlbkVuZCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKG90aGVyLmZyb20sIHRoaXMudG8sIHNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0geyBzdGVwVHlwZTogXCJyZXBsYWNlXCIsIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8gfTtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2Uuc2l6ZSlcbiAgICAgICAgICAgIGpzb24uc2xpY2UgPSB0aGlzLnNsaWNlLnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAgICAgICBqc29uLnN0cnVjdHVyZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZXBsYWNlU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcChqc29uLmZyb20sIGpzb24udG8sIFNsaWNlLmZyb21KU09OKHNjaGVtYSwganNvbi5zbGljZSksICEhanNvbi5zdHJ1Y3R1cmUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwicmVwbGFjZVwiLCBSZXBsYWNlU3RlcCk7XG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgY29udGVudCwgYnV0XG5wcmVzZXJ2ZSBhIHJhbmdlIG9mIHRoZSByZXBsYWNlZCBjb250ZW50IGJ5IG1vdmluZyBpdCBpbnRvIHRoZVxuc2xpY2UuXG4qL1xuY2xhc3MgUmVwbGFjZUFyb3VuZFN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSByZXBsYWNlLWFyb3VuZCBzdGVwIHdpdGggdGhlIGdpdmVuIHJhbmdlIGFuZCBnYXAuXG4gICAgYGluc2VydGAgc2hvdWxkIGJlIHRoZSBwb2ludCBpbiB0aGUgc2xpY2UgaW50byB3aGljaCB0aGUgY29udGVudFxuICAgIG9mIHRoZSBnYXAgc2hvdWxkIGJlIG1vdmVkLiBgc3RydWN0dXJlYCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhc1xuICAgIGl0IGhhcyBpbiB0aGUgW2BSZXBsYWNlU3RlcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uUmVwbGFjZVN0ZXApIGNsYXNzLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiBwcmVzZXJ2ZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBnYXBGcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHByZXNlcnZlZCByYW5nZS5cbiAgICAqL1xuICAgIGdhcFRvLCBcbiAgICAvKipcbiAgICBUaGUgc2xpY2UgdG8gaW5zZXJ0LlxuICAgICovXG4gICAgc2xpY2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBpbiB0aGUgc2xpY2Ugd2hlcmUgdGhlIHByZXNlcnZlZCByYW5nZSBzaG91bGQgYmVcbiAgICBpbnNlcnRlZC5cbiAgICAqL1xuICAgIGluc2VydCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZ2FwRnJvbSA9IGdhcEZyb207XG4gICAgICAgIHRoaXMuZ2FwVG8gPSBnYXBUbztcbiAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlO1xuICAgICAgICB0aGlzLmluc2VydCA9IGluc2VydDtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgKGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5mcm9tLCB0aGlzLmdhcEZyb20pIHx8XG4gICAgICAgICAgICBjb250ZW50QmV0d2Vlbihkb2MsIHRoaXMuZ2FwVG8sIHRoaXMudG8pKSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJTdHJ1Y3R1cmUgZ2FwLXJlcGxhY2Ugd291bGQgb3ZlcndyaXRlIGNvbnRlbnRcIik7XG4gICAgICAgIGxldCBnYXAgPSBkb2Muc2xpY2UodGhpcy5nYXBGcm9tLCB0aGlzLmdhcFRvKTtcbiAgICAgICAgaWYgKGdhcC5vcGVuU3RhcnQgfHwgZ2FwLm9wZW5FbmQpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiR2FwIGlzIG5vdCBhIGZsYXQgcmFuZ2VcIik7XG4gICAgICAgIGxldCBpbnNlcnRlZCA9IHRoaXMuc2xpY2UuaW5zZXJ0QXQodGhpcy5pbnNlcnQsIGdhcC5jb250ZW50KTtcbiAgICAgICAgaWYgKCFpbnNlcnRlZClcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJDb250ZW50IGRvZXMgbm90IGZpdCBpbiBnYXBcIik7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5pbnNlcnQsXG4gICAgICAgICAgICB0aGlzLmdhcFRvLCB0aGlzLnRvIC0gdGhpcy5nYXBUbywgdGhpcy5zbGljZS5zaXplIC0gdGhpcy5pbnNlcnRdKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgZ2FwID0gdGhpcy5nYXBUbyAtIHRoaXMuZ2FwRnJvbTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcCh0aGlzLmZyb20sIHRoaXMuZnJvbSArIHRoaXMuc2xpY2Uuc2l6ZSArIGdhcCwgdGhpcy5mcm9tICsgdGhpcy5pbnNlcnQsIHRoaXMuZnJvbSArIHRoaXMuaW5zZXJ0ICsgZ2FwLCBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKS5yZW1vdmVCZXR3ZWVuKHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5nYXBUbyAtIHRoaXMuZnJvbSksIHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy50bywgLTEpO1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IHRoaXMuZnJvbSA9PSB0aGlzLmdhcEZyb20gPyBmcm9tLnBvcyA6IG1hcHBpbmcubWFwKHRoaXMuZ2FwRnJvbSwgLTEpO1xuICAgICAgICBsZXQgZ2FwVG8gPSB0aGlzLnRvID09IHRoaXMuZ2FwVG8gPyB0by5wb3MgOiBtYXBwaW5nLm1hcCh0aGlzLmdhcFRvLCAxKTtcbiAgICAgICAgaWYgKChmcm9tLmRlbGV0ZWRBY3Jvc3MgJiYgdG8uZGVsZXRlZEFjcm9zcykgfHwgZ2FwRnJvbSA8IGZyb20ucG9zIHx8IGdhcFRvID4gdG8ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoZnJvbS5wb3MsIHRvLnBvcywgZ2FwRnJvbSwgZ2FwVG8sIHRoaXMuc2xpY2UsIHRoaXMuaW5zZXJ0LCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSB7IHN0ZXBUeXBlOiBcInJlcGxhY2VBcm91bmRcIiwgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byxcbiAgICAgICAgICAgIGdhcEZyb206IHRoaXMuZ2FwRnJvbSwgZ2FwVG86IHRoaXMuZ2FwVG8sIGluc2VydDogdGhpcy5pbnNlcnQgfTtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2Uuc2l6ZSlcbiAgICAgICAgICAgIGpzb24uc2xpY2UgPSB0aGlzLnNsaWNlLnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAgICAgICBqc29uLnN0cnVjdHVyZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0eXBlb2YganNvbi5nYXBGcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uZ2FwVG8gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5pbnNlcnQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgUmVwbGFjZUFyb3VuZFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoanNvbi5mcm9tLCBqc29uLnRvLCBqc29uLmdhcEZyb20sIGpzb24uZ2FwVG8sIFNsaWNlLmZyb21KU09OKHNjaGVtYSwganNvbi5zbGljZSksIGpzb24uaW5zZXJ0LCAhIWpzb24uc3RydWN0dXJlKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcInJlcGxhY2VBcm91bmRcIiwgUmVwbGFjZUFyb3VuZFN0ZXApO1xuZnVuY3Rpb24gY29udGVudEJldHdlZW4oZG9jLCBmcm9tLCB0bykge1xuICAgIGxldCAkZnJvbSA9IGRvYy5yZXNvbHZlKGZyb20pLCBkaXN0ID0gdG8gLSBmcm9tLCBkZXB0aCA9ICRmcm9tLmRlcHRoO1xuICAgIHdoaWxlIChkaXN0ID4gMCAmJiBkZXB0aCA+IDAgJiYgJGZyb20uaW5kZXhBZnRlcihkZXB0aCkgPT0gJGZyb20ubm9kZShkZXB0aCkuY2hpbGRDb3VudCkge1xuICAgICAgICBkZXB0aC0tO1xuICAgICAgICBkaXN0LS07XG4gICAgfVxuICAgIGlmIChkaXN0ID4gMCkge1xuICAgICAgICBsZXQgbmV4dCA9ICRmcm9tLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJGZyb20uaW5kZXhBZnRlcihkZXB0aCkpO1xuICAgICAgICB3aGlsZSAoZGlzdCA+IDApIHtcbiAgICAgICAgICAgIGlmICghbmV4dCB8fCBuZXh0LmlzTGVhZilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBkaXN0LS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhZGRNYXJrKHRyLCBmcm9tLCB0bywgbWFyaykge1xuICAgIGxldCByZW1vdmVkID0gW10sIGFkZGVkID0gW107XG4gICAgbGV0IHJlbW92aW5nLCBhZGRpbmc7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcywgcGFyZW50KSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5pc0lubGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG1hcmtzID0gbm9kZS5tYXJrcztcbiAgICAgICAgaWYgKCFtYXJrLmlzSW5TZXQobWFya3MpICYmIHBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKG1hcmsudHlwZSkpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHBvcywgZnJvbSksIGVuZCA9IE1hdGgubWluKHBvcyArIG5vZGUubm9kZVNpemUsIHRvKTtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSBtYXJrLmFkZFRvU2V0KG1hcmtzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZpbmcgJiYgcmVtb3ZpbmcudG8gPT0gc3RhcnQgJiYgcmVtb3ZpbmcubWFyay5lcShtYXJrc1tpXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmluZy50byA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKHJlbW92aW5nID0gbmV3IFJlbW92ZU1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmtzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkZGluZyAmJiBhZGRpbmcudG8gPT0gc3RhcnQpXG4gICAgICAgICAgICAgICAgYWRkaW5nLnRvID0gZW5kO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZGVkLnB1c2goYWRkaW5nID0gbmV3IEFkZE1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmspKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJlbW92ZWQuZm9yRWFjaChzID0+IHRyLnN0ZXAocykpO1xuICAgIGFkZGVkLmZvckVhY2gocyA9PiB0ci5zdGVwKHMpKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU1hcmsodHIsIGZyb20sIHRvLCBtYXJrKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBbXSwgc3RlcCA9IDA7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN0ZXArKztcbiAgICAgICAgbGV0IHRvUmVtb3ZlID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcmsgaW5zdGFuY2VvZiBNYXJrVHlwZSkge1xuICAgICAgICAgICAgbGV0IHNldCA9IG5vZGUubWFya3MsIGZvdW5kO1xuICAgICAgICAgICAgd2hpbGUgKGZvdW5kID0gbWFyay5pc0luU2V0KHNldCkpIHtcbiAgICAgICAgICAgICAgICAodG9SZW1vdmUgfHwgKHRvUmVtb3ZlID0gW10pKS5wdXNoKGZvdW5kKTtcbiAgICAgICAgICAgICAgICBzZXQgPSBmb3VuZC5yZW1vdmVGcm9tU2V0KHNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFyaykge1xuICAgICAgICAgICAgaWYgKG1hcmsuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICB0b1JlbW92ZSA9IFttYXJrXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvUmVtb3ZlID0gbm9kZS5tYXJrcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4ocG9zICsgbm9kZS5ub2RlU2l6ZSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRvUmVtb3ZlW2ldLCBmb3VuZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdGNoZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBtYXRjaGVkW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobS5zdGVwID09IHN0ZXAgLSAxICYmIHN0eWxlLmVxKG1hdGNoZWRbal0uc3R5bGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQudG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKHsgc3R5bGUsIGZyb206IE1hdGgubWF4KHBvcywgZnJvbSksIHRvOiBlbmQsIHN0ZXAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgbWF0Y2hlZC5mb3JFYWNoKG0gPT4gdHIuc3RlcChuZXcgUmVtb3ZlTWFya1N0ZXAobS5mcm9tLCBtLnRvLCBtLnN0eWxlKSkpO1xufVxuZnVuY3Rpb24gY2xlYXJJbmNvbXBhdGlibGUodHIsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2ggPSBwYXJlbnRUeXBlLmNvbnRlbnRNYXRjaCwgY2xlYXJOZXdsaW5lcyA9IHRydWUpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBsZXQgcmVwbFN0ZXBzID0gW10sIGN1ciA9IHBvcyArIDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpLCBlbmQgPSBjdXIgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBtYXRjaC5tYXRjaFR5cGUoY2hpbGQudHlwZSk7XG4gICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVwbFN0ZXBzLnB1c2gobmV3IFJlcGxhY2VTdGVwKGN1ciwgZW5kLCBTbGljZS5lbXB0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2ggPSBhbGxvd2VkO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZC5tYXJrcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuYWxsb3dzTWFya1R5cGUoY2hpbGQubWFya3Nbal0udHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKGN1ciwgZW5kLCBjaGlsZC5tYXJrc1tqXSkpO1xuICAgICAgICAgICAgaWYgKGNsZWFyTmV3bGluZXMgJiYgY2hpbGQuaXNUZXh0ICYmIHBhcmVudFR5cGUud2hpdGVzcGFjZSAhPSBcInByZVwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IG0sIG5ld2xpbmUgPSAvXFxyP1xcbnxcXHIvZywgc2xpY2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG0gPSBuZXdsaW5lLmV4ZWMoY2hpbGQudGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbGljZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20ocGFyZW50VHlwZS5zY2hlbWEudGV4dChcIiBcIiwgcGFyZW50VHlwZS5hbGxvd2VkTWFya3MoY2hpbGQubWFya3MpKSksIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICByZXBsU3RlcHMucHVzaChuZXcgUmVwbGFjZVN0ZXAoY3VyICsgbS5pbmRleCwgY3VyICsgbS5pbmRleCArIG1bMF0ubGVuZ3RoLCBzbGljZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBlbmQ7XG4gICAgfVxuICAgIGlmICghbWF0Y2gudmFsaWRFbmQpIHtcbiAgICAgICAgbGV0IGZpbGwgPSBtYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgdHIucmVwbGFjZShjdXIsIGN1ciwgbmV3IFNsaWNlKGZpbGwsIDAsIDApKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHJlcGxTdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgdHIuc3RlcChyZXBsU3RlcHNbaV0pO1xufVxuXG5mdW5jdGlvbiBjYW5DdXQobm9kZSwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoc3RhcnQgPT0gMCB8fCBub2RlLmNhblJlcGxhY2Uoc3RhcnQsIG5vZGUuY2hpbGRDb3VudCkpICYmXG4gICAgICAgIChlbmQgPT0gbm9kZS5jaGlsZENvdW50IHx8IG5vZGUuY2FuUmVwbGFjZSgwLCBlbmQpKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSB0YXJnZXQgZGVwdGggdG8gd2hpY2ggdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlXG5jYW4gYmUgbGlmdGVkLiBXaWxsIG5vdCBnbyBhY3Jvc3Ncbltpc29sYXRpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5pc29sYXRpbmcpIHBhcmVudCBub2Rlcy5cbiovXG5mdW5jdGlvbiBsaWZ0VGFyZ2V0KHJhbmdlKSB7XG4gICAgbGV0IHBhcmVudCA9IHJhbmdlLnBhcmVudDtcbiAgICBsZXQgY29udGVudCA9IHBhcmVudC5jb250ZW50LmN1dEJ5SW5kZXgocmFuZ2Uuc3RhcnRJbmRleCwgcmFuZ2UuZW5kSW5kZXgpO1xuICAgIGZvciAobGV0IGRlcHRoID0gcmFuZ2UuZGVwdGg7OyAtLWRlcHRoKSB7XG4gICAgICAgIGxldCBub2RlID0gcmFuZ2UuJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBpbmRleCA9IHJhbmdlLiRmcm9tLmluZGV4KGRlcHRoKSwgZW5kSW5kZXggPSByYW5nZS4kdG8uaW5kZXhBZnRlcihkZXB0aCk7XG4gICAgICAgIGlmIChkZXB0aCA8IHJhbmdlLmRlcHRoICYmIG5vZGUuY2FuUmVwbGFjZShpbmRleCwgZW5kSW5kZXgsIGNvbnRlbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGRlcHRoO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCB8fCBub2RlLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgIWNhbkN1dChub2RlLCBpbmRleCwgZW5kSW5kZXgpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gbGlmdCh0ciwgcmFuZ2UsIHRhcmdldCkge1xuICAgIGxldCB7ICRmcm9tLCAkdG8sIGRlcHRoIH0gPSByYW5nZTtcbiAgICBsZXQgZ2FwU3RhcnQgPSAkZnJvbS5iZWZvcmUoZGVwdGggKyAxKSwgZ2FwRW5kID0gJHRvLmFmdGVyKGRlcHRoICsgMSk7XG4gICAgbGV0IHN0YXJ0ID0gZ2FwU3RhcnQsIGVuZCA9IGdhcEVuZDtcbiAgICBsZXQgYmVmb3JlID0gRnJhZ21lbnQuZW1wdHksIG9wZW5TdGFydCA9IDA7XG4gICAgZm9yIChsZXQgZCA9IGRlcHRoLCBzcGxpdHRpbmcgPSBmYWxzZTsgZCA+IHRhcmdldDsgZC0tKVxuICAgICAgICBpZiAoc3BsaXR0aW5nIHx8ICRmcm9tLmluZGV4KGQpID4gMCkge1xuICAgICAgICAgICAgc3BsaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGJlZm9yZSA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KGJlZm9yZSkpO1xuICAgICAgICAgICAgb3BlblN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydC0tO1xuICAgICAgICB9XG4gICAgbGV0IGFmdGVyID0gRnJhZ21lbnQuZW1wdHksIG9wZW5FbmQgPSAwO1xuICAgIGZvciAobGV0IGQgPSBkZXB0aCwgc3BsaXR0aW5nID0gZmFsc2U7IGQgPiB0YXJnZXQ7IGQtLSlcbiAgICAgICAgaWYgKHNwbGl0dGluZyB8fCAkdG8uYWZ0ZXIoZCArIDEpIDwgJHRvLmVuZChkKSkge1xuICAgICAgICAgICAgc3BsaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGFmdGVyID0gRnJhZ21lbnQuZnJvbSgkdG8ubm9kZShkKS5jb3B5KGFmdGVyKSk7XG4gICAgICAgICAgICBvcGVuRW5kKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0LCBlbmQsIGdhcFN0YXJ0LCBnYXBFbmQsIG5ldyBTbGljZShiZWZvcmUuYXBwZW5kKGFmdGVyKSwgb3BlblN0YXJ0LCBvcGVuRW5kKSwgYmVmb3JlLnNpemUgLSBvcGVuU3RhcnQsIHRydWUpKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSB2YWxpZCB3YXkgdG8gd3JhcCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaW4gYVxubm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gTWF5IGludHJvZHVjZSBleHRyYSBub2RlcyBhcm91bmQgYW5kIGluc2lkZVxudGhlIHdyYXBwZXIgbm9kZSwgaWYgbmVjZXNzYXJ5LiBSZXR1cm5zIG51bGwgaWYgbm8gdmFsaWQgd3JhcHBpbmdcbmNvdWxkIGJlIGZvdW5kLiBXaGVuIGBpbm5lclJhbmdlYCBpcyBnaXZlbiwgdGhhdCByYW5nZSdzIGNvbnRlbnQgaXNcbnVzZWQgYXMgdGhlIGNvbnRlbnQgdG8gZml0IGludG8gdGhlIHdyYXBwaW5nLCBpbnN0ZWFkIG9mIHRoZVxuY29udGVudCBvZiBgcmFuZ2VgLlxuKi9cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZyhyYW5nZSwgbm9kZVR5cGUsIGF0dHJzID0gbnVsbCwgaW5uZXJSYW5nZSA9IHJhbmdlKSB7XG4gICAgbGV0IGFyb3VuZCA9IGZpbmRXcmFwcGluZ091dHNpZGUocmFuZ2UsIG5vZGVUeXBlKTtcbiAgICBsZXQgaW5uZXIgPSBhcm91bmQgJiYgZmluZFdyYXBwaW5nSW5zaWRlKGlubmVyUmFuZ2UsIG5vZGVUeXBlKTtcbiAgICBpZiAoIWlubmVyKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJvdW5kLm1hcCh3aXRoQXR0cnMpXG4gICAgICAgIC5jb25jYXQoeyB0eXBlOiBub2RlVHlwZSwgYXR0cnMgfSkuY29uY2F0KGlubmVyLm1hcCh3aXRoQXR0cnMpKTtcbn1cbmZ1bmN0aW9uIHdpdGhBdHRycyh0eXBlKSB7IHJldHVybiB7IHR5cGUsIGF0dHJzOiBudWxsIH07IH1cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ091dHNpZGUocmFuZ2UsIHR5cGUpIHtcbiAgICBsZXQgeyBwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSByYW5nZTtcbiAgICBsZXQgYXJvdW5kID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KHN0YXJ0SW5kZXgpLmZpbmRXcmFwcGluZyh0eXBlKTtcbiAgICBpZiAoIWFyb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG91dGVyID0gYXJvdW5kLmxlbmd0aCA/IGFyb3VuZFswXSA6IHR5cGU7XG4gICAgcmV0dXJuIHBhcmVudC5jYW5SZXBsYWNlV2l0aChzdGFydEluZGV4LCBlbmRJbmRleCwgb3V0ZXIpID8gYXJvdW5kIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ0luc2lkZShyYW5nZSwgdHlwZSkge1xuICAgIGxldCB7IHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHJhbmdlO1xuICAgIGxldCBpbm5lciA9IHBhcmVudC5jaGlsZChzdGFydEluZGV4KTtcbiAgICBsZXQgaW5zaWRlID0gdHlwZS5jb250ZW50TWF0Y2guZmluZFdyYXBwaW5nKGlubmVyLnR5cGUpO1xuICAgIGlmICghaW5zaWRlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbGFzdFR5cGUgPSBpbnNpZGUubGVuZ3RoID8gaW5zaWRlW2luc2lkZS5sZW5ndGggLSAxXSA6IHR5cGU7XG4gICAgbGV0IGlubmVyTWF0Y2ggPSBsYXN0VHlwZS5jb250ZW50TWF0Y2g7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGlubmVyTWF0Y2ggJiYgaSA8IGVuZEluZGV4OyBpKyspXG4gICAgICAgIGlubmVyTWF0Y2ggPSBpbm5lck1hdGNoLm1hdGNoVHlwZShwYXJlbnQuY2hpbGQoaSkudHlwZSk7XG4gICAgaWYgKCFpbm5lck1hdGNoIHx8ICFpbm5lck1hdGNoLnZhbGlkRW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaW5zaWRlO1xufVxuZnVuY3Rpb24gd3JhcCh0ciwgcmFuZ2UsIHdyYXBwZXJzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBpID0gd3JhcHBlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gd3JhcHBlcnNbaV0udHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLnZhbGlkRW5kKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiV3JhcHBlciB0eXBlIGdpdmVuIHRvIFRyYW5zZm9ybS53cmFwIGRvZXMgbm90IGZvcm0gdmFsaWQgY29udGVudCBvZiBpdHMgcGFyZW50IHdyYXBwZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20od3JhcHBlcnNbaV0udHlwZS5jcmVhdGUod3JhcHBlcnNbaV0uYXR0cnMsIGNvbnRlbnQpKTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gcmFuZ2Uuc3RhcnQsIGVuZCA9IHJhbmdlLmVuZDtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCwgZW5kLCBzdGFydCwgZW5kLCBuZXcgU2xpY2UoY29udGVudCwgMCwgMCksIHdyYXBwZXJzLmxlbmd0aCwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKHRyLCBmcm9tLCB0bywgdHlwZSwgYXR0cnMpIHtcbiAgICBpZiAoIXR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHlwZSBnaXZlbiB0byBzZXRCbG9ja1R5cGUgc2hvdWxkIGJlIGEgdGV4dGJsb2NrXCIpO1xuICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgbGV0IGF0dHJzSGVyZSA9IHR5cGVvZiBhdHRycyA9PSBcImZ1bmN0aW9uXCIgPyBhdHRycyhub2RlKSA6IGF0dHJzO1xuICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnNIZXJlKSAmJlxuICAgICAgICAgICAgY2FuQ2hhbmdlVHlwZSh0ci5kb2MsIHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyksIHR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgY29udmVydE5ld2xpbmVzID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmUgPSB0eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiwgc3VwcG9ydExpbmVicmVhayA9ICEhdHlwZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKHR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocHJlICYmICFzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TmV3bGluZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghcHJlICYmIHN1cHBvcnRMaW5lYnJlYWspXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgYWxsIG1hcmt1cCB0aGF0IGlzbid0IGFsbG93ZWQgaW4gdGhlIG5ldyBub2RlIHR5cGUgaXMgY2xlYXJlZFxuICAgICAgICAgICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmVwbGFjZUxpbmVicmVha3ModHIsIG5vZGUsIHBvcywgbWFwRnJvbSk7XG4gICAgICAgICAgICBjbGVhckluY29tcGF0aWJsZSh0ciwgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zLCAxKSwgdHlwZSwgdW5kZWZpbmVkLCBjb252ZXJ0TmV3bGluZXMgPT09IG51bGwpO1xuICAgICAgICAgICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0TSA9IG1hcHBpbmcubWFwKHBvcywgMSksIGVuZE0gPSBtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplLCAxKTtcbiAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0TSwgZW5kTSwgc3RhcnRNICsgMSwgZW5kTSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzSGVyZSwgbnVsbCwgbm9kZS5tYXJrcykpLCAwLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICAgICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXBsYWNlTmV3bGluZXModHIsIG5vZGUsIHBvcywgbWFwRnJvbSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VOZXdsaW5lcyh0ciwgbm9kZSwgcG9zLCBtYXBGcm9tKSB7XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgb2Zmc2V0KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBtLCBuZXdsaW5lID0gL1xccj9cXG58XFxyL2c7XG4gICAgICAgICAgICB3aGlsZSAobSA9IG5ld2xpbmUuZXhlYyhjaGlsZC50ZXh0KSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIDEgKyBvZmZzZXQgKyBtLmluZGV4KTtcbiAgICAgICAgICAgICAgICB0ci5yZXBsYWNlV2l0aChzdGFydCwgc3RhcnQgKyAxLCBub2RlLnR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50LmNyZWF0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZUxpbmVicmVha3ModHIsIG5vZGUsIHBvcywgbWFwRnJvbSkge1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIG9mZnNldCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PSBjaGlsZC50eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zICsgMSArIG9mZnNldCk7XG4gICAgICAgICAgICB0ci5yZXBsYWNlV2l0aChzdGFydCwgc3RhcnQgKyAxLCBub2RlLnR5cGUuc2NoZW1hLnRleHQoXCJcXG5cIikpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjYW5DaGFuZ2VUeXBlKGRvYywgcG9zLCB0eXBlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICByZXR1cm4gJHBvcy5wYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4ICsgMSwgdHlwZSk7XG59XG4vKipcbkNoYW5nZSB0aGUgdHlwZSwgYXR0cmlidXRlcywgYW5kL29yIG1hcmtzIG9mIHRoZSBub2RlIGF0IGBwb3NgLlxuV2hlbiBgdHlwZWAgaXNuJ3QgZ2l2ZW4sIHRoZSBleGlzdGluZyBub2RlIHR5cGUgaXMgcHJlc2VydmVkLFxuKi9cbmZ1bmN0aW9uIHNldE5vZGVNYXJrdXAodHIsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgbGV0IG5vZGUgPSB0ci5kb2Mubm9kZUF0KHBvcyk7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIG5vZGUgYXQgZ2l2ZW4gcG9zaXRpb25cIik7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICB0eXBlID0gbm9kZS50eXBlO1xuICAgIGxldCBuZXdOb2RlID0gdHlwZS5jcmVhdGUoYXR0cnMsIG51bGwsIG1hcmtzIHx8IG5vZGUubWFya3MpO1xuICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgcmV0dXJuIHRyLnJlcGxhY2VXaXRoKHBvcywgcG9zICsgbm9kZS5ub2RlU2l6ZSwgbmV3Tm9kZSk7XG4gICAgaWYgKCF0eXBlLnZhbGlkQ29udGVudChub2RlLmNvbnRlbnQpKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY29udGVudCBmb3Igbm9kZSB0eXBlIFwiICsgdHlwZS5uYW1lKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChwb3MsIHBvcyArIG5vZGUubm9kZVNpemUsIHBvcyArIDEsIHBvcyArIG5vZGUubm9kZVNpemUgLSAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShuZXdOb2RlKSwgMCwgMCksIDEsIHRydWUpKTtcbn1cbi8qKlxuQ2hlY2sgd2hldGhlciBzcGxpdHRpbmcgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIGFsbG93ZWQuXG4qL1xuZnVuY3Rpb24gY2FuU3BsaXQoZG9jLCBwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKSwgYmFzZSA9ICRwb3MuZGVwdGggLSBkZXB0aDtcbiAgICBsZXQgaW5uZXJUeXBlID0gKHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlclt0eXBlc0FmdGVyLmxlbmd0aCAtIDFdKSB8fCAkcG9zLnBhcmVudDtcbiAgICBpZiAoYmFzZSA8IDAgfHwgJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZyB8fFxuICAgICAgICAhJHBvcy5wYXJlbnQuY2FuUmVwbGFjZSgkcG9zLmluZGV4KCksICRwb3MucGFyZW50LmNoaWxkQ291bnQpIHx8XG4gICAgICAgICFpbm5lclR5cGUudHlwZS52YWxpZENvbnRlbnQoJHBvcy5wYXJlbnQuY29udGVudC5jdXRCeUluZGV4KCRwb3MuaW5kZXgoKSwgJHBvcy5wYXJlbnQuY2hpbGRDb3VudCkpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxLCBpID0gZGVwdGggLSAyOyBkID4gYmFzZTsgZC0tLCBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGUoZCksIGluZGV4ID0gJHBvcy5pbmRleChkKTtcbiAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3QgPSBub2RlLmNvbnRlbnQuY3V0QnlJbmRleChpbmRleCwgbm9kZS5jaGlsZENvdW50KTtcbiAgICAgICAgbGV0IG92ZXJyaWRlQ2hpbGQgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaSArIDFdO1xuICAgICAgICBpZiAob3ZlcnJpZGVDaGlsZClcbiAgICAgICAgICAgIHJlc3QgPSByZXN0LnJlcGxhY2VDaGlsZCgwLCBvdmVycmlkZUNoaWxkLnR5cGUuY3JlYXRlKG92ZXJyaWRlQ2hpbGQuYXR0cnMpKTtcbiAgICAgICAgbGV0IGFmdGVyID0gKHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpXSkgfHwgbm9kZTtcbiAgICAgICAgaWYgKCFub2RlLmNhblJlcGxhY2UoaW5kZXggKyAxLCBub2RlLmNoaWxkQ291bnQpIHx8ICFhZnRlci50eXBlLnZhbGlkQ29udGVudChyZXN0KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleEFmdGVyKGJhc2UpO1xuICAgIGxldCBiYXNlVHlwZSA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlclswXTtcbiAgICByZXR1cm4gJHBvcy5ub2RlKGJhc2UpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgYmFzZVR5cGUgPyBiYXNlVHlwZS50eXBlIDogJHBvcy5ub2RlKGJhc2UgKyAxKS50eXBlKTtcbn1cbmZ1bmN0aW9uIHNwbGl0KHRyLCBwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKSwgYmVmb3JlID0gRnJhZ21lbnQuZW1wdHksIGFmdGVyID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGgsIGUgPSAkcG9zLmRlcHRoIC0gZGVwdGgsIGkgPSBkZXB0aCAtIDE7IGQgPiBlOyBkLS0sIGktLSkge1xuICAgICAgICBiZWZvcmUgPSBGcmFnbWVudC5mcm9tKCRwb3Mubm9kZShkKS5jb3B5KGJlZm9yZSkpO1xuICAgICAgICBsZXQgdHlwZUFmdGVyID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2ldO1xuICAgICAgICBhZnRlciA9IEZyYWdtZW50LmZyb20odHlwZUFmdGVyID8gdHlwZUFmdGVyLnR5cGUuY3JlYXRlKHR5cGVBZnRlci5hdHRycywgYWZ0ZXIpIDogJHBvcy5ub2RlKGQpLmNvcHkoYWZ0ZXIpKTtcbiAgICB9XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAocG9zLCBwb3MsIG5ldyBTbGljZShiZWZvcmUuYXBwZW5kKGFmdGVyKSwgZGVwdGgsIGRlcHRoKSwgdHJ1ZSkpO1xufVxuLyoqXG5UZXN0IHdoZXRoZXIgdGhlIGJsb2NrcyBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gY2FuIGJlXG5qb2luZWQuXG4qL1xuZnVuY3Rpb24gY2FuSm9pbihkb2MsIHBvcykge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKSwgaW5kZXggPSAkcG9zLmluZGV4KCk7XG4gICAgcmV0dXJuIGpvaW5hYmxlKCRwb3Mubm9kZUJlZm9yZSwgJHBvcy5ub2RlQWZ0ZXIpICYmXG4gICAgICAgICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSk7XG59XG5mdW5jdGlvbiBjYW5BcHBlbmRXaXRoU3Vic3RpdHV0ZWRMaW5lYnJlYWtzKGEsIGIpIHtcbiAgICBpZiAoIWIuY29udGVudC5zaXplKVxuICAgICAgICBhLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQoYi50eXBlKTtcbiAgICBsZXQgbWF0Y2ggPSBhLmNvbnRlbnRNYXRjaEF0KGEuY2hpbGRDb3VudCk7XG4gICAgbGV0IHsgbGluZWJyZWFrUmVwbGFjZW1lbnQgfSA9IGEudHlwZS5zY2hlbWE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBiLmNoaWxkKGkpO1xuICAgICAgICBsZXQgdHlwZSA9IGNoaWxkLnR5cGUgPT0gbGluZWJyZWFrUmVwbGFjZW1lbnQgPyBhLnR5cGUuc2NoZW1hLm5vZGVzLnRleHQgOiBjaGlsZC50eXBlO1xuICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLnR5cGUuYWxsb3dzTWFya3MoY2hpbGQubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2gudmFsaWRFbmQ7XG59XG5mdW5jdGlvbiBqb2luYWJsZShhLCBiKSB7XG4gICAgcmV0dXJuICEhKGEgJiYgYiAmJiAhYS5pc0xlYWYgJiYgY2FuQXBwZW5kV2l0aFN1YnN0aXR1dGVkTGluZWJyZWFrcyhhLCBiKSk7XG59XG4vKipcbkZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbmJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxucG9pbnQsIGlmIGFueS5cbiovXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MsIGRpciA9IC0xKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgIGlmIChkID09ICRwb3MuZGVwdGgpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZTtcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlKGQgKyAxKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZSAmJiAhYmVmb3JlLmlzVGV4dGJsb2NrICYmIGpvaW5hYmxlKGJlZm9yZSwgYWZ0ZXIpICYmXG4gICAgICAgICAgICAkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGlmIChkID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZGlyIDwgMCA/ICRwb3MuYmVmb3JlKGQpIDogJHBvcy5hZnRlcihkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBqb2luKHRyLCBwb3MsIGRlcHRoKSB7XG4gICAgbGV0IGNvbnZlcnROZXdsaW5lcyA9IG51bGw7XG4gICAgbGV0IHsgbGluZWJyZWFrUmVwbGFjZW1lbnQgfSA9IHRyLmRvYy50eXBlLnNjaGVtYTtcbiAgICBsZXQgJGJlZm9yZSA9IHRyLmRvYy5yZXNvbHZlKHBvcyAtIGRlcHRoKSwgYmVmb3JlVHlwZSA9ICRiZWZvcmUubm9kZSgpLnR5cGU7XG4gICAgaWYgKGxpbmVicmVha1JlcGxhY2VtZW50ICYmIGJlZm9yZVR5cGUuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgcHJlID0gYmVmb3JlVHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCI7XG4gICAgICAgIGxldCBzdXBwb3J0TGluZWJyZWFrID0gISFiZWZvcmVUeXBlLmNvbnRlbnRNYXRjaC5tYXRjaFR5cGUobGluZWJyZWFrUmVwbGFjZW1lbnQpO1xuICAgICAgICBpZiAocHJlICYmICFzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgY29udmVydE5ld2xpbmVzID0gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKCFwcmUgJiYgc3VwcG9ydExpbmVicmVhaylcbiAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IHRydWU7XG4gICAgfVxuICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIGlmIChjb252ZXJ0TmV3bGluZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCAkYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZShwb3MgKyBkZXB0aCk7XG4gICAgICAgIHJlcGxhY2VMaW5lYnJlYWtzKHRyLCAkYWZ0ZXIubm9kZSgpLCAkYWZ0ZXIuYmVmb3JlKCksIG1hcEZyb20pO1xuICAgIH1cbiAgICBpZiAoYmVmb3JlVHlwZS5pbmxpbmVDb250ZW50KVxuICAgICAgICBjbGVhckluY29tcGF0aWJsZSh0ciwgcG9zICsgZGVwdGggLSAxLCBiZWZvcmVUeXBlLCAkYmVmb3JlLm5vZGUoKS5jb250ZW50TWF0Y2hBdCgkYmVmb3JlLmluZGV4KCkpLCBjb252ZXJ0TmV3bGluZXMgPT0gbnVsbCk7XG4gICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLCBzdGFydCA9IG1hcHBpbmcubWFwKHBvcyAtIGRlcHRoKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChzdGFydCwgbWFwcGluZy5tYXAocG9zICsgZGVwdGgsIC0xKSwgU2xpY2UuZW1wdHksIHRydWUpKTtcbiAgICBpZiAoY29udmVydE5ld2xpbmVzID09PSB0cnVlKSB7XG4gICAgICAgIGxldCAkZnVsbCA9IHRyLmRvYy5yZXNvbHZlKHN0YXJ0KTtcbiAgICAgICAgcmVwbGFjZU5ld2xpbmVzKHRyLCAkZnVsbC5ub2RlKCksICRmdWxsLmJlZm9yZSgpLCB0ci5zdGVwcy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG4vKipcblRyeSB0byBmaW5kIGEgcG9pbnQgd2hlcmUgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIGNhbiBiZSBpbnNlcnRlZFxubmVhciBgcG9zYCwgYnkgc2VhcmNoaW5nIHVwIHRoZSBub2RlIGhpZXJhcmNoeSB3aGVuIGBwb3NgIGl0c2VsZlxuaXNuJ3QgYSB2YWxpZCBwbGFjZSBidXQgaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIG5vZGUuIFJldHVyblxubnVsbCBpZiBubyBwb3NpdGlvbiB3YXMgZm91bmQuXG4qL1xuZnVuY3Rpb24gaW5zZXJ0UG9pbnQoZG9jLCBwb3MsIG5vZGVUeXBlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICgkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aCgkcG9zLmluZGV4KCksICRwb3MuaW5kZXgoKSwgbm9kZVR5cGUpKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIGlmICgkcG9zLnBhcmVudE9mZnNldCA9PSAwKVxuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShkKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIG5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5iZWZvcmUoZCArIDEpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIGlmICgkcG9zLnBhcmVudE9mZnNldCA9PSAkcG9zLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXhBZnRlcihkKTtcbiAgICAgICAgICAgIGlmICgkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBub2RlVHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3MuYWZ0ZXIoZCArIDEpO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgJHBvcy5ub2RlKGQpLmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuRmluZHMgYSBwb3NpdGlvbiBhdCBvciBhcm91bmQgdGhlIGdpdmVuIHBvc2l0aW9uIHdoZXJlIHRoZSBnaXZlblxuc2xpY2UgY2FuIGJlIGluc2VydGVkLiBXaWxsIGxvb2sgYXQgcGFyZW50IG5vZGVzJyBuZWFyZXN0IGJvdW5kYXJ5XG5hbmQgdHJ5IHRoZXJlLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3YXNuJ3QgZGlyZWN0bHkgYXQgdGhlXG5zdGFydCBvciBlbmQgb2YgdGhhdCBub2RlLiBSZXR1cm5zIG51bGwgd2hlbiBubyBwb3NpdGlvbiB3YXMgZm91bmQuXG4qL1xuZnVuY3Rpb24gZHJvcFBvaW50KGRvYywgcG9zLCBzbGljZSkge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIXNsaWNlLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICBsZXQgY29udGVudCA9IHNsaWNlLmNvbnRlbnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGljZS5vcGVuU3RhcnQ7IGkrKylcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgIGZvciAobGV0IHBhc3MgPSAxOyBwYXNzIDw9IChzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5zaXplID8gMiA6IDEpOyBwYXNzKyspIHtcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgYmlhcyA9IGQgPT0gJHBvcy5kZXB0aCA/IDAgOiAkcG9zLnBvcyA8PSAoJHBvcy5zdGFydChkICsgMSkgKyAkcG9zLmVuZChkICsgMSkpIC8gMiA/IC0xIDogMTtcbiAgICAgICAgICAgIGxldCBpbnNlcnRQb3MgPSAkcG9zLmluZGV4KGQpICsgKGJpYXMgPiAwID8gMSA6IDApO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRwb3Mubm9kZShkKSwgZml0cyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSkge1xuICAgICAgICAgICAgICAgIGZpdHMgPSBwYXJlbnQuY2FuUmVwbGFjZShpbnNlcnRQb3MsIGluc2VydFBvcywgY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBpbmcgPSBwYXJlbnQuY29udGVudE1hdGNoQXQoaW5zZXJ0UG9zKS5maW5kV3JhcHBpbmcoY29udGVudC5maXJzdENoaWxkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGZpdHMgPSB3cmFwcGluZyAmJiBwYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5zZXJ0UG9zLCBpbnNlcnRQb3MsIHdyYXBwaW5nWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXRzKVxuICAgICAgICAgICAgICAgIHJldHVybiBiaWFzID09IDAgPyAkcG9zLnBvcyA6IGJpYXMgPCAwID8gJHBvcy5iZWZvcmUoZCArIDEpIDogJHBvcy5hZnRlcihkICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxu4oCYRml04oCZIGEgc2xpY2UgaW50byBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcHJvZHVjaW5nIGFcbltzdGVwXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXApIHRoYXQgaW5zZXJ0cyBpdC4gV2lsbCByZXR1cm4gbnVsbCBpZlxudGhlcmUncyBubyBtZWFuaW5nZnVsIHdheSB0byBpbnNlcnQgdGhlIHNsaWNlIGhlcmUsIG9yIGluc2VydGluZyBpdFxud291bGQgYmUgYSBuby1vcCAoYW4gZW1wdHkgc2xpY2Ugb3ZlciBhbiBlbXB0eSByYW5nZSkuXG4qL1xuZnVuY3Rpb24gcmVwbGFjZVN0ZXAoZG9jLCBmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICBpZiAoZnJvbSA9PSB0byAmJiAhc2xpY2Uuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0ICRmcm9tID0gZG9jLnJlc29sdmUoZnJvbSksICR0byA9IGRvYy5yZXNvbHZlKHRvKTtcbiAgICAvLyBPcHRpbWl6YXRpb24gLS0gYXZvaWQgd29yayBpZiBpdCdzIG9idmlvdXMgdGhhdCBpdCdzIG5vdCBuZWVkZWQuXG4gICAgaWYgKGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpKVxuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGZyb20sIHRvLCBzbGljZSk7XG4gICAgcmV0dXJuIG5ldyBGaXR0ZXIoJGZyb20sICR0bywgc2xpY2UpLmZpdCgpO1xufVxuZnVuY3Rpb24gZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkge1xuICAgIHJldHVybiAhc2xpY2Uub3BlblN0YXJ0ICYmICFzbGljZS5vcGVuRW5kICYmICRmcm9tLnN0YXJ0KCkgPT0gJHRvLnN0YXJ0KCkgJiZcbiAgICAgICAgJGZyb20ucGFyZW50LmNhblJlcGxhY2UoJGZyb20uaW5kZXgoKSwgJHRvLmluZGV4KCksIHNsaWNlLmNvbnRlbnQpO1xufVxuLy8gQWxnb3JpdGhtIGZvciAncGxhY2luZycgdGhlIGVsZW1lbnRzIG9mIGEgc2xpY2UgaW50byBhIGdhcDpcbi8vXG4vLyBXZSBjb25zaWRlciB0aGUgY29udGVudCBvZiBlYWNoIG5vZGUgdGhhdCBpcyBvcGVuIHRvIHRoZSBsZWZ0IHRvIGJlXG4vLyBpbmRlcGVuZGVudGx5IHBsYWNlYWJsZS4gSS5lLiBpbiA8cChcImZvb1wiKSwgcChcImJhclwiKT4sIHdoZW4gdGhlXG4vLyBwYXJhZ3JhcGggb24gdGhlIGxlZnQgaXMgb3BlbiwgXCJmb29cIiBjYW4gYmUgcGxhY2VkIChzb21ld2hlcmUgb25cbi8vIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJlcGxhY2VtZW50IGdhcCkgaW5kZXBlbmRlbnRseSBmcm9tIHAoXCJiYXJcIikuXG4vL1xuLy8gVGhpcyBjbGFzcyB0cmFja3MgdGhlIHN0YXRlIG9mIHRoZSBwbGFjZW1lbnQgcHJvZ3Jlc3MgaW4gdGhlXG4vLyBmb2xsb3dpbmcgcHJvcGVydGllczpcbi8vXG4vLyAgLSBgZnJvbnRpZXJgIGhvbGRzIGEgc3RhY2sgb2YgYHt0eXBlLCBtYXRjaH1gIG9iamVjdHMgdGhhdFxuLy8gICAgcmVwcmVzZW50IHRoZSBvcGVuIHNpZGUgb2YgdGhlIHJlcGxhY2VtZW50LiBJdCBzdGFydHMgYXRcbi8vICAgIGAkZnJvbWAsIHRoZW4gbW92ZXMgZm9yd2FyZCBhcyBjb250ZW50IGlzIHBsYWNlZCwgYW5kIGlzIGZpbmFsbHlcbi8vICAgIHJlY29uY2lsZWQgd2l0aCBgJHRvYC5cbi8vXG4vLyAgLSBgdW5wbGFjZWRgIGlzIGEgc2xpY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50IHRoYXQgaGFzbid0XG4vLyAgICBiZWVuIHBsYWNlZCB5ZXQuXG4vL1xuLy8gIC0gYHBsYWNlZGAgaXMgYSBmcmFnbWVudCBvZiBwbGFjZWQgY29udGVudC4gSXRzIG9wZW4tc3RhcnQgdmFsdWVcbi8vICAgIGlzIGltcGxpY2l0IGluIGAkZnJvbWAsIGFuZCBpdHMgb3Blbi1lbmQgdmFsdWUgaW4gYGZyb250aWVyYC5cbmNsYXNzIEZpdHRlciB7XG4gICAgY29uc3RydWN0b3IoJGZyb20sICR0bywgdW5wbGFjZWQpIHtcbiAgICAgICAgdGhpcy4kZnJvbSA9ICRmcm9tO1xuICAgICAgICB0aGlzLiR0byA9ICR0bztcbiAgICAgICAgdGhpcy51bnBsYWNlZCA9IHVucGxhY2VkO1xuICAgICAgICB0aGlzLmZyb250aWVyID0gW107XG4gICAgICAgIHRoaXMucGxhY2VkID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9ICRmcm9tLmRlcHRoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gJGZyb20ubm9kZShpKTtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRpZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIG1hdGNoOiBub2RlLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoaSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gJGZyb20uZGVwdGg7IGkgPiAwOyBpLS0pXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShpKS5jb3B5KHRoaXMucGxhY2VkKSk7XG4gICAgfVxuICAgIGdldCBkZXB0aCgpIHsgcmV0dXJuIHRoaXMuZnJvbnRpZXIubGVuZ3RoIC0gMTsgfVxuICAgIGZpdCgpIHtcbiAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGVyZSdzIHVucGxhY2VkIGNvbnRlbnQsIHRyeSB0byBwbGFjZSBzb21lIG9mIGl0LlxuICAgICAgICAvLyBJZiB0aGF0IGZhaWxzLCBlaXRoZXIgaW5jcmVhc2UgdGhlIG9wZW4gc2NvcmUgb2YgdGhlIHVucGxhY2VkXG4gICAgICAgIC8vIHNsaWNlLCBvciBkcm9wIG5vZGVzIGZyb20gaXQsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICAgICAgd2hpbGUgKHRoaXMudW5wbGFjZWQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGZpdCA9IHRoaXMuZmluZEZpdHRhYmxlKCk7XG4gICAgICAgICAgICBpZiAoZml0KVxuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VOb2RlcyhmaXQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMub3Blbk1vcmUoKSB8fCB0aGlzLmRyb3BOb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGVyZSdzIGlubGluZSBjb250ZW50IGRpcmVjdGx5IGFmdGVyIHRoZSBmcm9udGllciBfYW5kX1xuICAgICAgICAvLyBkaXJlY3RseSBhZnRlciBgdGhpcy4kdG9gLCB3ZSBtdXN0IGdlbmVyYXRlIGEgYFJlcGxhY2VBcm91bmRgXG4gICAgICAgIC8vIHN0ZXAgdGhhdCBwdWxscyB0aGF0IGNvbnRlbnQgaW50byB0aGUgbm9kZSBhZnRlciB0aGUgZnJvbnRpZXIuXG4gICAgICAgIC8vIFRoYXQgbWVhbnMgdGhlIGZpdHRpbmcgbXVzdCBiZSBkb25lIHRvIHRoZSBlbmQgb2YgdGhlIHRleHRibG9ja1xuICAgICAgICAvLyBub2RlIGFmdGVyIGB0aGlzLiR0b2AsIG5vdCBgdGhpcy4kdG9gIGl0c2VsZi5cbiAgICAgICAgbGV0IG1vdmVJbmxpbmUgPSB0aGlzLm11c3RNb3ZlSW5saW5lKCksIHBsYWNlZFNpemUgPSB0aGlzLnBsYWNlZC5zaXplIC0gdGhpcy5kZXB0aCAtIHRoaXMuJGZyb20uZGVwdGg7XG4gICAgICAgIGxldCAkZnJvbSA9IHRoaXMuJGZyb20sICR0byA9IHRoaXMuY2xvc2UobW92ZUlubGluZSA8IDAgPyB0aGlzLiR0byA6ICRmcm9tLmRvYy5yZXNvbHZlKG1vdmVJbmxpbmUpKTtcbiAgICAgICAgaWYgKCEkdG8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSWYgY2xvc2luZyB0byBgJHRvYCBzdWNjZWVkZWQsIGNyZWF0ZSBhIHN0ZXBcbiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnBsYWNlZCwgb3BlblN0YXJ0ID0gJGZyb20uZGVwdGgsIG9wZW5FbmQgPSAkdG8uZGVwdGg7XG4gICAgICAgIHdoaWxlIChvcGVuU3RhcnQgJiYgb3BlbkVuZCAmJiBjb250ZW50LmNoaWxkQ291bnQgPT0gMSkgeyAvLyBOb3JtYWxpemUgYnkgZHJvcHBpbmcgb3BlbiBwYXJlbnQgbm9kZXNcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmZpcnN0Q2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIG9wZW5TdGFydC0tO1xuICAgICAgICAgICAgb3BlbkVuZC0tO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICBpZiAobW92ZUlubGluZSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkZnJvbS5wb3MsIG1vdmVJbmxpbmUsIHRoaXMuJHRvLnBvcywgdGhpcy4kdG8uZW5kKCksIHNsaWNlLCBwbGFjZWRTaXplKTtcbiAgICAgICAgaWYgKHNsaWNlLnNpemUgfHwgJGZyb20ucG9zICE9IHRoaXMuJHRvLnBvcykgLy8gRG9uJ3QgZ2VuZXJhdGUgbm8tb3Agc3RlcHNcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoJGZyb20ucG9zLCAkdG8ucG9zLCBzbGljZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBGaW5kIGEgcG9zaXRpb24gb24gdGhlIHN0YXJ0IHNwaW5lIG9mIGB0aGlzLnVucGxhY2VkYCB0aGF0IGhhc1xuICAgIC8vIGNvbnRlbnQgdGhhdCBjYW4gYmUgbW92ZWQgc29tZXdoZXJlIG9uIHRoZSBmcm9udGllci4gUmV0dXJucyB0d29cbiAgICAvLyBkZXB0aHMsIG9uZSBmb3IgdGhlIHNsaWNlIGFuZCBvbmUgZm9yIHRoZSBmcm9udGllci5cbiAgICBmaW5kRml0dGFibGUoKSB7XG4gICAgICAgIGxldCBzdGFydERlcHRoID0gdGhpcy51bnBsYWNlZC5vcGVuU3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHRoaXMudW5wbGFjZWQuY29udGVudCwgZCA9IDAsIG9wZW5FbmQgPSB0aGlzLnVucGxhY2VkLm9wZW5FbmQ7IGQgPCBzdGFydERlcHRoOyBkKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gY3VyLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoY3VyLmNoaWxkQ291bnQgPiAxKVxuICAgICAgICAgICAgICAgIG9wZW5FbmQgPSAwO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZyAmJiBvcGVuRW5kIDw9IGQpIHtcbiAgICAgICAgICAgICAgICBzdGFydERlcHRoID0gZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1ciA9IG5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHRyeSB3cmFwcGluZyBub2RlcyAocGFzcyAyKSBhZnRlciBmaW5kaW5nIGEgcGxhY2Ugd2l0aG91dFxuICAgICAgICAvLyB3cmFwcGluZyBmYWlsZWQuXG4gICAgICAgIGZvciAobGV0IHBhc3MgPSAxOyBwYXNzIDw9IDI7IHBhc3MrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgc2xpY2VEZXB0aCA9IHBhc3MgPT0gMSA/IHN0YXJ0RGVwdGggOiB0aGlzLnVucGxhY2VkLm9wZW5TdGFydDsgc2xpY2VEZXB0aCA+PSAwOyBzbGljZURlcHRoLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJhZ21lbnQsIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gY29udGVudEF0KHRoaXMudW5wbGFjZWQuY29udGVudCwgc2xpY2VEZXB0aCAtIDEpLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gcGFyZW50LmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMudW5wbGFjZWQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmcm9udGllckRlcHRoID0gdGhpcy5kZXB0aDsgZnJvbnRpZXJEZXB0aCA+PSAwOyBmcm9udGllckRlcHRoLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbWF0Y2ggfSA9IHRoaXMuZnJvbnRpZXJbZnJvbnRpZXJEZXB0aF0sIHdyYXAsIGluamVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHBhc3MgMSwgaWYgdGhlIG5leHQgbm9kZSBtYXRjaGVzLCBvciB0aGVyZSBpcyBubyBuZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgYnV0IHRoZSBwYXJlbnRzIGxvb2sgY29tcGF0aWJsZSwgd2UndmUgZm91bmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSAmJiAoZmlyc3QgPyBtYXRjaC5tYXRjaFR5cGUoZmlyc3QudHlwZSkgfHwgKGluamVjdCA9IG1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZnJvbShmaXJzdCksIGZhbHNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyZW50ICYmIHR5cGUuY29tcGF0aWJsZUNvbnRlbnQocGFyZW50LnR5cGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgaW5qZWN0IH07XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHBhc3MgMiwgbG9vayBmb3IgYSBzZXQgb2Ygd3JhcHBpbmcgbm9kZXMgdGhhdCBtYWtlXG4gICAgICAgICAgICAgICAgICAgIC8vIGBmaXJzdGAgZml0IGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3MgPT0gMiAmJiBmaXJzdCAmJiAod3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhmaXJzdC50eXBlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzbGljZURlcHRoLCBmcm9udGllckRlcHRoLCBwYXJlbnQsIHdyYXAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29udGludWUgbG9va2luZyBmdXJ0aGVyIHVwIGlmIHRoZSBwYXJlbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBmaXQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBtYXRjaC5tYXRjaFR5cGUocGFyZW50LnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG9wZW5Nb3JlKCkge1xuICAgICAgICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHRoaXMudW5wbGFjZWQ7XG4gICAgICAgIGxldCBpbm5lciA9IGNvbnRlbnRBdChjb250ZW50LCBvcGVuU3RhcnQpO1xuICAgICAgICBpZiAoIWlubmVyLmNoaWxkQ291bnQgfHwgaW5uZXIuZmlyc3RDaGlsZC5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSBuZXcgU2xpY2UoY29udGVudCwgb3BlblN0YXJ0ICsgMSwgTWF0aC5tYXgob3BlbkVuZCwgaW5uZXIuc2l6ZSArIG9wZW5TdGFydCA+PSBjb250ZW50LnNpemUgLSBvcGVuRW5kID8gb3BlblN0YXJ0ICsgMSA6IDApKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyb3BOb2RlKCkge1xuICAgICAgICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHRoaXMudW5wbGFjZWQ7XG4gICAgICAgIGxldCBpbm5lciA9IGNvbnRlbnRBdChjb250ZW50LCBvcGVuU3RhcnQpO1xuICAgICAgICBpZiAoaW5uZXIuY2hpbGRDb3VudCA8PSAxICYmIG9wZW5TdGFydCA+IDApIHtcbiAgICAgICAgICAgIGxldCBvcGVuQXRFbmQgPSBjb250ZW50LnNpemUgLSBvcGVuU3RhcnQgPD0gb3BlblN0YXJ0ICsgaW5uZXIuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudW5wbGFjZWQgPSBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChjb250ZW50LCBvcGVuU3RhcnQgLSAxLCAxKSwgb3BlblN0YXJ0IC0gMSwgb3BlbkF0RW5kID8gb3BlblN0YXJ0IC0gMSA6IG9wZW5FbmQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KGNvbnRlbnQsIG9wZW5TdGFydCwgMSksIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTW92ZSBjb250ZW50IGZyb20gdGhlIHVucGxhY2VkIHNsaWNlIGF0IGBzbGljZURlcHRoYCB0byB0aGVcbiAgICAvLyBmcm9udGllciBub2RlIGF0IGBmcm9udGllckRlcHRoYC4gQ2xvc2UgdGhhdCBmcm9udGllciBub2RlIHdoZW5cbiAgICAvLyBhcHBsaWNhYmxlLlxuICAgIHBsYWNlTm9kZXMoeyBzbGljZURlcHRoLCBmcm9udGllckRlcHRoLCBwYXJlbnQsIGluamVjdCwgd3JhcCB9KSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRlcHRoID4gZnJvbnRpZXJEZXB0aClcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgaWYgKHdyYXApXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRnJvbnRpZXJOb2RlKHdyYXBbaV0pO1xuICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnVucGxhY2VkLCBmcmFnbWVudCA9IHBhcmVudCA/IHBhcmVudC5jb250ZW50IDogc2xpY2UuY29udGVudDtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IHNsaWNlLm9wZW5TdGFydCAtIHNsaWNlRGVwdGg7XG4gICAgICAgIGxldCB0YWtlbiA9IDAsIGFkZCA9IFtdO1xuICAgICAgICBsZXQgeyBtYXRjaCwgdHlwZSB9ID0gdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXTtcbiAgICAgICAgaWYgKGluamVjdCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3QuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICAgICAgICAgIGFkZC5wdXNoKGluamVjdC5jaGlsZChpKSk7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoRnJhZ21lbnQoaW5qZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wdXRlcyB0aGUgYW1vdW50IG9mIChlbmQpIG9wZW4gbm9kZXMgYXQgdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gZnJhZ21lbnQuIFdoZW4gMCwgdGhlIHBhcmVudCBpcyBvcGVuLCBidXQgbm8gbW9yZS4gV2hlblxuICAgICAgICAvLyBuZWdhdGl2ZSwgbm90aGluZyBpcyBvcGVuLlxuICAgICAgICBsZXQgb3BlbkVuZENvdW50ID0gKGZyYWdtZW50LnNpemUgKyBzbGljZURlcHRoKSAtIChzbGljZS5jb250ZW50LnNpemUgLSBzbGljZS5vcGVuRW5kKTtcbiAgICAgICAgLy8gU2NhbiBvdmVyIHRoZSBmcmFnbWVudCwgZml0dGluZyBhcyBtYW55IGNoaWxkIG5vZGVzIGFzXG4gICAgICAgIC8vIHBvc3NpYmxlLlxuICAgICAgICB3aGlsZSAodGFrZW4gPCBmcmFnbWVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZyYWdtZW50LmNoaWxkKHRha2VuKSwgbWF0Y2hlcyA9IG1hdGNoLm1hdGNoVHlwZShuZXh0LnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGFrZW4rKztcbiAgICAgICAgICAgIGlmICh0YWtlbiA+IDEgfHwgb3BlblN0YXJ0ID09IDAgfHwgbmV4dC5jb250ZW50LnNpemUpIHsgLy8gRHJvcCBlbXB0eSBvcGVuIG5vZGVzXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzO1xuICAgICAgICAgICAgICAgIGFkZC5wdXNoKGNsb3NlTm9kZVN0YXJ0KG5leHQubWFyayh0eXBlLmFsbG93ZWRNYXJrcyhuZXh0Lm1hcmtzKSksIHRha2VuID09IDEgPyBvcGVuU3RhcnQgOiAwLCB0YWtlbiA9PSBmcmFnbWVudC5jaGlsZENvdW50ID8gb3BlbkVuZENvdW50IDogLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9FbmQgPSB0YWtlbiA9PSBmcmFnbWVudC5jaGlsZENvdW50O1xuICAgICAgICBpZiAoIXRvRW5kKVxuICAgICAgICAgICAgb3BlbkVuZENvdW50ID0gLTE7XG4gICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgZnJvbnRpZXJEZXB0aCwgRnJhZ21lbnQuZnJvbShhZGQpKTtcbiAgICAgICAgdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXS5tYXRjaCA9IG1hdGNoO1xuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IHR5cGVzIG1hdGNoLCBhbmQgdGhlIGVudGlyZSBub2RlIHdhcyBtb3ZlZCwgYW5kXG4gICAgICAgIC8vIGl0J3Mgbm90IG9wZW4sIGNsb3NlIHRoaXMgZnJvbnRpZXIgbm9kZSByaWdodCBhd2F5LlxuICAgICAgICBpZiAodG9FbmQgJiYgb3BlbkVuZENvdW50IDwgMCAmJiBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXS50eXBlICYmIHRoaXMuZnJvbnRpZXIubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgLy8gQWRkIG5ldyBmcm9udGllciBub2RlcyBmb3IgYW55IG9wZW4gbm9kZXMgYXQgdGhlIGVuZC5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGN1ciA9IGZyYWdtZW50OyBpIDwgb3BlbkVuZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gY3VyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRpZXIucHVzaCh7IHR5cGU6IG5vZGUudHlwZSwgbWF0Y2g6IG5vZGUuY29udGVudE1hdGNoQXQobm9kZS5jaGlsZENvdW50KSB9KTtcbiAgICAgICAgICAgIGN1ciA9IG5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgYHRoaXMudW5wbGFjZWRgLiBEcm9wIHRoZSBlbnRpcmUgbm9kZSBmcm9tIHdoaWNoIHdlXG4gICAgICAgIC8vIHBsYWNlZCBpdCB3ZSBnb3QgdG8gaXRzIGVuZCwgb3RoZXJ3aXNlIGp1c3QgZHJvcCB0aGUgcGxhY2VkXG4gICAgICAgIC8vIG5vZGVzLlxuICAgICAgICB0aGlzLnVucGxhY2VkID0gIXRvRW5kID8gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoc2xpY2UuY29udGVudCwgc2xpY2VEZXB0aCwgdGFrZW4pLCBzbGljZS5vcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpXG4gICAgICAgICAgICA6IHNsaWNlRGVwdGggPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChzbGljZS5jb250ZW50LCBzbGljZURlcHRoIC0gMSwgMSksIHNsaWNlRGVwdGggLSAxLCBvcGVuRW5kQ291bnQgPCAwID8gc2xpY2Uub3BlbkVuZCA6IHNsaWNlRGVwdGggLSAxKTtcbiAgICB9XG4gICAgbXVzdE1vdmVJbmxpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy4kdG8ucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXSwgbGV2ZWw7XG4gICAgICAgIGlmICghdG9wLnR5cGUuaXNUZXh0YmxvY2sgfHwgIWNvbnRlbnRBZnRlckZpdHModGhpcy4kdG8sIHRoaXMuJHRvLmRlcHRoLCB0b3AudHlwZSwgdG9wLm1hdGNoLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICh0aGlzLiR0by5kZXB0aCA9PSB0aGlzLmRlcHRoICYmIChsZXZlbCA9IHRoaXMuZmluZENsb3NlTGV2ZWwodGhpcy4kdG8pKSAmJiBsZXZlbC5kZXB0aCA9PSB0aGlzLmRlcHRoKSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgbGV0IHsgZGVwdGggfSA9IHRoaXMuJHRvLCBhZnRlciA9IHRoaXMuJHRvLmFmdGVyKGRlcHRoKTtcbiAgICAgICAgd2hpbGUgKGRlcHRoID4gMSAmJiBhZnRlciA9PSB0aGlzLiR0by5lbmQoLS1kZXB0aCkpXG4gICAgICAgICAgICArK2FmdGVyO1xuICAgICAgICByZXR1cm4gYWZ0ZXI7XG4gICAgfVxuICAgIGZpbmRDbG9zZUxldmVsKCR0bykge1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBpID0gTWF0aC5taW4odGhpcy5kZXB0aCwgJHRvLmRlcHRoKTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2ldO1xuICAgICAgICAgICAgbGV0IGRyb3BJbm5lciA9IGkgPCAkdG8uZGVwdGggJiYgJHRvLmVuZChpICsgMSkgPT0gJHRvLnBvcyArICgkdG8uZGVwdGggLSAoaSArIDEpKTtcbiAgICAgICAgICAgIGxldCBmaXQgPSBjb250ZW50QWZ0ZXJGaXRzKCR0bywgaSwgdHlwZSwgbWF0Y2gsIGRyb3BJbm5lcik7XG4gICAgICAgICAgICBpZiAoIWZpdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSBpIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBtYXRjaCwgdHlwZSB9ID0gdGhpcy5mcm9udGllcltkXTtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IGNvbnRlbnRBZnRlckZpdHMoJHRvLCBkLCB0eXBlLCBtYXRjaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXMuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgc2NhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRlcHRoOiBpLCBmaXQsIG1vdmU6IGRyb3BJbm5lciA/ICR0by5kb2MucmVzb2x2ZSgkdG8uYWZ0ZXIoaSArIDEpKSA6ICR0byB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlKCR0bykge1xuICAgICAgICBsZXQgY2xvc2UgPSB0aGlzLmZpbmRDbG9zZUxldmVsKCR0byk7XG4gICAgICAgIGlmICghY2xvc2UpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVwdGggPiBjbG9zZS5kZXB0aClcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgaWYgKGNsb3NlLmZpdC5jaGlsZENvdW50KVxuICAgICAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCBjbG9zZS5kZXB0aCwgY2xvc2UuZml0KTtcbiAgICAgICAgJHRvID0gY2xvc2UubW92ZTtcbiAgICAgICAgZm9yIChsZXQgZCA9IGNsb3NlLmRlcHRoICsgMTsgZCA8PSAkdG8uZGVwdGg7IGQrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkdG8ubm9kZShkKSwgYWRkID0gbm9kZS50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKG5vZGUuY29udGVudCwgdHJ1ZSwgJHRvLmluZGV4KGQpKTtcbiAgICAgICAgICAgIHRoaXMub3BlbkZyb250aWVyTm9kZShub2RlLnR5cGUsIG5vZGUuYXR0cnMsIGFkZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICR0bztcbiAgICB9XG4gICAgb3BlbkZyb250aWVyTm9kZSh0eXBlLCBhdHRycyA9IG51bGwsIGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMuZnJvbnRpZXJbdGhpcy5kZXB0aF07XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaC5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgdGhpcy5kZXB0aCwgRnJhZ21lbnQuZnJvbSh0eXBlLmNyZWF0ZShhdHRycywgY29udGVudCkpKTtcbiAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHsgdHlwZSwgbWF0Y2g6IHR5cGUuY29udGVudE1hdGNoIH0pO1xuICAgIH1cbiAgICBjbG9zZUZyb250aWVyTm9kZSgpIHtcbiAgICAgICAgbGV0IG9wZW4gPSB0aGlzLmZyb250aWVyLnBvcCgpO1xuICAgICAgICBsZXQgYWRkID0gb3Blbi5tYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgaWYgKGFkZC5jaGlsZENvdW50KVxuICAgICAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCB0aGlzLmZyb250aWVyLmxlbmd0aCwgYWRkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkcm9wRnJvbUZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgY291bnQpIHtcbiAgICBpZiAoZGVwdGggPT0gMClcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LmN1dEJ5SW5kZXgoY291bnQsIGZyYWdtZW50LmNoaWxkQ291bnQpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoMCwgZnJhZ21lbnQuZmlyc3RDaGlsZC5jb3B5KGRyb3BGcm9tRnJhZ21lbnQoZnJhZ21lbnQuZmlyc3RDaGlsZC5jb250ZW50LCBkZXB0aCAtIDEsIGNvdW50KSkpO1xufVxuZnVuY3Rpb24gYWRkVG9GcmFnbWVudChmcmFnbWVudCwgZGVwdGgsIGNvbnRlbnQpIHtcbiAgICBpZiAoZGVwdGggPT0gMClcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LmFwcGVuZChjb250ZW50KTtcbiAgICByZXR1cm4gZnJhZ21lbnQucmVwbGFjZUNoaWxkKGZyYWdtZW50LmNoaWxkQ291bnQgLSAxLCBmcmFnbWVudC5sYXN0Q2hpbGQuY29weShhZGRUb0ZyYWdtZW50KGZyYWdtZW50Lmxhc3RDaGlsZC5jb250ZW50LCBkZXB0aCAtIDEsIGNvbnRlbnQpKSk7XG59XG5mdW5jdGlvbiBjb250ZW50QXQoZnJhZ21lbnQsIGRlcHRoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQuY29udGVudDtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiBjbG9zZU5vZGVTdGFydChub2RlLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBpZiAob3BlblN0YXJ0IDw9IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChvcGVuU3RhcnQgPiAxKVxuICAgICAgICBmcmFnID0gZnJhZy5yZXBsYWNlQ2hpbGQoMCwgY2xvc2VOb2RlU3RhcnQoZnJhZy5maXJzdENoaWxkLCBvcGVuU3RhcnQgLSAxLCBmcmFnLmNoaWxkQ291bnQgPT0gMSA/IG9wZW5FbmQgLSAxIDogMCkpO1xuICAgIGlmIChvcGVuU3RhcnQgPiAwKSB7XG4gICAgICAgIGZyYWcgPSBub2RlLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoZnJhZykuYXBwZW5kKGZyYWcpO1xuICAgICAgICBpZiAob3BlbkVuZCA8PSAwKVxuICAgICAgICAgICAgZnJhZyA9IGZyYWcuYXBwZW5kKG5vZGUudHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChmcmFnKS5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNvcHkoZnJhZyk7XG59XG5mdW5jdGlvbiBjb250ZW50QWZ0ZXJGaXRzKCR0bywgZGVwdGgsIHR5cGUsIG1hdGNoLCBvcGVuKSB7XG4gICAgbGV0IG5vZGUgPSAkdG8ubm9kZShkZXB0aCksIGluZGV4ID0gb3BlbiA/ICR0by5pbmRleEFmdGVyKGRlcHRoKSA6ICR0by5pbmRleChkZXB0aCk7XG4gICAgaWYgKGluZGV4ID09IG5vZGUuY2hpbGRDb3VudCAmJiAhdHlwZS5jb21wYXRpYmxlQ29udGVudChub2RlLnR5cGUpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZml0ID0gbWF0Y2guZmlsbEJlZm9yZShub2RlLmNvbnRlbnQsIHRydWUsIGluZGV4KTtcbiAgICByZXR1cm4gZml0ICYmICFpbnZhbGlkTWFya3ModHlwZSwgbm9kZS5jb250ZW50LCBpbmRleCkgPyBmaXQgOiBudWxsO1xufVxuZnVuY3Rpb24gaW52YWxpZE1hcmtzKHR5cGUsIGZyYWdtZW50LCBzdGFydCkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGZyYWdtZW50LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgaWYgKCF0eXBlLmFsbG93c01hcmtzKGZyYWdtZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRlZmluZXNDb250ZW50KHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZS5zcGVjLmRlZmluaW5nIHx8IHR5cGUuc3BlYy5kZWZpbmluZ0ZvckNvbnRlbnQ7XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2UodHIsIGZyb20sIHRvLCBzbGljZSkge1xuICAgIGlmICghc2xpY2Uuc2l6ZSlcbiAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gdHIuZG9jLnJlc29sdmUodG8pO1xuICAgIGlmIChmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSlcbiAgICAgICAgcmV0dXJuIHRyLnN0ZXAobmV3IFJlcGxhY2VTdGVwKGZyb20sIHRvLCBzbGljZSkpO1xuICAgIGxldCB0YXJnZXREZXB0aHMgPSBjb3ZlcmVkRGVwdGhzKCRmcm9tLCB0ci5kb2MucmVzb2x2ZSh0bykpO1xuICAgIC8vIENhbid0IHJlcGxhY2UgdGhlIHdob2xlIGRvY3VtZW50LCBzbyByZW1vdmUgMCBpZiBpdCdzIHByZXNlbnRcbiAgICBpZiAodGFyZ2V0RGVwdGhzW3RhcmdldERlcHRocy5sZW5ndGggLSAxXSA9PSAwKVxuICAgICAgICB0YXJnZXREZXB0aHMucG9wKCk7XG4gICAgLy8gTmVnYXRpdmUgbnVtYmVycyByZXByZXNlbnQgbm90IGV4cGFuc2lvbiBvdmVyIHRoZSB3aG9sZSBub2RlIGF0XG4gICAgLy8gdGhhdCBkZXB0aCwgYnV0IHJlcGxhY2luZyBmcm9tICRmcm9tLmJlZm9yZSgtRCkgdG8gJHRvLnBvcy5cbiAgICBsZXQgcHJlZmVycmVkVGFyZ2V0ID0gLSgkZnJvbS5kZXB0aCArIDEpO1xuICAgIHRhcmdldERlcHRocy51bnNoaWZ0KHByZWZlcnJlZFRhcmdldCk7XG4gICAgLy8gVGhpcyBsb29wIHBpY2tzIGEgcHJlZmVycmVkIHRhcmdldCBkZXB0aCwgaWYgb25lIG9mIHRoZSBjb3ZlcmluZ1xuICAgIC8vIGRlcHRocyBpcyBub3Qgb3V0c2lkZSBvZiBhIGRlZmluaW5nIG5vZGUsIGFuZCBhZGRzIG5lZ2F0aXZlXG4gICAgLy8gZGVwdGhzIGZvciBhbnkgZGVwdGggdGhhdCBoYXMgJGZyb20gYXQgaXRzIHN0YXJ0IGFuZCBkb2VzIG5vdFxuICAgIC8vIGNyb3NzIGEgZGVmaW5pbmcgbm9kZS5cbiAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGgsIHBvcyA9ICRmcm9tLnBvcyAtIDE7IGQgPiAwOyBkLS0sIHBvcy0tKSB7XG4gICAgICAgIGxldCBzcGVjID0gJGZyb20ubm9kZShkKS50eXBlLnNwZWM7XG4gICAgICAgIGlmIChzcGVjLmRlZmluaW5nIHx8IHNwZWMuZGVmaW5pbmdBc0NvbnRleHQgfHwgc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHRhcmdldERlcHRocy5pbmRleE9mKGQpID4gLTEpXG4gICAgICAgICAgICBwcmVmZXJyZWRUYXJnZXQgPSBkO1xuICAgICAgICBlbHNlIGlmICgkZnJvbS5iZWZvcmUoZCkgPT0gcG9zKVxuICAgICAgICAgICAgdGFyZ2V0RGVwdGhzLnNwbGljZSgxLCAwLCAtZCk7XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaXQgZWFjaCBwb3NzaWJsZSBkZXB0aCBvZiB0aGUgc2xpY2UgaW50byBlYWNoIHBvc3NpYmxlXG4gICAgLy8gdGFyZ2V0IGRlcHRoLCBzdGFydGluZyB3aXRoIHRoZSBwcmVmZXJyZWQgZGVwdGhzLlxuICAgIGxldCBwcmVmZXJyZWRUYXJnZXRJbmRleCA9IHRhcmdldERlcHRocy5pbmRleE9mKHByZWZlcnJlZFRhcmdldCk7XG4gICAgbGV0IGxlZnROb2RlcyA9IFtdLCBwcmVmZXJyZWREZXB0aCA9IHNsaWNlLm9wZW5TdGFydDtcbiAgICBmb3IgKGxldCBjb250ZW50ID0gc2xpY2UuY29udGVudCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGxlZnROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoaSA9PSBzbGljZS5vcGVuU3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY29udGVudCA9IG5vZGUuY29udGVudDtcbiAgICB9XG4gICAgLy8gQmFjayB1cCBwcmVmZXJyZWREZXB0aCB0byBjb3ZlciBkZWZpbmluZyB0ZXh0YmxvY2tzIGRpcmVjdGx5XG4gICAgLy8gYWJvdmUgaXQsIHBvc3NpYmx5IHNraXBwaW5nIGEgbm9uLWRlZmluaW5nIHRleHRibG9jay5cbiAgICBmb3IgKGxldCBkID0gcHJlZmVycmVkRGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgbGVmdE5vZGUgPSBsZWZ0Tm9kZXNbZF0sIGRlZiA9IGRlZmluZXNDb250ZW50KGxlZnROb2RlLnR5cGUpO1xuICAgICAgICBpZiAoZGVmICYmICFsZWZ0Tm9kZS5zYW1lTWFya3VwKCRmcm9tLm5vZGUoTWF0aC5hYnMocHJlZmVycmVkVGFyZ2V0KSAtIDEpKSlcbiAgICAgICAgICAgIHByZWZlcnJlZERlcHRoID0gZDtcbiAgICAgICAgZWxzZSBpZiAoZGVmIHx8ICFsZWZ0Tm9kZS50eXBlLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBzbGljZS5vcGVuU3RhcnQ7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGxldCBvcGVuRGVwdGggPSAoaiArIHByZWZlcnJlZERlcHRoICsgMSkgJSAoc2xpY2Uub3BlblN0YXJ0ICsgMSk7XG4gICAgICAgIGxldCBpbnNlcnQgPSBsZWZ0Tm9kZXNbb3BlbkRlcHRoXTtcbiAgICAgICAgaWYgKCFpbnNlcnQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXREZXB0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBwb3NzaWJsZSBleHBhbnNpb24gbGV2ZWxzLCBzdGFydGluZyB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gcHJlZmVycmVkIG9uZVxuICAgICAgICAgICAgbGV0IHRhcmdldERlcHRoID0gdGFyZ2V0RGVwdGhzWyhpICsgcHJlZmVycmVkVGFyZ2V0SW5kZXgpICUgdGFyZ2V0RGVwdGhzLmxlbmd0aF0sIGV4cGFuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGFyZ2V0RGVwdGggPCAwKSB7XG4gICAgICAgICAgICAgICAgZXhwYW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RGVwdGggPSAtdGFyZ2V0RGVwdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSh0YXJnZXREZXB0aCAtIDEpLCBpbmRleCA9ICRmcm9tLmluZGV4KHRhcmdldERlcHRoIC0gMSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgaW5zZXJ0LnR5cGUsIGluc2VydC5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyLnJlcGxhY2UoJGZyb20uYmVmb3JlKHRhcmdldERlcHRoKSwgZXhwYW5kID8gJHRvLmFmdGVyKHRhcmdldERlcHRoKSA6IHRvLCBuZXcgU2xpY2UoY2xvc2VGcmFnbWVudChzbGljZS5jb250ZW50LCAwLCBzbGljZS5vcGVuU3RhcnQsIG9wZW5EZXB0aCksIG9wZW5EZXB0aCwgc2xpY2Uub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdGFydFN0ZXBzID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSB0YXJnZXREZXB0aHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdHIucmVwbGFjZShmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICBpZiAodHIuc3RlcHMubGVuZ3RoID4gc3RhcnRTdGVwcylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgZGVwdGggPSB0YXJnZXREZXB0aHNbaV07XG4gICAgICAgIGlmIChkZXB0aCA8IDApXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZnJvbSA9ICRmcm9tLmJlZm9yZShkZXB0aCk7XG4gICAgICAgIHRvID0gJHRvLmFmdGVyKGRlcHRoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZUZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgb2xkT3BlbiwgbmV3T3BlbiwgcGFyZW50KSB7XG4gICAgaWYgKGRlcHRoIDwgb2xkT3Blbikge1xuICAgICAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnJlcGxhY2VDaGlsZCgwLCBmaXJzdC5jb3B5KGNsb3NlRnJhZ21lbnQoZmlyc3QuY29udGVudCwgZGVwdGggKyAxLCBvbGRPcGVuLCBuZXdPcGVuLCBmaXJzdCkpKTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID4gbmV3T3Blbikge1xuICAgICAgICBsZXQgbWF0Y2ggPSBwYXJlbnQuY29udGVudE1hdGNoQXQoMCk7XG4gICAgICAgIGxldCBzdGFydCA9IG1hdGNoLmZpbGxCZWZvcmUoZnJhZ21lbnQpLmFwcGVuZChmcmFnbWVudCk7XG4gICAgICAgIGZyYWdtZW50ID0gc3RhcnQuYXBwZW5kKG1hdGNoLm1hdGNoRnJhZ21lbnQoc3RhcnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlV2l0aCh0ciwgZnJvbSwgdG8sIG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuaXNJbmxpbmUgJiYgZnJvbSA9PSB0byAmJiB0ci5kb2MucmVzb2x2ZShmcm9tKS5wYXJlbnQuY29udGVudC5zaXplKSB7XG4gICAgICAgIGxldCBwb2ludCA9IGluc2VydFBvaW50KHRyLmRvYywgZnJvbSwgbm9kZS50eXBlKTtcbiAgICAgICAgaWYgKHBvaW50ICE9IG51bGwpXG4gICAgICAgICAgICBmcm9tID0gdG8gPSBwb2ludDtcbiAgICB9XG4gICAgdHIucmVwbGFjZVJhbmdlKGZyb20sIHRvLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShub2RlKSwgMCwgMCkpO1xufVxuZnVuY3Rpb24gZGVsZXRlUmFuZ2UodHIsIGZyb20sIHRvKSB7XG4gICAgbGV0ICRmcm9tID0gdHIuZG9jLnJlc29sdmUoZnJvbSksICR0byA9IHRyLmRvYy5yZXNvbHZlKHRvKTtcbiAgICBsZXQgY292ZXJlZCA9IGNvdmVyZWREZXB0aHMoJGZyb20sICR0byk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3ZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkZXB0aCA9IGNvdmVyZWRbaV0sIGxhc3QgPSBpID09IGNvdmVyZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKChsYXN0ICYmIGRlcHRoID09IDApIHx8ICRmcm9tLm5vZGUoZGVwdGgpLnR5cGUuY29udGVudE1hdGNoLnZhbGlkRW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZSgkZnJvbS5zdGFydChkZXB0aCksICR0by5lbmQoZGVwdGgpKTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiAobGFzdCB8fCAkZnJvbS5ub2RlKGRlcHRoIC0gMSkuY2FuUmVwbGFjZSgkZnJvbS5pbmRleChkZXB0aCAtIDEpLCAkdG8uaW5kZXhBZnRlcihkZXB0aCAtIDEpKSkpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkZXB0aCksICR0by5hZnRlcihkZXB0aCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMTsgZCA8PSAkZnJvbS5kZXB0aCAmJiBkIDw9ICR0by5kZXB0aDsgZCsrKSB7XG4gICAgICAgIGlmIChmcm9tIC0gJGZyb20uc3RhcnQoZCkgPT0gJGZyb20uZGVwdGggLSBkICYmIHRvID4gJGZyb20uZW5kKGQpICYmICR0by5lbmQoZCkgLSB0byAhPSAkdG8uZGVwdGggLSBkICYmXG4gICAgICAgICAgICAkZnJvbS5zdGFydChkIC0gMSkgPT0gJHRvLnN0YXJ0KGQgLSAxKSAmJiAkZnJvbS5ub2RlKGQgLSAxKS5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KGQgLSAxKSwgJHRvLmluZGV4KGQgLSAxKSkpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkKSwgdG8pO1xuICAgIH1cbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xufVxuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZGVwdGhzIGZvciB3aGljaCAkZnJvbSAtICR0byBzcGFucyB0aGVcbi8vIHdob2xlIGNvbnRlbnQgb2YgdGhlIG5vZGVzIGF0IHRoYXQgZGVwdGguXG5mdW5jdGlvbiBjb3ZlcmVkRGVwdGhzKCRmcm9tLCAkdG8pIHtcbiAgICBsZXQgcmVzdWx0ID0gW10sIG1pbkRlcHRoID0gTWF0aC5taW4oJGZyb20uZGVwdGgsICR0by5kZXB0aCk7XG4gICAgZm9yIChsZXQgZCA9IG1pbkRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5zdGFydChkKTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCkgfHxcbiAgICAgICAgICAgICR0by5lbmQoZCkgPiAkdG8ucG9zICsgKCR0by5kZXB0aCAtIGQpIHx8XG4gICAgICAgICAgICAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcgfHxcbiAgICAgICAgICAgICR0by5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHN0YXJ0ID09ICR0by5zdGFydChkKSB8fFxuICAgICAgICAgICAgKGQgPT0gJGZyb20uZGVwdGggJiYgZCA9PSAkdG8uZGVwdGggJiYgJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQgJiYgJHRvLnBhcmVudC5pbmxpbmVDb250ZW50ICYmXG4gICAgICAgICAgICAgICAgZCAmJiAkdG8uc3RhcnQoZCAtIDEpID09IHN0YXJ0IC0gMSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5VcGRhdGUgYW4gYXR0cmlidXRlIGluIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBBdHRyU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgICovXG4gICAgYXR0ciwgXG4gICAgLy8gVGhlIGF0dHJpYnV0ZSdzIG5ldyB2YWx1ZS5cbiAgICB2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgYXR0cmlidXRlIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBub2RlLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBub2RlLmF0dHJzW25hbWVdO1xuICAgICAgICBhdHRyc1t0aGlzLmF0dHJdID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXR0clN0ZXAodGhpcy5wb3MsIHRoaXMuYXR0ciwgZG9jLm5vZGVBdCh0aGlzLnBvcykuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBBdHRyU3RlcChwb3MucG9zLCB0aGlzLmF0dHIsIHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImF0dHJcIiwgcG9zOiB0aGlzLnBvcywgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEF0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJTdGVwKGpzb24ucG9zLCBqc29uLmF0dHIsIGpzb24udmFsdWUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYXR0clwiLCBBdHRyU3RlcCk7XG4vKipcblVwZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIGRvYyBub2RlLlxuKi9cbmNsYXNzIERvY0F0dHJTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZSB0byBzZXQuXG4gICAgKi9cbiAgICBhdHRyLCBcbiAgICAvLyBUaGUgYXR0cmlidXRlJ3MgbmV3IHZhbHVlLlxuICAgIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gZG9jLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBkb2MuYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW3RoaXMuYXR0cl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGRvYy50eXBlLmNyZWF0ZShhdHRycywgZG9jLmNvbnRlbnQsIGRvYy5tYXJrcyk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0Lm9rKHVwZGF0ZWQpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRG9jQXR0clN0ZXAodGhpcy5hdHRyLCBkb2MuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImRvY0F0dHJcIiwgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIERvY0F0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IERvY0F0dHJTdGVwKGpzb24uYXR0ciwganNvbi52YWx1ZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJkb2NBdHRyXCIsIERvY0F0dHJTdGVwKTtcblxuLyoqXG5AaW50ZXJuYWxcbiovXG5sZXQgVHJhbnNmb3JtRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbn07XG5UcmFuc2Zvcm1FcnJvciA9IGZ1bmN0aW9uIFRyYW5zZm9ybUVycm9yKG1lc3NhZ2UpIHtcbiAgICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgICBlcnIuX19wcm90b19fID0gVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlO1xuICAgIHJldHVybiBlcnI7XG59O1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhbnNmb3JtRXJyb3I7XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiVHJhbnNmb3JtRXJyb3JcIjtcbi8qKlxuQWJzdHJhY3Rpb24gdG8gYnVpbGQgdXAgYW5kIHRyYWNrIGFuIGFycmF5IG9mXG5bc3RlcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgdHJhbnNmb3JtYXRpb24uXG5cbk1vc3QgdHJhbnNmb3JtaW5nIG1ldGhvZHMgcmV0dXJuIHRoZSBgVHJhbnNmb3JtYCBvYmplY3QgaXRzZWxmLCBzb1xudGhhdCB0aGV5IGNhbiBiZSBjaGFpbmVkLlxuKi9cbmNsYXNzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJhbnNmb3JtIHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQgKHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zZm9ybSkuXG4gICAgKi9cbiAgICBkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RlcHMgaW4gdGhpcyB0cmFuc2Zvcm0uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBkb2N1bWVudHMgYmVmb3JlIGVhY2ggb2YgdGhlIHN0ZXBzLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEEgbWFwcGluZyB3aXRoIHRoZSBtYXBzIGZvciBlYWNoIG9mIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydGluZyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBiZWZvcmUoKSB7IHJldHVybiB0aGlzLmRvY3MubGVuZ3RoID8gdGhpcy5kb2NzWzBdIDogdGhpcy5kb2M7IH1cbiAgICAvKipcbiAgICBBcHBseSBhIG5ldyBzdGVwIGluIHRoaXMgdHJhbnNmb3JtLCBzYXZpbmcgdGhlIHJlc3VsdC4gVGhyb3dzIGFuXG4gICAgZXJyb3Igd2hlbiB0aGUgc3RlcCBmYWlscy5cbiAgICAqL1xuICAgIHN0ZXAoc3RlcCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tYXliZVN0ZXAoc3RlcCk7XG4gICAgICAgIGlmIChyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybUVycm9yKHJlc3VsdC5mYWlsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIGFwcGx5IGEgc3RlcCBpbiB0aGlzIHRyYW5zZm9ybWF0aW9uLCBpZ25vcmluZyBpdCBpZiBpdFxuICAgIGZhaWxzLiBSZXR1cm5zIHRoZSBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIG1heWJlU3RlcChzdGVwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhpcy5hZGRTdGVwKHN0ZXAsIHJlc3VsdC5kb2MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQgKHdoZW4gdGhlcmUgYXJlIGFueVxuICAgIHN0ZXBzKS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZFN0ZXAoc3RlcCwgZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHRoaXMuZG9jKTtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICB0aGlzLm1hcHBpbmcuYXBwZW5kTWFwKHN0ZXAuZ2V0TWFwKCkpO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbiAgICBnaXZlbiBgc2xpY2VgLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgbGV0IHN0ZXAgPSByZXBsYWNlU3RlcCh0aGlzLmRvYywgZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgaWYgKHN0ZXApXG4gICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYVxuICAgIGZyYWdtZW50LCBub2RlLCBvciBhcnJheSBvZiBub2Rlcy5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCAwLCAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBkZWxldGUoZnJvbSwgdG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShmcm9tLCB0bywgU2xpY2UuZW1wdHkpO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaW5zZXJ0KHBvcywgY29udGVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNsaWNlLCB1c2luZ1xuICAgIGBmcm9tYCwgYHRvYCwgYW5kIHRoZSBzbGljZSdzXG4gICAgW2BvcGVuU3RhcnRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2xpY2Uub3BlblN0YXJ0KSBwcm9wZXJ0eSBhcyBoaW50cywgcmF0aGVyXG4gICAgdGhhbiBmaXhlZCBzdGFydCBhbmQgZW5kIHBvaW50cy4gVGhpcyBtZXRob2QgbWF5IGdyb3cgdGhlXG4gICAgcmVwbGFjZWQgYXJlYSBvciBjbG9zZSBvcGVuIG5vZGVzIGluIHRoZSBzbGljZSBpbiBvcmRlciB0byBnZXQgYVxuICAgIGZpdCB0aGF0IGlzIG1vcmUgaW4gbGluZSB3aXRoIFdZU0lXWUcgZXhwZWN0YXRpb25zLCBieSBkcm9wcGluZ1xuICAgIGZ1bGx5IGNvdmVyZWQgcGFyZW50IG5vZGVzIG9mIHRoZSByZXBsYWNlZCByZWdpb24gd2hlbiB0aGV5IGFyZVxuICAgIG1hcmtlZCBbbm9uLWRlZmluaW5nIGFzXG4gICAgY29udGV4dF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmRlZmluaW5nQXNDb250ZXh0KSwgb3IgaW5jbHVkaW5nIGFuXG4gICAgb3BlbiBwYXJlbnQgbm9kZSBmcm9tIHRoZSBzbGljZSB0aGF0IF9pc18gbWFya2VkIGFzIFtkZWZpbmluZ1xuICAgIGl0cyBjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZGVmaW5pbmdGb3JDb250ZW50KS5cbiAgICBcbiAgICBUaGlzIGlzIHRoZSBtZXRob2QsIGZvciBleGFtcGxlLCB0byBoYW5kbGUgcGFzdGUuIFRoZSBzaW1pbGFyXG4gICAgW2ByZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0ucmVwbGFjZSkgbWV0aG9kIGlzIGEgbW9yZVxuICAgIHByaW1pdGl2ZSB0b29sIHdoaWNoIHdpbGwgX25vdF8gbW92ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBpdHMgZ2l2ZW5cbiAgICByYW5nZSwgYW5kIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIG1vcmUgcHJlY2lzZVxuICAgIGNvbnRyb2wgb3ZlciB3aGF0IGhhcHBlbnMuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUsIGJ1dCB1c2UgYGZyb21gIGFuZCBgdG9gIGFzXG4gICAgaGludHMsIHJhdGhlciB0aGFuIHByZWNpc2UgcG9zaXRpb25zLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgc2FtZVxuICAgIGFuZCBhcmUgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHBhcmVudCBub2RlIGluIHdoaWNoIHRoZSBnaXZlblxuICAgIG5vZGUgZG9lc24ndCBmaXQsIHRoaXMgbWV0aG9kIG1heSBfbW92ZV8gdGhlbSBvdXQgdG93YXJkcyBhIHBhcmVudFxuICAgIHRoYXQgZG9lcyBhbGxvdyB0aGUgZ2l2ZW4gbm9kZSB0byBiZSBwbGFjZWQuIFdoZW4gdGhlIGdpdmVuIHJhbmdlXG4gICAgY29tcGxldGVseSBjb3ZlcnMgYSBwYXJlbnQgbm9kZSwgdGhpcyBtZXRob2QgbWF5IGNvbXBsZXRlbHkgcmVwbGFjZVxuICAgIHRoYXQgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBub2RlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZVdpdGgodGhpcywgZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBnaXZlbiByYW5nZSwgZXhwYW5kaW5nIGl0IHRvIGNvdmVyIGZ1bGx5IGNvdmVyZWRcbiAgICBwYXJlbnQgbm9kZXMgdW50aWwgYSB2YWxpZCByZXBsYWNlIGlzIGZvdW5kLlxuICAgICovXG4gICAgZGVsZXRlUmFuZ2UoZnJvbSwgdG8pIHtcbiAgICAgICAgZGVsZXRlUmFuZ2UodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIG9mZiBmcm9tIGl0cyBwYXJlbnQsIGlmIHRoZXJlXG4gICAgaXMgc2libGluZyBjb250ZW50IGJlZm9yZSBvciBhZnRlciBpdCwgYW5kIG1vdmUgaXQgdXAgdGhlIHRyZWUgdG9cbiAgICB0aGUgZGVwdGggc3BlY2lmaWVkIGJ5IGB0YXJnZXRgLiBZb3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2VcbiAgICBbYGxpZnRUYXJnZXRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmxpZnRUYXJnZXQpIHRvIGNvbXB1dGUgYHRhcmdldGAsIHRvIG1ha2VcbiAgICBzdXJlIHRoZSBsaWZ0IGlzIHZhbGlkLlxuICAgICovXG4gICAgbGlmdChyYW5nZSwgdGFyZ2V0KSB7XG4gICAgICAgIGxpZnQodGhpcywgcmFuZ2UsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgZGVwdGggaXMgMiwgdGhlaXJcbiAgICBsYXN0IGFuZCBmaXJzdCBzaWJsaW5ncyBhcmUgYWxzbyBqb2luZWQsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIGpvaW4ocG9zLCBkZXB0aCA9IDEpIHtcbiAgICAgICAgam9pbih0aGlzLCBwb3MsIGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFdyYXAgdGhlIGdpdmVuIFtyYW5nZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZSkgaW4gdGhlIGdpdmVuIHNldCBvZiB3cmFwcGVycy5cbiAgICBUaGUgd3JhcHBlcnMgYXJlIGFzc3VtZWQgdG8gYmUgdmFsaWQgaW4gdGhpcyBwb3NpdGlvbiwgYW5kIHNob3VsZFxuICAgIHByb2JhYmx5IGJlIGNvbXB1dGVkIHdpdGggW2BmaW5kV3JhcHBpbmdgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmZpbmRXcmFwcGluZykuXG4gICAgKi9cbiAgICB3cmFwKHJhbmdlLCB3cmFwcGVycykge1xuICAgICAgICB3cmFwKHRoaXMsIHJhbmdlLCB3cmFwcGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzZXRCbG9ja1R5cGUoZnJvbSwgdG8gPSBmcm9tLCB0eXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHRoaXMsIGZyb20sIHRvLCB0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGFuZ2UgdGhlIHR5cGUsIGF0dHJpYnV0ZXMsIGFuZC9vciBtYXJrcyBvZiB0aGUgbm9kZSBhdCBgcG9zYC5cbiAgICBXaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4gICAgKi9cbiAgICBzZXROb2RlTWFya3VwKHBvcywgdHlwZSwgYXR0cnMgPSBudWxsLCBtYXJrcykge1xuICAgICAgICBzZXROb2RlTWFya3VwKHRoaXMsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCBhIHNpbmdsZSBhdHRyaWJ1dGUgb24gYSBnaXZlbiBub2RlIHRvIGEgbmV3IHZhbHVlLlxuICAgIFRoZSBgcG9zYCBhZGRyZXNzZXMgdGhlIGRvY3VtZW50IGNvbnRlbnQuIFVzZSBgc2V0RG9jQXR0cmlidXRlYFxuICAgIHRvIHNldCBhdHRyaWJ1dGVzIG9uIHRoZSBkb2N1bWVudCBpdHNlbGYuXG4gICAgKi9cbiAgICBzZXROb2RlQXR0cmlidXRlKHBvcywgYXR0ciwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBBdHRyU3RlcChwb3MsIGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgYSBzaW5nbGUgYXR0cmlidXRlIG9uIHRoZSBkb2N1bWVudCB0byBhIG5ldyB2YWx1ZS5cbiAgICAqL1xuICAgIHNldERvY0F0dHJpYnV0ZShhdHRyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IERvY0F0dHJTdGVwKGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBtYXJrIHRvIHRoZSBub2RlIGF0IHBvc2l0aW9uIGBwb3NgLlxuICAgICovXG4gICAgYWRkTm9kZU1hcmsocG9zLCBtYXJrKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgQWRkTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayAob3IgYWxsIG1hcmtzIG9mIHRoZSBnaXZlbiB0eXBlKSBmcm9tIHRoZSBub2RlIGF0XG4gICAgcG9zaXRpb24gYHBvc2AuXG4gICAgKi9cbiAgICByZW1vdmVOb2RlTWFyayhwb3MsIG1hcmspIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmRvYy5ub2RlQXQocG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBub2RlIGF0IHBvc2l0aW9uIFwiICsgcG9zKTtcbiAgICAgICAgaWYgKG1hcmsgaW5zdGFuY2VvZiBNYXJrKSB7XG4gICAgICAgICAgICBpZiAobWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RlcChuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNldCA9IG5vZGUubWFya3MsIGZvdW5kLCBzdGVwcyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGZvdW5kID0gbWFyay5pc0luU2V0KHNldCkpIHtcbiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAocG9zLCBmb3VuZCkpO1xuICAgICAgICAgICAgICAgIHNldCA9IGZvdW5kLnJlbW92ZUZyb21TZXQoc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTcGxpdCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIGFuZCBvcHRpb25hbGx5LCBpZiBgZGVwdGhgIGlzXG4gICAgZ3JlYXRlciB0aGFuIG9uZSwgYW55IG51bWJlciBvZiBub2RlcyBhYm92ZSB0aGF0LiBCeSBkZWZhdWx0LCB0aGVcbiAgICBwYXJ0cyBzcGxpdCBvZmYgd2lsbCBpbmhlcml0IHRoZSBub2RlIHR5cGUgb2YgdGhlIG9yaWdpbmFsIG5vZGUuXG4gICAgVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBwYXNzaW5nIGFuIGFycmF5IG9mIHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHRvXG4gICAgdXNlIGFmdGVyIHRoZSBzcGxpdCAod2l0aCB0aGUgb3V0ZXJtb3N0IG5vZGVzIGNvbWluZyBmaXJzdCkuXG4gICAgKi9cbiAgICBzcGxpdChwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgICAgICBzcGxpdCh0aGlzLCBwb3MsIGRlcHRoLCB0eXBlc0FmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBhZGRNYXJrKGZyb20sIHRvLCBtYXJrKSB7XG4gICAgICAgIGFkZE1hcmsodGhpcywgZnJvbSwgdG8sIG1hcmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIG1hcmtzIGZyb20gaW5saW5lIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYG1hcmtgIGlzIGEgc2luZ2xlIG1hcmssIHJlbW92ZSBwcmVjaXNlbHkgdGhhdCBtYXJrLiBXaGVuIGl0IGlzXG4gICAgYSBtYXJrIHR5cGUsIHJlbW92ZSBhbGwgbWFya3Mgb2YgdGhhdCB0eXBlLiBXaGVuIGl0IGlzIG51bGwsXG4gICAgcmVtb3ZlIGFsbCBtYXJrcyBvZiBhbnkgdHlwZS5cbiAgICAqL1xuICAgIHJlbW92ZU1hcmsoZnJvbSwgdG8sIG1hcmspIHtcbiAgICAgICAgcmVtb3ZlTWFyayh0aGlzLCBmcm9tLCB0bywgbWFyayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIGFsbCBtYXJrcyBhbmQgbm9kZXMgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSBhdFxuICAgIGBwb3NgIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGdpdmVuIG5ldyBwYXJlbnQgbm9kZSB0eXBlLiBBY2NlcHRzXG4gICAgYW4gb3B0aW9uYWwgc3RhcnRpbmcgW2NvbnRlbnQgbWF0Y2hdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Db250ZW50TWF0Y2gpIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBjbGVhckluY29tcGF0aWJsZShwb3MsIHBhcmVudFR5cGUsIG1hdGNoKSB7XG4gICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRoaXMsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEFkZE1hcmtTdGVwLCBBZGROb2RlTWFya1N0ZXAsIEF0dHJTdGVwLCBEb2NBdHRyU3RlcCwgTWFwUmVzdWx0LCBNYXBwaW5nLCBSZW1vdmVNYXJrU3RlcCwgUmVtb3ZlTm9kZU1hcmtTdGVwLCBSZXBsYWNlQXJvdW5kU3RlcCwgUmVwbGFjZVN0ZXAsIFN0ZXAsIFN0ZXBNYXAsIFN0ZXBSZXN1bHQsIFRyYW5zZm9ybSwgVHJhbnNmb3JtRXJyb3IsIGNhbkpvaW4sIGNhblNwbGl0LCBkcm9wUG9pbnQsIGZpbmRXcmFwcGluZywgaW5zZXJ0UG9pbnQsIGpvaW5Qb2ludCwgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAgfTtcbiIsImltcG9ydCB7IFNsaWNlLCBGcmFnbWVudCwgTWFyaywgTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFJlcGxhY2VTdGVwLCBSZXBsYWNlQXJvdW5kU3RlcCwgVHJhbnNmb3JtIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuY29uc3QgY2xhc3Nlc0J5SWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5TdXBlcmNsYXNzIGZvciBlZGl0b3Igc2VsZWN0aW9ucy4gRXZlcnkgc2VsZWN0aW9uIHR5cGUgc2hvdWxkXG5leHRlbmQgdGhpcy4gU2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuXG4qL1xuY2xhc3MgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBJbml0aWFsaXplIGEgc2VsZWN0aW9uIHdpdGggdGhlIGhlYWQgYW5kIGFuY2hvciBhbmQgcmFuZ2VzLiBJZiBub1xuICAgIHJhbmdlcyBhcmUgZ2l2ZW4sIGNvbnN0cnVjdHMgYSBzaW5nbGUgcmFuZ2UgYWNyb3NzIGAkYW5jaG9yYCBhbmRcbiAgICBgJGhlYWRgLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHJlc29sdmVkIGFuY2hvciBvZiB0aGUgc2VsZWN0aW9uICh0aGUgc2lkZSB0aGF0IHN0YXlzIGluXG4gICAgcGxhY2Ugd2hlbiB0aGUgc2VsZWN0aW9uIGlzIG1vZGlmaWVkKS5cbiAgICAqL1xuICAgICRhbmNob3IsIFxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBoZWFkIG9mIHRoZSBzZWxlY3Rpb24gKHRoZSBzaWRlIHRoYXQgbW92ZXMgd2hlblxuICAgIHRoZSBzZWxlY3Rpb24gaXMgbW9kaWZpZWQpLlxuICAgICovXG4gICAgJGhlYWQsIHJhbmdlcykge1xuICAgICAgICB0aGlzLiRhbmNob3IgPSAkYW5jaG9yO1xuICAgICAgICB0aGlzLiRoZWFkID0gJGhlYWQ7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzIHx8IFtuZXcgU2VsZWN0aW9uUmFuZ2UoJGFuY2hvci5taW4oJGhlYWQpLCAkYW5jaG9yLm1heCgkaGVhZCkpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbidzIGFuY2hvciwgYXMgYW4gdW5yZXNvbHZlZCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGdldCBhbmNob3IoKSB7IHJldHVybiB0aGlzLiRhbmNob3IucG9zOyB9XG4gICAgLyoqXG4gICAgVGhlIHNlbGVjdGlvbidzIGhlYWQuXG4gICAgKi9cbiAgICBnZXQgaGVhZCgpIHsgcmV0dXJuIHRoaXMuJGhlYWQucG9zOyB9XG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IGZyb20oKSB7IHJldHVybiB0aGlzLiRmcm9tLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCB0bygpIHsgcmV0dXJuIHRoaXMuJHRvLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBsb3dlciAgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgJGZyb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1swXS4kZnJvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHJlc29sdmVkIHVwcGVyIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0ICR0bygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VzWzBdLiR0bztcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBjb250YWlucyBhbnkgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBlbXB0eSgpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IHRoaXMucmFuZ2VzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChyYW5nZXNbaV0uJGZyb20ucG9zICE9IHJhbmdlc1tpXS4kdG8ucG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29udGVudCBvZiB0aGlzIHNlbGVjdGlvbiBhcyBhIHNsaWNlLlxuICAgICovXG4gICAgY29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGZyb20uZG9jLnNsaWNlKHRoaXMuZnJvbSwgdGhpcy50bywgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIGEgc2xpY2Ugb3IsIGlmIG5vIHNsaWNlIGlzIGdpdmVuLFxuICAgIGRlbGV0ZSB0aGUgc2VsZWN0aW9uLiBXaWxsIGFwcGVuZCB0byB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgLy8gUHV0IHRoZSBuZXcgc2VsZWN0aW9uIGF0IHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgaW5zZXJ0ZWRcbiAgICAgICAgLy8gY29udGVudC4gV2hlbiB0aGF0IGVuZGVkIGluIGFuIGlubGluZSBub2RlLCBzZWFyY2ggYmFja3dhcmRzLFxuICAgICAgICAvLyB0byBnZXQgdGhlIHBvc2l0aW9uIGFmdGVyIHRoYXQgbm9kZS4gSWYgbm90LCBzZWFyY2ggZm9yd2FyZC5cbiAgICAgICAgbGV0IGxhc3ROb2RlID0gY29udGVudC5jb250ZW50Lmxhc3RDaGlsZCwgbGFzdFBhcmVudCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5vcGVuRW5kOyBpKyspIHtcbiAgICAgICAgICAgIGxhc3RQYXJlbnQgPSBsYXN0Tm9kZTtcbiAgICAgICAgICAgIGxhc3ROb2RlID0gbGFzdE5vZGUubGFzdENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoLCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXSwgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICB0ci5yZXBsYWNlUmFuZ2UobWFwcGluZy5tYXAoJGZyb20ucG9zKSwgbWFwcGluZy5tYXAoJHRvLnBvcyksIGkgPyBTbGljZS5lbXB0eSA6IGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKGkgPT0gMClcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0luc2VydGlvbkVuZCh0ciwgbWFwRnJvbSwgKGxhc3ROb2RlID8gbGFzdE5vZGUuaXNJbmxpbmUgOiBsYXN0UGFyZW50ICYmIGxhc3RQYXJlbnQuaXNUZXh0YmxvY2spID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbm9kZSwgYXBwZW5kaW5nIHRoZSBjaGFuZ2VzXG4gICAgdG8gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgcmVwbGFjZVdpdGgodHIsIG5vZGUpIHtcbiAgICAgICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGgsIHJhbmdlcyA9IHRoaXMucmFuZ2VzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldLCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKTtcbiAgICAgICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXAoJGZyb20ucG9zKSwgdG8gPSBtYXBwaW5nLm1hcCgkdG8ucG9zKTtcbiAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgdHIuZGVsZXRlUmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChmcm9tLCB0bywgbm9kZSk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIG1hcEZyb20sIG5vZGUuaXNJbmxpbmUgPyAtMSA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYSB2YWxpZCBjdXJzb3Igb3IgbGVhZiBub2RlIHNlbGVjdGlvbiBzdGFydGluZyBhdCB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbiBhbmQgc2VhcmNoaW5nIGJhY2sgaWYgYGRpcmAgaXMgbmVnYXRpdmUsIGFuZCBmb3J3YXJkIGlmXG4gICAgcG9zaXRpdmUuIFdoZW4gYHRleHRPbmx5YCBpcyB0cnVlLCBvbmx5IGNvbnNpZGVyIGN1cnNvclxuICAgIHNlbGVjdGlvbnMuIFdpbGwgcmV0dXJuIG51bGwgd2hlbiBubyB2YWxpZCBzZWxlY3Rpb24gcG9zaXRpb24gaXNcbiAgICBmb3VuZC5cbiAgICAqL1xuICAgIHN0YXRpYyBmaW5kRnJvbSgkcG9zLCBkaXIsIHRleHRPbmx5ID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGlubmVyID0gJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCA/IG5ldyBUZXh0U2VsZWN0aW9uKCRwb3MpXG4gICAgICAgICAgICA6IGZpbmRTZWxlY3Rpb25JbigkcG9zLm5vZGUoMCksICRwb3MucGFyZW50LCAkcG9zLnBvcywgJHBvcy5pbmRleCgpLCBkaXIsIHRleHRPbmx5KTtcbiAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIGlubmVyO1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9ICRwb3MuZGVwdGggLSAxOyBkZXB0aCA+PSAwOyBkZXB0aC0tKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBkaXIgPCAwXG4gICAgICAgICAgICAgICAgPyBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLm5vZGUoZGVwdGgpLCAkcG9zLmJlZm9yZShkZXB0aCArIDEpLCAkcG9zLmluZGV4KGRlcHRoKSwgZGlyLCB0ZXh0T25seSlcbiAgICAgICAgICAgICAgICA6IGZpbmRTZWxlY3Rpb25JbigkcG9zLm5vZGUoMCksICRwb3Mubm9kZShkZXB0aCksICRwb3MuYWZ0ZXIoZGVwdGggKyAxKSwgJHBvcy5pbmRleChkZXB0aCkgKyAxLCBkaXIsIHRleHRPbmx5KTtcbiAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYSB2YWxpZCBjdXJzb3Igb3IgbGVhZiBub2RlIHNlbGVjdGlvbiBuZWFyIHRoZSBnaXZlblxuICAgIHBvc2l0aW9uLiBTZWFyY2hlcyBmb3J3YXJkIGZpcnN0IGJ5IGRlZmF1bHQsIGJ1dCBpZiBgYmlhc2AgaXNcbiAgICBuZWdhdGl2ZSwgaXQgd2lsbCBzZWFyY2ggYmFja3dhcmRzIGZpcnN0LlxuICAgICovXG4gICAgc3RhdGljIG5lYXIoJHBvcywgYmlhcyA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZyb20oJHBvcywgYmlhcykgfHwgdGhpcy5maW5kRnJvbSgkcG9zLCAtYmlhcykgfHwgbmV3IEFsbFNlbGVjdGlvbigkcG9zLm5vZGUoMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjdXJzb3Igb3IgbGVhZiBub2RlIHNlbGVjdGlvbiBjbG9zZXN0IHRvIHRoZSBzdGFydCBvZlxuICAgIHRoZSBnaXZlbiBkb2N1bWVudC4gV2lsbCByZXR1cm4gYW5cbiAgICBbYEFsbFNlbGVjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5BbGxTZWxlY3Rpb24pIGlmIG5vIHZhbGlkIHBvc2l0aW9uXG4gICAgZXhpc3RzLlxuICAgICovXG4gICAgc3RhdGljIGF0U3RhcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBkb2MsIDAsIDAsIDEpIHx8IG5ldyBBbGxTZWxlY3Rpb24oZG9jKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gY2xvc2VzdCB0byB0aGUgZW5kIG9mIHRoZVxuICAgIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgc3RhdGljIGF0RW5kKGRvYykge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGlvbkluKGRvYywgZG9jLCBkb2MuY29udGVudC5zaXplLCBkb2MuY2hpbGRDb3VudCwgLTEpIHx8IG5ldyBBbGxTZWxlY3Rpb24oZG9jKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBzZWxlY3Rpb24uIE11c3QgYmVcbiAgICBpbXBsZW1lbnRlZCBmb3IgY3VzdG9tIGNsYXNzZXMgKGFzIGEgc3RhdGljIGNsYXNzIG1ldGhvZCkuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhanNvbi50eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBTZWxlY3Rpb24uZnJvbUpTT05cIik7XG4gICAgICAgIGxldCBjbHMgPSBjbGFzc2VzQnlJZFtqc29uLnR5cGVdO1xuICAgICAgICBpZiAoIWNscylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBObyBzZWxlY3Rpb24gdHlwZSAke2pzb24udHlwZX0gZGVmaW5lZGApO1xuICAgICAgICByZXR1cm4gY2xzLmZyb21KU09OKGRvYywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gZGVzZXJpYWxpemUgc2VsZWN0aW9ucyBmcm9tIEpTT04sIGN1c3RvbSBzZWxlY3Rpb25cbiAgICBjbGFzc2VzIG11c3QgcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIGFuIElEIHN0cmluZywgc28gdGhhdCB0aGV5XG4gICAgY2FuIGJlIGRpc2FtYmlndWF0ZWQuIFRyeSB0byBwaWNrIHNvbWV0aGluZyB0aGF0J3MgdW5saWtlbHkgdG9cbiAgICBjbGFzaCB3aXRoIGNsYXNzZXMgZnJvbSBvdGhlciBtb2R1bGVzLlxuICAgICovXG4gICAgc3RhdGljIGpzb25JRChpZCwgc2VsZWN0aW9uQ2xhc3MpIHtcbiAgICAgICAgaWYgKGlkIGluIGNsYXNzZXNCeUlkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEdXBsaWNhdGUgdXNlIG9mIHNlbGVjdGlvbiBKU09OIElEIFwiICsgaWQpO1xuICAgICAgICBjbGFzc2VzQnlJZFtpZF0gPSBzZWxlY3Rpb25DbGFzcztcbiAgICAgICAgc2VsZWN0aW9uQ2xhc3MucHJvdG90eXBlLmpzb25JRCA9IGlkO1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uQ2xhc3M7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhIFtib29rbWFya10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbkJvb2ttYXJrKSBmb3IgdGhpcyBzZWxlY3Rpb24sXG4gICAgd2hpY2ggaXMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBtYXBwZWQgd2l0aG91dCBoYXZpbmcgYWNjZXNzIHRvIGFcbiAgICBjdXJyZW50IGRvY3VtZW50LCBhbmQgbGF0ZXIgcmVzb2x2ZWQgdG8gYSByZWFsIHNlbGVjdGlvbiBmb3IgYVxuICAgIGdpdmVuIGRvY3VtZW50IGFnYWluLiAoVGhpcyBpcyB1c2VkIG1vc3RseSBieSB0aGUgaGlzdG9yeSB0b1xuICAgIHRyYWNrIGFuZCByZXN0b3JlIG9sZCBzZWxlY3Rpb25zLikgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2ZcbiAgICB0aGlzIG1ldGhvZCBqdXN0IGNvbnZlcnRzIHRoZSBzZWxlY3Rpb24gdG8gYSB0ZXh0IHNlbGVjdGlvbiBhbmRcbiAgICByZXR1cm5zIHRoZSBib29rbWFyayBmb3IgdGhhdC5cbiAgICAqL1xuICAgIGdldEJvb2ttYXJrKCkge1xuICAgICAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5iZXR3ZWVuKHRoaXMuJGFuY2hvciwgdGhpcy4kaGVhZCkuZ2V0Qm9va21hcmsoKTtcbiAgICB9XG59XG5TZWxlY3Rpb24ucHJvdG90eXBlLnZpc2libGUgPSB0cnVlO1xuLyoqXG5SZXByZXNlbnRzIGEgc2VsZWN0ZWQgcmFuZ2UgaW4gYSBkb2N1bWVudC5cbiovXG5jbGFzcyBTZWxlY3Rpb25SYW5nZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmFuZ2UuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgJGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICAkdG8pIHtcbiAgICAgICAgdGhpcy4kZnJvbSA9ICRmcm9tO1xuICAgICAgICB0aGlzLiR0byA9ICR0bztcbiAgICB9XG59XG5sZXQgd2FybmVkQWJvdXRUZXh0U2VsZWN0aW9uID0gZmFsc2U7XG5mdW5jdGlvbiBjaGVja1RleHRTZWxlY3Rpb24oJHBvcykge1xuICAgIGlmICghd2FybmVkQWJvdXRUZXh0U2VsZWN0aW9uICYmICEkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIHdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGNvbnNvbGVbXCJ3YXJuXCJdKFwiVGV4dFNlbGVjdGlvbiBlbmRwb2ludCBub3QgcG9pbnRpbmcgaW50byBhIG5vZGUgd2l0aCBpbmxpbmUgY29udGVudCAoXCIgKyAkcG9zLnBhcmVudC50eXBlLm5hbWUgKyBcIilcIik7XG4gICAgfVxufVxuLyoqXG5BIHRleHQgc2VsZWN0aW9uIHJlcHJlc2VudHMgYSBjbGFzc2ljYWwgZWRpdG9yIHNlbGVjdGlvbiwgd2l0aCBhXG5oZWFkICh0aGUgbW92aW5nIHNpZGUpIGFuZCBhbmNob3IgKGltbW9iaWxlIHNpZGUpLCBib3RoIG9mIHdoaWNoXG5wb2ludCBpbnRvIHRleHRibG9jayBub2Rlcy4gSXQgY2FuIGJlIGVtcHR5IChhIHJlZ3VsYXIgY3Vyc29yXG5wb3NpdGlvbikuXG4qL1xuY2xhc3MgVGV4dFNlbGVjdGlvbiBleHRlbmRzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgdGV4dCBzZWxlY3Rpb24gYmV0d2VlbiB0aGUgZ2l2ZW4gcG9pbnRzLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoJGFuY2hvciwgJGhlYWQgPSAkYW5jaG9yKSB7XG4gICAgICAgIGNoZWNrVGV4dFNlbGVjdGlvbigkYW5jaG9yKTtcbiAgICAgICAgY2hlY2tUZXh0U2VsZWN0aW9uKCRoZWFkKTtcbiAgICAgICAgc3VwZXIoJGFuY2hvciwgJGhlYWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcmVzb2x2ZWQgcG9zaXRpb24gaWYgdGhpcyBpcyBhIGN1cnNvciBzZWxlY3Rpb24gKGFuXG4gICAgZW1wdHkgdGV4dCBzZWxlY3Rpb24pLCBhbmQgbnVsbCBvdGhlcndpc2UuXG4gICAgKi9cbiAgICBnZXQgJGN1cnNvcigpIHsgcmV0dXJuIHRoaXMuJGFuY2hvci5wb3MgPT0gdGhpcy4kaGVhZC5wb3MgPyB0aGlzLiRoZWFkIDogbnVsbDsgfVxuICAgIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgICAgbGV0ICRoZWFkID0gZG9jLnJlc29sdmUobWFwcGluZy5tYXAodGhpcy5oZWFkKSk7XG4gICAgICAgIGlmICghJGhlYWQucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWQpO1xuICAgICAgICBsZXQgJGFuY2hvciA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuYW5jaG9yKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbigkYW5jaG9yLnBhcmVudC5pbmxpbmVDb250ZW50ID8gJGFuY2hvciA6ICRoZWFkLCAkaGVhZCk7XG4gICAgfVxuICAgIHJlcGxhY2UodHIsIGNvbnRlbnQgPSBTbGljZS5lbXB0eSkge1xuICAgICAgICBzdXBlci5yZXBsYWNlKHRyLCBjb250ZW50KTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHRoaXMuJGZyb20ubWFya3NBY3Jvc3ModGhpcy4kdG8pO1xuICAgICAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgICAgIHRyLmVuc3VyZU1hcmtzKG1hcmtzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmIG90aGVyLmFuY2hvciA9PSB0aGlzLmFuY2hvciAmJiBvdGhlci5oZWFkID09IHRoaXMuaGVhZDtcbiAgICB9XG4gICAgZ2V0Qm9va21hcmsoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEJvb2ttYXJrKHRoaXMuYW5jaG9yLCB0aGlzLmhlYWQpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwidGV4dFwiLCBhbmNob3I6IHRoaXMuYW5jaG9yLCBoZWFkOiB0aGlzLmhlYWQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hbmNob3IgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5oZWFkICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFRleHRTZWxlY3Rpb24uZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbihkb2MucmVzb2x2ZShqc29uLmFuY2hvciksIGRvYy5yZXNvbHZlKGpzb24uaGVhZCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0ZXh0IHNlbGVjdGlvbiBmcm9tIG5vbi1yZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGRvYywgYW5jaG9yLCBoZWFkID0gYW5jaG9yKSB7XG4gICAgICAgIGxldCAkYW5jaG9yID0gZG9jLnJlc29sdmUoYW5jaG9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKCRhbmNob3IsIGhlYWQgPT0gYW5jaG9yID8gJGFuY2hvciA6IGRvYy5yZXNvbHZlKGhlYWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgdGV4dCBzZWxlY3Rpb24gdGhhdCBzcGFucyB0aGUgZ2l2ZW4gcG9zaXRpb25zIG9yLCBpZlxuICAgIHRoZXkgYXJlbid0IHRleHQgcG9zaXRpb25zLCBmaW5kIGEgdGV4dCBzZWxlY3Rpb24gbmVhciB0aGVtLlxuICAgIGBiaWFzYCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1ldGhvZCBzZWFyY2hlcyBmb3J3YXJkIChkZWZhdWx0KVxuICAgIG9yIGJhY2t3YXJkcyAobmVnYXRpdmUgbnVtYmVyKSBmaXJzdC4gV2lsbCBmYWxsIGJhY2sgdG8gY2FsbGluZ1xuICAgIFtgU2VsZWN0aW9uLm5lYXJgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uXm5lYXIpIHdoZW4gdGhlIGRvY3VtZW50XG4gICAgZG9lc24ndCBjb250YWluIGEgdmFsaWQgdGV4dCBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBiZXR3ZWVuKCRhbmNob3IsICRoZWFkLCBiaWFzKSB7XG4gICAgICAgIGxldCBkUG9zID0gJGFuY2hvci5wb3MgLSAkaGVhZC5wb3M7XG4gICAgICAgIGlmICghYmlhcyB8fCBkUG9zKVxuICAgICAgICAgICAgYmlhcyA9IGRQb3MgPj0gMCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKCEkaGVhZC5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gU2VsZWN0aW9uLmZpbmRGcm9tKCRoZWFkLCBiaWFzLCB0cnVlKSB8fCBTZWxlY3Rpb24uZmluZEZyb20oJGhlYWQsIC1iaWFzLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAkaGVhZCA9IGZvdW5kLiRoZWFkO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkaGVhZCwgYmlhcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkYW5jaG9yLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAoZFBvcyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJGFuY2hvciA9ICRoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgJGFuY2hvciA9IChTZWxlY3Rpb24uZmluZEZyb20oJGFuY2hvciwgLWJpYXMsIHRydWUpIHx8IFNlbGVjdGlvbi5maW5kRnJvbSgkYW5jaG9yLCBiaWFzLCB0cnVlKSkuJGFuY2hvcjtcbiAgICAgICAgICAgICAgICBpZiAoKCRhbmNob3IucG9zIDwgJGhlYWQucG9zKSAhPSAoZFBvcyA8IDApKVxuICAgICAgICAgICAgICAgICAgICAkYW5jaG9yID0gJGhlYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKCRhbmNob3IsICRoZWFkKTtcbiAgICB9XG59XG5TZWxlY3Rpb24uanNvbklEKFwidGV4dFwiLCBUZXh0U2VsZWN0aW9uKTtcbmNsYXNzIFRleHRCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yLCBoZWFkKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgICAgICB0aGlzLmhlYWQgPSBoZWFkO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICByZXR1cm4gbmV3IFRleHRCb29rbWFyayhtYXBwaW5nLm1hcCh0aGlzLmFuY2hvciksIG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgIH1cbiAgICByZXNvbHZlKGRvYykge1xuICAgICAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5iZXR3ZWVuKGRvYy5yZXNvbHZlKHRoaXMuYW5jaG9yKSwgZG9jLnJlc29sdmUodGhpcy5oZWFkKSk7XG4gICAgfVxufVxuLyoqXG5BIG5vZGUgc2VsZWN0aW9uIGlzIGEgc2VsZWN0aW9uIHRoYXQgcG9pbnRzIGF0IGEgc2luZ2xlIG5vZGUuIEFsbFxubm9kZXMgbWFya2VkIFtzZWxlY3RhYmxlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuc2VsZWN0YWJsZSkgY2FuIGJlIHRoZVxudGFyZ2V0IG9mIGEgbm9kZSBzZWxlY3Rpb24uIEluIHN1Y2ggYSBzZWxlY3Rpb24sIGBmcm9tYCBhbmQgYHRvYFxucG9pbnQgZGlyZWN0bHkgYmVmb3JlIGFuZCBhZnRlciB0aGUgc2VsZWN0ZWQgbm9kZSwgYGFuY2hvcmAgZXF1YWxzXG5gZnJvbWAsIGFuZCBgaGVhZGAgZXF1YWxzIGB0b2AuLlxuKi9cbmNsYXNzIE5vZGVTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5vZGUgc2VsZWN0aW9uLiBEb2VzIG5vdCB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIGl0c1xuICAgIGFyZ3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoJHBvcykge1xuICAgICAgICBsZXQgbm9kZSA9ICRwb3Mubm9kZUFmdGVyO1xuICAgICAgICBsZXQgJGVuZCA9ICRwb3Mubm9kZSgwKS5yZXNvbHZlKCRwb3MucG9zICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgICAgIHN1cGVyKCRwb3MsICRlbmQpO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbiAgICBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICAgIGxldCB7IGRlbGV0ZWQsIHBvcyB9ID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5hbmNob3IpO1xuICAgICAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgICAgIGlmIChkZWxldGVkKVxuICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyk7XG4gICAgfVxuICAgIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh0aGlzLm5vZGUpLCAwLCAwKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBvdGhlci5hbmNob3IgPT0gdGhpcy5hbmNob3I7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJub2RlXCIsIGFuY2hvcjogdGhpcy5hbmNob3IgfTtcbiAgICB9XG4gICAgZ2V0Qm9va21hcmsoKSB7IHJldHVybiBuZXcgTm9kZUJvb2ttYXJrKHRoaXMuYW5jaG9yKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIE5vZGVTZWxlY3Rpb24uZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihkb2MucmVzb2x2ZShqc29uLmFuY2hvcikpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbiBmcm9tIG5vbi1yZXNvbHZlZCBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGRvYywgZnJvbSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZG9jLnJlc29sdmUoZnJvbSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUgbWF5IGJlIHNlbGVjdGVkIGFzIGEgbm9kZVxuICAgIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBpc1NlbGVjdGFibGUobm9kZSkge1xuICAgICAgICByZXR1cm4gIW5vZGUuaXNUZXh0ICYmIG5vZGUudHlwZS5zcGVjLnNlbGVjdGFibGUgIT09IGZhbHNlO1xuICAgIH1cbn1cbk5vZGVTZWxlY3Rpb24ucHJvdG90eXBlLnZpc2libGUgPSBmYWxzZTtcblNlbGVjdGlvbi5qc29uSUQoXCJub2RlXCIsIE5vZGVTZWxlY3Rpb24pO1xuY2xhc3MgTm9kZUJvb2ttYXJrIHtcbiAgICBjb25zdHJ1Y3RvcihhbmNob3IpIHtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCB7IGRlbGV0ZWQsIHBvcyB9ID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5hbmNob3IpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG5ldyBUZXh0Qm9va21hcmsocG9zLCBwb3MpIDogbmV3IE5vZGVCb29rbWFyayhwb3MpO1xuICAgIH1cbiAgICByZXNvbHZlKGRvYykge1xuICAgICAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHRoaXMuYW5jaG9yKSwgbm9kZSA9ICRwb3Mubm9kZUFmdGVyO1xuICAgICAgICBpZiAobm9kZSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbigkcG9zKTtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRwb3MpO1xuICAgIH1cbn1cbi8qKlxuQSBzZWxlY3Rpb24gdHlwZSB0aGF0IHJlcHJlc2VudHMgc2VsZWN0aW5nIHRoZSB3aG9sZSBkb2N1bWVudFxuKHdoaWNoIGNhbiBub3QgbmVjZXNzYXJpbHkgYmUgZXhwcmVzc2VkIHdpdGggYSB0ZXh0IHNlbGVjdGlvbiwgd2hlblxudGhlcmUgYXJlIGZvciBleGFtcGxlIGxlYWYgYmxvY2sgbm9kZXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGVcbmRvY3VtZW50KS5cbiovXG5jbGFzcyBBbGxTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBhbGwtc2VsZWN0aW9uIG92ZXIgdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoZG9jKSB7XG4gICAgICAgIHN1cGVyKGRvYy5yZXNvbHZlKDApLCBkb2MucmVzb2x2ZShkb2MuY29udGVudC5zaXplKSk7XG4gICAgfVxuICAgIHJlcGxhY2UodHIsIGNvbnRlbnQgPSBTbGljZS5lbXB0eSkge1xuICAgICAgICBpZiAoY29udGVudCA9PSBTbGljZS5lbXB0eSkge1xuICAgICAgICAgICAgdHIuZGVsZXRlKDAsIHRyLmRvYy5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgbGV0IHNlbCA9IFNlbGVjdGlvbi5hdFN0YXJ0KHRyLmRvYyk7XG4gICAgICAgICAgICBpZiAoIXNlbC5lcSh0ci5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihzZWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIucmVwbGFjZSh0ciwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkgeyByZXR1cm4geyB0eXBlOiBcImFsbFwiIH07IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MpIHsgcmV0dXJuIG5ldyBBbGxTZWxlY3Rpb24oZG9jKTsgfVxuICAgIG1hcChkb2MpIHsgcmV0dXJuIG5ldyBBbGxTZWxlY3Rpb24oZG9jKTsgfVxuICAgIGVxKG90aGVyKSB7IHJldHVybiBvdGhlciBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbjsgfVxuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gQWxsQm9va21hcms7IH1cbn1cblNlbGVjdGlvbi5qc29uSUQoXCJhbGxcIiwgQWxsU2VsZWN0aW9uKTtcbmNvbnN0IEFsbEJvb2ttYXJrID0ge1xuICAgIG1hcCgpIHsgcmV0dXJuIHRoaXM7IH0sXG4gICAgcmVzb2x2ZShkb2MpIHsgcmV0dXJuIG5ldyBBbGxTZWxlY3Rpb24oZG9jKTsgfVxufTtcbi8vIEZJWE1FIHdlJ2xsIG5lZWQgc29tZSBhd2FyZW5lc3Mgb2YgdGV4dCBkaXJlY3Rpb24gd2hlbiBzY2FubmluZyBmb3Igc2VsZWN0aW9uc1xuLy8gVHJ5IHRvIGZpbmQgYSBzZWxlY3Rpb24gaW5zaWRlIHRoZSBnaXZlbiBub2RlLiBgcG9zYCBwb2ludHMgYXQgdGhlXG4vLyBwb3NpdGlvbiB3aGVyZSB0aGUgc2VhcmNoIHN0YXJ0cy4gV2hlbiBgdGV4dGAgaXMgdHJ1ZSwgb25seSByZXR1cm5cbi8vIHRleHQgc2VsZWN0aW9ucy5cbmZ1bmN0aW9uIGZpbmRTZWxlY3Rpb25Jbihkb2MsIG5vZGUsIHBvcywgaW5kZXgsIGRpciwgdGV4dCA9IGZhbHNlKSB7XG4gICAgaWYgKG5vZGUuaW5saW5lQ29udGVudClcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgcG9zKTtcbiAgICBmb3IgKGxldCBpID0gaW5kZXggLSAoZGlyID4gMCA/IDAgOiAxKTsgZGlyID4gMCA/IGkgPCBub2RlLmNoaWxkQ291bnQgOiBpID49IDA7IGkgKz0gZGlyKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IG5vZGUuY2hpbGQoaSk7XG4gICAgICAgIGlmICghY2hpbGQuaXNBdG9tKSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBmaW5kU2VsZWN0aW9uSW4oZG9jLCBjaGlsZCwgcG9zICsgZGlyLCBkaXIgPCAwID8gY2hpbGQuY2hpbGRDb3VudCA6IDAsIGRpciwgdGV4dCk7XG4gICAgICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0ZXh0ICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGNoaWxkKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5vZGVTZWxlY3Rpb24uY3JlYXRlKGRvYywgcG9zIC0gKGRpciA8IDAgPyBjaGlsZC5ub2RlU2l6ZSA6IDApKTtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gY2hpbGQubm9kZVNpemUgKiBkaXI7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIHN0YXJ0TGVuLCBiaWFzKSB7XG4gICAgbGV0IGxhc3QgPSB0ci5zdGVwcy5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0IDwgc3RhcnRMZW4pXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgc3RlcCA9IHRyLnN0ZXBzW2xhc3RdO1xuICAgIGlmICghKHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCB8fCBzdGVwIGluc3RhbmNlb2YgUmVwbGFjZUFyb3VuZFN0ZXApKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IG1hcCA9IHRyLm1hcHBpbmcubWFwc1tsYXN0XSwgZW5kO1xuICAgIG1hcC5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IHsgaWYgKGVuZCA9PSBudWxsKVxuICAgICAgICBlbmQgPSBuZXdUbzsgfSk7XG4gICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKGVuZCksIGJpYXMpKTtcbn1cblxuY29uc3QgVVBEQVRFRF9TRUwgPSAxLCBVUERBVEVEX01BUktTID0gMiwgVVBEQVRFRF9TQ1JPTEwgPSA0O1xuLyoqXG5BbiBlZGl0b3Igc3RhdGUgdHJhbnNhY3Rpb24sIHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvIGEgc3RhdGUgdG9cbmNyZWF0ZSBhbiB1cGRhdGVkIHN0YXRlLiBVc2VcbltgRWRpdG9yU3RhdGUudHJgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUudHIpIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cblxuVHJhbnNhY3Rpb25zIHRyYWNrIGNoYW5nZXMgdG8gdGhlIGRvY3VtZW50ICh0aGV5IGFyZSBhIHN1YmNsYXNzIG9mXG5bYFRyYW5zZm9ybWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uVHJhbnNmb3JtKSksIGJ1dCBhbHNvIG90aGVyIHN0YXRlIGNoYW5nZXMsXG5saWtlIHNlbGVjdGlvbiB1cGRhdGVzIGFuZCBhZGp1c3RtZW50cyBvZiB0aGUgc2V0IG9mIFtzdG9yZWRcbm1hcmtzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuc3RvcmVkTWFya3MpLiBJbiBhZGRpdGlvbiwgeW91IGNhbiBzdG9yZVxubWV0YWRhdGEgcHJvcGVydGllcyBpbiBhIHRyYW5zYWN0aW9uLCB3aGljaCBhcmUgZXh0cmEgcGllY2VzIG9mXG5pbmZvcm1hdGlvbiB0aGF0IGNsaWVudCBjb2RlIG9yIHBsdWdpbnMgY2FuIHVzZSB0byBkZXNjcmliZSB3aGF0IGFcbnRyYW5zYWN0aW9uIHJlcHJlc2VudHMsIHNvIHRoYXQgdGhleSBjYW4gdXBkYXRlIHRoZWlyIFtvd25cbnN0YXRlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuU3RhdGVGaWVsZCkgYWNjb3JkaW5nbHkuXG5cblRoZSBbZWRpdG9yIHZpZXddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcpIHVzZXMgYSBmZXcgbWV0YWRhdGFcbnByb3BlcnRpZXM6IGl0IHdpbGwgYXR0YWNoIGEgcHJvcGVydHkgYFwicG9pbnRlclwiYCB3aXRoIHRoZSB2YWx1ZVxuYHRydWVgIHRvIHNlbGVjdGlvbiB0cmFuc2FjdGlvbnMgZGlyZWN0bHkgY2F1c2VkIGJ5IG1vdXNlIG9yIHRvdWNoXG5pbnB1dCwgYSBgXCJjb21wb3NpdGlvblwiYCBwcm9wZXJ0eSBob2xkaW5nIGFuIElEIGlkZW50aWZ5aW5nIHRoZVxuY29tcG9zaXRpb24gdGhhdCBjYXVzZWQgaXQgdG8gdHJhbnNhY3Rpb25zIGNhdXNlZCBieSBjb21wb3NlZCBET01cbmlucHV0LCBhbmQgYSBgXCJ1aUV2ZW50XCJgIHByb3BlcnR5IG9mIHRoYXQgbWF5IGJlIGBcInBhc3RlXCJgLFxuYFwiY3V0XCJgLCBvciBgXCJkcm9wXCJgLlxuKi9cbmNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKHN0YXRlLmRvYyk7XG4gICAgICAgIC8vIFRoZSBzdGVwIGNvdW50IGZvciB3aGljaCB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgdmFsaWQuXG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gMDtcbiAgICAgICAgLy8gQml0ZmllbGQgdG8gdHJhY2sgd2hpY2ggYXNwZWN0cyBvZiB0aGUgc3RhdGUgd2VyZSB1cGRhdGVkIGJ5XG4gICAgICAgIC8vIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMudXBkYXRlZCA9IDA7XG4gICAgICAgIC8vIE9iamVjdCB1c2VkIHRvIHN0b3JlIG1ldGFkYXRhIHByb3BlcnRpZXMgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgICAgdGhpcy5tZXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy50aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIHRoaXMuc3RvcmVkTWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHRyYW5zYWN0aW9uJ3MgY3VycmVudCBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdHMgdG8gdGhlIGVkaXRvclxuICAgIHNlbGVjdGlvbiBbbWFwcGVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uLm1hcCkgdGhyb3VnaCB0aGUgc3RlcHMgaW4gdGhlXG4gICAgdHJhbnNhY3Rpb24sIGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gd2l0aFxuICAgIFtgc2V0U2VsZWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnNldFNlbGVjdGlvbikuXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJTZWxlY3Rpb25Gb3IgPCB0aGlzLnN0ZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSB0aGlzLmN1clNlbGVjdGlvbi5tYXAodGhpcy5kb2MsIHRoaXMubWFwcGluZy5zbGljZSh0aGlzLmN1clNlbGVjdGlvbkZvcikpO1xuICAgICAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb25Gb3IgPSB0aGlzLnN0ZXBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jdXJTZWxlY3Rpb247XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24ncyBjdXJyZW50IHNlbGVjdGlvbi4gV2lsbCBkZXRlcm1pbmUgdGhlXG4gICAgc2VsZWN0aW9uIHRoYXQgdGhlIGVkaXRvciBnZXRzIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFwcGxpZWQuXG4gICAgKi9cbiAgICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChzZWxlY3Rpb24uJGZyb20uZG9jICE9IHRoaXMuZG9jKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTZWxlY3Rpb24gcGFzc2VkIHRvIHNldFNlbGVjdGlvbiBtdXN0IHBvaW50IGF0IHRoZSBjdXJyZW50IGRvY3VtZW50XCIpO1xuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb25Gb3IgPSB0aGlzLnN0ZXBzLmxlbmd0aDtcbiAgICAgICAgdGhpcy51cGRhdGVkID0gKHRoaXMudXBkYXRlZCB8IFVQREFURURfU0VMKSAmIH5VUERBVEVEX01BUktTO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiB3YXMgZXhwbGljaXRseSB1cGRhdGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgc2VsZWN0aW9uU2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfU0VMKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgY3VycmVudCBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICBzZXRTdG9yZWRNYXJrcyhtYXJrcykge1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMudXBkYXRlZCB8PSBVUERBVEVEX01BUktTO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgTWFrZSBzdXJlIHRoZSBjdXJyZW50IHN0b3JlZCBtYXJrcyBvciwgaWYgdGhhdCBpcyBudWxsLCB0aGUgbWFya3NcbiAgICBhdCB0aGUgc2VsZWN0aW9uLCBtYXRjaCB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtzLiBEb2VzIG5vdGhpbmcgaWZcbiAgICB0aGlzIGlzIGFscmVhZHkgdGhlIGNhc2UuXG4gICAgKi9cbiAgICBlbnN1cmVNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAoIU1hcmsuc2FtZVNldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCksIG1hcmtzKSlcbiAgICAgICAgICAgIHRoaXMuc2V0U3RvcmVkTWFya3MobWFya3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGEgbWFyayB0byB0aGUgc2V0IG9mIHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIGFkZFN0b3JlZE1hcmsobWFyaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnN1cmVNYXJrcyhtYXJrLmFkZFRvU2V0KHRoaXMuc3RvcmVkTWFya3MgfHwgdGhpcy5zZWxlY3Rpb24uJGhlYWQubWFya3MoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgYSBtYXJrIG9yIG1hcmsgdHlwZSBmcm9tIHRoZSBzZXQgb2Ygc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgcmVtb3ZlU3RvcmVkTWFyayhtYXJrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZU1hcmtzKG1hcmsucmVtb3ZlRnJvbVNldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc3RvcmVkIG1hcmtzIHdlcmUgZXhwbGljaXRseSBzZXQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBnZXQgc3RvcmVkTWFya3NTZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9NQVJLUykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZFN0ZXAoc3RlcCwgZG9jKSB7XG4gICAgICAgIHN1cGVyLmFkZFN0ZXAoc3RlcCwgZG9jKTtcbiAgICAgICAgdGhpcy51cGRhdGVkID0gdGhpcy51cGRhdGVkICYgflVQREFURURfTUFSS1M7XG4gICAgICAgIHRoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgc2V0VGltZSh0aW1lKSB7XG4gICAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiBzbGljZS5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb24oc2xpY2UpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZSh0aGlzLCBzbGljZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbm9kZS4gV2hlbiBgaW5oZXJpdE1hcmtzYCBpc1xuICAgIHRydWUgYW5kIHRoZSBjb250ZW50IGlzIGlubGluZSwgaXQgaW5oZXJpdHMgdGhlIG1hcmtzIGZyb20gdGhlXG4gICAgcGxhY2Ugd2hlcmUgaXQgaXMgaW5zZXJ0ZWQuXG4gICAgKi9cbiAgICByZXBsYWNlU2VsZWN0aW9uV2l0aChub2RlLCBpbmhlcml0TWFya3MgPSB0cnVlKSB7XG4gICAgICAgIGxldCBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKGluaGVyaXRNYXJrcylcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm1hcmsodGhpcy5zdG9yZWRNYXJrcyB8fCAoc2VsZWN0aW9uLmVtcHR5ID8gc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkgOiAoc2VsZWN0aW9uLiRmcm9tLm1hcmtzQWNyb3NzKHNlbGVjdGlvbi4kdG8pIHx8IE1hcmsubm9uZSkpKTtcbiAgICAgICAgc2VsZWN0aW9uLnJlcGxhY2VXaXRoKHRoaXMsIG5vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBkZWxldGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSwgb3IgdGhlIHNlbGVjdGlvbiBpZiBubyByYW5nZSBpcyBnaXZlbixcbiAgICB3aXRoIGEgdGV4dCBub2RlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIHN0cmluZy5cbiAgICAqL1xuICAgIGluc2VydFRleHQodGV4dCwgZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuZG9jLnR5cGUuc2NoZW1hO1xuICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0aW9uV2l0aChzY2hlbWEudGV4dCh0ZXh0KSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodG8gPT0gbnVsbClcbiAgICAgICAgICAgICAgICB0byA9IGZyb207XG4gICAgICAgICAgICB0byA9IHRvID09IG51bGwgPyBmcm9tIDogdG87XG4gICAgICAgICAgICBpZiAoIXRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUmFuZ2UoZnJvbSwgdG8pO1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gdGhpcy5zdG9yZWRNYXJrcztcbiAgICAgICAgICAgIGlmICghbWFya3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgJGZyb20gPSB0aGlzLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgICAgICAgICAgICAgIG1hcmtzID0gdG8gPT0gZnJvbSA/ICRmcm9tLm1hcmtzKCkgOiAkZnJvbS5tYXJrc0Fjcm9zcyh0aGlzLmRvYy5yZXNvbHZlKHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIHNjaGVtYS50ZXh0KHRleHQsIG1hcmtzKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmVtcHR5KVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRoaXMuc2VsZWN0aW9uLiR0bykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgU3RvcmUgYSBtZXRhZGF0YSBwcm9wZXJ0eSBpbiB0aGlzIHRyYW5zYWN0aW9uLCBrZXllZCBlaXRoZXIgYnlcbiAgICBuYW1lIG9yIGJ5IHBsdWdpbi5cbiAgICAqL1xuICAgIHNldE1ldGEoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm1ldGFbdHlwZW9mIGtleSA9PSBcInN0cmluZ1wiID8ga2V5IDoga2V5LmtleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHJpZXZlIGEgbWV0YWRhdGEgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gbmFtZSBvciBwbHVnaW4uXG4gICAgKi9cbiAgICBnZXRNZXRhKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhW3R5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleS5rZXldO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2FjdGlvbiBkb2Vzbid0IGNvbnRhaW4gYW55IG1ldGFkYXRhLFxuICAgIGFuZCBjYW4gdGh1cyBzYWZlbHkgYmUgZXh0ZW5kZWQuXG4gICAgKi9cbiAgICBnZXQgaXNHZW5lcmljKCkge1xuICAgICAgICBmb3IgKGxldCBfIGluIHRoaXMubWV0YSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlIHRoYXQgdGhlIGVkaXRvciBzaG91bGQgc2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3XG4gICAgd2hlbiB1cGRhdGVkIHRvIHRoZSBzdGF0ZSBwcm9kdWNlZCBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgc2Nyb2xsSW50b1ZpZXcoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlZCB8PSBVUERBVEVEX1NDUk9MTDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIHRyYW5zYWN0aW9uIGhhcyBoYWQgYHNjcm9sbEludG9WaWV3YCBjYWxsZWQgb24gaXQuXG4gICAgKi9cbiAgICBnZXQgc2Nyb2xsZWRJbnRvVmlldygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX1NDUk9MTCkgPiAwO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYmluZChmLCBzZWxmKSB7XG4gICAgcmV0dXJuICFzZWxmIHx8ICFmID8gZiA6IGYuYmluZChzZWxmKTtcbn1cbmNsYXNzIEZpZWxkRGVzYyB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZGVzYywgc2VsZikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmluaXQgPSBiaW5kKGRlc2MuaW5pdCwgc2VsZik7XG4gICAgICAgIHRoaXMuYXBwbHkgPSBiaW5kKGRlc2MuYXBwbHksIHNlbGYpO1xuICAgIH1cbn1cbmNvbnN0IGJhc2VGaWVsZHMgPSBbXG4gICAgbmV3IEZpZWxkRGVzYyhcImRvY1wiLCB7XG4gICAgICAgIGluaXQoY29uZmlnKSB7IHJldHVybiBjb25maWcuZG9jIHx8IGNvbmZpZy5zY2hlbWEudG9wTm9kZVR5cGUuY3JlYXRlQW5kRmlsbCgpOyB9LFxuICAgICAgICBhcHBseSh0cikgeyByZXR1cm4gdHIuZG9jOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInNlbGVjdGlvblwiLCB7XG4gICAgICAgIGluaXQoY29uZmlnLCBpbnN0YW5jZSkgeyByZXR1cm4gY29uZmlnLnNlbGVjdGlvbiB8fCBTZWxlY3Rpb24uYXRTdGFydChpbnN0YW5jZS5kb2MpOyB9LFxuICAgICAgICBhcHBseSh0cikgeyByZXR1cm4gdHIuc2VsZWN0aW9uOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInN0b3JlZE1hcmtzXCIsIHtcbiAgICAgICAgaW5pdChjb25maWcpIHsgcmV0dXJuIGNvbmZpZy5zdG9yZWRNYXJrcyB8fCBudWxsOyB9LFxuICAgICAgICBhcHBseSh0ciwgX21hcmtzLCBfb2xkLCBzdGF0ZSkgeyByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLiRjdXJzb3IgPyB0ci5zdG9yZWRNYXJrcyA6IG51bGw7IH1cbiAgICB9KSxcbiAgICBuZXcgRmllbGREZXNjKFwic2Nyb2xsVG9TZWxlY3Rpb25cIiwge1xuICAgICAgICBpbml0KCkgeyByZXR1cm4gMDsgfSxcbiAgICAgICAgYXBwbHkodHIsIHByZXYpIHsgcmV0dXJuIHRyLnNjcm9sbGVkSW50b1ZpZXcgPyBwcmV2ICsgMSA6IHByZXY7IH1cbiAgICB9KVxuXTtcbi8vIE9iamVjdCB3cmFwcGluZyB0aGUgcGFydCBvZiBhIHN0YXRlIG9iamVjdCB0aGF0IHN0YXlzIHRoZSBzYW1lXG4vLyBhY3Jvc3MgdHJhbnNhY3Rpb25zLiBTdG9yZWQgaW4gdGhlIHN0YXRlJ3MgYGNvbmZpZ2AgcHJvcGVydHkuXG5jbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIHBsdWdpbnMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICAgICAgICB0aGlzLnBsdWdpbnNCeUtleSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMuZmllbGRzID0gYmFzZUZpZWxkcy5zbGljZSgpO1xuICAgICAgICBpZiAocGx1Z2lucylcbiAgICAgICAgICAgIHBsdWdpbnMuZm9yRWFjaChwbHVnaW4gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnNCeUtleVtwbHVnaW4ua2V5XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBZGRpbmcgZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhIGtleWVkIHBsdWdpbiAoXCIgKyBwbHVnaW4ua2V5ICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zQnlLZXlbcGx1Z2luLmtleV0gPSBwbHVnaW47XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLnN0YXRlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5wdXNoKG5ldyBGaWVsZERlc2MocGx1Z2luLmtleSwgcGx1Z2luLnNwZWMuc3RhdGUsIHBsdWdpbikpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG5UaGUgc3RhdGUgb2YgYSBQcm9zZU1pcnJvciBlZGl0b3IgaXMgcmVwcmVzZW50ZWQgYnkgYW4gb2JqZWN0IG9mXG50aGlzIHR5cGUuIEEgc3RhdGUgaXMgYSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJl4oCUaXQgaXNuJ3RcbnVwZGF0ZWQsIGJ1dCByYXRoZXIgYSBuZXcgc3RhdGUgdmFsdWUgaXMgY29tcHV0ZWQgZnJvbSBhbiBvbGQgb25lXG51c2luZyB0aGUgW2BhcHBseWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5hcHBseSkgbWV0aG9kLlxuXG5BIHN0YXRlIGhvbGRzIGEgbnVtYmVyIG9mIGJ1aWx0LWluIGZpZWxkcywgYW5kIHBsdWdpbnMgY2FuXG5bZGVmaW5lXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuUGx1Z2luU3BlYy5zdGF0ZSkgYWRkaXRpb25hbCBmaWVsZHMuXG4qL1xuY2xhc3MgRWRpdG9yU3RhdGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzY2hlbWEgb2YgdGhlIHN0YXRlJ3MgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgc2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuc2NoZW1hO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgcGx1Z2lucyB0aGF0IGFyZSBhY3RpdmUgaW4gdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcucGx1Z2lucztcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwbHkgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRvIHByb2R1Y2UgYSBuZXcgc3RhdGUuXG4gICAgKi9cbiAgICBhcHBseSh0cikge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseVRyYW5zYWN0aW9uKHRyKS5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmaWx0ZXJUcmFuc2FjdGlvbih0ciwgaWdub3JlID0gLTEpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5wbHVnaW5zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGkgIT0gaWdub3JlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuY29uZmlnLnBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLmZpbHRlclRyYW5zYWN0aW9uICYmICFwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbi5jYWxsKHBsdWdpbiwgdHIsIHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBWZXJib3NlIHZhcmlhbnQgb2YgW2BhcHBseWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5hcHBseSkgdGhhdFxuICAgIHJldHVybnMgdGhlIHByZWNpc2UgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBhcHBsaWVkICh3aGljaCBtaWdodFxuICAgIGJlIGluZmx1ZW5jZWQgYnkgdGhlIFt0cmFuc2FjdGlvblxuICAgIGhvb2tzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuUGx1Z2luU3BlYy5maWx0ZXJUcmFuc2FjdGlvbikgb2ZcbiAgICBwbHVnaW5zKSBhbG9uZyB3aXRoIHRoZSBuZXcgc3RhdGUuXG4gICAgKi9cbiAgICBhcHBseVRyYW5zYWN0aW9uKHJvb3RUcikge1xuICAgICAgICBpZiAoIXRoaXMuZmlsdGVyVHJhbnNhY3Rpb24ocm9vdFRyKSlcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiB0aGlzLCB0cmFuc2FjdGlvbnM6IFtdIH07XG4gICAgICAgIGxldCB0cnMgPSBbcm9vdFRyXSwgbmV3U3RhdGUgPSB0aGlzLmFwcGx5SW5uZXIocm9vdFRyKSwgc2VlbiA9IG51bGw7XG4gICAgICAgIC8vIFRoaXMgbG9vcCByZXBlYXRlZGx5IGdpdmVzIHBsdWdpbnMgYSBjaGFuY2UgdG8gcmVzcG9uZCB0b1xuICAgICAgICAvLyB0cmFuc2FjdGlvbnMgYXMgbmV3IHRyYW5zYWN0aW9ucyBhcmUgYWRkZWQsIG1ha2luZyBzdXJlIHRvIG9ubHlcbiAgICAgICAgLy8gcGFzcyB0aGUgdHJhbnNhY3Rpb25zIHRoZSBwbHVnaW4gZGlkIG5vdCBzZWUgYmVmb3JlLlxuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgaGF2ZU5ldyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbmZpZy5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuY29uZmlnLnBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuID0gc2VlbiA/IHNlZW5baV0ubiA6IDAsIG9sZFN0YXRlID0gc2VlbiA/IHNlZW5baV0uc3RhdGUgOiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHIgPSBuIDwgdHJzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnNwZWMuYXBwZW5kVHJhbnNhY3Rpb24uY2FsbChwbHVnaW4sIG4gPyB0cnMuc2xpY2UobikgOiB0cnMsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ciAmJiBuZXdTdGF0ZS5maWx0ZXJUcmFuc2FjdGlvbih0ciwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLnNldE1ldGEoXCJhcHBlbmRlZFRyYW5zYWN0aW9uXCIsIHJvb3RUcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvbmZpZy5wbHVnaW5zLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuLnB1c2goaiA8IGkgPyB7IHN0YXRlOiBuZXdTdGF0ZSwgbjogdHJzLmxlbmd0aCB9IDogeyBzdGF0ZTogdGhpcywgbjogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRycy5wdXNoKHRyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbmV3U3RhdGUuYXBwbHlJbm5lcih0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXZlTmV3ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VlbilcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5baV0gPSB7IHN0YXRlOiBuZXdTdGF0ZSwgbjogdHJzLmxlbmd0aCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaGF2ZU5ldylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogbmV3U3RhdGUsIHRyYW5zYWN0aW9uczogdHJzIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhcHBseUlubmVyKHRyKSB7XG4gICAgICAgIGlmICghdHIuYmVmb3JlLmVxKHRoaXMuZG9jKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQXBwbHlpbmcgYSBtaXNtYXRjaGVkIHRyYW5zYWN0aW9uXCIpO1xuICAgICAgICBsZXQgbmV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUodGhpcy5jb25maWcpLCBmaWVsZHMgPSB0aGlzLmNvbmZpZy5maWVsZHM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICBuZXdJbnN0YW5jZVtmaWVsZC5uYW1lXSA9IGZpZWxkLmFwcGx5KHRyLCB0aGlzW2ZpZWxkLm5hbWVdLCB0aGlzLCBuZXdJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBTdGFydCBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSBmcm9tIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgdHIoKSB7IHJldHVybiBuZXcgVHJhbnNhY3Rpb24odGhpcyk7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgc3RhdGUuXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGNvbmZpZykge1xuICAgICAgICBsZXQgJGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKGNvbmZpZy5kb2MgPyBjb25maWcuZG9jLnR5cGUuc2NoZW1hIDogY29uZmlnLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgJGNvbmZpZy5maWVsZHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpbnN0YW5jZVskY29uZmlnLmZpZWxkc1tpXS5uYW1lXSA9ICRjb25maWcuZmllbGRzW2ldLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlIGJhc2VkIG9uIHRoaXMgb25lLCBidXQgd2l0aCBhbiBhZGp1c3RlZCBzZXRcbiAgICBvZiBhY3RpdmUgcGx1Z2lucy4gU3RhdGUgZmllbGRzIHRoYXQgZXhpc3QgaW4gYm90aCBzZXRzIG9mXG4gICAgcGx1Z2lucyBhcmUga2VwdCB1bmNoYW5nZWQuIFRob3NlIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGFyZVxuICAgIGRyb3BwZWQsIGFuZCB0aG9zZSB0aGF0IGFyZSBuZXcgYXJlIGluaXRpYWxpemVkIHVzaW5nIHRoZWlyXG4gICAgW2Bpbml0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQuaW5pdCkgbWV0aG9kLCBwYXNzaW5nIGluIHRoZSBuZXdcbiAgICBjb25maWd1cmF0aW9uIG9iamVjdC4uXG4gICAgKi9cbiAgICByZWNvbmZpZ3VyZShjb25maWcpIHtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbih0aGlzLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgZmllbGRzID0gJGNvbmZpZy5maWVsZHMsIGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBmaWVsZHNbaV0ubmFtZTtcbiAgICAgICAgICAgIGluc3RhbmNlW25hbWVdID0gdGhpcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHRoaXNbbmFtZV0gOiBmaWVsZHNbaV0uaW5pdChjb25maWcsIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIHN0YXRlIHRvIEpTT04uIElmIHlvdSB3YW50IHRvIHNlcmlhbGl6ZSB0aGUgc3RhdGVcbiAgICBvZiBwbHVnaW5zLCBwYXNzIGFuIG9iamVjdCBtYXBwaW5nIHByb3BlcnR5IG5hbWVzIHRvIHVzZSBpbiB0aGVcbiAgICByZXN1bHRpbmcgSlNPTiBvYmplY3QgdG8gcGx1Z2luIG9iamVjdHMuIFRoZSBhcmd1bWVudCBtYXkgYWxzbyBiZVxuICAgIGEgc3RyaW5nIG9yIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLCB0byBzdXBwb3J0IHRoZVxuICAgIHdheSBgSlNPTi5zdHJpbmdpZnlgIGNhbGxzIGB0b1N0cmluZ2AgbWV0aG9kcy5cbiAgICAqL1xuICAgIHRvSlNPTihwbHVnaW5GaWVsZHMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZG9jOiB0aGlzLmRvYy50b0pTT04oKSwgc2VsZWN0aW9uOiB0aGlzLnNlbGVjdGlvbi50b0pTT04oKSB9O1xuICAgICAgICBpZiAodGhpcy5zdG9yZWRNYXJrcylcbiAgICAgICAgICAgIHJlc3VsdC5zdG9yZWRNYXJrcyA9IHRoaXMuc3RvcmVkTWFya3MubWFwKG0gPT4gbS50b0pTT04oKSk7XG4gICAgICAgIGlmIChwbHVnaW5GaWVsZHMgJiYgdHlwZW9mIHBsdWdpbkZpZWxkcyA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcGx1Z2luRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT0gXCJkb2NcIiB8fCBwcm9wID09IFwic2VsZWN0aW9uXCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIEpTT04gZmllbGRzIGBkb2NgIGFuZCBgc2VsZWN0aW9uYCBhcmUgcmVzZXJ2ZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbkZpZWxkc1twcm9wXSwgc3RhdGUgPSBwbHVnaW4uc3BlYy5zdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUudG9KU09OKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBzdGF0ZS50b0pTT04uY2FsbChwbHVnaW4sIHRoaXNbcGx1Z2luLmtleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBzdGF0ZS4gYGNvbmZpZ2Agc2hvdWxkXG4gICAgaGF2ZSBhdCBsZWFzdCBhIGBzY2hlbWFgIGZpZWxkLCBhbmQgc2hvdWxkIGNvbnRhaW4gYXJyYXkgb2ZcbiAgICBwbHVnaW5zIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGguIGBwbHVnaW5GaWVsZHNgIGNhbiBiZSB1c2VkXG4gICAgdG8gZGVzZXJpYWxpemUgdGhlIHN0YXRlIG9mIHBsdWdpbnMsIGJ5IGFzc29jaWF0aW5nIHBsdWdpblxuICAgIGluc3RhbmNlcyB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lcyB0aGV5IHVzZSBpbiB0aGUgSlNPTiBvYmplY3QuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oY29uZmlnLCBqc29uLCBwbHVnaW5GaWVsZHMpIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBFZGl0b3JTdGF0ZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgaWYgKCFjb25maWcuc2NoZW1hKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSZXF1aXJlZCBjb25maWcgZmllbGQgJ3NjaGVtYScgbWlzc2luZ1wiKTtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuc2NoZW1hLCBjb25maWcucGx1Z2lucyk7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgJGNvbmZpZy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQubmFtZSA9PSBcImRvY1wiKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZG9jID0gTm9kZS5mcm9tSlNPTihjb25maWcuc2NoZW1hLCBqc29uLmRvYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5uYW1lID09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5zZWxlY3Rpb24gPSBTZWxlY3Rpb24uZnJvbUpTT04oaW5zdGFuY2UuZG9jLCBqc29uLnNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5uYW1lID09IFwic3RvcmVkTWFya3NcIikge1xuICAgICAgICAgICAgICAgIGlmIChqc29uLnN0b3JlZE1hcmtzKVxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5zdG9yZWRNYXJrcyA9IGpzb24uc3RvcmVkTWFya3MubWFwKGNvbmZpZy5zY2hlbWEubWFya0Zyb21KU09OKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW5GaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcGx1Z2luRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gcGx1Z2luRmllbGRzW3Byb3BdLCBzdGF0ZSA9IHBsdWdpbi5zcGVjLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5rZXkgPT0gZmllbGQubmFtZSAmJiBzdGF0ZSAmJiBzdGF0ZS5mcm9tSlNPTiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW2ZpZWxkLm5hbWVdID0gc3RhdGUuZnJvbUpTT04uY2FsbChwbHVnaW4sIGNvbmZpZywganNvbltwcm9wXSwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc3RhbmNlW2ZpZWxkLm5hbWVdID0gZmllbGQuaW5pdChjb25maWcsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRQcm9wcyhvYmosIHNlbGYsIHRhcmdldCkge1xuICAgIGZvciAobGV0IHByb3AgaW4gb2JqKSB7XG4gICAgICAgIGxldCB2YWwgPSBvYmpbcHJvcF07XG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgICAgICAgIHZhbCA9IHZhbC5iaW5kKHNlbGYpO1xuICAgICAgICBlbHNlIGlmIChwcm9wID09IFwiaGFuZGxlRE9NRXZlbnRzXCIpXG4gICAgICAgICAgICB2YWwgPSBiaW5kUHJvcHModmFsLCBzZWxmLCB7fSk7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKlxuUGx1Z2lucyBidW5kbGUgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhbiBlZGl0b3IuXG5UaGV5IGFyZSBwYXJ0IG9mIHRoZSBbZWRpdG9yIHN0YXRlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUpIGFuZFxubWF5IGluZmx1ZW5jZSB0aGF0IHN0YXRlIGFuZCB0aGUgdmlldyB0aGF0IGNvbnRhaW5zIGl0LlxuKi9cbmNsYXNzIFBsdWdpbiB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBsdWdpbidzIFtzcGVjIG9iamVjdF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMpLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIFtwcm9wc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMpIGV4cG9ydGVkIGJ5IHRoaXMgcGx1Z2luLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnByb3BzID0ge307XG4gICAgICAgIGlmIChzcGVjLnByb3BzKVxuICAgICAgICAgICAgYmluZFByb3BzKHNwZWMucHJvcHMsIHRoaXMsIHRoaXMucHJvcHMpO1xuICAgICAgICB0aGlzLmtleSA9IHNwZWMua2V5ID8gc3BlYy5rZXkua2V5IDogY3JlYXRlS2V5KFwicGx1Z2luXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRyYWN0IHRoZSBwbHVnaW4ncyBzdGF0ZSBmaWVsZCBmcm9tIGFuIGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldFN0YXRlKHN0YXRlKSB7IHJldHVybiBzdGF0ZVt0aGlzLmtleV07IH1cbn1cbmNvbnN0IGtleXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZnVuY3Rpb24gY3JlYXRlS2V5KG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiBrZXlzKVxuICAgICAgICByZXR1cm4gbmFtZSArIFwiJFwiICsgKytrZXlzW25hbWVdO1xuICAgIGtleXNbbmFtZV0gPSAwO1xuICAgIHJldHVybiBuYW1lICsgXCIkXCI7XG59XG4vKipcbkEga2V5IGlzIHVzZWQgdG8gW3RhZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMua2V5KSBwbHVnaW5zIGluIGEgd2F5XG50aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGZpbmQgdGhlbSwgZ2l2ZW4gYW4gZWRpdG9yIHN0YXRlLlxuQXNzaWduaW5nIGEga2V5IGRvZXMgbWVhbiBvbmx5IG9uZSBwbHVnaW4gb2YgdGhhdCB0eXBlIGNhbiBiZVxuYWN0aXZlIGluIGEgc3RhdGUuXG4qL1xuY2xhc3MgUGx1Z2luS2V5IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4ga2V5LlxuICAgICovXG4gICAgY29uc3RydWN0b3IobmFtZSA9IFwia2V5XCIpIHsgdGhpcy5rZXkgPSBjcmVhdGVLZXkobmFtZSk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGFjdGl2ZSBwbHVnaW4gd2l0aCB0aGlzIGtleSwgaWYgYW55LCBmcm9tIGFuIGVkaXRvclxuICAgIHN0YXRlLlxuICAgICovXG4gICAgZ2V0KHN0YXRlKSB7IHJldHVybiBzdGF0ZS5jb25maWcucGx1Z2luc0J5S2V5W3RoaXMua2V5XTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcGx1Z2luJ3Mgc3RhdGUgZnJvbSBhbiBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXRTdGF0ZShzdGF0ZSkgeyByZXR1cm4gc3RhdGVbdGhpcy5rZXldOyB9XG59XG5cbmV4cG9ydCB7IEFsbFNlbGVjdGlvbiwgRWRpdG9yU3RhdGUsIE5vZGVTZWxlY3Rpb24sIFBsdWdpbiwgUGx1Z2luS2V5LCBTZWxlY3Rpb24sIFNlbGVjdGlvblJhbmdlLCBUZXh0U2VsZWN0aW9uLCBUcmFuc2FjdGlvbiB9O1xuIiwiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiwgTm9kZVNlbGVjdGlvbiwgQWxsU2VsZWN0aW9uLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBET01TZXJpYWxpemVyLCBGcmFnbWVudCwgTWFyaywgU2xpY2UsIERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IGRyb3BQb2ludCB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGRvbUluZGV4ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7OyBpbmRleCsrKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn07XG5jb25zdCBwYXJlbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBsZXQgcGFyZW50ID0gbm9kZS5hc3NpZ25lZFNsb3QgfHwgbm9kZS5wYXJlbnROb2RlO1xuICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09IDExID8gcGFyZW50Lmhvc3QgOiBwYXJlbnQ7XG59O1xubGV0IHJldXNlZFJhbmdlID0gbnVsbDtcbi8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByYW5nZSwgYmVjYXVzZSBET00gcmFuZ2Vcbi8vIG9iamVjdHMgYXJlIGV2ZXJ5IGV4cGVuc2l2ZSwgYW5kIGtlZXAgc2xvd2luZyBkb3duIHN1YnNlcXVlbnQgRE9NXG4vLyB1cGRhdGVzLCBmb3Igc29tZSByZWFzb24uXG5jb25zdCB0ZXh0UmFuZ2UgPSBmdW5jdGlvbiAobm9kZSwgZnJvbSwgdG8pIHtcbiAgICBsZXQgcmFuZ2UgPSByZXVzZWRSYW5nZSB8fCAocmV1c2VkUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8gPT0gbnVsbCA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tIHx8IDApO1xuICAgIHJldHVybiByYW5nZTtcbn07XG5jb25zdCBjbGVhclJldXNlZFJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldXNlZFJhbmdlID0gbnVsbDtcbn07XG4vLyBTY2FucyBmb3J3YXJkIGFuZCBiYWNrd2FyZCB0aHJvdWdoIERPTSBwb3NpdGlvbnMgZXF1aXZhbGVudCB0byB0aGVcbi8vIGdpdmVuIG9uZSB0byBzZWUgaWYgdGhlIHR3byBhcmUgaW4gdGhlIHNhbWUgcGxhY2UgKGkuZS4gYWZ0ZXIgYVxuLy8gdGV4dCBub2RlIHZzIGF0IHRoZSBlbmQgb2YgdGhhdCB0ZXh0IG5vZGUpXG5jb25zdCBpc0VxdWl2YWxlbnRQb3NpdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZikge1xuICAgIHJldHVybiB0YXJnZXROb2RlICYmIChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpO1xufTtcbmNvbnN0IGF0b21FbGVtZW50cyA9IC9eKGltZ3xicnxpbnB1dHx0ZXh0YXJlYXxocikkL2k7XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxIHx8IGhhc0Jsb2NrRGVzYyhub2RlKSB8fCBhdG9tRWxlbWVudHMudGVzdChub2RlLm5vZGVOYW1lKSB8fFxuICAgICAgICAgICAgICAgIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkb21JbmRleChub2RlKSArIChkaXIgPCAwID8gMCA6IDEpO1xuICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2ZmICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG5vZGVTaXplKG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG5vZGVTaXplKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHRleHROb2RlQmVmb3JlJDEobm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZVNpemUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dE5vZGVBZnRlciQxKG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNPbkVkZ2Uobm9kZSwgb2Zmc2V0LCBwYXJlbnQpIHtcbiAgICBmb3IgKGxldCBhdFN0YXJ0ID0gb2Zmc2V0ID09IDAsIGF0RW5kID0gb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpOyBhdFN0YXJ0IHx8IGF0RW5kOykge1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGluZGV4ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXRTdGFydCA9IGF0U3RhcnQgJiYgaW5kZXggPT0gMDtcbiAgICAgICAgYXRFbmQgPSBhdEVuZCAmJiBpbmRleCA9PSBub2RlU2l6ZShub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNCbG9ja0Rlc2MoZG9tKSB7XG4gICAgbGV0IGRlc2M7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKVxuICAgICAgICBpZiAoZGVzYyA9IGN1ci5wbVZpZXdEZXNjKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrICYmIChkZXNjLmRvbSA9PSBkb20gfHwgZGVzYy5jb250ZW50RE9NID09IGRvbSk7XG59XG4vLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3NTIzXG4vLyAoaXNDb2xsYXBzZWQgaW5hcHByb3ByaWF0ZWx5IHJldHVybnMgdHJ1ZSBpbiBzaGFkb3cgZG9tKVxuY29uc3Qgc2VsZWN0aW9uQ29sbGFwc2VkID0gZnVuY3Rpb24gKGRvbVNlbCkge1xuICAgIHJldHVybiBkb21TZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xufTtcbmZ1bmN0aW9uIGtleUV2ZW50KGtleUNvZGUsIGtleSkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwia2V5ZG93blwiLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5rZXlDb2RlID0ga2V5Q29kZTtcbiAgICBldmVudC5rZXkgPSBldmVudC5jb2RlID0ga2V5O1xuICAgIHJldHVybiBldmVudDtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBjYXJldEZyb21Qb2ludChkb2MsIHgsIHkpIHtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgdHJ5IHsgLy8gRmlyZWZveCB0aHJvd3MgZm9yIHRoaXMgY2FsbCBpbiBoYXJkLXRvLXByZWRpY3QgY2lyY3Vtc3RhbmNlcyAoIzk5NClcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIC8vIENsaXAgdGhlIG9mZnNldCwgYmVjYXVzZSBDaHJvbWUgd2lsbCByZXR1cm4gYSB0ZXh0IG9mZnNldFxuICAgICAgICAgICAgLy8gaW50byA8aW5wdXQ+IG5vZGVzLCB3aGljaCBjYW4ndCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBET01cbiAgICAgICAgICAgIC8vIG9mZnNldFxuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBwb3Mub2Zmc2V0Tm9kZSwgb2Zmc2V0OiBNYXRoLm1pbihub2RlU2l6ZShwb3Mub2Zmc2V0Tm9kZSksIHBvcy5vZmZzZXQpIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgIH1cbiAgICBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBvZmZzZXQ6IE1hdGgubWluKG5vZGVTaXplKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSwgcmFuZ2Uuc3RhcnRPZmZzZXQpIH07XG4gICAgfVxufVxuXG5jb25zdCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiBudWxsO1xuY29uc3QgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudCA6IG51bGw7XG5jb25zdCBhZ2VudCA9IChuYXYgJiYgbmF2LnVzZXJBZ2VudCkgfHwgXCJcIjtcbmNvbnN0IGllX2VkZ2UgPSAvRWRnZVxcLyhcXGQrKS8uZXhlYyhhZ2VudCk7XG5jb25zdCBpZV91cHRvMTAgPSAvTVNJRSBcXGQvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhhZ2VudCk7XG5jb25zdCBpZSA9ICEhKGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGllX2VkZ2UpO1xuY29uc3QgaWVfdmVyc2lvbiA9IGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDA7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvZ2Vja29cXC8oXFxkKykvaS50ZXN0KGFnZW50KTtcbmdlY2tvICYmICsoL0ZpcmVmb3hcXC8oXFxkKykvLmV4ZWMoYWdlbnQpIHx8IFswLCAwXSlbMV07XG5jb25zdCBfY2hyb21lID0gIWllICYmIC9DaHJvbWVcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgY2hyb21lID0gISFfY2hyb21lO1xuY29uc3QgY2hyb21lX3ZlcnNpb24gPSBfY2hyb21lID8gK19jaHJvbWVbMV0gOiAwO1xuY29uc3Qgc2FmYXJpID0gIWllICYmICEhbmF2ICYmIC9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbi8vIElzIHRydWUgZm9yIGJvdGggaU9TIGFuZCBpUGFkT1MgZm9yIGNvbnZlbmllbmNlXG5jb25zdCBpb3MgPSBzYWZhcmkgJiYgKC9Nb2JpbGVcXC9cXHcrLy50ZXN0KGFnZW50KSB8fCAhIW5hdiAmJiBuYXYubWF4VG91Y2hQb2ludHMgPiAyKTtcbmNvbnN0IG1hYyA9IGlvcyB8fCAobmF2ID8gL01hYy8udGVzdChuYXYucGxhdGZvcm0pIDogZmFsc2UpO1xuY29uc3Qgd2luZG93cyA9IG5hdiA/IC9XaW4vLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlO1xuY29uc3QgYW5kcm9pZCA9IC9BbmRyb2lkIFxcZC8udGVzdChhZ2VudCk7XG5jb25zdCB3ZWJraXQgPSAhIWRvYyAmJiBcIndlYmtpdEZvbnRTbW9vdGhpbmdcIiBpbiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuY29uc3Qgd2Via2l0X3ZlcnNpb24gPSB3ZWJraXQgPyArKC9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMDtcblxuZnVuY3Rpb24gd2luZG93UmVjdChkb2MpIHtcbiAgICBsZXQgdnAgPSBkb2MuZGVmYXVsdFZpZXcgJiYgZG9jLmRlZmF1bHRWaWV3LnZpc3VhbFZpZXdwb3J0O1xuICAgIGlmICh2cClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IDAsIHJpZ2h0OiB2cC53aWR0aCxcbiAgICAgICAgICAgIHRvcDogMCwgYm90dG9tOiB2cC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgICAgdG9wOiAwLCBib3R0b206IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IH07XG59XG5mdW5jdGlvbiBnZXRTaWRlKHZhbHVlLCBzaWRlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiID8gdmFsdWUgOiB2YWx1ZVtzaWRlXTtcbn1cbmZ1bmN0aW9uIGNsaWVudFJlY3Qobm9kZSkge1xuICAgIGxldCByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBBZGp1c3QgZm9yIGVsZW1lbnRzIHdpdGggc3R5bGUgXCJ0cmFuc2Zvcm06IHNjYWxlKClcIlxuICAgIGxldCBzY2FsZVggPSAocmVjdC53aWR0aCAvIG5vZGUub2Zmc2V0V2lkdGgpIHx8IDE7XG4gICAgbGV0IHNjYWxlWSA9IChyZWN0LmhlaWdodCAvIG5vZGUub2Zmc2V0SGVpZ2h0KSB8fCAxO1xuICAgIC8vIE1ha2Ugc3VyZSBzY3JvbGxiYXIgd2lkdGggaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlY3RhbmdsZVxuICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QubGVmdCArIG5vZGUuY2xpZW50V2lkdGggKiBzY2FsZVgsXG4gICAgICAgIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBub2RlLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsUmVjdEludG9WaWV3KHZpZXcsIHJlY3QsIHN0YXJ0RE9NKSB7XG4gICAgbGV0IHNjcm9sbFRocmVzaG9sZCA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxUaHJlc2hvbGRcIikgfHwgMCwgc2Nyb2xsTWFyZ2luID0gdmlldy5zb21lUHJvcChcInNjcm9sbE1hcmdpblwiKSB8fCA1O1xuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IHBhcmVudCA9IHN0YXJ0RE9NIHx8IHZpZXcuZG9tOzspIHtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHBhcmVudC5ub2RlVHlwZSAhPSAxKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZWx0ID0gcGFyZW50O1xuICAgICAgICBsZXQgYXRUb3AgPSBlbHQgPT0gZG9jLmJvZHk7XG4gICAgICAgIGxldCBib3VuZGluZyA9IGF0VG9wID8gd2luZG93UmVjdChkb2MpIDogY2xpZW50UmVjdChlbHQpO1xuICAgICAgICBsZXQgbW92ZVggPSAwLCBtb3ZlWSA9IDA7XG4gICAgICAgIGlmIChyZWN0LnRvcCA8IGJvdW5kaW5nLnRvcCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcInRvcFwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gLShib3VuZGluZy50b3AgLSByZWN0LnRvcCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcInRvcFwiKSk7XG4gICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tIC0gZ2V0U2lkZShzY3JvbGxUaHJlc2hvbGQsIFwiYm90dG9tXCIpKVxuICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gYm91bmRpbmcuYm90dG9tIC0gYm91bmRpbmcudG9wXG4gICAgICAgICAgICAgICAgPyByZWN0LnRvcCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcInRvcFwiKSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgIDogcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJib3R0b21cIik7XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgZ2V0U2lkZShzY3JvbGxUaHJlc2hvbGQsIFwibGVmdFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gLShib3VuZGluZy5sZWZ0IC0gcmVjdC5sZWZ0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwibGVmdFwiKSk7XG4gICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcInJpZ2h0XCIpKVxuICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJyaWdodFwiKTtcbiAgICAgICAgaWYgKG1vdmVYIHx8IG1vdmVZKSB7XG4gICAgICAgICAgICBpZiAoYXRUb3ApIHtcbiAgICAgICAgICAgICAgICBkb2MuZGVmYXVsdFZpZXcuc2Nyb2xsQnkobW92ZVgsIG1vdmVZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydFggPSBlbHQuc2Nyb2xsTGVmdCwgc3RhcnRZID0gZWx0LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICBpZiAobW92ZVkpXG4gICAgICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgKz0gbW92ZVk7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCArPSBtb3ZlWDtcbiAgICAgICAgICAgICAgICBsZXQgZFggPSBlbHQuc2Nyb2xsTGVmdCAtIHN0YXJ0WCwgZFkgPSBlbHQuc2Nyb2xsVG9wIC0gc3RhcnRZO1xuICAgICAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IHJlY3QubGVmdCAtIGRYLCB0b3A6IHJlY3QudG9wIC0gZFksIHJpZ2h0OiByZWN0LnJpZ2h0IC0gZFgsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb3MgPSBhdFRvcCA/IFwiZml4ZWRcIiA6IGdldENvbXB1dGVkU3R5bGUocGFyZW50KS5wb3NpdGlvbjtcbiAgICAgICAgaWYgKC9eKGZpeGVkfHN0aWNreSkkLy50ZXN0KHBvcykpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcGFyZW50ID0gcG9zID09IFwiYWJzb2x1dGVcIiA/IHBhcmVudC5vZmZzZXRQYXJlbnQgOiBwYXJlbnROb2RlKHBhcmVudCk7XG4gICAgfVxufVxuLy8gU3RvcmUgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzLCBhbG9uZyB3aXRoXG4vLyB0aGUgdG9wIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgbmVhciB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIHdoaWNoXG4vLyB3aWxsIGJlIHVzZWQgdG8gbWFrZSBzdXJlIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHJlbWFpbnMgc3RhYmxlIGV2ZW5cbi8vIHdoZW4gdGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgYWJvdmUgY2hhbmdlcy5cbmZ1bmN0aW9uIHN0b3JlU2Nyb2xsUG9zKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBzdGFydFkgPSBNYXRoLm1heCgwLCByZWN0LnRvcCk7XG4gICAgbGV0IHJlZkRPTSwgcmVmVG9wO1xuICAgIGZvciAobGV0IHggPSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLCB5ID0gc3RhcnRZICsgMTsgeSA8IE1hdGgubWluKGlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7IHkgKz0gNSkge1xuICAgICAgICBsZXQgZG9tID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmICghZG9tIHx8IGRvbSA9PSB2aWV3LmRvbSB8fCAhdmlldy5kb20uY29udGFpbnMoZG9tKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbG9jYWxSZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAobG9jYWxSZWN0LnRvcCA+PSBzdGFydFkgLSAyMCkge1xuICAgICAgICAgICAgcmVmRE9NID0gZG9tO1xuICAgICAgICAgICAgcmVmVG9wID0gbG9jYWxSZWN0LnRvcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlZkRPTTogcmVmRE9NLCByZWZUb3A6IHJlZlRvcCwgc3RhY2s6IHNjcm9sbFN0YWNrKHZpZXcuZG9tKSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsU3RhY2soZG9tKSB7XG4gICAgbGV0IHN0YWNrID0gW10sIGRvYyA9IGRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOyBjdXIgPSBwYXJlbnROb2RlKGN1cikpIHtcbiAgICAgICAgc3RhY2sucHVzaCh7IGRvbTogY3VyLCB0b3A6IGN1ci5zY3JvbGxUb3AsIGxlZnQ6IGN1ci5zY3JvbGxMZWZ0IH0pO1xuICAgICAgICBpZiAoZG9tID09IGRvYylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gc3RhY2s7XG59XG4vLyBSZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBlZGl0b3IncyBwYXJlbnQgbm9kZXMgdG8gdGhhdCB3aGF0XG4vLyBpdCB3YXMgYmVmb3JlLCB3aGVuIHN0b3JlU2Nyb2xsUG9zIHdhcyBjYWxsZWQuXG5mdW5jdGlvbiByZXNldFNjcm9sbFBvcyh7IHJlZkRPTSwgcmVmVG9wLCBzdGFjayB9KSB7XG4gICAgbGV0IG5ld1JlZlRvcCA9IHJlZkRPTSA/IHJlZkRPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgOiAwO1xuICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdGFjaywgbmV3UmVmVG9wID09IDAgPyAwIDogbmV3UmVmVG9wIC0gcmVmVG9wKTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JvbGxTdGFjayhzdGFjaywgZFRvcCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZG9tLCB0b3AsIGxlZnQgfSA9IHN0YWNrW2ldO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbFRvcCAhPSB0b3AgKyBkVG9wKVxuICAgICAgICAgICAgZG9tLnNjcm9sbFRvcCA9IHRvcCArIGRUb3A7XG4gICAgICAgIGlmIChkb20uc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgZG9tLnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RvcmVkID0gc2Nyb2xsU3RhY2soZG9tKTtcbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdG9yZVNjcm9sbFN0YWNrKHN0b3JlZCwgMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZE9mZnNldEluTm9kZShub2RlLCBjb29yZHMpIHtcbiAgICBsZXQgY2xvc2VzdCwgZHhDbG9zZXN0ID0gMmU4LCBjb29yZHNDbG9zZXN0LCBvZmZzZXQgPSAwO1xuICAgIGxldCByb3dCb3QgPSBjb29yZHMudG9wLCByb3dUb3AgPSBjb29yZHMudG9wO1xuICAgIGxldCBmaXJzdEJlbG93LCBjb29yZHNCZWxvdztcbiAgICBmb3IgKGxldCBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCwgY2hpbGRJbmRleCA9IDA7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nLCBjaGlsZEluZGV4KyspIHtcbiAgICAgICAgbGV0IHJlY3RzO1xuICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgIHJlY3RzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChyZWN0LnRvcCA8PSByb3dCb3QgJiYgcmVjdC5ib3R0b20gPj0gcm93VG9wKSB7XG4gICAgICAgICAgICAgICAgcm93Qm90ID0gTWF0aC5tYXgocmVjdC5ib3R0b20sIHJvd0JvdCk7XG4gICAgICAgICAgICAgICAgcm93VG9wID0gTWF0aC5taW4ocmVjdC50b3AsIHJvd1RvcCk7XG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gcmVjdC5sZWZ0ID4gY29vcmRzLmxlZnQgPyByZWN0LmxlZnQgLSBjb29yZHMubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCA/IGNvb3Jkcy5sZWZ0IC0gcmVjdC5yaWdodCA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGR4IDwgZHhDbG9zZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZHhDbG9zZXN0ID0gZHg7XG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc0Nsb3Nlc3QgPSBkeCAmJiBjbG9zZXN0Lm5vZGVUeXBlID09IDMgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBjb29yZHMudG9wXG4gICAgICAgICAgICAgICAgICAgIH0gOiBjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxICYmIGR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2hpbGRJbmRleCArIChjb29yZHMubGVmdCA+PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWN0LnRvcCA+IGNvb3Jkcy50b3AgJiYgIWZpcnN0QmVsb3cgJiYgcmVjdC5sZWZ0IDw9IGNvb3Jkcy5sZWZ0ICYmIHJlY3QucmlnaHQgPj0gY29vcmRzLmxlZnQpIHtcbiAgICAgICAgICAgICAgICBmaXJzdEJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY29vcmRzQmVsb3cgPSB7IGxlZnQ6IE1hdGgubWF4KHJlY3QubGVmdCwgTWF0aC5taW4ocmVjdC5yaWdodCwgY29vcmRzLmxlZnQpKSwgdG9wOiByZWN0LnRvcCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjbG9zZXN0ICYmIChjb29yZHMubGVmdCA+PSByZWN0LnJpZ2h0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC50b3AgfHxcbiAgICAgICAgICAgICAgICBjb29yZHMubGVmdCA+PSByZWN0LmxlZnQgJiYgY29vcmRzLnRvcCA+PSByZWN0LmJvdHRvbSkpXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2hpbGRJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0ICYmIGZpcnN0QmVsb3cpIHtcbiAgICAgICAgY2xvc2VzdCA9IGZpcnN0QmVsb3c7XG4gICAgICAgIGNvb3Jkc0Nsb3Nlc3QgPSBjb29yZHNCZWxvdztcbiAgICAgICAgZHhDbG9zZXN0ID0gMDtcbiAgICB9XG4gICAgaWYgKGNsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZmluZE9mZnNldEluVGV4dChjbG9zZXN0LCBjb29yZHNDbG9zZXN0KTtcbiAgICBpZiAoIWNsb3Nlc3QgfHwgKGR4Q2xvc2VzdCAmJiBjbG9zZXN0Lm5vZGVUeXBlID09IDEpKVxuICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQgfTtcbiAgICByZXR1cm4gZmluZE9mZnNldEluTm9kZShjbG9zZXN0LCBjb29yZHNDbG9zZXN0KTtcbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJblRleHQobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIGkgKyAxKTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XG4gICAgICAgIGxldCByZWN0ID0gc2luZ2xlUmVjdChyYW5nZSwgMSk7XG4gICAgICAgIGlmIChyZWN0LnRvcCA9PSByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGkgKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IDAgfTtcbn1cbmZ1bmN0aW9uIGluUmVjdChjb29yZHMsIHJlY3QpIHtcbiAgICByZXR1cm4gY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0IC0gMSAmJiBjb29yZHMubGVmdCA8PSByZWN0LnJpZ2h0ICsgMSAmJlxuICAgICAgICBjb29yZHMudG9wID49IHJlY3QudG9wIC0gMSAmJiBjb29yZHMudG9wIDw9IHJlY3QuYm90dG9tICsgMTtcbn1cbmZ1bmN0aW9uIHRhcmdldEtsdWRnZShkb20sIGNvb3Jkcykge1xuICAgIGxldCBwYXJlbnQgPSBkb20ucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50ICYmIC9ebGkkL2kudGVzdChwYXJlbnQubm9kZU5hbWUpICYmIGNvb3Jkcy5sZWZ0IDwgZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpXG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgcmV0dXJuIGRvbTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21FbGVtZW50KHZpZXcsIGVsdCwgY29vcmRzKSB7XG4gICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSBmaW5kT2Zmc2V0SW5Ob2RlKGVsdCwgY29vcmRzKSwgYmlhcyA9IC0xO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgIW5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGJpYXMgPSByZWN0LmxlZnQgIT0gcmVjdC5yaWdodCAmJiBjb29yZHMubGVmdCA+IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShub2RlLCBvZmZzZXQsIGJpYXMpO1xufVxuZnVuY3Rpb24gcG9zRnJvbUNhcmV0KHZpZXcsIG5vZGUsIG9mZnNldCwgY29vcmRzKSB7XG4gICAgLy8gQnJvd3NlciAoaW4gY2FyZXRQb3NpdGlvbi9SYW5nZUZyb21Qb2ludCkgd2lsbCBhZ3Jlc3NpdmVseVxuICAgIC8vIG5vcm1hbGl6ZSB0b3dhcmRzIG5lYXJieSBpbmxpbmUgbm9kZXMuIFNpbmNlIHdlIGFyZSBpbnRlcmVzdGVkIGluXG4gICAgLy8gcG9zaXRpb25zIGJldHdlZW4gYmxvY2sgbm9kZXMgdG9vLCB3ZSBmaXJzdCB3YWxrIHVwIHRoZSBoaWVyYXJjaHlcbiAgICAvLyBvZiBub2RlcyB0byBzZWUgaWYgdGhlcmUgYXJlIGJsb2NrIG5vZGVzIHRoYXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgLy8gZmFsbCBvdXRzaWRlIG9mLiBJZiBzbywgd2UgdGFrZSB0aGUgcG9zaXRpb24gYmVmb3JlL2FmdGVyIHRoYXRcbiAgICAvLyBibG9jay4gSWYgbm90LCB3ZSBjYWxsIGBwb3NGcm9tRE9NYCBvbiB0aGUgcmF3IG5vZGUvb2Zmc2V0LlxuICAgIGxldCBvdXRzaWRlQmxvY2sgPSAtMTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlLCBzYXdCbG9jayA9IGZhbHNlOzspIHtcbiAgICAgICAgaWYgKGN1ciA9PSB2aWV3LmRvbSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhjdXIsIHRydWUpLCByZWN0O1xuICAgICAgICBpZiAoIWRlc2MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGRlc2MuZG9tLm5vZGVUeXBlID09IDEgJiYgKGRlc2Mubm9kZS5pc0Jsb2NrICYmIGRlc2MucGFyZW50IHx8ICFkZXNjLmNvbnRlbnRET00pICYmXG4gICAgICAgICAgICAvLyBJZ25vcmUgZWxlbWVudHMgd2l0aCB6ZXJvLXNpemUgYm91bmRpbmcgcmVjdGFuZ2xlc1xuICAgICAgICAgICAgKChyZWN0ID0gZGVzYy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLndpZHRoIHx8IHJlY3QuaGVpZ2h0KSkge1xuICAgICAgICAgICAgaWYgKGRlc2Mubm9kZS5pc0Jsb2NrICYmIGRlc2MucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhcHBseSB0aGUgaG9yaXpvbnRhbCB0ZXN0IHRvIHRoZSBpbm5lcm1vc3QgYmxvY2suIFZlcnRpY2FsIGZvciBhbnkgcGFyZW50LlxuICAgICAgICAgICAgICAgIGlmICghc2F3QmxvY2sgJiYgcmVjdC5sZWZ0ID4gY29vcmRzLmxlZnQgfHwgcmVjdC50b3AgPiBjb29yZHMudG9wKVxuICAgICAgICAgICAgICAgICAgICBvdXRzaWRlQmxvY2sgPSBkZXNjLnBvc0JlZm9yZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghc2F3QmxvY2sgJiYgcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0IHx8IHJlY3QuYm90dG9tIDwgY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZUJsb2NrID0gZGVzYy5wb3NBZnRlcjtcbiAgICAgICAgICAgICAgICBzYXdCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MuY29udGVudERPTSAmJiBvdXRzaWRlQmxvY2sgPCAwICYmICFkZXNjLm5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhIGxlYWYsIHJldHVybiB0aGUgc2lkZSBvZiB0aGUgbGVhZiBjbG9zZXIgdG8gdGhlIGNvb3Jkc1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBkZXNjLm5vZGUuaXNCbG9jayA/IGNvb3Jkcy50b3AgPCAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIDogY29vcmRzLmxlZnQgPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUgPyBkZXNjLnBvc0JlZm9yZSA6IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gZGVzYy5kb20ucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHNpZGVCbG9jayA+IC0xID8gb3V0c2lkZUJsb2NrIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCAtMSk7XG59XG5mdW5jdGlvbiBlbGVtZW50RnJvbVBvaW50KGVsZW1lbnQsIGNvb3JkcywgYm94KSB7XG4gICAgbGV0IGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgaWYgKGxlbiAmJiBib3gudG9wIDwgYm94LmJvdHRvbSkge1xuICAgICAgICBmb3IgKGxldCBzdGFydEkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZW4gLSAxLCBNYXRoLmZsb29yKGxlbiAqIChjb29yZHMudG9wIC0gYm94LnRvcCkgLyAoYm94LmJvdHRvbSAtIGJveC50b3ApKSAtIDIpKSwgaSA9IHN0YXJ0STs7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudEZyb21Qb2ludChjaGlsZCwgY29vcmRzLCByZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgPSAoaSArIDEpICUgbGVuKSA9PSBzdGFydEkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vLyBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudCwgbm9kZSwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgY2FyZXQgPSBjYXJldEZyb21Qb2ludChkb2MsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBpZiAoY2FyZXQpXG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gY2FyZXQpO1xuICAgIGxldCBlbHQgPSAodmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2MpXG4gICAgICAgIC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBsZXQgcG9zO1xuICAgIGlmICghZWx0IHx8ICF2aWV3LmRvbS5jb250YWlucyhlbHQubm9kZVR5cGUgIT0gMSA/IGVsdC5wYXJlbnROb2RlIDogZWx0KSkge1xuICAgICAgICBsZXQgYm94ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghaW5SZWN0KGNvb3JkcywgYm94KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBlbHQgPSBlbGVtZW50RnJvbVBvaW50KHZpZXcuZG9tLCBjb29yZHMsIGJveCk7XG4gICAgICAgIGlmICghZWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgcmV0dXJucyBub25zZW5zZSB3aGVuIG9uIGEgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICAgIGZvciAobGV0IHAgPSBlbHQ7IG5vZGUgJiYgcDsgcCA9IHBhcmVudE5vZGUocCkpXG4gICAgICAgICAgICBpZiAocC5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWx0ID0gdGFyZ2V0S2x1ZGdlKGVsdCwgY29vcmRzKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHdpbGwgc29tZXRpbWVzIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2hcbiAgICAgICAgICAgIC8vIGhhdmUgbm8gYWN0dWFsIGNoaWxkcmVuLCBmcm9tIGNhcmV0UG9zaXRpb25Gcm9tUG9pbnQgKCM5NTMpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICAgICAgLy8gSXQnbGwgYWxzbyBtb3ZlIHRoZSByZXR1cm5lZCBwb3NpdGlvbiBiZWZvcmUgaW1hZ2Ugbm9kZXMsXG4gICAgICAgICAgICAvLyBldmVuIGlmIHRob3NlIGFyZSBiZWhpbmQgaXQuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIGJveDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5ub2RlTmFtZSA9PSBcIklNR1wiICYmIChib3ggPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS5yaWdodCA8PSBjb29yZHMubGVmdCAmJlxuICAgICAgICAgICAgICAgICAgICBib3guYm90dG9tID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXY7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgYWJvdmUgdGhlIHJpZ2h0IHNpZGUgb2YgYW4gdW5lZGl0YWJsZSBub2RlLCBDaHJvbWUgd2lsbCByZXBvcnQgYSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdGhhdCBub2RlLlxuICAgICAgICBpZiAod2Via2l0ICYmIG9mZnNldCAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgKHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0pLm5vZGVUeXBlID09IDEgJiZcbiAgICAgICAgICAgIHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiAmJiBwcmV2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+PSBjb29yZHMudG9wKVxuICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIC8vIFN1c3BpY2lvdXNseSBzcGVjaWZpYyBrbHVkZ2UgdG8gd29yayBhcm91bmQgY2FyZXQqRnJvbVBvaW50XG4gICAgICAgIC8vIG5ldmVyIHJldHVybmluZyBhIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50XG4gICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiBub2RlLmxhc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBjb29yZHMudG9wID4gbm9kZS5sYXN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKVxuICAgICAgICAgICAgcG9zID0gdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplO1xuICAgICAgICAvLyBJZ25vcmUgcG9zaXRpb25zIGRpcmVjdGx5IGFmdGVyIGEgQlIsIHNpbmNlIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyAncm91bmQgdXAnIHBvc2l0aW9ucyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGVseSBwbGFjZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBCUiBub2RlLlxuICAgICAgICBlbHNlIGlmIChvZmZzZXQgPT0gMCB8fCBub2RlLm5vZGVUeXBlICE9IDEgfHwgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHBvcyA9IHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcyk7XG4gICAgfVxuICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgcG9zID0gcG9zRnJvbUVsZW1lbnQodmlldywgZWx0LCBjb29yZHMpO1xuICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGVsdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHsgcG9zLCBpbnNpZGU6IGRlc2MgPyBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciA6IC0xIH07XG59XG5mdW5jdGlvbiBub25aZXJvKHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPCByZWN0LmJvdHRvbSB8fCByZWN0LmxlZnQgPCByZWN0LnJpZ2h0O1xufVxuZnVuY3Rpb24gc2luZ2xlUmVjdCh0YXJnZXQsIGJpYXMpIHtcbiAgICBsZXQgcmVjdHMgPSB0YXJnZXQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHJlY3RzW2JpYXMgPCAwID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobm9uWmVybyhmaXJzdCkpXG4gICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCBub25aZXJvKSB8fCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG59XG5jb25zdCBCSURJID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNdLztcbi8vIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlXG4vLyBjaGFyYWN0ZXIgYXQgdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbmZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCwgYXRvbSB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCBzaWRlIDwgMCA/IC0xIDogMSk7XG4gICAgbGV0IHN1cHBvcnRFbXB0eVJhbmdlID0gd2Via2l0IHx8IGdlY2tvO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gVGhlc2UgYnJvd3NlcnMgc3VwcG9ydCBxdWVyeWluZyBlbXB0eSB0ZXh0IHJhbmdlcy4gUHJlZmVyIHRoYXQgaW5cbiAgICAgICAgLy8gYmlkaSBjb250ZXh0IG9yIHdoZW4gYXQgdGhlIGVuZCBvZiBhIG5vZGUuXG4gICAgICAgIGlmIChzdXBwb3J0RW1wdHlSYW5nZSAmJiAoQklESS50ZXN0KG5vZGUubm9kZVZhbHVlKSB8fCAoc2lkZSA8IDAgPyAhb2Zmc2V0IDogb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0KSwgc2lkZSk7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHJldHVybnMgYmFkIHJlc3VsdHMgKHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwYWNlKVxuICAgICAgICAgICAgLy8gd2hlbiBxdWVyeWluZyBhIHBvc2l0aW9uIGRpcmVjdGx5IGFmdGVyIGxpbmUtYnJva2VuXG4gICAgICAgICAgICAvLyB3aGl0ZXNwYWNlLiBEZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIGFuZCBrbHVkZ2UgYXJvdW5kIGl0XG4gICAgICAgICAgICBpZiAoZ2Vja28gJiYgb2Zmc2V0ICYmIC9cXHMvLnRlc3Qobm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0pICYmIG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgb2Zmc2V0IC0gMSwgb2Zmc2V0IC0gMSksIC0xKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS50b3AgPT0gcmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RBZnRlciA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSksIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RBZnRlci50b3AgIT0gcmVjdC50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblYocmVjdEFmdGVyLCByZWN0QWZ0ZXIubGVmdCA8IHJlY3RCZWZvcmUubGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG9mZnNldCwgdG8gPSBvZmZzZXQsIHRha2VTaWRlID0gc2lkZSA8IDAgPyAxIDogLTE7XG4gICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgIW9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgdGFrZVNpZGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPj0gMCAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPCAwKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBmcm9tLCB0byksIHRha2VTaWRlKSwgdGFrZVNpZGUgPCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgJGRvbSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zIC0gKGF0b20gfHwgMCkpO1xuICAgIC8vIFJldHVybiBhIGhvcml6b250YWwgbGluZSBpbiBibG9jayBjb250ZXh0XG4gICAgaWYgKCEkZG9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChiZWZvcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCA8IG5vZGVTaXplKG5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChhZnRlci5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChhZnRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5IKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHNpZGUgPj0gMCk7XG4gICAgfVxuICAgIC8vIElubGluZSwgbm90IGluIHRleHQgbm9kZSAodGhpcyBpcyBub3QgQmlkaS1zYWZlKVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGxldCB0YXJnZXQgPSBiZWZvcmUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShiZWZvcmUsIG5vZGVTaXplKGJlZm9yZSkgLSAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICAvLyBCUiBub2RlcyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRoZSByZWN0YW5nbGUgYmVmb3JlIHRoZW0uXG4gICAgICAgICAgICAvLyBPbmx5IHVzZSB0aGVtIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlaXIgcGFyZW50XG4gICAgICAgICAgICA6IGJlZm9yZS5ub2RlVHlwZSA9PSAxICYmIChiZWZvcmUubm9kZU5hbWUgIT0gXCJCUlwiIHx8ICFiZWZvcmUubmV4dFNpYmxpbmcpID8gYmVmb3JlIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgMSksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgd2hpbGUgKGFmdGVyLnBtVmlld0Rlc2MgJiYgYWZ0ZXIucG1WaWV3RGVzYy5pZ25vcmVGb3JDb29yZHMpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gIWFmdGVyID8gbnVsbCA6IGFmdGVyLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYWZ0ZXIsIDAsIChzdXBwb3J0RW1wdHlSYW5nZSA/IDAgOiAxKSlcbiAgICAgICAgICAgIDogYWZ0ZXIubm9kZVR5cGUgPT0gMSA/IGFmdGVyIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgLTEpLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gQWxsIGVsc2UgZmFpbGVkLCBqdXN0IHRyeSB0byBnZXQgYSByZWN0YW5nbGUgZm9yIHRoZSB0YXJnZXQgbm9kZVxuICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KG5vZGUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShub2RlKSA6IG5vZGUsIC1zaWRlKSwgc2lkZSA+PSAwKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5WKHJlY3QsIGxlZnQpIHtcbiAgICBpZiAocmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICBsZXQgeCA9IGxlZnQgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0O1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiB4IH07XG59XG5mdW5jdGlvbiBmbGF0dGVuSChyZWN0LCB0b3ApIHtcbiAgICBpZiAocmVjdC5oZWlnaHQgPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHkgPSB0b3AgPyByZWN0LnRvcCA6IHJlY3QuYm90dG9tO1xuICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0IH07XG59XG5mdW5jdGlvbiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCBmKSB7XG4gICAgbGV0IHZpZXdTdGF0ZSA9IHZpZXcuc3RhdGUsIGFjdGl2ZSA9IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20pXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZigpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHZpZXdTdGF0ZSAhPSBzdGF0ZSlcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlld1N0YXRlKTtcbiAgICAgICAgaWYgKGFjdGl2ZSAhPSB2aWV3LmRvbSAmJiBhY3RpdmUpXG4gICAgICAgICAgICBhY3RpdmUuZm9jdXMoKTtcbiAgICB9XG59XG4vLyBXaGV0aGVyIHZlcnRpY2FsIHBvc2l0aW9uIG1vdGlvbiBpbiBhIGdpdmVuIGRpcmVjdGlvblxuLy8gZnJvbSBhIHBvc2l0aW9uIHdvdWxkIGxlYXZlIGEgdGV4dCBibG9jay5cbmZ1bmN0aW9uIGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0ICRwb3MgPSBkaXIgPT0gXCJ1cFwiID8gc2VsLiRmcm9tIDogc2VsLiR0bztcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICBsZXQgeyBub2RlOiBkb20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKCRwb3MucG9zLCBkaXIgPT0gXCJ1cFwiID8gLTEgOiAxKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChuZWFyZXN0Lm5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuY29udGVudERPTSB8fCBuZWFyZXN0LmRvbTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHZpZXcsICRwb3MucG9zLCAxKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBib3hlcztcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIGJveGVzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgYm94ZXMgPSB0ZXh0UmFuZ2UoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChib3guYm90dG9tID4gYm94LnRvcCArIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRpciA9PSBcInVwXCIgPyBjb29yZHMudG9wIC0gYm94LnRvcCA+IChib3guYm90dG9tIC0gY29vcmRzLnRvcCkgKiAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJveC5ib3R0b20gLSBjb29yZHMuYm90dG9tID4gKGNvb3Jkcy5ib3R0b20gLSBib3gudG9wKSAqIDIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5jb25zdCBtYXliZVJUTCA9IC9bXFx1MDU5MC1cXHUwOGFjXS87XG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCB7ICRoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gJGhlYWQucGFyZW50T2Zmc2V0LCBhdFN0YXJ0ID0gIW9mZnNldCwgYXRFbmQgPSBvZmZzZXQgPT0gJGhlYWQucGFyZW50LmNvbnRlbnQuc2l6ZTtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbClcbiAgICAgICAgcmV0dXJuICRoZWFkLnBvcyA9PSAkaGVhZC5zdGFydCgpIHx8ICRoZWFkLnBvcyA9PSAkaGVhZC5lbmQoKTtcbiAgICAvLyBJZiB0aGUgdGV4dGJsb2NrIGlzIGFsbCBMVFIsIG9yIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydFxuICAgIC8vIFNlbGVjdGlvbi5tb2RpZnkgKEVkZ2UpLCBmYWxsIGJhY2sgdG8gYSBwcmltaXRpdmUgYXBwcm9hY2hcbiAgICBpZiAoIW1heWJlUlRMLnRlc3QoJGhlYWQucGFyZW50LnRleHRDb250ZW50KSB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgcmV0dXJuIGRpciA9PSBcImxlZnRcIiB8fCBkaXIgPT0gXCJiYWNrd2FyZFwiID8gYXRTdGFydCA6IGF0RW5kO1xuICAgIHJldHVybiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCAoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBodWdlIGhhY2ssIGJ1dCBhcHBlYXJzIHRvIGJlIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBjdXJyZW50bHkgZG86IHVzZSBgU2VsZWN0aW9uLm1vZGlmeWAgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIGJ5XG4gICAgICAgIC8vIG9uZSBjaGFyYWN0ZXIsIGFuZCBzZWUgaWYgdGhhdCBtb3ZlcyB0aGUgY3Vyc29yIG91dCBvZiB0aGVcbiAgICAgICAgLy8gdGV4dGJsb2NrIChvciBkb2Vzbid0IG1vdmUgaXQgYXQgYWxsLCB3aGVuIGF0IHRoZSBzdGFydC9lbmQgb2ZcbiAgICAgICAgLy8gdGhlIGRvY3VtZW50KS5cbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBvbGROb2RlLCBmb2N1c09mZnNldDogb2xkT2ZmLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG9sZEJpZGlMZXZlbCA9IHNlbC5jYXJldEJpZGlMZXZlbCAvLyBPbmx5IGZvciBGaXJlZm94XG4gICAgICAgIDtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgZGlyLCBcImNoYXJhY3RlclwiKTtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9ICRoZWFkLmRlcHRoID8gdmlldy5kb2NWaWV3LmRvbUFmdGVyUG9zKCRoZWFkLmJlZm9yZSgpKSA6IHZpZXcuZG9tO1xuICAgICAgICBsZXQgeyBmb2N1c05vZGU6IG5ld05vZGUsIGZvY3VzT2Zmc2V0OiBuZXdPZmYgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ld05vZGUgJiYgIXBhcmVudERPTS5jb250YWlucyhuZXdOb2RlLm5vZGVUeXBlID09IDEgPyBuZXdOb2RlIDogbmV3Tm9kZS5wYXJlbnROb2RlKSB8fFxuICAgICAgICAgICAgKG9sZE5vZGUgPT0gbmV3Tm9kZSAmJiBvbGRPZmYgPT0gbmV3T2ZmKTtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChvbGROb2RlICYmIChvbGROb2RlICE9IGFuY2hvck5vZGUgfHwgb2xkT2ZmICE9IGFuY2hvck9mZnNldCkgJiYgc2VsLmV4dGVuZClcbiAgICAgICAgICAgICAgICBzZWwuZXh0ZW5kKG9sZE5vZGUsIG9sZE9mZik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICBpZiAob2xkQmlkaUxldmVsICE9IG51bGwpXG4gICAgICAgICAgICBzZWwuY2FyZXRCaWRpTGV2ZWwgPSBvbGRCaWRpTGV2ZWw7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5sZXQgY2FjaGVkU3RhdGUgPSBudWxsO1xubGV0IGNhY2hlZERpciA9IG51bGw7XG5sZXQgY2FjaGVkUmVzdWx0ID0gZmFsc2U7XG5mdW5jdGlvbiBlbmRPZlRleHRibG9jayh2aWV3LCBzdGF0ZSwgZGlyKSB7XG4gICAgaWYgKGNhY2hlZFN0YXRlID09IHN0YXRlICYmIGNhY2hlZERpciA9PSBkaXIpXG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgY2FjaGVkU3RhdGUgPSBzdGF0ZTtcbiAgICBjYWNoZWREaXIgPSBkaXI7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9IGRpciA9PSBcInVwXCIgfHwgZGlyID09IFwiZG93blwiXG4gICAgICAgID8gZW5kT2ZUZXh0YmxvY2tWZXJ0aWNhbCh2aWV3LCBzdGF0ZSwgZGlyKVxuICAgICAgICA6IGVuZE9mVGV4dGJsb2NrSG9yaXpvbnRhbCh2aWV3LCBzdGF0ZSwgZGlyKTtcbn1cblxuLy8gVmlldyBkZXNjcmlwdGlvbnMgYXJlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZSBET00gdGhhdCBpc1xuLy8gdXNlZCB0byByZXByZXNlbnQgdGhlIGVkaXRvcidzIGNvbnRlbnQuIFRoZXkgYXJlIHVzZWQgZm9yOlxuLy9cbi8vIC0gSW5jcmVtZW50YWwgcmVkcmF3aW5nIHdoZW4gdGhlIGRvY3VtZW50IGNoYW5nZXNcbi8vXG4vLyAtIEZpZ3VyaW5nIG91dCB3aGF0IHBhcnQgb2YgdGhlIGRvY3VtZW50IGEgZ2l2ZW4gRE9NIHBvc2l0aW9uXG4vLyAgIGNvcnJlc3BvbmRzIHRvXG4vL1xuLy8gLSBXaXJpbmcgaW4gY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZWRpdGluZyBpbnRlcmZhY2UgZm9yIGFcbi8vICAgZ2l2ZW4gbm9kZVxuLy9cbi8vIFRoZXkgZm9ybSBhIGRvdWJseS1saW5rZWQgbXV0YWJsZSB0cmVlLCBzdGFydGluZyBhdCBgdmlldy5kb2NWaWV3YC5cbmNvbnN0IE5PVF9ESVJUWSA9IDAsIENISUxEX0RJUlRZID0gMSwgQ09OVEVOVF9ESVJUWSA9IDIsIE5PREVfRElSVFkgPSAzO1xuLy8gU3VwZXJjbGFzcyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRpb25zLiBEZWZpbmVzIHRoZWlyXG4vLyBiYXNpYyBzdHJ1Y3R1cmUgYW5kIHNoYXJlZCBtZXRob2RzLlxuY2xhc3MgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgY2hpbGRyZW4sIGRvbSwgXG4gICAgLy8gVGhpcyBpcyB0aGUgbm9kZSB0aGF0IGhvbGRzIHRoZSBjaGlsZCB2aWV3cy4gSXQgbWF5IGJlIG51bGwgZm9yXG4gICAgLy8gZGVzY3MgdGhhdCBkb24ndCBoYXZlIGNoaWxkcmVuLlxuICAgIGNvbnRlbnRET00pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGNvbnRlbnRET007XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIC8vIEFuIGV4cGFuZG8gcHJvcGVydHkgb24gdGhlIERPTSBub2RlIHByb3ZpZGVzIGEgbGluayBiYWNrIHRvIGl0c1xuICAgICAgICAvLyBkZXNjcmlwdGlvbi5cbiAgICAgICAgZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgIH1cbiAgICAvLyBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBkZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhXG4gICAgLy8gd2lkZ2V0L21hcmsvbm9kZS5cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBpbi1lZGl0b3IgY29udGVudCAoaW4gZG9tY2hhbmdlLmpzKSwgd2UgYWxsb3dcbiAgICAvLyBkZXNjcmlwdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBwYXJzZSBydWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvXG4gICAgLy8gcGFyc2UgdGhlbS5cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgLy8gVXNlZCBieSB0aGUgZWRpdG9yJ3MgZXZlbnQgaGFuZGxlciB0byBpZ25vcmUgZXZlbnRzIHRoYXQgY29tZVxuICAgIC8vIGZyb20gY2VydGFpbiBkZXNjcy5cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGJsb2NrIG5vZGVzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHNwYWNlIHRha2VuIHVwIGJ5IHRoZWlyXG4gICAgLy8gc3RhcnQvZW5kIHRva2Vucy5cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5kb20ucG1WaWV3RGVzYyA9PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHBvc0JlZm9yZUNoaWxkKGNoaWxkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGN1ciA9PSBjaGlsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGN1ci5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwb3NCZWZvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZUNoaWxkKHRoaXMpICsgdGhpcy5ib3JkZXIgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSArIHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5zaXplIC0gMiAqIHRoaXMuYm9yZGVyO1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgLy8gSWYgdGhlIERPTSBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGVudCwgdXNlIHRoZSBjaGlsZCBkZXNjIGFmdGVyXG4gICAgICAgIC8vIGl0IHRvIGZpZ3VyZSBvdXQgYSBwb3NpdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChiaWFzIDwgMCkge1xuICAgICAgICAgICAgICAgIGxldCBkb21CZWZvcmUsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChkb21CZWZvcmUgJiYgISgoZGVzYyA9IGRvbUJlZm9yZS5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tQmVmb3JlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmVmb3JlID8gdGhpcy5wb3NCZWZvcmVDaGlsZChkZXNjKSArIGRlc2Muc2l6ZSA6IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkb21BZnRlciwgZGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZG9tID09IHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUFmdGVyID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQWZ0ZXIgJiYgISgoZGVzYyA9IGRvbUFmdGVyLnBtVmlld0Rlc2MpICYmIGRlc2MucGFyZW50ID09IHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbUFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21BZnRlciA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgOiB0aGlzLnBvc0F0RW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHZhcmlvdXMgaGV1cmlzdGljcywgZmFsbGluZyBiYWNrIG9uIHRoZSBiaWFzXG4gICAgICAgIC8vIHBhcmFtZXRlciwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB0aGVcbiAgICAgICAgLy8gc3RhcnQgb3IgYXQgdGhlIGVuZCBvZiB0aGlzIHZpZXcgZGVzYy5cbiAgICAgICAgbGV0IGF0RW5kO1xuICAgICAgICBpZiAoZG9tID09IHRoaXMuZG9tICYmIHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgYXRFbmQgPSBvZmZzZXQgPiBkb21JbmRleCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKSkge1xuICAgICAgICAgICAgYXRFbmQgPSBkb20uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5jb250ZW50RE9NKSAmIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdEVuZCA9PSBudWxsICYmIG9mZnNldCA9PSBkb20uY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gZG9tOzsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGF0RW5kID09IG51bGwgPyBiaWFzID4gMCA6IGF0RW5kKSA/IHRoaXMucG9zQXRFbmQgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIG5lYXJlc3REZXNjKGRvbSwgb25seU5vZGVzID0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChsZXQgZmlyc3QgPSB0cnVlLCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKGN1ciksIG5vZGVET007XG4gICAgICAgICAgICBpZiAoZGVzYyAmJiAoIW9ubHlOb2RlcyB8fCBkZXNjLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZG9tIGlzIG91dHNpZGUgb2YgdGhpcyBkZXNjJ3Mgbm9kZURPTSwgZG9uJ3QgY291bnQgaXQuXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICYmIChub2RlRE9NID0gZGVzYy5ub2RlRE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGVET00ubm9kZVR5cGUgPT0gMSA/IG5vZGVET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkgOiBub2RlRE9NID09IGRvbSkpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZXNjKGRvbSkge1xuICAgICAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkZXNjOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoY3VyID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIHBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IGRvbTsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmdldERlc2Moc2Nhbik7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5sb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgZGVzYyBmb3IgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIHBvcywgaWYgYW55LiAoV2hlbiBhXG4gICAgLy8gcGFyZW50IG5vZGUgb3ZlcnJvZGUgcmVuZGVyaW5nLCB0aGVyZSBtaWdodCBub3QgYmUgb25lLilcbiAgICBkZXNjQXQocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zICYmIGVuZCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWNoaWxkLmJvcmRlciAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyID0gY2hpbGQuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZGVzY0F0KHBvcyAtIG9mZnNldCAtIGNoaWxkLmJvcmRlcik7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmRvbSwgb2Zmc2V0OiAwLCBhdG9tOiBwb3MgKyAxIH07XG4gICAgICAgIC8vIEZpcnN0IGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBhcnJheVxuICAgICAgICBsZXQgaSA9IDAsIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGN1clBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBjdXJQb3MgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcyB8fCBjaGlsZCBpbnN0YW5jZW9mIFRyYWlsaW5nSGFja1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zIC0gY3VyUG9zO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgcG9pbnRzIGludG8gdGhlIG1pZGRsZSBvZiBhIGNoaWxkLCBjYWxsIHRocm91Z2hcbiAgICAgICAgaWYgKG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUZyb21Qb3Mob2Zmc2V0IC0gdGhpcy5jaGlsZHJlbltpXS5ib3JkZXIsIHNpZGUpO1xuICAgICAgICAvLyBHbyBiYWNrIGlmIHRoZXJlIHdlcmUgYW55IHplcm8tbGVuZ3RoIHdpZGdldHMgd2l0aCBzaWRlID49IDAgYmVmb3JlIHRoaXMgcG9pbnRcbiAgICAgICAgZm9yIChsZXQgcHJldjsgaSAmJiAhKHByZXYgPSB0aGlzLmNoaWxkcmVuW2kgLSAxXSkuc2l6ZSAmJiBwcmV2IGluc3RhbmNlb2YgV2lkZ2V0Vmlld0Rlc2MgJiYgcHJldi5zaWRlID49IDA7IGktLSkgeyB9XG4gICAgICAgIC8vIFNjYW4gdG93YXJkcyB0aGUgZmlyc3QgdXNlYWJsZSBub2RlXG4gICAgICAgIGlmIChzaWRlIDw9IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGktLSwgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSBpID8gdGhpcy5jaGlsZHJlbltpIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiAmJiBzaWRlICYmIGVudGVyICYmICFwcmV2LmJvcmRlciAmJiAhcHJldi5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUZyb21Qb3MocHJldi5zaXplLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBwcmV2ID8gZG9tSW5kZXgocHJldi5kb20pICsgMSA6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKywgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmNoaWxkcmVuW2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHQgJiYgZW50ZXIgJiYgIW5leHQuYm9yZGVyICYmICFuZXh0LmRvbUF0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tRnJvbVBvcygwLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBuZXh0ID8gZG9tSW5kZXgobmV4dC5kb20pIDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCB0byBmaW5kIGEgRE9NIHJhbmdlIGluIGEgc2luZ2xlIHBhcmVudCBmb3IgYSBnaXZlbiBjaGFuZ2VkXG4gICAgLy8gcmFuZ2UuXG4gICAgcGFyc2VSYW5nZShmcm9tLCB0bywgYmFzZSA9IDApIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIGZyb20sIHRvLCBmcm9tT2Zmc2V0OiAwLCB0b09mZnNldDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gLTEsIHRvT2Zmc2V0ID0gLTE7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IGJhc2UsIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEgJiYgZnJvbSA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRCYXNlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1heWJlIGRlc2NlbmQgbWFyayB2aWV3cyB0byBwYXJzZSBhIG5hcnJvd2VyIHJhbmdlP1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGNoaWxkQmFzZSAmJiB0byA8PSBlbmQgLSBjaGlsZC5ib3JkZXIgJiYgY2hpbGQubm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTS5jb250YWlucyhjaGlsZC5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnBhcnNlUmFuZ2UoZnJvbSwgdG8sIGNoaWxkQmFzZSk7XG4gICAgICAgICAgICAgICAgZnJvbSA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5zaXplICYmIHByZXYuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFwcmV2LmVtcHR5Q2hpbGRBdCgxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9mZnNldCA9IGRvbUluZGV4KHByZXYuZG9tKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tIC09IHByZXYuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPiAtMSAmJiAoZW5kID4gdG8gfHwgaSA9PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICAgICAgdG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnNpemUgJiYgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIW5leHQuZW1wdHlDaGlsZEF0KC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBkb21JbmRleChuZXh0LmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0byArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b09mZnNldCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSB0aGlzLmNvbnRlbnRET00uY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldCwgdG9PZmZzZXQgfTtcbiAgICB9XG4gICAgZW1wdHlDaGlsZEF0KHNpZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuYm9yZGVyIHx8ICF0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3NpZGUgPCAwID8gMCA6IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBjaGlsZC5zaXplID09IDAgfHwgY2hpbGQuZW1wdHlDaGlsZEF0KHNpZGUpO1xuICAgIH1cbiAgICBkb21BZnRlclBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB0aGlzLmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSB8fCBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhZnRlciBwb3MgXCIgKyBwb3MpO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgfVxuICAgIC8vIFZpZXcgZGVzY3MgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGFueSBzZWxlY3Rpb24gdGhhdCBmYWxsc1xuICAgIC8vIGVudGlyZWx5IGluc2lkZSBvZiB0aGVtLCBzbyB0aGF0IGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgY2FuIGRvXG4gICAgLy8gY3VzdG9tIHRoaW5ncyB3aXRoIHRoZSBzZWxlY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGZhbGxzIGFwYXJ0IHdoZW5cbiAgICAvLyBhIHNlbGVjdGlvbiBzdGFydHMgaW4gc3VjaCBhIG5vZGUgYW5kIGVuZHMgaW4gYW5vdGhlciwgaW4gd2hpY2hcbiAgICAvLyBjYXNlIHdlIGp1c3QgdXNlIHdoYXRldmVyIGRvbUZyb21Qb3MgcHJvZHVjZXMgYXMgYSBiZXN0IGVmZm9ydC5cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gZmFsbHMgZW50aXJlbHkgaW4gYSBjaGlsZCwgZ2l2ZSBpdCB0byB0aGF0IGNoaWxkXG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5taW4oYW5jaG9yLCBoZWFkKSwgdG8gPSBNYXRoLm1heChhbmNob3IsIGhlYWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IG9mZnNldCAmJiB0byA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2V0U2VsZWN0aW9uKGFuY2hvciAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgaGVhZCAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgdmlldywgZm9yY2UpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbmNob3JET00gPSB0aGlzLmRvbUZyb21Qb3MoYW5jaG9yLCBhbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgaGVhZERPTSA9IGhlYWQgPT0gYW5jaG9yID8gYW5jaG9yRE9NIDogdGhpcy5kb21Gcm9tUG9zKGhlYWQsIGhlYWQgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5yb290LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBsZXQgc2VsUmFuZ2UgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBicktsdWRnZSA9IGZhbHNlO1xuICAgICAgICAvLyBPbiBGaXJlZm94LCB1c2luZyBTZWxlY3Rpb24uY29sbGFwc2UgdG8gcHV0IHRoZSBjdXJzb3IgYWZ0ZXIgYVxuICAgICAgICAvLyBCUiBub2RlIGZvciBzb21lIHJlYXNvbiBkb2Vzbid0IGFsd2F5cyB3b3JrICgjMTA3MykuIE9uIFNhZmFyaSxcbiAgICAgICAgLy8gdGhlIGN1cnNvciBzb21ldGltZXMgaW5leHBsaWNhYmxlIHZpc3VhbGx5IGxhZ3MgYmVoaW5kIGl0c1xuICAgICAgICAvLyByZXBvcnRlZCBwb3NpdGlvbiBpbiBzdWNoIHNpdHVhdGlvbnMgKCMxMDkyKS5cbiAgICAgICAgaWYgKChnZWNrbyB8fCBzYWZhcmkpICYmIGFuY2hvciA9PSBoZWFkKSB7XG4gICAgICAgICAgICBsZXQgeyBub2RlLCBvZmZzZXQgfSA9IGFuY2hvckRPTTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICBicktsdWRnZSA9ICEhKG9mZnNldCAmJiBub2RlLm5vZGVWYWx1ZVtvZmZzZXQgLSAxXSA9PSBcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAvLyBJc3N1ZSAjMTEyOFxuICAgICAgICAgICAgICAgIGlmIChicktsdWRnZSAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBhZnRlcjsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID0gc2Nhbi5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlci5ub2RlTmFtZSA9PSBcIkJSXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRPTSA9IGhlYWRET00gPSB7IG5vZGU6IGFmdGVyLnBhcmVudE5vZGUsIG9mZnNldDogZG9tSW5kZXgoYWZ0ZXIpICsgMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBzY2FuLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUgJiYgZGVzYy5ub2RlLmlzQmxvY2spXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBicktsdWRnZSA9IHByZXYgJiYgKHByZXYubm9kZU5hbWUgPT0gXCJCUlwiIHx8IHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlyZWZveCBjYW4gYWN0IHN0cmFuZ2VseSB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgaW4gZnJvbnQgb2YgYW5cbiAgICAgICAgLy8gdW5lZGl0YWJsZSBub2RlLiBTZWUgIzExNjMgYW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDk1MzZcbiAgICAgICAgaWYgKGdlY2tvICYmIHNlbFJhbmdlLmZvY3VzTm9kZSAmJiBzZWxSYW5nZS5mb2N1c05vZGUgIT0gaGVhZERPTS5ub2RlICYmIHNlbFJhbmdlLmZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBzZWxSYW5nZS5mb2N1c05vZGUuY2hpbGROb2Rlc1tzZWxSYW5nZS5mb2N1c09mZnNldF07XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoZm9yY2UgfHwgYnJLbHVkZ2UgJiYgc2FmYXJpKSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIHNlbFJhbmdlLmFuY2hvck5vZGUsIHNlbFJhbmdlLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQsIHNlbFJhbmdlLmZvY3VzTm9kZSwgc2VsUmFuZ2UuZm9jdXNPZmZzZXQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBTZWxlY3Rpb24uZXh0ZW5kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiAnaW52ZXJ0ZWQnIHNlbGVjdGlvblxuICAgICAgICAvLyAob25lIHdoZXJlIHRoZSBmb2N1cyBpcyBiZWZvcmUgdGhlIGFuY2hvciksIGJ1dCBub3QgYWxsXG4gICAgICAgIC8vIGJyb3dzZXJzIHN1cHBvcnQgaXQgeWV0LlxuICAgICAgICBsZXQgZG9tU2VsRXh0ZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKChkb21TZWwuZXh0ZW5kIHx8IGFuY2hvciA9PSBoZWFkKSAmJiAhYnJLbHVkZ2UpIHtcbiAgICAgICAgICAgIGRvbVNlbC5jb2xsYXBzZShhbmNob3JET00ubm9kZSwgYW5jaG9yRE9NLm9mZnNldCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgIT0gaGVhZClcbiAgICAgICAgICAgICAgICAgICAgZG9tU2VsLmV4dGVuZChoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBkb21TZWxFeHRlbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgd2l0aCBDaHJvbWUgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhZnRlciBjYWxsaW5nXG4gICAgICAgICAgICAgICAgLy8gY29sbGFwc2UsIGV2ZW4gd2hlbiBpdCBzaG91bGQgYmUgdmFsaWQuIFRoaXMgYXBwZWFycyB0byBiZSBhIGJ1ZywgYnV0XG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgZGlmZmljdWx0IHRvIGlzb2xhdGUuIElmIHRoaXMgaGFwcGVucyBmYWxsYmFjayB0byB0aGUgb2xkIHBhdGhcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHVzaW5nIGV4dGVuZC5cbiAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHksIHRoaXMgY291bGQgY3Jhc2ggb24gU2FmYXJpIGlmIHRoZSBlZGl0b3IgaXMgaGlkZGVuLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgbm8gc2VsZWN0aW9uLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZG9tU2VsRXh0ZW5kZWQpIHtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPiBoZWFkKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IGFuY2hvckRPTTtcbiAgICAgICAgICAgICAgICBhbmNob3JET00gPSBoZWFkRE9NO1xuICAgICAgICAgICAgICAgIGhlYWRET00gPSB0bXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQpO1xuICAgICAgICAgICAgZG9tU2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGVudERPTSAmJiBtdXRhdGlvbi50eXBlICE9IFwic2VsZWN0aW9uXCI7XG4gICAgfVxuICAgIGdldCBjb250ZW50TG9zdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgIXRoaXMuZG9tLmNvbnRhaW5zKHRoaXMuY29udGVudERPTSk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBhIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgdHJlZSB0aGF0IGhhcyBiZWVuIHRvdWNoZWRcbiAgICAvLyBieSBhIERPTSBjaGFuZ2UsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcmVkcmF3IGl0LlxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGVuZCA/IGZyb20gPD0gZW5kICYmIHRvID49IG9mZnNldCA6IGZyb20gPCBlbmQgJiYgdG8gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRJbnNpZGUgPSBvZmZzZXQgKyBjaGlsZC5ib3JkZXIsIGVuZEluc2lkZSA9IGVuZCAtIGNoaWxkLmJvcmRlcjtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBzdGFydEluc2lkZSAmJiB0byA8PSBlbmRJbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZyb20gPT0gb2Zmc2V0IHx8IHRvID09IGVuZCA/IENPTlRFTlRfRElSVFkgOiBDSElMRF9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPT0gc3RhcnRJbnNpZGUgJiYgdG8gPT0gZW5kSW5zaWRlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hpbGQuY29udGVudExvc3QgfHwgY2hpbGQuZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpcnR5ID0gTk9ERV9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubWFya0RpcnR5KGZyb20gLSBzdGFydEluc2lkZSwgdG8gLSBzdGFydEluc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpcnR5ID0gY2hpbGQuZG9tID09IGNoaWxkLmNvbnRlbnRET00gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFjaGlsZC5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gQ09OVEVOVF9ESVJUWSA6IE5PREVfRElSVFk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSAxO1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpcy5wYXJlbnQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudCwgbGV2ZWwrKykge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gbGV2ZWwgPT0gMSA/IENPTlRFTlRfRElSVFkgOiBDSElMRF9ESVJUWTtcbiAgICAgICAgICAgIGlmIChub2RlLmRpcnR5IDwgZGlydHkpXG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eSA9IGRpcnR5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaWdub3JlRm9yQ29vcmRzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc1RleHQodGV4dCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8vIEEgd2lkZ2V0IGRlc2MgcmVwcmVzZW50cyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlXG4vLyBkcmF3biBiZXR3ZWVuIHRoZSBkb2N1bWVudCBub2Rlcy5cbmNsYXNzIFdpZGdldFZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgd2lkZ2V0LCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IHNlbGYsIGRvbSA9IHdpZGdldC50eXBlLnRvRE9NO1xuICAgICAgICBpZiAodHlwZW9mIGRvbSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBkb20gPSBkb20odmlldywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wb3NCZWZvcmVDaGlsZChzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIXdpZGdldC50eXBlLnNwZWMucmF3KSB7XG4gICAgICAgICAgICBpZiAoZG9tLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSB3cmFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itd2lkZ2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgfVxuICAgIG1hdGNoZXNXaWRnZXQod2lkZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiB3aWRnZXQudHlwZS5lcSh0aGlzLndpZGdldC50eXBlKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4geyBpZ25vcmU6IHRydWUgfTsgfVxuICAgIHN0b3BFdmVudChldmVudCkge1xuICAgICAgICBsZXQgc3RvcCA9IHRoaXMud2lkZ2V0LnNwZWMuc3RvcEV2ZW50O1xuICAgICAgICByZXR1cm4gc3RvcCA/IHN0b3AoZXZlbnQpIDogZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwic2VsZWN0aW9uXCIgfHwgdGhpcy53aWRnZXQuc3BlYy5pZ25vcmVTZWxlY3Rpb247XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMud2lkZ2V0LnR5cGUuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IHNpZGUoKSB7IHJldHVybiB0aGlzLndpZGdldC50eXBlLnNpZGU7IH1cbn1cbmNsYXNzIENvbXBvc2l0aW9uVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBkb20sIHRleHRET00sIHRleHQpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBudWxsKTtcbiAgICAgICAgdGhpcy50ZXh0RE9NID0gdGV4dERPTTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmIChkb20gIT0gdGhpcy50ZXh0RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIChvZmZzZXQgPyB0aGlzLnNpemUgOiAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIG9mZnNldDtcbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy50ZXh0RE9NLCBvZmZzZXQ6IHBvcyB9O1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXQpIHtcbiAgICAgICAgcmV0dXJuIG11dC50eXBlID09PSAnY2hhcmFjdGVyRGF0YScgJiYgbXV0LnRhcmdldC5ub2RlVmFsdWUgPT0gbXV0Lm9sZFZhbHVlO1xuICAgIH1cbn1cbi8vIEEgbWFyayBkZXNjIHJlcHJlc2VudHMgYSBtYXJrLiBNYXkgaGF2ZSBtdWx0aXBsZSBjaGlsZHJlbixcbi8vIGRlcGVuZGluZyBvbiBob3cgdGhlIG1hcmsgaXMgc3BsaXQuIE5vdGUgdGhhdCBtYXJrcyBhcmUgZHJhd24gdXNpbmdcbi8vIGEgZml4ZWQgbmVzdGluZyBvcmRlciwgZm9yIHNpbXBsaWNpdHkgYW5kIHByZWRpY3RhYmlsaXR5LCBzbyBpblxuLy8gc29tZSBjYXNlcyB0aGV5IHdpbGwgYmUgc3BsaXQgbW9yZSBvZnRlbiB0aGFuIHdvdWxkIGFwcGVhclxuLy8gbmVjZXNzYXJ5LlxuY2xhc3MgTWFya1ZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbWFyaywgZG9tLCBjb250ZW50RE9NLCBzcGVjKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgY29udGVudERPTSk7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUocGFyZW50LCBtYXJrLCBpbmxpbmUsIHZpZXcpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHZpZXcubm9kZVZpZXdzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgbGV0IHNwZWMgPSBjdXN0b20gJiYgY3VzdG9tKG1hcmssIHZpZXcsIGlubGluZSk7XG4gICAgICAgIGlmICghc3BlYyB8fCAhc3BlYy5kb20pXG4gICAgICAgICAgICBzcGVjID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvY3VtZW50LCBtYXJrLnR5cGUuc3BlYy50b0RPTShtYXJrLCBpbmxpbmUpLCBudWxsLCBtYXJrLmF0dHJzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlld0Rlc2MocGFyZW50LCBtYXJrLCBzcGVjLmRvbSwgc3BlYy5jb250ZW50RE9NIHx8IHNwZWMuZG9tLCBzcGVjKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBpZiAoKHRoaXMuZGlydHkgJiBOT0RFX0RJUlRZKSB8fCB0aGlzLm1hcmsudHlwZS5zcGVjLnJlcGFyc2VJblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHsgbWFyazogdGhpcy5tYXJrLnR5cGUubmFtZSwgYXR0cnM6IHRoaXMubWFyay5hdHRycywgY29udGVudEVsZW1lbnQ6IHRoaXMuY29udGVudERPTSB9O1xuICAgIH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiB0aGlzLmRpcnR5ICE9IE5PREVfRElSVFkgJiYgdGhpcy5tYXJrLmVxKG1hcmspOyB9XG4gICAgbWFya0RpcnR5KGZyb20sIHRvKSB7XG4gICAgICAgIHN1cGVyLm1hcmtEaXJ0eShmcm9tLCB0byk7XG4gICAgICAgIC8vIE1vdmUgZGlydHkgaW5mbyB0byBuZWFyZXN0IG5vZGUgdmlld1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIHdoaWxlICghcGFyZW50Lm5vZGUpXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZGlydHkgPCB0aGlzLmRpcnR5KVxuICAgICAgICAgICAgICAgIHBhcmVudC5kaXJ0eSA9IHRoaXMuZGlydHk7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNsaWNlKGZyb20sIHRvLCB2aWV3KSB7XG4gICAgICAgIGxldCBjb3B5ID0gTWFya1ZpZXdEZXNjLmNyZWF0ZSh0aGlzLnBhcmVudCwgdGhpcy5tYXJrLCB0cnVlLCB2aWV3KTtcbiAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5jaGlsZHJlbiwgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgaWYgKHRvIDwgc2l6ZSlcbiAgICAgICAgICAgIG5vZGVzID0gcmVwbGFjZU5vZGVzKG5vZGVzLCB0bywgc2l6ZSwgdmlldyk7XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIG5vZGVzID0gcmVwbGFjZU5vZGVzKG5vZGVzLCAwLCBmcm9tLCB2aWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG5vZGVzW2ldLnBhcmVudCA9IGNvcHk7XG4gICAgICAgIGNvcHkuY2hpbGRyZW4gPSBub2RlcztcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24gPyB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24obXV0YXRpb24pIDogc3VwZXIuaWdub3JlTXV0YXRpb24obXV0YXRpb24pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveSgpO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxufVxuLy8gTm9kZSB2aWV3IGRlc2NzIGFyZSB0aGUgbWFpbiwgbW9zdCBjb21tb24gdHlwZSBvZiB2aWV3IGRlc2MsIGFuZFxuLy8gY29ycmVzcG9uZCB0byBhbiBhY3R1YWwgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFVubGlrZSBtYXJrIGRlc2NzLFxuLy8gdGhleSBwb3B1bGF0ZSB0aGVpciBjaGlsZCBhcnJheSB0aGVtc2VsdmVzLlxuY2xhc3MgTm9kZVZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgdmlldywgcG9zKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgY29udGVudERPTSk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgICAgICB0aGlzLmlubmVyRGVjbyA9IGlubmVyRGVjbztcbiAgICAgICAgdGhpcy5ub2RlRE9NID0gbm9kZURPTTtcbiAgICB9XG4gICAgLy8gQnkgZGVmYXVsdCwgYSBub2RlIGlzIHJlbmRlcmVkIHVzaW5nIHRoZSBgdG9ET01gIG1ldGhvZCBmcm9tIHRoZVxuICAgIC8vIG5vZGUgdHlwZSBzcGVjLiBCdXQgY2xpZW50IGNvZGUgY2FuIHVzZSB0aGUgYG5vZGVWaWV3c2Agc3BlYyB0b1xuICAgIC8vIHN1cHBseSBhIGN1c3RvbSBub2RlIHZpZXcsIHdoaWNoIGNhbiBpbmZsdWVuY2UgdmFyaW91cyBhc3BlY3RzIG9mXG4gICAgLy8gdGhlIHdheSB0aGUgbm9kZSB3b3Jrcy5cbiAgICAvL1xuICAgIC8vIChVc2luZyBzdWJjbGFzc2luZyBmb3IgdGhpcyB3YXMgaW50ZW50aW9uYWxseSBkZWNpZGVkIGFnYWluc3QsXG4gICAgLy8gc2luY2UgaXQnZCByZXF1aXJlIGV4cG9zaW5nIGEgd2hvbGUgc2xldyBvZiBmaW5pY2t5XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byB0aGUgdXNlciBjb2RlIHRoYXQgdGhleSBwcm9iYWJseSB3aWxsXG4gICAgLy8gbmV2ZXIgbmVlZC4pXG4gICAgc3RhdGljIGNyZWF0ZShwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHZpZXcubm9kZVZpZXdzW25vZGUudHlwZS5uYW1lXSwgZGVzY09iajtcbiAgICAgICAgbGV0IHNwZWMgPSBjdXN0b20gJiYgY3VzdG9tKG5vZGUsIHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIChUaGlzIGlzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdGhlIGN1c3RvbSB2aWV3IHRvIGZpbmQgaXRzXG4gICAgICAgICAgICAvLyBvd24gcG9zaXRpb24pXG4gICAgICAgICAgICBpZiAoIWRlc2NPYmopXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIGlmIChkZXNjT2JqLnBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY09iai5wYXJlbnQucG9zQmVmb3JlQ2hpbGQoZGVzY09iaik7XG4gICAgICAgIH0sIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgbGV0IGRvbSA9IHNwZWMgJiYgc3BlYy5kb20sIGNvbnRlbnRET00gPSBzcGVjICYmIHNwZWMuY29udGVudERPTTtcbiAgICAgICAgaWYgKG5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICBpZiAoIWRvbSlcbiAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlLnRleHQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlICE9IDMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUZXh0IG11c3QgYmUgcmVuZGVyZWQgYXMgYSBET00gdGV4dCBub2RlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFkb20pIHtcbiAgICAgICAgICAgIGxldCBzcGVjID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvY3VtZW50LCBub2RlLnR5cGUuc3BlYy50b0RPTShub2RlKSwgbnVsbCwgbm9kZS5hdHRycyk7XG4gICAgICAgICAgICAoeyBkb20sIGNvbnRlbnRET00gfSA9IHNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGVudERPTSAmJiAhbm9kZS5pc1RleHQgJiYgZG9tLm5vZGVOYW1lICE9IFwiQlJcIikgeyAvLyBDaHJvbWUgZ2V0cyBjb25mdXNlZCBieSA8YnIgY29udGVudGVkaXRhYmxlPWZhbHNlPlxuICAgICAgICAgICAgaWYgKCFkb20uaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpKVxuICAgICAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIGRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBub2RlRE9NID0gZG9tO1xuICAgICAgICBkb20gPSBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgbm9kZSk7XG4gICAgICAgIGlmIChzcGVjKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NPYmogPSBuZXcgQ3VzdG9tTm9kZVZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSB8fCBudWxsLCBub2RlRE9NLCBzcGVjLCB2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgZWxzZSBpZiAobm9kZS5pc1RleHQpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00gfHwgbnVsbCwgbm9kZURPTSwgdmlldywgcG9zICsgMSk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHtcbiAgICAgICAgLy8gRXhwZXJpbWVudGFsIGtsdWRnZSB0byBhbGxvdyBvcHQtaW4gcmUtcGFyc2luZyBvZiBub2Rlc1xuICAgICAgICBpZiAodGhpcy5ub2RlLnR5cGUuc3BlYy5yZXBhcnNlSW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZJWE1FIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBjYW4gYWx3YXlzIHJldHVybiB0aGUgY3VycmVudFxuICAgICAgICAvLyBhdHRycyBtZWFucyB0aGF0IGlmIHRoZSB1c2VyIHNvbWVob3cgbWFuYWdlcyB0byBjaGFuZ2UgdGhlXG4gICAgICAgIC8vIGF0dHJzIGluIHRoZSBkb20sIHRoYXQgd29uJ3QgYmUgcGlja2VkIHVwLiBOb3QgZW50aXJlbHkgc3VyZVxuICAgICAgICAvLyB3aGV0aGVyIHRoaXMgaXMgYSBwcm9ibGVtXG4gICAgICAgIGxldCBydWxlID0geyBub2RlOiB0aGlzLm5vZGUudHlwZS5uYW1lLCBhdHRyczogdGhpcy5ub2RlLmF0dHJzIH07XG4gICAgICAgIGlmICh0aGlzLm5vZGUudHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCIpXG4gICAgICAgICAgICBydWxlLnByZXNlcnZlV2hpdGVzcGFjZSA9IFwiZnVsbFwiO1xuICAgICAgICBpZiAoIXRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50ID0gKCkgPT4gdGhpcy5ub2RlLmNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuY29udGVudExvc3QpIHtcbiAgICAgICAgICAgIHJ1bGUuY29udGVudEVsZW1lbnQgPSB0aGlzLmNvbnRlbnRET007XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgbGlrZXMgdG8gcmFuZG9tbHkgcmVjcmVhdGUgcGFyZW50IG5vZGVzIHdoZW5cbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIHRoaW5ncy4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoaXMgdHJpZXMgdG8gZmluZCB0aGVcbiAgICAgICAgICAgIC8vIG5ldyBwYXJlbnQuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9tLmNvbnRhaW5zKGNoaWxkLmRvbS5wYXJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLmNvbnRlbnRFbGVtZW50ID0gY2hpbGQuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcnVsZS5jb250ZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICBydWxlLmdldENvbnRlbnQgPSAoKSA9PiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVsZTtcbiAgICB9XG4gICAgbWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIG5vZGUuZXEodGhpcy5ub2RlKSAmJlxuICAgICAgICAgICAgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIHRoaXMub3V0ZXJEZWNvKSAmJiBpbm5lckRlY28uZXEodGhpcy5pbm5lckRlY28pO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5ub2RlU2l6ZTsgfVxuICAgIGdldCBib3JkZXIoKSB7IHJldHVybiB0aGlzLm5vZGUuaXNMZWFmID8gMCA6IDE7IH1cbiAgICAvLyBTeW5jcyBgdGhpcy5jaGlsZHJlbmAgdG8gbWF0Y2ggYHRoaXMubm9kZS5jb250ZW50YCBhbmQgdGhlIGxvY2FsXG4gICAgLy8gZGVjb3JhdGlvbnMsIHBvc3NpYmx5IGludHJvZHVjaW5nIG5lc3RpbmcgZm9yIG1hcmtzLiBUaGVuLCBpbiBhXG4gICAgLy8gc2VwYXJhdGUgc3RlcCwgc3luY3MgdGhlIERPTSBpbnNpZGUgYHRoaXMuY29udGVudERPTWAgdG9cbiAgICAvLyBgdGhpcy5jaGlsZHJlbmAuXG4gICAgdXBkYXRlQ2hpbGRyZW4odmlldywgcG9zKSB7XG4gICAgICAgIGxldCBpbmxpbmUgPSB0aGlzLm5vZGUuaW5saW5lQ29udGVudCwgb2ZmID0gcG9zO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSB2aWV3LmNvbXBvc2luZyA/IHRoaXMubG9jYWxDb21wb3NpdGlvbkluZm8odmlldywgcG9zKSA6IG51bGw7XG4gICAgICAgIGxldCBsb2NhbENvbXBvc2l0aW9uID0gY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucG9zID4gLTEgPyBjb21wb3NpdGlvbiA6IG51bGw7XG4gICAgICAgIGxldCBjb21wb3NpdGlvbkluQ2hpbGQgPSBjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5wb3MgPCAwO1xuICAgICAgICBsZXQgdXBkYXRlciA9IG5ldyBWaWV3VHJlZVVwZGF0ZXIodGhpcywgbG9jYWxDb21wb3NpdGlvbiAmJiBsb2NhbENvbXBvc2l0aW9uLm5vZGUsIHZpZXcpO1xuICAgICAgICBpdGVyRGVjbyh0aGlzLm5vZGUsIHRoaXMuaW5uZXJEZWNvLCAod2lkZ2V0LCBpLCBpbnNpZGVOb2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0LnNwZWMubWFya3MpXG4gICAgICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyh3aWRnZXQuc3BlYy5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZGdldC50eXBlLnNpZGUgPj0gMCAmJiAhaW5zaWRlTm9kZSlcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKGkgPT0gdGhpcy5ub2RlLmNoaWxkQ291bnQgPyBNYXJrLm5vbmUgOiB0aGlzLm5vZGUuY2hpbGQoaSkubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBub2RlIGlzIGEgZGVzYyBtYXRjaGluZyB0aGlzIHdpZGdldCwgcmV1c2UgaXQsXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgaW5zZXJ0IHRoZSB3aWRnZXQgYXMgYSBuZXcgdmlldyBkZXNjLlxuICAgICAgICAgICAgdXBkYXRlci5wbGFjZVdpZGdldCh3aWRnZXQsIHZpZXcsIG9mZik7XG4gICAgICAgIH0sIChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGkpID0+IHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgd3JhcHBpbmcgbWFyayBkZXNjcyBtYXRjaCB0aGUgbm9kZSdzIG1hcmtzLlxuICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhjaGlsZC5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIC8vIFRyeSBzZXZlcmFsIHN0cmF0ZWdpZXMgZm9yIGRyYXdpbmcgdGhpcyBub2RlXG4gICAgICAgICAgICBsZXQgY29tcEluZGV4O1xuICAgICAgICAgICAgaWYgKHVwZGF0ZXIuZmluZE5vZGVNYXRjaChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGkpKSA7XG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb3NpdGlvbkluQ2hpbGQgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA+IG9mZiAmJlxuICAgICAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDwgb2ZmICsgY2hpbGQubm9kZVNpemUgJiZcbiAgICAgICAgICAgICAgICAoY29tcEluZGV4ID0gdXBkYXRlci5maW5kSW5kZXhXaXRoQ2hpbGQoY29tcG9zaXRpb24ubm9kZSkpID4gLTEgJiZcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnVwZGF0ZU5vZGVBdChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGNvbXBJbmRleCwgdmlldykpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHVwZGF0ZXIudXBkYXRlTmV4dE5vZGUoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBpLCBvZmYpKSA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgaXQgYXMgYSBuZXcgdmlld1xuICAgICAgICAgICAgICAgIHVwZGF0ZXIuYWRkTm9kZShjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIG9mZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBEcm9wIGFsbCByZW1haW5pbmcgZGVzY3MgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoW10sIGlubGluZSwgdmlldyk7XG4gICAgICAgIGlmICh0aGlzLm5vZGUuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICB1cGRhdGVyLmFkZFRleHRibG9ja0hhY2tzKCk7XG4gICAgICAgIHVwZGF0ZXIuZGVzdHJveVJlc3QoKTtcbiAgICAgICAgLy8gU3luYyB0aGUgRE9NIGlmIGFueXRoaW5nIGNoYW5nZWRcbiAgICAgICAgaWYgKHVwZGF0ZXIuY2hhbmdlZCB8fCB0aGlzLmRpcnR5ID09IENPTlRFTlRfRElSVFkpIHtcbiAgICAgICAgICAgIC8vIE1heSBoYXZlIHRvIHByb3RlY3QgZm9jdXNlZCBET00gZnJvbSBiZWluZyBjaGFuZ2VkIGlmIGEgY29tcG9zaXRpb24gaXMgYWN0aXZlXG4gICAgICAgICAgICBpZiAobG9jYWxDb21wb3NpdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLnByb3RlY3RMb2NhbENvbXBvc2l0aW9uKHZpZXcsIGxvY2FsQ29tcG9zaXRpb24pO1xuICAgICAgICAgICAgcmVuZGVyRGVzY3ModGhpcy5jb250ZW50RE9NLCB0aGlzLmNoaWxkcmVuLCB2aWV3KTtcbiAgICAgICAgICAgIGlmIChpb3MpXG4gICAgICAgICAgICAgICAgaW9zSGFja3ModGhpcy5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxvY2FsQ29tcG9zaXRpb25JbmZvKHZpZXcsIHBvcykge1xuICAgICAgICAvLyBPbmx5IGRvIHNvbWV0aGluZyBpZiBib3RoIHRoZSBzZWxlY3Rpb24gYW5kIGEgZm9jdXNlZCB0ZXh0IG5vZGVcbiAgICAgICAgLy8gYXJlIGluc2lkZSBvZiB0aGlzIG5vZGVcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHx8IGZyb20gPCBwb3MgfHwgdG8gPiBwb3MgKyB0aGlzLm5vZGUuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0ZXh0Tm9kZSA9IHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2RlO1xuICAgICAgICBpZiAoIXRleHROb2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyh0ZXh0Tm9kZS5wYXJlbnROb2RlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5ub2RlLmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRleHQgaW4gdGhlIGZvY3VzZWQgbm9kZSBpbiB0aGUgbm9kZSwgc3RvcCBpZiBpdCdzIG5vdFxuICAgICAgICAgICAgLy8gdGhlcmUgKG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgdGhyb3VnaCBvdGhlciBtZWFucywgaW4gd2hpY2hcbiAgICAgICAgICAgIC8vIGNhc2UgaXQgc2hvdWxkIG92ZXJ3cml0dGVuKVxuICAgICAgICAgICAgbGV0IHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICBsZXQgdGV4dFBvcyA9IGZpbmRUZXh0SW5GcmFnbWVudCh0aGlzLm5vZGUuY29udGVudCwgdGV4dCwgZnJvbSAtIHBvcywgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHRQb3MgPCAwID8gbnVsbCA6IHsgbm9kZTogdGV4dE5vZGUsIHBvczogdGV4dFBvcywgdGV4dCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGV4dE5vZGUsIHBvczogLTEsIHRleHQ6IFwiXCIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0TG9jYWxDb21wb3NpdGlvbih2aWV3LCB7IG5vZGUsIHBvcywgdGV4dCB9KSB7XG4gICAgICAgIC8vIFRoZSBub2RlIGlzIGFscmVhZHkgcGFydCBvZiBhIGxvY2FsIHZpZXcgZGVzYywgbGVhdmUgaXQgdGhlcmVcbiAgICAgICAgaWYgKHRoaXMuZ2V0RGVzYyhub2RlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRpb24gdmlldyBmb3IgdGhlIG9ycGhhbmVkIG5vZGVzXG4gICAgICAgIGxldCB0b3BOb2RlID0gbm9kZTtcbiAgICAgICAgZm9yICg7OyB0b3BOb2RlID0gdG9wTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAodG9wTm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICB0b3BOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpO1xuICAgICAgICAgICAgd2hpbGUgKHRvcE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucG1WaWV3RGVzYylcbiAgICAgICAgICAgICAgICB0b3BOb2RlLnBtVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlc2MgPSBuZXcgQ29tcG9zaXRpb25WaWV3RGVzYyh0aGlzLCB0b3BOb2RlLCBub2RlLCB0ZXh0KTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLnB1c2goZGVzYyk7XG4gICAgICAgIC8vIFBhdGNoIHVwIHRoaXMuY2hpbGRyZW4gdG8gY29udGFpbiB0aGUgY29tcG9zaXRpb24gdmlld1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gcmVwbGFjZU5vZGVzKHRoaXMuY2hpbGRyZW4sIHBvcywgcG9zICsgdGV4dC5sZW5ndGgsIHZpZXcsIGRlc2MpO1xuICAgIH1cbiAgICAvLyBJZiB0aGlzIGRlc2MgbXVzdCBiZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSBnaXZlbiBub2RlIGRlY29yYXRpb24sXG4gICAgLy8gZG8gc28gYW5kIHJldHVybiB0cnVlLlxuICAgIHVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSA9PSBOT0RFX0RJUlRZIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5pbm5lckRlY28gPSBpbm5lckRlY287XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKHZpZXcsIHRoaXMucG9zQXRTdGFydCk7XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgfVxuICAgIHVwZGF0ZU91dGVyRGVjbyhvdXRlckRlY28pIHtcbiAgICAgICAgaWYgKHNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm91dGVyRGVjbykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBuZWVkc1dyYXAgPSB0aGlzLm5vZGVET00ubm9kZVR5cGUgIT0gMTtcbiAgICAgICAgbGV0IG9sZERPTSA9IHRoaXMuZG9tO1xuICAgICAgICB0aGlzLmRvbSA9IHBhdGNoT3V0ZXJEZWNvKHRoaXMuZG9tLCB0aGlzLm5vZGVET00sIGNvbXB1dGVPdXRlckRlY28odGhpcy5vdXRlckRlY28sIHRoaXMubm9kZSwgbmVlZHNXcmFwKSwgY29tcHV0ZU91dGVyRGVjbyhvdXRlckRlY28sIHRoaXMubm9kZSwgbmVlZHNXcmFwKSk7XG4gICAgICAgIGlmICh0aGlzLmRvbSAhPSBvbGRET00pIHtcbiAgICAgICAgICAgIG9sZERPTS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRlckRlY28gPSBvdXRlckRlY287XG4gICAgfVxuICAgIC8vIE1hcmsgdGhpcyBub2RlIGFzIGJlaW5nIHRoZSBzZWxlY3RlZCBub2RlLlxuICAgIHNlbGVjdE5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVET00ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgIHRoaXMubm9kZURPTS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NIHx8ICF0aGlzLm5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBub2RlIG1hcmtpbmcgZnJvbSB0aGlzIG5vZGUuXG4gICAgZGVzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZURPTS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdGhpcy5ub2RlLmlzQXRvbTsgfVxufVxuLy8gQ3JlYXRlIGEgdmlldyBkZXNjIGZvciB0aGUgdG9wLWxldmVsIGRvY3VtZW50IG5vZGUsIHRvIGJlIGV4cG9ydGVkXG4vLyBhbmQgdXNlZCBieSB0aGUgdmlldyBjbGFzcy5cbmZ1bmN0aW9uIGRvY1ZpZXdEZXNjKGRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgdmlldykge1xuICAgIGFwcGx5T3V0ZXJEZWNvKGRvbSwgb3V0ZXJEZWNvLCBkb2MpO1xuICAgIGxldCBkb2NWaWV3ID0gbmV3IE5vZGVWaWV3RGVzYyh1bmRlZmluZWQsIGRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgZG9tLCBkb20sIHZpZXcsIDApO1xuICAgIGlmIChkb2NWaWV3LmNvbnRlbnRET00pXG4gICAgICAgIGRvY1ZpZXcudXBkYXRlQ2hpbGRyZW4odmlldywgMCk7XG4gICAgcmV0dXJuIGRvY1ZpZXc7XG59XG5jbGFzcyBUZXh0Vmlld0Rlc2MgZXh0ZW5kcyBOb2RlVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgbm9kZURPTSwgdmlldykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG51bGwsIG5vZGVET00sIHZpZXcsIDApO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIGxldCBza2lwID0gdGhpcy5ub2RlRE9NLnBhcmVudE5vZGU7XG4gICAgICAgIHdoaWxlIChza2lwICYmIHNraXAgIT0gdGhpcy5kb20gJiYgIXNraXAucG1Jc0RlY28pXG4gICAgICAgICAgICBza2lwID0gc2tpcC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4geyBza2lwOiAoc2tpcCB8fCB0cnVlKSB9O1xuICAgIH1cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fCAodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgJiYgIXRoaXMuaW5QYXJlbnQoKSkgfHxcbiAgICAgICAgICAgICFub2RlLnNhbWVNYXJrdXAodGhpcy5ub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgaWYgKCh0aGlzLmRpcnR5ICE9IE5PVF9ESVJUWSB8fCBub2RlLnRleHQgIT0gdGhpcy5ub2RlLnRleHQpICYmIG5vZGUudGV4dCAhPSB0aGlzLm5vZGVET00ubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVET00ubm9kZVZhbHVlID0gbm9kZS50ZXh0O1xuICAgICAgICAgICAgaWYgKHZpZXcudHJhY2tXcml0ZXMgPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpblBhcmVudCgpIHtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9IHRoaXMucGFyZW50LmNvbnRlbnRET007XG4gICAgICAgIGZvciAobGV0IG4gPSB0aGlzLm5vZGVET007IG47IG4gPSBuLnBhcmVudE5vZGUpXG4gICAgICAgICAgICBpZiAobiA9PSBwYXJlbnRET00pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5ub2RlRE9NLCBvZmZzZXQ6IHBvcyB9O1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgaWYgKGRvbSA9PSB0aGlzLm5vZGVET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgTWF0aC5taW4ob2Zmc2V0LCB0aGlzLm5vZGUudGV4dC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gc3VwZXIubG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgIT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiO1xuICAgIH1cbiAgICBzbGljZShmcm9tLCB0bywgdmlldykge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMubm9kZS5jdXQoZnJvbSwgdG8pLCBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlLnRleHQpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRWaWV3RGVzYyh0aGlzLnBhcmVudCwgbm9kZSwgdGhpcy5vdXRlckRlY28sIHRoaXMuaW5uZXJEZWNvLCBkb20sIGRvbSwgdmlldyk7XG4gICAgfVxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBzdXBlci5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gdGhpcy5ub2RlRE9NICYmIChmcm9tID09IDAgfHwgdG8gPT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IE5PREVfRElSVFk7XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc1RleHQodGV4dCkgeyByZXR1cm4gdGhpcy5ub2RlLnRleHQgPT0gdGV4dDsgfVxufVxuLy8gQSBkdW1teSBkZXNjIHVzZWQgdG8gdGFnIHRyYWlsaW5nIEJSIG9yIElNRyBub2RlcyBjcmVhdGVkIHRvIHdvcmtcbi8vIGFyb3VuZCBjb250ZW50RWRpdGFibGUgdGVycmlibGVuZXNzLlxuY2xhc3MgVHJhaWxpbmdIYWNrVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4geyBpZ25vcmU6IHRydWUgfTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiB0aGlzLmRvbS5ub2RlTmFtZSA9PSBub2RlTmFtZTsgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpZ25vcmVGb3JDb29yZHMoKSB7IHJldHVybiB0aGlzLmRvbS5ub2RlTmFtZSA9PSBcIklNR1wiOyB9XG59XG4vLyBBIHNlcGFyYXRlIHN1YmNsYXNzIGlzIHVzZWQgZm9yIGN1c3RvbWl6ZWQgbm9kZSB2aWV3cywgc28gdGhhdCB0aGVcbi8vIGV4dHJhIGNoZWNrcyBvbmx5IGhhdmUgdG8gYmUgbWFkZSBmb3Igbm9kZXMgdGhhdCBhcmUgYWN0dWFsbHlcbi8vIGN1c3RvbWl6ZWQuXG5jbGFzcyBDdXN0b21Ob2RlVmlld0Rlc2MgZXh0ZW5kcyBOb2RlVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgc3BlYywgdmlldywgcG9zKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgdmlldywgcG9zKTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLy8gQSBjdXN0b20gYHVwZGF0ZWAgbWV0aG9kIGdldHMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHVwZGF0ZSBnb2VzXG4gICAgLy8gdGhyb3VnaC4gSWYgaXQgZG9lcywgYW5kIHRoZXJlJ3MgYSBgY29udGVudERPTWAgbm9kZSwgb3VyIGxvZ2ljXG4gICAgLy8gdXBkYXRlcyB0aGUgY2hpbGRyZW4uXG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnNwZWMudXBkYXRlICYmICh0aGlzLm5vZGUudHlwZSA9PSBub2RlLnR5cGUgfHwgdGhpcy5zcGVjLm11bHRpVHlwZSkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNwZWMudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRET00gJiYgIW5vZGUuaXNMZWFmKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICB0aGlzLnNwZWMuc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5zZWxlY3ROb2RlKCkgOiBzdXBlci5zZWxlY3ROb2RlKCk7XG4gICAgfVxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLmRlc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUoKSA6IHN1cGVyLmRlc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSkge1xuICAgICAgICB0aGlzLnNwZWMuc2V0U2VsZWN0aW9uID8gdGhpcy5zcGVjLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHZpZXcucm9vdClcbiAgICAgICAgICAgIDogc3VwZXIuc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveSgpO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHN0b3BFdmVudChldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLnN0b3BFdmVudCA/IHRoaXMuc3BlYy5zdG9wRXZlbnQoZXZlbnQpIDogZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24gPyB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24obXV0YXRpb24pIDogc3VwZXIuaWdub3JlTXV0YXRpb24obXV0YXRpb24pO1xuICAgIH1cbn1cbi8vIFN5bmMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBub2RlIHdpdGggdGhlIG5vZGVzIGFzc29jaWF0ZWRcbi8vIHdpdGggdGhlIGdpdmVuIGFycmF5IG9mIHZpZXcgZGVzY3MsIHJlY3Vyc2luZyBpbnRvIG1hcmsgZGVzY3Ncbi8vIGJlY2F1c2UgdGhpcyBzaG91bGQgc3luYyB0aGUgc3VidHJlZSBmb3IgYSB3aG9sZSBub2RlIGF0IGEgdGltZS5cbmZ1bmN0aW9uIHJlbmRlckRlc2NzKHBhcmVudERPTSwgZGVzY3MsIHZpZXcpIHtcbiAgICBsZXQgZG9tID0gcGFyZW50RE9NLmZpcnN0Q2hpbGQsIHdyaXR0ZW4gPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkZXNjID0gZGVzY3NbaV0sIGNoaWxkRE9NID0gZGVzYy5kb207XG4gICAgICAgIGlmIChjaGlsZERPTS5wYXJlbnROb2RlID09IHBhcmVudERPTSkge1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkRE9NICE9IGRvbSkge1xuICAgICAgICAgICAgICAgIGRvbSA9IHJtKGRvbSk7XG4gICAgICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20gPSBkb20ubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudERPTS5pbnNlcnRCZWZvcmUoY2hpbGRET00sIGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2MgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb20gPyBkb20ucHJldmlvdXNTaWJsaW5nIDogcGFyZW50RE9NLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIHJlbmRlckRlc2NzKGRlc2MuY29udGVudERPTSwgZGVzYy5jaGlsZHJlbiwgdmlldyk7XG4gICAgICAgICAgICBkb20gPSBwb3MgPyBwb3MubmV4dFNpYmxpbmcgOiBwYXJlbnRET00uZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoZG9tKSB7XG4gICAgICAgIGRvbSA9IHJtKGRvbSk7XG4gICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAod3JpdHRlbiAmJiB2aWV3LnRyYWNrV3JpdGVzID09IHBhcmVudERPTSlcbiAgICAgICAgdmlldy50cmFja1dyaXRlcyA9IG51bGw7XG59XG5jb25zdCBPdXRlckRlY29MZXZlbCA9IGZ1bmN0aW9uIChub2RlTmFtZSkge1xuICAgIGlmIChub2RlTmFtZSlcbiAgICAgICAgdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lO1xufTtcbk91dGVyRGVjb0xldmVsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBub0RlY28gPSBbbmV3IE91dGVyRGVjb0xldmVsXTtcbmZ1bmN0aW9uIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCBub2RlLCBuZWVkc1dyYXApIHtcbiAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbm9EZWNvO1xuICAgIGxldCB0b3AgPSBuZWVkc1dyYXAgPyBub0RlY29bMF0gOiBuZXcgT3V0ZXJEZWNvTGV2ZWwsIHJlc3VsdCA9IFt0b3BdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0ZXJEZWNvLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRycyA9IG91dGVyRGVjb1tpXS50eXBlLmF0dHJzO1xuICAgICAgICBpZiAoIWF0dHJzKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChhdHRycy5ub2RlTmFtZSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRvcCA9IG5ldyBPdXRlckRlY29MZXZlbChhdHRycy5ub2RlTmFtZSkpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gYXR0cnNbbmFtZV07XG4gICAgICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmVlZHNXcmFwICYmIHJlc3VsdC5sZW5ndGggPT0gMSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwobm9kZS5pc0lubGluZSA/IFwic3BhblwiIDogXCJkaXZcIikpO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiKVxuICAgICAgICAgICAgICAgIHRvcC5jbGFzcyA9ICh0b3AuY2xhc3MgPyB0b3AuY2xhc3MgKyBcIiBcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgdG9wLnN0eWxlID0gKHRvcC5zdHlsZSA/IHRvcC5zdHlsZSArIFwiO1wiIDogXCJcIikgKyB2YWw7XG4gICAgICAgICAgICBlbHNlIGlmIChuYW1lICE9IFwibm9kZU5hbWVcIilcbiAgICAgICAgICAgICAgICB0b3BbbmFtZV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhdGNoT3V0ZXJEZWNvKG91dGVyRE9NLCBub2RlRE9NLCBwcmV2Q29tcHV0ZWQsIGN1ckNvbXB1dGVkKSB7XG4gICAgLy8gU2hvcnRjdXQgZm9yIHRyaXZpYWwgY2FzZVxuICAgIGlmIChwcmV2Q29tcHV0ZWQgPT0gbm9EZWNvICYmIGN1ckNvbXB1dGVkID09IG5vRGVjbylcbiAgICAgICAgcmV0dXJuIG5vZGVET007XG4gICAgbGV0IGN1ckRPTSA9IG5vZGVET007XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJDb21wdXRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVjbyA9IGN1ckNvbXB1dGVkW2ldLCBwcmV2ID0gcHJldkNvbXB1dGVkW2ldO1xuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudDtcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYubm9kZU5hbWUgPT0gZGVjby5ub2RlTmFtZSAmJiBjdXJET00gIT0gb3V0ZXJET00gJiZcbiAgICAgICAgICAgICAgICAocGFyZW50ID0gY3VyRE9NLnBhcmVudE5vZGUpICYmIHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IGRlY28ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjdXJET00gPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRlY28ubm9kZU5hbWUpO1xuICAgICAgICAgICAgICAgIHBhcmVudC5wbUlzRGVjbyA9IHRydWU7XG4gICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgcHJldiA9IG5vRGVjb1swXTtcbiAgICAgICAgICAgICAgICBjdXJET00gPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hBdHRyaWJ1dGVzKGN1ckRPTSwgcHJldiB8fCBub0RlY29bMF0sIGRlY28pO1xuICAgIH1cbiAgICByZXR1cm4gY3VyRE9NO1xufVxuZnVuY3Rpb24gcGF0Y2hBdHRyaWJ1dGVzKGRvbSwgcHJldiwgY3VyKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICBpZiAobmFtZSAhPSBcImNsYXNzXCIgJiYgbmFtZSAhPSBcInN0eWxlXCIgJiYgbmFtZSAhPSBcIm5vZGVOYW1lXCIgJiYgIShuYW1lIGluIGN1cikpXG4gICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gY3VyKVxuICAgICAgICBpZiAobmFtZSAhPSBcImNsYXNzXCIgJiYgbmFtZSAhPSBcInN0eWxlXCIgJiYgbmFtZSAhPSBcIm5vZGVOYW1lXCIgJiYgY3VyW25hbWVdICE9IHByZXZbbmFtZV0pXG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGN1cltuYW1lXSk7XG4gICAgaWYgKHByZXYuY2xhc3MgIT0gY3VyLmNsYXNzKSB7XG4gICAgICAgIGxldCBwcmV2TGlzdCA9IHByZXYuY2xhc3MgPyBwcmV2LmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgbGV0IGN1ckxpc3QgPSBjdXIuY2xhc3MgPyBjdXIuY2xhc3Muc3BsaXQoXCIgXCIpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGN1ckxpc3QuaW5kZXhPZihwcmV2TGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5yZW1vdmUocHJldkxpc3RbaV0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ckxpc3QubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocHJldkxpc3QuaW5kZXhPZihjdXJMaXN0W2ldKSA9PSAtMSlcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZChjdXJMaXN0W2ldKTtcbiAgICAgICAgaWYgKGRvbS5jbGFzc0xpc3QubGVuZ3RoID09IDApXG4gICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICAgIGlmIChwcmV2LnN0eWxlICE9IGN1ci5zdHlsZSkge1xuICAgICAgICBpZiAocHJldi5zdHlsZSkge1xuICAgICAgICAgICAgbGV0IHByb3AgPSAvXFxzKihbXFx3XFwtXFx4YTEtXFx1ZmZmZl0rKVxccyo6KD86XCIoPzpcXFxcLnxbXlwiXSkqXCJ8Jyg/OlxcXFwufFteJ10pKid8XFwoLio/XFwpfFteO10pKi9nLCBtO1xuICAgICAgICAgICAgd2hpbGUgKG0gPSBwcm9wLmV4ZWMocHJldi5zdHlsZSkpXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KG1bMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXIuc3R5bGUpXG4gICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCArPSBjdXIuc3R5bGU7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlPdXRlckRlY28oZG9tLCBkZWNvLCBub2RlKSB7XG4gICAgcmV0dXJuIHBhdGNoT3V0ZXJEZWNvKGRvbSwgZG9tLCBub0RlY28sIGNvbXB1dGVPdXRlckRlY28oZGVjbywgbm9kZSwgZG9tLm5vZGVUeXBlICE9IDEpKTtcbn1cbmZ1bmN0aW9uIHNhbWVPdXRlckRlY28oYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLnR5cGUuZXEoYltpXS50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJlbW92ZSBhIERPTSBub2RlIGFuZCByZXR1cm4gaXRzIG5leHQgc2libGluZy5cbmZ1bmN0aW9uIHJtKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG4vLyBIZWxwZXIgY2xhc3MgZm9yIGluY3JlbWVudGFsbHkgdXBkYXRpbmcgYSB0cmVlIG9mIG1hcmsgZGVzY3MgYW5kXG4vLyB0aGUgd2lkZ2V0IGFuZCBub2RlIGRlc2NzIGluc2lkZSBvZiB0aGVtLlxuY2xhc3MgVmlld1RyZWVVcGRhdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b3AsIGxvY2ssIHZpZXcpIHtcbiAgICAgICAgdGhpcy5sb2NrID0gbG9jaztcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgLy8gSW5kZXggaW50byBgdGhpcy50b3BgJ3MgY2hpbGQgYXJyYXksIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uLlxuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgLy8gV2hlbiBlbnRlcmluZyBhIG1hcmssIHRoZSBjdXJyZW50IHRvcCBhbmQgaW5kZXggYXJlIHB1c2hlZFxuICAgICAgICAvLyBvbnRvIHRoaXMuXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgLy8gVHJhY2tzIHdoZXRoZXIgYW55dGhpbmcgd2FzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9wID0gdG9wO1xuICAgICAgICB0aGlzLnByZU1hdGNoID0gcHJlTWF0Y2godG9wLm5vZGUuY29udGVudCwgdG9wKTtcbiAgICB9XG4gICAgLy8gRGVzdHJveSBhbmQgcmVtb3ZlIHRoZSBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBnaXZlbiBpbmRpY2VzIGluXG4gICAgLy8gYHRoaXMudG9wYC5cbiAgICBkZXN0cm95QmV0d2VlbihzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmIChzdGFydCA9PSBlbmQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgdGhpcy50b3AuY2hpbGRyZW5baV0uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRGVzdHJveSBhbGwgcmVtYWluaW5nIGNoaWxkcmVuIGluIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveVJlc3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgLy8gU3luYyB0aGUgY3VycmVudCBzdGFjayBvZiBtYXJrIGRlc2NzIHdpdGggdGhlIGdpdmVuIGFycmF5IG9mXG4gICAgLy8gbWFya3MsIHJldXNpbmcgZXhpc3RpbmcgbWFyayBkZXNjcyB3aGVuIHBvc3NpYmxlLlxuICAgIHN5bmNUb01hcmtzKG1hcmtzLCBpbmxpbmUsIHZpZXcpIHtcbiAgICAgICAgbGV0IGtlZXAgPSAwLCBkZXB0aCA9IHRoaXMuc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICAgIGxldCBtYXhLZWVwID0gTWF0aC5taW4oZGVwdGgsIG1hcmtzLmxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChrZWVwIDwgbWF4S2VlcCAmJlxuICAgICAgICAgICAgKGtlZXAgPT0gZGVwdGggLSAxID8gdGhpcy50b3AgOiB0aGlzLnN0YWNrWyhrZWVwICsgMSkgPDwgMV0pXG4gICAgICAgICAgICAgICAgLm1hdGNoZXNNYXJrKG1hcmtzW2tlZXBdKSAmJiBtYXJrc1trZWVwXS50eXBlLnNwZWMuc3Bhbm5pbmcgIT09IGZhbHNlKVxuICAgICAgICAgICAga2VlcCsrO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IGRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnRvcC5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZGVwdGggPCBtYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLnRvcCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gLTE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IE1hdGgubWluKHRoaXMuaW5kZXggKyAzLCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lm1hdGNoZXNNYXJrKG1hcmtzW2RlcHRoXSkgJiYgIXRoaXMuaXNMb2NrZWQobmV4dC5kb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiB0aGlzLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgZm91bmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRvcCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmtEZXNjID0gTWFya1ZpZXdEZXNjLmNyZWF0ZSh0aGlzLnRvcCwgbWFya3NbZGVwdGhdLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4LCAwLCBtYXJrRGVzYyk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSBtYXJrRGVzYztcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgbm9kZSBkZXNjIG1hdGNoaW5nIHRoZSBnaXZlbiBkYXRhLiBTa2lwIG92ZXIgaXQgYW5kXG4gICAgLy8gcmV0dXJuIHRydWUgd2hlbiBzdWNjZXNzZnVsLlxuICAgIGZpbmROb2RlTWF0Y2gobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGluZGV4KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IC0xLCB0YXJnZXREZXNjO1xuICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5wcmVNYXRjaC5pbmRleCAmJlxuICAgICAgICAgICAgKHRhcmdldERlc2MgPSB0aGlzLnByZU1hdGNoLm1hdGNoZXNbaW5kZXggLSB0aGlzLnByZU1hdGNoLmluZGV4XSkucGFyZW50ID09IHRoaXMudG9wICYmXG4gICAgICAgICAgICB0YXJnZXREZXNjLm1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRvcC5jaGlsZHJlbi5pbmRleE9mKHRhcmdldERlc2MsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXgsIGUgPSBNYXRoLm1pbih0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGgsIGkgKyA1KTsgaSA8IGU7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykgJiYgIXRoaXMucHJlTWF0Y2gubWF0Y2hlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgZm91bmQpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB1cGRhdGVOb2RlQXQobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGluZGV4LCB2aWV3KSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkLmRpcnR5ID09IE5PREVfRElSVFkgJiYgY2hpbGQuZG9tID09IGNoaWxkLmNvbnRlbnRET00pXG4gICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgICAgIGlmICghY2hpbGQudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXN0cm95QmV0d2Vlbih0aGlzLmluZGV4LCBpbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZpbmRJbmRleFdpdGhDaGlsZChkb21Ob2RlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBkb21Ob2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09IHRoaXMudG9wLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGRvbU5vZGUucG1WaWV3RGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wLmNoaWxkcmVuW2ldID09IGRlc2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb21Ob2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byB1cGRhdGUgdGhlIG5leHQgbm9kZSwgaWYgYW55LCB0byB0aGUgZ2l2ZW4gZGF0YS4gQ2hlY2tzXG4gICAgLy8gcHJlLW1hdGNoZXMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgbm9kZXMgdGhhdCBjb3VsZCBzdGlsbCBiZSB1c2VkLlxuICAgIHVwZGF0ZU5leHROb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBpbmRleCwgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy50b3AuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE5vZGVWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgIGxldCBwcmVNYXRjaCA9IHRoaXMucHJlTWF0Y2gubWF0Y2hlZC5nZXQobmV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZU1hdGNoICE9IG51bGwgJiYgcHJlTWF0Y2ggIT0gaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dERPTSA9IG5leHQuZG9tLCB1cGRhdGVkO1xuICAgICAgICAgICAgICAgIC8vIENhbid0IHVwZGF0ZSBpZiBuZXh0RE9NIGlzIG9yIGNvbnRhaW5zIHRoaXMubG9jaywgZXhjZXB0IGlmXG4gICAgICAgICAgICAgICAgLy8gaXQncyBhIHRleHQgbm9kZSB3aG9zZSBjb250ZW50IGFscmVhZHkgbWF0Y2hlcyB0aGUgbmV3IHRleHRcbiAgICAgICAgICAgICAgICAvLyBhbmQgd2hvc2UgZGVjb3JhdGlvbnMgbWF0Y2ggdGhlIG5ldyBvbmVzLlxuICAgICAgICAgICAgICAgIGxldCBsb2NrZWQgPSB0aGlzLmlzTG9ja2VkKG5leHRET00pICYmXG4gICAgICAgICAgICAgICAgICAgICEobm9kZS5pc1RleHQgJiYgbmV4dC5ub2RlICYmIG5leHQubm9kZS5pc1RleHQgJiYgbmV4dC5ub2RlRE9NLm5vZGVWYWx1ZSA9PSBub2RlLnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuZGlydHkgIT0gTk9ERV9ESVJUWSAmJiBzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgbmV4dC5vdXRlckRlY28pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2tlZCAmJiBuZXh0LnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95QmV0d2Vlbih0aGlzLmluZGV4LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZG9tICE9IG5leHRET00pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbG9ja2VkICYmICh1cGRhdGVkID0gdGhpcy5yZWNyZWF0ZVdyYXBwZXIobmV4dCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdID0gdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLnVwZGF0ZUNoaWxkcmVuKHZpZXcsIHBvcyArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFdoZW4gYSBub2RlIHdpdGggY29udGVudCBpcyByZXBsYWNlZCBieSBhIGRpZmZlcmVudCBub2RlIHdpdGhcbiAgICAvLyBpZGVudGljYWwgY29udGVudCwgbW92ZSBvdmVyIGl0cyBjaGlsZHJlbi5cbiAgICByZWNyZWF0ZVdyYXBwZXIobmV4dCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBpZiAobmV4dC5kaXJ0eSB8fCBub2RlLmlzQXRvbSB8fCAhbmV4dC5jaGlsZHJlbi5sZW5ndGggfHxcbiAgICAgICAgICAgICFuZXh0Lm5vZGUuY29udGVudC5lcShub2RlLmNvbnRlbnQpIHx8XG4gICAgICAgICAgICAhc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSB8fCAhaW5uZXJEZWNvLmVxKG5leHQuaW5uZXJEZWNvKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgd3JhcHBlciA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAod3JhcHBlci5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIG5leHQuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIHdyYXBwZXIuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2gucGFyZW50ID0gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuICAgIC8vIEluc2VydCB0aGUgbm9kZSBhcyBhIG5ld2x5IGNyZWF0ZWQgbm9kZSBkZXNjLlxuICAgIGFkZE5vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgZGVzYyA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NKVxuICAgICAgICAgICAgZGVzYy51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5pbmRleCA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdIDogbnVsbDtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5tYXRjaGVzV2lkZ2V0KHdpZGdldCkgJiZcbiAgICAgICAgICAgICh3aWRnZXQgPT0gbmV4dC53aWRnZXQgfHwgIW5leHQud2lkZ2V0LnR5cGUudG9ET00ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gbmV3IFdpZGdldFZpZXdEZXNjKHRoaXMudG9wLCB3aWRnZXQsIHZpZXcsIHBvcyk7XG4gICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBkZXNjKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGEgdGV4dGJsb2NrIGxvb2tzIGFuZCBiZWhhdmVzIGNvcnJlY3RseSBpblxuICAgIC8vIGNvbnRlbnRFZGl0YWJsZS5cbiAgICBhZGRUZXh0YmxvY2tIYWNrcygpIHtcbiAgICAgICAgbGV0IGxhc3RDaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXggLSAxXSwgcGFyZW50ID0gdGhpcy50b3A7XG4gICAgICAgIHdoaWxlIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGxhc3RDaGlsZDtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0Q2hpbGQgfHwgLy8gRW1wdHkgdGV4dGJsb2NrXG4gICAgICAgICAgICAhKGxhc3RDaGlsZCBpbnN0YW5jZW9mIFRleHRWaWV3RGVzYykgfHxcbiAgICAgICAgICAgIC9cXG4kLy50ZXN0KGxhc3RDaGlsZC5ub2RlLnRleHQpIHx8XG4gICAgICAgICAgICAodGhpcy52aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSAmJiAvXFxzJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSkpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3MgaW4gU2FmYXJpJ3MgY3Vyc29yIGRyYXdpbmcgKCMxMTY1KSBhbmQgQ2hyb21lJ3MgbW91c2Ugc2VsZWN0aW9uICgjMTE1MilcbiAgICAgICAgICAgIGlmICgoc2FmYXJpIHx8IGNocm9tZSkgJiYgbGFzdENoaWxkICYmIGxhc3RDaGlsZC5kb20uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiSU1HXCIsIHBhcmVudCk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiQlJcIiwgdGhpcy50b3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEhhY2tOb2RlKG5vZGVOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcCAmJiB0aGlzLmluZGV4IDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0ubWF0Y2hlc0hhY2sobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICAgICAgICAgIGRvbS5hbHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci10cmFpbGluZ0JyZWFrXCI7XG4gICAgICAgICAgICBsZXQgaGFjayA9IG5ldyBUcmFpbGluZ0hhY2tWaWV3RGVzYyh0aGlzLnRvcCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMudG9wKVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKGhhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBoYWNrKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNMb2NrZWQobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrICYmIChub2RlID09IHRoaXMubG9jayB8fCBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jb250YWlucyh0aGlzLmxvY2sucGFyZW50Tm9kZSkpO1xuICAgIH1cbn1cbi8vIEl0ZXJhdGUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCBhbmQgYXJyYXkgb2YgZGVzY3MgdG8gZmluZFxuLy8gZGlyZWN0bHkgbWF0Y2hpbmcgb25lcywgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmVhZ2VybHkgcmV1c2luZyB0aG9zZVxuLy8gZm9yIG90aGVyIG5vZGVzLiBSZXR1cm5zIHRoZSBmcmFnbWVudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm9kZSB0aGF0XG4vLyBpcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBvZiBtYXRjaGVkIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlXG4vLyBmcmFnbWVudC5cbmZ1bmN0aW9uIHByZU1hdGNoKGZyYWcsIHBhcmVudERlc2MpIHtcbiAgICBsZXQgY3VyRGVzYyA9IHBhcmVudERlc2MsIGRlc2NJID0gY3VyRGVzYy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGZJID0gZnJhZy5jaGlsZENvdW50LCBtYXRjaGVkID0gbmV3IE1hcCwgbWF0Y2hlcyA9IFtdO1xuICAgIG91dGVyOiB3aGlsZSAoZkkgPiAwKSB7XG4gICAgICAgIGxldCBkZXNjO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoZGVzY0kpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1ckRlc2MuY2hpbGRyZW5bZGVzY0kgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE1hcmtWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjdXJEZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0kgPSBuZXh0LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICBkZXNjSS0tO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJEZXNjID09IHBhcmVudERlc2MpIHtcbiAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgZGVzY0kgPSBjdXJEZXNjLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGN1ckRlc2MpO1xuICAgICAgICAgICAgICAgIGN1ckRlc2MgPSBjdXJEZXNjLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IGRlc2Mubm9kZTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChub2RlICE9IGZyYWcuY2hpbGQoZkkgLSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAtLWZJO1xuICAgICAgICBtYXRjaGVkLnNldChkZXNjLCBmSSk7XG4gICAgICAgIG1hdGNoZXMucHVzaChkZXNjKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5kZXg6IGZJLCBtYXRjaGVkLCBtYXRjaGVzOiBtYXRjaGVzLnJldmVyc2UoKSB9O1xufVxuZnVuY3Rpb24gY29tcGFyZVNpZGUoYSwgYikge1xuICAgIHJldHVybiBhLnR5cGUuc2lkZSAtIGIudHlwZS5zaWRlO1xufVxuLy8gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgaXRlcmF0aW5nIG92ZXIgdGhlIG5vZGVzIGFuZCBkZWNvcmF0aW9ucyBpblxuLy8gYSBmcmFnbWVudC4gQ2FsbHMgYG9uTm9kZWAgZm9yIGVhY2ggbm9kZSwgd2l0aCBpdHMgbG9jYWwgYW5kIGNoaWxkXG4vLyBkZWNvcmF0aW9ucy4gU3BsaXRzIHRleHQgbm9kZXMgd2hlbiB0aGVyZSBpcyBhIGRlY29yYXRpb24gc3RhcnRpbmdcbi8vIG9yIGVuZGluZyBpbnNpZGUgb2YgdGhlbS4gQ2FsbHMgYG9uV2lkZ2V0YCBmb3IgZWFjaCB3aWRnZXQuXG5mdW5jdGlvbiBpdGVyRGVjbyhwYXJlbnQsIGRlY28sIG9uV2lkZ2V0LCBvbk5vZGUpIHtcbiAgICBsZXQgbG9jYWxzID0gZGVjby5sb2NhbHMocGFyZW50KSwgb2Zmc2V0ID0gMDtcbiAgICAvLyBTaW1wbGUsIGNoZWFwIHZhcmlhbnQgZm9yIHdoZW4gdGhlcmUgYXJlIG5vIGxvY2FsIGRlY29yYXRpb25zXG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPT0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5jaGlsZChpKTtcbiAgICAgICAgICAgIG9uTm9kZShjaGlsZCwgbG9jYWxzLCBkZWNvLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpLCBpKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkZWNvSW5kZXggPSAwLCBhY3RpdmUgPSBbXSwgcmVzdE5vZGUgPSBudWxsO1xuICAgIGZvciAobGV0IHBhcmVudEluZGV4ID0gMDs7KSB7XG4gICAgICAgIGxldCB3aWRnZXQsIHdpZGdldHM7XG4gICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvID09IG9mZnNldCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBsb2NhbHNbZGVjb0luZGV4KytdO1xuICAgICAgICAgICAgaWYgKG5leHQud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAod2lkZ2V0cyB8fCAod2lkZ2V0cyA9IFt3aWRnZXRdKSkucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkZ2V0KSB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHdpZGdldHMuc29ydChjb21wYXJlU2lkZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXRzW2ldLCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXQsIHBhcmVudEluZGV4LCAhIXJlc3ROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hpbGQsIGluZGV4O1xuICAgICAgICBpZiAocmVzdE5vZGUpIHtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjaGlsZCA9IHJlc3ROb2RlO1xuICAgICAgICAgICAgcmVzdE5vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgcGFyZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5jaGlsZChwYXJlbnRJbmRleCsrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDw9IG9mZnNldCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA+IG9mZnNldClcbiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGxvY2Fsc1tkZWNvSW5kZXgrK10pO1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBjdXRBdCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLmZyb20gPCBjdXRBdClcbiAgICAgICAgICAgICAgICBjdXRBdCA9IGxvY2Fsc1tkZWNvSW5kZXhdLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlW2ldLnRvIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgICAgIGN1dEF0ID0gYWN0aXZlW2ldLnRvO1xuICAgICAgICAgICAgaWYgKGN1dEF0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdE5vZGUgPSBjaGlsZC5jdXQoY3V0QXQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KDAsIGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSBjdXRBdDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGRlY29JbmRleCA8IGxvY2Fscy5sZW5ndGggJiYgbG9jYWxzW2RlY29JbmRleF0udG8gPCBlbmQpXG4gICAgICAgICAgICAgICAgZGVjb0luZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG91dGVyRGVjbyA9IGNoaWxkLmlzSW5saW5lICYmICFjaGlsZC5pc0xlYWYgPyBhY3RpdmUuZmlsdGVyKGQgPT4gIWQuaW5saW5lKSA6IGFjdGl2ZS5zbGljZSgpO1xuICAgICAgICBvbk5vZGUoY2hpbGQsIG91dGVyRGVjbywgZGVjby5mb3JDaGlsZChvZmZzZXQsIGNoaWxkKSwgaW5kZXgpO1xuICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgfVxufVxuLy8gTGlzdCBtYXJrZXJzIGluIE1vYmlsZSBTYWZhcmkgd2lsbCBteXN0ZXJpb3VzbHkgZGlzYXBwZWFyXG4vLyBzb21ldGltZXMuIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQuXG5mdW5jdGlvbiBpb3NIYWNrcyhkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiVUxcIiB8fCBkb20ubm9kZU5hbWUgPT0gXCJPTFwiKSB7XG4gICAgICAgIGxldCBvbGRDU1MgPSBkb20uc3R5bGUuY3NzVGV4dDtcbiAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBvbGRDU1MgKyBcIjsgbGlzdC1zdHlsZTogc3F1YXJlICFpbXBvcnRhbnRcIjtcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tKS5saXN0U3R5bGU7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTO1xuICAgIH1cbn1cbi8vIEZpbmQgYSBwaWVjZSBvZiB0ZXh0IGluIGFuIGlubGluZSBmcmFnbWVudCwgb3ZlcmxhcHBpbmcgZnJvbS10b1xuZnVuY3Rpb24gZmluZFRleHRJbkZyYWdtZW50KGZyYWcsIHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCBmcmFnLmNoaWxkQ291bnQgJiYgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgY2hpbGQgPSBmcmFnLmNoaWxkKGkrKyksIGNoaWxkU3RhcnQgPSBwb3M7XG4gICAgICAgIHBvcyArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKCFjaGlsZC5pc1RleHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHN0ciA9IGNoaWxkLnRleHQ7XG4gICAgICAgIHdoaWxlIChpIDwgZnJhZy5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZyYWcuY2hpbGQoaSsrKTtcbiAgICAgICAgICAgIHBvcyArPSBuZXh0Lm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKCFuZXh0LmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0ciArPSBuZXh0LnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICBpZiAocG9zID49IHRvICYmIHN0ci5zbGljZSh0byAtIHRleHQubGVuZ3RoIC0gY2hpbGRTdGFydCwgdG8gLSBjaGlsZFN0YXJ0KSA9PSB0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0byAtIHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY2hpbGRTdGFydCA8IHRvID8gc3RyLmxhc3RJbmRleE9mKHRleHQsIHRvIC0gY2hpbGRTdGFydCAtIDEpIDogLTE7XG4gICAgICAgICAgICBpZiAoZm91bmQgPj0gMCAmJiBmb3VuZCArIHRleHQubGVuZ3RoICsgY2hpbGRTdGFydCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZFN0YXJ0ICsgZm91bmQ7XG4gICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBzdHIubGVuZ3RoID49ICh0byArIHRleHQubGVuZ3RoKSAtIGNoaWxkU3RhcnQgJiZcbiAgICAgICAgICAgICAgICBzdHIuc2xpY2UodG8gLSBjaGlsZFN0YXJ0LCB0byAtIGNoaWxkU3RhcnQgKyB0ZXh0Lmxlbmd0aCkgPT0gdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdG87XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLy8gUmVwbGFjZSByYW5nZSBmcm9tLXRvIGluIGFuIGFycmF5IG9mIHZpZXcgZGVzY3Mgd2l0aCByZXBsYWNlbWVudFxuLy8gKG1heSBiZSBudWxsIHRvIGp1c3QgZGVsZXRlKS4gVGhpcyBnb2VzIHZlcnkgbXVjaCBhZ2FpbnN0IHRoZSBncmFpblxuLy8gb2YgdGhlIHJlc3Qgb2YgdGhpcyBjb2RlLCB3aGljaCB0ZW5kcyB0byBjcmVhdGUgbm9kZXMgd2l0aCB0aGVcbi8vIHJpZ2h0IHNoYXBlIGluIG9uZSBnbywgcmF0aGVyIHRoYW4gbWVzc2luZyB3aXRoIHRoZW0gYWZ0ZXJcbi8vIGNyZWF0aW9uLCBidXQgaXMgbmVjZXNzYXJ5IGluIHRoZSBjb21wb3NpdGlvbiBoYWNrLlxuZnVuY3Rpb24gcmVwbGFjZU5vZGVzKG5vZGVzLCBmcm9tLCB0bywgdmlldywgcmVwbGFjZW1lbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2Rlc1tpXSwgc3RhcnQgPSBvZmYsIGVuZCA9IG9mZiArPSBjaGlsZC5zaXplO1xuICAgICAgICBpZiAoc3RhcnQgPj0gdG8gfHwgZW5kIDw9IGZyb20pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQuc2xpY2UoMCwgZnJvbSAtIHN0YXJ0LCB2aWV3KSk7XG4gICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQuc2xpY2UodG8gLSBzdGFydCwgY2hpbGQuc2l6ZSwgdmlldykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21ET00odmlldywgb3JpZ2luID0gbnVsbCkge1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCksIGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGlmICghZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG5lYXJlc3REZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGRvbVNlbC5mb2N1c05vZGUpLCBpbldpZGdldCA9IG5lYXJlc3REZXNjICYmIG5lYXJlc3REZXNjLnNpemUgPT0gMDtcbiAgICBsZXQgaGVhZCA9IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgMSk7XG4gICAgaWYgKGhlYWQgPCAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgJGhlYWQgPSBkb2MucmVzb2x2ZShoZWFkKSwgYW5jaG9yLCBzZWxlY3Rpb247XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChkb21TZWwpKSB7XG4gICAgICAgIGFuY2hvciA9IGhlYWQ7XG4gICAgICAgIHdoaWxlIChuZWFyZXN0RGVzYyAmJiAhbmVhcmVzdERlc2Mubm9kZSlcbiAgICAgICAgICAgIG5lYXJlc3REZXNjID0gbmVhcmVzdERlc2MucGFyZW50O1xuICAgICAgICBsZXQgbmVhcmVzdERlc2NOb2RlID0gbmVhcmVzdERlc2Mubm9kZTtcbiAgICAgICAgaWYgKG5lYXJlc3REZXNjICYmIG5lYXJlc3REZXNjTm9kZS5pc0F0b20gJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobmVhcmVzdERlc2NOb2RlKSAmJiBuZWFyZXN0RGVzYy5wYXJlbnRcbiAgICAgICAgICAgICYmICEobmVhcmVzdERlc2NOb2RlLmlzSW5saW5lICYmIGlzT25FZGdlKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgbmVhcmVzdERlc2MuZG9tKSkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBuZWFyZXN0RGVzYy5wb3NCZWZvcmU7XG4gICAgICAgICAgICBzZWxlY3Rpb24gPSBuZXcgTm9kZVNlbGVjdGlvbihoZWFkID09IHBvcyA/ICRoZWFkIDogZG9jLnJlc29sdmUocG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChkb21TZWwgaW5zdGFuY2VvZiB2aWV3LmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LlNlbGVjdGlvbiAmJiBkb21TZWwucmFuZ2VDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGxldCBtaW4gPSBoZWFkLCBtYXggPSBoZWFkO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21TZWwucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9tU2VsLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQsIDEpKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0LCAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pbiA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBbYW5jaG9yLCBoZWFkXSA9IG1heCA9PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IgPyBbbWF4LCBtaW5dIDogW21pbiwgbWF4XTtcbiAgICAgICAgICAgICRoZWFkID0gZG9jLnJlc29sdmUoaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IgPSB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuY2hvciA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShhbmNob3IpO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBiaWFzID0gb3JpZ2luID09IFwicG9pbnRlclwiIHx8ICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkIDwgJGhlYWQucG9zICYmICFpbldpZGdldCkgPyAxIDogLTE7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkJldHdlZW4odmlldywgJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uO1xufVxuZnVuY3Rpb24gZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB7XG4gICAgcmV0dXJuIHZpZXcuZWRpdGFibGUgPyB2aWV3Lmhhc0ZvY3VzKCkgOlxuICAgICAgICBoYXNTZWxlY3Rpb24odmlldykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNvbnRhaW5zKHZpZXcuZG9tKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvRE9NKHZpZXcsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgc3luY05vZGVTZWxlY3Rpb24odmlldywgc2VsKTtcbiAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBUaGUgZGVsYXllZCBkcmFnIHNlbGVjdGlvbiBjYXVzZXMgaXNzdWVzIHdpdGggQ2VsbCBTZWxlY3Rpb25zXG4gICAgLy8gaW4gU2FmYXJpLiBBbmQgdGhlIGRyYWcgc2VsZWN0aW9uIGRlbGF5IGlzIHRvIHdvcmthcm9uZCBpc3N1ZXNcbiAgICAvLyB3aGljaCBvbmx5IHByZXNlbnQgaW4gQ2hyb21lLlxuICAgIGlmICghZm9yY2UgJiYgdmlldy5pbnB1dC5tb3VzZURvd24gJiYgdmlldy5pbnB1dC5tb3VzZURvd24uYWxsb3dEZWZhdWx0ICYmIGNocm9tZSkge1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBjdXJTZWwgPSB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAmJiBjdXJTZWwuYW5jaG9yTm9kZSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIGN1clNlbC5hbmNob3JOb2RlLCBjdXJTZWwuYW5jaG9yT2Zmc2V0KSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZGVsYXllZFNlbGVjdGlvblN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKSB7XG4gICAgICAgIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBhbmNob3IsIGhlYWQgfSA9IHNlbCwgcmVzZXRFZGl0YWJsZUZyb20sIHJlc2V0RWRpdGFibGVUbztcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlICYmICEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghc2VsLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGVGcm9tID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLmZyb20pO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkgJiYgIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlVG8gPSB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBzZWwudG8pO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZG9jVmlldy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSk7XG4gICAgICAgIGlmIChicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSkge1xuICAgICAgICAgICAgaWYgKHJlc2V0RWRpdGFibGVGcm9tKVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGUocmVzZXRFZGl0YWJsZUZyb20pO1xuICAgICAgICAgICAgaWYgKHJlc2V0RWRpdGFibGVUbylcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlKHJlc2V0RWRpdGFibGVUbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbC52aXNpYmxlKSB7XG4gICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKFwib25zZWxlY3Rpb25jaGFuZ2VcIiBpbiBkb2N1bWVudClcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc09uU2VsZWN0aW9uQ2hhbmdlKHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgdmlldy5kb21PYnNlcnZlci5jb25uZWN0U2VsZWN0aW9uKCk7XG59XG4vLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgV2Via2l0IG5vdCBhbGxvd2luZyBhIHNlbGVjdGlvbiB0byBzdGFydC9lbmRcbi8vIGJldHdlZW4gbm9uLWVkaXRhYmxlIGJsb2NrIG5vZGVzLiBXZSBicmllZmx5IG1ha2Ugc29tZXRoaW5nXG4vLyBlZGl0YWJsZSwgc2V0IHRoZSBzZWxlY3Rpb24sIHRoZW4gc2V0IGl0IHVuZWRpdGFibGUgYWdhaW4uXG5jb25zdCBicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSA9IHNhZmFyaSB8fCBjaHJvbWUgJiYgY2hyb21lX3ZlcnNpb24gPCA2MztcbmZ1bmN0aW9uIHRlbXBvcmFyaWx5RWRpdGFibGVOZWFyKHZpZXcsIHBvcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICBsZXQgYWZ0ZXIgPSBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID8gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0gOiBudWxsO1xuICAgIGxldCBiZWZvcmUgPSBvZmZzZXQgPyBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0gOiBudWxsO1xuICAgIGlmIChzYWZhcmkgJiYgYWZ0ZXIgJiYgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGFmdGVyKTtcbiAgICBpZiAoKCFhZnRlciB8fCBhZnRlci5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSAmJlxuICAgICAgICAoIWJlZm9yZSB8fCBiZWZvcmUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgaWYgKGFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGFmdGVyKTtcbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlKVxuICAgICAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGJlZm9yZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0RWRpdGFibGUoZWxlbWVudCkge1xuICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaWYgKHNhZmFyaSAmJiBlbGVtZW50LmRyYWdnYWJsZSkge1xuICAgICAgICBlbGVtZW50LmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBlbGVtZW50Lndhc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xufVxuZnVuY3Rpb24gcmVzZXRFZGl0YWJsZShlbGVtZW50KSB7XG4gICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgaWYgKGVsZW1lbnQud2FzRHJhZ2dhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgZWxlbWVudC53YXNEcmFnZ2FibGUgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzT25TZWxlY3Rpb25DaGFuZ2Uodmlldykge1xuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gZG9tU2VsLmFuY2hvck5vZGUsIG9mZnNldCA9IGRvbVNlbC5hbmNob3JPZmZzZXQ7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAhPSBub2RlIHx8IGRvbVNlbC5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgICAgICB9LCAyMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldykge1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpLCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgaWYgKCFkb21TZWwpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbm9kZSA9IHZpZXcuY3Vyc29yV3JhcHBlci5kb20sIGltZyA9IG5vZGUubm9kZU5hbWUgPT0gXCJJTUdcIjtcbiAgICBpZiAoaW1nKVxuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLnBhcmVudE5vZGUsIGRvbUluZGV4KG5vZGUpICsgMSk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCAwKTtcbiAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAvLyBLbHVkZ2UgdG8ga2lsbCAnY29udHJvbCBzZWxlY3Rpb24nIGluIElFMTEgd2hlbiBzZWxlY3RpbmcgYW5cbiAgICAvLyBpbnZpc2libGUgY3Vyc29yIHdyYXBwZXIsIHNpbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIHRob3NlIHdlaXJkXG4gICAgLy8gcmVzaXplIGhhbmRsZXMgYW5kIGEgc2VsZWN0aW9uIHRoYXQgY29uc2lkZXJzIHRoZSBhYnNvbHV0ZWx5XG4gICAgLy8gcG9zaXRpb25lZCB3cmFwcGVyLCByYXRoZXIgdGhhbiB0aGUgcm9vdCBlZGl0YWJsZSBub2RlLCB0aGVcbiAgICAvLyBmb2N1c2VkIGVsZW1lbnQuXG4gICAgaWYgKCFpbWcgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiYgaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSkge1xuICAgICAgICBub2RlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCkge1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChzZWwuZnJvbSk7XG4gICAgICAgIGlmIChkZXNjICE9IHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICAgICAgICAgIGlmIChkZXNjKVxuICAgICAgICAgICAgICAgIGRlc2Muc2VsZWN0Tm9kZSgpO1xuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IGRlc2M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICB9XG59XG4vLyBDbGVhciBhbGwgRE9NIHN0YXRlZnVsbmVzcyBvZiB0aGUgbGFzdCBub2RlIHNlbGVjdGlvbi5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MucGFyZW50KVxuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYy5kZXNlbGVjdE5vZGUoKTtcbiAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKSB7XG4gICAgcmV0dXJuIHZpZXcuc29tZVByb3AoXCJjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuXCIsIGYgPT4gZih2aWV3LCAkYW5jaG9yLCAkaGVhZCkpXG4gICAgICAgIHx8IFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcyk7XG59XG5mdW5jdGlvbiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuZWRpdGFibGUgJiYgIXZpZXcuaGFzRm9jdXMoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBoYXNTZWxlY3Rpb24odmlldyk7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24odmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gdmlldy5kb20uY29udGFpbnMoc2VsLmFuY2hvck5vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5hbmNob3JOb2RlLnBhcmVudE5vZGUgOiBzZWwuYW5jaG9yTm9kZSkgJiZcbiAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8IHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5mb2N1c05vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5mb2N1c05vZGUucGFyZW50Tm9kZSA6IHNlbC5mb2N1c05vZGUpKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFuY2hvckluUmlnaHRQbGFjZSh2aWV3KSB7XG4gICAgbGV0IGFuY2hvckRPTSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciwgMCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICByZXR1cm4gaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkYW5jaG9yLCAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkc2lkZSA9IGRpciA+IDAgPyAkYW5jaG9yLm1heCgkaGVhZCkgOiAkYW5jaG9yLm1pbigkaGVhZCk7XG4gICAgbGV0ICRzdGFydCA9ICEkc2lkZS5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRzaWRlIDogJHNpZGUuZGVwdGggPyBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHNpZGUuYWZ0ZXIoKSA6ICRzaWRlLmJlZm9yZSgpKSA6IG51bGw7XG4gICAgcmV0dXJuICRzdGFydCAmJiBTZWxlY3Rpb24uZmluZEZyb20oJHN0YXJ0LCBkaXIpO1xufVxuZnVuY3Rpb24gYXBwbHkodmlldywgc2VsKSB7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykge1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikge1xuICAgICAgICBpZiAobW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyAkaGVhZCB9ID0gc2VsLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dCB8fCAhbm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRuZXdIZWFkID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSgkaGVhZC5wb3MgKyBub2RlLm5vZGVTaXplICogKGRpciA8IDAgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihzZWwuJGFuY2hvciwgJG5ld0hlYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShtYWMgJiYgbW9kcy5pbmRleE9mKFwibVwiKSA+IC0xKSkge1xuICAgICAgICAgICAgbGV0ICRoZWFkID0gc2VsLiRoZWFkLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlciwgZGVzYztcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbm9kZVBvcyA9IGRpciA8IDAgPyAkaGVhZC5wb3MgLSBub2RlLm5vZGVTaXplIDogJGhlYWQucG9zO1xuICAgICAgICAgICAgaWYgKCEobm9kZS5pc0F0b20gfHwgKGRlc2MgPSB2aWV3LmRvY1ZpZXcuZGVzY0F0KG5vZGVQb3MpKSAmJiAhZGVzYy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IE5vZGVTZWxlY3Rpb24oZGlyIDwgMCA/IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSkgOiAkaGVhZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2Via2l0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgd2lsbCBpbnRyb2R1Y2UgZXh0cmEgcG9pbnRsZXNzIGN1cnNvclxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9ucyBhcm91bmQgaW5saW5lIHVuZWRpdGFibGUgbm9kZXMsIHNvIHdlIGhhdmUgdG9cbiAgICAgICAgICAgICAgICAvLyB0YWtlIG92ZXIgYW5kIG1vdmUgdGhlIGN1cnNvciBwYXN0IHRoZW0gKCM5MzcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBUZXh0U2VsZWN0aW9uKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZGlyIDwgMCA/IG5vZGVQb3MgOiBub2RlUG9zICsgbm9kZS5ub2RlU2l6ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbC5ub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihkaXIgPiAwID8gc2VsLiR0byA6IHNlbC4kZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub2RlTGVuKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGlzSWdub3JhYmxlKGRvbSwgZGlyKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLnNpemUgPT0gMCAmJiAoZGlyIDwgMCB8fCBkb20ubmV4dFNpYmxpbmcgfHwgZG9tLm5vZGVOYW1lICE9IFwiQlJcIik7XG59XG5mdW5jdGlvbiBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcikge1xuICAgIHJldHVybiBkaXIgPCAwID8gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSA6IHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGFmdGVyIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLCB3aGljaCB3aWxsIGNvbmZ1c2UgdGhlIGJyb3dzZXIncyBjdXJzb3IgbW90aW9uIGxvZ2ljLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQsIGZvcmNlID0gZmFsc2U7XG4gICAgLy8gR2Vja28gd2lsbCBkbyBvZGQgdGhpbmdzIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBkaXJlY3RseSBpbiBmcm9udFxuICAgIC8vIG9mIGEgbm9uLWVkaXRhYmxlIG5vZGUsIHNvIGluIHRoYXQgY2FzZSwgbW92ZSBpdCBpbnRvIHRoZSBuZXh0XG4gICAgLy8gbm9kZSBpZiBwb3NzaWJsZS4gSXNzdWUgcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3IjODMyLlxuICAgIGlmIChnZWNrbyAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZUxlbihub2RlKSAmJiBpc0lnbm9yYWJsZShub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSwgLTEpKVxuICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYmVmb3JlLCAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0ID0gLS1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHByZXYgJiYgaXNJZ25vcmFibGUocHJldiwgLTEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KHByZXYpO1xuICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJldikge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JjZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuLy8gTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXNuJ3QgZGlyZWN0bHkgYmVmb3JlIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0FmdGVyKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgIGxldCBtb3ZlTm9kZSwgbW92ZU9mZnNldDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChpc0lnbm9yYWJsZShhZnRlciwgMSkpIHtcbiAgICAgICAgICAgICAgICBtb3ZlTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9ICsrb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQmxvY2tOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIGlzSWdub3JhYmxlKG5leHQsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBuZXh0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KG5leHQpICsgMTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlbiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGVMZW4obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vdmVOb2RlKVxuICAgICAgICBzZXRTZWxGb2N1cyh2aWV3LCBtb3ZlTm9kZSwgbW92ZU9mZnNldCk7XG59XG5mdW5jdGlvbiBpc0Jsb2NrTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaztcbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZShub2RlLCBvZmZzZXQpIHtcbiAgICB3aGlsZSAobm9kZSAmJiAhb2Zmc2V0ICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCkge1xuICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRTZWxGb2N1cyh2aWV3LCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgICAgICBpZiAoYWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBhZnRlcjtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlID0gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgbm9kZSA9IGJlZm9yZTtcbiAgICAgICAgICAgIG9mZnNldCA9IGJlZm9yZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChzZWwpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBvZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBvZmZzZXQpO1xuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbC5leHRlbmQpIHtcbiAgICAgICAgc2VsLmV4dGVuZChub2RlLCBvZmZzZXQpO1xuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3O1xuICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBlbmRzIHVwIGhhcHBlbmluZywgcmVzZXQgdGhlIHNlbGVjdGlvbi5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUgPT0gc3RhdGUpXG4gICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBmaW5kRGlyZWN0aW9uKHZpZXcsIHBvcykge1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICghKGNocm9tZSB8fCB3aW5kb3dzKSAmJiAkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgIGlmIChwb3MgPiAkcG9zLnN0YXJ0KCkpIHtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyAtIDEpO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChiZWZvcmUudG9wICsgYmVmb3JlLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhiZWZvcmUubGVmdCAtIGNvb3Jkcy5sZWZ0KSA+IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJlZm9yZS5sZWZ0IDwgY29vcmRzLmxlZnQgPyBcImx0clwiIDogXCJydGxcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zIDwgJHBvcy5lbmQoKSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gdmlldy5jb29yZHNBdFBvcyhwb3MgKyAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYWZ0ZXIudG9wICsgYWZ0ZXIuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICBpZiAobWlkID4gY29vcmRzLnRvcCAmJiBtaWQgPCBjb29yZHMuYm90dG9tICYmIE1hdGguYWJzKGFmdGVyLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlci5sZWZ0ID4gY29vcmRzLmxlZnQgPyBcImx0clwiIDogXCJydGxcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQgPSBnZXRDb21wdXRlZFN0eWxlKHZpZXcuZG9tKS5kaXJlY3Rpb247XG4gICAgcmV0dXJuIGNvbXB1dGVkID09IFwicnRsXCIgPyBcInJ0bFwiIDogXCJsdHJcIjtcbn1cbi8vIENoZWNrIHdoZXRoZXIgdmVydGljYWwgc2VsZWN0aW9uIG1vdGlvbiB3b3VsZCBpbnZvbHZlIG5vZGVcbi8vIHNlbGVjdGlvbnMuIElmIHNvLCBhcHBseSBpdCAoaWYgbm90LCB0aGUgcmVzdWx0IGlzIGxlZnQgdG8gdGhlXG4vLyBicm93c2VyKVxuZnVuY3Rpb24gc2VsZWN0VmVydGljYWxseSh2aWV3LCBkaXIsIG1vZHMpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgIXNlbC5lbXB0eSB8fCBtb2RzLmluZGV4T2YoXCJzXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFjICYmIG1vZHMuaW5kZXhPZihcIm1cIikgPiAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHNlbDtcbiAgICBpZiAoISRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50IHx8IHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyIDwgMCA/IFwidXBcIiA6IFwiZG93blwiKSkge1xuICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICBpZiAobmV4dCAmJiAobmV4dCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pKVxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgIH1cbiAgICBpZiAoISRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGxldCBzaWRlID0gZGlyIDwgMCA/ICRmcm9tIDogJHRvO1xuICAgICAgICBsZXQgYmV5b25kID0gc2VsIGluc3RhbmNlb2YgQWxsU2VsZWN0aW9uID8gU2VsZWN0aW9uLm5lYXIoc2lkZSwgZGlyKSA6IFNlbGVjdGlvbi5maW5kRnJvbShzaWRlLCBkaXIpO1xuICAgICAgICByZXR1cm4gYmV5b25kID8gYXBwbHkodmlldywgYmV5b25kKSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzdG9wTmF0aXZlSG9yaXpvbnRhbERlbGV0ZSh2aWV3LCBkaXIpIHtcbiAgICBpZiAoISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgeyAkaGVhZCwgJGFuY2hvciwgZW1wdHkgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQuc2FtZVBhcmVudCgkYW5jaG9yKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFlbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA+IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBuZXh0Tm9kZSA9ICEkaGVhZC50ZXh0T2Zmc2V0ICYmIChkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcik7XG4gICAgaWYgKG5leHROb2RlICYmICFuZXh0Tm9kZS5pc1RleHQpIHtcbiAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zIC0gbmV4dE5vZGUubm9kZVNpemUsICRoZWFkLnBvcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgkaGVhZC5wb3MsICRoZWFkLnBvcyArIG5leHROb2RlLm5vZGVTaXplKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBub2RlLCBzdGF0ZSkge1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgIG5vZGUuY29udGVudEVkaXRhYmxlID0gc3RhdGU7XG4gICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xufVxuLy8gSXNzdWUgIzg2NyAvICMxMDkwIC8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTAzODIxXG4vLyBJbiB3aGljaCBTYWZhcmkgKGFuZCBhdCBzb21lIHBvaW50IGluIHRoZSBwYXN0LCBDaHJvbWUpIGRvZXMgcmVhbGx5XG4vLyB3cm9uZyB0aGluZ3Mgd2hlbiB0aGUgZG93biBhcnJvdyBpcyBwcmVzc2VkIHdoZW4gdGhlIGN1cnNvciBpc1xuLy8gZGlyZWN0bHkgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGFuZCBoYXMgYW4gdW5lZGl0YWJsZSBub2RlXG4vLyBhZnRlciBpdFxuZnVuY3Rpb24gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHtcbiAgICBpZiAoIXNhZmFyaSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kaGVhZC5wYXJlbnRPZmZzZXQgPiAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHsgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9ID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGlmIChmb2N1c05vZGUgJiYgZm9jdXNOb2RlLm5vZGVUeXBlID09IDEgJiYgZm9jdXNPZmZzZXQgPT0gMCAmJlxuICAgICAgICBmb2N1c05vZGUuZmlyc3RDaGlsZCAmJiBmb2N1c05vZGUuZmlyc3RDaGlsZC5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGZvY3VzTm9kZS5maXJzdENoaWxkO1xuICAgICAgICBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJ0cnVlXCIpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHN3aXRjaEVkaXRhYmxlKHZpZXcsIGNoaWxkLCBcImZhbHNlXCIpLCAyMCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIEEgYmFja2Ryb3Aga2V5IG1hcHBpbmcgdXNlZCB0byBtYWtlIHN1cmUgd2UgYWx3YXlzIHN1cHByZXNzIGtleXNcbi8vIHRoYXQgaGF2ZSBhIGRhbmdlcm91cyBkZWZhdWx0IGVmZmVjdCwgZXZlbiBpZiB0aGUgY29tbWFuZHMgdGhleSBhcmVcbi8vIGJvdW5kIHRvIHJldHVybiBmYWxzZSwgYW5kIHRvIG1ha2Ugc3VyZSB0aGF0IGN1cnNvci1tb3Rpb24ga2V5c1xuLy8gZmluZCBhIGN1cnNvciAoYXMgb3Bwb3NlZCB0byBhIG5vZGUgc2VsZWN0aW9uKSB3aGVuIHByZXNzZWQuIEZvclxuLy8gY3Vyc29yLW1vdGlvbiBrZXlzLCB0aGUgY29kZSBpbiB0aGUgaGFuZGxlcnMgYWxzbyB0YWtlcyBjYXJlIG9mXG4vLyBibG9jayBzZWxlY3Rpb25zLlxuZnVuY3Rpb24gZ2V0TW9kcyhldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJjXCI7XG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpXG4gICAgICAgIHJlc3VsdCArPSBcIm1cIjtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJhXCI7XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJzXCI7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNhcHR1cmVLZXlEb3duKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGNvZGUgPSBldmVudC5rZXlDb2RlLCBtb2RzID0gZ2V0TW9kcyhldmVudCk7XG4gICAgaWYgKGNvZGUgPT0gOCB8fCAobWFjICYmIGNvZGUgPT0gNzIgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gQmFja3NwYWNlLCBDdHJsLWggb24gTWFjXG4gICAgICAgIHJldHVybiBzdG9wTmF0aXZlSG9yaXpvbnRhbERlbGV0ZSh2aWV3LCAtMSkgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChjb2RlID09IDQ2ICYmICFldmVudC5zaGlmdEtleSkgfHwgKG1hYyAmJiBjb2RlID09IDY4ICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIERlbGV0ZSwgQ3RybC1kIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgMSkgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAxMyB8fCBjb2RlID09IDI3KSB7IC8vIEVudGVyLCBFc2NcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzcgfHwgKG1hYyAmJiBjb2RlID09IDY2ICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIExlZnQgYXJyb3csIEN0cmwtYiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzcgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gLTEgOiAxKSA6IC0xO1xuICAgICAgICByZXR1cm4gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCBkaXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM5IHx8IChtYWMgJiYgY29kZSA9PSA3MCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBSaWdodCBhcnJvdywgQ3RybC1mIG9uIE1hY1xuICAgICAgICBsZXQgZGlyID0gY29kZSA9PSAzOSA/IChmaW5kRGlyZWN0aW9uKHZpZXcsIHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20pID09IFwibHRyXCIgPyAxIDogLTEpIDogMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOCB8fCAobWFjICYmIGNvZGUgPT0gODAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gVXAgYXJyb3csIEN0cmwtcCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHNlbGVjdFZlcnRpY2FsbHkodmlldywgLTEsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDQwIHx8IChtYWMgJiYgY29kZSA9PSA3OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEb3duIGFycm93LCBDdHJsLW4gb24gTWFjXG4gICAgICAgIHJldHVybiBzYWZhcmlEb3duQXJyb3dCdWcodmlldykgfHwgc2VsZWN0VmVydGljYWxseSh2aWV3LCAxLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIDEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RzID09IChtYWMgPyBcIm1cIiA6IFwiY1wiKSAmJlxuICAgICAgICAoY29kZSA9PSA2NiB8fCBjb2RlID09IDczIHx8IGNvZGUgPT0gODkgfHwgY29kZSA9PSA5MCkpIHsgLy8gTW9kLVtiaXl6XVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVGb3JDbGlwYm9hcmQodmlldywgc2xpY2UpIHtcbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtQ29waWVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICBsZXQgY29udGV4dCA9IFtdLCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgd2hpbGUgKG9wZW5TdGFydCA+IDEgJiYgb3BlbkVuZCA+IDEgJiYgY29udGVudC5jaGlsZENvdW50ID09IDEgJiYgY29udGVudC5maXJzdENoaWxkLmNoaWxkQ291bnQgPT0gMSkge1xuICAgICAgICBvcGVuU3RhcnQtLTtcbiAgICAgICAgb3BlbkVuZC0tO1xuICAgICAgICBsZXQgbm9kZSA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgY29udGV4dC5wdXNoKG5vZGUudHlwZS5uYW1lLCBub2RlLmF0dHJzICE9IG5vZGUudHlwZS5kZWZhdWx0QXR0cnMgPyBub2RlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIGNvbnRlbnQgPSBub2RlLmNvbnRlbnQ7XG4gICAgfVxuICAgIGxldCBzZXJpYWxpemVyID0gdmlldy5zb21lUHJvcChcImNsaXBib2FyZFNlcmlhbGl6ZXJcIikgfHwgRE9NU2VyaWFsaXplci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKTtcbiAgICBsZXQgZG9jID0gZGV0YWNoZWREb2MoKSwgd3JhcCA9IGRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHdyYXAuYXBwZW5kQ2hpbGQoc2VyaWFsaXplci5zZXJpYWxpemVGcmFnbWVudChjb250ZW50LCB7IGRvY3VtZW50OiBkb2MgfSkpO1xuICAgIGxldCBmaXJzdENoaWxkID0gd3JhcC5maXJzdENoaWxkLCBuZWVkc1dyYXAsIHdyYXBwZXJzID0gMDtcbiAgICB3aGlsZSAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09IDEgJiYgKG5lZWRzV3JhcCA9IHdyYXBNYXBbZmlyc3RDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5lZWRzV3JhcC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHdyYXBwZXIgPSBkb2MuY3JlYXRlRWxlbWVudChuZWVkc1dyYXBbaV0pO1xuICAgICAgICAgICAgd2hpbGUgKHdyYXAuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHdyYXAuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICAgICAgd3JhcHBlcnMrKztcbiAgICAgICAgfVxuICAgICAgICBmaXJzdENoaWxkID0gd3JhcC5maXJzdENoaWxkO1xuICAgIH1cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgIGZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiLCBgJHtvcGVuU3RhcnR9ICR7b3BlbkVuZH0ke3dyYXBwZXJzID8gYCAtJHt3cmFwcGVyc31gIDogXCJcIn0gJHtKU09OLnN0cmluZ2lmeShjb250ZXh0KX1gKTtcbiAgICBsZXQgdGV4dCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0U2VyaWFsaXplclwiLCBmID0+IGYoc2xpY2UsIHZpZXcpKSB8fFxuICAgICAgICBzbGljZS5jb250ZW50LnRleHRCZXR3ZWVuKDAsIHNsaWNlLmNvbnRlbnQuc2l6ZSwgXCJcXG5cXG5cIik7XG4gICAgcmV0dXJuIHsgZG9tOiB3cmFwLCB0ZXh0LCBzbGljZSB9O1xufVxuLy8gUmVhZCBhIHNsaWNlIG9mIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIChvciBkcm9wIGRhdGEpLlxuZnVuY3Rpb24gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHBsYWluVGV4dCwgJGNvbnRleHQpIHtcbiAgICBsZXQgaW5Db2RlID0gJGNvbnRleHQucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCBkb20sIHNsaWNlO1xuICAgIGlmICghaHRtbCAmJiAhdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFzVGV4dCA9IHRleHQgJiYgKHBsYWluVGV4dCB8fCBpbkNvZGUgfHwgIWh0bWwpO1xuICAgIGlmIChhc1RleHQpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFRleHRcIiwgZiA9PiB7IHRleHQgPSBmKHRleHQsIGluQ29kZSB8fCBwbGFpblRleHQsIHZpZXcpOyB9KTtcbiAgICAgICAgaWYgKGluQ29kZSlcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ID8gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odmlldy5zdGF0ZS5zY2hlbWEudGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikpKSwgMCwgMCkgOiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0UGFyc2VyXCIsIGYgPT4gZih0ZXh0LCAkY29udGV4dCwgcGxhaW5UZXh0LCB2aWV3KSk7XG4gICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIHNsaWNlID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gJGNvbnRleHQubWFya3MoKTtcbiAgICAgICAgICAgIGxldCB7IHNjaGVtYSB9ID0gdmlldy5zdGF0ZSwgc2VyaWFsaXplciA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRleHQuc3BsaXQoLyg/Olxcclxcbj98XFxuKSsvKS5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrKVxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplTm9kZShzY2hlbWEudGV4dChibG9jaywgbWFya3MpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZEhUTUxcIiwgZiA9PiB7IGh0bWwgPSBmKGh0bWwsIHZpZXcpOyB9KTtcbiAgICAgICAgZG9tID0gcmVhZEhUTUwoaHRtbCk7XG4gICAgICAgIGlmICh3ZWJraXQpXG4gICAgICAgICAgICByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHROb2RlID0gZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtcG0tc2xpY2VdXCIpO1xuICAgIGxldCBzbGljZURhdGEgPSBjb250ZXh0Tm9kZSAmJiAvXihcXGQrKSAoXFxkKykoPzogLShcXGQrKSk/ICguKikvLmV4ZWMoY29udGV4dE5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiKSB8fCBcIlwiKTtcbiAgICBpZiAoc2xpY2VEYXRhICYmIHNsaWNlRGF0YVszXSlcbiAgICAgICAgZm9yIChsZXQgaSA9ICtzbGljZURhdGFbM107IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkb20gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgIGlmICghc2xpY2UpIHtcbiAgICAgICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRQYXJzZXJcIikgfHwgdmlldy5zb21lUHJvcChcImRvbVBhcnNlclwiKSB8fCBET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgICAgIHNsaWNlID0gcGFyc2VyLnBhcnNlU2xpY2UoZG9tLCB7XG4gICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICEhKGFzVGV4dCB8fCBzbGljZURhdGEpLFxuICAgICAgICAgICAgY29udGV4dDogJGNvbnRleHQsXG4gICAgICAgICAgICBydWxlRnJvbU5vZGUoZG9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRvbS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBkb20ucGFyZW50Tm9kZSAmJiAhaW5saW5lUGFyZW50cy50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2xpY2VEYXRhKSB7XG4gICAgICAgIHNsaWNlID0gYWRkQ29udGV4dChjbG9zZVNsaWNlKHNsaWNlLCArc2xpY2VEYXRhWzFdLCArc2xpY2VEYXRhWzJdKSwgc2xpY2VEYXRhWzRdKTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIEhUTUwgd2Fzbid0IGNyZWF0ZWQgYnkgUHJvc2VNaXJyb3IuIE1ha2Ugc3VyZSB0b3AtbGV2ZWwgc2libGluZ3MgYXJlIGNvaGVyZW50XG4gICAgICAgIHNsaWNlID0gU2xpY2UubWF4T3Blbihub3JtYWxpemVTaWJsaW5ncyhzbGljZS5jb250ZW50LCAkY29udGV4dCksIHRydWUpO1xuICAgICAgICBpZiAoc2xpY2Uub3BlblN0YXJ0IHx8IHNsaWNlLm9wZW5FbmQpIHtcbiAgICAgICAgICAgIGxldCBvcGVuU3RhcnQgPSAwLCBvcGVuRW5kID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQ7IG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuU3RhcnQrKywgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5sYXN0Q2hpbGQ7IG9wZW5FbmQgPCBzbGljZS5vcGVuRW5kICYmICFub2RlLnR5cGUuc3BlYy5pc29sYXRpbmc7IG9wZW5FbmQrKywgbm9kZSA9IG5vZGUubGFzdENoaWxkKSB7IH1cbiAgICAgICAgICAgIHNsaWNlID0gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG5jb25zdCBpbmxpbmVQYXJlbnRzID0gL14oYXxhYmJyfGFjcm9ueW18YnxjaXRlfGNvZGV8ZGVsfGVtfGl8aW5zfGtiZHxsYWJlbHxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzcGFufHN0cm9uZ3xzdWJ8c3VwfHRpbWV8dXx0dHx2YXIpJC9pO1xuLy8gVGFrZXMgYSBzbGljZSBwYXJzZWQgd2l0aCBwYXJzZVNsaWNlLCB3aGljaCBtZWFucyB0aGVyZSBoYXNuJ3QgYmVlblxuLy8gYW55IGNvbnRlbnQtZXhwcmVzc2lvbiBjaGVja2luZyBkb25lIG9uIHRoZSB0b3Agbm9kZXMsIHRyaWVzIHRvXG4vLyBmaW5kIGEgcGFyZW50IG5vZGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dCB0aGF0IG1pZ2h0IGZpdCB0aGUgbm9kZXMsXG4vLyBhbmQgaWYgc3VjY2Vzc2Z1bCwgcmVidWlsZHMgdGhlIHNsaWNlIHNvIHRoYXQgaXQgZml0cyBpbnRvIHRoYXQgcGFyZW50LlxuLy9cbi8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIHRoYXQgVHJhbnNmb3JtLnJlcGxhY2UgZXhwZWN0cyBhXG4vLyBjb2hlcmVudCBzbGljZSwgYW5kIHdpbGwgZmFpbCB0byBwbGFjZSBhIHNldCBvZiBzaWJsaW5ncyB0aGF0IGRvbid0XG4vLyBmaXQgYW55d2hlcmUgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpYmxpbmdzKGZyYWdtZW50LCAkY29udGV4dCkge1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50IDwgMilcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjb250ZXh0Lm5vZGUoZCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleChkKSk7XG4gICAgICAgIGxldCBsYXN0V3JhcCwgcmVzdWx0ID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgd3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhub2RlLnR5cGUpLCBpbkxhc3Q7XG4gICAgICAgICAgICBpZiAoIXdyYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaW5MYXN0ID0gcmVzdWx0Lmxlbmd0aCAmJiBsYXN0V3JhcC5sZW5ndGggJiYgYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLCAwKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBpbkxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGNsb3NlUmlnaHQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgbGFzdFdyYXAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdpdGhXcmFwcGVycyhub2RlLCB3cmFwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3cmFwcGVkKTtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh3cmFwcGVkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGxhc3RXcmFwID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZnJvbSA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gd3JhcC5sZW5ndGggLSAxOyBpID49IGZyb207IGktLSlcbiAgICAgICAgbm9kZSA9IHdyYXBbaV0uY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiBub2RlO1xufVxuLy8gVXNlZCB0byBncm91cCBhZGphY2VudCBub2RlcyB3cmFwcGVkIGluIHNpbWlsYXIgcGFyZW50cyBieVxuLy8gbm9ybWFsaXplU2libGluZ3MgaW50byB0aGUgc2FtZSBwYXJlbnQgbm9kZVxuZnVuY3Rpb24gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA8IHdyYXAubGVuZ3RoICYmIGRlcHRoIDwgbGFzdFdyYXAubGVuZ3RoICYmIHdyYXBbZGVwdGhdID09IGxhc3RXcmFwW2RlcHRoXSkge1xuICAgICAgICBsZXQgaW5uZXIgPSBhZGRUb1NpYmxpbmcod3JhcCwgbGFzdFdyYXAsIG5vZGUsIHNpYmxpbmcubGFzdENoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5yZXBsYWNlQ2hpbGQoc2libGluZy5jaGlsZENvdW50IC0gMSwgaW5uZXIpKTtcbiAgICAgICAgbGV0IG1hdGNoID0gc2libGluZy5jb250ZW50TWF0Y2hBdChzaWJsaW5nLmNoaWxkQ291bnQpO1xuICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKGRlcHRoID09IHdyYXAubGVuZ3RoIC0gMSA/IG5vZGUudHlwZSA6IHdyYXBbZGVwdGggKyAxXSkpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5hcHBlbmQoRnJhZ21lbnQuZnJvbSh3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZGVwdGggKyAxKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZVJpZ2h0KG5vZGUsIGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnbWVudCA9IG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQobm9kZS5jaGlsZENvdW50IC0gMSwgY2xvc2VSaWdodChub2RlLmxhc3RDaGlsZCwgZGVwdGggLSAxKSk7XG4gICAgbGV0IGZpbGwgPSBub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnbWVudC5hcHBlbmQoZmlsbCkpO1xufVxuZnVuY3Rpb24gY2xvc2VSYW5nZShmcmFnbWVudCwgc2lkZSwgZnJvbSwgdG8sIGRlcHRoLCBvcGVuRW5kKSB7XG4gICAgbGV0IG5vZGUgPSBzaWRlIDwgMCA/IGZyYWdtZW50LmZpcnN0Q2hpbGQgOiBmcmFnbWVudC5sYXN0Q2hpbGQsIGlubmVyID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgaWYgKGRlcHRoIDwgdG8gLSAxKVxuICAgICAgICBpbm5lciA9IGNsb3NlUmFuZ2UoaW5uZXIsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCArIDEsIG9wZW5FbmQpO1xuICAgIGlmIChkZXB0aCA+PSBmcm9tKVxuICAgICAgICBpbm5lciA9IHNpZGUgPCAwID8gbm9kZS5jb250ZW50TWF0Y2hBdCgwKS5maWxsQmVmb3JlKGlubmVyLCBvcGVuRW5kIDw9IGRlcHRoKS5hcHBlbmQoaW5uZXIpXG4gICAgICAgICAgICA6IGlubmVyLmFwcGVuZChub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoc2lkZSA8IDAgPyAwIDogZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIG5vZGUuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgaWYgKG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAtMSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuU3RhcnQsIDAsIHNsaWNlLm9wZW5FbmQpLCBvcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpO1xuICAgIGlmIChvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAxLCBvcGVuRW5kLCBzbGljZS5vcGVuRW5kLCAwLCAwKSwgc2xpY2Uub3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG4vLyBUcmljayBmcm9tIGpRdWVyeSAtLSBzb21lIGVsZW1lbnRzIG11c3QgYmUgd3JhcHBlZCBpbiBvdGhlclxuLy8gZWxlbWVudHMgZm9yIGlubmVySFRNTCB0byB3b3JrLiBJLmUuIGlmIHlvdSBkbyBgZGl2LmlubmVySFRNTCA9XG4vLyBcIjx0ZD4uLjwvdGQ+XCJgIHRoZSB0YWJsZSBjZWxscyBhcmUgaWdub3JlZC5cbmNvbnN0IHdyYXBNYXAgPSB7XG4gICAgdGhlYWQ6IFtcInRhYmxlXCJdLFxuICAgIHRib2R5OiBbXCJ0YWJsZVwiXSxcbiAgICB0Zm9vdDogW1widGFibGVcIl0sXG4gICAgY2FwdGlvbjogW1widGFibGVcIl0sXG4gICAgY29sZ3JvdXA6IFtcInRhYmxlXCJdLFxuICAgIGNvbDogW1widGFibGVcIiwgXCJjb2xncm91cFwiXSxcbiAgICB0cjogW1widGFibGVcIiwgXCJ0Ym9keVwiXSxcbiAgICB0ZDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdLFxuICAgIHRoOiBbXCJ0YWJsZVwiLCBcInRib2R5XCIsIFwidHJcIl1cbn07XG5sZXQgX2RldGFjaGVkRG9jID0gbnVsbDtcbmZ1bmN0aW9uIGRldGFjaGVkRG9jKCkge1xuICAgIHJldHVybiBfZGV0YWNoZWREb2MgfHwgKF9kZXRhY2hlZERvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcInRpdGxlXCIpKTtcbn1cbmxldCBfcG9saWN5ID0gbnVsbDtcbmZ1bmN0aW9uIG1heWJlV3JhcFRydXN0ZWQoaHRtbCkge1xuICAgIGxldCB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuICAgIGlmICghdHJ1c3RlZFR5cGVzKVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAvLyBXaXRoIHRoZSByZXF1aXJlLXRydXN0ZWQtdHlwZXMtZm9yIENTUCwgQ2hyb21lIHdpbGwgYmxvY2tcbiAgICAvLyBpbm5lckhUTUwsIGV2ZW4gb24gYSBkZXRhY2hlZCBkb2N1bWVudC4gVGhpcyB3cmFwcyB0aGUgc3RyaW5nIGluXG4gICAgLy8gYSB3YXkgdGhhdCBtYWtlcyB0aGUgYnJvd3NlciBhbGxvdyB1cyB0byB1c2UgaXRzIHBhcnNlciBhZ2Fpbi5cbiAgICBpZiAoIV9wb2xpY3kpXG4gICAgICAgIF9wb2xpY3kgPSB0cnVzdGVkVHlwZXMuZGVmYXVsdFBvbGljeSB8fCB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KFwiUHJvc2VNaXJyb3JDbGlwYm9hcmRcIiwgeyBjcmVhdGVIVE1MOiAocykgPT4gcyB9KTtcbiAgICByZXR1cm4gX3BvbGljeS5jcmVhdGVIVE1MKGh0bWwpO1xufVxuZnVuY3Rpb24gcmVhZEhUTUwoaHRtbCkge1xuICAgIGxldCBtZXRhcyA9IC9eKFxccyo8bWV0YSBbXj5dKj4pKi8uZXhlYyhodG1sKTtcbiAgICBpZiAobWV0YXMpXG4gICAgICAgIGh0bWwgPSBodG1sLnNsaWNlKG1ldGFzWzBdLmxlbmd0aCk7XG4gICAgbGV0IGVsdCA9IGRldGFjaGVkRG9jKCkuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBsZXQgZmlyc3RUYWcgPSAvPChbYS16XVtePlxcc10rKS9pLmV4ZWMoaHRtbCksIHdyYXA7XG4gICAgaWYgKHdyYXAgPSBmaXJzdFRhZyAmJiB3cmFwTWFwW2ZpcnN0VGFnWzFdLnRvTG93ZXJDYXNlKCldKVxuICAgICAgICBodG1sID0gd3JhcC5tYXAobiA9PiBcIjxcIiArIG4gKyBcIj5cIikuam9pbihcIlwiKSArIGh0bWwgKyB3cmFwLm1hcChuID0+IFwiPC9cIiArIG4gKyBcIj5cIikucmV2ZXJzZSgpLmpvaW4oXCJcIik7XG4gICAgZWx0LmlubmVySFRNTCA9IG1heWJlV3JhcFRydXN0ZWQoaHRtbCk7XG4gICAgaWYgKHdyYXApXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVsdCA9IGVsdC5xdWVyeVNlbGVjdG9yKHdyYXBbaV0pIHx8IGVsdDtcbiAgICByZXR1cm4gZWx0O1xufVxuLy8gV2Via2l0IGJyb3dzZXJzIGRvIHNvbWUgaGFyZC10by1wcmVkaWN0IHJlcGxhY2VtZW50IG9mIHJlZ3VsYXJcbi8vIHNwYWNlcyB3aXRoIG5vbi1icmVha2luZyBzcGFjZXMgd2hlbiBwdXR0aW5nIGNvbnRlbnQgb24gdGhlXG4vLyBjbGlwYm9hcmQuIFRoaXMgdHJpZXMgdG8gY29udmVydCBzdWNoIG5vbi1icmVha2luZyBzcGFjZXMgKHdoaWNoXG4vLyB3aWxsIGJlIHdyYXBwZWQgaW4gYSBwbGFpbiBzcGFuIG9uIENocm9tZSwgYSBzcGFuIHdpdGggY2xhc3Ncbi8vIEFwcGxlLWNvbnZlcnRlZC1zcGFjZSBvbiBTYWZhcmkpIGJhY2sgdG8gcmVndWxhciBzcGFjZXMuXG5mdW5jdGlvbiByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKSB7XG4gICAgbGV0IG5vZGVzID0gZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoY2hyb21lID8gXCJzcGFuOm5vdChbY2xhc3NdKTpub3QoW3N0eWxlXSlcIiA6IFwic3Bhbi5BcHBsZS1jb252ZXJ0ZWQtc3BhY2VcIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIG5vZGUudGV4dENvbnRlbnQgPT0gXCJcXHUwMGEwXCIgJiYgbm9kZS5wYXJlbnROb2RlKVxuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb20ub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIiBcIiksIG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZENvbnRleHQoc2xpY2UsIGNvbnRleHQpIHtcbiAgICBpZiAoIXNsaWNlLnNpemUpXG4gICAgICAgIHJldHVybiBzbGljZTtcbiAgICBsZXQgc2NoZW1hID0gc2xpY2UuY29udGVudC5maXJzdENoaWxkLnR5cGUuc2NoZW1hLCBhcnJheTtcbiAgICB0cnkge1xuICAgICAgICBhcnJheSA9IEpTT04ucGFyc2UoY29udGV4dCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzbGljZTtcbiAgICB9XG4gICAgbGV0IHsgY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPSBzbGljZTtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubm9kZXNbYXJyYXlbaV1dO1xuICAgICAgICBpZiAoIXR5cGUgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGUoYXJyYXlbaSArIDFdLCBjb250ZW50KSk7XG4gICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBvcGVuRW5kKys7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2xpY2UoY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbn1cblxuLy8gQSBjb2xsZWN0aW9uIG9mIERPTSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIGVkaXRvciwgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uc1xuLy8gdG8gaW52b2tlIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuY29uc3QgaGFuZGxlcnMgPSB7fTtcbmNvbnN0IGVkaXRIYW5kbGVycyA9IHt9O1xuY29uc3QgcGFzc2l2ZUhhbmRsZXJzID0geyB0b3VjaHN0YXJ0OiB0cnVlLCB0b3VjaG1vdmU6IHRydWUgfTtcbmNsYXNzIElucHV0U3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNoaWZ0S2V5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VEb3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGVUaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q2xpY2sgPSB7IHRpbWU6IDAsIHg6IDAsIHk6IDAsIHR5cGU6IFwiXCIsIGJ1dHRvbjogMCB9O1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICB0aGlzLmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RGb2N1cyA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q2hyb21lRGVsZXRlID0gMDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbk5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBvc2luZ1RpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbk5vZGVzID0gW107XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0ID0gLTJlODtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbklEID0gMTtcbiAgICAgICAgLy8gU2V0IHRvIGEgY29tcG9zaXRpb24gSUQgd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGF0IGNvbXBvc2l0aW9uZW5kXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IDA7XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmhpZGVTZWxlY3Rpb25HdWFyZCA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdElucHV0KHZpZXcpIHtcbiAgICBmb3IgKGxldCBldmVudCBpbiBoYW5kbGVycykge1xuICAgICAgICBsZXQgaGFuZGxlciA9IGhhbmRsZXJzW2V2ZW50XTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW2V2ZW50XSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50QmVsb25nc1RvVmlldyh2aWV3LCBldmVudCkgJiYgIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgKHZpZXcuZWRpdGFibGUgfHwgIShldmVudC50eXBlIGluIGVkaXRIYW5kbGVycykpKVxuICAgICAgICAgICAgICAgIGhhbmRsZXIodmlldywgZXZlbnQpO1xuICAgICAgICB9LCBwYXNzaXZlSGFuZGxlcnNbZXZlbnRdID8geyBwYXNzaXZlOiB0cnVlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvLyBPbiBTYWZhcmksIGZvciByZWFzb25zIGJleW9uZCBteSB1bmRlcnN0YW5kaW5nLCBhZGRpbmcgYW4gaW5wdXRcbiAgICAvLyBldmVudCBoYW5kbGVyIG1ha2VzIGFuIGlzc3VlIHdoZXJlIHRoZSBjb21wb3NpdGlvbiB2YW5pc2hlcyB3aGVuXG4gICAgLy8geW91IHByZXNzIGVudGVyIGdvIGF3YXkuXG4gICAgaWYgKHNhZmFyaSlcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IG51bGwpO1xuICAgIGVuc3VyZUxpc3RlbmVycyh2aWV3KTtcbn1cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBvcmlnaW4pIHtcbiAgICB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBvcmlnaW47XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG59XG5mdW5jdGlvbiBkZXN0cm95SW5wdXQodmlldykge1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgIGZvciAobGV0IHR5cGUgaW4gdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzKVxuICAgICAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSk7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCk7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0KTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUxpc3RlbmVycyh2aWV3KSB7XG4gICAgdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBjdXJyZW50SGFuZGxlcnMgPT4ge1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIGN1cnJlbnRIYW5kbGVycylcbiAgICAgICAgICAgIGlmICghdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW3R5cGVdKVxuICAgICAgICAgICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW3R5cGVdID0gZXZlbnQgPT4gcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkge1xuICAgIHJldHVybiB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlRE9NRXZlbnRzXCIsIGhhbmRsZXJzID0+IHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudC50eXBlXTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIgPyBoYW5kbGVyKHZpZXcsIGV2ZW50KSB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkIDogZmFsc2U7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LmJ1YmJsZXMpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgbm9kZSA9IGV2ZW50LnRhcmdldDsgbm9kZSAhPSB2aWV3LmRvbTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHxcbiAgICAgICAgICAgIChub2RlLnBtVmlld0Rlc2MgJiYgbm9kZS5wbVZpZXdEZXNjLnN0b3BFdmVudChldmVudCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCh2aWV3LCBldmVudCkge1xuICAgIGlmICghcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkgJiYgaGFuZGxlcnNbZXZlbnQudHlwZV0gJiZcbiAgICAgICAgKHZpZXcuZWRpdGFibGUgfHwgIShldmVudC50eXBlIGluIGVkaXRIYW5kbGVycykpKVxuICAgICAgICBoYW5kbGVyc1tldmVudC50eXBlXSh2aWV3LCBldmVudCk7XG59XG5lZGl0SGFuZGxlcnMua2V5ZG93biA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgdmlldy5pbnB1dC5zaGlmdEtleSA9IGV2ZW50LmtleUNvZGUgPT0gMTYgfHwgZXZlbnQuc2hpZnRLZXk7XG4gICAgaWYgKGluT3JOZWFyQ29tcG9zaXRpb24odmlldywgZXZlbnQpKVxuICAgICAgICByZXR1cm47XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFN1cHByZXNzIGVudGVyIGtleSBldmVudHMgb24gQ2hyb21lIEFuZHJvaWQsIGJlY2F1c2UgdGhvc2UgdGVuZFxuICAgIC8vIHRvIGJlIHBhcnQgb2YgYSBjb25mdXNlZCBzZXF1ZW5jZSBvZiBjb21wb3NpdGlvbiBldmVudHMgZmlyZWQsXG4gICAgLy8gYW5kIGhhbmRsaW5nIHRoZW0gZWFnZXJseSB0ZW5kcyB0byBjb3JydXB0IHRoZSBpbnB1dC5cbiAgICBpZiAoYW5kcm9pZCAmJiBjaHJvbWUgJiYgZXZlbnQua2V5Q29kZSA9PSAxMylcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChldmVudC5rZXlDb2RlICE9IDIyOSlcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgLy8gT24gaU9TLCBpZiB3ZSBwcmV2ZW50RGVmYXVsdCBlbnRlciBrZXkgcHJlc3NlcywgdGhlIHZpcnR1YWxcbiAgICAvLyBrZXlib2FyZCBnZXRzIGNvbmZ1c2VkLiBTbyB0aGUgaGFjayBoZXJlIGlzIHRvIHNldCBhIGZsYWcgdGhhdFxuICAgIC8vIG1ha2VzIHRoZSBET00gY2hhbmdlIGNvZGUgcmVjb2duaXplIHRoYXQgd2hhdCBqdXN0IGhhcHBlbnMgc2hvdWxkXG4gICAgLy8gYmUgcmVwbGFjZWQgYnkgd2hhdGV2ZXIgdGhlIEVudGVyIGtleSBoYW5kbGVycyBkby5cbiAgICBpZiAoaW9zICYmIGV2ZW50LmtleUNvZGUgPT0gMTMgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSBub3c7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPT0gbm93KSB7XG4gICAgICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSk7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDApO1xuICAgIH1cbiAgICBlbHNlIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywgZXZlbnQpKSB8fCBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBcImtleVwiKTtcbiAgICB9XG59O1xuZWRpdEhhbmRsZXJzLmtleXVwID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTYpXG4gICAgICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBmYWxzZTtcbn07XG5lZGl0SGFuZGxlcnMua2V5cHJlc3MgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSB8fCAhZXZlbnQuY2hhckNvZGUgfHxcbiAgICAgICAgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8IG1hYyAmJiBldmVudC5tZXRhS2V5KVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlQcmVzc1wiLCBmID0+IGYodmlldywgZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIShzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB8fCAhc2VsLiRmcm9tLnNhbWVQYXJlbnQoc2VsLiR0bykpIHtcbiAgICAgICAgbGV0IHRleHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKTtcbiAgICAgICAgaWYgKCEvW1xcclxcbl0vLnRlc3QodGV4dCkgJiYgIXZpZXcuc29tZVByb3AoXCJoYW5kbGVUZXh0SW5wdXRcIiwgZiA9PiBmKHZpZXcsIHNlbC4kZnJvbS5wb3MsIHNlbC4kdG8ucG9zLCB0ZXh0KSkpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuaW5zZXJ0VGV4dCh0ZXh0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gZXZlbnRDb29yZHMoZXZlbnQpIHsgcmV0dXJuIHsgbGVmdDogZXZlbnQuY2xpZW50WCwgdG9wOiBldmVudC5jbGllbnRZIH07IH1cbmZ1bmN0aW9uIGlzTmVhcihldmVudCwgY2xpY2spIHtcbiAgICBsZXQgZHggPSBjbGljay54IC0gZXZlbnQuY2xpZW50WCwgZHkgPSBjbGljay55IC0gZXZlbnQuY2xpZW50WTtcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPCAxMDA7XG59XG5mdW5jdGlvbiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIHByb3BOYW1lLCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKHByb3BOYW1lLCBmID0+IGkgPiAkcG9zLmRlcHRoID8gZih2aWV3LCBwb3MsICRwb3Mubm9kZUFmdGVyLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIHRydWUpXG4gICAgICAgICAgICA6IGYodmlldywgcG9zLCAkcG9zLm5vZGUoaSksICRwb3MuYmVmb3JlKGkpLCBldmVudCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24odmlldywgc2VsZWN0aW9uLCBvcmlnaW4pIHtcbiAgICBpZiAoIXZpZXcuZm9jdXNlZClcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIGlmICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShzZWxlY3Rpb24pKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBpZiAob3JpZ2luID09IFwicG9pbnRlclwiKVxuICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWRMZWFmKHZpZXcsIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgPT0gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoaW5zaWRlKSwgbm9kZSA9ICRwb3Mubm9kZUFmdGVyO1xuICAgIGlmIChub2RlICYmIG5vZGUuaXNBdG9tICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUodmlldywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbiwgc2VsZWN0ZWROb2RlLCBzZWxlY3RBdDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbilcbiAgICAgICAgc2VsZWN0ZWROb2RlID0gc2VsLm5vZGU7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGxldCBub2RlID0gaSA+ICRwb3MuZGVwdGggPyAkcG9zLm5vZGVBZnRlciA6ICRwb3Mubm9kZShpKTtcbiAgICAgICAgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWROb2RlICYmIHNlbC4kZnJvbS5kZXB0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBpID49IHNlbC4kZnJvbS5kZXB0aCAmJiAkcG9zLmJlZm9yZShzZWwuJGZyb20uZGVwdGggKyAxKSA9PSBzZWwuJGZyb20ucG9zKVxuICAgICAgICAgICAgICAgIHNlbGVjdEF0ID0gJHBvcy5iZWZvcmUoc2VsLiRmcm9tLmRlcHRoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWxlY3RBdCA9ICRwb3MuYmVmb3JlKGkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbGVjdEF0ICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBzZWxlY3RBdCksIFwicG9pbnRlclwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2luZ2xlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50LCBzZWxlY3ROb2RlKSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSkgfHxcbiAgICAgICAgKHNlbGVjdE5vZGUgPyBzZWxlY3RDbGlja2VkTm9kZSh2aWV3LCBpbnNpZGUpIDogc2VsZWN0Q2xpY2tlZExlYWYodmlldywgaW5zaWRlKSk7XG59XG5mdW5jdGlvbiBoYW5kbGVEb3VibGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZURvdWJsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlRG91YmxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVRyaXBsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlVHJpcGxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVUcmlwbGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpIHx8XG4gICAgICAgIGRlZmF1bHRUcmlwbGVDbGljayh2aWV3LCBpbnNpZGUsIGV2ZW50KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRUcmlwbGVDbGljayh2aWV3LCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGlmIChpbnNpZGUgPT0gLTEpIHtcbiAgICAgICAgaWYgKGRvYy5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCAwLCBkb2MuY29udGVudC5zaXplKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGxldCBub2RlID0gaSA+ICRwb3MuZGVwdGggPyAkcG9zLm5vZGVBZnRlciA6ICRwb3Mubm9kZShpKTtcbiAgICAgICAgbGV0IG5vZGVQb3MgPSAkcG9zLmJlZm9yZShpKTtcbiAgICAgICAgaWYgKG5vZGUuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIG5vZGVQb3MgKyAxLCBub2RlUG9zICsgMSArIG5vZGUuY29udGVudC5zaXplKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICBlbHNlIGlmIChOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSlcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIG5vZGVQb3MpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmb3JjZURPTUZsdXNoKHZpZXcpIHtcbiAgICByZXR1cm4gZW5kQ29tcG9zaXRpb24odmlldyk7XG59XG5jb25zdCBzZWxlY3ROb2RlTW9kaWZpZXIgPSBtYWMgPyBcIm1ldGFLZXlcIiA6IFwiY3RybEtleVwiO1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgbGV0IGZsdXNoZWQgPSBmb3JjZURPTUZsdXNoKHZpZXcpO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpLCB0eXBlID0gXCJzaW5nbGVDbGlja1wiO1xuICAgIGlmIChub3cgLSB2aWV3LmlucHV0Lmxhc3RDbGljay50aW1lIDwgNTAwICYmIGlzTmVhcihldmVudCwgdmlldy5pbnB1dC5sYXN0Q2xpY2spICYmICFldmVudFtzZWxlY3ROb2RlTW9kaWZpZXJdICYmXG4gICAgICAgIHZpZXcuaW5wdXQubGFzdENsaWNrLmJ1dHRvbiA9PSBldmVudC5idXR0b24pIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwiZG91YmxlQ2xpY2tcIjtcbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5sYXN0Q2xpY2sudHlwZSA9PSBcImRvdWJsZUNsaWNrXCIpXG4gICAgICAgICAgICB0eXBlID0gXCJ0cmlwbGVDbGlja1wiO1xuICAgIH1cbiAgICB2aWV3LmlucHV0Lmxhc3RDbGljayA9IHsgdGltZTogbm93LCB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0eXBlLCBidXR0b246IGV2ZW50LmJ1dHRvbiB9O1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKGV2ZW50Q29vcmRzKGV2ZW50KSk7XG4gICAgaWYgKCFwb3MpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAodHlwZSA9PSBcInNpbmdsZUNsaWNrXCIpIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubW91c2VEb3duKVxuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZG9uZSgpO1xuICAgICAgICB2aWV3LmlucHV0Lm1vdXNlRG93biA9IG5ldyBNb3VzZURvd24odmlldywgcG9zLCBldmVudCwgISFmbHVzaGVkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHR5cGUgPT0gXCJkb3VibGVDbGlja1wiID8gaGFuZGxlRG91YmxlQ2xpY2sgOiBoYW5kbGVUcmlwbGVDbGljaykodmlldywgcG9zLnBvcywgcG9zLmluc2lkZSwgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbn07XG5jbGFzcyBNb3VzZURvd24ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHBvcywgZXZlbnQsIGZsdXNoZWQpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5mbHVzaGVkID0gZmx1c2hlZDtcbiAgICAgICAgdGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1pZ2h0RHJhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhcnREb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlID0gISFldmVudFtzZWxlY3ROb2RlTW9kaWZpZXJdO1xuICAgICAgICB0aGlzLmFsbG93RGVmYXVsdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICBsZXQgdGFyZ2V0Tm9kZSwgdGFyZ2V0UG9zO1xuICAgICAgICBpZiAocG9zLmluc2lkZSA+IC0xKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gdmlldy5zdGF0ZS5kb2Mubm9kZUF0KHBvcy5pbnNpZGUpO1xuICAgICAgICAgICAgdGFyZ2V0UG9zID0gcG9zLmluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKTtcbiAgICAgICAgICAgIHRhcmdldE5vZGUgPSAkcG9zLnBhcmVudDtcbiAgICAgICAgICAgIHRhcmdldFBvcyA9ICRwb3MuZGVwdGggPyAkcG9zLmJlZm9yZSgpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSBmbHVzaGVkID8gbnVsbCA6IGV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGVzYyA9IHRhcmdldCA/IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyh0YXJnZXQsIHRydWUpIDogbnVsbDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXREZXNjICYmIHRhcmdldERlc2MuZG9tLm5vZGVUeXBlID09IDEgPyB0YXJnZXREZXNjLmRvbSA6IG51bGw7XG4gICAgICAgIGxldCB7IHNlbGVjdGlvbiB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PSAwICYmXG4gICAgICAgICAgICB0YXJnZXROb2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuc2VsZWN0YWJsZSAhPT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZyb20gPD0gdGFyZ2V0UG9zICYmIHNlbGVjdGlvbi50byA+IHRhcmdldFBvcylcbiAgICAgICAgICAgIHRoaXMubWlnaHREcmFnID0ge1xuICAgICAgICAgICAgICAgIG5vZGU6IHRhcmdldE5vZGUsXG4gICAgICAgICAgICAgICAgcG9zOiB0YXJnZXRQb3MsXG4gICAgICAgICAgICAgICAgYWRkQXR0cjogISEodGhpcy50YXJnZXQgJiYgIXRoaXMudGFyZ2V0LmRyYWdnYWJsZSksXG4gICAgICAgICAgICAgICAgc2V0VW5lZGl0YWJsZTogISEodGhpcy50YXJnZXQgJiYgZ2Vja28gJiYgIXRoaXMudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAodGhpcy5taWdodERyYWcuYWRkQXR0ciB8fCB0aGlzLm1pZ2h0RHJhZy5zZXRVbmVkaXRhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pZ2h0RHJhZy5hZGRBdHRyKVxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPT0gdGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlID0gdGhpcy5tb3ZlLmJpbmQodGhpcykpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbiAgICBkb25lKCkge1xuICAgICAgICB0aGlzLnZpZXcucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUpO1xuICAgICAgICBpZiAodGhpcy5taWdodERyYWcgJiYgdGhpcy50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYylcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KSk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPSBudWxsO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5kb2MgIT0gdGhpcy5zdGFydERvYylcbiAgICAgICAgICAgIHBvcyA9IHRoaXMudmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmFsbG93RGVmYXVsdCB8fCAhcG9zKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFuZGxlU2luZ2xlQ2xpY2sodGhpcy52aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCwgdGhpcy5zZWxlY3ROb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgKHRoaXMuZmx1c2hlZCB8fFxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBpZ25vcmVzIGNsaWNrcyBvbiBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAoc2FmYXJpICYmIHRoaXMubWlnaHREcmFnICYmICF0aGlzLm1pZ2h0RHJhZy5ub2RlLmlzQXRvbSkgfHxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMgdHJlYXQgYSBub2RlIHNlbGVjdGlvbiBhcyBhXG4gICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBidXQgc3RpbGwgcmVwb3J0IHRoYXQgdGhlIG5vZGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGFza2VkIHRocm91Z2ggZ2V0U2VsZWN0aW9uLiBZb3UnbGwgdGhlbiBnZXQgYVxuICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSBjbGlja2luZyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIChoaWRkZW4pIGN1cnNvciBpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2VsZWN0aW9uLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aHVzIGRvZXNuJ3QgZ2V0IGEgcmVhY3Rpb24gZnJvbSBQcm9zZU1pcnJvci4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtzIGFyb3VuZCB0aGF0LlxuICAgICAgICAgICAgICAgIChjaHJvbWUgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNYXRoLmFicyhwb3MucG9zIC0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSwgTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udG8pKSA8PSAyKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih0aGlzLnZpZXcsIFNlbGVjdGlvbi5uZWFyKHRoaXMudmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih0aGlzLnZpZXcsIFwicG9pbnRlclwiKTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHRoaXMuZG9uZSgpO1xuICAgIH1cbiAgICB1cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93RGVmYXVsdCAmJiAoTWF0aC5hYnModGhpcy5ldmVudC54IC0gZXZlbnQuY2xpZW50WCkgPiA0IHx8XG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmV2ZW50LnkgLSBldmVudC5jbGllbnRZKSA+IDQpKVxuICAgICAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbn1cbmhhbmRsZXJzLnRvdWNoc3RhcnQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdFRvdWNoID0gRGF0ZS5ub3coKTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiBmb3JjZURPTUZsdXNoKHZpZXcpO1xuZnVuY3Rpb24gaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgIC8vIE9uIEphcGFuZXNlIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvIGNvbmZpcm0gY2hhcmFjdGVyXG4gICAgLy8gc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCwgY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZVxuICAgIC8vIGVtaXR0ZWQuIFRoZSBrZXlkb3duIGV2ZW50IHRyaWdnZXJzIG5ld2xpbmUgaW5zZXJ0aW9uLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5ZG93biBldmVudCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAvLyBXZSBvbmx5IGlnbm9yZSBpdCBvbmNlLCBhcyBwcmVzc2luZyBFbnRlciBhIHNlY29uZCB0aW1lICpzaG91bGQqIGluc2VydCBhIG5ld2xpbmUuXG4gICAgLy8gRnVydGhlcm1vcmUsIHRoZSBrZXlkb3duIGV2ZW50IHRpbWVzdGFtcCBtdXN0IGJlIGNsb3NlIHRvIHRoZSBjb21wb3NpdGlvbkVuZGVkQXQgdGltZXN0YW1wLlxuICAgIC8vIFRoaXMgZ3VhcmRzIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgY29tcG9zaXRpb25lbmQgaXMgdHJpZ2dlcmVkIHdpdGhvdXQgdGhlIGtleWJvYXJkXG4gICAgLy8gKGUuZy4gY2hhcmFjdGVyIGNvbmZpcm1hdGlvbiBtYXkgYmUgZG9uZSB3aXRoIHRoZSBtb3VzZSksIGFuZCBrZXlkb3duIGlzIHRyaWdnZXJlZFxuICAgIC8vIGFmdGVyd2FyZHMtIHdlIHdvdWxkbid0IHdhbnQgdG8gaWdub3JlIHRoZSBrZXlkb3duIGV2ZW50IGluIHRoaXMgY2FzZS5cbiAgICBpZiAoc2FmYXJpICYmIE1hdGguYWJzKGV2ZW50LnRpbWVTdGFtcCAtIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0KSA8IDUwMCkge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBEcm9wIGFjdGl2ZSBjb21wb3NpdGlvbiBhZnRlciA1IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBvbiBBbmRyb2lkXG5jb25zdCB0aW1lb3V0Q29tcG9zaXRpb24gPSBhbmRyb2lkID8gNTAwMCA6IC0xO1xuZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBlZGl0SGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAoIXZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKTtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsICRwb3MgPSBzdGF0ZS5zZWxlY3Rpb24uJHRvO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgKHN0YXRlLnN0b3JlZE1hcmtzIHx8XG4gICAgICAgICAgICAgICAgKCEkcG9zLnRleHRPZmZzZXQgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgJHBvcy5ub2RlQmVmb3JlLm1hcmtzLnNvbWUobSA9PiBtLnR5cGUuc3BlYy5pbmNsdXNpdmUgPT09IGZhbHNlKSkpKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIHdyYXAgdGhlIGN1cnNvciBpbiBtYXJrIG5vZGVzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmVzIGluIHRoZSBET00gY29udGV4dFxuICAgICAgICAgICAgdmlldy5tYXJrQ3Vyc29yID0gdmlldy5zdGF0ZS5zdG9yZWRNYXJrcyB8fCAkcG9zLm1hcmtzKCk7XG4gICAgICAgICAgICBlbmRDb21wb3NpdGlvbih2aWV3LCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmRDb21wb3NpdGlvbih2aWV3LCAhc3RhdGUuc2VsZWN0aW9uLmVtcHR5KTtcbiAgICAgICAgICAgIC8vIEluIGZpcmVmb3gsIGlmIHRoZSBjdXJzb3IgaXMgYWZ0ZXIgYnV0IG91dHNpZGUgYSBtYXJrZWQgbm9kZSxcbiAgICAgICAgICAgIC8vIHRoZSBpbnNlcnRlZCB0ZXh0IHdvbid0IGluaGVyaXQgdGhlIG1hcmtzLiBTbyB0aGlzIG1vdmVzIGl0XG4gICAgICAgICAgICAvLyBpbnNpZGUgaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgICAgaWYgKGdlY2tvICYmIHN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiAkcG9zLnBhcmVudE9mZnNldCAmJiAhJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzZWwuZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7IG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCAhPSAwOykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gb2Zmc2V0IDwgMCA/IG5vZGUubGFzdENoaWxkIDogbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwuY29sbGFwc2UoYmVmb3JlLCBiZWZvcmUubm9kZVZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IHRydWU7XG4gICAgfVxuICAgIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCB0aW1lb3V0Q29tcG9zaXRpb24pO1xufTtcbmVkaXRIYW5kbGVycy5jb21wb3NpdGlvbmVuZCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gdmlldy5kb21PYnNlcnZlci5wZW5kaW5nUmVjb3JkcygpLmxlbmd0aCA/IHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCA6IDA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2RlID0gbnVsbDtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcylcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5kb21PYnNlcnZlci5mbHVzaCgpKTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbklEKys7XG4gICAgICAgIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCAyMCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCBkZWxheSkge1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGlmIChkZWxheSA+IC0xKVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGVuZENvbXBvc2l0aW9uKHZpZXcpLCBkZWxheSk7XG59XG5mdW5jdGlvbiBjbGVhckNvbXBvc2l0aW9uKHZpZXcpIHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKTtcbiAgICB9XG4gICAgd2hpbGUgKHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZXMucG9wKCkubWFya1BhcmVudHNEaXJ0eSgpO1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0ZXh0QmVmb3JlID0gdGV4dE5vZGVCZWZvcmUkMShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpO1xuICAgIGxldCB0ZXh0QWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyJDEoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBpZiAodGV4dEJlZm9yZSAmJiB0ZXh0QWZ0ZXIgJiYgdGV4dEJlZm9yZSAhPSB0ZXh0QWZ0ZXIpIHtcbiAgICAgICAgbGV0IGRlc2NBZnRlciA9IHRleHRBZnRlci5wbVZpZXdEZXNjLCBsYXN0Q2hhbmdlZCA9IHZpZXcuZG9tT2JzZXJ2ZXIubGFzdENoYW5nZWRUZXh0Tm9kZTtcbiAgICAgICAgaWYgKHRleHRCZWZvcmUgPT0gbGFzdENoYW5nZWQgfHwgdGV4dEFmdGVyID09IGxhc3RDaGFuZ2VkKVxuICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGFuZ2VkO1xuICAgICAgICBpZiAoIWRlc2NBZnRlciB8fCAhZGVzY0FmdGVyLmlzVGV4dCh0ZXh0QWZ0ZXIubm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZSA9PSB0ZXh0QWZ0ZXIpIHtcbiAgICAgICAgICAgIGxldCBkZXNjQmVmb3JlID0gdGV4dEJlZm9yZS5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgaWYgKCEoIWRlc2NCZWZvcmUgfHwgIWRlc2NCZWZvcmUuaXNUZXh0KHRleHRCZWZvcmUubm9kZVZhbHVlKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dEJlZm9yZSB8fCB0ZXh0QWZ0ZXI7XG59XG5mdW5jdGlvbiB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKSB7XG4gICAgbGV0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBldmVudC5pbml0RXZlbnQoXCJldmVudFwiLCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wO1xufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBlbmRDb21wb3NpdGlvbih2aWV3LCByZXN0YXJ0aW5nID0gZmFsc2UpIHtcbiAgICBpZiAoYW5kcm9pZCAmJiB2aWV3LmRvbU9ic2VydmVyLmZsdXNoaW5nU29vbiA+PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmlldy5kb21PYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgY2xlYXJDb21wb3NpdGlvbih2aWV3KTtcbiAgICBpZiAocmVzdGFydGluZyB8fCB2aWV3LmRvY1ZpZXcgJiYgdmlldy5kb2NWaWV3LmRpcnR5KSB7XG4gICAgICAgIGxldCBzZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpLCBjdXIgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHNlbCAmJiAhc2VsLmVxKGN1cikpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCkpO1xuICAgICAgICBlbHNlIGlmICgodmlldy5tYXJrQ3Vyc29yIHx8IHJlc3RhcnRpbmcpICYmICFjdXIuJGZyb20ubm9kZShjdXIuJGZyb20uc2hhcmVkRGVwdGgoY3VyLnRvKSkuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5kZWxldGVTZWxlY3Rpb24oKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlldy5zdGF0ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCBkb20pIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHdyYXAgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHdyYXAuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICB3cmFwLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24oKSwgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhkb20pO1xuICAgIC8vIERvbmUgYmVjYXVzZSBJRSB3aWxsIGZpcmUgYSBzZWxlY3Rpb25jaGFuZ2UgbW92aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAvLyB0byBpdHMgc3RhcnQgd2hlbiByZW1vdmVBbGxSYW5nZXMgaXMgY2FsbGVkIGFuZCB0aGUgZWRpdG9yIHN0aWxsXG4gICAgLy8gaGFzIGZvY3VzICh3aGljaCB3aWxsIG1lc3MgdXAgdGhlIGVkaXRvcidzIHNlbGVjdGlvbiBzdGF0ZSkuXG4gICAgdmlldy5kb20uYmx1cigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAod3JhcC5wYXJlbnROb2RlKVxuICAgICAgICAgICAgd3JhcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXApO1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgfSwgNTApO1xufVxuLy8gVGhpcyBpcyB2ZXJ5IGNydWRlLCBidXQgdW5mb3J0dW5hdGVseSBib3RoIHRoZXNlIGJyb3dzZXJzIF9wcmV0ZW5kX1xuLy8gdGhhdCB0aGV5IGhhdmUgYSBjbGlwYm9hcmQgQVBJ4oCUYWxsIHRoZSBvYmplY3RzIGFuZCBtZXRob2RzIGFyZVxuLy8gdGhlcmUsIHRoZXkganVzdCBkb24ndCB3b3JrLCBhbmQgdGhleSBhcmUgaGFyZCB0byB0ZXN0LlxuY29uc3QgYnJva2VuQ2xpcGJvYXJkQVBJID0gKGllICYmIGllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoaW9zICYmIHdlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmhhbmRsZXJzLmNvcHkgPSBlZGl0SGFuZGxlcnMuY3V0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24sIGN1dCA9IGV2ZW50LnR5cGUgPT0gXCJjdXRcIjtcbiAgICBpZiAoc2VsLmVtcHR5KVxuICAgICAgICByZXR1cm47XG4gICAgLy8gSUUgYW5kIEVkZ2UncyBjbGlwYm9hcmQgaW50ZXJmYWNlIGlzIGNvbXBsZXRlbHkgYnJva2VuXG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBsZXQgc2xpY2UgPSBzZWwuY29udGVudCgpLCB7IGRvbSwgdGV4dCB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgZG9tLmlubmVySFRNTCk7XG4gICAgICAgIGRhdGEuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCBkb20pO1xuICAgIH1cbiAgICBpZiAoY3V0KVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlU2VsZWN0aW9uKCkuc2Nyb2xsSW50b1ZpZXcoKS5zZXRNZXRhKFwidWlFdmVudFwiLCBcImN1dFwiKSk7XG59O1xuZnVuY3Rpb24gc2xpY2VTaW5nbGVOb2RlKHNsaWNlKSB7XG4gICAgcmV0dXJuIHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLm9wZW5FbmQgPT0gMCAmJiBzbGljZS5jb250ZW50LmNoaWxkQ291bnQgPT0gMSA/IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCA6IG51bGw7XG59XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXZpZXcuZG9tLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgcGxhaW5UZXh0ID0gdmlldy5pbnB1dC5zaGlmdEtleSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQudHlwZS5zcGVjLmNvZGU7XG4gICAgbGV0IHRhcmdldCA9IHZpZXcuZG9tLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwbGFpblRleHQgPyBcInRleHRhcmVhXCIgOiBcImRpdlwiKSk7XG4gICAgaWYgKCFwbGFpblRleHQpXG4gICAgICAgIHRhcmdldC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB0YXJnZXQuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAtMTAwMDBweDsgdG9wOiAxMHB4XCI7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgbGV0IHBsYWluID0gdmlldy5pbnB1dC5zaGlmdEtleSAmJiB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlICE9IDQ1O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIGlmICh0YXJnZXQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgICAgIGlmIChwbGFpblRleHQpXG4gICAgICAgICAgICBkb1Bhc3RlKHZpZXcsIHRhcmdldC52YWx1ZSwgbnVsbCwgcGxhaW4sIGV2ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudGV4dENvbnRlbnQsIHRhcmdldC5pbm5lckhUTUwsIHBsYWluLCBldmVudCk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZG9QYXN0ZSh2aWV3LCB0ZXh0LCBodG1sLCBwcmVmZXJQbGFpbiwgZXZlbnQpIHtcbiAgICBsZXQgc2xpY2UgPSBwYXJzZUZyb21DbGlwYm9hcmQodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIHZpZXcuc3RhdGUuc2VsZWN0aW9uLiRmcm9tKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZVBhc3RlXCIsIGYgPT4gZih2aWV3LCBldmVudCwgc2xpY2UgfHwgU2xpY2UuZW1wdHkpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzaW5nbGVOb2RlID0gc2xpY2VTaW5nbGVOb2RlKHNsaWNlKTtcbiAgICBsZXQgdHIgPSBzaW5nbGVOb2RlXG4gICAgICAgID8gdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChzaW5nbGVOb2RlLCBwcmVmZXJQbGFpbilcbiAgICAgICAgOiB2aWV3LnN0YXRlLnRyLnJlcGxhY2VTZWxlY3Rpb24oc2xpY2UpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKS5zZXRNZXRhKFwicGFzdGVcIiwgdHJ1ZSkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJwYXN0ZVwiKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRUZXh0KGNsaXBib2FyZERhdGEpIHtcbiAgICBsZXQgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICBpZiAodGV4dClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgbGV0IHVyaXMgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3VyaS1saXN0XCIpO1xuICAgIHJldHVybiB1cmlzID8gdXJpcy5yZXBsYWNlKC9cXHI/XFxuL2csIFwiIFwiKSA6IFwiXCI7XG59XG5lZGl0SGFuZGxlcnMucGFzdGUgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIEhhbmRsaW5nIHBhc3RlIGZyb20gSmF2YVNjcmlwdCBkdXJpbmcgY29tcG9zaXRpb24gaXMgdmVyeSBwb29ybHlcbiAgICAvLyBoYW5kbGVkIGJ5IGJyb3dzZXJzLCBzbyBhcyBhIGRvZGd5IGJ1dCBwcmVmZXJhYmxlIGtsdWRnZSwgd2UganVzdFxuICAgIC8vIGxldCB0aGUgYnJvd3NlciBkbyBpdHMgbmF0aXZlIHRoaW5nIHRoZXJlLCBleGNlcHQgb24gQW5kcm9pZCxcbiAgICAvLyB3aGVyZSB0aGUgZWRpdG9yIGlzIGFsbW9zdCBhbHdheXMgY29tcG9zaW5nLlxuICAgIGlmICh2aWV3LmNvbXBvc2luZyAmJiAhYW5kcm9pZClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHBsYWluID0gdmlldy5pbnB1dC5zaGlmdEtleSAmJiB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlICE9IDQ1O1xuICAgIGlmIChkYXRhICYmIGRvUGFzdGUodmlldywgZ2V0VGV4dChkYXRhKSwgZGF0YS5nZXREYXRhKFwidGV4dC9odG1sXCIpLCBwbGFpbiwgZXZlbnQpKVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGVsc2VcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KTtcbn07XG5jbGFzcyBEcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3Ioc2xpY2UsIG1vdmUsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlO1xuICAgICAgICB0aGlzLm1vdmUgPSBtb3ZlO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbn1cbmNvbnN0IGRyYWdDb3B5TW9kaWZpZXIgPSBtYWMgPyBcImFsdEtleVwiIDogXCJjdHJsS2V5XCI7XG5mdW5jdGlvbiBkcmFnTW92ZXModmlldywgZXZlbnQpIHtcbiAgICBsZXQgbW92ZXMgPSB2aWV3LnNvbWVQcm9wKFwiZHJhZ0NvcGllc1wiLCB0ZXN0ID0+ICF0ZXN0KGV2ZW50KSk7XG4gICAgcmV0dXJuIG1vdmVzICE9IG51bGwgPyBtb3ZlcyA6ICFldmVudFtkcmFnQ29weU1vZGlmaWVyXTtcbn1cbmhhbmRsZXJzLmRyYWdzdGFydCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IG1vdXNlRG93biA9IHZpZXcuaW5wdXQubW91c2VEb3duO1xuICAgIGlmIChtb3VzZURvd24pXG4gICAgICAgIG1vdXNlRG93bi5kb25lKCk7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHBvcyA9IHNlbC5lbXB0eSA/IG51bGwgOiB2aWV3LnBvc0F0Q29vcmRzKGV2ZW50Q29vcmRzKGV2ZW50KSk7XG4gICAgbGV0IG5vZGU7XG4gICAgaWYgKHBvcyAmJiBwb3MucG9zID49IHNlbC5mcm9tICYmIHBvcy5wb3MgPD0gKHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gPyBzZWwudG8gLSAxIDogc2VsLnRvKSkgO1xuICAgIGVsc2UgaWYgKG1vdXNlRG93biAmJiBtb3VzZURvd24ubWlnaHREcmFnKSB7XG4gICAgICAgIG5vZGUgPSBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgbW91c2VEb3duLm1pZ2h0RHJhZy5wb3MpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZXZlbnQudGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgZGVzYyAhPSB2aWV3LmRvY1ZpZXcpXG4gICAgICAgICAgICBub2RlID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIGRlc2MucG9zQmVmb3JlKTtcbiAgICB9XG4gICAgbGV0IGRyYWdnZWRTbGljZSA9IChub2RlIHx8IHZpZXcuc3RhdGUuc2VsZWN0aW9uKS5jb250ZW50KCk7XG4gICAgbGV0IHsgZG9tLCB0ZXh0LCBzbGljZSB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIGRyYWdnZWRTbGljZSk7XG4gICAgLy8gUHJlLTEyMCBDaHJvbWUgdmVyc2lvbnMgY2xlYXIgZmlsZXMgd2hlbiBjYWxsaW5nIGBjbGVhckRhdGFgICgjMTQ3MilcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggfHwgIWNocm9tZSB8fCBjaHJvbWVfdmVyc2lvbiA+IDEyMClcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKGJyb2tlbkNsaXBib2FyZEFQSSA/IFwiVGV4dFwiIDogXCJ0ZXh0L2h0bWxcIiwgZG9tLmlubmVySFRNTCk7XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci9pc3N1ZXMvMTE1NlxuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5TW92ZVwiO1xuICAgIGlmICghYnJva2VuQ2xpcGJvYXJkQVBJKVxuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGV4dCk7XG4gICAgdmlldy5kcmFnZ2luZyA9IG5ldyBEcmFnZ2luZyhzbGljZSwgZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSwgbm9kZSk7XG59O1xuaGFuZGxlcnMuZHJhZ2VuZCA9IHZpZXcgPT4ge1xuICAgIGxldCBkcmFnZ2luZyA9IHZpZXcuZHJhZ2dpbmc7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodmlldy5kcmFnZ2luZyA9PSBkcmFnZ2luZylcbiAgICAgICAgICAgIHZpZXcuZHJhZ2dpbmcgPSBudWxsO1xuICAgIH0sIDUwKTtcbn07XG5lZGl0SGFuZGxlcnMuZHJhZ292ZXIgPSBlZGl0SGFuZGxlcnMuZHJhZ2VudGVyID0gKF8sIGUpID0+IGUucHJldmVudERlZmF1bHQoKTtcbmVkaXRIYW5kbGVycy5kcm9wID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHZpZXcuZHJhZ2dpbmcgPSBudWxsO1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGV2ZW50UG9zID0gdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGlmICghZXZlbnRQb3MpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgJG1vdXNlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShldmVudFBvcy5wb3MpO1xuICAgIGxldCBzbGljZSA9IGRyYWdnaW5nICYmIGRyYWdnaW5nLnNsaWNlO1xuICAgIGlmIChzbGljZSkge1xuICAgICAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIGdldFRleHQoZXZlbnQuZGF0YVRyYW5zZmVyKSwgYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9odG1sXCIpLCBmYWxzZSwgJG1vdXNlKTtcbiAgICB9XG4gICAgbGV0IG1vdmUgPSAhIShkcmFnZ2luZyAmJiBkcmFnTW92ZXModmlldywgZXZlbnQpKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZURyb3BcIiwgZiA9PiBmKHZpZXcsIGV2ZW50LCBzbGljZSB8fCBTbGljZS5lbXB0eSwgbW92ZSkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IGluc2VydFBvcyA9IHNsaWNlID8gZHJvcFBvaW50KHZpZXcuc3RhdGUuZG9jLCAkbW91c2UucG9zLCBzbGljZSkgOiAkbW91c2UucG9zO1xuICAgIGlmIChpbnNlcnRQb3MgPT0gbnVsbClcbiAgICAgICAgaW5zZXJ0UG9zID0gJG1vdXNlLnBvcztcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgIGlmIChtb3ZlKSB7XG4gICAgICAgIGxldCB7IG5vZGUgfSA9IGRyYWdnaW5nO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG5vZGUucmVwbGFjZSh0cik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBsZXQgcG9zID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICBsZXQgaXNOb2RlID0gc2xpY2Uub3BlblN0YXJ0ID09IDAgJiYgc2xpY2Uub3BlbkVuZCA9PSAwICYmIHNsaWNlLmNvbnRlbnQuY2hpbGRDb3VudCA9PSAxO1xuICAgIGxldCBiZWZvcmVJbnNlcnQgPSB0ci5kb2M7XG4gICAgaWYgKGlzTm9kZSlcbiAgICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChwb3MsIHBvcywgc2xpY2UuY29udGVudC5maXJzdENoaWxkKTtcbiAgICBlbHNlXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZShwb3MsIHBvcywgc2xpY2UpO1xuICAgIGlmICh0ci5kb2MuZXEoYmVmb3JlSW5zZXJ0KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoaXNOb2RlICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCkgJiZcbiAgICAgICAgJHBvcy5ub2RlQWZ0ZXIgJiYgJHBvcy5ub2RlQWZ0ZXIuc2FtZU1hcmt1cChzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgZW5kID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICAgICAgdHIubWFwcGluZy5tYXBzW3RyLm1hcHBpbmcubWFwcy5sZW5ndGggLSAxXS5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IGVuZCA9IG5ld1RvKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkJldHdlZW4odmlldywgJHBvcywgdHIuZG9jLnJlc29sdmUoZW5kKSkpO1xuICAgIH1cbiAgICB2aWV3LmZvY3VzKCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zZXRNZXRhKFwidWlFdmVudFwiLCBcImRyb3BcIikpO1xufTtcbmhhbmRsZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSBEYXRlLm5vdygpO1xuICAgIGlmICghdmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmRvY1ZpZXcgJiYgdmlldy5oYXNGb2N1cygpICYmICF2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbn07XG5oYW5kbGVycy5ibHVyID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAodmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAmJiB2aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBkbyBtb3JlIHdpdGggYmVmb3JlaW5wdXQgZXZlbnRzLCBidXQgc3VwcG9ydFxuICAgIC8vIGlzIHNvIHNwb3R0eSB0aGF0IEknbSBzdGlsbCB3YWl0aW5nIHRvIHNlZSB3aGVyZSB0aGV5IGFyZSBnb2luZy5cbiAgICAvLyBWZXJ5IHNwZWNpZmljIGhhY2sgdG8gZGVhbCB3aXRoIGJhY2tzcGFjZSBzb21ldGltZXMgZmFpbGluZyBvblxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdoZW4gYWZ0ZXIgYW4gdW5lZGl0YWJsZSBub2RlLlxuICAgIGlmIChjaHJvbWUgJiYgYW5kcm9pZCAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgICAgICBsZXQgeyBkb21DaGFuZ2VDb3VudCB9ID0gdmlldy5pbnB1dDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCAhPSBkb21DaGFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGFscmVhZHkgaGFkIHNvbWUgZWZmZWN0XG4gICAgICAgICAgICAvLyBUaGlzIGJ1ZyB0ZW5kcyB0byBjbG9zZSB0aGUgdmlydHVhbCBrZXlib2FyZCwgc28gd2UgcmVmb2N1c1xuICAgICAgICAgICAgdmlldy5kb20uYmx1cigpO1xuICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgLy8gQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiBiYWNrc3BhY2UgYmVoYXZpb3Igd2hlbiBubyBjb21tYW5kIGhhbmRsZWQgaXRcbiAgICAgICAgICAgIGlmICgkY3Vyc29yICYmICRjdXJzb3IucG9zID4gMClcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlKCRjdXJzb3IucG9zIC0gMSwgJGN1cnNvci5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbi8vIE1ha2Ugc3VyZSBhbGwgaGFuZGxlcnMgZ2V0IHJlZ2lzdGVyZWRcbmZvciAobGV0IHByb3AgaW4gZWRpdEhhbmRsZXJzKVxuICAgIGhhbmRsZXJzW3Byb3BdID0gZWRpdEhhbmRsZXJzW3Byb3BdO1xuXG5mdW5jdGlvbiBjb21wYXJlT2JqcyhhLCBiKSB7XG4gICAgaWYgKGEgPT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICBpZiAoYVtwXSAhPT0gYltwXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b0RPTSwgc3BlYykge1xuICAgICAgICB0aGlzLnRvRE9NID0gdG9ET007XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgICAgICB0aGlzLnNpZGUgPSB0aGlzLnNwZWMuc2lkZSB8fCAwO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgcG9zLCBkZWxldGVkIH0gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihwb3MgLSBvZmZzZXQsIHBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRUeXBlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuc3BlYy5rZXkgJiYgdGhpcy5zcGVjLmtleSA9PSBvdGhlci5zcGVjLmtleSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvRE9NID09IG90aGVyLnRvRE9NICYmIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpKTtcbiAgICB9XG4gICAgZGVzdHJveShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnNwZWMuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMuc3BlYy5kZXN0cm95KG5vZGUpO1xuICAgIH1cbn1cbmNsYXNzIElubGluZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYyB8fCBub1NwZWM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBzcGFuLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHNwYW4uZnJvbSArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZVN0YXJ0ID8gLTEgOiAxKSAtIG9mZnNldDtcbiAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAoc3Bhbi50byArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZUVuZCA/IDEgOiAtMSkgLSBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBmcm9tID49IHRvID8gbnVsbCA6IG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQoXywgc3BhbikgeyByZXR1cm4gc3Bhbi5mcm9tIDwgc3Bhbi50bzsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBJbmxpbmVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBzdGF0aWMgaXMoc3BhbikgeyByZXR1cm4gc3Bhbi50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIDEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHNwYW4udG8gKyBvbGRPZmZzZXQsIC0xKTtcbiAgICAgICAgaWYgKHRvLmRlbGV0ZWQgfHwgdG8ucG9zIDw9IGZyb20ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLnBvcyAtIG9mZnNldCwgdG8ucG9zIC0gb2Zmc2V0LCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQobm9kZSwgc3Bhbikge1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHNwYW4uZnJvbSksIGNoaWxkO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID09IHNwYW4uZnJvbSAmJiAhKGNoaWxkID0gbm9kZS5jaGlsZChpbmRleCkpLmlzVGV4dCAmJiBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSA9PSBzcGFuLnRvO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgTm9kZVR5cGUgJiYgY29tcGFyZU9ianModGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZU9ianModGhpcy5zcGVjLCBvdGhlci5zcGVjKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbi8qKlxuRGVjb3JhdGlvbiBvYmplY3RzIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgdmlldyB0aHJvdWdoIHRoZVxuW2BkZWNvcmF0aW9uc2AgcHJvcF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuZGVjb3JhdGlvbnMpLiBUaGV5IGNvbWUgaW5cbnNldmVyYWwgdmFyaWFudHPigJRzZWUgdGhlIHN0YXRpYyBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgZm9yIGRldGFpbHMuXG4qL1xuY2xhc3MgRGVjb3JhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uLiBXaWxsIGJlIHRoZSBzYW1lIGFzIGBmcm9tYCBmb3IgW3dpZGdldFxuICAgIGRlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXndpZGdldCkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb3B5KGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcy50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxKG90aGVyLnR5cGUpICYmIHRoaXMuZnJvbSArIG9mZnNldCA9PSBvdGhlci5mcm9tICYmIHRoaXMudG8gKyBvZmZzZXQgPT0gb3RoZXIudG87XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUubWFwKG1hcHBpbmcsIHRoaXMsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlIHRoYXQncyBzaG93biBpblxuICAgIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91XG4gICAgZGVsYXkgcmVuZGVyaW5nIHRoZSB3aWRnZXQgYnkgcGFzc2luZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZVxuICAgIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYWN0dWFsbHkgZHJhd24gaW4gYSB2aWV3LCBidXQgeW91IGNhblxuICAgIGFsc28gZGlyZWN0bHkgcGFzcyBhIERPTSBub2RlLiBgZ2V0UG9zYCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZVxuICAgIHdpZGdldCdzIGN1cnJlbnQgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHBvcywgdG9ET00sIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKHBvcywgcG9zLCBuZXcgV2lkZ2V0VHlwZSh0b0RPTSwgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGVzIGFuIGlubGluZSBkZWNvcmF0aW9uLCB3aGljaCBhZGRzIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIHRvXG4gICAgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbiAgICAqL1xuICAgIHN0YXRpYyBpbmxpbmUoZnJvbSwgdG8sIGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgbmV3IElubGluZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIG5vZGUgZGVjb3JhdGlvbi4gYGZyb21gIGFuZCBgdG9gIHNob3VsZCBwb2ludCBwcmVjaXNlbHlcbiAgICBiZWZvcmUgYW5kIGFmdGVyIGEgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFRoYXQgbm9kZSwgYW5kIG9ubHkgdGhhdFxuICAgIG5vZGUsIHdpbGwgcmVjZWl2ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBub2RlKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBOb2RlVHlwZShhdHRycywgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3BlYyBwcm92aWRlZCB3aGVuIGNyZWF0aW5nIHRoaXMgZGVjb3JhdGlvbi4gQ2FuIGJlIHVzZWZ1bFxuICAgIGlmIHlvdSd2ZSBzdG9yZWQgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhhdCBvYmplY3QuXG4gICAgKi9cbiAgICBnZXQgc3BlYygpIHsgcmV0dXJuIHRoaXMudHlwZS5zcGVjOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHdpZGdldCgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIFdpZGdldFR5cGU7IH1cbn1cbmNvbnN0IG5vbmUgPSBbXSwgbm9TcGVjID0ge307XG4vKipcbkEgY29sbGVjdGlvbiBvZiBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pLCBvcmdhbml6ZWQgaW4gc3VjaFxuYSB3YXkgdGhhdCB0aGUgZHJhd2luZyBhbGdvcml0aG0gY2FuIGVmZmljaWVudGx5IHVzZSBhbmQgY29tcGFyZVxudGhlbS4gVGhpcyBpcyBhIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmXigJRpdCBpcyBub3QgbW9kaWZpZWQsXG51cGRhdGVzIGNyZWF0ZSBhIG5ldyB2YWx1ZS5cbiovXG5jbGFzcyBEZWNvcmF0aW9uU2V0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsLCBjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWwubGVuZ3RoID8gbG9jYWwgOiBub25lO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW4gOiBub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMsIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdpdmVuXG4gICAgZG9jdW1lbnQuIFRoaXMgd2lsbCBjb25zdW1lIChtb2RpZnkpIHRoZSBgZGVjb3JhdGlvbnNgIGFycmF5LCBzb1xuICAgIHlvdSBtdXN0IG1ha2UgYSBjb3B5IGlmIHlvdSB3YW50IG5lZWQgdG8gcHJlc2VydmUgdGhhdC5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBkZWNvcmF0aW9ucykge1xuICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnMubGVuZ3RoID8gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBkb2MsIDAsIG5vU3BlYykgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQgd2hpY2ggdG91Y2ggdGhlIGdpdmVuIHJhbmdlXG4gICAgKGluY2x1ZGluZyBkZWNvcmF0aW9ucyB0aGF0IHN0YXJ0IG9yIGVuZCBkaXJlY3RseSBhdCB0aGVcbiAgICBib3VuZGFyaWVzKSBhbmQgbWF0Y2ggdGhlIGdpdmVuIHByZWRpY2F0ZSBvbiB0aGVpciBzcGVjLiBXaGVuXG4gICAgYHN0YXJ0YCBhbmQgYGVuZGAgYXJlIG9taXR0ZWQsIGFsbCBkZWNvcmF0aW9ucyBpbiB0aGUgc2V0IGFyZVxuICAgIGNvbnNpZGVyZWQuIFdoZW4gYHByZWRpY2F0ZWAgaXNuJ3QgZ2l2ZW4sIGFsbCBkZWNvcmF0aW9ucyBhcmVcbiAgICBhc3N1bWVkIHRvIG1hdGNoLlxuICAgICovXG4gICAgZmluZChzdGFydCwgZW5kLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZpbmRJbm5lcihzdGFydCA9PSBudWxsID8gMCA6IHN0YXJ0LCBlbmQgPT0gbnVsbCA/IDFlOSA6IGVuZCwgcmVzdWx0LCAwLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmaW5kSW5uZXIoc3RhcnQsIGVuZCwgcmVzdWx0LCBvZmZzZXQsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gZW5kICYmIHNwYW4udG8gPj0gc3RhcnQgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNwYW4uc3BlYykpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYW4uY29weShzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldIDwgZW5kICYmIHRoaXMuY2hpbGRyZW5baSArIDFdID4gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPZmYgPSB0aGlzLmNoaWxkcmVuW2ldICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAyXS5maW5kSW5uZXIoc3RhcnQgLSBjaGlsZE9mZiwgZW5kIC0gY2hpbGRPZmYsIHJlc3VsdCwgb2Zmc2V0ICsgY2hpbGRPZmYsIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgaW4gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZywgZG9jLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5IHx8IG1hcHBpbmcubWFwcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBJbm5lcihtYXBwaW5nLCBkb2MsIDAsIDAsIG9wdGlvbnMgfHwgbm9TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXBJbm5lcihtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgbmV3TG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQgJiYgbWFwcGVkLnR5cGUudmFsaWQobm9kZSwgbWFwcGVkKSlcbiAgICAgICAgICAgICAgICAobmV3TG9jYWwgfHwgKG5ld0xvY2FsID0gW10pKS5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUodGhpcy5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbWFwQ2hpbGRyZW4odGhpcy5jaGlsZHJlbiwgbmV3TG9jYWwgfHwgW10sIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ld0xvY2FsID8gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIG5vbmUpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVjb3JhdGlvbnMgdG8gdGhlIG9uZXMgaW4gdGhlIHNldCxcbiAgICBwcm9kdWNpbmcgYSBuZXcgc2V0LiBDb25zdW1lcyB0aGUgYGRlY29yYXRpb25zYCBhcnJheS4gTmVlZHNcbiAgICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0cmVlXG4gICAgc3RydWN0dXJlLlxuICAgICovXG4gICAgYWRkKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFkZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZElubmVyKGRvYywgZGVjb3JhdGlvbnMsIDApO1xuICAgIH1cbiAgICBhZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuLCBjaGlsZEluZGV4ID0gMDtcbiAgICAgICAgZG9jLmZvckVhY2goKGNoaWxkTm9kZSwgY2hpbGRPZmZzZXQpID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlT2Zmc2V0ID0gY2hpbGRPZmZzZXQgKyBvZmZzZXQsIGZvdW5kO1xuICAgICAgICAgICAgaWYgKCEoZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKGRlY29yYXRpb25zLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkSW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bY2hpbGRJbmRleF0gPCBjaGlsZE9mZnNldClcbiAgICAgICAgICAgICAgICBjaGlsZEluZGV4ICs9IDM7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRJbmRleF0gPT0gY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdID0gY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdLmFkZElubmVyKGNoaWxkTm9kZSwgZm91bmQsIGJhc2VPZmZzZXQgKyAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoY2hpbGRJbmRleCwgMCwgY2hpbGRPZmZzZXQsIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgYmFzZU9mZnNldCArIDEsIG5vU3BlYykpO1xuICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxvY2FsID0gbW92ZVNwYW5zKGNoaWxkSW5kZXggPyB3aXRob3V0TnVsbHMoZGVjb3JhdGlvbnMpIDogZGVjb3JhdGlvbnMsIC1vZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFsb2NhbFtpXS50eXBlLnZhbGlkKGRvYywgbG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShpLS0sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobG9jYWwubGVuZ3RoID8gdGhpcy5sb2NhbC5jb25jYXQobG9jYWwpLnNvcnQoYnlQb3MpIDogdGhpcy5sb2NhbCwgY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzZXQgdGhhdCBjb250YWlucyB0aGUgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQsIG1pbnVzXG4gICAgdGhlIG9uZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICAgICovXG4gICAgcmVtb3ZlKGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUlubmVyKGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgcmVtb3ZlSW5uZXIoZGVjb3JhdGlvbnMsIG9mZnNldCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLCBsb2NhbCA9IHRoaXMubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY2hpbGRyZW5baV0gKyBvZmZzZXQsIHRvID0gY2hpbGRyZW5baSArIDFdICsgb2Zmc2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIHNwYW47IGogPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPiBmcm9tICYmIHNwYW4udG8gPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnNbal0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gY2hpbGRyZW5baSArIDJdLnJlbW92ZUlubmVyKGZvdW5kLCBmcm9tICsgMSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IHJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbC5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IGRlY29yYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzcGFuID0gZGVjb3JhdGlvbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsb2NhbC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFtqXS5lcShzcGFuLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5sb2NhbC5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4gJiYgbG9jYWwgPT0gdGhpcy5sb2NhbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbG9jYWwubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLCBjaGlsZHJlbikgOiBlbXB0eTtcbiAgICB9XG4gICAgZm9yQ2hpbGQob2Zmc2V0LCBub2RlKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgY2hpbGQsIGxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA+PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA9PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpICsgMl07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IG9mZnNldCArIDEsIGVuZCA9IHN0YXJ0ICsgbm9kZS5jb250ZW50LnNpemU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGRlYyA9IHRoaXMubG9jYWxbaV07XG4gICAgICAgICAgICBpZiAoZGVjLmZyb20gPCBlbmQgJiYgZGVjLnRvID4gc3RhcnQgJiYgKGRlYy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHN0YXJ0LCBkZWMuZnJvbSkgLSBzdGFydCwgdG8gPSBNYXRoLm1pbihlbmQsIGRlYy50bykgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKVxuICAgICAgICAgICAgICAgICAgICAobG9jYWwgfHwgKGxvY2FsID0gW10pKS5wdXNoKGRlYy5jb3B5KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxTZXQgPSBuZXcgRGVjb3JhdGlvblNldChsb2NhbC5zb3J0KGJ5UG9zKSwgbm9uZSk7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQgPyBuZXcgRGVjb3JhdGlvbkdyb3VwKFtsb2NhbFNldCwgY2hpbGRdKSA6IGxvY2FsU2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZCB8fCBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcyA9PSBvdGhlcilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpIHx8XG4gICAgICAgICAgICB0aGlzLmxvY2FsLmxlbmd0aCAhPSBvdGhlci5sb2NhbC5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9IG90aGVyLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvY2FsW2ldLmVxKG90aGVyLmxvY2FsW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldICE9IG90aGVyLmNoaWxkcmVuW2ldIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpICsgMV0gIT0gb3RoZXIuY2hpbGRyZW5baSArIDFdIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMuY2hpbGRyZW5baSArIDJdLmVxKG90aGVyLmNoaWxkcmVuW2kgKyAyXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlT3ZlcmxhcCh0aGlzLmxvY2Fsc0lubmVyKG5vZGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBsb2NhbHNJbm5lcihub2RlKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIG5vbmU7XG4gICAgICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQgfHwgIXRoaXMubG9jYWwuc29tZShJbmxpbmVUeXBlLmlzKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5sb2NhbFtpXS50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZSkpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sb2NhbFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZm9yRWFjaFNldChmKSB7IGYodGhpcyk7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uU2V0LmVtcHR5ID0gbmV3IERlY29yYXRpb25TZXQoW10sIFtdKTtcbi8qKlxuQGludGVybmFsXG4qL1xuRGVjb3JhdGlvblNldC5yZW1vdmVPdmVybGFwID0gcmVtb3ZlT3ZlcmxhcDtcbmNvbnN0IGVtcHR5ID0gRGVjb3JhdGlvblNldC5lbXB0eTtcbi8vIEFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjb2RlIGRlYWxpbmcgd2l0aCBkZWNvcmF0aW9ucyB0b1xuLy8gdHJlYXQgbXVsdGlwbGUgRGVjb3JhdGlvblNldCBvYmplY3RzIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgb2JqZWN0XG4vLyB3aXRoIChhIHN1YnNldCBvZikgdGhlIHNhbWUgaW50ZXJmYWNlLlxuY2xhc3MgRGVjb3JhdGlvbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihtZW1iZXJzKSB7XG4gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBkb2MpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRGVjb3MgPSB0aGlzLm1lbWJlcnMubWFwKG1lbWJlciA9PiBtZW1iZXIubWFwKG1hcHBpbmcsIGRvYywgbm9TcGVjKSk7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShtYXBwZWREZWNvcyk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1lbWJlcnNbaV0uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kLmNvbmNhdChyZXN1bHQubWVtYmVycyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvbkdyb3VwKSB8fFxuICAgICAgICAgICAgb3RoZXIubWVtYmVycy5sZW5ndGggIT0gdGhpcy5tZW1iZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVtYmVyc1tpXS5lcShvdGhlci5tZW1iZXJzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICBsZXQgcmVzdWx0LCBzb3J0ZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FscyA9IHRoaXMubWVtYmVyc1tpXS5sb2NhbHNJbm5lcihub2RlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9jYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsb2NhbHNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgPyByZW1vdmVPdmVybGFwKHNvcnRlZCA/IHJlc3VsdCA6IHJlc3VsdC5zb3J0KGJ5UG9zKSkgOiBub25lO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb24gc2V0cywgb3IgcmV0dXJuXG4gICAgLy8gYSBzaW5nbGUgc2V0IHdoZW4gcG9zc2libGUuXG4gICAgc3RhdGljIGZyb20obWVtYmVycykge1xuICAgICAgICBzd2l0Y2ggKG1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1lbWJlcnNbMF07XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbmV3IERlY29yYXRpb25Hcm91cChtZW1iZXJzLmV2ZXJ5KG0gPT4gbSBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpID8gbWVtYmVycyA6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5yZWR1Y2UoKHIsIG0pID0+IHIuY29uY2F0KG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0ID8gbSA6IG0ubWVtYmVycyksIFtdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaFNldChmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5tZW1iZXJzW2ldLmZvckVhY2hTZXQoZik7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ2hpbGRyZW4ob2xkQ2hpbGRyZW4sIG5ld0xvY2FsLCBtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgIGxldCBjaGlsZHJlbiA9IG9sZENoaWxkcmVuLnNsaWNlKCk7XG4gICAgLy8gTWFyayB0aGUgY2hpbGRyZW4gdGhhdCBhcmUgZGlyZWN0bHkgdG91Y2hlZCBieSBjaGFuZ2VzLCBhbmRcbiAgICAvLyBtb3ZlIHRob3NlIHRoYXQgYXJlIGFmdGVyIHRoZSBjaGFuZ2VzLlxuICAgIGZvciAobGV0IGkgPSAwLCBiYXNlT2Zmc2V0ID0gb2xkT2Zmc2V0OyBpIDwgbWFwcGluZy5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIG1hcHBpbmcubWFwc1tpXS5mb3JFYWNoKChvbGRTdGFydCwgb2xkRW5kLCBuZXdTdGFydCwgbmV3RW5kKSA9PiB7XG4gICAgICAgICAgICBsZXQgZFNpemUgPSAobmV3RW5kIC0gbmV3U3RhcnQpIC0gKG9sZEVuZCAtIG9sZFN0YXJ0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gY2hpbGRyZW5baSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPCAwIHx8IG9sZFN0YXJ0ID4gZW5kICsgYmFzZU9mZnNldCAtIG1vdmVkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjaGlsZHJlbltpXSArIGJhc2VPZmZzZXQgLSBtb3ZlZDtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW5kID49IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IG9sZFN0YXJ0IDw9IHN0YXJ0ID8gLTIgOiAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkU3RhcnQgPj0gYmFzZU9mZnNldCAmJiBkU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSArPSBkU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdICs9IGRTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmVkICs9IGRTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgYmFzZU9mZnNldCA9IG1hcHBpbmcubWFwc1tpXS5tYXAoYmFzZU9mZnNldCwgLTEpO1xuICAgIH1cbiAgICAvLyBGaW5kIHRoZSBjaGlsZCBub2RlcyB0aGF0IHN0aWxsIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgbm9kZSxcbiAgICAvLyByZWN1cnNpdmVseSBjYWxsIG1hcElubmVyIG9uIHRoZW0gYW5kIHVwZGF0ZSB0aGVpciBwb3NpdGlvbnMuXG4gICAgbGV0IG11c3RSZWJ1aWxkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA8IDApIHsgLy8gVG91Y2hlZCBub2Rlc1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA9PSAtMikge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSAtMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXAob2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQpLCBmcm9tTG9jYWwgPSBmcm9tIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGZyb21Mb2NhbCA8IDAgfHwgZnJvbUxvY2FsID49IG5vZGUuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTXVzdCByZWFkIG9sZENoaWxkcmVuIGJlY2F1c2UgY2hpbGRyZW4gd2FzIHRhZ2dlZCB3aXRoIC0xXG4gICAgICAgICAgICBsZXQgdG8gPSBtYXBwaW5nLm1hcChvbGRDaGlsZHJlbltpICsgMV0gKyBvbGRPZmZzZXQsIC0xKSwgdG9Mb2NhbCA9IHRvIC0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldDogY2hpbGRPZmZzZXQgfSA9IG5vZGUuY29udGVudC5maW5kSW5kZXgoZnJvbUxvY2FsKTtcbiAgICAgICAgICAgIGxldCBjaGlsZE5vZGUgPSBub2RlLm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSAmJiBjaGlsZE9mZnNldCA9PSBmcm9tTG9jYWwgJiYgY2hpbGRPZmZzZXQgKyBjaGlsZE5vZGUubm9kZVNpemUgPT0gdG9Mb2NhbCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXBwZWQgPSBjaGlsZHJlbltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgLm1hcElubmVyKG1hcHBpbmcsIGNoaWxkTm9kZSwgZnJvbSArIDEsIG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSA9IGZyb21Mb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gdG9Mb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDJdID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gLTI7XG4gICAgICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAvLyBSZW1haW5pbmcgY2hpbGRyZW4gbXVzdCBiZSBjb2xsZWN0ZWQgYW5kIHJlYnVpbHQgaW50byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlXG4gICAgaWYgKG11c3RSZWJ1aWxkKSB7XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IG1hcEFuZEdhdGhlclJlbWFpbmluZ0RlY29yYXRpb25zKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgbmV3TG9jYWwsIG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgbGV0IGJ1aWx0ID0gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBub2RlLCAwLCBvcHRpb25zKTtcbiAgICAgICAgbmV3TG9jYWwgPSBidWlsdC5sb2NhbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPCAwKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDMpO1xuICAgICAgICAgICAgICAgIGkgLT0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgYnVpbHQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gYnVpbHQuY2hpbGRyZW5baV07XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjaGlsZHJlbltqXSA8IGZyb20pXG4gICAgICAgICAgICAgICAgaiArPSAzO1xuICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGosIDAsIGJ1aWx0LmNoaWxkcmVuW2ldLCBidWlsdC5jaGlsZHJlbltpICsgMV0sIGJ1aWx0LmNoaWxkcmVuW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uU2V0KG5ld0xvY2FsLnNvcnQoYnlQb3MpLCBjaGlsZHJlbik7XG59XG5mdW5jdGlvbiBtb3ZlU3BhbnMoc3BhbnMsIG9mZnNldCkge1xuICAgIGlmICghb2Zmc2V0IHx8ICFzcGFucy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBzcGFucztcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICByZXN1bHQucHVzaChuZXcgRGVjb3JhdGlvbihzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQsIHNwYW4udHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwQW5kR2F0aGVyUmVtYWluaW5nRGVjb3JhdGlvbnMoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBkZWNvcmF0aW9ucywgbWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICAvLyBHYXRoZXIgYWxsIGRlY29yYXRpb25zIGZyb20gdGhlIHJlbWFpbmluZyBtYXJrZWQgY2hpbGRyZW5cbiAgICBmdW5jdGlvbiBnYXRoZXIoc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQgPSBzZXQubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKHNldC5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGdhdGhlcihzZXQuY2hpbGRyZW5baSArIDJdLCBzZXQuY2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA9PSAtMSlcbiAgICAgICAgICAgIGdhdGhlcihjaGlsZHJlbltpICsgMl0sIG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSk7XG4gICAgcmV0dXJuIGRlY29yYXRpb25zO1xufVxuZnVuY3Rpb24gdGFrZVNwYW5zRm9yTm9kZShzcGFucywgbm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZW5kID0gb2Zmc2V0ICsgbm9kZS5ub2RlU2l6ZSwgZm91bmQgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBzcGFuOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKChzcGFuID0gc3BhbnNbaV0pICYmIHNwYW4uZnJvbSA+IG9mZnNldCAmJiBzcGFuLnRvIDwgZW5kKSB7XG4gICAgICAgICAgICAoZm91bmQgfHwgKGZvdW5kID0gW10pKS5wdXNoKHNwYW4pO1xuICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIHdpdGhvdXROdWxscyhhcnJheSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gbnVsbClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQnVpbGQgdXAgYSB0cmVlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzZXQgb2YgZGVjb3JhdGlvbnMuIGBvZmZzZXRgXG4vLyBpcyBhIGJhc2Ugb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYGZyb21gIGFuZCBgdG9gXG4vLyBwb3NpdGlvbnMgaW4gdGhlIHNwYW5zIChzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgbmV3IHNwYW5zXG4vLyBmb3IgcmVjdXJzaXZlIGNhbGxzKS5cbmZ1bmN0aW9uIGJ1aWxkVHJlZShzcGFucywgbm9kZSwgb2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gW10sIGhhc051bGxzID0gZmFsc2U7XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZE5vZGUsIGxvY2FsU3RhcnQpID0+IHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGFrZVNwYW5zRm9yTm9kZShzcGFucywgY2hpbGROb2RlLCBsb2NhbFN0YXJ0ICsgb2Zmc2V0KTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBoYXNOdWxscyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgc3VidHJlZSA9IGJ1aWxkVHJlZShmb3VuZCwgY2hpbGROb2RlLCBvZmZzZXQgKyBsb2NhbFN0YXJ0ICsgMSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoc3VidHJlZSAhPSBlbXB0eSlcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGxvY2FsU3RhcnQsIGxvY2FsU3RhcnQgKyBjaGlsZE5vZGUubm9kZVNpemUsIHN1YnRyZWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGxvY2FscyA9IG1vdmVTcGFucyhoYXNOdWxscyA/IHdpdGhvdXROdWxscyhzcGFucykgOiBzcGFucywgLW9mZnNldCkuc29ydChieVBvcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghbG9jYWxzW2ldLnR5cGUudmFsaWQobm9kZSwgbG9jYWxzW2ldKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub25SZW1vdmUpXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlbW92ZShsb2NhbHNbaV0uc3BlYyk7XG4gICAgICAgICAgICBsb2NhbHMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbG9jYWxzLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPyBuZXcgRGVjb3JhdGlvblNldChsb2NhbHMsIGNoaWxkcmVuKSA6IGVtcHR5O1xufVxuLy8gVXNlZCB0byBzb3J0IGRlY29yYXRpb25zIHNvIHRoYXQgb25lcyB3aXRoIGEgbG93IHN0YXJ0IHBvc2l0aW9uXG4vLyBjb21lIGZpcnN0LCBhbmQgd2l0aGluIGEgc2V0IHdpdGggdGhlIHNhbWUgc3RhcnQgcG9zaXRpb24sIHRob3NlXG4vLyB3aXRoIGFuIHNtYWxsZXIgZW5kIHBvc2l0aW9uIGNvbWUgZmlyc3QuXG5mdW5jdGlvbiBieVBvcyhhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnRvIC0gYi50bztcbn1cbi8vIFNjYW4gYSBzb3J0ZWQgYXJyYXkgb2YgZGVjb3JhdGlvbnMgZm9yIHBhcnRpYWxseSBvdmVybGFwcGluZyBzcGFucyxcbi8vIGFuZCBzcGxpdCB0aG9zZSBzbyB0aGF0IG9ubHkgZnVsbHkgb3ZlcmxhcHBpbmcgc3BhbnMgYXJlIGxlZnQgKHRvXG4vLyBtYWtlIHN1YnNlcXVlbnQgcmVuZGVyaW5nIGVhc2llcikuIFdpbGwgcmV0dXJuIHRoZSBpbnB1dCBhcnJheSBpZlxuLy8gbm8gcGFydGlhbGx5IG92ZXJsYXBwaW5nIHNwYW5zIGFyZSBmb3VuZCAodGhlIGNvbW1vbiBjYXNlKS5cbmZ1bmN0aW9uIHJlbW92ZU92ZXJsYXAoc3BhbnMpIHtcbiAgICBsZXQgd29ya2luZyA9IHNwYW5zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29ya2luZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHNwYW4gPSB3b3JraW5nW2ldO1xuICAgICAgICBpZiAoc3Bhbi5mcm9tICE9IHNwYW4udG8pXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCB3b3JraW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB3b3JraW5nW2pdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPT0gc3Bhbi5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvICE9IHNwYW4udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nID09IHNwYW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSBzcGFucy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93ZWQgYnkgYSBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgbGFyZ2VyIHNwYW4uIFNwbGl0IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYW4uXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nW2pdID0gbmV4dC5jb3B5KG5leHQuZnJvbSwgc3Bhbi50byk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBaGVhZCh3b3JraW5nLCBqICsgMSwgbmV4dC5jb3B5KHNwYW4udG8sIG5leHQudG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPCBzcGFuLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZyA9PSBzcGFucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gc3BhbnMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhpcyBvbmUgb3ZlcmxhcHMgd2l0aCBhIHN1YnNlcXVlbnQgc3Bhbi4gU3BsaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ1tpXSA9IHNwYW4uY29weShzcGFuLmZyb20sIG5leHQuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBaGVhZCh3b3JraW5nLCBqLCBzcGFuLmNvcHkobmV4dC5mcm9tLCBzcGFuLnRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd29ya2luZztcbn1cbmZ1bmN0aW9uIGluc2VydEFoZWFkKGFycmF5LCBpLCBkZWNvKSB7XG4gICAgd2hpbGUgKGkgPCBhcnJheS5sZW5ndGggJiYgYnlQb3MoZGVjbywgYXJyYXlbaV0pID4gMClcbiAgICAgICAgaSsrO1xuICAgIGFycmF5LnNwbGljZShpLCAwLCBkZWNvKTtcbn1cbi8vIEdldCB0aGUgZGVjb3JhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHByb3BzIG9mIGEgdmlldy5cbmZ1bmN0aW9uIHZpZXdEZWNvcmF0aW9ucyh2aWV3KSB7XG4gICAgbGV0IGZvdW5kID0gW107XG4gICAgdmlldy5zb21lUHJvcChcImRlY29yYXRpb25zXCIsIGYgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZih2aWV3LnN0YXRlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gZW1wdHkpXG4gICAgICAgICAgICBmb3VuZC5wdXNoKHJlc3VsdCk7XG4gICAgfSk7XG4gICAgaWYgKHZpZXcuY3Vyc29yV3JhcHBlcilcbiAgICAgICAgZm91bmQucHVzaChEZWNvcmF0aW9uU2V0LmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgW3ZpZXcuY3Vyc29yV3JhcHBlci5kZWNvXSkpO1xuICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG59XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvIERPTUNoYXJhY3RlckRhdGFNb2RpZmllZFxuY29uc3QgdXNlQ2hhckRhdGEgPSBpZSAmJiBpZV92ZXJzaW9uIDw9IDExO1xuY2xhc3MgU2VsZWN0aW9uU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuZm9jdXNOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IDA7XG4gICAgfVxuICAgIHNldChzZWwpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBzZWwuZm9jdXNOb2RlO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgIH1cbiAgICBlcShzZWwpIHtcbiAgICAgICAgcmV0dXJuIHNlbC5hbmNob3JOb2RlID09IHRoaXMuYW5jaG9yTm9kZSAmJiBzZWwuYW5jaG9yT2Zmc2V0ID09IHRoaXMuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICBzZWwuZm9jdXNOb2RlID09IHRoaXMuZm9jdXNOb2RlICYmIHNlbC5mb2N1c09mZnNldCA9PSB0aGlzLmZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmNsYXNzIERPTU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoYW5kbGVET01DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5oYW5kbGVET01DaGFuZ2UgPSBoYW5kbGVET01DaGFuZ2U7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25TdGF0ZTtcbiAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhbmdlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyICYmXG4gICAgICAgICAgICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dGF0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gSUUxMSB3aWxsIHNvbWV0aW1lcyAob24gYmFja3NwYWNpbmcgb3V0IGEgc2luZ2xlIGNoYXJhY3RlclxuICAgICAgICAgICAgICAgIC8vIHRleHQgbm9kZSBhZnRlciBhIEJSIG5vZGUpIGNhbGwgdGhlIG9ic2VydmVyIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGFjdHVhbGx5IHVwZGF0aW5nIHRoZSBET00sIHdoaWNoIHdpbGwgY2F1c2VcbiAgICAgICAgICAgICAgICAvLyBQcm9zZU1pcnJvciB0byBtaXNzIHRoZSBjaGFuZ2UgKHNlZSAjOTMwKVxuICAgICAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBlLnRhcmdldCwgdHlwZTogXCJjaGFyYWN0ZXJEYXRhXCIsIG9sZFZhbHVlOiBlLnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBmbHVzaFNvb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoaW5nU29vbiA8IDApXG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTsgdGhpcy5mbHVzaCgpOyB9LCAyMCk7XG4gICAgfVxuICAgIGZvcmNlRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoaW5nU29vbiA+IC0xKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hpbmdTb29uKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gLTE7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3LmRvbSwgb2JzZXJ2ZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5jb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgICBsZXQgdGFrZSA9IHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcbiAgICAgICAgICAgIGlmICh0YWtlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFrZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHRha2VbaV0pO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZmx1c2goKSwgMjApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25DaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgY29ubmVjdFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmlldy5kb20ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICBzdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IGZhbHNlLCA1MCk7XG4gICAgfVxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIWhhc0ZvY3VzQW5kU2VsZWN0aW9uKHRoaXMudmlldykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25Ub0RPTSh0aGlzLnZpZXcpO1xuICAgICAgICAvLyBEZWxldGlvbnMgb24gSUUxMSBmaXJlIHRoZWlyIGV2ZW50cyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGdpdmluZ1xuICAgICAgICAvLyB1cyBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgYmVmb3JlIHRoZSBET00gY2hhbmdlcyBhcmVcbiAgICAgICAgLy8gcmVwb3J0ZWQuXG4gICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmICF0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy52aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgICAgICAvLyBTZWxlY3Rpb24uaXNDb2xsYXBzZWQgaXNuJ3QgcmVsaWFibGUgb24gSUVcbiAgICAgICAgICAgIGlmIChzZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgc2V0Q3VyU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uc2V0KHRoaXMudmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKTtcbiAgICB9XG4gICAgaWdub3JlU2VsZWN0aW9uQ2hhbmdlKHNlbCkge1xuICAgICAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGFuY2VzdG9ycyA9IG5ldyBTZXQsIGNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IHNlbC5mb2N1c05vZGU7IHNjYW47IHNjYW4gPSBwYXJlbnROb2RlKHNjYW4pKVxuICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChzY2FuKTtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IHNlbC5hbmNob3JOb2RlOyBzY2FuOyBzY2FuID0gcGFyZW50Tm9kZShzY2FuKSlcbiAgICAgICAgICAgIGlmIChhbmNlc3RvcnMuaGFzKHNjYW4pKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gc2NhbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IGRlc2MgPSBjb250YWluZXIgJiYgdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5pZ25vcmVNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBjb250YWluZXIubm9kZVR5cGUgPT0gMyA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldEN1clNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKVxuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKSlcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICBpZiAoIXZpZXcuZG9jVmlldyB8fCB0aGlzLmZsdXNoaW5nU29vbiA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbXV0YXRpb25zID0gdGhpcy5wZW5kaW5nUmVjb3JkcygpO1xuICAgICAgICBpZiAobXV0YXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1NlbCA9ICF0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyAmJiAhdGhpcy5jdXJyZW50U2VsZWN0aW9uLmVxKHNlbCkgJiYgaGFzRm9jdXNBbmRTZWxlY3Rpb24odmlldykgJiYgIXRoaXMuaWdub3JlU2VsZWN0aW9uQ2hhbmdlKHNlbCk7XG4gICAgICAgIGxldCBmcm9tID0gLTEsIHRvID0gLTEsIHR5cGVPdmVyID0gZmFsc2UsIGFkZGVkID0gW107XG4gICAgICAgIGlmICh2aWV3LmVkaXRhYmxlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlZ2lzdGVyTXV0YXRpb24obXV0YXRpb25zW2ldLCBhZGRlZCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gZnJvbSA8IDAgPyByZXN1bHQuZnJvbSA6IE1hdGgubWluKHJlc3VsdC5mcm9tLCBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgdG8gPSB0byA8IDAgPyByZXN1bHQudG8gOiBNYXRoLm1heChyZXN1bHQudG8sIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlT3ZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdlY2tvICYmIGFkZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGJycyA9IGFkZGVkLmZpbHRlcihuID0+IG4ubm9kZU5hbWUgPT0gXCJCUlwiKTtcbiAgICAgICAgICAgIGlmIChicnMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2EsIGJdID0gYnJzO1xuICAgICAgICAgICAgICAgIGlmIChhLnBhcmVudE5vZGUgJiYgYS5wYXJlbnROb2RlLnBhcmVudE5vZGUgPT0gYi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBiLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB7IGZvY3VzTm9kZSB9ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGJyIG9mIGJycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gYnIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgPT0gXCJMSVwiICYmICghZm9jdXNOb2RlIHx8IGJsb2NrUGFyZW50KHZpZXcsIGZvY3VzTm9kZSkgIT0gcGFyZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZFNlbCA9IG51bGw7XG4gICAgICAgIC8vIElmIGl0IGxvb2tzIGxpa2UgdGhlIGJyb3dzZXIgaGFzIHJlc2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBhZnRlciBmb2N1cywgcmVzdG9yZSB0aGUgc2VsZWN0aW9uIGZyb21cbiAgICAgICAgLy8gdGhlIHN0YXRlXG4gICAgICAgIGlmIChmcm9tIDwgMCAmJiBuZXdTZWwgJiYgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICBNYXRoLm1heCh2aWV3LmlucHV0Lmxhc3RUb3VjaCwgdmlldy5pbnB1dC5sYXN0Q2xpY2sudGltZSkgPCBEYXRlLm5vdygpIC0gMzAwICYmXG4gICAgICAgICAgICBzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSAmJiAocmVhZFNlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldykpICYmXG4gICAgICAgICAgICByZWFkU2VsLmVxKFNlbGVjdGlvbi5uZWFyKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoMCksIDEpKSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSAwO1xuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uc2V0KHNlbCk7XG4gICAgICAgICAgICB2aWV3LnNjcm9sbFRvU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZnJvbSA+IC0xIHx8IG5ld1NlbCkge1xuICAgICAgICAgICAgaWYgKGZyb20gPiAtMSkge1xuICAgICAgICAgICAgICAgIHZpZXcuZG9jVmlldy5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGNoZWNrQ1NTKHZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVET01DaGFuZ2UoZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCk7XG4gICAgICAgICAgICBpZiAodmlldy5kb2NWaWV3ICYmIHZpZXcuZG9jVmlldy5kaXJ0eSlcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuY3VycmVudFNlbGVjdGlvbi5lcShzZWwpKVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlZ2lzdGVyTXV0YXRpb24obXV0LCBhZGRlZCkge1xuICAgICAgICAvLyBJZ25vcmUgbXV0YXRpb25zIGluc2lkZSBub2RlcyB0aGF0IHdlcmUgYWxyZWFkeSBub3RlZCBhcyBpbnNlcnRlZFxuICAgICAgICBpZiAoYWRkZWQuaW5kZXhPZihtdXQudGFyZ2V0KSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MobXV0LnRhcmdldCk7XG4gICAgICAgIGlmIChtdXQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIiAmJlxuICAgICAgICAgICAgKGRlc2MgPT0gdGhpcy52aWV3LmRvY1ZpZXcgfHwgbXV0LmF0dHJpYnV0ZU5hbWUgPT0gXCJjb250ZW50ZWRpdGFibGVcIiB8fFxuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc29tZXRpbWVzIGZpcmVzIHNwdXJpb3VzIGV2ZW50cyBmb3IgbnVsbC9lbXB0eSBzdHlsZXNcbiAgICAgICAgICAgICAgICAobXV0LmF0dHJpYnV0ZU5hbWUgPT0gXCJzdHlsZVwiICYmICFtdXQub2xkVmFsdWUgJiYgIW11dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIWRlc2MgfHwgZGVzYy5pZ25vcmVNdXRhdGlvbihtdXQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChtdXQudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dC5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBtdXQuYWRkZWROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZWRUZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NICYmIGRlc2MuY29udGVudERPTSAhPSBkZXNjLmRvbSAmJiAhZGVzYy5jb250ZW50RE9NLmNvbnRhaW5zKG11dC50YXJnZXQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGZyb206IGRlc2MucG9zQmVmb3JlLCB0bzogZGVzYy5wb3NBZnRlciB9O1xuICAgICAgICAgICAgbGV0IHByZXYgPSBtdXQucHJldmlvdXNTaWJsaW5nLCBuZXh0ID0gbXV0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgbXV0LmFkZGVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUxMSBnaXZlcyB1cyBpbmNvcnJlY3QgbmV4dC9wcmV2IHNpYmxpbmdzIGZvciBzb21lXG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0aW9ucywgc28gaWYgdGhlcmUgYXJlIGFkZGVkIG5vZGVzLCByZWNvbXB1dGUgdGhvc2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dC5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IHByZXZpb3VzU2libGluZywgbmV4dFNpYmxpbmcgfSA9IG11dC5hZGRlZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzU2libGluZyB8fCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG11dC5hZGRlZE5vZGVzLCBwcmV2aW91c1NpYmxpbmcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dFNpYmxpbmcgfHwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChtdXQuYWRkZWROb2RlcywgbmV4dFNpYmxpbmcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbU9mZnNldCA9IHByZXYgJiYgcHJldi5wYXJlbnROb2RlID09IG11dC50YXJnZXRcbiAgICAgICAgICAgICAgICA/IGRvbUluZGV4KHByZXYpICsgMSA6IDA7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGRlc2MubG9jYWxQb3NGcm9tRE9NKG11dC50YXJnZXQsIGZyb21PZmZzZXQsIC0xKTtcbiAgICAgICAgICAgIGxldCB0b09mZnNldCA9IG5leHQgJiYgbmV4dC5wYXJlbnROb2RlID09IG11dC50YXJnZXRcbiAgICAgICAgICAgICAgICA/IGRvbUluZGV4KG5leHQpIDogbXV0LnRhcmdldC5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0byA9IGRlc2MubG9jYWxQb3NGcm9tRE9NKG11dC50YXJnZXQsIHRvT2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGRlc2MucG9zQXRTdGFydCAtIGRlc2MuYm9yZGVyLCB0bzogZGVzYy5wb3NBdEVuZCArIGRlc2MuYm9yZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFwiY2hhcmFjdGVyRGF0YVwiXG4gICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2VkVGV4dE5vZGUgPSBtdXQudGFyZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBkZXNjLnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGRlc2MucG9zQXRFbmQsXG4gICAgICAgICAgICAgICAgLy8gQW4gZXZlbnQgd2FzIGdlbmVyYXRlZCBmb3IgYSB0ZXh0IGNoYW5nZSB0aGF0IGRpZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICAvLyBhbnkgdGV4dC4gTWFyayB0aGUgZG9tIGNoYW5nZSB0byBmYWxsIGJhY2sgdG8gYXNzdW1pbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIHdhcyB0eXBlZCBvdmVyIHdpdGggYW4gaWRlbnRpY2FsIHZhbHVlIGlmIGl0IGNhbid0XG4gICAgICAgICAgICAgICAgLy8gZmluZCBhbm90aGVyIGNoYW5nZS5cbiAgICAgICAgICAgICAgICB0eXBlT3ZlcjogbXV0LnRhcmdldC5ub2RlVmFsdWUgPT0gbXV0Lm9sZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxubGV0IGNzc0NoZWNrZWQgPSBuZXcgV2Vha01hcCgpO1xubGV0IGNzc0NoZWNrV2FybmVkID0gZmFsc2U7XG5mdW5jdGlvbiBjaGVja0NTUyh2aWV3KSB7XG4gICAgaWYgKGNzc0NoZWNrZWQuaGFzKHZpZXcpKVxuICAgICAgICByZXR1cm47XG4gICAgY3NzQ2hlY2tlZC5zZXQodmlldywgbnVsbCk7XG4gICAgaWYgKFsnbm9ybWFsJywgJ25vd3JhcCcsICdwcmUtbGluZSddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkud2hpdGVTcGFjZSkgIT09IC0xKSB7XG4gICAgICAgIHZpZXcucmVxdWlyZXNHZWNrb0hhY2tOb2RlID0gZ2Vja287XG4gICAgICAgIGlmIChjc3NDaGVja1dhcm5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc29sZVtcIndhcm5cIl0oXCJQcm9zZU1pcnJvciBleHBlY3RzIHRoZSBDU1Mgd2hpdGUtc3BhY2UgcHJvcGVydHkgdG8gYmUgc2V0LCBwcmVmZXJhYmx5IHRvICdwcmUtd3JhcCcuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGxvYWQgc3R5bGUvcHJvc2VtaXJyb3IuY3NzIGZyb20gdGhlIHByb3NlbWlycm9yLXZpZXcgcGFja2FnZS5cIik7XG4gICAgICAgIGNzc0NoZWNrV2FybmVkID0gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgcmFuZ2UpIHtcbiAgICBsZXQgYW5jaG9yTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBhbmNob3JPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcbiAgICBsZXQgZm9jdXNOb2RlID0gcmFuZ2UuZW5kQ29udGFpbmVyLCBmb2N1c09mZnNldCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICBsZXQgY3VycmVudEFuY2hvciA9IHZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yKTtcbiAgICAvLyBTaW5jZSBzdWNoIGEgcmFuZ2UgZG9lc24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuY2hvciBhbmQgaGVhZCxcbiAgICAvLyB1c2UgYSBoZXVyaXN0aWMgdGhhdCBmbGlwcyBpdCBhcm91bmQgaWYgaXRzIGVuZCBtYXRjaGVzIHRoZVxuICAgIC8vIGN1cnJlbnQgYW5jaG9yLlxuICAgIGlmIChpc0VxdWl2YWxlbnRQb3NpdGlvbihjdXJyZW50QW5jaG9yLm5vZGUsIGN1cnJlbnRBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQxNCBmaXhcbmZ1bmN0aW9uIHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHZpZXcsIHNlbGVjdGlvbikge1xuICAgIGlmIChzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXMpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHZpZXcucm9vdClbMF07XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgcmFuZ2UpO1xuICAgIH1cbiAgICBsZXQgZm91bmQ7XG4gICAgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZm91bmQgPSBldmVudC5nZXRUYXJnZXRSYW5nZXMoKVswXTtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSBTYWZhcmkgKGF0IGxlYXN0IGluIDIwMTgtMjAyMikgZG9lc24ndCBwcm92aWRlIHJlZ3VsYXJcbiAgICAvLyBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBpbnNpZGUgYSBzaGFkb3dSb290LCB3ZSBoYXZlIHRvIHBlcmZvcm0gYVxuICAgIC8vIHJpZGljdWxvdXMgaGFjayB0byBnZXQgYXQgaXTigJR1c2luZyBgZXhlY0NvbW1hbmRgIHRvIHRyaWdnZXIgYVxuICAgIC8vIGBiZWZvcmVJbnB1dGAgZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gdGhlXG4gICAgLy8gZXZlbnQuXG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5kZW50XCIpO1xuICAgIHZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICByZXR1cm4gZm91bmQgPyByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgZm91bmQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGJsb2NrUGFyZW50KHZpZXcsIG5vZGUpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZS5wYXJlbnROb2RlOyBwICYmIHAgIT0gdmlldy5kb207IHAgPSBwLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MocCwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZS5pc0Jsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vLyBOb3RlIHRoYXQgYWxsIHJlZmVyZW5jaW5nIGFuZCBwYXJzaW5nIGlzIGRvbmUgd2l0aCB0aGVcbi8vIHN0YXJ0LW9mLW9wZXJhdGlvbiBzZWxlY3Rpb24gYW5kIGRvY3VtZW50LCBzaW5jZSB0aGF0J3MgdGhlIG9uZVxuLy8gdGhhdCB0aGUgRE9NIHJlcHJlc2VudHMuIElmIGFueSBjaGFuZ2VzIGNhbWUgaW4gaW4gdGhlIG1lYW50aW1lLFxuLy8gdGhlIG1vZGlmaWNhdGlvbiBpcyBtYXBwZWQgb3ZlciB0aG9zZSBiZWZvcmUgaXQgaXMgYXBwbGllZCwgaW5cbi8vIHJlYWRET01DaGFuZ2UuXG5mdW5jdGlvbiBwYXJzZUJldHdlZW4odmlldywgZnJvbV8sIHRvXykge1xuICAgIGxldCB7IG5vZGU6IHBhcmVudCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGZyb20sIHRvIH0gPSB2aWV3LmRvY1ZpZXcucGFyc2VSYW5nZShmcm9tXywgdG9fKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBmaW5kO1xuICAgIGxldCBhbmNob3IgPSBkb21TZWwuYW5jaG9yTm9kZTtcbiAgICBpZiAoYW5jaG9yICYmIHZpZXcuZG9tLmNvbnRhaW5zKGFuY2hvci5ub2RlVHlwZSA9PSAxID8gYW5jaG9yIDogYW5jaG9yLnBhcmVudE5vZGUpKSB7XG4gICAgICAgIGZpbmQgPSBbeyBub2RlOiBhbmNob3IsIG9mZnNldDogZG9tU2VsLmFuY2hvck9mZnNldCB9XTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSlcbiAgICAgICAgICAgIGZpbmQucHVzaCh7IG5vZGU6IGRvbVNlbC5mb2N1c05vZGUsIG9mZnNldDogZG9tU2VsLmZvY3VzT2Zmc2V0IH0pO1xuICAgIH1cbiAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSBpbiBDaHJvbWUgd2hlcmUgYmFja3NwYWNpbmcgc29tZXRpbWVzIHJlcGxhY2VzXG4gICAgLy8gdGhlIGRlbGV0ZWQgY29udGVudCB3aXRoIGEgcmFuZG9tIEJSIG5vZGUgKGlzc3VlcyAjNzk5LCAjODMxKVxuICAgIGlmIChjaHJvbWUgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCkge1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0b09mZnNldDsgb2ZmID4gZnJvbU9mZnNldDsgb2ZmLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbb2ZmIC0gMV0sIGRlc2MgPSBub2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRlc2MpIHtcbiAgICAgICAgICAgICAgICB0b09mZnNldCA9IG9mZjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGVzYyB8fCBkZXNjLnNpemUpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgIGxldCAkZnJvbSA9IHN0YXJ0RG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNlbCA9IG51bGwsIGRvYyA9IHBhcnNlci5wYXJzZShwYXJlbnQsIHtcbiAgICAgICAgdG9wTm9kZTogJGZyb20ucGFyZW50LFxuICAgICAgICB0b3BNYXRjaDogJGZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4KCkpLFxuICAgICAgICB0b3BPcGVuOiB0cnVlLFxuICAgICAgICBmcm9tOiBmcm9tT2Zmc2V0LFxuICAgICAgICB0bzogdG9PZmZzZXQsXG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJGZyb20ucGFyZW50LnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gXCJmdWxsXCIgOiB0cnVlLFxuICAgICAgICBmaW5kUG9zaXRpb25zOiBmaW5kLFxuICAgICAgICBydWxlRnJvbU5vZGUsXG4gICAgICAgIGNvbnRleHQ6ICRmcm9tXG4gICAgfSk7XG4gICAgaWYgKGZpbmQgJiYgZmluZFswXS5wb3MgIT0gbnVsbCkge1xuICAgICAgICBsZXQgYW5jaG9yID0gZmluZFswXS5wb3MsIGhlYWQgPSBmaW5kWzFdICYmIGZpbmRbMV0ucG9zO1xuICAgICAgICBpZiAoaGVhZCA9PSBudWxsKVxuICAgICAgICAgICAgaGVhZCA9IGFuY2hvcjtcbiAgICAgICAgc2VsID0geyBhbmNob3I6IGFuY2hvciArIGZyb20sIGhlYWQ6IGhlYWQgKyBmcm9tIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRvYywgc2VsLCBmcm9tLCB0byB9O1xufVxuZnVuY3Rpb24gcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MucGFyc2VSdWxlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gU2FmYXJpIHJlcGxhY2VzIHRoZSBsaXN0IGl0ZW0gb3IgdGFibGUgY2VsbCB3aXRoIGEgQlJcbiAgICAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIGxpc3Qgbm9kZSAoPyEpIGlmIHlvdSBkZWxldGUgdGhlIGxhc3RcbiAgICAgICAgLy8gY2hhcmFjdGVyIGluIGEgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgKCM3MDgsICM4NjIpXG4gICAgICAgIGlmIChzYWZhcmkgJiYgL14odWx8b2wpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBza2lwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9tLnBhcmVudE5vZGUubGFzdENoaWxkID09IGRvbSB8fCBzYWZhcmkgJiYgL14odHJ8dGFibGUpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiBkb20uZ2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiKSkge1xuICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBpc0lubGluZSA9IC9eKGF8YWJicnxhY3JvbnltfGJ8YmRbaW9dfGJpZ3xicnxidXR0b258Y2l0ZXxjb2RlfGRhdGEobGlzdCk/fGRlbHxkZm58ZW18aXxpbnN8a2JkfGxhYmVsfG1hcHxtYXJrfG1ldGVyfG91dHB1dHxxfHJ1Ynl8c3xzYW1wfHNtYWxsfHNwYW58c3Ryb25nfHN1W2JwXXx0aW1lfHV8dHR8dmFyKSQvaTtcbmZ1bmN0aW9uIHJlYWRET01DaGFuZ2UodmlldywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZE5vZGVzKSB7XG4gICAgbGV0IGNvbXBvc2l0aW9uSUQgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgfHwgKHZpZXcuY29tcG9zaW5nID8gdmlldy5pbnB1dC5jb21wb3NpdGlvbklEIDogMCk7XG4gICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gMDtcbiAgICBpZiAoZnJvbSA8IDApIHtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTAgPyB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gOiBudWxsO1xuICAgICAgICBsZXQgbmV3U2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4pO1xuICAgICAgICBpZiAobmV3U2VsICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShuZXdTZWwpKSB7XG4gICAgICAgICAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiZcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlID09PSAxMyAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXdTZWwpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbiA9PSBcImtleVwiKVxuICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCAkYmVmb3JlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICBsZXQgc2hhcmVkID0gJGJlZm9yZS5zaGFyZWREZXB0aCh0byk7XG4gICAgZnJvbSA9ICRiZWZvcmUuYmVmb3JlKHNoYXJlZCArIDEpO1xuICAgIHRvID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSh0bykuYWZ0ZXIoc2hhcmVkICsgMSk7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwYXJzZSA9IHBhcnNlQmV0d2Vlbih2aWV3LCBmcm9tLCB0byk7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCBjb21wYXJlID0gZG9jLnNsaWNlKHBhcnNlLmZyb20sIHBhcnNlLnRvKTtcbiAgICBsZXQgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlO1xuICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWRcbiAgICBpZiAodmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUpIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG87XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwic3RhcnRcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgbGV0IGNoYW5nZSA9IGZpbmREaWZmKGNvbXBhcmUuY29udGVudCwgcGFyc2UuZG9jLmNvbnRlbnQsIHBhcnNlLmZyb20sIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSk7XG4gICAgaWYgKGNoYW5nZSlcbiAgICAgICAgdmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCsrO1xuICAgIGlmICgoaW9zICYmIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID4gRGF0ZS5ub3coKSAtIDIyNSB8fCBhbmRyb2lkKSAmJlxuICAgICAgICBhZGRlZE5vZGVzLnNvbWUobiA9PiBuLm5vZGVUeXBlID09IDEgJiYgIWlzSW5saW5lLnRlc3Qobi5ub2RlTmFtZSkpICYmXG4gICAgICAgICghY2hhbmdlIHx8IGNoYW5nZS5lbmRBID49IGNoYW5nZS5lbmRCKSAmJlxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSkge1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVPdmVyICYmIHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgIXNlbC5lbXB0eSAmJiBzZWwuJGhlYWQuc2FtZVBhcmVudChzZWwuJGFuY2hvcikgJiZcbiAgICAgICAgICAgICF2aWV3LmNvbXBvc2luZyAmJiAhKHBhcnNlLnNlbCAmJiBwYXJzZS5zZWwuYW5jaG9yICE9IHBhcnNlLnNlbC5oZWFkKSkge1xuICAgICAgICAgICAgY2hhbmdlID0geyBzdGFydDogc2VsLmZyb20sIGVuZEE6IHNlbC50bywgZW5kQjogc2VsLnRvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocGFyc2Uuc2VsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHJlc29sdmVTZWxlY3Rpb24odmlldywgdmlldy5zdGF0ZS5kb2MsIHBhcnNlLnNlbCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCAmJiAhc2VsLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLnNldE1ldGEoXCJjb21wb3NpdGlvblwiLCBjb21wb3NpdGlvbklEKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvdmVyd3JpdGluZyBhIHNlbGVjdGlvbiBieSB0eXBpbmcgbWF0Y2hlc1xuICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGVkIGNvbnRlbnQsIGNyZWF0aW5nIGEgY2hhbmdlXG4gICAgLy8gdGhhdCdzIHNtYWxsZXIgdGhhbiB3aGF0IHdhcyBhY3R1YWxseSBvdmVyd3JpdHRlbi5cbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvICYmXG4gICAgICAgIGNoYW5nZS5zdGFydCA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKGNoYW5nZS5zdGFydCA+IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gJiYgY2hhbmdlLnN0YXJ0IDw9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gKyAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID49IHBhcnNlLmZyb20pIHtcbiAgICAgICAgICAgIGNoYW5nZS5zdGFydCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLmVuZEEgPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJiBjaGFuZ2UuZW5kQSA+PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAtIDIgJiZcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDw9IHBhcnNlLnRvKSB7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQiArPSAodmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSBjaGFuZ2UuZW5kQSk7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElFMTEgd2lsbCBpbnNlcnQgYSBub24tYnJlYWtpbmcgc3BhY2UgX2FoZWFkXyBvZiB0aGUgc3BhY2UgYWZ0ZXJcbiAgICAvLyB0aGUgY3Vyc29yIHNwYWNlIHdoZW4gYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGFub3RoZXIgc3BhY2UuIFdoZW5cbiAgICAvLyB0aGF0IGhhcHBlbmVkLCBhZGp1c3QgdGhlIGNoYW5nZSB0byBjb3ZlciB0aGUgc3BhY2UgaW5zdGVhZC5cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBjaGFuZ2UuZW5kQiA9PSBjaGFuZ2Uuc3RhcnQgKyAxICYmXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5zdGFydCAmJiBjaGFuZ2Uuc3RhcnQgPiBwYXJzZS5mcm9tICYmXG4gICAgICAgIHBhcnNlLmRvYy50ZXh0QmV0d2VlbihjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tIC0gMSwgY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSArIDEpID09IFwiIFxcdTAwYTBcIikge1xuICAgICAgICBjaGFuZ2Uuc3RhcnQtLTtcbiAgICAgICAgY2hhbmdlLmVuZEEtLTtcbiAgICAgICAgY2hhbmdlLmVuZEItLTtcbiAgICB9XG4gICAgbGV0ICRmcm9tID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20pO1xuICAgIGxldCAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJGZyb21BID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KTtcbiAgICBsZXQgaW5saW5lQ2hhbmdlID0gJGZyb20uc2FtZVBhcmVudCgkdG8pICYmICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50ICYmICRmcm9tQS5lbmQoKSA+PSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgbmV4dFNlbDtcbiAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIGVmZmVjdCBvZiBwcmVzc2luZyBFbnRlciAob3Igd2FzIHJlY29yZGVkXG4gICAgLy8gYXMgYmVpbmcgYW4gaU9TIGVudGVyIHByZXNzKSwganVzdCBkaXNwYXRjaCBhbiBFbnRlciBrZXkgaW5zdGVhZC5cbiAgICBpZiAoKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1ICYmXG4gICAgICAgICghaW5saW5lQ2hhbmdlIHx8IGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZU5hbWUgPT0gXCJESVZcIiB8fCBuLm5vZGVOYW1lID09IFwiUFwiKSkpIHx8XG4gICAgICAgICghaW5saW5lQ2hhbmdlICYmICRmcm9tLnBvcyA8IHBhcnNlLmRvYy5jb250ZW50LnNpemUgJiZcbiAgICAgICAgICAgICghJGZyb20uc2FtZVBhcmVudCgkdG8pIHx8ICEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkgJiZcbiAgICAgICAgICAgICEvXFxTLy50ZXN0KHBhcnNlLmRvYy50ZXh0QmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIFwiXCIsIFwiXCIpKSAmJlxuICAgICAgICAgICAgKG5leHRTZWwgPSBTZWxlY3Rpb24uZmluZEZyb20ocGFyc2UuZG9jLnJlc29sdmUoJGZyb20ucG9zICsgMSksIDEsIHRydWUpKSAmJlxuICAgICAgICAgICAgbmV4dFNlbC5oZWFkID4gJGZyb20ucG9zKSkgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpIHtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNhbWUgZm9yIGJhY2tzcGFjZVxuICAgIGlmICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IgPiBjaGFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgbG9va3NMaWtlQmFja3NwYWNlKGRvYywgY2hhbmdlLnN0YXJ0LCBjaGFuZ2UuZW5kQSwgJGZyb20sICR0bykgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDgsIFwiQmFja3NwYWNlXCIpKSkpIHtcbiAgICAgICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lKVxuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTsgLy8gIzgyMFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENocm9tZSB3aWxsIG9jY2FzaW9uYWxseSwgZHVyaW5nIGNvbXBvc2l0aW9uLCBkZWxldGUgdGhlXG4gICAgLy8gZW50aXJlIGNvbXBvc2l0aW9uIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGluc2VydCBpdCBhZ2Fpbi4gVGhpcyBpc1xuICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgIGlmIChjaHJvbWUgJiYgY2hhbmdlLmVuZEIgPT0gY2hhbmdlLnN0YXJ0KVxuICAgICAgICB2aWV3LmlucHV0Lmxhc3RDaHJvbWVEZWxldGUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFRoaXMgdHJpZXMgdG8gZGV0ZWN0IEFuZHJvaWQgdmlydHVhbCBrZXlib2FyZFxuICAgIC8vIGVudGVyLWFuZC1waWNrLXN1Z2dlc3Rpb24gYWN0aW9uLiBUaGF0IHNvbWV0aW1lcyAoc2VlIGlzc3VlXG4gICAgLy8gIzEwNTkpIGZpcnN0IGZpcmVzIGEgRE9NIG11dGF0aW9uLCBiZWZvcmUgbW92aW5nIHRoZSBzZWxlY3Rpb24gdG9cbiAgICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBibG9jay4gQW5kIHRoZW4sIGJlY2F1c2UgUHJvc2VNaXJyb3IgY2xlYW5zIHVwXG4gICAgLy8gdGhlIERPTSBzZWxlY3Rpb24sIGl0IGdpdmVzIHVwIG1vdmluZyB0aGUgc2VsZWN0aW9uIGVudGlyZWx5LFxuICAgIC8vIGxlYXZpbmcgdGhlIGN1cnNvciBpbiB0aGUgd3JvbmcgcGxhY2UuIFdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBkcm9wXG4gICAgLy8gdGhlIG5ldyBwYXJhZ3JhcGggZnJvbSB0aGUgaW5pdGlhbCBjaGFuZ2UsIGFuZCBmaXJlIGEgc2ltdWxhdGVkXG4gICAgLy8gZW50ZXIga2V5IGFmdGVyd2FyZHMuXG4gICAgaWYgKGFuZHJvaWQgJiYgIWlubGluZUNoYW5nZSAmJiAkZnJvbS5zdGFydCgpICE9ICR0by5zdGFydCgpICYmICR0by5wYXJlbnRPZmZzZXQgPT0gMCAmJiAkZnJvbS5kZXB0aCA9PSAkdG8uZGVwdGggJiZcbiAgICAgICAgcGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgPT0gcGFyc2Uuc2VsLmhlYWQgJiYgcGFyc2Uuc2VsLmhlYWQgPT0gY2hhbmdlLmVuZEEpIHtcbiAgICAgICAgY2hhbmdlLmVuZEIgLT0gMjtcbiAgICAgICAgJHRvID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpOyB9KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbiAgICBsZXQgY2hGcm9tID0gY2hhbmdlLnN0YXJ0LCBjaFRvID0gY2hhbmdlLmVuZEE7XG4gICAgbGV0IHRyLCBzdG9yZWRNYXJrcywgbWFya0NoYW5nZTtcbiAgICBpZiAoaW5saW5lQ2hhbmdlKSB7XG4gICAgICAgIGlmICgkZnJvbS5wb3MgPT0gJHRvLnBvcykgeyAvLyBEZWxldGlvblxuICAgICAgICAgICAgLy8gSUUxMSBzb21ldGltZXMgd2VpcmRseSBtb3ZlcyB0aGUgRE9NIHNlbGVjdGlvbiBhcm91bmQgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIG91dCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHRleHRibG9ja1xuICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgJGZyb20ucGFyZW50T2Zmc2V0ID09IDApIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN1cHByZXNzU2VsZWN0aW9uVXBkYXRlcygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odmlldyksIDIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5kZWxldGUoY2hGcm9tLCBjaFRvKTtcbiAgICAgICAgICAgIHN0b3JlZE1hcmtzID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KS5tYXJrc0Fjcm9zcyhkb2MucmVzb2x2ZShjaGFuZ2UuZW5kQSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCAvLyBBZGRpbmcgb3IgcmVtb3ZpbmcgYSBtYXJrXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5lbmRCICYmXG4gICAgICAgICAgICAobWFya0NoYW5nZSA9IGlzTWFya0NoYW5nZSgkZnJvbS5wYXJlbnQuY29udGVudC5jdXQoJGZyb20ucGFyZW50T2Zmc2V0LCAkdG8ucGFyZW50T2Zmc2V0KSwgJGZyb21BLnBhcmVudC5jb250ZW50LmN1dCgkZnJvbUEucGFyZW50T2Zmc2V0LCBjaGFuZ2UuZW5kQSAtICRmcm9tQS5zdGFydCgpKSkpKSB7XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgICAgICBpZiAobWFya0NoYW5nZS50eXBlID09IFwiYWRkXCIpXG4gICAgICAgICAgICAgICAgdHIuYWRkTWFyayhjaEZyb20sIGNoVG8sIG1hcmtDaGFuZ2UubWFyayk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdHIucmVtb3ZlTWFyayhjaEZyb20sIGNoVG8sIG1hcmtDaGFuZ2UubWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJGZyb20ucGFyZW50LmNoaWxkKCRmcm9tLmluZGV4KCkpLmlzVGV4dCAmJiAkZnJvbS5pbmRleCgpID09ICR0by5pbmRleCgpIC0gKCR0by50ZXh0T2Zmc2V0ID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAvLyBCb3RoIHBvc2l0aW9ucyBpbiB0aGUgc2FtZSB0ZXh0IG5vZGUgLS0gc2ltcGx5IGluc2VydCB0ZXh0XG4gICAgICAgICAgICBsZXQgdGV4dCA9ICRmcm9tLnBhcmVudC50ZXh0QmV0d2VlbigkZnJvbS5wYXJlbnRPZmZzZXQsICR0by5wYXJlbnRPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVUZXh0SW5wdXRcIiwgZiA9PiBmKHZpZXcsIGNoRnJvbSwgY2hUbywgdGV4dCkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5pbnNlcnRUZXh0KHRleHQsIGNoRnJvbSwgY2hUbyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0cilcbiAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLnJlcGxhY2UoY2hGcm9tLCBjaFRvLCBwYXJzZS5kb2Muc2xpY2UoY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSwgY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKSk7XG4gICAgaWYgKHBhcnNlLnNlbCkge1xuICAgICAgICBsZXQgc2VsID0gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCB0ci5kb2MsIHBhcnNlLnNlbCk7XG4gICAgICAgIC8vIENocm9tZSB3aWxsIHNvbWV0aW1lcywgZHVyaW5nIGNvbXBvc2l0aW9uLCByZXBvcnQgdGhlXG4gICAgICAgIC8vIHNlbGVjdGlvbiBpbiB0aGUgd3JvbmcgcGxhY2UuIElmIGl0IGxvb2tzIGxpa2UgdGhhdCBpc1xuICAgICAgICAvLyBoYXBwZW5pbmcsIGRvbid0IHVwZGF0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICAgICAvLyBFZGdlIGp1c3QgZG9lc24ndCBtb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCB3aGVuIHlvdSBzdGFydCB0eXBpbmdcbiAgICAgICAgLy8gaW4gYW4gZW1wdHkgYmxvY2sgb3IgYmV0d2VlbiBiciBub2Rlcy5cbiAgICAgICAgaWYgKHNlbCAmJiAhKGNocm9tZSAmJiB2aWV3LmNvbXBvc2luZyAmJiBzZWwuZW1wdHkgJiZcbiAgICAgICAgICAgIChjaGFuZ2Uuc3RhcnQgIT0gY2hhbmdlLmVuZEIgfHwgdmlldy5pbnB1dC5sYXN0Q2hyb21lRGVsZXRlIDwgRGF0ZS5ub3coKSAtIDEwMCkgJiZcbiAgICAgICAgICAgIChzZWwuaGVhZCA9PSBjaEZyb20gfHwgc2VsLmhlYWQgPT0gdHIubWFwcGluZy5tYXAoY2hUbykgLSAxKSB8fFxuICAgICAgICAgICAgaWUgJiYgc2VsLmVtcHR5ICYmIHNlbC5oZWFkID09IGNoRnJvbSkpXG4gICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICB9XG4gICAgaWYgKHN0b3JlZE1hcmtzKVxuICAgICAgICB0ci5lbnN1cmVNYXJrcyhzdG9yZWRNYXJrcyk7XG4gICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgIHRyLnNldE1ldGEoXCJjb21wb3NpdGlvblwiLCBjb21wb3NpdGlvbklEKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCBkb2MsIHBhcnNlZFNlbCkge1xuICAgIGlmIChNYXRoLm1heChwYXJzZWRTZWwuYW5jaG9yLCBwYXJzZWRTZWwuaGVhZCkgPiBkb2MuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gc2VsZWN0aW9uQmV0d2Vlbih2aWV3LCBkb2MucmVzb2x2ZShwYXJzZWRTZWwuYW5jaG9yKSwgZG9jLnJlc29sdmUocGFyc2VkU2VsLmhlYWQpKTtcbn1cbi8vIEdpdmVuIHR3byBzYW1lLWxlbmd0aCwgbm9uLWVtcHR5IGZyYWdtZW50cyBvZiBpbmxpbmUgY29udGVudCxcbi8vIGRldGVybWluZSB3aGV0aGVyIHRoZSBmaXJzdCBjb3VsZCBiZSBjcmVhdGVkIGZyb20gdGhlIHNlY29uZCBieVxuLy8gcmVtb3Zpbmcgb3IgYWRkaW5nIGEgc2luZ2xlIG1hcmsgdHlwZS5cbmZ1bmN0aW9uIGlzTWFya0NoYW5nZShjdXIsIHByZXYpIHtcbiAgICBsZXQgY3VyTWFya3MgPSBjdXIuZmlyc3RDaGlsZC5tYXJrcywgcHJldk1hcmtzID0gcHJldi5maXJzdENoaWxkLm1hcmtzO1xuICAgIGxldCBhZGRlZCA9IGN1ck1hcmtzLCByZW1vdmVkID0gcHJldk1hcmtzLCB0eXBlLCBtYXJrLCB1cGRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgIGFkZGVkID0gcHJldk1hcmtzW2ldLnJlbW92ZUZyb21TZXQoYWRkZWQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgIHJlbW92ZWQgPSBjdXJNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KHJlbW92ZWQpO1xuICAgIGlmIChhZGRlZC5sZW5ndGggPT0gMSAmJiByZW1vdmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIG1hcmsgPSBhZGRlZFswXTtcbiAgICAgICAgdHlwZSA9IFwiYWRkXCI7XG4gICAgICAgIHVwZGF0ZSA9IChub2RlKSA9PiBub2RlLm1hcmsobWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFkZGVkLmxlbmd0aCA9PSAwICYmIHJlbW92ZWQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbWFyayA9IHJlbW92ZWRbMF07XG4gICAgICAgIHR5cGUgPSBcInJlbW92ZVwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHVwZGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICB1cGRhdGVkLnB1c2godXBkYXRlKHByZXYuY2hpbGQoaSkpKTtcbiAgICBpZiAoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKS5lcShjdXIpKVxuICAgICAgICByZXR1cm4geyBtYXJrLCB0eXBlIH07XG59XG5mdW5jdGlvbiBsb29rc0xpa2VCYWNrc3BhY2Uob2xkLCBzdGFydCwgZW5kLCAkbmV3U3RhcnQsICRuZXdFbmQpIHtcbiAgICBpZiAoIC8vIFRoZSBjb250ZW50IG11c3QgaGF2ZSBzaHJ1bmtcbiAgICBlbmQgLSBzdGFydCA8PSAkbmV3RW5kLnBvcyAtICRuZXdTdGFydC5wb3MgfHxcbiAgICAgICAgLy8gbmV3RW5kIG11c3QgcG9pbnQgZGlyZWN0bHkgYXQgb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYmxvY2sgdGhhdCBuZXdTdGFydCBwb2ludHMgaW50b1xuICAgICAgICBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJG5ld1N0YXJ0LCB0cnVlLCBmYWxzZSkgPCAkbmV3RW5kLnBvcylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkc3RhcnQgPSBvbGQucmVzb2x2ZShzdGFydCk7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlLCByYXRoZXIgdGhhbiBqb2luaW5nIGJsb2NrcywgdGhlIGNoYW5nZSBqdXN0IHJlbW92ZWQgYW4gZW50aXJlIGJsb2NrXG4gICAgaWYgKCEkbmV3U3RhcnQucGFyZW50LmlzVGV4dGJsb2NrKSB7XG4gICAgICAgIGxldCBhZnRlciA9ICRzdGFydC5ub2RlQWZ0ZXI7XG4gICAgICAgIHJldHVybiBhZnRlciAhPSBudWxsICYmIGVuZCA9PSBzdGFydCArIGFmdGVyLm5vZGVTaXplO1xuICAgIH1cbiAgICAvLyBTdGFydCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYSBibG9ja1xuICAgIGlmICgkc3RhcnQucGFyZW50T2Zmc2V0IDwgJHN0YXJ0LnBhcmVudC5jb250ZW50LnNpemUgfHwgISRzdGFydC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJG5leHQgPSBvbGQucmVzb2x2ZShza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHN0YXJ0LCB0cnVlLCB0cnVlKSk7XG4gICAgLy8gVGhlIG5leHQgdGV4dGJsb2NrIG11c3Qgc3RhcnQgYmVmb3JlIGVuZCBhbmQgZW5kIG5lYXIgaXRcbiAgICBpZiAoISRuZXh0LnBhcmVudC5pc1RleHRibG9jayB8fCAkbmV4dC5wb3MgPiBlbmQgfHxcbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXh0LCB0cnVlLCBmYWxzZSkgPCBlbmQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBUaGUgZnJhZ21lbnRzIGFmdGVyIHRoZSBqb2luIHBvaW50IG11c3QgbWF0Y2hcbiAgICByZXR1cm4gJG5ld1N0YXJ0LnBhcmVudC5jb250ZW50LmN1dCgkbmV3U3RhcnQucGFyZW50T2Zmc2V0KS5lcSgkbmV4dC5wYXJlbnQuY29udGVudCk7XG59XG5mdW5jdGlvbiBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHBvcywgZnJvbUVuZCwgbWF5T3Blbikge1xuICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGgsIGVuZCA9IGZyb21FbmQgPyAkcG9zLmVuZCgpIDogJHBvcy5wb3M7XG4gICAgd2hpbGUgKGRlcHRoID4gMCAmJiAoZnJvbUVuZCB8fCAkcG9zLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRwb3Mubm9kZShkZXB0aCkuY2hpbGRDb3VudCkpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZW5kKys7XG4gICAgICAgIGZyb21FbmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1heU9wZW4pIHtcbiAgICAgICAgbGV0IG5leHQgPSAkcG9zLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJHBvcy5pbmRleEFmdGVyKGRlcHRoKSk7XG4gICAgICAgIHdoaWxlIChuZXh0ICYmICFuZXh0LmlzTGVhZikge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwb3MsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBzdGFydCA9IGEuZmluZERpZmZTdGFydChiLCBwb3MpO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBhOiBlbmRBLCBiOiBlbmRCIH0gPSBhLmZpbmREaWZmRW5kKGIsIHBvcyArIGEuc2l6ZSwgcG9zICsgYi5zaXplKTtcbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBzdGFydCAtIE1hdGgubWluKGVuZEEsIGVuZEIpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IGVuZEEgKyBhZGp1c3QgLSBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZEEgPCBzdGFydCAmJiBhLnNpemUgPCBiLnNpemUpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEEgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGIuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYi50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0ICsgKGVuZEIgLSBlbmRBKTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0O1xuICAgIH1cbiAgICBlbHNlIGlmIChlbmRCIDwgc3RhcnQpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEIgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGEuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYS50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0ICsgKGVuZEEgLSBlbmRCKTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kQSwgZW5kQiB9O1xufVxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoICE9IDIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYSA9IHN0ci5jaGFyQ29kZUF0KDApLCBiID0gc3RyLmNoYXJDb2RlQXQoMSk7XG4gICAgcmV0dXJuIGEgPj0gMHhEQzAwICYmIGEgPD0gMHhERkZGICYmIGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fcGFyc2VGcm9tQ2xpcGJvYXJkID0gcGFyc2VGcm9tQ2xpcGJvYXJkO1xuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX2VuZENvbXBvc2l0aW9uID0gZW5kQ29tcG9zaXRpb247XG4vKipcbkFuIGVkaXRvciB2aWV3IG1hbmFnZXMgdGhlIERPTSBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGFuXG5lZGl0YWJsZSBkb2N1bWVudC4gSXRzIHN0YXRlIGFuZCBiZWhhdmlvciBhcmUgZGV0ZXJtaW5lZCBieSBpdHNcbltwcm9wc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMpLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHZpZXcuIGBwbGFjZWAgbWF5IGJlIGEgRE9NIG5vZGUgdGhhdCB0aGUgZWRpdG9yIHNob3VsZFxuICAgIGJlIGFwcGVuZGVkIHRvLCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwbGFjZSBpdCBpbnRvIHRoZSBkb2N1bWVudCxcbiAgICBvciBhbiBvYmplY3Qgd2hvc2UgYG1vdW50YCBwcm9wZXJ0eSBob2xkcyB0aGUgbm9kZSB0byB1c2UgYXMgdGhlXG4gICAgZG9jdW1lbnQgY29udGFpbmVyLiBJZiBpdCBpcyBgbnVsbGAsIHRoZSBlZGl0b3Igd2lsbCBub3QgYmVcbiAgICBhZGRlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGFjZSwgcHJvcHMpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBLbHVkZ2UgdXNlZCB0byB3b3JrIGFyb3VuZCBhIENocm9tZSBidWcgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tXcml0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY3Vyc29yV3JhcHBlciA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlucHV0ID0gbmV3IElucHV0U3RhdGU7XG4gICAgICAgIHRoaXMucHJldkRpcmVjdFBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5WaWV3cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgSG9sZHMgYHRydWVgIHdoZW4gYSBoYWNrIG5vZGUgaXMgbmVlZGVkIGluIEZpcmVmb3ggdG8gcHJldmVudCB0aGVcbiAgICAgICAgW3NwYWNlIGlzIGVhdGVuIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzY1MSlcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVxdWlyZXNHZWNrb0hhY2tOb2RlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBXaGVuIGVkaXRvciBjb250ZW50IGlzIGJlaW5nIGRyYWdnZWQsIHRoaXMgb2JqZWN0IGNvbnRhaW5zXG4gICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcmFnZ2VkIHNsaWNlIGFuZCB3aGV0aGVyIGl0IGlzIGJlaW5nXG4gICAgICAgIGNvcGllZCBvciBtb3ZlZC4gQXQgYW55IG90aGVyIHRpbWUsIGl0IGlzIG51bGwuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLnN0YXRlID0gcHJvcHMuc3RhdGU7XG4gICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucyA9IHByb3BzLnBsdWdpbnMgfHwgW107XG4gICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucy5mb3JFYWNoKGNoZWNrU3RhdGVDb21wb25lbnQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbSA9IChwbGFjZSAmJiBwbGFjZS5tb3VudCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaWYgKHBsYWNlKSB7XG4gICAgICAgICAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpXG4gICAgICAgICAgICAgICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBsYWNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICBwbGFjZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChwbGFjZS5tb3VudClcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGFibGUgPSBnZXRFZGl0YWJsZSh0aGlzKTtcbiAgICAgICAgdXBkYXRlQ3Vyc29yV3JhcHBlcih0aGlzKTtcbiAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gZG9jVmlld0Rlc2ModGhpcy5zdGF0ZS5kb2MsIGNvbXB1dGVEb2NEZWNvKHRoaXMpLCB2aWV3RGVjb3JhdGlvbnModGhpcyksIHRoaXMuZG9tLCB0aGlzKTtcbiAgICAgICAgdGhpcy5kb21PYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcih0aGlzLCAoZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkgPT4gcmVhZERPTUNoYW5nZSh0aGlzLCBmcm9tLCB0bywgdHlwZU92ZXIsIGFkZGVkKSk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgaW5pdElucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBsdWdpblZpZXdzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEhvbGRzIGB0cnVlYCB3aGVuIGFcbiAgICBbY29tcG9zaXRpb25dKGh0dHBzOi8vdzNjLmdpdGh1Yi5pby91aWV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzKVxuICAgIGlzIGFjdGl2ZS5cbiAgICAqL1xuICAgIGdldCBjb21wb3NpbmcoKSB7IHJldHVybiB0aGlzLmlucHV0LmNvbXBvc2luZzsgfVxuICAgIC8qKlxuICAgIFRoZSB2aWV3J3MgY3VycmVudCBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKS5cbiAgICAqL1xuICAgIGdldCBwcm9wcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb3BzLnN0YXRlICE9IHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5fcHJvcHM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BzW25hbWVdID0gcHJldltuYW1lXTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BzLnN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcHM7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldydzIHByb3BzLiBXaWxsIGltbWVkaWF0ZWx5IGNhdXNlIGFuIHVwZGF0ZSB0b1xuICAgIHRoZSBET00uXG4gICAgKi9cbiAgICB1cGRhdGUocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpXG4gICAgICAgICAgICBlbnN1cmVMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGxldCBwcmV2UHJvcHMgPSB0aGlzLl9wcm9wcztcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgaWYgKHByb3BzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIHByb3BzLnBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucyA9IHByb3BzLnBsdWdpbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHByb3BzLnN0YXRlLCBwcmV2UHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgYnkgdXBkYXRpbmcgZXhpc3RpbmcgcHJvcHMgb2JqZWN0IHdpdGggdGhlIG9iamVjdFxuICAgIGdpdmVuIGFzIGFyZ3VtZW50LiBFcXVpdmFsZW50IHRvIGB2aWV3LnVwZGF0ZShPYmplY3QuYXNzaWduKHt9LFxuICAgIHZpZXcucHJvcHMsIHByb3BzKSlgLlxuICAgICovXG4gICAgc2V0UHJvcHMocHJvcHMpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLl9wcm9wcylcbiAgICAgICAgICAgIHVwZGF0ZWRbbmFtZV0gPSB0aGlzLl9wcm9wc1tuYW1lXTtcbiAgICAgICAgdXBkYXRlZC5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gcHJvcHNbbmFtZV07XG4gICAgICAgIHRoaXMudXBkYXRlKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIGVkaXRvcidzIGBzdGF0ZWAgcHJvcCwgd2l0aG91dCB0b3VjaGluZyBhbnkgb2YgdGhlXG4gICAgb3RoZXIgcHJvcHMuXG4gICAgKi9cbiAgICB1cGRhdGVTdGF0ZShzdGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHRoaXMuX3Byb3BzKTtcbiAgICB9XG4gICAgdXBkYXRlU3RhdGVJbm5lcihzdGF0ZSwgcHJldlByb3BzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnN0YXRlLCByZWRyYXcgPSBmYWxzZSwgdXBkYXRlU2VsID0gZmFsc2U7XG4gICAgICAgIC8vIFdoZW4gc3RvcmVkIG1hcmtzIGFyZSBhZGRlZCwgc3RvcCBjb21wb3NpdGlvbiwgc28gdGhhdCB0aGV5IGNhblxuICAgICAgICAvLyBiZSBkaXNwbGF5ZWQuXG4gICAgICAgIGlmIChzdGF0ZS5zdG9yZWRNYXJrcyAmJiB0aGlzLmNvbXBvc2luZykge1xuICAgICAgICAgICAgY2xlYXJDb21wb3NpdGlvbih0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZVNlbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICBsZXQgcGx1Z2luc0NoYW5nZWQgPSBwcmV2LnBsdWdpbnMgIT0gc3RhdGUucGx1Z2lucyB8fCB0aGlzLl9wcm9wcy5wbHVnaW5zICE9IHByZXZQcm9wcy5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucyB8fCB0aGlzLl9wcm9wcy5ub2RlVmlld3MgIT0gcHJldlByb3BzLm5vZGVWaWV3cykge1xuICAgICAgICAgICAgbGV0IG5vZGVWaWV3cyA9IGJ1aWxkTm9kZVZpZXdzKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWROb2RlVmlld3Mobm9kZVZpZXdzLCB0aGlzLm5vZGVWaWV3cykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVWaWV3cyA9IG5vZGVWaWV3cztcbiAgICAgICAgICAgICAgICByZWRyYXcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwbHVnaW5zQ2hhbmdlZCB8fCBwcmV2UHJvcHMuaGFuZGxlRE9NRXZlbnRzICE9IHRoaXMuX3Byb3BzLmhhbmRsZURPTUV2ZW50cykge1xuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGFibGUgPSBnZXRFZGl0YWJsZSh0aGlzKTtcbiAgICAgICAgdXBkYXRlQ3Vyc29yV3JhcHBlcih0aGlzKTtcbiAgICAgICAgbGV0IGlubmVyRGVjbyA9IHZpZXdEZWNvcmF0aW9ucyh0aGlzKSwgb3V0ZXJEZWNvID0gY29tcHV0ZURvY0RlY28odGhpcyk7XG4gICAgICAgIGxldCBzY3JvbGwgPSBwcmV2LnBsdWdpbnMgIT0gc3RhdGUucGx1Z2lucyAmJiAhcHJldi5kb2MuZXEoc3RhdGUuZG9jKSA/IFwicmVzZXRcIlxuICAgICAgICAgICAgOiBzdGF0ZS5zY3JvbGxUb1NlbGVjdGlvbiA+IHByZXYuc2Nyb2xsVG9TZWxlY3Rpb24gPyBcInRvIHNlbGVjdGlvblwiIDogXCJwcmVzZXJ2ZVwiO1xuICAgICAgICBsZXQgdXBkYXRlRG9jID0gcmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcubWF0Y2hlc05vZGUoc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgIGlmICh1cGRhdGVEb2MgfHwgIXN0YXRlLnNlbGVjdGlvbi5lcShwcmV2LnNlbGVjdGlvbikpXG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICBsZXQgb2xkU2Nyb2xsUG9zID0gc2Nyb2xsID09IFwicHJlc2VydmVcIiAmJiB1cGRhdGVTZWwgJiYgdGhpcy5kb20uc3R5bGUub3ZlcmZsb3dBbmNob3IgPT0gbnVsbCAmJiBzdG9yZVNjcm9sbFBvcyh0aGlzKTtcbiAgICAgICAgaWYgKHVwZGF0ZVNlbCkge1xuICAgICAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBhbiBpc3N1ZSBpbiBDaHJvbWUsIElFLCBhbmQgRWRnZSB3aGVyZSBjaGFuZ2luZ1xuICAgICAgICAgICAgLy8gdGhlIERPTSBhcm91bmQgYW4gYWN0aXZlIHNlbGVjdGlvbiBwdXRzIGl0IGludG8gYSBicm9rZW5cbiAgICAgICAgICAgIC8vIHN0YXRlIHdoZXJlIHRoZSB0aGluZyB0aGUgdXNlciBzZWVzIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiByZXBvcnRlZCBieSB0aGUgU2VsZWN0aW9uIG9iamVjdCAoIzcxMCwgIzk3MyxcbiAgICAgICAgICAgIC8vICMxMDExLCAjMTAxMywgIzEwMzUpLlxuICAgICAgICAgICAgbGV0IGZvcmNlU2VsVXBkYXRlID0gdXBkYXRlRG9jICYmIChpZSB8fCBjaHJvbWUpICYmICF0aGlzLmNvbXBvc2luZyAmJlxuICAgICAgICAgICAgICAgICFwcmV2LnNlbGVjdGlvbi5lbXB0eSAmJiAhc3RhdGUuc2VsZWN0aW9uLmVtcHR5ICYmIHNlbGVjdGlvbkNvbnRleHRDaGFuZ2VkKHByZXYuc2VsZWN0aW9uLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZURvYykge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIHRoYXQgdGhlIHNlbGVjdGlvbiBwb2ludHMgaW50byBpcyB3cml0dGVuIHRvLFxuICAgICAgICAgICAgICAgIC8vIENocm9tZSBzb21ldGltZXMgc3RhcnRzIG1pc3JlcG9ydGluZyB0aGUgc2VsZWN0aW9uLCBzbyB0aGlzXG4gICAgICAgICAgICAgICAgLy8gdHJhY2tzIHRoYXQgYW5kIGZvcmNlcyBhIHNlbGVjdGlvbiByZXNldCB3aGVuIG91ciB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyBkaWQgd3JpdGUgdG8gdGhlIG5vZGUuXG4gICAgICAgICAgICAgICAgbGV0IGNocm9tZUtsdWRnZSA9IGNocm9tZSA/ICh0aGlzLnRyYWNrV3JpdGVzID0gdGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpLmZvY3VzTm9kZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2luZylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jb21wb3NpdGlvbk5vZGUgPSBmaW5kQ29tcG9zaXRpb25Ob2RlKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChyZWRyYXcgfHwgIXRoaXMuZG9jVmlldy51cGRhdGUoc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbywgdGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZU91dGVyRGVjbyhvdXRlckRlY28pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcgPSBkb2NWaWV3RGVzYyhzdGF0ZS5kb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHJvbWVLbHVkZ2UgJiYgIXRoaXMudHJhY2tXcml0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU2VsVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBhbiBpc3N1ZSB3aGVyZSBhbiB1cGRhdGUgYXJyaXZpbmcgcmlnaHQgYmV0d2VlblxuICAgICAgICAgICAgLy8gYSBET00gc2VsZWN0aW9uIGNoYW5nZSBhbmQgdGhlIFwic2VsZWN0aW9uY2hhbmdlXCIgZXZlbnQgZm9yIGl0XG4gICAgICAgICAgICAvLyBjYW4gY2F1c2UgYSBzcHVyaW91cyBET00gc2VsZWN0aW9uIHVwZGF0ZSwgZGlzcnVwdGluZyBtb3VzZVxuICAgICAgICAgICAgLy8gZHJhZyBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZm9yY2VTZWxVcGRhdGUgfHxcbiAgICAgICAgICAgICAgICAhKHRoaXMuaW5wdXQubW91c2VEb3duICYmIHRoaXMuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5lcSh0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkpICYmXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvckluUmlnaHRQbGFjZSh0aGlzKSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh0aGlzLCBmb3JjZVNlbFVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzeW5jTm9kZVNlbGVjdGlvbih0aGlzLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cyhwcmV2KTtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmRyYWdnaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdnZWROb2RlKHRoaXMuZHJhZ2dpbmcsIHByZXYpO1xuICAgICAgICBpZiAoc2Nyb2xsID09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5kb20uc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY3JvbGwgPT0gXCJ0byBzZWxlY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFNjcm9sbFBvcykge1xuICAgICAgICAgICAgcmVzZXRTY3JvbGxQb3Mob2xkU2Nyb2xsUG9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjcm9sbFRvU2VsZWN0aW9uKCkge1xuICAgICAgICBsZXQgc3RhcnRET00gPSB0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkuZm9jdXNOb2RlO1xuICAgICAgICBpZiAoIXN0YXJ0RE9NIHx8ICF0aGlzLmRvbS5jb250YWlucyhzdGFydERPTS5ub2RlVHlwZSA9PSAxID8gc3RhcnRET00gOiBzdGFydERPTS5wYXJlbnROb2RlKSkgO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnNvbWVQcm9wKFwiaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb25cIiwgZiA9PiBmKHRoaXMpKSkgO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmRvY1ZpZXcuZG9tQWZ0ZXJQb3ModGhpcy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMsIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMsIHRoaXMuY29vcmRzQXRQb3ModGhpcy5zdGF0ZS5zZWxlY3Rpb24uaGVhZCwgMSksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95UGx1Z2luVmlld3MoKSB7XG4gICAgICAgIGxldCB2aWV3O1xuICAgICAgICB3aGlsZSAodmlldyA9IHRoaXMucGx1Z2luVmlld3MucG9wKCkpXG4gICAgICAgICAgICBpZiAodmlldy5kZXN0cm95KVxuICAgICAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5WaWV3cyhwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKCFwcmV2U3RhdGUgfHwgcHJldlN0YXRlLnBsdWdpbnMgIT0gdGhpcy5zdGF0ZS5wbHVnaW5zIHx8IHRoaXMuZGlyZWN0UGx1Z2lucyAhPSB0aGlzLnByZXZEaXJlY3RQbHVnaW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gdGhpcy5kaXJlY3RQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UGx1Z2luVmlld3MoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5zdGF0ZS5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy52aWV3KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpblZpZXdzLnB1c2gocGx1Z2luLnNwZWMudmlldyh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luVmlldyA9IHRoaXMucGx1Z2luVmlld3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpblZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwbHVnaW5WaWV3LnVwZGF0ZSh0aGlzLCBwcmV2U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZURyYWdnZWROb2RlKGRyYWdnaW5nLCBwcmV2KSB7XG4gICAgICAgIGxldCBzZWwgPSBkcmFnZ2luZy5ub2RlLCBmb3VuZCA9IC0xO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5kb2Mubm9kZUF0KHNlbC5mcm9tKSA9PSBzZWwubm9kZSkge1xuICAgICAgICAgICAgZm91bmQgPSBzZWwuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtb3ZlZFBvcyA9IHNlbC5mcm9tICsgKHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSAtIHByZXYuZG9jLmNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICBsZXQgbW92ZWQgPSBtb3ZlZFBvcyA+IDAgJiYgdGhpcy5zdGF0ZS5kb2Mubm9kZUF0KG1vdmVkUG9zKTtcbiAgICAgICAgICAgIGlmIChtb3ZlZCA9PSBzZWwubm9kZSlcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG1vdmVkUG9zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBuZXcgRHJhZ2dpbmcoZHJhZ2dpbmcuc2xpY2UsIGRyYWdnaW5nLm1vdmUsIGZvdW5kIDwgMCA/IHVuZGVmaW5lZCA6IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRoaXMuc3RhdGUuZG9jLCBmb3VuZCkpO1xuICAgIH1cbiAgICBzb21lUHJvcChwcm9wTmFtZSwgZikge1xuICAgICAgICBsZXQgcHJvcCA9IHRoaXMuX3Byb3BzICYmIHRoaXMuX3Byb3BzW3Byb3BOYW1lXSwgdmFsdWU7XG4gICAgICAgIGlmIChwcm9wICE9IG51bGwgJiYgKHZhbHVlID0gZiA/IGYocHJvcCkgOiBwcm9wKSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRpcmVjdFBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gdGhpcy5kaXJlY3RQbHVnaW5zW2ldLnByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwgJiYgKHZhbHVlID0gZiA/IGYocHJvcCkgOiBwcm9wKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBsdWdpbnMgPSB0aGlzLnN0YXRlLnBsdWdpbnM7XG4gICAgICAgIGlmIChwbHVnaW5zKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3AgPSBwbHVnaW5zW2ldLnByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGUgdmlldyBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBoYXNGb2N1cygpIHtcbiAgICAgICAgLy8gV29yayBhcm91bmQgSUUgbm90IGhhbmRsaW5nIGZvY3VzIGNvcnJlY3RseSBpZiByZXNpemUgaGFuZGxlcyBhcmUgc2hvd24uXG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCByZXNpemUgaGFuZGxlcywgYWN0aXZlRWxlbWVudFxuICAgICAgICAvLyB3aWxsIGJlIHRoYXQgZWxlbWVudCBpbnN0ZWFkIG9mIHRoaXMuZG9tLlxuICAgICAgICBpZiAoaWUpIHtcbiAgICAgICAgICAgIC8vIElmIGFjdGl2ZUVsZW1lbnQgaXMgd2l0aGluIHRoaXMuZG9tLCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAvLyBzZXR0aW5nIGBjb250ZW50ZWRpdGFibGVgIHRvIGZhbHNlIGluIGJldHdlZW4sIHRyZWF0IGl0IGFzIGZvY3VzZWQuXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICYmIHRoaXMuZG9tICE9IG5vZGUgJiYgdGhpcy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gJ2ZhbHNlJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb207XG4gICAgfVxuICAgIC8qKlxuICAgIEZvY3VzIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKVxuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuZG9tKTtcbiAgICAgICAgc2VsZWN0aW9uVG9ET00odGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkb2N1bWVudCByb290IGluIHdoaWNoIHRoZSBlZGl0b3IgZXhpc3RzLiBUaGlzIHdpbGxcbiAgICB1c3VhbGx5IGJlIHRoZSB0b3AtbGV2ZWwgYGRvY3VtZW50YCwgYnV0IG1pZ2h0IGJlIGEgW3NoYWRvd1xuICAgIERPTV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvU2hhZG93X0RPTSlcbiAgICByb290IGlmIHRoZSBlZGl0b3IgaXMgaW5zaWRlIG9uZS5cbiAgICAqL1xuICAgIGdldCByb290KCkge1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcm9vdDtcbiAgICAgICAgaWYgKGNhY2hlZCA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gdGhpcy5kb20ucGFyZW50Tm9kZTsgc2VhcmNoOyBzZWFyY2ggPSBzZWFyY2gucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWFyY2gubm9kZVR5cGUgPT0gOSB8fCAoc2VhcmNoLm5vZGVUeXBlID09IDExICYmIHNlYXJjaC5ob3N0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaC5nZXRTZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2VhcmNoKS5nZXRTZWxlY3Rpb24gPSAoKSA9PiBzZWFyY2gub3duZXJEb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QgPSBzZWFyY2g7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVkIHx8IGRvY3VtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICBXaGVuIGFuIGV4aXN0aW5nIGVkaXRvciB2aWV3IGlzIG1vdmVkIHRvIGEgbmV3IGRvY3VtZW50IG9yXG4gICAgc2hhZG93IHRyZWUsIGNhbGwgdGhpcyB0byBtYWtlIGl0IHJlY29tcHV0ZSBpdHMgcm9vdC5cbiAgICAqL1xuICAgIHVwZGF0ZVJvb3QoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHBhaXIgb2Ygdmlld3BvcnQgY29vcmRpbmF0ZXMsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgICBwb3NpdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZW0uIE1heSByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW5cbiAgICBjb29yZGluYXRlcyBhcmVuJ3QgaW5zaWRlIG9mIHRoZSBlZGl0b3IuIFdoZW4gYW4gb2JqZWN0IGlzXG4gICAgcmV0dXJuZWQsIGl0cyBgcG9zYCBwcm9wZXJ0eSBpcyB0aGUgcG9zaXRpb24gbmVhcmVzdCB0byB0aGVcbiAgICBjb29yZGluYXRlcywgYW5kIGl0cyBgaW5zaWRlYCBwcm9wZXJ0eSBob2xkcyB0aGUgcG9zaXRpb24gb2YgdGhlXG4gICAgaW5uZXIgbm9kZSB0aGF0IHRoZSBwb3NpdGlvbiBmYWxscyBpbnNpZGUgb2YsIG9yIC0xIGlmIGl0IGlzIGF0XG4gICAgdGhlIHRvcCBsZXZlbCwgbm90IGluIGFueSBub2RlLlxuICAgICovXG4gICAgcG9zQXRDb29yZHMoY29vcmRzKSB7XG4gICAgICAgIHJldHVybiBwb3NBdENvb3Jkcyh0aGlzLCBjb29yZHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSB2aWV3cG9ydCByZWN0YW5nbGUgYXQgYSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgbGVmdGAgYW5kIGByaWdodGAgd2lsbCBiZSB0aGUgc2FtZSBudW1iZXIsIGFzIHRoaXMgcmV0dXJucyBhXG4gICAgZmxhdCBjdXJzb3ItaXNoIHJlY3RhbmdsZS4gSWYgdGhlIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHRoaW5nc1xuICAgIHRoYXQgYXJlbid0IGRpcmVjdGx5IGFkamFjZW50LCBgc2lkZWAgZGV0ZXJtaW5lcyB3aGljaCBlbGVtZW50XG4gICAgaXMgdXNlZC4gV2hlbiA8IDAsIHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgdXNlZCxcbiAgICBvdGhlcndpc2UgdGhlIGVsZW1lbnQgYWZ0ZXIuXG4gICAgKi9cbiAgICBjb29yZHNBdFBvcyhwb3MsIHNpZGUgPSAxKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNBdFBvcyh0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gZG9jdW1lbnRcbiAgICBwb3NpdGlvbi4gV2hlbiBgc2lkZWAgaXMgbmVnYXRpdmUsIGZpbmQgdGhlIHBvc2l0aW9uIGFzIGNsb3NlIGFzXG4gICAgcG9zc2libGUgdG8gdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBwb3NpdGlvbi4gV2hlbiBwb3NpdGl2ZSxcbiAgICBwcmVmZXIgcG9zaXRpb25zIGNsb3NlIHRvIHRoZSBjb250ZW50IGFmdGVyIHRoZSBwb3NpdGlvbi4gV2hlblxuICAgIHplcm8sIHByZWZlciBhcyBzaGFsbG93IGEgcG9zaXRpb24gYXMgcG9zc2libGUuXG4gICAgXG4gICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgKipub3QqKiBtdXRhdGUgdGhlIGVkaXRvcidzIGludGVybmFsIERPTSxcbiAgICBvbmx5IGluc3BlY3QgaXQgKGFuZCBldmVuIHRoYXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5KS5cbiAgICAqL1xuICAgIGRvbUF0UG9zKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgbm9kZSBhZnRlciB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbi4gTWF5IHJldHVybiBgbnVsbGAgd2hlbiB0aGUgcG9zaXRpb24gZG9lc24ndCBwb2ludFxuICAgIGluIGZyb250IG9mIGEgbm9kZSBvciBpZiB0aGUgbm9kZSBpcyBpbnNpZGUgYW4gb3BhcXVlIG5vZGUgdmlldy5cbiAgICBcbiAgICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGFibGUgdG8gY2FsbCB0aGluZ3MgbGlrZVxuICAgIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG9uIHRoYXQgRE9NIG5vZGUuIERvICoqbm90KiogbXV0YXRlIHRoZVxuICAgIGVkaXRvciBET00gZGlyZWN0bHksIG9yIGFkZCBzdHlsaW5nIHRoaXMgd2F5LCBzaW5jZSB0aGF0IHdpbGwgYmVcbiAgICBpbW1lZGlhdGVseSBvdmVycmlkZW4gYnkgdGhlIGVkaXRvciBhcyBpdCByZWRyYXdzIHRoZSBub2RlLlxuICAgICovXG4gICAgbm9kZURPTShwb3MpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmRvY1ZpZXcuZGVzY0F0KHBvcyk7XG4gICAgICAgIHJldHVybiBkZXNjID8gZGVzYy5ub2RlRE9NIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIERPTVxuICAgIHBvc2l0aW9uLiAoV2hlbmV2ZXIgcG9zc2libGUsIGl0IGlzIHByZWZlcmFibGUgdG8gaW5zcGVjdCB0aGVcbiAgICBkb2N1bWVudCBzdHJ1Y3R1cmUgZGlyZWN0bHksIHJhdGhlciB0aGFuIHBva2luZyBhcm91bmQgaW4gdGhlXG4gICAgRE9NLCBidXQgc29tZXRpbWVz4oCUZm9yIGV4YW1wbGUgd2hlbiBpbnRlcnByZXRpbmcgYW4gZXZlbnRcbiAgICB0YXJnZXTigJR5b3UgZG9uJ3QgaGF2ZSBhIGNob2ljZS4pXG4gICAgXG4gICAgVGhlIGBiaWFzYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHdoaWNoIHNpZGUgb2YgYSBET01cbiAgICBub2RlIHRvIHVzZSB3aGVuIHRoZSBwb3NpdGlvbiBpcyBpbnNpZGUgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBwb3NBdERPTShub2RlLCBvZmZzZXQsIGJpYXMgPSAtMSkge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbiAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJET00gcG9zaXRpb24gbm90IGluc2lkZSB0aGUgZWRpdG9yXCIpO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIG91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jayB3aGVuXG4gICAgbW92aW5nIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLiBXaGVuLCBmb3IgZXhhbXBsZSwgZ2l2ZW4gYFwibGVmdFwiYCxcbiAgICBpdCB3aWxsIHJldHVybiB0cnVlIGlmIG1vdmluZyBsZWZ0IGZyb20gdGhlIGN1cnJlbnQgY3Vyc29yXG4gICAgcG9zaXRpb24gd291bGQgbGVhdmUgdGhhdCBwb3NpdGlvbidzIHBhcmVudCB0ZXh0YmxvY2suIFdpbGwgYXBwbHlcbiAgICB0byB0aGUgdmlldydzIGN1cnJlbnQgc3RhdGUgYnkgZGVmYXVsdCwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvXG4gICAgcGFzcyBhIGRpZmZlcmVudCBzdGF0ZS5cbiAgICAqL1xuICAgIGVuZE9mVGV4dGJsb2NrKGRpciwgc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGVuZE9mVGV4dGJsb2NrKHRoaXMsIHN0YXRlIHx8IHRoaXMuc3RhdGUsIGRpcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmcuIFRoZVxuICAgIGBldmVudGAsIGlmIGdpdmVuLCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICBbYGhhbmRsZVBhc3RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlUGFzdGUpIGhvb2suXG4gICAgKi9cbiAgICBwYXN0ZUhUTUwoaHRtbCwgZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIGRvUGFzdGUodGhpcywgXCJcIiwgaHRtbCwgZmFsc2UsIGV2ZW50IHx8IG5ldyBDbGlwYm9hcmRFdmVudChcInBhc3RlXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIHRoZSBlZGl0b3IncyBwYXN0ZSBsb2dpYyB3aXRoIHRoZSBnaXZlbiBwbGFpbi10ZXh0IGlucHV0LlxuICAgICovXG4gICAgcGFzdGVUZXh0KHRleHQsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIHRleHQsIG51bGwsIHRydWUsIGV2ZW50IHx8IG5ldyBDbGlwYm9hcmRFdmVudChcInBhc3RlXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoZSBnaXZlbiBzbGljZSBhcyBpdCB3b3VsZCBiZSBpZiBpdCB3YXMgY29waWVkIGZyb21cbiAgICB0aGlzIGVkaXRvci4gUmV0dXJucyBhIERPTSBlbGVtZW50IHRoYXQgY29udGFpbnMgYVxuICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzbGljZSBhcyBpdHMgY2hpbGRyZW4sIGEgdGV4dHVhbFxuICAgIHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlIHRyYW5zZm9ybWVkIHNsaWNlICh3aGljaCBjYW4gYmVcbiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgZHVlIHRvIGhvb2tzIGxpa2VcbiAgICBbYHRyYW5zZm9ybUNvcGllZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLnRyYW5zZm9ybUNvcGllZCkpLlxuICAgICovXG4gICAgc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHNsaWNlKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVGb3JDbGlwYm9hcmQodGhpcywgc2xpY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIHRoZSBlZGl0b3IgZnJvbSB0aGUgRE9NIGFuZCBkZXN0cm95cyBhbGwgW25vZGVcbiAgICB2aWV3c10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRlc3Ryb3lJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXN0cm95UGx1Z2luVmlld3MoKTtcbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZSh0aGlzLnN0YXRlLmRvYywgW10sIHZpZXdEZWNvcmF0aW9ucyh0aGlzKSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gbnVsbDtcbiAgICAgICAgY2xlYXJSZXVzZWRSYW5nZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIHRydWUgd2hlbiB0aGUgdmlldyBoYXMgYmVlblxuICAgIFtkZXN0cm95ZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGVzdHJveSkgKGFuZCB0aHVzIHNob3VsZCBub3QgYmVcbiAgICB1c2VkIGFueW1vcmUpLlxuICAgICovXG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3ID09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgZm9yIHRlc3RpbmcuXG4gICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGlzcGF0Y2ggYSB0cmFuc2FjdGlvbi4gV2lsbCBjYWxsXG4gICAgW2BkaXNwYXRjaFRyYW5zYWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbilcbiAgICB3aGVuIGdpdmVuLCBhbmQgb3RoZXJ3aXNlIGRlZmF1bHRzIHRvIGFwcGx5aW5nIHRoZSB0cmFuc2FjdGlvbiB0b1xuICAgIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBjYWxsaW5nXG4gICAgW2B1cGRhdGVTdGF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudXBkYXRlU3RhdGUpIHdpdGggdGhlIHJlc3VsdC5cbiAgICBUaGlzIG1ldGhvZCBpcyBib3VuZCB0byB0aGUgdmlldyBpbnN0YW5jZSwgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAqL1xuICAgIGRpc3BhdGNoKHRyKSB7XG4gICAgICAgIGxldCBkaXNwYXRjaFRyYW5zYWN0aW9uID0gdGhpcy5fcHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbjtcbiAgICAgICAgaWYgKGRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uLmNhbGwodGhpcywgdHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUuYXBwbHkodHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuZG9tU2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsKVxuICAgICAgICAgICAgcmV0dXJuIHsgZm9jdXNOb2RlOiBudWxsLCBmb2N1c09mZnNldDogMCwgYW5jaG9yTm9kZTogbnVsbCwgYW5jaG9yT2Zmc2V0OiAwIH07XG4gICAgICAgIHJldHVybiBzYWZhcmkgJiYgdGhpcy5yb290Lm5vZGVUeXBlID09PSAxMSAmJlxuICAgICAgICAgICAgZGVlcEFjdGl2ZUVsZW1lbnQodGhpcy5kb20ub3duZXJEb2N1bWVudCkgPT0gdGhpcy5kb20gJiYgc2FmYXJpU2hhZG93U2VsZWN0aW9uUmFuZ2UodGhpcywgc2VsKSB8fCBzZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LmdldFNlbGVjdGlvbigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVEb2NEZWNvKHZpZXcpIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGF0dHJzLmNsYXNzID0gXCJQcm9zZU1pcnJvclwiO1xuICAgIGF0dHJzLmNvbnRlbnRlZGl0YWJsZSA9IFN0cmluZyh2aWV3LmVkaXRhYmxlKTtcbiAgICB2aWV3LnNvbWVQcm9wKFwiYXR0cmlidXRlc1wiLCB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgZm9yIChsZXQgYXR0ciBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMuY2xhc3MgKz0gXCIgXCIgKyB2YWx1ZVthdHRyXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMuc3R5bGUgPSAoYXR0cnMuc3R5bGUgPyBhdHRycy5zdHlsZSArIFwiO1wiIDogXCJcIikgKyB2YWx1ZVthdHRyXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghYXR0cnNbYXR0cl0gJiYgYXR0ciAhPSBcImNvbnRlbnRlZGl0YWJsZVwiICYmIGF0dHIgIT0gXCJub2RlTmFtZVwiKVxuICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHRyXSA9IFN0cmluZyh2YWx1ZVthdHRyXSk7XG4gICAgICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFhdHRycy50cmFuc2xhdGUpXG4gICAgICAgIGF0dHJzLnRyYW5zbGF0ZSA9IFwibm9cIjtcbiAgICByZXR1cm4gW0RlY29yYXRpb24ubm9kZSgwLCB2aWV3LnN0YXRlLmRvYy5jb250ZW50LnNpemUsIGF0dHJzKV07XG59XG5mdW5jdGlvbiB1cGRhdGVDdXJzb3JXcmFwcGVyKHZpZXcpIHtcbiAgICBpZiAodmlldy5tYXJrQ3Vyc29yKSB7XG4gICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1zZXBhcmF0b3JcIjtcbiAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcIm1hcmstcGxhY2Vob2xkZXJcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYWx0XCIsIFwiXCIpO1xuICAgICAgICB2aWV3LmN1cnNvcldyYXBwZXIgPSB7IGRvbSwgZGVjbzogRGVjb3JhdGlvbi53aWRnZXQodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSwgZG9tLCB7IHJhdzogdHJ1ZSwgbWFya3M6IHZpZXcubWFya0N1cnNvciB9KSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5jdXJzb3JXcmFwcGVyID0gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFZGl0YWJsZSh2aWV3KSB7XG4gICAgcmV0dXJuICF2aWV3LnNvbWVQcm9wKFwiZWRpdGFibGVcIiwgdmFsdWUgPT4gdmFsdWUodmlldy5zdGF0ZSkgPT09IGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRleHRDaGFuZ2VkKHNlbDEsIHNlbDIpIHtcbiAgICBsZXQgZGVwdGggPSBNYXRoLm1pbihzZWwxLiRhbmNob3Iuc2hhcmVkRGVwdGgoc2VsMS5oZWFkKSwgc2VsMi4kYW5jaG9yLnNoYXJlZERlcHRoKHNlbDIuaGVhZCkpO1xuICAgIHJldHVybiBzZWwxLiRhbmNob3Iuc3RhcnQoZGVwdGgpICE9IHNlbDIuJGFuY2hvci5zdGFydChkZXB0aCk7XG59XG5mdW5jdGlvbiBidWlsZE5vZGVWaWV3cyh2aWV3KSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZnVuY3Rpb24gYWRkKG9iaikge1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG9iailcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgcHJvcCkpXG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwibm9kZVZpZXdzXCIsIGFkZCk7XG4gICAgdmlldy5zb21lUHJvcChcIm1hcmtWaWV3c1wiLCBhZGQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjaGFuZ2VkTm9kZVZpZXdzKGEsIGIpIHtcbiAgICBsZXQgbkEgPSAwLCBuQiA9IDA7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBhKSB7XG4gICAgICAgIGlmIChhW3Byb3BdICE9IGJbcHJvcF0pXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbkErKztcbiAgICB9XG4gICAgZm9yIChsZXQgXyBpbiBiKVxuICAgICAgICBuQisrO1xuICAgIHJldHVybiBuQSAhPSBuQjtcbn1cbmZ1bmN0aW9uIGNoZWNrU3RhdGVDb21wb25lbnQocGx1Z2luKSB7XG4gICAgaWYgKHBsdWdpbi5zcGVjLnN0YXRlIHx8IHBsdWdpbi5zcGVjLmZpbHRlclRyYW5zYWN0aW9uIHx8IHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlBsdWdpbnMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSB2aWV3IG11c3Qgbm90IGhhdmUgYSBzdGF0ZSBjb21wb25lbnRcIik7XG59XG5cbmV4cG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXcsIF9fZW5kQ29tcG9zaXRpb24sIF9fcGFyc2VGcm9tQ2xpcGJvYXJkIH07XG4iLCJ2YXIgR09PRF9MRUFGX1NJWkUgPSAyMDA7XG5cbi8vIDo6IGNsYXNzPFQ+IEEgcm9wZSBzZXF1ZW5jZSBpcyBhIHBlcnNpc3RlbnQgc2VxdWVuY2UgZGF0YSBzdHJ1Y3R1cmVcbi8vIHRoYXQgc3VwcG9ydHMgYXBwZW5kaW5nLCBwcmVwZW5kaW5nLCBhbmQgc2xpY2luZyB3aXRob3V0IGRvaW5nIGFcbi8vIGZ1bGwgY29weS4gSXQgaXMgcmVwcmVzZW50ZWQgYXMgYSBtb3N0bHktYmFsYW5jZWQgdHJlZS5cbnZhciBSb3BlU2VxdWVuY2UgPSBmdW5jdGlvbiBSb3BlU2VxdWVuY2UgKCkge307XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kIChvdGhlcikge1xuICBpZiAoIW90aGVyLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gIG90aGVyID0gUm9wZVNlcXVlbmNlLmZyb20ob3RoZXIpO1xuXG4gIHJldHVybiAoIXRoaXMubGVuZ3RoICYmIG90aGVyKSB8fFxuICAgIChvdGhlci5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiB0aGlzLmxlYWZBcHBlbmQob3RoZXIpKSB8fFxuICAgICh0aGlzLmxlbmd0aCA8IEdPT0RfTEVBRl9TSVpFICYmIG90aGVyLmxlYWZQcmVwZW5kKHRoaXMpKSB8fFxuICAgIHRoaXMuYXBwZW5kSW5uZXIob3RoZXIpXG59O1xuXG4vLyA6OiAodW5pb248W1RdLCBSb3BlU2VxdWVuY2U8VD4+KSDihpIgUm9wZVNlcXVlbmNlPFQ+XG4vLyBQcmVwZW5kIGFuIGFycmF5IG9yIG90aGVyIHJvcGUgdG8gdGhpcyBvbmUsIHJldHVybmluZyBhIG5ldyByb3BlLlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gcHJlcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICByZXR1cm4gUm9wZVNlcXVlbmNlLmZyb20ob3RoZXIpLmFwcGVuZCh0aGlzKVxufTtcblxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLCBvdGhlcilcbn07XG5cbi8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgUm9wZVNlcXVlbmNlPFQ+XG4vLyBDcmVhdGUgYSByb3BlIHJlcGVzZW50aW5nIGEgc3ViLXNlcXVlbmNlIG9mIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoZnJvbSwgdG8pIHtcbiAgICBpZiAoIGZyb20gPT09IHZvaWQgMCApIGZyb20gPSAwO1xuICAgIGlmICggdG8gPT09IHZvaWQgMCApIHRvID0gdGhpcy5sZW5ndGg7XG5cbiAgaWYgKGZyb20gPj0gdG8pIHsgcmV0dXJuIFJvcGVTZXF1ZW5jZS5lbXB0eSB9XG4gIHJldHVybiB0aGlzLnNsaWNlSW5uZXIoTWF0aC5tYXgoMCwgZnJvbSksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykpXG59O1xuXG4vLyA6OiAobnVtYmVyKSDihpIgVFxuLy8gUmV0cmlldmUgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGZyb20gdGhpcyByb3BlLlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5sZW5ndGgpIHsgcmV0dXJuIHVuZGVmaW5lZCB9XG4gIHJldHVybiB0aGlzLmdldElubmVyKGkpXG59O1xuXG4vLyA6OiAoKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIpIOKGkiA/Ym9vbCwgP251bWJlciwgP251bWJlcilcbi8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGVsZW1lbnQgYmV0d2VlbiB0aGUgZ2l2ZW5cbi8vIGluZGljZXMuIFRoaXMgdGVuZHMgdG8gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBsb29waW5nIG92ZXIgdGhlXG4vLyBpbmRpY2VzIGFuZCBjYWxsaW5nIGBnZXRgLCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSB0byBkZXNjZW5kIHRoZVxuLy8gdHJlZSBmb3IgZXZlcnkgZWxlbWVudC5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2ggKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tIDw9IHRvKVxuICAgIHsgdGhpcy5mb3JFYWNoSW5uZXIoZiwgZnJvbSwgdG8sIDApOyB9XG4gIGVsc2VcbiAgICB7IHRoaXMuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgZnJvbSwgdG8sIDApOyB9XG59O1xuXG4vLyA6OiAoKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIpIOKGkiBVLCA/bnVtYmVyLCA/bnVtYmVyKSDihpIgW1VdXG4vLyBNYXAgdGhlIGdpdmVuIGZ1bmN0aW9ucyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUgcm9wZSwgcHJvZHVjaW5nXG4vLyBhIGZsYXQgYXJyYXkuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAoZiwgZnJvbSwgdG8pIHtcbiAgICBpZiAoIGZyb20gPT09IHZvaWQgMCApIGZyb20gPSAwO1xuICAgIGlmICggdG8gPT09IHZvaWQgMCApIHRvID0gdGhpcy5sZW5ndGg7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsdCwgaSkgeyByZXR1cm4gcmVzdWx0LnB1c2goZihlbHQsIGkpKTsgfSwgZnJvbSwgdG8pO1xuICByZXR1cm4gcmVzdWx0XG59O1xuXG4vLyA6OiAoP3VuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+Pikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGFycmF5LCBvciByZXR1cm4gdGhlIHJvcGVcbi8vIGl0c2VsZiBpZiBhIHJvcGUgd2FzIGdpdmVuLlxuUm9wZVNlcXVlbmNlLmZyb20gPSBmdW5jdGlvbiBmcm9tICh2YWx1ZXMpIHtcbiAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIFJvcGVTZXF1ZW5jZSkgeyByZXR1cm4gdmFsdWVzIH1cbiAgcmV0dXJuIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID8gbmV3IExlYWYodmFsdWVzKSA6IFJvcGVTZXF1ZW5jZS5lbXB0eVxufTtcblxudmFyIExlYWYgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChSb3BlU2VxdWVuY2UpIHtcbiAgZnVuY3Rpb24gTGVhZih2YWx1ZXMpIHtcbiAgICBSb3BlU2VxdWVuY2UuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGlmICggUm9wZVNlcXVlbmNlICkgTGVhZi5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIExlYWYucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUm9wZVNlcXVlbmNlICYmIFJvcGVTZXF1ZW5jZS5wcm90b3R5cGUgKTtcbiAgTGVhZi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMZWFmO1xuXG4gIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGxlbmd0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSxkZXB0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gIExlYWYucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbiBmbGF0dGVuICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5zbGljZUlubmVyID0gZnVuY3Rpb24gc2xpY2VJbm5lciAoZnJvbSwgdG8pIHtcbiAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgICByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuc2xpY2UoZnJvbSwgdG8pKVxuICB9O1xuXG4gIExlYWYucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNbaV1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIGZvciAodmFyIGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgIHsgaWYgKGYodGhpcy52YWx1ZXNbaV0sIHN0YXJ0ICsgaSkgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5mb3JFYWNoSW52ZXJ0ZWRJbm5lciA9IGZ1bmN0aW9uIGZvckVhY2hJbnZlcnRlZElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbSAtIDE7IGkgPj0gdG87IGktLSlcbiAgICAgIHsgaWYgKGYodGhpcy52YWx1ZXNbaV0sIHN0YXJ0ICsgaSkgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGggPD0gR09PRF9MRUFGX1NJWkUpXG4gICAgICB7IHJldHVybiBuZXcgTGVhZih0aGlzLnZhbHVlcy5jb25jYXQob3RoZXIuZmxhdHRlbigpKSkgfVxuICB9O1xuXG4gIExlYWYucHJvdG90eXBlLmxlYWZQcmVwZW5kID0gZnVuY3Rpb24gbGVhZlByZXBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYob3RoZXIuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnZhbHVlcykpIH1cbiAgfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMubGVuZ3RoLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCB9O1xuXG4gIHByb3RvdHlwZUFjY2Vzc29ycy5kZXB0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAwIH07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExlYWYucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICByZXR1cm4gTGVhZjtcbn0oUm9wZVNlcXVlbmNlKSk7XG5cbi8vIDo6IFJvcGVTZXF1ZW5jZVxuLy8gVGhlIGVtcHR5IHJvcGUgc2VxdWVuY2UuXG5Sb3BlU2VxdWVuY2UuZW1wdHkgPSBuZXcgTGVhZihbXSk7XG5cbnZhciBBcHBlbmQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChSb3BlU2VxdWVuY2UpIHtcbiAgZnVuY3Rpb24gQXBwZW5kKGxlZnQsIHJpZ2h0KSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHJpZ2h0Lmxlbmd0aDtcbiAgICB0aGlzLmRlcHRoID0gTWF0aC5tYXgobGVmdC5kZXB0aCwgcmlnaHQuZGVwdGgpICsgMTtcbiAgfVxuXG4gIGlmICggUm9wZVNlcXVlbmNlICkgQXBwZW5kLl9fcHJvdG9fXyA9IFJvcGVTZXF1ZW5jZTtcbiAgQXBwZW5kLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIEFwcGVuZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcHBlbmQ7XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVmdC5mbGF0dGVuKCkuY29uY2F0KHRoaXMucmlnaHQuZmxhdHRlbigpKVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZ2V0SW5uZXIgPSBmdW5jdGlvbiBnZXRJbm5lciAoaSkge1xuICAgIHJldHVybiBpIDwgdGhpcy5sZWZ0Lmxlbmd0aCA/IHRoaXMubGVmdC5nZXQoaSkgOiB0aGlzLnJpZ2h0LmdldChpIC0gdGhpcy5sZWZ0Lmxlbmd0aClcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbm5lciA9IGZ1bmN0aW9uIGZvckVhY2hJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmIChmcm9tIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaElubmVyKGYsIGZyb20sIE1hdGgubWluKHRvLCBsZWZ0TGVuKSwgc3RhcnQpID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAodG8gPiBsZWZ0TGVuICYmXG4gICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaElubmVyKGYsIE1hdGgubWF4KGZyb20gLSBsZWZ0TGVuLCAwKSwgTWF0aC5taW4odGhpcy5sZW5ndGgsIHRvKSAtIGxlZnRMZW4sIHN0YXJ0ICsgbGVmdExlbikgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmIChmcm9tID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20gLSBsZWZ0TGVuLCBNYXRoLm1heCh0bywgbGVmdExlbikgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAodG8gPCBsZWZ0TGVuICYmXG4gICAgICAgIHRoaXMubGVmdC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBNYXRoLm1pbihmcm9tLCBsZWZ0TGVuKSwgdG8sIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5zbGljZUlubmVyID0gZnVuY3Rpb24gc2xpY2VJbm5lciAoZnJvbSwgdG8pIHtcbiAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgICB2YXIgbGVmdExlbiA9IHRoaXMubGVmdC5sZW5ndGg7XG4gICAgaWYgKHRvIDw9IGxlZnRMZW4pIHsgcmV0dXJuIHRoaXMubGVmdC5zbGljZShmcm9tLCB0bykgfVxuICAgIGlmIChmcm9tID49IGxlZnRMZW4pIHsgcmV0dXJuIHRoaXMucmlnaHQuc2xpY2UoZnJvbSAtIGxlZnRMZW4sIHRvIC0gbGVmdExlbikgfVxuICAgIHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgbGVmdExlbikuYXBwZW5kKHRoaXMucmlnaHQuc2xpY2UoMCwgdG8gLSBsZWZ0TGVuKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmxlYWZBcHBlbmQgPSBmdW5jdGlvbiBsZWFmQXBwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMucmlnaHQubGVhZkFwcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKHRoaXMubGVmdCwgaW5uZXIpIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmxlYWZQcmVwZW5kID0gZnVuY3Rpb24gbGVhZlByZXBlbmQgKG90aGVyKSB7XG4gICAgdmFyIGlubmVyID0gdGhpcy5sZWZ0LmxlYWZQcmVwZW5kKG90aGVyKTtcbiAgICBpZiAoaW5uZXIpIHsgcmV0dXJuIG5ldyBBcHBlbmQoaW5uZXIsIHRoaXMucmlnaHQpIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmFwcGVuZElubmVyID0gZnVuY3Rpb24gYXBwZW5kSW5uZXIgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVmdC5kZXB0aCA+PSBNYXRoLm1heCh0aGlzLnJpZ2h0LmRlcHRoLCBvdGhlci5kZXB0aCkgKyAxKVxuICAgICAgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIG5ldyBBcHBlbmQodGhpcy5yaWdodCwgb3RoZXIpKSB9XG4gICAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG4gIH07XG5cbiAgcmV0dXJuIEFwcGVuZDtcbn0oUm9wZVNlcXVlbmNlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IFJvcGVTZXF1ZW5jZTtcbiIsImltcG9ydCBSb3BlU2VxdWVuY2UgZnJvbSAncm9wZS1zZXF1ZW5jZSc7XG5pbXBvcnQgeyBNYXBwaW5nIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IFBsdWdpbktleSwgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vLyBQcm9zZU1pcnJvcidzIGhpc3RvcnkgaXNuJ3Qgc2ltcGx5IGEgd2F5IHRvIHJvbGwgYmFjayB0byBhIHByZXZpb3VzXG4vLyBzdGF0ZSwgYmVjYXVzZSBQcm9zZU1pcnJvciBzdXBwb3J0cyBhcHBseWluZyBjaGFuZ2VzIHdpdGhvdXQgYWRkaW5nXG4vLyB0aGVtIHRvIHRoZSBoaXN0b3J5IChmb3IgZXhhbXBsZSBkdXJpbmcgY29sbGFib3JhdGlvbikuXG4vL1xuLy8gVG8gdGhpcyBlbmQsIGVhY2ggJ0JyYW5jaCcgKG9uZSBmb3IgdGhlIHVuZG8gaGlzdG9yeSBhbmQgb25lIGZvclxuLy8gdGhlIHJlZG8gaGlzdG9yeSkga2VlcHMgYW4gYXJyYXkgb2YgJ0l0ZW1zJywgd2hpY2ggY2FuIG9wdGlvbmFsbHlcbi8vIGhvbGQgYSBzdGVwIChhbiBhY3R1YWwgdW5kb2FibGUgY2hhbmdlKSwgYW5kIGFsd2F5cyBob2xkIGEgcG9zaXRpb25cbi8vIG1hcCAod2hpY2ggaXMgbmVlZGVkIHRvIG1vdmUgY2hhbmdlcyBiZWxvdyB0aGVtIHRvIGFwcGx5IHRvIHRoZVxuLy8gY3VycmVudCBkb2N1bWVudCkuXG4vL1xuLy8gQW4gaXRlbSB0aGF0IGhhcyBib3RoIGEgc3RlcCBhbmQgYSBzZWxlY3Rpb24gYm9va21hcmsgaXMgdGhlIHN0YXJ0XG4vLyBvZiBhbiAnZXZlbnQnIOKAlCBhIGdyb3VwIG9mIGNoYW5nZXMgdGhhdCB3aWxsIGJlIHVuZG9uZSBvciByZWRvbmUgYXRcbi8vIG9uY2UuIChJdCBzdG9yZXMgb25seSB0aGUgYm9va21hcmssIHNpbmNlIHRoYXQgd2F5IHdlIGRvbid0IGhhdmUgdG9cbi8vIHByb3ZpZGUgYSBkb2N1bWVudCB1bnRpbCB0aGUgc2VsZWN0aW9uIGlzIGFjdHVhbGx5IGFwcGxpZWQsIHdoaWNoXG4vLyBpcyB1c2VmdWwgd2hlbiBjb21wcmVzc2luZy4pXG4vLyBVc2VkIHRvIHNjaGVkdWxlIGhpc3RvcnkgY29tcHJlc3Npb25cbmNvbnN0IG1heF9lbXB0eV9pdGVtcyA9IDUwMDtcbmNsYXNzIEJyYW5jaCB7XG4gICAgY29uc3RydWN0b3IoaXRlbXMsIGV2ZW50Q291bnQpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmV2ZW50Q291bnQgPSBldmVudENvdW50O1xuICAgIH1cbiAgICAvLyBQb3AgdGhlIGxhdGVzdCBldmVudCBvZmYgdGhlIGJyYW5jaCdzIGhpc3RvcnkgYW5kIGFwcGx5IGl0XG4gICAgLy8gdG8gYSBkb2N1bWVudCB0cmFuc2Zvcm0uXG4gICAgcG9wRXZlbnQoc3RhdGUsIHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICAgICAgZm9yICg7OyBlbmQtLSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLml0ZW1zLmdldChlbmQgLSAxKTtcbiAgICAgICAgICAgIGlmIChuZXh0LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC0tZW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZW1hcCwgbWFwRnJvbTtcbiAgICAgICAgaWYgKHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgICAgIHJlbWFwID0gdGhpcy5yZW1hcHBpbmcoZW5kLCB0aGlzLml0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYW5zZm9ybSA9IHN0YXRlLnRyO1xuICAgICAgICBsZXQgc2VsZWN0aW9uLCByZW1haW5pbmc7XG4gICAgICAgIGxldCBhZGRBZnRlciA9IFtdLCBhZGRCZWZvcmUgPSBbXTtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGlmICghcmVtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAgPSB0aGlzLnJlbWFwcGluZyhlbmQsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgYWRkQmVmb3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbWFwKSB7XG4gICAgICAgICAgICAgICAgYWRkQmVmb3JlLnB1c2gobmV3IEl0ZW0oaXRlbS5tYXApKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IGl0ZW0uc3RlcC5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpLCBtYXA7XG4gICAgICAgICAgICAgICAgaWYgKHN0ZXAgJiYgdHJhbnNmb3JtLm1heWJlU3RlcChzdGVwKS5kb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwID0gdHJhbnNmb3JtLm1hcHBpbmcubWFwc1t0cmFuc2Zvcm0ubWFwcGluZy5tYXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBhZGRBZnRlci5wdXNoKG5ldyBJdGVtKG1hcCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFkZEFmdGVyLmxlbmd0aCArIGFkZEJlZm9yZS5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgICAgIGlmIChtYXApXG4gICAgICAgICAgICAgICAgICAgIHJlbWFwLmFwcGVuZE1hcChtYXAsIG1hcEZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLm1heWJlU3RlcChpdGVtLnN0ZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gcmVtYXAgPyBpdGVtLnNlbGVjdGlvbi5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpIDogaXRlbS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbmV3IEJyYW5jaCh0aGlzLml0ZW1zLnNsaWNlKDAsIGVuZCkuYXBwZW5kKGFkZEJlZm9yZS5yZXZlcnNlKCkuY29uY2F0KGFkZEFmdGVyKSksIHRoaXMuZXZlbnRDb3VudCAtIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pdGVtcy5sZW5ndGgsIDApO1xuICAgICAgICByZXR1cm4geyByZW1haW5pbmc6IHJlbWFpbmluZywgdHJhbnNmb3JtLCBzZWxlY3Rpb246IHNlbGVjdGlvbiB9O1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBuZXcgYnJhbmNoIHdpdGggdGhlIGdpdmVuIHRyYW5zZm9ybSBhZGRlZC5cbiAgICBhZGRUcmFuc2Zvcm0odHJhbnNmb3JtLCBzZWxlY3Rpb24sIGhpc3RPcHRpb25zLCBwcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgIGxldCBuZXdJdGVtcyA9IFtdLCBldmVudENvdW50ID0gdGhpcy5ldmVudENvdW50O1xuICAgICAgICBsZXQgb2xkSXRlbXMgPSB0aGlzLml0ZW1zLCBsYXN0SXRlbSA9ICFwcmVzZXJ2ZUl0ZW1zICYmIG9sZEl0ZW1zLmxlbmd0aCA/IG9sZEl0ZW1zLmdldChvbGRJdGVtcy5sZW5ndGggLSAxKSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNmb3JtLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RlcCA9IHRyYW5zZm9ybS5zdGVwc1tpXS5pbnZlcnQodHJhbnNmb3JtLmRvY3NbaV0pO1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBuZXcgSXRlbSh0cmFuc2Zvcm0ubWFwcGluZy5tYXBzW2ldLCBzdGVwLCBzZWxlY3Rpb24pLCBtZXJnZWQ7XG4gICAgICAgICAgICBpZiAobWVyZ2VkID0gbGFzdEl0ZW0gJiYgbGFzdEl0ZW0ubWVyZ2UoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpdGVtID0gbWVyZ2VkO1xuICAgICAgICAgICAgICAgIGlmIChpKVxuICAgICAgICAgICAgICAgICAgICBuZXdJdGVtcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9sZEl0ZW1zID0gb2xkSXRlbXMuc2xpY2UoMCwgb2xkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGV2ZW50Q291bnQrKztcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlSXRlbXMpXG4gICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdmVyZmxvdyA9IGV2ZW50Q291bnQgLSBoaXN0T3B0aW9ucy5kZXB0aDtcbiAgICAgICAgaWYgKG92ZXJmbG93ID4gREVQVEhfT1ZFUkZMT1cpIHtcbiAgICAgICAgICAgIG9sZEl0ZW1zID0gY3V0T2ZmRXZlbnRzKG9sZEl0ZW1zLCBvdmVyZmxvdyk7XG4gICAgICAgICAgICBldmVudENvdW50IC09IG92ZXJmbG93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKG9sZEl0ZW1zLmFwcGVuZChuZXdJdGVtcyksIGV2ZW50Q291bnQpO1xuICAgIH1cbiAgICByZW1hcHBpbmcoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IG1hcHMgPSBuZXcgTWFwcGluZztcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWlycm9yUG9zID0gaXRlbS5taXJyb3JPZmZzZXQgIT0gbnVsbCAmJiBpIC0gaXRlbS5taXJyb3JPZmZzZXQgPj0gZnJvbVxuICAgICAgICAgICAgICAgID8gbWFwcy5tYXBzLmxlbmd0aCAtIGl0ZW0ubWlycm9yT2Zmc2V0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgbWFwcy5hcHBlbmRNYXAoaXRlbS5tYXAsIG1pcnJvclBvcyk7XG4gICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgcmV0dXJuIG1hcHM7XG4gICAgfVxuICAgIGFkZE1hcHMoYXJyYXkpIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKHRoaXMuaXRlbXMuYXBwZW5kKGFycmF5Lm1hcChtYXAgPT4gbmV3IEl0ZW0obWFwKSkpLCB0aGlzLmV2ZW50Q291bnQpO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZSBjb2xsYWIgbW9kdWxlIHJlY2VpdmVzIHJlbW90ZSBjaGFuZ2VzLCB0aGUgaGlzdG9yeSBoYXNcbiAgICAvLyB0byBrbm93IGFib3V0IHRob3NlLCBzbyB0aGF0IGl0IGNhbiBhZGp1c3QgdGhlIHN0ZXBzIHRoYXQgd2VyZVxuICAgIC8vIHJlYmFzZWQgb24gdG9wIG9mIHRoZSByZW1vdGUgY2hhbmdlcywgYW5kIGluY2x1ZGUgdGhlIHBvc2l0aW9uXG4gICAgLy8gbWFwcyBmb3IgdGhlIHJlbW90ZSBjaGFuZ2VzIGluIGl0cyBhcnJheSBvZiBpdGVtcy5cbiAgICByZWJhc2VkKHJlYmFzZWRUcmFuc2Zvcm0sIHJlYmFzZWRDb3VudCkge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRDb3VudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmViYXNlZEl0ZW1zID0gW10sIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGhpcy5pdGVtcy5sZW5ndGggLSByZWJhc2VkQ291bnQpO1xuICAgICAgICBsZXQgbWFwcGluZyA9IHJlYmFzZWRUcmFuc2Zvcm0ubWFwcGluZztcbiAgICAgICAgbGV0IG5ld1VudGlsID0gcmViYXNlZFRyYW5zZm9ybS5zdGVwcy5sZW5ndGg7XG4gICAgICAgIGxldCBldmVudENvdW50ID0gdGhpcy5ldmVudENvdW50O1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7IGlmIChpdGVtLnNlbGVjdGlvbilcbiAgICAgICAgICAgIGV2ZW50Q291bnQtLTsgfSwgc3RhcnQpO1xuICAgICAgICBsZXQgaVJlYmFzZWQgPSByZWJhc2VkQ291bnQ7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLmdldE1pcnJvcigtLWlSZWJhc2VkKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBuZXdVbnRpbCA9IE1hdGgubWluKG5ld1VudGlsLCBwb3MpO1xuICAgICAgICAgICAgbGV0IG1hcCA9IG1hcHBpbmcubWFwc1twb3NdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gcmViYXNlZFRyYW5zZm9ybS5zdGVwc1twb3NdLmludmVydChyZWJhc2VkVHJhbnNmb3JtLmRvY3NbcG9zXSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGl0ZW0uc2VsZWN0aW9uICYmIGl0ZW0uc2VsZWN0aW9uLm1hcChtYXBwaW5nLnNsaWNlKGlSZWJhc2VkICsgMSwgcG9zKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgIHJlYmFzZWRJdGVtcy5wdXNoKG5ldyBJdGVtKG1hcCwgc3RlcCwgc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWJhc2VkSXRlbXMucHVzaChuZXcgSXRlbShtYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgc3RhcnQpO1xuICAgICAgICBsZXQgbmV3TWFwcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gcmViYXNlZENvdW50OyBpIDwgbmV3VW50aWw7IGkrKylcbiAgICAgICAgICAgIG5ld01hcHMucHVzaChuZXcgSXRlbShtYXBwaW5nLm1hcHNbaV0pKTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgwLCBzdGFydCkuYXBwZW5kKG5ld01hcHMpLmFwcGVuZChyZWJhc2VkSXRlbXMpO1xuICAgICAgICBsZXQgYnJhbmNoID0gbmV3IEJyYW5jaChpdGVtcywgZXZlbnRDb3VudCk7XG4gICAgICAgIGlmIChicmFuY2guZW1wdHlJdGVtQ291bnQoKSA+IG1heF9lbXB0eV9pdGVtcylcbiAgICAgICAgICAgIGJyYW5jaCA9IGJyYW5jaC5jb21wcmVzcyh0aGlzLml0ZW1zLmxlbmd0aCAtIHJlYmFzZWRJdGVtcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYnJhbmNoO1xuICAgIH1cbiAgICBlbXB0eUl0ZW1Db3VudCgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoIWl0ZW0uc3RlcClcbiAgICAgICAgICAgIGNvdW50Kys7IH0pO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuICAgIC8vIENvbXByZXNzaW5nIGEgYnJhbmNoIG1lYW5zIHJld3JpdGluZyBpdCB0byBwdXNoIHRoZSBhaXIgKG1hcC1vbmx5XG4gICAgLy8gaXRlbXMpIG91dC4gRHVyaW5nIGNvbGxhYm9yYXRpb24sIHRoZXNlIG5hdHVyYWxseSBhY2N1bXVsYXRlXG4gICAgLy8gYmVjYXVzZSBlYWNoIHJlbW90ZSBjaGFuZ2UgYWRkcyBvbmUuIFRoZSBgdXB0b2AgYXJndW1lbnQgaXMgdXNlZFxuICAgIC8vIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIGl0ZW1zIGJlbG93IGEgZ2l2ZW4gbGV2ZWwgYXJlIGNvbXByZXNzZWQsXG4gICAgLy8gYmVjYXVzZSBgcmViYXNlZGAgcmVsaWVzIG9uIGEgY2xlYW4sIHVudG91Y2hlZCBzZXQgb2YgaXRlbXMgaW5cbiAgICAvLyBvcmRlciB0byBhc3NvY2lhdGUgb2xkIGl0ZW1zIHdpdGggcmViYXNlZCBzdGVwcy5cbiAgICBjb21wcmVzcyh1cHRvID0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHJlbWFwID0gdGhpcy5yZW1hcHBpbmcoMCwgdXB0byksIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1zID0gW10sIGV2ZW50cyA9IDA7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPj0gdXB0bykge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBldmVudHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gaXRlbS5zdGVwLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSksIG1hcCA9IHN0ZXAgJiYgc3RlcC5nZXRNYXAoKTtcbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgaWYgKG1hcClcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAuYXBwZW5kTWFwKG1hcCwgbWFwRnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGl0ZW0uc2VsZWN0aW9uICYmIGl0ZW0uc2VsZWN0aW9uLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0l0ZW0gPSBuZXcgSXRlbShtYXAuaW52ZXJ0KCksIHN0ZXAsIHNlbGVjdGlvbiksIG1lcmdlZCwgbGFzdCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQgPSBpdGVtcy5sZW5ndGggJiYgaXRlbXNbbGFzdF0ubWVyZ2UobmV3SXRlbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tsYXN0XSA9IG1lcmdlZDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChuZXdJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtLm1hcCkge1xuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pdGVtcy5sZW5ndGgsIDApO1xuICAgICAgICByZXR1cm4gbmV3IEJyYW5jaChSb3BlU2VxdWVuY2UuZnJvbShpdGVtcy5yZXZlcnNlKCkpLCBldmVudHMpO1xuICAgIH1cbn1cbkJyYW5jaC5lbXB0eSA9IG5ldyBCcmFuY2goUm9wZVNlcXVlbmNlLmVtcHR5LCAwKTtcbmZ1bmN0aW9uIGN1dE9mZkV2ZW50cyhpdGVtcywgbikge1xuICAgIGxldCBjdXRQb2ludDtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnNlbGVjdGlvbiAmJiAobi0tID09IDApKSB7XG4gICAgICAgICAgICBjdXRQb2ludCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbXMuc2xpY2UoY3V0UG9pbnQpO1xufVxuY2xhc3MgSXRlbSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIChmb3J3YXJkKSBzdGVwIG1hcCBmb3IgdGhpcyBpdGVtLlxuICAgIG1hcCwgXG4gICAgLy8gVGhlIGludmVydGVkIHN0ZXBcbiAgICBzdGVwLCBcbiAgICAvLyBJZiB0aGlzIGlzIG5vbi1udWxsLCB0aGlzIGl0ZW0gaXMgdGhlIHN0YXJ0IG9mIGEgZ3JvdXAsIGFuZFxuICAgIC8vIHRoaXMgc2VsZWN0aW9uIGlzIHRoZSBzdGFydGluZyBzZWxlY3Rpb24gZm9yIHRoZSBncm91cCAodGhlIG9uZVxuICAgIC8vIHRoYXQgd2FzIGFjdGl2ZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgd2FzIGFwcGxpZWQpXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvLyBJZiB0aGlzIGl0ZW0gaXMgdGhlIGludmVyc2Ugb2YgYSBwcmV2aW91cyBtYXBwaW5nIG9uIHRoZSBzdGFjayxcbiAgICAvLyB0aGlzIHBvaW50cyBhdCB0aGUgaW52ZXJzZSdzIG9mZnNldFxuICAgIG1pcnJvck9mZnNldCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5zdGVwID0gc3RlcDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMubWlycm9yT2Zmc2V0ID0gbWlycm9yT2Zmc2V0O1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5zdGVwICYmIG90aGVyLnN0ZXAgJiYgIW90aGVyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IHN0ZXAgPSBvdGhlci5zdGVwLm1lcmdlKHRoaXMuc3RlcCk7XG4gICAgICAgICAgICBpZiAoc3RlcClcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZW0oc3RlcC5nZXRNYXAoKS5pbnZlcnQoKSwgc3RlcCwgdGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gVGhlIHZhbHVlIG9mIHRoZSBzdGF0ZSBmaWVsZCB0aGF0IHRyYWNrcyB1bmRvL3JlZG8gaGlzdG9yeSBmb3IgdGhhdFxuLy8gc3RhdGUuIFdpbGwgYmUgc3RvcmVkIGluIHRoZSBwbHVnaW4gc3RhdGUgd2hlbiB0aGUgaGlzdG9yeSBwbHVnaW5cbi8vIGlzIGFjdGl2ZS5cbmNsYXNzIEhpc3RvcnlTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoZG9uZSwgdW5kb25lLCBwcmV2UmFuZ2VzLCBwcmV2VGltZSwgcHJldkNvbXBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IGRvbmU7XG4gICAgICAgIHRoaXMudW5kb25lID0gdW5kb25lO1xuICAgICAgICB0aGlzLnByZXZSYW5nZXMgPSBwcmV2UmFuZ2VzO1xuICAgICAgICB0aGlzLnByZXZUaW1lID0gcHJldlRpbWU7XG4gICAgICAgIHRoaXMucHJldkNvbXBvc2l0aW9uID0gcHJldkNvbXBvc2l0aW9uO1xuICAgIH1cbn1cbmNvbnN0IERFUFRIX09WRVJGTE9XID0gMjA7XG4vLyBSZWNvcmQgYSB0cmFuc2Zvcm1hdGlvbiBpbiB1bmRvIGhpc3RvcnkuXG5mdW5jdGlvbiBhcHBseVRyYW5zYWN0aW9uKGhpc3RvcnksIHN0YXRlLCB0ciwgb3B0aW9ucykge1xuICAgIGxldCBoaXN0b3J5VHIgPSB0ci5nZXRNZXRhKGhpc3RvcnlLZXkpLCByZWJhc2VkO1xuICAgIGlmIChoaXN0b3J5VHIpXG4gICAgICAgIHJldHVybiBoaXN0b3J5VHIuaGlzdG9yeVN0YXRlO1xuICAgIGlmICh0ci5nZXRNZXRhKGNsb3NlSGlzdG9yeUtleSkpXG4gICAgICAgIGhpc3RvcnkgPSBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZSwgaGlzdG9yeS51bmRvbmUsIG51bGwsIDAsIC0xKTtcbiAgICBsZXQgYXBwZW5kZWQgPSB0ci5nZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiKTtcbiAgICBpZiAodHIuc3RlcHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuIGhpc3Rvcnk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFwcGVuZGVkICYmIGFwcGVuZGVkLmdldE1ldGEoaGlzdG9yeUtleSkpIHtcbiAgICAgICAgaWYgKGFwcGVuZGVkLmdldE1ldGEoaGlzdG9yeUtleSkucmVkbylcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgaGlzdG9yeS51bmRvbmUsIHJhbmdlc0Zvcih0ci5tYXBwaW5nLm1hcHMpLCBoaXN0b3J5LnByZXZUaW1lLCBoaXN0b3J5LnByZXZDb21wb3NpdGlvbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZSwgaGlzdG9yeS51bmRvbmUuYWRkVHJhbnNmb3JtKHRyLCB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIG51bGwsIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHIuZ2V0TWV0YShcImFkZFRvSGlzdG9yeVwiKSAhPT0gZmFsc2UgJiYgIShhcHBlbmRlZCAmJiBhcHBlbmRlZC5nZXRNZXRhKFwiYWRkVG9IaXN0b3J5XCIpID09PSBmYWxzZSkpIHtcbiAgICAgICAgLy8gR3JvdXAgdHJhbnNmb3JtcyB0aGF0IG9jY3VyIGluIHF1aWNrIHN1Y2Nlc3Npb24gaW50byBvbmUgZXZlbnQuXG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHRyLmdldE1ldGEoXCJjb21wb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0dyb3VwID0gaGlzdG9yeS5wcmV2VGltZSA9PSAwIHx8XG4gICAgICAgICAgICAoIWFwcGVuZGVkICYmIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uICE9IGNvbXBvc2l0aW9uICYmXG4gICAgICAgICAgICAgICAgKGhpc3RvcnkucHJldlRpbWUgPCAodHIudGltZSB8fCAwKSAtIG9wdGlvbnMubmV3R3JvdXBEZWxheSB8fCAhaXNBZGphY2VudFRvKHRyLCBoaXN0b3J5LnByZXZSYW5nZXMpKSk7XG4gICAgICAgIGxldCBwcmV2UmFuZ2VzID0gYXBwZW5kZWQgPyBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSA6IHJhbmdlc0Zvcih0ci5tYXBwaW5nLm1hcHMpO1xuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUuYWRkVHJhbnNmb3JtKHRyLCBuZXdHcm91cCA/IHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpIDogdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBCcmFuY2guZW1wdHksIHByZXZSYW5nZXMsIHRyLnRpbWUsIGNvbXBvc2l0aW9uID09IG51bGwgPyBoaXN0b3J5LnByZXZDb21wb3NpdGlvbiA6IGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmViYXNlZCA9IHRyLmdldE1ldGEoXCJyZWJhc2VkXCIpKSB7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIGNvbGxhYiBtb2R1bGUgdG8gdGVsbCB0aGUgaGlzdG9yeSB0aGF0IHNvbWUgb2YgaXRzXG4gICAgICAgIC8vIGNvbnRlbnQgaGFzIGJlZW4gcmViYXNlZC5cbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLnJlYmFzZWQodHIsIHJlYmFzZWQpLCBoaXN0b3J5LnVuZG9uZS5yZWJhc2VkKHRyLCByZWJhc2VkKSwgbWFwUmFuZ2VzKGhpc3RvcnkucHJldlJhbmdlcywgdHIubWFwcGluZyksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRNYXBzKHRyLm1hcHBpbmcubWFwcyksIGhpc3RvcnkudW5kb25lLmFkZE1hcHModHIubWFwcGluZy5tYXBzKSwgbWFwUmFuZ2VzKGhpc3RvcnkucHJldlJhbmdlcywgdHIubWFwcGluZyksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0FkamFjZW50VG8odHJhbnNmb3JtLCBwcmV2UmFuZ2VzKSB7XG4gICAgaWYgKCFwcmV2UmFuZ2VzKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0cmFuc2Zvcm0uZG9jQ2hhbmdlZClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGFkamFjZW50ID0gZmFsc2U7XG4gICAgdHJhbnNmb3JtLm1hcHBpbmcubWFwc1swXS5mb3JFYWNoKChzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlJhbmdlcy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwcmV2UmFuZ2VzW2kgKyAxXSAmJiBlbmQgPj0gcHJldlJhbmdlc1tpXSlcbiAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkamFjZW50O1xufVxuZnVuY3Rpb24gcmFuZ2VzRm9yKG1hcHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IG1hcHMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHJlc3VsdC5sZW5ndGggPT0gMDsgaS0tKVxuICAgICAgICBtYXBzW2ldLmZvckVhY2goKF9mcm9tLCBfdG8sIGZyb20sIHRvKSA9PiByZXN1bHQucHVzaChmcm9tLCB0bykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXBSYW5nZXMocmFuZ2VzLCBtYXBwaW5nKSB7XG4gICAgaWYgKCFyYW5nZXMpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHJhbmdlc1tpXSwgMSksIHRvID0gbWFwcGluZy5tYXAocmFuZ2VzW2kgKyAxXSwgLTEpO1xuICAgICAgICBpZiAoZnJvbSA8PSB0bylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEFwcGx5IHRoZSBsYXRlc3QgZXZlbnQgZnJvbSBvbmUgYnJhbmNoIHRvIHRoZSBkb2N1bWVudCBhbmQgc2hpZnQgdGhlIGV2ZW50XG4vLyBvbnRvIHRoZSBvdGhlciBicmFuY2guXG5mdW5jdGlvbiBoaXN0VHJhbnNhY3Rpb24oaGlzdG9yeSwgc3RhdGUsIHJlZG8pIHtcbiAgICBsZXQgcHJlc2VydmVJdGVtcyA9IG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKTtcbiAgICBsZXQgaGlzdE9wdGlvbnMgPSBoaXN0b3J5S2V5LmdldChzdGF0ZSkuc3BlYy5jb25maWc7XG4gICAgbGV0IHBvcCA9IChyZWRvID8gaGlzdG9yeS51bmRvbmUgOiBoaXN0b3J5LmRvbmUpLnBvcEV2ZW50KHN0YXRlLCBwcmVzZXJ2ZUl0ZW1zKTtcbiAgICBpZiAoIXBvcClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNlbGVjdGlvbiA9IHBvcC5zZWxlY3Rpb24ucmVzb2x2ZShwb3AudHJhbnNmb3JtLmRvYyk7XG4gICAgbGV0IGFkZGVkID0gKHJlZG8gPyBoaXN0b3J5LmRvbmUgOiBoaXN0b3J5LnVuZG9uZSkuYWRkVHJhbnNmb3JtKHBvcC50cmFuc2Zvcm0sIHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLCBoaXN0T3B0aW9ucywgcHJlc2VydmVJdGVtcyk7XG4gICAgbGV0IG5ld0hpc3QgPSBuZXcgSGlzdG9yeVN0YXRlKHJlZG8gPyBhZGRlZCA6IHBvcC5yZW1haW5pbmcsIHJlZG8gPyBwb3AucmVtYWluaW5nIDogYWRkZWQsIG51bGwsIDAsIC0xKTtcbiAgICByZXR1cm4gcG9wLnRyYW5zZm9ybS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKS5zZXRNZXRhKGhpc3RvcnlLZXksIHsgcmVkbywgaGlzdG9yeVN0YXRlOiBuZXdIaXN0IH0pO1xufVxubGV0IGNhY2hlZFByZXNlcnZlSXRlbXMgPSBmYWxzZSwgY2FjaGVkUHJlc2VydmVJdGVtc1BsdWdpbnMgPSBudWxsO1xuLy8gQ2hlY2sgd2hldGhlciBhbnkgcGx1Z2luIGluIHRoZSBnaXZlbiBzdGF0ZSBoYXMgYVxuLy8gYGhpc3RvcnlQcmVzZXJ2ZUl0ZW1zYCBwcm9wZXJ0eSBpbiBpdHMgc3BlYywgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0XG4vLyBwcmVzZXJ2ZSBzdGVwcyBleGFjdGx5IGFzIHRoZXkgY2FtZSBpbiwgc28gdGhhdCB0aGV5IGNhbiBiZVxuLy8gcmViYXNlZC5cbmZ1bmN0aW9uIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSB7XG4gICAgbGV0IHBsdWdpbnMgPSBzdGF0ZS5wbHVnaW5zO1xuICAgIGlmIChjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyAhPSBwbHVnaW5zKSB7XG4gICAgICAgIGNhY2hlZFByZXNlcnZlSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtc1BsdWdpbnMgPSBwbHVnaW5zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocGx1Z2luc1tpXS5zcGVjLmhpc3RvcnlQcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRQcmVzZXJ2ZUl0ZW1zO1xufVxuLyoqXG5TZXQgYSBmbGFnIG9uIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0aGF0IHdpbGwgcHJldmVudCBmdXJ0aGVyIHN0ZXBzXG5mcm9tIGJlaW5nIGFwcGVuZGVkIHRvIGFuIGV4aXN0aW5nIGhpc3RvcnkgZXZlbnQgKHNvIHRoYXQgdGhleVxucmVxdWlyZSBhIHNlcGFyYXRlIHVuZG8gY29tbWFuZCB0byB1bmRvKS5cbiovXG5mdW5jdGlvbiBjbG9zZUhpc3RvcnkodHIpIHtcbiAgICByZXR1cm4gdHIuc2V0TWV0YShjbG9zZUhpc3RvcnlLZXksIHRydWUpO1xufVxuY29uc3QgaGlzdG9yeUtleSA9IG5ldyBQbHVnaW5LZXkoXCJoaXN0b3J5XCIpO1xuY29uc3QgY2xvc2VIaXN0b3J5S2V5ID0gbmV3IFBsdWdpbktleShcImNsb3NlSGlzdG9yeVwiKTtcbi8qKlxuUmV0dXJucyBhIHBsdWdpbiB0aGF0IGVuYWJsZXMgdGhlIHVuZG8gaGlzdG9yeSBmb3IgYW4gZWRpdG9yLiBUaGVcbnBsdWdpbiB3aWxsIHRyYWNrIHVuZG8gYW5kIHJlZG8gc3RhY2tzLCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIHRoZVxuW2B1bmRvYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2hpc3RvcnkudW5kbykgYW5kIFtgcmVkb2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNoaXN0b3J5LnJlZG8pIGNvbW1hbmRzLlxuXG5Zb3UgY2FuIHNldCBhbiBgXCJhZGRUb0hpc3RvcnlcImAgW21ldGFkYXRhXG5wcm9wZXJ0eV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnNldE1ldGEpIG9mIGBmYWxzZWAgb24gYSB0cmFuc2FjdGlvblxudG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJvbGxlZCBiYWNrIGJ5IHVuZG8uXG4qL1xuZnVuY3Rpb24gaGlzdG9yeShjb25maWcgPSB7fSkge1xuICAgIGNvbmZpZyA9IHsgZGVwdGg6IGNvbmZpZy5kZXB0aCB8fCAxMDAsXG4gICAgICAgIG5ld0dyb3VwRGVsYXk6IGNvbmZpZy5uZXdHcm91cERlbGF5IHx8IDUwMCB9O1xuICAgIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBoaXN0b3J5S2V5LFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShCcmFuY2guZW1wdHksIEJyYW5jaC5lbXB0eSwgbnVsbCwgMCwgLTEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5KHRyLCBoaXN0LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseVRyYW5zYWN0aW9uKGhpc3QsIHN0YXRlLCB0ciwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlaW5wdXQodmlldywgZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRUeXBlID0gZS5pbnB1dFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21tYW5kID0gaW5wdXRUeXBlID09IFwiaGlzdG9yeVVuZG9cIiA/IHVuZG8gOiBpbnB1dFR5cGUgPT0gXCJoaXN0b3J5UmVkb1wiID8gcmVkbyA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tbWFuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZCh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChyZWRvLCBzY3JvbGwpIHtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoIWhpc3QgfHwgKHJlZG8gPyBoaXN0LnVuZG9uZSA6IGhpc3QuZG9uZSkuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCB0ciA9IGhpc3RUcmFuc2FjdGlvbihoaXN0LCBzdGF0ZSwgcmVkbyk7XG4gICAgICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goc2Nyb2xsID8gdHIuc2Nyb2xsSW50b1ZpZXcoKSA6IHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB1bmRvZXMgdGhlIGxhc3QgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgdW5kbyA9IGJ1aWxkQ29tbWFuZChmYWxzZSwgdHJ1ZSk7XG4vKipcbkEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHJlZG9lcyB0aGUgbGFzdCB1bmRvbmUgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgcmVkbyA9IGJ1aWxkQ29tbWFuZCh0cnVlLCB0cnVlKTtcbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgdW5kb2VzIHRoZSBsYXN0IGNoYW5nZS4gRG9uJ3Qgc2Nyb2xsIHRoZVxuc2VsZWN0aW9uIGludG8gdmlldy5cbiovXG5jb25zdCB1bmRvTm9TY3JvbGwgPSBidWlsZENvbW1hbmQoZmFsc2UsIGZhbHNlKTtcbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgcmVkb2VzIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuIERvbid0XG5zY3JvbGwgdGhlIHNlbGVjdGlvbiBpbnRvIHZpZXcuXG4qL1xuY29uc3QgcmVkb05vU2Nyb2xsID0gYnVpbGRDb21tYW5kKHRydWUsIGZhbHNlKTtcbi8qKlxuVGhlIGFtb3VudCBvZiB1bmRvYWJsZSBldmVudHMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gdW5kb0RlcHRoKHN0YXRlKSB7XG4gICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICByZXR1cm4gaGlzdCA/IGhpc3QuZG9uZS5ldmVudENvdW50IDogMDtcbn1cbi8qKlxuVGhlIGFtb3VudCBvZiByZWRvYWJsZSBldmVudHMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gZWRpdG9yIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIHJlZG9EZXB0aChzdGF0ZSkge1xuICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIGhpc3QgPyBoaXN0LnVuZG9uZS5ldmVudENvdW50IDogMDtcbn1cblxuZXhwb3J0IHsgY2xvc2VIaXN0b3J5LCBoaXN0b3J5LCByZWRvLCByZWRvRGVwdGgsIHJlZG9Ob1Njcm9sbCwgdW5kbywgdW5kb0RlcHRoLCB1bmRvTm9TY3JvbGwgfTtcbiIsImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IGZpbmRXcmFwcGluZywgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbi8qKlxuSW5wdXQgcnVsZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVzY3JpYmluZyBhIHBpZWNlIG9mIHRleHRcbnRoYXQsIHdoZW4gdHlwZWQsIGNhdXNlcyBzb21ldGhpbmcgdG8gaGFwcGVuLiBUaGlzIG1pZ2h0IGJlXG5jaGFuZ2luZyB0d28gZGFzaGVzIGludG8gYW4gZW1kYXNoLCB3cmFwcGluZyBhIHBhcmFncmFwaCBzdGFydGluZ1xud2l0aCBgXCI+IFwiYCBpbnRvIGEgYmxvY2txdW90ZSwgb3Igc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudC5cbiovXG5jbGFzcyBJbnB1dFJ1bGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnB1dCBydWxlLiBUaGUgcnVsZSBhcHBsaWVzIHdoZW4gdGhlIHVzZXIgdHlwZWRcbiAgICBzb21ldGhpbmcgYW5kIHRoZSB0ZXh0IGRpcmVjdGx5IGluIGZyb250IG9mIHRoZSBjdXJzb3IgbWF0Y2hlc1xuICAgIGBtYXRjaGAsIHdoaWNoIHNob3VsZCBlbmQgd2l0aCBgJGAuXG4gICAgXG4gICAgVGhlIGBoYW5kbGVyYCBjYW4gYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoZWQgdGV4dCwgb3JcbiAgICB0aGUgZmlyc3QgbWF0Y2hlZCBncm91cCBpbiB0aGUgcmVnZXhwLCBpcyByZXBsYWNlZCBieSB0aGF0XG4gICAgc3RyaW5nLlxuICAgIFxuICAgIE9yIGEgaXQgY2FuIGJlIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG1hdGNoXG4gICAgYXJyYXkgcHJvZHVjZWQgYnlcbiAgICBbYFJlZ0V4cC5leGVjYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwL2V4ZWMpLFxuICAgIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG1hdGNoZWQgcmFuZ2UsIGFuZCB3aGljaCBjYW5cbiAgICByZXR1cm4gYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgdGhhdCBkZXNjcmliZXMgdGhlXG4gICAgcnVsZSdzIGVmZmVjdCwgb3IgbnVsbCB0byBpbmRpY2F0ZSB0aGUgaW5wdXQgd2FzIG5vdCBoYW5kbGVkLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaCwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSB0eXBlb2YgaGFuZGxlciA9PSBcInN0cmluZ1wiID8gc3RyaW5nSGFuZGxlcihoYW5kbGVyKSA6IGhhbmRsZXI7XG4gICAgICAgIHRoaXMudW5kb2FibGUgPSBvcHRpb25zLnVuZG9hYmxlICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbkNvZGUgPSBvcHRpb25zLmluQ29kZSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5pbkNvZGVNYXJrID0gb3B0aW9ucy5pbkNvZGVNYXJrICE9PSBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdIYW5kbGVyKHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGxldCBpbnNlcnQgPSBzdHJpbmc7XG4gICAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IG1hdGNoWzBdLmxhc3RJbmRleE9mKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIGluc2VydCArPSBtYXRjaFswXS5zbGljZShvZmZzZXQgKyBtYXRjaFsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgc3RhcnQgKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGN1dE9mZiA9IHN0YXJ0IC0gZW5kO1xuICAgICAgICAgICAgaWYgKGN1dE9mZiA+IDApIHtcbiAgICAgICAgICAgICAgICBpbnNlcnQgPSBtYXRjaFswXS5zbGljZShvZmZzZXQgLSBjdXRPZmYsIG9mZnNldCkgKyBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLnRyLmluc2VydFRleHQoaW5zZXJ0LCBzdGFydCwgZW5kKTtcbiAgICB9O1xufVxuY29uc3QgTUFYX01BVENIID0gNTAwO1xuLyoqXG5DcmVhdGUgYW4gaW5wdXQgcnVsZXMgcGx1Z2luLiBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgY2F1c2UgdGV4dFxuaW5wdXQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZSdzXG5hY3Rpb24uXG4qL1xuZnVuY3Rpb24gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pIHtcbiAgICBsZXQgcGx1Z2luID0gbmV3IFBsdWdpbih7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBpbml0KCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHRyLmdldE1ldGEodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHIuc2VsZWN0aW9uU2V0IHx8IHRyLmRvY0NoYW5nZWQgPyBudWxsIDogcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRJbnB1dCh2aWV3LCBmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydW4odmlldywgZnJvbSwgdG8sIHRleHQsIHJ1bGVzLCBwbHVnaW4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiAodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuKHZpZXcsICRjdXJzb3IucG9zLCAkY3Vyc29yLnBvcywgXCJcIiwgcnVsZXMsIHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNJbnB1dFJ1bGVzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHBsdWdpbjtcbn1cbmZ1bmN0aW9uIHJ1bih2aWV3LCBmcm9tLCB0bywgdGV4dCwgcnVsZXMsIHBsdWdpbikge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzdGF0ZSA9IHZpZXcuc3RhdGUsICRmcm9tID0gc3RhdGUuZG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHRleHRCZWZvcmUgPSAkZnJvbS5wYXJlbnQudGV4dEJldHdlZW4oTWF0aC5tYXgoMCwgJGZyb20ucGFyZW50T2Zmc2V0IC0gTUFYX01BVENIKSwgJGZyb20ucGFyZW50T2Zmc2V0LCBudWxsLCBcIlxcdWZmZmNcIikgKyB0ZXh0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJ1bGUgPSBydWxlc1tpXTtcbiAgICAgICAgaWYgKCFydWxlLmluQ29kZU1hcmsgJiYgJGZyb20ubWFya3MoKS5zb21lKG0gPT4gbS50eXBlLnNwZWMuY29kZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudC50eXBlLnNwZWMuY29kZSkge1xuICAgICAgICAgICAgaWYgKCFydWxlLmluQ29kZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlLmluQ29kZSA9PT0gXCJvbmx5XCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaCA9IHJ1bGUubWF0Y2guZXhlYyh0ZXh0QmVmb3JlKTtcbiAgICAgICAgbGV0IHRyID0gbWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID49IHRleHQubGVuZ3RoICYmXG4gICAgICAgICAgICBydWxlLmhhbmRsZXIoc3RhdGUsIG1hdGNoLCBmcm9tIC0gKG1hdGNoWzBdLmxlbmd0aCAtIHRleHQubGVuZ3RoKSwgdG8pO1xuICAgICAgICBpZiAoIXRyKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChydWxlLnVuZG9hYmxlKVxuICAgICAgICAgICAgdHIuc2V0TWV0YShwbHVnaW4sIHsgdHJhbnNmb3JtOiB0ciwgZnJvbSwgdG8sIHRleHQgfSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG5UaGlzIGlzIGEgY29tbWFuZCB0aGF0IHdpbGwgdW5kbyBhbiBpbnB1dCBydWxlLCBpZiBhcHBseWluZyBzdWNoIGFcbnJ1bGUgd2FzIHRoZSBsYXN0IHRoaW5nIHRoYXQgdGhlIHVzZXIgZGlkLlxuKi9cbmNvbnN0IHVuZG9JbnB1dFJ1bGUgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHBsdWdpbnMgPSBzdGF0ZS5wbHVnaW5zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcGx1Z2luID0gcGx1Z2luc1tpXSwgdW5kb2FibGU7XG4gICAgICAgIGlmIChwbHVnaW4uc3BlYy5pc0lucHV0UnVsZXMgJiYgKHVuZG9hYmxlID0gcGx1Z2luLmdldFN0YXRlKHN0YXRlKSkpIHtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLCB0b1VuZG8gPSB1bmRvYWJsZS50cmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHRvVW5kby5zdGVwcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSlcbiAgICAgICAgICAgICAgICAgICAgdHIuc3RlcCh0b1VuZG8uc3RlcHNbal0uaW52ZXJ0KHRvVW5kby5kb2NzW2pdKSk7XG4gICAgICAgICAgICAgICAgaWYgKHVuZG9hYmxlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtzID0gdHIuZG9jLnJlc29sdmUodW5kb2FibGUuZnJvbSkubWFya3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdHIucmVwbGFjZVdpdGgodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8sIHN0YXRlLnNjaGVtYS50ZXh0KHVuZG9hYmxlLnRleHQsIG1hcmtzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ci5kZWxldGUodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbkNvbnZlcnRzIGRvdWJsZSBkYXNoZXMgdG8gYW4gZW1kYXNoLlxuKi9cbmNvbnN0IGVtRGFzaCA9IG5ldyBJbnB1dFJ1bGUoLy0tJC8sIFwi4oCUXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbkNvbnZlcnRzIHRocmVlIGRvdHMgdG8gYW4gZWxsaXBzaXMgY2hhcmFjdGVyLlxuKi9cbmNvbnN0IGVsbGlwc2lzID0gbmV3IElucHV0UnVsZSgvXFwuXFwuXFwuJC8sIFwi4oCmXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIG9wZW5pbmcgZG91YmxlIHF1b3Rlcy5cbiovXG5jb25zdCBvcGVuRG91YmxlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC8oPzpefFtcXHNcXHtcXFtcXChcXDwnXCJcXHUyMDE4XFx1MjAxQ10pKFwiKSQvLCBcIuKAnFwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG7igJxTbWFydOKAnSBjbG9zaW5nIGRvdWJsZSBxdW90ZXMuXG4qL1xuY29uc3QgY2xvc2VEb3VibGVRdW90ZSA9IG5ldyBJbnB1dFJ1bGUoL1wiJC8sIFwi4oCdXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIG9wZW5pbmcgc2luZ2xlIHF1b3Rlcy5cbiovXG5jb25zdCBvcGVuU2luZ2xlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC8oPzpefFtcXHNcXHtcXFtcXChcXDwnXCJcXHUyMDE4XFx1MjAxQ10pKCcpJC8sIFwi4oCYXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy5cbiovXG5jb25zdCBjbG9zZVNpbmdsZVF1b3RlID0gbmV3IElucHV0UnVsZSgvJyQvLCBcIuKAmVwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG5TbWFydC1xdW90ZSByZWxhdGVkIGlucHV0IHJ1bGVzLlxuKi9cbmNvbnN0IHNtYXJ0UXVvdGVzID0gW29wZW5Eb3VibGVRdW90ZSwgY2xvc2VEb3VibGVRdW90ZSwgb3BlblNpbmdsZVF1b3RlLCBjbG9zZVNpbmdsZVF1b3RlXTtcblxuLyoqXG5CdWlsZCBhbiBpbnB1dCBydWxlIGZvciBhdXRvbWF0aWNhbGx5IHdyYXBwaW5nIGEgdGV4dGJsb2NrIHdoZW4gYVxuZ2l2ZW4gc3RyaW5nIGlzIHR5cGVkLiBUaGUgYHJlZ2V4cGAgYXJndW1lbnQgaXNcbmRpcmVjdGx5IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgSW5wdXRSdWxlYCBjb25zdHJ1Y3Rvci4gWW91J2xsXG5wcm9iYWJseSB3YW50IHRoZSByZWdleHAgdG8gc3RhcnQgd2l0aCBgXmAsIHNvIHRoYXQgdGhlIHBhdHRlcm4gY2FuXG5vbmx5IG9jY3VyIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jay5cblxuYG5vZGVUeXBlYCBpcyB0aGUgdHlwZSBvZiBub2RlIHRvIHdyYXAgaW4uIElmIGl0IG5lZWRzIGF0dHJpYnV0ZXMsXG55b3UgY2FuIGVpdGhlciBwYXNzIHRoZW0gZGlyZWN0bHksIG9yIHBhc3MgYSBmdW5jdGlvbiB0aGF0IHdpbGxcbmNvbXB1dGUgdGhlbSBmcm9tIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2guXG5cbkJ5IGRlZmF1bHQsIGlmIHRoZXJlJ3MgYSBub2RlIHdpdGggdGhlIHNhbWUgdHlwZSBhYm92ZSB0aGUgbmV3bHlcbndyYXBwZWQgbm9kZSwgdGhlIHJ1bGUgd2lsbCB0cnkgdG8gW2pvaW5dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uVHJhbnNmb3JtLmpvaW4pIHRob3NlXG50d28gbm9kZXMuIFlvdSBjYW4gcGFzcyBhIGpvaW4gcHJlZGljYXRlLCB3aGljaCB0YWtlcyBhIHJlZ3VsYXJcbmV4cHJlc3Npb24gbWF0Y2ggYW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgd3JhcHBlZCBub2RlLCBhbmQgY2FuXG5yZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgYSBqb2luIHNob3VsZCBoYXBwZW4uXG4qL1xuZnVuY3Rpb24gd3JhcHBpbmdJbnB1dFJ1bGUocmVnZXhwLCBub2RlVHlwZSwgZ2V0QXR0cnMgPSBudWxsLCBqb2luUHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUocmVnZXhwLCAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGxldCBhdHRycyA9IGdldEF0dHJzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBnZXRBdHRycyhtYXRjaCkgOiBnZXRBdHRycztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuZGVsZXRlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUoc3RhcnQpLCByYW5nZSA9ICRzdGFydC5ibG9ja1JhbmdlKCksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyLndyYXAocmFuZ2UsIHdyYXBwaW5nKTtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRyLmRvYy5yZXNvbHZlKHN0YXJ0IC0gMSkubm9kZUJlZm9yZTtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUudHlwZSA9PSBub2RlVHlwZSAmJiBjYW5Kb2luKHRyLmRvYywgc3RhcnQgLSAxKSAmJlxuICAgICAgICAgICAgKCFqb2luUHJlZGljYXRlIHx8IGpvaW5QcmVkaWNhdGUobWF0Y2gsIGJlZm9yZSkpKVxuICAgICAgICAgICAgdHIuam9pbihzdGFydCAtIDEpO1xuICAgICAgICByZXR1cm4gdHI7XG4gICAgfSk7XG59XG4vKipcbkJ1aWxkIGFuIGlucHV0IHJ1bGUgdGhhdCBjaGFuZ2VzIHRoZSB0eXBlIG9mIGEgdGV4dGJsb2NrIHdoZW4gdGhlXG5tYXRjaGVkIHRleHQgaXMgdHlwZWQgaW50byBpdC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byBzdGFydCB5b3VyXG5yZWdleHAgd2l0aCBgXmAgdG8gdGhhdCBpdCBpcyBvbmx5IG1hdGNoZWQgYXQgdGhlIHN0YXJ0IG9mIGFcbnRleHRibG9jay4gVGhlIG9wdGlvbmFsIGBnZXRBdHRyc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGVcbnRoZSBuZXcgbm9kZSdzIGF0dHJpYnV0ZXMsIGFuZCB3b3JrcyB0aGUgc2FtZSBhcyBpbiB0aGVcbmB3cmFwcGluZ0lucHV0UnVsZWAgZnVuY3Rpb24uXG4qL1xuZnVuY3Rpb24gdGV4dGJsb2NrVHlwZUlucHV0UnVsZShyZWdleHAsIG5vZGVUeXBlLCBnZXRBdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IElucHV0UnVsZShyZWdleHAsIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgbGV0ICRzdGFydCA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0KTtcbiAgICAgICAgbGV0IGF0dHJzID0gZ2V0QXR0cnMgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGdldEF0dHJzKG1hdGNoKSA6IGdldEF0dHJzO1xuICAgICAgICBpZiAoISRzdGFydC5ub2RlKC0xKS5jYW5SZXBsYWNlV2l0aCgkc3RhcnQuaW5kZXgoLTEpLCAkc3RhcnQuaW5kZXhBZnRlcigtMSksIG5vZGVUeXBlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gc3RhdGUudHJcbiAgICAgICAgICAgIC5kZWxldGUoc3RhcnQsIGVuZClcbiAgICAgICAgICAgIC5zZXRCbG9ja1R5cGUoc3RhcnQsIHN0YXJ0LCBub2RlVHlwZSwgYXR0cnMpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBJbnB1dFJ1bGUsIGNsb3NlRG91YmxlUXVvdGUsIGNsb3NlU2luZ2xlUXVvdGUsIGVsbGlwc2lzLCBlbURhc2gsIGlucHV0UnVsZXMsIG9wZW5Eb3VibGVRdW90ZSwgb3BlblNpbmdsZVF1b3RlLCBzbWFydFF1b3RlcywgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSwgdW5kb0lucHV0UnVsZSwgd3JhcHBpbmdJbnB1dFJ1bGUgfTtcbiIsImltcG9ydCB7IGZpbmRXcmFwcGluZywgUmVwbGFjZUFyb3VuZFN0ZXAsIGNhblNwbGl0LCBsaWZ0VGFyZ2V0LCBjYW5Kb2luIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IE5vZGVSYW5nZSwgRnJhZ21lbnQsIFNsaWNlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG5jb25zdCBvbERPTSA9IFtcIm9sXCIsIDBdLCB1bERPTSA9IFtcInVsXCIsIDBdLCBsaURPTSA9IFtcImxpXCIsIDBdO1xuLyoqXG5BbiBvcmRlcmVkIGxpc3QgW25vZGUgc3BlY10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjKS4gSGFzIGEgc2luZ2xlXG5hdHRyaWJ1dGUsIGBvcmRlcmAsIHdoaWNoIGRldGVybWluZXMgdGhlIG51bWJlciBhdCB3aGljaCB0aGUgbGlzdFxuc3RhcnRzIGNvdW50aW5nLCBhbmQgZGVmYXVsdHMgdG8gMS4gUmVwcmVzZW50ZWQgYXMgYW4gYDxvbD5gXG5lbGVtZW50LlxuKi9cbmNvbnN0IG9yZGVyZWRMaXN0ID0ge1xuICAgIGF0dHJzOiB7IG9yZGVyOiB7IGRlZmF1bHQ6IDEsIHZhbGlkYXRlOiBcIm51bWJlclwiIH0gfSxcbiAgICBwYXJzZURPTTogW3sgdGFnOiBcIm9sXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IG9yZGVyOiBkb20uaGFzQXR0cmlidXRlKFwic3RhcnRcIikgPyArZG9tLmdldEF0dHJpYnV0ZShcInN0YXJ0XCIpIDogMSB9O1xuICAgICAgICAgICAgfSB9XSxcbiAgICB0b0RPTShub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmF0dHJzLm9yZGVyID09IDEgPyBvbERPTSA6IFtcIm9sXCIsIHsgc3RhcnQ6IG5vZGUuYXR0cnMub3JkZXIgfSwgMF07XG4gICAgfVxufTtcbi8qKlxuQSBidWxsZXQgbGlzdCBub2RlIHNwZWMsIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDx1bD5gLlxuKi9cbmNvbnN0IGJ1bGxldExpc3QgPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJ1bFwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gdWxET007IH1cbn07XG4vKipcbkEgbGlzdCBpdGVtIChgPGxpPmApIHNwZWMuXG4qL1xuY29uc3QgbGlzdEl0ZW0gPSB7XG4gICAgcGFyc2VET006IFt7IHRhZzogXCJsaVwiIH1dLFxuICAgIHRvRE9NKCkgeyByZXR1cm4gbGlET007IH0sXG4gICAgZGVmaW5pbmc6IHRydWVcbn07XG5mdW5jdGlvbiBhZGQob2JqLCBwcm9wcykge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcylcbiAgICAgICAgY29weVtwcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuLyoqXG5Db252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgYWRkaW5nIGxpc3QtcmVsYXRlZCBub2RlIHR5cGVzIHRvIGEgbWFwXG5zcGVjaWZ5aW5nIHRoZSBub2RlcyBmb3IgYSBzY2hlbWEuIEFkZHNcbltgb3JkZXJlZExpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3Qub3JkZXJlZExpc3QpIGFzIGBcIm9yZGVyZWRfbGlzdFwiYCxcbltgYnVsbGV0TGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5idWxsZXRMaXN0KSBhcyBgXCJidWxsZXRfbGlzdFwiYCwgYW5kXG5bYGxpc3RJdGVtYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0Lmxpc3RJdGVtKSBhcyBgXCJsaXN0X2l0ZW1cImAuXG5cbmBpdGVtQ29udGVudGAgZGV0ZXJtaW5lcyB0aGUgY29udGVudCBleHByZXNzaW9uIGZvciB0aGUgbGlzdCBpdGVtcy5cbklmIHlvdSB3YW50IHRoZSBjb21tYW5kcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlIHRvIGFwcGx5IHRvIHlvdXJcbmxpc3Qgc3RydWN0dXJlLCBpdCBzaG91bGQgaGF2ZSBhIHNoYXBlIGxpa2UgYFwicGFyYWdyYXBoIGJsb2NrKlwiYCBvclxuYFwicGFyYWdyYXBoIChvcmRlcmVkX2xpc3QgfCBidWxsZXRfbGlzdCkqXCJgLiBgbGlzdEdyb3VwYCBjYW4gYmVcbmdpdmVuIHRvIGFzc2lnbiBhIGdyb3VwIG5hbWUgdG8gdGhlIGxpc3Qgbm9kZSB0eXBlcywgZm9yIGV4YW1wbGVcbmBcImJsb2NrXCJgLlxuKi9cbmZ1bmN0aW9uIGFkZExpc3ROb2Rlcyhub2RlcywgaXRlbUNvbnRlbnQsIGxpc3RHcm91cCkge1xuICAgIHJldHVybiBub2Rlcy5hcHBlbmQoe1xuICAgICAgICBvcmRlcmVkX2xpc3Q6IGFkZChvcmRlcmVkTGlzdCwgeyBjb250ZW50OiBcImxpc3RfaXRlbStcIiwgZ3JvdXA6IGxpc3RHcm91cCB9KSxcbiAgICAgICAgYnVsbGV0X2xpc3Q6IGFkZChidWxsZXRMaXN0LCB7IGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLCBncm91cDogbGlzdEdyb3VwIH0pLFxuICAgICAgICBsaXN0X2l0ZW06IGFkZChsaXN0SXRlbSwgeyBjb250ZW50OiBpdGVtQ29udGVudCB9KVxuICAgIH0pO1xufVxuLyoqXG5SZXR1cm5zIGEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBzZWxlY3Rpb24gaW4gYSBsaXN0IHdpdGhcbnRoZSBnaXZlbiB0eXBlIGFuIGF0dHJpYnV0ZXMuIElmIGBkaXNwYXRjaGAgaXMgbnVsbCwgb25seSByZXR1cm4gYVxudmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIHBvc3NpYmxlLCBidXQgZG9uJ3QgYWN0dWFsbHlcbnBlcmZvcm0gdGhlIGNoYW5nZS5cbiovXG5mdW5jdGlvbiB3cmFwSW5MaXN0KGxpc3RUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcbiAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHRyID0gZGlzcGF0Y2ggPyBzdGF0ZS50ciA6IG51bGw7XG4gICAgICAgIGlmICghd3JhcFJhbmdlSW5MaXN0KHRyLCByYW5nZSwgbGlzdFR5cGUsIGF0dHJzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblRyeSB0byB3cmFwIHRoZSBnaXZlbiBub2RlIHJhbmdlIGluIGEgbGlzdCBvZiB0aGUgZ2l2ZW4gdHlwZS5cblJldHVybiBgdHJ1ZWAgd2hlbiB0aGlzIGlzIHBvc3NpYmxlLCBgZmFsc2VgIG90aGVyd2lzZS4gV2hlbiBgdHJgXG5pcyBub24tbnVsbCwgdGhlIHdyYXBwaW5nIGlzIGFkZGVkIHRvIHRoYXQgdHJhbnNhY3Rpb24uIFdoZW4gaXQgaXNcbmBudWxsYCwgdGhlIGZ1bmN0aW9uIG9ubHkgcXVlcmllcyB3aGV0aGVyIHRoZSB3cmFwcGluZyBpc1xucG9zc2libGUuXG4qL1xuZnVuY3Rpb24gd3JhcFJhbmdlSW5MaXN0KHRyLCByYW5nZSwgbGlzdFR5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIGxldCBkb0pvaW4gPSBmYWxzZSwgb3V0ZXJSYW5nZSA9IHJhbmdlLCBkb2MgPSByYW5nZS4kZnJvbS5kb2M7XG4gICAgLy8gVGhpcyBpcyBhdCB0aGUgdG9wIG9mIGFuIGV4aXN0aW5nIGxpc3QgaXRlbVxuICAgIGlmIChyYW5nZS5kZXB0aCA+PSAyICYmIHJhbmdlLiRmcm9tLm5vZGUocmFuZ2UuZGVwdGggLSAxKS50eXBlLmNvbXBhdGlibGVDb250ZW50KGxpc3RUeXBlKSAmJiByYW5nZS5zdGFydEluZGV4ID09IDApIHtcbiAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBpcyB0aGUgdG9wIG9mIHRoZSBsaXN0XG4gICAgICAgIGlmIChyYW5nZS4kZnJvbS5pbmRleChyYW5nZS5kZXB0aCAtIDEpID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCAkaW5zZXJ0ID0gZG9jLnJlc29sdmUocmFuZ2Uuc3RhcnQgLSAyKTtcbiAgICAgICAgb3V0ZXJSYW5nZSA9IG5ldyBOb2RlUmFuZ2UoJGluc2VydCwgJGluc2VydCwgcmFuZ2UuZGVwdGgpO1xuICAgICAgICBpZiAocmFuZ2UuZW5kSW5kZXggPCByYW5nZS5wYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJhbmdlID0gbmV3IE5vZGVSYW5nZShyYW5nZS4kZnJvbSwgZG9jLnJlc29sdmUocmFuZ2UuJHRvLmVuZChyYW5nZS5kZXB0aCkpLCByYW5nZS5kZXB0aCk7XG4gICAgICAgIGRvSm9pbiA9IHRydWU7XG4gICAgfVxuICAgIGxldCB3cmFwID0gZmluZFdyYXBwaW5nKG91dGVyUmFuZ2UsIGxpc3RUeXBlLCBhdHRycywgcmFuZ2UpO1xuICAgIGlmICghd3JhcClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0cilcbiAgICAgICAgZG9XcmFwSW5MaXN0KHRyLCByYW5nZSwgd3JhcCwgZG9Kb2luLCBsaXN0VHlwZSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkb1dyYXBJbkxpc3QodHIsIHJhbmdlLCB3cmFwcGVycywgam9pbkJlZm9yZSwgbGlzdFR5cGUpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20od3JhcHBlcnNbaV0udHlwZS5jcmVhdGUod3JhcHBlcnNbaV0uYXR0cnMsIGNvbnRlbnQpKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChyYW5nZS5zdGFydCAtIChqb2luQmVmb3JlID8gMiA6IDApLCByYW5nZS5lbmQsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG4gICAgbGV0IGZvdW5kID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXBwZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAod3JhcHBlcnNbaV0udHlwZSA9PSBsaXN0VHlwZSlcbiAgICAgICAgICAgIGZvdW5kID0gaSArIDE7XG4gICAgbGV0IHNwbGl0RGVwdGggPSB3cmFwcGVycy5sZW5ndGggLSBmb3VuZDtcbiAgICBsZXQgc3BsaXRQb3MgPSByYW5nZS5zdGFydCArIHdyYXBwZXJzLmxlbmd0aCAtIChqb2luQmVmb3JlID8gMiA6IDApLCBwYXJlbnQgPSByYW5nZS5wYXJlbnQ7XG4gICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0SW5kZXgsIGUgPSByYW5nZS5lbmRJbmRleCwgZmlyc3QgPSB0cnVlOyBpIDwgZTsgaSsrLCBmaXJzdCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghZmlyc3QgJiYgY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgc3BsaXREZXB0aCkpIHtcbiAgICAgICAgICAgIHRyLnNwbGl0KHNwbGl0UG9zLCBzcGxpdERlcHRoKTtcbiAgICAgICAgICAgIHNwbGl0UG9zICs9IDIgKiBzcGxpdERlcHRoO1xuICAgICAgICB9XG4gICAgICAgIHNwbGl0UG9zICs9IHBhcmVudC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuLyoqXG5CdWlsZCBhIGNvbW1hbmQgdGhhdCBzcGxpdHMgYSBub24tZW1wdHkgdGV4dGJsb2NrIGF0IHRoZSB0b3AgbGV2ZWxcbm9mIGEgbGlzdCBpdGVtIGJ5IGFsc28gc3BsaXR0aW5nIHRoYXQgbGlzdCBpdGVtLlxuKi9cbmZ1bmN0aW9uIHNwbGl0TGlzdEl0ZW0oaXRlbVR5cGUsIGl0ZW1BdHRycykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8sIG5vZGUgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChub2RlICYmIG5vZGUuaXNCbG9jaykgfHwgJGZyb20uZGVwdGggPCAyIHx8ICEkZnJvbS5zYW1lUGFyZW50KCR0bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBncmFuZFBhcmVudCA9ICRmcm9tLm5vZGUoLTEpO1xuICAgICAgICBpZiAoZ3JhbmRQYXJlbnQudHlwZSAhPSBpdGVtVHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudC5jb250ZW50LnNpemUgPT0gMCAmJiAkZnJvbS5ub2RlKC0xKS5jaGlsZENvdW50ID09ICRmcm9tLmluZGV4QWZ0ZXIoLTEpKSB7XG4gICAgICAgICAgICAvLyBJbiBhbiBlbXB0eSBibG9jay4gSWYgdGhpcyBpcyBhIG5lc3RlZCBsaXN0LCB0aGUgd3JhcHBpbmdcbiAgICAgICAgICAgIC8vIGxpc3QgaXRlbSBzaG91bGQgYmUgc3BsaXQuIE90aGVyd2lzZSwgYmFpbCBvdXQgYW5kIGxldCBuZXh0XG4gICAgICAgICAgICAvLyBjb21tYW5kIGhhbmRsZSBsaWZ0aW5nLlxuICAgICAgICAgICAgaWYgKCRmcm9tLmRlcHRoID09IDMgfHwgJGZyb20ubm9kZSgtMykudHlwZSAhPSBpdGVtVHlwZSB8fFxuICAgICAgICAgICAgICAgICRmcm9tLmluZGV4KC0yKSAhPSAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50IC0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEJlZm9yZSA9ICRmcm9tLmluZGV4KC0xKSA/IDEgOiAkZnJvbS5pbmRleCgtMikgPyAyIDogMztcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGZyYWdtZW50IGNvbnRhaW5pbmcgZW1wdHkgdmVyc2lvbnMgb2YgdGhlIHN0cnVjdHVyZVxuICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG91dGVyIGxpc3QgaXRlbSB0byB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCAtIGRlcHRoQmVmb3JlOyBkID49ICRmcm9tLmRlcHRoIC0gMzsgZC0tKVxuICAgICAgICAgICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aEFmdGVyID0gJGZyb20uaW5kZXhBZnRlcigtMSkgPCAkZnJvbS5ub2RlKC0yKS5jaGlsZENvdW50ID8gMVxuICAgICAgICAgICAgICAgICAgICA6ICRmcm9tLmluZGV4QWZ0ZXIoLTIpIDwgJGZyb20ubm9kZSgtMykuY2hpbGRDb3VudCA/IDIgOiAzO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBhIHNlY29uZCBsaXN0IGl0ZW0gd2l0aCBhbiBlbXB0eSBkZWZhdWx0IHN0YXJ0IG5vZGVcbiAgICAgICAgICAgICAgICB3cmFwID0gd3JhcC5hcHBlbmQoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGVBbmRGaWxsKCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5iZWZvcmUoJGZyb20uZGVwdGggLSAoZGVwdGhCZWZvcmUgLSAxKSk7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIucmVwbGFjZShzdGFydCwgJGZyb20uYWZ0ZXIoLWRlcHRoQWZ0ZXIpLCBuZXcgU2xpY2Uod3JhcCwgNCAtIGRlcHRoQmVmb3JlLCAwKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IC0xO1xuICAgICAgICAgICAgICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oc3RhcnQsIHRyLmRvYy5jb250ZW50LnNpemUsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiBub2RlLmNvbnRlbnQuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShzZWwpKSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFR5cGUgPSAkdG8ucG9zID09ICRmcm9tLmVuZCgpID8gZ3JhbmRQYXJlbnQuY29udGVudE1hdGNoQXQoMCkuZGVmYXVsdFR5cGUgOiBudWxsO1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5kZWxldGUoJGZyb20ucG9zLCAkdG8ucG9zKTtcbiAgICAgICAgbGV0IHR5cGVzID0gbmV4dFR5cGUgPyBbaXRlbUF0dHJzID8geyB0eXBlOiBpdGVtVHlwZSwgYXR0cnM6IGl0ZW1BdHRycyB9IDogbnVsbCwgeyB0eXBlOiBuZXh0VHlwZSB9XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjYW5TcGxpdCh0ci5kb2MsICRmcm9tLnBvcywgMiwgdHlwZXMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zcGxpdCgkZnJvbS5wb3MsIDIsIHR5cGVzKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuQWN0cyBsaWtlIFtgc3BsaXRMaXN0SXRlbWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5zcGxpdExpc3RJdGVtKSwgYnV0XG53aXRob3V0IHJlc2V0dGluZyB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcyBhdCB0aGUgY3Vyc29yLlxuKi9cbmZ1bmN0aW9uIHNwbGl0TGlzdEl0ZW1LZWVwTWFya3MoaXRlbVR5cGUsIGl0ZW1BdHRycykge1xuICAgIGxldCBzcGxpdCA9IHNwbGl0TGlzdEl0ZW0oaXRlbVR5cGUsIGl0ZW1BdHRycyk7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgcmV0dXJuIHNwbGl0KHN0YXRlLCBkaXNwYXRjaCAmJiAodHIgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3MgfHwgKHN0YXRlLnNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKTtcbiAgICAgICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgIH0pKTtcbiAgICB9O1xufVxuLyoqXG5DcmVhdGUgYSBjb21tYW5kIHRvIGxpZnQgdGhlIGxpc3QgaXRlbSBhcm91bmQgdGhlIHNlbGVjdGlvbiB1cCBpbnRvXG5hIHdyYXBwaW5nIGxpc3QuXG4qL1xuZnVuY3Rpb24gbGlmdExpc3RJdGVtKGl0ZW1UeXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0bywgbm9kZSA9PiBub2RlLmNoaWxkQ291bnQgPiAwICYmIG5vZGUuZmlyc3RDaGlsZC50eXBlID09IGl0ZW1UeXBlKTtcbiAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFkaXNwYXRjaClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoJGZyb20ubm9kZShyYW5nZS5kZXB0aCAtIDEpLnR5cGUgPT0gaXRlbVR5cGUpIC8vIEluc2lkZSBhIHBhcmVudCBsaXN0XG4gICAgICAgICAgICByZXR1cm4gbGlmdFRvT3V0ZXJMaXN0KHN0YXRlLCBkaXNwYXRjaCwgaXRlbVR5cGUsIHJhbmdlKTtcbiAgICAgICAgZWxzZSAvLyBPdXRlciBsaXN0IG5vZGVcbiAgICAgICAgICAgIHJldHVybiBsaWZ0T3V0T2ZMaXN0KHN0YXRlLCBkaXNwYXRjaCwgcmFuZ2UpO1xuICAgIH07XG59XG5mdW5jdGlvbiBsaWZ0VG9PdXRlckxpc3Qoc3RhdGUsIGRpc3BhdGNoLCBpdGVtVHlwZSwgcmFuZ2UpIHtcbiAgICBsZXQgdHIgPSBzdGF0ZS50ciwgZW5kID0gcmFuZ2UuZW5kLCBlbmRPZkxpc3QgPSByYW5nZS4kdG8uZW5kKHJhbmdlLmRlcHRoKTtcbiAgICBpZiAoZW5kIDwgZW5kT2ZMaXN0KSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBzaWJsaW5ncyBhZnRlciB0aGUgbGlmdGVkIGl0ZW1zLCB3aGljaCBtdXN0IGJlY29tZVxuICAgICAgICAvLyBjaGlsZHJlbiBvZiB0aGUgbGFzdCBpdGVtXG4gICAgICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKGVuZCAtIDEsIGVuZE9mTGlzdCwgZW5kLCBlbmRPZkxpc3QsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGl0ZW1UeXBlLmNyZWF0ZShudWxsLCByYW5nZS5wYXJlbnQuY29weSgpKSksIDEsIDApLCAxLCB0cnVlKSk7XG4gICAgICAgIHJhbmdlID0gbmV3IE5vZGVSYW5nZSh0ci5kb2MucmVzb2x2ZShyYW5nZS4kZnJvbS5wb3MpLCB0ci5kb2MucmVzb2x2ZShlbmRPZkxpc3QpLCByYW5nZS5kZXB0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyLmxpZnQocmFuZ2UsIHRhcmdldCk7XG4gICAgbGV0ICRhZnRlciA9IHRyLmRvYy5yZXNvbHZlKHRyLm1hcHBpbmcubWFwKGVuZCwgLTEpIC0gMSk7XG4gICAgaWYgKGNhbkpvaW4odHIuZG9jLCAkYWZ0ZXIucG9zKSAmJiAkYWZ0ZXIubm9kZUJlZm9yZS50eXBlID09ICRhZnRlci5ub2RlQWZ0ZXIudHlwZSlcbiAgICAgICAgdHIuam9pbigkYWZ0ZXIucG9zKTtcbiAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGxpZnRPdXRPZkxpc3Qoc3RhdGUsIGRpc3BhdGNoLCByYW5nZSkge1xuICAgIGxldCB0ciA9IHN0YXRlLnRyLCBsaXN0ID0gcmFuZ2UucGFyZW50O1xuICAgIC8vIE1lcmdlIHRoZSBsaXN0IGl0ZW1zIGludG8gYSBzaW5nbGUgYmlnIGl0ZW1cbiAgICBmb3IgKGxldCBwb3MgPSByYW5nZS5lbmQsIGkgPSByYW5nZS5lbmRJbmRleCAtIDEsIGUgPSByYW5nZS5zdGFydEluZGV4OyBpID4gZTsgaS0tKSB7XG4gICAgICAgIHBvcyAtPSBsaXN0LmNoaWxkKGkpLm5vZGVTaXplO1xuICAgICAgICB0ci5kZWxldGUocG9zIC0gMSwgcG9zICsgMSk7XG4gICAgfVxuICAgIGxldCAkc3RhcnQgPSB0ci5kb2MucmVzb2x2ZShyYW5nZS5zdGFydCksIGl0ZW0gPSAkc3RhcnQubm9kZUFmdGVyO1xuICAgIGlmICh0ci5tYXBwaW5nLm1hcChyYW5nZS5lbmQpICE9IHJhbmdlLnN0YXJ0ICsgJHN0YXJ0Lm5vZGVBZnRlci5ub2RlU2l6ZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBhdFN0YXJ0ID0gcmFuZ2Uuc3RhcnRJbmRleCA9PSAwLCBhdEVuZCA9IHJhbmdlLmVuZEluZGV4ID09IGxpc3QuY2hpbGRDb3VudDtcbiAgICBsZXQgcGFyZW50ID0gJHN0YXJ0Lm5vZGUoLTEpLCBpbmRleEJlZm9yZSA9ICRzdGFydC5pbmRleCgtMSk7XG4gICAgaWYgKCFwYXJlbnQuY2FuUmVwbGFjZShpbmRleEJlZm9yZSArIChhdFN0YXJ0ID8gMCA6IDEpLCBpbmRleEJlZm9yZSArIDEsIGl0ZW0uY29udGVudC5hcHBlbmQoYXRFbmQgPyBGcmFnbWVudC5lbXB0eSA6IEZyYWdtZW50LmZyb20obGlzdCkpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzdGFydCA9ICRzdGFydC5wb3MsIGVuZCA9IHN0YXJ0ICsgaXRlbS5ub2RlU2l6ZTtcbiAgICAvLyBTdHJpcCBvZmYgdGhlIHN1cnJvdW5kaW5nIGxpc3QuIEF0IHRoZSBzaWRlcyB3aGVyZSB3ZSdyZSBub3QgYXRcbiAgICAvLyB0aGUgZW5kIG9mIHRoZSBsaXN0LCB0aGUgZXhpc3RpbmcgbGlzdCBpcyBjbG9zZWQuIEF0IHNpZGVzIHdoZXJlXG4gICAgLy8gdGhpcyBpcyB0aGUgZW5kLCBpdCBpcyBvdmVyd3JpdHRlbiB0byBpdHMgZW5kLlxuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0IC0gKGF0U3RhcnQgPyAxIDogMCksIGVuZCArIChhdEVuZCA/IDEgOiAwKSwgc3RhcnQgKyAxLCBlbmQgLSAxLCBuZXcgU2xpY2UoKGF0U3RhcnQgPyBGcmFnbWVudC5lbXB0eSA6IEZyYWdtZW50LmZyb20obGlzdC5jb3B5KEZyYWdtZW50LmVtcHR5KSkpXG4gICAgICAgIC5hcHBlbmQoYXRFbmQgPyBGcmFnbWVudC5lbXB0eSA6IEZyYWdtZW50LmZyb20obGlzdC5jb3B5KEZyYWdtZW50LmVtcHR5KSkpLCBhdFN0YXJ0ID8gMCA6IDEsIGF0RW5kID8gMCA6IDEpLCBhdFN0YXJ0ID8gMCA6IDEpKTtcbiAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCB0byBzaW5rIHRoZSBsaXN0IGl0ZW0gYXJvdW5kIHRoZSBzZWxlY3Rpb24gZG93blxuaW50byBhbiBpbm5lciBsaXN0LlxuKi9cbmZ1bmN0aW9uIHNpbmtMaXN0SXRlbShpdGVtVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIG5vZGUgPT4gbm9kZS5jaGlsZENvdW50ID4gMCAmJiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PSBpdGVtVHlwZSk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzdGFydEluZGV4ID0gcmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudCA9IHJhbmdlLnBhcmVudCwgbm9kZUJlZm9yZSA9IHBhcmVudC5jaGlsZChzdGFydEluZGV4IC0gMSk7XG4gICAgICAgIGlmIChub2RlQmVmb3JlLnR5cGUgIT0gaXRlbVR5cGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IG5lc3RlZEJlZm9yZSA9IG5vZGVCZWZvcmUubGFzdENoaWxkICYmIG5vZGVCZWZvcmUubGFzdENoaWxkLnR5cGUgPT0gcGFyZW50LnR5cGU7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBGcmFnbWVudC5mcm9tKG5lc3RlZEJlZm9yZSA/IGl0ZW1UeXBlLmNyZWF0ZSgpIDogbnVsbCk7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGUobnVsbCwgRnJhZ21lbnQuZnJvbShwYXJlbnQudHlwZS5jcmVhdGUobnVsbCwgaW5uZXIpKSkpLCBuZXN0ZWRCZWZvcmUgPyAzIDogMSwgMCk7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gcmFuZ2Uuc3RhcnQsIGFmdGVyID0gcmFuZ2UuZW5kO1xuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoYmVmb3JlIC0gKG5lc3RlZEJlZm9yZSA/IDMgOiAxKSwgYWZ0ZXIsIGJlZm9yZSwgYWZ0ZXIsIHNsaWNlLCAxLCB0cnVlKSlcbiAgICAgICAgICAgICAgICAuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cblxuZXhwb3J0IHsgYWRkTGlzdE5vZGVzLCBidWxsZXRMaXN0LCBsaWZ0TGlzdEl0ZW0sIGxpc3RJdGVtLCBvcmRlcmVkTGlzdCwgc2lua0xpc3RJdGVtLCBzcGxpdExpc3RJdGVtLCBzcGxpdExpc3RJdGVtS2VlcE1hcmtzLCB3cmFwSW5MaXN0LCB3cmFwUmFuZ2VJbkxpc3QgfTtcbiIsImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuY29uc3QgcERPTSA9IFtcInBcIiwgMF0sIGJsb2NrcXVvdGVET00gPSBbXCJibG9ja3F1b3RlXCIsIDBdLCBockRPTSA9IFtcImhyXCJdLCBwcmVET00gPSBbXCJwcmVcIiwgW1wiY29kZVwiLCAwXV0sIGJyRE9NID0gW1wiYnJcIl07XG4vKipcbltTcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjKSBmb3IgdGhlIG5vZGVzIGRlZmluZWQgaW4gdGhpcyBzY2hlbWEuXG4qL1xuY29uc3Qgbm9kZXMgPSB7XG4gICAgLyoqXG4gICAgTm9kZVNwZWMgVGhlIHRvcCBsZXZlbCBkb2N1bWVudCBub2RlLlxuICAgICovXG4gICAgZG9jOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwiYmxvY2srXCJcbiAgICB9LFxuICAgIC8qKlxuICAgIEEgcGxhaW4gcGFyYWdyYXBoIHRleHRibG9jay4gUmVwcmVzZW50ZWQgaW4gdGhlIERPTVxuICAgIGFzIGEgYDxwPmAgZWxlbWVudC5cbiAgICAqL1xuICAgIHBhcmFncmFwaDoge1xuICAgICAgICBjb250ZW50OiBcImlubGluZSpcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJwXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gcERPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBibG9ja3F1b3RlIChgPGJsb2NrcXVvdGU+YCkgd3JhcHBpbmcgb25lIG9yIG1vcmUgYmxvY2tzLlxuICAgICovXG4gICAgYmxvY2txdW90ZToge1xuICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiLFxuICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJibG9ja3F1b3RlXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gYmxvY2txdW90ZURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBob3Jpem9udGFsIHJ1bGUgKGA8aHI+YCkuXG4gICAgKi9cbiAgICBob3Jpem9udGFsX3J1bGU6IHtcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoclwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGhyRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIGhlYWRpbmcgdGV4dGJsb2NrLCB3aXRoIGEgYGxldmVsYCBhdHRyaWJ1dGUgdGhhdFxuICAgIHNob3VsZCBob2xkIHRoZSBudW1iZXIgMSB0byA2LiBQYXJzZWQgYW5kIHNlcmlhbGl6ZWQgYXMgYDxoMT5gIHRvXG4gICAgYDxoNj5gIGVsZW1lbnRzLlxuICAgICovXG4gICAgaGVhZGluZzoge1xuICAgICAgICBhdHRyczogeyBsZXZlbDogeyBkZWZhdWx0OiAxLCB2YWxpZGF0ZTogXCJudW1iZXJcIiB9IH0sXG4gICAgICAgIGNvbnRlbnQ6IFwiaW5saW5lKlwiLFxuICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoMVwiLCBhdHRyczogeyBsZXZlbDogMSB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoMlwiLCBhdHRyczogeyBsZXZlbDogMiB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoM1wiLCBhdHRyczogeyBsZXZlbDogMyB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNFwiLCBhdHRyczogeyBsZXZlbDogNCB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNVwiLCBhdHRyczogeyBsZXZlbDogNSB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNlwiLCBhdHRyczogeyBsZXZlbDogNiB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsLCAwXTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBjb2RlIGxpc3RpbmcuIERpc2FsbG93cyBtYXJrcyBvciBub24tdGV4dCBpbmxpbmVcbiAgICBub2RlcyBieSBkZWZhdWx0LiBSZXByZXNlbnRlZCBhcyBhIGA8cHJlPmAgZWxlbWVudCB3aXRoIGFcbiAgICBgPGNvZGU+YCBlbGVtZW50IGluc2lkZSBvZiBpdC5cbiAgICAqL1xuICAgIGNvZGVfYmxvY2s6IHtcbiAgICAgICAgY29udGVudDogXCJ0ZXh0KlwiLFxuICAgICAgICBtYXJrczogXCJcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicHJlXCIsIHByZXNlcnZlV2hpdGVzcGFjZTogXCJmdWxsXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gcHJlRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBUaGUgdGV4dCBub2RlLlxuICAgICovXG4gICAgdGV4dDoge1xuICAgICAgICBncm91cDogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgQW4gaW5saW5lIGltYWdlIChgPGltZz5gKSBub2RlLiBTdXBwb3J0cyBgc3JjYCxcbiAgICBgYWx0YCwgYW5kIGBocmVmYCBhdHRyaWJ1dGVzLiBUaGUgbGF0dGVyIHR3byBkZWZhdWx0IHRvIHRoZSBlbXB0eVxuICAgIHN0cmluZy5cbiAgICAqL1xuICAgIGltYWdlOiB7XG4gICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNyYzogeyB2YWxpZGF0ZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgYWx0OiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfVxuICAgICAgICB9LFxuICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImltZ1tzcmNdXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBkb20uZ2V0QXR0cmlidXRlKFwic3JjXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogZG9tLmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gfV0sXG4gICAgICAgIHRvRE9NKG5vZGUpIHsgbGV0IHsgc3JjLCBhbHQsIHRpdGxlIH0gPSBub2RlLmF0dHJzOyByZXR1cm4gW1wiaW1nXCIsIHsgc3JjLCBhbHQsIHRpdGxlIH1dOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIGhhcmQgbGluZSBicmVhaywgcmVwcmVzZW50ZWQgaW4gdGhlIERPTSBhcyBgPGJyPmAuXG4gICAgKi9cbiAgICBoYXJkX2JyZWFrOiB7XG4gICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImJyXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gYnJET007IH1cbiAgICB9XG59O1xuY29uc3QgZW1ET00gPSBbXCJlbVwiLCAwXSwgc3Ryb25nRE9NID0gW1wic3Ryb25nXCIsIDBdLCBjb2RlRE9NID0gW1wiY29kZVwiLCAwXTtcbi8qKlxuW1NwZWNzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMpIGZvciB0aGUgbWFya3MgaW4gdGhlIHNjaGVtYS5cbiovXG5jb25zdCBtYXJrcyA9IHtcbiAgICAvKipcbiAgICBBIGxpbmsuIEhhcyBgaHJlZmAgYW5kIGB0aXRsZWAgYXR0cmlidXRlcy4gYHRpdGxlYFxuICAgIGRlZmF1bHRzIHRvIHRoZSBlbXB0eSBzdHJpbmcuIFJlbmRlcmVkIGFuZCBwYXJzZWQgYXMgYW4gYDxhPmBcbiAgICBlbGVtZW50LlxuICAgICovXG4gICAgbGluazoge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgaHJlZjogeyB2YWxpZGF0ZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCwgdmFsaWRhdGU6IFwic3RyaW5nfG51bGxcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYVtocmVmXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaHJlZjogZG9tLmdldEF0dHJpYnV0ZShcImhyZWZcIiksIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgfTtcbiAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IGxldCB7IGhyZWYsIHRpdGxlIH0gPSBub2RlLmF0dHJzOyByZXR1cm4gW1wiYVwiLCB7IGhyZWYsIHRpdGxlIH0sIDBdOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBbiBlbXBoYXNpcyBtYXJrLiBSZW5kZXJlZCBhcyBhbiBgPGVtPmAgZWxlbWVudC4gSGFzIHBhcnNlIHJ1bGVzXG4gICAgdGhhdCBhbHNvIG1hdGNoIGA8aT5gIGFuZCBgZm9udC1zdHlsZTogaXRhbGljYC5cbiAgICAqL1xuICAgIGVtOiB7XG4gICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICB7IHRhZzogXCJpXCIgfSwgeyB0YWc6IFwiZW1cIiB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPWl0YWxpY1wiIH0sXG4gICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtc3R5bGU9bm9ybWFsXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcImVtXCIgfVxuICAgICAgICBdLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGVtRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIHN0cm9uZyBtYXJrLiBSZW5kZXJlZCBhcyBgPHN0cm9uZz5gLCBwYXJzZSBydWxlcyBhbHNvIG1hdGNoXG4gICAgYDxiPmAgYW5kIGBmb250LXdlaWdodDogYm9sZGAuXG4gICAgKi9cbiAgICBzdHJvbmc6IHtcbiAgICAgICAgcGFyc2VET006IFtcbiAgICAgICAgICAgIHsgdGFnOiBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGFyb3VuZCBhIEdvb2dsZSBEb2NzIG1pc2JlaGF2aW9yIHdoZXJlXG4gICAgICAgICAgICAvLyBwYXN0ZWQgY29udGVudCB3aWxsIGJlIGluZXhwbGljYWJseSB3cmFwcGVkIGluIGA8Yj5gXG4gICAgICAgICAgICAvLyB0YWdzIHdpdGggYSBmb250LXdlaWdodCBub3JtYWwuXG4gICAgICAgICAgICB7IHRhZzogXCJiXCIsIGdldEF0dHJzOiAobm9kZSkgPT4gbm9kZS5zdHlsZS5mb250V2VpZ2h0ICE9IFwibm9ybWFsXCIgJiYgbnVsbCB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXdlaWdodD00MDBcIiwgY2xlYXJNYXJrOiBtID0+IG0udHlwZS5uYW1lID09IFwic3Ryb25nXCIgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHRcIiwgZ2V0QXR0cnM6ICh2YWx1ZSkgPT4gL14oYm9sZChlcik/fFs1LTldXFxkezIsfSkkLy50ZXN0KHZhbHVlKSAmJiBudWxsIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gc3Ryb25nRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBDb2RlIGZvbnQgbWFyay4gUmVwcmVzZW50ZWQgYXMgYSBgPGNvZGU+YCBlbGVtZW50LlxuICAgICovXG4gICAgY29kZToge1xuICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImNvZGVcIiB9XSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBjb2RlRE9NOyB9XG4gICAgfVxufTtcbi8qKlxuVGhpcyBzY2hlbWEgcm91Z2hseSBjb3JyZXNwb25kcyB0byB0aGUgZG9jdW1lbnQgc2NoZW1hIHVzZWQgYnlcbltDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSwgbWludXMgdGhlIGxpc3QgZWxlbWVudHMsXG53aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgW2Bwcm9zZW1pcnJvci1zY2hlbWEtbGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdClcbm1vZHVsZS5cblxuVG8gcmV1c2UgZWxlbWVudHMgZnJvbSB0aGlzIHNjaGVtYSwgZXh0ZW5kIG9yIHJlYWQgZnJvbSBpdHNcbmBzcGVjLm5vZGVzYCBhbmQgYHNwZWMubWFya3NgIFtwcm9wZXJ0aWVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2NoZW1hLnNwZWMpLlxuKi9cbmNvbnN0IHNjaGVtYSA9IG5ldyBTY2hlbWEoeyBub2RlcywgbWFya3MgfSk7XG5cbmV4cG9ydCB7IG1hcmtzLCBub2Rlcywgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBidWxsZXRMaXN0LCBsaXN0SXRlbSwgb3JkZXJlZExpc3QgfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5pbXBvcnQgeyBtYXJrcywgbm9kZXMgfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtYmFzaWMnO1xuaW1wb3J0IHsgTm9kZVNwZWMsIFNjaGVtYSwgU2NoZW1hU3BlYyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuZXhwb3J0IGNvbnN0IE1BUktET1dOX0VTQ0FQRURfQVRUUiA9ICdtYXJrZG93bl9lc2NhcGVkJztcbmV4cG9ydCBjb25zdCBBVVRPX0xJTktfQVRUUiA9ICdhdXRvX2xpbmsnOyAvLyBMaW5rcyBhdXRvLWRldGVjdGVkIGZyb20gdXNlciBpbnB1dCwgYXMgb3Bwb3NlZCB0byBsaW5rcyBhZGRlZCBhcyBtZXRhZGF0YSBieSB0aGUgdXNlclxuXG5jb25zdCBFRElUT1JfQ0xTID0gJ3NuLWVkaXRvcic7XG5cbmNvbnN0IGRvY1NwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnYmxvY2srJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ21haW4nLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIHRhZzogJ21haW4nLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBoZWFkaW5nMVNwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGRlZmluaW5nOiB0cnVlLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ2gxJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFtcbiAgICB7XG4gICAgICB0YWc6ICdoMScsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IGhlYWRpbmcyU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIGdyb3VwOiAnYmxvY2snLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsnaDInLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW3sgdGFnOiAnaDInIH1dLFxufTtcblxuY29uc3QgaGVhZGluZzNTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydoMycsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdoMycgfV0sXG59O1xuXG5jb25zdCBwYXJhZ3JhcGhTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgbWFya3M6ICdfJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ3AnLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW3sgdGFnOiAncCcgfV0sXG59O1xuXG5leHBvcnQgZW51bSBDaGVja2JveFN0YXR1cyB7XG4gIERPTkUsXG4gIEVNUFRZLFxufVxuXG5jb25zdCBjaGVja2xpc3RJdGVtU3BlYzogTm9kZVNwZWMgPSB7XG4gIGF0dHJzOiB7XG4gICAgc3RhdHVzOiB7XG4gICAgICBkZWZhdWx0OiBDaGVja2JveFN0YXR1cy5FTVBUWSxcbiAgICB9LFxuICB9LFxuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGRlZmluaW5nOiB0cnVlLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgbWFya3M6ICdfJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbXG4gICAgICAnZGl2JyxcbiAgICAgIHsgY2xhc3M6ICdjaGVja2xpc3QtaXRlbScgfSxcbiAgICAgIFtcbiAgICAgICAgJ2lucHV0JyxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgLi4uKG5vZGUuYXR0cnMuc3RhdHVzID09PSBDaGVja2JveFN0YXR1cy5ET05FICYmIHsgY2hlY2tlZDogJ3RydWUnIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIFsncCcsIDBdLFxuICAgIF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgY29udGVudEVsZW1lbnQ6ICdwJyxcbiAgICAgIHRhZzogJ2Rpdi5jaGVja2xpc3QtaXRlbScsXG4gICAgICBnZXRBdHRycyhub2RlKSB7XG4gICAgICAgIC8vIFdpbGwgYmUgdHlwZSBOb2RlIHdoZW4gcGFyc2VET00gc3VwcGxpZXMgYSAndGFnJyBydWxlXG4gICAgICAgIGNvbnN0IGlucHV0ID0gKG5vZGUgYXMgSFRNTEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzOiAhIShpbnB1dCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkXG4gICAgICAgICAgICA/IENoZWNrYm94U3RhdHVzLkRPTkVcbiAgICAgICAgICAgIDogQ2hlY2tib3hTdGF0dXMuRU1QVFksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCB0ZXh0U3BlYzogTm9kZVNwZWMgPSB7XG4gIGdyb3VwOiAnaW5saW5lJyxcbn07XG5cbmNvbnN0IGNvZGVCbG9ja1NwZWM6IE5vZGVTcGVjID0ge1xuICAuLi5ub2Rlcy5jb2RlX2Jsb2NrLFxuICBhdHRyczoge1xuICAgIC4uLm5vZGVzLmNvZGVfYmxvY2suYXR0cnMsXG4gICAgW01BUktET1dOX0VTQ0FQRURfQVRUUl06IHtcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHRvRE9NKG5vZGUpIHtcbiAgICBjb25zdCBhdHRycyA9IHtcbiAgICAgIFtgZGF0YS0ke01BUktET1dOX0VTQ0FQRURfQVRUUn1gXTogbm9kZS5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdLFxuICAgIH07XG4gICAgcmV0dXJuIG5vZGUuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXVxuICAgICAgPyBbJ3ByZScsIGF0dHJzLCBbJ2RpdicsIHsgY2xhc3M6ICdpbmZvJyB9LCAnaSddLCBbJ2NvZGUnLCAwXV1cbiAgICAgIDogWydwcmUnLCBhdHRycywgWydjb2RlJywgMF1dO1xuICB9LFxufTtcblxuY29uc3Qgc3BlYzogU2NoZW1hU3BlYyA9IHtcbiAgbm9kZXM6IHtcbiAgICBkb2M6IGRvY1NwZWMsXG4gICAgLy8gT3JkZXIgbWF0dGVycyBoZXJlLiBwbSBhcHBhcmVudGx5IGluc2VydHMgdGhlIGZpcnN0IHZhbGlkIG5vZGUgb24gZW50ZXIuXG4gICAgcGFyYWdyYXBoOiBwYXJhZ3JhcGhTcGVjLFxuICAgIGNoZWNrbGlzdF9pdGVtOiBjaGVja2xpc3RJdGVtU3BlYyxcbiAgICB1bm9yZGVyZWRfbGlzdDoge1xuICAgICAgLi4uYnVsbGV0TGlzdCxcbiAgICAgIGNvbnRlbnQ6ICdsaXN0X2l0ZW0rJyxcbiAgICAgIGdyb3VwOiAnYmxvY2snLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICBvcmRlcmVkX2xpc3Q6IHtcbiAgICAgIC4uLm9yZGVyZWRMaXN0LFxuICAgICAgY29udGVudDogJ2xpc3RfaXRlbSsnLFxuICAgICAgZ3JvdXA6ICdibG9jaycsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIGxpc3RfaXRlbToge1xuICAgICAgLi4ubGlzdEl0ZW0sXG4gICAgICBjb250ZW50OiAncGFyYWdyYXBoIChwYXJhZ3JhcGggfCBvcmRlcmVkX2xpc3QgfCB1bm9yZGVyZWRfbGlzdCkqJyxcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgaGVhZGluZzE6IGhlYWRpbmcxU3BlYyxcbiAgICBoZWFkaW5nMjogaGVhZGluZzJTcGVjLFxuICAgIGhlYWRpbmczOiBoZWFkaW5nM1NwZWMsXG4gICAgdGV4dDogdGV4dFNwZWMsXG4gICAgY29kZV9ibG9jazogY29kZUJsb2NrU3BlYyxcbiAgfSxcbiAgbWFya3M6IHtcbiAgICBsaW5rOiB7XG4gICAgICBhdHRyczoge1xuICAgICAgICBocmVmOiB7IGRlZmF1bHQ6ICcnIH0sXG4gICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICAgICAgW0FVVE9fTElOS19BVFRSXTogeyBkZWZhdWx0OiBmYWxzZSB9LFxuICAgICAgfSxcbiAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICBwYXJzZURPTTogW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiAnYVtocmVmXScsXG4gICAgICAgICAgZ2V0QXR0cnMoZG9tOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaHJlZjogZG9tLmdldEF0dHJpYnV0ZSgnaHJlZicpLFxuICAgICAgICAgICAgICB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZSgndGl0bGUnKSxcbiAgICAgICAgICAgICAgW2BkYXRhLSR7QVVUT19MSU5LX0FUVFJ9YF06IGRvbS5nZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgYGRhdGEtJHtBVVRPX0xJTktfQVRUUn1gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRvRE9NKG5vZGUpIHtcbiAgICAgICAgbGV0IHsgaHJlZiwgdGl0bGUgfSA9IG5vZGUuYXR0cnM7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgJ2EnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIFtgZGF0YS0ke0FVVE9fTElOS19BVFRSfWBdOiBub2RlLmF0dHJzW0FVVE9fTElOS19BVFRSXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIDAsXG4gICAgICAgIF07XG4gICAgICB9LFxuICAgIH0sXG4gICAgZW06IHtcbiAgICAgIC4uLm1hcmtzLmVtLFxuICAgIH0sXG4gICAgc3Ryb25nOiB7XG4gICAgICAuLi5tYXJrcy5zdHJvbmcsXG4gICAgfSxcbiAgICBjb2RlOiB7XG4gICAgICAuLi5tYXJrcy5jb2RlLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgLi4ubWFya3MuY29kZS5hdHRycyxcbiAgICAgICAgW01BUktET1dOX0VTQ0FQRURfQVRUUl06IHtcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzY2hlbWEgPSBuZXcgU2NoZW1hKHNwZWMpO1xuIiwiaW1wb3J0IHtcbiAgaW5wdXRSdWxlcyxcbiAgc21hcnRRdW90ZXMsXG4gIGVsbGlwc2lzLFxuICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlLFxuICBJbnB1dFJ1bGUsXG59IGZyb20gJ3Byb3NlbWlycm9yLWlucHV0cnVsZXMnO1xuaW1wb3J0IHsgUGx1Z2luLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBNYXJrVHlwZSwgTm9kZVR5cGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmZ1bmN0aW9uIG1hcmtXcmFwcGluZ1J1bGUoXG4gIGM6IHN0cmluZyxcbiAgbWFya1R5cGU6IE1hcmtUeXBlLFxuICBpc1ZhbGlkSW5zaWRlQ29kZU1hcms6IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoXG4gICAgbmV3IFJlZ0V4cChgJHtjfShcXFxcUysoXFxcXHMrXFxcXFMrKSo/KSR7Y30kYCksXG4gICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgY29uc3QgW18sIHRleHRdID0gbWF0Y2g7XG4gICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTWFya3MgPSBzdGF0ZS5kb2NcbiAgICAgICAgLnJlc29sdmUoc3RhcnQpXG4gICAgICAgIC5tYXJrc0Fjcm9zcyhzdGF0ZS5kb2MucmVzb2x2ZShlbmQpKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHJcbiAgICAgICAgICAucmVwbGFjZVJhbmdlV2l0aChcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2NoZW1hLnRleHQodGV4dCwgWy4uLmV4aXN0aW5nTWFya3MsIG1hcmtUeXBlLmNyZWF0ZSgpXSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIEFkZCBhIHNwYWNlIGFmdGVyIHRoZSB0ZXh0IHNvIHRoZSBpbmNsdXNpdmUgbWFyayBydWxlIGRvZXNuJ3QgYWZmZWN0IHRoZSBlbnN1aW5nIGlucHV0XG4gICAgICAgICAgLmluc2VydCh0ci5zZWxlY3Rpb24uZnJvbSwgc2NoZW1hLnRleHQoJyAnLCBbLi4uZXhpc3RpbmdNYXJrc10pKVxuICAgICAgICAgIC5zZXRNZXRhKCdoYXMtZm9yY2VkLXNwYWNlLWZyb20taW5wdXQtcnVsZScsIHtcbiAgICAgICAgICAgIGVuZFBvczogdHIuc2VsZWN0aW9uLmZyb20sXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICB7XG4gICAgICBpbkNvZGVNYXJrOiBpc1ZhbGlkSW5zaWRlQ29kZU1hcmssXG4gICAgfSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdFR5cGVSdWxlKHByZWZpeDogc3RyaW5nLCBsaXN0VHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUge1xuICByZXR1cm4gbmV3IElucHV0UnVsZShcbiAgICBuZXcgUmVnRXhwKGBeJHtwcmVmaXh9JGApLFxuICAgIChzdGF0ZSwgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgIGNvbnN0ICRlbmQgPSBzdGF0ZS5kb2MucmVzb2x2ZShlbmQpO1xuICAgICAgaWYgKCRlbmQuZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSBsaXN0OyBhbGwgb3RoZXIgcG9zaXRpb25zIHNob3VsZCBiZVxuICAgICAgICAvLyBkZXB0aCAxLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdWJ0cmFjdCAyIGhlcmUsIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbm9kZS5cbiAgICAgIGNvbnN0IHJhbmdlQWZ0ZXJQcmVmaXg6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQgKyAkZW5kLnBhcmVudC5ub2RlU2l6ZSAtIDIsXG4gICAgICBdO1xuICAgICAgY29uc3Qgc2xpY2VBZnRlclByZWZpeCA9IHN0YXRlLmRvYy5zbGljZSguLi5yYW5nZUFmdGVyUHJlZml4KTtcbiAgICAgIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuICAgICAgdHIuZGVsZXRlUmFuZ2UoLi4ucmFuZ2VBZnRlclByZWZpeCk7XG4gICAgICB0ci5yZXBsYWNlUmFuZ2VXaXRoKHN0YXJ0LCBlbmQsIGxpc3RUeXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc3RhcnQpKSk7XG4gICAgICB0ci5pbnNlcnQodHIuc2VsZWN0aW9uLmZyb20sIHNsaWNlQWZ0ZXJQcmVmaXguY29udGVudCk7XG4gICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc3RhcnQpKSk7XG4gICAgICByZXR1cm4gdHI7XG4gICAgfSxcbiAgKTtcbn1cblxuY29uc3QgYXJyb3dDaGFycyA9IFtcbiAgbmV3IElucHV0UnVsZShuZXcgUmVnRXhwKCc8XFxcXC0+JCcpLCAn4oaUJywgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KSxcbiAgbmV3IElucHV0UnVsZShuZXcgUmVnRXhwKCdcXFxcLT4kJyksICfihpInLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IGlucHV0UnVsZXNQbHVnaW4gPSBpbnB1dFJ1bGVzKHtcbiAgcnVsZXM6IFtcbiAgICAuLi5zbWFydFF1b3RlcyxcbiAgICBlbGxpcHNpcyxcbiAgICAuLi5hcnJvd0NoYXJzLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL14jICQvLCBzY2hlbWEubm9kZXMuaGVhZGluZzEpLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL14jIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmcyKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyMjICQvLCBzY2hlbWEubm9kZXMuaGVhZGluZzMpLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL15gYGAkLywgc2NoZW1hLm5vZGVzLmNvZGVfYmxvY2spLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ2AnLCBzY2hlbWEubWFya3MuY29kZSwgZmFsc2UpLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ1xcXFwqJywgc2NoZW1hLm1hcmtzLnN0cm9uZywgZmFsc2UpLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ18nLCBzY2hlbWEubWFya3MuZW0sIGZhbHNlKSxcbiAgICBsaXN0VHlwZVJ1bGUoJzEuICcsIHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QpLFxuICAgIGxpc3RUeXBlUnVsZSgnLSAnLCBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QpLFxuICBdLFxufSk7XG5cbmNvbnN0IFJFU0VUX0hBU19GT1JDRURfU1BBQ0VfTUVUQSA9ICdyZXNldC1oYXMtZm9yY2VkLXNwYWNlLW1ldGEnO1xuXG4vLyBDcmVhdGUgYSBwbHVnaW4gdGhhdCBzd2FsbG93cyBhIHNwYWNlIHR5cGVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSd2ZSBqdXN0XG4vLyBpbnZva2VkIGFuIGlucHV0IHJ1bGUgdGhhdCBpbnNlcnRlZCBhIHNwYWNlIGZvciB0aGVtLCB0byBhdm9pZCB1bmludGVudGlvbmFsXG4vLyBkb3VibGUgc3BhY2VzLlxuZXhwb3J0IGNvbnN0IGlucHV0UnVsZXNGb3JjZWRTcGFjZVBsdWdpbiA9IG5ldyBQbHVnaW48XG4gIHsgaGFzRm9yY2VkU3BhY2U6IGZhbHNlIH0gfCB7IGhhc0ZvcmNlZFNwYWNlOiB0cnVlOyBmb3JjZWRTcGFjZVBvczogbnVtYmVyIH1cbj4oe1xuICBzdGF0ZToge1xuICAgIGluaXQoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNGb3JjZWRTcGFjZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXBwbHkodHIsIHByZXZpb3VzKSB7XG4gICAgICBpZiAodHIuZ2V0TWV0YShSRVNFVF9IQVNfRk9SQ0VEX1NQQUNFX01FVEEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzRm9yY2VkU3BhY2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzLmhhc0ZvcmNlZFNwYWNlKSB7XG4gICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgc2NlbmFyaW8sIHRoaXMgbG9naWMgY291bGQgYmUgaW5zdWZmaWNpZW50LCBidXQgaXRcbiAgICAgICAgLy8gc2hvdWxkIHdvcmsgZmluZSBmb3IgYWxsIGN1cnJlbnQgdXNlIGNhc2VzLiBXZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0XG4gICAgICAgIC8vIF9vbmx5XyB3aGVuIHRoZSB1c2VyIHR5cGVzIGEgc3BhY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdHlwaW5nIHRoZVxuICAgICAgICAvLyBjbG9zaW5nIHdyYXBwaW5nIG1hcmsgY2hhcmFjdGVyIGRvIHdlIHN1cHByZXNzIHRoYXQgc3BhY2UgY2hhcmFjdGVyLlxuICAgICAgICAvLyBTbyBpZiB0aGV5IGRvIGFueXRoaW5nIGVsc2UsIGxpa2UgZ28gc29tZXdoZXJlIGVsc2UgaW4gdGhlIGRvY3VtZW50XG4gICAgICAgIC8vIG9yIHR5cGUgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLCB3ZSBzaG91bGQgY2xlYXIgdGhlIHBsdWdpbiBzdGF0ZS4gVGhpc1xuICAgICAgICAvLyBjb3VsZCBmYWlsIGluIGEgY29sbGFib3JhdGl2ZSBzY2VuYXJpbywgd2hlcmUgb3RoZXJzIGNvdWxkIGNoYW5nZSB0aGVcbiAgICAgICAgLy8gZG9jdW1lbnQsIG9yIHdpdGggcGx1Z2lucyB0aGF0IG1vZGlmeSB0aGUgZG9jdW1lbnQgd2l0aG91dCBkaXJlY3RcbiAgICAgICAgLy8gaW5wdXQgZnJvbSB0aGUgdXNlci5cbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvblNldCB8fCB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWdpbk1ldGEgPSB0ci5nZXRNZXRhKCdoYXMtZm9yY2VkLXNwYWNlLWZyb20taW5wdXQtcnVsZScpO1xuICAgICAgaWYgKHBsdWdpbk1ldGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNGb3JjZWRTcGFjZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZWRTcGFjZVBvczogcGx1Z2luTWV0YS5lbmRQb3MsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9LFxuICB9LFxuICBwcm9wczoge1xuICAgIGhhbmRsZVRleHRJbnB1dCh2aWV3LCBfZnJvbSwgX3RvLCB0ZXh0KSB7XG4gICAgICBpZiAodGhpcy5nZXRTdGF0ZSh2aWV3LnN0YXRlKS5oYXNGb3JjZWRTcGFjZSAmJiB0ZXh0ID09PSAnICcpIHtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldE1ldGEoUkVTRVRfSEFTX0ZPUkNFRF9TUEFDRV9NRVRBLCB0cnVlKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59KTtcbiIsImltcG9ydCB7IGxpZnRUYXJnZXQsIHJlcGxhY2VTdGVwLCBSZXBsYWNlU3RlcCwgY2FuSm9pbiwgam9pblBvaW50LCBjYW5TcGxpdCwgUmVwbGFjZUFyb3VuZFN0ZXAsIGZpbmRXcmFwcGluZyB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBTbGljZSwgRnJhZ21lbnQgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBOb2RlU2VsZWN0aW9uLCBTZWxlY3Rpb24sIFRleHRTZWxlY3Rpb24sIEFsbFNlbGVjdGlvbiwgU2VsZWN0aW9uUmFuZ2UgfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbi8qKlxuRGVsZXRlIHRoZSBzZWxlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS5cbiovXG5jb25zdCBkZWxldGVTZWxlY3Rpb24gPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgaWYgKHN0YXRlLnNlbGVjdGlvbi5lbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlU2VsZWN0aW9uKCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gYXRCbG9ja1N0YXJ0KHN0YXRlLCB2aWV3KSB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiYmFja3dhcmRcIiwgc3RhdGUpXG4gICAgICAgIDogJGN1cnNvci5wYXJlbnRPZmZzZXQgPiAwKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuICRjdXJzb3I7XG59XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jaywgdHJ5IHRvXG5yZWR1Y2UgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhhdCBibG9jayBhbmQgdGhlIG9uZSBiZWZvcmUgaXTigJRpZlxudGhlcmUncyBhIGJsb2NrIGRpcmVjdGx5IGJlZm9yZSBpdCB0aGF0IGNhbiBiZSBqb2luZWQsIGpvaW4gdGhlbS5cbklmIG5vdCwgdHJ5IHRvIG1vdmUgdGhlIHNlbGVjdGVkIGJsb2NrIGNsb3NlciB0byB0aGUgbmV4dCBvbmUgaW5cbnRoZSBkb2N1bWVudCBzdHJ1Y3R1cmUgYnkgbGlmdGluZyBpdCBvdXQgb2YgaXRzIHBhcmVudCBvciBtb3ZpbmcgaXRcbmludG8gYSBwYXJlbnQgb2YgdGhlIHByZXZpb3VzIGJsb2NrLiBXaWxsIHVzZSB0aGUgdmlldyBmb3IgYWNjdXJhdGVcbihiaWRpLWF3YXJlKSBzdGFydC1vZi10ZXh0YmxvY2sgZGV0ZWN0aW9uIGlmIGdpdmVuLlxuKi9cbmNvbnN0IGpvaW5CYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRjdXJzb3IpO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIHRoaXMsIHRyeSB0byBsaWZ0XG4gICAgaWYgKCEkY3V0KSB7XG4gICAgICAgIGxldCByYW5nZSA9ICRjdXJzb3IuYmxvY2tSYW5nZSgpLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZTtcbiAgICAvLyBBcHBseSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICBpZiAoZGVsZXRlQmFycmllcihzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gsIC0xKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gSWYgdGhlIG5vZGUgYmVsb3cgaGFzIG5vIGNvbnRlbnQgYW5kIHRoZSBub2RlIGFib3ZlIGlzXG4gICAgLy8gc2VsZWN0YWJsZSwgZGVsZXRlIHRoZSBub2RlIGJlbG93IGFuZCBzZWxlY3QgdGhlIG9uZSBhYm92ZS5cbiAgICBpZiAoJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplID09IDAgJiZcbiAgICAgICAgKHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIikgfHwgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUoYmVmb3JlKSkpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAkY3Vyc29yLmRlcHRoOzsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGRlbFN0ZXAgPSByZXBsYWNlU3RlcChzdGF0ZS5kb2MsICRjdXJzb3IuYmVmb3JlKGRlcHRoKSwgJGN1cnNvci5hZnRlcihkZXB0aCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgICAgIGlmIChkZWxTdGVwICYmIGRlbFN0ZXAuc2xpY2Uuc2l6ZSA8IGRlbFN0ZXAudG8gLSBkZWxTdGVwLmZyb20pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gU2VsZWN0aW9uLmZpbmRGcm9tKHRyLmRvYy5yZXNvbHZlKHRyLm1hcHBpbmcubWFwKCRjdXQucG9zLCAtMSkpLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCAkY3V0LnBvcyAtIGJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVwdGggPT0gMSB8fCAkY3Vyc29yLm5vZGUoZGVwdGggLSAxKS5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgbm9kZSBiZWZvcmUgaXMgYW4gYXRvbSwgZGVsZXRlIGl0XG4gICAgaWYgKGJlZm9yZS5pc0F0b20gJiYgJGN1dC5kZXB0aCA9PSAkY3Vyc29yLmRlcHRoIC0gMSkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5kZWxldGUoJGN1dC5wb3MgLSBiZWZvcmUubm9kZVNpemUsICRjdXQucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbkEgbW9yZSBsaW1pdGVkIGZvcm0gb2YgW2Bqb2luQmFja3dhcmRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuam9pbkJhY2t3YXJkKVxudGhhdCBvbmx5IHRyaWVzIHRvIGpvaW4gdGhlIGN1cnJlbnQgdGV4dGJsb2NrIHRvIHRoZSBvbmUgYmVmb3JlXG5pdCwgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2suXG4qL1xuY29uc3Qgam9pblRleHRibG9ja0JhY2t3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCAkY3Vyc29yID0gYXRCbG9ja1N0YXJ0KHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGN1cnNvcik7XG4gICAgcmV0dXJuICRjdXQgPyBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIDogZmFsc2U7XG59O1xuLyoqXG5BIG1vcmUgbGltaXRlZCBmb3JtIG9mIFtgam9pbkZvcndhcmRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuam9pbkZvcndhcmQpXG50aGF0IG9ubHkgdHJpZXMgdG8gam9pbiB0aGUgY3VycmVudCB0ZXh0YmxvY2sgdG8gdGhlIG9uZSBhZnRlclxuaXQsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jay5cbiovXG5jb25zdCBqb2luVGV4dGJsb2NrRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEFmdGVyKCRjdXJzb3IpO1xuICAgIHJldHVybiAkY3V0ID8gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSA6IGZhbHNlO1xufTtcbmZ1bmN0aW9uIGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkge1xuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmUsIGJlZm9yZVRleHQgPSBiZWZvcmUsIGJlZm9yZVBvcyA9ICRjdXQucG9zIC0gMTtcbiAgICBmb3IgKDsgIWJlZm9yZVRleHQuaXNUZXh0YmxvY2s7IGJlZm9yZVBvcy0tKSB7XG4gICAgICAgIGlmIChiZWZvcmVUZXh0LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBjaGlsZCA9IGJlZm9yZVRleHQubGFzdENoaWxkO1xuICAgICAgICBpZiAoIWNoaWxkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBiZWZvcmVUZXh0ID0gY2hpbGQ7XG4gICAgfVxuICAgIGxldCBhZnRlciA9ICRjdXQubm9kZUFmdGVyLCBhZnRlclRleHQgPSBhZnRlciwgYWZ0ZXJQb3MgPSAkY3V0LnBvcyArIDE7XG4gICAgZm9yICg7ICFhZnRlclRleHQuaXNUZXh0YmxvY2s7IGFmdGVyUG9zKyspIHtcbiAgICAgICAgaWYgKGFmdGVyVGV4dC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSBhZnRlclRleHQuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKCFjaGlsZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYWZ0ZXJUZXh0ID0gY2hpbGQ7XG4gICAgfVxuICAgIGxldCBzdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCBiZWZvcmVQb3MsIGFmdGVyUG9zLCBTbGljZS5lbXB0eSk7XG4gICAgaWYgKCFzdGVwIHx8IHN0ZXAuZnJvbSAhPSBiZWZvcmVQb3MgfHxcbiAgICAgICAgc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VTdGVwICYmIHN0ZXAuc2xpY2Uuc2l6ZSA+PSBhZnRlclBvcyAtIGJlZm9yZVBvcylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKHN0ZXApO1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBiZWZvcmVQb3MpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gdGV4dGJsb2NrQXQobm9kZSwgc2lkZSwgb25seSA9IGZhbHNlKSB7XG4gICAgZm9yIChsZXQgc2NhbiA9IG5vZGU7IHNjYW47IHNjYW4gPSAoc2lkZSA9PSBcInN0YXJ0XCIgPyBzY2FuLmZpcnN0Q2hpbGQgOiBzY2FuLmxhc3RDaGlsZCkpIHtcbiAgICAgICAgaWYgKHNjYW4uaXNUZXh0YmxvY2spXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG9ubHkgJiYgc2Nhbi5jaGlsZENvdW50ICE9IDEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2ssIHNlbGVjdFxudGhlIG5vZGUgYmVmb3JlIHRoYXQgdGV4dGJsb2NrLCBpZiBwb3NzaWJsZS4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZVxuYm91bmQgdG8ga2V5cyBsaWtlIGJhY2tzcGFjZSwgYWZ0ZXJcbltgam9pbkJhY2t3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5CYWNrd2FyZCkgb3Igb3RoZXIgZGVsZXRpbmdcbmNvbW1hbmRzLCBhcyBhIGZhbGwtYmFjayBiZWhhdmlvciB3aGVuIHRoZSBzY2hlbWEgZG9lc24ndCBhbGxvd1xuZGVsZXRpb24gYXQgdGhlIHNlbGVjdGVkIHBvaW50LlxuKi9cbmNvbnN0IHNlbGVjdE5vZGVCYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgeyAkaGVhZCwgZW1wdHkgfSA9IHN0YXRlLnNlbGVjdGlvbiwgJGN1dCA9ICRoZWFkO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGhlYWQucGFyZW50LmlzVGV4dGJsb2NrKSB7XG4gICAgICAgIGlmICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJiYWNrd2FyZFwiLCBzdGF0ZSkgOiAkaGVhZC5wYXJlbnRPZmZzZXQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAkY3V0ID0gZmluZEN1dEJlZm9yZSgkaGVhZCk7XG4gICAgfVxuICAgIGxldCBub2RlID0gJGN1dCAmJiAkY3V0Lm5vZGVCZWZvcmU7XG4gICAgaWYgKCFub2RlIHx8ICFOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHN0YXRlLmRvYywgJGN1dC5wb3MgLSBub2RlLm5vZGVTaXplKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZmluZEN1dEJlZm9yZSgkcG9zKSB7XG4gICAgaWYgKCEkcG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoJHBvcy5pbmRleChpKSA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUoJHBvcy5iZWZvcmUoaSArIDEpKTtcbiAgICAgICAgICAgIGlmICgkcG9zLm5vZGUoaSkudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gYXRCbG9ja0VuZChzdGF0ZSwgdmlldykge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImZvcndhcmRcIiwgc3RhdGUpXG4gICAgICAgIDogJGN1cnNvci5wYXJlbnRPZmZzZXQgPCAkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gJGN1cnNvcjtcbn1cbi8qKlxuSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kIG9mIGFcbnRleHRibG9jaywgdHJ5IHRvIHJlZHVjZSBvciByZW1vdmUgdGhlIGJvdW5kYXJ5IGJldHdlZW4gdGhhdCBibG9ja1xuYW5kIHRoZSBvbmUgYWZ0ZXIgaXQsIGVpdGhlciBieSBqb2luaW5nIHRoZW0gb3IgYnkgbW92aW5nIHRoZSBvdGhlclxuYmxvY2sgY2xvc2VyIHRvIHRoaXMgb25lIGluIHRoZSB0cmVlIHN0cnVjdHVyZS4gV2lsbCB1c2UgdGhlIHZpZXdcbmZvciBhY2N1cmF0ZSBzdGFydC1vZi10ZXh0YmxvY2sgZGV0ZWN0aW9uIGlmIGdpdmVuLlxuKi9cbmNvbnN0IGpvaW5Gb3J3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCAkY3Vyc29yID0gYXRCbG9ja0VuZChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QWZ0ZXIoJGN1cnNvcik7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBhZnRlciB0aGlzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG9cbiAgICBpZiAoISRjdXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlcjtcbiAgICAvLyBUcnkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgaWYgKGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoLCAxKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gSWYgdGhlIG5vZGUgYWJvdmUgaGFzIG5vIGNvbnRlbnQgYW5kIHRoZSBub2RlIGJlbG93IGlzXG4gICAgLy8gc2VsZWN0YWJsZSwgZGVsZXRlIHRoZSBub2RlIGFib3ZlIGFuZCBzZWxlY3QgdGhlIG9uZSBiZWxvdy5cbiAgICBpZiAoJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplID09IDAgJiZcbiAgICAgICAgKHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIpIHx8IE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGFmdGVyKSkpIHtcbiAgICAgICAgbGV0IGRlbFN0ZXAgPSByZXBsYWNlU3RlcChzdGF0ZS5kb2MsICRjdXJzb3IuYmVmb3JlKCksICRjdXJzb3IuYWZ0ZXIoKSwgU2xpY2UuZW1wdHkpO1xuICAgICAgICBpZiAoZGVsU3RlcCAmJiBkZWxTdGVwLnNsaWNlLnNpemUgPCBkZWxTdGVwLnRvIC0gZGVsU3RlcC5mcm9tKSB7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKGRlbFN0ZXApO1xuICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbih0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiKSA/IFNlbGVjdGlvbi5maW5kRnJvbSh0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcykpLCAxKVxuICAgICAgICAgICAgICAgICAgICA6IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgdHIubWFwcGluZy5tYXAoJGN1dC5wb3MpKSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiB0aGUgbmV4dCBub2RlIGlzIGFuIGF0b20sIGRlbGV0ZSBpdFxuICAgIGlmIChhZnRlci5pc0F0b20gJiYgJGN1dC5kZXB0aCA9PSAkY3Vyc29yLmRlcHRoIC0gMSkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5kZWxldGUoJGN1dC5wb3MsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgZW5kIG9mIGEgdGV4dGJsb2NrLCBzZWxlY3RcbnRoZSBub2RlIGNvbWluZyBhZnRlciB0aGF0IHRleHRibG9jaywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW50ZW5kZWRcbnRvIGJlIGJvdW5kIHRvIGtleXMgbGlrZSBkZWxldGUsIGFmdGVyXG5bYGpvaW5Gb3J3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5Gb3J3YXJkKSBhbmQgc2ltaWxhciBkZWxldGluZ1xuY29tbWFuZHMsIHRvIHByb3ZpZGUgYSBmYWxsLWJhY2sgYmVoYXZpb3Igd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3RcbmFsbG93IGRlbGV0aW9uIGF0IHRoZSBzZWxlY3RlZCBwb2ludC5cbiovXG5jb25zdCBzZWxlY3ROb2RlRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgeyAkaGVhZCwgZW1wdHkgfSA9IHN0YXRlLnNlbGVjdGlvbiwgJGN1dCA9ICRoZWFkO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGhlYWQucGFyZW50LmlzVGV4dGJsb2NrKSB7XG4gICAgICAgIGlmICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJmb3J3YXJkXCIsIHN0YXRlKSA6ICRoZWFkLnBhcmVudE9mZnNldCA8ICRoZWFkLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICRjdXQgPSBmaW5kQ3V0QWZ0ZXIoJGhlYWQpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9ICRjdXQgJiYgJGN1dC5ub2RlQWZ0ZXI7XG4gICAgaWYgKCFub2RlIHx8ICFOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHN0YXRlLmRvYywgJGN1dC5wb3MpKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBmaW5kQ3V0QWZ0ZXIoJHBvcykge1xuICAgIGlmICghJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRwb3Mubm9kZShpKTtcbiAgICAgICAgICAgIGlmICgkcG9zLmluZGV4KGkpICsgMSA8IHBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmRvYy5yZXNvbHZlKCRwb3MuYWZ0ZXIoaSArIDEpKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG5Kb2luIHRoZSBzZWxlY3RlZCBibG9jayBvciwgaWYgdGhlcmUgaXMgYSB0ZXh0IHNlbGVjdGlvbiwgdGhlXG5jbG9zZXN0IGFuY2VzdG9yIGJsb2NrIG9mIHRoZSBzZWxlY3Rpb24gdGhhdCBjYW4gYmUgam9pbmVkLCB3aXRoXG50aGUgc2libGluZyBhYm92ZSBpdC5cbiovXG5jb25zdCBqb2luVXAgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgbm9kZVNlbCA9IHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24sIHBvaW50O1xuICAgIGlmIChub2RlU2VsKSB7XG4gICAgICAgIGlmIChzZWwubm9kZS5pc1RleHRibG9jayB8fCAhY2FuSm9pbihzdGF0ZS5kb2MsIHNlbC5mcm9tKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcG9pbnQgPSBzZWwuZnJvbTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBvaW50ID0gam9pblBvaW50KHN0YXRlLmRvYywgc2VsLmZyb20sIC0xKTtcbiAgICAgICAgaWYgKHBvaW50ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5qb2luKHBvaW50KTtcbiAgICAgICAgaWYgKG5vZGVTZWwpXG4gICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBwb2ludCAtIHN0YXRlLmRvYy5yZXNvbHZlKHBvaW50KS5ub2RlQmVmb3JlLm5vZGVTaXplKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkpvaW4gdGhlIHNlbGVjdGVkIGJsb2NrLCBvciB0aGUgY2xvc2VzdCBhbmNlc3RvciBvZiB0aGUgc2VsZWN0aW9uXG50aGF0IGNhbiBiZSBqb2luZWQsIHdpdGggdGhlIHNpYmxpbmcgYWZ0ZXIgaXQuXG4qL1xuY29uc3Qgam9pbkRvd24gPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgcG9pbnQ7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHNlbC5ub2RlLmlzVGV4dGJsb2NrIHx8ICFjYW5Kb2luKHN0YXRlLmRvYywgc2VsLnRvKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcG9pbnQgPSBzZWwudG87XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHNlbC50bywgMSk7XG4gICAgICAgIGlmIChwb2ludCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmpvaW4ocG9pbnQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuTGlmdCB0aGUgc2VsZWN0ZWQgYmxvY2ssIG9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGJsb2NrIG9mIHRoZVxuc2VsZWN0aW9uIHRoYXQgY2FuIGJlIGxpZnRlZCwgb3V0IG9mIGl0cyBwYXJlbnQgbm9kZS5cbiovXG5jb25zdCBsaWZ0ID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSBub2RlIHdob3NlIHR5cGUgaGFzIGEgdHJ1dGh5XG5bYGNvZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29kZSkgcHJvcGVydHkgaW4gaXRzIHNwZWMsIHJlcGxhY2UgdGhlXG5zZWxlY3Rpb24gd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyLlxuKi9cbmNvbnN0IG5ld2xpbmVJbkNvZGUgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnBhcmVudC50eXBlLnNwZWMuY29kZSB8fCAhJGhlYWQuc2FtZVBhcmVudCgkYW5jaG9yKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuaW5zZXJ0VGV4dChcIlxcblwiKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBkZWZhdWx0QmxvY2tBdChtYXRjaCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2guZWRnZUNvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IHsgdHlwZSB9ID0gbWF0Y2guZWRnZShpKTtcbiAgICAgICAgaWYgKHR5cGUuaXNUZXh0YmxvY2sgJiYgIXR5cGUuaGFzUmVxdWlyZWRBdHRycygpKVxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG5XaGVuIHRoZSBzZWxlY3Rpb24gaXMgaW4gYSBub2RlIHdpdGggYSB0cnV0aHlcbltgY29kZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5jb2RlKSBwcm9wZXJ0eSBpbiBpdHMgc3BlYywgY3JlYXRlIGFcbmRlZmF1bHQgYmxvY2sgYWZ0ZXIgdGhlIGNvZGUgYmxvY2ssIGFuZCBtb3ZlIHRoZSBjdXJzb3IgdGhlcmUuXG4qL1xuY29uc3QgZXhpdENvZGUgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnBhcmVudC50eXBlLnNwZWMuY29kZSB8fCAhJGhlYWQuc2FtZVBhcmVudCgkYW5jaG9yKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBhYm92ZSA9ICRoZWFkLm5vZGUoLTEpLCBhZnRlciA9ICRoZWFkLmluZGV4QWZ0ZXIoLTEpLCB0eXBlID0gZGVmYXVsdEJsb2NrQXQoYWJvdmUuY29udGVudE1hdGNoQXQoYWZ0ZXIpKTtcbiAgICBpZiAoIXR5cGUgfHwgIWFib3ZlLmNhblJlcGxhY2VXaXRoKGFmdGVyLCBhZnRlciwgdHlwZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHBvcyA9ICRoZWFkLmFmdGVyKCksIHRyID0gc3RhdGUudHIucmVwbGFjZVdpdGgocG9zLCBwb3MsIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHBvcyksIDEpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgYSBibG9jayBub2RlIGlzIHNlbGVjdGVkLCBjcmVhdGUgYW4gZW1wdHkgcGFyYWdyYXBoIGJlZm9yZSAoaWZcbml0IGlzIGl0cyBwYXJlbnQncyBmaXJzdCBjaGlsZCkgb3IgYWZ0ZXIgaXQuXG4qL1xuY29uc3QgY3JlYXRlUGFyYWdyYXBoTmVhciA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uLCB7ICRmcm9tLCAkdG8gfSA9IHNlbDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgQWxsU2VsZWN0aW9uIHx8ICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50IHx8ICR0by5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB0eXBlID0gZGVmYXVsdEJsb2NrQXQoJHRvLnBhcmVudC5jb250ZW50TWF0Y2hBdCgkdG8uaW5kZXhBZnRlcigpKSk7XG4gICAgaWYgKCF0eXBlIHx8ICF0eXBlLmlzVGV4dGJsb2NrKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBzaWRlID0gKCEkZnJvbS5wYXJlbnRPZmZzZXQgJiYgJHRvLmluZGV4KCkgPCAkdG8ucGFyZW50LmNoaWxkQ291bnQgPyAkZnJvbSA6ICR0bykucG9zO1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5pbnNlcnQoc2lkZSwgdHlwZS5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBzaWRlICsgMSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiB0aGUgY3Vyc29yIGlzIGluIGFuIGVtcHR5IHRleHRibG9jayB0aGF0IGNhbiBiZSBsaWZ0ZWQsIGxpZnQgdGhlXG5ibG9jay5cbiovXG5jb25zdCBsaWZ0RW1wdHlCbG9jayA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICgkY3Vyc29yLmRlcHRoID4gMSAmJiAkY3Vyc29yLmFmdGVyKCkgIT0gJGN1cnNvci5lbmQoLTEpKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSAkY3Vyc29yLmJlZm9yZSgpO1xuICAgICAgICBpZiAoY2FuU3BsaXQoc3RhdGUuZG9jLCBiZWZvcmUpKSB7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc3BsaXQoYmVmb3JlKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByYW5nZSA9ICRjdXJzb3IuYmxvY2tSYW5nZSgpLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5DcmVhdGUgYSB2YXJpYW50IG9mIFtgc3BsaXRCbG9ja2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5zcGxpdEJsb2NrKSB0aGF0IHVzZXNcbmEgY3VzdG9tIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiB0aGUgbmV3bHkgc3BsaXQgb2ZmIGJsb2NrLlxuKi9cbmZ1bmN0aW9uIHNwbGl0QmxvY2tBcyhzcGxpdE5vZGUpIHtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHN0YXRlLnNlbGVjdGlvbi5ub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgIGlmICghJGZyb20ucGFyZW50T2Zmc2V0IHx8ICFjYW5TcGxpdChzdGF0ZS5kb2MsICRmcm9tLnBvcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNwbGl0KCRmcm9tLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISRmcm9tLmRlcHRoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgdHlwZXMgPSBbXTtcbiAgICAgICAgbGV0IHNwbGl0RGVwdGgsIGRlZmx0LCBhdEVuZCA9IGZhbHNlLCBhdFN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aDs7IGQtLSkge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkZnJvbS5ub2RlKGQpO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgICAgIGF0RW5kID0gJGZyb20uZW5kKGQpID09ICRmcm9tLnBvcyArICgkZnJvbS5kZXB0aCAtIGQpO1xuICAgICAgICAgICAgICAgIGF0U3RhcnQgPSAkZnJvbS5zdGFydChkKSA9PSAkZnJvbS5wb3MgLSAoJGZyb20uZGVwdGggLSBkKTtcbiAgICAgICAgICAgICAgICBkZWZsdCA9IGRlZmF1bHRCbG9ja0F0KCRmcm9tLm5vZGUoZCAtIDEpLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoZCAtIDEpKSk7XG4gICAgICAgICAgICAgICAgbGV0IHNwbGl0VHlwZSA9IHNwbGl0Tm9kZSAmJiBzcGxpdE5vZGUoJHRvLnBhcmVudCwgYXRFbmQsICRmcm9tKTtcbiAgICAgICAgICAgICAgICB0eXBlcy51bnNoaWZ0KHNwbGl0VHlwZSB8fCAoYXRFbmQgJiYgZGVmbHQgPyB7IHR5cGU6IGRlZmx0IH0gOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgc3BsaXREZXB0aCA9IGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZCA9PSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHlwZXMudW5zaGlmdChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gfHwgc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgQWxsU2VsZWN0aW9uKVxuICAgICAgICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICAgIGxldCBzcGxpdFBvcyA9IHRyLm1hcHBpbmcubWFwKCRmcm9tLnBvcyk7XG4gICAgICAgIGxldCBjYW4gPSBjYW5TcGxpdCh0ci5kb2MsIHNwbGl0UG9zLCB0eXBlcy5sZW5ndGgsIHR5cGVzKTtcbiAgICAgICAgaWYgKCFjYW4pIHtcbiAgICAgICAgICAgIHR5cGVzWzBdID0gZGVmbHQgPyB7IHR5cGU6IGRlZmx0IH0gOiBudWxsO1xuICAgICAgICAgICAgY2FuID0gY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgdHlwZXMubGVuZ3RoLCB0eXBlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjYW4pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRyLnNwbGl0KHNwbGl0UG9zLCB0eXBlcy5sZW5ndGgsIHR5cGVzKTtcbiAgICAgICAgaWYgKCFhdEVuZCAmJiBhdFN0YXJ0ICYmICRmcm9tLm5vZGUoc3BsaXREZXB0aCkudHlwZSAhPSBkZWZsdCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gdHIubWFwcGluZy5tYXAoJGZyb20uYmVmb3JlKHNwbGl0RGVwdGgpKSwgJGZpcnN0ID0gdHIuZG9jLnJlc29sdmUoZmlyc3QpO1xuICAgICAgICAgICAgaWYgKGRlZmx0ICYmICRmcm9tLm5vZGUoc3BsaXREZXB0aCAtIDEpLmNhblJlcGxhY2VXaXRoKCRmaXJzdC5pbmRleCgpLCAkZmlyc3QuaW5kZXgoKSArIDEsIGRlZmx0KSlcbiAgICAgICAgICAgICAgICB0ci5zZXROb2RlTWFya3VwKHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZShzcGxpdERlcHRoKSksIGRlZmx0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuU3BsaXQgdGhlIHBhcmVudCBibG9jayBvZiB0aGUgc2VsZWN0aW9uLiBJZiB0aGUgc2VsZWN0aW9uIGlzIGEgdGV4dFxuc2VsZWN0aW9uLCBhbHNvIGRlbGV0ZSBpdHMgY29udGVudC5cbiovXG5jb25zdCBzcGxpdEJsb2NrID0gc3BsaXRCbG9ja0FzKCk7XG4vKipcbkFjdHMgbGlrZSBbYHNwbGl0QmxvY2tgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuc3BsaXRCbG9jayksIGJ1dCB3aXRob3V0XG5yZXNldHRpbmcgdGhlIHNldCBvZiBhY3RpdmUgbWFya3MgYXQgdGhlIGN1cnNvci5cbiovXG5jb25zdCBzcGxpdEJsb2NrS2VlcE1hcmtzID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIHJldHVybiBzcGxpdEJsb2NrKHN0YXRlLCBkaXNwYXRjaCAmJiAodHIgPT4ge1xuICAgICAgICBsZXQgbWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcyB8fCAoc3RhdGUuc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc3RhdGUuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpO1xuICAgICAgICBpZiAobWFya3MpXG4gICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9KSk7XG59O1xuLyoqXG5Nb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlIG5vZGUgd3JhcHBpbmcgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBpZlxuYW55LiAoV2lsbCBub3Qgc2VsZWN0IHRoZSBkb2N1bWVudCBub2RlLilcbiovXG5jb25zdCBzZWxlY3RQYXJlbnROb2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRmcm9tLCB0byB9ID0gc3RhdGUuc2VsZWN0aW9uLCBwb3M7XG4gICAgbGV0IHNhbWUgPSAkZnJvbS5zaGFyZWREZXB0aCh0byk7XG4gICAgaWYgKHNhbWUgPT0gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHBvcyA9ICRmcm9tLmJlZm9yZShzYW1lKTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsIHBvcykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcblNlbGVjdCB0aGUgd2hvbGUgZG9jdW1lbnQuXG4qL1xuY29uc3Qgc2VsZWN0QWxsID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKG5ldyBBbGxTZWxlY3Rpb24oc3RhdGUuZG9jKSkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGpvaW5NYXliZUNsZWFyKHN0YXRlLCAkcG9zLCBkaXNwYXRjaCkge1xuICAgIGxldCBiZWZvcmUgPSAkcG9zLm5vZGVCZWZvcmUsIGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXIsIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgIGlmICghYmVmb3JlIHx8ICFhZnRlciB8fCAhYmVmb3JlLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQoYWZ0ZXIudHlwZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJlZm9yZS5jb250ZW50LnNpemUgJiYgJHBvcy5wYXJlbnQuY2FuUmVwbGFjZShpbmRleCAtIDEsIGluZGV4KSkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5kZWxldGUoJHBvcy5wb3MgLSBiZWZvcmUubm9kZVNpemUsICRwb3MucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghJHBvcy5wYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKSB8fCAhKGFmdGVyLmlzVGV4dGJsb2NrIHx8IGNhbkpvaW4oc3RhdGUuZG9jLCAkcG9zLnBvcykpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5qb2luKCRwb3MucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoLCBkaXIpIHtcbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlLCBhZnRlciA9ICRjdXQubm9kZUFmdGVyLCBjb25uLCBtYXRjaDtcbiAgICBsZXQgaXNvbGF0ZWQgPSBiZWZvcmUudHlwZS5zcGVjLmlzb2xhdGluZyB8fCBhZnRlci50eXBlLnNwZWMuaXNvbGF0aW5nO1xuICAgIGlmICghaXNvbGF0ZWQgJiYgam9pbk1heWJlQ2xlYXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGNhbkRlbEFmdGVyID0gIWlzb2xhdGVkICYmICRjdXQucGFyZW50LmNhblJlcGxhY2UoJGN1dC5pbmRleCgpLCAkY3V0LmluZGV4KCkgKyAxKTtcbiAgICBpZiAoY2FuRGVsQWZ0ZXIgJiZcbiAgICAgICAgKGNvbm4gPSAobWF0Y2ggPSBiZWZvcmUuY29udGVudE1hdGNoQXQoYmVmb3JlLmNoaWxkQ291bnQpKS5maW5kV3JhcHBpbmcoYWZ0ZXIudHlwZSkpICYmXG4gICAgICAgIG1hdGNoLm1hdGNoVHlwZShjb25uWzBdIHx8IGFmdGVyLnR5cGUpLnZhbGlkRW5kKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IGVuZCA9ICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUsIHdyYXAgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb25uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgIHdyYXAgPSBGcmFnbWVudC5mcm9tKGNvbm5baV0uY3JlYXRlKG51bGwsIHdyYXApKTtcbiAgICAgICAgICAgIHdyYXAgPSBGcmFnbWVudC5mcm9tKGJlZm9yZS5jb3B5KHdyYXApKTtcbiAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKCRjdXQucG9zIC0gMSwgZW5kLCAkY3V0LnBvcywgZW5kLCBuZXcgU2xpY2Uod3JhcCwgMSwgMCksIGNvbm4ubGVuZ3RoLCB0cnVlKSk7XG4gICAgICAgICAgICBsZXQgJGpvaW5BdCA9IHRyLmRvYy5yZXNvbHZlKGVuZCArIDIgKiBjb25uLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoJGpvaW5BdC5ub2RlQWZ0ZXIgJiYgJGpvaW5BdC5ub2RlQWZ0ZXIudHlwZSA9PSBiZWZvcmUudHlwZSAmJlxuICAgICAgICAgICAgICAgIGNhbkpvaW4odHIuZG9jLCAkam9pbkF0LnBvcykpXG4gICAgICAgICAgICAgICAgdHIuam9pbigkam9pbkF0LnBvcyk7XG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHNlbEFmdGVyID0gYWZ0ZXIudHlwZS5zcGVjLmlzb2xhdGluZyB8fCAoZGlyID4gMCAmJiBpc29sYXRlZCkgPyBudWxsIDogU2VsZWN0aW9uLmZpbmRGcm9tKCRjdXQsIDEpO1xuICAgIGxldCByYW5nZSA9IHNlbEFmdGVyICYmIHNlbEFmdGVyLiRmcm9tLmJsb2NrUmFuZ2Uoc2VsQWZ0ZXIuJHRvKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldCA+PSAkY3V0LmRlcHRoKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2FuRGVsQWZ0ZXIgJiYgdGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIiwgdHJ1ZSkgJiYgdGV4dGJsb2NrQXQoYmVmb3JlLCBcImVuZFwiKSkge1xuICAgICAgICBsZXQgYXQgPSBiZWZvcmUsIHdyYXAgPSBbXTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgd3JhcC5wdXNoKGF0KTtcbiAgICAgICAgICAgIGlmIChhdC5pc1RleHRibG9jaylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGF0ID0gYXQubGFzdENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhZnRlclRleHQgPSBhZnRlciwgYWZ0ZXJEZXB0aCA9IDE7XG4gICAgICAgIGZvciAoOyAhYWZ0ZXJUZXh0LmlzVGV4dGJsb2NrOyBhZnRlclRleHQgPSBhZnRlclRleHQuZmlyc3RDaGlsZClcbiAgICAgICAgICAgIGFmdGVyRGVwdGgrKztcbiAgICAgICAgaWYgKGF0LmNhblJlcGxhY2UoYXQuY2hpbGRDb3VudCwgYXQuY2hpbGRDb3VudCwgYWZ0ZXJUZXh0LmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHdyYXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IEZyYWdtZW50LmZyb20od3JhcFtpXS5jb3B5KGVuZCkpO1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKCRjdXQucG9zIC0gd3JhcC5sZW5ndGgsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUsICRjdXQucG9zICsgYWZ0ZXJEZXB0aCwgJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSAtIGFmdGVyRGVwdGgsIG5ldyBTbGljZShlbmQsIHdyYXAubGVuZ3RoLCAwKSwgMCwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2VsZWN0VGV4dGJsb2NrU2lkZShzaWRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgJHBvcyA9IHNpZGUgPCAwID8gc2VsLiRmcm9tIDogc2VsLiR0bztcbiAgICAgICAgbGV0IGRlcHRoID0gJHBvcy5kZXB0aDtcbiAgICAgICAgd2hpbGUgKCRwb3Mubm9kZShkZXB0aCkuaXNJbmxpbmUpIHtcbiAgICAgICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISRwb3Mubm9kZShkZXB0aCkuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsIHNpZGUgPCAwID8gJHBvcy5zdGFydChkZXB0aCkgOiAkcG9zLmVuZChkZXB0aCkpKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcbk1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiovXG5jb25zdCBzZWxlY3RUZXh0YmxvY2tTdGFydCA9IHNlbGVjdFRleHRibG9ja1NpZGUoLTEpO1xuLyoqXG5Nb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgY3VycmVudCB0ZXh0IGJsb2NrLlxuKi9cbmNvbnN0IHNlbGVjdFRleHRibG9ja0VuZCA9IHNlbGVjdFRleHRibG9ja1NpZGUoMSk7XG4vLyBQYXJhbWV0ZXJpemVkIGNvbW1hbmRzXG4vKipcbldyYXAgdGhlIHNlbGVjdGlvbiBpbiBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW5cbmF0dHJpYnV0ZXMuXG4qL1xuZnVuY3Rpb24gd3JhcEluKG5vZGVUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKSwgd3JhcHBpbmcgPSByYW5nZSAmJiBmaW5kV3JhcHBpbmcocmFuZ2UsIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgIGlmICghd3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLndyYXAocmFuZ2UsIHdyYXBwaW5nKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuUmV0dXJucyBhIGNvbW1hbmQgdGhhdCB0cmllcyB0byBzZXQgdGhlIHNlbGVjdGVkIHRleHRibG9ja3MgdG8gdGhlXG5naXZlbiBub2RlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiovXG5mdW5jdGlvbiBzZXRCbG9ja1R5cGUobm9kZVR5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGggJiYgIWFwcGxpY2FibGU7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgJGZyb206IHsgcG9zOiBmcm9tIH0sICR0bzogeyBwb3M6IHRvIH0gfSA9IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXNbaV07XG4gICAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxpY2FibGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2sgfHwgbm9kZS5oYXNNYXJrdXAobm9kZVR5cGUsIGF0dHJzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT0gbm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgJHBvcyA9IHN0YXRlLmRvYy5yZXNvbHZlKHBvcyksIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlID0gJHBvcy5wYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4ICsgMSwgbm9kZVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYXBwbGljYWJsZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7ICRmcm9tOiB7IHBvczogZnJvbSB9LCAkdG86IHsgcG9zOiB0byB9IH0gPSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgIHRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgbm9kZVR5cGUsIGF0dHJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5mdW5jdGlvbiBtYXJrQXBwbGllcyhkb2MsIHJhbmdlcywgdHlwZSwgZW50ZXJBdG9tcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXTtcbiAgICAgICAgbGV0IGNhbiA9ICRmcm9tLmRlcHRoID09IDAgPyBkb2MuaW5saW5lQ29udGVudCAmJiBkb2MudHlwZS5hbGxvd3NNYXJrVHlwZSh0eXBlKSA6IGZhbHNlO1xuICAgICAgICBkb2Mubm9kZXNCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgaWYgKGNhbiB8fCAhZW50ZXJBdG9tcyAmJiBub2RlLmlzQXRvbSAmJiBub2RlLmlzSW5saW5lICYmIHBvcyA+PSAkZnJvbS5wb3MgJiYgcG9zICsgbm9kZS5ub2RlU2l6ZSA8PSAkdG8ucG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhbiA9IG5vZGUuaW5saW5lQ29udGVudCAmJiBub2RlLnR5cGUuYWxsb3dzTWFya1R5cGUodHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY2FuKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUlubGluZUF0b21zKHJhbmdlcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgICRmcm9tLmRvYy5ub2Rlc0JldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0F0b20gJiYgbm9kZS5jb250ZW50LnNpemUgJiYgbm9kZS5pc0lubGluZSAmJiBwb3MgPj0gJGZyb20ucG9zICYmIHBvcyArIG5vZGUubm9kZVNpemUgPD0gJHRvLnBvcykge1xuICAgICAgICAgICAgICAgIGlmIChwb3MgKyAxID4gJGZyb20ucG9zKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU2VsZWN0aW9uUmFuZ2UoJGZyb20sICRmcm9tLmRvYy5yZXNvbHZlKHBvcyArIDEpKSk7XG4gICAgICAgICAgICAgICAgJGZyb20gPSAkZnJvbS5kb2MucmVzb2x2ZShwb3MgKyAxICsgbm9kZS5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgkZnJvbS5wb3MgPCAkdG8ucG9zKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFNlbGVjdGlvblJhbmdlKCRmcm9tLCAkdG8pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHRvZ2dsZXMgdGhlIGdpdmVuIG1hcmsgd2l0aCB0aGVcbmdpdmVuIGF0dHJpYnV0ZXMuIFdpbGwgcmV0dXJuIGBmYWxzZWAgd2hlbiB0aGUgY3VycmVudCBzZWxlY3Rpb25cbmRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1hcmsuIFRoaXMgd2lsbCByZW1vdmUgdGhlIG1hcmsgaWYgYW55IG1hcmtzXG5vZiB0aGF0IHR5cGUgZXhpc3QgaW4gdGhlIHNlbGVjdGlvbiwgb3IgYWRkIGl0IG90aGVyd2lzZS4gSWYgdGhlXG5zZWxlY3Rpb24gaXMgZW1wdHksIHRoaXMgYXBwbGllcyB0byB0aGUgW3N0b3JlZFxubWFya3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5zdG9yZWRNYXJrcykgaW5zdGVhZCBvZiBhIHJhbmdlIG9mIHRoZVxuZG9jdW1lbnQuXG4qL1xuZnVuY3Rpb24gdG9nZ2xlTWFyayhtYXJrVHlwZSwgYXR0cnMgPSBudWxsLCBvcHRpb25zKSB7XG4gICAgbGV0IHJlbW92ZVdoZW5QcmVzZW50ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5yZW1vdmVXaGVuUHJlc2VudCkgIT09IGZhbHNlO1xuICAgIGxldCBlbnRlckF0b21zID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5lbnRlcklubGluZUF0b21zKSAhPT0gZmFsc2U7XG4gICAgbGV0IGRyb3BTcGFjZSA9ICEob3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVXaGl0ZXNwYWNlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyBlbXB0eSwgJGN1cnNvciwgcmFuZ2VzIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmICgoZW1wdHkgJiYgISRjdXJzb3IpIHx8ICFtYXJrQXBwbGllcyhzdGF0ZS5kb2MsIHJhbmdlcywgbWFya1R5cGUsIGVudGVyQXRvbXMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGlmICgkY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtUeXBlLmlzSW5TZXQoc3RhdGUuc3RvcmVkTWFya3MgfHwgJGN1cnNvci5tYXJrcygpKSlcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIucmVtb3ZlU3RvcmVkTWFyayhtYXJrVHlwZSkpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuYWRkU3RvcmVkTWFyayhtYXJrVHlwZS5jcmVhdGUoYXR0cnMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgYWRkLCB0ciA9IHN0YXRlLnRyO1xuICAgICAgICAgICAgICAgIGlmICghZW50ZXJBdG9tcylcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VzID0gcmVtb3ZlSW5saW5lQXRvbXMocmFuZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlV2hlblByZXNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkID0gIXJhbmdlcy5zb21lKHIgPT4gc3RhdGUuZG9jLnJhbmdlSGFzTWFyayhyLiRmcm9tLnBvcywgci4kdG8ucG9zLCBtYXJrVHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkID0gIXJhbmdlcy5ldmVyeShyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtaXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKHIuJGZyb20ucG9zLCByLiR0by5wb3MsIChub2RlLCBwb3MsIHBhcmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyA9ICFtYXJrVHlwZS5pc0luU2V0KG5vZGUubWFya3MpICYmICEhcGFyZW50ICYmIHBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKG5vZGUuaXNUZXh0ICYmIC9eXFxzKiQvLnRlc3Qobm9kZS50ZXh0QmV0d2VlbihNYXRoLm1heCgwLCByLiRmcm9tLnBvcyAtIHBvcyksIE1hdGgubWluKG5vZGUubm9kZVNpemUsIHIuJHRvLnBvcyAtIHBvcykpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbWlzc2luZztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLnJlbW92ZU1hcmsoJGZyb20ucG9zLCAkdG8ucG9zLCBtYXJrVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9ICRmcm9tLnBvcywgdG8gPSAkdG8ucG9zLCBzdGFydCA9ICRmcm9tLm5vZGVBZnRlciwgZW5kID0gJHRvLm5vZGVCZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VTdGFydCA9IGRyb3BTcGFjZSAmJiBzdGFydCAmJiBzdGFydC5pc1RleHQgPyAvXlxccyovLmV4ZWMoc3RhcnQudGV4dClbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZUVuZCA9IGRyb3BTcGFjZSAmJiBlbmQgJiYgZW5kLmlzVGV4dCA/IC9cXHMqJC8uZXhlYyhlbmQudGV4dClbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tICsgc3BhY2VTdGFydCA8IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSBzcGFjZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIC09IHNwYWNlRW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHIuYWRkTWFyayhmcm9tLCB0bywgbWFya1R5cGUuY3JlYXRlKGF0dHJzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHdyYXBEaXNwYXRjaEZvckpvaW4oZGlzcGF0Y2gsIGlzSm9pbmFibGUpIHtcbiAgICByZXR1cm4gKHRyKSA9PiB7XG4gICAgICAgIGlmICghdHIuaXNHZW5lcmljKVxuICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoKHRyKTtcbiAgICAgICAgbGV0IHJhbmdlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyLm1hcHBpbmcubWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcCA9IHRyLm1hcHBpbmcubWFwc1tpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmFuZ2VzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIHJhbmdlc1tqXSA9IG1hcC5tYXAocmFuZ2VzW2pdKTtcbiAgICAgICAgICAgIG1hcC5mb3JFYWNoKChfcywgX2UsIGZyb20sIHRvKSA9PiByYW5nZXMucHVzaChmcm9tLCB0bykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggam9pbmFibGUgcG9pbnRzIGV4aXN0IGluc2lkZSB0aG9zZSByYW5nZXMsXG4gICAgICAgIC8vIGJ5IGNoZWNraW5nIGFsbCBub2RlIGJvdW5kYXJpZXMgaW4gdGhlaXIgcGFyZW50IG5vZGVzLlxuICAgICAgICBsZXQgam9pbmFibGUgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gcmFuZ2VzW2ldLCB0byA9IHJhbmdlc1tpICsgMV07XG4gICAgICAgICAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgZGVwdGggPSAkZnJvbS5zaGFyZWREZXB0aCh0byksIHBhcmVudCA9ICRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAkZnJvbS5pbmRleEFmdGVyKGRlcHRoKSwgcG9zID0gJGZyb20uYWZ0ZXIoZGVwdGggKyAxKTsgcG9zIDw9IHRvOyArK2luZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IGFmdGVyID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICghYWZ0ZXIpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAmJiBqb2luYWJsZS5pbmRleE9mKHBvcykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHBhcmVudC5jaGlsZChpbmRleCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlLnR5cGUgPT0gYWZ0ZXIudHlwZSAmJiBpc0pvaW5hYmxlKGJlZm9yZSwgYWZ0ZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbmFibGUucHVzaChwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgKz0gYWZ0ZXIubm9kZVNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSm9pbiB0aGUgam9pbmFibGUgcG9pbnRzXG4gICAgICAgIGpvaW5hYmxlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGpvaW5hYmxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoY2FuSm9pbih0ci5kb2MsIGpvaW5hYmxlW2ldKSlcbiAgICAgICAgICAgICAgICB0ci5qb2luKGpvaW5hYmxlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgfTtcbn1cbi8qKlxuV3JhcCBhIGNvbW1hbmQgc28gdGhhdCwgd2hlbiBpdCBwcm9kdWNlcyBhIHRyYW5zZm9ybSB0aGF0IGNhdXNlc1xudHdvIGpvaW5hYmxlIG5vZGVzIHRvIGVuZCB1cCBuZXh0IHRvIGVhY2ggb3RoZXIsIHRob3NlIGFyZSBqb2luZWQuXG5Ob2RlcyBhcmUgY29uc2lkZXJlZCBqb2luYWJsZSB3aGVuIHRoZXkgYXJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kXG53aGVuIHRoZSBgaXNKb2luYWJsZWAgcHJlZGljYXRlIHJldHVybnMgdHJ1ZSBmb3IgdGhlbSBvciwgaWYgYW5cbmFycmF5IG9mIHN0cmluZ3Mgd2FzIHBhc3NlZCwgaWYgdGhlaXIgbm9kZSB0eXBlIG5hbWUgaXMgaW4gdGhhdFxuYXJyYXkuXG4qL1xuZnVuY3Rpb24gYXV0b0pvaW4oY29tbWFuZCwgaXNKb2luYWJsZSkge1xuICAgIGxldCBjYW5Kb2luID0gQXJyYXkuaXNBcnJheShpc0pvaW5hYmxlKSA/IChub2RlKSA9PiBpc0pvaW5hYmxlLmluZGV4T2Yobm9kZS50eXBlLm5hbWUpID4gLTFcbiAgICAgICAgOiBpc0pvaW5hYmxlO1xuICAgIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiBjb21tYW5kKHN0YXRlLCBkaXNwYXRjaCAmJiB3cmFwRGlzcGF0Y2hGb3JKb2luKGRpc3BhdGNoLCBjYW5Kb2luKSwgdmlldyk7XG59XG4vKipcbkNvbWJpbmUgYSBudW1iZXIgb2YgY29tbWFuZCBmdW5jdGlvbnMgaW50byBhIHNpbmdsZSBmdW5jdGlvbiAod2hpY2hcbmNhbGxzIHRoZW0gb25lIGJ5IG9uZSB1bnRpbCBvbmUgcmV0dXJucyB0cnVlKS5cbiovXG5mdW5jdGlvbiBjaGFpbkNvbW1hbmRzKC4uLmNvbW1hbmRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjb21tYW5kc1tpXShzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbn1cbmxldCBiYWNrc3BhY2UgPSBjaGFpbkNvbW1hbmRzKGRlbGV0ZVNlbGVjdGlvbiwgam9pbkJhY2t3YXJkLCBzZWxlY3ROb2RlQmFja3dhcmQpO1xubGV0IGRlbCA9IGNoYWluQ29tbWFuZHMoZGVsZXRlU2VsZWN0aW9uLCBqb2luRm9yd2FyZCwgc2VsZWN0Tm9kZUZvcndhcmQpO1xuLyoqXG5BIGJhc2ljIGtleW1hcCBjb250YWluaW5nIGJpbmRpbmdzIG5vdCBzcGVjaWZpYyB0byBhbnkgc2NoZW1hLlxuQmluZHMgdGhlIGZvbGxvd2luZyBrZXlzICh3aGVuIG11bHRpcGxlIGNvbW1hbmRzIGFyZSBsaXN0ZWQsIHRoZXlcbmFyZSBjaGFpbmVkIHdpdGggW2BjaGFpbkNvbW1hbmRzYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmNoYWluQ29tbWFuZHMpKTpcblxuKiAqKkVudGVyKiogdG8gYG5ld2xpbmVJbkNvZGVgLCBgY3JlYXRlUGFyYWdyYXBoTmVhcmAsIGBsaWZ0RW1wdHlCbG9ja2AsIGBzcGxpdEJsb2NrYFxuKiAqKk1vZC1FbnRlcioqIHRvIGBleGl0Q29kZWBcbiogKipCYWNrc3BhY2UqKiBhbmQgKipNb2QtQmFja3NwYWNlKiogdG8gYGRlbGV0ZVNlbGVjdGlvbmAsIGBqb2luQmFja3dhcmRgLCBgc2VsZWN0Tm9kZUJhY2t3YXJkYFxuKiAqKkRlbGV0ZSoqIGFuZCAqKk1vZC1EZWxldGUqKiB0byBgZGVsZXRlU2VsZWN0aW9uYCwgYGpvaW5Gb3J3YXJkYCwgYHNlbGVjdE5vZGVGb3J3YXJkYFxuKiAqKk1vZC1EZWxldGUqKiB0byBgZGVsZXRlU2VsZWN0aW9uYCwgYGpvaW5Gb3J3YXJkYCwgYHNlbGVjdE5vZGVGb3J3YXJkYFxuKiAqKk1vZC1hKiogdG8gYHNlbGVjdEFsbGBcbiovXG5jb25zdCBwY0Jhc2VLZXltYXAgPSB7XG4gICAgXCJFbnRlclwiOiBjaGFpbkNvbW1hbmRzKG5ld2xpbmVJbkNvZGUsIGNyZWF0ZVBhcmFncmFwaE5lYXIsIGxpZnRFbXB0eUJsb2NrLCBzcGxpdEJsb2NrKSxcbiAgICBcIk1vZC1FbnRlclwiOiBleGl0Q29kZSxcbiAgICBcIkJhY2tzcGFjZVwiOiBiYWNrc3BhY2UsXG4gICAgXCJNb2QtQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIlNoaWZ0LUJhY2tzcGFjZVwiOiBiYWNrc3BhY2UsXG4gICAgXCJEZWxldGVcIjogZGVsLFxuICAgIFwiTW9kLURlbGV0ZVwiOiBkZWwsXG4gICAgXCJNb2QtYVwiOiBzZWxlY3RBbGxcbn07XG4vKipcbkEgY29weSBvZiBgcGNCYXNlS2V5bWFwYCB0aGF0IGFsc28gYmluZHMgKipDdHJsLWgqKiBsaWtlIEJhY2tzcGFjZSxcbioqQ3RybC1kKiogbGlrZSBEZWxldGUsICoqQWx0LUJhY2tzcGFjZSoqIGxpa2UgQ3RybC1CYWNrc3BhY2UsIGFuZFxuKipDdHJsLUFsdC1CYWNrc3BhY2UqKiwgKipBbHQtRGVsZXRlKiosIGFuZCAqKkFsdC1kKiogbGlrZVxuQ3RybC1EZWxldGUuXG4qL1xuY29uc3QgbWFjQmFzZUtleW1hcCA9IHtcbiAgICBcIkN0cmwtaFwiOiBwY0Jhc2VLZXltYXBbXCJCYWNrc3BhY2VcIl0sXG4gICAgXCJBbHQtQmFja3NwYWNlXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1CYWNrc3BhY2VcIl0sXG4gICAgXCJDdHJsLWRcIjogcGNCYXNlS2V5bWFwW1wiRGVsZXRlXCJdLFxuICAgIFwiQ3RybC1BbHQtQmFja3NwYWNlXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1EZWxldGVcIl0sXG4gICAgXCJBbHQtRGVsZXRlXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1EZWxldGVcIl0sXG4gICAgXCJBbHQtZFwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtRGVsZXRlXCJdLFxuICAgIFwiQ3RybC1hXCI6IHNlbGVjdFRleHRibG9ja1N0YXJ0LFxuICAgIFwiQ3RybC1lXCI6IHNlbGVjdFRleHRibG9ja0VuZFxufTtcbmZvciAobGV0IGtleSBpbiBwY0Jhc2VLZXltYXApXG4gICAgbWFjQmFzZUtleW1hcFtrZXldID0gcGNCYXNlS2V5bWFwW2tleV07XG5jb25zdCBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyAvTWFjfGlQKGhvbmV8W29hXWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgOiB0eXBlb2Ygb3MgIT0gXCJ1bmRlZmluZWRcIiAmJiBvcy5wbGF0Zm9ybSA/IG9zLnBsYXRmb3JtKCkgPT0gXCJkYXJ3aW5cIiA6IGZhbHNlO1xuLyoqXG5EZXBlbmRpbmcgb24gdGhlIGRldGVjdGVkIHBsYXRmb3JtLCB0aGlzIHdpbGwgaG9sZFxuW2BwY0Jhc2VrZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMucGNCYXNlS2V5bWFwKSBvclxuW2BtYWNCYXNlS2V5bWFwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLm1hY0Jhc2VLZXltYXApLlxuKi9cbmNvbnN0IGJhc2VLZXltYXAgPSBtYWMgPyBtYWNCYXNlS2V5bWFwIDogcGNCYXNlS2V5bWFwO1xuXG5leHBvcnQgeyBhdXRvSm9pbiwgYmFzZUtleW1hcCwgY2hhaW5Db21tYW5kcywgY3JlYXRlUGFyYWdyYXBoTmVhciwgZGVsZXRlU2VsZWN0aW9uLCBleGl0Q29kZSwgam9pbkJhY2t3YXJkLCBqb2luRG93biwgam9pbkZvcndhcmQsIGpvaW5UZXh0YmxvY2tCYWNrd2FyZCwgam9pblRleHRibG9ja0ZvcndhcmQsIGpvaW5VcCwgbGlmdCwgbGlmdEVtcHR5QmxvY2ssIG1hY0Jhc2VLZXltYXAsIG5ld2xpbmVJbkNvZGUsIHBjQmFzZUtleW1hcCwgc2VsZWN0QWxsLCBzZWxlY3ROb2RlQmFja3dhcmQsIHNlbGVjdE5vZGVGb3J3YXJkLCBzZWxlY3RQYXJlbnROb2RlLCBzZWxlY3RUZXh0YmxvY2tFbmQsIHNlbGVjdFRleHRibG9ja1N0YXJ0LCBzZXRCbG9ja1R5cGUsIHNwbGl0QmxvY2ssIHNwbGl0QmxvY2tBcywgc3BsaXRCbG9ja0tlZXBNYXJrcywgdG9nZ2xlTWFyaywgd3JhcEluIH07XG4iLCJpbXBvcnQgeyBQbHVnaW4sIEVkaXRvclN0YXRlLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHtcbiAgbGlmdExpc3RJdGVtLFxuICBzaW5rTGlzdEl0ZW0sXG4gIHdyYXBJbkxpc3QsXG59IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1saXN0JztcbmltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFJlbW92ZU1hcmtTdGVwLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgdW5kbywgcmVkbyB9IGZyb20gJ3Byb3NlbWlycm9yLWhpc3RvcnknO1xuaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBzZWxlY3RQYXJlbnROb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgQ2hlY2tib3hTdGF0dXMgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IEFQUExZX0ZPUk1BVF9BVFRSID0gJ2RhdGEtZm9ybWF0JztcblxudHlwZSBDb21tYW5kID0gdHlwZW9mIHNlbGVjdFBhcmVudE5vZGU7XG5cbi8qKlxuICogU3dhcCB0ZXh0IGJsb2NrcyB0byBhIGdpdmVuIG5vZGUgdHlwZVxuICogVGhpcyBoYW5kbGVzIGxpZnRpbmcgbGlzdCBpdGVtcyBpZiBuZWVkZWQgYmVmb3JlIGNvbnZlcnRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN3YXBUZXh0QmxvY2sodmlldzogRWRpdG9yVmlldywgbm9kZVR5cGU6IE5vZGVUeXBlKTogdm9pZCB7XG4gIGxldCB7IGRpc3BhdGNoLCBzdGF0ZSB9ID0gdmlldztcbiAgbGV0IHsgdHIgfSA9IHN0YXRlO1xuXG4gIGlmIChcbiAgICBub2RlVHlwZSAhPT0gc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0ICYmXG4gICAgbm9kZVR5cGUgIT09IHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3RcbiAgKSB7XG4gICAgbGlmdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCk7XG4gIH1cblxuICAoeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXcpO1xuICAoeyB0ciB9ID0gc3RhdGUpO1xuICBjb25zdCB7XG4gICAgc2VsZWN0aW9uOiB7IGZyb20sIHRvIH0sXG4gIH0gPSBzdGF0ZTtcbiAgdHIuc2V0QmxvY2tUeXBlKGZyb20sIHRvLCBub2RlVHlwZSk7XG4gIGRpc3BhdGNoKHRyKTtcbn1cblxuZXhwb3J0IGNvbnN0IGluZGVudExpc3RJdGVtOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIHJldHVybiAoXG4gICAgc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCkgfHxcbiAgICB3cmFwSW5MaXN0KHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCkoc3RhdGUsIGRpc3BhdGNoKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IG91dGRlbnRMaXN0SXRlbTogQ29tbWFuZCA9IGZ1bmN0aW9uIChcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICBkaXNwYXRjaDogRWRpdG9yVmlld1snZGlzcGF0Y2gnXSB8IHVuZGVmaW5lZCxcbikge1xuICByZXR1cm4gbGlmdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGlzdCB0eXBlIG9mIHRoZSBzZWxlY3Rpb24uXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gb3ZlcmxhcHMgd2l0aCBsaXN0IG5vZGVzIGFuZCBub24tbGlzdCBub2Rlcywgb3IgaWYgaXRcbiAqICAgaW5jbHVkZXMgYW55IHBvcnRpb24gb2YgYSBuZXN0ZWQgbGlzdCwgZG8gbm90aGluZ1xuICogLSBJZiB0aGUgc2VsZWN0aW9uIGlzIG5vdCBhIGxpc3QsIGNoYW5nZSBpdCBpbnRvIG9uZVxuICogLSBJZiB0aGUgc2VsZWN0aW9uIGlzIGEgbGlzdCBidXQgbm90IHRoZSBkZXNpcmVkIGxpc3QgdHlwZSwgY2hhbmdlIGl0IGludG9cbiAqICAgdGhlIGRlc2lyZWQgbGlzdCB0eXBlXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHBhc3NlZCBpbiBsaXN0IHR5cGUsIGNoYW5nZSBpdCBpbnRvIGEgcGFyYWdyYXBoXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMaXN0ID0gZnVuY3Rpb24gKFxuICB2aWV3OiBFZGl0b3JWaWV3LFxuICBsaXN0VHlwZTogTm9kZVR5cGUsXG4gIGl0ZW1UeXBlOiBOb2RlVHlwZSxcbik6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHNlbGVjdGlvbjogeyAkZnJvbSwgJHRvIH0sXG4gICAgfSxcbiAgfSA9IHZpZXc7XG5cbiAgY29uc3QgbGlzdEJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKFxuICAgICR0byxcbiAgICAobm9kZSkgPT4gbm9kZS50eXBlID09PSBsaXN0VHlwZSxcbiAgKTtcbiAgaWYgKGxpc3RCbG9ja1JhbmdlKSB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyB3aXRoIGEgbGlzdCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBsaXN0LCBkb1xuICAgIC8vIG5vdGhpbmcuIERlcHRoIG9mIDIgYWNjb3VudHMgZm9yIHRoZSBsaXN0IG5vZGUgYW5kIHRoZSBsaXN0IGl0ZW0gbm9kZS5cbiAgICBpZiAobGlzdEJsb2NrUmFuZ2UuZGVwdGggPiAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXc7XG5cbiAgICBsZXQgY29udGFpbnNOZXN0ZWRMaXN0ID0gZmFsc2U7XG4gICAgY29uc3QgJHJhbmdlU3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShsaXN0QmxvY2tSYW5nZS5zdGFydCk7XG4gICAgY29uc3QgJHJhbmdlRW5kID0gc3RhdGUuZG9jLnJlc29sdmUobGlzdEJsb2NrUmFuZ2UuZW5kKTtcbiAgICBsaXN0QmxvY2tSYW5nZS5wYXJlbnQubm9kZXNCZXR3ZWVuKFxuICAgICAgJHJhbmdlU3RhcnQucGFyZW50T2Zmc2V0LFxuICAgICAgJHJhbmdlRW5kLnBhcmVudE9mZnNldCxcbiAgICAgIChub2RlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdub2RlJywgbm9kZS50eXBlLm5hbWUsIG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGFpbnNOZXN0ZWRMaXN0IHx8IG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0IHx8XG4gICAgICAgICAgbm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRhaW5zTmVzdGVkTGlzdCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKGNvbnRhaW5zTmVzdGVkTGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW50aXJlbHkgd2l0aGluIGEgbGlzdCBsaWZ0IHRoZSBzZWxlY3RlZCBpdGVtcyBvdXRcbiAgICBsaWZ0TGlzdEl0ZW0oaXRlbVR5cGUpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG4gICAgZm9yIChcbiAgICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICAgIGluZGV4ICs9IDFcbiAgICApIHtcbiAgICAgIGlmIChibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCkudHlwZSA9PT0gbGlzdFR5cGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBwYXJ0aWFsbHkgaW5zaWRlIGEgbGlzdCwgZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW50aXJlbHkgb3V0c2lkZSBhIGxpc3QsIGNvbnZlcnQgZXZlcnl0aGluZyB0byBhIHBhcmFncmFwaFxuICAgIC8vIHNvIGl0IGNhbiBzdWJzZXF1ZW50bHkgYmVjb21lIGEgbGlzdFxuICAgIHN3YXBUZXh0QmxvY2sodmlldywgc2NoZW1hLm5vZGVzLnBhcmFncmFwaCk7XG4gICAgY29uc3QgeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXc7XG4gICAgd3JhcEluTGlzdChsaXN0VHlwZSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgfVxufTtcblxuY29uc3QgdG9nZ2xlQ2hlY2tsaXN0SXRlbVN0YXRlOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuXG4gIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG5cbiAgbGV0IGhhc0NoZWNrZWQgPSBmYWxzZTtcbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXgsIGNoaWxkID0gYmxvY2tSYW5nZS5wYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICBpbmRleCArPSAxXG4gICkge1xuICAgIGlmIChjaGlsZC50eXBlICE9PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSkge1xuICAgICAgaGFzQ2hlY2tlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXgsXG4gICAgICBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KSxcbiAgICAgIHBvcyA9IGJsb2NrUmFuZ2Uuc3RhcnQ7XG4gICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgIGluZGV4ICs9IDFcbiAgKSB7XG4gICAgdHIuc2V0Tm9kZU1hcmt1cChwb3MsIHVuZGVmaW5lZCwge1xuICAgICAgc3RhdHVzOiBoYXNDaGVja2VkID8gQ2hlY2tib3hTdGF0dXMuRU1QVFkgOiBDaGVja2JveFN0YXR1cy5ET05FLFxuICAgIH0pO1xuICAgIHBvcyArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgfVxuXG4gIGRpc3BhdGNoKHRyKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG50eXBlIG1vZGFsQ29uZmlybUhhbmRsZXIgPSAocGFyYW1zOiB7IHRleHQ6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuY2xhc3MgTGlua01vZGFsIHtcbiAgcHJpdmF0ZSBlbDogRWxlbWVudDtcbiAgcHJpdmF0ZSBmcmFtZUVsOiBFbGVtZW50O1xuICBwcml2YXRlIHRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSB1cmw6IHN0cmluZztcbiAgcHJpdmF0ZSBvbkNvbmZpcm06IG1vZGFsQ29uZmlybUhhbmRsZXI7XG4gIHByaXZhdGUgb25DbGVhcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgc2hvd0NscyA9ICdhY3RpdmUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsOiBFbGVtZW50LFxuICAgIHtcbiAgICAgIG9uQ29uZmlybSxcbiAgICAgIG9uQ2xlYXIsXG4gICAgICB0ZXh0LFxuICAgICAgdXJsLFxuICAgIH06IHtcbiAgICAgIG9uQ2xlYXI/OiAoKSA9PiB2b2lkO1xuICAgICAgb25Db25maXJtOiBtb2RhbENvbmZpcm1IYW5kbGVyO1xuICAgICAgdGV4dDogc3RyaW5nO1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMudGV4dElucHV0LnZhbHVlID0gdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLnVybElucHV0LnZhbHVlID0gdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5vbkNvbmZpcm0gPSBvbkNvbmZpcm07XG4gICAgdGhpcy5vbkNsZWFyID0gb25DbGVhcjtcbiAgICB0aGlzLmZyYW1lRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcjZnJhbWUnKTtcblxuICAgIGlmIChvbkNsZWFyKSB7XG4gICAgICB0aGlzLmNsZWFyQnRuLmNsYXNzTGlzdC5hZGQodGhpcy5zaG93Q2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckJ0bi5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2hvd0Nscyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKHRoaXMuc2hvd0Nscyk7XG4gICAgdGhpcy5jb25maXJtQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDb25maXJtKTtcbiAgICB0aGlzLmNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FuY2VsKTtcbiAgICB0aGlzLmNsZWFyQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGVhcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlR2xvYmFsS2V5ZG93bik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUdsb2JhbENsaWNrKTtcbiAgICB0aGlzLnVybElucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSA9ICgpID0+IHtcbiAgICB0aGlzLmNvbmZpcm1CdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNvbmZpcm0pO1xuICAgIHRoaXMuY2FuY2VsQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYW5jZWwpO1xuICAgIHRoaXMuY2xlYXJCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsZWFyKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVHbG9iYWxLZXlkb3duKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5zaG93Q2xzKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNvbmZpcm0gPSAoKSA9PiB7XG4gICAgdGhpcy5vbkNvbmZpcm0oe1xuICAgICAgdGV4dDogdGhpcy50ZXh0SW5wdXQudmFsdWUsXG4gICAgICB1cmw6IHRoaXMudXJsSW5wdXQudmFsdWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNsZWFyID0gKCkgPT4ge1xuICAgIHRoaXMub25DbGVhcigpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsS2V5ZG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFbnRlciA9IGUua2V5ID09PSAnRW50ZXInO1xuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGV4dElucHV0IHx8XG4gICAgICAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy51cmxJbnB1dCAmJiBpc0VudGVyKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVDb25maXJtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzRXNjID0gZS5rZXkgPT09ICdFc2NhcGUnO1xuICAgIGlmIChpc0VzYykge1xuICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVHbG9iYWxDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuZnJhbWVFbC5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG5cbiAgZ2V0IHRleHRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCN0ZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgfVxuXG4gIGdldCB1cmxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCN1cmwnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgZ2V0IGNvbmZpcm1CdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignYnV0dG9uI2NvbmZpcm0nKTtcbiAgfVxuXG4gIGdldCBjYW5jZWxCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignYnV0dG9uI2NhbmNlbCcpO1xuICB9XG5cbiAgZ2V0IGNsZWFyQnRuKCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiNjbGVhcicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUb29sYmFyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSB2aWV3OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIG1vZGFsRWw6IEVsZW1lbnQ7XG4gIHByaXZhdGUgdG9vbGJhckVsOiBFbGVtZW50O1xuICBwcml2YXRlIG1vZGFsOiBMaW5rTW9kYWw7XG5cbiAgcHJpdmF0ZSBzd2FwVGV4dEJsb2NrID0gKG5vZGVUeXBlOiBOb2RlVHlwZSkgPT4ge1xuICAgIHN3YXBUZXh0QmxvY2sodGhpcy52aWV3LCBub2RlVHlwZSk7XG4gICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwcm9tb3RlSGVhZGluZyA9IChzdGF0ZTogRWRpdG9yU3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlO1xuICAgIGlmICghc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgICRmcm9tOiB7XG4gICAgICAgIHBhcmVudDogeyB0eXBlIH0sXG4gICAgICB9LFxuICAgIH0gPSBzZWxlY3Rpb247XG4gICAgbGV0IG5leHRUeXBlOiBOb2RlVHlwZTtcbiAgICBpZiAodHlwZSA9PT0gc2NoZW1hLm5vZGVzLmhlYWRpbmcyKSB7XG4gICAgICBuZXh0VHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMykge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMuaGVhZGluZzI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBzY2hlbWEubm9kZXMuaGVhZGluZzEpIHtcbiAgICAgIG5leHRUeXBlID0gc2NoZW1hLm5vZGVzLnBhcmFncmFwaDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMuaGVhZGluZzM7XG4gICAgfVxuICAgIHRoaXMuc3dhcFRleHRCbG9jayhuZXh0VHlwZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0b2dnbGVMaXN0ID0gKGxpc3RUeXBlOiBOb2RlVHlwZSwgaXRlbVR5cGU6IE5vZGVUeXBlKSA9PiB7XG4gICAgdG9nZ2xlTGlzdCh0aGlzLnZpZXcsIGxpc3RUeXBlLCBpdGVtVHlwZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0b2dnbGVDaGVja2xpc3RJdGVtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZGlzcGF0Y2gsIHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyBkb2MsIHRyIH0gPSBzdGF0ZTtcbiAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBjb25zdCBibG9ja1JhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pO1xuXG4gICAgZm9yIChcbiAgICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICAgIGluZGV4ICs9IDFcbiAgICApIHtcbiAgICAgIGlmIChibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCkudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtKSB7XG4gICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN3YXBUZXh0QmxvY2soc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtKTtcbiAgfTtcblxuICBwcml2YXRlIGFjdGl2YXRlTGlua01vZGFsOiBDb21tYW5kID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgZG9jLCBzZWxlY3Rpb24gfSA9IHN0YXRlO1xuICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc2VsZWN0aW9uO1xuICAgIGNvbnN0IGxpbmtNYXJrQXRTdGFydCA9ICRmcm9tXG4gICAgICAubWFya3MoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChtYXJrKSA9PlxuICAgICAgICAgIG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmsgJiYgIW1hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdLFxuICAgICAgKTtcbiAgICBjb25zdCBsaW5rTWFya0F0RW5kID0gJHRvXG4gICAgICAubWFya3MoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChtYXJrKSA9PlxuICAgICAgICAgIG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmsgJiYgIW1hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdLFxuICAgICAgKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Jc0luc2lkZUxpbmsgPSBsaW5rTWFya0F0U3RhcnQgJiYgbGlua01hcmtBdEVuZDtcblxuICAgIGlmIChzZWxlY3Rpb24uZW1wdHkgJiYgIXNlbGVjdGlvbklzSW5zaWRlTGluaykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGlua01hcmtBdFN0YXJ0ICE9PSBsaW5rTWFya0F0RW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZGlzcGF0Y2gpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmsgPSBsaW5rTWFya0F0U3RhcnQ7XG4gICAgbGV0IGVuZCwgc3RhcnQsIHRleHQsIHVybDtcbiAgICBpZiAobWFyaykge1xuICAgICAgY29uc3QgdGV4dE5vZGUgPSAkZnJvbS5wYXJlbnQubm9kZUF0KFxuICAgICAgICAkZnJvbS5wYXJlbnRPZmZzZXQgLSAkZnJvbS50ZXh0T2Zmc2V0LFxuICAgICAgKTtcbiAgICAgIHN0YXJ0ID0gJGZyb20ucG9zIC0gJGZyb20udGV4dE9mZnNldDtcbiAgICAgIGVuZCA9IHN0YXJ0ICsgdGV4dE5vZGUubm9kZVNpemU7XG4gICAgICB0ZXh0ID0gdGV4dE5vZGUudGV4dDtcbiAgICAgIHVybCA9IG1hcmsuYXR0cnMuaHJlZjtcbiAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKFxuICAgICAgICBkb2MucmVzb2x2ZShzdGFydCksXG4gICAgICAgIGRvYy5yZXNvbHZlKGVuZCksXG4gICAgICApO1xuICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSAkdG8ucG9zO1xuICAgICAgc3RhcnQgPSAkZnJvbS5wb3M7XG4gICAgICB0ZXh0ID0gc3RhdGUuZG9jLnRleHRCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcyk7XG4gICAgICB1cmwgPSAnJztcbiAgICB9XG5cbiAgICBjb25zdCBvbkNsZWFyID1cbiAgICAgIG1hcmsgJiZcbiAgICAgICgoKSA9PlxuICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goXG4gICAgICAgICAgdGhpcy52aWV3LnN0YXRlLnRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmspKSxcbiAgICAgICAgKSk7XG5cbiAgICB0aGlzLm1vZGFsID0gbmV3IExpbmtNb2RhbCh0aGlzLm1vZGFsRWwsIHtcbiAgICAgIG9uQ2xlYXIsXG4gICAgICBvbkNvbmZpcm06ICh7IHRleHQsIHVybCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBzY2hlbWEubWFya3MubGluay5jcmVhdGUoeyBocmVmOiB1cmwgfSk7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gc2NoZW1hLnRleHQodGV4dCwgW21hcmtdKTtcbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKFxuICAgICAgICAgIHRoaXMudmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aCh0ZXh0Tm9kZSwgZmFsc2UpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHRleHQsXG4gICAgICB1cmwsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZU1hcmsgPSAobWFyazogTWFya1R5cGUpID0+IHtcbiAgICB0b2dnbGVNYXJrKG1hcmspKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcih0b29sYmFyRWw6IEVsZW1lbnQsIG1vZGFsRWw6IEVsZW1lbnQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2aWV3OiAodmlld0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXdJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5tb2RhbEVsID0gbW9kYWxFbDtcbiAgICAgICAgdGhpcy50b29sYmFyRWwgPSB0b29sYmFyRWw7XG5cbiAgICAgICAgdG9vbGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVUb29sYmFyQ2xpY2spO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgdG9vbGJhckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVUb29sYmFyQ2xpY2spO1xuICAgICAgICAgICAgdGhpcy51bmhpZ2hsaWdodFNlbGVjdGVkQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMubW9kYWw/LmRlc3Ryb3koKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZTogKHZpZXcsIF9wcmV2aW91c1N0YXRlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2xiYXJGb3JTZWxlY3Rpb24odmlldy5zdGF0ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBwcm9wczoge1xuICAgICAgICBoYW5kbGVLZXlEb3duOiAoX3ZpZXcsIGUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNDdHJsID0gZS5jdHJsS2V5O1xuICAgICAgICAgIGNvbnN0IGhhc01vZCA9IGUubWV0YUtleTtcbiAgICAgICAgICBjb25zdCBoYXNTaGlmdCA9IGUuc2hpZnRLZXk7XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICBpbmRlbnRMaXN0SXRlbSh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICdoJykge1xuICAgICAgICAgICAgb3V0ZGVudExpc3RJdGVtKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdUYWInICYmICFoYXNDdHJsICYmICFoYXNNb2QpIHtcbiAgICAgICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgICBvdXRkZW50TGlzdEl0ZW0odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaW5kZW50TGlzdEl0ZW0odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAndCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hlY2tsaXN0SXRlbSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc01vZCAmJiBlLmtleSA9PT0gJzcnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ3UnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ28nKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3Qoc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJz0nKSB7XG4gICAgICAgICAgICB0aGlzLnByb21vdGVIZWFkaW5nKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAnaicpIHtcbiAgICAgICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZShcbiAgICAgICAgICAgICAgdGhpcy52aWV3LnN0YXRlLFxuICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd6Jykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdpJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5lbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAnYicpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFyayhzY2hlbWEubWFya3Muc3Ryb25nKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSBcIidcIikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5jb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlVG9vbGJhckZvclNlbGVjdGlvbiA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICB0aGlzLnVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycygpO1xuICAgIGNvbnN0IHNlbGVjdGVkQXR0cnMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0QXR0cnMoc3RhdGUpO1xuICAgIGlmIChzZWxlY3RlZEF0dHJzKSB7XG4gICAgICBzZWxlY3RlZEF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgY29uc3QgYnRuID0gdGhpcy50b29sYmFyRWwucXVlcnlTZWxlY3RvcihgW2RhdGEtZm9ybWF0PSR7YXR0cn1dYCk7XG4gICAgICAgIGlmIChidG4pIHtcbiAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycyA9ICgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEJ0bnMgPSB0aGlzLnRvb2xiYXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBzZWxlY3RlZEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0U2VsZWN0ZWRGb3JtYXRBbmRNYXJrcyA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICBpZiAoIXN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoXG4gICAgICAkdG8sXG4gICAgICAobm9kZSkgPT4gbm9kZS50eXBlICE9PSBzY2hlbWEubm9kZXMubGlzdF9pdGVtLFxuICAgICk7XG5cbiAgICBsZXQgc2VsZWN0ZWQgPSBudWxsO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgICBpbmRleCArPSAxXG4gICAgKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUeXBlID1cbiAgICAgICAgY2hpbGQudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbVxuICAgICAgICAgID8gYmxvY2tSYW5nZS5wYXJlbnQudHlwZVxuICAgICAgICAgIDogY2hpbGQudHlwZTtcblxuICAgICAgaWYgKHNlbGVjdGVkID09PSBudWxsKSB7XG4gICAgICAgIHNlbGVjdGVkID0gY3VycmVudFR5cGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGVkICE9PSBjdXJyZW50VHlwZSkge1xuICAgICAgICBzZWxlY3RlZCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucHVzaChzZWxlY3RlZCk7XG5cbiAgICBsZXQgbWFya3MgPSAkZnJvbS5wb3MgPT09ICR0by5wb3MgPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3MoJHRvKTtcbiAgICBpZiAoc3RhdGUuc2VsZWN0aW9uLmVtcHR5ICYmIHN0YXRlLnN0b3JlZE1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzO1xuICAgIH1cblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ubWFya3MubWFwKChtYXJrKSA9PiBtYXJrLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGdldFNlbGVjdGVkRm9ybWF0QXR0cnMgPSAoc3RhdGU6IEVkaXRvclN0YXRlKSA9PiB7XG4gICAgY29uc3QgW25vZGVUeXBlLCAuLi5tYXJrVHlwZXNdID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEFuZE1hcmtzKHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLmhlYWRpbmcxOlxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuaGVhZGluZzI6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2hlYWRpbmcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGg6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ3BhcmFncmFwaCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0OiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCd1bm9yZGVyZWRfbGlzdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdDoge1xuICAgICAgICByZXN1bHQucHVzaCgnb3JkZXJlZF9saXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW06IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2NoZWNrbGlzdF9pdGVtJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya1R5cGVzLmZvckVhY2goKG1hcmtUeXBlKSA9PiB7XG4gICAgICBzd2l0Y2ggKG1hcmtUeXBlKSB7XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmxpbms6IHtcbiAgICAgICAgICByZXN1bHQucHVzaCgnbGluaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmlubGluZV9saW5rOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2xpbmsnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5lbToge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdlbScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLnN0cm9uZzoge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdzdHJvbmcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5jb2RlOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2NvZGUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBoYW5kbGVUb29sYmFyQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KGBbJHtBUFBMWV9GT1JNQVRfQVRUUn1dYCk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXQoYnV0dG9uLmdldEF0dHJpYnV0ZShBUFBMWV9GT1JNQVRfQVRUUikpO1xuICAgIH1cbiAgfTtcblxuICBhcHBseUZvcm1hdCA9IChkYXRhRm9ybWF0U3RyOiBzdHJpbmcpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGFGb3JtYXRTdHIpIHtcbiAgICAgIGNhc2UgJ3VuZG8nOiB7XG4gICAgICAgIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlZG8nOiB7XG4gICAgICAgIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvZGVfYmxvY2snOiB7XG4gICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMuY29kZV9ibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGluZyc6IHtcbiAgICAgICAgdGhpcy5wcm9tb3RlSGVhZGluZyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5vcmRlcmVkX2xpc3QnOiB7XG4gICAgICAgIHRoaXMudG9nZ2xlTGlzdChzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29yZGVyZWRfbGlzdCc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVMaXN0KHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NoZWNrbGlzdF9pdGVtJzoge1xuICAgICAgICB0aGlzLnRvZ2dsZUNoZWNrbGlzdEl0ZW0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJvbmcnOlxuICAgICAgY2FzZSAnZW0nOlxuICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1tkYXRhRm9ybWF0U3RyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5kZW50Jzoge1xuICAgICAgICBpbmRlbnRMaXN0SXRlbSh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnb3V0ZGVudCc6IHtcbiAgICAgICAgb3V0ZGVudExpc3RJdGVtKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7XG4gIFBsdWdpbixcbiAgRWRpdG9yU3RhdGUsXG4gIFNlbGVjdGlvbixcbiAgVGV4dFNlbGVjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IFNIT1dfQ0xTID0gJ3Nob3cnO1xuXG5jb25zdCBIVFRQX0xJTksgPSBuZXcgUmVnRXhwKCdeaHR0cHM/Oi8vJyk7XG5cbmNvbnN0IE1BSUxUT19MSU5LID0gbmV3IFJlZ0V4cCgnXm1haWx0bzonKTtcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHRvb2x0aXBFbDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcblxuICBzdGF0aWMgbm9kZVRvQW5jaG9ySHJlZih1cmw6IHN0cmluZykge1xuICAgIGlmIChIVFRQX0xJTksudGVzdCh1cmwpIHx8IE1BSUxUT19MSU5LLnRlc3QodXJsKSkge1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcmV0dXJuIGBodHRwOi8vJHt1cmx9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZpZXc6ICh2aWV3SW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlld0luc3RhbmNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlOiAodmlldywgcHJldmlvdXNTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1NlbGVjdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy50b29sdGlwRWwgPSBlbDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgJGN1cnNvciB9ID0gc2VsZWN0aW9uO1xuXG4gICAgY29uc3Qgd2l0aGluTGluayA9IEJvb2xlYW4oXG4gICAgICAkY3Vyc29yICYmXG4gICAgICAgICRjdXJzb3Iubm9kZUJlZm9yZSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlciAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVCZWZvcmUubWFya3Muc29tZShcbiAgICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgKSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlci5tYXJrcy5zb21lKChtYXJrKSA9PiBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rKSxcbiAgICApO1xuXG4gICAgaWYgKHdpdGhpbkxpbmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXJrID0gJGN1cnNvci5ub2RlQmVmb3JlLm1hcmtzLmZpbmQoXG4gICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICApO1xuXG4gICAgdGhpcy5zaG93KCRjdXJzb3IsIG1hcmsuYXR0cnMuaHJlZiwgbWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGlkZSA9ICgpID0+IHtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QucmVtb3ZlKFNIT1dfQ0xTKTtcbiAgfTtcblxuICBwcml2YXRlIHNob3cgPSAoJHBvczogUmVzb2x2ZWRQb3MsIHVybDogc3RyaW5nLCBpc0F1dG9MaW5rOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5saW5rVGV4dEVsLmlubmVyVGV4dCA9IHVybDtcbiAgICB0aGlzLmFuY2hvckVsLmhyZWYgPSBUb29sdGlwUGx1Z2luLm5vZGVUb0FuY2hvckhyZWYodXJsKTtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QudG9nZ2xlKCd5ZXMtYXV0by1saW5rJywgaXNBdXRvTGluayk7XG4gICAgdGhpcy50b29sdGlwRWwuY2xhc3NMaXN0LmFkZChTSE9XX0NMUyk7XG5cbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gdGhpcy52aWV3LmNvb3Jkc0F0UG9zKCRwb3MucG9zKTtcbiAgICBjb25zdCBhY3R1YWxXaWR0aCA9IHRoaXMudG9vbHRpcEVsLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIC8vIHRvb2x0aXAgbWF4LXdpZHRoIGlzIDEwMCUgLSAxMCwgZm9yIDVweCBvZiBzcGFjZSBmcm9tIGVhY2ggd2luZG93IGVkZ2VcbiAgICBpZiAobGVmdCArIGFjdHVhbFdpZHRoID4gYXZhaWxhYmxlV2lkdGgpIHtcbiAgICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCg1LCBsZWZ0IC0gYWN0dWFsV2lkdGgpfXB4YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwRWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDUsIGxlZnQpfXB4YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZWQgPSAodGhpcy52aWV3LnJvb3QgYXMgRG9jdW1lbnQpLmJvZHk7XG4gICAgLy8gUHVsbCB0b3AgdXAgYnkgcHJlc3VtZWQgaGVpZ2h0IG9mIHRvb2x0aXAgcGx1cyBzb21lIG1hcmdpblxuICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLnRvcCA9IGAke3RvcCAtIDM2ICsgc2Nyb2xsZWQuc2Nyb2xsVG9wfXB4YDtcbiAgfTtcblxuICBnZXQgbGlua1RleHRFbCgpOiBIVE1MU3BhbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRvb2x0aXBFbC5xdWVyeVNlbGVjdG9yKCdkaXYudGV4dCcpO1xuICB9XG5cbiAgZ2V0IGFuY2hvckVsKCk6IEhUTUxBbmNob3JFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwRWwucXVlcnlTZWxlY3RvcignYS5saW5rLWFuY2hvcicpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4sIFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcblxuZXhwb3J0IGNsYXNzIEVkaXRvckV4dGVuZGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSB2aWV3OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIGVsOiBIVE1MRGl2RWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihleHRlbmRlckVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZpZXc6ICh2aWV3SW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlld0luc3RhbmNlO1xuICAgICAgICB0aGlzLmVsID0gZXh0ZW5kZXJFbDtcblxuICAgICAgICB0aGlzLmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGljayk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayA9ICgpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyBkb2MsIHRyIH0gPSBzdGF0ZTtcbiAgICBjb25zdCBsYXN0UG9zID0gZG9jLm5vZGVTaXplIC0gMjtcbiAgICBjb25zdCBsYXN0Tm9kZVR5cGUgPSBzdGF0ZS5kb2MubGFzdENoaWxkLnR5cGU7XG4gICAgaWYgKGxhc3ROb2RlVHlwZSA9PT0gc2NoZW1hLm5vZGVzLmNvZGVfYmxvY2sgfHwgbGFzdE5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgdHIuaW5zZXJ0KGxhc3RQb3MsIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGguY3JlYXRlQW5kRmlsbCgpKTtcbiAgICB9XG4gICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5hdEVuZCh0ci5kb2MpKTtcbiAgICB0aGlzLnZpZXcuZGlzcGF0Y2godHIpO1xuICAgIHRoaXMudmlldy5mb2N1cygpO1xuICB9O1xufVxuIiwiY29uc3QgcmFuZG9tVVVJRCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEICYmIGNyeXB0by5yYW5kb21VVUlELmJpbmQoY3J5cHRvKTtcbmV4cG9ydCBkZWZhdWx0IHsgcmFuZG9tVVVJRCB9O1xuIiwibGV0IGdldFJhbmRvbVZhbHVlcztcbmNvbnN0IHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY3J5cHRvID09PSAndW5kZWZpbmVkJyB8fCAhY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGdldFJhbmRvbVZhbHVlcyA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbn1cbiIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmNvbnN0IGJ5dGVUb0hleCA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAgIHJldHVybiAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgdXVpZCA9IHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCk7XG4gICAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZDtcbn1cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTtcbiIsImltcG9ydCBuYXRpdmUgZnJvbSAnLi9uYXRpdmUuanMnO1xuaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICAgIGlmIChuYXRpdmUucmFuZG9tVVVJRCAmJiAhYnVmICYmICFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmUucmFuZG9tVVVJRCgpO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBybmRzID0gb3B0aW9ucy5yYW5kb20gPz8gb3B0aW9ucy5ybmc/LigpID8/IHJuZygpO1xuICAgIGlmIChybmRzLmxlbmd0aCA8IDE2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmFuZG9tIGJ5dGVzIGxlbmd0aCBtdXN0IGJlID49IDE2Jyk7XG4gICAgfVxuICAgIHJuZHNbNl0gPSAocm5kc1s2XSAmIDB4MGYpIHwgMHg0MDtcbiAgICBybmRzWzhdID0gKHJuZHNbOF0gJiAweDNmKSB8IDB4ODA7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgMTYgPiBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVVVJRCBieXRlIHJhbmdlICR7b2Zmc2V0fToke29mZnNldCArIDE1fSBpcyBvdXQgb2YgYnVmZmVyIGJvdW5kc2ApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICByZXR1cm4gdW5zYWZlU3RyaW5naWZ5KHJuZHMpO1xufVxuZXhwb3J0IGRlZmF1bHQgdjQ7XG4iLCJpbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCBDb21wb25lbnRNYW5hZ2VyIGZyb20gJ0BzdGFuZGFyZG5vdGVzL2NvbXBvbmVudC1yZWxheSc7XG5pbXBvcnQgeyBtYXJrZG93blBhcnNlciB9IGZyb20gJy4vbWFya2Rvd24nO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5jb25zdCBTTl9JVEVNX1NBVkVfS0VZID0gJ2NvbS5keWxhbm9uZWxzb24uc24tZWRpdG9yJztcblxuZnVuY3Rpb24gZ2V0TmFtZXNwYWNlZENvbnRlbnQoaXRlbTogSXRlbSkge1xuICBjb25zdCByZXN1bHQgPSBpdGVtICYmIGl0ZW0uY29udGVudCAmJiBpdGVtLmNvbnRlbnRbU05fSVRFTV9TQVZFX0tFWV07XG4gIHJldHVybiByZXN1bHQgfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VXVpZChpdGVtOiBJdGVtKSB7XG4gIGlmIChpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0udXVpZDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VGV4dChpdGVtOiBJdGVtKSB7XG4gIHJldHVybiBpdGVtICYmIGl0ZW0uY29udGVudCAmJiBpdGVtLmNvbnRlbnQudGV4dCA/IGl0ZW0uY29udGVudC50ZXh0IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jKGl0ZW06IEl0ZW0pIHtcbiAgY29uc3QgY29udGVudCA9IGdldE5hbWVzcGFjZWRDb250ZW50KGl0ZW0pO1xuICBpZiAoY29udGVudCAmJiBjb250ZW50LmRvYykge1xuICAgIHJldHVybiBjb250ZW50LmRvYztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFNhdmVkQnkoaXRlbTogSXRlbSkge1xuICBjb25zdCBjb250ZW50ID0gZ2V0TmFtZXNwYWNlZENvbnRlbnQoaXRlbSk7XG4gIGlmIChjb250ZW50ICYmIGNvbnRlbnQubGFzdFNhdmVkQnkpIHtcbiAgICByZXR1cm4gY29udGVudC5sYXN0U2F2ZWRCeTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY2xhc3MgQ2xpZW50IHtcbiAgc3RhdGljIFNOX0lURU1fU0FWRV9LRVkgPSAnY29tLmR5bGFub25lbHNvbi5zbi1lZGl0b3InO1xuXG4gIHByaXZhdGUgc3RhdGljIGl0ZW1TZWxlY3RvcnMgPSB7fTtcblxuICBwcml2YXRlIF9pdGVtOiBJdGVtID0gbnVsbDtcblxuICBwcml2YXRlIF9yZWFkeTogUHJvbWlzZTx2b2lkPjtcblxuICBwcml2YXRlIF9pZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2xpc3RlbmVyczogKCh7fSkgPT4gdm9pZClbXTtcblxuICBwcml2YXRlIGNvbXBvbmVudE1hbmFnZXI6IENvbXBvbmVudE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcblxuICAgIGxldCByZXNvbHZlQ2xpZW50UmVhZHk7XG4gICAgdGhpcy5fcmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVzb2x2ZUNsaWVudFJlYWR5ID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29tcG9uZW50TWFuYWdlciA9IG5ldyBDb21wb25lbnRNYW5hZ2VyKHtcbiAgICAgIHRhcmdldFdpbmRvdzogd2luZG93LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgICAgYWNjZXB0c1RoZW1lczogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBvblJlYWR5OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50TWFuYWdlci5zdHJlYW1Db250ZXh0SXRlbSgoaXRlbTogSXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ3N0cmVhbUNvbnRleHRJdGVtIHVwZGF0ZTonLCBpdGVtKTtcblxuICAgICAgICAgIGNvbnN0IGNhbGxMaXN0ZW5lcnMgPSB0aGlzLnNob3VsZENhbGxMaXN0ZW5lcnMoaXRlbSwgdGhpcy5faXRlbSk7XG5cbiAgICAgICAgICB0aGlzLl9pdGVtID0gaXRlbTtcblxuICAgICAgICAgIGlmIChjYWxsTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgbGlzdGVuZXIoaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlQ2xpZW50UmVhZHkoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGxhdGVzdERvYygpIHtcbiAgICByZXR1cm4gZ2V0RG9jKHRoaXMuX2l0ZW0pO1xuICB9XG5cbiAgZ2V0IGxhdGVzdFRleHQoKSB7XG4gICAgcmV0dXJuIGdldFRleHQodGhpcy5faXRlbSk7XG4gIH1cblxuICBvblVwZGF0ZShjYWxsYmFjazogKHt9KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZmlsdGVyKFxuICAgICAgICAobGlzdGVuZXIpID0+IGxpc3RlbmVyICE9PSBjYWxsYmFjayxcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHJlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkeTtcbiAgfVxuXG4gIHNhdmVOb3RlKGpzb25Eb2M6IHt9LCBtZERvYzogc3RyaW5nLCB0ZXh0UHJldmlldzogc3RyaW5nKSB7XG4gICAgY29uc3QgdG9TYXZlID0ge1xuICAgICAgLi4udGhpcy5faXRlbSxcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgLi4udGhpcy5faXRlbS5jb250ZW50LFxuICAgICAgICBbU05fSVRFTV9TQVZFX0tFWV06IHtcbiAgICAgICAgICBkb2M6IGpzb25Eb2MsXG4gICAgICAgICAgbGFzdFNhdmVkQnk6IHRoaXMuX2lkLFxuICAgICAgICB9LFxuICAgICAgICB0ZXh0OiBtZERvYyxcbiAgICAgICAgcHJldmlld19wbGFpbjogdGV4dFByZXZpZXcsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5jb21wb25lbnRNYW5hZ2VyLnNhdmVJdGVtV2l0aFByZXNhdmUoXG4gICAgICB0b1NhdmUsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIFByZXNhdmUgY2FsbGJhY2tcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIFNhdmUgY29tcGxldGUgY2FsbGJhY2tcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHNob3VsZENhbGxMaXN0ZW5lcnMgPSAobmV4dEl0ZW0sIHByZXZpb3VzSXRlbSkgPT4ge1xuICAgIGlmIChuZXh0SXRlbS5pc01ldGFkYXRhVXBkYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBnZXRVdWlkKG5leHRJdGVtKSAhPT0gZ2V0VXVpZChwcmV2aW91c0l0ZW0pIHx8XG4gICAgICBnZXRMYXN0U2F2ZWRCeShuZXh0SXRlbSkgIT09IHRoaXMuX2lkXG4gICAgKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoKTtcbiIsImltcG9ydCB7IENoZWNrYm94U3RhdHVzLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBFZGl0b3JQcm9wcyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgQ2hlY2tib3hPdXRsaW5lLCBDaGVja2JveCB9IGZyb20gJy4vYXNzZXRzJztcblxuY29uc3QgQ0hFQ0tCT1hfQ0hFQ0tFRF9DTEFTU05BTUUgPSAnaXMtY2hlY2tlZCc7XG5jb25zdCBDTElDS19UQVJHRVRfQ0xBU1NOQU1FID0gJ2NsaWNrLXRhcmdldCc7XG5cbmV4cG9ydCBjb25zdCBub2RlVmlld3M6IEVkaXRvclByb3BzPHR5cGVvZiBzY2hlbWE+Wydub2RlVmlld3MnXSA9IHtcbiAgY2hlY2tsaXN0X2l0ZW0obm9kZSwgdmlldywgZ2V0UG9zKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTGlzdC5hZGQoJ2NoZWNrbGlzdC1pdGVtJyk7XG5cbiAgICBjb25zdCBpbnB1dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlucHV0RGl2LmNsYXNzTGlzdC5hZGQoJ2NoZWNrYm94Jyk7XG4gICAgaWYgKG5vZGUuYXR0cnMuc3RhdHVzID09PSBDaGVja2JveFN0YXR1cy5ET05FKSB7XG4gICAgICBpbnB1dERpdi5jbGFzc0xpc3QuYWRkKENIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FKTtcbiAgICAgIGlucHV0RGl2LmlubmVySFRNTCA9IENoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dERpdi5pbm5lckhUTUwgPSBDaGVja2JveE91dGxpbmU7XG4gICAgfVxuXG4gICAgY29uc3QgY2xpY2tUYXJnZXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjbGlja1RhcmdldERpdi5jbGFzc0xpc3QuYWRkKENMSUNLX1RBUkdFVF9DTEFTU05BTUUpO1xuICAgIGNsaWNrVGFyZ2V0RGl2LmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7XG4gICAgY2xpY2tUYXJnZXREaXYudGFiSW5kZXggPSAwO1xuXG4gICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcblxuICAgIGNsaWNrVGFyZ2V0RGl2LmFwcGVuZENoaWxkKGlucHV0RGl2KTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQoY2xpY2tUYXJnZXREaXYpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChwKTtcblxuICAgIGNvbnN0IGZvY3VzSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyByZWxhdGVkVGFyZ2V0LCB0YXJnZXQgfSA9IGV2ZW50O1xuICAgICAgaWYgKGNsaWNrVGFyZ2V0RGl2LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIC8vIElucHV0IGlzIHRha2luZyBmb2N1c1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdIYXNGb2N1cyA9IHRhcmdldCA9PT0gdmlldy5kb207XG4gICAgICBpZiAodmlld0hhc0ZvY3VzKSB7XG4gICAgICAgIC8vIFRoZSB2aWV3IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgaW5wdXRcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGlja0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChjbGlja1RhcmdldERpdi5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBpbnB1dERpdi5jbGFzc0xpc3QuY29udGFpbnMoQ0hFQ0tCT1hfQ0hFQ0tFRF9DTEFTU05BTUUpO1xuICAgICAgY29uc3QgeyB0ciB9ID0gdmlldy5zdGF0ZTtcbiAgICAgIGNvbnN0IHBvcyA9IChnZXRQb3MgYXMgKCkgPT4gbnVtYmVyKSgpO1xuICAgICAgdHIuc2V0Tm9kZU1hcmt1cChwb3MsIHVuZGVmaW5lZCwge1xuICAgICAgICBzdGF0dXM6IGNoZWNrZWQgPyBDaGVja2JveFN0YXR1cy5FTVBUWSA6IENoZWNrYm94U3RhdHVzLkRPTkUsXG4gICAgICB9KTtcbiAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgIH07XG5cbiAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZm9jdXNIYW5kbGVyKTtcbiAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrSGFuZGxlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9tOiBkaXYsXG4gICAgICBjb250ZW50RE9NOiBwLFxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGZvY3VzSGFuZGxlcik7XG4gICAgICAgIHZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn07XG4iLCJleHBvcnQgdmFyIGJhc2UgPSB7XG4gIDg6IFwiQmFja3NwYWNlXCIsXG4gIDk6IFwiVGFiXCIsXG4gIDEwOiBcIkVudGVyXCIsXG4gIDEyOiBcIk51bUxvY2tcIixcbiAgMTM6IFwiRW50ZXJcIixcbiAgMTY6IFwiU2hpZnRcIixcbiAgMTc6IFwiQ29udHJvbFwiLFxuICAxODogXCJBbHRcIixcbiAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgMjc6IFwiRXNjYXBlXCIsXG4gIDMyOiBcIiBcIixcbiAgMzM6IFwiUGFnZVVwXCIsXG4gIDM0OiBcIlBhZ2VEb3duXCIsXG4gIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsXG4gIDM3OiBcIkFycm93TGVmdFwiLFxuICAzODogXCJBcnJvd1VwXCIsXG4gIDM5OiBcIkFycm93UmlnaHRcIixcbiAgNDA6IFwiQXJyb3dEb3duXCIsXG4gIDQ0OiBcIlByaW50U2NyZWVuXCIsXG4gIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIixcbiAgNTk6IFwiO1wiLFxuICA2MTogXCI9XCIsXG4gIDkxOiBcIk1ldGFcIixcbiAgOTI6IFwiTWV0YVwiLFxuICAxMDY6IFwiKlwiLFxuICAxMDc6IFwiK1wiLFxuICAxMDg6IFwiLFwiLFxuICAxMDk6IFwiLVwiLFxuICAxMTA6IFwiLlwiLFxuICAxMTE6IFwiL1wiLFxuICAxNDQ6IFwiTnVtTG9ja1wiLFxuICAxNDU6IFwiU2Nyb2xsTG9ja1wiLFxuICAxNjA6IFwiU2hpZnRcIixcbiAgMTYxOiBcIlNoaWZ0XCIsXG4gIDE2MjogXCJDb250cm9sXCIsXG4gIDE2MzogXCJDb250cm9sXCIsXG4gIDE2NDogXCJBbHRcIixcbiAgMTY1OiBcIkFsdFwiLFxuICAxNzM6IFwiLVwiLFxuICAxODY6IFwiO1wiLFxuICAxODc6IFwiPVwiLFxuICAxODg6IFwiLFwiLFxuICAxODk6IFwiLVwiLFxuICAxOTA6IFwiLlwiLFxuICAxOTE6IFwiL1wiLFxuICAxOTI6IFwiYFwiLFxuICAyMTk6IFwiW1wiLFxuICAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLFxuICAyMjI6IFwiJ1wiXG59XG5cbmV4cG9ydCB2YXIgc2hpZnQgPSB7XG4gIDQ4OiBcIilcIixcbiAgNDk6IFwiIVwiLFxuICA1MDogXCJAXCIsXG4gIDUxOiBcIiNcIixcbiAgNTI6IFwiJFwiLFxuICA1MzogXCIlXCIsXG4gIDU0OiBcIl5cIixcbiAgNTU6IFwiJlwiLFxuICA1NjogXCIqXCIsXG4gIDU3OiBcIihcIixcbiAgNTk6IFwiOlwiLFxuICA2MTogXCIrXCIsXG4gIDE3MzogXCJfXCIsXG4gIDE4NjogXCI6XCIsXG4gIDE4NzogXCIrXCIsXG4gIDE4ODogXCI8XCIsXG4gIDE4OTogXCJfXCIsXG4gIDE5MDogXCI+XCIsXG4gIDE5MTogXCI/XCIsXG4gIDE5MjogXCJ+XCIsXG4gIDIxOTogXCJ7XCIsXG4gIDIyMDogXCJ8XCIsXG4gIDIyMTogXCJ9XCIsXG4gIDIyMjogXCJcXFwiXCJcbn1cblxudmFyIG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbnZhciBpZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTVNJRSBcXGR8VHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClcblxuLy8gRmlsbCBpbiB0aGUgZGlnaXQga2V5c1xuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSBiYXNlWzQ4ICsgaV0gPSBiYXNlWzk2ICsgaV0gPSBTdHJpbmcoaSlcblxuLy8gVGhlIGZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDI0OyBpKyspIGJhc2VbaSArIDExMV0gPSBcIkZcIiArIGlcblxuLy8gQW5kIHRoZSBhbHBoYWJldGljIGtleXNcbmZvciAodmFyIGkgPSA2NTsgaSA8PSA5MDsgaSsrKSB7XG4gIGJhc2VbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAzMilcbiAgc2hpZnRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG59XG5cbi8vIEZvciBlYWNoIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgYSBzaGlmdC1lcXVpdmFsZW50LCBjb3B5IHRoZSBiYXNlIG5hbWVcbmZvciAodmFyIGNvZGUgaW4gYmFzZSkgaWYgKCFzaGlmdC5oYXNPd25Qcm9wZXJ0eShjb2RlKSkgc2hpZnRbY29kZV0gPSBiYXNlW2NvZGVdXG5cbmV4cG9ydCBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIC8vIE9uIG1hY09TLCBrZXlzIGhlbGQgd2l0aCBTaGlmdCBhbmQgQ21kIGRvbid0IHJlZmxlY3QgdGhlIGVmZmVjdCBvZiBTaGlmdCBpbiBgLmtleWAuXG4gIC8vIE9uIElFLCBzaGlmdCBlZmZlY3QgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYC5rZXlgLlxuICB2YXIgaWdub3JlS2V5ID0gbWFjICYmIGV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fFxuICAgICAgaWUgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT0gMSB8fFxuICAgICAgZXZlbnQua2V5ID09IFwiVW5pZGVudGlmaWVkXCJcbiAgdmFyIG5hbWUgPSAoIWlnbm9yZUtleSAmJiBldmVudC5rZXkpIHx8XG4gICAgKGV2ZW50LnNoaWZ0S2V5ID8gc2hpZnQgOiBiYXNlKVtldmVudC5rZXlDb2RlXSB8fFxuICAgIGV2ZW50LmtleSB8fCBcIlVuaWRlbnRpZmllZFwiXG4gIC8vIEVkZ2Ugc29tZXRpbWVzIHByb2R1Y2VzIHdyb25nIG5hbWVzIChJc3N1ZSAjMylcbiAgaWYgKG5hbWUgPT0gXCJFc2NcIikgbmFtZSA9IFwiRXNjYXBlXCJcbiAgaWYgKG5hbWUgPT0gXCJEZWxcIikgbmFtZSA9IFwiRGVsZXRlXCJcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODg2MDU3MS9cbiAgaWYgKG5hbWUgPT0gXCJMZWZ0XCIpIG5hbWUgPSBcIkFycm93TGVmdFwiXG4gIGlmIChuYW1lID09IFwiVXBcIikgbmFtZSA9IFwiQXJyb3dVcFwiXG4gIGlmIChuYW1lID09IFwiUmlnaHRcIikgbmFtZSA9IFwiQXJyb3dSaWdodFwiXG4gIGlmIChuYW1lID09IFwiRG93blwiKSBuYW1lID0gXCJBcnJvd0Rvd25cIlxuICByZXR1cm4gbmFtZVxufVxuIiwiaW1wb3J0IHsga2V5TmFtZSwgYmFzZSB9IGZyb20gJ3czYy1rZXluYW1lJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3QgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWN8aVAoaG9uZXxbb2FdZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTtcbmNvbnN0IHdpbmRvd3MgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL1dpbi8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lKSB7XG4gICAgbGV0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyksIHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBsZXQgbW9kID0gcGFydHNbaV07XG4gICAgICAgIGlmICgvXihjbWR8bWV0YXxtKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgYWx0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL14oY3xjdHJsfGNvbnRyb2wpJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXnMoaGlmdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIHNoaWZ0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICAgICAgICBpZiAobWFjKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZShtYXApIHtcbiAgICBsZXQgY29weSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgIGNvcHlbbm9ybWFsaXplS2V5TmFtZShwcm9wKV0gPSBtYXBbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG5mdW5jdGlvbiBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHNoaWZ0ID0gdHJ1ZSkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgJiYgZXZlbnQuc2hpZnRLZXkpXG4gICAgICAgIG5hbWUgPSBcIlNoaWZ0LVwiICsgbmFtZTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbi8qKlxuQ3JlYXRlIGEga2V5bWFwIHBsdWdpbiBmb3IgdGhlIGdpdmVuIHNldCBvZiBiaW5kaW5ncy5cblxuQmluZGluZ3Mgc2hvdWxkIG1hcCBrZXkgbmFtZXMgdG8gW2NvbW1hbmRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcyktc3R5bGVcbmZ1bmN0aW9ucywgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBgKEVkaXRvclN0YXRlLCBkaXNwYXRjaCxcbkVkaXRvclZpZXcpYCBhcmd1bWVudHMsIGFuZCBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGV5J3ZlIGhhbmRsZWRcbnRoZSBrZXkuIE5vdGUgdGhhdCB0aGUgdmlldyBhcmd1bWVudCBpc24ndCBwYXJ0IG9mIHRoZSBjb21tYW5kXG5wcm90b2NvbCwgYnV0IGNhbiBiZSB1c2VkIGFzIGFuIGVzY2FwZSBoYXRjaCBpZiBhIGJpbmRpbmcgbmVlZHMgdG9cbmRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIFVJLlxuXG5LZXkgbmFtZXMgbWF5IGJlIHN0cmluZ3MgbGlrZSBgXCJTaGlmdC1DdHJsLUVudGVyXCJg4oCUYSBrZXlcbmlkZW50aWZpZXIgcHJlZml4ZWQgd2l0aCB6ZXJvIG9yIG1vcmUgbW9kaWZpZXJzLiBLZXkgaWRlbnRpZmllcnNcbmFyZSBiYXNlZCBvbiB0aGUgc3RyaW5ncyB0aGF0IGNhbiBhcHBlYXIgaW5cbltgS2V5RXZlbnQua2V5YF0oaHR0cHM6ZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSkuXG5Vc2UgbG93ZXJjYXNlIGxldHRlcnMgdG8gcmVmZXIgdG8gbGV0dGVyIGtleXMgKG9yIHVwcGVyY2FzZSBsZXR0ZXJzXG5pZiB5b3Ugd2FudCBzaGlmdCB0byBiZSBoZWxkKS4gWW91IG1heSB1c2UgYFwiU3BhY2VcImAgYXMgYW4gYWxpYXNcbmZvciB0aGUgYFwiIFwiYCBuYW1lLlxuXG5Nb2RpZmllcnMgY2FuIGJlIGdpdmVuIGluIGFueSBvcmRlci4gYFNoaWZ0LWAgKG9yIGBzLWApLCBgQWx0LWAgKG9yXG5gYS1gKSwgYEN0cmwtYCAob3IgYGMtYCBvciBgQ29udHJvbC1gKSBhbmQgYENtZC1gIChvciBgbS1gIG9yXG5gTWV0YS1gKSBhcmUgcmVjb2duaXplZC4gRm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgY3JlYXRlZCBieSBob2xkaW5nXG5zaGlmdCwgdGhlIGBTaGlmdC1gIHByZWZpeCBpcyBpbXBsaWVkLCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZFxuZXhwbGljaXRseS5cblxuWW91IGNhbiB1c2UgYE1vZC1gIGFzIGEgc2hvcnRoYW5kIGZvciBgQ21kLWAgb24gTWFjIGFuZCBgQ3RybC1gIG9uXG5vdGhlciBwbGF0Zm9ybXMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcCBwbHVnaW5zIHRvIGFuIGVkaXRvci4gVGhlIG9yZGVyIGluXG53aGljaCB0aGV5IGFwcGVhciBkZXRlcm1pbmVzIHRoZWlyIHByZWNlZGVuY2UgKHRoZSBvbmVzIGVhcmx5IGluXG50aGUgYXJyYXkgZ2V0IHRvIGRpc3BhdGNoIGZpcnN0KS5cbiovXG5mdW5jdGlvbiBrZXltYXAoYmluZGluZ3MpIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7IHByb3BzOiB7IGhhbmRsZUtleURvd246IGtleWRvd25IYW5kbGVyKGJpbmRpbmdzKSB9IH0pO1xufVxuLyoqXG5HaXZlbiBhIHNldCBvZiBiaW5kaW5ncyAodXNpbmcgdGhlIHNhbWUgZm9ybWF0IGFzXG5bYGtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNrZXltYXAua2V5bWFwKSksIHJldHVybiBhIFtrZXlkb3duXG5oYW5kbGVyXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcy5oYW5kbGVLZXlEb3duKSB0aGF0IGhhbmRsZXMgdGhlbS5cbiovXG5mdW5jdGlvbiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykge1xuICAgIGxldCBtYXAgPSBub3JtYWxpemUoYmluZGluZ3MpO1xuICAgIHJldHVybiBmdW5jdGlvbiAodmlldywgZXZlbnQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KSwgYmFzZU5hbWUsIGRpcmVjdCA9IG1hcFttb2RpZmllcnMobmFtZSwgZXZlbnQpXTtcbiAgICAgICAgaWYgKGRpcmVjdCAmJiBkaXJlY3Qodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQSBjaGFyYWN0ZXIga2V5XG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA9PSAxICYmIG5hbWUgIT0gXCIgXCIpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIG5hbWUgd2FzIGFscmVhZHkgbW9kaWZpZWQgYnkgc2hpZnQsIHRyeSBsb29raW5nXG4gICAgICAgICAgICAgICAgLy8gaXQgdXAgd2l0aG91dCBpdHMgc2hpZnQgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICBsZXQgbm9TaGlmdCA9IG1hcFttb2RpZmllcnMobmFtZSwgZXZlbnQsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgaWYgKG5vU2hpZnQgJiYgbm9TaGlmdCh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICAgICAgICAgICAgLy8gQ3RybC1BbHQgbWF5IGJlIHVzZWQgZm9yIEFsdEdyIG9uIFdpbmRvd3NcbiAgICAgICAgICAgICAgICAhKHdpbmRvd3MgJiYgZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkpICYmXG4gICAgICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleUNvZGUgd2hlbiB0aGVyZSdzIGEgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICAvLyBhY3RpdmUgb3IgdGhlIGNoYXJhY3RlciBwcm9kdWNlZCBpc24ndCBBU0NJSSwgYW5kIG91ciB0YWJsZVxuICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGEgZGlmZmVyZW50IG5hbWUgZnJvbSB0aGUgdGhlIGtleUNvZGUuIFNlZSAjNjY4LFxuICAgICAgICAgICAgICAgIC8vICMxMDYwLCAjMTUyOS5cbiAgICAgICAgICAgICAgICBsZXQgZnJvbUNvZGUgPSBtYXBbbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCldO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQ29kZSAmJiBmcm9tQ29kZSh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGtleWRvd25IYW5kbGVyLCBrZXltYXAgfTtcbiIsImltcG9ydCB7XG4gIEVkaXRvclN0YXRlLFxuICBQbHVnaW4sXG4gIFNlbGVjdGlvbixcbiAgVGV4dFNlbGVjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IFJlc29sdmVkUG9zIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgYmFzZUtleW1hcCwgc2V0QmxvY2tUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IHNwbGl0TGlzdEl0ZW0gfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZURlbGV0ZUVtcHR5KHRyOiBUcmFuc2FjdGlvbiwgJHBvczogUmVzb2x2ZWRQb3MpOiBUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSAkcG9zLnBhcmVudDtcbiAgaWYgKHBhcmVudE5vZGUubm9kZVNpemUgPT09IDIpIHtcbiAgICBjb25zdCB7IHBvcyB9ID0gJHBvcztcbiAgICByZXR1cm4gcmVjdXJzaXZlRGVsZXRlRW1wdHkoXG4gICAgICB0ci5kZWxldGVSYW5nZShwb3MgLSAxLCBwb3MgKyAxKSxcbiAgICAgIHRyLmRvYy5yZXNvbHZlKHRyLm1hcHBpbmcubWFwKHBvcykpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRyO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUZXh0U2VsZWN0aW9uSW5FbXB0eU5vZGUoc3RhdGU6IEVkaXRvclN0YXRlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb247XG4gIHJldHVybiBCb29sZWFuKCRjdXJzb3IgJiYgJGN1cnNvci5wYXJlbnQubm9kZVNpemUgPT09IDIpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVDaGVja2xpc3RJdGVtVGV4dFNlbGVjdGlvbihzdGF0ZTogRWRpdG9yU3RhdGUpIHtcbiAgY29uc3QgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb24gYXMgVGV4dFNlbGVjdGlvbjtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgJGN1cnNvciAmJiAkY3Vyc29yLnBhcmVudC50eXBlID09PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0sXG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBrZXltYXBQbHVnaW5zOiBQbHVnaW5bXSA9IFtcbiAgLy8gY2hlY2tsaXN0IGl0ZW0gaGFuZGxlcnNcbiAga2V5bWFwKHtcbiAgICBCYWNrc3BhY2Uoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSB7XG4gICAgICBpZiAoZW5zdXJlQ2hlY2tsaXN0SXRlbVRleHRTZWxlY3Rpb24oc3RhdGUpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodmlldy5lbmRPZlRleHRibG9jaygnbGVmdCcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb24pLiRjdXJzb3IuaW5kZXgoMCkgPT09IDApIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBFbnRlcihzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0aW9uLCB0ciB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7ICRmcm9tLCBmcm9tIH0gPSBzZWxlY3Rpb247XG4gICAgICBpZiAoJGZyb20ucGFyZW50LnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgIGNvbnN0IG5leHQkRnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgICAgaWYgKG5leHQkRnJvbS5wYXJlbnQubm9kZVNpemUgPT09IDIpIHtcbiAgICAgICAgY29uc3QgbmV4dEZyb20gPSBuZXh0JEZyb20ucG9zO1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBlbXB0eVxuICAgICAgICB0ci5yZXBsYWNlV2l0aChcbiAgICAgICAgICBuZXh0RnJvbSAtIDEsXG4gICAgICAgICAgbmV4dEZyb20gKyAxLFxuICAgICAgICAgIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGguY3JlYXRlQW5kRmlsbCgpLFxuICAgICAgICApO1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUobmV4dEZyb20gLSAxKSkpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdHIuc3BsaXQoZnJvbSwgdW5kZWZpbmVkLCBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pLFxuICAvLyBsaXN0IGl0ZW0gaGFuZGxlcnNcbiAga2V5bWFwKHtcbiAgICBCYWNrc3BhY2Uoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICBpZiAoZW5zdXJlVGV4dFNlbGVjdGlvbkluRW1wdHlOb2RlKHN0YXRlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCB7ICRjdXJzb3IgfSA9IHNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHBvc3NpYmxlU2VsZWN0aW9uID0gU2VsZWN0aW9uLmZpbmRGcm9tKFxuICAgICAgICBzdGF0ZS5kb2MucmVzb2x2ZSgkY3Vyc29yLmJlZm9yZSgpKSxcbiAgICAgICAgLTEsXG4gICAgICAgIHRydWUsXG4gICAgICAgIC8vIFdlIGNhbiBhc3NlcnQgdGhpcyBoZXJlIGJjIG9mIHRoZSB0ZXh0T25seSBhcmcgYWJvdmVcbiAgICAgICkgYXMgVGV4dFNlbGVjdGlvbjtcbiAgICAgIGlmICghcG9zc2libGVTZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHBvc3NpYmxlU2VsZWN0aW9uLiRjdXJzb3Iubm9kZSgtMSkudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zZXRTZWxlY3Rpb24ocG9zc2libGVTZWxlY3Rpb24pO1xuICAgICAgdHIgPSByZWN1cnNpdmVEZWxldGVFbXB0eSh0ciwgJGN1cnNvcik7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIEVudGVyOiBzcGxpdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pLFxuICB9KSxcbiAga2V5bWFwKGJhc2VLZXltYXApLFxuXTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblxuY29uc3QgZGVjb2RlQ2FjaGUgPSB7fVxuXG5mdW5jdGlvbiBnZXREZWNvZGVDYWNoZSAoZXhjbHVkZSkge1xuICBsZXQgY2FjaGUgPSBkZWNvZGVDYWNoZVtleGNsdWRlXVxuICBpZiAoY2FjaGUpIHsgcmV0dXJuIGNhY2hlIH1cblxuICBjYWNoZSA9IGRlY29kZUNhY2hlW2V4Y2x1ZGVdID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDEyODsgaSsrKSB7XG4gICAgY29uc3QgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG4gICAgY2FjaGUucHVzaChjaClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZXhjbHVkZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gZXhjbHVkZS5jaGFyQ29kZUF0KGkpXG4gICAgY2FjaGVbY2hdID0gJyUnICsgKCcwJyArIGNoLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMilcbiAgfVxuXG4gIHJldHVybiBjYWNoZVxufVxuXG4vLyBEZWNvZGUgcGVyY2VudC1lbmNvZGVkIHN0cmluZy5cbi8vXG5mdW5jdGlvbiBkZWNvZGUgKHN0cmluZywgZXhjbHVkZSkge1xuICBpZiAodHlwZW9mIGV4Y2x1ZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgZXhjbHVkZSA9IGRlY29kZS5kZWZhdWx0Q2hhcnNcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RGVjb2RlQ2FjaGUoZXhjbHVkZSlcblxuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyglW2EtZjAtOV17Mn0pKy9naSwgZnVuY3Rpb24gKHNlcSkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzZXEubGVuZ3RoOyBpIDwgbDsgaSArPSAzKSB7XG4gICAgICBjb25zdCBiMSA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgMSwgaSArIDMpLCAxNilcblxuICAgICAgaWYgKGIxIDwgMHg4MCkge1xuICAgICAgICByZXN1bHQgKz0gY2FjaGVbYjFdXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICgoYjEgJiAweEUwKSA9PT0gMHhDMCAmJiAoaSArIDMgPCBsKSkge1xuICAgICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgICBjb25zdCBiMiA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNCwgaSArIDYpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBjb25zdCBjaHIgPSAoKGIxIDw8IDYpICYgMHg3QzApIHwgKGIyICYgMHgzRilcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSArPSAzXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhGMCkgPT09IDB4RTAgJiYgKGkgKyA2IDwgbCkpIHtcbiAgICAgICAgLy8gMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHhcbiAgICAgICAgY29uc3QgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpXG4gICAgICAgIGNvbnN0IGIzID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA3LCBpICsgOSksIDE2KVxuXG4gICAgICAgIGlmICgoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgIGNvbnN0IGNociA9ICgoYjEgPDwgMTIpICYgMHhGMDAwKSB8ICgoYjIgPDwgNikgJiAweEZDMCkgfCAoYjMgJiAweDNGKVxuXG4gICAgICAgICAgaWYgKGNociA8IDB4ODAwIHx8IChjaHIgPj0gMHhEODAwICYmIGNociA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gNlxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKChiMSAmIDB4RjgpID09PSAweEYwICYmIChpICsgOSA8IGwpKSB7XG4gICAgICAgIC8vIDExMTExMHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICAgIGNvbnN0IGIyID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA0LCBpICsgNiksIDE2KVxuICAgICAgICBjb25zdCBiMyA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNywgaSArIDkpLCAxNilcbiAgICAgICAgY29uc3QgYjQgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDEwLCBpICsgMTIpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODAgJiYgKGI0ICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBsZXQgY2hyID0gKChiMSA8PCAxOCkgJiAweDFDMDAwMCkgfCAoKGIyIDw8IDEyKSAmIDB4M0YwMDApIHwgKChiMyA8PCA2KSAmIDB4RkMwKSB8IChiNCAmIDB4M0YpXG5cbiAgICAgICAgICBpZiAoY2hyIDwgMHgxMDAwMCB8fCBjaHIgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZFxcdWZmZmRcXHVmZmZkJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHIgLT0gMHgxMDAwMFxuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwICsgKGNociA+PiAxMCksIDB4REMwMCArIChjaHIgJiAweDNGRikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSArPSA5XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufVxuXG5kZWNvZGUuZGVmYXVsdENoYXJzID0gJzsvPzpAJj0rJCwjJ1xuZGVjb2RlLmNvbXBvbmVudENoYXJzID0gJydcblxuZXhwb3J0IGRlZmF1bHQgZGVjb2RlXG4iLCJjb25zdCBlbmNvZGVDYWNoZSA9IHt9XG5cbi8vIENyZWF0ZSBhIGxvb2t1cCBhcnJheSB3aGVyZSBhbnl0aGluZyBidXQgY2hhcmFjdGVycyBpbiBgY2hhcnNgIHN0cmluZ1xuLy8gYW5kIGFscGhhbnVtZXJpYyBjaGFycyBpcyBwZXJjZW50LWVuY29kZWQuXG4vL1xuZnVuY3Rpb24gZ2V0RW5jb2RlQ2FjaGUgKGV4Y2x1ZGUpIHtcbiAgbGV0IGNhY2hlID0gZW5jb2RlQ2FjaGVbZXhjbHVkZV1cbiAgaWYgKGNhY2hlKSB7IHJldHVybiBjYWNoZSB9XG5cbiAgY2FjaGUgPSBlbmNvZGVDYWNoZVtleGNsdWRlXSA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxuXG4gICAgaWYgKC9eWzAtOWEtel0kL2kudGVzdChjaCkpIHtcbiAgICAgIC8vIGFsd2F5cyBhbGxvdyB1bmVuY29kZWQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgIGNhY2hlLnB1c2goY2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlLnB1c2goJyUnICsgKCcwJyArIGkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZVtleGNsdWRlLmNoYXJDb2RlQXQoaSldID0gZXhjbHVkZVtpXVxuICB9XG5cbiAgcmV0dXJuIGNhY2hlXG59XG5cbi8vIEVuY29kZSB1bnNhZmUgY2hhcmFjdGVycyB3aXRoIHBlcmNlbnQtZW5jb2RpbmcsIHNraXBwaW5nIGFscmVhZHlcbi8vIGVuY29kZWQgc2VxdWVuY2VzLlxuLy9cbi8vICAtIHN0cmluZyAgICAgICAtIHN0cmluZyB0byBlbmNvZGVcbi8vICAtIGV4Y2x1ZGUgICAgICAtIGxpc3Qgb2YgY2hhcmFjdGVycyB0byBpZ25vcmUgKGluIGFkZGl0aW9uIHRvIGEtekEtWjAtOSlcbi8vICAtIGtlZXBFc2NhcGVkICAtIGRvbid0IGVuY29kZSAnJScgaW4gYSBjb3JyZWN0IGVzY2FwZSBzZXF1ZW5jZSAoZGVmYXVsdDogdHJ1ZSlcbi8vXG5mdW5jdGlvbiBlbmNvZGUgKHN0cmluZywgZXhjbHVkZSwga2VlcEVzY2FwZWQpIHtcbiAgaWYgKHR5cGVvZiBleGNsdWRlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGVuY29kZShzdHJpbmcsIGtlZXBFc2NhcGVkKVxuICAgIGtlZXBFc2NhcGVkID0gZXhjbHVkZVxuICAgIGV4Y2x1ZGUgPSBlbmNvZGUuZGVmYXVsdENoYXJzXG4gIH1cblxuICBpZiAodHlwZW9mIGtlZXBFc2NhcGVkID09PSAndW5kZWZpbmVkJykge1xuICAgIGtlZXBFc2NhcGVkID0gdHJ1ZVxuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXRFbmNvZGVDYWNoZShleGNsdWRlKVxuICBsZXQgcmVzdWx0ID0gJydcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IHN0cmluZy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIGlmIChrZWVwRXNjYXBlZCAmJiBjb2RlID09PSAweDI1IC8qICUgKi8gJiYgaSArIDIgPCBsKSB7XG4gICAgICBpZiAoL15bMC05YS1mXXsyfSQvaS50ZXN0KHN0cmluZy5zbGljZShpICsgMSwgaSArIDMpKSkge1xuICAgICAgICByZXN1bHQgKz0gc3RyaW5nLnNsaWNlKGksIGkgKyAzKVxuICAgICAgICBpICs9IDJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA8IDEyOCkge1xuICAgICAgcmVzdWx0ICs9IGNhY2hlW2NvZGVdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REZGRikge1xuICAgICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhEQkZGICYmIGkgKyAxIDwgbCkge1xuICAgICAgICBjb25zdCBuZXh0Q29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGkgKyAxKVxuICAgICAgICBpZiAobmV4dENvZGUgPj0gMHhEQzAwICYmIG5leHRDb2RlIDw9IDB4REZGRikge1xuICAgICAgICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nW2ldICsgc3RyaW5nW2kgKyAxXSlcbiAgICAgICAgICBpKytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gJyVFRiVCRiVCRCdcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdbaV0pXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmVuY29kZS5kZWZhdWx0Q2hhcnMgPSBcIjsvPzpAJj0rJCwtXy4hfionKCkjXCJcbmVuY29kZS5jb21wb25lbnRDaGFycyA9IFwiLV8uIX4qJygpXCJcblxuZXhwb3J0IGRlZmF1bHQgZW5jb2RlXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQgKHVybCkge1xuICBsZXQgcmVzdWx0ID0gJydcblxuICByZXN1bHQgKz0gdXJsLnByb3RvY29sIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuc2xhc2hlcyA/ICcvLycgOiAnJ1xuICByZXN1bHQgKz0gdXJsLmF1dGggPyB1cmwuYXV0aCArICdAJyA6ICcnXG5cbiAgaWYgKHVybC5ob3N0bmFtZSAmJiB1cmwuaG9zdG5hbWUuaW5kZXhPZignOicpICE9PSAtMSkge1xuICAgIC8vIGlwdjYgYWRkcmVzc1xuICAgIHJlc3VsdCArPSAnWycgKyB1cmwuaG9zdG5hbWUgKyAnXSdcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgKz0gdXJsLmhvc3RuYW1lIHx8ICcnXG4gIH1cblxuICByZXN1bHQgKz0gdXJsLnBvcnQgPyAnOicgKyB1cmwucG9ydCA6ICcnXG4gIHJlc3VsdCArPSB1cmwucGF0aG5hbWUgfHwgJydcbiAgcmVzdWx0ICs9IHVybC5zZWFyY2ggfHwgJydcbiAgcmVzdWx0ICs9IHVybC5oYXNoIHx8ICcnXG5cbiAgcmV0dXJuIHJlc3VsdFxufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vL1xuLy8gQ2hhbmdlcyBmcm9tIGpveWVudC9ub2RlOlxuLy9cbi8vIDEuIE5vIGxlYWRpbmcgc2xhc2ggaW4gcGF0aHMsXG4vLyAgICBlLmcuIGluIGB1cmwucGFyc2UoJ2h0dHA6Ly9mb28/YmFyJylgIHBhdGhuYW1lIGlzIGBgLCBub3QgYC9gXG4vL1xuLy8gMi4gQmFja3NsYXNoZXMgYXJlIG5vdCByZXBsYWNlZCB3aXRoIHNsYXNoZXMsXG4vLyAgICBzbyBgaHR0cDpcXFxcZXhhbXBsZS5vcmdcXGAgaXMgdHJlYXRlZCBsaWtlIGEgcmVsYXRpdmUgcGF0aFxuLy9cbi8vIDMuIFRyYWlsaW5nIGNvbG9uIGlzIHRyZWF0ZWQgbGlrZSBhIHBhcnQgb2YgdGhlIHBhdGgsXG4vLyAgICBpLmUuIGluIGBodHRwOi8vZXhhbXBsZS5vcmc6Zm9vYCBwYXRobmFtZSBpcyBgOmZvb2Bcbi8vXG4vLyA0LiBOb3RoaW5nIGlzIFVSTC1lbmNvZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LFxuLy8gICAgKGluIGpveWVudC9ub2RlIHNvbWUgY2hhcnMgaW4gYXV0aCBhbmQgcGF0aHMgYXJlIGVuY29kZWQpXG4vL1xuLy8gNS4gYHVybC5wYXJzZSgpYCBkb2VzIG5vdCBoYXZlIGBwYXJzZVF1ZXJ5U3RyaW5nYCBhcmd1bWVudFxuLy9cbi8vIDYuIFJlbW92ZWQgZXh0cmFuZW91cyByZXN1bHQgcHJvcGVydGllczogYGhvc3RgLCBgcGF0aGAsIGBxdWVyeWAsIGV0Yy4sXG4vLyAgICB3aGljaCBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgb3RoZXIgcGFydHMgb2YgdGhlIHVybC5cbi8vXG5cbmZ1bmN0aW9uIFVybCAoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsXG4gIHRoaXMuc2xhc2hlcyA9IG51bGxcbiAgdGhpcy5hdXRoID0gbnVsbFxuICB0aGlzLnBvcnQgPSBudWxsXG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsXG4gIHRoaXMuaGFzaCA9IG51bGxcbiAgdGhpcy5zZWFyY2ggPSBudWxsXG4gIHRoaXMucGF0aG5hbWUgPSBudWxsXG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG5jb25zdCBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pXG5jb25zdCBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC9cblxuLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlICovXG5jb25zdCBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC9cblxuLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbi8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG5jb25zdCBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXVxuXG4vLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuY29uc3QgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpXG5cbi8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbmNvbnN0IGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpXG4vLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4vLyB0aGVtLlxuY29uc3Qgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSlcbmNvbnN0IGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXVxuY29uc3QgaG9zdG5hbWVNYXhMZW4gPSAyNTVcbmNvbnN0IGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC9cbmNvbnN0IGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvXG4vLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbi8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbmNvbnN0IGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gIGphdmFzY3JpcHQ6IHRydWUsXG4gICdqYXZhc2NyaXB0Oic6IHRydWVcbn1cbi8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuY29uc3Qgc2xhc2hlZFByb3RvY29sID0ge1xuICBodHRwOiB0cnVlLFxuICBodHRwczogdHJ1ZSxcbiAgZnRwOiB0cnVlLFxuICBnb3BoZXI6IHRydWUsXG4gIGZpbGU6IHRydWUsXG4gICdodHRwOic6IHRydWUsXG4gICdodHRwczonOiB0cnVlLFxuICAnZnRwOic6IHRydWUsXG4gICdnb3BoZXI6JzogdHJ1ZSxcbiAgJ2ZpbGU6JzogdHJ1ZVxufVxuXG5mdW5jdGlvbiB1cmxQYXJzZSAodXJsLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybFxuXG4gIGNvbnN0IHUgPSBuZXcgVXJsKClcbiAgdS5wYXJzZSh1cmwsIHNsYXNoZXNEZW5vdGVIb3N0KVxuICByZXR1cm4gdVxufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgbGV0IGxvd2VyUHJvdG8sIGhlYywgc2xhc2hlc1xuICBsZXQgcmVzdCA9IHVybFxuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpXG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIGNvbnN0IHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpXG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdXG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG5cbiAgbGV0IHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdClcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXVxuICAgIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpXG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvXG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aClcbiAgfVxuXG4gIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBnb3QgYSBob3N0XG4gIC8vIHVzZXJAc2VydmVyIGlzICphbHdheXMqIGludGVycHJldGVkIGFzIGEgaG9zdG5hbWUsIGFuZCB1cmxcbiAgLy8gcmVzb2x1dGlvbiB3aWxsIHRyZWF0IC8vZm9vL2JhciBhcyBob3N0PWZvbyxwYXRoPWJhciBiZWNhdXNlIHRoYXQnc1xuICAvLyBob3cgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgcmVsYXRpdmUgVVJMcy5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlICovXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHNsYXNoZXMgPSByZXN0LnN1YnN0cigwLCAyKSA9PT0gJy8vJ1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMilcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIGxldCBob3N0RW5kID0gLTFcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSlcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSkge1xuICAgICAgICBob3N0RW5kID0gaGVjXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgbGV0IGF1dGgsIGF0U2lnblxuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAvLyBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcsIGhvc3RFbmQpXG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKVxuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSlcbiAgICAgIHRoaXMuYXV0aCA9IGF1dGhcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pXG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHtcbiAgICAgICAgaG9zdEVuZCA9IGhlY1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7XG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAocmVzdFtob3N0RW5kIC0gMV0gPT09ICc6JykgeyBob3N0RW5kLS0gfVxuICAgIGNvbnN0IGhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpXG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZClcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoaG9zdClcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJ1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICBjb25zdCBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSdcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICBjb25zdCBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKVxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBob3N0cGFydHNbaV1cbiAgICAgICAgaWYgKCFwYXJ0KSB7IGNvbnRpbnVlIH1cbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgbGV0IG5ld3BhcnQgPSAnJ1xuICAgICAgICAgIGZvciAobGV0IGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4J1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIHRlc3QgYWdhaW4gd2l0aCBBU0NJSSBjaGFyIG9ubHlcbiAgICAgICAgICBpZiAoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSlcbiAgICAgICAgICAgIGNvbnN0IG5vdEhvc3QgPSBob3N0cGFydHMuc2xpY2UoaSArIDEpXG4gICAgICAgICAgICBjb25zdCBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KVxuICAgICAgICAgICAgaWYgKGJpdCkge1xuICAgICAgICAgICAgICB2YWxpZFBhcnRzLnB1c2goYml0WzFdKVxuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSB2YWxpZFBhcnRzLmpvaW4oJy4nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnXG4gICAgfVxuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMilcbiAgICB9XG4gIH1cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICBjb25zdCBoYXNoID0gcmVzdC5pbmRleE9mKCcjJylcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpXG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaClcbiAgfVxuICBjb25zdCBxbSA9IHJlc3QuaW5kZXhPZignPycpXG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKVxuICB9XG4gIGlmIChyZXN0KSB7IHRoaXMucGF0aG5hbWUgPSByZXN0IH1cbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnJ1xuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICBsZXQgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdClcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXVxuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpXG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKVxuICB9XG4gIGlmIChob3N0KSB7IHRoaXMuaG9zdG5hbWUgPSBob3N0IH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXJsUGFyc2VcbiIsImV4cG9ydCBkZWZhdWx0IC9bIS0jJS1cXCosLVxcLzo7XFw/QFxcWy1cXF1fXFx7XFx9XFx4QTFcXHhBN1xceEFCXFx4QjZcXHhCN1xceEJCXFx4QkZcXHUwMzdFXFx1MDM4N1xcdTA1NUEtXFx1MDU1RlxcdTA1ODlcXHUwNThBXFx1MDVCRVxcdTA1QzBcXHUwNUMzXFx1MDVDNlxcdTA1RjNcXHUwNUY0XFx1MDYwOVxcdTA2MEFcXHUwNjBDXFx1MDYwRFxcdTA2MUJcXHUwNjFELVxcdTA2MUZcXHUwNjZBLVxcdTA2NkRcXHUwNkQ0XFx1MDcwMC1cXHUwNzBEXFx1MDdGNy1cXHUwN0Y5XFx1MDgzMC1cXHUwODNFXFx1MDg1RVxcdTA5NjRcXHUwOTY1XFx1MDk3MFxcdTA5RkRcXHUwQTc2XFx1MEFGMFxcdTBDNzdcXHUwQzg0XFx1MERGNFxcdTBFNEZcXHUwRTVBXFx1MEU1QlxcdTBGMDQtXFx1MEYxMlxcdTBGMTRcXHUwRjNBLVxcdTBGM0RcXHUwRjg1XFx1MEZEMC1cXHUwRkQ0XFx1MEZEOVxcdTBGREFcXHUxMDRBLVxcdTEwNEZcXHUxMEZCXFx1MTM2MC1cXHUxMzY4XFx1MTQwMFxcdTE2NkVcXHUxNjlCXFx1MTY5Q1xcdTE2RUItXFx1MTZFRFxcdTE3MzVcXHUxNzM2XFx1MTdENC1cXHUxN0Q2XFx1MTdEOC1cXHUxN0RBXFx1MTgwMC1cXHUxODBBXFx1MTk0NFxcdTE5NDVcXHUxQTFFXFx1MUExRlxcdTFBQTAtXFx1MUFBNlxcdTFBQTgtXFx1MUFBRFxcdTFCNUEtXFx1MUI2MFxcdTFCN0RcXHUxQjdFXFx1MUJGQy1cXHUxQkZGXFx1MUMzQi1cXHUxQzNGXFx1MUM3RVxcdTFDN0ZcXHUxQ0MwLVxcdTFDQzdcXHUxQ0QzXFx1MjAxMC1cXHUyMDI3XFx1MjAzMC1cXHUyMDQzXFx1MjA0NS1cXHUyMDUxXFx1MjA1My1cXHUyMDVFXFx1MjA3RFxcdTIwN0VcXHUyMDhEXFx1MjA4RVxcdTIzMDgtXFx1MjMwQlxcdTIzMjlcXHUyMzJBXFx1Mjc2OC1cXHUyNzc1XFx1MjdDNVxcdTI3QzZcXHUyN0U2LVxcdTI3RUZcXHUyOTgzLVxcdTI5OThcXHUyOUQ4LVxcdTI5REJcXHUyOUZDXFx1MjlGRFxcdTJDRjktXFx1MkNGQ1xcdTJDRkVcXHUyQ0ZGXFx1MkQ3MFxcdTJFMDAtXFx1MkUyRVxcdTJFMzAtXFx1MkU0RlxcdTJFNTItXFx1MkU1RFxcdTMwMDEtXFx1MzAwM1xcdTMwMDgtXFx1MzAxMVxcdTMwMTQtXFx1MzAxRlxcdTMwMzBcXHUzMDNEXFx1MzBBMFxcdTMwRkJcXHVBNEZFXFx1QTRGRlxcdUE2MEQtXFx1QTYwRlxcdUE2NzNcXHVBNjdFXFx1QTZGMi1cXHVBNkY3XFx1QTg3NC1cXHVBODc3XFx1QThDRVxcdUE4Q0ZcXHVBOEY4LVxcdUE4RkFcXHVBOEZDXFx1QTkyRVxcdUE5MkZcXHVBOTVGXFx1QTlDMS1cXHVBOUNEXFx1QTlERVxcdUE5REZcXHVBQTVDLVxcdUFBNUZcXHVBQURFXFx1QUFERlxcdUFBRjBcXHVBQUYxXFx1QUJFQlxcdUZEM0VcXHVGRDNGXFx1RkUxMC1cXHVGRTE5XFx1RkUzMC1cXHVGRTUyXFx1RkU1NC1cXHVGRTYxXFx1RkU2M1xcdUZFNjhcXHVGRTZBXFx1RkU2QlxcdUZGMDEtXFx1RkYwM1xcdUZGMDUtXFx1RkYwQVxcdUZGMEMtXFx1RkYwRlxcdUZGMUFcXHVGRjFCXFx1RkYxRlxcdUZGMjBcXHVGRjNCLVxcdUZGM0RcXHVGRjNGXFx1RkY1QlxcdUZGNURcXHVGRjVGLVxcdUZGNjVdfFxcdUQ4MDBbXFx1REQwMC1cXHVERDAyXFx1REY5RlxcdURGRDBdfFxcdUQ4MDFcXHVERDZGfFxcdUQ4MDJbXFx1REM1N1xcdUREMUZcXHVERDNGXFx1REU1MC1cXHVERTU4XFx1REU3RlxcdURFRjAtXFx1REVGNlxcdURGMzktXFx1REYzRlxcdURGOTktXFx1REY5Q118XFx1RDgwM1tcXHVERUFEXFx1REY1NS1cXHVERjU5XFx1REY4Ni1cXHVERjg5XXxcXHVEODA0W1xcdURDNDctXFx1REM0RFxcdURDQkJcXHVEQ0JDXFx1RENCRS1cXHVEQ0MxXFx1REQ0MC1cXHVERDQzXFx1REQ3NFxcdURENzVcXHVEREM1LVxcdUREQzhcXHVERENEXFx1REREQlxcdUREREQtXFx1RERERlxcdURFMzgtXFx1REUzRFxcdURFQTldfFxcdUQ4MDVbXFx1REM0Qi1cXHVEQzRGXFx1REM1QVxcdURDNUJcXHVEQzVEXFx1RENDNlxcdUREQzEtXFx1REREN1xcdURFNDEtXFx1REU0M1xcdURFNjAtXFx1REU2Q1xcdURFQjlcXHVERjNDLVxcdURGM0VdfFxcdUQ4MDZbXFx1REMzQlxcdURENDQtXFx1REQ0NlxcdURERTJcXHVERTNGLVxcdURFNDZcXHVERTlBLVxcdURFOUNcXHVERTlFLVxcdURFQTJcXHVERjAwLVxcdURGMDldfFxcdUQ4MDdbXFx1REM0MS1cXHVEQzQ1XFx1REM3MFxcdURDNzFcXHVERUY3XFx1REVGOFxcdURGNDMtXFx1REY0RlxcdURGRkZdfFxcdUQ4MDlbXFx1REM3MC1cXHVEQzc0XXxcXHVEODBCW1xcdURGRjFcXHVERkYyXXxcXHVEODFBW1xcdURFNkVcXHVERTZGXFx1REVGNVxcdURGMzctXFx1REYzQlxcdURGNDRdfFxcdUQ4MUJbXFx1REU5Ny1cXHVERTlBXFx1REZFMl18XFx1RDgyRlxcdURDOUZ8XFx1RDgzNltcXHVERTg3LVxcdURFOEJdfFxcdUQ4M0FbXFx1REQ1RVxcdURENUZdLyIsImV4cG9ydCBkZWZhdWx0IC9bXFwkXFwrPC0+XFxeYFxcfH5cXHhBMi1cXHhBNlxceEE4XFx4QTlcXHhBQ1xceEFFLVxceEIxXFx4QjRcXHhCOFxceEQ3XFx4RjdcXHUwMkMyLVxcdTAyQzVcXHUwMkQyLVxcdTAyREZcXHUwMkU1LVxcdTAyRUJcXHUwMkVEXFx1MDJFRi1cXHUwMkZGXFx1MDM3NVxcdTAzODRcXHUwMzg1XFx1MDNGNlxcdTA0ODJcXHUwNThELVxcdTA1OEZcXHUwNjA2LVxcdTA2MDhcXHUwNjBCXFx1MDYwRVxcdTA2MEZcXHUwNkRFXFx1MDZFOVxcdTA2RkRcXHUwNkZFXFx1MDdGNlxcdTA3RkVcXHUwN0ZGXFx1MDg4OFxcdTA5RjJcXHUwOUYzXFx1MDlGQVxcdTA5RkJcXHUwQUYxXFx1MEI3MFxcdTBCRjMtXFx1MEJGQVxcdTBDN0ZcXHUwRDRGXFx1MEQ3OVxcdTBFM0ZcXHUwRjAxLVxcdTBGMDNcXHUwRjEzXFx1MEYxNS1cXHUwRjE3XFx1MEYxQS1cXHUwRjFGXFx1MEYzNFxcdTBGMzZcXHUwRjM4XFx1MEZCRS1cXHUwRkM1XFx1MEZDNy1cXHUwRkNDXFx1MEZDRVxcdTBGQ0ZcXHUwRkQ1LVxcdTBGRDhcXHUxMDlFXFx1MTA5RlxcdTEzOTAtXFx1MTM5OVxcdTE2NkRcXHUxN0RCXFx1MTk0MFxcdTE5REUtXFx1MTlGRlxcdTFCNjEtXFx1MUI2QVxcdTFCNzQtXFx1MUI3Q1xcdTFGQkRcXHUxRkJGLVxcdTFGQzFcXHUxRkNELVxcdTFGQ0ZcXHUxRkRELVxcdTFGREZcXHUxRkVELVxcdTFGRUZcXHUxRkZEXFx1MUZGRVxcdTIwNDRcXHUyMDUyXFx1MjA3QS1cXHUyMDdDXFx1MjA4QS1cXHUyMDhDXFx1MjBBMC1cXHUyMEMwXFx1MjEwMFxcdTIxMDFcXHUyMTAzLVxcdTIxMDZcXHUyMTA4XFx1MjEwOVxcdTIxMTRcXHUyMTE2LVxcdTIxMThcXHUyMTFFLVxcdTIxMjNcXHUyMTI1XFx1MjEyN1xcdTIxMjlcXHUyMTJFXFx1MjEzQVxcdTIxM0JcXHUyMTQwLVxcdTIxNDRcXHUyMTRBLVxcdTIxNERcXHUyMTRGXFx1MjE4QVxcdTIxOEJcXHUyMTkwLVxcdTIzMDdcXHUyMzBDLVxcdTIzMjhcXHUyMzJCLVxcdTI0MjZcXHUyNDQwLVxcdTI0NEFcXHUyNDlDLVxcdTI0RTlcXHUyNTAwLVxcdTI3NjdcXHUyNzk0LVxcdTI3QzRcXHUyN0M3LVxcdTI3RTVcXHUyN0YwLVxcdTI5ODJcXHUyOTk5LVxcdTI5RDdcXHUyOURDLVxcdTI5RkJcXHUyOUZFLVxcdTJCNzNcXHUyQjc2LVxcdTJCOTVcXHUyQjk3LVxcdTJCRkZcXHUyQ0U1LVxcdTJDRUFcXHUyRTUwXFx1MkU1MVxcdTJFODAtXFx1MkU5OVxcdTJFOUItXFx1MkVGM1xcdTJGMDAtXFx1MkZENVxcdTJGRjAtXFx1MkZGRlxcdTMwMDRcXHUzMDEyXFx1MzAxM1xcdTMwMjBcXHUzMDM2XFx1MzAzN1xcdTMwM0VcXHUzMDNGXFx1MzA5QlxcdTMwOUNcXHUzMTkwXFx1MzE5MVxcdTMxOTYtXFx1MzE5RlxcdTMxQzAtXFx1MzFFM1xcdTMxRUZcXHUzMjAwLVxcdTMyMUVcXHUzMjJBLVxcdTMyNDdcXHUzMjUwXFx1MzI2MC1cXHUzMjdGXFx1MzI4QS1cXHUzMkIwXFx1MzJDMC1cXHUzM0ZGXFx1NERDMC1cXHU0REZGXFx1QTQ5MC1cXHVBNEM2XFx1QTcwMC1cXHVBNzE2XFx1QTcyMFxcdUE3MjFcXHVBNzg5XFx1QTc4QVxcdUE4MjgtXFx1QTgyQlxcdUE4MzYtXFx1QTgzOVxcdUFBNzctXFx1QUE3OVxcdUFCNUJcXHVBQjZBXFx1QUI2QlxcdUZCMjlcXHVGQkIyLVxcdUZCQzJcXHVGRDQwLVxcdUZENEZcXHVGRENGXFx1RkRGQy1cXHVGREZGXFx1RkU2MlxcdUZFNjQtXFx1RkU2NlxcdUZFNjlcXHVGRjA0XFx1RkYwQlxcdUZGMUMtXFx1RkYxRVxcdUZGM0VcXHVGRjQwXFx1RkY1Q1xcdUZGNUVcXHVGRkUwLVxcdUZGRTZcXHVGRkU4LVxcdUZGRUVcXHVGRkZDXFx1RkZGRF18XFx1RDgwMFtcXHVERDM3LVxcdUREM0ZcXHVERDc5LVxcdUREODlcXHVERDhDLVxcdUREOEVcXHVERDkwLVxcdUREOUNcXHVEREEwXFx1REREMC1cXHVEREZDXXxcXHVEODAyW1xcdURDNzdcXHVEQzc4XFx1REVDOF18XFx1RDgwNVxcdURGM0Z8XFx1RDgwN1tcXHVERkQ1LVxcdURGRjFdfFxcdUQ4MUFbXFx1REYzQy1cXHVERjNGXFx1REY0NV18XFx1RDgyRlxcdURDOUN8XFx1RDgzM1tcXHVERjUwLVxcdURGQzNdfFxcdUQ4MzRbXFx1REMwMC1cXHVEQ0Y1XFx1REQwMC1cXHVERDI2XFx1REQyOS1cXHVERDY0XFx1REQ2QS1cXHVERDZDXFx1REQ4M1xcdUREODRcXHVERDhDLVxcdUREQTlcXHVEREFFLVxcdURERUFcXHVERTAwLVxcdURFNDFcXHVERTQ1XFx1REYwMC1cXHVERjU2XXxcXHVEODM1W1xcdURFQzFcXHVERURCXFx1REVGQlxcdURGMTVcXHVERjM1XFx1REY0RlxcdURGNkZcXHVERjg5XFx1REZBOVxcdURGQzNdfFxcdUQ4MzZbXFx1REMwMC1cXHVEREZGXFx1REUzNy1cXHVERTNBXFx1REU2RC1cXHVERTc0XFx1REU3Ni1cXHVERTgzXFx1REU4NVxcdURFODZdfFxcdUQ4MzhbXFx1REQ0RlxcdURFRkZdfFxcdUQ4M0JbXFx1RENBQ1xcdURDQjBcXHVERDJFXFx1REVGMFxcdURFRjFdfFxcdUQ4M0NbXFx1REMwMC1cXHVEQzJCXFx1REMzMC1cXHVEQzkzXFx1RENBMC1cXHVEQ0FFXFx1RENCMS1cXHVEQ0JGXFx1RENDMS1cXHVEQ0NGXFx1RENEMS1cXHVEQ0Y1XFx1REQwRC1cXHVEREFEXFx1RERFNi1cXHVERTAyXFx1REUxMC1cXHVERTNCXFx1REU0MC1cXHVERTQ4XFx1REU1MFxcdURFNTFcXHVERTYwLVxcdURFNjVcXHVERjAwLVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVERUQ3XFx1REVEQy1cXHVERUVDXFx1REVGMC1cXHVERUZDXFx1REYwMC1cXHVERjc2XFx1REY3Qi1cXHVERkQ5XFx1REZFMC1cXHVERkVCXFx1REZGMF18XFx1RDgzRVtcXHVEQzAwLVxcdURDMEJcXHVEQzEwLVxcdURDNDdcXHVEQzUwLVxcdURDNTlcXHVEQzYwLVxcdURDODdcXHVEQzkwLVxcdURDQURcXHVEQ0IwXFx1RENCMVxcdUREMDAtXFx1REU1M1xcdURFNjAtXFx1REU2RFxcdURFNzAtXFx1REU3Q1xcdURFODAtXFx1REU4OFxcdURFOTAtXFx1REVCRFxcdURFQkYtXFx1REVDNVxcdURFQ0UtXFx1REVEQlxcdURFRTAtXFx1REVFOFxcdURFRjAtXFx1REVGOFxcdURGMDAtXFx1REY5MlxcdURGOTQtXFx1REZDQV0vIiwiZXhwb3J0IGRlZmF1bHQgL1tcXDAtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS8iLCJleHBvcnQgZGVmYXVsdCAvW1xcMC1cXHgxRlxceDdGLVxceDlGXS8iLCJleHBvcnQgZGVmYXVsdCAvW1xceEFEXFx1MDYwMC1cXHUwNjA1XFx1MDYxQ1xcdTA2RERcXHUwNzBGXFx1MDg5MFxcdTA4OTFcXHUwOEUyXFx1MTgwRVxcdTIwMEItXFx1MjAwRlxcdTIwMkEtXFx1MjAyRVxcdTIwNjAtXFx1MjA2NFxcdTIwNjYtXFx1MjA2RlxcdUZFRkZcXHVGRkY5LVxcdUZGRkJdfFxcdUQ4MDRbXFx1RENCRFxcdURDQ0RdfFxcdUQ4MERbXFx1REMzMC1cXHVEQzNGXXxcXHVEODJGW1xcdURDQTAtXFx1RENBM118XFx1RDgzNFtcXHVERDczLVxcdUREN0FdfFxcdURCNDBbXFx1REMwMVxcdURDMjAtXFx1REM3Rl0vIiwiZXhwb3J0IGRlZmF1bHQgL1sgXFx4QTBcXHUxNjgwXFx1MjAwMC1cXHUyMDBBXFx1MjAyOFxcdTIwMjlcXHUyMDJGXFx1MjA1RlxcdTMwMDBdLyIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiLy8gVXRpbGl0aWVzXG4vL1xuXG5pbXBvcnQgKiBhcyBtZHVybCBmcm9tICdtZHVybCdcbmltcG9ydCAqIGFzIHVjbWljcm8gZnJvbSAndWMubWljcm8nXG5pbXBvcnQgeyBkZWNvZGVIVE1MIH0gZnJvbSAnZW50aXRpZXMnXG5cbmZ1bmN0aW9uIF9jbGFzcyAob2JqKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSB9XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBTdHJpbmddJyB9XG5cbmNvbnN0IF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuZnVuY3Rpb24gaGFzIChvYmplY3QsIGtleSkge1xuICByZXR1cm4gX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG59XG5cbi8vIE1lcmdlIG9iamVjdHNcbi8vXG5mdW5jdGlvbiBhc3NpZ24gKG9iaiAvKiBmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4gKi8pIHtcbiAgY29uc3Qgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcblxuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGlmICghc291cmNlKSB7IHJldHVybiB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgb2JqZWN0JylcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBSZW1vdmUgZWxlbWVudCBmcm9tIGFycmF5IGFuZCBwdXQgYW5vdGhlciBhcnJheSBhdCB0aG9zZSBwb3NpdGlvbi5cbi8vIFVzZWZ1bCBmb3Igc29tZSBvcGVyYXRpb25zIHdpdGggdG9rZW5zXG5mdW5jdGlvbiBhcnJheVJlcGxhY2VBdCAoc3JjLCBwb3MsIG5ld0VsZW1lbnRzKSB7XG4gIHJldHVybiBbXS5jb25jYXQoc3JjLnNsaWNlKDAsIHBvcyksIG5ld0VsZW1lbnRzLCBzcmMuc2xpY2UocG9zICsgMSkpXG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbnRpdHlDb2RlIChjKSB7XG4gIC8qIGVzbGludCBuby1iaXR3aXNlOjAgKi9cbiAgLy8gYnJva2VuIHNlcXVlbmNlXG4gIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikgeyByZXR1cm4gZmFsc2UgfVxuICAvLyBuZXZlciB1c2VkXG4gIGlmIChjID49IDB4RkREMCAmJiBjIDw9IDB4RkRFRikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoKGMgJiAweEZGRkYpID09PSAweEZGRkYgfHwgKGMgJiAweEZGRkYpID09PSAweEZGRkUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gY29udHJvbCBjb2Rlc1xuICBpZiAoYyA+PSAweDAwICYmIGMgPD0gMHgwOCkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA9PT0gMHgwQikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA+PSAweDBFICYmIGMgPD0gMHgxRikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA+PSAweDdGICYmIGMgPD0gMHg5RikgeyByZXR1cm4gZmFsc2UgfVxuICAvLyBvdXQgb2YgcmFuZ2VcbiAgaWYgKGMgPiAweDEwRkZGRikgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50IChjKSB7XG4gIC8qIGVzbGludCBuby1iaXR3aXNlOjAgKi9cbiAgaWYgKGMgPiAweGZmZmYpIHtcbiAgICBjIC09IDB4MTAwMDBcbiAgICBjb25zdCBzdXJyb2dhdGUxID0gMHhkODAwICsgKGMgPj4gMTApXG4gICAgY29uc3Qgc3Vycm9nYXRlMiA9IDB4ZGMwMCArIChjICYgMHgzZmYpXG5cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzdXJyb2dhdGUxLCBzdXJyb2dhdGUyKVxuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpXG59XG5cbmNvbnN0IFVORVNDQVBFX01EX1JFICA9IC9cXFxcKFshXCIjJCUmJygpKissXFwtLi86Ozw9Pj9AW1xcXFxcXF1eX2B7fH1+XSkvZ1xuY29uc3QgRU5USVRZX1JFICAgICAgID0gLyYoW2EteiNdW2EtejAtOV17MSwzMX0pOy9naVxuY29uc3QgVU5FU0NBUEVfQUxMX1JFID0gbmV3IFJlZ0V4cChVTkVTQ0FQRV9NRF9SRS5zb3VyY2UgKyAnfCcgKyBFTlRJVFlfUkUuc291cmNlLCAnZ2knKVxuXG5jb25zdCBESUdJVEFMX0VOVElUWV9URVNUX1JFID0gL14jKCg/OnhbYS1mMC05XXsxLDh9fFswLTldezEsOH0pKSQvaVxuXG5mdW5jdGlvbiByZXBsYWNlRW50aXR5UGF0dGVybiAobWF0Y2gsIG5hbWUpIHtcbiAgaWYgKG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gMHgyMy8qICMgKi8gJiYgRElHSVRBTF9FTlRJVFlfVEVTVF9SRS50ZXN0KG5hbWUpKSB7XG4gICAgY29uc3QgY29kZSA9IG5hbWVbMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnXG4gICAgICA/IHBhcnNlSW50KG5hbWUuc2xpY2UoMiksIDE2KVxuICAgICAgOiBwYXJzZUludChuYW1lLnNsaWNlKDEpLCAxMClcblxuICAgIGlmIChpc1ZhbGlkRW50aXR5Q29kZShjb2RlKSkge1xuICAgICAgcmV0dXJuIGZyb21Db2RlUG9pbnQoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hcbiAgfVxuXG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVIVE1MKG1hdGNoKVxuICBpZiAoZGVjb2RlZCAhPT0gbWF0Y2gpIHtcbiAgICByZXR1cm4gZGVjb2RlZFxuICB9XG5cbiAgcmV0dXJuIG1hdGNoXG59XG5cbi8qIGZ1bmN0aW9uIHJlcGxhY2VFbnRpdGllcyhzdHIpIHtcbiAgaWYgKHN0ci5pbmRleE9mKCcmJykgPCAwKSB7IHJldHVybiBzdHI7IH1cblxuICByZXR1cm4gc3RyLnJlcGxhY2UoRU5USVRZX1JFLCByZXBsYWNlRW50aXR5UGF0dGVybik7XG59ICovXG5cbmZ1bmN0aW9uIHVuZXNjYXBlTWQgKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJ1xcXFwnKSA8IDApIHsgcmV0dXJuIHN0ciB9XG4gIHJldHVybiBzdHIucmVwbGFjZShVTkVTQ0FQRV9NRF9SRSwgJyQxJylcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVBbGwgKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJ1xcXFwnKSA8IDAgJiYgc3RyLmluZGV4T2YoJyYnKSA8IDApIHsgcmV0dXJuIHN0ciB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFVORVNDQVBFX0FMTF9SRSwgZnVuY3Rpb24gKG1hdGNoLCBlc2NhcGVkLCBlbnRpdHkpIHtcbiAgICBpZiAoZXNjYXBlZCkgeyByZXR1cm4gZXNjYXBlZCB9XG4gICAgcmV0dXJuIHJlcGxhY2VFbnRpdHlQYXR0ZXJuKG1hdGNoLCBlbnRpdHkpXG4gIH0pXG59XG5cbmNvbnN0IEhUTUxfRVNDQVBFX1RFU1RfUkUgPSAvWyY8PlwiXS9cbmNvbnN0IEhUTUxfRVNDQVBFX1JFUExBQ0VfUkUgPSAvWyY8PlwiXS9nXG5jb25zdCBIVE1MX1JFUExBQ0VNRU5UUyA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VVbnNhZmVDaGFyIChjaCkge1xuICByZXR1cm4gSFRNTF9SRVBMQUNFTUVOVFNbY2hdXG59XG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwgKHN0cikge1xuICBpZiAoSFRNTF9FU0NBUEVfVEVTVF9SRS50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoSFRNTF9FU0NBUEVfUkVQTEFDRV9SRSwgcmVwbGFjZVVuc2FmZUNoYXIpXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5jb25zdCBSRUdFWFBfRVNDQVBFX1JFID0gL1suPyorXiRbXFxdXFxcXCgpe318LV0vZ1xuXG5mdW5jdGlvbiBlc2NhcGVSRSAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfRVNDQVBFX1JFLCAnXFxcXCQmJylcbn1cblxuZnVuY3Rpb24gaXNTcGFjZSAoY29kZSkge1xuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4MDk6XG4gICAgY2FzZSAweDIwOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gWnMgKHVuaWNvZGUgY2xhc3MpIHx8IFtcXHRcXGZcXHZcXHJcXG5dXG5mdW5jdGlvbiBpc1doaXRlU3BhY2UgKGNvZGUpIHtcbiAgaWYgKGNvZGUgPj0gMHgyMDAwICYmIGNvZGUgPD0gMHgyMDBBKSB7IHJldHVybiB0cnVlIH1cbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAweDA5OiAvLyBcXHRcbiAgICBjYXNlIDB4MEE6IC8vIFxcblxuICAgIGNhc2UgMHgwQjogLy8gXFx2XG4gICAgY2FzZSAweDBDOiAvLyBcXGZcbiAgICBjYXNlIDB4MEQ6IC8vIFxcclxuICAgIGNhc2UgMHgyMDpcbiAgICBjYXNlIDB4QTA6XG4gICAgY2FzZSAweDE2ODA6XG4gICAgY2FzZSAweDIwMkY6XG4gICAgY2FzZSAweDIwNUY6XG4gICAgY2FzZSAweDMwMDA6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbi8vIEN1cnJlbnRseSB3aXRob3V0IGFzdHJhbCBjaGFyYWN0ZXJzIHN1cHBvcnQuXG5mdW5jdGlvbiBpc1B1bmN0Q2hhciAoY2gpIHtcbiAgcmV0dXJuIHVjbWljcm8uUC50ZXN0KGNoKSB8fCB1Y21pY3JvLlMudGVzdChjaClcbn1cblxuLy8gTWFya2Rvd24gQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVycy5cbi8vXG4vLyAhLCBcIiwgIywgJCwgJSwgJiwgJywgKCwgKSwgKiwgKywgLCwgLSwgLiwgLywgOiwgOywgPCwgPSwgPiwgPywgQCwgWywgXFwsIF0sIF4sIF8sIGAsIHssIHwsIH0sIG9yIH5cbi8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTUvI2FzY2lpLXB1bmN0dWF0aW9uLWNoYXJhY3RlclxuLy9cbi8vIERvbid0IGNvbmZ1c2Ugd2l0aCB1bmljb2RlIHB1bmN0dWF0aW9uICEhISBJdCBsYWNrcyBzb21lIGNoYXJzIGluIGFzY2lpIHJhbmdlLlxuLy9cbmZ1bmN0aW9uIGlzTWRBc2NpaVB1bmN0IChjaCkge1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAweDIxLyogISAqLzpcbiAgICBjYXNlIDB4MjIvKiBcIiAqLzpcbiAgICBjYXNlIDB4MjMvKiAjICovOlxuICAgIGNhc2UgMHgyNC8qICQgKi86XG4gICAgY2FzZSAweDI1LyogJSAqLzpcbiAgICBjYXNlIDB4MjYvKiAmICovOlxuICAgIGNhc2UgMHgyNy8qICcgKi86XG4gICAgY2FzZSAweDI4LyogKCAqLzpcbiAgICBjYXNlIDB4MjkvKiApICovOlxuICAgIGNhc2UgMHgyQS8qICogKi86XG4gICAgY2FzZSAweDJCLyogKyAqLzpcbiAgICBjYXNlIDB4MkMvKiAsICovOlxuICAgIGNhc2UgMHgyRC8qIC0gKi86XG4gICAgY2FzZSAweDJFLyogLiAqLzpcbiAgICBjYXNlIDB4MkYvKiAvICovOlxuICAgIGNhc2UgMHgzQS8qIDogKi86XG4gICAgY2FzZSAweDNCLyogOyAqLzpcbiAgICBjYXNlIDB4M0MvKiA8ICovOlxuICAgIGNhc2UgMHgzRC8qID0gKi86XG4gICAgY2FzZSAweDNFLyogPiAqLzpcbiAgICBjYXNlIDB4M0YvKiA/ICovOlxuICAgIGNhc2UgMHg0MC8qIEAgKi86XG4gICAgY2FzZSAweDVCLyogWyAqLzpcbiAgICBjYXNlIDB4NUMvKiBcXCAqLzpcbiAgICBjYXNlIDB4NUQvKiBdICovOlxuICAgIGNhc2UgMHg1RS8qIF4gKi86XG4gICAgY2FzZSAweDVGLyogXyAqLzpcbiAgICBjYXNlIDB4NjAvKiBgICovOlxuICAgIGNhc2UgMHg3Qi8qIHsgKi86XG4gICAgY2FzZSAweDdDLyogfCAqLzpcbiAgICBjYXNlIDB4N0QvKiB9ICovOlxuICAgIGNhc2UgMHg3RS8qIH4gKi86XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vLyBIZXBsZXIgdG8gdW5pZnkgW3JlZmVyZW5jZSBsYWJlbHNdLlxuLy9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlZmVyZW5jZSAoc3RyKSB7XG4gIC8vIFRyaW0gYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2VcbiAgLy9cbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJylcblxuICAvLyBJbiBub2RlIHYxMCAn4bqeJy50b0xvd2VyQ2FzZSgpID09PSAn4bm+Jywgd2hpY2ggaXMgcHJlc3VtZWQgdG8gYmUgYSBidWdcbiAgLy8gZml4ZWQgaW4gdjEyIChjb3VsZG4ndCBmaW5kIGFueSBkZXRhaWxzKS5cbiAgLy9cbiAgLy8gU28gdHJlYXQgdGhpcyBvbmUgYXMgYSBzcGVjaWFsIGNhc2VcbiAgLy8gKHJlbW92ZSB0aGlzIHdoZW4gbm9kZSB2MTAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCkuXG4gIC8vXG4gIGlmICgn4bqeJy50b0xvd2VyQ2FzZSgpID09PSAn4bm+Jykge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/hup4vZywgJ8OfJylcbiAgfVxuXG4gIC8vIC50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkgc2hvdWxkIGdldCByaWQgb2YgYWxsIGRpZmZlcmVuY2VzXG4gIC8vIGJldHdlZW4gbGV0dGVyIHZhcmlhbnRzLlxuICAvL1xuICAvLyBTaW1wbGUgLnRvTG93ZXJDYXNlKCkgZG9lc24ndCBub3JtYWxpemUgMTI1IGNvZGUgcG9pbnRzIGNvcnJlY3RseSxcbiAgLy8gYW5kIC50b1VwcGVyQ2FzZSBkb2Vzbid0IG5vcm1hbGl6ZSA2IG9mIHRoZW0gKGxpc3Qgb2YgZXhjZXB0aW9uczpcbiAgLy8gxLAsIM+0LCDhup4sIOKEpiwg4oSqLCDihKsgLSB0aG9zZSBhcmUgYWxyZWFkeSB1cHBlcmNhc2VkLCBidXQgaGF2ZSBkaWZmZXJlbnRseVxuICAvLyB1cHBlcmNhc2VkIHZlcnNpb25zKS5cbiAgLy9cbiAgLy8gSGVyZSdzIGFuIGV4YW1wbGUgc2hvd2luZyBob3cgaXQgaGFwcGVucy4gTGV0cyB0YWtlIGdyZWVrIGxldHRlciBvbWVnYTpcbiAgLy8gdXBwZXJjYXNlIFUrMDM5OCAozpgpLCBVKzAzZjQgKM+0KSBhbmQgbG93ZXJjYXNlIFUrMDNiOCAozrgpLCBVKzAzZDEgKM+RKVxuICAvL1xuICAvLyBVbmljb2RlIGVudHJpZXM6XG4gIC8vIDAzOTg7R1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEE7THU7MDtMOzs7OztOOzs7OzAzQjg7XG4gIC8vIDAzQjg7R1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBO0xsOzA7TDs7Ozs7Tjs7OzAzOTg7OzAzOThcbiAgLy8gMDNEMTtHUkVFSyBUSEVUQSBTWU1CT0w7TGw7MDtMOzxjb21wYXQ+IDAzQjg7Ozs7TjtHUkVFSyBTTUFMTCBMRVRURVIgU0NSSVBUIFRIRVRBOzswMzk4OzswMzk4XG4gIC8vIDAzRjQ7R1JFRUsgQ0FQSVRBTCBUSEVUQSBTWU1CT0w7THU7MDtMOzxjb21wYXQ+IDAzOTg7Ozs7Tjs7OzswM0I4O1xuICAvL1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gc2hvdWxkIHRyZWF0IGFsbCBvZiB0aGVtIGFzIGVxdWl2YWxlbnQuXG4gIC8vXG4gIC8vIEJ1dCAudG9Mb3dlckNhc2UoKSBkb2Vzbid0IGNoYW5nZSDPkSAoaXQncyBhbHJlYWR5IGxvd2VyY2FzZSksXG4gIC8vIGFuZCAudG9VcHBlckNhc2UoKSBkb2Vzbid0IGNoYW5nZSDPtCAoYWxyZWFkeSB1cHBlcmNhc2UpLlxuICAvL1xuICAvLyBBcHBseWluZyBmaXJzdCBsb3dlciB0aGVuIHVwcGVyIGNhc2Ugbm9ybWFsaXplcyBhbnkgY2hhcmFjdGVyOlxuICAvLyAnXFx1MDM5OFxcdTAzZjRcXHUwM2I4XFx1MDNkMScudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpID09PSAnXFx1MDM5OFxcdTAzOThcXHUwMzk4XFx1MDM5OCdcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBpcyBlcXVpdmFsZW50IHRvIHVuaWNvZGUgY2FzZSBmb2xkaW5nOyB1bmljb2RlIG5vcm1hbGl6YXRpb25cbiAgLy8gaXMgYSBkaWZmZXJlbnQgc3RlcCB0aGF0IGlzIG5vdCByZXF1aXJlZCBoZXJlLlxuICAvL1xuICAvLyBGaW5hbCByZXN1bHQgc2hvdWxkIGJlIHVwcGVyY2FzZWQsIGJlY2F1c2UgaXQncyBsYXRlciBzdG9yZWQgaW4gYW4gb2JqZWN0XG4gIC8vICh0aGlzIGF2b2lkIGEgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIG1lbWJlcnMsXG4gIC8vIG1vc3Qgbm90YWJseSwgYF9fcHJvdG9fX2ApXG4gIC8vXG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpXG59XG5cbi8vIFJlLWV4cG9ydCBsaWJyYXJpZXMgY29tbW9ubHkgdXNlZCBpbiBib3RoIG1hcmtkb3duLWl0IGFuZCBpdHMgcGx1Z2lucyxcbi8vIHNvIHBsdWdpbnMgd29uJ3QgaGF2ZSB0byBkZXBlbmQgb24gdGhlbSBleHBsaWNpdGx5LCB3aGljaCByZWR1Y2VzIHRoZWlyXG4vLyBidW5kbGVkIHNpemUgKGUuZy4gYSBicm93c2VyIGJ1aWxkKS5cbi8vXG5jb25zdCBsaWIgPSB7IG1kdXJsLCB1Y21pY3JvIH1cblxuZXhwb3J0IHtcbiAgbGliLFxuICBhc3NpZ24sXG4gIGlzU3RyaW5nLFxuICBoYXMsXG4gIHVuZXNjYXBlTWQsXG4gIHVuZXNjYXBlQWxsLFxuICBpc1ZhbGlkRW50aXR5Q29kZSxcbiAgZnJvbUNvZGVQb2ludCxcbiAgZXNjYXBlSHRtbCxcbiAgYXJyYXlSZXBsYWNlQXQsXG4gIGlzU3BhY2UsXG4gIGlzV2hpdGVTcGFjZSxcbiAgaXNNZEFzY2lpUHVuY3QsXG4gIGlzUHVuY3RDaGFyLFxuICBlc2NhcGVSRSxcbiAgbm9ybWFsaXplUmVmZXJlbmNlXG59XG4iLCIvLyBQYXJzZSBsaW5rIGxhYmVsXG4vL1xuLy8gdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZmlyc3QgY2hhcmFjdGVyIChcIltcIikgYWxyZWFkeSBtYXRjaGVzO1xuLy8gcmV0dXJucyB0aGUgZW5kIG9mIHRoZSBsYWJlbFxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VMaW5rTGFiZWwgKHN0YXRlLCBzdGFydCwgZGlzYWJsZU5lc3RlZCkge1xuICBsZXQgbGV2ZWwsIGZvdW5kLCBtYXJrZXIsIHByZXZQb3NcblxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3Qgb2xkUG9zID0gc3RhdGUucG9zXG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyAxXG4gIGxldmVsID0gMVxuXG4gIHdoaWxlIChzdGF0ZS5wb3MgPCBtYXgpIHtcbiAgICBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpXG4gICAgaWYgKG1hcmtlciA9PT0gMHg1RCAvKiBdICovKSB7XG4gICAgICBsZXZlbC0tXG4gICAgICBpZiAobGV2ZWwgPT09IDApIHtcbiAgICAgICAgZm91bmQgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJldlBvcyA9IHN0YXRlLnBvc1xuICAgIHN0YXRlLm1kLmlubGluZS5za2lwVG9rZW4oc3RhdGUpXG4gICAgaWYgKG1hcmtlciA9PT0gMHg1QiAvKiBbICovKSB7XG4gICAgICBpZiAocHJldlBvcyA9PT0gc3RhdGUucG9zIC0gMSkge1xuICAgICAgICAvLyBpbmNyZWFzZSBsZXZlbCBpZiB3ZSBmaW5kIHRleHQgYFtgLCB3aGljaCBpcyBub3QgYSBwYXJ0IG9mIGFueSB0b2tlblxuICAgICAgICBsZXZlbCsrXG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGVOZXN0ZWQpIHtcbiAgICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBsYWJlbEVuZCA9IC0xXG5cbiAgaWYgKGZvdW5kKSB7XG4gICAgbGFiZWxFbmQgPSBzdGF0ZS5wb3NcbiAgfVxuXG4gIC8vIHJlc3RvcmUgb2xkIHN0YXRlXG4gIHN0YXRlLnBvcyA9IG9sZFBvc1xuXG4gIHJldHVybiBsYWJlbEVuZFxufVxuIiwiLy8gUGFyc2UgbGluayBkZXN0aW5hdGlvblxuLy9cblxuaW1wb3J0IHsgdW5lc2NhcGVBbGwgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUxpbmtEZXN0aW5hdGlvbiAoc3RyLCBzdGFydCwgbWF4KSB7XG4gIGxldCBjb2RlXG4gIGxldCBwb3MgPSBzdGFydFxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBvazogZmFsc2UsXG4gICAgcG9zOiAwLFxuICAgIHN0cjogJydcbiAgfVxuXG4gIGlmIChzdHIuY2hhckNvZGVBdChwb3MpID09PSAweDNDIC8qIDwgKi8pIHtcbiAgICBwb3MrK1xuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoY29kZSA9PT0gMHgwQSAvKiBcXG4gKi8pIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgICBpZiAoY29kZSA9PT0gMHgzQyAvKiA8ICovKSB7IHJldHVybiByZXN1bHQgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4M0UgLyogPiAqLykge1xuICAgICAgICByZXN1bHQucG9zID0gcG9zICsgMVxuICAgICAgICByZXN1bHQuc3RyID0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0ICsgMSwgcG9zKSlcbiAgICAgICAgcmVzdWx0Lm9rID0gdHJ1ZVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gMHg1QyAvKiBcXCAqLyAmJiBwb3MgKyAxIDwgbWF4KSB7XG4gICAgICAgIHBvcyArPSAyXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgLy8gbm8gY2xvc2luZyAnPidcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyB0aGlzIHNob3VsZCBiZSAuLi4gfSBlbHNlIHsgLi4uIGJyYW5jaFxuXG4gIGxldCBsZXZlbCA9IDBcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoY29kZSA9PT0gMHgyMCkgeyBicmVhayB9XG5cbiAgICAvLyBhc2NpaSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDB4MjAgfHwgY29kZSA9PT0gMHg3RikgeyBicmVhayB9XG5cbiAgICBpZiAoY29kZSA9PT0gMHg1QyAvKiBcXCAqLyAmJiBwb3MgKyAxIDwgbWF4KSB7XG4gICAgICBpZiAoc3RyLmNoYXJDb2RlQXQocG9zICsgMSkgPT09IDB4MjApIHsgYnJlYWsgfVxuICAgICAgcG9zICs9IDJcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4MjggLyogKCAqLykge1xuICAgICAgbGV2ZWwrK1xuICAgICAgaWYgKGxldmVsID4gMzIpIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4MjkgLyogKSAqLykge1xuICAgICAgaWYgKGxldmVsID09PSAwKSB7IGJyZWFrIH1cbiAgICAgIGxldmVsLS1cbiAgICB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSBwb3MpIHsgcmV0dXJuIHJlc3VsdCB9XG4gIGlmIChsZXZlbCAhPT0gMCkgeyByZXR1cm4gcmVzdWx0IH1cblxuICByZXN1bHQuc3RyID0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICByZXN1bHQucG9zID0gcG9zXG4gIHJlc3VsdC5vayA9IHRydWVcbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLy8gUGFyc2UgbGluayB0aXRsZVxuLy9cblxuaW1wb3J0IHsgdW5lc2NhcGVBbGwgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG4vLyBQYXJzZSBsaW5rIHRpdGxlIHdpdGhpbiBgc3RyYCBpbiBbc3RhcnQsIG1heF0gcmFuZ2UsXG4vLyBvciBjb250aW51ZSBwcmV2aW91cyBwYXJzaW5nIGlmIGBwcmV2X3N0YXRlYCBpcyBkZWZpbmVkIChlcXVhbCB0byByZXN1bHQgb2YgbGFzdCBleGVjdXRpb24pLlxuLy9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlTGlua1RpdGxlIChzdHIsIHN0YXJ0LCBtYXgsIHByZXZfc3RhdGUpIHtcbiAgbGV0IGNvZGVcbiAgbGV0IHBvcyA9IHN0YXJ0XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgLy8gaWYgYHRydWVgLCB0aGlzIGlzIGEgdmFsaWQgbGluayB0aXRsZVxuICAgIG9rOiBmYWxzZSxcbiAgICAvLyBpZiBgdHJ1ZWAsIHRoaXMgbGluayBjYW4gYmUgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmVcbiAgICBjYW5fY29udGludWU6IGZhbHNlLFxuICAgIC8vIGlmIGBva2AsIGl0J3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNsb3NpbmcgbWFya2VyXG4gICAgcG9zOiAwLFxuICAgIC8vIGlmIGBva2AsIGl0J3MgdGhlIHVuZXNjYXBlZCB0aXRsZVxuICAgIHN0cjogJycsXG4gICAgLy8gZXhwZWN0ZWQgY2xvc2luZyBtYXJrZXIgY2hhcmFjdGVyIGNvZGVcbiAgICBtYXJrZXI6IDBcbiAgfVxuXG4gIGlmIChwcmV2X3N0YXRlKSB7XG4gICAgLy8gdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBvZiBhIHByZXZpb3VzIHBhcnNlTGlua1RpdGxlIGNhbGwgb24gdGhlIG5leHQgbGluZSxcbiAgICAvLyB1c2VkIGluIHJlZmVyZW5jZSBsaW5rcyBvbmx5XG4gICAgc3RhdGUuc3RyID0gcHJldl9zdGF0ZS5zdHJcbiAgICBzdGF0ZS5tYXJrZXIgPSBwcmV2X3N0YXRlLm1hcmtlclxuICB9IGVsc2Uge1xuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBzdGF0ZSB9XG5cbiAgICBsZXQgbWFya2VyID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChtYXJrZXIgIT09IDB4MjIgLyogXCIgKi8gJiYgbWFya2VyICE9PSAweDI3IC8qICcgKi8gJiYgbWFya2VyICE9PSAweDI4IC8qICggKi8pIHsgcmV0dXJuIHN0YXRlIH1cblxuICAgIHN0YXJ0KytcbiAgICBwb3MrK1xuXG4gICAgLy8gaWYgb3BlbmluZyBtYXJrZXIgaXMgXCIoXCIsIHN3aXRjaCBpdCB0byBjbG9zaW5nIG1hcmtlciBcIilcIlxuICAgIGlmIChtYXJrZXIgPT09IDB4MjgpIHsgbWFya2VyID0gMHgyOSB9XG5cbiAgICBzdGF0ZS5tYXJrZXIgPSBtYXJrZXJcbiAgfVxuXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjb2RlID09PSBzdGF0ZS5tYXJrZXIpIHtcbiAgICAgIHN0YXRlLnBvcyA9IHBvcyArIDFcbiAgICAgIHN0YXRlLnN0ciArPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQsIHBvcykpXG4gICAgICBzdGF0ZS5vayA9IHRydWVcbiAgICAgIHJldHVybiBzdGF0ZVxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyOCAvKiAoICovICYmIHN0YXRlLm1hcmtlciA9PT0gMHgyOSAvKiApICovKSB7XG4gICAgICByZXR1cm4gc3RhdGVcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4NUMgLyogXFwgKi8gJiYgcG9zICsgMSA8IG1heCkge1xuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgLy8gbm8gY2xvc2luZyBtYXJrZXIgZm91bmQsIGJ1dCB0aGlzIGxpbmsgdGl0bGUgbWF5IGNvbnRpbnVlIG9uIHRoZSBuZXh0IGxpbmUgKGZvciByZWZlcmVuY2VzKVxuICBzdGF0ZS5jYW5fY29udGludWUgPSB0cnVlXG4gIHN0YXRlLnN0ciArPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQsIHBvcykpXG4gIHJldHVybiBzdGF0ZVxufVxuIiwiLyoqXG4gKiBjbGFzcyBSZW5kZXJlclxuICpcbiAqIEdlbmVyYXRlcyBIVE1MIGZyb20gcGFyc2VkIHRva2VuIHN0cmVhbS4gRWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnRcbiAqIGNvcHkgb2YgcnVsZXMuIFRob3NlIGNhbiBiZSByZXdyaXR0ZW4gd2l0aCBlYXNlLiBBbHNvLCB5b3UgY2FuIGFkZCBuZXdcbiAqIHJ1bGVzIGlmIHlvdSBjcmVhdGUgcGx1Z2luIGFuZCBhZGRzIG5ldyB0b2tlbiB0eXBlcy5cbiAqKi9cblxuaW1wb3J0IHsgYXNzaWduLCB1bmVzY2FwZUFsbCwgZXNjYXBlSHRtbCB9IGZyb20gJy4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgZGVmYXVsdF9ydWxlcyA9IHt9XG5cbmRlZmF1bHRfcnVsZXMuY29kZV9pbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2xmKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cblxuICByZXR1cm4gICc8Y29kZScgKyBzbGYucmVuZGVyQXR0cnModG9rZW4pICsgJz4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHRva2VuLmNvbnRlbnQpICtcbiAgICAgICAgICAnPC9jb2RlPidcbn1cblxuZGVmYXVsdF9ydWxlcy5jb2RlX2Jsb2NrID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG5cbiAgcmV0dXJuICAnPHByZScgKyBzbGYucmVuZGVyQXR0cnModG9rZW4pICsgJz48Y29kZT4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmNvbnRlbnQpICtcbiAgICAgICAgICAnPC9jb2RlPjwvcHJlPlxcbidcbn1cblxuZGVmYXVsdF9ydWxlcy5mZW5jZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzbGYpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuICBjb25zdCBpbmZvID0gdG9rZW4uaW5mbyA/IHVuZXNjYXBlQWxsKHRva2VuLmluZm8pLnRyaW0oKSA6ICcnXG4gIGxldCBsYW5nTmFtZSA9ICcnXG4gIGxldCBsYW5nQXR0cnMgPSAnJ1xuXG4gIGlmIChpbmZvKSB7XG4gICAgY29uc3QgYXJyID0gaW5mby5zcGxpdCgvKFxccyspL2cpXG4gICAgbGFuZ05hbWUgPSBhcnJbMF1cbiAgICBsYW5nQXR0cnMgPSBhcnIuc2xpY2UoMikuam9pbignJylcbiAgfVxuXG4gIGxldCBoaWdobGlnaHRlZFxuICBpZiAob3B0aW9ucy5oaWdobGlnaHQpIHtcbiAgICBoaWdobGlnaHRlZCA9IG9wdGlvbnMuaGlnaGxpZ2h0KHRva2VuLmNvbnRlbnQsIGxhbmdOYW1lLCBsYW5nQXR0cnMpIHx8IGVzY2FwZUh0bWwodG9rZW4uY29udGVudClcbiAgfSBlbHNlIHtcbiAgICBoaWdobGlnaHRlZCA9IGVzY2FwZUh0bWwodG9rZW4uY29udGVudClcbiAgfVxuXG4gIGlmIChoaWdobGlnaHRlZC5pbmRleE9mKCc8cHJlJykgPT09IDApIHtcbiAgICByZXR1cm4gaGlnaGxpZ2h0ZWQgKyAnXFxuJ1xuICB9XG5cbiAgLy8gSWYgbGFuZ3VhZ2UgZXhpc3RzLCBpbmplY3QgY2xhc3MgZ2VudGx5LCB3aXRob3V0IG1vZGlmeWluZyBvcmlnaW5hbCB0b2tlbi5cbiAgLy8gTWF5IGJlLCBvbmUgZGF5IHdlIHdpbGwgYWRkIC5kZWVwQ2xvbmUoKSBmb3IgdG9rZW4gYW5kIHNpbXBsaWZ5IHRoaXMgcGFydCwgYnV0XG4gIC8vIG5vdyB3ZSBwcmVmZXIgdG8ga2VlcCB0aGluZ3MgbG9jYWwuXG4gIGlmIChpbmZvKSB7XG4gICAgY29uc3QgaSA9IHRva2VuLmF0dHJJbmRleCgnY2xhc3MnKVxuICAgIGNvbnN0IHRtcEF0dHJzID0gdG9rZW4uYXR0cnMgPyB0b2tlbi5hdHRycy5zbGljZSgpIDogW11cblxuICAgIGlmIChpIDwgMCkge1xuICAgICAgdG1wQXR0cnMucHVzaChbJ2NsYXNzJywgb3B0aW9ucy5sYW5nUHJlZml4ICsgbGFuZ05hbWVdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0bXBBdHRyc1tpXSA9IHRtcEF0dHJzW2ldLnNsaWNlKClcbiAgICAgIHRtcEF0dHJzW2ldWzFdICs9ICcgJyArIG9wdGlvbnMubGFuZ1ByZWZpeCArIGxhbmdOYW1lXG4gICAgfVxuXG4gICAgLy8gRmFrZSB0b2tlbiBqdXN0IHRvIHJlbmRlciBhdHRyaWJ1dGVzXG4gICAgY29uc3QgdG1wVG9rZW4gPSB7XG4gICAgICBhdHRyczogdG1wQXR0cnNcbiAgICB9XG5cbiAgICByZXR1cm4gYDxwcmU+PGNvZGUke3NsZi5yZW5kZXJBdHRycyh0bXBUb2tlbil9PiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPlxcbmBcbiAgfVxuXG4gIHJldHVybiBgPHByZT48Y29kZSR7c2xmLnJlbmRlckF0dHJzKHRva2VuKX0+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+XFxuYFxufVxuXG5kZWZhdWx0X3J1bGVzLmltYWdlID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG5cbiAgLy8gXCJhbHRcIiBhdHRyIE1VU1QgYmUgc2V0LCBldmVuIGlmIGVtcHR5LiBCZWNhdXNlIGl0J3MgbWFuZGF0b3J5IGFuZFxuICAvLyBzaG91bGQgYmUgcGxhY2VkIG9uIHByb3BlciBwb3NpdGlvbiBmb3IgdGVzdHMuXG4gIC8vXG4gIC8vIFJlcGxhY2UgY29udGVudCB3aXRoIGFjdHVhbCB2YWx1ZVxuXG4gIHRva2VuLmF0dHJzW3Rva2VuLmF0dHJJbmRleCgnYWx0JyldWzFdID1cbiAgICBzbGYucmVuZGVySW5saW5lQXNUZXh0KHRva2VuLmNoaWxkcmVuLCBvcHRpb25zLCBlbnYpXG5cbiAgcmV0dXJuIHNsZi5yZW5kZXJUb2tlbih0b2tlbnMsIGlkeCwgb3B0aW9ucylcbn1cblxuZGVmYXVsdF9ydWxlcy5oYXJkYnJlYWsgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMgLyosIGVudiAqLykge1xuICByZXR1cm4gb3B0aW9ucy54aHRtbE91dCA/ICc8YnIgLz5cXG4nIDogJzxicj5cXG4nXG59XG5kZWZhdWx0X3J1bGVzLnNvZnRicmVhayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucyAvKiwgZW52ICovKSB7XG4gIHJldHVybiBvcHRpb25zLmJyZWFrcyA/IChvcHRpb25zLnhodG1sT3V0ID8gJzxiciAvPlxcbicgOiAnPGJyPlxcbicpIDogJ1xcbidcbn1cblxuZGVmYXVsdF9ydWxlcy50ZXh0ID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuIGVzY2FwZUh0bWwodG9rZW5zW2lkeF0uY29udGVudClcbn1cblxuZGVmYXVsdF9ydWxlcy5odG1sX2Jsb2NrID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuIHRva2Vuc1tpZHhdLmNvbnRlbnRcbn1cbmRlZmF1bHRfcnVsZXMuaHRtbF9pbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gdG9rZW5zW2lkeF0uY29udGVudFxufVxuXG4vKipcbiAqIG5ldyBSZW5kZXJlcigpXG4gKlxuICogQ3JlYXRlcyBuZXcgW1tSZW5kZXJlcl1dIGluc3RhbmNlIGFuZCBmaWxsIFtbUmVuZGVyZXIjcnVsZXNdXSB3aXRoIGRlZmF1bHRzLlxuICoqL1xuZnVuY3Rpb24gUmVuZGVyZXIgKCkge1xuICAvKipcbiAgICogUmVuZGVyZXIjcnVsZXMgLT4gT2JqZWN0XG4gICAqXG4gICAqIENvbnRhaW5zIHJlbmRlciBydWxlcyBmb3IgdG9rZW5zLiBDYW4gYmUgdXBkYXRlZCBhbmQgZXh0ZW5kZWQuXG4gICAqXG4gICAqICMjIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gICAqXG4gICAqIG1kLnJlbmRlcmVyLnJ1bGVzLnN0cm9uZ19vcGVuICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICc8Yj4nOyB9O1xuICAgKiBtZC5yZW5kZXJlci5ydWxlcy5zdHJvbmdfY2xvc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnPC9iPic7IH07XG4gICAqXG4gICAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXJJbmxpbmUoLi4uKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEVhY2ggcnVsZSBpcyBjYWxsZWQgYXMgaW5kZXBlbmRlbnQgc3RhdGljIGZ1bmN0aW9uIHdpdGggZml4ZWQgc2lnbmF0dXJlOlxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGZ1bmN0aW9uIG15X3Rva2VuX3JlbmRlcih0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCByZW5kZXJlcikge1xuICAgKiAgIC8vIC4uLlxuICAgKiAgIHJldHVybiByZW5kZXJlZEhUTUw7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBbc291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcmVuZGVyZXIubWpzKVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVzID0gYXNzaWduKHt9LCBkZWZhdWx0X3J1bGVzKVxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlckF0dHJzKHRva2VuKSAtPiBTdHJpbmdcbiAqXG4gKiBSZW5kZXIgdG9rZW4gYXR0cmlidXRlcyB0byBzdHJpbmcuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyQXR0cnMgPSBmdW5jdGlvbiByZW5kZXJBdHRycyAodG9rZW4pIHtcbiAgbGV0IGksIGwsIHJlc3VsdFxuXG4gIGlmICghdG9rZW4uYXR0cnMpIHsgcmV0dXJuICcnIH1cblxuICByZXN1bHQgPSAnJ1xuXG4gIGZvciAoaSA9IDAsIGwgPSB0b2tlbi5hdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgZXNjYXBlSHRtbCh0b2tlbi5hdHRyc1tpXVswXSkgKyAnPVwiJyArIGVzY2FwZUh0bWwodG9rZW4uYXR0cnNbaV1bMV0pICsgJ1wiJ1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlclRva2VuKHRva2VucywgaWR4LCBvcHRpb25zKSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb2YgdG9rZW5zXG4gKiAtIGlkeCAoTnVtYmVkKTogdG9rZW4gaW5kZXggdG8gcmVuZGVyXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHBhcmFtcyBvZiBwYXJzZXIgaW5zdGFuY2VcbiAqXG4gKiBEZWZhdWx0IHRva2VuIHJlbmRlcmVyLiBDYW4gYmUgb3ZlcnJpZGVuIGJ5IGN1c3RvbSBmdW5jdGlvblxuICogaW4gW1tSZW5kZXJlciNydWxlc11dLlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlclRva2VuID0gZnVuY3Rpb24gcmVuZGVyVG9rZW4gKHRva2VucywgaWR4LCBvcHRpb25zKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgLy8gVGlnaHQgbGlzdCBwYXJhZ3JhcGhzXG4gIGlmICh0b2tlbi5oaWRkZW4pIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEluc2VydCBhIG5ld2xpbmUgYmV0d2VlbiBoaWRkZW4gcGFyYWdyYXBoIGFuZCBzdWJzZXF1ZW50IG9wZW5pbmdcbiAgLy8gYmxvY2stbGV2ZWwgdGFnLlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgaGVyZSB3ZSBzaG91bGQgaW5zZXJ0IGEgbmV3bGluZSBiZWZvcmUgYmxvY2txdW90ZTpcbiAgLy8gIC0gYVxuICAvLyAgICA+XG4gIC8vXG4gIGlmICh0b2tlbi5ibG9jayAmJiB0b2tlbi5uZXN0aW5nICE9PSAtMSAmJiBpZHggJiYgdG9rZW5zW2lkeCAtIDFdLmhpZGRlbikge1xuICAgIHJlc3VsdCArPSAnXFxuJ1xuICB9XG5cbiAgLy8gQWRkIHRva2VuIG5hbWUsIGUuZy4gYDxpbWdgXG4gIHJlc3VsdCArPSAodG9rZW4ubmVzdGluZyA9PT0gLTEgPyAnPC8nIDogJzwnKSArIHRva2VuLnRhZ1xuXG4gIC8vIEVuY29kZSBhdHRyaWJ1dGVzLCBlLmcuIGA8aW1nIHNyYz1cImZvb1wiYFxuICByZXN1bHQgKz0gdGhpcy5yZW5kZXJBdHRycyh0b2tlbilcblxuICAvLyBBZGQgYSBzbGFzaCBmb3Igc2VsZi1jbG9zaW5nIHRhZ3MsIGUuZy4gYDxpbWcgc3JjPVwiZm9vXCIgL2BcbiAgaWYgKHRva2VuLm5lc3RpbmcgPT09IDAgJiYgb3B0aW9ucy54aHRtbE91dCkge1xuICAgIHJlc3VsdCArPSAnIC8nXG4gIH1cblxuICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ld2xpbmUgYWZ0ZXIgdGhpcyB0YWdcbiAgbGV0IG5lZWRMZiA9IGZhbHNlXG4gIGlmICh0b2tlbi5ibG9jaykge1xuICAgIG5lZWRMZiA9IHRydWVcblxuICAgIGlmICh0b2tlbi5uZXN0aW5nID09PSAxKSB7XG4gICAgICBpZiAoaWR4ICsgMSA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW2lkeCArIDFdXG5cbiAgICAgICAgaWYgKG5leHRUb2tlbi50eXBlID09PSAnaW5saW5lJyB8fCBuZXh0VG9rZW4uaGlkZGVuKSB7XG4gICAgICAgICAgLy8gQmxvY2stbGV2ZWwgdGFnIGNvbnRhaW5pbmcgYW4gaW5saW5lIHRhZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5lZWRMZiA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dFRva2VuLm5lc3RpbmcgPT09IC0xICYmIG5leHRUb2tlbi50YWcgPT09IHRva2VuLnRhZykge1xuICAgICAgICAgIC8vIE9wZW5pbmcgdGFnICsgY2xvc2luZyB0YWcgb2YgdGhlIHNhbWUgdHlwZS4gRS5nLiBgPGxpPjwvbGk+YC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5lZWRMZiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXN1bHQgKz0gbmVlZExmID8gJz5cXG4nIDogJz4nXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlcklubGluZSh0b2tlbnMsIG9wdGlvbnMsIGVudikgLT4gU3RyaW5nXG4gKiAtIHRva2VucyAoQXJyYXkpOiBsaXN0IG9uIGJsb2NrIHRva2VucyB0byByZW5kZXJcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcGFyYW1zIG9mIHBhcnNlciBpbnN0YW5jZVxuICogLSBlbnYgKE9iamVjdCk6IGFkZGl0aW9uYWwgZGF0YSBmcm9tIHBhcnNlZCBpbnB1dCAocmVmZXJlbmNlcywgZm9yIGV4YW1wbGUpXG4gKlxuICogVGhlIHNhbWUgYXMgW1tSZW5kZXJlci5yZW5kZXJdXSwgYnV0IGZvciBzaW5nbGUgdG9rZW4gb2YgYGlubGluZWAgdHlwZS5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJJbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlc1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB0eXBlID0gdG9rZW5zW2ldLnR5cGVcblxuICAgIGlmICh0eXBlb2YgcnVsZXNbdHlwZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQgKz0gcnVsZXNbdHlwZV0odG9rZW5zLCBpLCBvcHRpb25zLCBlbnYsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlclRva2VuKHRva2VucywgaSwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKiBpbnRlcm5hbFxuICogUmVuZGVyZXIucmVuZGVySW5saW5lQXNUZXh0KHRva2Vucywgb3B0aW9ucywgZW52KSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb24gYmxvY2sgdG9rZW5zIHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKiAtIGVudiAoT2JqZWN0KTogYWRkaXRpb25hbCBkYXRhIGZyb20gcGFyc2VkIGlucHV0IChyZWZlcmVuY2VzLCBmb3IgZXhhbXBsZSlcbiAqXG4gKiBTcGVjaWFsIGtsdWRnZSBmb3IgaW1hZ2UgYGFsdGAgYXR0cmlidXRlcyB0byBjb25mb3JtIENvbW1vbk1hcmsgc3BlYy5cbiAqIERvbid0IHRyeSB0byB1c2UgaXQhIFNwZWMgcmVxdWlyZXMgdG8gc2hvdyBgYWx0YCBjb250ZW50IHdpdGggc3RyaXBwZWQgbWFya3VwLFxuICogaW5zdGVhZCBvZiBzaW1wbGUgZXNjYXBpbmcuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVySW5saW5lQXNUZXh0ID0gZnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucywgZW52KSB7XG4gIGxldCByZXN1bHQgPSAnJ1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzd2l0Y2ggKHRva2Vuc1tpXS50eXBlKSB7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmVzdWx0ICs9IHRva2Vuc1tpXS5jb250ZW50XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlcklubGluZUFzVGV4dCh0b2tlbnNbaV0uY2hpbGRyZW4sIG9wdGlvbnMsIGVudilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2h0bWxfaW5saW5lJzpcbiAgICAgIGNhc2UgJ2h0bWxfYmxvY2snOlxuICAgICAgICByZXN1bHQgKz0gdG9rZW5zW2ldLmNvbnRlbnRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NvZnRicmVhayc6XG4gICAgICBjYXNlICdoYXJkYnJlYWsnOlxuICAgICAgICByZXN1bHQgKz0gJ1xcbidcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGFsbCBvdGhlciB0b2tlbnMgYXJlIHNraXBwZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVuZGVyZXIucmVuZGVyKHRva2Vucywgb3B0aW9ucywgZW52KSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb24gYmxvY2sgdG9rZW5zIHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKiAtIGVudiAoT2JqZWN0KTogYWRkaXRpb25hbCBkYXRhIGZyb20gcGFyc2VkIGlucHV0IChyZWZlcmVuY2VzLCBmb3IgZXhhbXBsZSlcbiAqXG4gKiBUYWtlcyB0b2tlbiBzdHJlYW0gYW5kIGdlbmVyYXRlcyBIVE1MLiBQcm9iYWJseSwgeW91IHdpbGwgbmV2ZXIgbmVlZCB0byBjYWxsXG4gKiB0aGlzIG1ldGhvZCBkaXJlY3RseS5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlc1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB0eXBlID0gdG9rZW5zW2ldLnR5cGVcblxuICAgIGlmICh0eXBlID09PSAnaW5saW5lJykge1xuICAgICAgcmVzdWx0ICs9IHRoaXMucmVuZGVySW5saW5lKHRva2Vuc1tpXS5jaGlsZHJlbiwgb3B0aW9ucywgZW52KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJ1bGVzW3R5cGVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzdWx0ICs9IHJ1bGVzW3R5cGVdKHRva2VucywgaSwgb3B0aW9ucywgZW52LCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5yZW5kZXJUb2tlbih0b2tlbnMsIGksIG9wdGlvbnMsIGVudilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyXG4iLCIvKipcbiAqIGNsYXNzIFJ1bGVyXG4gKlxuICogSGVscGVyIGNsYXNzLCB1c2VkIGJ5IFtbTWFya2Rvd25JdCNjb3JlXV0sIFtbTWFya2Rvd25JdCNibG9ja11dIGFuZFxuICogW1tNYXJrZG93bkl0I2lubGluZV1dIHRvIG1hbmFnZSBzZXF1ZW5jZXMgb2YgZnVuY3Rpb25zIChydWxlcyk6XG4gKlxuICogLSBrZWVwIHJ1bGVzIGluIGRlZmluZWQgb3JkZXJcbiAqIC0gYXNzaWduIHRoZSBuYW1lIHRvIGVhY2ggcnVsZVxuICogLSBlbmFibGUvZGlzYWJsZSBydWxlc1xuICogLSBhZGQvcmVwbGFjZSBydWxlc1xuICogLSBhbGxvdyBhc3NpZ24gcnVsZXMgdG8gYWRkaXRpb25hbCBuYW1lZCBjaGFpbnMgKGluIHRoZSBzYW1lKVxuICogLSBjYWNoZWluZyBsaXN0cyBvZiBhY3RpdmUgcnVsZXNcbiAqXG4gKiBZb3Ugd2lsbCBub3QgbmVlZCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bnRpbCB3cml0ZSBwbHVnaW5zLiBGb3Igc2ltcGxlXG4gKiBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dLCBbW01hcmtkb3duSXQuZW5hYmxlXV0gYW5kXG4gKiBbW01hcmtkb3duSXQudXNlXV0uXG4gKiovXG5cbi8qKlxuICogbmV3IFJ1bGVyKClcbiAqKi9cbmZ1bmN0aW9uIFJ1bGVyICgpIHtcbiAgLy8gTGlzdCBvZiBhZGRlZCBydWxlcy4gRWFjaCBlbGVtZW50IGlzOlxuICAvL1xuICAvLyB7XG4gIC8vICAgbmFtZTogWFhYLFxuICAvLyAgIGVuYWJsZWQ6IEJvb2xlYW4sXG4gIC8vICAgZm46IEZ1bmN0aW9uKCksXG4gIC8vICAgYWx0OiBbIG5hbWUyLCBuYW1lMyBdXG4gIC8vIH1cbiAgLy9cbiAgdGhpcy5fX3J1bGVzX18gPSBbXVxuXG4gIC8vIENhY2hlZCBydWxlIGNoYWlucy5cbiAgLy9cbiAgLy8gRmlyc3QgbGV2ZWwgLSBjaGFpbiBuYW1lLCAnJyBmb3IgZGVmYXVsdC5cbiAgLy8gU2Vjb25kIGxldmVsIC0gZGlnaW5hbCBhbmNob3IgZm9yIGZhc3QgZmlsdGVyaW5nIGJ5IGNoYXJjb2Rlcy5cbiAgLy9cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8vIEhlbHBlciBtZXRob2RzLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHlcblxuLy8gRmluZCBydWxlIGluZGV4IGJ5IG5hbWVcbi8vXG5SdWxlci5wcm90b3R5cGUuX19maW5kX18gPSBmdW5jdGlvbiAobmFtZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19ydWxlc19fLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHRoaXMuX19ydWxlc19fW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vLyBCdWlsZCBydWxlcyBsb29rdXAgY2FjaGVcbi8vXG5SdWxlci5wcm90b3R5cGUuX19jb21waWxlX18gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGNvbnN0IGNoYWlucyA9IFsnJ11cblxuICAvLyBjb2xsZWN0IHVuaXF1ZSBuYW1lc1xuICBzZWxmLl9fcnVsZXNfXy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgaWYgKCFydWxlLmVuYWJsZWQpIHsgcmV0dXJuIH1cblxuICAgIHJ1bGUuYWx0LmZvckVhY2goZnVuY3Rpb24gKGFsdE5hbWUpIHtcbiAgICAgIGlmIChjaGFpbnMuaW5kZXhPZihhbHROYW1lKSA8IDApIHtcbiAgICAgICAgY2hhaW5zLnB1c2goYWx0TmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIHNlbGYuX19jYWNoZV9fID0ge31cblxuICBjaGFpbnMuZm9yRWFjaChmdW5jdGlvbiAoY2hhaW4pIHtcbiAgICBzZWxmLl9fY2FjaGVfX1tjaGFpbl0gPSBbXVxuICAgIHNlbGYuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIGlmICghcnVsZS5lbmFibGVkKSB7IHJldHVybiB9XG5cbiAgICAgIGlmIChjaGFpbiAmJiBydWxlLmFsdC5pbmRleE9mKGNoYWluKSA8IDApIHsgcmV0dXJuIH1cblxuICAgICAgc2VsZi5fX2NhY2hlX19bY2hhaW5dLnB1c2gocnVsZS5mbilcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIFJ1bGVyLmF0KG5hbWUsIGZuIFssIG9wdGlvbnNdKVxuICogLSBuYW1lIChTdHJpbmcpOiBydWxlIG5hbWUgdG8gcmVwbGFjZS5cbiAqIC0gZm4gKEZ1bmN0aW9uKTogbmV3IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IG5ldyBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIFJlcGxhY2UgcnVsZSBieSBuYW1lIHdpdGggbmV3IGZ1bmN0aW9uICYgb3B0aW9ucy4gVGhyb3dzIGVycm9yIGlmIG5hbWUgbm90XG4gKiBmb3VuZC5cbiAqXG4gKiAjIyMjIyBPcHRpb25zOlxuICpcbiAqIC0gX19hbHRfXyAtIGFycmF5IHdpdGggbmFtZXMgb2YgXCJhbHRlcm5hdGVcIiBjaGFpbnMuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIFJlcGxhY2UgZXhpc3RpbmcgdHlwb2dyYXBoZXIgcmVwbGFjZW1lbnQgcnVsZSB3aXRoIG5ldyBvbmU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmNvcmUucnVsZXIuYXQoJ3JlcGxhY2VtZW50cycsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiAobmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3QgaW5kZXggPSB0aGlzLl9fZmluZF9fKG5hbWUpXG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoaW5kZXggPT09IC0xKSB7IHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgbmFtZSkgfVxuXG4gIHRoaXMuX19ydWxlc19fW2luZGV4XS5mbiA9IGZuXG4gIHRoaXMuX19ydWxlc19fW2luZGV4XS5hbHQgPSBvcHQuYWx0IHx8IFtdXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bGVyLmJlZm9yZShiZWZvcmVOYW1lLCBydWxlTmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIGJlZm9yZU5hbWUgKFN0cmluZyk6IG5ldyBydWxlIHdpbGwgYmUgYWRkZWQgYmVmb3JlIHRoaXMgb25lLlxuICogLSBydWxlTmFtZSAoU3RyaW5nKTogbmFtZSBvZiBhZGRlZCBydWxlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIEFkZCBuZXcgcnVsZSB0byBjaGFpbiBiZWZvcmUgb25lIHdpdGggZ2l2ZW4gbmFtZS4gU2VlIGFsc29cbiAqIFtbUnVsZXIuYWZ0ZXJdXSwgW1tSdWxlci5wdXNoXV0uXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuYmxvY2sucnVsZXIuYmVmb3JlKCdwYXJhZ3JhcGgnLCAnbXlfcnVsZScsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUuYmVmb3JlID0gZnVuY3Rpb24gKGJlZm9yZU5hbWUsIHJ1bGVOYW1lLCBmbiwgb3B0aW9ucykge1xuICBjb25zdCBpbmRleCA9IHRoaXMuX19maW5kX18oYmVmb3JlTmFtZSlcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICcgKyBiZWZvcmVOYW1lKSB9XG5cbiAgdGhpcy5fX3J1bGVzX18uc3BsaWNlKGluZGV4LCAwLCB7XG4gICAgbmFtZTogcnVsZU5hbWUsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBmbixcbiAgICBhbHQ6IG9wdC5hbHQgfHwgW11cbiAgfSlcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLyoqXG4gKiBSdWxlci5hZnRlcihhZnRlck5hbWUsIHJ1bGVOYW1lLCBmbiBbLCBvcHRpb25zXSlcbiAqIC0gYWZ0ZXJOYW1lIChTdHJpbmcpOiBuZXcgcnVsZSB3aWxsIGJlIGFkZGVkIGFmdGVyIHRoaXMgb25lLlxuICogLSBydWxlTmFtZSAoU3RyaW5nKTogbmFtZSBvZiBhZGRlZCBydWxlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIEFkZCBuZXcgcnVsZSB0byBjaGFpbiBhZnRlciBvbmUgd2l0aCBnaXZlbiBuYW1lLiBTZWUgYWxzb1xuICogW1tSdWxlci5iZWZvcmVdXSwgW1tSdWxlci5wdXNoXV0uXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuaW5saW5lLnJ1bGVyLmFmdGVyKCd0ZXh0JywgJ215X3J1bGUnLCBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gKiAgIC8vLi4uXG4gKiB9KTtcbiAqIGBgYFxuICoqL1xuUnVsZXIucHJvdG90eXBlLmFmdGVyID0gZnVuY3Rpb24gKGFmdGVyTmFtZSwgcnVsZU5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5fX2ZpbmRfXyhhZnRlck5hbWUpXG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoaW5kZXggPT09IC0xKSB7IHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgYWZ0ZXJOYW1lKSB9XG5cbiAgdGhpcy5fX3J1bGVzX18uc3BsaWNlKGluZGV4ICsgMSwgMCwge1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIucHVzaChydWxlTmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIHJ1bGVOYW1lIChTdHJpbmcpOiBuYW1lIG9mIGFkZGVkIHJ1bGUuXG4gKiAtIGZuIChGdW5jdGlvbik6IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHJ1bGUgb3B0aW9ucyAobm90IG1hbmRhdG9yeSkuXG4gKlxuICogUHVzaCBuZXcgcnVsZSB0byB0aGUgZW5kIG9mIGNoYWluLiBTZWUgYWxzb1xuICogW1tSdWxlci5iZWZvcmVdXSwgW1tSdWxlci5hZnRlcl1dLlxuICpcbiAqICMjIyMjIE9wdGlvbnM6XG4gKlxuICogLSBfX2FsdF9fIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiBcImFsdGVybmF0ZVwiIGNoYWlucy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmNvcmUucnVsZXIucHVzaCgnbXlfcnVsZScsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIHRoaXMuX19ydWxlc19fLnB1c2goe1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIuZW5hYmxlKGxpc3QgWywgaWdub3JlSW52YWxpZF0pIC0+IEFycmF5XG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBlbmFibGUuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBFbmFibGUgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcy4gSWYgYW55IHJ1bGUgbmFtZSBub3QgZm91bmQgLSB0aHJvdyBFcnJvci5cbiAqIEVycm9ycyBjYW4gYmUgZGlzYWJsZWQgYnkgc2Vjb25kIHBhcmFtLlxuICpcbiAqIFJldHVybnMgbGlzdCBvZiBmb3VuZCBydWxlIG5hbWVzIChpZiBubyBleGNlcHRpb24gaGFwcGVuZWQpLlxuICpcbiAqIFNlZSBhbHNvIFtbUnVsZXIuZGlzYWJsZV1dLCBbW1J1bGVyLmVuYWJsZU9ubHldXS5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyBTZWFyY2ggYnkgbmFtZSBhbmQgZW5hYmxlXG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX19maW5kX18obmFtZSlcblxuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICBpZiAoaWdub3JlSW52YWxpZCkgeyByZXR1cm4gfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAnICsgbmFtZSlcbiAgICB9XG4gICAgdGhpcy5fX3J1bGVzX19baWR4XS5lbmFibGVkID0gdHJ1ZVxuICAgIHJlc3VsdC5wdXNoKG5hbWUpXG4gIH0sIHRoaXMpXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSdWxlci5lbmFibGVPbmx5KGxpc3QgWywgaWdub3JlSW52YWxpZF0pXG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBlbmFibGUgKHdoaXRlbGlzdCkuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBFbmFibGUgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcywgYW5kIGRpc2FibGUgZXZlcnl0aGluZyBlbHNlLiBJZiBhbnkgcnVsZSBuYW1lXG4gKiBub3QgZm91bmQgLSB0aHJvdyBFcnJvci4gRXJyb3JzIGNhbiBiZSBkaXNhYmxlZCBieSBzZWNvbmQgcGFyYW0uXG4gKlxuICogU2VlIGFsc28gW1tSdWxlci5kaXNhYmxlXV0sIFtbUnVsZXIuZW5hYmxlXV0uXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZW5hYmxlT25seSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICB0aGlzLl9fcnVsZXNfXy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7IHJ1bGUuZW5hYmxlZCA9IGZhbHNlIH0pXG5cbiAgdGhpcy5lbmFibGUobGlzdCwgaWdub3JlSW52YWxpZClcbn1cblxuLyoqXG4gKiBSdWxlci5kaXNhYmxlKGxpc3QgWywgaWdub3JlSW52YWxpZF0pIC0+IEFycmF5XG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBkaXNhYmxlLlxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRGlzYWJsZSBydWxlcyB3aXRoIGdpdmVuIG5hbWVzLiBJZiBhbnkgcnVsZSBuYW1lIG5vdCBmb3VuZCAtIHRocm93IEVycm9yLlxuICogRXJyb3JzIGNhbiBiZSBkaXNhYmxlZCBieSBzZWNvbmQgcGFyYW0uXG4gKlxuICogUmV0dXJucyBsaXN0IG9mIGZvdW5kIHJ1bGUgbmFtZXMgKGlmIG5vIGV4Y2VwdGlvbiBoYXBwZW5lZCkuXG4gKlxuICogU2VlIGFsc28gW1tSdWxlci5lbmFibGVdXSwgW1tSdWxlci5lbmFibGVPbmx5XV0uXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBjb25zdCByZXN1bHQgPSBbXVxuXG4gIC8vIFNlYXJjaCBieSBuYW1lIGFuZCBkaXNhYmxlXG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX19maW5kX18obmFtZSlcblxuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICBpZiAoaWdub3JlSW52YWxpZCkgeyByZXR1cm4gfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAnICsgbmFtZSlcbiAgICB9XG4gICAgdGhpcy5fX3J1bGVzX19baWR4XS5lbmFibGVkID0gZmFsc2VcbiAgICByZXN1bHQucHVzaChuYW1lKVxuICB9LCB0aGlzKVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUnVsZXIuZ2V0UnVsZXMoY2hhaW5OYW1lKSAtPiBBcnJheVxuICpcbiAqIFJldHVybiBhcnJheSBvZiBhY3RpdmUgZnVuY3Rpb25zIChydWxlcykgZm9yIGdpdmVuIGNoYWluIG5hbWUuIEl0IGFuYWx5emVzXG4gKiBydWxlcyBjb25maWd1cmF0aW9uLCBjb21waWxlcyBjYWNoZXMgaWYgbm90IGV4aXN0cyBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogRGVmYXVsdCBjaGFpbiBuYW1lIGlzIGAnJ2AgKGVtcHR5IHN0cmluZykuIEl0IGNhbid0IGJlIHNraXBwZWQuIFRoYXQnc1xuICogZG9uZSBpbnRlbnRpb25hbGx5LCB0byBrZWVwIHNpZ25hdHVyZSBtb25vbW9ycGhpYyBmb3IgaGlnaCBzcGVlZC5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5nZXRSdWxlcyA9IGZ1bmN0aW9uIChjaGFpbk5hbWUpIHtcbiAgaWYgKHRoaXMuX19jYWNoZV9fID09PSBudWxsKSB7XG4gICAgdGhpcy5fX2NvbXBpbGVfXygpXG4gIH1cblxuICAvLyBDaGFpbiBjYW4gYmUgZW1wdHksIGlmIHJ1bGVzIGRpc2FibGVkLiBCdXQgd2Ugc3RpbGwgaGF2ZSB0byByZXR1cm4gQXJyYXkuXG4gIHJldHVybiB0aGlzLl9fY2FjaGVfX1tjaGFpbk5hbWVdIHx8IFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJ1bGVyXG4iLCIvLyBUb2tlbiBjbGFzc1xuXG4vKipcbiAqIGNsYXNzIFRva2VuXG4gKiovXG5cbi8qKlxuICogbmV3IFRva2VuKHR5cGUsIHRhZywgbmVzdGluZylcbiAqXG4gKiBDcmVhdGUgbmV3IHRva2VuIGFuZCBmaWxsIHBhc3NlZCBwcm9wZXJ0aWVzLlxuICoqL1xuZnVuY3Rpb24gVG9rZW4gKHR5cGUsIHRhZywgbmVzdGluZykge1xuICAvKipcbiAgICogVG9rZW4jdHlwZSAtPiBTdHJpbmdcbiAgICpcbiAgICogVHlwZSBvZiB0aGUgdG9rZW4gKHN0cmluZywgZS5nLiBcInBhcmFncmFwaF9vcGVuXCIpXG4gICAqKi9cbiAgdGhpcy50eXBlICAgICA9IHR5cGVcblxuICAvKipcbiAgICogVG9rZW4jdGFnIC0+IFN0cmluZ1xuICAgKlxuICAgKiBodG1sIHRhZyBuYW1lLCBlLmcuIFwicFwiXG4gICAqKi9cbiAgdGhpcy50YWcgICAgICA9IHRhZ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNhdHRycyAtPiBBcnJheVxuICAgKlxuICAgKiBIdG1sIGF0dHJpYnV0ZXMuIEZvcm1hdDogYFsgWyBuYW1lMSwgdmFsdWUxIF0sIFsgbmFtZTIsIHZhbHVlMiBdIF1gXG4gICAqKi9cbiAgdGhpcy5hdHRycyAgICA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jbWFwIC0+IEFycmF5XG4gICAqXG4gICAqIFNvdXJjZSBtYXAgaW5mby4gRm9ybWF0OiBgWyBsaW5lX2JlZ2luLCBsaW5lX2VuZCBdYFxuICAgKiovXG4gIHRoaXMubWFwICAgICAgPSBudWxsXG5cbiAgLyoqXG4gICAqIFRva2VuI25lc3RpbmcgLT4gTnVtYmVyXG4gICAqXG4gICAqIExldmVsIGNoYW5nZSAobnVtYmVyIGluIHstMSwgMCwgMX0gc2V0KSwgd2hlcmU6XG4gICAqXG4gICAqIC0gIGAxYCBtZWFucyB0aGUgdGFnIGlzIG9wZW5pbmdcbiAgICogLSAgYDBgIG1lYW5zIHRoZSB0YWcgaXMgc2VsZi1jbG9zaW5nXG4gICAqIC0gYC0xYCBtZWFucyB0aGUgdGFnIGlzIGNsb3NpbmdcbiAgICoqL1xuICB0aGlzLm5lc3RpbmcgID0gbmVzdGluZ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNsZXZlbCAtPiBOdW1iZXJcbiAgICpcbiAgICogbmVzdGluZyBsZXZlbCwgdGhlIHNhbWUgYXMgYHN0YXRlLmxldmVsYFxuICAgKiovXG4gIHRoaXMubGV2ZWwgICAgPSAwXG5cbiAgLyoqXG4gICAqIFRva2VuI2NoaWxkcmVuIC0+IEFycmF5XG4gICAqXG4gICAqIEFuIGFycmF5IG9mIGNoaWxkIG5vZGVzIChpbmxpbmUgYW5kIGltZyB0b2tlbnMpXG4gICAqKi9cbiAgdGhpcy5jaGlsZHJlbiA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jY29udGVudCAtPiBTdHJpbmdcbiAgICpcbiAgICogSW4gYSBjYXNlIG9mIHNlbGYtY2xvc2luZyB0YWcgKGNvZGUsIGh0bWwsIGZlbmNlLCBldGMuKSxcbiAgICogaXQgaGFzIGNvbnRlbnRzIG9mIHRoaXMgdGFnLlxuICAgKiovXG4gIHRoaXMuY29udGVudCAgPSAnJ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNtYXJrdXAgLT4gU3RyaW5nXG4gICAqXG4gICAqICcqJyBvciAnXycgZm9yIGVtcGhhc2lzLCBmZW5jZSBzdHJpbmcgZm9yIGZlbmNlLCBldGMuXG4gICAqKi9cbiAgdGhpcy5tYXJrdXAgICA9ICcnXG5cbiAgLyoqXG4gICAqIFRva2VuI2luZm8gLT4gU3RyaW5nXG4gICAqXG4gICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb246XG4gICAqXG4gICAqIC0gSW5mbyBzdHJpbmcgZm9yIFwiZmVuY2VcIiB0b2tlbnNcbiAgICogLSBUaGUgdmFsdWUgXCJhdXRvXCIgZm9yIGF1dG9saW5rIFwibGlua19vcGVuXCIgYW5kIFwibGlua19jbG9zZVwiIHRva2Vuc1xuICAgKiAtIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGl0ZW0gbWFya2VyIGZvciBvcmRlcmVkLWxpc3QgXCJsaXN0X2l0ZW1fb3BlblwiIHRva2Vuc1xuICAgKiovXG4gIHRoaXMuaW5mbyAgICAgPSAnJ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNtZXRhIC0+IE9iamVjdFxuICAgKlxuICAgKiBBIHBsYWNlIGZvciBwbHVnaW5zIHRvIHN0b3JlIGFuIGFyYml0cmFyeSBkYXRhXG4gICAqKi9cbiAgdGhpcy5tZXRhICAgICA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jYmxvY2sgLT4gQm9vbGVhblxuICAgKlxuICAgKiBUcnVlIGZvciBibG9jay1sZXZlbCB0b2tlbnMsIGZhbHNlIGZvciBpbmxpbmUgdG9rZW5zLlxuICAgKiBVc2VkIGluIHJlbmRlcmVyIHRvIGNhbGN1bGF0ZSBsaW5lIGJyZWFrc1xuICAgKiovXG4gIHRoaXMuYmxvY2sgICAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBUb2tlbiNoaWRkZW4gLT4gQm9vbGVhblxuICAgKlxuICAgKiBJZiBpdCdzIHRydWUsIGlnbm9yZSB0aGlzIGVsZW1lbnQgd2hlbiByZW5kZXJpbmcuIFVzZWQgZm9yIHRpZ2h0IGxpc3RzXG4gICAqIHRvIGhpZGUgcGFyYWdyYXBocy5cbiAgICoqL1xuICB0aGlzLmhpZGRlbiAgID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRySW5kZXgobmFtZSkgLT4gTnVtYmVyXG4gKlxuICogU2VhcmNoIGF0dHJpYnV0ZSBpbmRleCBieSBuYW1lLlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJJbmRleCA9IGZ1bmN0aW9uIGF0dHJJbmRleCAobmFtZSkge1xuICBpZiAoIXRoaXMuYXR0cnMpIHsgcmV0dXJuIC0xIH1cblxuICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cnNcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXR0cnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoYXR0cnNbaV1bMF0gPT09IG5hbWUpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJQdXNoKGF0dHJEYXRhKVxuICpcbiAqIEFkZCBgWyBuYW1lLCB2YWx1ZSBdYCBhdHRyaWJ1dGUgdG8gbGlzdC4gSW5pdCBhdHRycyBpZiBuZWNlc3NhcnlcbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRyUHVzaCA9IGZ1bmN0aW9uIGF0dHJQdXNoIChhdHRyRGF0YSkge1xuICBpZiAodGhpcy5hdHRycykge1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyRGF0YSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmF0dHJzID0gW2F0dHJEYXRhXVxuICB9XG59XG5cbi8qKlxuICogVG9rZW4uYXR0clNldChuYW1lLCB2YWx1ZSlcbiAqXG4gKiBTZXQgYG5hbWVgIGF0dHJpYnV0ZSB0byBgdmFsdWVgLiBPdmVycmlkZSBvbGQgdmFsdWUgaWYgZXhpc3RzLlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJTZXQgPSBmdW5jdGlvbiBhdHRyU2V0IChuYW1lLCB2YWx1ZSkge1xuICBjb25zdCBpZHggPSB0aGlzLmF0dHJJbmRleChuYW1lKVxuICBjb25zdCBhdHRyRGF0YSA9IFtuYW1lLCB2YWx1ZV1cblxuICBpZiAoaWR4IDwgMCkge1xuICAgIHRoaXMuYXR0clB1c2goYXR0ckRhdGEpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hdHRyc1tpZHhdID0gYXR0ckRhdGFcbiAgfVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJHZXQobmFtZSlcbiAqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSBgbmFtZWAsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0ckdldCA9IGZ1bmN0aW9uIGF0dHJHZXQgKG5hbWUpIHtcbiAgY29uc3QgaWR4ID0gdGhpcy5hdHRySW5kZXgobmFtZSlcbiAgbGV0IHZhbHVlID0gbnVsbFxuICBpZiAoaWR4ID49IDApIHtcbiAgICB2YWx1ZSA9IHRoaXMuYXR0cnNbaWR4XVsxXVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJKb2luKG5hbWUsIHZhbHVlKVxuICpcbiAqIEpvaW4gdmFsdWUgdG8gZXhpc3RpbmcgYXR0cmlidXRlIHZpYSBzcGFjZS4gT3IgY3JlYXRlIG5ldyBhdHRyaWJ1dGUgaWYgbm90XG4gKiBleGlzdHMuIFVzZWZ1bCB0byBvcGVyYXRlIHdpdGggdG9rZW4gY2xhc3Nlcy5cbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRySm9pbiA9IGZ1bmN0aW9uIGF0dHJKb2luIChuYW1lLCB2YWx1ZSkge1xuICBjb25zdCBpZHggPSB0aGlzLmF0dHJJbmRleChuYW1lKVxuXG4gIGlmIChpZHggPCAwKSB7XG4gICAgdGhpcy5hdHRyUHVzaChbbmFtZSwgdmFsdWVdKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuYXR0cnNbaWR4XVsxXSA9IHRoaXMuYXR0cnNbaWR4XVsxXSArICcgJyArIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVG9rZW5cbiIsIi8vIENvcmUgc3RhdGUgb2JqZWN0XG4vL1xuXG5pbXBvcnQgVG9rZW4gZnJvbSAnLi4vdG9rZW4ubWpzJ1xuXG5mdW5jdGlvbiBTdGF0ZUNvcmUgKHNyYywgbWQsIGVudikge1xuICB0aGlzLnNyYyA9IHNyY1xuICB0aGlzLmVudiA9IGVudlxuICB0aGlzLnRva2VucyA9IFtdXG4gIHRoaXMuaW5saW5lTW9kZSA9IGZhbHNlXG4gIHRoaXMubWQgPSBtZCAvLyBsaW5rIHRvIHBhcnNlciBpbnN0YW5jZVxufVxuXG4vLyByZS1leHBvcnQgVG9rZW4gY2xhc3MgdG8gdXNlIGluIGNvcmUgcnVsZXNcblN0YXRlQ29yZS5wcm90b3R5cGUuVG9rZW4gPSBUb2tlblxuXG5leHBvcnQgZGVmYXVsdCBTdGF0ZUNvcmVcbiIsIi8vIE5vcm1hbGl6ZSBpbnB1dCBzdHJpbmdcblxuLy8gaHR0cHM6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMjkvI2xpbmUtZW5kaW5nXG5jb25zdCBORVdMSU5FU19SRSAgPSAvXFxyXFxuP3xcXG4vZ1xuY29uc3QgTlVMTF9SRSAgICAgID0gL1xcMC9nXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZSAoc3RhdGUpIHtcbiAgbGV0IHN0clxuXG4gIC8vIE5vcm1hbGl6ZSBuZXdsaW5lc1xuICBzdHIgPSBzdGF0ZS5zcmMucmVwbGFjZShORVdMSU5FU19SRSwgJ1xcbicpXG5cbiAgLy8gUmVwbGFjZSBOVUxMIGNoYXJhY3RlcnNcbiAgc3RyID0gc3RyLnJlcGxhY2UoTlVMTF9SRSwgJ1xcdUZGRkQnKVxuXG4gIHN0YXRlLnNyYyA9IHN0clxufVxuIiwiLy8gUmVwbGFjZSBsaW5rLWxpa2UgdGV4dHMgd2l0aCBsaW5rIG5vZGVzLlxuLy9cbi8vIEN1cnJlbnRseSByZXN0cmljdGVkIGJ5IGBtZC52YWxpZGF0ZUxpbmsoKWAgdG8gaHR0cC9odHRwcy9mdHBcbi8vXG5cbmltcG9ydCB7IGFycmF5UmVwbGFjZUF0IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZnVuY3Rpb24gaXNMaW5rT3BlbiAoc3RyKSB7XG4gIHJldHVybiAvXjxhWz5cXHNdL2kudGVzdChzdHIpXG59XG5mdW5jdGlvbiBpc0xpbmtDbG9zZSAoc3RyKSB7XG4gIHJldHVybiAvXjxcXC9hXFxzKj4vaS50ZXN0KHN0cilcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlua2lmeSAoc3RhdGUpIHtcbiAgY29uc3QgYmxvY2tUb2tlbnMgPSBzdGF0ZS50b2tlbnNcblxuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMubGlua2lmeSkgeyByZXR1cm4gfVxuXG4gIGZvciAobGV0IGogPSAwLCBsID0gYmxvY2tUb2tlbnMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnIHx8XG4gICAgICAgICFzdGF0ZS5tZC5saW5raWZ5LnByZXRlc3QoYmxvY2tUb2tlbnNbal0uY29udGVudCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgbGV0IHRva2VucyA9IGJsb2NrVG9rZW5zW2pdLmNoaWxkcmVuXG5cbiAgICBsZXQgaHRtbExpbmtMZXZlbCA9IDBcblxuICAgIC8vIFdlIHNjYW4gZnJvbSB0aGUgZW5kLCB0byBrZWVwIHBvc2l0aW9uIHdoZW4gbmV3IHRhZ3MgYWRkZWQuXG4gICAgLy8gVXNlIHJldmVyc2VkIGxvZ2ljIGluIGxpbmtzIHN0YXJ0L2VuZCBtYXRjaFxuICAgIGZvciAobGV0IGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgICAvLyBTa2lwIGNvbnRlbnQgb2YgbWFya2Rvd24gbGlua3NcbiAgICAgIGlmIChjdXJyZW50VG9rZW4udHlwZSA9PT0gJ2xpbmtfY2xvc2UnKSB7XG4gICAgICAgIGktLVxuICAgICAgICB3aGlsZSAodG9rZW5zW2ldLmxldmVsICE9PSBjdXJyZW50VG9rZW4ubGV2ZWwgJiYgdG9rZW5zW2ldLnR5cGUgIT09ICdsaW5rX29wZW4nKSB7XG4gICAgICAgICAgaS0tXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBjb250ZW50IG9mIGh0bWwgdGFnIGxpbmtzXG4gICAgICBpZiAoY3VycmVudFRva2VuLnR5cGUgPT09ICdodG1sX2lubGluZScpIHtcbiAgICAgICAgaWYgKGlzTGlua09wZW4oY3VycmVudFRva2VuLmNvbnRlbnQpICYmIGh0bWxMaW5rTGV2ZWwgPiAwKSB7XG4gICAgICAgICAgaHRtbExpbmtMZXZlbC0tXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTGlua0Nsb3NlKGN1cnJlbnRUb2tlbi5jb250ZW50KSkge1xuICAgICAgICAgIGh0bWxMaW5rTGV2ZWwrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaHRtbExpbmtMZXZlbCA+IDApIHsgY29udGludWUgfVxuXG4gICAgICBpZiAoY3VycmVudFRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBzdGF0ZS5tZC5saW5raWZ5LnRlc3QoY3VycmVudFRva2VuLmNvbnRlbnQpKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBjdXJyZW50VG9rZW4uY29udGVudFxuICAgICAgICBsZXQgbGlua3MgPSBzdGF0ZS5tZC5saW5raWZ5Lm1hdGNoKHRleHQpXG5cbiAgICAgICAgLy8gTm93IHNwbGl0IHN0cmluZyB0byBub2Rlc1xuICAgICAgICBjb25zdCBub2RlcyA9IFtdXG4gICAgICAgIGxldCBsZXZlbCA9IGN1cnJlbnRUb2tlbi5sZXZlbFxuICAgICAgICBsZXQgbGFzdFBvcyA9IDBcblxuICAgICAgICAvLyBmb3JiaWQgZXNjYXBlIHNlcXVlbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLFxuICAgICAgICAvLyB0aGlzIGF2b2lkcyBodHRwXFw6Ly9leGFtcGxlLmNvbS8gZnJvbSBiZWluZyBsaW5raWZpZWQgYXNcbiAgICAgICAgLy8gaHR0cDo8YSBocmVmPVwiLy9leGFtcGxlLmNvbS9cIj4vL2V4YW1wbGUuY29tLzwvYT5cbiAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIGxpbmtzWzBdLmluZGV4ID09PSAwICYmXG4gICAgICAgICAgICBpID4gMCAmJlxuICAgICAgICAgICAgdG9rZW5zW2kgLSAxXS50eXBlID09PSAndGV4dF9zcGVjaWFsJykge1xuICAgICAgICAgIGxpbmtzID0gbGlua3Muc2xpY2UoMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCBsaW5rcy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBsaW5rc1tsbl0udXJsXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsodXJsKVxuICAgICAgICAgIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAgIGxldCB1cmxUZXh0ID0gbGlua3NbbG5dLnRleHRcblxuICAgICAgICAgIC8vIExpbmtpZmllciBtaWdodCBzZW5kIHJhdyBob3N0bmFtZXMgbGlrZSBcImV4YW1wbGUuY29tXCIsIHdoZXJlIHVybFxuICAgICAgICAgIC8vIHN0YXJ0cyB3aXRoIGRvbWFpbiBuYW1lLiBTbyB3ZSBwcmVwZW5kIGh0dHA6Ly8gaW4gdGhvc2UgY2FzZXMsXG4gICAgICAgICAgLy8gYW5kIHJlbW92ZSBpdCBhZnRlcndhcmRzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKCFsaW5rc1tsbl0uc2NoZW1hKSB7XG4gICAgICAgICAgICB1cmxUZXh0ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQoJ2h0dHA6Ly8nICsgdXJsVGV4dCkucmVwbGFjZSgvXmh0dHA6XFwvXFwvLywgJycpXG4gICAgICAgICAgfSBlbHNlIGlmIChsaW5rc1tsbl0uc2NoZW1hID09PSAnbWFpbHRvOicgJiYgIS9ebWFpbHRvOi9pLnRlc3QodXJsVGV4dCkpIHtcbiAgICAgICAgICAgIHVybFRleHQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCgnbWFpbHRvOicgKyB1cmxUZXh0KS5yZXBsYWNlKC9ebWFpbHRvOi8sICcnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmxUZXh0ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsVGV4dClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwb3MgPSBsaW5rc1tsbl0uaW5kZXhcblxuICAgICAgICAgIGlmIChwb3MgPiBsYXN0UG9zKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiAgID0gbmV3IHN0YXRlLlRva2VuKCd0ZXh0JywgJycsIDApXG4gICAgICAgICAgICB0b2tlbi5jb250ZW50ID0gdGV4dC5zbGljZShsYXN0UG9zLCBwb3MpXG4gICAgICAgICAgICB0b2tlbi5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICAgIG5vZGVzLnB1c2godG9rZW4pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdG9rZW5fbyAgID0gbmV3IHN0YXRlLlRva2VuKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICAgICAgdG9rZW5fby5hdHRycyAgID0gW1snaHJlZicsIGZ1bGxVcmxdXVxuICAgICAgICAgIHRva2VuX28ubGV2ZWwgICA9IGxldmVsKytcbiAgICAgICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnbGlua2lmeSdcbiAgICAgICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX28pXG5cbiAgICAgICAgICBjb25zdCB0b2tlbl90ICAgPSBuZXcgc3RhdGUuVG9rZW4oJ3RleHQnLCAnJywgMClcbiAgICAgICAgICB0b2tlbl90LmNvbnRlbnQgPSB1cmxUZXh0XG4gICAgICAgICAgdG9rZW5fdC5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX3QpXG5cbiAgICAgICAgICBjb25zdCB0b2tlbl9jICAgPSBuZXcgc3RhdGUuVG9rZW4oJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICAgICAgICAgIHRva2VuX2MubGV2ZWwgICA9IC0tbGV2ZWxcbiAgICAgICAgICB0b2tlbl9jLm1hcmt1cCAgPSAnbGlua2lmeSdcbiAgICAgICAgICB0b2tlbl9jLmluZm8gICAgPSAnYXV0bydcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX2MpXG5cbiAgICAgICAgICBsYXN0UG9zID0gbGlua3NbbG5dLmxhc3RJbmRleFxuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0UG9zIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiAgID0gbmV3IHN0YXRlLlRva2VuKCd0ZXh0JywgJycsIDApXG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRleHQuc2xpY2UobGFzdFBvcylcbiAgICAgICAgICB0b2tlbi5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwbGFjZSBjdXJyZW50IG5vZGVcbiAgICAgICAgYmxvY2tUb2tlbnNbal0uY2hpbGRyZW4gPSB0b2tlbnMgPSBhcnJheVJlcGxhY2VBdCh0b2tlbnMsIGksIG5vZGVzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gU2ltcGxlIHR5cG9ncmFwaGljIHJlcGxhY2VtZW50c1xuLy9cbi8vIChjKSAoQykg4oaSIMKpXG4vLyAodG0pIChUTSkg4oaSIOKEolxuLy8gKHIpIChSKSDihpIgwq5cbi8vICstIOKGkiDCsVxuLy8gLi4uIOKGkiDigKYgKGFsc28gPy4uLi4g4oaSID8uLiwgIS4uLi4g4oaSICEuLilcbi8vID8/Pz8/Pz8/IOKGkiA/Pz8sICEhISEhIOKGkiAhISEsIGAsLGAg4oaSIGAsYFxuLy8gLS0g4oaSICZuZGFzaDssIC0tLSDihpIgJm1kYXNoO1xuLy9cblxuLy8gVE9ETzpcbi8vIC0gZnJhY3Rpb25hbHMgMS8yLCAxLzQsIDMvNCAtPiDCvSwgwrwsIMK+XG4vLyAtIG11bHRpcGxpY2F0aW9ucyAyIHggNCAtPiAyIMOXIDRcblxuY29uc3QgUkFSRV9SRSA9IC9cXCstfFxcLlxcLnxcXD9cXD9cXD9cXD98ISEhIXwsLHwtLS9cblxuLy8gV29ya2Fyb3VuZCBmb3IgcGhhbnRvbWpzIC0gbmVlZCByZWdleCB3aXRob3V0IC9nIGZsYWcsXG4vLyBvciByb290IGNoZWNrIHdpbGwgZmFpbCBldmVyeSBzZWNvbmQgdGltZVxuY29uc3QgU0NPUEVEX0FCQlJfVEVTVF9SRSA9IC9cXCgoY3x0bXxyKVxcKS9pXG5cbmNvbnN0IFNDT1BFRF9BQkJSX1JFID0gL1xcKChjfHRtfHIpXFwpL2lnXG5jb25zdCBTQ09QRURfQUJCUiA9IHtcbiAgYzogJ8KpJyxcbiAgcjogJ8KuJyxcbiAgdG06ICfihKInXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VGbiAobWF0Y2gsIG5hbWUpIHtcbiAgcmV0dXJuIFNDT1BFRF9BQkJSW25hbWUudG9Mb3dlckNhc2UoKV1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZV9zY29wZWQgKGlubGluZVRva2Vucykge1xuICBsZXQgaW5zaWRlX2F1dG9saW5rID0gMFxuXG4gIGZvciAobGV0IGkgPSBpbmxpbmVUb2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0b2tlbiA9IGlubGluZVRva2Vuc1tpXVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiAhaW5zaWRlX2F1dG9saW5rKSB7XG4gICAgICB0b2tlbi5jb250ZW50ID0gdG9rZW4uY29udGVudC5yZXBsYWNlKFNDT1BFRF9BQkJSX1JFLCByZXBsYWNlRm4pXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX29wZW4nICYmIHRva2VuLmluZm8gPT09ICdhdXRvJykge1xuICAgICAgaW5zaWRlX2F1dG9saW5rLS1cbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpbmtfY2xvc2UnICYmIHRva2VuLmluZm8gPT09ICdhdXRvJykge1xuICAgICAgaW5zaWRlX2F1dG9saW5rKytcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZV9yYXJlIChpbmxpbmVUb2tlbnMpIHtcbiAgbGV0IGluc2lkZV9hdXRvbGluayA9IDBcblxuICBmb3IgKGxldCBpID0gaW5saW5lVG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmxpbmVUb2tlbnNbaV1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgIWluc2lkZV9hdXRvbGluaykge1xuICAgICAgaWYgKFJBUkVfUkUudGVzdCh0b2tlbi5jb250ZW50KSkge1xuICAgICAgICB0b2tlbi5jb250ZW50ID0gdG9rZW4uY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlKC9cXCstL2csICfCsScpXG4gICAgICAgICAgLy8gLi4sIC4uLiwgLi4uLi4uLiAtPiDigKZcbiAgICAgICAgICAvLyBidXQgPy4uLi4uICYgIS4uLi4uIC0+ID8uLiAmICEuLlxuICAgICAgICAgIC5yZXBsYWNlKC9cXC57Mix9L2csICfigKYnKS5yZXBsYWNlKC8oWz8hXSnigKYvZywgJyQxLi4nKVxuICAgICAgICAgIC5yZXBsYWNlKC8oWz8hXSl7NCx9L2csICckMSQxJDEnKS5yZXBsYWNlKC8sezIsfS9nLCAnLCcpXG4gICAgICAgICAgLy8gZW0tZGFzaFxuICAgICAgICAgIC5yZXBsYWNlKC8oXnxbXi1dKS0tLSg/PVteLV18JCkvbWcsICckMVxcdTIwMTQnKVxuICAgICAgICAgIC8vIGVuLWRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvKF58XFxzKS0tKD89XFxzfCQpL21nLCAnJDFcXHUyMDEzJylcbiAgICAgICAgICAucmVwbGFjZSgvKF58W14tXFxzXSktLSg/PVteLVxcc118JCkvbWcsICckMVxcdTIwMTMnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19vcGVuJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluay0tXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX2Nsb3NlJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluaysrXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcGxhY2UgKHN0YXRlKSB7XG4gIGxldCBibGtJZHhcblxuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMudHlwb2dyYXBoZXIpIHsgcmV0dXJuIH1cblxuICBmb3IgKGJsa0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxOyBibGtJZHggPj0gMDsgYmxrSWR4LS0pIHtcbiAgICBpZiAoc3RhdGUudG9rZW5zW2Jsa0lkeF0udHlwZSAhPT0gJ2lubGluZScpIHsgY29udGludWUgfVxuXG4gICAgaWYgKFNDT1BFRF9BQkJSX1RFU1RfUkUudGVzdChzdGF0ZS50b2tlbnNbYmxrSWR4XS5jb250ZW50KSkge1xuICAgICAgcmVwbGFjZV9zY29wZWQoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY2hpbGRyZW4pXG4gICAgfVxuXG4gICAgaWYgKFJBUkVfUkUudGVzdChzdGF0ZS50b2tlbnNbYmxrSWR4XS5jb250ZW50KSkge1xuICAgICAgcmVwbGFjZV9yYXJlKHN0YXRlLnRva2Vuc1tibGtJZHhdLmNoaWxkcmVuKVxuICAgIH1cbiAgfVxufVxuIiwiLy8gQ29udmVydCBzdHJhaWdodCBxdW90YXRpb24gbWFya3MgdG8gdHlwb2dyYXBoaWMgb25lc1xuLy9cblxuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlLCBpc1B1bmN0Q2hhciwgaXNNZEFzY2lpUHVuY3QgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5jb25zdCBRVU9URV9URVNUX1JFID0gL1snXCJdL1xuY29uc3QgUVVPVEVfUkUgPSAvWydcIl0vZ1xuY29uc3QgQVBPU1RST1BIRSA9ICdcXHUyMDE5JyAvKiDigJkgKi9cblxuZnVuY3Rpb24gcmVwbGFjZUF0IChzdHIsIGluZGV4LCBjaCkge1xuICByZXR1cm4gc3RyLnNsaWNlKDAsIGluZGV4KSArIGNoICsgc3RyLnNsaWNlKGluZGV4ICsgMSlcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc19pbmxpbmVzICh0b2tlbnMsIHN0YXRlKSB7XG4gIGxldCBqXG5cbiAgY29uc3Qgc3RhY2sgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV1cblxuICAgIGNvbnN0IHRoaXNMZXZlbCA9IHRva2Vuc1tpXS5sZXZlbFxuXG4gICAgZm9yIChqID0gc3RhY2subGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIGlmIChzdGFja1tqXS5sZXZlbCA8PSB0aGlzTGV2ZWwpIHsgYnJlYWsgfVxuICAgIH1cbiAgICBzdGFjay5sZW5ndGggPSBqICsgMVxuXG4gICAgaWYgKHRva2VuLnR5cGUgIT09ICd0ZXh0JykgeyBjb250aW51ZSB9XG5cbiAgICBsZXQgdGV4dCA9IHRva2VuLmNvbnRlbnRcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBtYXggPSB0ZXh0Lmxlbmd0aFxuXG4gICAgLyogZXNsaW50IG5vLWxhYmVsczowLGJsb2NrLXNjb3BlZC12YXI6MCAqL1xuICAgIE9VVEVSOlxuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIFFVT1RFX1JFLmxhc3RJbmRleCA9IHBvc1xuICAgICAgY29uc3QgdCA9IFFVT1RFX1JFLmV4ZWModGV4dClcbiAgICAgIGlmICghdCkgeyBicmVhayB9XG5cbiAgICAgIGxldCBjYW5PcGVuID0gdHJ1ZVxuICAgICAgbGV0IGNhbkNsb3NlID0gdHJ1ZVxuICAgICAgcG9zID0gdC5pbmRleCArIDFcbiAgICAgIGNvbnN0IGlzU2luZ2xlID0gKHRbMF0gPT09IFwiJ1wiKVxuXG4gICAgICAvLyBGaW5kIHByZXZpb3VzIGNoYXJhY3RlcixcbiAgICAgIC8vIGRlZmF1bHQgdG8gc3BhY2UgaWYgaXQncyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lXG4gICAgICAvL1xuICAgICAgbGV0IGxhc3RDaGFyID0gMHgyMFxuXG4gICAgICBpZiAodC5pbmRleCAtIDEgPj0gMCkge1xuICAgICAgICBsYXN0Q2hhciA9IHRleHQuY2hhckNvZGVBdCh0LmluZGV4IC0gMSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaiA9IGkgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGlmICh0b2tlbnNbal0udHlwZSA9PT0gJ3NvZnRicmVhaycgfHwgdG9rZW5zW2pdLnR5cGUgPT09ICdoYXJkYnJlYWsnKSBicmVhayAvLyBsYXN0Q2hhciBkZWZhdWx0cyB0byAweDIwXG4gICAgICAgICAgaWYgKCF0b2tlbnNbal0uY29udGVudCkgY29udGludWUgLy8gc2hvdWxkIHNraXAgYWxsIHRva2VucyBleGNlcHQgJ3RleHQnLCAnaHRtbF9pbmxpbmUnIG9yICdjb2RlX2lubGluZSdcblxuICAgICAgICAgIGxhc3RDaGFyID0gdG9rZW5zW2pdLmNvbnRlbnQuY2hhckNvZGVBdCh0b2tlbnNbal0uY29udGVudC5sZW5ndGggLSAxKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmluZCBuZXh0IGNoYXJhY3RlcixcbiAgICAgIC8vIGRlZmF1bHQgdG8gc3BhY2UgaWYgaXQncyB0aGUgZW5kIG9mIHRoZSBsaW5lXG4gICAgICAvL1xuICAgICAgbGV0IG5leHRDaGFyID0gMHgyMFxuXG4gICAgICBpZiAocG9zIDwgbWF4KSB7XG4gICAgICAgIG5leHRDaGFyID0gdGV4dC5jaGFyQ29kZUF0KHBvcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgdG9rZW5zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgaWYgKHRva2Vuc1tqXS50eXBlID09PSAnc29mdGJyZWFrJyB8fCB0b2tlbnNbal0udHlwZSA9PT0gJ2hhcmRicmVhaycpIGJyZWFrIC8vIG5leHRDaGFyIGRlZmF1bHRzIHRvIDB4MjBcbiAgICAgICAgICBpZiAoIXRva2Vuc1tqXS5jb250ZW50KSBjb250aW51ZSAvLyBzaG91bGQgc2tpcCBhbGwgdG9rZW5zIGV4Y2VwdCAndGV4dCcsICdodG1sX2lubGluZScgb3IgJ2NvZGVfaW5saW5lJ1xuXG4gICAgICAgICAgbmV4dENoYXIgPSB0b2tlbnNbal0uY29udGVudC5jaGFyQ29kZUF0KDApXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0xhc3RQdW5jdENoYXIgPSBpc01kQXNjaWlQdW5jdChsYXN0Q2hhcikgfHwgaXNQdW5jdENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZShsYXN0Q2hhcikpXG4gICAgICBjb25zdCBpc05leHRQdW5jdENoYXIgPSBpc01kQXNjaWlQdW5jdChuZXh0Q2hhcikgfHwgaXNQdW5jdENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhcikpXG5cbiAgICAgIGNvbnN0IGlzTGFzdFdoaXRlU3BhY2UgPSBpc1doaXRlU3BhY2UobGFzdENoYXIpXG4gICAgICBjb25zdCBpc05leHRXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKG5leHRDaGFyKVxuXG4gICAgICBpZiAoaXNOZXh0V2hpdGVTcGFjZSkge1xuICAgICAgICBjYW5PcGVuID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoaXNOZXh0UHVuY3RDaGFyKSB7XG4gICAgICAgIGlmICghKGlzTGFzdFdoaXRlU3BhY2UgfHwgaXNMYXN0UHVuY3RDaGFyKSkge1xuICAgICAgICAgIGNhbk9wZW4gPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0xhc3RXaGl0ZVNwYWNlKSB7XG4gICAgICAgIGNhbkNsb3NlID0gZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAoaXNMYXN0UHVuY3RDaGFyKSB7XG4gICAgICAgIGlmICghKGlzTmV4dFdoaXRlU3BhY2UgfHwgaXNOZXh0UHVuY3RDaGFyKSkge1xuICAgICAgICAgIGNhbkNsb3NlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV4dENoYXIgPT09IDB4MjIgLyogXCIgKi8gJiYgdFswXSA9PT0gJ1wiJykge1xuICAgICAgICBpZiAobGFzdENoYXIgPj0gMHgzMCAvKiAwICovICYmIGxhc3RDaGFyIDw9IDB4MzkgLyogOSAqLykge1xuICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogMVwiXCIgLSBjb3VudCBmaXJzdCBxdW90ZSBhcyBhbiBpbmNoXG4gICAgICAgICAgY2FuQ2xvc2UgPSBjYW5PcGVuID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FuT3BlbiAmJiBjYW5DbG9zZSkge1xuICAgICAgICAvLyBSZXBsYWNlIHF1b3RlcyBpbiB0aGUgbWlkZGxlIG9mIHB1bmN0dWF0aW9uIHNlcXVlbmNlLCBidXQgbm90XG4gICAgICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIHdvcmRzLCBpLmUuOlxuICAgICAgICAvL1xuICAgICAgICAvLyAxLiBmb28gXCIgYmFyIFwiIGJheiAtIG5vdCByZXBsYWNlZFxuICAgICAgICAvLyAyLiBmb28tXCItYmFyLVwiLWJheiAtIHJlcGxhY2VkXG4gICAgICAgIC8vIDMuIGZvb1wiYmFyXCJiYXogICAgIC0gbm90IHJlcGxhY2VkXG4gICAgICAgIC8vXG4gICAgICAgIGNhbk9wZW4gPSBpc0xhc3RQdW5jdENoYXJcbiAgICAgICAgY2FuQ2xvc2UgPSBpc05leHRQdW5jdENoYXJcbiAgICAgIH1cblxuICAgICAgaWYgKCFjYW5PcGVuICYmICFjYW5DbG9zZSkge1xuICAgICAgICAvLyBtaWRkbGUgb2Ygd29yZFxuICAgICAgICBpZiAoaXNTaW5nbGUpIHtcbiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gcmVwbGFjZUF0KHRva2VuLmNvbnRlbnQsIHQuaW5kZXgsIEFQT1NUUk9QSEUpXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGNhbkNsb3NlKSB7XG4gICAgICAgIC8vIHRoaXMgY291bGQgYmUgYSBjbG9zaW5nIHF1b3RlLCByZXdpbmQgdGhlIHN0YWNrIHRvIGdldCBhIG1hdGNoXG4gICAgICAgIGZvciAoaiA9IHN0YWNrLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgbGV0IGl0ZW0gPSBzdGFja1tqXVxuICAgICAgICAgIGlmIChzdGFja1tqXS5sZXZlbCA8IHRoaXNMZXZlbCkgeyBicmVhayB9XG4gICAgICAgICAgaWYgKGl0ZW0uc2luZ2xlID09PSBpc1NpbmdsZSAmJiBzdGFja1tqXS5sZXZlbCA9PT0gdGhpc0xldmVsKSB7XG4gICAgICAgICAgICBpdGVtID0gc3RhY2tbal1cblxuICAgICAgICAgICAgbGV0IG9wZW5RdW90ZVxuICAgICAgICAgICAgbGV0IGNsb3NlUXVvdGVcbiAgICAgICAgICAgIGlmIChpc1NpbmdsZSkge1xuICAgICAgICAgICAgICBvcGVuUXVvdGUgPSBzdGF0ZS5tZC5vcHRpb25zLnF1b3Rlc1syXVxuICAgICAgICAgICAgICBjbG9zZVF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbM11cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wZW5RdW90ZSA9IHN0YXRlLm1kLm9wdGlvbnMucXVvdGVzWzBdXG4gICAgICAgICAgICAgIGNsb3NlUXVvdGUgPSBzdGF0ZS5tZC5vcHRpb25zLnF1b3Rlc1sxXVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZXBsYWNlIHRva2VuLmNvbnRlbnQgKmJlZm9yZSogdG9rZW5zW2l0ZW0udG9rZW5dLmNvbnRlbnQsXG4gICAgICAgICAgICAvLyBiZWNhdXNlLCBpZiB0aGV5IGFyZSBwb2ludGluZyBhdCB0aGUgc2FtZSB0b2tlbiwgcmVwbGFjZUF0XG4gICAgICAgICAgICAvLyBjb3VsZCBtZXNzIHVwIGluZGljZXMgd2hlbiBxdW90ZSBsZW5ndGggIT0gMVxuICAgICAgICAgICAgdG9rZW4uY29udGVudCA9IHJlcGxhY2VBdCh0b2tlbi5jb250ZW50LCB0LmluZGV4LCBjbG9zZVF1b3RlKVxuICAgICAgICAgICAgdG9rZW5zW2l0ZW0udG9rZW5dLmNvbnRlbnQgPSByZXBsYWNlQXQoXG4gICAgICAgICAgICAgIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50LCBpdGVtLnBvcywgb3BlblF1b3RlKVxuXG4gICAgICAgICAgICBwb3MgKz0gY2xvc2VRdW90ZS5sZW5ndGggLSAxXG4gICAgICAgICAgICBpZiAoaXRlbS50b2tlbiA9PT0gaSkgeyBwb3MgKz0gb3BlblF1b3RlLmxlbmd0aCAtIDEgfVxuXG4gICAgICAgICAgICB0ZXh0ID0gdG9rZW4uY29udGVudFxuICAgICAgICAgICAgbWF4ID0gdGV4dC5sZW5ndGhcblxuICAgICAgICAgICAgc3RhY2subGVuZ3RoID0galxuICAgICAgICAgICAgY29udGludWUgT1VURVJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhbk9wZW4pIHtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgdG9rZW46IGksXG4gICAgICAgICAgcG9zOiB0LmluZGV4LFxuICAgICAgICAgIHNpbmdsZTogaXNTaW5nbGUsXG4gICAgICAgICAgbGV2ZWw6IHRoaXNMZXZlbFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChjYW5DbG9zZSAmJiBpc1NpbmdsZSkge1xuICAgICAgICB0b2tlbi5jb250ZW50ID0gcmVwbGFjZUF0KHRva2VuLmNvbnRlbnQsIHQuaW5kZXgsIEFQT1NUUk9QSEUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNtYXJ0cXVvdGVzIChzdGF0ZSkge1xuICAvKiBlc2xpbnQgbWF4LWRlcHRoOjAgKi9cbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLnR5cG9ncmFwaGVyKSB7IHJldHVybiB9XG5cbiAgZm9yIChsZXQgYmxrSWR4ID0gc3RhdGUudG9rZW5zLmxlbmd0aCAtIDE7IGJsa0lkeCA+PSAwOyBibGtJZHgtLSkge1xuICAgIGlmIChzdGF0ZS50b2tlbnNbYmxrSWR4XS50eXBlICE9PSAnaW5saW5lJyB8fFxuICAgICAgICAhUVVPVEVfVEVTVF9SRS50ZXN0KHN0YXRlLnRva2Vuc1tibGtJZHhdLmNvbnRlbnQpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHByb2Nlc3NfaW5saW5lcyhzdGF0ZS50b2tlbnNbYmxrSWR4XS5jaGlsZHJlbiwgc3RhdGUpXG4gIH1cbn1cbiIsIi8qKiBpbnRlcm5hbFxuICogY2xhc3MgQ29yZVxuICpcbiAqIFRvcC1sZXZlbCBydWxlcyBleGVjdXRvci4gR2x1ZXMgYmxvY2svaW5saW5lIHBhcnNlcnMgYW5kIGRvZXMgaW50ZXJtZWRpYXRlXG4gKiB0cmFuc2Zvcm1hdGlvbnMuXG4gKiovXG5cbmltcG9ydCBSdWxlciBmcm9tICcuL3J1bGVyLm1qcydcbmltcG9ydCBTdGF0ZUNvcmUgZnJvbSAnLi9ydWxlc19jb3JlL3N0YXRlX2NvcmUubWpzJ1xuXG5pbXBvcnQgcl9ub3JtYWxpemUgZnJvbSAnLi9ydWxlc19jb3JlL25vcm1hbGl6ZS5tanMnXG5pbXBvcnQgcl9ibG9jayBmcm9tICcuL3J1bGVzX2NvcmUvYmxvY2subWpzJ1xuaW1wb3J0IHJfaW5saW5lIGZyb20gJy4vcnVsZXNfY29yZS9pbmxpbmUubWpzJ1xuaW1wb3J0IHJfbGlua2lmeSBmcm9tICcuL3J1bGVzX2NvcmUvbGlua2lmeS5tanMnXG5pbXBvcnQgcl9yZXBsYWNlbWVudHMgZnJvbSAnLi9ydWxlc19jb3JlL3JlcGxhY2VtZW50cy5tanMnXG5pbXBvcnQgcl9zbWFydHF1b3RlcyBmcm9tICcuL3J1bGVzX2NvcmUvc21hcnRxdW90ZXMubWpzJ1xuaW1wb3J0IHJfdGV4dF9qb2luIGZyb20gJy4vcnVsZXNfY29yZS90ZXh0X2pvaW4ubWpzJ1xuXG5jb25zdCBfcnVsZXMgPSBbXG4gIFsnbm9ybWFsaXplJywgICAgICByX25vcm1hbGl6ZV0sXG4gIFsnYmxvY2snLCAgICAgICAgICByX2Jsb2NrXSxcbiAgWydpbmxpbmUnLCAgICAgICAgIHJfaW5saW5lXSxcbiAgWydsaW5raWZ5JywgICAgICAgIHJfbGlua2lmeV0sXG4gIFsncmVwbGFjZW1lbnRzJywgICByX3JlcGxhY2VtZW50c10sXG4gIFsnc21hcnRxdW90ZXMnLCAgICByX3NtYXJ0cXVvdGVzXSxcbiAgLy8gYHRleHRfam9pbmAgZmluZHMgYHRleHRfc3BlY2lhbGAgdG9rZW5zIChmb3IgZXNjYXBlIHNlcXVlbmNlcylcbiAgLy8gYW5kIGpvaW5zIHRoZW0gd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGV4dFxuICBbJ3RleHRfam9pbicsICAgICAgcl90ZXh0X2pvaW5dXG5dXG5cbi8qKlxuICogbmV3IENvcmUoKVxuICoqL1xuZnVuY3Rpb24gQ29yZSAoKSB7XG4gIC8qKlxuICAgKiBDb3JlI3J1bGVyIC0+IFJ1bGVyXG4gICAqXG4gICAqIFtbUnVsZXJdXSBpbnN0YW5jZS4gS2VlcCBjb25maWd1cmF0aW9uIG9mIGNvcmUgcnVsZXMuXG4gICAqKi9cbiAgdGhpcy5ydWxlciA9IG5ldyBSdWxlcigpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0pXG4gIH1cbn1cblxuLyoqXG4gKiBDb3JlLnByb2Nlc3Moc3RhdGUpXG4gKlxuICogRXhlY3V0ZXMgY29yZSBjaGFpbiBydWxlcy5cbiAqKi9cbkNvcmUucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKVxuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gcnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgcnVsZXNbaV0oc3RhdGUpXG4gIH1cbn1cblxuQ29yZS5wcm90b3R5cGUuU3RhdGUgPSBTdGF0ZUNvcmVcblxuZXhwb3J0IGRlZmF1bHQgQ29yZVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmxvY2sgKHN0YXRlKSB7XG4gIGxldCB0b2tlblxuXG4gIGlmIChzdGF0ZS5pbmxpbmVNb2RlKSB7XG4gICAgdG9rZW4gICAgICAgICAgPSBuZXcgc3RhdGUuVG9rZW4oJ2lubGluZScsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgID0gc3RhdGUuc3JjXG4gICAgdG9rZW4ubWFwICAgICAgPSBbMCwgMV1cbiAgICB0b2tlbi5jaGlsZHJlbiA9IFtdXG4gICAgc3RhdGUudG9rZW5zLnB1c2godG9rZW4pXG4gIH0gZWxzZSB7XG4gICAgc3RhdGUubWQuYmxvY2sucGFyc2Uoc3RhdGUuc3JjLCBzdGF0ZS5tZCwgc3RhdGUuZW52LCBzdGF0ZS50b2tlbnMpXG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlubGluZSAoc3RhdGUpIHtcbiAgY29uc3QgdG9rZW5zID0gc3RhdGUudG9rZW5zXG5cbiAgLy8gUGFyc2UgaW5saW5lc1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHRva2Vucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCB0b2sgPSB0b2tlbnNbaV1cbiAgICBpZiAodG9rLnR5cGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICBzdGF0ZS5tZC5pbmxpbmUucGFyc2UodG9rLmNvbnRlbnQsIHN0YXRlLm1kLCBzdGF0ZS5lbnYsIHRvay5jaGlsZHJlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEpvaW4gcmF3IHRleHQgdG9rZW5zIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRleHRcbi8vXG4vLyBUaGlzIGlzIHNldCBhcyBhIHNlcGFyYXRlIHJ1bGUgdG8gcHJvdmlkZSBhbiBvcHBvcnR1bml0eSBmb3IgcGx1Z2luc1xuLy8gdG8gcnVuIHRleHQgcmVwbGFjZW1lbnRzIGFmdGVyIHRleHQgam9pbiwgYnV0IGJlZm9yZSBlc2NhcGUgam9pbi5cbi8vXG4vLyBGb3IgZXhhbXBsZSwgYFxcOilgIHNob3VsZG4ndCBiZSByZXBsYWNlZCB3aXRoIGFuIGVtb2ppLlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGV4dF9qb2luIChzdGF0ZSkge1xuICBsZXQgY3VyciwgbGFzdFxuICBjb25zdCBibG9ja1Rva2VucyA9IHN0YXRlLnRva2Vuc1xuICBjb25zdCBsID0gYmxvY2tUb2tlbnMubGVuZ3RoXG5cbiAgZm9yIChsZXQgaiA9IDA7IGogPCBsOyBqKyspIHtcbiAgICBpZiAoYmxvY2tUb2tlbnNbal0udHlwZSAhPT0gJ2lubGluZScpIGNvbnRpbnVlXG5cbiAgICBjb25zdCB0b2tlbnMgPSBibG9ja1Rva2Vuc1tqXS5jaGlsZHJlblxuICAgIGNvbnN0IG1heCA9IHRva2Vucy5sZW5ndGhcblxuICAgIGZvciAoY3VyciA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgICAgaWYgKHRva2Vuc1tjdXJyXS50eXBlID09PSAndGV4dF9zcGVjaWFsJykge1xuICAgICAgICB0b2tlbnNbY3Vycl0udHlwZSA9ICd0ZXh0J1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY3VyciA9IGxhc3QgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICAgIGlmICh0b2tlbnNbY3Vycl0udHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgICAgY3VyciArIDEgPCBtYXggJiZcbiAgICAgICAgICB0b2tlbnNbY3VyciArIDFdLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAvLyBjb2xsYXBzZSB0d28gYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgICB0b2tlbnNbY3VyciArIDFdLmNvbnRlbnQgPSB0b2tlbnNbY3Vycl0uY29udGVudCArIHRva2Vuc1tjdXJyICsgMV0uY29udGVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnIgIT09IGxhc3QpIHsgdG9rZW5zW2xhc3RdID0gdG9rZW5zW2N1cnJdIH1cblxuICAgICAgICBsYXN0KytcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VyciAhPT0gbGFzdCkge1xuICAgICAgdG9rZW5zLmxlbmd0aCA9IGxhc3RcbiAgICB9XG4gIH1cbn1cbiIsIi8vIFBhcnNlciBzdGF0ZSBjbGFzc1xuXG5pbXBvcnQgVG9rZW4gZnJvbSAnLi4vdG9rZW4ubWpzJ1xuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmZ1bmN0aW9uIFN0YXRlQmxvY2sgKHNyYywgbWQsIGVudiwgdG9rZW5zKSB7XG4gIHRoaXMuc3JjID0gc3JjXG5cbiAgLy8gbGluayB0byBwYXJzZXIgaW5zdGFuY2VcbiAgdGhpcy5tZCAgICAgPSBtZFxuXG4gIHRoaXMuZW52ID0gZW52XG5cbiAgLy9cbiAgLy8gSW50ZXJuYWwgc3RhdGUgdmFydGlhYmxlc1xuICAvL1xuXG4gIHRoaXMudG9rZW5zID0gdG9rZW5zXG5cbiAgdGhpcy5iTWFya3MgPSBbXSAgLy8gbGluZSBiZWdpbiBvZmZzZXRzIGZvciBmYXN0IGp1bXBzXG4gIHRoaXMuZU1hcmtzID0gW10gIC8vIGxpbmUgZW5kIG9mZnNldHMgZm9yIGZhc3QganVtcHNcbiAgdGhpcy50U2hpZnQgPSBbXSAgLy8gb2Zmc2V0cyBvZiB0aGUgZmlyc3Qgbm9uLXNwYWNlIGNoYXJhY3RlcnMgKHRhYnMgbm90IGV4cGFuZGVkKVxuICB0aGlzLnNDb3VudCA9IFtdICAvLyBpbmRlbnRzIGZvciBlYWNoIGxpbmUgKHRhYnMgZXhwYW5kZWQpXG5cbiAgLy8gQW4gYW1vdW50IG9mIHZpcnR1YWwgc3BhY2VzICh0YWJzIGV4cGFuZGVkKSBiZXR3ZWVuIGJlZ2lubmluZ1xuICAvLyBvZiBlYWNoIGxpbmUgKGJNYXJrcykgYW5kIHJlYWwgYmVnaW5uaW5nIG9mIHRoYXQgbGluZS5cbiAgLy9cbiAgLy8gSXQgZXhpc3RzIG9ubHkgYXMgYSBoYWNrIGJlY2F1c2UgYmxvY2txdW90ZXMgb3ZlcnJpZGUgYk1hcmtzXG4gIC8vIGxvc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgcHJvY2Vzcy5cbiAgLy9cbiAgLy8gSXQncyB1c2VkIG9ubHkgd2hlbiBleHBhbmRpbmcgdGFicywgeW91IGNhbiB0aGluayBhYm91dCBpdCBhc1xuICAvLyBhbiBpbml0aWFsIHRhYiBsZW5ndGgsIGUuZy4gYnNDb3VudD0yMSBhcHBsaWVkIHRvIHN0cmluZyBgXFx0MTIzYFxuICAvLyBtZWFucyBmaXJzdCB0YWIgc2hvdWxkIGJlIGV4cGFuZGVkIHRvIDQtMjElNCA9PT0gMyBzcGFjZXMuXG4gIC8vXG4gIHRoaXMuYnNDb3VudCA9IFtdXG5cbiAgLy8gYmxvY2sgcGFyc2VyIHZhcmlhYmxlc1xuXG4gIC8vIHJlcXVpcmVkIGJsb2NrIGNvbnRlbnQgaW5kZW50IChmb3IgZXhhbXBsZSwgaWYgd2UgYXJlXG4gIC8vIGluc2lkZSBhIGxpc3QsIGl0IHdvdWxkIGJlIHBvc2l0aW9uZWQgYWZ0ZXIgbGlzdCBtYXJrZXIpXG4gIHRoaXMuYmxrSW5kZW50ICA9IDBcbiAgdGhpcy5saW5lICAgICAgID0gMCAvLyBsaW5lIGluZGV4IGluIHNyY1xuICB0aGlzLmxpbmVNYXggICAgPSAwIC8vIGxpbmVzIGNvdW50XG4gIHRoaXMudGlnaHQgICAgICA9IGZhbHNlICAvLyBsb29zZS90aWdodCBtb2RlIGZvciBsaXN0c1xuICB0aGlzLmRkSW5kZW50ICAgPSAtMSAvLyBpbmRlbnQgb2YgdGhlIGN1cnJlbnQgZGQgYmxvY2sgKC0xIGlmIHRoZXJlIGlzbid0IGFueSlcbiAgdGhpcy5saXN0SW5kZW50ID0gLTEgLy8gaW5kZW50IG9mIHRoZSBjdXJyZW50IGxpc3QgYmxvY2sgKC0xIGlmIHRoZXJlIGlzbid0IGFueSlcblxuICAvLyBjYW4gYmUgJ2Jsb2NrcXVvdGUnLCAnbGlzdCcsICdyb290JywgJ3BhcmFncmFwaCcgb3IgJ3JlZmVyZW5jZSdcbiAgLy8gdXNlZCBpbiBsaXN0cyB0byBkZXRlcm1pbmUgaWYgdGhleSBpbnRlcnJ1cHQgYSBwYXJhZ3JhcGhcbiAgdGhpcy5wYXJlbnRUeXBlID0gJ3Jvb3QnXG5cbiAgdGhpcy5sZXZlbCA9IDBcblxuICAvLyBDcmVhdGUgY2FjaGVzXG4gIC8vIEdlbmVyYXRlIG1hcmtlcnMuXG4gIGNvbnN0IHMgPSB0aGlzLnNyY1xuXG4gIGZvciAobGV0IHN0YXJ0ID0gMCwgcG9zID0gMCwgaW5kZW50ID0gMCwgb2Zmc2V0ID0gMCwgbGVuID0gcy5sZW5ndGgsIGluZGVudF9mb3VuZCA9IGZhbHNlOyBwb3MgPCBsZW47IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKCFpbmRlbnRfZm91bmQpIHtcbiAgICAgIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgICBpbmRlbnQrK1xuXG4gICAgICAgIGlmIChjaCA9PT0gMHgwOSkge1xuICAgICAgICAgIG9mZnNldCArPSA0IC0gb2Zmc2V0ICUgNFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZnNldCsrXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudF9mb3VuZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ggPT09IDB4MEEgfHwgcG9zID09PSBsZW4gLSAxKSB7XG4gICAgICBpZiAoY2ggIT09IDB4MEEpIHsgcG9zKysgfVxuICAgICAgdGhpcy5iTWFya3MucHVzaChzdGFydClcbiAgICAgIHRoaXMuZU1hcmtzLnB1c2gocG9zKVxuICAgICAgdGhpcy50U2hpZnQucHVzaChpbmRlbnQpXG4gICAgICB0aGlzLnNDb3VudC5wdXNoKG9mZnNldClcbiAgICAgIHRoaXMuYnNDb3VudC5wdXNoKDApXG5cbiAgICAgIGluZGVudF9mb3VuZCA9IGZhbHNlXG4gICAgICBpbmRlbnQgPSAwXG4gICAgICBvZmZzZXQgPSAwXG4gICAgICBzdGFydCA9IHBvcyArIDFcbiAgICB9XG4gIH1cblxuICAvLyBQdXNoIGZha2UgZW50cnkgdG8gc2ltcGxpZnkgY2FjaGUgYm91bmRzIGNoZWNrc1xuICB0aGlzLmJNYXJrcy5wdXNoKHMubGVuZ3RoKVxuICB0aGlzLmVNYXJrcy5wdXNoKHMubGVuZ3RoKVxuICB0aGlzLnRTaGlmdC5wdXNoKDApXG4gIHRoaXMuc0NvdW50LnB1c2goMClcbiAgdGhpcy5ic0NvdW50LnB1c2goMClcblxuICB0aGlzLmxpbmVNYXggPSB0aGlzLmJNYXJrcy5sZW5ndGggLSAxIC8vIGRvbid0IGNvdW50IGxhc3QgZmFrZSBsaW5lXG59XG5cbi8vIFB1c2ggbmV3IHRva2VuIHRvIFwic3RyZWFtXCIuXG4vL1xuU3RhdGVCbG9jay5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0eXBlLCB0YWcsIG5lc3RpbmcpIHtcbiAgY29uc3QgdG9rZW4gPSBuZXcgVG9rZW4odHlwZSwgdGFnLCBuZXN0aW5nKVxuICB0b2tlbi5ibG9jayA9IHRydWVcblxuICBpZiAobmVzdGluZyA8IDApIHRoaXMubGV2ZWwtLSAvLyBjbG9zaW5nIHRhZ1xuICB0b2tlbi5sZXZlbCA9IHRoaXMubGV2ZWxcbiAgaWYgKG5lc3RpbmcgPiAwKSB0aGlzLmxldmVsKysgLy8gb3BlbmluZyB0YWdcblxuICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKVxuICByZXR1cm4gdG9rZW5cbn1cblxuU3RhdGVCbG9jay5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uIGlzRW1wdHkgKGxpbmUpIHtcbiAgcmV0dXJuIHRoaXMuYk1hcmtzW2xpbmVdICsgdGhpcy50U2hpZnRbbGluZV0gPj0gdGhpcy5lTWFya3NbbGluZV1cbn1cblxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcEVtcHR5TGluZXMgPSBmdW5jdGlvbiBza2lwRW1wdHlMaW5lcyAoZnJvbSkge1xuICBmb3IgKGxldCBtYXggPSB0aGlzLmxpbmVNYXg7IGZyb20gPCBtYXg7IGZyb20rKykge1xuICAgIGlmICh0aGlzLmJNYXJrc1tmcm9tXSArIHRoaXMudFNoaWZ0W2Zyb21dIDwgdGhpcy5lTWFya3NbZnJvbV0pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG4gIHJldHVybiBmcm9tXG59XG5cbi8vIFNraXAgc3BhY2VzIGZyb20gZ2l2ZW4gcG9zaXRpb24uXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwU3BhY2VzID0gZnVuY3Rpb24gc2tpcFNwYWNlcyAocG9zKSB7XG4gIGZvciAobGV0IG1heCA9IHRoaXMuc3JjLmxlbmd0aDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gdGhpcy5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKCFpc1NwYWNlKGNoKSkgeyBicmVhayB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBTa2lwIHNwYWNlcyBmcm9tIGdpdmVuIHBvc2l0aW9uIGluIHJldmVyc2UuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwU3BhY2VzQmFjayA9IGZ1bmN0aW9uIHNraXBTcGFjZXNCYWNrIChwb3MsIG1pbikge1xuICBpZiAocG9zIDw9IG1pbikgeyByZXR1cm4gcG9zIH1cblxuICB3aGlsZSAocG9zID4gbWluKSB7XG4gICAgaWYgKCFpc1NwYWNlKHRoaXMuc3JjLmNoYXJDb2RlQXQoLS1wb3MpKSkgeyByZXR1cm4gcG9zICsgMSB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBTa2lwIGNoYXIgY29kZXMgZnJvbSBnaXZlbiBwb3NpdGlvblxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcENoYXJzID0gZnVuY3Rpb24gc2tpcENoYXJzIChwb3MsIGNvZGUpIHtcbiAgZm9yIChsZXQgbWF4ID0gdGhpcy5zcmMubGVuZ3RoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgaWYgKHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gY29kZSkgeyBicmVhayB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBTa2lwIGNoYXIgY29kZXMgcmV2ZXJzZSBmcm9tIGdpdmVuIHBvc2l0aW9uIC0gMVxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcENoYXJzQmFjayA9IGZ1bmN0aW9uIHNraXBDaGFyc0JhY2sgKHBvcywgY29kZSwgbWluKSB7XG4gIGlmIChwb3MgPD0gbWluKSB7IHJldHVybiBwb3MgfVxuXG4gIHdoaWxlIChwb3MgPiBtaW4pIHtcbiAgICBpZiAoY29kZSAhPT0gdGhpcy5zcmMuY2hhckNvZGVBdCgtLXBvcykpIHsgcmV0dXJuIHBvcyArIDEgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gY3V0IGxpbmVzIHJhbmdlIGZyb20gc291cmNlLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuZ2V0TGluZXMgPSBmdW5jdGlvbiBnZXRMaW5lcyAoYmVnaW4sIGVuZCwgaW5kZW50LCBrZWVwTGFzdExGKSB7XG4gIGlmIChiZWdpbiA+PSBlbmQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IHF1ZXVlID0gbmV3IEFycmF5KGVuZCAtIGJlZ2luKVxuXG4gIGZvciAobGV0IGkgPSAwLCBsaW5lID0gYmVnaW47IGxpbmUgPCBlbmQ7IGxpbmUrKywgaSsrKSB7XG4gICAgbGV0IGxpbmVJbmRlbnQgPSAwXG4gICAgY29uc3QgbGluZVN0YXJ0ID0gdGhpcy5iTWFya3NbbGluZV1cbiAgICBsZXQgZmlyc3QgPSBsaW5lU3RhcnRcbiAgICBsZXQgbGFzdFxuXG4gICAgaWYgKGxpbmUgKyAxIDwgZW5kIHx8IGtlZXBMYXN0TEYpIHtcbiAgICAgIC8vIE5vIG5lZWQgZm9yIGJvdW5kcyBjaGVjayBiZWNhdXNlIHdlIGhhdmUgZmFrZSBlbnRyeSBvbiB0YWlsLlxuICAgICAgbGFzdCA9IHRoaXMuZU1hcmtzW2xpbmVdICsgMVxuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0ID0gdGhpcy5lTWFya3NbbGluZV1cbiAgICB9XG5cbiAgICB3aGlsZSAoZmlyc3QgPCBsYXN0ICYmIGxpbmVJbmRlbnQgPCBpbmRlbnQpIHtcbiAgICAgIGNvbnN0IGNoID0gdGhpcy5zcmMuY2hhckNvZGVBdChmaXJzdClcblxuICAgICAgaWYgKGlzU3BhY2UoY2gpKSB7XG4gICAgICAgIGlmIChjaCA9PT0gMHgwOSkge1xuICAgICAgICAgIGxpbmVJbmRlbnQgKz0gNCAtIChsaW5lSW5kZW50ICsgdGhpcy5ic0NvdW50W2xpbmVdKSAlIDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lSW5kZW50KytcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChmaXJzdCAtIGxpbmVTdGFydCA8IHRoaXMudFNoaWZ0W2xpbmVdKSB7XG4gICAgICAgIC8vIHBhdGNoZWQgdFNoaWZ0IG1hc2tlZCBjaGFyYWN0ZXJzIHRvIGxvb2sgbGlrZSBzcGFjZXMgKGJsb2NrcXVvdGVzLCBsaXN0IG1hcmtlcnMpXG4gICAgICAgIGxpbmVJbmRlbnQrK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZmlyc3QrK1xuICAgIH1cblxuICAgIGlmIChsaW5lSW5kZW50ID4gaW5kZW50KSB7XG4gICAgICAvLyBwYXJ0aWFsbHkgZXhwYW5kaW5nIHRhYnMgaW4gY29kZSBibG9ja3MsIGUuZyAnXFx0XFx0Zm9vYmFyJ1xuICAgICAgLy8gd2l0aCBpbmRlbnQ9MiBiZWNvbWVzICcgIFxcdGZvb2JhcidcbiAgICAgIHF1ZXVlW2ldID0gbmV3IEFycmF5KGxpbmVJbmRlbnQgLSBpbmRlbnQgKyAxKS5qb2luKCcgJykgKyB0aGlzLnNyYy5zbGljZShmaXJzdCwgbGFzdClcbiAgICB9IGVsc2Uge1xuICAgICAgcXVldWVbaV0gPSB0aGlzLnNyYy5zbGljZShmaXJzdCwgbGFzdClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcXVldWUuam9pbignJylcbn1cblxuLy8gcmUtZXhwb3J0IFRva2VuIGNsYXNzIHRvIHVzZSBpbiBibG9jayBydWxlc1xuU3RhdGVCbG9jay5wcm90b3R5cGUuVG9rZW4gPSBUb2tlblxuXG5leHBvcnQgZGVmYXVsdCBTdGF0ZUJsb2NrXG4iLCIvLyBHRk0gdGFibGUsIGh0dHBzOi8vZ2l0aHViLmdpdGh1Yi5jb20vZ2ZtLyN0YWJsZXMtZXh0ZW5zaW9uLVxuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuLy8gTGltaXQgdGhlIGFtb3VudCBvZiBlbXB0eSBhdXRvY29tcGxldGVkIGNlbGxzIGluIGEgdGFibGUsXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2lzc3Vlcy8xMDAwLFxuLy9cbi8vIEJvdGggcHVsbGRvd24tY21hcmsgYW5kIGNvbW1vbm1hcmstaHMgbGltaXQgdGhlIG51bWJlciBvZiBjZWxscyB0aGlzIHdheSB0byB+MjAway5cbi8vIFdlIHNldCBpdCB0byA2NWssIHdoaWNoIGNhbiBleHBhbmQgdXNlciBpbnB1dCBieSBhIGZhY3RvciBvZiB4MzcwXG4vLyAoMjU2eDI1NiBzcXVhcmUgaXMgMS44a0IgZXhwYW5kZWQgaW50byA2NTBrQikuXG5jb25zdCBNQVhfQVVUT0NPTVBMRVRFRF9DRUxMUyA9IDB4MTAwMDBcblxuZnVuY3Rpb24gZ2V0TGluZSAoc3RhdGUsIGxpbmUpIHtcbiAgY29uc3QgcG9zID0gc3RhdGUuYk1hcmtzW2xpbmVdICsgc3RhdGUudFNoaWZ0W2xpbmVdXG4gIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tsaW5lXVxuXG4gIHJldHVybiBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpXG59XG5cbmZ1bmN0aW9uIGVzY2FwZWRTcGxpdCAoc3RyKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGNvbnN0IG1heCA9IHN0ci5sZW5ndGhcblxuICBsZXQgcG9zID0gMFxuICBsZXQgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gIGxldCBpc0VzY2FwZWQgPSBmYWxzZVxuICBsZXQgbGFzdFBvcyA9IDBcbiAgbGV0IGN1cnJlbnQgPSAnJ1xuXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBpZiAoY2ggPT09IDB4N2MvKiB8ICovKSB7XG4gICAgICBpZiAoIWlzRXNjYXBlZCkge1xuICAgICAgICAvLyBwaXBlIHNlcGFyYXRpbmcgY2VsbHMsICd8J1xuICAgICAgICByZXN1bHQucHVzaChjdXJyZW50ICsgc3RyLnN1YnN0cmluZyhsYXN0UG9zLCBwb3MpKVxuICAgICAgICBjdXJyZW50ID0gJydcbiAgICAgICAgbGFzdFBvcyA9IHBvcyArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzY2FwZWQgcGlwZSwgJ1xcfCdcbiAgICAgICAgY3VycmVudCArPSBzdHIuc3Vic3RyaW5nKGxhc3RQb3MsIHBvcyAtIDEpXG4gICAgICAgIGxhc3RQb3MgPSBwb3NcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VzY2FwZWQgPSAoY2ggPT09IDB4NWMvKiBcXCAqLylcbiAgICBwb3MrK1xuXG4gICAgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gIH1cblxuICByZXN1bHQucHVzaChjdXJyZW50ICsgc3RyLnN1YnN0cmluZyhsYXN0UG9zKSlcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRhYmxlIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgLy8gc2hvdWxkIGhhdmUgYXQgbGVhc3QgdHdvIGxpbmVzXG4gIGlmIChzdGFydExpbmUgKyAyID4gZW5kTGluZSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHNlY29uZCBsaW5lIHNob3VsZCBiZSAnfCcsICctJywgJzonLFxuICAvLyBhbmQgbm8gb3RoZXIgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBidXQgc3BhY2VzO1xuICAvLyBiYXNpY2FsbHksIHRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgL15bLTp8XVstOnxcXHNdKiQvIHJlZ2V4cFxuXG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICBpZiAocG9zID49IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBmaXJzdENoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG4gIGlmIChmaXJzdENoICE9PSAweDdDLyogfCAqLyAmJiBmaXJzdENoICE9PSAweDJELyogLSAqLyAmJiBmaXJzdENoICE9PSAweDNBLyogOiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChwb3MgPj0gc3RhdGUuZU1hcmtzW25leHRMaW5lXSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHNlY29uZENoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG4gIGlmIChzZWNvbmRDaCAhPT0gMHg3Qy8qIHwgKi8gJiYgc2Vjb25kQ2ggIT09IDB4MkQvKiAtICovICYmIHNlY29uZENoICE9PSAweDNBLyogOiAqLyAmJiAhaXNTcGFjZShzZWNvbmRDaCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGlmIGZpcnN0IGNoYXJhY3RlciBpcyAnLScsIHRoZW4gc2Vjb25kIGNoYXJhY3RlciBtdXN0IG5vdCBiZSBhIHNwYWNlXG4gIC8vIChkdWUgdG8gcGFyc2luZyBhbWJpZ3VpdHkgd2l0aCBsaXN0KVxuICBpZiAoZmlyc3RDaCA9PT0gMHgyRC8qIC0gKi8gJiYgaXNTcGFjZShzZWNvbmRDaCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICB3aGlsZSAocG9zIDwgc3RhdGUuZU1hcmtzW25leHRMaW5lXSkge1xuICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKGNoICE9PSAweDdDLyogfCAqLyAmJiBjaCAhPT0gMHgyRC8qIC0gKi8gJiYgY2ggIT09IDB4M0EvKiA6ICovICYmICFpc1NwYWNlKGNoKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgcG9zKytcbiAgfVxuXG4gIGxldCBsaW5lVGV4dCA9IGdldExpbmUoc3RhdGUsIHN0YXJ0TGluZSArIDEpXG4gIGxldCBjb2x1bW5zID0gbGluZVRleHQuc3BsaXQoJ3wnKVxuICBjb25zdCBhbGlnbnMgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0ID0gY29sdW1uc1tpXS50cmltKClcbiAgICBpZiAoIXQpIHtcbiAgICAgIC8vIGFsbG93IGVtcHR5IGNvbHVtbnMgYmVmb3JlIGFuZCBhZnRlciB0YWJsZSwgYnV0IG5vdCBpbiBiZXR3ZWVuIGNvbHVtbnM7XG4gICAgICAvLyBlLmcuIGFsbG93IGAgfC0tLXwgYCwgZGlzYWxsb3cgYCAtLS18fC0tLSBgXG4gICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSBjb2x1bW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghL146Py0rOj8kLy50ZXN0KHQpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHQuY2hhckNvZGVBdCh0Lmxlbmd0aCAtIDEpID09PSAweDNBLyogOiAqLykge1xuICAgICAgYWxpZ25zLnB1c2godC5jaGFyQ29kZUF0KDApID09PSAweDNBLyogOiAqLyA/ICdjZW50ZXInIDogJ3JpZ2h0JylcbiAgICB9IGVsc2UgaWYgKHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGFsaWducy5wdXNoKCdsZWZ0JylcbiAgICB9IGVsc2Uge1xuICAgICAgYWxpZ25zLnB1c2goJycpXG4gICAgfVxuICB9XG5cbiAgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBzdGFydExpbmUpLnRyaW0oKVxuICBpZiAobGluZVRleHQuaW5kZXhPZignfCcpID09PSAtMSkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuICBjb2x1bW5zID0gZXNjYXBlZFNwbGl0KGxpbmVUZXh0KVxuICBpZiAoY29sdW1ucy5sZW5ndGggJiYgY29sdW1uc1swXSA9PT0gJycpIGNvbHVtbnMuc2hpZnQoKVxuICBpZiAoY29sdW1ucy5sZW5ndGggJiYgY29sdW1uc1tjb2x1bW5zLmxlbmd0aCAtIDFdID09PSAnJykgY29sdW1ucy5wb3AoKVxuXG4gIC8vIGhlYWRlciByb3cgd2lsbCBkZWZpbmUgYW4gYW1vdW50IG9mIGNvbHVtbnMgaW4gdGhlIGVudGlyZSB0YWJsZSxcbiAgLy8gYW5kIGFsaWduIHJvdyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSAodGhlIHJlc3Qgb2YgdGhlIHJvd3MgY2FuIGRpZmZlcilcbiAgY29uc3QgY29sdW1uQ291bnQgPSBjb2x1bW5zLmxlbmd0aFxuICBpZiAoY29sdW1uQ291bnQgPT09IDAgfHwgY29sdW1uQ291bnQgIT09IGFsaWducy5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBjb25zdCBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZVxuICBzdGF0ZS5wYXJlbnRUeXBlID0gJ3RhYmxlJ1xuXG4gIC8vIHVzZSAnYmxvY2txdW90ZScgbGlzdHMgZm9yIHRlcm1pbmF0aW9uIGJlY2F1c2UgaXQnc1xuICAvLyB0aGUgbW9zdCBzaW1pbGFyIHRvIHRhYmxlc1xuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygnYmxvY2txdW90ZScpXG5cbiAgY29uc3QgdG9rZW5fdG8gPSBzdGF0ZS5wdXNoKCd0YWJsZV9vcGVuJywgJ3RhYmxlJywgMSlcbiAgY29uc3QgdGFibGVMaW5lcyA9IFtzdGFydExpbmUsIDBdXG4gIHRva2VuX3RvLm1hcCA9IHRhYmxlTGluZXNcblxuICBjb25zdCB0b2tlbl90aG8gPSBzdGF0ZS5wdXNoKCd0aGVhZF9vcGVuJywgJ3RoZWFkJywgMSlcbiAgdG9rZW5fdGhvLm1hcCA9IFtzdGFydExpbmUsIHN0YXJ0TGluZSArIDFdXG5cbiAgY29uc3QgdG9rZW5faHRybyA9IHN0YXRlLnB1c2goJ3RyX29wZW4nLCAndHInLCAxKVxuICB0b2tlbl9odHJvLm1hcCA9IFtzdGFydExpbmUsIHN0YXJ0TGluZSArIDFdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW5faG8gPSBzdGF0ZS5wdXNoKCd0aF9vcGVuJywgJ3RoJywgMSlcbiAgICBpZiAoYWxpZ25zW2ldKSB7XG4gICAgICB0b2tlbl9oby5hdHRycyAgPSBbWydzdHlsZScsICd0ZXh0LWFsaWduOicgKyBhbGlnbnNbaV1dXVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VuX2lsID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gICAgdG9rZW5faWwuY29udGVudCAgPSBjb2x1bW5zW2ldLnRyaW0oKVxuICAgIHRva2VuX2lsLmNoaWxkcmVuID0gW11cblxuICAgIHN0YXRlLnB1c2goJ3RoX2Nsb3NlJywgJ3RoJywgLTEpXG4gIH1cblxuICBzdGF0ZS5wdXNoKCd0cl9jbG9zZScsICd0cicsIC0xKVxuICBzdGF0ZS5wdXNoKCd0aGVhZF9jbG9zZScsICd0aGVhZCcsIC0xKVxuXG4gIGxldCB0Ym9keUxpbmVzXG4gIGxldCBhdXRvY29tcGxldGVkQ2VsbHMgPSAwXG5cbiAgZm9yIChuZXh0TGluZSA9IHN0YXJ0TGluZSArIDI7IG5leHRMaW5lIDwgZW5kTGluZTsgbmV4dExpbmUrKykge1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrIH1cblxuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrIH1cbiAgICBsaW5lVGV4dCA9IGdldExpbmUoc3RhdGUsIG5leHRMaW5lKS50cmltKClcbiAgICBpZiAoIWxpbmVUZXh0KSB7IGJyZWFrIH1cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IGJyZWFrIH1cbiAgICBjb2x1bW5zID0gZXNjYXBlZFNwbGl0KGxpbmVUZXh0KVxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCAmJiBjb2x1bW5zWzBdID09PSAnJykgY29sdW1ucy5zaGlmdCgpXG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbY29sdW1ucy5sZW5ndGggLSAxXSA9PT0gJycpIGNvbHVtbnMucG9wKClcblxuICAgIC8vIG5vdGU6IGF1dG9jb21wbGV0ZSBjb3VudCBjYW4gYmUgbmVnYXRpdmUgaWYgdXNlciBzcGVjaWZpZXMgbW9yZSBjb2x1bW5zIHRoYW4gaGVhZGVyLFxuICAgIC8vIGJ1dCB0aGF0IGRvZXMgbm90IGFmZmVjdCBpbnRlbmRlZCB1c2UgKHdoaWNoIGlzIGxpbWl0aW5nIGV4cGFuc2lvbilcbiAgICBhdXRvY29tcGxldGVkQ2VsbHMgKz0gY29sdW1uQ291bnQgLSBjb2x1bW5zLmxlbmd0aFxuICAgIGlmIChhdXRvY29tcGxldGVkQ2VsbHMgPiBNQVhfQVVUT0NPTVBMRVRFRF9DRUxMUykgeyBicmVhayB9XG5cbiAgICBpZiAobmV4dExpbmUgPT09IHN0YXJ0TGluZSArIDIpIHtcbiAgICAgIGNvbnN0IHRva2VuX3RibyA9IHN0YXRlLnB1c2goJ3Rib2R5X29wZW4nLCAndGJvZHknLCAxKVxuICAgICAgdG9rZW5fdGJvLm1hcCA9IHRib2R5TGluZXMgPSBbc3RhcnRMaW5lICsgMiwgMF1cbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbl90cm8gPSBzdGF0ZS5wdXNoKCd0cl9vcGVuJywgJ3RyJywgMSlcbiAgICB0b2tlbl90cm8ubWFwID0gW25leHRMaW5lLCBuZXh0TGluZSArIDFdXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuX3RkbyA9IHN0YXRlLnB1c2goJ3RkX29wZW4nLCAndGQnLCAxKVxuICAgICAgaWYgKGFsaWduc1tpXSkge1xuICAgICAgICB0b2tlbl90ZG8uYXR0cnMgID0gW1snc3R5bGUnLCAndGV4dC1hbGlnbjonICsgYWxpZ25zW2ldXV1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW5faWwgPSBzdGF0ZS5wdXNoKCdpbmxpbmUnLCAnJywgMClcbiAgICAgIHRva2VuX2lsLmNvbnRlbnQgID0gY29sdW1uc1tpXSA/IGNvbHVtbnNbaV0udHJpbSgpIDogJydcbiAgICAgIHRva2VuX2lsLmNoaWxkcmVuID0gW11cblxuICAgICAgc3RhdGUucHVzaCgndGRfY2xvc2UnLCAndGQnLCAtMSlcbiAgICB9XG4gICAgc3RhdGUucHVzaCgndHJfY2xvc2UnLCAndHInLCAtMSlcbiAgfVxuXG4gIGlmICh0Ym9keUxpbmVzKSB7XG4gICAgc3RhdGUucHVzaCgndGJvZHlfY2xvc2UnLCAndGJvZHknLCAtMSlcbiAgICB0Ym9keUxpbmVzWzFdID0gbmV4dExpbmVcbiAgfVxuXG4gIHN0YXRlLnB1c2goJ3RhYmxlX2Nsb3NlJywgJ3RhYmxlJywgLTEpXG4gIHRhYmxlTGluZXNbMV0gPSBuZXh0TGluZVxuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gTGlzdHNcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbi8vIFNlYXJjaCBgWy0rKl1bXFxuIF1gLCByZXR1cm5zIG5leHQgcG9zIGFmdGVyIG1hcmtlciBvbiBzdWNjZXNzXG4vLyBvciAtMSBvbiBmYWlsLlxuZnVuY3Rpb24gc2tpcEJ1bGxldExpc3RNYXJrZXIgKHN0YXRlLCBzdGFydExpbmUpIHtcbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cblxuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgLy8gQ2hlY2sgYnVsbGV0XG4gIGlmIChtYXJrZXIgIT09IDB4MkEvKiAqICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkQvKiAtICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkIvKiArICovKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBpZiAocG9zIDwgbWF4KSB7XG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoIWlzU3BhY2UoY2gpKSB7XG4gICAgICAvLyBcIiAtdGVzdCBcIiAtIGlzIG5vdCBhIGxpc3QgaXRlbVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBTZWFyY2ggYFxcZCtbLildW1xcbiBdYCwgcmV0dXJucyBuZXh0IHBvcyBhZnRlciBtYXJrZXIgb24gc3VjY2Vzc1xuLy8gb3IgLTEgb24gZmFpbC5cbmZ1bmN0aW9uIHNraXBPcmRlcmVkTGlzdE1hcmtlciAoc3RhdGUsIHN0YXJ0TGluZSkge1xuICBjb25zdCBzdGFydCA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgbGV0IHBvcyA9IHN0YXJ0XG5cbiAgLy8gTGlzdCBtYXJrZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMiBjaGFycyAoZGlnaXQgKyBkb3QpXG4gIGlmIChwb3MgKyAxID49IG1heCkgeyByZXR1cm4gLTEgfVxuXG4gIGxldCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuXG4gIGlmIChjaCA8IDB4MzAvKiAwICovIHx8IGNoID4gMHgzOS8qIDkgKi8pIHsgcmV0dXJuIC0xIH1cblxuICBmb3IgKDs7KSB7XG4gICAgLy8gRU9MIC0+IGZhaWxcbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gLTEgfVxuXG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcblxuICAgIGlmIChjaCA+PSAweDMwLyogMCAqLyAmJiBjaCA8PSAweDM5LyogOSAqLykge1xuICAgICAgLy8gTGlzdCBtYXJrZXIgc2hvdWxkIGhhdmUgbm8gbW9yZSB0aGFuIDkgZGlnaXRzXG4gICAgICAvLyAocHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyBpbiBicm93c2VycylcbiAgICAgIGlmIChwb3MgLSBzdGFydCA+PSAxMCkgeyByZXR1cm4gLTEgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGZvdW5kIHZhbGlkIG1hcmtlclxuICAgIGlmIChjaCA9PT0gMHgyOS8qICkgKi8gfHwgY2ggPT09IDB4MmUvKiAuICovKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgaWYgKHBvcyA8IG1heCkge1xuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKCFpc1NwYWNlKGNoKSkge1xuICAgICAgLy8gXCIgMS50ZXN0IFwiIC0gaXMgbm90IGEgbGlzdCBpdGVtXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG5mdW5jdGlvbiBtYXJrVGlnaHRQYXJhZ3JhcGhzIChzdGF0ZSwgaWR4KSB7XG4gIGNvbnN0IGxldmVsID0gc3RhdGUubGV2ZWwgKyAyXG5cbiAgZm9yIChsZXQgaSA9IGlkeCArIDIsIGwgPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykge1xuICAgIGlmIChzdGF0ZS50b2tlbnNbaV0ubGV2ZWwgPT09IGxldmVsICYmIHN0YXRlLnRva2Vuc1tpXS50eXBlID09PSAncGFyYWdyYXBoX29wZW4nKSB7XG4gICAgICBzdGF0ZS50b2tlbnNbaSArIDJdLmhpZGRlbiA9IHRydWVcbiAgICAgIHN0YXRlLnRva2Vuc1tpXS5oaWRkZW4gPSB0cnVlXG4gICAgICBpICs9IDJcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdCAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBtYXgsIHBvcywgc3RhcnQsIHRva2VuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZVxuICBsZXQgdGlnaHQgPSB0cnVlXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZTpcbiAgLy8gIC0gaXRlbSAxXG4gIC8vICAgLSBpdGVtIDJcbiAgLy8gICAgLSBpdGVtIDNcbiAgLy8gICAgIC0gaXRlbSA0XG4gIC8vICAgICAgLSB0aGlzIG9uZSBpcyBhIHBhcmFncmFwaCBjb250aW51YXRpb25cbiAgaWYgKHN0YXRlLmxpc3RJbmRlbnQgPj0gMCAmJlxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmxpc3RJbmRlbnQgPj0gNCAmJlxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGlzVGVybWluYXRpbmdQYXJhZ3JhcGggPSBmYWxzZVxuXG4gIC8vIGxpbWl0IGNvbmRpdGlvbnMgd2hlbiBsaXN0IGNhbiBpbnRlcnJ1cHRcbiAgLy8gYSBwYXJhZ3JhcGggKHZhbGlkYXRpb24gbW9kZSBvbmx5KVxuICBpZiAoc2lsZW50ICYmIHN0YXRlLnBhcmVudFR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgLy8gTmV4dCBsaXN0IGl0ZW0gc2hvdWxkIHN0aWxsIHRlcm1pbmF0ZSBwcmV2aW91cyBsaXN0IGl0ZW07XG4gICAgLy9cbiAgICAvLyBUaGlzIGNvZGUgY2FuIGZhaWwgaWYgcGx1Z2lucyB1c2UgYmxrSW5kZW50IGFzIHdlbGwgYXMgbGlzdHMsXG4gICAgLy8gYnV0IEkgaG9wZSB0aGUgc3BlYyBnZXRzIGZpeGVkIGxvbmcgYmVmb3JlIHRoYXQgaGFwcGVucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdID49IHN0YXRlLmJsa0luZGVudCkge1xuICAgICAgaXNUZXJtaW5hdGluZ1BhcmFncmFwaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvLyBEZXRlY3QgbGlzdCB0eXBlIGFuZCBwb3NpdGlvbiBhZnRlciBtYXJrZXJcbiAgbGV0IGlzT3JkZXJlZFxuICBsZXQgbWFya2VyVmFsdWVcbiAgbGV0IHBvc0FmdGVyTWFya2VyXG4gIGlmICgocG9zQWZ0ZXJNYXJrZXIgPSBza2lwT3JkZXJlZExpc3RNYXJrZXIoc3RhdGUsIG5leHRMaW5lKSkgPj0gMCkge1xuICAgIGlzT3JkZXJlZCA9IHRydWVcbiAgICBzdGFydCA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWFya2VyVmFsdWUgPSBOdW1iZXIoc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3NBZnRlck1hcmtlciAtIDEpKVxuXG4gICAgLy8gSWYgd2UncmUgc3RhcnRpbmcgYSBuZXcgb3JkZXJlZCBsaXN0IHJpZ2h0IGFmdGVyXG4gICAgLy8gYSBwYXJhZ3JhcGgsIGl0IHNob3VsZCBzdGFydCB3aXRoIDEuXG4gICAgaWYgKGlzVGVybWluYXRpbmdQYXJhZ3JhcGggJiYgbWFya2VyVmFsdWUgIT09IDEpIHJldHVybiBmYWxzZVxuICB9IGVsc2UgaWYgKChwb3NBZnRlck1hcmtlciA9IHNraXBCdWxsZXRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSkpID49IDApIHtcbiAgICBpc09yZGVyZWQgPSBmYWxzZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gSWYgd2UncmUgc3RhcnRpbmcgYSBuZXcgdW5vcmRlcmVkIGxpc3QgcmlnaHQgYWZ0ZXJcbiAgLy8gYSBwYXJhZ3JhcGgsIGZpcnN0IGxpbmUgc2hvdWxkIG5vdCBiZSBlbXB0eS5cbiAgaWYgKGlzVGVybWluYXRpbmdQYXJhZ3JhcGgpIHtcbiAgICBpZiAoc3RhdGUuc2tpcFNwYWNlcyhwb3NBZnRlck1hcmtlcikgPj0gc3RhdGUuZU1hcmtzW25leHRMaW5lXSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGb3IgdmFsaWRhdGlvbiBtb2RlIHdlIGNhbiB0ZXJtaW5hdGUgaW1tZWRpYXRlbHlcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gV2Ugc2hvdWxkIHRlcm1pbmF0ZSBsaXN0IG9uIHN0eWxlIGNoYW5nZS4gUmVtZW1iZXIgZmlyc3Qgb25lIHRvIGNvbXBhcmUuXG4gIGNvbnN0IG1hcmtlckNoYXJDb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zQWZ0ZXJNYXJrZXIgLSAxKVxuXG4gIC8vIFN0YXJ0IGxpc3RcbiAgY29uc3QgbGlzdFRva0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGhcblxuICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgdG9rZW4gICAgICAgPSBzdGF0ZS5wdXNoKCdvcmRlcmVkX2xpc3Rfb3BlbicsICdvbCcsIDEpXG4gICAgaWYgKG1hcmtlclZhbHVlICE9PSAxKSB7XG4gICAgICB0b2tlbi5hdHRycyA9IFtbJ3N0YXJ0JywgbWFya2VyVmFsdWVdXVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b2tlbiAgICAgICA9IHN0YXRlLnB1c2goJ2J1bGxldF9saXN0X29wZW4nLCAndWwnLCAxKVxuICB9XG5cbiAgY29uc3QgbGlzdExpbmVzID0gW25leHRMaW5lLCAwXVxuICB0b2tlbi5tYXAgICAgPSBsaXN0TGluZXNcbiAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcblxuICAvL1xuICAvLyBJdGVyYXRlIGxpc3QgaXRlbXNcbiAgLy9cblxuICBsZXQgcHJldkVtcHR5RW5kID0gZmFsc2VcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2xpc3QnKVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAnbGlzdCdcblxuICB3aGlsZSAobmV4dExpbmUgPCBlbmRMaW5lKSB7XG4gICAgcG9zID0gcG9zQWZ0ZXJNYXJrZXJcbiAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG5cbiAgICBjb25zdCBpbml0aWFsID0gc3RhdGUuc0NvdW50W25leHRMaW5lXSArIHBvc0FmdGVyTWFya2VyIC0gKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgIGxldCBvZmZzZXQgPSBpbml0aWFsXG5cbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgICAgaWYgKGNoID09PSAweDA5KSB7XG4gICAgICAgIG9mZnNldCArPSA0IC0gKG9mZnNldCArIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKSAlIDRcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjApIHtcbiAgICAgICAgb2Zmc2V0KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFN0YXJ0ID0gcG9zXG4gICAgbGV0IGluZGVudEFmdGVyTWFya2VyXG5cbiAgICBpZiAoY29udGVudFN0YXJ0ID49IG1heCkge1xuICAgICAgLy8gdHJpbW1pbmcgc3BhY2UgaW4gXCItICAgIFxcbiAgM1wiIGNhc2UsIGluZGVudCBpcyAxIGhlcmVcbiAgICAgIGluZGVudEFmdGVyTWFya2VyID0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRlbnRBZnRlck1hcmtlciA9IG9mZnNldCAtIGluaXRpYWxcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgdGhhbiA0IHNwYWNlcywgdGhlIGluZGVudCBpcyAxXG4gICAgLy8gKHRoZSByZXN0IGlzIGp1c3QgaW5kZW50ZWQgY29kZSBibG9jaylcbiAgICBpZiAoaW5kZW50QWZ0ZXJNYXJrZXIgPiA0KSB7IGluZGVudEFmdGVyTWFya2VyID0gMSB9XG5cbiAgICAvLyBcIiAgLSAgdGVzdFwiXG4gICAgLy8gIF5eXl5eIC0gY2FsY3VsYXRpbmcgdG90YWwgbGVuZ3RoIG9mIHRoaXMgdGhpbmdcbiAgICBjb25zdCBpbmRlbnQgPSBpbml0aWFsICsgaW5kZW50QWZ0ZXJNYXJrZXJcblxuICAgIC8vIFJ1biBzdWJwYXJzZXIgJiB3cml0ZSB0b2tlbnNcbiAgICB0b2tlbiAgICAgICAgPSBzdGF0ZS5wdXNoKCdsaXN0X2l0ZW1fb3BlbicsICdsaScsIDEpXG4gICAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcbiAgICBjb25zdCBpdGVtTGluZXMgPSBbbmV4dExpbmUsIDBdXG4gICAgdG9rZW4ubWFwICAgID0gaXRlbUxpbmVzXG4gICAgaWYgKGlzT3JkZXJlZCkge1xuICAgICAgdG9rZW4uaW5mbyA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zQWZ0ZXJNYXJrZXIgLSAxKVxuICAgIH1cblxuICAgIC8vIGNoYW5nZSBjdXJyZW50IHN0YXRlLCB0aGVuIHJlc3RvcmUgaXQgYWZ0ZXIgcGFyc2VyIHN1YmNhbGxcbiAgICBjb25zdCBvbGRUaWdodCA9IHN0YXRlLnRpZ2h0XG4gICAgY29uc3Qgb2xkVFNoaWZ0ID0gc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIGNvbnN0IG9sZFNDb3VudCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV1cblxuICAgIC8vICAtIGV4YW1wbGUgbGlzdFxuICAgIC8vIF4gbGlzdEluZGVudCBwb3NpdGlvbiB3aWxsIGJlIGhlcmVcbiAgICAvLyAgIF4gYmxrSW5kZW50IHBvc2l0aW9uIHdpbGwgYmUgaGVyZVxuICAgIC8vXG4gICAgY29uc3Qgb2xkTGlzdEluZGVudCA9IHN0YXRlLmxpc3RJbmRlbnRcbiAgICBzdGF0ZS5saXN0SW5kZW50ID0gc3RhdGUuYmxrSW5kZW50XG4gICAgc3RhdGUuYmxrSW5kZW50ID0gaW5kZW50XG5cbiAgICBzdGF0ZS50aWdodCA9IHRydWVcbiAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gY29udGVudFN0YXJ0IC0gc3RhdGUuYk1hcmtzW25leHRMaW5lXVxuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvZmZzZXRcblxuICAgIGlmIChjb250ZW50U3RhcnQgPj0gbWF4ICYmIHN0YXRlLmlzRW1wdHkobmV4dExpbmUgKyAxKSkge1xuICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgdGhpcyBjYXNlXG4gICAgICAvLyAobGlzdCBpdGVtIGlzIGVtcHR5LCBsaXN0IHRlcm1pbmF0ZXMgYmVmb3JlIFwiZm9vXCIpOlxuICAgICAgLy8gfn5+fn5+fn5cbiAgICAgIC8vICAgLVxuICAgICAgLy9cbiAgICAgIC8vICAgICBmb29cbiAgICAgIC8vIH5+fn5+fn5+XG4gICAgICBzdGF0ZS5saW5lID0gTWF0aC5taW4oc3RhdGUubGluZSArIDIsIGVuZExpbmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLm1kLmJsb2NrLnRva2VuaXplKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgb2YgbGlzdCBpdGVtIGlzIHRpZ2h0LCBtYXJrIGxpc3QgYXMgdGlnaHRcbiAgICBpZiAoIXN0YXRlLnRpZ2h0IHx8IHByZXZFbXB0eUVuZCkge1xuICAgICAgdGlnaHQgPSBmYWxzZVxuICAgIH1cbiAgICAvLyBJdGVtIGJlY29tZSBsb29zZSBpZiBmaW5pc2ggd2l0aCBlbXB0eSBsaW5lLFxuICAgIC8vIGJ1dCB3ZSBzaG91bGQgZmlsdGVyIGxhc3QgZWxlbWVudCwgYmVjYXVzZSBpdCBtZWFucyBsaXN0IGZpbmlzaFxuICAgIHByZXZFbXB0eUVuZCA9IChzdGF0ZS5saW5lIC0gbmV4dExpbmUpID4gMSAmJiBzdGF0ZS5pc0VtcHR5KHN0YXRlLmxpbmUgLSAxKVxuXG4gICAgc3RhdGUuYmxrSW5kZW50ID0gc3RhdGUubGlzdEluZGVudFxuICAgIHN0YXRlLmxpc3RJbmRlbnQgPSBvbGRMaXN0SW5kZW50XG4gICAgc3RhdGUudFNoaWZ0W25leHRMaW5lXSA9IG9sZFRTaGlmdFxuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvbGRTQ291bnRcbiAgICBzdGF0ZS50aWdodCA9IG9sZFRpZ2h0XG5cbiAgICB0b2tlbiAgICAgICAgPSBzdGF0ZS5wdXNoKCdsaXN0X2l0ZW1fY2xvc2UnLCAnbGknLCAtMSlcbiAgICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuXG4gICAgbmV4dExpbmUgPSBzdGF0ZS5saW5lXG4gICAgaXRlbUxpbmVzWzFdID0gbmV4dExpbmVcblxuICAgIGlmIChuZXh0TGluZSA+PSBlbmRMaW5lKSB7IGJyZWFrIH1cblxuICAgIC8vXG4gICAgLy8gVHJ5IHRvIGNoZWNrIGlmIGxpc3QgaXMgdGVybWluYXRlZCBvciBjb250aW51ZWQuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgYnJlYWsgfVxuXG4gICAgLy8gZmFpbCBpZiB0ZXJtaW5hdGluZyBibG9jayBmb3VuZFxuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG5cbiAgICAvLyBmYWlsIGlmIGxpc3QgaGFzIGFub3RoZXIgdHlwZVxuICAgIGlmIChpc09yZGVyZWQpIHtcbiAgICAgIHBvc0FmdGVyTWFya2VyID0gc2tpcE9yZGVyZWRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSlcbiAgICAgIGlmIChwb3NBZnRlck1hcmtlciA8IDApIHsgYnJlYWsgfVxuICAgICAgc3RhcnQgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NBZnRlck1hcmtlciA9IHNraXBCdWxsZXRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSlcbiAgICAgIGlmIChwb3NBZnRlck1hcmtlciA8IDApIHsgYnJlYWsgfVxuICAgIH1cblxuICAgIGlmIChtYXJrZXJDaGFyQ29kZSAhPT0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zQWZ0ZXJNYXJrZXIgLSAxKSkgeyBicmVhayB9XG4gIH1cblxuICAvLyBGaW5hbGl6ZSBsaXN0XG4gIGlmIChpc09yZGVyZWQpIHtcbiAgICB0b2tlbiA9IHN0YXRlLnB1c2goJ29yZGVyZWRfbGlzdF9jbG9zZScsICdvbCcsIC0xKVxuICB9IGVsc2Uge1xuICAgIHRva2VuID0gc3RhdGUucHVzaCgnYnVsbGV0X2xpc3RfY2xvc2UnLCAndWwnLCAtMSlcbiAgfVxuICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuXG4gIGxpc3RMaW5lc1sxXSA9IG5leHRMaW5lXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG5cbiAgLy8gbWFyayBwYXJhZ3JhcGhzIHRpZ2h0IGlmIG5lZWRlZFxuICBpZiAodGlnaHQpIHtcbiAgICBtYXJrVGlnaHRQYXJhZ3JhcGhzKHN0YXRlLCBsaXN0VG9rSWR4KVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIExpc3Qgb2YgdmFsaWQgaHRtbCBibG9ja3MgbmFtZXMsIGFjY29yZGluZyB0byBjb21tb25tYXJrIHNwZWNcbi8vIGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjMwLyNodG1sLWJsb2Nrc1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYmFzZScsXG4gICdiYXNlZm9udCcsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnY2FwdGlvbicsXG4gICdjZW50ZXInLFxuICAnY29sJyxcbiAgJ2NvbGdyb3VwJyxcbiAgJ2RkJyxcbiAgJ2RldGFpbHMnLFxuICAnZGlhbG9nJyxcbiAgJ2RpcicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZmllbGRzZXQnLFxuICAnZmlnY2FwdGlvbicsXG4gICdmaWd1cmUnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnZnJhbWUnLFxuICAnZnJhbWVzZXQnLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZCcsXG4gICdoZWFkZXInLFxuICAnaHInLFxuICAnaHRtbCcsXG4gICdpZnJhbWUnLFxuICAnbGVnZW5kJyxcbiAgJ2xpJyxcbiAgJ2xpbmsnLFxuICAnbWFpbicsXG4gICdtZW51JyxcbiAgJ21lbnVpdGVtJyxcbiAgJ25hdicsXG4gICdub2ZyYW1lcycsXG4gICdvbCcsXG4gICdvcHRncm91cCcsXG4gICdvcHRpb24nLFxuICAncCcsXG4gICdwYXJhbScsXG4gICdzZWFyY2gnLFxuICAnc2VjdGlvbicsXG4gICdzdW1tYXJ5JyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpdGxlJyxcbiAgJ3RyJyxcbiAgJ3RyYWNrJyxcbiAgJ3VsJ1xuXVxuIiwiLy8gUmVnZXhwcyB0byBtYXRjaCBodG1sIGVsZW1lbnRzXG5cbmNvbnN0IGF0dHJfbmFtZSAgICAgPSAnW2EtekEtWl86XVthLXpBLVowLTk6Ll8tXSonXG5cbmNvbnN0IHVucXVvdGVkICAgICAgPSAnW15cIlxcJz08PmBcXFxceDAwLVxcXFx4MjBdKydcbmNvbnN0IHNpbmdsZV9xdW90ZWQgPSBcIidbXiddKidcIlxuY29uc3QgZG91YmxlX3F1b3RlZCA9ICdcIlteXCJdKlwiJ1xuXG5jb25zdCBhdHRyX3ZhbHVlICA9ICcoPzonICsgdW5xdW90ZWQgKyAnfCcgKyBzaW5nbGVfcXVvdGVkICsgJ3wnICsgZG91YmxlX3F1b3RlZCArICcpJ1xuXG5jb25zdCBhdHRyaWJ1dGUgICA9ICcoPzpcXFxccysnICsgYXR0cl9uYW1lICsgJyg/OlxcXFxzKj1cXFxccyonICsgYXR0cl92YWx1ZSArICcpPyknXG5cbmNvbnN0IG9wZW5fdGFnICAgID0gJzxbQS1aYS16XVtBLVphLXowLTlcXFxcLV0qJyArIGF0dHJpYnV0ZSArICcqXFxcXHMqXFxcXC8/PidcblxuY29uc3QgY2xvc2VfdGFnICAgPSAnPFxcXFwvW0EtWmEtel1bQS1aYS16MC05XFxcXC1dKlxcXFxzKj4nXG5jb25zdCBjb21tZW50ICAgICA9ICc8IS0tLT8+fDwhLS0oPzpbXi1dfC1bXi1dfC0tW14+XSkqLS0+J1xuY29uc3QgcHJvY2Vzc2luZyAgPSAnPFs/XVtcXFxcc1xcXFxTXSo/Wz9dPidcbmNvbnN0IGRlY2xhcmF0aW9uID0gJzwhW0EtWmEtel1bXj5dKj4nXG5jb25zdCBjZGF0YSAgICAgICA9ICc8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nXG5cbmNvbnN0IEhUTUxfVEFHX1JFID0gbmV3IFJlZ0V4cCgnXig/OicgKyBvcGVuX3RhZyArICd8JyArIGNsb3NlX3RhZyArICd8JyArIGNvbW1lbnQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgcHJvY2Vzc2luZyArICd8JyArIGRlY2xhcmF0aW9uICsgJ3wnICsgY2RhdGEgKyAnKScpXG5jb25zdCBIVE1MX09QRU5fQ0xPU0VfVEFHX1JFID0gbmV3IFJlZ0V4cCgnXig/OicgKyBvcGVuX3RhZyArICd8JyArIGNsb3NlX3RhZyArICcpJylcblxuZXhwb3J0IHsgSFRNTF9UQUdfUkUsIEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUgfVxuIiwiLy8gSFRNTCBibG9ja1xuXG5pbXBvcnQgYmxvY2tfbmFtZXMgZnJvbSAnLi4vY29tbW9uL2h0bWxfYmxvY2tzLm1qcydcbmltcG9ydCB7IEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUgfSBmcm9tICcuLi9jb21tb24vaHRtbF9yZS5tanMnXG5cbi8vIEFuIGFycmF5IG9mIG9wZW5pbmcgYW5kIGNvcnJlc3BvbmRpbmcgY2xvc2luZyBzZXF1ZW5jZXMgZm9yIGh0bWwgdGFncyxcbi8vIGxhc3QgYXJndW1lbnQgZGVmaW5lcyB3aGV0aGVyIGl0IGNhbiB0ZXJtaW5hdGUgYSBwYXJhZ3JhcGggb3Igbm90XG4vL1xuY29uc3QgSFRNTF9TRVFVRU5DRVMgPSBbXG4gIFsvXjwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSkoPz0oXFxzfD58JCkpL2ksIC88XFwvKHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpPi9pLCB0cnVlXSxcbiAgWy9ePCEtLS8sICAgICAgICAvLS0+LywgICB0cnVlXSxcbiAgWy9ePFxcPy8sICAgICAgICAgL1xcPz4vLCAgIHRydWVdLFxuICBbL148IVtBLVpdLywgICAgIC8+LywgICAgIHRydWVdLFxuICBbL148IVxcW0NEQVRBXFxbLywgL1xcXVxcXT4vLCB0cnVlXSxcbiAgW25ldyBSZWdFeHAoJ148Lz8oJyArIGJsb2NrX25hbWVzLmpvaW4oJ3wnKSArICcpKD89KFxcXFxzfC8/PnwkKSknLCAnaScpLCAvXiQvLCB0cnVlXSxcbiAgW25ldyBSZWdFeHAoSFRNTF9PUEVOX0NMT1NFX1RBR19SRS5zb3VyY2UgKyAnXFxcXHMqJCcpLCAgL14kLywgZmFsc2VdXG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh0bWxfYmxvY2sgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5odG1sKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0MvKiA8ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IGxpbmVUZXh0ID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gIGxldCBpID0gMFxuICBmb3IgKDsgaSA8IEhUTUxfU0VRVUVOQ0VTLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKEhUTUxfU0VRVUVOQ0VTW2ldWzBdLnRlc3QobGluZVRleHQpKSB7IGJyZWFrIH1cbiAgfVxuICBpZiAoaSA9PT0gSFRNTF9TRVFVRU5DRVMubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIC8vIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgYSB0ZXJtaW5hdG9yLCBmYWxzZSBvdGhlcndpc2VcbiAgICByZXR1cm4gSFRNTF9TRVFVRU5DRVNbaV1bMl1cbiAgfVxuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICAvLyBJZiB3ZSBhcmUgaGVyZSAtIHdlIGRldGVjdGVkIEhUTUwgYmxvY2suXG4gIC8vIExldCdzIHJvbGwgZG93biB0aWxsIGJsb2NrIGVuZC5cbiAgaWYgKCFIVE1MX1NFUVVFTkNFU1tpXVsxXS50ZXN0KGxpbmVUZXh0KSkge1xuICAgIGZvciAoOyBuZXh0TGluZSA8IGVuZExpbmU7IG5leHRMaW5lKyspIHtcbiAgICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrIH1cblxuICAgICAgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cbiAgICAgIGxpbmVUZXh0ID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gICAgICBpZiAoSFRNTF9TRVFVRU5DRVNbaV1bMV0udGVzdChsaW5lVGV4dCkpIHtcbiAgICAgICAgaWYgKGxpbmVUZXh0Lmxlbmd0aCAhPT0gMCkgeyBuZXh0TGluZSsrIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcblxuICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgnaHRtbF9ibG9jaycsICcnLCAwKVxuICB0b2tlbi5tYXAgICAgID0gW3N0YXJ0TGluZSwgbmV4dExpbmVdXG4gIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCBzdGF0ZS5ibGtJbmRlbnQsIHRydWUpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8qKiBpbnRlcm5hbFxuICogY2xhc3MgUGFyc2VyQmxvY2tcbiAqXG4gKiBCbG9jay1sZXZlbCB0b2tlbml6ZXIuXG4gKiovXG5cbmltcG9ydCBSdWxlciBmcm9tICcuL3J1bGVyLm1qcydcbmltcG9ydCBTdGF0ZUJsb2NrIGZyb20gJy4vcnVsZXNfYmxvY2svc3RhdGVfYmxvY2subWpzJ1xuXG5pbXBvcnQgcl90YWJsZSBmcm9tICcuL3J1bGVzX2Jsb2NrL3RhYmxlLm1qcydcbmltcG9ydCByX2NvZGUgZnJvbSAnLi9ydWxlc19ibG9jay9jb2RlLm1qcydcbmltcG9ydCByX2ZlbmNlIGZyb20gJy4vcnVsZXNfYmxvY2svZmVuY2UubWpzJ1xuaW1wb3J0IHJfYmxvY2txdW90ZSBmcm9tICcuL3J1bGVzX2Jsb2NrL2Jsb2NrcXVvdGUubWpzJ1xuaW1wb3J0IHJfaHIgZnJvbSAnLi9ydWxlc19ibG9jay9oci5tanMnXG5pbXBvcnQgcl9saXN0IGZyb20gJy4vcnVsZXNfYmxvY2svbGlzdC5tanMnXG5pbXBvcnQgcl9yZWZlcmVuY2UgZnJvbSAnLi9ydWxlc19ibG9jay9yZWZlcmVuY2UubWpzJ1xuaW1wb3J0IHJfaHRtbF9ibG9jayBmcm9tICcuL3J1bGVzX2Jsb2NrL2h0bWxfYmxvY2subWpzJ1xuaW1wb3J0IHJfaGVhZGluZyBmcm9tICcuL3J1bGVzX2Jsb2NrL2hlYWRpbmcubWpzJ1xuaW1wb3J0IHJfbGhlYWRpbmcgZnJvbSAnLi9ydWxlc19ibG9jay9saGVhZGluZy5tanMnXG5pbXBvcnQgcl9wYXJhZ3JhcGggZnJvbSAnLi9ydWxlc19ibG9jay9wYXJhZ3JhcGgubWpzJ1xuXG5jb25zdCBfcnVsZXMgPSBbXG4gIC8vIEZpcnN0IDIgcGFyYW1zIC0gcnVsZSBuYW1lICYgc291cmNlLiBTZWNvbmRhcnkgYXJyYXkgLSBsaXN0IG9mIHJ1bGVzLFxuICAvLyB3aGljaCBjYW4gYmUgdGVybWluYXRlZCBieSB0aGlzIG9uZS5cbiAgWyd0YWJsZScsICAgICAgcl90YWJsZSwgICAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnXV0sXG4gIFsnY29kZScsICAgICAgIHJfY29kZV0sXG4gIFsnZmVuY2UnLCAgICAgIHJfZmVuY2UsICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCddXSxcbiAgWydibG9ja3F1b3RlJywgcl9ibG9ja3F1b3RlLCBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZScsICdsaXN0J11dLFxuICBbJ2hyJywgICAgICAgICByX2hyLCAgICAgICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJywgJ2xpc3QnXV0sXG4gIFsnbGlzdCcsICAgICAgIHJfbGlzdCwgICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnXV0sXG4gIFsncmVmZXJlbmNlJywgIHJfcmVmZXJlbmNlXSxcbiAgWydodG1sX2Jsb2NrJywgcl9odG1sX2Jsb2NrLCBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZSddXSxcbiAgWydoZWFkaW5nJywgICAgcl9oZWFkaW5nLCAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZSddXSxcbiAgWydsaGVhZGluZycsICAgcl9saGVhZGluZ10sXG4gIFsncGFyYWdyYXBoJywgIHJfcGFyYWdyYXBoXVxuXVxuXG4vKipcbiAqIG5ldyBQYXJzZXJCbG9jaygpXG4gKiovXG5mdW5jdGlvbiBQYXJzZXJCbG9jayAoKSB7XG4gIC8qKlxuICAgKiBQYXJzZXJCbG9jayNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBibG9jayBydWxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVyID0gbmV3IFJ1bGVyKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IF9ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIucHVzaChfcnVsZXNbaV1bMF0sIF9ydWxlc1tpXVsxXSwgeyBhbHQ6IChfcnVsZXNbaV1bMl0gfHwgW10pLnNsaWNlKCkgfSlcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSB0b2tlbnMgZm9yIGlucHV0IHJhbmdlXG4vL1xuUGFyc2VyQmxvY2sucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUpIHtcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcbiAgY29uc3QgbWF4TmVzdGluZyA9IHN0YXRlLm1kLm9wdGlvbnMubWF4TmVzdGluZ1xuICBsZXQgbGluZSA9IHN0YXJ0TGluZVxuICBsZXQgaGFzRW1wdHlMaW5lcyA9IGZhbHNlXG5cbiAgd2hpbGUgKGxpbmUgPCBlbmRMaW5lKSB7XG4gICAgc3RhdGUubGluZSA9IGxpbmUgPSBzdGF0ZS5za2lwRW1wdHlMaW5lcyhsaW5lKVxuICAgIGlmIChsaW5lID49IGVuZExpbmUpIHsgYnJlYWsgfVxuXG4gICAgLy8gVGVybWluYXRpb24gY29uZGl0aW9uIGZvciBuZXN0ZWQgY2FsbHMuXG4gICAgLy8gTmVzdGVkIGNhbGxzIGN1cnJlbnRseSB1c2VkIGZvciBibG9ja3F1b3RlcyAmIGxpc3RzXG4gICAgaWYgKHN0YXRlLnNDb3VudFtsaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAvLyBJZiBuZXN0aW5nIGxldmVsIGV4Y2VlZGVkIC0gc2tpcCB0YWlsIHRvIHRoZSBlbmQuIFRoYXQncyBub3Qgb3JkaW5hcnlcbiAgICAvLyBzaXR1YXRpb24gYW5kIHdlIHNob3VsZCBub3QgY2FyZSBhYm91dCBjb250ZW50LlxuICAgIGlmIChzdGF0ZS5sZXZlbCA+PSBtYXhOZXN0aW5nKSB7XG4gICAgICBzdGF0ZS5saW5lID0gZW5kTGluZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICAvLyBUcnkgYWxsIHBvc3NpYmxlIHJ1bGVzLlxuICAgIC8vIE9uIHN1Y2Nlc3MsIHJ1bGUgc2hvdWxkOlxuICAgIC8vXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLmxpbmVgXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLnRva2Vuc2BcbiAgICAvLyAtIHJldHVybiB0cnVlXG4gICAgY29uc3QgcHJldkxpbmUgPSBzdGF0ZS5saW5lXG4gICAgbGV0IG9rID0gZmFsc2VcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG9rID0gcnVsZXNbaV0oc3RhdGUsIGxpbmUsIGVuZExpbmUsIGZhbHNlKVxuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIGlmIChwcmV2TGluZSA+PSBzdGF0ZS5saW5lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgcnVsZSBkaWRuJ3QgaW5jcmVtZW50IHN0YXRlLmxpbmVcIilcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHVzZXIgZGlzYWJsZXMgcGFyYWdyYXBoIHJ1bGVcbiAgICBpZiAoIW9rKSB0aHJvdyBuZXcgRXJyb3IoJ25vbmUgb2YgdGhlIGJsb2NrIHJ1bGVzIG1hdGNoZWQnKVxuXG4gICAgLy8gc2V0IHN0YXRlLnRpZ2h0IGlmIHdlIGhhZCBhbiBlbXB0eSBsaW5lIGJlZm9yZSBjdXJyZW50IHRhZ1xuICAgIC8vIGkuZS4gbGF0ZXN0IGVtcHR5IGxpbmUgc2hvdWxkIG5vdCBjb3VudFxuICAgIHN0YXRlLnRpZ2h0ID0gIWhhc0VtcHR5TGluZXNcblxuICAgIC8vIHBhcmFncmFwaCBtaWdodCBcImVhdFwiIG9uZSBuZXdsaW5lIGFmdGVyIGl0IGluIG5lc3RlZCBsaXN0c1xuICAgIGlmIChzdGF0ZS5pc0VtcHR5KHN0YXRlLmxpbmUgLSAxKSkge1xuICAgICAgaGFzRW1wdHlMaW5lcyA9IHRydWVcbiAgICB9XG5cbiAgICBsaW5lID0gc3RhdGUubGluZVxuXG4gICAgaWYgKGxpbmUgPCBlbmRMaW5lICYmIHN0YXRlLmlzRW1wdHkobGluZSkpIHtcbiAgICAgIGhhc0VtcHR5TGluZXMgPSB0cnVlXG4gICAgICBsaW5lKytcbiAgICAgIHN0YXRlLmxpbmUgPSBsaW5lXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VyQmxvY2sucGFyc2Uoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG4gKlxuICogUHJvY2VzcyBpbnB1dCBzdHJpbmcgYW5kIHB1c2ggYmxvY2sgdG9rZW5zIGludG8gYG91dFRva2Vuc2BcbiAqKi9cblBhcnNlckJsb2NrLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzcmMsIG1kLCBlbnYsIG91dFRva2Vucykge1xuICBpZiAoIXNyYykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuU3RhdGUoc3JjLCBtZCwgZW52LCBvdXRUb2tlbnMpXG5cbiAgdGhpcy50b2tlbml6ZShzdGF0ZSwgc3RhdGUubGluZSwgc3RhdGUubGluZU1heClcbn1cblxuUGFyc2VyQmxvY2sucHJvdG90eXBlLlN0YXRlID0gU3RhdGVCbG9ja1xuXG5leHBvcnQgZGVmYXVsdCBQYXJzZXJCbG9ja1xuIiwiLy8gQ29kZSBibG9jayAoNCBzcGFjZXMgcGFkZGVkKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2RlIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLyosIHNpbGVudCAqLykge1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPCA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuICBsZXQgbGFzdCA9IG5leHRMaW5lXG5cbiAgd2hpbGUgKG5leHRMaW5lIDwgZW5kTGluZSkge1xuICAgIGlmIChzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgICAgbmV4dExpbmUrK1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7XG4gICAgICBuZXh0TGluZSsrXG4gICAgICBsYXN0ID0gbmV4dExpbmVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGJyZWFrXG4gIH1cblxuICBzdGF0ZS5saW5lID0gbGFzdFxuXG4gIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCdjb2RlX2Jsb2NrJywgJ2NvZGUnLCAwKVxuICB0b2tlbi5jb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBsYXN0LCA0ICsgc3RhdGUuYmxrSW5kZW50LCBmYWxzZSkgKyAnXFxuJ1xuICB0b2tlbi5tYXAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gZmVuY2VzIChgYGAgbGFuZywgfn5+IGxhbmcpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZlbmNlIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAocG9zICsgMyA+IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAobWFya2VyICE9PSAweDdFLyogfiAqLyAmJiBtYXJrZXIgIT09IDB4NjAgLyogYCAqLykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gc2NhbiBtYXJrZXIgbGVuZ3RoXG4gIGxldCBtZW0gPSBwb3NcbiAgcG9zID0gc3RhdGUuc2tpcENoYXJzKHBvcywgbWFya2VyKVxuXG4gIGxldCBsZW4gPSBwb3MgLSBtZW1cblxuICBpZiAobGVuIDwgMykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG1hcmt1cCA9IHN0YXRlLnNyYy5zbGljZShtZW0sIHBvcylcbiAgY29uc3QgcGFyYW1zID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gIGlmIChtYXJrZXIgPT09IDB4NjAgLyogYCAqLykge1xuICAgIGlmIChwYXJhbXMuaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcikpID49IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIFNpbmNlIHN0YXJ0IGlzIGZvdW5kLCB3ZSBjYW4gcmVwb3J0IHN1Y2Nlc3MgaGVyZSBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gc2VhcmNoIGVuZCBvZiBibG9ja1xuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmVcbiAgbGV0IGhhdmVFbmRNYXJrZXIgPSBmYWxzZVxuXG4gIGZvciAoOzspIHtcbiAgICBuZXh0TGluZSsrXG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHtcbiAgICAgIC8vIHVuY2xvc2VkIGJsb2NrIHNob3VsZCBiZSBhdXRvY2xvc2VkIGJ5IGVuZCBvZiBkb2N1bWVudC5cbiAgICAgIC8vIGFsc28gYmxvY2sgc2VlbXMgdG8gYmUgYXV0b2Nsb3NlZCBieSBlbmQgb2YgcGFyZW50XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHBvcyA9IG1lbSA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICAvLyBub24tZW1wdHkgbGluZSB3aXRoIG5lZ2F0aXZlIGluZGVudCBzaG91bGQgc3RvcCB0aGUgbGlzdDpcbiAgICAgIC8vIC0gYGBgXG4gICAgICAvLyAgdGVzdFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gbWFya2VyKSB7IGNvbnRpbnVlIH1cblxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHtcbiAgICAgIC8vIGNsb3NpbmcgZmVuY2Ugc2hvdWxkIGJlIGluZGVudGVkIGxlc3MgdGhhbiA0IHNwYWNlc1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpXG5cbiAgICAvLyBjbG9zaW5nIGNvZGUgZmVuY2UgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBvcGVuaW5nIG9uZVxuICAgIGlmIChwb3MgLSBtZW0gPCBsZW4pIHsgY29udGludWUgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRhaWwgaGFzIHNwYWNlcyBvbmx5XG4gICAgcG9zID0gc3RhdGUuc2tpcFNwYWNlcyhwb3MpXG5cbiAgICBpZiAocG9zIDwgbWF4KSB7IGNvbnRpbnVlIH1cblxuICAgIGhhdmVFbmRNYXJrZXIgPSB0cnVlXG4gICAgLy8gZm91bmQhXG4gICAgYnJlYWtcbiAgfVxuXG4gIC8vIElmIGEgZmVuY2UgaGFzIGhlYWRpbmcgc3BhY2VzLCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZyb20gaXRzIGlubmVyIGJsb2NrXG4gIGxlbiA9IHN0YXRlLnNDb3VudFtzdGFydExpbmVdXG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lICsgKGhhdmVFbmRNYXJrZXIgPyAxIDogMClcblxuICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgnZmVuY2UnLCAnY29kZScsIDApXG4gIHRva2VuLmluZm8gICAgPSBwYXJhbXNcbiAgdG9rZW4uY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSArIDEsIG5leHRMaW5lLCBsZW4sIHRydWUpXG4gIHRva2VuLm1hcmt1cCAgPSBtYXJrdXBcbiAgdG9rZW4ubWFwICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIEJsb2NrIHF1b3Rlc1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmxvY2txdW90ZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGxldCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuXG4gIGNvbnN0IG9sZExpbmVNYXggPSBzdGF0ZS5saW5lTWF4XG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBjaGVjayB0aGUgYmxvY2sgcXVvdGUgbWFya2VyXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNFLyogPiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIHdlIGtub3cgdGhhdCBpdCdzIGdvaW5nIHRvIGJlIGEgdmFsaWQgYmxvY2txdW90ZSxcbiAgLy8gc28gbm8gcG9pbnQgdHJ5aW5nIHRvIGZpbmQgdGhlIGVuZCBvZiBpdCBpbiBzaWxlbnQgbW9kZVxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBjb25zdCBvbGRCTWFya3MgID0gW11cbiAgY29uc3Qgb2xkQlNDb3VudCA9IFtdXG4gIGNvbnN0IG9sZFNDb3VudCAgPSBbXVxuICBjb25zdCBvbGRUU2hpZnQgID0gW11cblxuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygnYmxvY2txdW90ZScpXG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdibG9ja3F1b3RlJ1xuICBsZXQgbGFzdExpbmVFbXB0eSA9IGZhbHNlXG4gIGxldCBuZXh0TGluZVxuXG4gIC8vIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBibG9ja1xuICAvL1xuICAvLyBCbG9jayBlbmRzIHdpdGggZWl0aGVyOlxuICAvLyAgMS4gYW4gZW1wdHkgbGluZSBvdXRzaWRlOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+IHRlc3RcbiAgLy9cbiAgLy8gICAgIGBgYFxuICAvLyAgMi4gYW4gZW1wdHkgbGluZSBpbnNpZGU6XG4gIC8vICAgICBgYGBcbiAgLy8gICAgID5cbiAgLy8gICAgIHRlc3RcbiAgLy8gICAgIGBgYFxuICAvLyAgMy4gYW5vdGhlciB0YWc6XG4gIC8vICAgICBgYGBcbiAgLy8gICAgID4gdGVzdFxuICAvLyAgICAgIC0gLSAtXG4gIC8vICAgICBgYGBcbiAgZm9yIChuZXh0TGluZSA9IHN0YXJ0TGluZTsgbmV4dExpbmUgPCBlbmRMaW5lOyBuZXh0TGluZSsrKSB7XG4gICAgLy8gY2hlY2sgaWYgaXQncyBvdXRkZW50ZWQsIGkuZS4gaXQncyBpbnNpZGUgbGlzdCBpdGVtIGFuZCBpbmRlbnRlZFxuICAgIC8vIGxlc3MgdGhhbiBzYWlkIGxpc3QgaXRlbTpcbiAgICAvL1xuICAgIC8vIGBgYFxuICAgIC8vIDEuIGFueXRoaW5nXG4gICAgLy8gICAgPiBjdXJyZW50IGJsb2NrcXVvdGVcbiAgICAvLyAyLiBjaGVja2luZyB0aGlzIGxpbmVcbiAgICAvLyBgYGBcbiAgICBjb25zdCBpc091dGRlbnRlZCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnRcblxuICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgaWYgKHBvcyA+PSBtYXgpIHtcbiAgICAgIC8vIENhc2UgMTogbGluZSBpcyBub3QgaW5zaWRlIHRoZSBibG9ja3F1b3RlLCBhbmQgdGhpcyBsaW5lIGlzIGVtcHR5LlxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspID09PSAweDNFLyogPiAqLyAmJiAhaXNPdXRkZW50ZWQpIHtcbiAgICAgIC8vIFRoaXMgbGluZSBpcyBpbnNpZGUgdGhlIGJsb2NrcXVvdGUuXG5cbiAgICAgIC8vIHNldCBvZmZzZXQgcGFzdCBzcGFjZXMgYW5kIFwiPlwiXG4gICAgICBsZXQgaW5pdGlhbCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gKyAxXG4gICAgICBsZXQgc3BhY2VBZnRlck1hcmtlclxuICAgICAgbGV0IGFkanVzdFRhYlxuXG4gICAgICAvLyBza2lwIG9uZSBvcHRpb25hbCBzcGFjZSBhZnRlciAnPidcbiAgICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDIwIC8qIHNwYWNlICovKSB7XG4gICAgICAgIC8vICcgPiAgIHRlc3QgJ1xuICAgICAgICAvLyAgICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmU6XG4gICAgICAgIHBvcysrXG4gICAgICAgIGluaXRpYWwrK1xuICAgICAgICBhZGp1c3RUYWIgPSBmYWxzZVxuICAgICAgICBzcGFjZUFmdGVyTWFya2VyID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDA5IC8qIHRhYiAqLykge1xuICAgICAgICBzcGFjZUFmdGVyTWFya2VyID0gdHJ1ZVxuXG4gICAgICAgIGlmICgoc3RhdGUuYnNDb3VudFtuZXh0TGluZV0gKyBpbml0aWFsKSAlIDQgPT09IDMpIHtcbiAgICAgICAgICAvLyAnICA+XFx0ICB0ZXN0ICdcbiAgICAgICAgICAvLyAgICAgICBeIC0tIHBvc2l0aW9uIHN0YXJ0IG9mIGxpbmUgaGVyZSAodGFiIGhhcyB3aWR0aD09PTEpXG4gICAgICAgICAgcG9zKytcbiAgICAgICAgICBpbml0aWFsKytcbiAgICAgICAgICBhZGp1c3RUYWIgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICcgPlxcdCAgdGVzdCAnXG4gICAgICAgICAgLy8gICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmUgKyBzaGlmdCBic0NvdW50IHNsaWdodGx5XG4gICAgICAgICAgLy8gICAgICAgICB0byBtYWtlIGV4dHJhIHNwYWNlIGFwcGVhclxuICAgICAgICAgIGFkanVzdFRhYiA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGxldCBvZmZzZXQgPSBpbml0aWFsXG4gICAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKVxuICAgICAgc3RhdGUuYk1hcmtzW25leHRMaW5lXSA9IHBvc1xuXG4gICAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgICAgIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgICAgIGlmIChjaCA9PT0gMHgwOSkge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDQgLSAob2Zmc2V0ICsgc3RhdGUuYnNDb3VudFtuZXh0TGluZV0gKyAoYWRqdXN0VGFiID8gMSA6IDApKSAlIDRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0KytcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcysrXG4gICAgICB9XG5cbiAgICAgIGxhc3RMaW5lRW1wdHkgPSBwb3MgPj0gbWF4XG5cbiAgICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdID0gc3RhdGUuc0NvdW50W25leHRMaW5lXSArIDEgKyAoc3BhY2VBZnRlck1hcmtlciA/IDEgOiAwKVxuXG4gICAgICBvbGRTQ291bnQucHVzaChzdGF0ZS5zQ291bnRbbmV4dExpbmVdKVxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IG9mZnNldCAtIGluaXRpYWxcblxuICAgICAgb2xkVFNoaWZ0LnB1c2goc3RhdGUudFNoaWZ0W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPSBwb3MgLSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIENhc2UgMjogbGluZSBpcyBub3QgaW5zaWRlIHRoZSBibG9ja3F1b3RlLCBhbmQgdGhlIGxhc3QgbGluZSB3YXMgZW1wdHkuXG4gICAgaWYgKGxhc3RMaW5lRW1wdHkpIHsgYnJlYWsgfVxuXG4gICAgLy8gQ2FzZSAzOiBhbm90aGVyIHRhZyBmb3VuZC5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgLy8gUXVpcmsgdG8gZW5mb3JjZSBcImhhcmQgdGVybWluYXRpb24gbW9kZVwiIGZvciBwYXJhZ3JhcGhzO1xuICAgICAgLy8gbm9ybWFsbHkgaWYgeW91IGNhbGwgYHRva2VuaXplKHN0YXRlLCBzdGFydExpbmUsIG5leHRMaW5lKWAsXG4gICAgICAvLyBwYXJhZ3JhcGhzIHdpbGwgbG9vayBiZWxvdyBuZXh0TGluZSBmb3IgcGFyYWdyYXBoIGNvbnRpbnVhdGlvbixcbiAgICAgIC8vIGJ1dCBpZiBibG9ja3F1b3RlIGlzIHRlcm1pbmF0ZWQgYnkgYW5vdGhlciB0YWcsIHRoZXkgc2hvdWxkbid0XG4gICAgICBzdGF0ZS5saW5lTWF4ID0gbmV4dExpbmVcblxuICAgICAgaWYgKHN0YXRlLmJsa0luZGVudCAhPT0gMCkge1xuICAgICAgICAvLyBzdGF0ZS5ibGtJbmRlbnQgd2FzIG5vbi16ZXJvLCB3ZSBub3cgc2V0IGl0IHRvIHplcm8sXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gcmUtY2FsY3VsYXRlIGFsbCBvZmZzZXRzIHRvIGFwcGVhciBhc1xuICAgICAgICAvLyBpZiBpbmRlbnQgd2Fzbid0IGNoYW5nZWRcbiAgICAgICAgb2xkQk1hcmtzLnB1c2goc3RhdGUuYk1hcmtzW25leHRMaW5lXSlcbiAgICAgICAgb2xkQlNDb3VudC5wdXNoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKVxuICAgICAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgICAgICBvbGRTQ291bnQucHVzaChzdGF0ZS5zQ291bnRbbmV4dExpbmVdKVxuICAgICAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC09IHN0YXRlLmJsa0luZGVudFxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIG9sZEJNYXJrcy5wdXNoKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0pXG4gICAgb2xkQlNDb3VudC5wdXNoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKVxuICAgIG9sZFRTaGlmdC5wdXNoKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0pXG4gICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcblxuICAgIC8vIEEgbmVnYXRpdmUgaW5kZW50YXRpb24gbWVhbnMgdGhhdCB0aGlzIGlzIGEgcGFyYWdyYXBoIGNvbnRpbnVhdGlvblxuICAgIC8vXG4gICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IC0xXG4gIH1cblxuICBjb25zdCBvbGRJbmRlbnQgPSBzdGF0ZS5ibGtJbmRlbnRcbiAgc3RhdGUuYmxrSW5kZW50ID0gMFxuXG4gIGNvbnN0IHRva2VuX28gID0gc3RhdGUucHVzaCgnYmxvY2txdW90ZV9vcGVuJywgJ2Jsb2NrcXVvdGUnLCAxKVxuICB0b2tlbl9vLm1hcmt1cCA9ICc+J1xuICBjb25zdCBsaW5lcyA9IFtzdGFydExpbmUsIDBdXG4gIHRva2VuX28ubWFwICAgID0gbGluZXNcblxuICBzdGF0ZS5tZC5ibG9jay50b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lLCBuZXh0TGluZSlcblxuICBjb25zdCB0b2tlbl9jICA9IHN0YXRlLnB1c2goJ2Jsb2NrcXVvdGVfY2xvc2UnLCAnYmxvY2txdW90ZScsIC0xKVxuICB0b2tlbl9jLm1hcmt1cCA9ICc+J1xuXG4gIHN0YXRlLmxpbmVNYXggPSBvbGRMaW5lTWF4XG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG4gIGxpbmVzWzFdID0gc3RhdGUubGluZVxuXG4gIC8vIFJlc3RvcmUgb3JpZ2luYWwgdFNoaWZ0OyB0aGlzIG1pZ2h0IG5vdCBiZSBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhcnNlclxuICAvLyBoYXMgYWxyZWFkeSBiZWVuIGhlcmUsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZG8gdGhhdC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUU2hpZnQubGVuZ3RoOyBpKyspIHtcbiAgICBzdGF0ZS5iTWFya3NbaSArIHN0YXJ0TGluZV0gPSBvbGRCTWFya3NbaV1cbiAgICBzdGF0ZS50U2hpZnRbaSArIHN0YXJ0TGluZV0gPSBvbGRUU2hpZnRbaV1cbiAgICBzdGF0ZS5zQ291bnRbaSArIHN0YXJ0TGluZV0gPSBvbGRTQ291bnRbaV1cbiAgICBzdGF0ZS5ic0NvdW50W2kgKyBzdGFydExpbmVdID0gb2xkQlNDb3VudFtpXVxuICB9XG4gIHN0YXRlLmJsa0luZGVudCA9IG9sZEluZGVudFxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBIb3Jpem9udGFsIHJ1bGVcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhyIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcblxuICAvLyBDaGVjayBociBtYXJrZXJcbiAgaWYgKG1hcmtlciAhPT0gMHgyQS8qICogKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHg1Ri8qIF8gKi8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIG1hcmtlcnMgY2FuIGJlIG1peGVkIHdpdGggc3BhY2VzLCBidXQgdGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IDMgb2YgdGhlbVxuXG4gIGxldCBjbnQgPSAxXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICAgIGlmIChjaCAhPT0gbWFya2VyICYmICFpc1NwYWNlKGNoKSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmIChjaCA9PT0gbWFya2VyKSB7IGNudCsrIH1cbiAgfVxuXG4gIGlmIChjbnQgPCAzKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgc3RhdGUubGluZSA9IHN0YXJ0TGluZSArIDFcblxuICBjb25zdCB0b2tlbiAgPSBzdGF0ZS5wdXNoKCdocicsICdocicsIDApXG4gIHRva2VuLm1hcCAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG4gIHRva2VuLm1hcmt1cCA9IEFycmF5KGNudCArIDEpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpKVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgeyBpc1NwYWNlLCBub3JtYWxpemVSZWZlcmVuY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWZlcmVuY2UgKHN0YXRlLCBzdGFydExpbmUsIF9lbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRMaW5lIChuZXh0TGluZSkge1xuICAgIGNvbnN0IGVuZExpbmUgPSBzdGF0ZS5saW5lTWF4XG5cbiAgICBpZiAobmV4dExpbmUgPj0gZW5kTGluZSB8fCBzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgICAgLy8gZW1wdHkgbGluZSBvciBlbmQgb2YgaW5wdXRcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGlzQ29udGludWF0aW9uID0gZmFsc2VcblxuICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgLy8gaXQncyBjb25zaWRlcmVkIGEgbGF6eSBjb250aW51YXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0J3MgdGhlcmVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgaXNDb250aW51YXRpb24gPSB0cnVlIH1cblxuICAgIC8vIHF1aXJrIGZvciBibG9ja3F1b3RlcywgdGhpcyBsaW5lIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgYnkgdGhhdCBydWxlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCAwKSB7IGlzQ29udGludWF0aW9uID0gdHJ1ZSB9XG5cbiAgICBpZiAoIWlzQ29udGludWF0aW9uKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygncmVmZXJlbmNlJylcbiAgICAgIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gICAgICBzdGF0ZS5wYXJlbnRUeXBlID0gJ3JlZmVyZW5jZSdcblxuICAgICAgLy8gU29tZSB0YWdzIGNhbiB0ZXJtaW5hdGUgcGFyYWdyYXBoIHdpdGhvdXQgZW1wdHkgbGluZS5cbiAgICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgYW5vdGhlciBibG9ja1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgLy8gbWF4ICsgMSBleHBsaWNpdGx5IGluY2x1ZGVzIHRoZSBuZXdsaW5lXG4gICAgcmV0dXJuIHN0YXRlLnNyYy5zbGljZShwb3MsIG1heCArIDEpXG4gIH1cblxuICBsZXQgc3RyID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4ICsgMSlcblxuICBtYXggPSBzdHIubGVuZ3RoXG4gIGxldCBsYWJlbEVuZCA9IC0xXG5cbiAgZm9yIChwb3MgPSAxOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKGNoID09PSAweDVCIC8qIFsgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUQgLyogXSAqLykge1xuICAgICAgbGFiZWxFbmQgPSBwb3NcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwQSAvKiBcXG4gKi8pIHtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgICBpZiAobGluZUNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICAgICAgbmV4dExpbmUrK1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUMgLyogXFwgKi8pIHtcbiAgICAgIHBvcysrXG4gICAgICBpZiAocG9zIDwgbWF4ICYmIHN0ci5jaGFyQ29kZUF0KHBvcykgPT09IDB4MEEpIHtcbiAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICAgIG5leHRMaW5lKytcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChsYWJlbEVuZCA8IDAgfHwgc3RyLmNoYXJDb2RlQXQobGFiZWxFbmQgKyAxKSAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgIF5eXiBza2lwIG9wdGlvbmFsIHdoaXRlc3BhY2UgaGVyZVxuICBmb3IgKHBvcyA9IGxhYmVsRW5kICsgMjsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjaCA9PT0gMHgwQSkge1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgIGlmIChsaW5lQ29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICBuZXh0TGluZSsrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgLyogZXNsaW50IG5vLWVtcHR5OjAgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eIHBhcnNlIHRoaXNcbiAgY29uc3QgZGVzdFJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rRGVzdGluYXRpb24oc3RyLCBwb3MsIG1heClcbiAgaWYgKCFkZXN0UmVzLm9rKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgaHJlZiA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsoZGVzdFJlcy5zdHIpXG4gIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGhyZWYpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgcG9zID0gZGVzdFJlcy5wb3NcblxuICAvLyBzYXZlIGN1cnNvciBzdGF0ZSwgd2UgY291bGQgcmVxdWlyZSB0byByb2xsYmFjayBsYXRlclxuICBjb25zdCBkZXN0RW5kUG9zID0gcG9zXG4gIGNvbnN0IGRlc3RFbmRMaW5lTm8gPSBuZXh0TGluZVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBeXl4gc2tpcHBpbmcgdGhvc2Ugc3BhY2VzXG4gIGNvbnN0IHN0YXJ0ID0gcG9zXG4gIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKGNoID09PSAweDBBKSB7XG4gICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgICAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgICAgIG5leHRMaW5lKytcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3BhY2UoY2gpKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tZW1wdHk6MCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eIHBhcnNlIHRoaXNcbiAgbGV0IHRpdGxlUmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdHIsIHBvcywgbWF4KVxuICB3aGlsZSAodGl0bGVSZXMuY2FuX2NvbnRpbnVlKSB7XG4gICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICBpZiAobGluZUNvbnRlbnQgPT09IG51bGwpIGJyZWFrXG4gICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgcG9zID0gbWF4XG4gICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgIG5leHRMaW5lKytcbiAgICB0aXRsZVJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rVGl0bGUoc3RyLCBwb3MsIG1heCwgdGl0bGVSZXMpXG4gIH1cbiAgbGV0IHRpdGxlXG5cbiAgaWYgKHBvcyA8IG1heCAmJiBzdGFydCAhPT0gcG9zICYmIHRpdGxlUmVzLm9rKSB7XG4gICAgdGl0bGUgPSB0aXRsZVJlcy5zdHJcbiAgICBwb3MgPSB0aXRsZVJlcy5wb3NcbiAgfSBlbHNlIHtcbiAgICB0aXRsZSA9ICcnXG4gICAgcG9zID0gZGVzdEVuZFBvc1xuICAgIG5leHRMaW5lID0gZGVzdEVuZExpbmVOb1xuICB9XG5cbiAgLy8gc2tpcCB0cmFpbGluZyBzcGFjZXMgdW50aWwgdGhlIHJlc3Qgb2YgdGhlIGxpbmVcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmICghaXNTcGFjZShjaCkpIHsgYnJlYWsgfVxuICAgIHBvcysrXG4gIH1cblxuICBpZiAocG9zIDwgbWF4ICYmIHN0ci5jaGFyQ29kZUF0KHBvcykgIT09IDB4MEEpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIC8vIGdhcmJhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhZnRlciB0aXRsZSxcbiAgICAgIC8vIGJ1dCBpdCBjb3VsZCBzdGlsbCBiZSBhIHZhbGlkIHJlZmVyZW5jZSBpZiB3ZSByb2xsIGJhY2tcbiAgICAgIHRpdGxlID0gJydcbiAgICAgIHBvcyA9IGRlc3RFbmRQb3NcbiAgICAgIG5leHRMaW5lID0gZGVzdEVuZExpbmVOb1xuICAgICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgaWYgKCFpc1NwYWNlKGNoKSkgeyBicmVhayB9XG4gICAgICAgIHBvcysrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBvcyA8IG1heCAmJiBzdHIuY2hhckNvZGVBdChwb3MpICE9PSAweDBBKSB7XG4gICAgLy8gZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBsYWJlbCA9IG5vcm1hbGl6ZVJlZmVyZW5jZShzdHIuc2xpY2UoMSwgbGFiZWxFbmQpKVxuICBpZiAoIWxhYmVsKSB7XG4gICAgLy8gQ29tbW9uTWFyayAwLjIwIGRpc2FsbG93cyBlbXB0eSBsYWJlbHNcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFJlZmVyZW5jZSBjYW4gbm90IHRlcm1pbmF0ZSBhbnl0aGluZy4gVGhpcyBjaGVjayBpcyBmb3Igc2FmZXR5IG9ubHkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXRlLmVudi5yZWZlcmVuY2VzID0ge31cbiAgfVxuICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzW2xhYmVsXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0ZS5lbnYucmVmZXJlbmNlc1tsYWJlbF0gPSB7IHRpdGxlLCBocmVmIH1cbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gaGVhZGluZyAoIywgIyMsIC4uLilcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhlYWRpbmcgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBjaCAgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgaWYgKGNoICE9PSAweDIzLyogIyAqLyB8fCBwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gY291bnQgaGVhZGluZyBsZXZlbFxuICBsZXQgbGV2ZWwgPSAxXG4gIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytwb3MpXG4gIHdoaWxlIChjaCA9PT0gMHgyMy8qICMgKi8gJiYgcG9zIDwgbWF4ICYmIGxldmVsIDw9IDYpIHtcbiAgICBsZXZlbCsrXG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdCgrK3BvcylcbiAgfVxuXG4gIGlmIChsZXZlbCA+IDYgfHwgKHBvcyA8IG1heCAmJiAhaXNTcGFjZShjaCkpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gTGV0J3MgY3V0IHRhaWxzIGxpa2UgJyAgICAjIyMgICcgZnJvbSB0aGUgZW5kIG9mIHN0cmluZ1xuXG4gIG1heCA9IHN0YXRlLnNraXBTcGFjZXNCYWNrKG1heCwgcG9zKVxuICBjb25zdCB0bXAgPSBzdGF0ZS5za2lwQ2hhcnNCYWNrKG1heCwgMHgyMywgcG9zKSAvLyAjXG4gIGlmICh0bXAgPiBwb3MgJiYgaXNTcGFjZShzdGF0ZS5zcmMuY2hhckNvZGVBdCh0bXAgLSAxKSkpIHtcbiAgICBtYXggPSB0bXBcbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW5fbyAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX29wZW4nLCAnaCcgKyBTdHJpbmcobGV2ZWwpLCAxKVxuICB0b2tlbl9vLm1hcmt1cCA9ICcjIyMjIyMjIycuc2xpY2UoMCwgbGV2ZWwpXG4gIHRva2VuX28ubWFwICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICBjb25zdCB0b2tlbl9pICAgID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gIHRva2VuX2kuY29udGVudCAgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpLnRyaW0oKVxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cbiAgdG9rZW5faS5jaGlsZHJlbiA9IFtdXG5cbiAgY29uc3QgdG9rZW5fYyAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX2Nsb3NlJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgLTEpXG4gIHRva2VuX2MubWFya3VwID0gJyMjIyMjIyMjJy5zbGljZSgwLCBsZXZlbClcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gbGhlYWRpbmcgKC0tLSwgPT09KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaGVhZGluZyAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZS8qLCBzaWxlbnQgKi8pIHtcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ3BhcmFncmFwaCcpXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZVxuICBzdGF0ZS5wYXJlbnRUeXBlID0gJ3BhcmFncmFwaCcgLy8gdXNlIHBhcmFncmFwaCB0byBtYXRjaCB0ZXJtaW5hdG9yUnVsZXNcblxuICAvLyBqdW1wIGxpbmUtYnktbGluZSB1bnRpbCBlbXB0eSBvbmUgb3IgRU9GXG4gIGxldCBsZXZlbCA9IDBcbiAgbGV0IG1hcmtlclxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgZm9yICg7IG5leHRMaW5lIDwgZW5kTGluZSAmJiAhc3RhdGUuaXNFbXB0eShuZXh0TGluZSk7IG5leHRMaW5lKyspIHtcbiAgICAvLyB0aGlzIHdvdWxkIGJlIGEgY29kZSBibG9jayBub3JtYWxseSwgYnV0IGFmdGVyIHBhcmFncmFwaFxuICAgIC8vIGl0J3MgY29uc2lkZXJlZCBhIGxhenkgY29udGludWF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCdzIHRoZXJlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPiAzKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vXG4gICAgLy8gQ2hlY2sgZm9yIHVuZGVybGluZSBpbiBzZXRleHQgaGVhZGVyXG4gICAgLy9cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA+PSBzdGF0ZS5ibGtJbmRlbnQpIHtcbiAgICAgIGxldCBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgICAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgICBpZiAocG9zIDwgbWF4KSB7XG4gICAgICAgIG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgICAgICBpZiAobWFya2VyID09PSAweDJELyogLSAqLyB8fCBtYXJrZXIgPT09IDB4M0QvKiA9ICovKSB7XG4gICAgICAgICAgcG9zID0gc3RhdGUuc2tpcENoYXJzKHBvcywgbWFya2VyKVxuICAgICAgICAgIHBvcyA9IHN0YXRlLnNraXBTcGFjZXMocG9zKVxuXG4gICAgICAgICAgaWYgKHBvcyA+PSBtYXgpIHtcbiAgICAgICAgICAgIGxldmVsID0gKG1hcmtlciA9PT0gMHgzRC8qID0gKi8gPyAxIDogMilcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcXVpcmsgZm9yIGJsb2NrcXVvdGVzLCB0aGlzIGxpbmUgc2hvdWxkIGFscmVhZHkgYmUgY2hlY2tlZCBieSB0aGF0IHJ1bGVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IDApIHsgY29udGludWUgfVxuXG4gICAgLy8gU29tZSB0YWdzIGNhbiB0ZXJtaW5hdGUgcGFyYWdyYXBoIHdpdGhvdXQgZW1wdHkgbGluZS5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWsgfVxuICB9XG5cbiAgaWYgKCFsZXZlbCkge1xuICAgIC8vIERpZG4ndCBmaW5kIHZhbGlkIHVuZGVybGluZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSwgbmV4dExpbmUsIHN0YXRlLmJsa0luZGVudCwgZmFsc2UpLnRyaW0oKVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZSArIDFcblxuICBjb25zdCB0b2tlbl9vICAgID0gc3RhdGUucHVzaCgnaGVhZGluZ19vcGVuJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgMSlcbiAgdG9rZW5fby5tYXJrdXAgICA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKVxuICB0b2tlbl9vLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICBjb25zdCB0b2tlbl9pICAgID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gIHRva2VuX2kuY29udGVudCAgPSBjb250ZW50XG4gIHRva2VuX2kubWFwICAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lIC0gMV1cbiAgdG9rZW5faS5jaGlsZHJlbiA9IFtdXG5cbiAgY29uc3QgdG9rZW5fYyAgICA9IHN0YXRlLnB1c2goJ2hlYWRpbmdfY2xvc2UnLCAnaCcgKyBTdHJpbmcobGV2ZWwpLCAtMSlcbiAgdG9rZW5fYy5tYXJrdXAgICA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKVxuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFBhcmFncmFwaFxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJhZ3JhcGggKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUpIHtcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ3BhcmFncmFwaCcpXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdwYXJhZ3JhcGgnXG5cbiAgLy8ganVtcCBsaW5lLWJ5LWxpbmUgdW50aWwgZW1wdHkgb25lIG9yIEVPRlxuICBmb3IgKDsgbmV4dExpbmUgPCBlbmRMaW5lICYmICFzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKTsgbmV4dExpbmUrKykge1xuICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgLy8gaXQncyBjb25zaWRlcmVkIGEgbGF6eSBjb250aW51YXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0J3MgdGhlcmVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgY29udGludWUgfVxuXG4gICAgLy8gcXVpcmsgZm9yIGJsb2NrcXVvdGVzLCB0aGlzIGxpbmUgc2hvdWxkIGFscmVhZHkgYmUgY2hlY2tlZCBieSB0aGF0IHJ1bGVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IDApIHsgY29udGludWUgfVxuXG4gICAgLy8gU29tZSB0YWdzIGNhbiB0ZXJtaW5hdGUgcGFyYWdyYXBoIHdpdGhvdXQgZW1wdHkgbGluZS5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWsgfVxuICB9XG5cbiAgY29uc3QgY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSwgbmV4dExpbmUsIHN0YXRlLmJsa0luZGVudCwgZmFsc2UpLnRyaW0oKVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuXG4gIGNvbnN0IHRva2VuX28gICAgPSBzdGF0ZS5wdXNoKCdwYXJhZ3JhcGhfb3BlbicsICdwJywgMSlcbiAgdG9rZW5fby5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gY29udGVudFxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cbiAgdG9rZW5faS5jaGlsZHJlbiA9IFtdXG5cbiAgc3RhdGUucHVzaCgncGFyYWdyYXBoX2Nsb3NlJywgJ3AnLCAtMSlcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBJbmxpbmUgcGFyc2VyIHN0YXRlXG5cbmltcG9ydCBUb2tlbiBmcm9tICcuLi90b2tlbi5tanMnXG5pbXBvcnQgeyBpc1doaXRlU3BhY2UsIGlzUHVuY3RDaGFyLCBpc01kQXNjaWlQdW5jdCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmZ1bmN0aW9uIFN0YXRlSW5saW5lIChzcmMsIG1kLCBlbnYsIG91dFRva2Vucykge1xuICB0aGlzLnNyYyA9IHNyY1xuICB0aGlzLmVudiA9IGVudlxuICB0aGlzLm1kID0gbWRcbiAgdGhpcy50b2tlbnMgPSBvdXRUb2tlbnNcbiAgdGhpcy50b2tlbnNfbWV0YSA9IEFycmF5KG91dFRva2Vucy5sZW5ndGgpXG5cbiAgdGhpcy5wb3MgPSAwXG4gIHRoaXMucG9zTWF4ID0gdGhpcy5zcmMubGVuZ3RoXG4gIHRoaXMubGV2ZWwgPSAwXG4gIHRoaXMucGVuZGluZyA9ICcnXG4gIHRoaXMucGVuZGluZ0xldmVsID0gMFxuXG4gIC8vIFN0b3JlcyB7IHN0YXJ0OiBlbmQgfSBwYWlycy4gVXNlZnVsIGZvciBiYWNrdHJhY2tcbiAgLy8gb3B0aW1pemF0aW9uIG9mIHBhaXJzIHBhcnNlIChlbXBoYXNpcywgc3RyaWtlcykuXG4gIHRoaXMuY2FjaGUgPSB7fVxuXG4gIC8vIExpc3Qgb2YgZW1waGFzaXMtbGlrZSBkZWxpbWl0ZXJzIGZvciBjdXJyZW50IHRhZ1xuICB0aGlzLmRlbGltaXRlcnMgPSBbXVxuXG4gIC8vIFN0YWNrIG9mIGRlbGltaXRlciBsaXN0cyBmb3IgdXBwZXIgbGV2ZWwgdGFnc1xuICB0aGlzLl9wcmV2X2RlbGltaXRlcnMgPSBbXVxuXG4gIC8vIGJhY2t0aWNrIGxlbmd0aCA9PiBsYXN0IHNlZW4gcG9zaXRpb25cbiAgdGhpcy5iYWNrdGlja3MgPSB7fVxuICB0aGlzLmJhY2t0aWNrc1NjYW5uZWQgPSBmYWxzZVxuXG4gIC8vIENvdW50ZXIgdXNlZCB0byBkaXNhYmxlIGlubGluZSBsaW5raWZ5LWl0IGV4ZWN1dGlvblxuICAvLyBpbnNpZGUgPGE+IGFuZCBtYXJrZG93biBsaW5rc1xuICB0aGlzLmxpbmtMZXZlbCA9IDBcbn1cblxuLy8gRmx1c2ggcGVuZGluZyB0ZXh0XG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLnB1c2hQZW5kaW5nID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbigndGV4dCcsICcnLCAwKVxuICB0b2tlbi5jb250ZW50ID0gdGhpcy5wZW5kaW5nXG4gIHRva2VuLmxldmVsID0gdGhpcy5wZW5kaW5nTGV2ZWxcbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgdGhpcy5wZW5kaW5nID0gJydcbiAgcmV0dXJuIHRva2VuXG59XG5cbi8vIFB1c2ggbmV3IHRva2VuIHRvIFwic3RyZWFtXCIuXG4vLyBJZiBwZW5kaW5nIHRleHQgZXhpc3RzIC0gZmx1c2ggaXQgYXMgdGV4dCB0b2tlblxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHR5cGUsIHRhZywgbmVzdGluZykge1xuICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgdGhpcy5wdXNoUGVuZGluZygpXG4gIH1cblxuICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbih0eXBlLCB0YWcsIG5lc3RpbmcpXG4gIGxldCB0b2tlbl9tZXRhID0gbnVsbFxuXG4gIGlmIChuZXN0aW5nIDwgMCkge1xuICAgIC8vIGNsb3NpbmcgdGFnXG4gICAgdGhpcy5sZXZlbC0tXG4gICAgdGhpcy5kZWxpbWl0ZXJzID0gdGhpcy5fcHJldl9kZWxpbWl0ZXJzLnBvcCgpXG4gIH1cblxuICB0b2tlbi5sZXZlbCA9IHRoaXMubGV2ZWxcblxuICBpZiAobmVzdGluZyA+IDApIHtcbiAgICAvLyBvcGVuaW5nIHRhZ1xuICAgIHRoaXMubGV2ZWwrK1xuICAgIHRoaXMuX3ByZXZfZGVsaW1pdGVycy5wdXNoKHRoaXMuZGVsaW1pdGVycylcbiAgICB0aGlzLmRlbGltaXRlcnMgPSBbXVxuICAgIHRva2VuX21ldGEgPSB7IGRlbGltaXRlcnM6IHRoaXMuZGVsaW1pdGVycyB9XG4gIH1cblxuICB0aGlzLnBlbmRpbmdMZXZlbCA9IHRoaXMubGV2ZWxcbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgdGhpcy50b2tlbnNfbWV0YS5wdXNoKHRva2VuX21ldGEpXG4gIHJldHVybiB0b2tlblxufVxuXG4vLyBTY2FuIGEgc2VxdWVuY2Ugb2YgZW1waGFzaXMtbGlrZSBtYXJrZXJzLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXJcbi8vIGl0IGNhbiBzdGFydCBhbiBlbXBoYXNpcyBzZXF1ZW5jZSBvciBlbmQgYW4gZW1waGFzaXMgc2VxdWVuY2UuXG4vL1xuLy8gIC0gc3RhcnQgLSBwb3NpdGlvbiB0byBzY2FuIGZyb20gKGl0IHNob3VsZCBwb2ludCBhdCBhIHZhbGlkIG1hcmtlcik7XG4vLyAgLSBjYW5TcGxpdFdvcmQgLSBkZXRlcm1pbmUgaWYgdGhlc2UgbWFya2VycyBjYW4gYmUgZm91bmQgaW5zaWRlIGEgd29yZFxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5zY2FuRGVsaW1zID0gZnVuY3Rpb24gKHN0YXJ0LCBjYW5TcGxpdFdvcmQpIHtcbiAgY29uc3QgbWF4ID0gdGhpcy5wb3NNYXhcbiAgY29uc3QgbWFya2VyID0gdGhpcy5zcmMuY2hhckNvZGVBdChzdGFydClcblxuICAvLyB0cmVhdCBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYXMgYSB3aGl0ZXNwYWNlXG4gIGNvbnN0IGxhc3RDaGFyID0gc3RhcnQgPiAwID8gdGhpcy5zcmMuY2hhckNvZGVBdChzdGFydCAtIDEpIDogMHgyMFxuXG4gIGxldCBwb3MgPSBzdGFydFxuICB3aGlsZSAocG9zIDwgbWF4ICYmIHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gbWFya2VyKSB7IHBvcysrIH1cblxuICBjb25zdCBjb3VudCA9IHBvcyAtIHN0YXJ0XG5cbiAgLy8gdHJlYXQgZW5kIG9mIHRoZSBsaW5lIGFzIGEgd2hpdGVzcGFjZVxuICBjb25zdCBuZXh0Q2hhciA9IHBvcyA8IG1heCA/IHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKSA6IDB4MjBcblxuICBjb25zdCBpc0xhc3RQdW5jdENoYXIgPSBpc01kQXNjaWlQdW5jdChsYXN0Q2hhcikgfHwgaXNQdW5jdENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZShsYXN0Q2hhcikpXG4gIGNvbnN0IGlzTmV4dFB1bmN0Q2hhciA9IGlzTWRBc2NpaVB1bmN0KG5leHRDaGFyKSB8fCBpc1B1bmN0Q2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyKSlcblxuICBjb25zdCBpc0xhc3RXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKGxhc3RDaGFyKVxuICBjb25zdCBpc05leHRXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKG5leHRDaGFyKVxuXG4gIGNvbnN0IGxlZnRfZmxhbmtpbmcgPVxuICAgICFpc05leHRXaGl0ZVNwYWNlICYmICghaXNOZXh0UHVuY3RDaGFyIHx8IGlzTGFzdFdoaXRlU3BhY2UgfHwgaXNMYXN0UHVuY3RDaGFyKVxuICBjb25zdCByaWdodF9mbGFua2luZyA9XG4gICAgIWlzTGFzdFdoaXRlU3BhY2UgJiYgKCFpc0xhc3RQdW5jdENoYXIgfHwgaXNOZXh0V2hpdGVTcGFjZSB8fCBpc05leHRQdW5jdENoYXIpXG5cbiAgY29uc3QgY2FuX29wZW4gID0gbGVmdF9mbGFua2luZyAgJiYgKGNhblNwbGl0V29yZCB8fCAhcmlnaHRfZmxhbmtpbmcgfHwgaXNMYXN0UHVuY3RDaGFyKVxuICBjb25zdCBjYW5fY2xvc2UgPSByaWdodF9mbGFua2luZyAmJiAoY2FuU3BsaXRXb3JkIHx8ICFsZWZ0X2ZsYW5raW5nICB8fCBpc05leHRQdW5jdENoYXIpXG5cbiAgcmV0dXJuIHsgY2FuX29wZW4sIGNhbl9jbG9zZSwgbGVuZ3RoOiBjb3VudCB9XG59XG5cbi8vIHJlLWV4cG9ydCBUb2tlbiBjbGFzcyB0byB1c2UgaW4gYmxvY2sgcnVsZXNcblN0YXRlSW5saW5lLnByb3RvdHlwZS5Ub2tlbiA9IFRva2VuXG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRlSW5saW5lXG4iLCIvLyBTa2lwIHRleHQgY2hhcmFjdGVycyBmb3IgdGV4dCB0b2tlbiwgcGxhY2UgdGhvc2UgdG8gcGVuZGluZyBidWZmZXJcbi8vIGFuZCBpbmNyZW1lbnQgY3VycmVudCBwb3NcblxuLy8gUnVsZSB0byBza2lwIHB1cmUgdGV4dFxuLy8gJ3t9JCVAfis9OicgcmVzZXJ2ZWQgZm9yIGV4dGVudGlvbnNcblxuLy8gISwgXCIsICMsICQsICUsICYsICcsICgsICksICosICssICwsIC0sIC4sIC8sIDosIDssIDwsID0sID4sID8sIEAsIFssIFxcLCBdLCBeLCBfLCBgLCB7LCB8LCB9LCBvciB+XG5cbi8vICEhISEgRG9uJ3QgY29uZnVzZSB3aXRoIFwiTWFya2Rvd24gQVNDSUkgUHVuY3R1YXRpb25cIiBjaGFyc1xuLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xNS8jYXNjaWktcHVuY3R1YXRpb24tY2hhcmFjdGVyXG5mdW5jdGlvbiBpc1Rlcm1pbmF0b3JDaGFyIChjaCkge1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAweDBBLyogXFxuICovOlxuICAgIGNhc2UgMHgyMS8qICEgKi86XG4gICAgY2FzZSAweDIzLyogIyAqLzpcbiAgICBjYXNlIDB4MjQvKiAkICovOlxuICAgIGNhc2UgMHgyNS8qICUgKi86XG4gICAgY2FzZSAweDI2LyogJiAqLzpcbiAgICBjYXNlIDB4MkEvKiAqICovOlxuICAgIGNhc2UgMHgyQi8qICsgKi86XG4gICAgY2FzZSAweDJELyogLSAqLzpcbiAgICBjYXNlIDB4M0EvKiA6ICovOlxuICAgIGNhc2UgMHgzQy8qIDwgKi86XG4gICAgY2FzZSAweDNELyogPSAqLzpcbiAgICBjYXNlIDB4M0UvKiA+ICovOlxuICAgIGNhc2UgMHg0MC8qIEAgKi86XG4gICAgY2FzZSAweDVCLyogWyAqLzpcbiAgICBjYXNlIDB4NUMvKiBcXCAqLzpcbiAgICBjYXNlIDB4NUQvKiBdICovOlxuICAgIGNhc2UgMHg1RS8qIF4gKi86XG4gICAgY2FzZSAweDVGLyogXyAqLzpcbiAgICBjYXNlIDB4NjAvKiBgICovOlxuICAgIGNhc2UgMHg3Qi8qIHsgKi86XG4gICAgY2FzZSAweDdELyogfSAqLzpcbiAgICBjYXNlIDB4N0UvKiB+ICovOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGV4dCAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG5cbiAgd2hpbGUgKHBvcyA8IHN0YXRlLnBvc01heCAmJiAhaXNUZXJtaW5hdG9yQ2hhcihzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpKSkge1xuICAgIHBvcysrXG4gIH1cblxuICBpZiAocG9zID09PSBzdGF0ZS5wb3MpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShzdGF0ZS5wb3MsIHBvcykgfVxuXG4gIHN0YXRlLnBvcyA9IHBvc1xuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIEFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uLCBmb3IgbWVtb3J5LlxuLy9cbi8vIEl0IGNvc3RzIDEwJSBvZiBwZXJmb3JtYW5jZSwgYnV0IGFsbG93cyBleHRlbmQgdGVybWluYXRvcnMgbGlzdCwgaWYgcGxhY2UgaXRcbi8vIHRvIGBQYXJzZXJJbmxpbmVgIHByb3BlcnR5LiBQcm9iYWJseSwgd2lsbCBzd2l0Y2ggdG8gaXQgc29tZXRpbWUsIHN1Y2hcbi8vIGZsZXhpYmlsaXR5IHJlcXVpcmVkLlxuXG4vKlxudmFyIFRFUk1JTkFUT1JfUkUgPSAvW1xcbiEjJCUmKitcXC06PD0+QFtcXFxcXFxdXl9ge31+XS87XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGV4dChzdGF0ZSwgc2lsZW50KSB7XG4gIHZhciBwb3MgPSBzdGF0ZS5wb3MsXG4gICAgICBpZHggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5zZWFyY2goVEVSTUlOQVRPUl9SRSk7XG5cbiAgLy8gZmlyc3QgY2hhciBpcyB0ZXJtaW5hdG9yIC0+IGVtcHR5IHRleHRcbiAgaWYgKGlkeCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyBubyB0ZXJtaW5hdG9yIC0+IHRleHQgdGlsbCBlbmQgb2Ygc3RyaW5nXG4gIGlmIChpZHggPCAwKSB7XG4gICAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2UocG9zKTsgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXRlLnNyYy5sZW5ndGg7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShwb3MsIHBvcyArIGlkeCk7IH1cblxuICBzdGF0ZS5wb3MgKz0gaWR4O1xuXG4gIHJldHVybiB0cnVlO1xufTsgKi9cbiIsIi8vIFByb2Nlc3MgbGlua3MgbGlrZSBodHRwczovL2V4YW1wbGUub3JnL1xuXG4vLyBSRkMzOTg2OiBzY2hlbWUgPSBBTFBIQSAqKCBBTFBIQSAvIERJR0lUIC8gXCIrXCIgLyBcIi1cIiAvIFwiLlwiIClcbmNvbnN0IFNDSEVNRV9SRSA9IC8oPzpefFteYS16MC05ListXSkoW2Etel1bYS16MC05ListXSopJC9pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmtpZnkgKHN0YXRlLCBzaWxlbnQpIHtcbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLmxpbmtpZnkpIHJldHVybiBmYWxzZVxuICBpZiAoc3RhdGUubGlua0xldmVsID4gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGlmIChwb3MgKyAzID4gbWF4KSByZXR1cm4gZmFsc2VcbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0EvKiA6ICovKSByZXR1cm4gZmFsc2VcbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDEpICE9PSAweDJGLyogLyAqLykgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAyKSAhPT0gMHgyRi8qIC8gKi8pIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1hdGNoID0gc3RhdGUucGVuZGluZy5tYXRjaChTQ0hFTUVfUkUpXG4gIGlmICghbWF0Y2gpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvID0gbWF0Y2hbMV1cblxuICBjb25zdCBsaW5rID0gc3RhdGUubWQubGlua2lmeS5tYXRjaEF0U3RhcnQoc3RhdGUuc3JjLnNsaWNlKHBvcyAtIHByb3RvLmxlbmd0aCkpXG4gIGlmICghbGluaykgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IHVybCA9IGxpbmsudXJsXG5cbiAgLy8gaW52YWxpZCBsaW5rLCBidXQgc3RpbGwgZGV0ZWN0ZWQgYnkgbGlua2lmeSBzb21laG93O1xuICAvLyBuZWVkIHRvIGNoZWNrIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcCBiZWxvd1xuICBpZiAodXJsLmxlbmd0aCA8PSBwcm90by5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gIC8vIGRpc2FsbG93ICcqJyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rIChjb25mbGljdHMgd2l0aCBlbXBoYXNpcylcbiAgdXJsID0gdXJsLnJlcGxhY2UoL1xcKiskLywgJycpXG5cbiAgY29uc3QgZnVsbFVybCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsodXJsKVxuICBpZiAoIXN0YXRlLm1kLnZhbGlkYXRlTGluayhmdWxsVXJsKSkgcmV0dXJuIGZhbHNlXG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBzdGF0ZS5wZW5kaW5nID0gc3RhdGUucGVuZGluZy5zbGljZSgwLCAtcHJvdG8ubGVuZ3RoKVxuXG4gICAgY29uc3QgdG9rZW5fbyA9IHN0YXRlLnB1c2goJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICB0b2tlbl9vLmF0dHJzID0gW1snaHJlZicsIGZ1bGxVcmxdXVxuICAgIHRva2VuX28ubWFya3VwID0gJ2xpbmtpZnknXG4gICAgdG9rZW5fby5pbmZvID0gJ2F1dG8nXG5cbiAgICBjb25zdCB0b2tlbl90ID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgIHRva2VuX3QuY29udGVudCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KHVybClcblxuICAgIGNvbnN0IHRva2VuX2MgPSBzdGF0ZS5wdXNoKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICB0b2tlbl9jLm1hcmt1cCA9ICdsaW5raWZ5J1xuICAgIHRva2VuX2MuaW5mbyA9ICdhdXRvJ1xuICB9XG5cbiAgc3RhdGUucG9zICs9IHVybC5sZW5ndGggLSBwcm90by5sZW5ndGhcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFByb2Nlc3MgZXNjYXBlZCBjaGFycyBhbmQgaGFyZGJyZWFrc1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgRVNDQVBFRCA9IFtdXG5cbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgRVNDQVBFRC5wdXNoKDApIH1cblxuJ1xcXFwhXCIjJCUmXFwnKCkqKywuLzo7PD0+P0BbXV5fYHt8fX4tJ1xuICAuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNoKSB7IEVTQ0FQRURbY2guY2hhckNvZGVBdCgwKV0gPSAxIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVzY2FwZSAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDVDLyogXFwgKi8pIHJldHVybiBmYWxzZVxuICBwb3MrK1xuXG4gIC8vICdcXCcgYXQgdGhlIGVuZCBvZiB0aGUgaW5saW5lIGJsb2NrXG4gIGlmIChwb3MgPj0gbWF4KSByZXR1cm4gZmFsc2VcblxuICBsZXQgY2gxID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChjaDEgPT09IDB4MEEpIHtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgc3RhdGUucHVzaCgnaGFyZGJyZWFrJywgJ2JyJywgMClcbiAgICB9XG5cbiAgICBwb3MrK1xuICAgIC8vIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlcyBmcm9tIG5leHQgbGluZVxuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIGNoMSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjaDEpKSBicmVha1xuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBwb3NcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGVzY2FwZWRTdHIgPSBzdGF0ZS5zcmNbcG9zXVxuXG4gIGlmIChjaDEgPj0gMHhEODAwICYmIGNoMSA8PSAweERCRkYgJiYgcG9zICsgMSA8IG1heCkge1xuICAgIGNvbnN0IGNoMiA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDEpXG5cbiAgICBpZiAoY2gyID49IDB4REMwMCAmJiBjaDIgPD0gMHhERkZGKSB7XG4gICAgICBlc2NhcGVkU3RyICs9IHN0YXRlLnNyY1twb3MgKyAxXVxuICAgICAgcG9zKytcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmlnU3RyID0gJ1xcXFwnICsgZXNjYXBlZFN0clxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcblxuICAgIGlmIChjaDEgPCAyNTYgJiYgRVNDQVBFRFtjaDFdICE9PSAwKSB7XG4gICAgICB0b2tlbi5jb250ZW50ID0gZXNjYXBlZFN0clxuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbi5jb250ZW50ID0gb3JpZ1N0clxuICAgIH1cblxuICAgIHRva2VuLm1hcmt1cCA9IG9yaWdTdHJcbiAgICB0b2tlbi5pbmZvICAgPSAnZXNjYXBlJ1xuICB9XG5cbiAgc3RhdGUucG9zID0gcG9zICsgMVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gfn5zdHJpa2UgdGhyb3VnaH5+XG4vL1xuXG4vLyBJbnNlcnQgZWFjaCBtYXJrZXIgYXMgYSBzZXBhcmF0ZSB0ZXh0IHRva2VuLCBhbmQgYWRkIGl0IHRvIGRlbGltaXRlciBsaXN0XG4vL1xuZnVuY3Rpb24gc3RyaWtldGhyb3VnaF90b2tlbml6ZSAoc3RhdGUsIHNpbGVudCkge1xuICBjb25zdCBzdGFydCA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydClcblxuICBpZiAoc2lsZW50KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG1hcmtlciAhPT0gMHg3RS8qIH4gKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBzY2FubmVkID0gc3RhdGUuc2NhbkRlbGltcyhzdGF0ZS5wb3MsIHRydWUpXG4gIGxldCBsZW4gPSBzY2FubmVkLmxlbmd0aFxuICBjb25zdCBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKVxuXG4gIGlmIChsZW4gPCAyKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IHRva2VuXG5cbiAgaWYgKGxlbiAlIDIpIHtcbiAgICB0b2tlbiAgICAgICAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgPSBjaFxuICAgIGxlbi0tXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ID0gY2ggKyBjaFxuXG4gICAgc3RhdGUuZGVsaW1pdGVycy5wdXNoKHtcbiAgICAgIG1hcmtlcixcbiAgICAgIGxlbmd0aDogMCwgICAgIC8vIGRpc2FibGUgXCJydWxlIG9mIDNcIiBsZW5ndGggY2hlY2tzIG1lYW50IGZvciBlbXBoYXNpc1xuICAgICAgdG9rZW46IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxLFxuICAgICAgZW5kOiAtMSxcbiAgICAgIG9wZW46IHNjYW5uZWQuY2FuX29wZW4sXG4gICAgICBjbG9zZTogc2Nhbm5lZC5jYW5fY2xvc2VcbiAgICB9KVxuICB9XG5cbiAgc3RhdGUucG9zICs9IHNjYW5uZWQubGVuZ3RoXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcG9zdFByb2Nlc3MgKHN0YXRlLCBkZWxpbWl0ZXJzKSB7XG4gIGxldCB0b2tlblxuICBjb25zdCBsb25lTWFya2VycyA9IFtdXG4gIGNvbnN0IG1heCA9IGRlbGltaXRlcnMubGVuZ3RoXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXg7IGkrKykge1xuICAgIGNvbnN0IHN0YXJ0RGVsaW0gPSBkZWxpbWl0ZXJzW2ldXG5cbiAgICBpZiAoc3RhcnREZWxpbS5tYXJrZXIgIT09IDB4N0UvKiB+ICovKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzdGFydERlbGltLmVuZCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgZW5kRGVsaW0gPSBkZWxpbWl0ZXJzW3N0YXJ0RGVsaW0uZW5kXVxuXG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnRva2Vuc1tzdGFydERlbGltLnRva2VuXVxuICAgIHRva2VuLnR5cGUgICAgPSAnc19vcGVuJ1xuICAgIHRva2VuLnRhZyAgICAgPSAncydcbiAgICB0b2tlbi5uZXN0aW5nID0gMVxuICAgIHRva2VuLm1hcmt1cCAgPSAnfn4nXG4gICAgdG9rZW4uY29udGVudCA9ICcnXG5cbiAgICB0b2tlbiAgICAgICAgID0gc3RhdGUudG9rZW5zW2VuZERlbGltLnRva2VuXVxuICAgIHRva2VuLnR5cGUgICAgPSAnc19jbG9zZSdcbiAgICB0b2tlbi50YWcgICAgID0gJ3MnXG4gICAgdG9rZW4ubmVzdGluZyA9IC0xXG4gICAgdG9rZW4ubWFya3VwICA9ICd+fidcbiAgICB0b2tlbi5jb250ZW50ID0gJydcblxuICAgIGlmIChzdGF0ZS50b2tlbnNbZW5kRGVsaW0udG9rZW4gLSAxXS50eXBlID09PSAndGV4dCcgJiZcbiAgICAgICAgc3RhdGUudG9rZW5zW2VuZERlbGltLnRva2VuIC0gMV0uY29udGVudCA9PT0gJ34nKSB7XG4gICAgICBsb25lTWFya2Vycy5wdXNoKGVuZERlbGltLnRva2VuIC0gMSlcbiAgICB9XG4gIH1cblxuICAvLyBJZiBhIG1hcmtlciBzZXF1ZW5jZSBoYXMgYW4gb2RkIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBpdCdzIHNwbGl0dGVkXG4gIC8vIGxpa2UgdGhpczogYH5+fn5+YCAtPiBgfmAgKyBgfn5gICsgYH5+YCwgbGVhdmluZyBvbmUgbWFya2VyIGF0IHRoZVxuICAvLyBzdGFydCBvZiB0aGUgc2VxdWVuY2UuXG4gIC8vXG4gIC8vIFNvLCB3ZSBoYXZlIHRvIG1vdmUgYWxsIHRob3NlIG1hcmtlcnMgYWZ0ZXIgc3Vic2VxdWVudCBzX2Nsb3NlIHRhZ3MuXG4gIC8vXG4gIHdoaWxlIChsb25lTWFya2Vycy5sZW5ndGgpIHtcbiAgICBjb25zdCBpID0gbG9uZU1hcmtlcnMucG9wKClcbiAgICBsZXQgaiA9IGkgKyAxXG5cbiAgICB3aGlsZSAoaiA8IHN0YXRlLnRva2Vucy5sZW5ndGggJiYgc3RhdGUudG9rZW5zW2pdLnR5cGUgPT09ICdzX2Nsb3NlJykge1xuICAgICAgaisrXG4gICAgfVxuXG4gICAgai0tXG5cbiAgICBpZiAoaSAhPT0gaikge1xuICAgICAgdG9rZW4gPSBzdGF0ZS50b2tlbnNbal1cbiAgICAgIHN0YXRlLnRva2Vuc1tqXSA9IHN0YXRlLnRva2Vuc1tpXVxuICAgICAgc3RhdGUudG9rZW5zW2ldID0gdG9rZW5cbiAgICB9XG4gIH1cbn1cblxuLy8gV2FsayB0aHJvdWdoIGRlbGltaXRlciBsaXN0IGFuZCByZXBsYWNlIHRleHQgdG9rZW5zIHdpdGggdGFnc1xuLy9cbmZ1bmN0aW9uIHN0cmlrZXRocm91Z2hfcG9zdFByb2Nlc3MgKHN0YXRlKSB7XG4gIGNvbnN0IHRva2Vuc19tZXRhID0gc3RhdGUudG9rZW5zX21ldGFcbiAgY29uc3QgbWF4ID0gc3RhdGUudG9rZW5zX21ldGEubGVuZ3RoXG5cbiAgcG9zdFByb2Nlc3Moc3RhdGUsIHN0YXRlLmRlbGltaXRlcnMpXG5cbiAgZm9yIChsZXQgY3VyciA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgIGlmICh0b2tlbnNfbWV0YVtjdXJyXSAmJiB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKSB7XG4gICAgICBwb3N0UHJvY2VzcyhzdGF0ZSwgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB0b2tlbml6ZTogc3RyaWtldGhyb3VnaF90b2tlbml6ZSxcbiAgcG9zdFByb2Nlc3M6IHN0cmlrZXRocm91Z2hfcG9zdFByb2Nlc3Ncbn1cbiIsIi8vIFByb2Nlc3MgKnRoaXMqIGFuZCBfdGhhdF9cbi8vXG5cbi8vIEluc2VydCBlYWNoIG1hcmtlciBhcyBhIHNlcGFyYXRlIHRleHQgdG9rZW4sIGFuZCBhZGQgaXQgdG8gZGVsaW1pdGVyIGxpc3Rcbi8vXG5mdW5jdGlvbiBlbXBoYXNpc190b2tlbml6ZSAoc3RhdGUsIHNpbGVudCkge1xuICBjb25zdCBzdGFydCA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydClcblxuICBpZiAoc2lsZW50KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG1hcmtlciAhPT0gMHg1RiAvKiBfICovICYmIG1hcmtlciAhPT0gMHgyQSAvKiAqICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc2Nhbm5lZCA9IHN0YXRlLnNjYW5EZWxpbXMoc3RhdGUucG9zLCBtYXJrZXIgPT09IDB4MkEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FubmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKVxuXG4gICAgc3RhdGUuZGVsaW1pdGVycy5wdXNoKHtcbiAgICAgIC8vIENoYXIgY29kZSBvZiB0aGUgc3RhcnRpbmcgbWFya2VyIChudW1iZXIpLlxuICAgICAgLy9cbiAgICAgIG1hcmtlcixcblxuICAgICAgLy8gVG90YWwgbGVuZ3RoIG9mIHRoZXNlIHNlcmllcyBvZiBkZWxpbWl0ZXJzLlxuICAgICAgLy9cbiAgICAgIGxlbmd0aDogc2Nhbm5lZC5sZW5ndGgsXG5cbiAgICAgIC8vIEEgcG9zaXRpb24gb2YgdGhlIHRva2VuIHRoaXMgZGVsaW1pdGVyIGNvcnJlc3BvbmRzIHRvLlxuICAgICAgLy9cbiAgICAgIHRva2VuOiBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMSxcblxuICAgICAgLy8gSWYgdGhpcyBkZWxpbWl0ZXIgaXMgbWF0Y2hlZCBhcyBhIHZhbGlkIG9wZW5lciwgYGVuZGAgd2lsbCBiZVxuICAgICAgLy8gZXF1YWwgdG8gaXRzIHBvc2l0aW9uLCBvdGhlcndpc2UgaXQncyBgLTFgLlxuICAgICAgLy9cbiAgICAgIGVuZDogLTEsXG5cbiAgICAgIC8vIEJvb2xlYW4gZmxhZ3MgdGhhdCBkZXRlcm1pbmUgaWYgdGhpcyBkZWxpbWl0ZXIgY291bGQgb3BlbiBvciBjbG9zZVxuICAgICAgLy8gYW4gZW1waGFzaXMuXG4gICAgICAvL1xuICAgICAgb3Blbjogc2Nhbm5lZC5jYW5fb3BlbixcbiAgICAgIGNsb3NlOiBzY2FubmVkLmNhbl9jbG9zZVxuICAgIH0pXG4gIH1cblxuICBzdGF0ZS5wb3MgKz0gc2Nhbm5lZC5sZW5ndGhcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBwb3N0UHJvY2VzcyAoc3RhdGUsIGRlbGltaXRlcnMpIHtcbiAgY29uc3QgbWF4ID0gZGVsaW1pdGVycy5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gbWF4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGFydERlbGltID0gZGVsaW1pdGVyc1tpXVxuXG4gICAgaWYgKHN0YXJ0RGVsaW0ubWFya2VyICE9PSAweDVGLyogXyAqLyAmJiBzdGFydERlbGltLm1hcmtlciAhPT0gMHgyQS8qICogKi8pIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBvbmx5IG9wZW5pbmcgbWFya2Vyc1xuICAgIGlmIChzdGFydERlbGltLmVuZCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgZW5kRGVsaW0gPSBkZWxpbWl0ZXJzW3N0YXJ0RGVsaW0uZW5kXVxuXG4gICAgLy8gSWYgdGhlIHByZXZpb3VzIGRlbGltaXRlciBoYXMgdGhlIHNhbWUgbWFya2VyIGFuZCBpcyBhZGphY2VudCB0byB0aGlzIG9uZSxcbiAgICAvLyBtZXJnZSB0aG9zZSBpbnRvIG9uZSBzdHJvbmcgZGVsaW1pdGVyLlxuICAgIC8vXG4gICAgLy8gYDxlbT48ZW0+d2hhdGV2ZXI8L2VtPjwvZW0+YCAtPiBgPHN0cm9uZz53aGF0ZXZlcjwvc3Ryb25nPmBcbiAgICAvL1xuICAgIGNvbnN0IGlzU3Ryb25nID0gaSA+IDAgJiZcbiAgICAgICAgICAgICAgIGRlbGltaXRlcnNbaSAtIDFdLmVuZCA9PT0gc3RhcnREZWxpbS5lbmQgKyAxICYmXG4gICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGZpcnN0IHR3byBtYXJrZXJzIG1hdGNoIGFuZCBhZGphY2VudFxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tpIC0gMV0ubWFya2VyID09PSBzdGFydERlbGltLm1hcmtlciAmJlxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tpIC0gMV0udG9rZW4gPT09IHN0YXJ0RGVsaW0udG9rZW4gLSAxICYmXG4gICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGxhc3QgdHdvIG1hcmtlcnMgYXJlIGFkamFjZW50ICh3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGV5IG1hdGNoKVxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZCArIDFdLnRva2VuID09PSBlbmREZWxpbS50b2tlbiArIDFcblxuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShzdGFydERlbGltLm1hcmtlcilcblxuICAgIGNvbnN0IHRva2VuX28gICA9IHN0YXRlLnRva2Vuc1tzdGFydERlbGltLnRva2VuXVxuICAgIHRva2VuX28udHlwZSAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZ19vcGVuJyA6ICdlbV9vcGVuJ1xuICAgIHRva2VuX28udGFnICAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZycgOiAnZW0nXG4gICAgdG9rZW5fby5uZXN0aW5nID0gMVxuICAgIHRva2VuX28ubWFya3VwICA9IGlzU3Ryb25nID8gY2ggKyBjaCA6IGNoXG4gICAgdG9rZW5fby5jb250ZW50ID0gJydcblxuICAgIGNvbnN0IHRva2VuX2MgICA9IHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbl1cbiAgICB0b2tlbl9jLnR5cGUgICAgPSBpc1N0cm9uZyA/ICdzdHJvbmdfY2xvc2UnIDogJ2VtX2Nsb3NlJ1xuICAgIHRva2VuX2MudGFnICAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZycgOiAnZW0nXG4gICAgdG9rZW5fYy5uZXN0aW5nID0gLTFcbiAgICB0b2tlbl9jLm1hcmt1cCAgPSBpc1N0cm9uZyA/IGNoICsgY2ggOiBjaFxuICAgIHRva2VuX2MuY29udGVudCA9ICcnXG5cbiAgICBpZiAoaXNTdHJvbmcpIHtcbiAgICAgIHN0YXRlLnRva2Vuc1tkZWxpbWl0ZXJzW2kgLSAxXS50b2tlbl0uY29udGVudCA9ICcnXG4gICAgICBzdGF0ZS50b2tlbnNbZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZCArIDFdLnRva2VuXS5jb250ZW50ID0gJydcbiAgICAgIGktLVxuICAgIH1cbiAgfVxufVxuXG4vLyBXYWxrIHRocm91Z2ggZGVsaW1pdGVyIGxpc3QgYW5kIHJlcGxhY2UgdGV4dCB0b2tlbnMgd2l0aCB0YWdzXG4vL1xuZnVuY3Rpb24gZW1waGFzaXNfcG9zdF9wcm9jZXNzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHBvc3RQcm9jZXNzKHN0YXRlLCBzdGF0ZS5kZWxpbWl0ZXJzKVxuXG4gIGZvciAobGV0IGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICBpZiAodG9rZW5zX21ldGFbY3Vycl0gJiYgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycykge1xuICAgICAgcG9zdFByb2Nlc3Moc3RhdGUsIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdG9rZW5pemU6IGVtcGhhc2lzX3Rva2VuaXplLFxuICBwb3N0UHJvY2VzczogZW1waGFzaXNfcG9zdF9wcm9jZXNzXG59XG4iLCIvLyBQcm9jZXNzIGF1dG9saW5rcyAnPHByb3RvY29sOi4uLj4nXG5cbi8qIGVzbGludCBtYXgtbGVuOjAgKi9cbmNvbnN0IEVNQUlMX1JFICAgID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSopJC9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4ICovXG5jb25zdCBBVVRPTElOS19SRSA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0pOihbXjw+XFx4MDAtXFx4MjBdKikkL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvbGluayAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0MvKiA8ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgZm9yICg7Oykge1xuICAgIGlmICgrK3BvcyA+PSBtYXgpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoY2ggPT09IDB4M0MgLyogPCAqLykgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGNoID09PSAweDNFIC8qID4gKi8pIGJyZWFrXG4gIH1cblxuICBjb25zdCB1cmwgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQgKyAxLCBwb3MpXG5cbiAgaWYgKEFVVE9MSU5LX1JFLnRlc3QodXJsKSkge1xuICAgIGNvbnN0IGZ1bGxVcmwgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHVybClcbiAgICBpZiAoIXN0YXRlLm1kLnZhbGlkYXRlTGluayhmdWxsVXJsKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGNvbnN0IHRva2VuX28gICA9IHN0YXRlLnB1c2goJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICAgIHRva2VuX28uYXR0cnMgICA9IFtbJ2hyZWYnLCBmdWxsVXJsXV1cbiAgICAgIHRva2VuX28ubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX28uaW5mbyAgICA9ICdhdXRvJ1xuXG4gICAgICBjb25zdCB0b2tlbl90ICAgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgICB0b2tlbl90LmNvbnRlbnQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCh1cmwpXG5cbiAgICAgIGNvbnN0IHRva2VuX2MgICA9IHN0YXRlLnB1c2goJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICAgICAgdG9rZW5fYy5tYXJrdXAgID0gJ2F1dG9saW5rJ1xuICAgICAgdG9rZW5fYy5pbmZvICAgID0gJ2F1dG8nXG4gICAgfVxuXG4gICAgc3RhdGUucG9zICs9IHVybC5sZW5ndGggKyAyXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChFTUFJTF9SRS50ZXN0KHVybCkpIHtcbiAgICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluaygnbWFpbHRvOicgKyB1cmwpXG4gICAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBjb25zdCB0b2tlbl9vICAgPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICB0b2tlbl9vLmF0dHJzICAgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcblxuICAgICAgY29uc3QgdG9rZW5fdCAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgICAgdG9rZW5fdC5jb250ZW50ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsKVxuXG4gICAgICBjb25zdCB0b2tlbl9jICAgPSBzdGF0ZS5wdXNoKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICAgIHRva2VuX2MubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX2MuaW5mbyAgICA9ICdhdXRvJ1xuICAgIH1cblxuICAgIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoICsgMlxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8vIFByb2Nlc3MgaHRtbCBlbnRpdHkgLSAmIzEyMzssICYjeEFGOywgJnF1b3Q7LCAuLi5cblxuaW1wb3J0IHsgZGVjb2RlSFRNTCB9IGZyb20gJ2VudGl0aWVzJ1xuaW1wb3J0IHsgaXNWYWxpZEVudGl0eUNvZGUsIGZyb21Db2RlUG9pbnQgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5jb25zdCBESUdJVEFMX1JFID0gL14mIygoPzp4W2EtZjAtOV17MSw2fXxbMC05XXsxLDd9KSk7L2lcbmNvbnN0IE5BTUVEX1JFICAgPSAvXiYoW2Etel1bYS16MC05XXsxLDMxfSk7L2lcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW50aXR5IChzdGF0ZSwgc2lsZW50KSB7XG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZVxuXG4gIGlmIChwb3MgKyAxID49IG1heCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuXG4gIGlmIChjaCA9PT0gMHgyMyAvKiAjICovKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5tYXRjaChESUdJVEFMX1JFKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IG1hdGNoWzFdWzBdLnRvTG93ZXJDYXNlKCkgPT09ICd4JyA/IHBhcnNlSW50KG1hdGNoWzFdLnNsaWNlKDEpLCAxNikgOiBwYXJzZUludChtYXRjaFsxXSwgMTApXG5cbiAgICAgICAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ3RleHRfc3BlY2lhbCcsICcnLCAwKVxuICAgICAgICB0b2tlbi5jb250ZW50ID0gaXNWYWxpZEVudGl0eUNvZGUoY29kZSkgPyBmcm9tQ29kZVBvaW50KGNvZGUpIDogZnJvbUNvZGVQb2ludCgweEZGRkQpXG4gICAgICAgIHRva2VuLm1hcmt1cCAgPSBtYXRjaFswXVxuICAgICAgICB0b2tlbi5pbmZvICAgID0gJ2VudGl0eSdcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyArPSBtYXRjaFswXS5sZW5ndGhcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goTkFNRURfUkUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlSFRNTChtYXRjaFswXSlcbiAgICAgIGlmIChkZWNvZGVkICE9PSBtYXRjaFswXSkge1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcbiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gZGVjb2RlZFxuICAgICAgICAgIHRva2VuLm1hcmt1cCAgPSBtYXRjaFswXVxuICAgICAgICAgIHRva2VuLmluZm8gICAgPSAnZW50aXR5J1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnBvcyArPSBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8vIEZvciBlYWNoIG9wZW5pbmcgZW1waGFzaXMtbGlrZSBtYXJrZXIgZmluZCBhIG1hdGNoaW5nIGNsb3Npbmcgb25lXG4vL1xuXG5mdW5jdGlvbiBwcm9jZXNzRGVsaW1pdGVycyAoZGVsaW1pdGVycykge1xuICBjb25zdCBvcGVuZXJzQm90dG9tID0ge31cbiAgY29uc3QgbWF4ID0gZGVsaW1pdGVycy5sZW5ndGhcblxuICBpZiAoIW1heCkgcmV0dXJuXG5cbiAgLy8gaGVhZGVySWR4IGlzIHRoZSBmaXJzdCBkZWxpbWl0ZXIgb2YgdGhlIGN1cnJlbnQgKHdoZXJlIGNsb3NlciBpcykgZGVsaW1pdGVyIHJ1blxuICBsZXQgaGVhZGVySWR4ID0gMFxuICBsZXQgbGFzdFRva2VuSWR4ID0gLTIgLy8gbmVlZHMgYW55IHZhbHVlIGxvd2VyIHRoYW4gLTFcbiAgY29uc3QganVtcHMgPSBbXVxuXG4gIGZvciAobGV0IGNsb3NlcklkeCA9IDA7IGNsb3NlcklkeCA8IG1heDsgY2xvc2VySWR4KyspIHtcbiAgICBjb25zdCBjbG9zZXIgPSBkZWxpbWl0ZXJzW2Nsb3NlcklkeF1cblxuICAgIGp1bXBzLnB1c2goMClcblxuICAgIC8vIG1hcmtlcnMgYmVsb25nIHRvIHNhbWUgZGVsaW1pdGVyIHJ1biBpZjpcbiAgICAvLyAgLSB0aGV5IGhhdmUgYWRqYWNlbnQgdG9rZW5zXG4gICAgLy8gIC0gQU5EIG1hcmtlcnMgYXJlIHRoZSBzYW1lXG4gICAgLy9cbiAgICBpZiAoZGVsaW1pdGVyc1toZWFkZXJJZHhdLm1hcmtlciAhPT0gY2xvc2VyLm1hcmtlciB8fCBsYXN0VG9rZW5JZHggIT09IGNsb3Nlci50b2tlbiAtIDEpIHtcbiAgICAgIGhlYWRlcklkeCA9IGNsb3NlcklkeFxuICAgIH1cblxuICAgIGxhc3RUb2tlbklkeCA9IGNsb3Nlci50b2tlblxuXG4gICAgLy8gTGVuZ3RoIGlzIG9ubHkgdXNlZCBmb3IgZW1waGFzaXMtc3BlY2lmaWMgXCJydWxlIG9mIDNcIixcbiAgICAvLyBpZiBpdCdzIG5vdCBkZWZpbmVkIChpbiBzdHJpa2V0aHJvdWdoIG9yIDNyZCBwYXJ0eSBwbHVnaW5zKSxcbiAgICAvLyB3ZSBjYW4gZGVmYXVsdCBpdCB0byAwIHRvIGRpc2FibGUgdGhvc2UgY2hlY2tzLlxuICAgIC8vXG4gICAgY2xvc2VyLmxlbmd0aCA9IGNsb3Nlci5sZW5ndGggfHwgMFxuXG4gICAgaWYgKCFjbG9zZXIuY2xvc2UpIGNvbnRpbnVlXG5cbiAgICAvLyBQcmV2aW91c2x5IGNhbGN1bGF0ZWQgbG93ZXIgYm91bmRzIChwcmV2aW91cyBmYWlscylcbiAgICAvLyBmb3IgZWFjaCBtYXJrZXIsIGVhY2ggZGVsaW1pdGVyIGxlbmd0aCBtb2R1bG8gMyxcbiAgICAvLyBhbmQgZm9yIHdoZXRoZXIgdGhpcyBjbG9zZXIgY2FuIGJlIGFuIG9wZW5lcjtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29tbW9ubWFyay9jbWFyay9jb21taXQvMzQyNTBlMTJjY2ViZGM2MzcyYjhiNDljNDRmYWI1N2M3MjQ0MzQ2MFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbiAgICBpZiAoIW9wZW5lcnNCb3R0b20uaGFzT3duUHJvcGVydHkoY2xvc2VyLm1hcmtlcikpIHtcbiAgICAgIG9wZW5lcnNCb3R0b21bY2xvc2VyLm1hcmtlcl0gPSBbLTEsIC0xLCAtMSwgLTEsIC0xLCAtMV1cbiAgICB9XG5cbiAgICBjb25zdCBtaW5PcGVuZXJJZHggPSBvcGVuZXJzQm90dG9tW2Nsb3Nlci5tYXJrZXJdWyhjbG9zZXIub3BlbiA/IDMgOiAwKSArIChjbG9zZXIubGVuZ3RoICUgMyldXG5cbiAgICBsZXQgb3BlbmVySWR4ID0gaGVhZGVySWR4IC0ganVtcHNbaGVhZGVySWR4XSAtIDFcblxuICAgIGxldCBuZXdNaW5PcGVuZXJJZHggPSBvcGVuZXJJZHhcblxuICAgIGZvciAoOyBvcGVuZXJJZHggPiBtaW5PcGVuZXJJZHg7IG9wZW5lcklkeCAtPSBqdW1wc1tvcGVuZXJJZHhdICsgMSkge1xuICAgICAgY29uc3Qgb3BlbmVyID0gZGVsaW1pdGVyc1tvcGVuZXJJZHhdXG5cbiAgICAgIGlmIChvcGVuZXIubWFya2VyICE9PSBjbG9zZXIubWFya2VyKSBjb250aW51ZVxuXG4gICAgICBpZiAob3BlbmVyLm9wZW4gJiYgb3BlbmVyLmVuZCA8IDApIHtcbiAgICAgICAgbGV0IGlzT2RkTWF0Y2ggPSBmYWxzZVxuXG4gICAgICAgIC8vIGZyb20gc3BlYzpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgb25lIG9mIHRoZSBkZWxpbWl0ZXJzIGNhbiBib3RoIG9wZW4gYW5kIGNsb3NlIGVtcGhhc2lzLCB0aGVuIHRoZVxuICAgICAgICAvLyBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIGRlbGltaXRlciBydW5zIGNvbnRhaW5pbmcgdGhlIG9wZW5pbmcgYW5kXG4gICAgICAgIC8vIGNsb3NpbmcgZGVsaW1pdGVycyBtdXN0IG5vdCBiZSBhIG11bHRpcGxlIG9mIDMgdW5sZXNzIGJvdGggbGVuZ3Roc1xuICAgICAgICAvLyBhcmUgbXVsdGlwbGVzIG9mIDMuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChvcGVuZXIuY2xvc2UgfHwgY2xvc2VyLm9wZW4pIHtcbiAgICAgICAgICBpZiAoKG9wZW5lci5sZW5ndGggKyBjbG9zZXIubGVuZ3RoKSAlIDMgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChvcGVuZXIubGVuZ3RoICUgMyAhPT0gMCB8fCBjbG9zZXIubGVuZ3RoICUgMyAhPT0gMCkge1xuICAgICAgICAgICAgICBpc09kZE1hdGNoID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNPZGRNYXRjaCkge1xuICAgICAgICAgIC8vIElmIHByZXZpb3VzIGRlbGltaXRlciBjYW5ub3QgYmUgYW4gb3BlbmVyLCB3ZSBjYW4gc2FmZWx5IHNraXBcbiAgICAgICAgICAvLyB0aGUgZW50aXJlIHNlcXVlbmNlIGluIGZ1dHVyZSBjaGVja3MuIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZVxuICAgICAgICAgIC8vIHN1cmUgYWxnb3JpdGhtIGhhcyBsaW5lYXIgY29tcGxleGl0eSAoc2VlICpfKl8qXypfKl8uLi4gY2FzZSkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IG9wZW5lcklkeCA+IDAgJiYgIWRlbGltaXRlcnNbb3BlbmVySWR4IC0gMV0ub3BlblxuICAgICAgICAgICAgPyBqdW1wc1tvcGVuZXJJZHggLSAxXSArIDFcbiAgICAgICAgICAgIDogMFxuXG4gICAgICAgICAganVtcHNbY2xvc2VySWR4XSA9IGNsb3NlcklkeCAtIG9wZW5lcklkeCArIGxhc3RKdW1wXG4gICAgICAgICAganVtcHNbb3BlbmVySWR4XSA9IGxhc3RKdW1wXG5cbiAgICAgICAgICBjbG9zZXIub3BlbiAgPSBmYWxzZVxuICAgICAgICAgIG9wZW5lci5lbmQgICA9IGNsb3NlcklkeFxuICAgICAgICAgIG9wZW5lci5jbG9zZSA9IGZhbHNlXG4gICAgICAgICAgbmV3TWluT3BlbmVySWR4ID0gLTFcbiAgICAgICAgICAvLyB0cmVhdCBuZXh0IHRva2VuIGFzIHN0YXJ0IG9mIHJ1bixcbiAgICAgICAgICAvLyBpdCBvcHRpbWl6ZXMgc2tpcHMgaW4gKio8Li4uPioqYSoqPC4uLj4qKiBwYXRob2xvZ2ljYWwgY2FzZVxuICAgICAgICAgIGxhc3RUb2tlbklkeCA9IC0yXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXdNaW5PcGVuZXJJZHggIT09IC0xKSB7XG4gICAgICAvLyBJZiBtYXRjaCBmb3IgdGhpcyBkZWxpbWl0ZXIgcnVuIGZhaWxlZCwgd2Ugd2FudCB0byBzZXQgbG93ZXIgYm91bmQgZm9yXG4gICAgICAvLyBmdXR1cmUgbG9va3Vwcy4gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIHN1cmUgYWxnb3JpdGhtIGhhcyBsaW5lYXJcbiAgICAgIC8vIGNvbXBsZXhpdHkuXG4gICAgICAvL1xuICAgICAgLy8gU2VlIGRldGFpbHMgaGVyZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21tb25tYXJrL2NtYXJrL2lzc3Vlcy8xNzgjaXNzdWVjb21tZW50LTI3MDQxNzQ0MlxuICAgICAgLy9cbiAgICAgIG9wZW5lcnNCb3R0b21bY2xvc2VyLm1hcmtlcl1bKGNsb3Nlci5vcGVuID8gMyA6IDApICsgKChjbG9zZXIubGVuZ3RoIHx8IDApICUgMyldID0gbmV3TWluT3BlbmVySWR4XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmtfcGFpcnMgKHN0YXRlKSB7XG4gIGNvbnN0IHRva2Vuc19tZXRhID0gc3RhdGUudG9rZW5zX21ldGFcbiAgY29uc3QgbWF4ID0gc3RhdGUudG9rZW5zX21ldGEubGVuZ3RoXG5cbiAgcHJvY2Vzc0RlbGltaXRlcnMoc3RhdGUuZGVsaW1pdGVycylcblxuICBmb3IgKGxldCBjdXJyID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgaWYgKHRva2Vuc19tZXRhW2N1cnJdICYmIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpIHtcbiAgICAgIHByb2Nlc3NEZWxpbWl0ZXJzKHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpXG4gICAgfVxuICB9XG59XG4iLCIvKiogaW50ZXJuYWxcbiAqIGNsYXNzIFBhcnNlcklubGluZVxuICpcbiAqIFRva2VuaXplcyBwYXJhZ3JhcGggY29udGVudC5cbiAqKi9cblxuaW1wb3J0IFJ1bGVyIGZyb20gJy4vcnVsZXIubWpzJ1xuaW1wb3J0IFN0YXRlSW5saW5lIGZyb20gJy4vcnVsZXNfaW5saW5lL3N0YXRlX2lubGluZS5tanMnXG5cbmltcG9ydCByX3RleHQgZnJvbSAnLi9ydWxlc19pbmxpbmUvdGV4dC5tanMnXG5pbXBvcnQgcl9saW5raWZ5IGZyb20gJy4vcnVsZXNfaW5saW5lL2xpbmtpZnkubWpzJ1xuaW1wb3J0IHJfbmV3bGluZSBmcm9tICcuL3J1bGVzX2lubGluZS9uZXdsaW5lLm1qcydcbmltcG9ydCByX2VzY2FwZSBmcm9tICcuL3J1bGVzX2lubGluZS9lc2NhcGUubWpzJ1xuaW1wb3J0IHJfYmFja3RpY2tzIGZyb20gJy4vcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5tanMnXG5pbXBvcnQgcl9zdHJpa2V0aHJvdWdoIGZyb20gJy4vcnVsZXNfaW5saW5lL3N0cmlrZXRocm91Z2gubWpzJ1xuaW1wb3J0IHJfZW1waGFzaXMgZnJvbSAnLi9ydWxlc19pbmxpbmUvZW1waGFzaXMubWpzJ1xuaW1wb3J0IHJfbGluayBmcm9tICcuL3J1bGVzX2lubGluZS9saW5rLm1qcydcbmltcG9ydCByX2ltYWdlIGZyb20gJy4vcnVsZXNfaW5saW5lL2ltYWdlLm1qcydcbmltcG9ydCByX2F1dG9saW5rIGZyb20gJy4vcnVsZXNfaW5saW5lL2F1dG9saW5rLm1qcydcbmltcG9ydCByX2h0bWxfaW5saW5lIGZyb20gJy4vcnVsZXNfaW5saW5lL2h0bWxfaW5saW5lLm1qcydcbmltcG9ydCByX2VudGl0eSBmcm9tICcuL3J1bGVzX2lubGluZS9lbnRpdHkubWpzJ1xuXG5pbXBvcnQgcl9iYWxhbmNlX3BhaXJzIGZyb20gJy4vcnVsZXNfaW5saW5lL2JhbGFuY2VfcGFpcnMubWpzJ1xuaW1wb3J0IHJfZnJhZ21lbnRzX2pvaW4gZnJvbSAnLi9ydWxlc19pbmxpbmUvZnJhZ21lbnRzX2pvaW4ubWpzJ1xuXG4vLyBQYXJzZXIgcnVsZXNcblxuY29uc3QgX3J1bGVzID0gW1xuICBbJ3RleHQnLCAgICAgICAgICAgIHJfdGV4dF0sXG4gIFsnbGlua2lmeScsICAgICAgICAgcl9saW5raWZ5XSxcbiAgWyduZXdsaW5lJywgICAgICAgICByX25ld2xpbmVdLFxuICBbJ2VzY2FwZScsICAgICAgICAgIHJfZXNjYXBlXSxcbiAgWydiYWNrdGlja3MnLCAgICAgICByX2JhY2t0aWNrc10sXG4gIFsnc3RyaWtldGhyb3VnaCcsICAgcl9zdHJpa2V0aHJvdWdoLnRva2VuaXplXSxcbiAgWydlbXBoYXNpcycsICAgICAgICByX2VtcGhhc2lzLnRva2VuaXplXSxcbiAgWydsaW5rJywgICAgICAgICAgICByX2xpbmtdLFxuICBbJ2ltYWdlJywgICAgICAgICAgIHJfaW1hZ2VdLFxuICBbJ2F1dG9saW5rJywgICAgICAgIHJfYXV0b2xpbmtdLFxuICBbJ2h0bWxfaW5saW5lJywgICAgIHJfaHRtbF9pbmxpbmVdLFxuICBbJ2VudGl0eScsICAgICAgICAgIHJfZW50aXR5XVxuXVxuXG4vLyBgcnVsZTJgIHJ1bGVzZXQgd2FzIGNyZWF0ZWQgc3BlY2lmaWNhbGx5IGZvciBlbXBoYXNpcy9zdHJpa2V0aHJvdWdoXG4vLyBwb3N0LXByb2Nlc3NpbmcgYW5kIG1heSBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gRG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nIGV4Y2VwdCBwYWlycyAocGx1Z2lucyB3b3JraW5nIHdpdGggYGJhbGFuY2VfcGFpcnNgKS5cbi8vXG5jb25zdCBfcnVsZXMyID0gW1xuICBbJ2JhbGFuY2VfcGFpcnMnLCAgIHJfYmFsYW5jZV9wYWlyc10sXG4gIFsnc3RyaWtldGhyb3VnaCcsICAgcl9zdHJpa2V0aHJvdWdoLnBvc3RQcm9jZXNzXSxcbiAgWydlbXBoYXNpcycsICAgICAgICByX2VtcGhhc2lzLnBvc3RQcm9jZXNzXSxcbiAgLy8gcnVsZXMgZm9yIHBhaXJzIHNlcGFyYXRlICcqKicgaW50byBpdHMgb3duIHRleHQgdG9rZW5zLCB3aGljaCBtYXkgYmUgbGVmdCB1bnVzZWQsXG4gIC8vIHJ1bGUgYmVsb3cgbWVyZ2VzIHVudXNlZCBzZWdtZW50cyBiYWNrIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRleHRcbiAgWydmcmFnbWVudHNfam9pbicsICByX2ZyYWdtZW50c19qb2luXVxuXVxuXG4vKipcbiAqIG5ldyBQYXJzZXJJbmxpbmUoKVxuICoqL1xuZnVuY3Rpb24gUGFyc2VySW5saW5lICgpIHtcbiAgLyoqXG4gICAqIFBhcnNlcklubGluZSNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBpbmxpbmUgcnVsZXMuXG4gICAqKi9cbiAgdGhpcy5ydWxlciA9IG5ldyBSdWxlcigpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0pXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VySW5saW5lI3J1bGVyMiAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIFNlY29uZCBydWxlciB1c2VkIGZvciBwb3N0LXByb2Nlc3NpbmdcbiAgICogKGUuZy4gaW4gZW1waGFzaXMtbGlrZSBydWxlcykuXG4gICAqKi9cbiAgdGhpcy5ydWxlcjIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzMi5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIyLnB1c2goX3J1bGVzMltpXVswXSwgX3J1bGVzMltpXVsxXSlcbiAgfVxufVxuXG4vLyBTa2lwIHNpbmdsZSB0b2tlbiBieSBydW5uaW5nIGFsbCBydWxlcyBpbiB2YWxpZGF0aW9uIG1vZGU7XG4vLyByZXR1cm5zIGB0cnVlYCBpZiBhbnkgcnVsZSByZXBvcnRlZCBzdWNjZXNzXG4vL1xuUGFyc2VySW5saW5lLnByb3RvdHlwZS5za2lwVG9rZW4gPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY29uc3QgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG4gIGNvbnN0IG1heE5lc3RpbmcgPSBzdGF0ZS5tZC5vcHRpb25zLm1heE5lc3RpbmdcbiAgY29uc3QgY2FjaGUgPSBzdGF0ZS5jYWNoZVxuXG4gIGlmICh0eXBlb2YgY2FjaGVbcG9zXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0ZS5wb3MgPSBjYWNoZVtwb3NdXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgb2sgPSBmYWxzZVxuXG4gIGlmIChzdGF0ZS5sZXZlbCA8IG1heE5lc3RpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAvLyBJbmNyZW1lbnQgc3RhdGUubGV2ZWwgYW5kIGRlY3JlbWVudCBpdCBsYXRlciB0byBsaW1pdCByZWN1cnNpb24uXG4gICAgICAvLyBJdCdzIGhhcm1sZXNzIHRvIGRvIGhlcmUsIGJlY2F1c2Ugbm8gdG9rZW5zIGFyZSBjcmVhdGVkLiBCdXQgaWRlYWxseSxcbiAgICAgIC8vIHdlJ2QgbmVlZCBhIHNlcGFyYXRlIHByaXZhdGUgc3RhdGUgdmFyaWFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgIC8vXG4gICAgICBzdGF0ZS5sZXZlbCsrXG4gICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCB0cnVlKVxuICAgICAgc3RhdGUubGV2ZWwtLVxuXG4gICAgICBpZiAob2spIHtcbiAgICAgICAgaWYgKHBvcyA+PSBzdGF0ZS5wb3MpIHsgdGhyb3cgbmV3IEVycm9yKFwiaW5saW5lIHJ1bGUgZGlkbid0IGluY3JlbWVudCBzdGF0ZS5wb3NcIikgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUb28gbXVjaCBuZXN0aW5nLCBqdXN0IHNraXAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLlxuICAgIC8vXG4gICAgLy8gTk9URTogdGhpcyB3aWxsIGNhdXNlIGxpbmtzIHRvIGJlaGF2ZSBpbmNvcnJlY3RseSBpbiB0aGUgZm9sbG93aW5nIGNhc2UsXG4gICAgLy8gICAgICAgd2hlbiBhbiBhbW91bnQgb2YgYFtgIGlzIGV4YWN0bHkgZXF1YWwgdG8gYG1heE5lc3RpbmcgKyAxYDpcbiAgICAvL1xuICAgIC8vICAgICAgIFtbW1tbW1tbW1tbW1tbW1tbW1tbW2Zvb10oKVxuICAgIC8vXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCB3aGVuIENNIHN0YW5kYXJkIHdpbGwgYWxsb3cgbmVzdGVkIGxpbmtzXG4gICAgLy8gICAgICAgKHdlIGNhbiByZXBsYWNlIGl0IGJ5IHByZXZlbnRpbmcgbGlua3MgZnJvbSBiZWluZyBwYXJzZWQgaW5cbiAgICAvLyAgICAgICB2YWxpZGF0aW9uIG1vZGUpXG4gICAgLy9cbiAgICBzdGF0ZS5wb3MgPSBzdGF0ZS5wb3NNYXhcbiAgfVxuXG4gIGlmICghb2spIHsgc3RhdGUucG9zKysgfVxuICBjYWNoZVtwb3NdID0gc3RhdGUucG9zXG59XG5cbi8vIEdlbmVyYXRlIHRva2VucyBmb3IgaW5wdXQgcmFuZ2Vcbi8vXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG4gIGNvbnN0IGVuZCA9IHN0YXRlLnBvc01heFxuICBjb25zdCBtYXhOZXN0aW5nID0gc3RhdGUubWQub3B0aW9ucy5tYXhOZXN0aW5nXG5cbiAgd2hpbGUgKHN0YXRlLnBvcyA8IGVuZCkge1xuICAgIC8vIFRyeSBhbGwgcG9zc2libGUgcnVsZXMuXG4gICAgLy8gT24gc3VjY2VzcywgcnVsZSBzaG91bGQ6XG4gICAgLy9cbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUucG9zYFxuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS50b2tlbnNgXG4gICAgLy8gLSByZXR1cm4gdHJ1ZVxuICAgIGNvbnN0IHByZXZQb3MgPSBzdGF0ZS5wb3NcbiAgICBsZXQgb2sgPSBmYWxzZVxuXG4gICAgaWYgKHN0YXRlLmxldmVsIDwgbWF4TmVzdGluZykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCBmYWxzZSlcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgaWYgKHByZXZQb3MgPj0gc3RhdGUucG9zKSB7IHRocm93IG5ldyBFcnJvcihcImlubGluZSBydWxlIGRpZG4ndCBpbmNyZW1lbnQgc3RhdGUucG9zXCIpIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9rKSB7XG4gICAgICBpZiAoc3RhdGUucG9zID49IGVuZCkgeyBicmVhayB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjW3N0YXRlLnBvcysrXVxuICB9XG5cbiAgaWYgKHN0YXRlLnBlbmRpbmcpIHtcbiAgICBzdGF0ZS5wdXNoUGVuZGluZygpXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXJJbmxpbmUucGFyc2Uoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG4gKlxuICogUHJvY2VzcyBpbnB1dCBzdHJpbmcgYW5kIHB1c2ggaW5saW5lIHRva2VucyBpbnRvIGBvdXRUb2tlbnNgXG4gKiovXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgbWQsIGVudiwgb3V0VG9rZW5zKSB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuU3RhdGUoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG5cbiAgdGhpcy50b2tlbml6ZShzdGF0ZSlcblxuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcnVsZXNbaV0oc3RhdGUpXG4gIH1cbn1cblxuUGFyc2VySW5saW5lLnByb3RvdHlwZS5TdGF0ZSA9IFN0YXRlSW5saW5lXG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcklubGluZVxuIiwiLy8gUHJvY2Vlc3MgJ1xcbidcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5ld2xpbmUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDBBLyogXFxuICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgcG1heCA9IHN0YXRlLnBlbmRpbmcubGVuZ3RoIC0gMVxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICAvLyAnICBcXG4nIC0+IGhhcmRicmVha1xuICAvLyBMb29rdXAgaW4gcGVuZGluZyBjaGFycyBpcyBiYWQgcHJhY3RpY2UhIERvbid0IGNvcHkgdG8gb3RoZXIgcnVsZXMhXG4gIC8vIFBlbmRpbmcgc3RyaW5nIGlzIHN0b3JlZCBpbiBjb25jYXQgbW9kZSwgaW5kZXhlZCBsb29rdXBzIHdpbGwgY2F1c2VcbiAgLy8gY29udmVydGlvbiB0byBmbGF0IG1vZGUuXG4gIGlmICghc2lsZW50KSB7XG4gICAgaWYgKHBtYXggPj0gMCAmJiBzdGF0ZS5wZW5kaW5nLmNoYXJDb2RlQXQocG1heCkgPT09IDB4MjApIHtcbiAgICAgIGlmIChwbWF4ID49IDEgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHBtYXggLSAxKSA9PT0gMHgyMCkge1xuICAgICAgICAvLyBGaW5kIHdoaXRlc3BhY2VzIHRhaWwgb2YgcGVuZGluZyBjaGFycy5cbiAgICAgICAgbGV0IHdzID0gcG1heCAtIDFcbiAgICAgICAgd2hpbGUgKHdzID49IDEgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHdzIC0gMSkgPT09IDB4MjApIHdzLS1cblxuICAgICAgICBzdGF0ZS5wZW5kaW5nID0gc3RhdGUucGVuZGluZy5zbGljZSgwLCB3cylcbiAgICAgICAgc3RhdGUucHVzaCgnaGFyZGJyZWFrJywgJ2JyJywgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nLnNsaWNlKDAsIC0xKVxuICAgICAgICBzdGF0ZS5wdXNoKCdzb2Z0YnJlYWsnLCAnYnInLCAwKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wdXNoKCdzb2Z0YnJlYWsnLCAnYnInLCAwKVxuICAgIH1cbiAgfVxuXG4gIHBvcysrXG5cbiAgLy8gc2tpcCBoZWFkaW5nIHNwYWNlcyBmb3IgbmV4dCBsaW5lXG4gIHdoaWxlIChwb3MgPCBtYXggJiYgaXNTcGFjZShzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpKSkgeyBwb3MrKyB9XG5cbiAgc3RhdGUucG9zID0gcG9zXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQYXJzZSBiYWNrdGlja3NcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmFja3RpY2sgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAoY2ggIT09IDB4NjAvKiBgICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc3RhcnQgPSBwb3NcbiAgcG9zKytcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgLy8gc2NhbiBtYXJrZXIgbGVuZ3RoXG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg2MC8qIGAgKi8pIHsgcG9zKysgfVxuXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKVxuICBjb25zdCBvcGVuZXJMZW5ndGggPSBtYXJrZXIubGVuZ3RoXG5cbiAgaWYgKHN0YXRlLmJhY2t0aWNrc1NjYW5uZWQgJiYgKHN0YXRlLmJhY2t0aWNrc1tvcGVuZXJMZW5ndGhdIHx8IDApIDw9IHN0YXJ0KSB7XG4gICAgaWYgKCFzaWxlbnQpIHN0YXRlLnBlbmRpbmcgKz0gbWFya2VyXG4gICAgc3RhdGUucG9zICs9IG9wZW5lckxlbmd0aFxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBsZXQgbWF0Y2hFbmQgPSBwb3NcbiAgbGV0IG1hdGNoU3RhcnRcblxuICAvLyBOb3RoaW5nIGZvdW5kIGluIHRoZSBjYWNoZSwgc2NhbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIChvciB1bnRpbCBtYXJrZXIgaXMgZm91bmQpXG4gIHdoaWxlICgobWF0Y2hTdGFydCA9IHN0YXRlLnNyYy5pbmRleE9mKCdgJywgbWF0Y2hFbmQpKSAhPT0gLTEpIHtcbiAgICBtYXRjaEVuZCA9IG1hdGNoU3RhcnQgKyAxXG5cbiAgICAvLyBzY2FuIG1hcmtlciBsZW5ndGhcbiAgICB3aGlsZSAobWF0Y2hFbmQgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQobWF0Y2hFbmQpID09PSAweDYwLyogYCAqLykgeyBtYXRjaEVuZCsrIH1cblxuICAgIGNvbnN0IGNsb3Nlckxlbmd0aCA9IG1hdGNoRW5kIC0gbWF0Y2hTdGFydFxuXG4gICAgaWYgKGNsb3Nlckxlbmd0aCA9PT0gb3BlbmVyTGVuZ3RoKSB7XG4gICAgICAvLyBGb3VuZCBtYXRjaGluZyBjbG9zZXIgbGVuZ3RoLlxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCdjb2RlX2lubGluZScsICdjb2RlJywgMClcbiAgICAgICAgdG9rZW4ubWFya3VwID0gbWFya2VyXG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXRjaFN0YXJ0KVxuICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgICAgICAgIC5yZXBsYWNlKC9eICguKykgJC8sICckMScpXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBtYXRjaEVuZFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBTb21lIGRpZmZlcmVudCBsZW5ndGggZm91bmQsIHB1dCBpdCBpbiBjYWNoZSBhcyB1cHBlciBsaW1pdCBvZiB3aGVyZSBjbG9zZXIgY2FuIGJlIGZvdW5kXG4gICAgc3RhdGUuYmFja3RpY2tzW2Nsb3Nlckxlbmd0aF0gPSBtYXRjaFN0YXJ0XG4gIH1cblxuICAvLyBTY2FubmVkIHRocm91Z2ggdGhlIGVuZCwgZGlkbid0IGZpbmQgYW55dGhpbmdcbiAgc3RhdGUuYmFja3RpY2tzU2Nhbm5lZCA9IHRydWVcblxuICBpZiAoIXNpbGVudCkgc3RhdGUucGVuZGluZyArPSBtYXJrZXJcbiAgc3RhdGUucG9zICs9IG9wZW5lckxlbmd0aFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUHJvY2VzcyBbbGlua10oPHRvPiBcInN0dWZmXCIpXG5cbmltcG9ydCB7IG5vcm1hbGl6ZVJlZmVyZW5jZSwgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmsgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IGNvZGUsIGxhYmVsLCByZXMsIHJlZlxuICBsZXQgaHJlZiA9ICcnXG4gIGxldCB0aXRsZSA9ICcnXG4gIGxldCBzdGFydCA9IHN0YXRlLnBvc1xuICBsZXQgcGFyc2VSZWZlcmVuY2UgPSB0cnVlXG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcykgIT09IDB4NUIvKiBbICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgb2xkUG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuICBjb25zdCBsYWJlbFN0YXJ0ID0gc3RhdGUucG9zICsgMVxuICBjb25zdCBsYWJlbEVuZCA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHN0YXRlLnBvcywgdHJ1ZSlcblxuICAvLyBwYXJzZXIgZmFpbGVkIHRvIGZpbmQgJ10nLCBzbyBpdCdzIG5vdCBhIHZhbGlkIGxpbmtcbiAgaWYgKGxhYmVsRW5kIDwgMCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBwb3MgPSBsYWJlbEVuZCArIDFcbiAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDI4LyogKCAqLykge1xuICAgIC8vXG4gICAgLy8gSW5saW5lIGxpbmtcbiAgICAvL1xuXG4gICAgLy8gbWlnaHQgaGF2ZSBmb3VuZCBhIHZhbGlkIHNob3J0Y3V0IGxpbmssIGRpc2FibGUgcmVmZXJlbmNlIHBhcnNpbmdcbiAgICBwYXJzZVJlZmVyZW5jZSA9IGZhbHNlXG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICBwb3MrK1xuICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgIH1cbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICBeXl5eXl4gcGFyc2luZyBsaW5rIGRlc3RpbmF0aW9uXG4gICAgc3RhcnQgPSBwb3NcbiAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0Rlc3RpbmF0aW9uKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgaHJlZiA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsocmVzLnN0cilcbiAgICAgIGlmIChzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoaHJlZikpIHtcbiAgICAgICAgcG9zID0gcmVzLnBvc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHJlZiA9ICcnXG4gICAgICB9XG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICAgIHN0YXJ0ID0gcG9zXG4gICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICB9XG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIF5eXl5eXl4gcGFyc2luZyBsaW5rIHRpdGxlXG4gICAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua1RpdGxlKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXJ0ICE9PSBwb3MgJiYgcmVzLm9rKSB7XG4gICAgICAgIHRpdGxlID0gcmVzLnN0clxuICAgICAgICBwb3MgPSByZXMucG9zXG5cbiAgICAgICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zID49IG1heCB8fCBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDI5LyogKSAqLykge1xuICAgICAgLy8gcGFyc2luZyBhIHZhbGlkIHNob3J0Y3V0IGxpbmsgZmFpbGVkLCBmYWxsYmFjayB0byByZWZlcmVuY2VcbiAgICAgIHBhcnNlUmVmZXJlbmNlID0gdHJ1ZVxuICAgIH1cbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHBhcnNlUmVmZXJlbmNlKSB7XG4gICAgLy9cbiAgICAvLyBMaW5rIHJlZmVyZW5jZVxuICAgIC8vXG4gICAgaWYgKHR5cGVvZiBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICAgIHN0YXJ0ID0gcG9zICsgMVxuICAgICAgcG9zID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtMYWJlbChzdGF0ZSwgcG9zKVxuICAgICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAgIGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MrKylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcyA9IGxhYmVsRW5kICsgMVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICB9XG5cbiAgICAvLyBjb3ZlcnMgbGFiZWwgPT09ICcnIGFuZCBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgLy8gKGNvbGxhcHNlZCByZWZlcmVuY2UgbGluayBhbmQgc2hvcnRjdXQgcmVmZXJlbmNlIGxpbmsgcmVzcGVjdGl2ZWx5KVxuICAgIGlmICghbGFiZWwpIHsgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2UobGFiZWxTdGFydCwgbGFiZWxFbmQpIH1cblxuICAgIHJlZiA9IHN0YXRlLmVudi5yZWZlcmVuY2VzW25vcm1hbGl6ZVJlZmVyZW5jZShsYWJlbCldXG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGhyZWYgPSByZWYuaHJlZlxuICAgIHRpdGxlID0gcmVmLnRpdGxlXG4gIH1cblxuICAvL1xuICAvLyBXZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSBsaW5rLCBhbmQga25vdyBmb3IgYSBmYWN0IGl0J3MgYSB2YWxpZCBsaW5rO1xuICAvLyBzbyBhbGwgdGhhdCdzIGxlZnQgdG8gZG8gaXMgdG8gY2FsbCB0b2tlbml6ZXIuXG4gIC8vXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucG9zID0gbGFiZWxTdGFydFxuICAgIHN0YXRlLnBvc01heCA9IGxhYmVsRW5kXG5cbiAgICBjb25zdCB0b2tlbl9vID0gc3RhdGUucHVzaCgnbGlua19vcGVuJywgJ2EnLCAxKVxuICAgIGNvbnN0IGF0dHJzID0gW1snaHJlZicsIGhyZWZdXVxuICAgIHRva2VuX28uYXR0cnMgID0gYXR0cnNcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGF0dHJzLnB1c2goWyd0aXRsZScsIHRpdGxlXSlcbiAgICB9XG5cbiAgICBzdGF0ZS5saW5rTGV2ZWwrK1xuICAgIHN0YXRlLm1kLmlubGluZS50b2tlbml6ZShzdGF0ZSlcbiAgICBzdGF0ZS5saW5rTGV2ZWwtLVxuXG4gICAgc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcbiAgc3RhdGUucG9zTWF4ID0gbWF4XG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZXNzICFbaW1hZ2VdKDxzcmM+IFwidGl0bGVcIilcblxuaW1wb3J0IHsgbm9ybWFsaXplUmVmZXJlbmNlLCBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW1hZ2UgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IGNvZGUsIGNvbnRlbnQsIGxhYmVsLCBwb3MsIHJlZiwgcmVzLCB0aXRsZSwgc3RhcnRcbiAgbGV0IGhyZWYgPSAnJ1xuICBjb25zdCBvbGRQb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcykgIT09IDB4MjEvKiAhICovKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgKyAxKSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBsYWJlbFN0YXJ0ID0gc3RhdGUucG9zICsgMlxuICBjb25zdCBsYWJlbEVuZCA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHN0YXRlLnBvcyArIDEsIGZhbHNlKVxuXG4gIC8vIHBhcnNlciBmYWlsZWQgdG8gZmluZCAnXScsIHNvIGl0J3Mgbm90IGEgdmFsaWQgbGlua1xuICBpZiAobGFiZWxFbmQgPCAwKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgcG9zID0gbGFiZWxFbmQgKyAxXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyOC8qICggKi8pIHtcbiAgICAvL1xuICAgIC8vIElubGluZSBsaW5rXG4gICAgLy9cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgIHBvcysrXG4gICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgfVxuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgIF5eXl5eXiBwYXJzaW5nIGxpbmsgZGVzdGluYXRpb25cbiAgICBzdGFydCA9IHBvc1xuICAgIHJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rRGVzdGluYXRpb24oc3RhdGUuc3JjLCBwb3MsIHN0YXRlLnBvc01heClcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBocmVmID0gc3RhdGUubWQubm9ybWFsaXplTGluayhyZXMuc3RyKVxuICAgICAgaWYgKHN0YXRlLm1kLnZhbGlkYXRlTGluayhocmVmKSkge1xuICAgICAgICBwb3MgPSByZXMucG9zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBocmVmID0gJydcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgIHN0YXJ0ID0gcG9zXG4gICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICAgICAgICAgIF5eXl5eXl4gcGFyc2luZyBsaW5rIHRpdGxlXG4gICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhcnQgIT09IHBvcyAmJiByZXMub2spIHtcbiAgICAgIHRpdGxlID0gcmVzLnN0clxuICAgICAgcG9zID0gcmVzLnBvc1xuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gJydcbiAgICB9XG5cbiAgICBpZiAocG9zID49IG1heCB8fCBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDI5LyogKSAqLykge1xuICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcG9zKytcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vIExpbmsgcmVmZXJlbmNlXG4gICAgLy9cbiAgICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDVCLyogWyAqLykge1xuICAgICAgc3RhcnQgPSBwb3MgKyAxXG4gICAgICBwb3MgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0xhYmVsKHN0YXRlLCBwb3MpXG4gICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zID0gbGFiZWxFbmQgKyAxXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcyA9IGxhYmVsRW5kICsgMVxuICAgIH1cblxuICAgIC8vIGNvdmVycyBsYWJlbCA9PT0gJycgYW5kIGxhYmVsID09PSB1bmRlZmluZWRcbiAgICAvLyAoY29sbGFwc2VkIHJlZmVyZW5jZSBsaW5rIGFuZCBzaG9ydGN1dCByZWZlcmVuY2UgbGluayByZXNwZWN0aXZlbHkpXG4gICAgaWYgKCFsYWJlbCkgeyBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShsYWJlbFN0YXJ0LCBsYWJlbEVuZCkgfVxuXG4gICAgcmVmID0gc3RhdGUuZW52LnJlZmVyZW5jZXNbbm9ybWFsaXplUmVmZXJlbmNlKGxhYmVsKV1cbiAgICBpZiAoIXJlZikge1xuICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaHJlZiA9IHJlZi5ocmVmXG4gICAgdGl0bGUgPSByZWYudGl0bGVcbiAgfVxuXG4gIC8vXG4gIC8vIFdlIGZvdW5kIHRoZSBlbmQgb2YgdGhlIGxpbmssIGFuZCBrbm93IGZvciBhIGZhY3QgaXQncyBhIHZhbGlkIGxpbms7XG4gIC8vIHNvIGFsbCB0aGF0J3MgbGVmdCB0byBkbyBpcyB0byBjYWxsIHRva2VuaXplci5cbiAgLy9cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBjb250ZW50ID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKVxuXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBzdGF0ZS5tZC5pbmxpbmUucGFyc2UoXG4gICAgICBjb250ZW50LFxuICAgICAgc3RhdGUubWQsXG4gICAgICBzdGF0ZS5lbnYsXG4gICAgICB0b2tlbnNcbiAgICApXG5cbiAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ2ltYWdlJywgJ2ltZycsIDApXG4gICAgY29uc3QgYXR0cnMgPSBbWydzcmMnLCBocmVmXSwgWydhbHQnLCAnJ11dXG4gICAgdG9rZW4uYXR0cnMgPSBhdHRyc1xuICAgIHRva2VuLmNoaWxkcmVuID0gdG9rZW5zXG4gICAgdG9rZW4uY29udGVudCA9IGNvbnRlbnRcblxuICAgIGlmICh0aXRsZSkge1xuICAgICAgYXR0cnMucHVzaChbJ3RpdGxlJywgdGl0bGVdKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHBvc1xuICBzdGF0ZS5wb3NNYXggPSBtYXhcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFByb2Nlc3MgaHRtbCB0YWdzXG5cbmltcG9ydCB7IEhUTUxfVEFHX1JFIH0gZnJvbSAnLi4vY29tbW9uL2h0bWxfcmUubWpzJ1xuXG5mdW5jdGlvbiBpc0xpbmtPcGVuIChzdHIpIHtcbiAgcmV0dXJuIC9ePGFbPlxcc10vaS50ZXN0KHN0cilcbn1cbmZ1bmN0aW9uIGlzTGlua0Nsb3NlIChzdHIpIHtcbiAgcmV0dXJuIC9ePFxcL2FcXHMqPi9pLnRlc3Qoc3RyKVxufVxuXG5mdW5jdGlvbiBpc0xldHRlciAoY2gpIHtcbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6MCAqL1xuICBjb25zdCBsYyA9IGNoIHwgMHgyMCAvLyB0byBsb3dlciBjYXNlXG4gIHJldHVybiAobGMgPj0gMHg2MS8qIGEgKi8pICYmIChsYyA8PSAweDdhLyogeiAqLylcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHRtbF9pbmxpbmUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLmh0bWwpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBDaGVjayBzdGFydFxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3QgcG9zID0gc3RhdGUucG9zXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLyB8fFxuICAgICAgcG9zICsgMiA+PSBtYXgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFF1aWNrIGZhaWwgb24gc2Vjb25kIGNoYXJcbiAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovICYmXG4gICAgICBjaCAhPT0gMHgzRi8qID8gKi8gJiZcbiAgICAgIGNoICE9PSAweDJGLyogLyAqLyAmJlxuICAgICAgIWlzTGV0dGVyKGNoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5tYXRjaChIVE1MX1RBR19SRSlcbiAgaWYgKCFtYXRjaCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCdodG1sX2lubGluZScsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgPSBtYXRjaFswXVxuXG4gICAgaWYgKGlzTGlua09wZW4odG9rZW4uY29udGVudCkpICBzdGF0ZS5saW5rTGV2ZWwrK1xuICAgIGlmIChpc0xpbmtDbG9zZSh0b2tlbi5jb250ZW50KSkgc3RhdGUubGlua0xldmVsLS1cbiAgfVxuICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBDbGVhbiB1cCB0b2tlbnMgYWZ0ZXIgZW1waGFzaXMgYW5kIHN0cmlrZXRocm91Z2ggcG9zdHByb2Nlc3Npbmc6XG4vLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzIGludG8gb25lIGFuZCByZS1jYWxjdWxhdGUgYWxsIHRva2VuIGxldmVsc1xuLy9cbi8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaW5pdGlhbGx5IGVtcGhhc2lzIGRlbGltaXRlciBtYXJrZXJzICgqLCBfLCB+KVxuLy8gYXJlIHRyZWF0ZWQgYXMgdGhlaXIgb3duIHNlcGFyYXRlIHRleHQgdG9rZW5zLiBUaGVuIGVtcGhhc2lzIHJ1bGUgZWl0aGVyXG4vLyBsZWF2ZXMgdGhlbSBhcyB0ZXh0IChuZWVkZWQgdG8gbWVyZ2Ugd2l0aCBhZGphY2VudCB0ZXh0KSBvciB0dXJucyB0aGVtXG4vLyBpbnRvIG9wZW5pbmcvY2xvc2luZyB0YWdzICh3aGljaCBtZXNzZXMgdXAgbGV2ZWxzIGluc2lkZSkuXG4vL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmcmFnbWVudHNfam9pbiAoc3RhdGUpIHtcbiAgbGV0IGN1cnIsIGxhc3RcbiAgbGV0IGxldmVsID0gMFxuICBjb25zdCB0b2tlbnMgPSBzdGF0ZS50b2tlbnNcbiAgY29uc3QgbWF4ID0gc3RhdGUudG9rZW5zLmxlbmd0aFxuXG4gIGZvciAoY3VyciA9IGxhc3QgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICAvLyByZS1jYWxjdWxhdGUgbGV2ZWxzIGFmdGVyIGVtcGhhc2lzL3N0cmlrZXRocm91Z2ggdHVybnMgc29tZSB0ZXh0IG5vZGVzXG4gICAgLy8gaW50byBvcGVuaW5nL2Nsb3NpbmcgdGFnc1xuICAgIGlmICh0b2tlbnNbY3Vycl0ubmVzdGluZyA8IDApIGxldmVsLS0gLy8gY2xvc2luZyB0YWdcbiAgICB0b2tlbnNbY3Vycl0ubGV2ZWwgPSBsZXZlbFxuICAgIGlmICh0b2tlbnNbY3Vycl0ubmVzdGluZyA+IDApIGxldmVsKysgLy8gb3BlbmluZyB0YWdcblxuICAgIGlmICh0b2tlbnNbY3Vycl0udHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgIGN1cnIgKyAxIDwgbWF4ICYmXG4gICAgICAgIHRva2Vuc1tjdXJyICsgMV0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAvLyBjb2xsYXBzZSB0d28gYWRqYWNlbnQgdGV4dCBub2Rlc1xuICAgICAgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50ID0gdG9rZW5zW2N1cnJdLmNvbnRlbnQgKyB0b2tlbnNbY3VyciArIDFdLmNvbnRlbnRcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnIgIT09IGxhc3QpIHsgdG9rZW5zW2xhc3RdID0gdG9rZW5zW2N1cnJdIH1cblxuICAgICAgbGFzdCsrXG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnIgIT09IGxhc3QpIHtcbiAgICB0b2tlbnMubGVuZ3RoID0gbGFzdFxuICB9XG59XG4iLCJpbXBvcnQgcmVGYWN0b3J5IGZyb20gJy4vbGliL3JlLm1qcydcblxuLy9cbi8vIEhlbHBlcnNcbi8vXG5cbi8vIE1lcmdlIG9iamVjdHNcbi8vXG5mdW5jdGlvbiBhc3NpZ24gKG9iaiAvKiBmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4gKi8pIHtcbiAgY29uc3Qgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcblxuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGlmICghc291cmNlKSB7IHJldHVybiB9XG5cbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBfY2xhc3MgKG9iaikgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgfVxuZnVuY3Rpb24gaXNTdHJpbmcgKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nIH1cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBPYmplY3RdJyB9XG5mdW5jdGlvbiBpc1JlZ0V4cCAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgfVxuZnVuY3Rpb24gaXNGdW5jdGlvbiAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB9XG5cbmZ1bmN0aW9uIGVzY2FwZVJFIChzdHIpIHsgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLj8qK14kW1xcXVxcXFwoKXt9fC1dL2csICdcXFxcJCYnKSB9XG5cbi8vXG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBmdXp6eUxpbms6IHRydWUsXG4gIGZ1enp5RW1haWw6IHRydWUsXG4gIGZ1enp5SVA6IGZhbHNlXG59XG5cbmZ1bmN0aW9uIGlzT3B0aW9uc09iaiAob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmogfHwge30pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xuICAgIHJldHVybiBhY2MgfHwgZGVmYXVsdE9wdGlvbnMuaGFzT3duUHJvcGVydHkoaylcbiAgfSwgZmFsc2UpXG59XG5cbmNvbnN0IGRlZmF1bHRTY2hlbWFzID0ge1xuICAnaHR0cDonOiB7XG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICh0ZXh0LCBwb3MsIHNlbGYpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgICAgaWYgKCFzZWxmLnJlLmh0dHApIHtcbiAgICAgICAgLy8gY29tcGlsZSBsYXppbHksIGJlY2F1c2UgXCJob3N0XCItY29udGFpbmluZyB2YXJpYWJsZXMgY2FuIGNoYW5nZSBvbiB0bGRzIHVwZGF0ZS5cbiAgICAgICAgc2VsZi5yZS5odHRwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAnXlxcXFwvXFxcXC8nICsgc2VsZi5yZS5zcmNfYXV0aCArIHNlbGYucmUuc3JjX2hvc3RfcG9ydF9zdHJpY3QgKyBzZWxmLnJlLnNyY19wYXRoLCAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHNlbGYucmUuaHR0cC50ZXN0KHRhaWwpKSB7XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUuaHR0cClbMF0ubGVuZ3RoXG4gICAgICB9XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfSxcbiAgJ2h0dHBzOic6ICdodHRwOicsXG4gICdmdHA6JzogJ2h0dHA6JyxcbiAgJy8vJzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5ub19odHRwKSB7XG4gICAgICAvLyBjb21waWxlIGxhemlseSwgYmVjYXVzZSBcImhvc3RcIi1jb250YWluaW5nIHZhcmlhYmxlcyBjYW4gY2hhbmdlIG9uIHRsZHMgdXBkYXRlLlxuICAgICAgICBzZWxmLnJlLm5vX2h0dHAgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICdeJyArXG4gICAgICAgICAgc2VsZi5yZS5zcmNfYXV0aCArXG4gICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgc2luZ2xlLWxldmVsIGRvbWFpbnMsIGJlY2F1c2Ugb2YgZmFsc2UgcG9zaXRpdmVzIGxpa2UgJy8vdGVzdCdcbiAgICAgICAgICAvLyB3aXRoIGNvZGUgY29tbWVudHNcbiAgICAgICAgICAnKD86bG9jYWxob3N0fCg/Oig/OicgKyBzZWxmLnJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsnICsgc2VsZi5yZS5zcmNfZG9tYWluX3Jvb3QgKyAnKScgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX3BvcnQgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX2hvc3RfdGVybWluYXRvciArXG4gICAgICAgICAgc2VsZi5yZS5zcmNfcGF0aCxcblxuICAgICAgICAgICdpJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLnJlLm5vX2h0dHAudGVzdCh0YWlsKSkge1xuICAgICAgICAvLyBzaG91bGQgbm90IGJlIGA6Ly9gICYgYC8vL2AsIHRoYXQgcHJvdGVjdHMgZnJvbSBlcnJvcnMgaW4gcHJvdG9jb2wgbmFtZVxuICAgICAgICBpZiAocG9zID49IDMgJiYgdGV4dFtwb3MgLSAzXSA9PT0gJzonKSB7IHJldHVybiAwIH1cbiAgICAgICAgaWYgKHBvcyA+PSAzICYmIHRleHRbcG9zIC0gM10gPT09ICcvJykgeyByZXR1cm4gMCB9XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUubm9faHR0cClbMF0ubGVuZ3RoXG4gICAgICB9XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfSxcbiAgJ21haWx0bzonOiB7XG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICh0ZXh0LCBwb3MsIHNlbGYpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgICAgaWYgKCFzZWxmLnJlLm1haWx0bykge1xuICAgICAgICBzZWxmLnJlLm1haWx0byA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgJ14nICsgc2VsZi5yZS5zcmNfZW1haWxfbmFtZSArICdAJyArIHNlbGYucmUuc3JjX2hvc3Rfc3RyaWN0LCAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHNlbGYucmUubWFpbHRvLnRlc3QodGFpbCkpIHtcbiAgICAgICAgcmV0dXJuIHRhaWwubWF0Y2goc2VsZi5yZS5tYWlsdG8pWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cbn1cblxuLy8gUkUgcGF0dGVybiBmb3IgMi1jaGFyYWN0ZXIgdGxkcyAoYXV0b2dlbmVyYXRlZCBieSAuL3N1cHBvcnQvdGxkc18yY2hhcl9nZW4uanMpXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbiAqL1xuY29uc3QgdGxkc18yY2hfc3JjX3JlID0gJ2FbY2RlZmdpbG1ub3Fyc3R1d3h6XXxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdfGNbYWNkZmdoaWtsbW5vcnV2d3h5el18ZFtlamttb3pdfGVbY2VncnN0dV18Zltpamttb3JdfGdbYWJkZWZnaGlsbW5wcXJzdHV3eV18aFtrbW5ydHVdfGlbZGVsbW5vcXJzdF18altlbW9wXXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdfG5bYWNlZmdpbG9wcnV6XXxvbXxwW2FlZmdoa2xtbnJzdHd5XXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnh5el18dFtjZGZnaGprbG1ub3J0dnd6XXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXx5W2V0XXx6W2Ftd10nXG5cbi8vIERPTidUIHRyeSB0byBtYWtlIFBScyB3aXRoIGNoYW5nZXMuIEV4dGVuZCBUTERzIHdpdGggTGlua2lmeUl0LnRsZHMoKSBpbnN0ZWFkXG5jb25zdCB0bGRzX2RlZmF1bHQgPSAnYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YQnLnNwbGl0KCd8JylcblxuZnVuY3Rpb24gcmVzZXRTY2FuQ2FjaGUgKHNlbGYpIHtcbiAgc2VsZi5fX2luZGV4X18gPSAtMVxuICBzZWxmLl9fdGV4dF9jYWNoZV9fID0gJydcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmFsaWRhdG9yIChyZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRleHQsIHBvcykge1xuICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgIGlmIChyZS50ZXN0KHRhaWwpKSB7XG4gICAgICByZXR1cm4gdGFpbC5tYXRjaChyZSlbMF0ubGVuZ3RoXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9ybWFsaXplciAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIHNlbGYpIHtcbiAgICBzZWxmLm5vcm1hbGl6ZShtYXRjaClcbiAgfVxufVxuXG4vLyBTY2hlbWFzIGNvbXBpbGVyLiBCdWlsZCByZWdleHBzLlxuLy9cbmZ1bmN0aW9uIGNvbXBpbGUgKHNlbGYpIHtcbiAgLy8gTG9hZCAmIGNsb25lIFJFIHBhdHRlcm5zLlxuICBjb25zdCByZSA9IHNlbGYucmUgPSByZUZhY3Rvcnkoc2VsZi5fX29wdHNfXylcblxuICAvLyBEZWZpbmUgZHluYW1pYyBwYXR0ZXJuc1xuICBjb25zdCB0bGRzID0gc2VsZi5fX3RsZHNfXy5zbGljZSgpXG5cbiAgc2VsZi5vbkNvbXBpbGUoKVxuXG4gIGlmICghc2VsZi5fX3RsZHNfcmVwbGFjZWRfXykge1xuICAgIHRsZHMucHVzaCh0bGRzXzJjaF9zcmNfcmUpXG4gIH1cbiAgdGxkcy5wdXNoKHJlLnNyY194bilcblxuICByZS5zcmNfdGxkcyA9IHRsZHMuam9pbignfCcpXG5cbiAgZnVuY3Rpb24gdW50cGwgKHRwbCkgeyByZXR1cm4gdHBsLnJlcGxhY2UoJyVUTERTJScsIHJlLnNyY190bGRzKSB9XG5cbiAgcmUuZW1haWxfZnV6enkgPSBSZWdFeHAodW50cGwocmUudHBsX2VtYWlsX2Z1enp5KSwgJ2knKVxuICByZS5saW5rX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9saW5rX2Z1enp5KSwgJ2knKVxuICByZS5saW5rX25vX2lwX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9saW5rX25vX2lwX2Z1enp5KSwgJ2knKVxuICByZS5ob3N0X2Z1enp5X3Rlc3QgPSBSZWdFeHAodW50cGwocmUudHBsX2hvc3RfZnV6enlfdGVzdCksICdpJylcblxuICAvL1xuICAvLyBDb21waWxlIGVhY2ggc2NoZW1hXG4gIC8vXG5cbiAgY29uc3QgYWxpYXNlcyA9IFtdXG5cbiAgc2VsZi5fX2NvbXBpbGVkX18gPSB7fSAvLyBSZXNldCBjb21waWxlZCBkYXRhXG5cbiAgZnVuY3Rpb24gc2NoZW1hRXJyb3IgKG5hbWUsIHZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignKExpbmtpZnlJdCkgSW52YWxpZCBzY2hlbWEgXCInICsgbmFtZSArICdcIjogJyArIHZhbClcbiAgfVxuXG4gIE9iamVjdC5rZXlzKHNlbGYuX19zY2hlbWFzX18pLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCB2YWwgPSBzZWxmLl9fc2NoZW1hc19fW25hbWVdXG5cbiAgICAvLyBza2lwIGRpc2FibGVkIG1ldGhvZHNcbiAgICBpZiAodmFsID09PSBudWxsKSB7IHJldHVybiB9XG5cbiAgICBjb25zdCBjb21waWxlZCA9IHsgdmFsaWRhdGU6IG51bGwsIGxpbms6IG51bGwgfVxuXG4gICAgc2VsZi5fX2NvbXBpbGVkX19bbmFtZV0gPSBjb21waWxlZFxuXG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmIChpc1JlZ0V4cCh2YWwudmFsaWRhdGUpKSB7XG4gICAgICAgIGNvbXBpbGVkLnZhbGlkYXRlID0gY3JlYXRlVmFsaWRhdG9yKHZhbC52YWxpZGF0ZSlcbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih2YWwudmFsaWRhdGUpKSB7XG4gICAgICAgIGNvbXBpbGVkLnZhbGlkYXRlID0gdmFsLnZhbGlkYXRlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbC5ub3JtYWxpemUpKSB7XG4gICAgICAgIGNvbXBpbGVkLm5vcm1hbGl6ZSA9IHZhbC5ub3JtYWxpemVcbiAgICAgIH0gZWxzZSBpZiAoIXZhbC5ub3JtYWxpemUpIHtcbiAgICAgICAgY29tcGlsZWQubm9ybWFsaXplID0gY3JlYXRlTm9ybWFsaXplcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyh2YWwpKSB7XG4gICAgICBhbGlhc2VzLnB1c2gobmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNjaGVtYUVycm9yKG5hbWUsIHZhbClcbiAgfSlcblxuICAvL1xuICAvLyBDb21waWxlIHBvc3Rwb25lZCBhbGlhc2VzXG4gIC8vXG5cbiAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgIGlmICghc2VsZi5fX2NvbXBpbGVkX19bc2VsZi5fX3NjaGVtYXNfX1thbGlhc11dKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIG9uIG1pc3NlZCBzY2hlbWFzIHRvIGF2b2lkIGVycm9ucyBvbiBkaXNhYmxlLlxuICAgICAgLy8gc2NoZW1hRXJyb3IoYWxpYXMsIHNlbGYuX19zY2hlbWFzX19bYWxpYXNdKTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNlbGYuX19jb21waWxlZF9fW2FsaWFzXS52YWxpZGF0ZSA9XG4gICAgICBzZWxmLl9fY29tcGlsZWRfX1tzZWxmLl9fc2NoZW1hc19fW2FsaWFzXV0udmFsaWRhdGVcbiAgICBzZWxmLl9fY29tcGlsZWRfX1thbGlhc10ubm9ybWFsaXplID1cbiAgICAgIHNlbGYuX19jb21waWxlZF9fW3NlbGYuX19zY2hlbWFzX19bYWxpYXNdXS5ub3JtYWxpemVcbiAgfSlcblxuICAvL1xuICAvLyBGYWtlIHJlY29yZCBmb3IgZ3Vlc3NlZCBsaW5rc1xuICAvL1xuICBzZWxmLl9fY29tcGlsZWRfX1snJ10gPSB7IHZhbGlkYXRlOiBudWxsLCBub3JtYWxpemU6IGNyZWF0ZU5vcm1hbGl6ZXIoKSB9XG5cbiAgLy9cbiAgLy8gQnVpbGQgc2NoZW1hIGNvbmRpdGlvblxuICAvL1xuICBjb25zdCBzbGlzdCA9IE9iamVjdC5rZXlzKHNlbGYuX19jb21waWxlZF9fKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIEZpbHRlciBkaXNhYmxlZCAmIGZha2Ugc2NoZW1hc1xuICAgICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMCAmJiBzZWxmLl9fY29tcGlsZWRfX1tuYW1lXVxuICAgIH0pXG4gICAgLm1hcChlc2NhcGVSRSlcbiAgICAuam9pbignfCcpXG4gIC8vICg/IV8pIGNhdXNlIDEuNXggc2xvd2Rvd25cbiAgc2VsZi5yZS5zY2hlbWFfdGVzdCA9IFJlZ0V4cCgnKF58KD8hXykoPzpbPjxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSkoJyArIHNsaXN0ICsgJyknLCAnaScpXG4gIHNlbGYucmUuc2NoZW1hX3NlYXJjaCA9IFJlZ0V4cCgnKF58KD8hXykoPzpbPjxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSkoJyArIHNsaXN0ICsgJyknLCAnaWcnKVxuICBzZWxmLnJlLnNjaGVtYV9hdF9zdGFydCA9IFJlZ0V4cCgnXicgKyBzZWxmLnJlLnNjaGVtYV9zZWFyY2guc291cmNlLCAnaScpXG5cbiAgc2VsZi5yZS5wcmV0ZXN0ID0gUmVnRXhwKFxuICAgICcoJyArIHNlbGYucmUuc2NoZW1hX3Rlc3Quc291cmNlICsgJyl8KCcgKyBzZWxmLnJlLmhvc3RfZnV6enlfdGVzdC5zb3VyY2UgKyAnKXxAJyxcbiAgICAnaSdcbiAgKVxuXG4gIC8vXG4gIC8vIENsZWFudXBcbiAgLy9cblxuICByZXNldFNjYW5DYWNoZShzZWxmKVxufVxuXG4vKipcbiAqIGNsYXNzIE1hdGNoXG4gKlxuICogTWF0Y2ggcmVzdWx0LiBTaW5nbGUgZWxlbWVudCBvZiBhcnJheSwgcmV0dXJuZWQgYnkgW1tMaW5raWZ5SXQjbWF0Y2hdXVxuICoqL1xuZnVuY3Rpb24gTWF0Y2ggKHNlbGYsIHNoaWZ0KSB7XG4gIGNvbnN0IHN0YXJ0ID0gc2VsZi5fX2luZGV4X19cbiAgY29uc3QgZW5kID0gc2VsZi5fX2xhc3RfaW5kZXhfX1xuICBjb25zdCB0ZXh0ID0gc2VsZi5fX3RleHRfY2FjaGVfXy5zbGljZShzdGFydCwgZW5kKVxuXG4gIC8qKlxuICAgKiBNYXRjaCNzY2hlbWEgLT4gU3RyaW5nXG4gICAqXG4gICAqIFByZWZpeCAocHJvdG9jb2wpIGZvciBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnNjaGVtYSA9IHNlbGYuX19zY2hlbWFfXy50b0xvd2VyQ2FzZSgpXG4gIC8qKlxuICAgKiBNYXRjaCNpbmRleCAtPiBOdW1iZXJcbiAgICpcbiAgICogRmlyc3QgcG9zaXRpb24gb2YgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgc2hpZnRcbiAgLyoqXG4gICAqIE1hdGNoI2xhc3RJbmRleCAtPiBOdW1iZXJcbiAgICpcbiAgICogTmV4dCBwb3NpdGlvbiBhZnRlciBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLmxhc3RJbmRleCA9IGVuZCArIHNoaWZ0XG4gIC8qKlxuICAgKiBNYXRjaCNyYXcgLT4gU3RyaW5nXG4gICAqXG4gICAqIE1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMucmF3ID0gdGV4dFxuICAvKipcbiAgICogTWF0Y2gjdGV4dCAtPiBTdHJpbmdcbiAgICpcbiAgICogTm90bWFsaXplZCB0ZXh0IG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMudGV4dCA9IHRleHRcbiAgLyoqXG4gICAqIE1hdGNoI3VybCAtPiBTdHJpbmdcbiAgICpcbiAgICogTm9ybWFsaXplZCB1cmwgb2YgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy51cmwgPSB0ZXh0XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hdGNoIChzZWxmLCBzaGlmdCkge1xuICBjb25zdCBtYXRjaCA9IG5ldyBNYXRjaChzZWxmLCBzaGlmdClcblxuICBzZWxmLl9fY29tcGlsZWRfX1ttYXRjaC5zY2hlbWFdLm5vcm1hbGl6ZShtYXRjaCwgc2VsZilcblxuICByZXR1cm4gbWF0Y2hcbn1cblxuLyoqXG4gKiBjbGFzcyBMaW5raWZ5SXRcbiAqKi9cblxuLyoqXG4gKiBuZXcgTGlua2lmeUl0KHNjaGVtYXMsIG9wdGlvbnMpXG4gKiAtIHNjaGVtYXMgKE9iamVjdCk6IE9wdGlvbmFsLiBBZGRpdGlvbmFsIHNjaGVtYXMgdG8gdmFsaWRhdGUgKHByZWZpeC92YWxpZGF0b3IpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHsgZnV6enlMaW5rfGZ1enp5RW1haWx8ZnV6enlJUDogdHJ1ZXxmYWxzZSB9XG4gKlxuICogQ3JlYXRlcyBuZXcgbGlua2lmaWVyIGluc3RhbmNlIHdpdGggb3B0aW9uYWwgYWRkaXRpb25hbCBzY2hlbWFzLlxuICogQ2FuIGJlIGNhbGxlZCB3aXRob3V0IGBuZXdgIGtleXdvcmQgZm9yIGNvbnZlbmllbmNlLlxuICpcbiAqIEJ5IGRlZmF1bHQgdW5kZXJzdGFuZHM6XG4gKlxuICogLSBgaHR0cChzKTovLy4uLmAgLCBgZnRwOi8vLi4uYCwgYG1haWx0bzouLi5gICYgYC8vLi4uYCBsaW5rc1xuICogLSBcImZ1enp5XCIgbGlua3MgYW5kIGVtYWlscyAoZXhhbXBsZS5jb20sIGZvb0BiYXIuY29tKS5cbiAqXG4gKiBgc2NoZW1hc2AgaXMgYW4gb2JqZWN0LCB3aGVyZSBlYWNoIGtleS92YWx1ZSBkZXNjcmliZXMgcHJvdG9jb2wvcnVsZTpcbiAqXG4gKiAtIF9fa2V5X18gLSBsaW5rIHByZWZpeCAodXN1YWxseSwgcHJvdG9jb2wgbmFtZSB3aXRoIGA6YCBhdCB0aGUgZW5kLCBgc2t5cGU6YFxuICogICBmb3IgZXhhbXBsZSkuIGBsaW5raWZ5LWl0YCBtYWtlcyBzaHVyZSB0aGF0IHByZWZpeCBpcyBub3QgcHJlY2VlZGVkIHdpdGhcbiAqICAgYWxwaGFudW1lcmljIGNoYXIgYW5kIHN5bWJvbHMuIE9ubHkgd2hpdGVzcGFjZXMgYW5kIHB1bmN0dWF0aW9uIGFsbG93ZWQuXG4gKiAtIF9fdmFsdWVfXyAtIHJ1bGUgdG8gY2hlY2sgdGFpbCBhZnRlciBsaW5rIHByZWZpeFxuICogICAtIF9TdHJpbmdfIC0ganVzdCBhbGlhcyB0byBleGlzdGluZyBydWxlXG4gKiAgIC0gX09iamVjdF9cbiAqICAgICAtIF92YWxpZGF0ZV8gLSB2YWxpZGF0b3IgZnVuY3Rpb24gKHNob3VsZCByZXR1cm4gbWF0Y2hlZCBsZW5ndGggb24gc3VjY2VzcyksXG4gKiAgICAgICBvciBgUmVnRXhwYC5cbiAqICAgICAtIF9ub3JtYWxpemVfIC0gb3B0aW9uYWwgZnVuY3Rpb24gdG8gbm9ybWFsaXplIHRleHQgJiB1cmwgb2YgbWF0Y2hlZCByZXN1bHRcbiAqICAgICAgIChmb3IgZXhhbXBsZSwgZm9yIEB0d2l0dGVyIG1lbnRpb25zKS5cbiAqXG4gKiBgb3B0aW9uc2A6XG4gKlxuICogLSBfX2Z1enp5TGlua19fIC0gcmVjb2duaWdlIFVSTC1zIHdpdGhvdXQgYGh0dHAocyk6YCBwcmVmaXguIERlZmF1bHQgYHRydWVgLlxuICogLSBfX2Z1enp5SVBfXyAtIGFsbG93IElQcyBpbiBmdXp6eSBsaW5rcyBhYm92ZS4gQ2FuIGNvbmZsaWN0IHdpdGggc29tZSB0ZXh0c1xuICogICBsaWtlIHZlcnNpb24gbnVtYmVycy4gRGVmYXVsdCBgZmFsc2VgLlxuICogLSBfX2Z1enp5RW1haWxfXyAtIHJlY29nbml6ZSBlbWFpbHMgd2l0aG91dCBgbWFpbHRvOmAgcHJlZml4LlxuICpcbiAqKi9cbmZ1bmN0aW9uIExpbmtpZnlJdCAoc2NoZW1hcywgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGlua2lmeUl0KSkge1xuICAgIHJldHVybiBuZXcgTGlua2lmeUl0KHNjaGVtYXMsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBpZiAoaXNPcHRpb25zT2JqKHNjaGVtYXMpKSB7XG4gICAgICBvcHRpb25zID0gc2NoZW1hc1xuICAgICAgc2NoZW1hcyA9IHt9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fX29wdHNfXyA9IGFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpXG5cbiAgLy8gQ2FjaGUgbGFzdCB0ZXN0ZWQgcmVzdWx0LiBVc2VkIHRvIHNraXAgcmVwZWF0aW5nIHN0ZXBzIG9uIG5leHQgYG1hdGNoYCBjYWxsLlxuICB0aGlzLl9faW5kZXhfXyA9IC0xXG4gIHRoaXMuX19sYXN0X2luZGV4X18gPSAtMSAvLyBOZXh0IHNjYW4gcG9zaXRpb25cbiAgdGhpcy5fX3NjaGVtYV9fID0gJydcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9ICcnXG5cbiAgdGhpcy5fX3NjaGVtYXNfXyA9IGFzc2lnbih7fSwgZGVmYXVsdFNjaGVtYXMsIHNjaGVtYXMpXG4gIHRoaXMuX19jb21waWxlZF9fID0ge31cblxuICB0aGlzLl9fdGxkc19fID0gdGxkc19kZWZhdWx0XG4gIHRoaXMuX190bGRzX3JlcGxhY2VkX18gPSBmYWxzZVxuXG4gIHRoaXMucmUgPSB7fVxuXG4gIGNvbXBpbGUodGhpcylcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I2FkZChzY2hlbWEsIGRlZmluaXRpb24pXG4gKiAtIHNjaGVtYSAoU3RyaW5nKTogcnVsZSBuYW1lIChmaXhlZCBwYXR0ZXJuIHByZWZpeClcbiAqIC0gZGVmaW5pdGlvbiAoU3RyaW5nfFJlZ0V4cHxPYmplY3QpOiBzY2hlbWEgZGVmaW5pdGlvblxuICpcbiAqIEFkZCBuZXcgcnVsZSBkZWZpbml0aW9uLiBTZWUgY29uc3RydWN0b3IgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoc2NoZW1hLCBkZWZpbml0aW9uKSB7XG4gIHRoaXMuX19zY2hlbWFzX19bc2NoZW1hXSA9IGRlZmluaXRpb25cbiAgY29tcGlsZSh0aGlzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBMaW5raWZ5SXQjc2V0KG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHsgZnV6enlMaW5rfGZ1enp5RW1haWx8ZnV6enlJUDogdHJ1ZXxmYWxzZSB9XG4gKlxuICogU2V0IHJlY29nbml0aW9uIG9wdGlvbnMgZm9yIGxpbmtzIHdpdGhvdXQgc2NoZW1hLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKG9wdGlvbnMpIHtcbiAgdGhpcy5fX29wdHNfXyA9IGFzc2lnbih0aGlzLl9fb3B0c19fLCBvcHRpb25zKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIExpbmtpZnlJdCN0ZXN0KHRleHQpIC0+IEJvb2xlYW5cbiAqXG4gKiBTZWFyY2hlcyBsaW5raWZpYWJsZSBwYXR0ZXJuIGFuZCByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzIG9yIGBmYWxzZWAgb24gZmFpbC5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIHRlc3QgKHRleHQpIHtcbiAgLy8gUmVzZXQgc2NhbiBjYWNoZVxuICB0aGlzLl9fdGV4dF9jYWNoZV9fID0gdGV4dFxuICB0aGlzLl9faW5kZXhfXyA9IC0xXG5cbiAgaWYgKCF0ZXh0Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBtLCBtbCwgbWUsIGxlbiwgc2hpZnQsIG5leHQsIHJlLCB0bGRfcG9zLCBhdF9wb3NcblxuICAvLyB0cnkgdG8gc2NhbiBmb3IgbGluayB3aXRoIHNjaGVtYSAtIHRoYXQncyB0aGUgbW9zdCBzaW1wbGUgcnVsZVxuICBpZiAodGhpcy5yZS5zY2hlbWFfdGVzdC50ZXN0KHRleHQpKSB7XG4gICAgcmUgPSB0aGlzLnJlLnNjaGVtYV9zZWFyY2hcbiAgICByZS5sYXN0SW5kZXggPSAwXG4gICAgd2hpbGUgKChtID0gcmUuZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgIGxlbiA9IHRoaXMudGVzdFNjaGVtYUF0KHRleHQsIG1bMl0sIHJlLmxhc3RJbmRleClcbiAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gbVsyXVxuICAgICAgICB0aGlzLl9faW5kZXhfXyA9IG0uaW5kZXggKyBtWzFdLmxlbmd0aFxuICAgICAgICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoICsgbGVuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX19vcHRzX18uZnV6enlMaW5rICYmIHRoaXMuX19jb21waWxlZF9fWydodHRwOiddKSB7XG4gICAgLy8gZ3Vlc3Mgc2NoZW1hbGVzcyBsaW5rc1xuICAgIHRsZF9wb3MgPSB0ZXh0LnNlYXJjaCh0aGlzLnJlLmhvc3RfZnV6enlfdGVzdClcbiAgICBpZiAodGxkX3BvcyA+PSAwKSB7XG4gICAgICAvLyBpZiB0bGQgaXMgbG9jYXRlZCBhZnRlciBmb3VuZCBsaW5rIC0gbm8gbmVlZCB0byBjaGVjayBmdXp6eSBwYXR0ZXJuXG4gICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHRsZF9wb3MgPCB0aGlzLl9faW5kZXhfXykge1xuICAgICAgICBpZiAoKG1sID0gdGV4dC5tYXRjaCh0aGlzLl9fb3B0c19fLmZ1enp5SVAgPyB0aGlzLnJlLmxpbmtfZnV6enkgOiB0aGlzLnJlLmxpbmtfbm9faXBfZnV6enkpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNoaWZ0ID0gbWwuaW5kZXggKyBtbFsxXS5sZW5ndGhcblxuICAgICAgICAgIGlmICh0aGlzLl9faW5kZXhfXyA8IDAgfHwgc2hpZnQgPCB0aGlzLl9faW5kZXhfXykge1xuICAgICAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gJydcbiAgICAgICAgICAgIHRoaXMuX19pbmRleF9fID0gc2hpZnRcbiAgICAgICAgICAgIHRoaXMuX19sYXN0X2luZGV4X18gPSBtbC5pbmRleCArIG1sWzBdLmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9fb3B0c19fLmZ1enp5RW1haWwgJiYgdGhpcy5fX2NvbXBpbGVkX19bJ21haWx0bzonXSkge1xuICAgIC8vIGd1ZXNzIHNjaGVtYWxlc3MgZW1haWxzXG4gICAgYXRfcG9zID0gdGV4dC5pbmRleE9mKCdAJylcbiAgICBpZiAoYXRfcG9zID49IDApIHtcbiAgICAgIC8vIFdlIGNhbid0IHNraXAgdGhpcyBjaGVjaywgYmVjYXVzZSB0aGlzIGNhc2VzIGFyZSBwb3NzaWJsZTpcbiAgICAgIC8vIDE5Mi4xNjguMS4xQGdtYWlsLmNvbSwgbXkuaW5AZXhhbXBsZS5jb21cbiAgICAgIGlmICgobWUgPSB0ZXh0Lm1hdGNoKHRoaXMucmUuZW1haWxfZnV6enkpKSAhPT0gbnVsbCkge1xuICAgICAgICBzaGlmdCA9IG1lLmluZGV4ICsgbWVbMV0ubGVuZ3RoXG4gICAgICAgIG5leHQgPSBtZS5pbmRleCArIG1lWzBdLmxlbmd0aFxuXG4gICAgICAgIGlmICh0aGlzLl9faW5kZXhfXyA8IDAgfHwgc2hpZnQgPCB0aGlzLl9faW5kZXhfXyB8fFxuICAgICAgICAgICAgKHNoaWZ0ID09PSB0aGlzLl9faW5kZXhfXyAmJiBuZXh0ID4gdGhpcy5fX2xhc3RfaW5kZXhfXykpIHtcbiAgICAgICAgICB0aGlzLl9fc2NoZW1hX18gPSAnbWFpbHRvOidcbiAgICAgICAgICB0aGlzLl9faW5kZXhfXyA9IHNoaWZ0XG4gICAgICAgICAgdGhpcy5fX2xhc3RfaW5kZXhfXyA9IG5leHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzLl9faW5kZXhfXyA+PSAwXG59XG5cbi8qKlxuICogTGlua2lmeUl0I3ByZXRlc3QodGV4dCkgLT4gQm9vbGVhblxuICpcbiAqIFZlcnkgcXVpY2sgY2hlY2ssIHRoYXQgY2FuIGdpdmUgZmFsc2UgcG9zaXRpdmVzLiBSZXR1cm5zIHRydWUgaWYgbGluayBNQVkgQkVcbiAqIGNhbiBleGlzdHMuIENhbiBiZSB1c2VkIGZvciBzcGVlZCBvcHRpbWl6YXRpb24sIHdoZW4geW91IG5lZWQgdG8gY2hlY2sgdGhhdFxuICogbGluayBOT1QgZXhpc3RzLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5wcmV0ZXN0ID0gZnVuY3Rpb24gcHJldGVzdCAodGV4dCkge1xuICByZXR1cm4gdGhpcy5yZS5wcmV0ZXN0LnRlc3QodGV4dClcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjdGVzdFNjaGVtYUF0KHRleHQsIG5hbWUsIHBvc2l0aW9uKSAtPiBOdW1iZXJcbiAqIC0gdGV4dCAoU3RyaW5nKTogdGV4dCB0byBzY2FuXG4gKiAtIG5hbWUgKFN0cmluZyk6IHJ1bGUgKHNjaGVtYSkgbmFtZVxuICogLSBwb3NpdGlvbiAoTnVtYmVyKTogdGV4dCBvZmZzZXQgdG8gY2hlY2sgZnJvbVxuICpcbiAqIFNpbWlsYXIgdG8gW1tMaW5raWZ5SXQjdGVzdF1dIGJ1dCBjaGVja3Mgb25seSBzcGVjaWZpYyBwcm90b2NvbCB0YWlsIGV4YWN0bHlcbiAqIGF0IGdpdmVuIHBvc2l0aW9uLiBSZXR1cm5zIGxlbmd0aCBvZiBmb3VuZCBwYXR0ZXJuICgwIG9uIGZhaWwpLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS50ZXN0U2NoZW1hQXQgPSBmdW5jdGlvbiB0ZXN0U2NoZW1hQXQgKHRleHQsIHNjaGVtYSwgcG9zKSB7XG4gIC8vIElmIG5vdCBzdXBwb3J0ZWQgc2NoZW1hIGNoZWNrIHJlcXVlc3RlZCAtIHRlcm1pbmF0ZVxuICBpZiAoIXRoaXMuX19jb21waWxlZF9fW3NjaGVtYS50b0xvd2VyQ2FzZSgpXSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgcmV0dXJuIHRoaXMuX19jb21waWxlZF9fW3NjaGVtYS50b0xvd2VyQ2FzZSgpXS52YWxpZGF0ZSh0ZXh0LCBwb3MsIHRoaXMpXG59XG5cbi8qKlxuICogTGlua2lmeUl0I21hdGNoKHRleHQpIC0+IEFycmF5fG51bGxcbiAqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGZvdW5kIGxpbmsgZGVzY3JpcHRpb25zIG9yIGBudWxsYCBvbiBmYWlsLiBXZSBzdHJvbmdseVxuICogcmVjb21tZW5kIHRvIHVzZSBbW0xpbmtpZnlJdCN0ZXN0XV0gZmlyc3QsIGZvciBiZXN0IHNwZWVkLlxuICpcbiAqICMjIyMjIFJlc3VsdCBtYXRjaCBkZXNjcmlwdGlvblxuICpcbiAqIC0gX19zY2hlbWFfXyAtIGxpbmsgc2NoZW1hLCBjYW4gYmUgZW1wdHkgZm9yIGZ1enp5IGxpbmtzLCBvciBgLy9gIGZvclxuICogICBwcm90b2NvbC1uZXV0cmFsICBsaW5rcy5cbiAqIC0gX19pbmRleF9fIC0gb2Zmc2V0IG9mIG1hdGNoZWQgdGV4dFxuICogLSBfX2xhc3RJbmRleF9fIC0gaW5kZXggb2YgbmV4dCBjaGFyIGFmdGVyIG1hdGhjaCBlbmRcbiAqIC0gX19yYXdfXyAtIG1hdGNoZWQgdGV4dFxuICogLSBfX3RleHRfXyAtIG5vcm1hbGl6ZWQgdGV4dFxuICogLSBfX3VybF9fIC0gbGluaywgZ2VuZXJhdGVkIGZyb20gbWF0Y2hlZCB0ZXh0XG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2ggKHRleHQpIHtcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgbGV0IHNoaWZ0ID0gMFxuXG4gIC8vIFRyeSB0byB0YWtlIHByZXZpb3VzIGVsZW1lbnQgZnJvbSBjYWNoZSwgaWYgLnRlc3QoKSBjYWxsZWQgYmVmb3JlXG4gIGlmICh0aGlzLl9faW5kZXhfXyA+PSAwICYmIHRoaXMuX190ZXh0X2NhY2hlX18gPT09IHRleHQpIHtcbiAgICByZXN1bHQucHVzaChjcmVhdGVNYXRjaCh0aGlzLCBzaGlmdCkpXG4gICAgc2hpZnQgPSB0aGlzLl9fbGFzdF9pbmRleF9fXG4gIH1cblxuICAvLyBDdXQgaGVhZCBpZiBjYWNoZSB3YXMgdXNlZFxuICBsZXQgdGFpbCA9IHNoaWZ0ID8gdGV4dC5zbGljZShzaGlmdCkgOiB0ZXh0XG5cbiAgLy8gU2NhbiBzdHJpbmcgdW50aWwgZW5kIHJlYWNoZWRcbiAgd2hpbGUgKHRoaXMudGVzdCh0YWlsKSkge1xuICAgIHJlc3VsdC5wdXNoKGNyZWF0ZU1hdGNoKHRoaXMsIHNoaWZ0KSlcblxuICAgIHRhaWwgPSB0YWlsLnNsaWNlKHRoaXMuX19sYXN0X2luZGV4X18pXG4gICAgc2hpZnQgKz0gdGhpcy5fX2xhc3RfaW5kZXhfX1xuICB9XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNtYXRjaEF0U3RhcnQodGV4dCkgLT4gTWF0Y2h8bnVsbFxuICpcbiAqIFJldHVybnMgZnVsbHktZm9ybWVkIChub3QgZnV6enkpIGxpbmsgaWYgaXQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmdcbiAqIG9mIHRoZSBzdHJpbmcsIGFuZCBudWxsIG90aGVyd2lzZS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUubWF0Y2hBdFN0YXJ0ID0gZnVuY3Rpb24gbWF0Y2hBdFN0YXJ0ICh0ZXh0KSB7XG4gIC8vIFJlc2V0IHNjYW4gY2FjaGVcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9IHRleHRcbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuXG4gIGlmICghdGV4dC5sZW5ndGgpIHJldHVybiBudWxsXG5cbiAgY29uc3QgbSA9IHRoaXMucmUuc2NoZW1hX2F0X3N0YXJ0LmV4ZWModGV4dClcbiAgaWYgKCFtKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGxlbiA9IHRoaXMudGVzdFNjaGVtYUF0KHRleHQsIG1bMl0sIG1bMF0ubGVuZ3RoKVxuICBpZiAoIWxlbikgcmV0dXJuIG51bGxcblxuICB0aGlzLl9fc2NoZW1hX18gPSBtWzJdXG4gIHRoaXMuX19pbmRleF9fID0gbS5pbmRleCArIG1bMV0ubGVuZ3RoXG4gIHRoaXMuX19sYXN0X2luZGV4X18gPSBtLmluZGV4ICsgbVswXS5sZW5ndGggKyBsZW5cblxuICByZXR1cm4gY3JlYXRlTWF0Y2godGhpcywgMClcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I3RsZHMobGlzdCBbLCBrZWVwT2xkXSkgLT4gdGhpc1xuICogLSBsaXN0IChBcnJheSk6IGxpc3Qgb2YgdGxkc1xuICogLSBrZWVwT2xkIChCb29sZWFuKTogbWVyZ2Ugd2l0aCBjdXJyZW50IGxpc3QgaWYgYHRydWVgIChgZmFsc2VgIGJ5IGRlZmF1bHQpXG4gKlxuICogTG9hZCAob3IgbWVyZ2UpIG5ldyB0bGRzIGxpc3QuIFRob3NlIGFyZSB1c2VyIGZvciBmdXp6eSBsaW5rcyAod2l0aG91dCBwcmVmaXgpXG4gKiB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMuIEJ5IGRlZmF1bHQgdGhpcyBhbGdvcnl0aG0gdXNlZDpcbiAqXG4gKiAtIGhvc3RuYW1lIHdpdGggYW55IDItbGV0dGVyIHJvb3Qgem9uZXMgYXJlIG9rLlxuICogLSBiaXp8Y29tfGVkdXxnb3Z8bmV0fG9yZ3xwcm98d2VifHh4eHxhZXJvfGFzaWF8Y29vcHxpbmZvfG11c2V1bXxuYW1lfHNob3B80YDRhFxuICogICBhcmUgb2suXG4gKiAtIGVuY29kZWQgKGB4bi0tLi4uYCkgcm9vdCB6b25lcyBhcmUgb2suXG4gKlxuICogSWYgbGlzdCBpcyByZXBsYWNlZCwgdGhlbiBleGFjdCBtYXRjaCBmb3IgMi1jaGFycyByb290IHpvbmVzIHdpbGwgYmUgY2hlY2tlZC5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGxkcyA9IGZ1bmN0aW9uIHRsZHMgKGxpc3QsIGtlZXBPbGQpIHtcbiAgbGlzdCA9IEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW2xpc3RdXG5cbiAgaWYgKCFrZWVwT2xkKSB7XG4gICAgdGhpcy5fX3RsZHNfXyA9IGxpc3Quc2xpY2UoKVxuICAgIHRoaXMuX190bGRzX3JlcGxhY2VkX18gPSB0cnVlXG4gICAgY29tcGlsZSh0aGlzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0aGlzLl9fdGxkc19fID0gdGhpcy5fX3RsZHNfXy5jb25jYXQobGlzdClcbiAgICAuc29ydCgpXG4gICAgLmZpbHRlcihmdW5jdGlvbiAoZWwsIGlkeCwgYXJyKSB7XG4gICAgICByZXR1cm4gZWwgIT09IGFycltpZHggLSAxXVxuICAgIH0pXG4gICAgLnJldmVyc2UoKVxuXG4gIGNvbXBpbGUodGhpcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjbm9ybWFsaXplKG1hdGNoKVxuICpcbiAqIERlZmF1bHQgbm9ybWFsaXplciAoaWYgc2NoZW1hIGRvZXMgbm90IGRlZmluZSBpdCdzIG93bikuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSAobWF0Y2gpIHtcbiAgLy8gRG8gbWluaW1hbCBwb3NzaWJsZSBjaGFuZ2VzIGJ5IGRlZmF1bHQuIE5lZWQgdG8gY29sbGVjdCBmZWVkYmFjayBwcmlvclxuICAvLyB0byBtb3ZlIGZvcndhcmQgaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L2xpbmtpZnktaXQvaXNzdWVzLzFcblxuICBpZiAoIW1hdGNoLnNjaGVtYSkgeyBtYXRjaC51cmwgPSAnaHR0cDovLycgKyBtYXRjaC51cmwgfVxuXG4gIGlmIChtYXRjaC5zY2hlbWEgPT09ICdtYWlsdG86JyAmJiAhL15tYWlsdG86L2kudGVzdChtYXRjaC51cmwpKSB7XG4gICAgbWF0Y2gudXJsID0gJ21haWx0bzonICsgbWF0Y2gudXJsXG4gIH1cbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjb25Db21waWxlKClcbiAqXG4gKiBPdmVycmlkZSB0byBtb2RpZnkgYmFzaWMgUmVnRXhwLXMuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm9uQ29tcGlsZSA9IGZ1bmN0aW9uIG9uQ29tcGlsZSAoKSB7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpbmtpZnlJdFxuIiwiaW1wb3J0IHsgQW55LCBDYywgWiwgUCB9IGZyb20gJ3VjLm1pY3JvJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3B0cykge1xuICBjb25zdCByZSA9IHt9XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgcmUuc3JjX0FueSA9IEFueS5zb3VyY2VcbiAgcmUuc3JjX0NjID0gQ2Muc291cmNlXG4gIHJlLnNyY19aID0gWi5zb3VyY2VcbiAgcmUuc3JjX1AgPSBQLnNvdXJjZVxuXG4gIC8vIFxccHtcXFpcXFBcXENjXFxDRn0gKHdoaXRlIHNwYWNlcyArIGNvbnRyb2wgKyBmb3JtYXQgKyBwdW5jdHVhdGlvbilcbiAgcmUuc3JjX1pQQ2MgPSBbcmUuc3JjX1osIHJlLnNyY19QLCByZS5zcmNfQ2NdLmpvaW4oJ3wnKVxuXG4gIC8vIFxccHtcXFpcXENjfSAod2hpdGUgc3BhY2VzICsgY29udHJvbClcbiAgcmUuc3JjX1pDYyA9IFtyZS5zcmNfWiwgcmUuc3JjX0NjXS5qb2luKCd8JylcblxuICAvLyBFeHBlcmltZW50YWwuIExpc3Qgb2YgY2hhcnMsIGNvbXBsZXRlbHkgcHJvaGliaXRlZCBpbiBsaW5rc1xuICAvLyBiZWNhdXNlIGNhbiBzZXBhcmF0ZSBpdCBmcm9tIG90aGVyIHBhcnQgb2YgdGV4dFxuICBjb25zdCB0ZXh0X3NlcGFyYXRvcnMgPSAnWz48XFx1ZmY1Y10nXG5cbiAgLy8gQWxsIHBvc3NpYmxlIHdvcmQgY2hhcmFjdGVycyAoZXZlcnl0aGluZyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzcGFjZXMgJiBjb250cm9scylcbiAgLy8gRGVmaW5lZCB2aWEgcHVuY3R1YXRpb24gJiBzcGFjZXMgdG8gc2F2ZSBzcGFjZVxuICAvLyBTaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgXFxwe1xcTFxcTlxcU1xcTX0gKFxcdyBidXQgd2l0aG91dCBgX2ApXG4gIHJlLnNyY19wc2V1ZG9fbGV0dGVyID0gJyg/Oig/IScgKyB0ZXh0X3NlcGFyYXRvcnMgKyAnfCcgKyByZS5zcmNfWlBDYyArICcpJyArIHJlLnNyY19BbnkgKyAnKSdcbiAgLy8gVGhlIHNhbWUgYXMgYWJvdGhlIGJ1dCB3aXRob3V0IFswLTldXG4gIC8vIHZhciBzcmNfcHNldWRvX2xldHRlcl9ub25fZCA9ICcoPzooPyFbMC05XXwnICsgc3JjX1pQQ2MgKyAnKScgKyBzcmNfQW55ICsgJyknO1xuXG4gIHJlLnNyY19pcDQgPVxuXG4gICAgJyg/OigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFxcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPyknXG5cbiAgLy8gUHJvaGliaXQgYW55IG9mIFwiQC9bXSgpXCIgaW4gdXNlci9wYXNzIHRvIGF2b2lkIHdyb25nIGRvbWFpbiBmZXRjaC5cbiAgcmUuc3JjX2F1dGggPSAnKD86KD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFtAL1xcXFxbXFxcXF0oKV0pLikrQCk/J1xuXG4gIHJlLnNyY19wb3J0ID1cblxuICAgICcoPzo6KD86Nig/OlswLTRdXFxcXGR7M318NSg/OlswLTRdXFxcXGR7Mn18NSg/OlswLTJdXFxcXGR8M1swLTVdKSkpfFsxLTVdP1xcXFxkezEsNH0pKT8nXG5cbiAgcmUuc3JjX2hvc3RfdGVybWluYXRvciA9XG5cbiAgICAnKD89JHwnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3wnICsgcmUuc3JjX1pQQ2MgKyAnKScgK1xuICAgICcoPyEnICsgKG9wdHNbJy0tLSddID8gJy0oPyEtLSl8JyA6ICctfCcpICsgJ198OlxcXFxkfFxcXFwuLXxcXFxcLig/ISR8JyArIHJlLnNyY19aUENjICsgJykpJ1xuXG4gIHJlLnNyY19wYXRoID1cblxuICAgICcoPzonICtcbiAgICAgICdbLz8jXScgK1xuICAgICAgICAnKD86JyArXG4gICAgICAgICAgJyg/IScgKyByZS5zcmNfWkNjICsgJ3wnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3xbKClbXFxcXF17fS4sXCJcXCc/IVxcXFwtO10pLnwnICtcbiAgICAgICAgICAnXFxcXFsoPzooPyEnICsgcmUuc3JjX1pDYyArICd8XFxcXF0pLikqXFxcXF18JyArXG4gICAgICAgICAgJ1xcXFwoKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFspXSkuKSpcXFxcKXwnICtcbiAgICAgICAgICAnXFxcXHsoPzooPyEnICsgcmUuc3JjX1pDYyArICd8W31dKS4pKlxcXFx9fCcgK1xuICAgICAgICAgICdcXFxcXCIoPzooPyEnICsgcmUuc3JjX1pDYyArICd8W1wiXSkuKStcXFxcXCJ8JyArXG4gICAgICAgICAgXCJcXFxcJyg/Oig/IVwiICsgcmUuc3JjX1pDYyArIFwifFsnXSkuKStcXFxcJ3xcIiArXG5cbiAgICAgICAgICAvLyBhbGxvdyBgSSdtX2tpbmdgIGlmIG5vIHBhaXIgZm91bmRcbiAgICAgICAgICBcIlxcXFwnKD89XCIgKyByZS5zcmNfcHNldWRvX2xldHRlciArICd8Wy1dKXwnICtcblxuICAgICAgICAgIC8vIGdvb2dsZSBoYXMgbWFueSBkb3RzIGluIFwiZ29vZ2xlIHNlYXJjaFwiIGxpbmtzICgjNjYsICM4MSkuXG4gICAgICAgICAgLy8gZ2l0aHViIGhhcyAuLi4gaW4gY29tbWl0IHJhbmdlIGxpbmtzLFxuICAgICAgICAgIC8vIFJlc3RyaWN0IHRvXG4gICAgICAgICAgLy8gLSBlbmdsaXNoXG4gICAgICAgICAgLy8gLSBwZXJjZW50LWVuY29kZWRcbiAgICAgICAgICAvLyAtIHBhcnRzIG9mIGZpbGUgcGF0aFxuICAgICAgICAgIC8vIC0gcGFyYW1zIHNlcGFyYXRvclxuICAgICAgICAgIC8vIHVudGlsIG1vcmUgZXhhbXBsZXMgZm91bmQuXG4gICAgICAgICAgJ1xcXFwuezIsfVthLXpBLVowLTklLyZdfCcgK1xuXG4gICAgICAgICAgJ1xcXFwuKD8hJyArIHJlLnNyY19aQ2MgKyAnfFsuXXwkKXwnICtcbiAgICAgICAgICAob3B0c1snLS0tJ11cbiAgICAgICAgICAgID8gJ1xcXFwtKD8hLS0oPzpbXi1dfCQpKSg/Oi0qKXwnIC8vIGAtLS1gID0+IGxvbmcgZGFzaCwgdGVybWluYXRlXG4gICAgICAgICAgICA6ICdcXFxcLSt8J1xuICAgICAgICAgICkgK1xuICAgICAgICAgIC8vIGFsbG93IGAsLCxgIGluIHBhdGhzXG4gICAgICAgICAgJywoPyEnICsgcmUuc3JjX1pDYyArICd8JCl8JyArXG5cbiAgICAgICAgICAvLyBhbGxvdyBgO2AgaWYgbm90IGZvbGxvd2VkIGJ5IHNwYWNlLWxpa2UgY2hhclxuICAgICAgICAgICc7KD8hJyArIHJlLnNyY19aQ2MgKyAnfCQpfCcgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYCEhIWAgaW4gcGF0aHMsIGJ1dCBub3QgYXQgdGhlIGVuZFxuICAgICAgICAgICdcXFxcISsoPyEnICsgcmUuc3JjX1pDYyArICd8WyFdfCQpfCcgK1xuXG4gICAgICAgICAgJ1xcXFw/KD8hJyArIHJlLnNyY19aQ2MgKyAnfFs/XXwkKScgK1xuICAgICAgICAnKSsnICtcbiAgICAgICd8XFxcXC8nICtcbiAgICAnKT8nXG5cbiAgLy8gQWxsb3cgYW55dGhpbmcgaW4gbWFya2Rvd24gc3BlYywgZm9yYmlkIHF1b3RlIChcIikgYXQgdGhlIGZpcnN0IHBvc2l0aW9uXG4gIC8vIGJlY2F1c2UgZW1haWxzIGVuY2xvc2VkIGluIHF1b3RlcyBhcmUgZmFyIG1vcmUgY29tbW9uXG4gIHJlLnNyY19lbWFpbF9uYW1lID1cblxuICAgICdbXFxcXC07OiY9XFxcXCtcXFxcJCxcXFxcLmEtekEtWjAtOV9dW1xcXFwtOzomPVxcXFwrXFxcXCQsXFxcXFwiXFxcXC5hLXpBLVowLTlfXSonXG5cbiAgcmUuc3JjX3huID1cblxuICAgICd4bi0tW2EtejAtOVxcXFwtXXsxLDU5fSdcblxuICAvLyBNb3JlIHRvIHJlYWQgYWJvdXQgZG9tYWluIG5hbWVzXG4gIC8vIGh0dHA6Ly9zZXJ2ZXJmYXVsdC5jb20vcXVlc3Rpb25zLzYzODI2MC9cblxuICByZS5zcmNfZG9tYWluX3Jvb3QgPVxuXG4gICAgLy8gQWxsb3cgbGV0dGVycyAmIGRpZ2l0cyAoaHR0cDovL3Rlc3QxKVxuICAgICcoPzonICtcbiAgICAgIHJlLnNyY194biArXG4gICAgICAnfCcgK1xuICAgICAgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnezEsNjN9JyArXG4gICAgJyknXG5cbiAgcmUuc3JjX2RvbWFpbiA9XG5cbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfeG4gK1xuICAgICAgJ3wnICtcbiAgICAgICcoPzonICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKScgK1xuICAgICAgJ3wnICtcbiAgICAgICcoPzonICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKD86LXwnICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKXswLDYxfScgKyByZS5zcmNfcHNldWRvX2xldHRlciArICcpJyArXG4gICAgJyknXG5cbiAgcmUuc3JjX2hvc3QgPVxuXG4gICAgJyg/OicgK1xuICAgIC8vIERvbid0IG5lZWQgSVAgY2hlY2ssIGJlY2F1c2UgZGlnaXRzIGFyZSBhbHJlYWR5IGFsbG93ZWQgaW4gbm9ybWFsIGRvbWFpbiBuYW1lc1xuICAgIC8vICAgc3JjX2lwNCArXG4gICAgLy8gJ3wnICtcbiAgICAgICcoPzooPzooPzonICsgcmUuc3JjX2RvbWFpbiArICcpXFxcXC4pKicgKyByZS5zcmNfZG9tYWluLyogX3Jvb3QgKi8gKyAnKScgK1xuICAgICcpJ1xuXG4gIHJlLnRwbF9ob3N0X2Z1enp5ID1cblxuICAgICcoPzonICtcbiAgICAgIHJlLnNyY19pcDQgK1xuICAgICd8JyArXG4gICAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsoPzolVExEUyUpKScgK1xuICAgICcpJ1xuXG4gIHJlLnRwbF9ob3N0X25vX2lwX2Z1enp5ID1cblxuICAgICcoPzooPzooPzonICsgcmUuc3JjX2RvbWFpbiArICcpXFxcXC4pKyg/OiVUTERTJSkpJ1xuXG4gIHJlLnNyY19ob3N0X3N0cmljdCA9XG5cbiAgICByZS5zcmNfaG9zdCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9mdXp6eV9zdHJpY3QgPVxuXG4gICAgcmUudHBsX2hvc3RfZnV6enkgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUuc3JjX2hvc3RfcG9ydF9zdHJpY3QgPVxuXG4gICAgcmUuc3JjX2hvc3QgKyByZS5zcmNfcG9ydCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9wb3J0X2Z1enp5X3N0cmljdCA9XG5cbiAgICByZS50cGxfaG9zdF9mdXp6eSArIHJlLnNyY19wb3J0ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIHJlLnRwbF9ob3N0X3BvcnRfbm9faXBfZnV6enlfc3RyaWN0ID1cblxuICAgIHJlLnRwbF9ob3N0X25vX2lwX2Z1enp5ICsgcmUuc3JjX3BvcnQgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgLy9cbiAgLy8gTWFpbiBydWxlc1xuICAvL1xuXG4gIC8vIFJ1ZGUgdGVzdCBmdXp6eSBsaW5rcyBieSBob3N0LCBmb3IgcXVpY2sgZGVueVxuICByZS50cGxfaG9zdF9mdXp6eV90ZXN0ID1cblxuICAgICdsb2NhbGhvc3R8d3d3XFxcXC58XFxcXC5cXFxcZHsxLDN9XFxcXC58KD86XFxcXC4oPzolVExEUyUpKD86JyArIHJlLnNyY19aUENjICsgJ3w+fCQpKSdcblxuICByZS50cGxfZW1haWxfZnV6enkgPVxuXG4gICAgICAnKF58JyArIHRleHRfc2VwYXJhdG9ycyArICd8XCJ8XFxcXCh8JyArIHJlLnNyY19aQ2MgKyAnKScgK1xuICAgICAgJygnICsgcmUuc3JjX2VtYWlsX25hbWUgKyAnQCcgKyByZS50cGxfaG9zdF9mdXp6eV9zdHJpY3QgKyAnKSdcblxuICByZS50cGxfbGlua19mdXp6eSA9XG4gICAgICAvLyBGdXp6eSBsaW5rIGNhbid0IGJlIHByZXBlbmRlZCB3aXRoIC46L1xcLSBhbmQgbm9uIHB1bmN0dWF0aW9uLlxuICAgICAgLy8gYnV0IGNhbiBzdGFydCB3aXRoID4gKG1hcmtkb3duIGJsb2NrcXVvdGUpXG4gICAgICAnKF58KD8hWy46L1xcXFwtX0BdKSg/OlskKzw9Pl5gfFxcdWZmNWNdfCcgKyByZS5zcmNfWlBDYyArICcpKScgK1xuICAgICAgJygoPyFbJCs8PT5eYHxcXHVmZjVjXSknICsgcmUudHBsX2hvc3RfcG9ydF9mdXp6eV9zdHJpY3QgKyByZS5zcmNfcGF0aCArICcpJ1xuXG4gIHJlLnRwbF9saW5rX25vX2lwX2Z1enp5ID1cbiAgICAgIC8vIEZ1enp5IGxpbmsgY2FuJ3QgYmUgcHJlcGVuZGVkIHdpdGggLjovXFwtIGFuZCBub24gcHVuY3R1YXRpb24uXG4gICAgICAvLyBidXQgY2FuIHN0YXJ0IHdpdGggPiAobWFya2Rvd24gYmxvY2txdW90ZSlcbiAgICAgICcoXnwoPyFbLjovXFxcXC1fQF0pKD86WyQrPD0+XmB8XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpJyArXG4gICAgICAnKCg/IVskKzw9Pl5gfFxcdWZmNWNdKScgKyByZS50cGxfaG9zdF9wb3J0X25vX2lwX2Z1enp5X3N0cmljdCArIHJlLnNyY19wYXRoICsgJyknXG5cbiAgcmV0dXJuIHJlXG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cbmNvbnN0IG1heEludCA9IDIxNDc0ODM2NDc7IC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuLyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuY29uc3QgYmFzZSA9IDM2O1xuY29uc3QgdE1pbiA9IDE7XG5jb25zdCB0TWF4ID0gMjY7XG5jb25zdCBza2V3ID0gMzg7XG5jb25zdCBkYW1wID0gNzAwO1xuY29uc3QgaW5pdGlhbEJpYXMgPSA3MjtcbmNvbnN0IGluaXRpYWxOID0gMTI4OyAvLyAweDgwXG5jb25zdCBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcblxuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cbmNvbnN0IHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vO1xuY29uc3QgcmVnZXhOb25BU0NJSSA9IC9bXlxcMC1cXHg3Rl0vOyAvLyBOb3RlOiBVKzAwN0YgREVMIGlzIGV4Y2x1ZGVkIHRvby5cbmNvbnN0IHJlZ2V4U2VwYXJhdG9ycyA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuLyoqIEVycm9yIG1lc3NhZ2VzICovXG5jb25zdCBlcnJvcnMgPSB7XG5cdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG59O1xuXG4vKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5jb25zdCBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG5jb25zdCBmbG9vciA9IE1hdGguZmxvb3I7XG5jb25zdCBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqXG4gKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xufVxuXG4vKipcbiAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcbiAqIGl0ZW0uXG4gKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hcChhcnJheSwgY2FsbGJhY2spIHtcblx0Y29uc3QgcmVzdWx0ID0gW107XG5cdGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdHJlc3VsdFtsZW5ndGhdID0gY2FsbGJhY2soYXJyYXlbbGVuZ3RoXSk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcbiAqIGFkZHJlc3Nlcy5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG4gKiBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcbiAqIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXBEb21haW4oZG9tYWluLCBjYWxsYmFjaykge1xuXHRjb25zdCBwYXJ0cyA9IGRvbWFpbi5zcGxpdCgnQCcpO1xuXHRsZXQgcmVzdWx0ID0gJyc7XG5cdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0ZG9tYWluID0gcGFydHNbMV07XG5cdH1cblx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRkb21haW4gPSBkb21haW4ucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRjb25zdCBsYWJlbHMgPSBkb21haW4uc3BsaXQoJy4nKTtcblx0Y29uc3QgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGNhbGxiYWNrKS5qb2luKCcuJyk7XG5cdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZGVjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuICovXG5mdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXHRjb25zdCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdGNvbnN0IHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHQvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuXHRcdFx0Y29uc3QgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIExvdyBzdXJyb2dhdGUuXG5cdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuXHRcdFx0XHQvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcbiAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG4gKiBAbmFtZSBlbmNvZGVcbiAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG4gKi9cbmNvbnN0IHVjczJlbmNvZGUgPSBjb2RlUG9pbnRzID0+IFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbmNvbnN0IGJhc2ljVG9EaWdpdCA9IGZ1bmN0aW9uKGNvZGVQb2ludCkge1xuXHRpZiAoY29kZVBvaW50ID49IDB4MzAgJiYgY29kZVBvaW50IDwgMHgzQSkge1xuXHRcdHJldHVybiAyNiArIChjb2RlUG9pbnQgLSAweDMwKTtcblx0fVxuXHRpZiAoY29kZVBvaW50ID49IDB4NDEgJiYgY29kZVBvaW50IDwgMHg1Qikge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDQxO1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgPj0gMHg2MSAmJiBjb2RlUG9pbnQgPCAweDdCKSB7XG5cdFx0cmV0dXJuIGNvZGVQb2ludCAtIDB4NjE7XG5cdH1cblx0cmV0dXJuIGJhc2U7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2VcbiAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcbiAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG4gKi9cbmNvbnN0IGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uKGRpZ2l0LCBmbGFnKSB7XG5cdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xufTtcblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFkYXB0ID0gZnVuY3Rpb24oZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG5cdGxldCBrID0gMDtcblx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0ZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuXHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0fVxuXHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcbiAqIHN5bWJvbHMuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAqL1xuY29uc3QgZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0Ly8gRG9uJ3QgdXNlIFVDUy0yLlxuXHRjb25zdCBvdXRwdXQgPSBbXTtcblx0Y29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdGxldCBpID0gMDtcblx0bGV0IG4gPSBpbml0aWFsTjtcblx0bGV0IGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cblx0bGV0IGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0aWYgKGJhc2ljIDwgMCkge1xuXHRcdGJhc2ljID0gMDtcblx0fVxuXG5cdGZvciAobGV0IGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcblx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHR9XG5cdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XG5cdH1cblxuXHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdC8vIHBvaW50cyB3ZXJlIGNvcGllZDsgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvdGhlcndpc2UuXG5cblx0Zm9yIChsZXQgaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdGNvbnN0IG9sZGkgPSBpO1xuXHRcdGZvciAobGV0IHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSkge1xuXHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0Y29uc3QgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdHcgKj0gYmFzZU1pbnVzVDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xuXG5cdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdGlmIChmbG9vcihpIC8gb3V0KSA+IG1heEludCAtIG4pIHtcblx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0aSAlPSBvdXQ7XG5cblx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0LlxuXHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHR9XG5cblx0cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLm91dHB1dCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbmNvbnN0IGVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdGNvbnN0IG91dHB1dCA9IFtdO1xuXG5cdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG5cdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0Ly8gQ2FjaGUgdGhlIGxlbmd0aC5cblx0Y29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUuXG5cdGxldCBuID0gaW5pdGlhbE47XG5cdGxldCBkZWx0YSA9IDA7XG5cdGxldCBiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy5cblx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblx0bGV0IGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7XG5cblx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyB3aXRoIGEgZGVsaW1pdGVyIHVubGVzcyBpdCdzIGVtcHR5LlxuXHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHR9XG5cblx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0bGV0IG0gPSBtYXhJbnQ7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdGNvbnN0IGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0fVxuXG5cdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRuID0gbTtcblxuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PT0gbikge1xuXHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cblx0XHRcdFx0bGV0IHEgPSBkZWx0YTtcblx0XHRcdFx0Zm9yIChsZXQgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cdFx0XHRcdFx0Y29uc3QgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdGNvbnN0IGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0KytkZWx0YTtcblx0XHQrK247XG5cblx0fVxuXHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG4gKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG4gKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cbiAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG4gKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcbiAqIHN0cmluZy5cbiAqL1xuY29uc3QgdG9Vbmljb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG4gKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcbiAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuICogQVNDSUkuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG4gKiBVbmljb2RlIHN0cmluZy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3JcbiAqIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmNvbnN0IHRvQVNDSUkgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5jb25zdCBwdW55Y29kZSA9IHtcblx0LyoqXG5cdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEB0eXBlIFN0cmluZ1xuXHQgKi9cblx0J3ZlcnNpb24nOiAnMi4zLjEnLFxuXHQvKipcblx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0ICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdCd1Y3MyJzoge1xuXHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdH0sXG5cdCdkZWNvZGUnOiBkZWNvZGUsXG5cdCdlbmNvZGUnOiBlbmNvZGUsXG5cdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxufTtcblxuZXhwb3J0IHsgdWNzMmRlY29kZSwgdWNzMmVuY29kZSwgZGVjb2RlLCBlbmNvZGUsIHRvQVNDSUksIHRvVW5pY29kZSB9O1xuZXhwb3J0IGRlZmF1bHQgcHVueWNvZGU7XG4iLCIvLyBNYWluIHBhcnNlciBjbGFzc1xuXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL2NvbW1vbi91dGlscy5tanMnXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vaGVscGVycy9pbmRleC5tanMnXG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9yZW5kZXJlci5tanMnXG5pbXBvcnQgUGFyc2VyQ29yZSBmcm9tICcuL3BhcnNlcl9jb3JlLm1qcydcbmltcG9ydCBQYXJzZXJCbG9jayBmcm9tICcuL3BhcnNlcl9ibG9jay5tanMnXG5pbXBvcnQgUGFyc2VySW5saW5lIGZyb20gJy4vcGFyc2VyX2lubGluZS5tanMnXG5pbXBvcnQgTGlua2lmeUl0IGZyb20gJ2xpbmtpZnktaXQnXG5pbXBvcnQgKiBhcyBtZHVybCBmcm9tICdtZHVybCdcbmltcG9ydCBwdW55Y29kZSBmcm9tICdwdW55Y29kZS5qcydcblxuaW1wb3J0IGNmZ19kZWZhdWx0IGZyb20gJy4vcHJlc2V0cy9kZWZhdWx0Lm1qcydcbmltcG9ydCBjZmdfemVybyBmcm9tICcuL3ByZXNldHMvemVyby5tanMnXG5pbXBvcnQgY2ZnX2NvbW1vbm1hcmsgZnJvbSAnLi9wcmVzZXRzL2NvbW1vbm1hcmsubWpzJ1xuXG5jb25zdCBjb25maWcgPSB7XG4gIGRlZmF1bHQ6IGNmZ19kZWZhdWx0LFxuICB6ZXJvOiBjZmdfemVybyxcbiAgY29tbW9ubWFyazogY2ZnX2NvbW1vbm1hcmtcbn1cblxuLy9cbi8vIFRoaXMgdmFsaWRhdG9yIGNhbiBwcm9oaWJpdCBtb3JlIHRoYW4gcmVhbGx5IG5lZWRlZCB0byBwcmV2ZW50IFhTUy4gSXQncyBhXG4vLyB0cmFkZW9mZiB0byBrZWVwIGNvZGUgc2ltcGxlIGFuZCB0byBiZSBzZWN1cmUgYnkgZGVmYXVsdC5cbi8vXG4vLyBJZiB5b3UgbmVlZCBkaWZmZXJlbnQgc2V0dXAgLSBvdmVycmlkZSB2YWxpZGF0b3IgbWV0aG9kIGFzIHlvdSB3aXNoLiBPclxuLy8gcmVwbGFjZSBpdCB3aXRoIGR1bW15IGZ1bmN0aW9uIGFuZCB1c2UgZXh0ZXJuYWwgc2FuaXRpemVyLlxuLy9cblxuY29uc3QgQkFEX1BST1RPX1JFID0gL14odmJzY3JpcHR8amF2YXNjcmlwdHxmaWxlfGRhdGEpOi9cbmNvbnN0IEdPT0RfREFUQV9SRSA9IC9eZGF0YTppbWFnZVxcLyhnaWZ8cG5nfGpwZWd8d2VicCk7L1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUxpbmsgKHVybCkge1xuICAvLyB1cmwgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludCwgYW5kIGV4aXN0aW5nIGVudGl0aWVzIGFyZSBkZWNvZGVkXG4gIGNvbnN0IHN0ciA9IHVybC50cmltKCkudG9Mb3dlckNhc2UoKVxuXG4gIHJldHVybiBCQURfUFJPVE9fUkUudGVzdChzdHIpID8gR09PRF9EQVRBX1JFLnRlc3Qoc3RyKSA6IHRydWVcbn1cblxuY29uc3QgUkVDT0RFX0hPU1ROQU1FX0ZPUiA9IFsnaHR0cDonLCAnaHR0cHM6JywgJ21haWx0bzonXVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5rICh1cmwpIHtcbiAgY29uc3QgcGFyc2VkID0gbWR1cmwucGFyc2UodXJsLCB0cnVlKVxuXG4gIGlmIChwYXJzZWQuaG9zdG5hbWUpIHtcbiAgICAvLyBFbmNvZGUgaG9zdG5hbWVzIGluIHVybHMgbGlrZTpcbiAgICAvLyBgaHR0cDovL2hvc3QvYCwgYGh0dHBzOi8vaG9zdC9gLCBgbWFpbHRvOnVzZXJAaG9zdGAsIGAvL2hvc3QvYFxuICAgIC8vXG4gICAgLy8gV2UgZG9uJ3QgZW5jb2RlIHVua25vd24gc2NoZW1hcywgYmVjYXVzZSBpdCdzIGxpa2VseSB0aGF0IHdlIGVuY29kZVxuICAgIC8vIHNvbWV0aGluZyB3ZSBzaG91bGRuJ3QgKGUuZy4gYHNreXBlOm5hbWVgIHRyZWF0ZWQgYXMgYHNreXBlOmhvc3RgKVxuICAgIC8vXG4gICAgaWYgKCFwYXJzZWQucHJvdG9jb2wgfHwgUkVDT0RFX0hPU1ROQU1FX0ZPUi5pbmRleE9mKHBhcnNlZC5wcm90b2NvbCkgPj0gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSShwYXJzZWQuaG9zdG5hbWUpXG4gICAgICB9IGNhdGNoIChlcikgeyAvKiovIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWR1cmwuZW5jb2RlKG1kdXJsLmZvcm1hdChwYXJzZWQpKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVMaW5rVGV4dCAodXJsKSB7XG4gIGNvbnN0IHBhcnNlZCA9IG1kdXJsLnBhcnNlKHVybCwgdHJ1ZSlcblxuICBpZiAocGFyc2VkLmhvc3RuYW1lKSB7XG4gICAgLy8gRW5jb2RlIGhvc3RuYW1lcyBpbiB1cmxzIGxpa2U6XG4gICAgLy8gYGh0dHA6Ly9ob3N0L2AsIGBodHRwczovL2hvc3QvYCwgYG1haWx0bzp1c2VyQGhvc3RgLCBgLy9ob3N0L2BcbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IGVuY29kZSB1bmtub3duIHNjaGVtYXMsIGJlY2F1c2UgaXQncyBsaWtlbHkgdGhhdCB3ZSBlbmNvZGVcbiAgICAvLyBzb21ldGhpbmcgd2Ugc2hvdWxkbid0IChlLmcuIGBza3lwZTpuYW1lYCB0cmVhdGVkIGFzIGBza3lwZTpob3N0YClcbiAgICAvL1xuICAgIGlmICghcGFyc2VkLnByb3RvY29sIHx8IFJFQ09ERV9IT1NUTkFNRV9GT1IuaW5kZXhPZihwYXJzZWQucHJvdG9jb2wpID49IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZC5ob3N0bmFtZSA9IHB1bnljb2RlLnRvVW5pY29kZShwYXJzZWQuaG9zdG5hbWUpXG4gICAgICB9IGNhdGNoIChlcikgeyAvKiovIH1cbiAgICB9XG4gIH1cblxuICAvLyBhZGQgJyUnIHRvIGV4Y2x1ZGUgbGlzdCBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9pc3N1ZXMvNzIwXG4gIHJldHVybiBtZHVybC5kZWNvZGUobWR1cmwuZm9ybWF0KHBhcnNlZCksIG1kdXJsLmRlY29kZS5kZWZhdWx0Q2hhcnMgKyAnJScpXG59XG5cbi8qKlxuICogY2xhc3MgTWFya2Rvd25JdFxuICpcbiAqIE1haW4gcGFyc2VyL3JlbmRlcmVyIGNsYXNzLlxuICpcbiAqICMjIyMjIFVzYWdlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gbm9kZS5qcywgXCJjbGFzc2ljXCIgd2F5OlxuICogdmFyIE1hcmtkb3duSXQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpLFxuICogICAgIG1kID0gbmV3IE1hcmtkb3duSXQoKTtcbiAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXIoJyMgbWFya2Rvd24taXQgcnVsZXp6IScpO1xuICpcbiAqIC8vIG5vZGUuanMsIHRoZSBzYW1lLCBidXQgd2l0aCBzdWdhcjpcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXIoJyMgbWFya2Rvd24taXQgcnVsZXp6IScpO1xuICpcbiAqIC8vIGJyb3dzZXIgd2l0aG91dCBBTUQsIGFkZGVkIHRvIFwid2luZG93XCIgb24gc2NyaXB0IGxvYWRcbiAqIC8vIE5vdGUsIHRoZXJlIGFyZSBubyBkYXNoLlxuICogdmFyIG1kID0gd2luZG93Lm1hcmtkb3duaXQoKTtcbiAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXIoJyMgbWFya2Rvd24taXQgcnVsZXp6IScpO1xuICogYGBgXG4gKlxuICogU2luZ2xlIGxpbmUgcmVuZGVyaW5nLCB3aXRob3V0IHBhcmFncmFwaCB3cmFwOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXJJbmxpbmUoJ19fbWFya2Rvd24taXRfXyBydWxlenohJyk7XG4gKiBgYGBcbiAqKi9cblxuLyoqXG4gKiBuZXcgTWFya2Rvd25JdChbcHJlc2V0TmFtZSwgb3B0aW9uc10pXG4gKiAtIHByZXNldE5hbWUgKFN0cmluZyk6IG9wdGlvbmFsLCBgY29tbW9ubWFya2AgLyBgemVyb2BcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KVxuICpcbiAqIENyZWF0ZXMgcGFyc2VyIGluc3RhbnNlIHdpdGggZ2l2ZW4gY29uZmlnLiBDYW4gYmUgY2FsbGVkIHdpdGhvdXQgYG5ld2AuXG4gKlxuICogIyMjIyMgcHJlc2V0TmFtZVxuICpcbiAqIE1hcmtkb3duSXQgcHJvdmlkZXMgbmFtZWQgcHJlc2V0cyBhcyBhIGNvbnZlbmllbmNlIHRvIHF1aWNrbHlcbiAqIGVuYWJsZS9kaXNhYmxlIGFjdGl2ZSBzeW50YXggcnVsZXMgYW5kIG9wdGlvbnMgZm9yIGNvbW1vbiB1c2UgY2FzZXMuXG4gKlxuICogLSBbXCJjb21tb25tYXJrXCJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcHJlc2V0cy9jb21tb25tYXJrLm1qcykgLVxuICogICBjb25maWd1cmVzIHBhcnNlciB0byBzdHJpY3QgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pIG1vZGUuXG4gKiAtIFtkZWZhdWx0XShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3ByZXNldHMvZGVmYXVsdC5tanMpIC1cbiAqICAgc2ltaWxhciB0byBHRk0sIHVzZWQgd2hlbiBubyBwcmVzZXQgbmFtZSBnaXZlbi4gRW5hYmxlcyBhbGwgYXZhaWxhYmxlIHJ1bGVzLFxuICogICBidXQgc3RpbGwgd2l0aG91dCBodG1sLCB0eXBvZ3JhcGhlciAmIGF1dG9saW5rZXIuXG4gKiAtIFtcInplcm9cIl0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9wcmVzZXRzL3plcm8ubWpzKSAtXG4gKiAgIGFsbCBydWxlcyBkaXNhYmxlZC4gVXNlZnVsIHRvIHF1aWNrbHkgc2V0dXAgeW91ciBjb25maWcgdmlhIGAuZW5hYmxlKClgLlxuICogICBGb3IgZXhhbXBsZSwgd2hlbiB5b3UgbmVlZCBvbmx5IGBib2xkYCBhbmQgYGl0YWxpY2AgbWFya3VwIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogIyMjIyMgb3B0aW9uczpcbiAqXG4gKiAtIF9faHRtbF9fIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBlbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZS4gQmUgY2FyZWZ1bCFcbiAqICAgVGhhdCdzIG5vdCBzYWZlISBZb3UgbWF5IG5lZWQgZXh0ZXJuYWwgc2FuaXRpemVyIHRvIHByb3RlY3Qgb3V0cHV0IGZyb20gWFNTLlxuICogICBJdCdzIGJldHRlciB0byBleHRlbmQgZmVhdHVyZXMgdmlhIHBsdWdpbnMsIGluc3RlYWQgb2YgZW5hYmxpbmcgSFRNTC5cbiAqIC0gX194aHRtbE91dF9fIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBhZGQgJy8nIHdoZW4gY2xvc2luZyBzaW5nbGUgdGFnc1xuICogICAoYDxiciAvPmApLiBUaGlzIGlzIG5lZWRlZCBvbmx5IGZvciBmdWxsIENvbW1vbk1hcmsgY29tcGF0aWJpbGl0eS4gSW4gcmVhbFxuICogICB3b3JsZCB5b3Ugd2lsbCBuZWVkIEhUTUwgb3V0cHV0LlxuICogLSBfX2JyZWFrc19fIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBjb252ZXJ0IGBcXG5gIGluIHBhcmFncmFwaHMgaW50byBgPGJyPmAuXG4gKiAtIF9fbGFuZ1ByZWZpeF9fIC0gYGxhbmd1YWdlLWAuIENTUyBsYW5ndWFnZSBjbGFzcyBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3MuXG4gKiAgIENhbiBiZSB1c2VmdWwgZm9yIGV4dGVybmFsIGhpZ2hsaWdodGVycy5cbiAqIC0gX19saW5raWZ5X18gLSBgZmFsc2VgLiBTZXQgYHRydWVgIHRvIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHQgdG8gbGlua3MuXG4gKiAtIF9fdHlwb2dyYXBoZXJfXyAgLSBgZmFsc2VgLiBTZXQgYHRydWVgIHRvIGVuYWJsZSBbc29tZSBsYW5ndWFnZS1uZXV0cmFsXG4gKiAgIHJlcGxhY2VtZW50XShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3J1bGVzX2NvcmUvcmVwbGFjZW1lbnRzLm1qcykgK1xuICogICBxdW90ZXMgYmVhdXRpZmljYXRpb24gKHNtYXJ0cXVvdGVzKS5cbiAqIC0gX19xdW90ZXNfXyAtIGDigJzigJ3igJjigJlgLCBTdHJpbmcgb3IgQXJyYXkuIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnRcbiAqICAgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCBhbmQgc21hcnRxdW90ZXMgb24uIEZvciBleGFtcGxlLCB5b3UgY2FuXG4gKiAgIHVzZSBgJ8KrwrvigJ7igJwnYCBmb3IgUnVzc2lhbiwgYCfigJ7igJzigJrigJgnYCBmb3IgR2VybWFuLCBhbmRcbiAqICAgYFsnwqtcXHhBMCcsICdcXHhBMMK7JywgJ+KAuVxceEEwJywgJ1xceEEw4oC6J11gIGZvciBGcmVuY2ggKGluY2x1ZGluZyBuYnNwKS5cbiAqIC0gX19oaWdobGlnaHRfXyAtIGBudWxsYC4gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24gZm9yIGZlbmNlZCBjb2RlIGJsb2Nrcy5cbiAqICAgSGlnaGxpZ2h0ZXIgYGZ1bmN0aW9uIChzdHIsIGxhbmcpYCBzaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTC4gSXQgY2FuIGFsc29cbiAqICAgcmV0dXJuIGVtcHR5IHN0cmluZyBpZiB0aGUgc291cmNlIHdhcyBub3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIGVzY2FwZWRcbiAqICAgZXh0ZXJuYWx5LiBJZiByZXN1bHQgc3RhcnRzIHdpdGggPHByZS4uLiBpbnRlcm5hbCB3cmFwcGVyIGlzIHNraXBwZWQuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIGNvbW1vbm1hcmsgbW9kZVxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgnY29tbW9ubWFyaycpO1xuICpcbiAqIC8vIGRlZmF1bHQgbW9kZVxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIC8vIGVuYWJsZSBldmVyeXRoaW5nXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKHtcbiAqICAgaHRtbDogdHJ1ZSxcbiAqICAgbGlua2lmeTogdHJ1ZSxcbiAqICAgdHlwb2dyYXBoZXI6IHRydWVcbiAqIH0pO1xuICogYGBgXG4gKlxuICogIyMjIyMgU3ludGF4IGhpZ2hsaWdodGluZ1xuICpcbiAqIGBgYGpzXG4gKiB2YXIgaGxqcyA9IHJlcXVpcmUoJ2hpZ2hsaWdodC5qcycpIC8vIGh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuICpcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0Jykoe1xuICogICBoaWdobGlnaHQ6IGZ1bmN0aW9uIChzdHIsIGxhbmcpIHtcbiAqICAgICBpZiAobGFuZyAmJiBobGpzLmdldExhbmd1YWdlKGxhbmcpKSB7XG4gKiAgICAgICB0cnkge1xuICogICAgICAgICByZXR1cm4gaGxqcy5oaWdobGlnaHQoc3RyLCB7IGxhbmd1YWdlOiBsYW5nLCBpZ25vcmVJbGxlZ2FsczogdHJ1ZSB9KS52YWx1ZTtcbiAqICAgICAgIH0gY2F0Y2ggKF9fKSB7fVxuICogICAgIH1cbiAqXG4gKiAgICAgcmV0dXJuICcnOyAvLyB1c2UgZXh0ZXJuYWwgZGVmYXVsdCBlc2NhcGluZ1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIE9yIHdpdGggZnVsbCB3cmFwcGVyIG92ZXJyaWRlIChpZiB5b3UgbmVlZCBhc3NpZ24gY2xhc3MgdG8gYDxwcmU+YCBvciBgPGNvZGU+YCk6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIGhsanMgPSByZXF1aXJlKCdoaWdobGlnaHQuanMnKSAvLyBodHRwczovL2hpZ2hsaWdodGpzLm9yZy9cbiAqXG4gKiAvLyBBY3R1YWwgZGVmYXVsdCB2YWx1ZXNcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0Jykoe1xuICogICBoaWdobGlnaHQ6IGZ1bmN0aW9uIChzdHIsIGxhbmcpIHtcbiAqICAgICBpZiAobGFuZyAmJiBobGpzLmdldExhbmd1YWdlKGxhbmcpKSB7XG4gKiAgICAgICB0cnkge1xuICogICAgICAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJobGpzXCI+JyArXG4gKiAgICAgICAgICAgICAgICBobGpzLmhpZ2hsaWdodChzdHIsIHsgbGFuZ3VhZ2U6IGxhbmcsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pLnZhbHVlICtcbiAqICAgICAgICAgICAgICAgICc8L2NvZGU+PC9wcmU+JztcbiAqICAgICAgIH0gY2F0Y2ggKF9fKSB7fVxuICogICAgIH1cbiAqXG4gKiAgICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwiaGxqc1wiPicgKyBtZC51dGlscy5lc2NhcGVIdG1sKHN0cikgKyAnPC9jb2RlPjwvcHJlPic7XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKlxuICoqL1xuZnVuY3Rpb24gTWFya2Rvd25JdCAocHJlc2V0TmFtZSwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWFya2Rvd25JdCkpIHtcbiAgICByZXR1cm4gbmV3IE1hcmtkb3duSXQocHJlc2V0TmFtZSwgb3B0aW9ucylcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIGlmICghdXRpbHMuaXNTdHJpbmcocHJlc2V0TmFtZSkpIHtcbiAgICAgIG9wdGlvbnMgPSBwcmVzZXROYW1lIHx8IHt9XG4gICAgICBwcmVzZXROYW1lID0gJ2RlZmF1bHQnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjaW5saW5lIC0+IFBhcnNlcklubGluZVxuICAgKlxuICAgKiBJbnN0YW5jZSBvZiBbW1BhcnNlcklubGluZV1dLiBZb3UgbWF5IG5lZWQgaXQgdG8gYWRkIG5ldyBydWxlcyB3aGVuXG4gICAqIHdyaXRpbmcgcGx1Z2lucy4gRm9yIHNpbXBsZSBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dIGFuZFxuICAgKiBbW01hcmtkb3duSXQuZW5hYmxlXV0uXG4gICAqKi9cbiAgdGhpcy5pbmxpbmUgPSBuZXcgUGFyc2VySW5saW5lKClcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNibG9jayAtPiBQYXJzZXJCbG9ja1xuICAgKlxuICAgKiBJbnN0YW5jZSBvZiBbW1BhcnNlckJsb2NrXV0uIFlvdSBtYXkgbmVlZCBpdCB0byBhZGQgbmV3IHJ1bGVzIHdoZW5cbiAgICogd3JpdGluZyBwbHVnaW5zLiBGb3Igc2ltcGxlIHJ1bGVzIGNvbnRyb2wgdXNlIFtbTWFya2Rvd25JdC5kaXNhYmxlXV0gYW5kXG4gICAqIFtbTWFya2Rvd25JdC5lbmFibGVdXS5cbiAgICoqL1xuICB0aGlzLmJsb2NrID0gbmV3IFBhcnNlckJsb2NrKClcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNjb3JlIC0+IENvcmVcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tDb3JlXV0gY2hhaW4gZXhlY3V0b3IuIFlvdSBtYXkgbmVlZCBpdCB0byBhZGQgbmV3IHJ1bGVzIHdoZW5cbiAgICogd3JpdGluZyBwbHVnaW5zLiBGb3Igc2ltcGxlIHJ1bGVzIGNvbnRyb2wgdXNlIFtbTWFya2Rvd25JdC5kaXNhYmxlXV0gYW5kXG4gICAqIFtbTWFya2Rvd25JdC5lbmFibGVdXS5cbiAgICoqL1xuICB0aGlzLmNvcmUgPSBuZXcgUGFyc2VyQ29yZSgpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjcmVuZGVyZXIgLT4gUmVuZGVyZXJcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tSZW5kZXJlcl1dLiBVc2UgaXQgdG8gbW9kaWZ5IG91dHB1dCBsb29rLiBPciB0byBhZGQgcmVuZGVyaW5nXG4gICAqIHJ1bGVzIGZvciBuZXcgdG9rZW4gdHlwZXMsIGdlbmVyYXRlZCBieSBwbHVnaW5zLlxuICAgKlxuICAgKiAjIyMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICAgKlxuICAgKiBmdW5jdGlvbiBteVRva2VuKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNlbGYpIHtcbiAgICogICAvLy4uLlxuICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAqIH07XG4gICAqXG4gICAqIG1kLnJlbmRlcmVyLnJ1bGVzWydteV90b2tlbiddID0gbXlUb2tlblxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIFtbUmVuZGVyZXJdXSBkb2NzIGFuZCBbc291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcmVuZGVyZXIubWpzKS5cbiAgICoqL1xuICB0aGlzLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKClcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNsaW5raWZ5IC0+IExpbmtpZnlJdFxuICAgKlxuICAgKiBbbGlua2lmeS1pdF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L2xpbmtpZnktaXQpIGluc3RhbmNlLlxuICAgKiBVc2VkIGJ5IFtsaW5raWZ5XShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3J1bGVzX2NvcmUvbGlua2lmeS5tanMpXG4gICAqIHJ1bGUuXG4gICAqKi9cbiAgdGhpcy5saW5raWZ5ID0gbmV3IExpbmtpZnlJdCgpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjdmFsaWRhdGVMaW5rKHVybCkgLT4gQm9vbGVhblxuICAgKlxuICAgKiBMaW5rIHZhbGlkYXRpb24gZnVuY3Rpb24uIENvbW1vbk1hcmsgYWxsb3dzIHRvbyBtdWNoIGluIGxpbmtzLiBCeSBkZWZhdWx0XG4gICAqIHdlIGRpc2FibGUgYGphdmFzY3JpcHQ6YCwgYHZic2NyaXB0OmAsIGBmaWxlOmAgc2NoZW1hcywgYW5kIGFsbW9zdCBhbGwgYGRhdGE6Li4uYCBzY2hlbWFzXG4gICAqIGV4Y2VwdCBzb21lIGVtYmVkZGVkIGltYWdlIHR5cGVzLlxuICAgKlxuICAgKiBZb3UgY2FuIGNoYW5nZSB0aGlzIGJlaGF2aW91cjpcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gICAqIC8vIGVuYWJsZSBldmVyeXRoaW5nXG4gICAqIG1kLnZhbGlkYXRlTGluayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICogYGBgXG4gICAqKi9cbiAgdGhpcy52YWxpZGF0ZUxpbmsgPSB2YWxpZGF0ZUxpbmtcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNub3JtYWxpemVMaW5rKHVybCkgLT4gU3RyaW5nXG4gICAqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gZW5jb2RlIGxpbmsgdXJsIHRvIGEgbWFjaGluZS1yZWFkYWJsZSBmb3JtYXQsXG4gICAqIHdoaWNoIGluY2x1ZGVzIHVybC1lbmNvZGluZywgcHVueWNvZGUsIGV0Yy5cbiAgICoqL1xuICB0aGlzLm5vcm1hbGl6ZUxpbmsgPSBub3JtYWxpemVMaW5rXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjbm9ybWFsaXplTGlua1RleHQodXJsKSAtPiBTdHJpbmdcbiAgICpcbiAgICogRnVuY3Rpb24gdXNlZCB0byBkZWNvZGUgbGluayB1cmwgdG8gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXRgXG4gICAqKi9cbiAgdGhpcy5ub3JtYWxpemVMaW5rVGV4dCA9IG5vcm1hbGl6ZUxpbmtUZXh0XG5cbiAgLy8gRXhwb3NlIHV0aWxzICYgaGVscGVycyBmb3IgZWFzeSBhY2NlcyBmcm9tIHBsdWdpbnNcblxuICAvKipcbiAgICogTWFya2Rvd25JdCN1dGlscyAtPiB1dGlsc1xuICAgKlxuICAgKiBBc3NvcnRlZCB1dGlsaXR5IGZ1bmN0aW9ucywgdXNlZnVsIHRvIHdyaXRlIHBsdWdpbnMuIFNlZSBkZXRhaWxzXG4gICAqIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL2NvbW1vbi91dGlscy5tanMpLlxuICAgKiovXG4gIHRoaXMudXRpbHMgPSB1dGlsc1xuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2hlbHBlcnMgLT4gaGVscGVyc1xuICAgKlxuICAgKiBMaW5rIGNvbXBvbmVudHMgcGFyc2VyIGZ1bmN0aW9ucywgdXNlZnVsIHRvIHdyaXRlIHBsdWdpbnMuIFNlZSBkZXRhaWxzXG4gICAqIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL2hlbHBlcnMpLlxuICAgKiovXG4gIHRoaXMuaGVscGVycyA9IHV0aWxzLmFzc2lnbih7fSwgaGVscGVycylcblxuICB0aGlzLm9wdGlvbnMgPSB7fVxuICB0aGlzLmNvbmZpZ3VyZShwcmVzZXROYW1lKVxuXG4gIGlmIChvcHRpb25zKSB7IHRoaXMuc2V0KG9wdGlvbnMpIH1cbn1cblxuLyoqIGNoYWluYWJsZVxuICogTWFya2Rvd25JdC5zZXQob3B0aW9ucylcbiAqXG4gKiBTZXQgcGFyc2VyIG9wdGlvbnMgKGluIHRoZSBzYW1lIGZvcm1hdCBhcyBpbiBjb25zdHJ1Y3RvcikuIFByb2JhYmx5LCB5b3VcbiAqIHdpbGwgbmV2ZXIgbmVlZCBpdCwgYnV0IHlvdSBjYW4gY2hhbmdlIG9wdGlvbnMgYWZ0ZXIgY29uc3RydWN0b3IgY2FsbC5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpXG4gKiAgICAgICAgICAgICAuc2V0KHsgaHRtbDogdHJ1ZSwgYnJlYWtzOiB0cnVlIH0pXG4gKiAgICAgICAgICAgICAuc2V0KHsgdHlwb2dyYXBoZXIsIHRydWUgfSk7XG4gKiBgYGBcbiAqXG4gKiBfX05vdGU6X18gVG8gYWNoaWV2ZSB0aGUgYmVzdCBwb3NzaWJsZSBwZXJmb3JtYW5jZSwgZG9uJ3QgbW9kaWZ5IGFcbiAqIGBtYXJrZG93bi1pdGAgaW5zdGFuY2Ugb3B0aW9ucyBvbiB0aGUgZmx5LiBJZiB5b3UgbmVlZCBtdWx0aXBsZSBjb25maWd1cmF0aW9uc1xuICogaXQncyBiZXN0IHRvIGNyZWF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYW5kIGluaXRpYWxpemUgZWFjaCB3aXRoIHNlcGFyYXRlXG4gKiBjb25maWcuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICB1dGlscy5hc3NpZ24odGhpcy5vcHRpb25zLCBvcHRpb25zKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlLCBpbnRlcm5hbFxuICogTWFya2Rvd25JdC5jb25maWd1cmUocHJlc2V0cylcbiAqXG4gKiBCYXRjaCBsb2FkIG9mIGFsbCBvcHRpb25zIGFuZCBjb21wZW5lbnQgc2V0dGluZ3MuIFRoaXMgaXMgaW50ZXJuYWwgbWV0aG9kLFxuICogYW5kIHlvdSBwcm9iYWJseSB3aWxsIG5vdCBuZWVkIGl0LiBCdXQgaWYgeW91IHdpbGwgLSBzZWUgYXZhaWxhYmxlIHByZXNldHNcbiAqIGFuZCBkYXRhIHN0cnVjdHVyZSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L3RyZWUvbWFzdGVyL2xpYi9wcmVzZXRzKVxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgcHJlc2V0cyBpbnN0ZWFkIG9mIGRpcmVjdCBjb25maWcgbG9hZHMuIFRoYXRcbiAqIHdpbGwgZ2l2ZSBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIG5leHQgdmVyc2lvbnMuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5jb25maWd1cmUgPSBmdW5jdGlvbiAocHJlc2V0cykge1xuICBjb25zdCBzZWxmID0gdGhpc1xuXG4gIGlmICh1dGlscy5pc1N0cmluZyhwcmVzZXRzKSkge1xuICAgIGNvbnN0IHByZXNldE5hbWUgPSBwcmVzZXRzXG4gICAgcHJlc2V0cyA9IGNvbmZpZ1twcmVzZXROYW1lXVxuICAgIGlmICghcHJlc2V0cykgeyB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIGBtYXJrZG93bi1pdGAgcHJlc2V0IFwiJyArIHByZXNldE5hbWUgKyAnXCIsIGNoZWNrIG5hbWUnKSB9XG4gIH1cblxuICBpZiAoIXByZXNldHMpIHsgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBgbWFya2Rvd24taXRgIHByZXNldCwgY2FuXFwndCBiZSBlbXB0eScpIH1cblxuICBpZiAocHJlc2V0cy5vcHRpb25zKSB7IHNlbGYuc2V0KHByZXNldHMub3B0aW9ucykgfVxuXG4gIGlmIChwcmVzZXRzLmNvbXBvbmVudHMpIHtcbiAgICBPYmplY3Qua2V5cyhwcmVzZXRzLmNvbXBvbmVudHMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIGlmIChwcmVzZXRzLmNvbXBvbmVudHNbbmFtZV0ucnVsZXMpIHtcbiAgICAgICAgc2VsZltuYW1lXS5ydWxlci5lbmFibGVPbmx5KHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlcylcbiAgICAgIH1cbiAgICAgIGlmIChwcmVzZXRzLmNvbXBvbmVudHNbbmFtZV0ucnVsZXMyKSB7XG4gICAgICAgIHNlbGZbbmFtZV0ucnVsZXIyLmVuYWJsZU9ubHkocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzMilcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQuZW5hYmxlKGxpc3QsIGlnbm9yZUludmFsaWQpXG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IHJ1bGUgbmFtZSBvciBsaXN0IG9mIHJ1bGUgbmFtZXMgdG8gZW5hYmxlXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBFbmFibGUgbGlzdCBvciBydWxlcy4gSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGZpbmQgYXBwcm9wcmlhdGUgY29tcG9uZW50cyxcbiAqIGNvbnRhaW5pbmcgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcy4gSWYgcnVsZSBub3QgZm91bmQsIGFuZCBgaWdub3JlSW52YWxpZGBcbiAqIG5vdCBzZXQgLSB0aHJvd3MgZXhjZXB0aW9uLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKClcbiAqICAgICAgICAgICAgIC5lbmFibGUoWydzdWInLCAnc3VwJ10pXG4gKiAgICAgICAgICAgICAuZGlzYWJsZSgnc21hcnRxdW90ZXMnKTtcbiAqIGBgYFxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgbGV0IHJlc3VsdCA9IFtdXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIFsnY29yZScsICdibG9jaycsICdpbmxpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpc1tjaGFpbl0ucnVsZXIuZW5hYmxlKGxpc3QsIHRydWUpKVxuICB9LCB0aGlzKVxuXG4gIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpcy5pbmxpbmUucnVsZXIyLmVuYWJsZShsaXN0LCB0cnVlKSlcblxuICBjb25zdCBtaXNzZWQgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gcmVzdWx0LmluZGV4T2YobmFtZSkgPCAwIH0pXG5cbiAgaWYgKG1pc3NlZC5sZW5ndGggJiYgIWlnbm9yZUludmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcmtkb3duSXQuIEZhaWxlZCB0byBlbmFibGUgdW5rbm93biBydWxlKHMpOiAnICsgbWlzc2VkKVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTWFya2Rvd25JdC5kaXNhYmxlKGxpc3QsIGlnbm9yZUludmFsaWQpXG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IHJ1bGUgbmFtZSBvciBsaXN0IG9mIHJ1bGUgbmFtZXMgdG8gZGlzYWJsZS5cbiAqIC0gaWdub3JlSW52YWxpZCAoQm9vbGVhbik6IHNldCBgdHJ1ZWAgdG8gaWdub3JlIGVycm9ycyB3aGVuIHJ1bGUgbm90IGZvdW5kLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbTWFya2Rvd25JdC5lbmFibGVdXSwgYnV0IHR1cm4gc3BlY2lmaWVkIHJ1bGVzIG9mZi5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBsZXQgcmVzdWx0ID0gW11cblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgWydjb3JlJywgJ2Jsb2NrJywgJ2lubGluZSddLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzW2NoYWluXS5ydWxlci5kaXNhYmxlKGxpc3QsIHRydWUpKVxuICB9LCB0aGlzKVxuXG4gIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpcy5pbmxpbmUucnVsZXIyLmRpc2FibGUobGlzdCwgdHJ1ZSkpXG5cbiAgY29uc3QgbWlzc2VkID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHJlc3VsdC5pbmRleE9mKG5hbWUpIDwgMCB9KVxuXG4gIGlmIChtaXNzZWQubGVuZ3RoICYmICFpZ25vcmVJbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXJrZG93bkl0LiBGYWlsZWQgdG8gZGlzYWJsZSB1bmtub3duIHJ1bGUocyk6ICcgKyBtaXNzZWQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTWFya2Rvd25JdC51c2UocGx1Z2luLCBwYXJhbXMpXG4gKlxuICogTG9hZCBzcGVjaWZpZWQgcGx1Z2luIHdpdGggZ2l2ZW4gcGFyYW1zIGludG8gY3VycmVudCBwYXJzZXIgaW5zdGFuY2UuXG4gKiBJdCdzIGp1c3QgYSBzdWdhciB0byBjYWxsIGBwbHVnaW4obWQsIHBhcmFtcylgIHdpdGggY3VycmluZy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIGl0ZXJhdG9yID0gcmVxdWlyZSgnbWFya2Rvd24taXQtZm9yLWlubGluZScpO1xuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpXG4gKiAgICAgICAgICAgICAudXNlKGl0ZXJhdG9yLCAnZm9vX3JlcGxhY2UnLCAndGV4dCcsIGZ1bmN0aW9uICh0b2tlbnMsIGlkeCkge1xuICogICAgICAgICAgICAgICB0b2tlbnNbaWR4XS5jb250ZW50ID0gdG9rZW5zW2lkeF0uY29udGVudC5yZXBsYWNlKC9mb28vZywgJ2JhcicpO1xuICogICAgICAgICAgICAgfSk7XG4gKiBgYGBcbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4gLyosIHBhcmFtcywgLi4uICovKSB7XG4gIGNvbnN0IGFyZ3MgPSBbdGhpc10uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpXG4gIHBsdWdpbi5hcHBseShwbHVnaW4sIGFyZ3MpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBpbnRlcm5hbFxuICogTWFya2Rvd25JdC5wYXJzZShzcmMsIGVudikgLT4gQXJyYXlcbiAqIC0gc3JjIChTdHJpbmcpOiBzb3VyY2Ugc3RyaW5nXG4gKiAtIGVudiAoT2JqZWN0KTogZW52aXJvbm1lbnQgc2FuZGJveFxuICpcbiAqIFBhcnNlIGlucHV0IHN0cmluZyBhbmQgcmV0dXJuIGxpc3Qgb2YgYmxvY2sgdG9rZW5zIChzcGVjaWFsIHRva2VuIHR5cGVcbiAqIFwiaW5saW5lXCIgd2lsbCBjb250YWluIGxpc3Qgb2YgaW5saW5lIHRva2VucykuIFlvdSBzaG91bGQgbm90IGNhbGwgdGhpc1xuICogbWV0aG9kIGRpcmVjdGx5LCB1bnRpbCB5b3Ugd3JpdGUgY3VzdG9tIHJlbmRlcmVyIChmb3IgZXhhbXBsZSwgdG8gcHJvZHVjZVxuICogQVNUKS5cbiAqXG4gKiBgZW52YCBpcyB1c2VkIHRvIHBhc3MgZGF0YSBiZXR3ZWVuIFwiZGlzdHJpYnV0ZWRcIiBydWxlcyBhbmQgcmV0dXJuIGFkZGl0aW9uYWxcbiAqIG1ldGFkYXRhIGxpa2UgcmVmZXJlbmNlIGluZm8sIG5lZWRlZCBmb3IgdGhlIHJlbmRlcmVyLiBJdCBhbHNvIGNhbiBiZSB1c2VkIHRvXG4gKiBpbmplY3QgZGF0YSBpbiBzcGVjaWZpYyBjYXNlcy4gVXN1YWxseSwgeW91IHdpbGwgYmUgb2sgdG8gcGFzcyBge31gLFxuICogYW5kIHRoZW4gcGFzcyB1cGRhdGVkIG9iamVjdCB0byByZW5kZXJlci5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHNyYywgZW52KSB7XG4gIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBzaG91bGQgYmUgYSBTdHJpbmcnKVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSBuZXcgdGhpcy5jb3JlLlN0YXRlKHNyYywgdGhpcywgZW52KVxuXG4gIHRoaXMuY29yZS5wcm9jZXNzKHN0YXRlKVxuXG4gIHJldHVybiBzdGF0ZS50b2tlbnNcbn1cblxuLyoqXG4gKiBNYXJrZG93bkl0LnJlbmRlcihzcmMgWywgZW52XSkgLT4gU3RyaW5nXG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBSZW5kZXIgbWFya2Rvd24gc3RyaW5nIGludG8gaHRtbC4gSXQgZG9lcyBhbGwgbWFnaWMgZm9yIHlvdSA6KS5cbiAqXG4gKiBgZW52YCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYWRkaXRpb25hbCBtZXRhZGF0YSAoYHt9YCBieSBkZWZhdWx0KS5cbiAqIEJ1dCB5b3Ugd2lsbCBub3QgbmVlZCBpdCB3aXRoIGhpZ2ggcHJvYmFiaWxpdHkuIFNlZSBhbHNvIGNvbW1lbnRcbiAqIGluIFtbTWFya2Rvd25JdC5wYXJzZV1dLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHNyYywgZW52KSB7XG4gIGVudiA9IGVudiB8fCB7fVxuXG4gIHJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnBhcnNlKHNyYywgZW52KSwgdGhpcy5vcHRpb25zLCBlbnYpXG59XG5cbi8qKiBpbnRlcm5hbFxuICogTWFya2Rvd25JdC5wYXJzZUlubGluZShzcmMsIGVudikgLT4gQXJyYXlcbiAqIC0gc3JjIChTdHJpbmcpOiBzb3VyY2Ugc3RyaW5nXG4gKiAtIGVudiAoT2JqZWN0KTogZW52aXJvbm1lbnQgc2FuZGJveFxuICpcbiAqIFRoZSBzYW1lIGFzIFtbTWFya2Rvd25JdC5wYXJzZV1dIGJ1dCBza2lwIGFsbCBibG9jayBydWxlcy4gSXQgcmV0dXJucyB0aGVcbiAqIGJsb2NrIHRva2VucyBsaXN0IHdpdGggdGhlIHNpbmdsZSBgaW5saW5lYCBlbGVtZW50LCBjb250YWluaW5nIHBhcnNlZCBpbmxpbmVcbiAqIHRva2VucyBpbiBgY2hpbGRyZW5gIHByb3BlcnR5LiBBbHNvIHVwZGF0ZXMgYGVudmAgb2JqZWN0LlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUucGFyc2VJbmxpbmUgPSBmdW5jdGlvbiAoc3JjLCBlbnYpIHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgdGhpcy5jb3JlLlN0YXRlKHNyYywgdGhpcywgZW52KVxuXG4gIHN0YXRlLmlubGluZU1vZGUgPSB0cnVlXG4gIHRoaXMuY29yZS5wcm9jZXNzKHN0YXRlKVxuXG4gIHJldHVybiBzdGF0ZS50b2tlbnNcbn1cblxuLyoqXG4gKiBNYXJrZG93bkl0LnJlbmRlcklubGluZShzcmMgWywgZW52XSkgLT4gU3RyaW5nXG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBTaW1pbGFyIHRvIFtbTWFya2Rvd25JdC5yZW5kZXJdXSBidXQgZm9yIHNpbmdsZSBwYXJhZ3JhcGggY29udGVudC4gUmVzdWx0XG4gKiB3aWxsIE5PVCBiZSB3cmFwcGVkIGludG8gYDxwPmAgdGFncy5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnJlbmRlcklubGluZSA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBlbnYgPSBlbnYgfHwge31cblxuICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5wYXJzZUlubGluZShzcmMsIGVudiksIHRoaXMub3B0aW9ucywgZW52KVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXJrZG93bkl0XG4iLCIvLyBtYXJrZG93bi1pdCBkZWZhdWx0IG9wdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcHRpb25zOiB7XG4gICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICBodG1sOiBmYWxzZSxcblxuICAgIC8vIFVzZSAnLycgdG8gY2xvc2Ugc2luZ2xlIHRhZ3MgKDxiciAvPilcbiAgICB4aHRtbE91dDogZmFsc2UsXG5cbiAgICAvLyBDb252ZXJ0ICdcXG4nIGluIHBhcmFncmFwaHMgaW50byA8YnI+XG4gICAgYnJlYWtzOiBmYWxzZSxcblxuICAgIC8vIENTUyBsYW5ndWFnZSBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3NcbiAgICBsYW5nUHJlZml4OiAnbGFuZ3VhZ2UtJyxcblxuICAgIC8vIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHRzIHRvIGxpbmtzXG4gICAgbGlua2lmeTogZmFsc2UsXG5cbiAgICAvLyBFbmFibGUgc29tZSBsYW5ndWFnZS1uZXV0cmFsIHJlcGxhY2VtZW50cyArIHF1b3RlcyBiZWF1dGlmaWNhdGlvblxuICAgIHR5cG9ncmFwaGVyOiBmYWxzZSxcblxuICAgIC8vIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnQgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCxcbiAgICAvLyBhbmQgc21hcnRxdW90ZXMgb24uIENvdWxkIGJlIGVpdGhlciBhIFN0cmluZyBvciBhbiBBcnJheS5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSAnwqvCu+KAnuKAnCcgZm9yIFJ1c3NpYW4sICfigJ7igJzigJrigJgnIGZvciBHZXJtYW4sXG4gICAgLy8gYW5kIFsnwqtcXHhBMCcsICdcXHhBMMK7JywgJ+KAuVxceEEwJywgJ1xceEEw4oC6J10gZm9yIEZyZW5jaCAoaW5jbHVkaW5nIG5ic3ApLlxuICAgIHF1b3RlczogJ1xcdTIwMWNcXHUyMDFkXFx1MjAxOFxcdTIwMTknLCAvKiDigJzigJ3igJjigJkgKi9cblxuICAgIC8vIEhpZ2hsaWdodGVyIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTCxcbiAgICAvLyBvciAnJyBpZiB0aGUgc291cmNlIHN0cmluZyBpcyBub3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIGVzY2FwZWQgZXh0ZXJuYWx5LlxuICAgIC8vIElmIHJlc3VsdCBzdGFydHMgd2l0aCA8cHJlLi4uIGludGVybmFsIHdyYXBwZXIgaXMgc2tpcHBlZC5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uICgvKnN0ciwgbGFuZyovKSB7IHJldHVybiAnJzsgfVxuICAgIC8vXG4gICAgaGlnaGxpZ2h0OiBudWxsLFxuXG4gICAgLy8gSW50ZXJuYWwgcHJvdGVjdGlvbiwgcmVjdXJzaW9uIGxpbWl0XG4gICAgbWF4TmVzdGluZzogMTAwXG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIGNvcmU6IHt9LFxuICAgIGJsb2NrOiB7fSxcbiAgICBpbmxpbmU6IHt9XG4gIH1cbn1cbiIsIi8vIFwiWmVyb1wiIHByZXNldCwgd2l0aCBub3RoaW5nIGVuYWJsZWQuIFVzZWZ1bCBmb3IgbWFudWFsIGNvbmZpZ3VyaW5nIG9mIHNpbXBsZVxuLy8gbW9kZXMuIEZvciBleGFtcGxlLCB0byBwYXJzZSBib2xkL2l0YWxpYyBvbmx5LlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9wdGlvbnM6IHtcbiAgICAvLyBFbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZVxuICAgIGh0bWw6IGZhbHNlLFxuXG4gICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIHhodG1sT3V0OiBmYWxzZSxcblxuICAgIC8vIENvbnZlcnQgJ1xcbicgaW4gcGFyYWdyYXBocyBpbnRvIDxicj5cbiAgICBicmVha3M6IGZhbHNlLFxuXG4gICAgLy8gQ1NTIGxhbmd1YWdlIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrc1xuICAgIGxhbmdQcmVmaXg6ICdsYW5ndWFnZS0nLFxuXG4gICAgLy8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dHMgdG8gbGlua3NcbiAgICBsaW5raWZ5OiBmYWxzZSxcblxuICAgIC8vIEVuYWJsZSBzb21lIGxhbmd1YWdlLW5ldXRyYWwgcmVwbGFjZW1lbnRzICsgcXVvdGVzIGJlYXV0aWZpY2F0aW9uXG4gICAgdHlwb2dyYXBoZXI6IGZhbHNlLFxuXG4gICAgLy8gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudCBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkLFxuICAgIC8vIGFuZCBzbWFydHF1b3RlcyBvbi4gQ291bGQgYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGFuIEFycmF5LlxuICAgIC8vXG4gICAgLy8gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlICfCq8K74oCe4oCcJyBmb3IgUnVzc2lhbiwgJ+KAnuKAnOKAmuKAmCcgZm9yIEdlcm1hbixcbiAgICAvLyBhbmQgWyfCq1xceEEwJywgJ1xceEEwwrsnLCAn4oC5XFx4QTAnLCAnXFx4QTDigLonXSBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gICAgcXVvdGVzOiAnXFx1MjAxY1xcdTIwMWRcXHUyMDE4XFx1MjAxOScsIC8qIOKAnOKAneKAmOKAmSAqL1xuXG4gICAgLy8gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLFxuICAgIC8vIG9yICcnIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgZXNjYXBlZCBleHRlcm5hbHkuXG4gICAgLy8gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24gKC8qc3RyLCBsYW5nKi8pIHsgcmV0dXJuICcnOyB9XG4gICAgLy9cbiAgICBoaWdobGlnaHQ6IG51bGwsXG5cbiAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgICBtYXhOZXN0aW5nOiAyMFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcblxuICAgIGNvcmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAnYmxvY2snLFxuICAgICAgICAnaW5saW5lJyxcbiAgICAgICAgJ3RleHRfam9pbidcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgYmxvY2s6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdwYXJhZ3JhcGgnXG4gICAgICBdXG4gICAgfSxcblxuICAgIGlubGluZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ3RleHQnXG4gICAgICBdLFxuICAgICAgcnVsZXMyOiBbXG4gICAgICAgICdiYWxhbmNlX3BhaXJzJyxcbiAgICAgICAgJ2ZyYWdtZW50c19qb2luJ1xuICAgICAgXVxuICAgIH1cbiAgfVxufVxuIiwiLy8gQ29tbW9ubWFyayBkZWZhdWx0IG9wdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcHRpb25zOiB7XG4gICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICBodG1sOiB0cnVlLFxuXG4gICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIHhodG1sT3V0OiB0cnVlLFxuXG4gICAgLy8gQ29udmVydCAnXFxuJyBpbiBwYXJhZ3JhcGhzIGludG8gPGJyPlxuICAgIGJyZWFrczogZmFsc2UsXG5cbiAgICAvLyBDU1MgbGFuZ3VhZ2UgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzXG4gICAgbGFuZ1ByZWZpeDogJ2xhbmd1YWdlLScsXG5cbiAgICAvLyBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0cyB0byBsaW5rc1xuICAgIGxpbmtpZnk6IGZhbHNlLFxuXG4gICAgLy8gRW5hYmxlIHNvbWUgbGFuZ3VhZ2UtbmV1dHJhbCByZXBsYWNlbWVudHMgKyBxdW90ZXMgYmVhdXRpZmljYXRpb25cbiAgICB0eXBvZ3JhcGhlcjogZmFsc2UsXG5cbiAgICAvLyBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50IHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQsXG4gICAgLy8gYW5kIHNtYXJ0cXVvdGVzIG9uLiBDb3VsZCBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYW4gQXJyYXkuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgJ8KrwrvigJ7igJwnIGZvciBSdXNzaWFuLCAn4oCe4oCc4oCa4oCYJyBmb3IgR2VybWFuLFxuICAgIC8vIGFuZCBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddIGZvciBGcmVuY2ggKGluY2x1ZGluZyBuYnNwKS5cbiAgICBxdW90ZXM6ICdcXHUyMDFjXFx1MjAxZFxcdTIwMThcXHUyMDE5JywgLyog4oCc4oCd4oCY4oCZICovXG5cbiAgICAvLyBIaWdobGlnaHRlciBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwsXG4gICAgLy8gb3IgJycgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkIGV4dGVybmFseS5cbiAgICAvLyBJZiByZXN1bHQgc3RhcnRzIHdpdGggPHByZS4uLiBpbnRlcm5hbCB3cmFwcGVyIGlzIHNraXBwZWQuXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiAoLypzdHIsIGxhbmcqLykgeyByZXR1cm4gJyc7IH1cbiAgICAvL1xuICAgIGhpZ2hsaWdodDogbnVsbCxcblxuICAgIC8vIEludGVybmFsIHByb3RlY3Rpb24sIHJlY3Vyc2lvbiBsaW1pdFxuICAgIG1heE5lc3Rpbmc6IDIwXG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuXG4gICAgY29yZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdibG9jaycsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAndGV4dF9qb2luJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBibG9jazoge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAnY29kZScsXG4gICAgICAgICdmZW5jZScsXG4gICAgICAgICdoZWFkaW5nJyxcbiAgICAgICAgJ2hyJyxcbiAgICAgICAgJ2h0bWxfYmxvY2snLFxuICAgICAgICAnbGhlYWRpbmcnLFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgICdyZWZlcmVuY2UnLFxuICAgICAgICAncGFyYWdyYXBoJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBpbmxpbmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdhdXRvbGluaycsXG4gICAgICAgICdiYWNrdGlja3MnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZW50aXR5JyxcbiAgICAgICAgJ2VzY2FwZScsXG4gICAgICAgICdodG1sX2lubGluZScsXG4gICAgICAgICdpbWFnZScsXG4gICAgICAgICdsaW5rJyxcbiAgICAgICAgJ25ld2xpbmUnLFxuICAgICAgICAndGV4dCdcbiAgICAgIF0sXG4gICAgICBydWxlczI6IFtcbiAgICAgICAgJ2JhbGFuY2VfcGFpcnMnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZnJhZ21lbnRzX2pvaW4nXG4gICAgICBdXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBTY2hlbWEsIE1hcmsgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgTWFya2Rvd25JdCBmcm9tICdtYXJrZG93bi1pdCc7XG5cbi8qKlxuRG9jdW1lbnQgc2NoZW1hIGZvciB0aGUgZGF0YSBtb2RlbCB1c2VkIGJ5IENvbW1vbk1hcmsuXG4qL1xuY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYSh7XG4gICAgbm9kZXM6IHtcbiAgICAgICAgZG9jOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFncmFwaDoge1xuICAgICAgICAgICAgY29udGVudDogXCJpbmxpbmUqXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJwXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcInBcIiwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgYmxvY2txdW90ZToge1xuICAgICAgICAgICAgY29udGVudDogXCJibG9jaytcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImJsb2NrcXVvdGVcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiYmxvY2txdW90ZVwiLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBob3Jpem9udGFsX3J1bGU6IHtcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImhyXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImRpdlwiLCBbXCJoclwiXV07IH1cbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGluZzoge1xuICAgICAgICAgICAgYXR0cnM6IHsgbGV2ZWw6IHsgZGVmYXVsdDogMSB9IH0sXG4gICAgICAgICAgICBjb250ZW50OiBcIih0ZXh0IHwgaW1hZ2UpKlwiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoMVwiLCBhdHRyczogeyBsZXZlbDogMSB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDJcIiwgYXR0cnM6IHsgbGV2ZWw6IDIgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImgzXCIsIGF0dHJzOiB7IGxldmVsOiAzIH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoNFwiLCBhdHRyczogeyBsZXZlbDogNCB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDVcIiwgYXR0cnM6IHsgbGV2ZWw6IDUgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImg2XCIsIGF0dHJzOiB7IGxldmVsOiA2IH0gfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBjb2RlX2Jsb2NrOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcInRleHQqXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICAgICAgbWFya3M6IFwiXCIsXG4gICAgICAgICAgICBhdHRyczogeyBwYXJhbXM6IHsgZGVmYXVsdDogXCJcIiB9IH0sXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInByZVwiLCBwcmVzZXJ2ZVdoaXRlc3BhY2U6IFwiZnVsbFwiLCBnZXRBdHRyczogbm9kZSA9PiAoeyBwYXJhbXM6IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYXJhbXNcIikgfHwgXCJcIiB9KSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcInByZVwiLCBub2RlLmF0dHJzLnBhcmFtcyA/IHsgXCJkYXRhLXBhcmFtc1wiOiBub2RlLmF0dHJzLnBhcmFtcyB9IDoge30sIFtcImNvZGVcIiwgMF1dOyB9XG4gICAgICAgIH0sXG4gICAgICAgIG9yZGVyZWRfbGlzdDoge1xuICAgICAgICAgICAgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgYXR0cnM6IHsgb3JkZXI6IHsgZGVmYXVsdDogMSB9LCB0aWdodDogeyBkZWZhdWx0OiBmYWxzZSB9IH0sXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcIm9sXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JkZXI6IGRvbS5oYXNBdHRyaWJ1dGUoXCJzdGFydFwiKSA/ICtkb20uZ2V0QXR0cmlidXRlKFwic3RhcnRcIikgOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZ2h0OiBkb20uaGFzQXR0cmlidXRlKFwiZGF0YS10aWdodFwiKSB9O1xuICAgICAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyID09IDEgPyBudWxsIDogbm9kZS5hdHRycy5vcmRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS10aWdodFwiOiBub2RlLmF0dHJzLnRpZ2h0ID8gXCJ0cnVlXCIgOiBudWxsIH0sIDBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBidWxsZXRfbGlzdDoge1xuICAgICAgICAgICAgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgYXR0cnM6IHsgdGlnaHQ6IHsgZGVmYXVsdDogZmFsc2UgfSB9LFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ1bFwiLCBnZXRBdHRyczogZG9tID0+ICh7IHRpZ2h0OiBkb20uaGFzQXR0cmlidXRlKFwiZGF0YS10aWdodFwiKSB9KSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcInVsXCIsIHsgXCJkYXRhLXRpZ2h0XCI6IG5vZGUuYXR0cnMudGlnaHQgPyBcInRydWVcIiA6IG51bGwgfSwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgbGlzdF9pdGVtOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiLFxuICAgICAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImxpXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImxpXCIsIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIHRleHQ6IHtcbiAgICAgICAgICAgIGdyb3VwOiBcImlubGluZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIHNyYzoge30sXG4gICAgICAgICAgICAgICAgYWx0OiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICAgICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaW1nW3NyY11cIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogZG9tLmdldEF0dHJpYnV0ZShcInNyY1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogZG9tLmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcImltZ1wiLCBub2RlLmF0dHJzXTsgfVxuICAgICAgICB9LFxuICAgICAgICBoYXJkX2JyZWFrOiB7XG4gICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJiclwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJiclwiXTsgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtYXJrczoge1xuICAgICAgICBlbToge1xuICAgICAgICAgICAgcGFyc2VET006IFtcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJpXCIgfSwgeyB0YWc6IFwiZW1cIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1pdGFsaWNcIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1ub3JtYWxcIiwgY2xlYXJNYXJrOiBtID0+IG0udHlwZS5uYW1lID09IFwiZW1cIiB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJlbVwiXTsgfVxuICAgICAgICB9LFxuICAgICAgICBzdHJvbmc6IHtcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwic3Ryb25nXCIgfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJiXCIsIGdldEF0dHJzOiBub2RlID0+IG5vZGUuc3R5bGUuZm9udFdlaWdodCAhPSBcIm5vcm1hbFwiICYmIG51bGwgfSxcbiAgICAgICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtd2VpZ2h0PTQwMFwiLCBjbGVhck1hcms6IG0gPT4gbS50eXBlLm5hbWUgPT0gXCJzdHJvbmdcIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHRcIiwgZ2V0QXR0cnM6IHZhbHVlID0+IC9eKGJvbGQoZXIpP3xbNS05XVxcZHsyLH0pJC8udGVzdCh2YWx1ZSkgJiYgbnVsbCB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJzdHJvbmdcIl07IH1cbiAgICAgICAgfSxcbiAgICAgICAgbGluazoge1xuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICBocmVmOiB7fSxcbiAgICAgICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJhW2hyZWZdXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaHJlZjogZG9tLmdldEF0dHJpYnV0ZShcImhyZWZcIiksIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcImFcIiwgbm9kZS5hdHRyc107IH1cbiAgICAgICAgfSxcbiAgICAgICAgY29kZToge1xuICAgICAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiY29kZVwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJjb2RlXCJdOyB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLy8gQHRzLWlnbm9yZVxuZnVuY3Rpb24gbWF5YmVNZXJnZShhLCBiKSB7XG4gICAgaWYgKGEuaXNUZXh0ICYmIGIuaXNUZXh0ICYmIE1hcmsuc2FtZVNldChhLm1hcmtzLCBiLm1hcmtzKSlcbiAgICAgICAgcmV0dXJuIGEud2l0aFRleHQoYS50ZXh0ICsgYi50ZXh0KTtcbn1cbi8vIE9iamVjdCB1c2VkIHRvIHRyYWNrIHRoZSBjb250ZXh0IG9mIGEgcnVubmluZyBwYXJzZS5cbmNsYXNzIE1hcmtkb3duUGFyc2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCB0b2tlbkhhbmRsZXJzKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnRva2VuSGFuZGxlcnMgPSB0b2tlbkhhbmRsZXJzO1xuICAgICAgICB0aGlzLnN0YWNrID0gW3sgdHlwZTogc2NoZW1hLnRvcE5vZGVUeXBlLCBhdHRyczogbnVsbCwgY29udGVudDogW10sIG1hcmtzOiBNYXJrLm5vbmUgfV07XG4gICAgfVxuICAgIHRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcHVzaChlbHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy50b3AoKS5jb250ZW50LnB1c2goZWx0KTtcbiAgICB9XG4gICAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQsXG4gICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgbWFya3MgYXMgc3R5bGluZy5cbiAgICBhZGRUZXh0KHRleHQpIHtcbiAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKSwgbm9kZXMgPSB0b3AuY29udGVudCwgbGFzdCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuc2NoZW1hLnRleHQodGV4dCwgdG9wLm1hcmtzKSwgbWVyZ2VkO1xuICAgICAgICBpZiAobGFzdCAmJiAobWVyZ2VkID0gbWF5YmVNZXJnZShsYXN0LCBub2RlKSkpXG4gICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG1lcmdlZDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgLy8gQWRkcyB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcy5cbiAgICBvcGVuTWFyayhtYXJrKSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCgpO1xuICAgICAgICB0b3AubWFya3MgPSBtYXJrLmFkZFRvU2V0KHRvcC5tYXJrcyk7XG4gICAgfVxuICAgIC8vIFJlbW92ZXMgdGhlIGdpdmVuIG1hcmsgZnJvbSB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcy5cbiAgICBjbG9zZU1hcmsobWFyaykge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKTtcbiAgICAgICAgdG9wLm1hcmtzID0gbWFyay5yZW1vdmVGcm9tU2V0KHRvcC5tYXJrcyk7XG4gICAgfVxuICAgIHBhcnNlVG9rZW5zKHRva3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9rID0gdG9rc1tpXTtcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gdGhpcy50b2tlbkhhbmRsZXJzW3Rvay50eXBlXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiB0eXBlIGBcIiArIHRvay50eXBlICsgXCJgIG5vdCBzdXBwb3J0ZWQgYnkgTWFya2Rvd24gcGFyc2VyXCIpO1xuICAgICAgICAgICAgaGFuZGxlcih0aGlzLCB0b2ssIHRva3MsIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBhIG5vZGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgYWRkTm9kZSh0eXBlLCBhdHRycywgY29udGVudCkge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKTtcbiAgICAgICAgbGV0IG5vZGUgPSB0eXBlLmNyZWF0ZUFuZEZpbGwoYXR0cnMsIGNvbnRlbnQsIHRvcCA/IHRvcC5tYXJrcyA6IFtdKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMucHVzaChub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8vIFdyYXAgc3Vic2VxdWVudCBjb250ZW50IGluIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAgICBvcGVuTm9kZSh0eXBlLCBhdHRycykge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyB0eXBlOiB0eXBlLCBhdHRyczogYXR0cnMsIGNvbnRlbnQ6IFtdLCBtYXJrczogTWFyay5ub25lIH0pO1xuICAgIH1cbiAgICAvLyBDbG9zZSBhbmQgcmV0dXJuIHRoZSBub2RlIHRoYXQgaXMgY3VycmVudGx5IG9uIHRvcCBvZiB0aGUgc3RhY2suXG4gICAgY2xvc2VOb2RlKCkge1xuICAgICAgICBsZXQgaW5mbyA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZE5vZGUoaW5mby50eXBlLCBpbmZvLmF0dHJzLCBpbmZvLmNvbnRlbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJzKHNwZWMsIHRva2VuLCB0b2tlbnMsIGkpIHtcbiAgICBpZiAoc3BlYy5nZXRBdHRycylcbiAgICAgICAgcmV0dXJuIHNwZWMuZ2V0QXR0cnModG9rZW4sIHRva2VucywgaSk7XG4gICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdoZW4gYGF0dHJzYCBpcyBhIEZ1bmN0aW9uXG4gICAgZWxzZSBpZiAoc3BlYy5hdHRycyBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXR1cm4gc3BlYy5hdHRycyh0b2tlbik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gc3BlYy5hdHRycztcbn1cbi8vIENvZGUgY29udGVudCBpcyByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSB0b2tlbiB3aXRoIGEgYGNvbnRlbnRgXG4vLyBwcm9wZXJ0eSBpbiBNYXJrZG93bi1pdC5cbmZ1bmN0aW9uIG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSB7XG4gICAgcmV0dXJuIHNwZWMubm9DbG9zZVRva2VuIHx8IHR5cGUgPT0gXCJjb2RlX2lubGluZVwiIHx8IHR5cGUgPT0gXCJjb2RlX2Jsb2NrXCIgfHwgdHlwZSA9PSBcImZlbmNlXCI7XG59XG5mdW5jdGlvbiB3aXRob3V0VHJhaWxpbmdOZXdsaW5lKHN0cikge1xuICAgIHJldHVybiBzdHJbc3RyLmxlbmd0aCAtIDFdID09IFwiXFxuXCIgPyBzdHIuc2xpY2UoMCwgc3RyLmxlbmd0aCAtIDEpIDogc3RyO1xufVxuZnVuY3Rpb24gbm9PcCgpIHsgfVxuZnVuY3Rpb24gdG9rZW5IYW5kbGVycyhzY2hlbWEsIHRva2Vucykge1xuICAgIGxldCBoYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiB0b2tlbnMpIHtcbiAgICAgICAgbGV0IHNwZWMgPSB0b2tlbnNbdHlwZV07XG4gICAgICAgIGlmIChzcGVjLmJsb2NrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZVR5cGUgPSBzY2hlbWEubm9kZVR5cGUoc3BlYy5ibG9jayk7XG4gICAgICAgICAgICBpZiAobm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLm9wZW5Ob2RlKG5vZGVUeXBlLCBhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRUZXh0KHdpdGhvdXRUcmFpbGluZ05ld2xpbmUodG9rLmNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2xvc2VOb2RlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9vcGVuXCJdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4gc3RhdGUub3Blbk5vZGUobm9kZVR5cGUsIGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX2Nsb3NlXCJdID0gc3RhdGUgPT4gc3RhdGUuY2xvc2VOb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BlYy5ub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZVR5cGUgPSBzY2hlbWEubm9kZVR5cGUoc3BlYy5ub2RlKTtcbiAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4gc3RhdGUuYWRkTm9kZShub2RlVHlwZSwgYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGVjLm1hcmspIHtcbiAgICAgICAgICAgIGxldCBtYXJrVHlwZSA9IHNjaGVtYS5tYXJrc1tzcGVjLm1hcmtdO1xuICAgICAgICAgICAgaWYgKG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5vcGVuTWFyayhtYXJrVHlwZS5jcmVhdGUoYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmFkZFRleHQod2l0aG91dFRyYWlsaW5nTmV3bGluZSh0b2suY29udGVudCkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jbG9zZU1hcmsobWFya1R5cGUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfb3BlblwiXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHN0YXRlLm9wZW5NYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfY2xvc2VcIl0gPSBzdGF0ZSA9PiBzdGF0ZS5jbG9zZU1hcmsobWFya1R5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwZWMuaWdub3JlKSB7XG4gICAgICAgICAgICBpZiAobm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSBub09wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX29wZW5cIl0gPSBub09wO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9jbG9zZVwiXSA9IG5vT3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVucmVjb2duaXplZCBwYXJzaW5nIHNwZWMgXCIgKyBKU09OLnN0cmluZ2lmeShzcGVjKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlcnMudGV4dCA9IChzdGF0ZSwgdG9rKSA9PiBzdGF0ZS5hZGRUZXh0KHRvay5jb250ZW50KTtcbiAgICBoYW5kbGVycy5pbmxpbmUgPSAoc3RhdGUsIHRvaykgPT4gc3RhdGUucGFyc2VUb2tlbnModG9rLmNoaWxkcmVuKTtcbiAgICBoYW5kbGVycy5zb2Z0YnJlYWsgPSBoYW5kbGVycy5zb2Z0YnJlYWsgfHwgKHN0YXRlID0+IHN0YXRlLmFkZFRleHQoXCIgXCIpKTtcbiAgICByZXR1cm4gaGFuZGxlcnM7XG59XG4vKipcbkEgY29uZmlndXJhdGlvbiBvZiBhIE1hcmtkb3duIHBhcnNlci4gU3VjaCBhIHBhcnNlciB1c2VzXG5bbWFya2Rvd24taXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdCkgdG9cbnRva2VuaXplIGEgZmlsZSwgYW5kIHRoZW4gcnVucyB0aGUgY3VzdG9tIHJ1bGVzIGl0IGlzIGdpdmVuIG92ZXJcbnRoZSB0b2tlbnMgdG8gY3JlYXRlIGEgUHJvc2VNaXJyb3IgZG9jdW1lbnQgdHJlZS5cbiovXG5jbGFzcyBNYXJrZG93blBhcnNlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGFyc2VyIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY29uZmlndXJlXG4gICAgdGhlIG1hcmtkb3duLWl0IHBhcnNlciB0byBwYXJzZSB0aGUgZGlhbGVjdCB5b3Ugd2FudCwgYW5kIHByb3ZpZGVcbiAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBQcm9zZU1pcnJvciBlbnRpdGllcyB0aG9zZSB0b2tlbnMgbWFwIHRvIGluXG4gICAgdGhlIGB0b2tlbnNgIG9iamVjdCwgd2hpY2ggbWFwcyB0b2tlbiBuYW1lcyB0byBkZXNjcmlwdGlvbnMgb2ZcbiAgICB3aGF0IHRvIGRvIHdpdGggdGhlbS4gU3VjaCBhIGRlc2NyaXB0aW9uIGlzIGFuIG9iamVjdCwgYW5kIG1heVxuICAgIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlcidzIGRvY3VtZW50IHNjaGVtYS5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhpcyBwYXJzZXIncyBtYXJrZG93bi1pdCB0b2tlbml6ZXIuXG4gICAgKi9cbiAgICB0b2tlbml6ZXIsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGUgYHRva2Vuc2Agb2JqZWN0IHVzZWQgdG8gY29uc3RydWN0IHRoaXNcbiAgICBwYXJzZXIuIENhbiBiZSB1c2VmdWwgdG8gY29weSBhbmQgbW9kaWZ5IHRvIGJhc2Ugb3RoZXIgcGFyc2Vyc1xuICAgIG9uLlxuICAgICovXG4gICAgdG9rZW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnRva2VuaXplciA9IHRva2VuaXplcjtcbiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgIHRoaXMudG9rZW5IYW5kbGVycyA9IHRva2VuSGFuZGxlcnMoc2NoZW1hLCB0b2tlbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZSBhIHN0cmluZyBhcyBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykgbWFya3VwLFxuICAgIGFuZCBjcmVhdGUgYSBQcm9zZU1pcnJvciBkb2N1bWVudCBhcyBwcmVzY3JpYmVkIGJ5IHRoaXMgcGFyc2VyJ3NcbiAgICBydWxlcy5cbiAgICBcbiAgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCB3aGVuIGdpdmVuLCBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGVcbiAgICBbTWFya2Rvd25cbiAgICBwYXJzZXJdKGh0dHBzOi8vbWFya2Rvd24taXQuZ2l0aHViLmlvL21hcmtkb3duLWl0LyNNYXJrZG93bkl0LnBhcnNlKS5cbiAgICAqL1xuICAgIHBhcnNlKHRleHQsIG1hcmtkb3duRW52ID0ge30pIHtcbiAgICAgICAgbGV0IHN0YXRlID0gbmV3IE1hcmtkb3duUGFyc2VTdGF0ZSh0aGlzLnNjaGVtYSwgdGhpcy50b2tlbkhhbmRsZXJzKSwgZG9jO1xuICAgICAgICBzdGF0ZS5wYXJzZVRva2Vucyh0aGlzLnRva2VuaXplci5wYXJzZSh0ZXh0LCBtYXJrZG93bkVudikpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBkb2MgPSBzdGF0ZS5jbG9zZU5vZGUoKTtcbiAgICAgICAgfSB3aGlsZSAoc3RhdGUuc3RhY2subGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGRvYyB8fCB0aGlzLnNjaGVtYS50b3BOb2RlVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdElzVGlnaHQodG9rZW5zLCBpKSB7XG4gICAgd2hpbGUgKCsraSA8IHRva2Vucy5sZW5ndGgpXG4gICAgICAgIGlmICh0b2tlbnNbaV0udHlwZSAhPSBcImxpc3RfaXRlbV9vcGVuXCIpXG4gICAgICAgICAgICByZXR1cm4gdG9rZW5zW2ldLmhpZGRlbjtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbkEgcGFyc2VyIHBhcnNpbmcgdW5leHRlbmRlZCBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLyksXG53aXRob3V0IGlubGluZSBIVE1MLCBhbmQgcHJvZHVjaW5nIGEgZG9jdW1lbnQgaW4gdGhlIGJhc2ljIHNjaGVtYS5cbiovXG5jb25zdCBkZWZhdWx0TWFya2Rvd25QYXJzZXIgPSBuZXcgTWFya2Rvd25QYXJzZXIoc2NoZW1hLCBNYXJrZG93bkl0KFwiY29tbW9ubWFya1wiLCB7IGh0bWw6IGZhbHNlIH0pLCB7XG4gICAgYmxvY2txdW90ZTogeyBibG9jazogXCJibG9ja3F1b3RlXCIgfSxcbiAgICBwYXJhZ3JhcGg6IHsgYmxvY2s6IFwicGFyYWdyYXBoXCIgfSxcbiAgICBsaXN0X2l0ZW06IHsgYmxvY2s6IFwibGlzdF9pdGVtXCIgfSxcbiAgICBidWxsZXRfbGlzdDogeyBibG9jazogXCJidWxsZXRfbGlzdFwiLCBnZXRBdHRyczogKF8sIHRva2VucywgaSkgPT4gKHsgdGlnaHQ6IGxpc3RJc1RpZ2h0KHRva2VucywgaSkgfSkgfSxcbiAgICBvcmRlcmVkX2xpc3Q6IHsgYmxvY2s6IFwib3JkZXJlZF9saXN0XCIsIGdldEF0dHJzOiAodG9rLCB0b2tlbnMsIGkpID0+ICh7XG4gICAgICAgICAgICBvcmRlcjogK3Rvay5hdHRyR2V0KFwic3RhcnRcIikgfHwgMSxcbiAgICAgICAgICAgIHRpZ2h0OiBsaXN0SXNUaWdodCh0b2tlbnMsIGkpXG4gICAgICAgIH0pIH0sXG4gICAgaGVhZGluZzogeyBibG9jazogXCJoZWFkaW5nXCIsIGdldEF0dHJzOiB0b2sgPT4gKHsgbGV2ZWw6ICt0b2sudGFnLnNsaWNlKDEpIH0pIH0sXG4gICAgY29kZV9ibG9jazogeyBibG9jazogXCJjb2RlX2Jsb2NrXCIsIG5vQ2xvc2VUb2tlbjogdHJ1ZSB9LFxuICAgIGZlbmNlOiB7IGJsb2NrOiBcImNvZGVfYmxvY2tcIiwgZ2V0QXR0cnM6IHRvayA9PiAoeyBwYXJhbXM6IHRvay5pbmZvIHx8IFwiXCIgfSksIG5vQ2xvc2VUb2tlbjogdHJ1ZSB9LFxuICAgIGhyOiB7IG5vZGU6IFwiaG9yaXpvbnRhbF9ydWxlXCIgfSxcbiAgICBpbWFnZTogeyBub2RlOiBcImltYWdlXCIsIGdldEF0dHJzOiB0b2sgPT4gKHtcbiAgICAgICAgICAgIHNyYzogdG9rLmF0dHJHZXQoXCJzcmNcIiksXG4gICAgICAgICAgICB0aXRsZTogdG9rLmF0dHJHZXQoXCJ0aXRsZVwiKSB8fCBudWxsLFxuICAgICAgICAgICAgYWx0OiB0b2suY2hpbGRyZW5bMF0gJiYgdG9rLmNoaWxkcmVuWzBdLmNvbnRlbnQgfHwgbnVsbFxuICAgICAgICB9KSB9LFxuICAgIGhhcmRicmVhazogeyBub2RlOiBcImhhcmRfYnJlYWtcIiB9LFxuICAgIGVtOiB7IG1hcms6IFwiZW1cIiB9LFxuICAgIHN0cm9uZzogeyBtYXJrOiBcInN0cm9uZ1wiIH0sXG4gICAgbGluazogeyBtYXJrOiBcImxpbmtcIiwgZ2V0QXR0cnM6IHRvayA9PiAoe1xuICAgICAgICAgICAgaHJlZjogdG9rLmF0dHJHZXQoXCJocmVmXCIpLFxuICAgICAgICAgICAgdGl0bGU6IHRvay5hdHRyR2V0KFwidGl0bGVcIikgfHwgbnVsbFxuICAgICAgICB9KSB9LFxuICAgIGNvZGVfaW5saW5lOiB7IG1hcms6IFwiY29kZVwiLCBub0Nsb3NlVG9rZW46IHRydWUgfVxufSk7XG5cbmNvbnN0IGJsYW5rTWFyayA9IHsgb3BlbjogXCJcIiwgY2xvc2U6IFwiXCIsIG1peGFibGU6IHRydWUgfTtcbi8qKlxuQSBzcGVjaWZpY2F0aW9uIGZvciBzZXJpYWxpemluZyBhIFByb3NlTWlycm9yIGRvY3VtZW50IGFzXG5NYXJrZG93bi9Db21tb25NYXJrIHRleHQuXG4qL1xuY2xhc3MgTWFya2Rvd25TZXJpYWxpemVyIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBzZXJpYWxpemVyIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIFRoZSBgbm9kZXNgXG4gICAgb2JqZWN0IHNob3VsZCBtYXAgbm9kZSBuYW1lcyBpbiBhIGdpdmVuIHNjaGVtYSB0byBmdW5jdGlvbiB0aGF0XG4gICAgdGFrZSBhIHNlcmlhbGl6ZXIgc3RhdGUgYW5kIHN1Y2ggYSBub2RlLCBhbmQgc2VyaWFsaXplIHRoZSBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2VyaWFsaXplciBmdW5jdGlvbnMgZm9yIHRoaXMgc2VyaWFsaXplci5cbiAgICAqL1xuICAgIG5vZGVzLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayBzZXJpYWxpemVyIGluZm8uXG4gICAgKi9cbiAgICBtYXJrcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgdG9cbiAgICBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykuXG4gICAgKi9cbiAgICBzZXJpYWxpemUoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgc3RhdGUgPSBuZXcgTWFya2Rvd25TZXJpYWxpemVyU3RhdGUodGhpcy5ub2RlcywgdGhpcy5tYXJrcywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnJlbmRlckNvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5vdXQ7XG4gICAgfVxufVxuLyoqXG5BIHNlcmlhbGl6ZXIgZm9yIHRoZSBbYmFzaWMgc2NoZW1hXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hKS5cbiovXG5jb25zdCBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyID0gbmV3IE1hcmtkb3duU2VyaWFsaXplcih7XG4gICAgYmxvY2txdW90ZShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cmFwQmxvY2soXCI+IFwiLCBudWxsLCBub2RlLCAoKSA9PiBzdGF0ZS5yZW5kZXJDb250ZW50KG5vZGUpKTtcbiAgICB9LFxuICAgIGNvZGVfYmxvY2soc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmcm9udCBtYXR0ZXIgZmVuY2VzIGFyZSBsb25nZXIgdGhhbiBhbnkgZGFzaCBzZXF1ZW5jZSB3aXRoaW4gaXRcbiAgICAgICAgY29uc3QgYmFja3RpY2tzID0gbm9kZS50ZXh0Q29udGVudC5tYXRjaCgvYHszLH0vZ20pO1xuICAgICAgICBjb25zdCBmZW5jZSA9IGJhY2t0aWNrcyA/IChiYWNrdGlja3Muc29ydCgpLnNsaWNlKC0xKVswXSArIFwiYFwiKSA6IFwiYGBgXCI7XG4gICAgICAgIHN0YXRlLndyaXRlKGZlbmNlICsgKG5vZGUuYXR0cnMucGFyYW1zIHx8IFwiXCIpICsgXCJcXG5cIik7XG4gICAgICAgIHN0YXRlLnRleHQobm9kZS50ZXh0Q29udGVudCwgZmFsc2UpO1xuICAgICAgICAvLyBBZGQgYSBuZXdsaW5lIHRvIHRoZSBjdXJyZW50IGNvbnRlbnQgYmVmb3JlIGFkZGluZyBjbG9zaW5nIG1hcmtlclxuICAgICAgICBzdGF0ZS53cml0ZShcIlxcblwiKTtcbiAgICAgICAgc3RhdGUud3JpdGUoZmVuY2UpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZyhzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cml0ZShzdGF0ZS5yZXBlYXQoXCIjXCIsIG5vZGUuYXR0cnMubGV2ZWwpICsgXCIgXCIpO1xuICAgICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSwgZmFsc2UpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaG9yaXpvbnRhbF9ydWxlKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKG5vZGUuYXR0cnMubWFya3VwIHx8IFwiLS0tXCIpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgYnVsbGV0X2xpc3Qoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUucmVuZGVyTGlzdChub2RlLCBcIiAgXCIsICgpID0+IChub2RlLmF0dHJzLmJ1bGxldCB8fCBcIipcIikgKyBcIiBcIik7XG4gICAgfSxcbiAgICBvcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZS5hdHRycy5vcmRlciB8fCAxO1xuICAgICAgICBsZXQgbWF4VyA9IFN0cmluZyhzdGFydCArIG5vZGUuY2hpbGRDb3VudCAtIDEpLmxlbmd0aDtcbiAgICAgICAgbGV0IHNwYWNlID0gc3RhdGUucmVwZWF0KFwiIFwiLCBtYXhXICsgMik7XG4gICAgICAgIHN0YXRlLnJlbmRlckxpc3Qobm9kZSwgc3BhY2UsIGkgPT4ge1xuICAgICAgICAgICAgbGV0IG5TdHIgPSBTdHJpbmcoc3RhcnQgKyBpKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5yZXBlYXQoXCIgXCIsIG1heFcgLSBuU3RyLmxlbmd0aCkgKyBuU3RyICsgXCIuIFwiO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGxpc3RfaXRlbShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS5yZW5kZXJDb250ZW50KG5vZGUpO1xuICAgIH0sXG4gICAgcGFyYWdyYXBoKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGltYWdlKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKFwiIVtcIiArIHN0YXRlLmVzYyhub2RlLmF0dHJzLmFsdCB8fCBcIlwiKSArIFwiXShcIiArIG5vZGUuYXR0cnMuc3JjLnJlcGxhY2UoL1tcXChcXCldL2csIFwiXFxcXCQmXCIpICtcbiAgICAgICAgICAgIChub2RlLmF0dHJzLnRpdGxlID8gJyBcIicgKyBub2RlLmF0dHJzLnRpdGxlLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSArICdcIicgOiBcIlwiKSArIFwiKVwiKTtcbiAgICB9LFxuICAgIGhhcmRfYnJlYWsoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkKGkpLnR5cGUgIT0gbm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUud3JpdGUoXCJcXFxcXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICB9LFxuICAgIHRleHQoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUudGV4dChub2RlLnRleHQsICFzdGF0ZS5pbkF1dG9saW5rKTtcbiAgICB9XG59LCB7XG4gICAgZW06IHsgb3BlbjogXCIqXCIsIGNsb3NlOiBcIipcIiwgbWl4YWJsZTogdHJ1ZSwgZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlOiB0cnVlIH0sXG4gICAgc3Ryb25nOiB7IG9wZW46IFwiKipcIiwgY2xvc2U6IFwiKipcIiwgbWl4YWJsZTogdHJ1ZSwgZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlOiB0cnVlIH0sXG4gICAgbGluazoge1xuICAgICAgICBvcGVuKHN0YXRlLCBtYXJrLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgICAgICBzdGF0ZS5pbkF1dG9saW5rID0gaXNQbGFpblVSTChtYXJrLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbkF1dG9saW5rID8gXCI8XCIgOiBcIltcIjtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2Uoc3RhdGUsIG1hcmssIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGxldCB7IGluQXV0b2xpbmsgfSA9IHN0YXRlO1xuICAgICAgICAgICAgc3RhdGUuaW5BdXRvbGluayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBpbkF1dG9saW5rID8gXCI+XCJcbiAgICAgICAgICAgICAgICA6IFwiXShcIiArIG1hcmsuYXR0cnMuaHJlZi5yZXBsYWNlKC9bXFwoXFwpXCJdL2csIFwiXFxcXCQmXCIpICsgKG1hcmsuYXR0cnMudGl0bGUgPyBgIFwiJHttYXJrLmF0dHJzLnRpdGxlLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImAgOiBcIlwiKSArIFwiKVwiO1xuICAgICAgICB9LFxuICAgICAgICBtaXhhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2RlOiB7IG9wZW4oX3N0YXRlLCBfbWFyaywgcGFyZW50LCBpbmRleCkgeyByZXR1cm4gYmFja3RpY2tzRm9yKHBhcmVudC5jaGlsZChpbmRleCksIC0xKTsgfSxcbiAgICAgICAgY2xvc2UoX3N0YXRlLCBfbWFyaywgcGFyZW50LCBpbmRleCkgeyByZXR1cm4gYmFja3RpY2tzRm9yKHBhcmVudC5jaGlsZChpbmRleCAtIDEpLCAxKTsgfSxcbiAgICAgICAgZXNjYXBlOiBmYWxzZSB9XG59KTtcbmZ1bmN0aW9uIGJhY2t0aWNrc0Zvcihub2RlLCBzaWRlKSB7XG4gICAgbGV0IHRpY2tzID0gL2ArL2csIG0sIGxlbiA9IDA7XG4gICAgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICB3aGlsZSAobSA9IHRpY2tzLmV4ZWMobm9kZS50ZXh0KSlcbiAgICAgICAgICAgIGxlbiA9IE1hdGgubWF4KGxlbiwgbVswXS5sZW5ndGgpO1xuICAgIGxldCByZXN1bHQgPSBsZW4gPiAwICYmIHNpZGUgPiAwID8gXCIgYFwiIDogXCJgXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgICAgcmVzdWx0ICs9IFwiYFwiO1xuICAgIGlmIChsZW4gPiAwICYmIHNpZGUgPCAwKVxuICAgICAgICByZXN1bHQgKz0gXCIgXCI7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzUGxhaW5VUkwobGluaywgcGFyZW50LCBpbmRleCkge1xuICAgIGlmIChsaW5rLmF0dHJzLnRpdGxlIHx8ICEvXlxcdys6Ly50ZXN0KGxpbmsuYXR0cnMuaHJlZikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgY29udGVudCA9IHBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgaWYgKCFjb250ZW50LmlzVGV4dCB8fCBjb250ZW50LnRleHQgIT0gbGluay5hdHRycy5ocmVmIHx8IGNvbnRlbnQubWFya3NbY29udGVudC5tYXJrcy5sZW5ndGggLSAxXSAhPSBsaW5rKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50IC0gMSB8fCAhbGluay5pc0luU2V0KHBhcmVudC5jaGlsZChpbmRleCArIDEpLm1hcmtzKTtcbn1cbi8qKlxuVGhpcyBpcyBhbiBvYmplY3QgdXNlZCB0byB0cmFjayBzdGF0ZSBhbmQgZXhwb3NlXG5tZXRob2RzIHJlbGF0ZWQgdG8gbWFya2Rvd24gc2VyaWFsaXphdGlvbi4gSW5zdGFuY2VzIGFyZSBwYXNzZWQgdG9cbm5vZGUgYW5kIG1hcmsgc2VyaWFsaXphdGlvbiBtZXRob2RzIChzZWUgYHRvTWFya2Rvd25gKS5cbiovXG5jbGFzcyBNYXJrZG93blNlcmlhbGl6ZXJTdGF0ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5vZGVzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcmtzLCBcbiAgICAvKipcbiAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNlcmlhbGl6ZXIuXG4gICAgKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsaW0gPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMub3V0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbkF1dG9saW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pblRpZ2h0TGlzdCA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy50aWdodExpc3RzID09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGlnaHRMaXN0cyA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYXJkQnJlYWtOb2RlTmFtZSA9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhhcmRCcmVha05vZGVOYW1lID0gXCJoYXJkX2JyZWFrXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmx1c2hDbG9zZShzaXplID0gMikge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdEJsYW5rKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgICAgIGlmIChzaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGxldCBkZWxpbU1pbiA9IHRoaXMuZGVsaW07XG4gICAgICAgICAgICAgICAgbGV0IHRyaW0gPSAvXFxzKyQvLmV4ZWMoZGVsaW1NaW4pO1xuICAgICAgICAgICAgICAgIGlmICh0cmltKVxuICAgICAgICAgICAgICAgICAgICBkZWxpbU1pbiA9IGRlbGltTWluLnNsaWNlKDAsIGRlbGltTWluLmxlbmd0aCAtIHRyaW1bMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNpemU7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXQgKz0gZGVsaW1NaW4gKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0TWFyayhuYW1lKSB7XG4gICAgICAgIGxldCBpbmZvID0gdGhpcy5tYXJrc1tuYW1lXTtcbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmljdCAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXJrIHR5cGUgXFxgJHtuYW1lfVxcYCBub3Qgc3VwcG9ydGVkIGJ5IE1hcmtkb3duIHJlbmRlcmVyYCk7XG4gICAgICAgICAgICBpbmZvID0gYmxhbmtNYXJrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYSBibG9jaywgcHJlZml4aW5nIGVhY2ggbGluZSB3aXRoIGBkZWxpbWAsIGFuZCB0aGUgZmlyc3RcbiAgICBsaW5lIGluIGBmaXJzdERlbGltYC4gYG5vZGVgIHNob3VsZCBiZSB0aGUgbm9kZSB0aGF0IGlzIGNsb3NlZCBhdFxuICAgIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBhbmQgYGZgIGlzIGEgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZVxuICAgIGNvbnRlbnQgb2YgdGhlIGJsb2NrLlxuICAgICovXG4gICAgd3JhcEJsb2NrKGRlbGltLCBmaXJzdERlbGltLCBub2RlLCBmKSB7XG4gICAgICAgIGxldCBvbGQgPSB0aGlzLmRlbGltO1xuICAgICAgICB0aGlzLndyaXRlKGZpcnN0RGVsaW0gIT0gbnVsbCA/IGZpcnN0RGVsaW0gOiBkZWxpbSk7XG4gICAgICAgIHRoaXMuZGVsaW0gKz0gZGVsaW07XG4gICAgICAgIGYoKTtcbiAgICAgICAgdGhpcy5kZWxpbSA9IG9sZDtcbiAgICAgICAgdGhpcy5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGF0QmxhbmsoKSB7XG4gICAgICAgIHJldHVybiAvKF58XFxuKSQvLnRlc3QodGhpcy5vdXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBFbnN1cmUgdGhlIGN1cnJlbnQgY29udGVudCBlbmRzIHdpdGggYSBuZXdsaW5lLlxuICAgICovXG4gICAgZW5zdXJlTmV3TGluZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF0QmxhbmsoKSlcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IFwiXFxuXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIFByZXBhcmUgdGhlIHN0YXRlIGZvciB3cml0aW5nIG91dHB1dCAoY2xvc2luZyBjbG9zZWQgcGFyYWdyYXBocyxcbiAgICBhZGRpbmcgZGVsaW1pdGVycywgYW5kIHNvIG9uKSwgYW5kIHRoZW4gb3B0aW9uYWxseSBhZGQgY29udGVudFxuICAgICh1bmVzY2FwZWQpIHRvIHRoZSBvdXRwdXQuXG4gICAgKi9cbiAgICB3cml0ZShjb250ZW50KSB7XG4gICAgICAgIHRoaXMuZmx1c2hDbG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5kZWxpbSAmJiB0aGlzLmF0QmxhbmsoKSlcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IHRoaXMuZGVsaW07XG4gICAgICAgIGlmIChjb250ZW50KVxuICAgICAgICAgICAgdGhpcy5vdXQgKz0gY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2xvc2UgdGhlIGJsb2NrIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAqL1xuICAgIGNsb3NlQmxvY2sobm9kZSkge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgZG9jdW1lbnQuIFdoZW4gZXNjYXBlIGlzIG5vdCBgZmFsc2VgLFxuICAgIGl0IHdpbGwgYmUgZXNjYXBlZC5cbiAgICAqL1xuICAgIHRleHQodGV4dCwgZXNjYXBlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKCk7XG4gICAgICAgICAgICAvLyBFc2NhcGUgZXhjbGFtYXRpb24gbWFya3MgaW4gZnJvbnQgb2YgbGlua3NcbiAgICAgICAgICAgIGlmICghZXNjYXBlICYmIGxpbmVzW2ldWzBdID09IFwiW1wiICYmIC8oXnxbXlxcXFxdKVxcISQvLnRlc3QodGhpcy5vdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMub3V0ID0gdGhpcy5vdXQuc2xpY2UoMCwgdGhpcy5vdXQubGVuZ3RoIC0gMSkgKyBcIlxcXFwhXCI7XG4gICAgICAgICAgICB0aGlzLm91dCArPSBlc2NhcGUgPyB0aGlzLmVzYyhsaW5lc1tpXSwgdGhpcy5hdEJsb2NrU3RhcnQpIDogbGluZXNbaV07XG4gICAgICAgICAgICBpZiAoaSAhPSBsaW5lcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIHRoaXMub3V0ICs9IFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIHRoZSBnaXZlbiBub2RlIGFzIGEgYmxvY2suXG4gICAgKi9cbiAgICByZW5kZXIobm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5ub2Rlc1tub2RlLnR5cGUubmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKHRoaXMsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gdHlwZSBgXCIgKyBub2RlLnR5cGUubmFtZSArIFwiYCBub3Qgc3VwcG9ydGVkIGJ5IE1hcmtkb3duIHJlbmRlcmVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIW5vZGUudHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2spXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VCbG9jayhub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgdGhlIGNvbnRlbnRzIG9mIGBwYXJlbnRgIGFzIGJsb2NrIG5vZGVzLlxuICAgICovXG4gICAgcmVuZGVyQ29udGVudChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmZvckVhY2goKG5vZGUsIF8sIGkpID0+IHRoaXMucmVuZGVyKG5vZGUsIHBhcmVudCwgaSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgdGhlIGNvbnRlbnRzIG9mIGBwYXJlbnRgIGFzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgcmVuZGVySW5saW5lKHBhcmVudCwgZnJvbUJsb2NrU3RhcnQgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZnJvbUJsb2NrU3RhcnQ7XG4gICAgICAgIGxldCBhY3RpdmUgPSBbXSwgdHJhaWxpbmcgPSBcIlwiO1xuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSAobm9kZSwgb2Zmc2V0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gbm9kZSA/IG5vZGUubWFya3MgOiBbXTtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBtYXJrcyBmcm9tIGBoYXJkX2JyZWFrYCB0aGF0IGFyZSB0aGUgbGFzdCBub2RlIGluc2lkZVxuICAgICAgICAgICAgLy8gdGhhdCBtYXJrIHRvIHByZXZlbnQgcGFyc2VyIGVkZ2UgY2FzZXMgd2l0aCBuZXcgbGluZXMganVzdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGNsb3NpbmcgbWFya3MuXG4gICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUubmFtZSA9PT0gdGhpcy5vcHRpb25zLmhhcmRCcmVha05vZGVOYW1lKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID09IHBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHBhcmVudC5jaGlsZChpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pc0luU2V0KG5leHQubWFya3MpICYmICghbmV4dC5pc1RleHQgfHwgL1xcUy8udGVzdChuZXh0LnRleHQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBsZWFkaW5nID0gdHJhaWxpbmc7XG4gICAgICAgICAgICB0cmFpbGluZyA9IFwiXCI7XG4gICAgICAgICAgICAvLyBJZiB3aGl0ZXNwYWNlIGhhcyB0byBiZSBleHBlbGxlZCBmcm9tIHRoZSBub2RlLCBhZGp1c3RcbiAgICAgICAgICAgIC8vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pc1RleHQgJiYgbWFya3Muc29tZShtYXJrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZm8gJiYgaW5mby5leHBlbEVuY2xvc2luZ1doaXRlc3BhY2UgJiYgIW1hcmsuaXNJblNldChhY3RpdmUpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW18sIGxlYWQsIHJlc3RdID0gL14oXFxzKikoLiopJC9tLmV4ZWMobm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBsZWFkaW5nICs9IGxlYWQ7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSByZXN0ID8gbm9kZS53aXRoVGV4dChyZXN0KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gYWN0aXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUuaXNUZXh0ICYmIG1hcmtzLnNvbWUobWFyayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLmdldE1hcmsobWFyay50eXBlLm5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvICYmIGluZm8uZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlICYmXG4gICAgICAgICAgICAgICAgICAgIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudCAtIDEgfHwgIW1hcmsuaXNJblNldChwYXJlbnQuY2hpbGQoaW5kZXggKyAxKS5tYXJrcykpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW18sIHJlc3QsIHRyYWlsXSA9IC9eKC4qPykoXFxzKikkL20uZXhlYyhub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFpbCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyA9IHRyYWlsO1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gcmVzdCA/IG5vZGUud2l0aFRleHQocmVzdCkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IGFjdGl2ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBtYXJrcy5sZW5ndGggPyBtYXJrc1ttYXJrcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbm9Fc2MgPSBpbm5lciAmJiB0aGlzLmdldE1hcmsoaW5uZXIudHlwZS5uYW1lKS5lc2NhcGUgPT09IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG1hcmtzLmxlbmd0aCAtIChub0VzYyA/IDEgOiAwKTtcbiAgICAgICAgICAgIC8vIFRyeSB0byByZW9yZGVyICdtaXhhYmxlJyBtYXJrcywgc3VjaCBhcyBlbSBhbmQgc3Ryb25nLCB3aGljaFxuICAgICAgICAgICAgLy8gaW4gTWFya2Rvd24gbWF5IGJlIG9wZW5lZCBhbmQgY2xvc2VkIGluIGRpZmZlcmVudCBvcmRlciwgc29cbiAgICAgICAgICAgIC8vIHRoYXQgb3JkZXIgb2YgdGhlIG1hcmtzIGZvciB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgb3JkZXIgaW5cbiAgICAgICAgICAgIC8vIGFjdGl2ZS5cbiAgICAgICAgICAgIG91dGVyOiBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSkubWl4YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhY3RpdmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyID0gYWN0aXZlW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0TWFyayhvdGhlci50eXBlLm5hbWUpLm1peGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmsuZXEob3RoZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5zbGljZSgwLCBqKS5jb25jYXQobWFyaykuY29uY2F0KG1hcmtzLnNsaWNlKGosIGkpKS5jb25jYXQobWFya3Muc2xpY2UoaSArIDEsIGxlbikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaiA+IGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5zbGljZSgwLCBpKS5jb25jYXQobWFya3Muc2xpY2UoaSArIDEsIGopKS5jb25jYXQobWFyaykuY29uY2F0KG1hcmtzLnNsaWNlKGosIGxlbikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBwcmVmaXggb2YgdGhlIG1hcmsgc2V0IHRoYXQgZGlkbid0IGNoYW5nZVxuICAgICAgICAgICAgbGV0IGtlZXAgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBNYXRoLm1pbihhY3RpdmUubGVuZ3RoLCBsZW4pICYmIG1hcmtzW2tlZXBdLmVxKGFjdGl2ZVtrZWVwXSkpXG4gICAgICAgICAgICAgICAgKytrZWVwO1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1hcmtzIHRoYXQgbmVlZCB0byBiZSBjbG9zZWRcbiAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQodGhpcy5tYXJrU3RyaW5nKGFjdGl2ZS5wb3AoKSwgZmFsc2UsIHBhcmVudCwgaW5kZXgpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBPdXRwdXQgYW55IHByZXZpb3VzbHkgZXhwZWxsZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvdXRzaWRlIHRoZSBtYXJrc1xuICAgICAgICAgICAgaWYgKGxlYWRpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0KGxlYWRpbmcpO1xuICAgICAgICAgICAgLy8gT3BlbiB0aGUgbWFya3MgdGhhdCBuZWVkIHRvIGJlIG9wZW5lZFxuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0gbWFya3NbYWN0aXZlLmxlbmd0aF07XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCh0aGlzLm1hcmtTdHJpbmcoYWRkLCB0cnVlLCBwYXJlbnQsIGluZGV4KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIG5vZGUuIFNwZWNpYWwgY2FzZSBjb2RlIG1hcmtzLCBzaW5jZSB0aGVpciBjb250ZW50XG4gICAgICAgICAgICAgICAgLy8gbWF5IG5vdCBiZSBlc2NhcGVkLlxuICAgICAgICAgICAgICAgIGlmIChub0VzYyAmJiBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0KHRoaXMubWFya1N0cmluZyhpbm5lciwgdHJ1ZSwgcGFyZW50LCBpbmRleCkgKyBub2RlLnRleHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrU3RyaW5nKGlubmVyLCBmYWxzZSwgcGFyZW50LCBpbmRleCArIDEpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcihub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IG5vbi1lbXB0eSB0ZXh0IG5vZGUgaXMgcmVuZGVyZWQsIHRoZSBlbmQgb2Ygb3V0cHV0XG4gICAgICAgICAgICAvLyBpcyBubyBsb25nZXIgYXQgYmxvY2sgc3RhcnQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRklYTUU6IElmIGEgbm9uLXRleHQgbm9kZSB3cml0ZXMgc29tZXRoaW5nIHRvIHRoZSBvdXRwdXQgZm9yIHRoaXNcbiAgICAgICAgICAgIC8vIGJsb2NrLCB0aGUgZW5kIG9mIG91dHB1dCBpcyBhbHNvIG5vIGxvbmdlciBhdCBibG9jayBzdGFydC4gQnV0IGhvd1xuICAgICAgICAgICAgLy8gY2FuIHdlIGRldGVjdCB0aGF0P1xuICAgICAgICAgICAgaWYgKChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGUuaXNUZXh0KSAmJiBub2RlLm5vZGVTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHBhcmVudC5mb3JFYWNoKHByb2dyZXNzKTtcbiAgICAgICAgcHJvZ3Jlc3MobnVsbCwgMCwgcGFyZW50LmNoaWxkQ291bnQpO1xuICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYSBub2RlJ3MgY29udGVudCBhcyBhIGxpc3QuIGBkZWxpbWAgc2hvdWxkIGJlIHRoZSBleHRyYVxuICAgIGluZGVudGF0aW9uIGFkZGVkIHRvIGFsbCBsaW5lcyBleGNlcHQgdGhlIGZpcnN0IGluIGFuIGl0ZW0sXG4gICAgYGZpcnN0RGVsaW1gIGlzIGEgZnVuY3Rpb24gZ29pbmcgZnJvbSBhbiBpdGVtIGluZGV4IHRvIGFcbiAgICBkZWxpbWl0ZXIgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBpdGVtLlxuICAgICovXG4gICAgcmVuZGVyTGlzdChub2RlLCBkZWxpbSwgZmlyc3REZWxpbSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQgJiYgdGhpcy5jbG9zZWQudHlwZSA9PSBub2RlLnR5cGUpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoMyk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaW5UaWdodExpc3QpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoMSk7XG4gICAgICAgIGxldCBpc1RpZ2h0ID0gdHlwZW9mIG5vZGUuYXR0cnMudGlnaHQgIT0gXCJ1bmRlZmluZWRcIiA/IG5vZGUuYXR0cnMudGlnaHQgOiB0aGlzLm9wdGlvbnMudGlnaHRMaXN0cztcbiAgICAgICAgbGV0IHByZXZUaWdodCA9IHRoaXMuaW5UaWdodExpc3Q7XG4gICAgICAgIHRoaXMuaW5UaWdodExpc3QgPSBpc1RpZ2h0O1xuICAgICAgICBub2RlLmZvckVhY2goKGNoaWxkLCBfLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSAmJiBpc1RpZ2h0KVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hDbG9zZSgxKTtcbiAgICAgICAgICAgIHRoaXMud3JhcEJsb2NrKGRlbGltLCBmaXJzdERlbGltKGkpLCBub2RlLCAoKSA9PiB0aGlzLnJlbmRlcihjaGlsZCwgbm9kZSwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pblRpZ2h0TGlzdCA9IHByZXZUaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgRXNjYXBlIHRoZSBnaXZlbiBzdHJpbmcgc28gdGhhdCBpdCBjYW4gc2FmZWx5IGFwcGVhciBpbiBNYXJrZG93blxuICAgIGNvbnRlbnQuIElmIGBzdGFydE9mTGluZWAgaXMgdHJ1ZSwgYWxzbyBlc2NhcGUgY2hhcmFjdGVycyB0aGF0XG4gICAgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlc2Moc3RyLCBzdGFydE9mTGluZSA9IGZhbHNlKSB7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bYCpcXFxcflxcW1xcXV9dL2csIChtLCBpKSA9PiBtID09IFwiX1wiICYmIGkgPiAwICYmIGkgKyAxIDwgc3RyLmxlbmd0aCAmJiBzdHJbaSAtIDFdLm1hdGNoKC9cXHcvKSAmJiBzdHJbaSArIDFdLm1hdGNoKC9cXHcvKSA/IG0gOiBcIlxcXFxcIiArIG0pO1xuICAgICAgICBpZiAoc3RhcnRPZkxpbmUpXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXihcXCtbIF18W1xcLSo+XSkvLCBcIlxcXFwkJlwiKS5yZXBsYWNlKC9eKFxccyopKCN7MSw2fSkoXFxzfCQpLywgJyQxXFxcXCQyJDMnKS5yZXBsYWNlKC9eKFxccypcXGQrKVxcLlxccy8sIFwiJDFcXFxcLiBcIik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlRXh0cmFDaGFyYWN0ZXJzKVxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UodGhpcy5vcHRpb25zLmVzY2FwZUV4dHJhQ2hhcmFjdGVycywgXCJcXFxcJCZcIik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcXVvdGUoc3RyKSB7XG4gICAgICAgIGxldCB3cmFwID0gc3RyLmluZGV4T2YoJ1wiJykgPT0gLTEgPyAnXCJcIicgOiBzdHIuaW5kZXhPZihcIidcIikgPT0gLTEgPyBcIicnXCIgOiBcIigpXCI7XG4gICAgICAgIHJldHVybiB3cmFwWzBdICsgc3RyICsgd3JhcFsxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwZWF0IHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLlxuICAgICovXG4gICAgcmVwZWF0KHN0ciwgbikge1xuICAgICAgICBsZXQgb3V0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspXG4gICAgICAgICAgICBvdXQgKz0gc3RyO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtkb3duIHN0cmluZyBmb3IgYSBnaXZlbiBvcGVuaW5nIG9yIGNsb3NpbmcgbWFyay5cbiAgICAqL1xuICAgIG1hcmtTdHJpbmcobWFyaywgb3BlbiwgcGFyZW50LCBpbmRleCkge1xuICAgICAgICBsZXQgaW5mbyA9IHRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSk7XG4gICAgICAgIGxldCB2YWx1ZSA9IG9wZW4gPyBpbmZvLm9wZW4gOiBpbmZvLmNsb3NlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlKHRoaXMsIG1hcmssIHBhcmVudCwgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGEgc3RyaW5nLiBWYWx1ZXMgb2ZcbiAgICBsZWFkaW5nIG9yIHRyYWlsaW5nIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gb2JqZWN0IHdpbGwgYmUgdW5kZWZpbmVkXG4gICAgaWYgdGhlcmUgaXMgbm8gbWF0Y2guXG4gICAgKi9cbiAgICBnZXRFbmNsb3NpbmdXaGl0ZXNwYWNlKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlYWRpbmc6ICh0ZXh0Lm1hdGNoKC9eKFxccyspLykgfHwgW3VuZGVmaW5lZF0pWzBdLFxuICAgICAgICAgICAgdHJhaWxpbmc6ICh0ZXh0Lm1hdGNoKC8oXFxzKykkLykgfHwgW3VuZGVmaW5lZF0pWzBdXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBNYXJrZG93blBhcnNlciwgTWFya2Rvd25TZXJpYWxpemVyLCBNYXJrZG93blNlcmlhbGl6ZXJTdGF0ZSwgZGVmYXVsdE1hcmtkb3duUGFyc2VyLCBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLCBzY2hlbWEgfTtcbiIsImltcG9ydCBtYXJrZG93bml0IGZyb20gJ21hcmtkb3duLWl0JztcbmltcG9ydCB7XG4gIE1hcmtkb3duUGFyc2VyLFxuICBNYXJrZG93blNlcmlhbGl6ZXIsXG4gIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIsXG59IGZyb20gJ3Byb3NlbWlycm9yLW1hcmtkb3duJztcbmltcG9ydCB7XG4gIEFVVE9fTElOS19BVFRSLFxuICBNQVJLRE9XTl9FU0NBUEVEX0FUVFIsXG4gIENoZWNrYm94U3RhdHVzLFxuICBzY2hlbWEsXG59IGZyb20gJy4vc2NoZW1hJztcblxuZXhwb3J0IGNvbnN0IG1hcmtkb3duU2VyaWFsaXplciA9IG5ldyBNYXJrZG93blNlcmlhbGl6ZXIoXG4gIHtcbiAgICBoZWFkaW5nMShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgc3RhdGUud3JpdGUoJyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZzIoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjIyAnKTtcbiAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBoZWFkaW5nMyhzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgc3RhdGUud3JpdGUoJyMjIyAnKTtcbiAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBjaGVja2xpc3RfaXRlbShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgY29uc3QgYm94VGV4dCA9XG4gICAgICAgIG5vZGUuYXR0cnMuc3RhdHVzID09PSBDaGVja2JveFN0YXR1cy5ET05FID8gJ1t4XSAnIDogJ1sgXSAnO1xuICAgICAgc3RhdGUud3JpdGUoYm94VGV4dCk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgcGFyYWdyYXBoKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBpZiAobm9kZS5ub2RlU2l6ZSA9PT0gMikge1xuICAgICAgICAvLyBXcml0ZSBhIG5vbi1icmVha2luZyBlbXB0eSBzcGFjZSBzbyBtYXJrZG93biByZXRhaW5zIHRoZSBsaW5lIGFzIGFuIGVtcHR5IHBhcmFncmFwaFxuICAgICAgICBzdGF0ZS53cml0ZSgnXFx1MDBBMCcpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLnBhcmFncmFwaChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBsaXN0X2l0ZW0oc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMubGlzdF9pdGVtKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIG9yZGVyZWRfbGlzdChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy5vcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgdW5vcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMuYnVsbGV0X2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgdGV4dChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy50ZXh0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIGNvZGVfYmxvY2soc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGlmIChub2RlLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl0pIHtcbiAgICAgICAgc3RhdGUud3JpdGUobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgIHN0YXRlLmVuc3VyZU5ld0xpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMuY29kZV9ibG9jayhzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIC4uLmRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubWFya3MsXG4gICAgaW5saW5lX2xpbms6IGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubWFya3MubGluayxcbiAgICBjb2RlOiB7XG4gICAgICBjbG9zZShzdGF0ZSwgbWFyaykge1xuICAgICAgICByZXR1cm4gbWFyay5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdID8gJycgOiAnYCc7XG4gICAgICB9LFxuICAgICAgZXNjYXBlOiBmYWxzZSxcbiAgICAgIG9wZW4oc3RhdGUsIG1hcmspIHtcbiAgICAgICAgcmV0dXJuIG1hcmsuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSA/ICcnIDogJ2AnO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxuKTtcblxuY29uc3QgbWFya2Rvd25JdFBhcnNlciA9IG1hcmtkb3duaXQoKTtcbmNvbnN0IFRva2VuID0gbWFya2Rvd25JdFBhcnNlci5jb3JlLlN0YXRlLnByb3RvdHlwZS5Ub2tlbjtcbi8vIFdlIG5lZWQgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IGltYWdlIHBhcnNlciBydWxlIHNvIHdlIGNhbiB3cmFwIGl0IGluIGN1c3RvbVxuLy8gbG9naWMuIFRoZXNlIG1ldGhvZHMgYW5kIG9iamVjdHMgYXJlIG1lYW50IHRvIGJlIGludGVybmFsIGJ1dCB0aGVyZSBzZWVtcyB0b1xuLy8gYmUgbm8gb3RoZXIgd2F5IHRvIGdldCBhdCB0aGUgZGVmYXVsdCBydWxlcy5cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IGltYWdlUnVsZUluZGV4ID0gbWFya2Rvd25JdFBhcnNlci5pbmxpbmUucnVsZXIuX19maW5kX18oJ2ltYWdlJyk7XG5jb25zdCBkZWZhdWx0SW1hZ2VSdWxlID1cbiAgLy8gQHRzLWlnbm9yZVxuICBtYXJrZG93bkl0UGFyc2VyLmlubGluZS5ydWxlci5fX3J1bGVzX19baW1hZ2VSdWxlSW5kZXhdLmZuO1xuXG5jb25zdCBDSEVDS0xJU1RfSVRFTV9PUEVOX01BUktFUlMgPSBbJ1t4XScsICdbWF0nLCAnWyBdJ107XG5cbm1hcmtkb3duSXRQYXJzZXIudXNlKChtZCkgPT4ge1xuICBtZC5jb3JlLnJ1bGVyLmFmdGVyKCdibG9jaycsICdjaGVja2xpc3RfaXRlbScsIChjb3JlU3RhdGUpID0+IHtcbiAgICBjb25zdCBzcmNMaW5lcyA9IGNvcmVTdGF0ZS5zcmMuc3BsaXQoJ1xcbicpO1xuICAgIGxldCBpc0NoZWNrbGlzdE9wZW4gPSBmYWxzZTtcbiAgICBsZXQgaGFzQ2hlY2tsaXN0ID0gZmFsc2U7XG5cbiAgICBjb3JlU3RhdGUudG9rZW5zID0gY29yZVN0YXRlLnRva2Vucy5tYXAoKHRva2VuKSA9PiB7XG4gICAgICBpZiAoaXNDaGVja2xpc3RPcGVuICYmIHRva2VuLnR5cGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSB0b2tlbi5jb250ZW50LnNsaWNlKDMpLnRyaW1MZWZ0KCk7XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3BhcmFncmFwaF9vcGVuJykge1xuICAgICAgICBjb25zdCBbc3RhcnRMaW5lLCBlbmRMaW5lXSA9IHRva2VuLm1hcDtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHNyY0xpbmVzW3N0YXJ0TGluZV07XG4gICAgICAgIGlmIChDSEVDS0xJU1RfSVRFTV9PUEVOX01BUktFUlMuaW5jbHVkZXMoY29udGVudC5zbGljZSgwLCAzKSkpIHtcbiAgICAgICAgICBoYXNDaGVja2xpc3QgPSB0cnVlO1xuICAgICAgICAgIGlzQ2hlY2tsaXN0T3BlbiA9IHRydWU7XG4gICAgICAgICAgY29uc3QgeyBUb2tlbiB9ID0gY29yZVN0YXRlO1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKCdjaGVja2xpc3RfaXRlbV9vcGVuJywgJ2RpdicsIDEpO1xuICAgICAgICAgIHRva2VuLmF0dHJQdXNoKFtcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgY29udGVudFsxXS50b0xvd2VyQ2FzZSgpID09PSAneCdcbiAgICAgICAgICAgICAgPyBDaGVja2JveFN0YXR1cy5ET05FLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgOiBDaGVja2JveFN0YXR1cy5FTVBUWS50b1N0cmluZygpLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0NoZWNrbGlzdE9wZW4gJiYgdG9rZW4udHlwZSA9PT0gJ3BhcmFncmFwaF9jbG9zZScpIHtcbiAgICAgICAgaXNDaGVja2xpc3RPcGVuID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBuZXcgY29yZVN0YXRlLlRva2VuKCdjaGVja2xpc3RfaXRlbV9jbG9zZScsICdkaXYnLCAtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9KTtcblxuICAgIHJldHVybiBoYXNDaGVja2xpc3Q7XG4gIH0pO1xuXG4gIG1kLmlubGluZS5ydWxlci5hdCgnaW1hZ2UnLCAoaW5saW5lU3RhdGUpID0+IHtcbiAgICBjb25zdCB7IHBvczogb3JpZ2luYWxQb3MgfSA9IGlubGluZVN0YXRlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRlZmF1bHRJbWFnZVJ1bGUoaW5saW5lU3RhdGUpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IGNvZGVUb2tlbiA9IG5ldyBpbmxpbmVTdGF0ZS5Ub2tlbignY29kZV9pbmxpbmUnLCAnY29kZScsIDApO1xuICAgICAgY29kZVRva2VuLm1hcmt1cCA9ICdgJztcbiAgICAgIGNvZGVUb2tlbi5jb250ZW50ID0gaW5saW5lU3RhdGUuc3JjLnNsaWNlKG9yaWdpbmFsUG9zLCBpbmxpbmVTdGF0ZS5wb3MpO1xuICAgICAgY29kZVRva2VuLmF0dHJTZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSLCAndHJ1ZScpO1xuICAgICAgaW5saW5lU3RhdGUudG9rZW5zW2lubGluZVN0YXRlLnRva2Vucy5sZW5ndGggLSAxXSA9IGNvZGVUb2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcblxuY2xhc3MgU2NyYXRjaFRva2VuUGFyc2VyIHtcbiAgcHJpdmF0ZSBmdWxsVG9rZW5MaXN0OiBtYXJrZG93bml0LlRva2VuW107XG4gIHByaXZhdGUgdG9rZW5TdGFjazogbWFya2Rvd25pdC5Ub2tlbltdO1xuICBwcml2YXRlIHBhcnNlYWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzcmM6IHN0cmluZztcblxuICBzdGF0aWMgRE9DVU1FTlRfTUFQID0gbmV3IE1hcChbXG4gICAgWydoZWFkaW5nMScsIFsnaW5saW5lJ11dLFxuICAgIFsnaGVhZGluZzInLCBbJ2lubGluZSddXSxcbiAgICBbJ2hlYWRpbmczJywgWydpbmxpbmUnXV0sXG4gICAgWydwYXJhZ3JhcGgnLCBbJ2lubGluZSddXSxcbiAgICBbJ2ZlbmNlJywgWydpbmxpbmUnXV0sXG4gICAgWydidWxsZXRfbGlzdCcsIFsnbGlzdF9pdGVtJywgJ2lubGluZSddXSxcbiAgICBbJ29yZGVyZWRfbGlzdCcsIFsnbGlzdF9pdGVtJywgJ2lubGluZSddXSxcbiAgICBbJ2xpc3RfaXRlbScsIFsncGFyYWdyYXBoJywgJ29yZGVyZWRfbGlzdCcsICdidWxsZXRfbGlzdCddXSxcbiAgICBbJ2NoZWNrbGlzdF9pdGVtJywgWydpbmxpbmUnXV0sXG4gICAgWydpbmxpbmUnLCBbXV0sXG4gIF0pO1xuXG4gIHN0YXRpYyBnZXRUeXBlTmFtZSh0b2tlblR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0b2tlblR5cGUucmVwbGFjZSgnX29wZW4nLCAnJykucmVwbGFjZSgnX2Nsb3NlJywgJycpO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc3JjOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgIHRoaXMuc3JjID0gc3JjO1xuICB9XG5cbiAgdGFrZSh0b2tlbjogbWFya2Rvd25pdC5Ub2tlbik6IG51bGwgfCBtYXJrZG93bml0LlRva2VuW10ge1xuICAgIGNvbnN0IHsgbmVzdGluZyB9ID0gdG9rZW47XG4gICAgbGV0IHsgdHlwZSB9ID0gdG9rZW47XG4gICAgdHlwZSA9IFNjcmF0Y2hUb2tlblBhcnNlci5nZXRUeXBlTmFtZSh0eXBlKTtcblxuICAgIHRoaXMuZnVsbFRva2VuTGlzdC5wdXNoKHRva2VuKTtcblxuICAgIGlmIChcbiAgICAgIFNjcmF0Y2hUb2tlblBhcnNlci5ET0NVTUVOVF9NQVAuaGFzKHR5cGUpID09PSBmYWxzZSAmJlxuICAgICAgdHlwZSAhPT0gJ2lubGluZSdcbiAgICApIHtcbiAgICAgIHRoaXMucGFyc2VhYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyc2VhYmxlICYmIHRoaXMudG9rZW5TdGFjay5sZW5ndGggJiYgbmVzdGluZyA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJlbnRUeXBlID0gU2NyYXRjaFRva2VuUGFyc2VyLmdldFR5cGVOYW1lKFxuICAgICAgICB0aGlzLnRva2VuU3RhY2tbdGhpcy50b2tlblN0YWNrLmxlbmd0aCAtIDFdLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIFNjcmF0Y2hUb2tlblBhcnNlci5ET0NVTUVOVF9NQVAuZ2V0KHBhcmVudFR5cGUpLmluY2x1ZGVzKHR5cGUpID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGFyc2VhYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lc3RpbmcgPiAwKSB7XG4gICAgICB0aGlzLnRva2VuU3RhY2sucHVzaCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKG5lc3RpbmcgPCAwKSB7XG4gICAgICB0aGlzLnRva2VuU3RhY2sucG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9rZW5TdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IG91dCA9IHRoaXMuZ2V0VG9rZW5zKCk7XG4gICAgICB0aGlzLnJlc2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5zID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZnVsbFRva2VuTGlzdCwgcGFyc2VhYmxlIH0gPSB0aGlzO1xuXG4gICAgaWYgKHBhcnNlYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFwOiBbZW5kTGluZSwgc3RhcnRMaW5lXSxcbiAgICAgIH0gPSBmdWxsVG9rZW5MaXN0WzBdO1xuICAgICAgY29uc3QgY29kZVRva2VuID0gbmV3IFRva2VuKCdmZW5jZScsICdjb2RlJywgMCk7XG4gICAgICBjb2RlVG9rZW4uY29udGVudCA9IHRoaXMuc3JjXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLnNsaWNlKGVuZExpbmUsIHN0YXJ0TGluZSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29kZVRva2VuLmF0dHJQdXNoKFtNQVJLRE9XTl9FU0NBUEVEX0FUVFIsICd0cnVlJ10pO1xuICAgICAgcmV0dXJuIFtjb2RlVG9rZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBmdWxsVG9rZW5MaXN0O1xuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRJbnRlcm5hbFN0YXRlID0gKCkgPT4ge1xuICAgIHRoaXMuZnVsbFRva2VuTGlzdCA9IFtdO1xuICAgIHRoaXMudG9rZW5TdGFjayA9IFtdO1xuICAgIHRoaXMucGFyc2VhYmxlID0gdHJ1ZTtcbiAgfTtcbn1cblxuY29uc3QgcGFyc2VyU2hpbSA9ICgpID0+ICh7XG4gIHBhcnNlKC4uLmFyZ3MpIHtcbiAgICAod2luZG93IGFzIGFueSkubWlwID0gbWFya2Rvd25JdFBhcnNlcjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW5pdGlhbCA9IG1hcmtkb3duSXRQYXJzZXIucGFyc2UoLi4uYXJncyk7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgY29uc3QgdG9rZW5QYXJzZXIgPSBuZXcgU2NyYXRjaFRva2VuUGFyc2VyKGFyZ3NbMF0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0aWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGluaXRpYWxbaV07XG4gICAgICBjb25zdCB7IG5lc3RpbmcsIHRhZywgdHlwZSB9ID0gdG9rZW47XG5cbiAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ2hlYWRpbmcnKSAmJiB0YWcgPT09ICdoMScpIHtcbiAgICAgICAgdG9rZW4udHlwZSA9IHRva2VuLnR5cGUucmVwbGFjZSgnaGVhZGluZycsICdoZWFkaW5nMScpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgnaGVhZGluZycpICYmIHRhZyA9PT0gJ2gyJykge1xuICAgICAgICB0b2tlbi50eXBlID0gdHlwZS5yZXBsYWNlKCdoZWFkaW5nJywgJ2hlYWRpbmcyJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCdoZWFkaW5nJykgJiYgdGFnID09PSAnaDMnKSB7XG4gICAgICAgIHRva2VuLnR5cGUgPSB0eXBlLnJlcGxhY2UoJ2hlYWRpbmcnLCAnaGVhZGluZzMnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnbGluaycgJiYgdG9rZW4uYXR0ckdldCgnaHJlZicpID09PSB0b2tlbi5jb250ZW50KSB7XG4gICAgICAgIHRva2VuLmF0dHJTZXQoQVVUT19MSU5LX0FUVFIsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHRva2VuUGFyc2VyLnRha2UodG9rZW4pO1xuXG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIG91dC5wdXNoKC4uLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbWFya2Rvd25QYXJzZXIgPSBuZXcgTWFya2Rvd25QYXJzZXIoXG4gIHNjaGVtYSxcbiAgLy8gQHRzLWlnbm9yZVxuICBwYXJzZXJTaGltKCksXG4gIHtcbiAgICBibG9ja3F1b3RlOiB7IGJsb2NrOiAnY29kZV9ibG9jaycgfSxcbiAgICBidWxsZXRfbGlzdDogeyBibG9jazogJ3Vub3JkZXJlZF9saXN0JyB9LFxuICAgIGZlbmNlOiB7XG4gICAgICBibG9jazogJ2NvZGVfYmxvY2snLFxuICAgICAgZ2V0QXR0cnModG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmF0dHJHZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSKSA9PT0gJ3RydWUnXG4gICAgICAgICAgPyB7IFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB0cnVlIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIGhlYWRpbmcxOiB7IGJsb2NrOiAnaGVhZGluZzEnIH0sXG4gICAgaGVhZGluZzI6IHsgYmxvY2s6ICdoZWFkaW5nMicgfSxcbiAgICBoZWFkaW5nMzogeyBibG9jazogJ2hlYWRpbmczJyB9LFxuICAgIGxpc3RfaXRlbTogeyBibG9jazogJ2xpc3RfaXRlbScgfSxcbiAgICBvcmRlcmVkX2xpc3Q6IHsgYmxvY2s6ICdvcmRlcmVkX2xpc3QnIH0sXG4gICAgcGFyYWdyYXBoOiB7IGJsb2NrOiAncGFyYWdyYXBoJyB9LFxuICAgIGNoZWNrbGlzdF9pdGVtOiB7XG4gICAgICBibG9jazogJ2NoZWNrbGlzdF9pdGVtJyxcbiAgICAgIGdldEF0dHJzKHRvaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czpcbiAgICAgICAgICAgIHRvay5hdHRyR2V0KCdzdGF0dXMnKSA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORS50b1N0cmluZygpXG4gICAgICAgICAgICAgID8gQ2hlY2tib3hTdGF0dXMuRE9ORVxuICAgICAgICAgICAgICA6IENoZWNrYm94U3RhdHVzLkVNUFRZLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIGVtOiB7IG1hcms6ICdlbScgfSxcbiAgICBzdHJvbmc6IHsgbWFyazogJ3N0cm9uZycgfSxcbiAgICBjb2RlX2lubGluZToge1xuICAgICAgZ2V0QXR0cnModG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmF0dHJHZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSKSA9PT0gJ3RydWUnXG4gICAgICAgICAgPyB7IFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB0cnVlIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgfSxcbiAgICAgIG1hcms6ICdjb2RlJyxcbiAgICAgIG5vQ2xvc2VUb2tlbjogdHJ1ZSxcbiAgICB9LFxuICAgIGxpbms6IHtcbiAgICAgIG1hcms6ICdsaW5rJyxcbiAgICAgIGdldEF0dHJzKHRvaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHRvay5hdHRyR2V0KCdocmVmJyksXG4gICAgICAgICAgdGl0bGU6IHRvay5hdHRyR2V0KCd0aXRsZScpIHx8IG51bGwsXG4gICAgICAgICAgLi4uKHRvay5pbmZvID09PSAnYXV0bycgJiYge1xuICAgICAgICAgICAgW0FVVE9fTElOS19BVFRSXTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbik7XG4iLCJpbXBvcnQgeyBQbHVnaW4sIFRyYW5zYWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgQVVUT19MSU5LX0FUVFIsIHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCBMaW5raWZ5SXQgZnJvbSAnbGlua2lmeS1pdCc7XG5cbmNvbnN0IGxpbmtpZnkgPSBuZXcgTGlua2lmeUl0KCk7XG5cbmV4cG9ydCBjb25zdCBmaW5kQW5kSW5zZXJ0SW5saW5lTGlua3MgPSAoc3RhdGUpOiBUcmFuc2FjdGlvbiA9PiB7XG4gIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuXG4gIHRyLmRvYy5kZXNjZW5kYW50cygobm9kZSwgcG9zLCBwYXJlbnQpID0+IHtcbiAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgZmluZCBhbmQgdmFsaWRhdGUgYWxsIGV4aXN0aW5nIGF1dG9saW5rcy4gSWYgYW4gYXV0b2xpbmsgY29udGFpbnMgdGV4dCB0aGF0IGlzIG5vdCBhIHZhbGlkIFVSTCwgcmVtb3ZlIHRoZSBsaW5rLlxuICAgIGNvbnN0IHN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlID0gcG9zICsgMTtcbiAgICBjb25zdCBhdXRvTGlua01hcHM6IHsgc3RhcnRQb3M6IG51bWJlcjsgZW5kUG9zOiBudW1iZXIgfVtdID0gW107XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgb2Zmc2V0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGNoaWxkTGlua01hcmsgPSBjaGlsZC5tYXJrcy5maW5kKFxuICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICk7XG4gICAgICBpZiAoY2hpbGRMaW5rTWFyayAmJiBjaGlsZExpbmtNYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoYXV0b0xpbmtNYXBzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RNYXAgPSBhdXRvTGlua01hcHNbYXV0b0xpbmtNYXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0TWFwLmVuZFBvcyA9PT0gc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgKyBvZmZzZXQpIHtcbiAgICAgICAgICAgIGxhc3RNYXAuZW5kUG9zID0gcG9zICsgb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF1dG9MaW5rTWFwcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0UG9zOiBzdGFydGluZ1Bvc2l0aW9uSW5zaWRlTm9kZSArIG9mZnNldCxcbiAgICAgICAgICAgIGVuZFBvczogc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgKyBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBhdXRvTGlua01hcCBvZiBhdXRvTGlua01hcHMpIHtcbiAgICAgIGNvbnN0IGxpbmtUZXh0ID0gdHIuZG9jLnRleHRCZXR3ZWVuKFxuICAgICAgICBhdXRvTGlua01hcC5zdGFydFBvcyxcbiAgICAgICAgYXV0b0xpbmtNYXAuZW5kUG9zLFxuICAgICAgKTtcbiAgICAgIGlmICghbGlua2lmeS50ZXN0KGxpbmtUZXh0KSkge1xuICAgICAgICB0ci5yZW1vdmVNYXJrKFxuICAgICAgICAgIGF1dG9MaW5rTWFwLnN0YXJ0UG9zLFxuICAgICAgICAgIGF1dG9MaW5rTWFwLmVuZFBvcyxcbiAgICAgICAgICBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgZWxzZSBzdGF0ZW1lbnQgZW5zdXJlcyB0aGF0IGV4aXN0aW5nIGF1dG9saW5rcyB3aWxsIGNvbnRpbnVlIHRvIHVwZGF0ZSBldmVuIGlmIHRoZXkgYXJlXG4gICAgICAgIC8vIGFkamFjZW50IHRvIG90aGVyIHRleHQ7IHRoZSByZWdleCBVUkwgdGVzdCB3aWxsIHN0b3AgZmluZGluZyB0aGVtIGluIHRoaXMgY2FzZS5cbiAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICBhdXRvTGlua01hcC5zdGFydFBvcyxcbiAgICAgICAgICBhdXRvTGlua01hcC5lbmRQb3MsXG4gICAgICAgICAgc2NoZW1hLm1hcmtzLmxpbmsuY3JlYXRlKHsgaHJlZjogbGlua1RleHQsIFtBVVRPX0xJTktfQVRUUl06IHRydWUgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlbiwgZmluZCBhbmQgaW5zZXJ0IG5ldyBhdXRvbGlua3MgYmFzZWQgb24gdGhlIHNhbWUgdGVzdC5cbiAgICBjb25zdCBtYXRjaGVzID0gbGlua2lmeS5tYXRjaChub2RlLnRleHRDb250ZW50KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcG9zICsgMSArIG1hdGNoLmluZGV4O1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBtYXRjaC50ZXh0Lmxlbmd0aDtcblxuICAgICAgaWYgKHRyLmRvYy5yYW5nZUhhc01hcmsoc3RhcnQsIGVuZCwgc2NoZW1hLm1hcmtzLmNvZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHIuZG9jLnJhbmdlSGFzTWFyayhzdGFydCwgZW5kLCBzY2hlbWEubWFya3MubGluaykpIHtcbiAgICAgICAgbGV0IGxpbmtNYXJrcyA9IFtdO1xuICAgICAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKHN0YXJ0LCBlbmQsIChub2RlKSA9PiB7XG4gICAgICAgICAgaWYgKG5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rTWFyayA9IG5vZGUubWFya3MuZmluZChcbiAgICAgICAgICAgICAgKG1hcmspID0+IG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxpbmtNYXJrICYmIGxpbmtNYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgbGlua01hcmtzLnB1c2gobGlua01hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsaW5rTWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc2NoZW1hLm1hcmtzLmxpbmsuY3JlYXRlKHsgaHJlZjogbWF0Y2gudXJsLCBbQVVUT19MSU5LX0FUVFJdOiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0cjtcbn07XG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVMaW5rUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgYXBwZW5kVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRBbmRJbnNlcnRJbmxpbmVMaW5rcyhuZXdTdGF0ZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCBDb21wb25lbnRNYW5hZ2VyIGZyb20gJ0BzdGFuZGFyZG5vdGVzL2NvbXBvbmVudC1yZWxheSc7XG5pbXBvcnQgeyBiYXNlS2V5bWFwIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IGhpc3RvcnkgfSBmcm9tICdwcm9zZW1pcnJvci1oaXN0b3J5JztcbmltcG9ydCB7IGlucHV0UnVsZXNGb3JjZWRTcGFjZVBsdWdpbiwgaW5wdXRSdWxlc1BsdWdpbiB9IGZyb20gJy4vaW5wdXRSdWxlcyc7XG5pbXBvcnQgeyBUb29sYmFyUGx1Z2luIH0gZnJvbSAnLi9Ub29sYmFyUGx1Z2luJztcbmltcG9ydCB7IFRvb2x0aXBQbHVnaW4gfSBmcm9tICcuL1Rvb2x0aXBQbHVnaW4nO1xuaW1wb3J0IHsgRWRpdG9yRXh0ZW5kZXJQbHVnaW4gfSBmcm9tICcuL0VkaXRvckV4dGVuZGVyUGx1Z2luJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IGNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmltcG9ydCB7IG5vZGVWaWV3cyB9IGZyb20gJy4vbm9kZVZpZXdzJztcbmltcG9ydCB7IGtleW1hcFBsdWdpbnMgfSBmcm9tICcuL2tleW1hcHMnO1xuaW1wb3J0IHsgbWFya2Rvd25QYXJzZXIsIG1hcmtkb3duU2VyaWFsaXplciB9IGZyb20gJy4vbWFya2Rvd24nO1xuaW1wb3J0IHsgSW5saW5lTGlua1BsdWdpbiB9IGZyb20gJy4vSW5saW5lTGlua1BsdWdpbic7XG5cbmludGVyZmFjZSBBcHBXaW5kb3cgZXh0ZW5kcyBXaW5kb3cge1xuICB2aWV3OiBFZGl0b3JWaWV3O1xufVxuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogQXBwV2luZG93O1xuXG5mdW5jdGlvbiBnZXREb2NGb3JOZXdFZGl0b3JTdGF0ZSgpIHtcbiAgcmV0dXJuIGNsaWVudC5sYXRlc3RUZXh0XG4gICAgPyBtYXJrZG93blBhcnNlci5wYXJzZShjbGllbnQubGF0ZXN0VGV4dClcbiAgICA6IGNsaWVudC5sYXRlc3REb2NcbiAgICAgID8gc2NoZW1hLm5vZGVGcm9tSlNPTihjbGllbnQubGF0ZXN0RG9jKVxuICAgICAgOiBzY2hlbWEudG9wTm9kZVR5cGUuY3JlYXRlQW5kRmlsbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0KCkge1xuICBhd2FpdCBjbGllbnQucmVhZHkoKTtcblxuICBjb25zdCB2aWV3ID0gKHdpbmRvdy52aWV3ID0gbmV3IEVkaXRvclZpZXcoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2VkaXRvcicpLFxuICAgIHtcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICBkb2M6IGdldERvY0Zvck5ld0VkaXRvclN0YXRlKCksXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAuLi5rZXltYXBQbHVnaW5zLFxuICAgICAgICAgIG5ldyBUb29sYmFyUGx1Z2luKFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Rvb2xiYXInKSxcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaW5rLW1vZGFsJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgVG9vbHRpcFBsdWdpbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGluay10b29sdGlwJykpLFxuICAgICAgICAgIG5ldyBFZGl0b3JFeHRlbmRlclBsdWdpbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXh0ZW5kZXInKSksXG4gICAgICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICBub2RlVmlld3MsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG5ldyBJbmxpbmVMaW5rUGx1Z2luKCksXG4gICAgICAgICAgaW5wdXRSdWxlc1BsdWdpbixcbiAgICAgICAgICBpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4sXG4gICAgICAgICAgaGlzdG9yeSgpLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uKHRyKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSB2aWV3LnN0YXRlLmFwcGx5KHRyKTtcbiAgICAgICAgdmlldy51cGRhdGVTdGF0ZShuZXh0KTtcbiAgICAgICAgaWYgKHRyLmRvY0NoYW5nZWQpIHtcbiAgICAgICAgICBjbGllbnQuc2F2ZU5vdGUoXG4gICAgICAgICAgICBuZXh0LmRvYy50b0pTT04oKSxcbiAgICAgICAgICAgIG1hcmtkb3duU2VyaWFsaXplci5zZXJpYWxpemUobmV4dC5kb2MpLFxuICAgICAgICAgICAgbmV4dC5kb2MudGV4dEJldHdlZW4oMCwgbmV4dC5kb2Mubm9kZVNpemUgLSAyLCAnICcpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgKSk7XG5cbiAgY2xpZW50Lm9uVXBkYXRlKChkb2MpID0+IHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIG9wZW5zIGEgbmV3IG5vdGUsIGtlZXAgYWxsIHRoZSBwbHVnaW4gaW5zdGFuY2VzIGV4Y2VwdCB0aGUgdG9vbGJhclxuICAgIGNvbnN0IHBsdWdpbnMgPSB2aWV3LnN0YXRlLnBsdWdpbnMuZmlsdGVyKFxuICAgICAgKHBsdWdpbikgPT4gcGx1Z2luIGluc3RhbmNlb2YgVG9vbGJhclBsdWdpbiA9PT0gZmFsc2UsXG4gICAgKTtcblxuICAgIHZpZXcuc2V0UHJvcHMoe1xuICAgICAgc3RhdGU6IEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgIGRvYzogZ2V0RG9jRm9yTmV3RWRpdG9yU3RhdGUoKSxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIC4uLnBsdWdpbnMsXG4gICAgICAgICAgbmV3IFRvb2xiYXJQbHVnaW4oXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9vbGJhcicpLFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpbmstbW9kYWwnKSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH0pO1xufVxuXG5pbml0KCk7XG4iXSwibmFtZXMiOlsic2VsZiIsIm1vZHVsZSIsImV4cG9ydHMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwiZGVmaW5pdGlvbiIsImtleSIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJvYmoiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiQ29tcG9uZW50QWN0aW9uIiwiRW52aXJvbm1lbnQiLCJDb250ZW50VHlwZSIsIkFwcERhdGFGaWVsZCIsImdldFJhbmRvbVZhbHVlcyIsInJuZHM4IiwiVWludDhBcnJheSIsInJuZyIsImNyeXB0byIsImJpbmQiLCJtc0NyeXB0byIsIkVycm9yIiwidXVpZCIsImJ5dGVUb0hleCIsImkiLCJwdXNoIiwidG9TdHJpbmciLCJzdWJzdHIiLCJvcHRpb25zIiwiYnVmIiwib2Zmc2V0Iiwicm5kcyIsInJhbmRvbSIsImFyciIsImFyZ3VtZW50cyIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiVHlwZUVycm9yIiwiZW52aXJvbm1lbnRUb1N0cmluZyIsImVudmlyb25tZW50IiwibWFwIiwiV2ViIiwiRGVza3RvcCIsIk1vYmlsZSIsImlzTm90VW5kZWZpbmVkT3JOdWxsIiwidmFsdWUiLCJub29wIiwiTG9nZ2VyIiwid2luZG93IiwiY29uc29sZSIsImlzU3VwcG9ydGVkIiwidGhpcyIsImVuYWJsZWQiLCJsb2ciLCJlcnJvciIsIk1lc3NhZ2VQYXlsb2FkQXBpIiwiS2V5Ym9hcmRNb2RpZmllciIsIkNvbXBvbmVudFJlbGF5IiwiY29uc3RydWN0b3IiLCJwYXJhbXMiLCJhY3RpdmVUaGVtZXMiLCJhY2NlcHRzVGhlbWVzIiwidGFyZ2V0V2luZG93IiwiY29udGVudFdpbmRvdyIsInByb2Nlc3NQYXJhbWV0ZXJzIiwicmVnaXN0ZXJNZXNzYWdlSGFuZGxlciIsInJlZ2lzdGVyS2V5Ym9hcmRFdmVudExpc3RlbmVycyIsInJlZ2lzdGVyTW91c2VFdmVudExpc3RlbmVycyIsImluaXRpYWxQZXJtaXNzaW9ucyIsIm9uUmVhZHkiLCJvblRoZW1lc0NoYW5nZSIsImNvYWxsZXNlZFNhdmluZyIsImNvYWxsZXNlZFNhdmluZ0RlbGF5IiwiY29tcG9uZW50Iiwib25SZWFkeUNhbGxiYWNrIiwib25UaGVtZXNDaGFuZ2VDYWxsYmFjayIsImRlYnVnIiwiZGVpbml0IiwibWVzc2FnZVF1ZXVlIiwic2VudE1lc3NhZ2VzIiwibGFzdFN0cmVhbWVkSXRlbSIsInBlbmRpbmdTYXZlSXRlbXMiLCJwZW5kaW5nU2F2ZVRpbWVvdXQiLCJwZW5kaW5nU2F2ZVBhcmFtcyIsIm1lc3NhZ2VIYW5kbGVyIiwiZG9jdW1lbnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwia2V5RG93bkV2ZW50TGlzdGVuZXIiLCJrZXlVcEV2ZW50TGlzdGVuZXIiLCJjbGlja0V2ZW50TGlzdGVuZXIiLCJldmVudCIsImRhdGEiLCJyZWZlcnJlciIsIlVSTCIsIm9yaWdpbiIsInBhcnNlZERhdGEiLCJzdHIiLCJyZXN1bHQiLCJKU09OIiwicGFyc2UiLCJ0eXBlIiwiZSIsImFjdGlvbiIsIkNvbXBvbmVudFJlZ2lzdGVyZWQiLCJoYW5kbGVNZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImN0cmxLZXkiLCJrZXlEb3duRXZlbnQiLCJDdHJsIiwic2hpZnRLZXkiLCJTaGlmdCIsIm1ldGFLZXkiLCJNZXRhIiwia2V5VXBFdmVudCIsIl9ldmVudCIsIm1vdXNlQ2xpY2tFdmVudCIsInBheWxvYWQiLCJzZXNzaW9uS2V5IiwiY29tcG9uZW50RGF0YSIsIkFjdGl2YXRlVGhlbWVzIiwiYWN0aXZhdGVUaGVtZXMiLCJ0aGVtZXMiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTWVzc2FnZSIsInQiLCJmaWx0ZXIiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwiZXh0ZW5zaW9uTmFtZSIsInRpdGxlIiwiYWxlcnRNZXNzYWdlIiwicmVwbGFjZSIsImNhbGxiYWNrIiwicGxhdGZvcm0iLCJyZXF1ZXN0UGVybWlzc2lvbnMiLCJwb3N0TWVzc2FnZSIsImFjdGl2ZVRoZW1lVXJscyIsIlRoZW1lc0FjdGl2YXRlZCIsImdldFNlbGZDb21wb25lbnRVVUlEIiwiaXNSdW5uaW5nSW5EZXNrdG9wQXBwbGljYXRpb24iLCJpc1J1bm5pbmdJbk1vYmlsZUFwcGxpY2F0aW9uIiwiZ2V0Q29tcG9uZW50RGF0YVZhbHVlRm9yS2V5Iiwic2V0Q29tcG9uZW50RGF0YVZhbHVlRm9yS2V5IiwiU2V0Q29tcG9uZW50RGF0YSIsImNsZWFyQ29tcG9uZW50RGF0YSIsImFwaSIsIkNvbXBvbmVudCIsImdlbmVyYXRlVVVJRCIsInNlbnRNZXNzYWdlIiwic3RyaW5naWZ5IiwicG9zdE1lc3NhZ2VQYXlsb2FkIiwicGFyZW50IiwicGVybWlzc2lvbnMiLCJSZXF1ZXN0UGVybWlzc2lvbnMiLCJpbmNvbWluZ1VybHMiLCJzb3J0IiwidGhlbWVzVG9BY3RpdmF0ZSIsInRoZW1lc1RvRGVhY3RpdmF0ZSIsImFjdGl2ZVVybCIsImluY2x1ZGVzIiwiY2FuZGlkYXRlIiwidGhlbWVVcmwiLCJkZWFjdGl2YXRlVGhlbWUiLCJsaW5rIiwiY3JlYXRlRWxlbWVudCIsImlkIiwiYnRvYSIsImhyZWYiLCJyZWwiLCJtZWRpYSIsImNsYXNzTmFtZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJ0aGVtZUVsZW1lbnRGb3JVcmwiLCJBcnJheSIsImZyb20iLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwic2xpY2UiLCJmaW5kIiwiZWxlbWVudCIsInBhcmVudE5vZGUiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVDaGlsZCIsInV1aWR2NCIsInN0cmVhbUl0ZW1zIiwiY29udGVudFR5cGVzIiwiU3RyZWFtSXRlbXMiLCJjb250ZW50X3R5cGVzIiwiaXRlbXMiLCJzdHJlYW1Db250ZXh0SXRlbSIsIlN0cmVhbUNvbnRleHRJdGVtIiwiaXRlbSIsImNsZWFyVGltZW91dCIsInBlcmZvcm1TYXZpbmdPZkl0ZW1zIiwic2VsZWN0SXRlbSIsIlNlbGVjdEl0ZW0iLCJqc29uT2JqZWN0Rm9ySXRlbSIsImNsZWFyU2VsZWN0aW9uIiwiQ2xlYXJTZWxlY3Rpb24iLCJjb250ZW50X3R5cGUiLCJUYWciLCJjcmVhdGVJdGVtIiwiQ3JlYXRlSXRlbSIsImFzc29jaWF0ZUl0ZW0iLCJjcmVhdGVJdGVtcyIsIm1hcHBlZCIsIkNyZWF0ZUl0ZW1zIiwiQXNzb2NpYXRlSXRlbSIsImRlYXNzb2NpYXRlSXRlbSIsIkRlYXNzb2NpYXRlSXRlbSIsImRlbGV0ZUl0ZW0iLCJkZWxldGVJdGVtcyIsIkRlbGV0ZUl0ZW1zIiwic2VuZEN1c3RvbUV2ZW50Iiwic2F2ZUl0ZW0iLCJza2lwRGVib3VuY2VyIiwic2F2ZUl0ZW1zIiwic2F2ZUl0ZW1XaXRoUHJlc2F2ZSIsInByZXNhdmUiLCJzYXZlSXRlbXNXaXRoUHJlc2F2ZSIsImNvbmNlcm5UaW1lb3V0Iiwic2V0VGltZW91dCIsImNvbmNlcm5UaW1lb3V0cyIsImZvckVhY2giLCJ0aW1lb3V0IiwiYWxlcnQiLCJtYXBwZWRJdGVtcyIsIlNhdmVJdGVtcyIsImluY29taW5nSWRzIiwicHJlZXhpc3RpbmdJdGVtcyIsImNvbmNhdCIsInNldFNpemUiLCJ3aWR0aCIsImhlaWdodCIsIlNldFNpemUiLCJrZXlib2FyZE1vZGlmaWVyIiwiS2V5RG93biIsIktleVVwIiwiQ2xpY2siLCJjb3B5IiwiYXNzaWduIiwiY2hpbGRyZW4iLCJnZXRJdGVtQXBwRGF0YVZhbHVlIiwiY29udGVudCIsImFwcERhdGEiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsInVuZGVmaW5lZCIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImQiLCJhIiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiT3JkZXJlZE1hcCIsImZvdW5kIiwidXBkYXRlIiwibmV3S2V5IiwicmVtb3ZlIiwic3BsaWNlIiwiYWRkVG9TdGFydCIsImFkZFRvRW5kIiwiYWRkQmVmb3JlIiwicGxhY2UiLCJ3aXRob3V0IiwiZiIsInByZXBlbmQiLCJzaXplIiwic3VidHJhY3QiLCJhcHBlbmQiLCJ0b09iamVjdCIsImZpbmREaWZmU3RhcnQiLCJiIiwicG9zIiwiY2hpbGRDb3VudCIsImNoaWxkQSIsImNoaWxkIiwiY2hpbGRCIiwic2FtZU1hcmt1cCIsImlzVGV4dCIsInRleHQiLCJqIiwiaW5uZXIiLCJub2RlU2l6ZSIsImZpbmREaWZmRW5kIiwicG9zQSIsInBvc0IiLCJpQSIsImlCIiwic2FtZSIsIm1pblNpemUiLCJNYXRoIiwibWluIiwiRnJhZ21lbnQiLCJub2Rlc0JldHdlZW4iLCJ0byIsIm5vZGVTdGFydCIsImVuZCIsInN0YXJ0IiwibWF4IiwiZGVzY2VuZGFudHMiLCJ0ZXh0QmV0d2VlbiIsImJsb2NrU2VwYXJhdG9yIiwibGVhZlRleHQiLCJmaXJzdCIsIm5vZGUiLCJub2RlVGV4dCIsImlzTGVhZiIsInNwZWMiLCJpc0Jsb2NrIiwiaXNUZXh0YmxvY2siLCJvdGhlciIsImxhc3QiLCJsYXN0Q2hpbGQiLCJmaXJzdENoaWxkIiwid2l0aFRleHQiLCJjdXQiLCJjdXRCeUluZGV4IiwiZW1wdHkiLCJyZXBsYWNlQ2hpbGQiLCJpbmRleCIsImN1cnJlbnQiLCJlcSIsIlJhbmdlRXJyb3IiLCJtYXliZUNoaWxkIiwicCIsIm90aGVyUG9zIiwiZmluZEluZGV4Iiwicm91bmQiLCJyZXRJbmRleCIsImN1clBvcyIsInRvU3RyaW5nSW5uZXIiLCJqb2luIiwidG9KU09OIiwiZnJvbUpTT04iLCJzY2hlbWEiLCJpc0FycmF5Iiwibm9kZUZyb21KU09OIiwiZnJvbUFycmF5IiwiYXJyYXkiLCJqb2luZWQiLCJub2RlcyIsImF0dHJzIiwiY29tcGFyZURlZXAiLCJNYXJrIiwiYWRkVG9TZXQiLCJzZXQiLCJwbGFjZWQiLCJleGNsdWRlcyIsInJhbmsiLCJyZW1vdmVGcm9tU2V0IiwiaXNJblNldCIsIm5hbWUiLCJfIiwianNvbiIsIm1hcmtzIiwibWFyayIsImNyZWF0ZSIsImNoZWNrQXR0cnMiLCJzYW1lU2V0Iiwic2V0RnJvbSIsIm5vbmUiLCJSZXBsYWNlRXJyb3IiLCJvcGVuU3RhcnQiLCJvcGVuRW5kIiwiaW5zZXJ0QXQiLCJmcmFnbWVudCIsImluc2VydEludG8iLCJyZW1vdmVCZXR3ZWVuIiwicmVtb3ZlUmFuZ2UiLCJtYXhPcGVuIiwib3Blbklzb2xhdGluZyIsImlzb2xhdGluZyIsImluZGV4VG8iLCJvZmZzZXRUbyIsImRpc3QiLCJpbnNlcnQiLCJjYW5SZXBsYWNlIiwiJGZyb20iLCIkdG8iLCJkZXB0aCIsInJlcGxhY2VPdXRlciIsIiRhbG9uZyIsImV4dHJhIiwicmVzb2x2ZU5vQ2FjaGUiLCJwcmVwYXJlU2xpY2VGb3JSZXBsYWNlIiwicmVwbGFjZVRocmVlV2F5IiwicGFyZW50T2Zmc2V0IiwicmVwbGFjZVR3b1dheSIsImNoZWNrSm9pbiIsIm1haW4iLCJzdWIiLCJjb21wYXRpYmxlQ29udGVudCIsImpvaW5hYmxlIiwiJGJlZm9yZSIsIiRhZnRlciIsImFkZE5vZGUiLCJ0YXJnZXQiLCJhZGRSYW5nZSIsIiRzdGFydCIsIiRlbmQiLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJ0ZXh0T2Zmc2V0Iiwibm9kZUFmdGVyIiwibm9kZUJlZm9yZSIsImNoZWNrQ29udGVudCIsIlJlc29sdmVkUG9zIiwicGF0aCIsInJlc29sdmVEZXB0aCIsInZhbCIsImRvYyIsImluZGV4QWZ0ZXIiLCJiZWZvcmUiLCJhZnRlciIsImRPZmYiLCJwb3NBdEluZGV4IiwidG1wIiwiaW5jbHVzaXZlIiwibWFya3NBY3Jvc3MiLCJpc0lubGluZSIsIm5leHQiLCJzaGFyZWREZXB0aCIsImJsb2NrUmFuZ2UiLCJwcmVkIiwiaW5saW5lQ29udGVudCIsIk5vZGVSYW5nZSIsInNhbWVQYXJlbnQiLCJyZXNvbHZlIiwicmVtIiwicmVzb2x2ZUNhY2hlZCIsImNhY2hlIiwicmVzb2x2ZUNhY2hlIiwiZWx0cyIsImVsdCIsIlJlc29sdmVDYWNoZSIsInJlc29sdmVDYWNoZVNpemUiLCJXZWFrTWFwIiwiZW1wdHlBdHRycyIsIk5vZGUiLCJzdGFydFBvcyIsInRleHRDb250ZW50IiwiaGFzTWFya3VwIiwiZGVmYXVsdEF0dHJzIiwiaW5jbHVkZVBhcmVudHMiLCJub2RlQXQiLCJjaGlsZEFmdGVyIiwiY2hpbGRCZWZvcmUiLCJyYW5nZUhhc01hcmsiLCJpc0F0b20iLCJ0b0RlYnVnU3RyaW5nIiwid3JhcE1hcmtzIiwiY29udGVudE1hdGNoQXQiLCJtYXRjaCIsImNvbnRlbnRNYXRjaCIsIm1hdGNoRnJhZ21lbnQiLCJyZXBsYWNlbWVudCIsIm9uZSIsInR3byIsInZhbGlkRW5kIiwiYWxsb3dzTWFya3MiLCJjYW5SZXBsYWNlV2l0aCIsIm1hdGNoVHlwZSIsImNhbkFwcGVuZCIsImNoZWNrIiwibSIsIm1hcmtGcm9tSlNPTiIsIm5vZGVUeXBlIiwiVGV4dE5vZGUiLCJzdXBlciIsImJhc2UiLCJDb250ZW50TWF0Y2giLCJ3cmFwQ2FjaGUiLCJzdHJpbmciLCJub2RlVHlwZXMiLCJzdHJlYW0iLCJUb2tlblN0cmVhbSIsImV4cHIiLCJwYXJzZUV4cHIiLCJlcnIiLCJuZmEiLCJsYWJlbGVkIiwiZXhwbG9yZSIsIm51bGxGcm9tIiwic3RhdGVzIiwib3V0IiwidGVybSIsImluZGV4T2YiLCJzdGF0ZSIsImNtcCIsImRmYSIsImNvbm5lY3QiLCJjb21waWxlIiwiZWRnZSIsImVkZ2VzIiwiZXhwcnMiLCJyZWR1Y2UiLCJsb29wIiwiY3VyIiwid29yayIsImRlYWQiLCJoYXNSZXF1aXJlZEF0dHJzIiwiY2hlY2tGb3JEZWFkRW5kcyIsImZyYWciLCJkZWZhdWx0VHlwZSIsImNvbXBhdGlibGUiLCJmaWxsQmVmb3JlIiwidG9FbmQiLCJzZWVuIiwic2VhcmNoIiwidHlwZXMiLCJmaW5pc2hlZCIsInRwIiwiY3JlYXRlQW5kRmlsbCIsImZpbmRXcmFwcGluZyIsImNvbXB1dGVkIiwiY29tcHV0ZVdyYXBwaW5nIiwiYWN0aXZlIiwidmlhIiwic2hpZnQiLCJyZXZlcnNlIiwiZWRnZUNvdW50Iiwic2NhbiIsImlubGluZSIsInRva2VucyIsInNwbGl0IiwicG9wIiwiZWF0IiwidG9rIiwiU3ludGF4RXJyb3IiLCJwYXJzZUV4cHJTZXEiLCJwYXJzZUV4cHJTdWJzY3JpcHQiLCJ0ZXN0IiwidHlwZU5hbWUiLCJpc0luR3JvdXAiLCJyZXNvbHZlTmFtZSIsInBhcnNlRXhwckF0b20iLCJwYXJzZUV4cHJSYW5nZSIsInBhcnNlTnVtIiwiTnVtYmVyIiwiZGVmYXVsdHMiLCJhdHRyTmFtZSIsImF0dHIiLCJoYXNEZWZhdWx0IiwiZGVmYXVsdCIsImNvbXB1dGVBdHRycyIsImJ1aWx0IiwiZ2l2ZW4iLCJ2YWx1ZXMiLCJ2YWxpZGF0ZSIsImluaXRBdHRycyIsIkF0dHJpYnV0ZSIsIk5vZGVUeXBlIiwibWFya1NldCIsImdyb3VwcyIsImdyb3VwIiwiYXRvbSIsIndoaXRlc3BhY2UiLCJjb2RlIiwiaXNSZXF1aXJlZCIsImNyZWF0ZUNoZWNrZWQiLCJtYXRjaGVkIiwidmFsaWRDb250ZW50IiwiYWxsb3dzTWFya1R5cGUiLCJtYXJrVHlwZSIsImFsbG93ZWRNYXJrcyIsInRvcFR5cGUiLCJ0b3BOb2RlIiwidmFsaWRhdGVUeXBlIiwiTWFya1R5cGUiLCJleGNsdWRlZCIsImluc3RhbmNlIiwiU2NoZW1hIiwibGluZWJyZWFrUmVwbGFjZW1lbnQiLCJjYWNoZWQiLCJpbnN0YW5jZVNwZWMiLCJjb250ZW50RXhwckNhY2hlIiwiY29udGVudEV4cHIiLCJtYXJrRXhwciIsImdhdGhlck1hcmtzIiwiZXhjbCIsInRvcE5vZGVUeXBlIiwid3JhcHBpbmdzIiwib2siLCJET01QYXJzZXIiLCJydWxlcyIsInRhZ3MiLCJzdHlsZXMiLCJtYXRjaGVkU3R5bGVzIiwicnVsZSIsInRhZyIsImlzVGFnUnVsZSIsInN0eWxlIiwiaXNTdHlsZVJ1bGUiLCJleGVjIiwibm9ybWFsaXplTGlzdHMiLCJzb21lIiwiZG9tIiwiY29udGV4dCIsIlBhcnNlQ29udGV4dCIsImFkZEFsbCIsImZpbmlzaCIsInBhcnNlU2xpY2UiLCJtYXRjaFRhZyIsIm1hdGNoZXMiLCJuYW1lc3BhY2UiLCJuYW1lc3BhY2VVUkkiLCJtYXRjaGVzQ29udGV4dCIsImdldEF0dHJzIiwibWF0Y2hTdHlsZSIsImNoYXJDb2RlQXQiLCJzY2hlbWFSdWxlcyIsInByaW9yaXR5IiwicGFyc2VET00iLCJpZ25vcmUiLCJjbGVhck1hcmsiLCJmcm9tU2NoZW1hIiwiZG9tUGFyc2VyIiwiYmxvY2tUYWdzIiwiYWRkcmVzcyIsImFydGljbGUiLCJhc2lkZSIsImJsb2NrcXVvdGUiLCJjYW52YXMiLCJkZCIsImRpdiIsImRsIiwiZmllbGRzZXQiLCJmaWdjYXB0aW9uIiwiZmlndXJlIiwiZm9vdGVyIiwiZm9ybSIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWRlciIsImhncm91cCIsImhyIiwibGkiLCJub3NjcmlwdCIsIm9sIiwib3V0cHV0IiwicHJlIiwic2VjdGlvbiIsInRhYmxlIiwidGZvb3QiLCJ1bCIsImlnbm9yZVRhZ3MiLCJoZWFkIiwib2JqZWN0Iiwic2NyaXB0IiwibGlzdFRhZ3MiLCJ3c09wdGlvbnNGb3IiLCJwcmVzZXJ2ZVdoaXRlc3BhY2UiLCJPUFRfUFJFU0VSVkVfV1MiLCJOb2RlQ29udGV4dCIsInNvbGlkIiwiYWN0aXZlTWFya3MiLCJmaWxsIiwid3JhcCIsImlubGluZUNvbnRleHQiLCJub2RlTmFtZSIsInBhcnNlciIsImlzT3BlbiIsIm9wZW4iLCJsb2NhbFByZXNlcnZlV1MiLCJ0b3BDb250ZXh0IiwidG9wT3B0aW9ucyIsInRvcE1hdGNoIiwiZmluZFBvc2l0aW9ucyIsIm5lZWRzQmxvY2siLCJ0b3AiLCJhZGRET00iLCJhZGRUZXh0Tm9kZSIsImFkZEVsZW1lbnQiLCJub2RlVmFsdWUiLCJwcmVzZXJ2ZVdTIiwiZG9tTm9kZUJlZm9yZSIsInByZXZpb3VzU2libGluZyIsImluc2VydE5vZGUiLCJmaW5kSW5UZXh0IiwiZmluZEluc2lkZSIsIm1hdGNoQWZ0ZXIiLCJvdXRlcldTIiwidGFnTmFtZSIsIndoaXRlU3BhY2UiLCJydWxlSUQiLCJwcmV2SXRlbSIsIm5leHRTaWJsaW5nIiwibm9ybWFsaXplTGlzdCIsInJ1bGVGcm9tTm9kZSIsImlnbm9yZUZhbGxiYWNrIiwic2tpcCIsImNsb3NlUGFyZW50Iiwic3luYyIsIm9sZE5lZWRzQmxvY2siLCJsZWFmRmFsbGJhY2siLCJpbm5lck1hcmtzIiwicmVhZFN0eWxlcyIsImFkZEVsZW1lbnRCeVJ1bGUiLCJjb25zdW1pbmciLCJvd25lckRvY3VtZW50IiwiY3JlYXRlVGV4dE5vZGUiLCJmaW5kUGxhY2UiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiY29udGludWVBZnRlciIsImVudGVyIiwic3RhcnRJbiIsImdldENvbnRlbnQiLCJjb250ZW50RE9NIiwiY29udGVudEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiZmluZEFyb3VuZCIsImNoaWxkTm9kZXMiLCJmaW5kQXRQb2ludCIsImNhdXRpb3VzIiwicm91dGUiLCJwZW5hbHR5IiwiY3giLCJlbnRlcklubmVyIiwiYmxvY2siLCJ0ZXh0YmxvY2tGcm9tQ29udGV4dCIsImNsb3NlRXh0cmEiLCJub2RlTWFya3MiLCJtYXJrTWF5QXBwbHkiLCJhcHBseU1hcmtzIiwidG9wT3BlbiIsImN1cnJlbnRQb3MiLCJjb250YWlucyIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwidGV4dE5vZGUiLCJwYXJ0cyIsIm9wdGlvbiIsInVzZVJvb3QiLCJtaW5EZXB0aCIsInBhcnQiLCIkY29udGV4dCIsImRlZmx0Iiwic2VsZWN0b3IiLCJtc01hdGNoZXNTZWxlY3RvciIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsIm1vek1hdGNoZXNTZWxlY3RvciIsIkRPTVNlcmlhbGl6ZXIiLCJzZXJpYWxpemVGcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJrZWVwIiwicmVuZGVyZWQiLCJzcGFubmluZyIsImFkZCIsIm1hcmtET00iLCJzZXJpYWxpemVNYXJrIiwic2VyaWFsaXplTm9kZUlubmVyIiwicmVuZGVyU3BlYyIsInNlcmlhbGl6ZU5vZGUiLCJ0b0RPTSIsInN0cnVjdHVyZSIsInhtbE5TIiwiYmxvY2tBcnJheXNJbiIsImRvbVNlcmlhbGl6ZXIiLCJub2Rlc0Zyb21TY2hlbWEiLCJtYXJrc0Zyb21TY2hlbWEiLCJnYXRoZXJUb0RPTSIsInN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZSIsInN1c3BpY2lvdXNBdHRyaWJ1dGVzIiwic3VzcGljaW91c0F0dHJpYnV0ZXNJbm5lciIsInN1c3BpY2lvdXMiLCJzcGFjZSIsImNyZWF0ZUVsZW1lbnROUyIsInNldEF0dHJpYnV0ZU5TIiwiaW5uZXJDb250ZW50IiwiZmFjdG9yMTYiLCJwb3ciLCJyZWNvdmVySW5kZXgiLCJNYXBSZXN1bHQiLCJkZWxJbmZvIiwicmVjb3ZlciIsImRlbGV0ZWQiLCJkZWxldGVkQmVmb3JlIiwiZGVsZXRlZEFmdGVyIiwiZGVsZXRlZEFjcm9zcyIsIlN0ZXBNYXAiLCJyYW5nZXMiLCJpbnZlcnRlZCIsImRpZmYiLCJyZWNvdmVyT2Zmc2V0IiwibWFwUmVzdWx0IiwiYXNzb2MiLCJfbWFwIiwic2ltcGxlIiwib2xkSW5kZXgiLCJuZXdJbmRleCIsIm9sZFNpemUiLCJuZXdTaXplIiwiZGVsIiwidG91Y2hlcyIsIm9sZFN0YXJ0IiwibmV3U3RhcnQiLCJpbnZlcnQiLCJNYXBwaW5nIiwibWFwcyIsIm1pcnJvciIsIl9tYXBzIiwib3duRGF0YSIsImFwcGVuZE1hcCIsIm1pcnJvcnMiLCJzZXRNaXJyb3IiLCJhcHBlbmRNYXBwaW5nIiwibWFwcGluZyIsInN0YXJ0U2l6ZSIsIm1pcnIiLCJnZXRNaXJyb3IiLCJhcHBlbmRNYXBwaW5nSW52ZXJ0ZWQiLCJ0b3RhbFNpemUiLCJpbnZlcnNlIiwiY29yciIsInN0ZXBzQnlJRCIsIlN0ZXAiLCJnZXRNYXAiLCJtZXJnZSIsInN0ZXBUeXBlIiwianNvbklEIiwic3RlcENsYXNzIiwiU3RlcFJlc3VsdCIsImZhaWxlZCIsImZhaWwiLCJmcm9tUmVwbGFjZSIsIm1hcEZyYWdtZW50IiwiQWRkTWFya1N0ZXAiLCJhcHBseSIsIm9sZFNsaWNlIiwiUmVtb3ZlTWFya1N0ZXAiLCJBZGROb2RlTWFya1N0ZXAiLCJ1cGRhdGVkIiwibmV3U2V0IiwiUmVtb3ZlTm9kZU1hcmtTdGVwIiwiY29udGVudEJldHdlZW4iLCJSZXBsYWNlQXJvdW5kU3RlcCIsImdhcEZyb20iLCJnYXBUbyIsImdhcCIsImluc2VydGVkIiwiY2xlYXJJbmNvbXBhdGlibGUiLCJ0ciIsInBhcmVudFR5cGUiLCJjbGVhck5ld2xpbmVzIiwicmVwbFN0ZXBzIiwiYWxsb3dlZCIsInN0ZXAiLCJuZXdsaW5lIiwiY2FuQ3V0IiwicmFuZ2UiLCJ3aXRoQXR0cnMiLCJyZXBsYWNlTmV3bGluZXMiLCJtYXBGcm9tIiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlTGluZWJyZWFrcyIsImNhblNwbGl0IiwidHlwZXNBZnRlciIsIiRwb3MiLCJpbm5lclR5cGUiLCJyZXN0Iiwib3ZlcnJpZGVDaGlsZCIsImJhc2VUeXBlIiwiY2FuQXBwZW5kV2l0aFN1YnN0aXR1dGVkTGluZWJyZWFrcyIsImZpdHNUcml2aWFsbHkiLCJGaXR0ZXIiLCJmaXQiLCJ1bnBsYWNlZCIsImZyb250aWVyIiwiZmluZEZpdHRhYmxlIiwicGxhY2VOb2RlcyIsIm9wZW5Nb3JlIiwiZHJvcE5vZGUiLCJtb3ZlSW5saW5lIiwibXVzdE1vdmVJbmxpbmUiLCJwbGFjZWRTaXplIiwiY2xvc2UiLCJzdGFydERlcHRoIiwicGFzcyIsInNsaWNlRGVwdGgiLCJjb250ZW50QXQiLCJmcm9udGllckRlcHRoIiwiaW5qZWN0Iiwib3BlbkF0RW5kIiwiZHJvcEZyb21GcmFnbWVudCIsImNsb3NlRnJvbnRpZXJOb2RlIiwib3BlbkZyb250aWVyTm9kZSIsInRha2VuIiwib3BlbkVuZENvdW50IiwiY2xvc2VOb2RlU3RhcnQiLCJhZGRUb0ZyYWdtZW50IiwibGV2ZWwiLCJjb250ZW50QWZ0ZXJGaXRzIiwiZmluZENsb3NlTGV2ZWwiLCJkcm9wSW5uZXIiLCJtb3ZlIiwiY291bnQiLCJpbnZhbGlkTWFya3MiLCJjbG9zZUZyYWdtZW50Iiwib2xkT3BlbiIsIm5ld09wZW4iLCJjb3ZlcmVkRGVwdGhzIiwiQXR0clN0ZXAiLCJEb2NBdHRyU3RlcCIsIlRyYW5zZm9ybUVycm9yIiwiX19wcm90b19fIiwiVHJhbnNmb3JtIiwic3RlcHMiLCJkb2NzIiwibWF5YmVTdGVwIiwiYWRkU3RlcCIsImRvY0NoYW5nZWQiLCJyZXBsYWNlUmFuZ2UiLCJkZWxldGVSYW5nZSIsInRhcmdldERlcHRocyIsInByZWZlcnJlZFRhcmdldCIsInVuc2hpZnQiLCJkZWZpbmluZyIsImRlZmluaW5nQXNDb250ZXh0IiwicHJlZmVycmVkVGFyZ2V0SW5kZXgiLCJsZWZ0Tm9kZXMiLCJwcmVmZXJyZWREZXB0aCIsImxlZnROb2RlIiwiZGVmIiwiZGVmaW5pbmdGb3JDb250ZW50IiwiYWJzIiwib3BlbkRlcHRoIiwidGFyZ2V0RGVwdGgiLCJleHBhbmQiLCJzdGFydFN0ZXBzIiwicmVwbGFjZVJhbmdlV2l0aCIsInBvaW50IiwiaW5zZXJ0UG9pbnQiLCJjb3ZlcmVkIiwiZGVsZXRlIiwibGlmdCIsImdhcFN0YXJ0IiwiZ2FwRW5kIiwic3BsaXR0aW5nIiwiY29udmVydE5ld2xpbmVzIiwiYmVmb3JlVHlwZSIsInN1cHBvcnRMaW5lYnJlYWsiLCIkZnVsbCIsIndyYXBwZXJzIiwic2V0QmxvY2tUeXBlIiwiYXR0cnNIZXJlIiwiY2FuQ2hhbmdlVHlwZSIsInN0YXJ0TSIsImVuZE0iLCJzZXROb2RlTWFya3VwIiwibmV3Tm9kZSIsInNldE5vZGVBdHRyaWJ1dGUiLCJzZXREb2NBdHRyaWJ1dGUiLCJhZGROb2RlTWFyayIsInJlbW92ZU5vZGVNYXJrIiwidHlwZUFmdGVyIiwiYWRkTWFyayIsInJlbW92aW5nIiwiYWRkaW5nIiwicmVtb3ZlZCIsImFkZGVkIiwicyIsInJlbW92ZU1hcmsiLCJ0b1JlbW92ZSIsImNsYXNzZXNCeUlkIiwiU2VsZWN0aW9uIiwiJGFuY2hvciIsIiRoZWFkIiwiU2VsZWN0aW9uUmFuZ2UiLCJhbmNob3IiLCJsYXN0Tm9kZSIsImxhc3RQYXJlbnQiLCJzZWxlY3Rpb25Ub0luc2VydGlvbkVuZCIsImZpbmRGcm9tIiwiZGlyIiwidGV4dE9ubHkiLCJmaW5kU2VsZWN0aW9uSW4iLCJuZWFyIiwiYmlhcyIsIkFsbFNlbGVjdGlvbiIsImF0U3RhcnQiLCJhdEVuZCIsImNscyIsInNlbGVjdGlvbkNsYXNzIiwiZ2V0Qm9va21hcmsiLCJiZXR3ZWVuIiwidmlzaWJsZSIsIndhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiIsImNoZWNrVGV4dFNlbGVjdGlvbiIsIiRjdXJzb3IiLCJlbnN1cmVNYXJrcyIsIlRleHRCb29rbWFyayIsImRQb3MiLCJOb2RlQm9va21hcmsiLCJpc1NlbGVjdGFibGUiLCJzZWxlY3RhYmxlIiwic2VsIiwic2VsZWN0aW9uIiwic2V0U2VsZWN0aW9uIiwiQWxsQm9va21hcmsiLCJzdGFydExlbiIsIl9mcm9tIiwiX3RvIiwiX25ld0Zyb20iLCJuZXdUbyIsIlRyYW5zYWN0aW9uIiwiY3VyU2VsZWN0aW9uRm9yIiwibWV0YSIsInRpbWUiLCJEYXRlIiwibm93IiwiY3VyU2VsZWN0aW9uIiwic3RvcmVkTWFya3MiLCJzZWxlY3Rpb25TZXQiLCJzZXRTdG9yZWRNYXJrcyIsImFkZFN0b3JlZE1hcmsiLCJyZW1vdmVTdG9yZWRNYXJrIiwic3RvcmVkTWFya3NTZXQiLCJzZXRUaW1lIiwicmVwbGFjZVNlbGVjdGlvbiIsInJlcGxhY2VTZWxlY3Rpb25XaXRoIiwiaW5oZXJpdE1hcmtzIiwiZGVsZXRlU2VsZWN0aW9uIiwiaW5zZXJ0VGV4dCIsInNldE1ldGEiLCJnZXRNZXRhIiwiaXNHZW5lcmljIiwic2Nyb2xsSW50b1ZpZXciLCJzY3JvbGxlZEludG9WaWV3IiwiRmllbGREZXNjIiwiZGVzYyIsImluaXQiLCJiYXNlRmllbGRzIiwiY29uZmlnIiwiX21hcmtzIiwiX29sZCIsInByZXYiLCJDb25maWd1cmF0aW9uIiwicGx1Z2lucyIsInBsdWdpbnNCeUtleSIsImZpZWxkcyIsInBsdWdpbiIsIkVkaXRvclN0YXRlIiwiYXBwbHlUcmFuc2FjdGlvbiIsImZpbHRlclRyYW5zYWN0aW9uIiwicm9vdFRyIiwidHJhbnNhY3Rpb25zIiwidHJzIiwibmV3U3RhdGUiLCJhcHBseUlubmVyIiwiaGF2ZU5ldyIsImFwcGVuZFRyYW5zYWN0aW9uIiwib2xkU3RhdGUiLCJuZXdJbnN0YW5jZSIsImZpZWxkIiwiJGNvbmZpZyIsInJlY29uZmlndXJlIiwicGx1Z2luRmllbGRzIiwiYmluZFByb3BzIiwiRnVuY3Rpb24iLCJQbHVnaW4iLCJwcm9wcyIsImNyZWF0ZUtleSIsImdldFN0YXRlIiwia2V5cyIsIlBsdWdpbktleSIsImRvbUluZGV4IiwiYXNzaWduZWRTbG90IiwiaG9zdCIsInJldXNlZFJhbmdlIiwidGV4dFJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZXRFbmQiLCJzZXRTdGFydCIsImlzRXF1aXZhbGVudFBvc2l0aW9uIiwib2ZmIiwidGFyZ2V0Tm9kZSIsInRhcmdldE9mZiIsInNjYW5Gb3IiLCJhdG9tRWxlbWVudHMiLCJoYXNCbG9ja0Rlc2MiLCJjb250ZW50RWRpdGFibGUiLCJwbVZpZXdEZXNjIiwic2VsZWN0aW9uQ29sbGFwc2VkIiwiZG9tU2VsIiwiZm9jdXNOb2RlIiwiZm9jdXNPZmZzZXQiLCJhbmNob3JOb2RlIiwiYW5jaG9yT2Zmc2V0Iiwia2V5RXZlbnQiLCJrZXlDb2RlIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJuYXYiLCJuYXZpZ2F0b3IiLCJhZ2VudCIsInVzZXJBZ2VudCIsImllX2VkZ2UiLCJpZV91cHRvMTAiLCJpZV8xMXVwIiwiaWUiLCJpZV92ZXJzaW9uIiwiZG9jdW1lbnRNb2RlIiwiZ2Vja28iLCJfY2hyb21lIiwiY2hyb21lIiwiY2hyb21lX3ZlcnNpb24iLCJzYWZhcmkiLCJ2ZW5kb3IiLCJpb3MiLCJtYXhUb3VjaFBvaW50cyIsIm1hYyIsIndpbmRvd3MiLCJhbmRyb2lkIiwid2Via2l0IiwiZG9jdW1lbnRFbGVtZW50Iiwid2Via2l0X3ZlcnNpb24iLCJ3aW5kb3dSZWN0IiwidnAiLCJkZWZhdWx0VmlldyIsInZpc3VhbFZpZXdwb3J0IiwibGVmdCIsInJpZ2h0IiwiYm90dG9tIiwiY2xpZW50V2lkdGgiLCJjbGllbnRIZWlnaHQiLCJnZXRTaWRlIiwic2lkZSIsImNsaWVudFJlY3QiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwic2NhbGVYIiwib2Zmc2V0V2lkdGgiLCJzY2FsZVkiLCJvZmZzZXRIZWlnaHQiLCJzY3JvbGxSZWN0SW50b1ZpZXciLCJ2aWV3Iiwic3RhcnRET00iLCJzY3JvbGxUaHJlc2hvbGQiLCJzb21lUHJvcCIsInNjcm9sbE1hcmdpbiIsImF0VG9wIiwiYm9keSIsImJvdW5kaW5nIiwibW92ZVgiLCJtb3ZlWSIsInNjcm9sbEJ5Iiwic3RhcnRYIiwic2Nyb2xsTGVmdCIsInN0YXJ0WSIsInNjcm9sbFRvcCIsImRYIiwiZFkiLCJnZXRDb21wdXRlZFN0eWxlIiwicG9zaXRpb24iLCJvZmZzZXRQYXJlbnQiLCJzY3JvbGxTdGFjayIsInN0YWNrIiwicmVzdG9yZVNjcm9sbFN0YWNrIiwiZFRvcCIsInByZXZlbnRTY3JvbGxTdXBwb3J0ZWQiLCJmaW5kT2Zmc2V0SW5Ob2RlIiwiY29vcmRzIiwiY2xvc2VzdCIsImNvb3Jkc0Nsb3Nlc3QiLCJmaXJzdEJlbG93IiwiY29vcmRzQmVsb3ciLCJkeENsb3Nlc3QiLCJyb3dCb3QiLCJyb3dUb3AiLCJjaGlsZEluZGV4IiwicmVjdHMiLCJnZXRDbGllbnRSZWN0cyIsImR4IiwibGVuIiwic2luZ2xlUmVjdCIsImluUmVjdCIsImZpbmRPZmZzZXRJblRleHQiLCJlbGVtZW50RnJvbVBvaW50IiwiYm94Iiwic3RhcnRJIiwiZmxvb3IiLCJwb3NBdENvb3JkcyIsImNhcmV0IiwieCIsInkiLCJjYXJldFBvc2l0aW9uRnJvbVBvaW50Iiwib2Zmc2V0Tm9kZSIsImNhcmV0UmFuZ2VGcm9tUG9pbnQiLCJzdGFydENvbnRhaW5lciIsInN0YXJ0T2Zmc2V0IiwiY2FyZXRGcm9tUG9pbnQiLCJyb290IiwiZHJhZ2dhYmxlIiwidGFyZ2V0S2x1ZGdlIiwib3V0c2lkZUJsb2NrIiwic2F3QmxvY2siLCJkb2NWaWV3IiwibmVhcmVzdERlc2MiLCJwb3NCZWZvcmUiLCJwb3NBZnRlciIsInBvc0Zyb21ET00iLCJwb3NGcm9tQ2FyZXQiLCJwb3NGcm9tRWxlbWVudCIsImluc2lkZSIsInBvc0F0U3RhcnQiLCJib3JkZXIiLCJub25aZXJvIiwiQklESSIsImNvb3Jkc0F0UG9zIiwiZG9tRnJvbVBvcyIsInN1cHBvcnRFbXB0eVJhbmdlIiwidGFrZVNpZGUiLCJmbGF0dGVuViIsInJlY3RCZWZvcmUiLCJyZWN0QWZ0ZXIiLCJmbGF0dGVuSCIsImlnbm9yZUZvckNvb3JkcyIsIndpdGhGbHVzaGVkU3RhdGUiLCJ2aWV3U3RhdGUiLCJhY3RpdmVFbGVtZW50IiwidXBkYXRlU3RhdGUiLCJmb2N1cyIsIm1heWJlUlRMIiwiY2FjaGVkU3RhdGUiLCJjYWNoZWREaXIiLCJjYWNoZWRSZXN1bHQiLCJlbmRPZlRleHRibG9jayIsIm5lYXJlc3QiLCJib3hlcyIsImVuZE9mVGV4dGJsb2NrVmVydGljYWwiLCJkb21TZWxlY3Rpb24iLCJtb2RpZnkiLCJvbGROb2RlIiwib2xkT2ZmIiwiZG9tU2VsZWN0aW9uUmFuZ2UiLCJvbGRCaWRpTGV2ZWwiLCJjYXJldEJpZGlMZXZlbCIsInBhcmVudERPTSIsImRvbUFmdGVyUG9zIiwibmV3T2ZmIiwiY29sbGFwc2UiLCJleHRlbmQiLCJlbmRPZlRleHRibG9ja0hvcml6b250YWwiLCJWaWV3RGVzYyIsImRpcnR5IiwibWF0Y2hlc1dpZGdldCIsIndpZGdldCIsIm1hdGNoZXNNYXJrIiwibWF0Y2hlc05vZGUiLCJvdXRlckRlY28iLCJpbm5lckRlY28iLCJtYXRjaGVzSGFjayIsInBhcnNlUnVsZSIsInN0b3BFdmVudCIsImRlc3Ryb3kiLCJwb3NCZWZvcmVDaGlsZCIsInBvc0F0RW5kIiwibG9jYWxQb3NGcm9tRE9NIiwiZG9tQmVmb3JlIiwiZG9tQWZ0ZXIiLCJvbmx5Tm9kZXMiLCJub2RlRE9NIiwiZ2V0RGVzYyIsImRlc2NBdCIsIlRyYWlsaW5nSGFja1ZpZXdEZXNjIiwiV2lkZ2V0Vmlld0Rlc2MiLCJkb21BdG9tIiwicGFyc2VSYW5nZSIsImZyb21PZmZzZXQiLCJ0b09mZnNldCIsImNoaWxkQmFzZSIsImVtcHR5Q2hpbGRBdCIsImZvcmNlIiwiYW5jaG9yRE9NIiwiaGVhZERPTSIsImdldFNlbGVjdGlvbiIsInNlbFJhbmdlIiwiYnJLbHVkZ2UiLCJkb21TZWxFeHRlbmRlZCIsInJlbW92ZUFsbFJhbmdlcyIsImlnbm9yZU11dGF0aW9uIiwibXV0YXRpb24iLCJjb250ZW50TG9zdCIsIm1hcmtEaXJ0eSIsInN0YXJ0SW5zaWRlIiwiZW5kSW5zaWRlIiwibWFya1BhcmVudHNEaXJ0eSIsInJhdyIsImNsYXNzTGlzdCIsInN0b3AiLCJpZ25vcmVTZWxlY3Rpb24iLCJDb21wb3NpdGlvblZpZXdEZXNjIiwidGV4dERPTSIsIm11dCIsIm9sZFZhbHVlIiwiTWFya1ZpZXdEZXNjIiwiY3VzdG9tIiwibm9kZVZpZXdzIiwicmVwYXJzZUluVmlldyIsInJlcGxhY2VOb2RlcyIsIk5vZGVWaWV3RGVzYyIsImRlc2NPYmoiLCJoYXNBdHRyaWJ1dGUiLCJhcHBseU91dGVyRGVjbyIsIkN1c3RvbU5vZGVWaWV3RGVzYyIsIlRleHRWaWV3RGVzYyIsInNhbWVPdXRlckRlY28iLCJ1cGRhdGVDaGlsZHJlbiIsImNvbXBvc2l0aW9uIiwiY29tcG9zaW5nIiwibG9jYWxDb21wb3NpdGlvbkluZm8iLCJsb2NhbENvbXBvc2l0aW9uIiwiY29tcG9zaXRpb25JbkNoaWxkIiwidXBkYXRlciIsIlZpZXdUcmVlVXBkYXRlciIsImRlY28iLCJvbldpZGdldCIsIm9uTm9kZSIsImxvY2FscyIsImZvckNoaWxkIiwiZGVjb0luZGV4IiwicmVzdE5vZGUiLCJwYXJlbnRJbmRleCIsIndpZGdldHMiLCJjb21wYXJlU2lkZSIsImN1dEF0IiwiaXRlckRlY28iLCJpbnNpZGVOb2RlIiwic3luY1RvTWFya3MiLCJwbGFjZVdpZGdldCIsImNvbXBJbmRleCIsImZpbmROb2RlTWF0Y2giLCJmaW5kSW5kZXhXaXRoQ2hpbGQiLCJ1cGRhdGVOb2RlQXQiLCJ1cGRhdGVOZXh0Tm9kZSIsImFkZFRleHRibG9ja0hhY2tzIiwiZGVzdHJveVJlc3QiLCJjaGFuZ2VkIiwicHJvdGVjdExvY2FsQ29tcG9zaXRpb24iLCJyZW5kZXJEZXNjcyIsIm9sZENTUyIsImNzc1RleHQiLCJsaXN0U3R5bGUiLCJpb3NIYWNrcyIsImlucHV0IiwiY29tcG9zaXRpb25Ob2RlIiwidGV4dFBvcyIsImNoaWxkU3RhcnQiLCJsYXN0SW5kZXhPZiIsImZpbmRUZXh0SW5GcmFnbWVudCIsImNvbXBvc2l0aW9uTm9kZXMiLCJ1cGRhdGVJbm5lciIsInVwZGF0ZU91dGVyRGVjbyIsIm5lZWRzV3JhcCIsIm9sZERPTSIsInBhdGNoT3V0ZXJEZWNvIiwiY29tcHV0ZU91dGVyRGVjbyIsInNlbGVjdE5vZGUiLCJkZXNlbGVjdE5vZGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJkb2NWaWV3RGVzYyIsInBtSXNEZWNvIiwiaW5QYXJlbnQiLCJ0cmFja1dyaXRlcyIsIm11bHRpVHlwZSIsImRlc2NzIiwid3JpdHRlbiIsImNoaWxkRE9NIiwicm0iLCJpbnNlcnRCZWZvcmUiLCJPdXRlckRlY29MZXZlbCIsIm5vRGVjbyIsImNsYXNzIiwib3V0ZXJET00iLCJwcmV2Q29tcHV0ZWQiLCJjdXJDb21wdXRlZCIsImN1ckRPTSIsInBhdGNoQXR0cmlidXRlcyIsInByZXZMaXN0IiwiQm9vbGVhbiIsImN1ckxpc3QiLCJyZW1vdmVQcm9wZXJ0eSIsImxvY2siLCJwcmVNYXRjaCIsInBhcmVudERlc2MiLCJjdXJEZXNjIiwiZGVzY0kiLCJmSSIsIk1hcCIsIm91dGVyIiwiZGVzdHJveUJldHdlZW4iLCJtYXhLZWVwIiwiaXNMb2NrZWQiLCJtYXJrRGVzYyIsInRhcmdldERlc2MiLCJoYXMiLCJkb21Ob2RlIiwibmV4dERPTSIsImxvY2tlZCIsInJlY3JlYXRlV3JhcHBlciIsIndyYXBwZXIiLCJjaCIsInJlcXVpcmVzR2Vja29IYWNrTm9kZSIsImFkZEhhY2tOb2RlIiwiYWx0IiwiaGFjayIsInNlbGVjdGlvbkZyb21ET00iLCJpbldpZGdldCIsIm5lYXJlc3REZXNjTm9kZSIsImlzT25FZGdlIiwicmFuZ2VDb3VudCIsImdldFJhbmdlQXQiLCJlbmRDb250YWluZXIiLCJlbmRPZmZzZXQiLCJzZWxlY3Rpb25CZXR3ZWVuIiwiZWRpdG9yT3duc1NlbGVjdGlvbiIsImVkaXRhYmxlIiwiaGFzRm9jdXMiLCJoYXNTZWxlY3Rpb24iLCJzZWxlY3Rpb25Ub0RPTSIsInN5bmNOb2RlU2VsZWN0aW9uIiwibW91c2VEb3duIiwiYWxsb3dEZWZhdWx0IiwiY3VyU2VsIiwiZG9tT2JzZXJ2ZXIiLCJjdXJyZW50U2VsZWN0aW9uIiwiZGVsYXllZFNlbGVjdGlvblN5bmMiLCJzZXRDdXJTZWxlY3Rpb24iLCJkaXNjb25uZWN0U2VsZWN0aW9uIiwiY3Vyc29yV3JhcHBlciIsImltZyIsImRpc2FibGVkIiwic2VsZWN0Q3Vyc29yV3JhcHBlciIsInJlc2V0RWRpdGFibGVGcm9tIiwicmVzZXRFZGl0YWJsZVRvIiwiYnJva2VuU2VsZWN0QmV0d2VlblVuZWRpdGFibGUiLCJ0ZW1wb3JhcmlseUVkaXRhYmxlTmVhciIsInJlc2V0RWRpdGFibGUiLCJoaWRlU2VsZWN0aW9uR3VhcmQiLCJyZW1vdmVDbGFzc09uU2VsZWN0aW9uQ2hhbmdlIiwiY29ubmVjdFNlbGVjdGlvbiIsInNldEVkaXRhYmxlIiwid2FzRHJhZ2dhYmxlIiwibGFzdFNlbGVjdGVkVmlld0Rlc2MiLCJjbGVhck5vZGVTZWxlY3Rpb24iLCJoYXNGb2N1c0FuZFNlbGVjdGlvbiIsIm1vdmVTZWxlY3Rpb25CbG9jayIsIiRzaWRlIiwiZGlzcGF0Y2giLCJzZWxlY3RIb3Jpem9udGFsbHkiLCJtb2RzIiwiJG5ld0hlYWQiLCJub2RlUG9zIiwibm9kZUxlbiIsImlzSWdub3JhYmxlIiwic2tpcElnbm9yZWROb2RlcyIsIm1vdmVOb2RlIiwibW92ZU9mZnNldCIsImlzQmxvY2tOb2RlIiwic2V0U2VsRm9jdXMiLCJza2lwSWdub3JlZE5vZGVzQmVmb3JlIiwic2tpcElnbm9yZWROb2Rlc0FmdGVyIiwidGV4dE5vZGVBZnRlciIsInRleHROb2RlQmVmb3JlIiwiZmluZERpcmVjdGlvbiIsIm1pZCIsImRpcmVjdGlvbiIsInNlbGVjdFZlcnRpY2FsbHkiLCJiZXlvbmQiLCJzdG9wTmF0aXZlSG9yaXpvbnRhbERlbGV0ZSIsIm5leHROb2RlIiwic3dpdGNoRWRpdGFibGUiLCJjYXB0dXJlS2V5RG93biIsImFsdEtleSIsImdldE1vZHMiLCJzYWZhcmlEb3duQXJyb3dCdWciLCJzZXJpYWxpemVGb3JDbGlwYm9hcmQiLCJzZXJpYWxpemVyIiwiZGV0YWNoZWREb2MiLCJ3cmFwTWFwIiwicGFyc2VGcm9tQ2xpcGJvYXJkIiwiaHRtbCIsInBsYWluVGV4dCIsImluQ29kZSIsImFzVGV4dCIsInBhcnNlZCIsIm1ldGFzIiwiZmlyc3RUYWciLCJpbm5lckhUTUwiLCJ0cnVzdGVkVHlwZXMiLCJfcG9saWN5IiwiZGVmYXVsdFBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJtYXliZVdyYXBUcnVzdGVkIiwicmVhZEhUTUwiLCJxdWVyeVNlbGVjdG9yQWxsIiwicmVzdG9yZVJlcGxhY2VkU3BhY2VzIiwiY29udGV4dE5vZGUiLCJzbGljZURhdGEiLCJnZXRBdHRyaWJ1dGUiLCJpbmxpbmVQYXJlbnRzIiwiYWRkQ29udGV4dCIsImNsb3NlU2xpY2UiLCJsYXN0V3JhcCIsImluTGFzdCIsImFkZFRvU2libGluZyIsImNsb3NlUmlnaHQiLCJ3cmFwcGVkIiwid2l0aFdyYXBwZXJzIiwibm9ybWFsaXplU2libGluZ3MiLCJzaWJsaW5nIiwiY2xvc2VSYW5nZSIsInRoZWFkIiwidGJvZHkiLCJjYXB0aW9uIiwiY29sZ3JvdXAiLCJjb2wiLCJ0ZCIsInRoIiwiX2RldGFjaGVkRG9jIiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJoYW5kbGVycyIsImVkaXRIYW5kbGVycyIsInBhc3NpdmVIYW5kbGVycyIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJJbnB1dFN0YXRlIiwibGFzdEtleUNvZGUiLCJsYXN0S2V5Q29kZVRpbWUiLCJsYXN0Q2xpY2siLCJidXR0b24iLCJsYXN0U2VsZWN0aW9uT3JpZ2luIiwibGFzdFNlbGVjdGlvblRpbWUiLCJsYXN0SU9TRW50ZXIiLCJsYXN0SU9TRW50ZXJGYWxsYmFja1RpbWVvdXQiLCJsYXN0Rm9jdXMiLCJsYXN0VG91Y2giLCJsYXN0Q2hyb21lRGVsZXRlIiwiY29tcG9zaW5nVGltZW91dCIsImNvbXBvc2l0aW9uRW5kZWRBdCIsImNvbXBvc2l0aW9uSUQiLCJjb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzIiwiZG9tQ2hhbmdlQ291bnQiLCJldmVudEhhbmRsZXJzIiwic2V0U2VsZWN0aW9uT3JpZ2luIiwiZW5zdXJlTGlzdGVuZXJzIiwiY3VycmVudEhhbmRsZXJzIiwicnVuQ3VzdG9tSGFuZGxlciIsImhhbmRsZXIiLCJkZWZhdWx0UHJldmVudGVkIiwiZXZlbnRCZWxvbmdzVG9WaWV3IiwiYnViYmxlcyIsImV2ZW50Q29vcmRzIiwiY2xpZW50WCIsImNsaWVudFkiLCJydW5IYW5kbGVyT25Db250ZXh0IiwicHJvcE5hbWUiLCJ1cGRhdGVTZWxlY3Rpb24iLCJmb2N1c2VkIiwiaGFuZGxlU2luZ2xlQ2xpY2siLCJzZWxlY3RlZE5vZGUiLCJzZWxlY3RBdCIsInNlbGVjdENsaWNrZWROb2RlIiwic2VsZWN0Q2xpY2tlZExlYWYiLCJoYW5kbGVEb3VibGVDbGljayIsImhhbmRsZVRyaXBsZUNsaWNrIiwiZGVmYXVsdFRyaXBsZUNsaWNrIiwiZm9yY2VET01GbHVzaCIsImVuZENvbXBvc2l0aW9uIiwia2V5ZG93biIsImluT3JOZWFyQ29tcG9zaXRpb24iLCJmb3JjZUZsdXNoIiwicHJldmVudERlZmF1bHQiLCJrZXl1cCIsImtleXByZXNzIiwiY2hhckNvZGUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzZWxlY3ROb2RlTW9kaWZpZXIiLCJtb3VzZWRvd24iLCJmbHVzaGVkIiwiY2xpY2siLCJkeSIsImlzTmVhciIsImRvbmUiLCJNb3VzZURvd24iLCJ0YXJnZXRQb3MiLCJtaWdodERyYWciLCJzdGFydERvYyIsImFkZEF0dHIiLCJzZXRVbmVkaXRhYmxlIiwidXAiLCJ1cGRhdGVBbGxvd0RlZmF1bHQiLCJidXR0b25zIiwidGltZVN0YW1wIiwiY29udGV4dG1lbnUiLCJ0aW1lb3V0Q29tcG9zaXRpb24iLCJzY2hlZHVsZUNvbXBvc2VFbmQiLCJkZWxheSIsImNsZWFyQ29tcG9zaXRpb24iLCJ0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQiLCJmaW5kQ29tcG9zaXRpb25Ob2RlIiwidGV4dEJlZm9yZSIsInRleHROb2RlQmVmb3JlJDEiLCJ0ZXh0QWZ0ZXIiLCJ0ZXh0Tm9kZUFmdGVyJDEiLCJkZXNjQWZ0ZXIiLCJsYXN0Q2hhbmdlZCIsImxhc3RDaGFuZ2VkVGV4dE5vZGUiLCJkZXNjQmVmb3JlIiwicmVzdGFydGluZyIsImZsdXNoaW5nU29vbiIsIm1hcmtDdXJzb3IiLCJjb21wb3NpdGlvbnN0YXJ0IiwiY29tcG9zaXRpb251cGRhdGUiLCJmbHVzaCIsImNvbXBvc2l0aW9uZW5kIiwicGVuZGluZ1JlY29yZHMiLCJQcm9taXNlIiwidGhlbiIsImJyb2tlbkNsaXBib2FyZEFQSSIsImRvUGFzdGUiLCJwcmVmZXJQbGFpbiIsInNpbmdsZU5vZGUiLCJzbGljZVNpbmdsZU5vZGUiLCJnZXRUZXh0IiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJ1cmlzIiwiY2xlYXJEYXRhIiwic2V0RGF0YSIsInNlbGVjdE5vZGVDb250ZW50cyIsImJsdXIiLCJjYXB0dXJlQ29weSIsInBhc3RlIiwicGxhaW4iLCJjYXB0dXJlUGFzdGUiLCJEcmFnZ2luZyIsImRyYWdDb3B5TW9kaWZpZXIiLCJkcmFnTW92ZXMiLCJtb3ZlcyIsImRyYWdzdGFydCIsImRhdGFUcmFuc2ZlciIsImRyYWdnZWRTbGljZSIsImZpbGVzIiwiZWZmZWN0QWxsb3dlZCIsImRyYWdnaW5nIiwiZHJhZ2VuZCIsImRyYWdvdmVyIiwiZHJhZ2VudGVyIiwiZHJvcCIsImV2ZW50UG9zIiwiJG1vdXNlIiwiaW5zZXJ0UG9zIiwiZml0cyIsIndyYXBwaW5nIiwiZHJvcFBvaW50IiwiaXNOb2RlIiwiYmVmb3JlSW5zZXJ0IiwicmVsYXRlZFRhcmdldCIsImNsZWFyIiwiYmVmb3JlaW5wdXQiLCJpbnB1dFR5cGUiLCJmbHVzaFNvb24iLCJjb21wYXJlT2JqcyIsIldpZGdldFR5cGUiLCJub1NwZWMiLCJzcGFuIiwib2xkT2Zmc2V0IiwiRGVjb3JhdGlvbiIsInZhbGlkIiwiSW5saW5lVHlwZSIsImluY2x1c2l2ZVN0YXJ0IiwiaW5jbHVzaXZlRW5kIiwiaXMiLCJEZWNvcmF0aW9uU2V0IiwibG9jYWwiLCJkZWNvcmF0aW9ucyIsImJ1aWxkVHJlZSIsInByZWRpY2F0ZSIsImZpbmRJbm5lciIsImNoaWxkT2ZmIiwibWFwSW5uZXIiLCJuZXdMb2NhbCIsIm9uUmVtb3ZlIiwib2xkQ2hpbGRyZW4iLCJiYXNlT2Zmc2V0IiwibW92ZWQiLCJvbGRFbmQiLCJuZXdFbmQiLCJkU2l6ZSIsIm11c3RSZWJ1aWxkIiwiZnJvbUxvY2FsIiwidG9Mb2NhbCIsImNoaWxkT2Zmc2V0IiwiY2hpbGROb2RlIiwiZ2F0aGVyIiwibWFwQW5kR2F0aGVyUmVtYWluaW5nRGVjb3JhdGlvbnMiLCJieVBvcyIsIm1hcENoaWxkcmVuIiwiYWRkSW5uZXIiLCJ0YWtlU3BhbnNGb3JOb2RlIiwibW92ZVNwYW5zIiwid2l0aG91dE51bGxzIiwicmVtb3ZlSW5uZXIiLCJkZWMiLCJsb2NhbFNldCIsIkRlY29yYXRpb25Hcm91cCIsInJlbW92ZU92ZXJsYXAiLCJsb2NhbHNJbm5lciIsImZvckVhY2hTZXQiLCJtZW1iZXJzIiwibWFwcGVkRGVjb3MiLCJtZW1iZXIiLCJzb3J0ZWQiLCJldmVyeSIsInNwYW5zIiwiaGFzTnVsbHMiLCJsb2NhbFN0YXJ0Iiwic3VidHJlZSIsIndvcmtpbmciLCJpbnNlcnRBaGVhZCIsInZpZXdEZWNvcmF0aW9ucyIsIm9ic2VydmVPcHRpb25zIiwiY2hpbGRMaXN0IiwiY2hhcmFjdGVyRGF0YSIsImNoYXJhY3RlckRhdGFPbGRWYWx1ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVPbGRWYWx1ZSIsInVzZUNoYXJEYXRhIiwiU2VsZWN0aW9uU3RhdGUiLCJET01PYnNlcnZlciIsImhhbmRsZURPTUNoYW5nZSIsInF1ZXVlIiwib2JzZXJ2ZXIiLCJvbkNoYXJEYXRhIiwic3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsInJlbW92ZWROb2RlcyIsInByZXZWYWx1ZSIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwidGFrZVJlY29yZHMiLCJvYnNlcnZlIiwidGFrZSIsImRpc2Nvbm5lY3QiLCJzdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMiLCJpZ25vcmVTZWxlY3Rpb25DaGFuZ2UiLCJjb250YWluZXIiLCJhbmNlc3RvcnMiLCJTZXQiLCJuZXdTZWwiLCJ0eXBlT3ZlciIsInJlZ2lzdGVyTXV0YXRpb24iLCJicnMiLCJiciIsImJsb2NrUGFyZW50IiwicmVhZFNlbCIsInNjcm9sbFRvU2VsZWN0aW9uIiwiY3NzQ2hlY2tlZCIsImNzc0NoZWNrV2FybmVkIiwiY2hlY2tDU1MiLCJhdHRyaWJ1dGVOYW1lIiwiYWRkZWROb2RlcyIsInJhbmdlVG9TZWxlY3Rpb25SYW5nZSIsImN1cnJlbnRBbmNob3IiLCJkb21BdFBvcyIsInJlYWRET01DaGFuZ2UiLCJzaGFyZWQiLCJwcmVmZXJyZWRQb3MiLCJwcmVmZXJyZWRTaWRlIiwiZnJvbV8iLCJ0b18iLCJwYXJzZUJldHdlZW4iLCJjb21wYXJlIiwiY2hhbmdlIiwiZW5kQSIsImVuZEIiLCJpc1N1cnJvZ2F0ZVBhaXIiLCJmaW5kRGlmZiIsInJlc29sdmVTZWxlY3Rpb24iLCJuZXh0U2VsIiwiJGZyb21BIiwiaW5saW5lQ2hhbmdlIiwib2xkIiwiJG5ld1N0YXJ0IiwiJG5ld0VuZCIsInNraXBDbG9zaW5nQW5kT3BlbmluZyIsIiRuZXh0IiwibG9va3NMaWtlQmFja3NwYWNlIiwibWFya0NoYW5nZSIsImNoRnJvbSIsImNoVG8iLCJjdXJNYXJrcyIsInByZXZNYXJrcyIsImlzTWFya0NoYW5nZSIsInBhcnNlZFNlbCIsImZyb21FbmQiLCJtYXlPcGVuIiwiRWRpdG9yVmlldyIsIl9yb290IiwibW91bnRlZCIsInByZXZEaXJlY3RQbHVnaW5zIiwicGx1Z2luVmlld3MiLCJfcHJvcHMiLCJkaXJlY3RQbHVnaW5zIiwiY2hlY2tTdGF0ZUNvbXBvbmVudCIsIm1vdW50IiwiZ2V0RWRpdGFibGUiLCJ1cGRhdGVDdXJzb3JXcmFwcGVyIiwiYnVpbGROb2RlVmlld3MiLCJjb21wdXRlRG9jRGVjbyIsInBhc3NpdmUiLCJpbml0SW5wdXQiLCJ1cGRhdGVQbHVnaW5WaWV3cyIsImhhbmRsZURPTUV2ZW50cyIsInByZXZQcm9wcyIsInVwZGF0ZVN0YXRlSW5uZXIiLCJzZXRQcm9wcyIsIl9hIiwicmVkcmF3IiwidXBkYXRlU2VsIiwicGx1Z2luc0NoYW5nZWQiLCJuQSIsIm5CIiwiY2hhbmdlZE5vZGVWaWV3cyIsInNjcm9sbCIsInVwZGF0ZURvYyIsIm9sZFNjcm9sbFBvcyIsIm92ZXJmbG93QW5jaG9yIiwicmVmRE9NIiwicmVmVG9wIiwiaW5uZXJIZWlnaHQiLCJsb2NhbFJlY3QiLCJzdG9yZVNjcm9sbFBvcyIsImZvcmNlU2VsVXBkYXRlIiwic2VsMSIsInNlbDIiLCJzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZCIsImNocm9tZUtsdWRnZSIsImFuY2hvckluUmlnaHRQbGFjZSIsInVwZGF0ZURyYWdnZWROb2RlIiwibmV3UmVmVG9wIiwicmVzZXRTY3JvbGxQb3MiLCJkZXN0cm95UGx1Z2luVmlld3MiLCJwcmV2U3RhdGUiLCJwbHVnaW5WaWV3IiwibW92ZWRQb3MiLCJwYXJlbnRFbGVtZW50Iiwic2V0QWN0aXZlIiwic3RvcmVkIiwicHJldmVudFNjcm9sbCIsImZvY3VzUHJldmVudFNjcm9sbCIsImdldFByb3RvdHlwZU9mIiwidXBkYXRlUm9vdCIsInBvc0F0RE9NIiwicGFzdGVIVE1MIiwiQ2xpcGJvYXJkRXZlbnQiLCJwYXN0ZVRleHQiLCJkZXN0cm95SW5wdXQiLCJpc0Rlc3Ryb3llZCIsImRpc3BhdGNoRXZlbnQiLCJkaXNwYXRjaFRyYW5zYWN0aW9uIiwic2hhZG93Um9vdCIsImRlZXBBY3RpdmVFbGVtZW50IiwiZ2V0Q29tcG9zZWRSYW5nZXMiLCJyZWFkIiwic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwiZ2V0VGFyZ2V0UmFuZ2VzIiwiZXhlY0NvbW1hbmQiLCJzYWZhcmlTaGFkb3dTZWxlY3Rpb25SYW5nZSIsImNvbnRlbnRlZGl0YWJsZSIsInRyYW5zbGF0ZSIsIkdPT0RfTEVBRl9TSVpFIiwiUm9wZVNlcXVlbmNlIiwibGVhZkFwcGVuZCIsImxlYWZQcmVwZW5kIiwiYXBwZW5kSW5uZXIiLCJBcHBlbmQiLCJzbGljZUlubmVyIiwiZ2V0SW5uZXIiLCJmb3JFYWNoSW5uZXIiLCJmb3JFYWNoSW52ZXJ0ZWRJbm5lciIsIkxlYWYiLCJwcm90b3R5cGVBY2Nlc3NvcnMiLCJjb25maWd1cmFibGUiLCJmbGF0dGVuIiwiZGVmaW5lUHJvcGVydGllcyIsImxlZnRMZW4iLCJCcmFuY2giLCJldmVudENvdW50IiwicG9wRXZlbnQiLCJwcmVzZXJ2ZUl0ZW1zIiwicmVtYXAiLCJyZW1hcHBpbmciLCJyZW1haW5pbmciLCJ0cmFuc2Zvcm0iLCJhZGRBZnRlciIsIkl0ZW0iLCJhZGRUcmFuc2Zvcm0iLCJoaXN0T3B0aW9ucyIsIm5ld0l0ZW1zIiwib2xkSXRlbXMiLCJsYXN0SXRlbSIsIm1lcmdlZCIsIm92ZXJmbG93IiwiREVQVEhfT1ZFUkZMT1ciLCJjdXRQb2ludCIsImN1dE9mZkV2ZW50cyIsIm1pcnJvclBvcyIsIm1pcnJvck9mZnNldCIsImFkZE1hcHMiLCJyZWJhc2VkIiwicmViYXNlZFRyYW5zZm9ybSIsInJlYmFzZWRDb3VudCIsInJlYmFzZWRJdGVtcyIsIm5ld1VudGlsIiwiaVJlYmFzZWQiLCJuZXdNYXBzIiwiYnJhbmNoIiwiZW1wdHlJdGVtQ291bnQiLCJjb21wcmVzcyIsInVwdG8iLCJldmVudHMiLCJuZXdJdGVtIiwiSGlzdG9yeVN0YXRlIiwidW5kb25lIiwicHJldlJhbmdlcyIsInByZXZUaW1lIiwicHJldkNvbXBvc2l0aW9uIiwicmFuZ2VzRm9yIiwibWFwUmFuZ2VzIiwiY2FjaGVkUHJlc2VydmVJdGVtcyIsImNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zIiwibXVzdFByZXNlcnZlSXRlbXMiLCJoaXN0b3J5UHJlc2VydmVJdGVtcyIsImhpc3RvcnlLZXkiLCJjbG9zZUhpc3RvcnlLZXkiLCJuZXdHcm91cERlbGF5IiwiaGlzdCIsImhpc3RvcnkiLCJoaXN0b3J5VHIiLCJoaXN0b3J5U3RhdGUiLCJhcHBlbmRlZCIsInJlZG8iLCJuZXdHcm91cCIsImFkamFjZW50IiwiaXNBZGphY2VudFRvIiwiY29tbWFuZCIsInVuZG8iLCJidWlsZENvbW1hbmQiLCJuZXdIaXN0IiwiaGlzdFRyYW5zYWN0aW9uIiwiSW5wdXRSdWxlIiwiY3V0T2ZmIiwidW5kb2FibGUiLCJpbkNvZGVNYXJrIiwicnVuIiwiZWxsaXBzaXMiLCJzbWFydFF1b3RlcyIsInRleHRibG9ja1R5cGVJbnB1dFJ1bGUiLCJyZWdleHAiLCJvbERPTSIsInVsRE9NIiwibGlET00iLCJvcmRlcmVkTGlzdCIsIm9yZGVyIiwiYnVsbGV0TGlzdCIsImxpc3RJdGVtIiwid3JhcEluTGlzdCIsImxpc3RUeXBlIiwiZG9Kb2luIiwib3V0ZXJSYW5nZSIsIiRpbnNlcnQiLCJpbm5lclJhbmdlIiwiYXJvdW5kIiwiZmluZFdyYXBwaW5nT3V0c2lkZSIsImlubmVyTWF0Y2giLCJmaW5kV3JhcHBpbmdJbnNpZGUiLCJqb2luQmVmb3JlIiwic3BsaXREZXB0aCIsInNwbGl0UG9zIiwiZG9XcmFwSW5MaXN0Iiwid3JhcFJhbmdlSW5MaXN0Iiwic3BsaXRMaXN0SXRlbSIsIml0ZW1UeXBlIiwiaXRlbUF0dHJzIiwiZ3JhbmRQYXJlbnQiLCJkZXB0aEJlZm9yZSIsImRlcHRoQWZ0ZXIiLCJuZXh0VHlwZSIsImxpZnRMaXN0SXRlbSIsImVuZE9mTGlzdCIsImxpZnRUb091dGVyTGlzdCIsImxpc3QiLCJpbmRleEJlZm9yZSIsImxpZnRPdXRPZkxpc3QiLCJwRE9NIiwiYmxvY2txdW90ZURPTSIsImhyRE9NIiwicHJlRE9NIiwiYnJET00iLCJwYXJhZ3JhcGgiLCJob3Jpem9udGFsX3J1bGUiLCJoZWFkaW5nIiwiY29kZV9ibG9jayIsImltYWdlIiwic3JjIiwiaGFyZF9icmVhayIsImVtRE9NIiwic3Ryb25nRE9NIiwiY29kZURPTSIsImVtIiwic3Ryb25nIiwiZm9udFdlaWdodCIsIk1BUktET1dOX0VTQ0FQRURfQVRUUiIsIkFVVE9fTElOS19BVFRSIiwiRURJVE9SX0NMUyIsImRvY1NwZWMiLCJoZWFkaW5nMVNwZWMiLCJoZWFkaW5nMlNwZWMiLCJoZWFkaW5nM1NwZWMiLCJwYXJhZ3JhcGhTcGVjIiwiQ2hlY2tib3hTdGF0dXMiLCJjaGVja2xpc3RJdGVtU3BlYyIsInN0YXR1cyIsIkVNUFRZIiwiRE9ORSIsImNoZWNrZWQiLCJjb2RlQmxvY2tTcGVjIiwiY2hlY2tsaXN0X2l0ZW0iLCJ1bm9yZGVyZWRfbGlzdCIsIm9yZGVyZWRfbGlzdCIsImxpc3RfaXRlbSIsImhlYWRpbmcxIiwiaGVhZGluZzIiLCJoZWFkaW5nMyIsIm1hcmtXcmFwcGluZ1J1bGUiLCJjIiwiaXNWYWxpZEluc2lkZUNvZGVNYXJrIiwiUmVnRXhwIiwiZXhpc3RpbmdNYXJrcyIsImVuZFBvcyIsImxpc3RUeXBlUnVsZSIsInByZWZpeCIsInJhbmdlQWZ0ZXJQcmVmaXgiLCJzbGljZUFmdGVyUHJlZml4IiwiaW5wdXRSdWxlc1BsdWdpbiIsImhhbmRsZVRleHRJbnB1dCIsImlzSW5wdXRSdWxlcyIsImlucHV0UnVsZXMiLCJSRVNFVF9IQVNfRk9SQ0VEX1NQQUNFX01FVEEiLCJpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4iLCJoYXNGb3JjZWRTcGFjZSIsInByZXZpb3VzIiwicGx1Z2luTWV0YSIsImZvcmNlZFNwYWNlUG9zIiwiYXRCbG9ja1N0YXJ0IiwidGV4dGJsb2NrQXQiLCJvbmx5IiwiZmluZEN1dEJlZm9yZSIsImF0QmxvY2tFbmQiLCJmaW5kQ3V0QWZ0ZXIiLCJkZWZhdWx0QmxvY2tBdCIsInNwbGl0QmxvY2siLCJzcGxpdFR5cGUiLCJzcGxpdE5vZGUiLCJjYW4iLCIkZmlyc3QiLCJkZWxldGVCYXJyaWVyIiwiJGN1dCIsImNvbm4iLCJpc29sYXRlZCIsImpvaW5NYXliZUNsZWFyIiwiY2FuRGVsQWZ0ZXIiLCIkam9pbkF0Iiwic2VsQWZ0ZXIiLCJhdCIsImFmdGVyVGV4dCIsImFmdGVyRGVwdGgiLCJzZWxlY3RUZXh0YmxvY2tTaWRlIiwic2VsZWN0VGV4dGJsb2NrU3RhcnQiLCJzZWxlY3RUZXh0YmxvY2tFbmQiLCJ0b2dnbGVNYXJrIiwicmVtb3ZlV2hlblByZXNlbnQiLCJlbnRlckF0b21zIiwiZW50ZXJJbmxpbmVBdG9tcyIsImRyb3BTcGFjZSIsImluY2x1ZGVXaGl0ZXNwYWNlIiwibWFya0FwcGxpZXMiLCJyZW1vdmVJbmxpbmVBdG9tcyIsIm1pc3NpbmciLCJzcGFjZVN0YXJ0Iiwic3BhY2VFbmQiLCJjaGFpbkNvbW1hbmRzIiwiY29tbWFuZHMiLCJiYWNrc3BhY2UiLCJkZWxTdGVwIiwicGNCYXNlS2V5bWFwIiwiYWJvdmUiLCJtYWNCYXNlS2V5bWFwIiwiYmFzZUtleW1hcCIsIm9zIiwiQVBQTFlfRk9STUFUX0FUVFIiLCJzd2FwVGV4dEJsb2NrIiwiaW5kZW50TGlzdEl0ZW0iLCJuZXN0ZWRCZWZvcmUiLCJvdXRkZW50TGlzdEl0ZW0iLCJMaW5rTW9kYWwiLCJlbCIsIm9uQ29uZmlybSIsIm9uQ2xlYXIiLCJ1cmwiLCJzaG93Q2xzIiwiY29uZmlybUJ0biIsImhhbmRsZUNvbmZpcm0iLCJjYW5jZWxCdG4iLCJoYW5kbGVDYW5jZWwiLCJjbGVhckJ0biIsImhhbmRsZUNsZWFyIiwiaGFuZGxlR2xvYmFsS2V5ZG93biIsInRleHRJbnB1dCIsInVybElucHV0IiwiaXNFbnRlciIsImhhbmRsZUdsb2JhbENsaWNrIiwiZnJhbWVFbCIsIlRvb2xiYXJQbHVnaW4iLCJ0b29sYmFyRWwiLCJtb2RhbEVsIiwidmlld0luc3RhbmNlIiwiaGFuZGxlVG9vbGJhckNsaWNrIiwidW5oaWdobGlnaHRTZWxlY3RlZEF0dHJzIiwibW9kYWwiLCJfcHJldmlvdXNTdGF0ZSIsInVwZGF0ZVRvb2xiYXJGb3JTZWxlY3Rpb24iLCJoYW5kbGVLZXlEb3duIiwiX3ZpZXciLCJoYXNDdHJsIiwiaGFzTW9kIiwiaGFzU2hpZnQiLCJ0b2dnbGVDaGVja2xpc3RJdGVtIiwidG9nZ2xlTGlzdCIsInByb21vdGVIZWFkaW5nIiwiaGFzQ2hlY2tlZCIsInRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZSIsImFjdGl2YXRlTGlua01vZGFsIiwibGlzdEJsb2NrUmFuZ2UiLCJjb250YWluc05lc3RlZExpc3QiLCIkcmFuZ2VTdGFydCIsIiRyYW5nZUVuZCIsImxpbmtNYXJrQXRTdGFydCIsImxpbmtNYXJrQXRFbmQiLCJzZWxlY3Rpb25Jc0luc2lkZUxpbmsiLCJuZXdTZWxlY3Rpb24iLCJzZWxlY3RlZEF0dHJzIiwiZ2V0U2VsZWN0ZWRGb3JtYXRBdHRycyIsImJ0biIsImdldFNlbGVjdGVkRm9ybWF0QW5kTWFya3MiLCJzZWxlY3RlZCIsImN1cnJlbnRUeXBlIiwibWFya1R5cGVzIiwiaW5saW5lX2xpbmsiLCJzdG9wUHJvcGFnYXRpb24iLCJhcHBseUZvcm1hdCIsImRhdGFGb3JtYXRTdHIiLCJTSE9XX0NMUyIsIkhUVFBfTElOSyIsIk1BSUxUT19MSU5LIiwiVG9vbHRpcFBsdWdpbiIsIm5vZGVUb0FuY2hvckhyZWYiLCJoaWRlIiwicHJldmlvdXNTdGF0ZSIsImNoZWNrU2VsZWN0aW9uIiwid2l0aGluTGluayIsInNob3ciLCJ0b29sdGlwRWwiLCJpc0F1dG9MaW5rIiwibGlua1RleHRFbCIsImlubmVyVGV4dCIsImFuY2hvckVsIiwidG9nZ2xlIiwiYWN0dWFsV2lkdGgiLCJhdmFpbGFibGVXaWR0aCIsInNjcm9sbGVkIiwiRWRpdG9yRXh0ZW5kZXJQbHVnaW4iLCJleHRlbmRlckVsIiwiaGFuZGxlQ2xpY2siLCJsYXN0UG9zIiwibGFzdE5vZGVUeXBlIiwicmFuZG9tVVVJRCIsInVuc2FmZVN0cmluZ2lmeSIsIlNOX0lURU1fU0FWRV9LRVkiLCJnZXROYW1lc3BhY2VkQ29udGVudCIsImdldFV1aWQiLCJDbGllbnQiLCJyZXNvbHZlQ2xpZW50UmVhZHkiLCJfaXRlbSIsInNob3VsZENhbGxMaXN0ZW5lcnMiLCJuZXh0SXRlbSIsInByZXZpb3VzSXRlbSIsImlzTWV0YWRhdGFVcGRhdGUiLCJsYXN0U2F2ZWRCeSIsImdldExhc3RTYXZlZEJ5IiwiX2lkIiwiX2xpc3RlbmVycyIsIl9yZWFkeSIsImNvbXBvbmVudE1hbmFnZXIiLCJjYWxsTGlzdGVuZXJzIiwibGlzdGVuZXIiLCJsYXRlc3REb2MiLCJnZXREb2MiLCJsYXRlc3RUZXh0Iiwib25VcGRhdGUiLCJyZWFkeSIsInNhdmVOb3RlIiwianNvbkRvYyIsIm1kRG9jIiwidGV4dFByZXZpZXciLCJ0b1NhdmUiLCJwcmV2aWV3X3BsYWluIiwiaXRlbVNlbGVjdG9ycyIsImNsaWVudCIsIkNIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FIiwiZ2V0UG9zIiwiaW5wdXREaXYiLCJjbGlja1RhcmdldERpdiIsInRhYkluZGV4IiwiZm9jdXNIYW5kbGVyIiwiY2xpY2tIYW5kbGVyIiwibm9ybWFsaXplS2V5TmFtZSIsImN0cmwiLCJtb2QiLCJtb2RpZmllcnMiLCJrZXltYXAiLCJiaW5kaW5ncyIsImtleWRvd25IYW5kbGVyIiwibm9ybWFsaXplIiwiYmFzZU5hbWUiLCJrZXlOYW1lIiwiZGlyZWN0Iiwibm9TaGlmdCIsImZyb21Db2RlIiwicmVjdXJzaXZlRGVsZXRlRW1wdHkiLCJrZXltYXBQbHVnaW5zIiwiQmFja3NwYWNlIiwiZW5zdXJlQ2hlY2tsaXN0SXRlbVRleHRTZWxlY3Rpb24iLCJhcHBsaWNhYmxlIiwiRW50ZXIiLCJuZXh0JEZyb20iLCJuZXh0RnJvbSIsImVuc3VyZVRleHRTZWxlY3Rpb25JbkVtcHR5Tm9kZSIsInBvc3NpYmxlU2VsZWN0aW9uIiwiZGVjb2RlQ2FjaGUiLCJkZWNvZGUiLCJleGNsdWRlIiwiZGVmYXVsdENoYXJzIiwidG9VcHBlckNhc2UiLCJnZXREZWNvZGVDYWNoZSIsInNlcSIsImwiLCJiMSIsInBhcnNlSW50IiwiYjIiLCJjaHIiLCJiMyIsImI0IiwiY29tcG9uZW50Q2hhcnMiLCJlbmNvZGVDYWNoZSIsImVuY29kZSIsImtlZXBFc2NhcGVkIiwiZ2V0RW5jb2RlQ2FjaGUiLCJuZXh0Q29kZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImZvcm1hdCIsInByb3RvY29sIiwic2xhc2hlcyIsImF1dGgiLCJob3N0bmFtZSIsInBvcnQiLCJwYXRobmFtZSIsImhhc2giLCJVcmwiLCJwcm90b2NvbFBhdHRlcm4iLCJwb3J0UGF0dGVybiIsInNpbXBsZVBhdGhQYXR0ZXJuIiwidW53aXNlIiwiYXV0b0VzY2FwZSIsIm5vbkhvc3RDaGFycyIsImhvc3RFbmRpbmdDaGFycyIsImhvc3RuYW1lUGFydFBhdHRlcm4iLCJob3N0bmFtZVBhcnRTdGFydCIsImhvc3RsZXNzUHJvdG9jb2wiLCJqYXZhc2NyaXB0Iiwic2xhc2hlZFByb3RvY29sIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwiZmlsZSIsInNsYXNoZXNEZW5vdGVIb3N0IiwibG93ZXJQcm90byIsImhlYyIsInRyaW0iLCJzaW1wbGVQYXRoIiwicHJvdG8iLCJhdFNpZ24iLCJob3N0RW5kIiwicGFyc2VIb3N0IiwiaXB2Nkhvc3RuYW1lIiwiaG9zdHBhcnRzIiwibmV3cGFydCIsImsiLCJ2YWxpZFBhcnRzIiwibm90SG9zdCIsImJpdCIsInFtIiwidSIsImlzU3RyaW5nIiwiX2NsYXNzIiwiX2hhc093blByb3BlcnR5Iiwic291cmNlIiwiYXJyYXlSZXBsYWNlQXQiLCJuZXdFbGVtZW50cyIsImlzVmFsaWRFbnRpdHlDb2RlIiwic3Vycm9nYXRlMSIsInN1cnJvZ2F0ZTIiLCJVTkVTQ0FQRV9NRF9SRSIsIlVORVNDQVBFX0FMTF9SRSIsIkRJR0lUQUxfRU5USVRZX1RFU1RfUkUiLCJ1bmVzY2FwZU1kIiwidW5lc2NhcGVBbGwiLCJlc2NhcGVkIiwiZW50aXR5IiwiZGVjb2RlZCIsInJlcGxhY2VFbnRpdHlQYXR0ZXJuIiwiSFRNTF9FU0NBUEVfVEVTVF9SRSIsIkhUTUxfRVNDQVBFX1JFUExBQ0VfUkUiLCJIVE1MX1JFUExBQ0VNRU5UUyIsInJlcGxhY2VVbnNhZmVDaGFyIiwiZXNjYXBlSHRtbCIsIlJFR0VYUF9FU0NBUEVfUkUiLCJlc2NhcGVSRSIsImlzU3BhY2UiLCJpc1doaXRlU3BhY2UiLCJpc1B1bmN0Q2hhciIsImlzTWRBc2NpaVB1bmN0Iiwibm9ybWFsaXplUmVmZXJlbmNlIiwibGliIiwibWR1cmwiLCJwYXJzZUxpbmtMYWJlbCIsImRpc2FibGVOZXN0ZWQiLCJtYXJrZXIiLCJwcmV2UG9zIiwicG9zTWF4Iiwib2xkUG9zIiwibWQiLCJza2lwVG9rZW4iLCJsYWJlbEVuZCIsInBhcnNlTGlua0Rlc3RpbmF0aW9uIiwicGFyc2VMaW5rVGl0bGUiLCJwcmV2X3N0YXRlIiwiY2FuX2NvbnRpbnVlIiwiZGVmYXVsdF9ydWxlcyIsIlJlbmRlcmVyIiwiY29kZV9pbmxpbmUiLCJpZHgiLCJlbnYiLCJzbGYiLCJ0b2tlbiIsInJlbmRlckF0dHJzIiwiZmVuY2UiLCJpbmZvIiwiaGlnaGxpZ2h0ZWQiLCJsYW5nTmFtZSIsImxhbmdBdHRycyIsImhpZ2hsaWdodCIsImF0dHJJbmRleCIsInRtcEF0dHJzIiwibGFuZ1ByZWZpeCIsInRtcFRva2VuIiwicmVuZGVySW5saW5lQXNUZXh0IiwicmVuZGVyVG9rZW4iLCJoYXJkYnJlYWsiLCJ4aHRtbE91dCIsInNvZnRicmVhayIsImJyZWFrcyIsImh0bWxfYmxvY2siLCJodG1sX2lubGluZSIsImhpZGRlbiIsIm5lc3RpbmciLCJuZWVkTGYiLCJuZXh0VG9rZW4iLCJyZW5kZXJJbmxpbmUiLCJyZW5kZXIiLCJSdWxlciIsIl9fcnVsZXNfXyIsIl9fY2FjaGVfXyIsIl9fZmluZF9fIiwiX19jb21waWxlX18iLCJjaGFpbnMiLCJhbHROYW1lIiwiY2hhaW4iLCJmbiIsIm9wdCIsImJlZm9yZU5hbWUiLCJydWxlTmFtZSIsImFmdGVyTmFtZSIsImVuYWJsZSIsImlnbm9yZUludmFsaWQiLCJlbmFibGVPbmx5IiwiZGlzYWJsZSIsImdldFJ1bGVzIiwiY2hhaW5OYW1lIiwiVG9rZW4iLCJtYXJrdXAiLCJhdHRyUHVzaCIsImF0dHJEYXRhIiwiYXR0clNldCIsImF0dHJHZXQiLCJhdHRySm9pbiIsIlN0YXRlQ29yZSIsImlubGluZU1vZGUiLCJORVdMSU5FU19SRSIsIk5VTExfUkUiLCJpc0xpbmtDbG9zZSIsIlJBUkVfUkUiLCJTQ09QRURfQUJCUl9URVNUX1JFIiwiU0NPUEVEX0FCQlJfUkUiLCJTQ09QRURfQUJCUiIsInRtIiwicmVwbGFjZUZuIiwicmVwbGFjZV9zY29wZWQiLCJpbmxpbmVUb2tlbnMiLCJpbnNpZGVfYXV0b2xpbmsiLCJyZXBsYWNlX3JhcmUiLCJRVU9URV9URVNUX1JFIiwiUVVPVEVfUkUiLCJyZXBsYWNlQXQiLCJwcm9jZXNzX2lubGluZXMiLCJ0aGlzTGV2ZWwiLCJPVVRFUiIsImxhc3RJbmRleCIsImNhbk9wZW4iLCJjYW5DbG9zZSIsImlzU2luZ2xlIiwibGFzdENoYXIiLCJuZXh0Q2hhciIsImlzTGFzdFB1bmN0Q2hhciIsImlzTmV4dFB1bmN0Q2hhciIsImlzTGFzdFdoaXRlU3BhY2UiLCJpc05leHRXaGl0ZVNwYWNlIiwic2luZ2xlIiwib3BlblF1b3RlIiwiY2xvc2VRdW90ZSIsInF1b3RlcyIsIl9ydWxlcyIsImJsb2NrVG9rZW5zIiwibGlua2lmeSIsInByZXRlc3QiLCJodG1sTGlua0xldmVsIiwiY3VycmVudFRva2VuIiwibGlua3MiLCJsbiIsImZ1bGxVcmwiLCJub3JtYWxpemVMaW5rIiwidmFsaWRhdGVMaW5rIiwidXJsVGV4dCIsIm5vcm1hbGl6ZUxpbmtUZXh0IiwidG9rZW5fbyIsInRva2VuX3QiLCJ0b2tlbl9jIiwiYmxrSWR4IiwidHlwb2dyYXBoZXIiLCJjdXJyIiwiQ29yZSIsInJ1bGVyIiwicHJvY2VzcyIsIlN0YXRlIiwiU3RhdGVCbG9jayIsImJNYXJrcyIsImVNYXJrcyIsInRTaGlmdCIsInNDb3VudCIsImJzQ291bnQiLCJibGtJbmRlbnQiLCJsaW5lIiwibGluZU1heCIsInRpZ2h0IiwiZGRJbmRlbnQiLCJsaXN0SW5kZW50IiwiaW5kZW50IiwiaW5kZW50X2ZvdW5kIiwiaXNFbXB0eSIsInNraXBFbXB0eUxpbmVzIiwic2tpcFNwYWNlcyIsInNraXBTcGFjZXNCYWNrIiwic2tpcENoYXJzIiwic2tpcENoYXJzQmFjayIsImdldExpbmVzIiwiYmVnaW4iLCJrZWVwTGFzdExGIiwibGluZUluZGVudCIsImxpbmVTdGFydCIsImdldExpbmUiLCJlc2NhcGVkU3BsaXQiLCJpc0VzY2FwZWQiLCJzdWJzdHJpbmciLCJza2lwQnVsbGV0TGlzdE1hcmtlciIsInN0YXJ0TGluZSIsInNraXBPcmRlcmVkTGlzdE1hcmtlciIsIm9wZW5fdGFnIiwiY2xvc2VfdGFnIiwiSFRNTF9UQUdfUkUiLCJIVE1MX09QRU5fQ0xPU0VfVEFHX1JFIiwiSFRNTF9TRVFVRU5DRVMiLCJlbmRMaW5lIiwic2lsZW50IiwibmV4dExpbmUiLCJmaXJzdENoIiwic2Vjb25kQ2giLCJsaW5lVGV4dCIsImNvbHVtbnMiLCJhbGlnbnMiLCJjb2x1bW5Db3VudCIsIm9sZFBhcmVudFR5cGUiLCJ0ZXJtaW5hdG9yUnVsZXMiLCJ0YWJsZUxpbmVzIiwidG9rZW5faG8iLCJ0b2tlbl9pbCIsInRib2R5TGluZXMiLCJhdXRvY29tcGxldGVkQ2VsbHMiLCJ0ZXJtaW5hdGUiLCJ0b2tlbl90ZG8iLCJtZW0iLCJoYXZlRW5kTWFya2VyIiwib2xkTGluZU1heCIsIm9sZEJNYXJrcyIsIm9sZEJTQ291bnQiLCJvbGRTQ291bnQiLCJvbGRUU2hpZnQiLCJsYXN0TGluZUVtcHR5IiwiaXNPdXRkZW50ZWQiLCJzcGFjZUFmdGVyTWFya2VyIiwiYWRqdXN0VGFiIiwiaW5pdGlhbCIsIm9sZEluZGVudCIsImxpbmVzIiwidG9rZW5pemUiLCJjbnQiLCJpc09yZGVyZWQiLCJtYXJrZXJWYWx1ZSIsInBvc0FmdGVyTWFya2VyIiwiaXNUZXJtaW5hdGluZ1BhcmFncmFwaCIsIm1hcmtlckNoYXJDb2RlIiwibGlzdFRva0lkeCIsImxpc3RMaW5lcyIsInByZXZFbXB0eUVuZCIsImNvbnRlbnRTdGFydCIsImluZGVudEFmdGVyTWFya2VyIiwiaXRlbUxpbmVzIiwib2xkVGlnaHQiLCJvbGRMaXN0SW5kZW50IiwibWFya1RpZ2h0UGFyYWdyYXBocyIsIl9lbmRMaW5lIiwiZ2V0TmV4dExpbmUiLCJpc0NvbnRpbnVhdGlvbiIsImxpbmVDb250ZW50IiwiZGVzdFJlcyIsImhlbHBlcnMiLCJkZXN0RW5kUG9zIiwiZGVzdEVuZExpbmVObyIsInRpdGxlUmVzIiwibGFiZWwiLCJyZWZlcmVuY2VzIiwidG9rZW5faSIsIlBhcnNlckJsb2NrIiwibWF4TmVzdGluZyIsImhhc0VtcHR5TGluZXMiLCJwcmV2TGluZSIsIm91dFRva2VucyIsIlN0YXRlSW5saW5lIiwidG9rZW5zX21ldGEiLCJwZW5kaW5nIiwicGVuZGluZ0xldmVsIiwiZGVsaW1pdGVycyIsIl9wcmV2X2RlbGltaXRlcnMiLCJiYWNrdGlja3MiLCJiYWNrdGlja3NTY2FubmVkIiwibGlua0xldmVsIiwicHVzaFBlbmRpbmciLCJ0b2tlbl9tZXRhIiwic2NhbkRlbGltcyIsImNhblNwbGl0V29yZCIsImxlZnRfZmxhbmtpbmciLCJyaWdodF9mbGFua2luZyIsImNhbl9vcGVuIiwiY2FuX2Nsb3NlIiwiaXNUZXJtaW5hdG9yQ2hhciIsIlNDSEVNRV9SRSIsIkVTQ0FQRUQiLCJwb3N0UHJvY2VzcyIsImxvbmVNYXJrZXJzIiwic3RhcnREZWxpbSIsImVuZERlbGltIiwic2Nhbm5lZCIsImlzU3Ryb25nIiwiRU1BSUxfUkUiLCJBVVRPTElOS19SRSIsIkRJR0lUQUxfUkUiLCJOQU1FRF9SRSIsInByb2Nlc3NEZWxpbWl0ZXJzIiwib3BlbmVyc0JvdHRvbSIsImhlYWRlcklkeCIsImxhc3RUb2tlbklkeCIsImp1bXBzIiwiY2xvc2VySWR4IiwiY2xvc2VyIiwibWluT3BlbmVySWR4Iiwib3BlbmVySWR4IiwibmV3TWluT3BlbmVySWR4Iiwib3BlbmVyIiwiaXNPZGRNYXRjaCIsImxhc3RKdW1wIiwibWF0Y2hBdFN0YXJ0IiwicG1heCIsIndzIiwiY2gxIiwiZXNjYXBlZFN0ciIsImNoMiIsIm9yaWdTdHIiLCJvcGVuZXJMZW5ndGgiLCJtYXRjaFN0YXJ0IiwibWF0Y2hFbmQiLCJjbG9zZXJMZW5ndGgiLCJyZXMiLCJyZWYiLCJwYXJzZVJlZmVyZW5jZSIsImxhYmVsU3RhcnQiLCJsYyIsImlzTGV0dGVyIiwiX3J1bGVzMiIsIlBhcnNlcklubGluZSIsInJ1bGVyMiIsImlzRnVuY3Rpb24iLCJkZWZhdWx0T3B0aW9ucyIsImZ1enp5TGluayIsImZ1enp5RW1haWwiLCJmdXp6eUlQIiwiZGVmYXVsdFNjaGVtYXMiLCJ0YWlsIiwicmUiLCJzcmNfYXV0aCIsInNyY19ob3N0X3BvcnRfc3RyaWN0Iiwic3JjX3BhdGgiLCJub19odHRwIiwic3JjX2RvbWFpbiIsInNyY19kb21haW5fcm9vdCIsInNyY19wb3J0Iiwic3JjX2hvc3RfdGVybWluYXRvciIsIm1haWx0byIsInNyY19lbWFpbF9uYW1lIiwic3JjX2hvc3Rfc3RyaWN0IiwidGxkc19kZWZhdWx0Iiwib3B0cyIsInNyY19BbnkiLCJzcmNfQ2MiLCJzcmNfWiIsInNyY19QIiwic3JjX1pQQ2MiLCJzcmNfWkNjIiwidGV4dF9zZXBhcmF0b3JzIiwic3JjX3BzZXVkb19sZXR0ZXIiLCJzcmNfaXA0Iiwic3JjX3huIiwic3JjX2hvc3QiLCJ0cGxfaG9zdF9mdXp6eSIsInRwbF9ob3N0X25vX2lwX2Z1enp5IiwidHBsX2hvc3RfZnV6enlfc3RyaWN0IiwidHBsX2hvc3RfcG9ydF9mdXp6eV9zdHJpY3QiLCJ0cGxfaG9zdF9wb3J0X25vX2lwX2Z1enp5X3N0cmljdCIsInRwbF9ob3N0X2Z1enp5X3Rlc3QiLCJ0cGxfZW1haWxfZnV6enkiLCJ0cGxfbGlua19mdXp6eSIsInRwbF9saW5rX25vX2lwX2Z1enp5IiwiX19vcHRzX18iLCJ0bGRzIiwiX190bGRzX18iLCJ1bnRwbCIsInRwbCIsInNyY190bGRzIiwib25Db21waWxlIiwiX190bGRzX3JlcGxhY2VkX18iLCJlbWFpbF9mdXp6eSIsImxpbmtfZnV6enkiLCJsaW5rX25vX2lwX2Z1enp5IiwiaG9zdF9mdXp6eV90ZXN0IiwiYWxpYXNlcyIsInNjaGVtYUVycm9yIiwiX19jb21waWxlZF9fIiwiX19zY2hlbWFzX18iLCJjb21waWxlZCIsImlzUmVnRXhwIiwiY3JlYXRlVmFsaWRhdG9yIiwiYWxpYXMiLCJzbGlzdCIsInNjaGVtYV90ZXN0Iiwic2NoZW1hX3NlYXJjaCIsInNjaGVtYV9hdF9zdGFydCIsIl9faW5kZXhfXyIsIl9fdGV4dF9jYWNoZV9fIiwicmVzZXRTY2FuQ2FjaGUiLCJNYXRjaCIsIl9fbGFzdF9pbmRleF9fIiwiX19zY2hlbWFfXyIsImNyZWF0ZU1hdGNoIiwiTGlua2lmeUl0Iiwic2NoZW1hcyIsImFjYyIsIm1sIiwibWUiLCJ0bGRfcG9zIiwiYXRfcG9zIiwidGVzdFNjaGVtYUF0Iiwia2VlcE9sZCIsIm1heEludCIsInJlZ2V4UHVueWNvZGUiLCJyZWdleE5vbkFTQ0lJIiwicmVnZXhTZXBhcmF0b3JzIiwiZXJyb3JzIiwic3RyaW5nRnJvbUNoYXJDb2RlIiwibWFwRG9tYWluIiwiZG9tYWluIiwiZW5jb2RlZCIsInVjczJkZWNvZGUiLCJjb3VudGVyIiwiZGlnaXRUb0Jhc2ljIiwiZGlnaXQiLCJmbGFnIiwiYWRhcHQiLCJkZWx0YSIsIm51bVBvaW50cyIsImZpcnN0VGltZSIsImJhc2VNaW51c1RNaW4iLCJpbnB1dExlbmd0aCIsImJhc2ljIiwib2xkaSIsInciLCJjb2RlUG9pbnQiLCJiYXNlTWludXNUIiwiZnJvbUNvZGVQb2ludCIsImN1cnJlbnRWYWx1ZSIsImJhc2ljTGVuZ3RoIiwiaGFuZGxlZENQQ291bnQiLCJoYW5kbGVkQ1BDb3VudFBsdXNPbmUiLCJxIiwicU1pbnVzVCIsImNvZGVQb2ludHMiLCJjb21wb25lbnRzIiwiY29yZSIsInplcm8iLCJydWxlczIiLCJjb21tb25tYXJrIiwiQkFEX1BST1RPX1JFIiwiR09PRF9EQVRBX1JFIiwiUkVDT0RFX0hPU1ROQU1FX0ZPUiIsImVyIiwiTWFya2Rvd25JdCIsInByZXNldE5hbWUiLCJyZW5kZXJlciIsInV0aWxzIiwiY29uZmlndXJlIiwicHJlc2V0cyIsIm1pc3NlZCIsInVzZSIsImFyZ3MiLCJwYXJzZUlubGluZSIsImJ1bGxldF9saXN0IiwiTWFya2Rvd25QYXJzZVN0YXRlIiwidG9rZW5IYW5kbGVycyIsImFkZFRleHQiLCJtYXliZU1lcmdlIiwib3Blbk1hcmsiLCJjbG9zZU1hcmsiLCJwYXJzZVRva2VucyIsInRva3MiLCJvcGVuTm9kZSIsImNsb3NlTm9kZSIsIm5vQ2xvc2VUb2tlbiIsIndpdGhvdXRUcmFpbGluZ05ld2xpbmUiLCJub09wIiwiTWFya2Rvd25QYXJzZXIiLCJ0b2tlbml6ZXIiLCJtYXJrZG93bkVudiIsImxpc3RJc1RpZ2h0IiwiYmxhbmtNYXJrIiwibWl4YWJsZSIsIk1hcmtkb3duU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsIk1hcmtkb3duU2VyaWFsaXplclN0YXRlIiwicmVuZGVyQ29udGVudCIsImRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIiLCJ3cmFwQmxvY2siLCJ3cml0ZSIsImNsb3NlQmxvY2siLCJyZXBlYXQiLCJyZW5kZXJMaXN0IiwiYnVsbGV0IiwibWF4VyIsIm5TdHIiLCJlc2MiLCJpbkF1dG9saW5rIiwiZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlIiwiaXNQbGFpblVSTCIsIl9zdGF0ZSIsIl9tYXJrIiwiYmFja3RpY2tzRm9yIiwiZXNjYXBlIiwidGlja3MiLCJkZWxpbSIsImNsb3NlZCIsImluVGlnaHRMaXN0IiwidGlnaHRMaXN0cyIsImhhcmRCcmVha05vZGVOYW1lIiwiZmx1c2hDbG9zZSIsImF0QmxhbmsiLCJkZWxpbU1pbiIsImdldE1hcmsiLCJzdHJpY3QiLCJmaXJzdERlbGltIiwiZW5zdXJlTmV3TGluZSIsImZyb21CbG9ja1N0YXJ0IiwidHJhaWxpbmciLCJwcm9ncmVzcyIsImxlYWRpbmciLCJsZWFkIiwidHJhaWwiLCJub0VzYyIsIm1hcmtTdHJpbmciLCJpc1RpZ2h0IiwicHJldlRpZ2h0Iiwic3RhcnRPZkxpbmUiLCJlc2NhcGVFeHRyYUNoYXJhY3RlcnMiLCJxdW90ZSIsImdldEVuY2xvc2luZ1doaXRlc3BhY2UiLCJtYXJrZG93blNlcmlhbGl6ZXIiLCJib3hUZXh0IiwibWFya2Rvd25JdFBhcnNlciIsImltYWdlUnVsZUluZGV4IiwiZGVmYXVsdEltYWdlUnVsZSIsIkNIRUNLTElTVF9JVEVNX09QRU5fTUFSS0VSUyIsImNvcmVTdGF0ZSIsInNyY0xpbmVzIiwiaXNDaGVja2xpc3RPcGVuIiwiaGFzQ2hlY2tsaXN0IiwidHJpbUxlZnQiLCJpbmxpbmVTdGF0ZSIsIm9yaWdpbmFsUG9zIiwiY29kZVRva2VuIiwiU2NyYXRjaFRva2VuUGFyc2VyIiwiZ2V0VHlwZU5hbWUiLCJ0b2tlblR5cGUiLCJnZXRUb2tlbnMiLCJmdWxsVG9rZW5MaXN0IiwicGFyc2VhYmxlIiwicmVzZXRJbnRlcm5hbFN0YXRlIiwidG9rZW5TdGFjayIsIkRPQ1VNRU5UX01BUCIsIm1hcmtkb3duUGFyc2VyIiwibWlwIiwidG9rZW5QYXJzZXIiLCJzdGFydHNXaXRoIiwiSW5saW5lTGlua1BsdWdpbiIsInN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlIiwiYXV0b0xpbmtNYXBzIiwiY2hpbGRMaW5rTWFyayIsImxhc3RNYXAiLCJhdXRvTGlua01hcCIsImxpbmtUZXh0IiwibGlua01hcmtzIiwibGlua01hcmsiLCJmaW5kQW5kSW5zZXJ0SW5saW5lTGlua3MiLCJnZXREb2NGb3JOZXdFZGl0b3JTdGF0ZSJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +(()=>{var e={92:e=>{self,e.exports=(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n,r,i,o;var s;e.d(t,{default:()=>S}),function(e){e.SetSize="set-size",e.StreamItems="stream-items",e.StreamContextItem="stream-context-item",e.SaveItems="save-items",e.SelectItem="select-item",e.AssociateItem="associate-item",e.DeassociateItem="deassociate-item",e.ClearSelection="clear-selection",e.CreateItem="create-item",e.CreateItems="create-items",e.DeleteItems="delete-items",e.SetComponentData="set-component-data",e.InstallLocalComponent="install-local-component",e.ToggleActivateComponent="toggle-activate-component",e.RequestPermissions="request-permissions",e.PresentConflictResolution="present-conflict-resolution",e.DuplicateItem="duplicate-item",e.ComponentRegistered="component-registered",e.ActivateThemes="themes",e.Reply="reply",e.SaveSuccess="save-success",e.SaveError="save-error",e.ThemesActivated="themes-activated",e.KeyDown="key-down",e.KeyUp="key-up",e.Click="click"}(n||(n={})),function(e){e[e.Web=1]="Web",e[e.Desktop=2]="Desktop",e[e.Mobile=3]="Mobile"}(r||(r={})),function(e){e.Any="*",e.Item="SF|Item",e.RootKey="SN|RootKey|NoSync",e.ItemsKey="SN|ItemsKey",e.EncryptedStorage="SN|EncryptedStorage",e.Note="Note",e.Tag="Tag",e.SmartTag="SN|SmartTag",e.Component="SN|Component",e.Editor="SN|Editor",e.ActionsExtension="Extension",e.UserPrefs="SN|UserPreferences",e.HistorySession="SN|HistorySession",e.Theme="SN|Theme",e.Mfa="SF|MFA",e.ServerExtension="SF|Extension",e.FilesafeCredentials="SN|FileSafe|Credentials",e.FilesafeFileMetadata="SN|FileSafe|FileMetadata",e.FilesafeIntegration="SN|FileSafe|Integration",e.ExtensionRepo="SN|ExtensionRepo"}(i||(i={})),function(e){e.Pinned="pinned",e.Archived="archived",e.Locked="locked",e.UserModifiedDate="client_updated_at",e.DefaultEditor="defaultEditor",e.MobileRules="mobileRules",e.NotAvailableOnMobile="notAvailableOnMobile",e.MobileActive="mobileActive",e.LastSize="lastSize",e.PrefersPlainEditor="prefersPlainEditor",e.ComponentInstallError="installError"}(o||(o={}));var l=new Uint8Array(16);function a(){if(!s&&!(s="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return s(l)}const c=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,h=function(e){return"string"==typeof e&&c.test(e)};for(var u=[],d=0;d<256;++d)u.push((d+256).toString(16).substr(1));const p=function(e,t,n){var r=(e=e||{}).random||(e.rng||a)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var i=0;i<16;++i)t[n+i]=r[i];return t}return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(u[e[t+0]]+u[e[t+1]]+u[e[t+2]]+u[e[t+3]]+"-"+u[e[t+4]]+u[e[t+5]]+"-"+u[e[t+6]]+u[e[t+7]]+"-"+u[e[t+8]]+u[e[t+9]]+"-"+u[e[t+10]]+u[e[t+11]]+u[e[t+12]]+u[e[t+13]]+u[e[t+14]]+u[e[t+15]]).toLowerCase();if(!h(n))throw TypeError("Stringified UUID is invalid");return n}(r)},f=e=>{var t;const n={[r.Web]:"web",[r.Desktop]:"desktop",[r.Mobile]:"mobile"};return null!==(t=n[e])&&void 0!==t?t:n[r.Web]},m=e=>null!=e,g=()=>{};class y{static get isSupported(){return!(!window.console&&!console)}static get info(){return y.isSupported&&this.enabled?console.log.bind(console):g}static get error(){return y.isSupported?console.error.bind(console):g}}var k,b,v,w;function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function C(e){for(var t=1;t0&&(this.initialPermissions=n),m(null==r?void 0:r.coallesedSaving)&&(this.coallesedSaving=r.coallesedSaving),m(null==r?void 0:r.coallesedSavingDelay)&&(this.coallesedSavingDelay=r.coallesedSavingDelay),m(null==r?void 0:r.acceptsThemes)&&(this.component.acceptsThemes=null===(s=null==r?void 0:r.acceptsThemes)||void 0===s||s),m(i)&&(this.onReadyCallback=i),m(o)&&(this.onThemesChangeCallback=o),y.enabled=null!==(t=null==r?void 0:r.debug)&&void 0!==t&&t}deinit(){this.onReadyCallback=void 0,this.component={acceptsThemes:!0,activeThemes:[]},this.messageQueue=[],this.sentMessages=[],this.lastStreamedItem=void 0,this.pendingSaveItems=void 0,this.pendingSaveTimeout=void 0,this.pendingSaveParams=void 0,this.messageHandler&&(this.contentWindow.document.removeEventListener("message",this.messageHandler),this.contentWindow.removeEventListener("message",this.messageHandler)),this.keyDownEventListener&&this.contentWindow.removeEventListener("keydown",this.keyDownEventListener),this.keyUpEventListener&&this.contentWindow.removeEventListener("keyup",this.keyUpEventListener),this.clickEventListener&&this.contentWindow.removeEventListener("click",this.clickEventListener)}registerMessageHandler(){this.messageHandler=e=>{if(y.info("Components API Message received:",e.data),document.referrer&&new URL(document.referrer).origin!==new URL(e.origin).origin)return;const{data:t}=e,r=(e=>{if("string"!=typeof e)return!1;try{const t=JSON.parse(e),n=Object.prototype.toString.call(t);return"[object Object]"===n||"[object Array]"===n}catch(e){return!1}})(t)?JSON.parse(t):t;if(r){if(void 0===this.component.origin&&r.action===n.ComponentRegistered)this.component.origin=e.origin;else if(e.origin!==this.component.origin)return;this.handleMessage(r)}else y.error("Invalid data received. Skipping...")},this.contentWindow.document.addEventListener("message",this.messageHandler,!1),this.contentWindow.addEventListener("message",this.messageHandler,!1),y.info("Waiting for messages...")}registerKeyboardEventListeners(){this.keyDownEventListener=e=>{y.info("A key has been pressed: ".concat(e.key)),e.ctrlKey?this.keyDownEvent(w.Ctrl):e.shiftKey?this.keyDownEvent(w.Shift):(e.metaKey||"Meta"===e.key)&&this.keyDownEvent(w.Meta)},this.keyUpEventListener=e=>{y.info("A key has been released: ".concat(e.key)),"Control"===e.key?this.keyUpEvent(w.Ctrl):"Shift"===e.key?this.keyUpEvent(w.Shift):"Meta"===e.key&&this.keyUpEvent(w.Meta)},this.contentWindow.addEventListener("keydown",this.keyDownEventListener,!1),this.contentWindow.addEventListener("keyup",this.keyUpEventListener,!1)}registerMouseEventListeners(){this.clickEventListener=e=>{y.info("A click has been performed."),this.mouseClickEvent()},this.contentWindow.addEventListener("click",this.clickEventListener,!1)}handleMessage(e){switch(e.action){case n.ComponentRegistered:this.component.sessionKey=e.sessionKey,e.componentData&&(this.component.data=e.componentData),this.onReady(e.data),y.info("Component successfully registered with payload:",e);break;case n.ActivateThemes:this.activateThemes(e.data.themes);break;default:{var t,r;if(!e.original)return;const n=null===(t=this.sentMessages)||void 0===t?void 0:t.filter((t=>{var n;return t.messageId===(null===(n=e.original)||void 0===n?void 0:n.messageId)}))[0];if(!n){const e=this.contentWindow.document.title,t=("The extension '".concat(e,"' is attempting to communicate with Standard Notes, ")+"but an error is preventing it from doing so. Please restart this extension and try again.").replace(" "," ");return void y.info(t)}null==n||null===(r=n.callback)||void 0===r||r.call(n,e.data);break}}}onReady(e){this.component.environment=e.environment,this.component.platform=e.platform,this.component.uuid=e.uuid,this.initialPermissions&&this.initialPermissions.length>0&&this.requestPermissions(this.initialPermissions);for(const e of this.messageQueue)this.postMessage(e.action,e.data,e.callback);this.messageQueue=[],y.info("Data passed to onReady:",e),this.activateThemes(e.activeThemeUrls||[]),this.postMessage(n.ThemesActivated,{}),this.onReadyCallback&&this.onReadyCallback()}getSelfComponentUUID(){return this.component.uuid}isRunningInDesktopApplication(){return this.component.environment===f(r.Desktop)}isRunningInMobileApplication(){return this.component.environment===f(r.Mobile)}getComponentDataValueForKey(e){if(this.component.data)return this.component.data[e]}setComponentDataValueForKey(e,t){if(!this.component.data)throw new Error("The component has not been initialized.");if(!e||e&&0===e.length)throw new Error("The key for the data value should be a valid string.");this.component.data=C(C({},this.component.data),{},{[e]:t}),this.postMessage(n.SetComponentData,{componentData:this.component.data})}clearComponentData(){this.component.data={},this.postMessage(n.SetComponentData,{componentData:this.component.data})}postMessage(e,t,n){if(!this.component.sessionKey)return void this.messageQueue.push({action:e,data:t,api:v.Component,callback:n});const r={action:e,data:t,messageId:this.generateUUID(),sessionKey:this.component.sessionKey,api:v.Component},i=JSON.parse(JSON.stringify(r));let o;i.callback=n,this.sentMessages.push(i),o=this.isRunningInMobileApplication()?JSON.stringify(r):r,y.info("Posting message:",o),this.contentWindow.parent.postMessage(o,this.component.origin)}requestPermissions(e,t){this.postMessage(n.RequestPermissions,{permissions:e},(()=>{t&&t()}))}activateThemes(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];if(!this.component.acceptsThemes)return;y.info("Incoming themes:",e);const{activeThemes:t}=this.component;if(t&&t.sort().toString()==e.sort().toString())return;let n=e;const r=[];for(const i of t)e.includes(i)?n=n.filter((e=>e!==i)):r.push(i);y.info("Deactivating themes:",r),y.info("Activating themes:",n);for(const e of r)this.deactivateTheme(e);this.component.activeThemes=e;for(const e of n){if(!e)continue;const t=this.contentWindow.document.createElement("link");t.id=btoa(e),t.href=e,t.type="text/css",t.rel="stylesheet",t.media="screen,print",t.className="custom-theme",this.contentWindow.document.getElementsByTagName("head")[0].appendChild(t)}this.onThemesChangeCallback&&this.onThemesChangeCallback()}themeElementForUrl(e){return Array.from(this.contentWindow.document.getElementsByClassName("custom-theme")).slice().find((t=>t.id==btoa(e)))}deactivateTheme(e){const t=this.themeElementForUrl(e);t&&t.parentNode&&(t.setAttribute("disabled","true"),t.parentNode.removeChild(t))}generateUUID(){return p()}get platform(){return this.component.platform}get environment(){return this.component.environment}streamItems(e,t){this.postMessage(n.StreamItems,{content_types:e},(e=>{t(e.items)}))}streamContextItem(e){this.postMessage(n.StreamContextItem,{},(t=>{const{item:n}=t;(!this.lastStreamedItem||this.lastStreamedItem.uuid!==n.uuid)&&this.pendingSaveTimeout&&(clearTimeout(this.pendingSaveTimeout),this.performSavingOfItems(this.pendingSaveParams),this.pendingSaveTimeout=void 0,this.pendingSaveParams=void 0),this.lastStreamedItem=n,e(this.lastStreamedItem)}))}selectItem(e){this.postMessage(n.SelectItem,{item:this.jsonObjectForItem(e)})}clearSelection(){this.postMessage(n.ClearSelection,{content_type:i.Tag})}createItem(e,t){this.postMessage(n.CreateItem,{item:this.jsonObjectForItem(e)},(e=>{let{item:n}=e;!n&&e.items&&e.items.length>0&&(n=e.items[0]),this.associateItem(n),t&&t(n)}))}createItems(e,t){const r=e.map((e=>this.jsonObjectForItem(e)));this.postMessage(n.CreateItems,{items:r},(e=>{t&&t(e.items)}))}associateItem(e){this.postMessage(n.AssociateItem,{item:this.jsonObjectForItem(e)})}deassociateItem(e){this.postMessage(n.DeassociateItem,{item:this.jsonObjectForItem(e)})}deleteItem(e,t){this.deleteItems([e],t)}deleteItems(e,t){const r={items:e.map((e=>this.jsonObjectForItem(e)))};this.postMessage(n.DeleteItems,r,(e=>{t&&t(e)}))}sendCustomEvent(e,t,n){this.postMessage(e,t,(e=>{n&&n(e)}))}saveItem(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.saveItems([e],t,n)}saveItemWithPresave(e,t,n){this.saveItemsWithPresave([e],t,n)}saveItemsWithPresave(e,t,n){this.saveItems(e,n,!1,t)}performSavingOfItems(e){let{items:t,presave:r,callback:i}=e;const o=setTimeout((()=>{this.concernTimeouts.forEach((e=>clearTimeout(e))),alert("This editor is unable to communicate with Standard Notes. Your changes may not be saved. Please backup your changes, then restart the application and try again.")}),5e3);this.concernTimeouts.push(o),r&&r();const s=[];for(const e of t)s.push(this.jsonObjectForItem(e));this.postMessage(n.SaveItems,{items:s},(()=>{this.concernTimeouts.forEach((e=>clearTimeout(e))),null==i||i()}))}saveItems(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3?arguments[3]:void 0;if(this.pendingSaveItems||(this.pendingSaveItems=[]),this.coallesedSaving&&!n){this.pendingSaveTimeout&&clearTimeout(this.pendingSaveTimeout);const n=e.map((e=>e.uuid)),i=this.pendingSaveItems.filter((e=>!n.includes(e.uuid)));this.pendingSaveItems=i.concat(e),this.pendingSaveParams={items:this.pendingSaveItems,presave:r,callback:t},this.pendingSaveTimeout=setTimeout((()=>{this.performSavingOfItems(this.pendingSaveParams),this.pendingSaveItems=[],this.pendingSaveTimeout=void 0,this.pendingSaveParams=null}),this.coallesedSavingDelay)}else this.performSavingOfItems({items:e,presave:r,callback:t})}setSize(e,t){this.postMessage(n.SetSize,{type:"container",width:e,height:t})}keyDownEvent(e){this.postMessage(n.KeyDown,{keyboardModifier:e})}keyUpEvent(e){this.postMessage(n.KeyUp,{keyboardModifier:e})}mouseClickEvent(){this.postMessage(n.Click,{})}jsonObjectForItem(e){const t=Object.assign({},e);return t.children=null,t.parent=null,t}getItemAppDataValue(e,t){var n,r;return null==e||null===(n=e.content)||void 0===n||null===(r=n.appData)||void 0===r?void 0:r["org.standardnotes.sn"][t]}}return t.default})()},115:e=>{e.exports=''},415:e=>{e.exports=''}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e={};n.r(e),n.d(e,{decode:()=>pl,encode:()=>gl,format:()=>yl,parse:()=>Ol});var t={};n.r(t),n.d(t,{Any:()=>Fl,Cc:()=>Il,Cf:()=>Rl,P:()=>Tl,S:()=>Nl,Z:()=>Bl});var r={};n.r(r),n.d(r,{arrayReplaceAt:()=>ha,assign:()=>ca,escapeHtml:()=>xa,escapeRE:()=>Da,fromCodePoint:()=>da,has:()=>aa,isMdAsciiPunct:()=>Aa,isPunctChar:()=>Ea,isSpace:()=>Sa,isString:()=>sa,isValidEntityCode:()=>ua,isWhiteSpace:()=>_a,lib:()=>Oa,normalizeReference:()=>Ma,unescapeAll:()=>ya,unescapeMd:()=>ga});var i={};function o(e){this.content=e}n.r(i),n.d(i,{parseLinkDestination:()=>Na,parseLinkLabel:()=>Ta,parseLinkTitle:()=>Fa}),o.prototype={constructor:o,find:function(e){for(var t=0;t>1}},o.from=function(e){if(e instanceof o)return e;var t=[];if(e)for(var n in e)t.push(n,e[n]);return new o(t)};const s=o;function l(e,t,n){for(let r=0;;r++){if(r==e.childCount||r==t.childCount)return e.childCount==t.childCount?null:n;let i=e.child(r),o=t.child(r);if(i!=o){if(!i.sameMarkup(o))return n;if(i.isText&&i.text!=o.text){for(let e=0;i.text[e]==o.text[e];e++)n++;return n}if(i.content.size||o.content.size){let e=l(i.content,o.content,n+1);if(null!=e)return e}n+=i.nodeSize}else n+=i.nodeSize}}function a(e,t,n,r){for(let i=e.childCount,o=t.childCount;;){if(0==i||0==o)return i==o?null:{a:n,b:r};let s=e.child(--i),l=t.child(--o),c=s.nodeSize;if(s!=l){if(!s.sameMarkup(l))return{a:n,b:r};if(s.isText&&s.text!=l.text){let e=0,t=Math.min(s.text.length,l.text.length);for(;ee&&!1!==n(l,r+s,i||null,o)&&l.content.size){let i=s+1;l.nodesBetween(Math.max(0,e-i),Math.min(l.content.size,t-i),n,r+i)}s=a}}descendants(e){this.nodesBetween(0,this.size,e)}textBetween(e,t,n,r){let i="",o=!0;return this.nodesBetween(e,t,((s,l)=>{let a=s.isText?s.text.slice(Math.max(e,l)-l,t-l):s.isLeaf?r?"function"==typeof r?r(s):r:s.type.spec.leafText?s.type.spec.leafText(s):"":"";s.isBlock&&(s.isLeaf&&a||s.isTextblock)&&n&&(o?o=!1:i+=n),i+=a}),0),i}append(e){if(!e.size)return this;if(!this.size)return e;let t=this.lastChild,n=e.firstChild,r=this.content.slice(),i=0;for(t.isText&&t.sameMarkup(n)&&(r[r.length-1]=t.withText(t.text+n.text),i=1);ie)for(let i=0,o=0;oe&&((ot)&&(s=s.isText?s.cut(Math.max(0,e-o),Math.min(s.text.length,t-o)):s.cut(Math.max(0,e-o-1),Math.min(s.content.size,t-o-1))),n.push(s),r+=s.nodeSize),o=l}return new c(n,r)}cutByIndex(e,t){return e==t?c.empty:0==e&&t==this.content.length?this:new c(this.content.slice(e,t))}replaceChild(e,t){let n=this.content[e];if(n==t)return this;let r=this.content.slice(),i=this.size+t.nodeSize-n.nodeSize;return r[e]=t,new c(r,i)}addToStart(e){return new c([e].concat(this.content),this.size+e.nodeSize)}addToEnd(e){return new c(this.content.concat(e),this.size+e.nodeSize)}eq(e){if(this.content.length!=e.content.length)return!1;for(let t=0;tthis.size||e<0)throw new RangeError(`Position ${e} outside of fragment (${this})`);for(let n=0,r=0;;n++){let i=r+this.child(n).nodeSize;if(i>=e)return i==e||t>0?u(n+1,i):u(n,r);r=i}}toString(){return"<"+this.toStringInner()+">"}toStringInner(){return this.content.join(", ")}toJSON(){return this.content.length?this.content.map((e=>e.toJSON())):null}static fromJSON(e,t){if(!t)return c.empty;if(!Array.isArray(t))throw new RangeError("Invalid input for Fragment.fromJSON");return new c(t.map(e.nodeFromJSON))}static fromArray(e){if(!e.length)return c.empty;let t,n=0;for(let r=0;rthis.type.rank&&(t||(t=e.slice(0,r)),t.push(this),n=!0),t&&t.push(i)}}return t||(t=e.slice()),n||t.push(this),t}removeFromSet(e){for(let t=0;te.type.rank-t.type.rank)),t}}p.none=[];class f extends Error{}class m{constructor(e,t,n){this.content=e,this.openStart=t,this.openEnd=n}get size(){return this.content.size-this.openStart-this.openEnd}insertAt(e,t){let n=y(this.content,e+this.openStart,t);return n&&new m(n,this.openStart,this.openEnd)}removeBetween(e,t){return new m(g(this.content,e+this.openStart,t+this.openStart),this.openStart,this.openEnd)}eq(e){return this.content.eq(e.content)&&this.openStart==e.openStart&&this.openEnd==e.openEnd}toString(){return this.content+"("+this.openStart+","+this.openEnd+")"}toJSON(){if(!this.content.size)return null;let e={content:this.content.toJSON()};return this.openStart>0&&(e.openStart=this.openStart),this.openEnd>0&&(e.openEnd=this.openEnd),e}static fromJSON(e,t){if(!t)return m.empty;let n=t.openStart||0,r=t.openEnd||0;if("number"!=typeof n||"number"!=typeof r)throw new RangeError("Invalid input for Slice.fromJSON");return new m(c.fromJSON(e,t.content),n,r)}static maxOpen(e,t=!0){let n=0,r=0;for(let r=e.firstChild;r&&!r.isLeaf&&(t||!r.type.spec.isolating);r=r.firstChild)n++;for(let n=e.lastChild;n&&!n.isLeaf&&(t||!n.type.spec.isolating);n=n.lastChild)r++;return new m(e,n,r)}}function g(e,t,n){let{index:r,offset:i}=e.findIndex(t),o=e.maybeChild(r),{index:s,offset:l}=e.findIndex(n);if(i==t||o.isText){if(l!=n&&!e.child(s).isText)throw new RangeError("Removing non-flat range");return e.cut(0,t).append(e.cut(n))}if(r!=s)throw new RangeError("Removing non-flat range");return e.replaceChild(r,o.copy(g(o.content,t-i-1,n-i-1)))}function y(e,t,n,r){let{index:i,offset:o}=e.findIndex(t),s=e.maybeChild(i);if(o==t||s.isText)return r&&!r.canReplace(i,i,n)?null:e.cut(0,t).append(n).append(e.cut(t));let l=y(s.content,t-o-1,n);return l&&e.replaceChild(i,s.copy(l))}function k(e,t,n){if(n.openStart>e.depth)throw new f("Inserted content deeper than insertion position");if(e.depth-n.openStart!=t.depth-n.openEnd)throw new f("Inconsistent open depths");return b(e,t,n,0)}function b(e,t,n,r){let i=e.index(r),o=e.node(r);if(i==t.index(r)&&r=0;e--)r=t.node(e).copy(c.from(r));return{start:r.resolveNoCache(e.openStart+n),end:r.resolveNoCache(r.content.size-e.openEnd-n)}}(n,e);return D(o,S(e,i,s,t,r))}{let r=e.parent,i=r.content;return D(r,i.cut(0,e.parentOffset).append(n.content).append(i.cut(t.parentOffset)))}}return D(o,_(e,t,r))}function v(e,t){if(!t.type.compatibleContent(e.type))throw new f("Cannot join "+t.type.name+" onto "+e.type.name)}function w(e,t,n){let r=e.node(n);return v(r,t.node(n)),r}function x(e,t){let n=t.length-1;n>=0&&e.isText&&e.sameMarkup(t[n])?t[n]=e.withText(t[n].text+e.text):t.push(e)}function C(e,t,n,r){let i=(t||e).node(n),o=0,s=t?t.index(n):i.childCount;e&&(o=e.index(n),e.depth>n?o++:e.textOffset&&(x(e.nodeAfter,r),o++));for(let e=o;ei&&w(e,t,i+1),s=r.depth>i&&w(n,r,i+1),l=[];return C(null,e,i,l),o&&s&&t.index(i)==n.index(i)?(v(o,s),x(D(o,S(e,t,n,r,i+1)),l)):(o&&x(D(o,_(e,t,i+1)),l),C(t,n,i,l),s&&x(D(s,_(n,r,i+1)),l)),C(r,null,i,l),new c(l)}function _(e,t,n){let r=[];if(C(null,e,n,r),e.depth>n){x(D(w(e,t,n+1),_(e,t,n+1)),r)}return C(t,null,n,r),new c(r)}m.empty=new m(c.empty,0,0);class E{constructor(e,t,n){this.pos=e,this.path=t,this.parentOffset=n,this.depth=t.length/3-1}resolveDepth(e){return null==e?this.depth:e<0?this.depth+e:e}get parent(){return this.node(this.depth)}get doc(){return this.node(0)}node(e){return this.path[3*this.resolveDepth(e)]}index(e){return this.path[3*this.resolveDepth(e)+1]}indexAfter(e){return e=this.resolveDepth(e),this.index(e)+(e!=this.depth||this.textOffset?1:0)}start(e){return 0==(e=this.resolveDepth(e))?0:this.path[3*e-1]+1}end(e){return e=this.resolveDepth(e),this.start(e)+this.node(e).content.size}before(e){if(!(e=this.resolveDepth(e)))throw new RangeError("There is no position before the top-level node");return e==this.depth+1?this.pos:this.path[3*e-1]}after(e){if(!(e=this.resolveDepth(e)))throw new RangeError("There is no position after the top-level node");return e==this.depth+1?this.pos:this.path[3*e-1]+this.path[3*e].nodeSize}get textOffset(){return this.pos-this.path[this.path.length-1]}get nodeAfter(){let e=this.parent,t=this.index(this.depth);if(t==e.childCount)return null;let n=this.pos-this.path[this.path.length-1],r=e.child(t);return n?e.child(t).cut(n):r}get nodeBefore(){let e=this.index(this.depth),t=this.pos-this.path[this.path.length-1];return t?this.parent.child(e).cut(0,t):0==e?null:this.parent.child(e-1)}posAtIndex(e,t){t=this.resolveDepth(t);let n=this.path[3*t],r=0==t?0:this.path[3*t-1]+1;for(let t=0;t0;t--)if(this.start(t)<=e&&this.end(t)>=e)return t;return 0}blockRange(e=this,t){if(e.pos=0;n--)if(e.pos<=this.end(n)&&(!t||t(this.node(n))))return new T(this,e,n);return null}sameParent(e){return this.pos-this.parentOffset==e.pos-e.parentOffset}max(e){return e.pos>this.pos?e:this}min(e){return e.pos=0&&t<=e.content.size))throw new RangeError("Position "+t+" out of range");let n=[],r=0,i=t;for(let t=e;;){let{index:e,offset:o}=t.content.findIndex(i),s=i-o;if(n.push(t,e,r+o),!s)break;if(t=t.child(e),t.isText)break;i=s-1,r+=o+1}return new E(t,n,i)}static resolveCached(e,t){let n=O.get(e);if(n)for(let e=0;ee&&this.nodesBetween(e,t,(e=>(n.isInSet(e.marks)&&(r=!0),!r))),r}get isBlock(){return this.type.isBlock}get isTextblock(){return this.type.isTextblock}get inlineContent(){return this.type.inlineContent}get isInline(){return this.type.isInline}get isText(){return this.type.isText}get isLeaf(){return this.type.isLeaf}get isAtom(){return this.type.isAtom}toString(){if(this.type.spec.toDebugString)return this.type.spec.toDebugString(this);let e=this.type.name;return this.content.size&&(e+="("+this.content.toStringInner()+")"),R(this.marks,e)}contentMatchAt(e){let t=this.type.contentMatch.matchFragment(this.content,0,e);if(!t)throw new Error("Called contentMatchAt on a node with invalid content");return t}canReplace(e,t,n=c.empty,r=0,i=n.childCount){let o=this.contentMatchAt(e).matchFragment(n,r,i),s=o&&o.matchFragment(this.content,t);if(!s||!s.validEnd)return!1;for(let e=r;ee.type.name))}`);this.content.forEach((e=>e.check()))}toJSON(){let e={type:this.type.name};for(let t in this.attrs){e.attrs=this.attrs;break}return this.content.size&&(e.content=this.content.toJSON()),this.marks.length&&(e.marks=this.marks.map((e=>e.toJSON()))),e}static fromJSON(e,t){if(!t)throw new RangeError("Invalid input for Node.fromJSON");let n;if(t.marks){if(!Array.isArray(t.marks))throw new RangeError("Invalid mark data for Node.fromJSON");n=t.marks.map(e.markFromJSON)}if("text"==t.type){if("string"!=typeof t.text)throw new RangeError("Invalid text node in JSON");return e.text(t.text,n)}let r=c.fromJSON(e,t.content),i=e.nodeType(t.type).create(t.attrs,r,n);return i.type.checkAttrs(i.attrs),i}}F.prototype.text=void 0;class I extends F{constructor(e,t,n,r){if(super(e,t,null,r),!n)throw new RangeError("Empty text nodes are not allowed");this.text=n}toString(){return this.type.spec.toDebugString?this.type.spec.toDebugString(this):R(this.marks,JSON.stringify(this.text))}get textContent(){return this.text}textBetween(e,t){return this.text.slice(e,t)}get nodeSize(){return this.text.length}mark(e){return e==this.marks?this:new I(this.type,this.attrs,this.text,e)}withText(e){return e==this.text?this:new I(this.type,this.attrs,e,this.marks)}cut(e=0,t=this.text.length){return 0==e&&t==this.text.length?this:this.withText(this.text.slice(e,t))}eq(e){return this.sameMarkup(e)&&this.text==e.text}toJSON(){let e=super.toJSON();return e.text=this.text,e}}function R(e,t){for(let n=e.length-1;n>=0;n--)t=e[n].type.name+"("+t+")";return t}class B{constructor(e){this.validEnd=e,this.next=[],this.wrapCache=[]}static parse(e,t){let n=new z(e,t);if(null==n.next)return B.empty;let r=L(n);n.next&&n.err("Unexpected trailing text");let i=function(e){let t=Object.create(null);return n(U(e,0));function n(r){let i=[];r.forEach((t=>{e[t].forEach((({term:t,to:n})=>{if(!t)return;let r;for(let e=0;e{r||i.push([t,r=[]]),-1==r.indexOf(e)&&r.push(e)}))}))}));let o=t[r.join(",")]=new B(r.indexOf(e.length-1)>-1);for(let e=0;ee.to=t))}function o(e,t){if("choice"==e.type)return e.exprs.reduce(((e,n)=>e.concat(o(n,t))),[]);if("seq"!=e.type){if("star"==e.type){let s=n();return r(t,s),i(o(e.expr,s),s),[r(s)]}if("plus"==e.type){let s=n();return i(o(e.expr,t),s),i(o(e.expr,s),s),[r(s)]}if("opt"==e.type)return[r(t)].concat(o(e.expr,t));if("range"==e.type){let s=t;for(let t=0;te.createAndFill())));for(let e=0;e=this.next.length)throw new RangeError(`There's no ${e}th edge in this content match`);return this.next[e]}toString(){let e=[];return function t(n){e.push(n);for(let r=0;r{let r=n+(t.validEnd?"*":" ")+" ";for(let n=0;n"+e.indexOf(t.next[n].next);return r})).join("\n")}}B.empty=new B(!0);class z{constructor(e,t){this.string=e,this.nodeTypes=t,this.inline=null,this.pos=0,this.tokens=e.split(/\s*(?=\b|\W|$)/),""==this.tokens[this.tokens.length-1]&&this.tokens.pop(),""==this.tokens[0]&&this.tokens.shift()}get next(){return this.tokens[this.pos]}eat(e){return this.next==e&&(this.pos++||!0)}err(e){throw new SyntaxError(e+" (in content expression '"+this.string+"')")}}function L(e){let t=[];do{t.push(P(e))}while(e.eat("|"));return 1==t.length?t[0]:{type:"choice",exprs:t}}function P(e){let t=[];do{t.push(q(e))}while(e.next&&")"!=e.next&&"|"!=e.next);return 1==t.length?t[0]:{type:"seq",exprs:t}}function q(e){let t=function(e){if(e.eat("(")){let t=L(e);return e.eat(")")||e.err("Missing closing paren"),t}if(!/\W/.test(e.next)){let t=function(e,t){let n=e.nodeTypes,r=n[t];if(r)return[r];let i=[];for(let e in n){let r=n[e];r.isInGroup(t)&&i.push(r)}0==i.length&&e.err("No node type or group '"+t+"' found");return i}(e,e.next).map((t=>(null==e.inline?e.inline=t.isInline:e.inline!=t.isInline&&e.err("Mixing inline and block content"),{type:"name",value:t})));return e.pos++,1==t.length?t[0]:{type:"choice",exprs:t}}e.err("Unexpected token '"+e.next+"'")}(e);for(;;)if(e.eat("+"))t={type:"plus",expr:t};else if(e.eat("*"))t={type:"star",expr:t};else if(e.eat("?"))t={type:"opt",expr:t};else{if(!e.eat("{"))break;t=V(e,t)}return t}function $(e){/\D/.test(e.next)&&e.err("Expected number, got '"+e.next+"'");let t=Number(e.next);return e.pos++,t}function V(e,t){let n=$(e),r=n;return e.eat(",")&&(r="}"!=e.next?$(e):-1),e.eat("}")||e.err("Unclosed braced range"),{type:"range",min:n,max:r,expr:t}}function j(e,t){return t-e}function U(e,t){let n=[];return function t(r){let i=e[r];if(1==i.length&&!i[0].term)return t(i[0].to);n.push(r);for(let e=0;e-1}get whitespace(){return this.spec.whitespace||(this.spec.code?"pre":"normal")}hasRequiredAttrs(){for(let e in this.attrs)if(this.attrs[e].isRequired)return!0;return!1}compatibleContent(e){return this==e||this.contentMatch.compatible(e.contentMatch)}computeAttrs(e){return!e&&this.defaultAttrs?this.defaultAttrs:H(this.attrs,e)}create(e=null,t,n){if(this.isText)throw new Error("NodeType.create can't construct text nodes");return new F(this,this.computeAttrs(e),c.from(t),p.setFrom(n))}createChecked(e=null,t,n){return t=c.from(t),this.checkContent(t),new F(this,this.computeAttrs(e),t,p.setFrom(n))}createAndFill(e=null,t,n){if(e=this.computeAttrs(e),(t=c.from(t)).size){let e=this.contentMatch.fillBefore(t);if(!e)return null;t=e.append(t)}let r=this.contentMatch.matchFragment(t),i=r&&r.fillBefore(c.empty,!0);return i?new F(this,e,t.append(i),p.setFrom(n)):null}validContent(e){let t=this.contentMatch.matchFragment(e);if(!t||!t.validEnd)return!1;for(let t=0;t-1}allowsMarks(e){if(null==this.markSet)return!0;for(let t=0;tn[e]=new G(e,t,r)));let r=t.spec.topNode||"doc";if(!n[r])throw new RangeError("Schema is missing its top node type ('"+r+"')");if(!n.text)throw new RangeError("Every schema needs a 'text' type");for(let e in n.text.attrs)throw new RangeError("The text node type should not have attributes");return n}}class Z{constructor(e,t,n){this.hasDefault=Object.prototype.hasOwnProperty.call(n,"default"),this.default=n.default,this.validate="string"==typeof n.validate?function(e,t,n){let r=n.split("|");return n=>{let i=null===n?"null":typeof n;if(r.indexOf(i)<0)throw new RangeError(`Expected value of type ${r} for attribute ${t} on type ${e}, got ${i}`)}}(e,t,n.validate):n.validate}get isRequired(){return!this.hasDefault}}class Y{constructor(e,t,n,r){this.name=e,this.rank=t,this.schema=n,this.spec=r,this.attrs=K(e,r.attrs),this.excluded=null;let i=W(this.attrs);this.instance=i?new p(this,i):null}create(e=null){return!e&&this.instance?this.instance:new p(this,H(this.attrs,e))}static compile(e,t){let n=Object.create(null),r=0;return e.forEach(((e,i)=>n[e]=new Y(e,r++,t,i))),n}removeFromSet(e){for(var t=0;t-1}}class Q{constructor(e){this.linebreakReplacement=null,this.cached=Object.create(null);let t=this.spec={};for(let n in e)t[n]=e[n];t.nodes=s.from(e.nodes),t.marks=s.from(e.marks||{}),this.nodes=G.compile(this.spec.nodes,this),this.marks=Y.compile(this.spec.marks,this);let n=Object.create(null);for(let e in this.nodes){if(e in this.marks)throw new RangeError(e+" can not be both a node and a mark");let t=this.nodes[e],r=t.spec.content||"",i=t.spec.marks;if(t.contentMatch=n[r]||(n[r]=B.parse(r,this.nodes)),t.inlineContent=t.contentMatch.inlineContent,t.spec.linebreakReplacement){if(this.linebreakReplacement)throw new RangeError("Multiple linebreak nodes defined");if(!t.isInline||!t.isLeaf)throw new RangeError("Linebreak replacement nodes must be inline leaf nodes");this.linebreakReplacement=t}t.markSet="_"==i?null:i?X(this,i.split(" ")):""!=i&&t.inlineContent?null:[]}for(let e in this.marks){let t=this.marks[e],n=t.spec.excludes;t.excluded=null==n?[t]:""==n?[]:X(this,n.split(" "))}this.nodeFromJSON=this.nodeFromJSON.bind(this),this.markFromJSON=this.markFromJSON.bind(this),this.topNodeType=this.nodes[this.spec.topNode||"doc"],this.cached.wrappings=Object.create(null)}node(e,t=null,n,r){if("string"==typeof e)e=this.nodeType(e);else{if(!(e instanceof G))throw new RangeError("Invalid node type: "+e);if(e.schema!=this)throw new RangeError("Node type from different schema used ("+e.name+")")}return e.createChecked(t,n,r)}text(e,t){let n=this.nodes.text;return new I(n,n.defaultAttrs,e,p.setFrom(t))}mark(e,t){return"string"==typeof e&&(e=this.marks[e]),e.create(t)}nodeFromJSON(e){return F.fromJSON(this,e)}markFromJSON(e){return p.fromJSON(this,e)}nodeType(e){let t=this.nodes[e];if(!t)throw new RangeError("Unknown node type: "+e);return t}}function X(e,t){let n=[];for(let r=0;r-1)&&n.push(s=r)}if(!s)throw new SyntaxError("Unknown mark type: '"+t[r]+"'")}return n}class ee{constructor(e,t){this.schema=e,this.rules=t,this.tags=[],this.styles=[];let n=this.matchedStyles=[];t.forEach((e=>{if(function(e){return null!=e.tag}(e))this.tags.push(e);else if(function(e){return null!=e.style}(e)){let t=/[^=]*/.exec(e.style)[0];n.indexOf(t)<0&&n.push(t),this.styles.push(e)}})),this.normalizeLists=!this.tags.some((t=>{if(!/^(ul|ol)\b/.test(t.tag)||!t.node)return!1;let n=e.nodes[t.node];return n.contentMatch.matchType(n)}))}parse(e,t={}){let n=new se(this,t,!1);return n.addAll(e,p.none,t.from,t.to),n.finish()}parseSlice(e,t={}){let n=new se(this,t,!0);return n.addAll(e,p.none,t.from,t.to),m.maxOpen(n.finish())}matchTag(e,t,n){for(let r=n?this.tags.indexOf(n)+1:0;re.length&&(61!=o.charCodeAt(e.length)||o.slice(e.length+1)!=t))){if(r.getAttrs){let e=r.getAttrs(t);if(!1===e)continue;r.attrs=e||void 0}return r}}}static schemaRules(e){let t=[];function n(e){let n=null==e.priority?50:e.priority,r=0;for(;r{n(e=ae(e)),e.mark||e.ignore||e.clearMark||(e.mark=t)}))}for(let t in e.nodes){let r=e.nodes[t].spec.parseDOM;r&&r.forEach((e=>{n(e=ae(e)),e.node||e.ignore||e.mark||(e.node=t)}))}return t}static fromSchema(e){return e.cached.domParser||(e.cached.domParser=new ee(e,ee.schemaRules(e)))}}const te={address:!0,article:!0,aside:!0,blockquote:!0,canvas:!0,dd:!0,div:!0,dl:!0,fieldset:!0,figcaption:!0,figure:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,li:!0,noscript:!0,ol:!0,output:!0,p:!0,pre:!0,section:!0,table:!0,tfoot:!0,ul:!0},ne={head:!0,noscript:!0,object:!0,script:!0,style:!0,title:!0},re={ol:!0,ul:!0};function ie(e,t,n){return null!=t?(t?1:0)|("full"===t?2:0):e&&"pre"==e.whitespace?3:-5&n}class oe{constructor(e,t,n,r,i,o){this.type=e,this.attrs=t,this.marks=n,this.solid=r,this.options=o,this.content=[],this.activeMarks=p.none,this.match=i||(4&o?null:e.contentMatch)}findWrapping(e){if(!this.match){if(!this.type)return[];let t=this.type.contentMatch.fillBefore(c.from(e));if(!t){let t,n=this.type.contentMatch;return(t=n.findWrapping(e.type))?(this.match=n,t):null}this.match=this.type.contentMatch.matchFragment(t)}return this.match.findWrapping(e.type)}finish(e){if(!(1&this.options)){let e,t=this.content[this.content.length-1];if(t&&t.isText&&(e=/[ \t\r\n\u000c]+$/.exec(t.text))){let n=t;t.text.length==e[0].length?this.content.pop():this.content[this.content.length-1]=n.withText(n.text.slice(0,n.text.length-e[0].length))}}let t=c.from(this.content);return!e&&this.match&&(t=t.append(this.match.fillBefore(c.empty,!0))),this.type?this.type.create(this.attrs,t,this.marks):t}inlineContext(e){return this.type?this.type.inlineContent:this.content.length?this.content[0].isInline:e.parentNode&&!te.hasOwnProperty(e.parentNode.nodeName.toLowerCase())}}class se{constructor(e,t,n){this.parser=e,this.options=t,this.isOpen=n,this.open=0,this.localPreserveWS=!1;let r,i=t.topNode,o=ie(null,t.preserveWhitespace,0)|(n?4:0);r=i?new oe(i.type,i.attrs,p.none,!0,t.topMatch||i.type.contentMatch,o):new oe(n?null:e.schema.topNodeType,null,p.none,!0,null,o),this.nodes=[r],this.find=t.findPositions,this.needsBlock=!1}get top(){return this.nodes[this.open]}addDOM(e,t){3==e.nodeType?this.addTextNode(e,t):1==e.nodeType&&this.addElement(e,t)}addTextNode(e,t){let n=e.nodeValue,r=this.top,i=2&r.options?"full":this.localPreserveWS||(1&r.options)>0;if("full"===i||r.inlineContext(e)||/[^ \t\r\n\u000c]/.test(n)){if(i)n="full"!==i?n.replace(/\r?\n|\r/g," "):n.replace(/\r\n?/g,"\n");else if(n=n.replace(/[ \t\r\n\u000c]+/g," "),/^[ \t\r\n\u000c]/.test(n)&&this.open==this.nodes.length-1){let t=r.content[r.content.length-1],i=e.previousSibling;(!t||i&&"BR"==i.nodeName||t.isText&&/[ \t\r\n\u000c]$/.test(t.text))&&(n=n.slice(1))}n&&this.insertNode(this.parser.schema.text(n),t,!/\S/.test(n)),this.findInText(e)}else this.findInside(e)}addElement(e,t,n){let r=this.localPreserveWS,i=this.top;("PRE"==e.tagName||/pre/.test(e.style&&e.style.whiteSpace))&&(this.localPreserveWS=!0);let o,s=e.nodeName.toLowerCase();re.hasOwnProperty(s)&&this.parser.normalizeLists&&function(e){for(let t=e.firstChild,n=null;t;t=t.nextSibling){let e=1==t.nodeType?t.nodeName.toLowerCase():null;e&&re.hasOwnProperty(e)&&n?(n.appendChild(t),t=n):"li"==e?n=t:e&&(n=null)}}(e);let l=this.options.ruleFromNode&&this.options.ruleFromNode(e)||(o=this.parser.matchTag(e,this,n));e:if(l?l.ignore:ne.hasOwnProperty(s))this.findInside(e),this.ignoreFallback(e,t);else if(!l||l.skip||l.closeParent){l&&l.closeParent?this.open=Math.max(0,this.open-1):l&&l.skip.nodeType&&(e=l.skip);let n,r=this.needsBlock;if(te.hasOwnProperty(s))i.content.length&&i.content[0].isInline&&this.open&&(this.open--,i=this.top),n=!0,i.type||(this.needsBlock=!0);else if(!e.firstChild){this.leafFallback(e,t);break e}let o=l&&l.skip?t:this.readStyles(e,t);o&&this.addAll(e,o),n&&this.sync(i),this.needsBlock=r}else{let n=this.readStyles(e,t);n&&this.addElementByRule(e,l,n,!1===l.consuming?o:void 0)}this.localPreserveWS=r}leafFallback(e,t){"BR"==e.nodeName&&this.top.type&&this.top.type.inlineContent&&this.addTextNode(e.ownerDocument.createTextNode("\n"),t)}ignoreFallback(e,t){"BR"!=e.nodeName||this.top.type&&this.top.type.inlineContent||this.findPlace(this.parser.schema.text("-"),t,!0)}readStyles(e,t){let n=e.style;if(n&&n.length)for(let e=0;e!n.clearMark(e))):t.concat(this.parser.schema.marks[n.mark].create(n.attrs)),!1!==n.consuming)break;e=n}}return t}addElementByRule(e,t,n,r){let i,o;if(t.node)if(o=this.parser.schema.nodes[t.node],o.isLeaf)this.insertNode(o.create(t.attrs),n,"BR"==e.nodeName)||this.leafFallback(e,n);else{let e=this.enter(o,t.attrs||null,n,t.preserveWhitespace);e&&(i=!0,n=e)}else{let e=this.parser.schema.marks[t.mark];n=n.concat(e.create(t.attrs))}let s=this.top;if(o&&o.isLeaf)this.findInside(e);else if(r)this.addElement(e,n,r);else if(t.getContent)this.findInside(e),t.getContent(e,this.parser.schema).forEach((e=>this.insertNode(e,n,!1)));else{let r=e;"string"==typeof t.contentElement?r=e.querySelector(t.contentElement):"function"==typeof t.contentElement?r=t.contentElement(e):t.contentElement&&(r=t.contentElement),this.findAround(e,r,!0),this.addAll(r,n),this.findAround(e,r,!1)}i&&this.sync(s)&&this.open--}addAll(e,t,n,r){let i=n||0;for(let o=n?e.childNodes[n]:e.firstChild,s=null==r?null:e.childNodes[r];o!=s;o=o.nextSibling,++i)this.findAtPoint(e,i),this.addDOM(o,t);this.findAtPoint(e,i)}findPlace(e,t,n){let r,i;for(let t=this.open,o=0;t>=0;t--){let s=this.nodes[t],l=s.findWrapping(e);if(l&&(!r||r.length>l.length+o)&&(r=l,i=s,!l.length))break;if(s.solid){if(n)break;o+=2}}if(!r)return null;this.sync(i);for(let e=0;e!(o.type?o.type.allowsMarkType(t.type):ce(t.type,e))||(l=t.addToSet(l),!1))),this.nodes.push(new oe(e,t,l,r,null,s)),this.open++,n}closeExtra(e=!1){let t=this.nodes.length-1;if(t>this.open){for(;t>this.open;t--)this.nodes[t-1].content.push(this.nodes[t].finish(e));this.nodes.length=this.open+1}}finish(){return this.open=0,this.closeExtra(this.isOpen),this.nodes[0].finish(!(!this.isOpen&&!this.options.topOpen))}sync(e){for(let t=this.open;t>=0;t--){if(this.nodes[t]==e)return this.open=t,!0;this.localPreserveWS&&(this.nodes[t].options|=1)}return!1}get currentPos(){this.closeExtra();let e=0;for(let t=this.open;t>=0;t--){let n=this.nodes[t].content;for(let t=n.length-1;t>=0;t--)e+=n[t].nodeSize;t&&e++}return e}findAtPoint(e,t){if(this.find)for(let n=0;n-1)return e.split(/\s*\|\s*/).some(this.matchesContext,this);let t=e.split("/"),n=this.options.context,r=!(this.isOpen||n&&n.parent.type!=this.nodes[0].type),i=-(n?n.depth+1:0)+(r?0:1),o=(e,s)=>{for(;e>=0;e--){let l=t[e];if(""==l){if(e==t.length-1||0==e)continue;for(;s>=i;s--)if(o(e-1,s))return!0;return!1}{let e=s>0||0==s&&r?this.nodes[s].type:n&&s>=i?n.node(s-i).type:null;if(!e||e.name!=l&&!e.isInGroup(l))return!1;s--}}return!0};return o(t.length-1,this.open)}textblockFromContext(){let e=this.options.context;if(e)for(let t=e.depth;t>=0;t--){let n=e.node(t).contentMatchAt(e.indexAfter(t)).defaultType;if(n&&n.isTextblock&&n.defaultAttrs)return n}for(let e in this.parser.schema.nodes){let t=this.parser.schema.nodes[e];if(t.isTextblock&&t.defaultAttrs)return t}}}function le(e,t){return(e.matches||e.msMatchesSelector||e.webkitMatchesSelector||e.mozMatchesSelector).call(e,t)}function ae(e){let t={};for(let n in e)t[n]=e[n];return t}function ce(e,t){let n=t.schema.nodes;for(let r in n){let i=n[r];if(!i.allowsMarkType(e))continue;let o=[],s=e=>{o.push(e);for(let n=0;n{if(i.length||e.marks.length){let n=0,o=0;for(;n=0;r--){let i=this.serializeMark(e.marks[r],e.isInline,t);i&&((i.contentDOM||i.dom).appendChild(n),n=i.dom)}return n}serializeMark(e,t,n={}){let r=this.marks[e.type.name];return r&&me(de(n),r(e,t),null,e.attrs)}static renderSpec(e,t,n=null,r){return me(e,t,n,r)}static fromSchema(e){return e.cached.domSerializer||(e.cached.domSerializer=new he(this.nodesFromSchema(e),this.marksFromSchema(e)))}static nodesFromSchema(e){let t=ue(e.nodes);return t.text||(t.text=e=>e.text),t}static marksFromSchema(e){return ue(e.marks)}}function ue(e){let t={};for(let n in e){let r=e[n].spec.toDOM;r&&(t[n]=r)}return t}function de(e){return e.document||window.document}const pe=new WeakMap;function fe(e){let t=pe.get(e);return void 0===t&&pe.set(e,t=function(e){let t=null;function n(e){if(e&&"object"==typeof e)if(Array.isArray(e))if("string"==typeof e[0])t||(t=[]),t.push(e);else for(let t=0;t-1)throw new RangeError("Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.");let s,l=o.indexOf(" ");l>0&&(n=o.slice(0,l),o=o.slice(l+1));let a=n?e.createElementNS(n,o):e.createElement(o),c=t[1],h=1;if(c&&"object"==typeof c&&null==c.nodeType&&!Array.isArray(c)){h=2;for(let e in c)if(null!=c[e]){let t=e.indexOf(" ");t>0?a.setAttributeNS(e.slice(0,t),e.slice(t+1),c[e]):a.setAttribute(e,c[e])}}for(let i=h;ih)throw new RangeError("Content hole must be the only child of its parent node");return{dom:a,contentDOM:a}}{let{dom:t,contentDOM:i}=me(e,o,n,r);if(a.appendChild(t),i){if(s)throw new RangeError("Multiple content holes");s=i}}}return{dom:a,contentDOM:s}}const ge=Math.pow(2,16);function ye(e){return 65535&e}class ke{constructor(e,t,n){this.pos=e,this.delInfo=t,this.recover=n}get deleted(){return(8&this.delInfo)>0}get deletedBefore(){return(5&this.delInfo)>0}get deletedAfter(){return(6&this.delInfo)>0}get deletedAcross(){return(4&this.delInfo)>0}}class be{constructor(e,t=!1){if(this.ranges=e,this.inverted=t,!e.length&&be.empty)return be.empty}recover(e){let t=0,n=ye(e);if(!this.inverted)for(let e=0;ee)break;let a=this.ranges[s+i],c=this.ranges[s+o],h=l+a;if(e<=h){let i=l+r+((a?e==l?-1:e==h?1:t:t)<0?0:c);if(n)return i;let o=e==(t<0?l:h)?null:s/3+(e-l)*ge,u=e==l?2:e==h?1:4;return(t<0?e!=l:e!=h)&&(u|=8),new ke(i,u,o)}r+=c-a}return n?e+r:new ke(e+r,0,null)}touches(e,t){let n=0,r=ye(t),i=this.inverted?2:1,o=this.inverted?1:2;for(let t=0;te)break;let l=this.ranges[t+i];if(e<=s+l&&t==3*r)return!0;n+=this.ranges[t+o]-l}return!1}forEach(e){let t=this.inverted?2:1,n=this.inverted?1:2;for(let r=0,i=0;r=0;t--){let r=e.getMirror(t);this.appendMap(e._maps[t].invert(),null!=r&&r>t?n-r-1:void 0)}}invert(){let e=new ve;return e.appendMappingInverted(this),e}map(e,t=1){if(this.mirror)return this._map(e,t,!0);for(let n=this.from;nn&&te.isAtom&&t.type.allowsMarkType(this.mark.type)?e.mark(this.mark.addToSet(e.marks)):e),r),t.openStart,t.openEnd);return Ce.fromReplace(e,this.from,this.to,i)}invert(){return new _e(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new Se(t.pos,n.pos,this.mark)}merge(e){return e instanceof Se&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new Se(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"addMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to)throw new RangeError("Invalid input for AddMarkStep.fromJSON");return new Se(t.from,t.to,e.markFromJSON(t.mark))}}xe.jsonID("addMark",Se);class _e extends xe{constructor(e,t,n){super(),this.from=e,this.to=t,this.mark=n}apply(e){let t=e.slice(this.from,this.to),n=new m(De(t.content,(e=>e.mark(this.mark.removeFromSet(e.marks))),e),t.openStart,t.openEnd);return Ce.fromReplace(e,this.from,this.to,n)}invert(){return new Se(this.from,this.to,this.mark)}map(e){let t=e.mapResult(this.from,1),n=e.mapResult(this.to,-1);return t.deleted&&n.deleted||t.pos>=n.pos?null:new _e(t.pos,n.pos,this.mark)}merge(e){return e instanceof _e&&e.mark.eq(this.mark)&&this.from<=e.to&&this.to>=e.from?new _e(Math.min(this.from,e.from),Math.max(this.to,e.to),this.mark):null}toJSON(){return{stepType:"removeMark",mark:this.mark.toJSON(),from:this.from,to:this.to}}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to)throw new RangeError("Invalid input for RemoveMarkStep.fromJSON");return new _e(t.from,t.to,e.markFromJSON(t.mark))}}xe.jsonID("removeMark",_e);class Ee extends xe{constructor(e,t){super(),this.pos=e,this.mark=t}apply(e){let t=e.nodeAt(this.pos);if(!t)return Ce.fail("No node at mark step's position");let n=t.type.create(t.attrs,null,this.mark.addToSet(t.marks));return Ce.fromReplace(e,this.pos,this.pos+1,new m(c.from(n),0,t.isLeaf?0:1))}invert(e){let t=e.nodeAt(this.pos);if(t){let e=this.mark.addToSet(t.marks);if(e.length==t.marks.length){for(let n=0;nn.pos?null:new Oe(t.pos,n.pos,r,i,this.slice,this.insert,this.structure)}toJSON(){let e={stepType:"replaceAround",from:this.from,to:this.to,gapFrom:this.gapFrom,gapTo:this.gapTo,insert:this.insert};return this.slice.size&&(e.slice=this.slice.toJSON()),this.structure&&(e.structure=!0),e}static fromJSON(e,t){if("number"!=typeof t.from||"number"!=typeof t.to||"number"!=typeof t.gapFrom||"number"!=typeof t.gapTo||"number"!=typeof t.insert)throw new RangeError("Invalid input for ReplaceAroundStep.fromJSON");return new Oe(t.from,t.to,t.gapFrom,t.gapTo,m.fromJSON(e,t.slice),t.insert,!!t.structure)}}function Te(e,t,n){let r=e.resolve(t),i=n-t,o=r.depth;for(;i>0&&o>0&&r.indexAfter(o)==r.node(o).childCount;)o--,i--;if(i>0){let e=r.node(o).maybeChild(r.indexAfter(o));for(;i>0;){if(!e||e.isLeaf)return!0;e=e.firstChild,i--}}return!1}function Ne(e,t,n,r=n.contentMatch,i=!0){let o=e.doc.nodeAt(t),s=[],l=t+1;for(let t=0;t=0;t--)e.step(s[t])}function Fe(e,t,n){return(0==t||e.canReplace(t,e.childCount))&&(n==e.childCount||e.canReplace(0,n))}function Ie(e){let t=e.parent.content.cutByIndex(e.startIndex,e.endIndex);for(let n=e.depth;;--n){let r=e.$from.node(n),i=e.$from.index(n),o=e.$to.indexAfter(n);if(n{if(i.isText){let s,l=/\r?\n|\r/g;for(;s=l.exec(i.text);){let i=e.mapping.slice(r).map(n+1+o+s.index);e.replaceWith(i,i+1,t.type.schema.linebreakReplacement.create())}}}))}function ze(e,t,n,r){t.forEach(((i,o)=>{if(i.type==i.type.schema.linebreakReplacement){let i=e.mapping.slice(r).map(n+1+o);e.replaceWith(i,i+1,t.type.schema.text("\n"))}}))}function Le(e,t,n=1,r){let i=e.resolve(t),o=i.depth-n,s=r&&r[r.length-1]||i.parent;if(o<0||i.parent.type.spec.isolating||!i.parent.canReplace(i.index(),i.parent.childCount)||!s.type.validContent(i.parent.content.cutByIndex(i.index(),i.parent.childCount)))return!1;for(let e=i.depth-1,t=n-2;e>o;e--,t--){let n=i.node(e),o=i.index(e);if(n.type.spec.isolating)return!1;let s=n.content.cutByIndex(o,n.childCount),l=r&&r[t+1];l&&(s=s.replaceChild(0,l.type.create(l.attrs)));let a=r&&r[t]||n;if(!n.canReplace(o+1,n.childCount)||!a.type.validContent(s))return!1}let l=i.indexAfter(o),a=r&&r[0];return i.node(o).canReplaceWith(l,l,a?a.type:i.node(o+1).type)}function Pe(e,t){let n=e.resolve(t),r=n.index();return qe(n.nodeBefore,n.nodeAfter)&&n.parent.canReplace(r,r+1)}function qe(e,t){return!(!e||!t||e.isLeaf||!function(e,t){t.content.size||e.type.compatibleContent(t.type);let n=e.contentMatchAt(e.childCount),{linebreakReplacement:r}=e.type.schema;for(let i=0;i0;t--)this.placed=c.from(e.node(t).copy(this.placed))}get depth(){return this.frontier.length-1}fit(){for(;this.unplaced.size;){let e=this.findFittable();e?this.placeNodes(e):this.openMore()||this.dropNode()}let e=this.mustMoveInline(),t=this.placed.size-this.depth-this.$from.depth,n=this.$from,r=this.close(e<0?this.$to:n.doc.resolve(e));if(!r)return null;let i=this.placed,o=n.depth,s=r.depth;for(;o&&s&&1==i.childCount;)i=i.firstChild.content,o--,s--;let l=new m(i,o,s);return e>-1?new Oe(n.pos,e,this.$to.pos,this.$to.end(),l,t):l.size||n.pos!=this.$to.pos?new Me(n.pos,r.pos,l):null}findFittable(){let e=this.unplaced.openStart;for(let t=this.unplaced.content,n=0,r=this.unplaced.openEnd;n1&&(r=0),i.type.spec.isolating&&r<=n){e=n;break}t=i.content}for(let t=1;t<=2;t++)for(let n=1==t?e:this.unplaced.openStart;n>=0;n--){let e,r=null;n?(r=He(this.unplaced.content,n-1).firstChild,e=r.content):e=this.unplaced.content;let i=e.firstChild;for(let e=this.depth;e>=0;e--){let o,{type:s,match:l}=this.frontier[e],a=null;if(1==t&&(i?l.matchType(i.type)||(a=l.fillBefore(c.from(i),!1)):r&&s.compatibleContent(r.type)))return{sliceDepth:n,frontierDepth:e,parent:r,inject:a};if(2==t&&i&&(o=l.findWrapping(i.type)))return{sliceDepth:n,frontierDepth:e,parent:r,wrap:o};if(r&&l.matchType(r.type))break}}}openMore(){let{content:e,openStart:t,openEnd:n}=this.unplaced,r=He(e,t);return!(!r.childCount||r.firstChild.isLeaf)&&(this.unplaced=new m(e,t+1,Math.max(n,r.size+t>=e.size-n?t+1:0)),!0)}dropNode(){let{content:e,openStart:t,openEnd:n}=this.unplaced,r=He(e,t);if(r.childCount<=1&&t>0){let i=e.size-t<=t+r.size;this.unplaced=new m(Ue(e,t-1,1),t-1,i?t-1:n)}else this.unplaced=new m(Ue(e,t,1),t,n)}placeNodes({sliceDepth:e,frontierDepth:t,parent:n,inject:r,wrap:i}){for(;this.depth>t;)this.closeFrontierNode();if(i)for(let e=0;e1||0==l||e.content.size)&&(u=t,h.push(Je(e.mark(d.allowedMarks(e.marks)),1==a?l:0,a==s.childCount?p:-1)))}let f=a==s.childCount;f||(p=-1),this.placed=We(this.placed,t,c.from(h)),this.frontier[t].match=u,f&&p<0&&n&&n.type==this.frontier[this.depth].type&&this.frontier.length>1&&this.closeFrontierNode();for(let e=0,t=s;e1&&r==this.$to.end(--n);)++r;return r}findCloseLevel(e){e:for(let t=Math.min(this.depth,e.depth);t>=0;t--){let{match:n,type:r}=this.frontier[t],i=t=0;n--){let{match:t,type:r}=this.frontier[n],i=Ke(e,n,r,t,!0);if(!i||i.childCount)continue e}return{depth:t,fit:o,move:i?e.doc.resolve(e.after(t+1)):e}}}}close(e){let t=this.findCloseLevel(e);if(!t)return null;for(;this.depth>t.depth;)this.closeFrontierNode();t.fit.childCount&&(this.placed=We(this.placed,t.depth,t.fit)),e=t.move;for(let n=t.depth+1;n<=e.depth;n++){let t=e.node(n),r=t.type.contentMatch.fillBefore(t.content,!0,e.index(n));this.openFrontierNode(t.type,t.attrs,r)}return e}openFrontierNode(e,t=null,n){let r=this.frontier[this.depth];r.match=r.match.matchType(e),this.placed=We(this.placed,this.depth,c.from(e.create(t,n))),this.frontier.push({type:e,match:e.contentMatch})}closeFrontierNode(){let e=this.frontier.pop().match.fillBefore(c.empty,!0);e.childCount&&(this.placed=We(this.placed,this.frontier.length,e))}}function Ue(e,t,n){return 0==t?e.cutByIndex(n,e.childCount):e.replaceChild(0,e.firstChild.copy(Ue(e.firstChild.content,t-1,n)))}function We(e,t,n){return 0==t?e.append(n):e.replaceChild(e.childCount-1,e.lastChild.copy(We(e.lastChild.content,t-1,n)))}function He(e,t){for(let n=0;n1&&(r=r.replaceChild(0,Je(r.firstChild,t-1,1==r.childCount?n-1:0))),t>0&&(r=e.type.contentMatch.fillBefore(r).append(r),n<=0&&(r=r.append(e.type.contentMatch.matchFragment(r).fillBefore(c.empty,!0)))),e.copy(r)}function Ke(e,t,n,r,i){let o=e.node(t),s=i?e.indexAfter(t):e.index(t);if(s==o.childCount&&!n.compatibleContent(o.type))return null;let l=r.fillBefore(o.content,!0,s);return l&&!function(e,t,n){for(let r=n;rr){let t=i.contentMatchAt(0),n=t.fillBefore(e).append(e);e=n.append(t.matchFragment(n).fillBefore(c.empty,!0))}return e}function Ze(e,t){let n=[];for(let r=Math.min(e.depth,t.depth);r>=0;r--){let i=e.start(r);if(it.pos+(t.depth-r)||e.node(r).type.spec.isolating||t.node(r).type.spec.isolating)break;(i==t.start(r)||r==e.depth&&r==t.depth&&e.parent.inlineContent&&t.parent.inlineContent&&r&&t.start(r-1)==i-1)&&n.push(r)}return n}class Ye extends xe{constructor(e,t,n){super(),this.pos=e,this.attr=t,this.value=n}apply(e){let t=e.nodeAt(this.pos);if(!t)return Ce.fail("No node at attribute step's position");let n=Object.create(null);for(let e in t.attrs)n[e]=t.attrs[e];n[this.attr]=this.value;let r=t.type.create(n,null,t.marks);return Ce.fromReplace(e,this.pos,this.pos+1,new m(c.from(r),0,t.isLeaf?0:1))}getMap(){return be.empty}invert(e){return new Ye(this.pos,this.attr,e.nodeAt(this.pos).attrs[this.attr])}map(e){let t=e.mapResult(this.pos,1);return t.deletedAfter?null:new Ye(t.pos,this.attr,this.value)}toJSON(){return{stepType:"attr",pos:this.pos,attr:this.attr,value:this.value}}static fromJSON(e,t){if("number"!=typeof t.pos||"string"!=typeof t.attr)throw new RangeError("Invalid input for AttrStep.fromJSON");return new Ye(t.pos,t.attr,t.value)}}xe.jsonID("attr",Ye);class Qe extends xe{constructor(e,t){super(),this.attr=e,this.value=t}apply(e){let t=Object.create(null);for(let n in e.attrs)t[n]=e.attrs[n];t[this.attr]=this.value;let n=e.type.create(t,e.content,e.marks);return Ce.ok(n)}getMap(){return be.empty}invert(e){return new Qe(this.attr,e.attrs[this.attr])}map(e){return this}toJSON(){return{stepType:"docAttr",attr:this.attr,value:this.value}}static fromJSON(e,t){if("string"!=typeof t.attr)throw new RangeError("Invalid input for DocAttrStep.fromJSON");return new Qe(t.attr,t.value)}}xe.jsonID("docAttr",Qe);let Xe=class extends Error{};Xe=function e(t){let n=Error.call(this,t);return n.__proto__=e.prototype,n},(Xe.prototype=Object.create(Error.prototype)).constructor=Xe,Xe.prototype.name="TransformError";class et{constructor(e){this.doc=e,this.steps=[],this.docs=[],this.mapping=new ve}get before(){return this.docs.length?this.docs[0]:this.doc}step(e){let t=this.maybeStep(e);if(t.failed)throw new Xe(t.failed);return this}maybeStep(e){let t=e.apply(this.doc);return t.failed||this.addStep(e,t.doc),t}get docChanged(){return this.steps.length>0}addStep(e,t){this.docs.push(this.doc),this.steps.push(e),this.mapping.appendMap(e.getMap()),this.doc=t}replace(e,t=e,n=m.empty){let r=$e(this.doc,e,t,n);return r&&this.step(r),this}replaceWith(e,t,n){return this.replace(e,t,new m(c.from(n),0,0))}delete(e,t){return this.replace(e,t,m.empty)}insert(e,t){return this.replaceWith(e,e,t)}replaceRange(e,t,n){return function(e,t,n,r){if(!r.size)return e.deleteRange(t,n);let i=e.doc.resolve(t),o=e.doc.resolve(n);if(Ve(i,o,r))return e.step(new Me(t,n,r));let s=Ze(i,e.doc.resolve(n));0==s[s.length-1]&&s.pop();let l=-(i.depth+1);s.unshift(l);for(let e=i.depth,t=i.pos-1;e>0;e--,t--){let n=i.node(e).type.spec;if(n.defining||n.definingAsContext||n.isolating)break;s.indexOf(e)>-1?l=e:i.before(e)==t&&s.splice(1,0,-e)}let a=s.indexOf(l),c=[],h=r.openStart;for(let e=r.content,t=0;;t++){let n=e.firstChild;if(c.push(n),t==r.openStart)break;e=n.content}for(let e=h-1;e>=0;e--){let t=c[e],n=(u=t.type).spec.defining||u.spec.definingForContent;if(n&&!t.sameMarkup(i.node(Math.abs(l)-1)))h=e;else if(n||!t.type.isTextblock)break}var u;for(let t=r.openStart;t>=0;t--){let l=(t+h+1)%(r.openStart+1),u=c[l];if(u)for(let t=0;t=0&&(e.replace(t,n,r),!(e.steps.length>d));l--){let e=s[l];e<0||(t=i.before(e),n=o.after(e))}}(this,e,t,n),this}replaceRangeWith(e,t,n){return function(e,t,n,r){if(!r.isInline&&t==n&&e.doc.resolve(t).parent.content.size){let i=function(e,t,n){let r=e.resolve(t);if(r.parent.canReplaceWith(r.index(),r.index(),n))return t;if(0==r.parentOffset)for(let e=r.depth-1;e>=0;e--){let t=r.index(e);if(r.node(e).canReplaceWith(t,t,n))return r.before(e+1);if(t>0)return null}if(r.parentOffset==r.parent.content.size)for(let e=r.depth-1;e>=0;e--){let t=r.indexAfter(e);if(r.node(e).canReplaceWith(t,t,n))return r.after(e+1);if(t0&&(s||r.node(n-1).canReplace(r.index(n-1),i.indexAfter(n-1))))return e.delete(r.before(n),i.after(n))}for(let o=1;o<=r.depth&&o<=i.depth;o++)if(t-r.start(o)==r.depth-o&&n>r.end(o)&&i.end(o)-n!=i.depth-o&&r.start(o-1)==i.start(o-1)&&r.node(o-1).canReplace(r.index(o-1),i.index(o-1)))return e.delete(r.before(o),n);e.delete(t,n)}(this,e,t),this}lift(e,t){return function(e,t,n){let{$from:r,$to:i,depth:o}=t,s=r.before(o+1),l=i.after(o+1),a=s,h=l,u=c.empty,d=0;for(let e=o,t=!1;e>n;e--)t||r.index(e)>0?(t=!0,u=c.from(r.node(e).copy(u)),d++):a--;let p=c.empty,f=0;for(let e=o,t=!1;e>n;e--)t||i.after(e+1)=0;e--){if(r.size){let t=n[e].type.contentMatch.matchFragment(r);if(!t||!t.validEnd)throw new RangeError("Wrapper type given to Transform.wrap does not form valid content of its parent wrapper")}r=c.from(n[e].type.create(n[e].attrs,r))}let i=t.start,o=t.end;e.step(new Oe(i,o,i,o,new m(r,0,0),n.length,!0))}(this,e,t),this}setBlockType(e,t=e,n,r=null){return function(e,t,n,r,i){if(!r.isTextblock)throw new RangeError("Type given to setBlockType should be a textblock");let o=e.steps.length;e.doc.nodesBetween(t,n,((t,n)=>{let s="function"==typeof i?i(t):i;if(t.isTextblock&&!t.hasMarkup(r,s)&&function(e,t,n){let r=e.resolve(t),i=r.index();return r.parent.canReplaceWith(i,i+1,n)}(e.doc,e.mapping.slice(o).map(n),r)){let i=null;if(r.schema.linebreakReplacement){let e="pre"==r.whitespace,t=!!r.contentMatch.matchType(r.schema.linebreakReplacement);e&&!t?i=!1:!e&&t&&(i=!0)}!1===i&&ze(e,t,n,o),Ne(e,e.mapping.slice(o).map(n,1),r,void 0,null===i);let l=e.mapping.slice(o),a=l.map(n,1),h=l.map(n+t.nodeSize,1);return e.step(new Oe(a,h,a+1,h-1,new m(c.from(r.create(s,null,t.marks)),0,0),1,!0)),!0===i&&Be(e,t,n,o),!1}}))}(this,e,t,n,r),this}setNodeMarkup(e,t,n=null,r){return function(e,t,n,r,i){let o=e.doc.nodeAt(t);if(!o)throw new RangeError("No node at given position");n||(n=o.type);let s=n.create(r,null,i||o.marks);if(o.isLeaf)return e.replaceWith(t,t+o.nodeSize,s);if(!n.validContent(o.content))throw new RangeError("Invalid content for node type "+n.name);e.step(new Oe(t,t+o.nodeSize,t+1,t+o.nodeSize-1,new m(c.from(s),0,0),1,!0))}(this,e,t,n,r),this}setNodeAttribute(e,t,n){return this.step(new Ye(e,t,n)),this}setDocAttribute(e,t){return this.step(new Qe(e,t)),this}addNodeMark(e,t){return this.step(new Ee(e,t)),this}removeNodeMark(e,t){let n=this.doc.nodeAt(e);if(!n)throw new RangeError("No node at position "+e);if(t instanceof p)t.isInSet(n.marks)&&this.step(new Ae(e,t));else{let r,i=n.marks,o=[];for(;r=t.isInSet(i);)o.push(new Ae(e,r)),i=r.removeFromSet(i);for(let e=o.length-1;e>=0;e--)this.step(o[e])}return this}split(e,t=1,n){return function(e,t,n=1,r){let i=e.doc.resolve(t),o=c.empty,s=c.empty;for(let e=i.depth,t=i.depth-n,l=n-1;e>t;e--,l--){o=c.from(i.node(e).copy(o));let t=r&&r[l];s=c.from(t?t.type.create(t.attrs,s):i.node(e).copy(s))}e.step(new Me(t,t,new m(o.append(s),n,n),!0))}(this,e,t,n),this}addMark(e,t,n){return function(e,t,n,r){let i,o,s=[],l=[];e.doc.nodesBetween(t,n,((e,a,c)=>{if(!e.isInline)return;let h=e.marks;if(!r.isInSet(h)&&c.type.allowsMarkType(r.type)){let c=Math.max(a,t),u=Math.min(a+e.nodeSize,n),d=r.addToSet(h);for(let e=0;ee.step(t))),l.forEach((t=>e.step(t)))}(this,e,t,n),this}removeMark(e,t,n){return function(e,t,n,r){let i=[],o=0;e.doc.nodesBetween(t,n,((e,s)=>{if(!e.isInline)return;o++;let l=null;if(r instanceof Y){let t,n=e.marks;for(;t=r.isInSet(n);)(l||(l=[])).push(t),n=t.removeFromSet(n)}else r?r.isInSet(e.marks)&&(l=[r]):l=e.marks;if(l&&l.length){let r=Math.min(s+e.nodeSize,n);for(let e=0;ee.step(new _e(t.from,t.to,t.style))))}(this,e,t,n),this}clearIncompatible(e,t,n){return Ne(this,e,t,n),this}}const tt=Object.create(null);class nt{constructor(e,t,n){this.$anchor=e,this.$head=t,this.ranges=n||[new rt(e.min(t),e.max(t))]}get anchor(){return this.$anchor.pos}get head(){return this.$head.pos}get from(){return this.$from.pos}get to(){return this.$to.pos}get $from(){return this.ranges[0].$from}get $to(){return this.ranges[0].$to}get empty(){let e=this.ranges;for(let t=0;t=0;r--){let i=t<0?dt(e.node(0),e.node(r),e.before(r+1),e.index(r),t,n):dt(e.node(0),e.node(r),e.after(r+1),e.index(r)+1,t,n);if(i)return i}return null}static near(e,t=1){return this.findFrom(e,t)||this.findFrom(e,-t)||new ht(e.node(0))}static atStart(e){return dt(e,e,0,0,1)||new ht(e)}static atEnd(e){return dt(e,e,e.content.size,e.childCount,-1)||new ht(e)}static fromJSON(e,t){if(!t||!t.type)throw new RangeError("Invalid input for Selection.fromJSON");let n=tt[t.type];if(!n)throw new RangeError(`No selection type ${t.type} defined`);return n.fromJSON(e,t)}static jsonID(e,t){if(e in tt)throw new RangeError("Duplicate use of selection JSON ID "+e);return tt[e]=t,t.prototype.jsonID=e,t}getBookmark(){return st.between(this.$anchor,this.$head).getBookmark()}}nt.prototype.visible=!0;class rt{constructor(e,t){this.$from=e,this.$to=t}}let it=!1;function ot(e){it||e.parent.inlineContent||(it=!0,console.warn("TextSelection endpoint not pointing into a node with inline content ("+e.parent.type.name+")"))}class st extends nt{constructor(e,t=e){ot(e),ot(t),super(e,t)}get $cursor(){return this.$anchor.pos==this.$head.pos?this.$head:null}map(e,t){let n=e.resolve(t.map(this.head));if(!n.parent.inlineContent)return nt.near(n);let r=e.resolve(t.map(this.anchor));return new st(r.parent.inlineContent?r:n,n)}replace(e,t=m.empty){if(super.replace(e,t),t==m.empty){let t=this.$from.marksAcross(this.$to);t&&e.ensureMarks(t)}}eq(e){return e instanceof st&&e.anchor==this.anchor&&e.head==this.head}getBookmark(){return new lt(this.anchor,this.head)}toJSON(){return{type:"text",anchor:this.anchor,head:this.head}}static fromJSON(e,t){if("number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid input for TextSelection.fromJSON");return new st(e.resolve(t.anchor),e.resolve(t.head))}static create(e,t,n=t){let r=e.resolve(t);return new this(r,n==t?r:e.resolve(n))}static between(e,t,n){let r=e.pos-t.pos;if(n&&!r||(n=r>=0?1:-1),!t.parent.inlineContent){let e=nt.findFrom(t,n,!0)||nt.findFrom(t,-n,!0);if(!e)return nt.near(t,n);t=e.$head}return e.parent.inlineContent||(0==r||(e=(nt.findFrom(e,-n,!0)||nt.findFrom(e,n,!0)).$anchor).posnew ht(e)};function dt(e,t,n,r,i,o=!1){if(t.inlineContent)return st.create(e,n);for(let s=r-(i>0?0:1);i>0?s=0;s+=i){let r=t.child(s);if(r.isAtom){if(!o&&at.isSelectable(r))return at.create(e,n-(i<0?r.nodeSize:0))}else{let t=dt(e,r,n+i,i<0?r.childCount:0,i,o);if(t)return t}n+=r.nodeSize*i}return null}function pt(e,t,n){let r=e.steps.length-1;if(r{null==i&&(i=r)})),e.setSelection(nt.near(e.doc.resolve(i),n)))}class ft extends et{constructor(e){super(e.doc),this.curSelectionFor=0,this.updated=0,this.meta=Object.create(null),this.time=Date.now(),this.curSelection=e.selection,this.storedMarks=e.storedMarks}get selection(){return this.curSelectionFor0}setStoredMarks(e){return this.storedMarks=e,this.updated|=2,this}ensureMarks(e){return p.sameSet(this.storedMarks||this.selection.$from.marks(),e)||this.setStoredMarks(e),this}addStoredMark(e){return this.ensureMarks(e.addToSet(this.storedMarks||this.selection.$head.marks()))}removeStoredMark(e){return this.ensureMarks(e.removeFromSet(this.storedMarks||this.selection.$head.marks()))}get storedMarksSet(){return(2&this.updated)>0}addStep(e,t){super.addStep(e,t),this.updated=-3&this.updated,this.storedMarks=null}setTime(e){return this.time=e,this}replaceSelection(e){return this.selection.replace(this,e),this}replaceSelectionWith(e,t=!0){let n=this.selection;return t&&(e=e.mark(this.storedMarks||(n.empty?n.$from.marks():n.$from.marksAcross(n.$to)||p.none))),n.replaceWith(this,e),this}deleteSelection(){return this.selection.replace(this),this}insertText(e,t,n){let r=this.doc.type.schema;if(null==t)return e?this.replaceSelectionWith(r.text(e),!0):this.deleteSelection();{if(null==n&&(n=t),n=null==n?t:n,!e)return this.deleteRange(t,n);let i=this.storedMarks;if(!i){let e=this.doc.resolve(t);i=n==t?e.marks():e.marksAcross(this.doc.resolve(n))}return this.replaceRangeWith(t,n,r.text(e,i)),this.selection.empty||this.setSelection(nt.near(this.selection.$to)),this}}setMeta(e,t){return this.meta["string"==typeof e?e:e.key]=t,this}getMeta(e){return this.meta["string"==typeof e?e:e.key]}get isGeneric(){for(let e in this.meta)return!1;return!0}scrollIntoView(){return this.updated|=4,this}get scrolledIntoView(){return(4&this.updated)>0}}function mt(e,t){return t&&e?e.bind(t):e}class gt{constructor(e,t,n){this.name=e,this.init=mt(t.init,n),this.apply=mt(t.apply,n)}}const yt=[new gt("doc",{init:e=>e.doc||e.schema.topNodeType.createAndFill(),apply:e=>e.doc}),new gt("selection",{init:(e,t)=>e.selection||nt.atStart(t.doc),apply:e=>e.selection}),new gt("storedMarks",{init:e=>e.storedMarks||null,apply:(e,t,n,r)=>r.selection.$cursor?e.storedMarks:null}),new gt("scrollToSelection",{init:()=>0,apply:(e,t)=>e.scrolledIntoView?t+1:t})];class kt{constructor(e,t){this.schema=e,this.plugins=[],this.pluginsByKey=Object.create(null),this.fields=yt.slice(),t&&t.forEach((e=>{if(this.pluginsByKey[e.key])throw new RangeError("Adding different instances of a keyed plugin ("+e.key+")");this.plugins.push(e),this.pluginsByKey[e.key]=e,e.spec.state&&this.fields.push(new gt(e.key,e.spec.state,e))}))}}class bt{constructor(e){this.config=e}get schema(){return this.config.schema}get plugins(){return this.config.plugins}apply(e){return this.applyTransaction(e).state}filterTransaction(e,t=-1){for(let n=0;ne.toJSON()))),e&&"object"==typeof e)for(let n in e){if("doc"==n||"selection"==n)throw new RangeError("The JSON fields `doc` and `selection` are reserved");let r=e[n],i=r.spec.state;i&&i.toJSON&&(t[n]=i.toJSON.call(r,this[r.key]))}return t}static fromJSON(e,t,n){if(!t)throw new RangeError("Invalid input for EditorState.fromJSON");if(!e.schema)throw new RangeError("Required config field 'schema' missing");let r=new kt(e.schema,e.plugins),i=new bt(r);return r.fields.forEach((r=>{if("doc"==r.name)i.doc=F.fromJSON(e.schema,t.doc);else if("selection"==r.name)i.selection=nt.fromJSON(i.doc,t.selection);else if("storedMarks"==r.name)t.storedMarks&&(i.storedMarks=t.storedMarks.map(e.schema.markFromJSON));else{if(n)for(let o in n){let s=n[o],l=s.spec.state;if(s.key==r.name&&l&&l.fromJSON&&Object.prototype.hasOwnProperty.call(t,o))return void(i[r.name]=l.fromJSON.call(s,e,t[o],i))}i[r.name]=r.init(e,i)}})),i}}function vt(e,t,n){for(let r in e){let i=e[r];i instanceof Function?i=i.bind(t):"handleDOMEvents"==r&&(i=vt(i,t,{})),n[r]=i}return n}class wt{constructor(e){this.spec=e,this.props={},e.props&&vt(e.props,this,this.props),this.key=e.key?e.key.key:Ct("plugin")}getState(e){return e[this.key]}}const xt=Object.create(null);function Ct(e){return e in xt?e+"$"+ ++xt[e]:(xt[e]=0,e+"$")}class Dt{constructor(e="key"){this.key=Ct(e)}get(e){return e.config.pluginsByKey[this.key]}getState(e){return e[this.key]}}const St=function(e){for(var t=0;;t++)if(!(e=e.previousSibling))return t},_t=function(e){let t=e.assignedSlot||e.parentNode;return t&&11==t.nodeType?t.host:t};let Et=null;const At=function(e,t,n){let r=Et||(Et=document.createRange());return r.setEnd(e,null==n?e.nodeValue.length:n),r.setStart(e,t||0),r},Mt=function(e,t,n,r){return n&&(Tt(e,t,n,r,-1)||Tt(e,t,n,r,1))},Ot=/^(img|br|input|textarea|hr)$/i;function Tt(e,t,n,r,i){for(;;){if(e==n&&t==r)return!0;if(t==(i<0?0:Nt(e))){let n=e.parentNode;if(!n||1!=n.nodeType||Ft(e)||Ot.test(e.nodeName)||"false"==e.contentEditable)return!1;t=St(e)+(i<0?0:1),e=n}else{if(1!=e.nodeType)return!1;if("false"==(e=e.childNodes[t+(i<0?-1:0)]).contentEditable)return!1;t=i<0?Nt(e):0}}}function Nt(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function Ft(e){let t;for(let n=e;n&&!(t=n.pmViewDesc);n=n.parentNode);return t&&t.node&&t.node.isBlock&&(t.dom==e||t.contentDOM==e)}const It=function(e){return e.focusNode&&Mt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)};function Rt(e,t){let n=document.createEvent("Event");return n.initEvent("keydown",!0,!0),n.keyCode=e,n.key=n.code=t,n}const Bt="undefined"!=typeof navigator?navigator:null,zt="undefined"!=typeof document?document:null,Lt=Bt&&Bt.userAgent||"",Pt=/Edge\/(\d+)/.exec(Lt),qt=/MSIE \d/.exec(Lt),$t=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Lt),Vt=!!(qt||$t||Pt),jt=qt?document.documentMode:$t?+$t[1]:Pt?+Pt[1]:0,Ut=!Vt&&/gecko\/(\d+)/i.test(Lt);Ut&&(/Firefox\/(\d+)/.exec(Lt)||[0,0])[1];const Wt=!Vt&&/Chrome\/(\d+)/.exec(Lt),Ht=!!Wt,Jt=Wt?+Wt[1]:0,Kt=!Vt&&!!Bt&&/Apple Computer/.test(Bt.vendor),Gt=Kt&&(/Mobile\/\w+/.test(Lt)||!!Bt&&Bt.maxTouchPoints>2),Zt=Gt||!!Bt&&/Mac/.test(Bt.platform),Yt=!!Bt&&/Win/.test(Bt.platform),Qt=/Android \d/.test(Lt),Xt=!!zt&&"webkitFontSmoothing"in zt.documentElement.style,en=Xt?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0;function tn(e){let t=e.defaultView&&e.defaultView.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:e.documentElement.clientWidth,top:0,bottom:e.documentElement.clientHeight}}function nn(e,t){return"number"==typeof e?e:e[t]}function rn(e){let t=e.getBoundingClientRect(),n=t.width/e.offsetWidth||1,r=t.height/e.offsetHeight||1;return{left:t.left,right:t.left+e.clientWidth*n,top:t.top,bottom:t.top+e.clientHeight*r}}function on(e,t,n){let r=e.someProp("scrollThreshold")||0,i=e.someProp("scrollMargin")||5,o=e.dom.ownerDocument;for(let s=n||e.dom;s;){if(1!=s.nodeType){s=_t(s);continue}let e=s,n=e==o.body,l=n?tn(o):rn(e),a=0,c=0;if(t.topl.bottom-nn(r,"bottom")&&(c=t.bottom-t.top>l.bottom-l.top?t.top+nn(i,"top")-l.top:t.bottom-l.bottom+nn(i,"bottom")),t.leftl.right-nn(r,"right")&&(a=t.right-l.right+nn(i,"right")),a||c)if(n)o.defaultView.scrollBy(a,c);else{let n=e.scrollLeft,r=e.scrollTop;c&&(e.scrollTop+=c),a&&(e.scrollLeft+=a);let i=e.scrollLeft-n,o=e.scrollTop-r;t={left:t.left-i,top:t.top-o,right:t.right-i,bottom:t.bottom-o}}let h=n?"fixed":getComputedStyle(s).position;if(/^(fixed|sticky)$/.test(h))break;s="absolute"==h?s.offsetParent:_t(s)}}function sn(e){let t=[],n=e.ownerDocument;for(let r=e;r&&(t.push({dom:r,top:r.scrollTop,left:r.scrollLeft}),e!=n);r=_t(r));return t}function ln(e,t){for(let n=0;n=c){a=Math.max(p.bottom,a),c=Math.min(p.top,c);let e=p.left>t.left?p.left-t.left:p.right=(p.left+p.right)/2?1:0));continue}}else p.top>t.top&&!i&&p.left<=t.left&&p.right>=t.left&&(i=h,o={left:Math.max(p.left,Math.min(p.right,t.left)),top:p.top});!n&&(t.left>=p.right&&t.top>=p.top||t.left>=p.left&&t.top>=p.bottom)&&(l=u+1)}}return!n&&i&&(n=i,r=o,s=0),n&&3==n.nodeType?function(e,t){let n=e.nodeValue.length,r=document.createRange();for(let i=0;i=(n.left+n.right)/2?1:0)}}return{node:e,offset:0}}(n,r):!n||s&&1==n.nodeType?{node:e,offset:l}:cn(n,r)}function hn(e,t){return e.left>=t.left-1&&e.left<=t.right+1&&e.top>=t.top-1&&e.top<=t.bottom+1}function un(e,t,n){let r=e.childNodes.length;if(r&&n.topt.top&&i++}let r;Xt&&i&&1==n.nodeType&&1==(r=n.childNodes[i-1]).nodeType&&"false"==r.contentEditable&&r.getBoundingClientRect().top>=t.top&&i--,n==e.dom&&i==n.childNodes.length-1&&1==n.lastChild.nodeType&&t.top>n.lastChild.getBoundingClientRect().bottom?s=e.state.doc.content.size:0!=i&&1==n.nodeType&&"BR"==n.childNodes[i-1].nodeName||(s=function(e,t,n,r){let i=-1;for(let n=t,o=!1;n!=e.dom;){let t,s=e.docView.nearestDesc(n,!0);if(!s)return null;if(1==s.dom.nodeType&&(s.node.isBlock&&s.parent||!s.contentDOM)&&((t=s.dom.getBoundingClientRect()).width||t.height)&&(s.node.isBlock&&s.parent&&(!o&&t.left>r.left||t.top>r.top?i=s.posBefore:(!o&&t.right-1?i:e.docView.posFromDOM(t,n,-1)}(e,n,i,t))}null==s&&(s=function(e,t,n){let{node:r,offset:i}=cn(t,n),o=-1;if(1==r.nodeType&&!r.firstChild){let e=r.getBoundingClientRect();o=e.left!=e.right&&n.left>(e.left+e.right)/2?1:-1}return e.docView.posFromDOM(r,i,o)}(e,l,t));let a=e.docView.nearestDesc(l,!0);return{pos:s,inside:a?a.posAtStart-a.border:-1}}function pn(e){return e.top=0&&i==r.nodeValue.length?(e--,o=1):n<0?e--:t++,yn(fn(At(r,e,t),o),o<0)}{let e=fn(At(r,i,i),n);if(Ut&&i&&/\s/.test(r.nodeValue[i-1])&&i=0)}if(null==o&&i&&(n<0||i==Nt(r))){let e=r.childNodes[i-1],t=3==e.nodeType?At(e,Nt(e)-(s?0:1)):1!=e.nodeType||"BR"==e.nodeName&&e.nextSibling?null:e;if(t)return yn(fn(t,1),!1)}if(null==o&&i=0)}function yn(e,t){if(0==e.width)return e;let n=t?e.left:e.right;return{top:e.top,bottom:e.bottom,left:n,right:n}}function kn(e,t){if(0==e.height)return e;let n=t?e.top:e.bottom;return{top:n,bottom:n,left:e.left,right:e.right}}function bn(e,t,n){let r=e.state,i=e.root.activeElement;r!=t&&e.updateState(t),i!=e.dom&&e.focus();try{return n()}finally{r!=t&&e.updateState(r),i!=e.dom&&i&&i.focus()}}const vn=/[\u0590-\u08ac]/;let wn=null,xn=null,Cn=!1;function Dn(e,t,n){return wn==t&&xn==n?Cn:(wn=t,xn=n,Cn="up"==n||"down"==n?function(e,t,n){let r=t.selection,i="up"==n?r.$from:r.$to;return bn(e,t,(()=>{let{node:t}=e.docView.domFromPos(i.pos,"up"==n?-1:1);for(;;){let n=e.docView.nearestDesc(t,!0);if(!n)break;if(n.node.isBlock){t=n.contentDOM||n.dom;break}t=n.dom.parentNode}let r=gn(e,i.pos,1);for(let e=t.firstChild;e;e=e.nextSibling){let t;if(1==e.nodeType)t=e.getClientRects();else{if(3!=e.nodeType)continue;t=At(e,0,e.nodeValue.length).getClientRects()}for(let e=0;ei.top+1&&("up"==n?r.top-i.top>2*(i.bottom-r.top):i.bottom-r.bottom>2*(r.bottom-i.top)))return!1}}return!0}))}(e,t,n):function(e,t,n){let{$head:r}=t.selection;if(!r.parent.isTextblock)return!1;let i=r.parentOffset,o=!i,s=i==r.parent.content.size,l=e.domSelection();return l?vn.test(r.parent.textContent)&&l.modify?bn(e,t,(()=>{let{focusNode:t,focusOffset:i,anchorNode:o,anchorOffset:s}=e.domSelectionRange(),a=l.caretBidiLevel;l.modify("move",n,"character");let c=r.depth?e.docView.domAfterPos(r.before()):e.dom,{focusNode:h,focusOffset:u}=e.domSelectionRange(),d=h&&!c.contains(1==h.nodeType?h:h.parentNode)||t==h&&i==u;try{l.collapse(o,s),t&&(t!=o||i!=s)&&l.extend&&l.extend(t,i)}catch(e){}return null!=a&&(l.caretBidiLevel=a),d})):"left"==n||"backward"==n?o:s:r.pos==r.start()||r.pos==r.end()}(e,t,n))}class Sn{constructor(e,t,n,r){this.parent=e,this.children=t,this.dom=n,this.contentDOM=r,this.dirty=0,n.pmViewDesc=this}matchesWidget(e){return!1}matchesMark(e){return!1}matchesNode(e,t,n){return!1}matchesHack(e){return!1}parseRule(){return null}stopEvent(e){return!1}get size(){let e=0;for(let t=0;tSt(this.contentDOM);else if(this.contentDOM&&this.contentDOM!=this.dom&&this.dom.contains(this.contentDOM))r=2&e.compareDocumentPosition(this.contentDOM);else if(this.dom.firstChild){if(0==t)for(let t=e;;t=t.parentNode){if(t==this.dom){r=!1;break}if(t.previousSibling)break}if(null==r&&t==e.childNodes.length)for(let t=e;;t=t.parentNode){if(t==this.dom){r=!0;break}if(t.nextSibling)break}}return(null==r?n>0:r)?this.posAtEnd:this.posAtStart}nearestDesc(e,t=!1){for(let n=!0,r=e;r;r=r.parentNode){let i,o=this.getDesc(r);if(o&&(!t||o.node)){if(!n||!(i=o.nodeDOM)||(1==i.nodeType?i.contains(1==e.nodeType?e:e.parentNode):i==e))return o;n=!1}}}getDesc(e){let t=e.pmViewDesc;for(let e=t;e;e=e.parent)if(e==this)return t}posFromDOM(e,t,n){for(let r=e;r;r=r.parentNode){let i=this.getDesc(r);if(i)return i.localPosFromDOM(e,t,n)}return-1}descAt(e){for(let t=0,n=0;te||i instanceof Nn){r=e-t;break}t=o}if(r)return this.children[n].domFromPos(r-this.children[n].border,t);for(let e;n&&!(e=this.children[n-1]).size&&e instanceof _n&&e.side>=0;n--);if(t<=0){let e,r=!0;for(;e=n?this.children[n-1]:null,e&&e.dom.parentNode!=this.contentDOM;n--,r=!1);return e&&t&&r&&!e.border&&!e.domAtom?e.domFromPos(e.size,t):{node:this.contentDOM,offset:e?St(e.dom)+1:0}}{let e,r=!0;for(;e=n=i&&t<=l-n.border&&n.node&&n.contentDOM&&this.contentDOM.contains(n.contentDOM))return n.parseRange(e,t,i);e=o;for(let t=s;t>0;t--){let n=this.children[t-1];if(n.size&&n.dom.parentNode==this.contentDOM&&!n.emptyChildAt(1)){r=St(n.dom)+1;break}e-=n.size}-1==r&&(r=0)}if(r>-1&&(l>t||s==this.children.length-1)){t=l;for(let e=s+1;el&&ot){let e=s;s=l,l=e}let n=document.createRange();n.setEnd(l.node,l.offset),n.setStart(s.node,s.offset),a.removeAllRanges(),a.addRange(n)}}ignoreMutation(e){return!this.contentDOM&&"selection"!=e.type}get contentLost(){return this.contentDOM&&this.contentDOM!=this.dom&&!this.dom.contains(this.contentDOM)}markDirty(e,t){for(let n=0,r=0;r=n:en){let r=n+i.border,s=o-i.border;if(e>=r&&t<=s)return this.dirty=e==n||t==o?2:1,void(e!=r||t!=s||!i.contentLost&&i.dom.parentNode==this.contentDOM?i.markDirty(e-r,t-r):i.dirty=3);i.dirty=i.dom!=i.contentDOM||i.dom.parentNode!=this.contentDOM||i.children.length?3:2}n=o}this.dirty=2}markParentsDirty(){let e=1;for(let t=this.parent;t;t=t.parent,e++){let n=1==e?2:1;t.dirtyi?i.parent?i.parent.posBeforeChild(i):void 0:r))),!t.type.spec.raw){if(1!=o.nodeType){let e=document.createElement("span");e.appendChild(o),o=e}o.contentEditable="false",o.classList.add("ProseMirror-widget")}super(e,[],o,null),this.widget=t,this.widget=t,i=this}matchesWidget(e){return 0==this.dirty&&e.type.eq(this.widget.type)}parseRule(){return{ignore:!0}}stopEvent(e){let t=this.widget.spec.stopEvent;return!!t&&t(e)}ignoreMutation(e){return"selection"!=e.type||this.widget.spec.ignoreSelection}destroy(){this.widget.type.destroy(this.dom),super.destroy()}get domAtom(){return!0}get side(){return this.widget.type.side}}class En extends Sn{constructor(e,t,n,r){super(e,[],t,null),this.textDOM=n,this.text=r}get size(){return this.text.length}localPosFromDOM(e,t){return e!=this.textDOM?this.posAtStart+(t?this.size:0):this.posAtStart+t}domFromPos(e){return{node:this.textDOM,offset:e}}ignoreMutation(e){return"characterData"===e.type&&e.target.nodeValue==e.oldValue}}class An extends Sn{constructor(e,t,n,r,i){super(e,[],n,r),this.mark=t,this.spec=i}static create(e,t,n,r){let i=r.nodeViews[t.type.name],o=i&&i(t,r,n);return o&&o.dom||(o=he.renderSpec(document,t.type.spec.toDOM(t,n),null,t.attrs)),new An(e,t,o.dom,o.contentDOM||o.dom,o)}parseRule(){return 3&this.dirty||this.mark.type.spec.reparseInView?null:{mark:this.mark.type.name,attrs:this.mark.attrs,contentElement:this.contentDOM}}matchesMark(e){return 3!=this.dirty&&this.mark.eq(e)}markDirty(e,t){if(super.markDirty(e,t),0!=this.dirty){let e=this.parent;for(;!e.node;)e=e.parent;e.dirty0&&(i=Wn(i,0,e,n));for(let e=0;es?s.parent?s.parent.posBeforeChild(s):void 0:o),n,r),c=a&&a.dom,h=a&&a.contentDOM;if(t.isText)if(c){if(3!=c.nodeType)throw new RangeError("Text must be rendered as a DOM text node")}else c=document.createTextNode(t.text);else if(!c){let e=he.renderSpec(document,t.type.spec.toDOM(t),null,t.attrs);({dom:c,contentDOM:h}=e)}h||t.isText||"BR"==c.nodeName||(c.hasAttribute("contenteditable")||(c.contentEditable="false"),t.type.spec.draggable&&(c.draggable=!0));let u=c;return c=qn(c,n,t),a?s=new Fn(e,t,n,r,c,h||null,u,a,i,o+1):t.isText?new Tn(e,t,n,r,c,u,i):new Mn(e,t,n,r,c,h||null,u,i,o+1)}parseRule(){if(this.node.type.spec.reparseInView)return null;let e={node:this.node.type.name,attrs:this.node.attrs};if("pre"==this.node.type.whitespace&&(e.preserveWhitespace="full"),this.contentDOM)if(this.contentLost){for(let t=this.children.length-1;t>=0;t--){let n=this.children[t];if(this.dom.contains(n.dom.parentNode)){e.contentElement=n.dom.parentNode;break}}e.contentElement||(e.getContent=()=>c.empty)}else e.contentElement=this.contentDOM;else e.getContent=()=>this.node.content;return e}matchesNode(e,t,n){return 0==this.dirty&&e.eq(this.node)&&$n(t,this.outerDeco)&&n.eq(this.innerDeco)}get size(){return this.node.nodeSize}get border(){return this.node.isLeaf?0:1}updateChildren(e,t){let n=this.node.inlineContent,r=t,i=e.composing?this.localCompositionInfo(e,t):null,o=i&&i.pos>-1?i:null,s=i&&i.pos<0,l=new jn(this,o&&o.node,e);!function(e,t,n,r){let i=t.locals(e),o=0;if(0==i.length){for(let n=0;no;)l.push(i[s++]);let f=o+d.nodeSize;if(d.isText){let e=f;s!e.inline)):l.slice(),t.forChild(o,d),p),o=f}}(this.node,this.innerDeco,((t,i,o)=>{t.spec.marks?l.syncToMarks(t.spec.marks,n,e):t.type.side>=0&&!o&&l.syncToMarks(i==this.node.childCount?p.none:this.node.child(i).marks,n,e),l.placeWidget(t,e,r)}),((t,o,a,c)=>{let h;l.syncToMarks(t.marks,n,e),l.findNodeMatch(t,o,a,c)||s&&e.state.selection.from>r&&e.state.selection.to-1&&l.updateNodeAt(t,o,a,h,e)||l.updateNextNode(t,o,a,e,c,r)||l.addNode(t,o,a,e,r),r+=t.nodeSize})),l.syncToMarks([],n,e),this.node.isTextblock&&l.addTextblockHacks(),l.destroyRest(),(l.changed||2==this.dirty)&&(o&&this.protectLocalComposition(e,o),In(this.contentDOM,this.children,e),Gt&&function(e){if("UL"==e.nodeName||"OL"==e.nodeName){let t=e.style.cssText;e.style.cssText=t+"; list-style: square !important",window.getComputedStyle(e).listStyle,e.style.cssText=t}}(this.dom))}localCompositionInfo(e,t){let{from:n,to:r}=e.state.selection;if(!(e.state.selection instanceof st)||nt+this.node.content.size)return null;let i=e.input.compositionNode;if(!i||!this.dom.contains(i.parentNode))return null;if(this.node.inlineContent){let e=i.nodeValue,o=function(e,t,n,r){for(let i=0,o=0;i=n){if(o>=r&&a.slice(r-t.length-l,r-l)==t)return r-t.length;let e=l=0&&e+t.length+l>=n)return l+e;if(n==r&&a.length>=r+t.length-l&&a.slice(r-l,r-l+t.length)==t)return r}}return-1}(this.node.content,e,n-t,r-t);return o<0?null:{node:i,pos:o,text:e}}return{node:i,pos:-1,text:""}}protectLocalComposition(e,{node:t,pos:n,text:r}){if(this.getDesc(t))return;let i=t;for(;i.parentNode!=this.contentDOM;i=i.parentNode){for(;i.previousSibling;)i.parentNode.removeChild(i.previousSibling);for(;i.nextSibling;)i.parentNode.removeChild(i.nextSibling);i.pmViewDesc&&(i.pmViewDesc=void 0)}let o=new En(this,i,t,r);e.input.compositionNodes.push(o),this.children=Wn(this.children,n,n+r.length,e,o)}update(e,t,n,r){return!(3==this.dirty||!e.sameMarkup(this.node))&&(this.updateInner(e,t,n,r),!0)}updateInner(e,t,n,r){this.updateOuterDeco(t),this.node=e,this.innerDeco=n,this.contentDOM&&this.updateChildren(r,this.posAtStart),this.dirty=0}updateOuterDeco(e){if($n(e,this.outerDeco))return;let t=1!=this.nodeDOM.nodeType,n=this.dom;this.dom=Ln(this.dom,this.nodeDOM,zn(this.outerDeco,this.node,t),zn(e,this.node,t)),this.dom!=n&&(n.pmViewDesc=void 0,this.dom.pmViewDesc=this),this.outerDeco=e}selectNode(){1==this.nodeDOM.nodeType&&this.nodeDOM.classList.add("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||(this.dom.draggable=!0)}deselectNode(){1==this.nodeDOM.nodeType&&(this.nodeDOM.classList.remove("ProseMirror-selectednode"),!this.contentDOM&&this.node.type.spec.draggable||this.dom.removeAttribute("draggable"))}get domAtom(){return this.node.isAtom}}function On(e,t,n,r,i){qn(r,t,e);let o=new Mn(void 0,e,t,n,r,r,r,i,0);return o.contentDOM&&o.updateChildren(i,0),o}class Tn extends Mn{constructor(e,t,n,r,i,o,s){super(e,t,n,r,i,null,o,s,0)}parseRule(){let e=this.nodeDOM.parentNode;for(;e&&e!=this.dom&&!e.pmIsDeco;)e=e.parentNode;return{skip:e||!0}}update(e,t,n,r){return!(3==this.dirty||0!=this.dirty&&!this.inParent()||!e.sameMarkup(this.node))&&(this.updateOuterDeco(t),0==this.dirty&&e.text==this.node.text||e.text==this.nodeDOM.nodeValue||(this.nodeDOM.nodeValue=e.text,r.trackWrites==this.nodeDOM&&(r.trackWrites=null)),this.node=e,this.dirty=0,!0)}inParent(){let e=this.parent.contentDOM;for(let t=this.nodeDOM;t;t=t.parentNode)if(t==e)return!0;return!1}domFromPos(e){return{node:this.nodeDOM,offset:e}}localPosFromDOM(e,t,n){return e==this.nodeDOM?this.posAtStart+Math.min(t,this.node.text.length):super.localPosFromDOM(e,t,n)}ignoreMutation(e){return"characterData"!=e.type&&"selection"!=e.type}slice(e,t,n){let r=this.node.cut(e,t),i=document.createTextNode(r.text);return new Tn(this.parent,r,this.outerDeco,this.innerDeco,i,i,n)}markDirty(e,t){super.markDirty(e,t),this.dom==this.nodeDOM||0!=e&&t!=this.nodeDOM.nodeValue.length||(this.dirty=3)}get domAtom(){return!1}isText(e){return this.node.text==e}}class Nn extends Sn{parseRule(){return{ignore:!0}}matchesHack(e){return 0==this.dirty&&this.dom.nodeName==e}get domAtom(){return!0}get ignoreForCoords(){return"IMG"==this.dom.nodeName}}class Fn extends Mn{constructor(e,t,n,r,i,o,s,l,a,c){super(e,t,n,r,i,o,s,a,c),this.spec=l}update(e,t,n,r){if(3==this.dirty)return!1;if(this.spec.update&&(this.node.type==e.type||this.spec.multiType)){let i=this.spec.update(e,t,n);return i&&this.updateInner(e,t,n,r),i}return!(!this.contentDOM&&!e.isLeaf)&&super.update(e,t,n,r)}selectNode(){this.spec.selectNode?this.spec.selectNode():super.selectNode()}deselectNode(){this.spec.deselectNode?this.spec.deselectNode():super.deselectNode()}setSelection(e,t,n,r){this.spec.setSelection?this.spec.setSelection(e,t,n.root):super.setSelection(e,t,n,r)}destroy(){this.spec.destroy&&this.spec.destroy(),super.destroy()}stopEvent(e){return!!this.spec.stopEvent&&this.spec.stopEvent(e)}ignoreMutation(e){return this.spec.ignoreMutation?this.spec.ignoreMutation(e):super.ignoreMutation(e)}}function In(e,t,n){let r=e.firstChild,i=!1;for(let o=0;o0;){let l;for(;;)if(r){let e=n.children[r-1];if(!(e instanceof An)){l=e,r--;break}n=e,r=e.children.length}else{if(n==t)break e;r=n.parent.children.indexOf(n),n=n.parent}let a=l.node;if(a){if(a!=e.child(i-1))break;--i,o.set(l,i),s.push(l)}}return{index:i,matched:o,matches:s.reverse()}}(e.node.content,e)}destroyBetween(e,t){if(e!=t){for(let n=e;n>1,o=Math.min(i,e.length);for(;r-1)r>this.index&&(this.changed=!0,this.destroyBetween(this.index,r)),this.top=this.top.children[this.index];else{let r=An.create(this.top,e[i],t,n);this.top.children.splice(this.index,0,r),this.top=r,this.changed=!0}this.index=0,i++}}findNodeMatch(e,t,n,r){let i,o=-1;if(r>=this.preMatch.index&&(i=this.preMatch.matches[r-this.preMatch.index]).parent==this.top&&i.matchesNode(e,t,n))o=this.top.children.indexOf(i,this.index);else for(let r=this.index,i=Math.min(this.top.children.length,r+5);r=n||h<=t?o.push(a):(cn&&o.push(a.slice(n-c,a.size,r)))}return o}function Hn(e,t=null){let n=e.domSelectionRange(),r=e.state.doc;if(!n.focusNode)return null;let i=e.docView.nearestDesc(n.focusNode),o=i&&0==i.size,s=e.docView.posFromDOM(n.focusNode,n.focusOffset,1);if(s<0)return null;let l,a,c=r.resolve(s);if(It(n)){for(l=s;i&&!i.node;)i=i.parent;let e=i.node;if(i&&e.isAtom&&at.isSelectable(e)&&i.parent&&(!e.isInline||!function(e,t,n){for(let r=0==t,i=t==Nt(e);r||i;){if(e==n)return!0;let t=St(e);if(!(e=e.parentNode))return!1;r=r&&0==t,i=i&&t==Nt(e)}}(n.focusNode,n.focusOffset,i.dom))){let e=i.posBefore;a=new at(s==e?c:r.resolve(e))}}else{if(n instanceof e.dom.ownerDocument.defaultView.Selection&&n.rangeCount>1){let t=s,i=s;for(let r=0;r{n.anchorNode==r&&n.anchorOffset==i||(t.removeEventListener("selectionchange",e.input.hideSelectionGuard),setTimeout((()=>{Jn(e)&&!e.state.selection.visible||e.dom.classList.remove("ProseMirror-hideselection")}),20))})}(e))}e.domObserver.setCurSelection(),e.domObserver.connectSelection()}}const Gn=Kt||Ht&&Jt<63;function Zn(e,t){let{node:n,offset:r}=e.docView.domFromPos(t,0),i=rr(e,t,n)))||st.between(t,n,r)}function nr(e){return!(e.editable&&!e.hasFocus())&&rr(e)}function rr(e){let t=e.domSelectionRange();if(!t.anchorNode)return!1;try{return e.dom.contains(3==t.anchorNode.nodeType?t.anchorNode.parentNode:t.anchorNode)&&(e.editable||e.dom.contains(3==t.focusNode.nodeType?t.focusNode.parentNode:t.focusNode))}catch(e){return!1}}function ir(e,t){let{$anchor:n,$head:r}=e.selection,i=t>0?n.max(r):n.min(r),o=i.parent.inlineContent?i.depth?e.doc.resolve(t>0?i.after():i.before()):null:i;return o&&nt.findFrom(o,t)}function or(e,t){return e.dispatch(e.state.tr.setSelection(t).scrollIntoView()),!0}function sr(e,t,n){let r=e.state.selection;if(!(r instanceof st)){if(r instanceof at&&r.node.isInline)return or(e,new st(t>0?r.$to:r.$from));{let n=ir(e.state,t);return!!n&&or(e,n)}}if(n.indexOf("s")>-1){let{$head:n}=r,i=n.textOffset?null:t<0?n.nodeBefore:n.nodeAfter;if(!i||i.isText||!i.isLeaf)return!1;let o=e.state.doc.resolve(n.pos+i.nodeSize*(t<0?-1:1));return or(e,new st(r.$anchor,o))}if(!r.empty)return!1;if(e.endOfTextblock(t>0?"forward":"backward")){let n=ir(e.state,t);return!!(n&&n instanceof at)&&or(e,n)}if(!(Zt&&n.indexOf("m")>-1)){let n,i=r.$head,o=i.textOffset?null:t<0?i.nodeBefore:i.nodeAfter;if(!o||o.isText)return!1;let s=t<0?i.pos-o.nodeSize:i.pos;return!!(o.isAtom||(n=e.docView.descAt(s))&&!n.contentDOM)&&(at.isSelectable(o)?or(e,new at(t<0?e.state.doc.resolve(i.pos-o.nodeSize):i)):!!Xt&&or(e,new st(e.state.doc.resolve(t<0?s:s+o.nodeSize))))}}function lr(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function ar(e,t){let n=e.pmViewDesc;return n&&0==n.size&&(t<0||e.nextSibling||"BR"!=e.nodeName)}function cr(e,t){return t<0?function(e){let t=e.domSelectionRange(),n=t.focusNode,r=t.focusOffset;if(!n)return;let i,o,s=!1;Ut&&1==n.nodeType&&r0){if(1!=n.nodeType)break;{let e=n.childNodes[r-1];if(ar(e,-1))i=n,o=--r;else{if(3!=e.nodeType)break;n=e,r=n.nodeValue.length}}}else{if(hr(n))break;{let t=n.previousSibling;for(;t&&ar(t,-1);)i=n.parentNode,o=St(t),t=t.previousSibling;if(t)n=t,r=lr(n);else{if(n=n.parentNode,n==e.dom)break;r=0}}}s?ur(e,n,r):i&&ur(e,i,o)}(e):function(e){let t=e.domSelectionRange(),n=t.focusNode,r=t.focusOffset;if(!n)return;let i,o,s=lr(n);for(;;)if(r{e.state==i&&Kn(e)}),50)}function dr(e,t){let n=e.state.doc.resolve(t);if(!Ht&&!Yt&&n.parent.inlineContent){let r=e.coordsAtPos(t);if(t>n.start()){let n=e.coordsAtPos(t-1),i=(n.top+n.bottom)/2;if(i>r.top&&i1)return n.leftr.top&&i1)return n.left>r.left?"ltr":"rtl"}}return"rtl"==getComputedStyle(e.dom).direction?"rtl":"ltr"}function pr(e,t,n){let r=e.state.selection;if(r instanceof st&&!r.empty||n.indexOf("s")>-1)return!1;if(Zt&&n.indexOf("m")>-1)return!1;let{$from:i,$to:o}=r;if(!i.parent.inlineContent||e.endOfTextblock(t<0?"up":"down")){let n=ir(e.state,t);if(n&&n instanceof at)return or(e,n)}if(!i.parent.inlineContent){let n=t<0?i:o,s=r instanceof ht?nt.near(n,t):nt.findFrom(n,t);return!!s&&or(e,s)}return!1}function fr(e,t){if(!(e.state.selection instanceof st))return!0;let{$head:n,$anchor:r,empty:i}=e.state.selection;if(!n.sameParent(r))return!0;if(!i)return!1;if(e.endOfTextblock(t>0?"forward":"backward"))return!0;let o=!n.textOffset&&(t<0?n.nodeBefore:n.nodeAfter);if(o&&!o.isText){let r=e.state.tr;return t<0?r.delete(n.pos-o.nodeSize,n.pos):r.delete(n.pos,n.pos+o.nodeSize),e.dispatch(r),!0}return!1}function mr(e,t,n){e.domObserver.stop(),t.contentEditable=n,e.domObserver.start()}function gr(e,t){let n=t.keyCode,r=function(e){let t="";return e.ctrlKey&&(t+="c"),e.metaKey&&(t+="m"),e.altKey&&(t+="a"),e.shiftKey&&(t+="s"),t}(t);if(8==n||Zt&&72==n&&"c"==r)return fr(e,-1)||cr(e,-1);if(46==n&&!t.shiftKey||Zt&&68==n&&"c"==r)return fr(e,1)||cr(e,1);if(13==n||27==n)return!0;if(37==n||Zt&&66==n&&"c"==r){let t=37==n?"ltr"==dr(e,e.state.selection.from)?-1:1:-1;return sr(e,t,r)||cr(e,t)}if(39==n||Zt&&70==n&&"c"==r){let t=39==n?"ltr"==dr(e,e.state.selection.from)?1:-1:1;return sr(e,t,r)||cr(e,t)}return 38==n||Zt&&80==n&&"c"==r?pr(e,-1,r)||cr(e,-1):40==n||Zt&&78==n&&"c"==r?function(e){if(!Kt||e.state.selection.$head.parentOffset>0)return!1;let{focusNode:t,focusOffset:n}=e.domSelectionRange();if(t&&1==t.nodeType&&0==n&&t.firstChild&&"false"==t.firstChild.contentEditable){let n=t.firstChild;mr(e,n,"true"),setTimeout((()=>mr(e,n,"false")),20)}return!1}(e)||pr(e,1,r)||cr(e,1):r==(Zt?"m":"c")&&(66==n||73==n||89==n||90==n)}function yr(e,t){e.someProp("transformCopied",(n=>{t=n(t,e)}));let n=[],{content:r,openStart:i,openEnd:o}=t;for(;i>1&&o>1&&1==r.childCount&&1==r.firstChild.childCount;){i--,o--;let e=r.firstChild;n.push(e.type.name,e.attrs!=e.type.defaultAttrs?e.attrs:null),r=e.content}let s=e.someProp("clipboardSerializer")||he.fromSchema(e.state.schema),l=Er(),a=l.createElement("div");a.appendChild(s.serializeFragment(r,{document:l}));let c,h=a.firstChild,u=0;for(;h&&1==h.nodeType&&(c=Sr[h.nodeName.toLowerCase()]);){for(let e=c.length-1;e>=0;e--){let t=l.createElement(c[e]);for(;a.firstChild;)t.appendChild(a.firstChild);a.appendChild(t),u++}h=a.firstChild}return h&&1==h.nodeType&&h.setAttribute("data-pm-slice",`${i} ${o}${u?` -${u}`:""} ${JSON.stringify(n)}`),{dom:a,text:e.someProp("clipboardTextSerializer",(n=>n(t,e)))||t.content.textBetween(0,t.content.size,"\n\n"),slice:t}}function kr(e,t,n,r,i){let o,s,l=i.parent.type.spec.code;if(!n&&!t)return null;let a=t&&(r||l||!n);if(a){if(e.someProp("transformPastedText",(n=>{t=n(t,l||r,e)})),l)return t?new m(c.from(e.state.schema.text(t.replace(/\r\n?/g,"\n"))),0,0):m.empty;let n=e.someProp("clipboardTextParser",(n=>n(t,i,r,e)));if(n)s=n;else{let n=i.marks(),{schema:r}=e.state,s=he.fromSchema(r);o=document.createElement("div"),t.split(/(?:\r\n?|\n)+/).forEach((e=>{let t=o.appendChild(document.createElement("p"));e&&t.appendChild(s.serializeNode(r.text(e,n)))}))}}else e.someProp("transformPastedHTML",(t=>{n=t(n,e)})),o=function(e){let t=/^(\s*]*>)*/.exec(e);t&&(e=e.slice(t[0].length));let n,r=Er().createElement("div"),i=/<([a-z][^>\s]+)/i.exec(e);(n=i&&Sr[i[1].toLowerCase()])&&(e=n.map((e=>"<"+e+">")).join("")+e+n.map((e=>"")).reverse().join(""));if(r.innerHTML=function(e){let t=window.trustedTypes;if(!t)return e;Ar||(Ar=t.defaultPolicy||t.createPolicy("ProseMirrorClipboard",{createHTML:e=>e}));return Ar.createHTML(e)}(e),n)for(let e=0;e0;e--){let e=o.firstChild;for(;e&&1!=e.nodeType;)e=e.nextSibling;if(!e)break;o=e}if(!s){let t=e.someProp("clipboardParser")||e.someProp("domParser")||ee.fromSchema(e.state.schema);s=t.parseSlice(o,{preserveWhitespace:!(!a&&!u),context:i,ruleFromNode:e=>"BR"!=e.nodeName||e.nextSibling||!e.parentNode||br.test(e.parentNode.nodeName)?null:{ignore:!0}})}if(u)s=function(e,t){if(!e.size)return e;let n,r=e.content.firstChild.type.schema;try{n=JSON.parse(t)}catch(t){return e}let{content:i,openStart:o,openEnd:s}=e;for(let e=n.length-2;e>=0;e-=2){let t=r.nodes[n[e]];if(!t||t.hasRequiredAttrs())break;i=c.from(t.create(n[e+1],i)),o++,s++}return new m(i,o,s)}(Dr(s,+u[1],+u[2]),u[4]);else if(s=m.maxOpen(function(e,t){if(e.childCount<2)return e;for(let n=t.depth;n>=0;n--){let r,i=t.node(n).contentMatchAt(t.index(n)),o=[];if(e.forEach((e=>{if(!o)return;let t,n=i.findWrapping(e.type);if(!n)return o=null;if(t=o.length&&r.length&&wr(n,r,e,o[o.length-1],0))o[o.length-1]=t;else{o.length&&(o[o.length-1]=xr(o[o.length-1],r.length));let t=vr(e,n);o.push(t),i=i.matchType(t.type),r=n}})),o)return c.from(o)}return e}(s.content,i),!0),s.openStart||s.openEnd){let e=0,t=0;for(let t=s.content.firstChild;e{s=t(s,e)})),s}const br=/^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;function vr(e,t,n=0){for(let r=t.length-1;r>=n;r--)e=t[r].create(null,c.from(e));return e}function wr(e,t,n,r,i){if(i1&&(o=0),i=n&&(l=t<0?s.contentMatchAt(0).fillBefore(l,o<=i).append(l):l.append(s.contentMatchAt(s.childCount).fillBefore(c.empty,!0))),e.replaceChild(t<0?0:e.childCount-1,s.copy(l))}function Dr(e,t,n){return t{for(let n in t)e.input.eventHandlers[n]||e.dom.addEventListener(n,e.input.eventHandlers[n]=t=>Rr(e,t))}))}function Rr(e,t){return e.someProp("handleDOMEvents",(n=>{let r=n[t.type];return!!r&&(r(e,t)||t.defaultPrevented)}))}function Br(e,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let n=t.target;n!=e.dom;n=n.parentNode)if(!n||11==n.nodeType||n.pmViewDesc&&n.pmViewDesc.stopEvent(t))return!1;return!0}function zr(e){return{left:e.clientX,top:e.clientY}}function Lr(e,t,n,r,i){if(-1==r)return!1;let o=e.state.doc.resolve(r);for(let r=o.depth+1;r>0;r--)if(e.someProp(t,(t=>r>o.depth?t(e,n,o.nodeAfter,o.before(r),i,!0):t(e,n,o.node(r),o.before(r),i,!1))))return!0;return!1}function Pr(e,t,n){if(e.focused||e.focus(),e.state.selection.eq(t))return;let r=e.state.tr.setSelection(t);"pointer"==n&&r.setMeta("pointer",!0),e.dispatch(r)}function qr(e,t,n,r,i){return Lr(e,"handleClickOn",t,n,r)||e.someProp("handleClick",(n=>n(e,t,r)))||(i?function(e,t){if(-1==t)return!1;let n,r,i=e.state.selection;i instanceof at&&(n=i.node);let o=e.state.doc.resolve(t);for(let e=o.depth+1;e>0;e--){let t=e>o.depth?o.nodeAfter:o.node(e);if(at.isSelectable(t)){r=n&&i.$from.depth>0&&e>=i.$from.depth&&o.before(i.$from.depth+1)==i.$from.pos?o.before(i.$from.depth):o.before(e);break}}return null!=r&&(Pr(e,at.create(e.state.doc,r),"pointer"),!0)}(e,n):function(e,t){if(-1==t)return!1;let n=e.state.doc.resolve(t),r=n.nodeAfter;return!!(r&&r.isAtom&&at.isSelectable(r))&&(Pr(e,new at(n),"pointer"),!0)}(e,n))}function $r(e,t,n,r){return Lr(e,"handleDoubleClickOn",t,n,r)||e.someProp("handleDoubleClick",(n=>n(e,t,r)))}function Vr(e,t,n,r){return Lr(e,"handleTripleClickOn",t,n,r)||e.someProp("handleTripleClick",(n=>n(e,t,r)))||function(e,t,n){if(0!=n.button)return!1;let r=e.state.doc;if(-1==t)return!!r.inlineContent&&(Pr(e,st.create(r,0,r.content.size),"pointer"),!0);let i=r.resolve(t);for(let t=i.depth+1;t>0;t--){let n=t>i.depth?i.nodeAfter:i.node(t),o=i.before(t);if(n.inlineContent)Pr(e,st.create(r,o+1,o+1+n.content.size),"pointer");else{if(!at.isSelectable(n))continue;Pr(e,at.create(r,o),"pointer")}return!0}}(e,n,r)}function jr(e){return Yr(e)}Or.keydown=(e,t)=>{let n=t;if(e.input.shiftKey=16==n.keyCode||n.shiftKey,!Hr(e,n)&&(e.input.lastKeyCode=n.keyCode,e.input.lastKeyCodeTime=Date.now(),!Qt||!Ht||13!=n.keyCode))if(229!=n.keyCode&&e.domObserver.forceFlush(),!Gt||13!=n.keyCode||n.ctrlKey||n.altKey||n.metaKey)e.someProp("handleKeyDown",(t=>t(e,n)))||gr(e,n)?n.preventDefault():Fr(e,"key");else{let t=Date.now();e.input.lastIOSEnter=t,e.input.lastIOSEnterFallbackTimeout=setTimeout((()=>{e.input.lastIOSEnter==t&&(e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))),e.input.lastIOSEnter=0)}),200)}},Or.keyup=(e,t)=>{16==t.keyCode&&(e.input.shiftKey=!1)},Or.keypress=(e,t)=>{let n=t;if(Hr(e,n)||!n.charCode||n.ctrlKey&&!n.altKey||Zt&&n.metaKey)return;if(e.someProp("handleKeyPress",(t=>t(e,n))))return void n.preventDefault();let r=e.state.selection;if(!(r instanceof st&&r.$from.sameParent(r.$to))){let t=String.fromCharCode(n.charCode);/[\r\n]/.test(t)||e.someProp("handleTextInput",(n=>n(e,r.$from.pos,r.$to.pos,t)))||e.dispatch(e.state.tr.insertText(t).scrollIntoView()),n.preventDefault()}};const Ur=Zt?"metaKey":"ctrlKey";Mr.mousedown=(e,t)=>{let n=t;e.input.shiftKey=n.shiftKey;let r=jr(e),i=Date.now(),o="singleClick";i-e.input.lastClick.time<500&&function(e,t){let n=t.x-e.clientX,r=t.y-e.clientY;return n*n+r*r<100}(n,e.input.lastClick)&&!n[Ur]&&e.input.lastClick.button==n.button&&("singleClick"==e.input.lastClick.type?o="doubleClick":"doubleClick"==e.input.lastClick.type&&(o="tripleClick")),e.input.lastClick={time:i,x:n.clientX,y:n.clientY,type:o,button:n.button};let s=e.posAtCoords(zr(n));s&&("singleClick"==o?(e.input.mouseDown&&e.input.mouseDown.done(),e.input.mouseDown=new Wr(e,s,n,!!r)):("doubleClick"==o?$r:Vr)(e,s.pos,s.inside,n)?n.preventDefault():Fr(e,"pointer"))};class Wr{constructor(e,t,n,r){let i,o;if(this.view=e,this.pos=t,this.event=n,this.flushed=r,this.delayedSelectionSync=!1,this.mightDrag=null,this.startDoc=e.state.doc,this.selectNode=!!n[Ur],this.allowDefault=n.shiftKey,t.inside>-1)i=e.state.doc.nodeAt(t.inside),o=t.inside;else{let n=e.state.doc.resolve(t.pos);i=n.parent,o=n.depth?n.before():0}const s=r?null:n.target,l=s?e.docView.nearestDesc(s,!0):null;this.target=l&&1==l.dom.nodeType?l.dom:null;let{selection:a}=e.state;(0==n.button&&i.type.spec.draggable&&!1!==i.type.spec.selectable||a instanceof at&&a.from<=o&&a.to>o)&&(this.mightDrag={node:i,pos:o,addAttr:!(!this.target||this.target.draggable),setUneditable:!(!this.target||!Ut||this.target.hasAttribute("contentEditable"))}),this.target&&this.mightDrag&&(this.mightDrag.addAttr||this.mightDrag.setUneditable)&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&(this.target.draggable=!0),this.mightDrag.setUneditable&&setTimeout((()=>{this.view.input.mouseDown==this&&this.target.setAttribute("contentEditable","false")}),20),this.view.domObserver.start()),e.root.addEventListener("mouseup",this.up=this.up.bind(this)),e.root.addEventListener("mousemove",this.move=this.move.bind(this)),Fr(e,"pointer")}done(){this.view.root.removeEventListener("mouseup",this.up),this.view.root.removeEventListener("mousemove",this.move),this.mightDrag&&this.target&&(this.view.domObserver.stop(),this.mightDrag.addAttr&&this.target.removeAttribute("draggable"),this.mightDrag.setUneditable&&this.target.removeAttribute("contentEditable"),this.view.domObserver.start()),this.delayedSelectionSync&&setTimeout((()=>Kn(this.view))),this.view.input.mouseDown=null}up(e){if(this.done(),!this.view.dom.contains(e.target))return;let t=this.pos;this.view.state.doc!=this.startDoc&&(t=this.view.posAtCoords(zr(e))),this.updateAllowDefault(e),this.allowDefault||!t?Fr(this.view,"pointer"):qr(this.view,t.pos,t.inside,e,this.selectNode)?e.preventDefault():0==e.button&&(this.flushed||Kt&&this.mightDrag&&!this.mightDrag.node.isAtom||Ht&&!this.view.state.selection.visible&&Math.min(Math.abs(t.pos-this.view.state.selection.from),Math.abs(t.pos-this.view.state.selection.to))<=2)?(Pr(this.view,nt.near(this.view.state.doc.resolve(t.pos)),"pointer"),e.preventDefault()):Fr(this.view,"pointer")}move(e){this.updateAllowDefault(e),Fr(this.view,"pointer"),0==e.buttons&&this.done()}updateAllowDefault(e){!this.allowDefault&&(Math.abs(this.event.x-e.clientX)>4||Math.abs(this.event.y-e.clientY)>4)&&(this.allowDefault=!0)}}function Hr(e,t){return!!e.composing||!!(Kt&&Math.abs(t.timeStamp-e.input.compositionEndedAt)<500)&&(e.input.compositionEndedAt=-2e8,!0)}Mr.touchstart=e=>{e.input.lastTouch=Date.now(),jr(e),Fr(e,"pointer")},Mr.touchmove=e=>{e.input.lastTouch=Date.now(),Fr(e,"pointer")},Mr.contextmenu=e=>jr(e);const Jr=Qt?5e3:-1;function Kr(e,t){clearTimeout(e.input.composingTimeout),t>-1&&(e.input.composingTimeout=setTimeout((()=>Yr(e)),t))}function Gr(e){for(e.composing&&(e.input.composing=!1,e.input.compositionEndedAt=function(){let e=document.createEvent("Event");return e.initEvent("event",!0,!0),e.timeStamp}());e.input.compositionNodes.length>0;)e.input.compositionNodes.pop().markParentsDirty()}function Zr(e){let t=e.domSelectionRange();if(!t.focusNode)return null;let n=function(e,t){for(;;){if(3==e.nodeType&&t)return e;if(1==e.nodeType&&t>0){if("false"==e.contentEditable)return null;t=Nt(e=e.childNodes[t-1])}else{if(!e.parentNode||Ft(e))return null;t=St(e),e=e.parentNode}}}(t.focusNode,t.focusOffset),r=function(e,t){for(;;){if(3==e.nodeType&&t=0)){if(e.domObserver.forceFlush(),Gr(e),t||e.docView&&e.docView.dirty){let n=Hn(e),r=e.state.selection;return n&&!n.eq(r)?e.dispatch(e.state.tr.setSelection(n)):!e.markCursor&&!t||r.$from.node(r.$from.sharedDepth(r.to)).inlineContent?e.updateState(e.state):e.dispatch(e.state.tr.deleteSelection()),!0}return!1}}Or.compositionstart=Or.compositionupdate=e=>{if(!e.composing){e.domObserver.flush();let{state:t}=e,n=t.selection.$to;if(t.selection instanceof st&&(t.storedMarks||!n.textOffset&&n.parentOffset&&n.nodeBefore.marks.some((e=>!1===e.type.spec.inclusive))))e.markCursor=e.state.storedMarks||n.marks(),Yr(e,!0),e.markCursor=null;else if(Yr(e,!t.selection.empty),Ut&&t.selection.empty&&n.parentOffset&&!n.textOffset&&n.nodeBefore.marks.length){let t=e.domSelectionRange();for(let n=t.focusNode,r=t.focusOffset;n&&1==n.nodeType&&0!=r;){let t=r<0?n.lastChild:n.childNodes[r-1];if(!t)break;if(3==t.nodeType){let n=e.domSelection();n&&n.collapse(t,t.nodeValue.length);break}n=t,r=-1}}e.input.composing=!0}Kr(e,Jr)},Or.compositionend=(e,t)=>{e.composing&&(e.input.composing=!1,e.input.compositionEndedAt=t.timeStamp,e.input.compositionPendingChanges=e.domObserver.pendingRecords().length?e.input.compositionID:0,e.input.compositionNode=null,e.input.compositionPendingChanges&&Promise.resolve().then((()=>e.domObserver.flush())),e.input.compositionID++,Kr(e,20))};const Qr=Vt&&jt<15||Gt&&en<604;function Xr(e,t,n,r,i){let o=kr(e,t,n,r,e.state.selection.$from);if(e.someProp("handlePaste",(t=>t(e,i,o||m.empty))))return!0;if(!o)return!1;let s=function(e){return 0==e.openStart&&0==e.openEnd&&1==e.content.childCount?e.content.firstChild:null}(o),l=s?e.state.tr.replaceSelectionWith(s,r):e.state.tr.replaceSelection(o);return e.dispatch(l.scrollIntoView().setMeta("paste",!0).setMeta("uiEvent","paste")),!0}function ei(e){let t=e.getData("text/plain")||e.getData("Text");if(t)return t;let n=e.getData("text/uri-list");return n?n.replace(/\r?\n/g," "):""}Mr.copy=Or.cut=(e,t)=>{let n=t,r=e.state.selection,i="cut"==n.type;if(r.empty)return;let o=Qr?null:n.clipboardData,s=r.content(),{dom:l,text:a}=yr(e,s);o?(n.preventDefault(),o.clearData(),o.setData("text/html",l.innerHTML),o.setData("text/plain",a)):function(e,t){if(!e.dom.parentNode)return;let n=e.dom.parentNode.appendChild(document.createElement("div"));n.appendChild(t),n.style.cssText="position: fixed; left: -10000px; top: 10px";let r=getSelection(),i=document.createRange();i.selectNodeContents(t),e.dom.blur(),r.removeAllRanges(),r.addRange(i),setTimeout((()=>{n.parentNode&&n.parentNode.removeChild(n),e.focus()}),50)}(e,l),i&&e.dispatch(e.state.tr.deleteSelection().scrollIntoView().setMeta("uiEvent","cut"))},Or.paste=(e,t)=>{let n=t;if(e.composing&&!Qt)return;let r=Qr?null:n.clipboardData,i=e.input.shiftKey&&45!=e.input.lastKeyCode;r&&Xr(e,ei(r),r.getData("text/html"),i,n)?n.preventDefault():function(e,t){if(!e.dom.parentNode)return;let n=e.input.shiftKey||e.state.selection.$from.parent.type.spec.code,r=e.dom.parentNode.appendChild(document.createElement(n?"textarea":"div"));n||(r.contentEditable="true"),r.style.cssText="position: fixed; left: -10000px; top: 10px",r.focus();let i=e.input.shiftKey&&45!=e.input.lastKeyCode;setTimeout((()=>{e.focus(),r.parentNode&&r.parentNode.removeChild(r),n?Xr(e,r.value,null,i,t):Xr(e,r.textContent,r.innerHTML,i,t)}),50)}(e,n)};class ti{constructor(e,t,n){this.slice=e,this.move=t,this.node=n}}const ni=Zt?"altKey":"ctrlKey";function ri(e,t){let n=e.someProp("dragCopies",(e=>!e(t)));return null!=n?n:!t[ni]}Mr.dragstart=(e,t)=>{let n=t,r=e.input.mouseDown;if(r&&r.done(),!n.dataTransfer)return;let i,o=e.state.selection,s=o.empty?null:e.posAtCoords(zr(n));if(s&&s.pos>=o.from&&s.pos<=(o instanceof at?o.to-1:o.to));else if(r&&r.mightDrag)i=at.create(e.state.doc,r.mightDrag.pos);else if(n.target&&1==n.target.nodeType){let t=e.docView.nearestDesc(n.target,!0);t&&t.node.type.spec.draggable&&t!=e.docView&&(i=at.create(e.state.doc,t.posBefore))}let l=(i||e.state.selection).content(),{dom:a,text:c,slice:h}=yr(e,l);(!n.dataTransfer.files.length||!Ht||Jt>120)&&n.dataTransfer.clearData(),n.dataTransfer.setData(Qr?"Text":"text/html",a.innerHTML),n.dataTransfer.effectAllowed="copyMove",Qr||n.dataTransfer.setData("text/plain",c),e.dragging=new ti(h,ri(e,n),i)},Mr.dragend=e=>{let t=e.dragging;window.setTimeout((()=>{e.dragging==t&&(e.dragging=null)}),50)},Or.dragover=Or.dragenter=(e,t)=>t.preventDefault(),Or.drop=(e,t)=>{let n=t,r=e.dragging;if(e.dragging=null,!n.dataTransfer)return;let i=e.posAtCoords(zr(n));if(!i)return;let o=e.state.doc.resolve(i.pos),s=r&&r.slice;s?e.someProp("transformPasted",(t=>{s=t(s,e)})):s=kr(e,ei(n.dataTransfer),Qr?null:n.dataTransfer.getData("text/html"),!1,o);let l=!(!r||!ri(e,n));if(e.someProp("handleDrop",(t=>t(e,n,s||m.empty,l))))return void n.preventDefault();if(!s)return;n.preventDefault();let a=s?function(e,t,n){let r=e.resolve(t);if(!n.content.size)return t;let i=n.content;for(let e=0;e=0;t--){let n=t==r.depth?0:r.pos<=(r.start(t+1)+r.end(t+1))/2?-1:1,o=r.index(t)+(n>0?1:0),s=r.node(t),l=!1;if(1==e)l=s.canReplace(o,o,i);else{let e=s.contentMatchAt(o).findWrapping(i.firstChild.type);l=e&&s.canReplaceWith(o,o,e[0])}if(l)return 0==n?r.pos:n<0?r.before(t+1):r.after(t+1)}return null}(e.state.doc,o.pos,s):o.pos;null==a&&(a=o.pos);let c=e.state.tr;if(l){let{node:e}=r;e?e.replace(c):c.deleteSelection()}let h=c.mapping.map(a),u=0==s.openStart&&0==s.openEnd&&1==s.content.childCount,d=c.doc;if(u?c.replaceRangeWith(h,h,s.content.firstChild):c.replaceRange(h,h,s),c.doc.eq(d))return;let p=c.doc.resolve(h);if(u&&at.isSelectable(s.content.firstChild)&&p.nodeAfter&&p.nodeAfter.sameMarkup(s.content.firstChild))c.setSelection(new at(p));else{let t=c.mapping.map(a);c.mapping.maps[c.mapping.maps.length-1].forEach(((e,n,r,i)=>t=i)),c.setSelection(tr(e,p,c.doc.resolve(t)))}e.focus(),e.dispatch(c.setMeta("uiEvent","drop"))},Mr.focus=e=>{e.input.lastFocus=Date.now(),e.focused||(e.domObserver.stop(),e.dom.classList.add("ProseMirror-focused"),e.domObserver.start(),e.focused=!0,setTimeout((()=>{e.docView&&e.hasFocus()&&!e.domObserver.currentSelection.eq(e.domSelectionRange())&&Kn(e)}),20))},Mr.blur=(e,t)=>{let n=t;e.focused&&(e.domObserver.stop(),e.dom.classList.remove("ProseMirror-focused"),e.domObserver.start(),n.relatedTarget&&e.dom.contains(n.relatedTarget)&&e.domObserver.currentSelection.clear(),e.focused=!1)},Mr.beforeinput=(e,t)=>{if(Ht&&Qt&&"deleteContentBackward"==t.inputType){e.domObserver.flushSoon();let{domChangeCount:t}=e.input;setTimeout((()=>{if(e.input.domChangeCount!=t)return;if(e.dom.blur(),e.focus(),e.someProp("handleKeyDown",(t=>t(e,Rt(8,"Backspace")))))return;let{$cursor:n}=e.state.selection;n&&n.pos>0&&e.dispatch(e.state.tr.delete(n.pos-1,n.pos).scrollIntoView())}),50)}};for(let e in Or)Mr[e]=Or[e];function ii(e,t){if(e==t)return!0;for(let n in e)if(e[n]!==t[n])return!1;for(let n in t)if(!(n in e))return!1;return!0}class oi{constructor(e,t){this.toDOM=e,this.spec=t||hi,this.side=this.spec.side||0}map(e,t,n,r){let{pos:i,deleted:o}=e.mapResult(t.from+r,this.side<0?-1:1);return o?null:new ai(i-n,i-n,this)}valid(){return!0}eq(e){return this==e||e instanceof oi&&(this.spec.key&&this.spec.key==e.spec.key||this.toDOM==e.toDOM&&ii(this.spec,e.spec))}destroy(e){this.spec.destroy&&this.spec.destroy(e)}}class si{constructor(e,t){this.attrs=e,this.spec=t||hi}map(e,t,n,r){let i=e.map(t.from+r,this.spec.inclusiveStart?-1:1)-n,o=e.map(t.to+r,this.spec.inclusiveEnd?1:-1)-n;return i>=o?null:new ai(i,o,this)}valid(e,t){return t.from=e&&(!i||i(s.spec))&&n.push(s.copy(s.from+r,s.to+r))}for(let o=0;oe){let s=this.children[o]+1;this.children[o+2].findInner(e-s,t-s,n,r+s,i)}}map(e,t,n){return this==di||0==e.maps.length?this:this.mapInner(e,t,0,0,n||hi)}mapInner(e,t,n,r,i){let o;for(let s=0;s{let s=o-i-(n-e);for(let i=0;io+t-r)continue;let a=l[i]+t-r;n>=a?l[i+1]=e<=a?-2:-1:e>=t&&s&&(l[i]+=s,l[i+1]+=s)}r+=s})),t=n.maps[e].map(t,-1)}let a=!1;for(let t=0;t=r.content.size){a=!0;continue}let u=n.map(e[t+1]+o,-1)-i,{index:d,offset:p}=r.content.findIndex(h),f=r.maybeChild(d);if(f&&p==h&&p+f.nodeSize==u){let r=l[t+2].mapInner(n,f,c+1,e[t]+o+1,s);r!=di?(l[t]=h,l[t+1]=u,l[t+2]=r):(l[t+1]=-2,a=!0)}else a=!0}if(a){let a=function(e,t,n,r,i,o,s){function l(e,t){for(let o=0;o{let s,l=o+n;if(s=mi(t,e,l)){for(r||(r=this.children.slice());io&&t.to=e){this.children[t]==e&&(n=this.children[t+2]);break}let i=e+1,o=i+t.content.size;for(let e=0;ei&&t.type instanceof si){let e=Math.max(i,t.from)-i,n=Math.min(o,t.to)-i;en.map(e,t,hi)));return pi.from(n)}forChild(e,t){if(t.isLeaf)return ui.empty;let n=[];for(let r=0;re instanceof ui))?e:e.reduce(((e,t)=>e.concat(t instanceof ui?t:t.members)),[]))}}forEachSet(e){for(let t=0;tn&&t.to{let l=mi(e,t,s+n);if(l){o=!0;let e=yi(l,t,n+s+1,r);e!=di&&i.push(s,s+t.nodeSize,e)}}));let s=fi(o?gi(e):e,-n).sort(ki);for(let e=0;e0;)t++;e.splice(t,0,n)}function wi(e){let t=[];return e.someProp("decorations",(n=>{let r=n(e.state);r&&r!=di&&t.push(r)})),e.cursorWrapper&&t.push(ui.create(e.state.doc,[e.cursorWrapper.deco])),pi.from(t)}const xi={childList:!0,characterData:!0,characterDataOldValue:!0,attributes:!0,attributeOldValue:!0,subtree:!0},Ci=Vt&&jt<=11;class Di{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}set(e){this.anchorNode=e.anchorNode,this.anchorOffset=e.anchorOffset,this.focusNode=e.focusNode,this.focusOffset=e.focusOffset}clear(){this.anchorNode=this.focusNode=null}eq(e){return e.anchorNode==this.anchorNode&&e.anchorOffset==this.anchorOffset&&e.focusNode==this.focusNode&&e.focusOffset==this.focusOffset}}class Si{constructor(e,t){this.view=e,this.handleDOMChange=t,this.queue=[],this.flushingSoon=-1,this.observer=null,this.currentSelection=new Di,this.onCharData=null,this.suppressingSelectionUpdates=!1,this.lastChangedTextNode=null,this.observer=window.MutationObserver&&new window.MutationObserver((e=>{for(let t=0;t"childList"==e.type&&e.removedNodes.length||"characterData"==e.type&&e.oldValue.length>e.target.nodeValue.length))?this.flushSoon():this.flush()})),Ci&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this)}flushSoon(){this.flushingSoon<0&&(this.flushingSoon=window.setTimeout((()=>{this.flushingSoon=-1,this.flush()}),20))}forceFlush(){this.flushingSoon>-1&&(window.clearTimeout(this.flushingSoon),this.flushingSoon=-1,this.flush())}start(){this.observer&&(this.observer.takeRecords(),this.observer.observe(this.view.dom,xi)),this.onCharData&&this.view.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.connectSelection()}stop(){if(this.observer){let e=this.observer.takeRecords();if(e.length){for(let t=0;tthis.flush()),20)}this.observer.disconnect()}this.onCharData&&this.view.dom.removeEventListener("DOMCharacterDataModified",this.onCharData),this.disconnectSelection()}connectSelection(){this.view.dom.ownerDocument.addEventListener("selectionchange",this.onSelectionChange)}disconnectSelection(){this.view.dom.ownerDocument.removeEventListener("selectionchange",this.onSelectionChange)}suppressSelectionUpdates(){this.suppressingSelectionUpdates=!0,setTimeout((()=>this.suppressingSelectionUpdates=!1),50)}onSelectionChange(){if(nr(this.view)){if(this.suppressingSelectionUpdates)return Kn(this.view);if(Vt&&jt<=11&&!this.view.state.selection.empty){let e=this.view.domSelectionRange();if(e.focusNode&&Mt(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset))return this.flushSoon()}this.flush()}}setCurSelection(){this.currentSelection.set(this.view.domSelectionRange())}ignoreSelectionChange(e){if(!e.focusNode)return!0;let t,n=new Set;for(let t=e.focusNode;t;t=_t(t))n.add(t);for(let r=e.anchorNode;r;r=_t(r))if(n.has(r)){t=r;break}let r=t&&this.view.docView.nearestDesc(t);return r&&r.ignoreMutation({type:"selection",target:3==t.nodeType?t.parentNode:t})?(this.setCurSelection(),!0):void 0}pendingRecords(){if(this.observer)for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}flush(){let{view:e}=this;if(!e.docView||this.flushingSoon>-1)return;let t=this.pendingRecords();t.length&&(this.queue=[]);let n=e.domSelectionRange(),r=!this.suppressingSelectionUpdates&&!this.currentSelection.eq(n)&&nr(e)&&!this.ignoreSelectionChange(n),i=-1,o=-1,s=!1,l=[];if(e.editable)for(let e=0;e"BR"==e.nodeName));if(2==t.length){let[e,n]=t;e.parentNode&&e.parentNode.parentNode==n.parentNode?n.remove():e.remove()}else{let{focusNode:n}=this.currentSelection;for(let r of t){let t=r.parentNode;!t||"LI"!=t.nodeName||n&&Mi(e,n)==t||r.remove()}}}let a=null;i<0&&r&&e.input.lastFocus>Date.now()-200&&Math.max(e.input.lastTouch,e.input.lastClick.time)-1||r)&&(i>-1&&(e.docView.markDirty(i,o),function(e){if(_i.has(e))return;if(_i.set(e,null),-1!==["normal","nowrap","pre-line"].indexOf(getComputedStyle(e.dom).whiteSpace)){if(e.requiresGeckoHackNode=Ut,Ei)return;console.warn("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package."),Ei=!0}}(e)),this.handleDOMChange(i,o,s,l),e.docView&&e.docView.dirty?e.updateState(e.state):this.currentSelection.eq(n)||Kn(e),this.currentSelection.set(n))}registerMutation(e,t){if(t.indexOf(e.target)>-1)return null;let n=this.view.docView.nearestDesc(e.target);if("attributes"==e.type&&(n==this.view.docView||"contenteditable"==e.attributeName||"style"==e.attributeName&&!e.oldValue&&!e.target.getAttribute("style")))return null;if(!n||n.ignoreMutation(e))return null;if("childList"==e.type){for(let n=0;nDate.now()-50?e.input.lastSelectionOrigin:null,n=Hn(e,t);if(n&&!e.state.selection.eq(n)){if(Ht&&Qt&&13===e.input.lastKeyCode&&Date.now()-100t(e,Rt(13,"Enter")))))return;let r=e.state.tr.setSelection(n);"pointer"==t?r.setMeta("pointer",!0):"key"==t&&r.scrollIntoView(),o&&r.setMeta("composition",o),e.dispatch(r)}return}let s=e.state.doc.resolve(t),l=s.sharedDepth(n);t=s.before(l+1),n=e.state.doc.resolve(n).after(l+1);let a,h,u=e.state.selection,d=function(e,t,n){let r,{node:i,fromOffset:o,toOffset:s,from:l,to:a}=e.docView.parseRange(t,n),c=e.domSelectionRange(),h=c.anchorNode;if(h&&e.dom.contains(1==h.nodeType?h:h.parentNode)&&(r=[{node:h,offset:c.anchorOffset}],It(c)||r.push({node:c.focusNode,offset:c.focusOffset})),Ht&&8===e.input.lastKeyCode)for(let e=s;e>o;e--){let t=i.childNodes[e-1],n=t.pmViewDesc;if("BR"==t.nodeName&&!n){s=e;break}if(!n||n.size)break}let u=e.state.doc,d=e.someProp("domParser")||ee.fromSchema(e.state.schema),p=u.resolve(l),f=null,m=d.parse(i,{topNode:p.parent,topMatch:p.parent.contentMatchAt(p.index()),topOpen:!0,from:o,to:s,preserveWhitespace:"pre"!=p.parent.type.whitespace||"full",findPositions:r,ruleFromNode:Oi,context:p});if(r&&null!=r[0].pos){let e=r[0].pos,t=r[1]&&r[1].pos;null==t&&(t=e),f={anchor:e+l,head:t+l}}return{doc:m,sel:f,from:l,to:a}}(e,t,n),p=e.state.doc,f=p.slice(d.from,d.to);8===e.input.lastKeyCode&&Date.now()-100=s?o-r:0;o-=e,o&&o=l?o-r:0;o-=t,o&&oDate.now()-225||Qt)&&i.some((e=>1==e.nodeType&&!Ti.test(e.nodeName)))&&(!m||m.endA>=m.endB)&&e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))))return void(e.input.lastIOSEnter=0);if(!m){if(!(r&&u instanceof st&&!u.empty&&u.$head.sameParent(u.$anchor))||e.composing||d.sel&&d.sel.anchor!=d.sel.head){if(d.sel){let t=Fi(e,e.state.doc,d.sel);if(t&&!t.eq(e.state.selection)){let n=e.state.tr.setSelection(t);o&&n.setMeta("composition",o),e.dispatch(n)}}return}m={start:u.from,endA:u.to,endB:u.to}}e.state.selection.frome.state.selection.from&&m.start<=e.state.selection.from+2&&e.state.selection.from>=d.from?m.start=e.state.selection.from:m.endA=e.state.selection.to-2&&e.state.selection.to<=d.to&&(m.endB+=e.state.selection.to-m.endA,m.endA=e.state.selection.to)),Vt&&jt<=11&&m.endB==m.start+1&&m.endA==m.start&&m.start>d.from&&"  "==d.doc.textBetween(m.start-d.from-1,m.start-d.from+1)&&(m.start--,m.endA--,m.endB--);let g,y=d.doc.resolveNoCache(m.start-d.from),k=d.doc.resolveNoCache(m.endB-d.from),b=p.resolve(m.start),v=y.sameParent(k)&&y.parent.inlineContent&&b.end()>=m.endA;if((Gt&&e.input.lastIOSEnter>Date.now()-225&&(!v||i.some((e=>"DIV"==e.nodeName||"P"==e.nodeName)))||!v&&y.posy.pos)&&e.someProp("handleKeyDown",(t=>t(e,Rt(13,"Enter")))))return void(e.input.lastIOSEnter=0);if(e.state.selection.anchor>m.start&&function(e,t,n,r,i){if(n-t<=i.pos-r.pos||Ii(r,!0,!1)n||Ii(s,!0,!1)t(e,Rt(8,"Backspace")))))return void(Qt&&Ht&&e.domObserver.suppressSelectionUpdates());Ht&&m.endB==m.start&&(e.input.lastChromeDelete=Date.now()),Qt&&!v&&y.start()!=k.start()&&0==k.parentOffset&&y.depth==k.depth&&d.sel&&d.sel.anchor==d.sel.head&&d.sel.head==m.endA&&(m.endB-=2,k=d.doc.resolveNoCache(m.endB-d.from),setTimeout((()=>{e.someProp("handleKeyDown",(function(t){return t(e,Rt(13,"Enter"))}))}),20));let w,x,C,D=m.start,S=m.endA;if(v)if(y.pos==k.pos)Vt&&jt<=11&&0==y.parentOffset&&(e.domObserver.suppressSelectionUpdates(),setTimeout((()=>Kn(e)),20)),w=e.state.tr.delete(D,S),x=p.resolve(m.start).marksAcross(p.resolve(m.endA));else if(m.endA==m.endB&&(C=function(e,t){let n,r,i,o=e.firstChild.marks,s=t.firstChild.marks,l=o,a=s;for(let e=0;ee.mark(r.addToSet(e.marks));else{if(0!=l.length||1!=a.length)return null;r=a[0],n="remove",i=e=>e.mark(r.removeFromSet(e.marks))}let h=[];for(let e=0;en(e,D,S,t))))return;w=e.state.tr.insertText(t,D,S)}if(w||(w=e.state.tr.replace(D,S,d.doc.slice(m.start-d.from,m.endB-d.from))),d.sel){let t=Fi(e,w.doc,d.sel);t&&!(Ht&&e.composing&&t.empty&&(m.start!=m.endB||e.input.lastChromeDeletet.content.size?null:tr(e,t.resolve(n.anchor),t.resolve(n.head))}function Ii(e,t,n){let r=e.depth,i=t?e.end():e.pos;for(;r>0&&(t||e.indexAfter(r)==e.node(r).childCount);)r--,i++,t=!1;if(n){let t=e.node(r).maybeChild(e.indexAfter(r));for(;t&&!t.isLeaf;)t=t.firstChild,i++}return i}function Ri(e){if(2!=e.length)return!1;let t=e.charCodeAt(0),n=e.charCodeAt(1);return t>=56320&&t<=57343&&n>=55296&&n<=56319}class Bi{constructor(e,t){this._root=null,this.focused=!1,this.trackWrites=null,this.mounted=!1,this.markCursor=null,this.cursorWrapper=null,this.lastSelectedViewDesc=void 0,this.input=new Nr,this.prevDirectPlugins=[],this.pluginViews=[],this.requiresGeckoHackNode=!1,this.dragging=null,this._props=t,this.state=t.state,this.directPlugins=t.plugins||[],this.directPlugins.forEach($i),this.dispatch=this.dispatch.bind(this),this.dom=e&&e.mount||document.createElement("div"),e&&(e.appendChild?e.appendChild(this.dom):"function"==typeof e?e(this.dom):e.mount&&(this.mounted=!0)),this.editable=Pi(this),Li(this),this.nodeViews=qi(this),this.docView=On(this.state.doc,zi(this),wi(this),this.dom,this),this.domObserver=new Si(this,((e,t,n,r)=>Ni(this,e,t,n,r))),this.domObserver.start(),function(e){for(let t in Mr){let n=Mr[t];e.dom.addEventListener(t,e.input.eventHandlers[t]=t=>{!Br(e,t)||Rr(e,t)||!e.editable&&t.type in Or||n(e,t)},Tr[t]?{passive:!0}:void 0)}Kt&&e.dom.addEventListener("input",(()=>null)),Ir(e)}(this),this.updatePluginViews()}get composing(){return this.input.composing}get props(){if(this._props.state!=this.state){let e=this._props;this._props={};for(let t in e)this._props[t]=e[t];this._props.state=this.state}return this._props}update(e){e.handleDOMEvents!=this._props.handleDOMEvents&&Ir(this);let t=this._props;this._props=e,e.plugins&&(e.plugins.forEach($i),this.directPlugins=e.plugins),this.updateStateInner(e.state,t)}setProps(e){let t={};for(let e in this._props)t[e]=this._props[e];t.state=this.state;for(let n in e)t[n]=e[n];this.update(t)}updateState(e){this.updateStateInner(e,this._props)}updateStateInner(e,t){var n;let r=this.state,i=!1,o=!1;e.storedMarks&&this.composing&&(Gr(this),o=!0),this.state=e;let s=r.plugins!=e.plugins||this._props.plugins!=t.plugins;if(s||this._props.plugins!=t.plugins||this._props.nodeViews!=t.nodeViews){let e=qi(this);(function(e,t){let n=0,r=0;for(let r in e){if(e[r]!=t[r])return!0;n++}for(let e in t)r++;return n!=r})(e,this.nodeViews)&&(this.nodeViews=e,i=!0)}(s||t.handleDOMEvents!=this._props.handleDOMEvents)&&Ir(this),this.editable=Pi(this),Li(this);let l=wi(this),a=zi(this),c=r.plugins==e.plugins||r.doc.eq(e.doc)?e.scrollToSelection>r.scrollToSelection?"to selection":"preserve":"reset",h=i||!this.docView.matchesNode(e.doc,a,l);!h&&e.selection.eq(r.selection)||(o=!0);let u="preserve"==c&&o&&null==this.dom.style.overflowAnchor&&function(e){let t,n,r=e.dom.getBoundingClientRect(),i=Math.max(0,r.top);for(let o=(r.left+r.right)/2,s=i+1;s=i-20){t=r,n=l.top;break}}return{refDOM:t,refTop:n,stack:sn(e.dom)}}(this);if(o){this.domObserver.stop();let t=h&&(Vt||Ht)&&!this.composing&&!r.selection.empty&&!e.selection.empty&&function(e,t){let n=Math.min(e.$anchor.sharedDepth(e.head),t.$anchor.sharedDepth(t.head));return e.$anchor.start(n)!=t.$anchor.start(n)}(r.selection,e.selection);if(h){let n=Ht?this.trackWrites=this.domSelectionRange().focusNode:null;this.composing&&(this.input.compositionNode=Zr(this)),!i&&this.docView.update(e.doc,a,l,this)||(this.docView.updateOuterDeco(a),this.docView.destroy(),this.docView=On(e.doc,a,l,this.dom,this)),n&&!this.trackWrites&&(t=!0)}t||!(this.input.mouseDown&&this.domObserver.currentSelection.eq(this.domSelectionRange())&&function(e){let t=e.docView.domFromPos(e.state.selection.anchor,0),n=e.domSelectionRange();return Mt(t.node,t.offset,n.anchorNode,n.anchorOffset)}(this))?Kn(this,t):(Xn(this,e.selection),this.domObserver.setCurSelection()),this.domObserver.start()}this.updatePluginViews(r),(null===(n=this.dragging)||void 0===n?void 0:n.node)&&!r.doc.eq(e.doc)&&this.updateDraggedNode(this.dragging,r),"reset"==c?this.dom.scrollTop=0:"to selection"==c?this.scrollToSelection():u&&function({refDOM:e,refTop:t,stack:n}){let r=e?e.getBoundingClientRect().top:0;ln(n,0==r?0:r-t)}(u)}scrollToSelection(){let e=this.domSelectionRange().focusNode;if(e&&this.dom.contains(1==e.nodeType?e:e.parentNode))if(this.someProp("handleScrollToSelection",(e=>e(this))));else if(this.state.selection instanceof at){let t=this.docView.domAfterPos(this.state.selection.from);1==t.nodeType&&on(this,t.getBoundingClientRect(),e)}else on(this,this.coordsAtPos(this.state.selection.head,1),e);else;}destroyPluginViews(){let e;for(;e=this.pluginViews.pop();)e.destroy&&e.destroy()}updatePluginViews(e){if(e&&e.plugins==this.state.plugins&&this.directPlugins==this.prevDirectPlugins)for(let t=0;t0&&this.state.doc.nodeAt(e))==n.node&&(r=e)}this.dragging=new ti(e.slice,e.move,r<0?void 0:at.create(this.state.doc,r))}someProp(e,t){let n,r=this._props&&this._props[e];if(null!=r&&(n=t?t(r):r))return n;for(let r=0;re.ownerDocument.getSelection()),this._root=e;return e||document}updateRoot(){this._root=null}posAtCoords(e){return dn(this,e)}coordsAtPos(e,t=1){return gn(this,e,t)}domAtPos(e,t=0){return this.docView.domFromPos(e,t)}nodeDOM(e){let t=this.docView.descAt(e);return t?t.nodeDOM:null}posAtDOM(e,t,n=-1){let r=this.docView.posFromDOM(e,t,n);if(null==r)throw new RangeError("DOM position not inside the editor");return r}endOfTextblock(e,t){return Dn(this,t||this.state,e)}pasteHTML(e,t){return Xr(this,"",e,!1,t||new ClipboardEvent("paste"))}pasteText(e,t){return Xr(this,e,null,!0,t||new ClipboardEvent("paste"))}serializeForClipboard(e){return yr(this,e)}destroy(){this.docView&&(!function(e){e.domObserver.stop();for(let t in e.input.eventHandlers)e.dom.removeEventListener(t,e.input.eventHandlers[t]);clearTimeout(e.input.composingTimeout),clearTimeout(e.input.lastIOSEnterFallbackTimeout)}(this),this.destroyPluginViews(),this.mounted?(this.docView.update(this.state.doc,[],wi(this),this),this.dom.textContent=""):this.dom.parentNode&&this.dom.parentNode.removeChild(this.dom),this.docView.destroy(),this.docView=null,Et=null)}get isDestroyed(){return null==this.docView}dispatchEvent(e){return function(e,t){Rr(e,t)||!Mr[t.type]||!e.editable&&t.type in Or||Mr[t.type](e,t)}(this,e)}dispatch(e){let t=this._props.dispatchTransaction;t?t.call(this,e):this.updateState(this.state.apply(e))}domSelectionRange(){let e=this.domSelection();return e?Kt&&11===this.root.nodeType&&function(e){let t=e.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}(this.dom.ownerDocument)==this.dom&&function(e,t){if(t.getComposedRanges){let n=t.getComposedRanges(e.root)[0];if(n)return Ai(e,n)}let n;function r(e){e.preventDefault(),e.stopImmediatePropagation(),n=e.getTargetRanges()[0]}return e.dom.addEventListener("beforeinput",r,!0),document.execCommand("indent"),e.dom.removeEventListener("beforeinput",r,!0),n?Ai(e,n):null}(this,e)||e:{focusNode:null,focusOffset:0,anchorNode:null,anchorOffset:0}}domSelection(){return this.root.getSelection()}}function zi(e){let t=Object.create(null);return t.class="ProseMirror",t.contenteditable=String(e.editable),e.someProp("attributes",(n=>{if("function"==typeof n&&(n=n(e.state)),n)for(let e in n)"class"==e?t.class+=" "+n[e]:"style"==e?t.style=(t.style?t.style+";":"")+n[e]:t[e]||"contenteditable"==e||"nodeName"==e||(t[e]=String(n[e]))})),t.translate||(t.translate="no"),[ai.node(0,e.state.doc.content.size,t)]}function Li(e){if(e.markCursor){let t=document.createElement("img");t.className="ProseMirror-separator",t.setAttribute("mark-placeholder","true"),t.setAttribute("alt",""),e.cursorWrapper={dom:t,deco:ai.widget(e.state.selection.from,t,{raw:!0,marks:e.markCursor})}}else e.cursorWrapper=null}function Pi(e){return!e.someProp("editable",(t=>!1===t(e.state)))}function qi(e){let t=Object.create(null);function n(e){for(let n in e)Object.prototype.hasOwnProperty.call(t,n)||(t[n]=e[n])}return e.someProp("nodeViews",n),e.someProp("markViews",n),t}function $i(e){if(e.spec.state||e.spec.filterTransaction||e.spec.appendTransaction)throw new RangeError("Plugins passed directly to the view must not have a state component")}var Vi=200,ji=function(){};ji.prototype.append=function(e){return e.length?(e=ji.from(e),!this.length&&e||e.length=t?ji.empty:this.sliceInner(Math.max(0,e),Math.min(this.length,t))},ji.prototype.get=function(e){if(!(e<0||e>=this.length))return this.getInner(e)},ji.prototype.forEach=function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=this.length),t<=n?this.forEachInner(e,t,n,0):this.forEachInvertedInner(e,t,n,0)},ji.prototype.map=function(e,t,n){void 0===t&&(t=0),void 0===n&&(n=this.length);var r=[];return this.forEach((function(t,n){return r.push(e(t,n))}),t,n),r},ji.from=function(e){return e instanceof ji?e:e&&e.length?new Ui(e):ji.empty};var Ui=function(e){function t(t){e.call(this),this.values=t}e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t;var n={length:{configurable:!0},depth:{configurable:!0}};return t.prototype.flatten=function(){return this.values},t.prototype.sliceInner=function(e,n){return 0==e&&n==this.length?this:new t(this.values.slice(e,n))},t.prototype.getInner=function(e){return this.values[e]},t.prototype.forEachInner=function(e,t,n,r){for(var i=t;i=n;i--)if(!1===e(this.values[i],r+i))return!1},t.prototype.leafAppend=function(e){if(this.length+e.length<=Vi)return new t(this.values.concat(e.flatten()))},t.prototype.leafPrepend=function(e){if(this.length+e.length<=Vi)return new t(e.flatten().concat(this.values))},n.length.get=function(){return this.values.length},n.depth.get=function(){return 0},Object.defineProperties(t.prototype,n),t}(ji);ji.empty=new Ui([]);var Wi=function(e){function t(t,n){e.call(this),this.left=t,this.right=n,this.length=t.length+n.length,this.depth=Math.max(t.depth,n.depth)+1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.flatten=function(){return this.left.flatten().concat(this.right.flatten())},t.prototype.getInner=function(e){return ei&&!1===this.right.forEachInner(e,Math.max(t-i,0),Math.min(this.length,n)-i,r+i))&&void 0)},t.prototype.forEachInvertedInner=function(e,t,n,r){var i=this.left.length;return!(t>i&&!1===this.right.forEachInvertedInner(e,t-i,Math.max(n,i)-i,r+i))&&(!(n=n?this.right.slice(e-n,t-n):this.left.slice(e,n).append(this.right.slice(0,t-n))},t.prototype.leafAppend=function(e){var n=this.right.leafAppend(e);if(n)return new t(this.left,n)},t.prototype.leafPrepend=function(e){var n=this.left.leafPrepend(e);if(n)return new t(n,this.right)},t.prototype.appendInner=function(e){return this.left.depth>=Math.max(this.right.depth,e.depth)+1?new t(this.left,new t(this.right,e)):new t(this,e)},t}(ji);const Hi=ji;class Ji{constructor(e,t){this.items=e,this.eventCount=t}popEvent(e,t){if(0==this.eventCount)return null;let n,r,i=this.items.length;for(;;i--){if(this.items.get(i-1).selection){--i;break}}t&&(n=this.remapping(i,this.items.length),r=n.maps.length);let o,s,l=e.tr,a=[],c=[];return this.items.forEach(((e,t)=>{if(!e.step)return n||(n=this.remapping(i,t+1),r=n.maps.length),r--,void c.push(e);if(n){c.push(new Ki(e.map));let t,i=e.step.map(n.slice(r));i&&l.maybeStep(i).doc&&(t=l.mapping.maps[l.mapping.maps.length-1],a.push(new Ki(t,void 0,void 0,a.length+c.length))),r--,t&&n.appendMap(t,r)}else l.maybeStep(e.step);return e.selection?(o=n?e.selection.map(n.slice(r)):e.selection,s=new Ji(this.items.slice(0,i).append(c.reverse().concat(a)),this.eventCount-1),!1):void 0}),this.items.length,0),{remaining:s,transform:l,selection:o}}addTransform(e,t,n,r){let i=[],o=this.eventCount,s=this.items,l=!r&&s.length?s.get(s.length-1):null;for(let n=0;nZi&&(s=function(e,t){let n;return e.forEach(((e,r)=>{if(e.selection&&0==t--)return n=r,!1})),e.slice(n)}(s,a),o-=a),new Ji(s.append(i),o)}remapping(e,t){let n=new ve;return this.items.forEach(((t,r)=>{let i=null!=t.mirrorOffset&&r-t.mirrorOffset>=e?n.maps.length-t.mirrorOffset:void 0;n.appendMap(t.map,i)}),e,t),n}addMaps(e){return 0==this.eventCount?this:new Ji(this.items.append(e.map((e=>new Ki(e)))),this.eventCount)}rebased(e,t){if(!this.eventCount)return this;let n=[],r=Math.max(0,this.items.length-t),i=e.mapping,o=e.steps.length,s=this.eventCount;this.items.forEach((e=>{e.selection&&s--}),r);let l=t;this.items.forEach((t=>{let r=i.getMirror(--l);if(null==r)return;o=Math.min(o,r);let a=i.maps[r];if(t.step){let o=e.steps[r].invert(e.docs[r]),c=t.selection&&t.selection.map(i.slice(l+1,r));c&&s++,n.push(new Ki(a,o,c))}else n.push(new Ki(a))}),r);let a=[];for(let e=t;e500&&(h=h.compress(this.items.length-n.length)),h}emptyItemCount(){let e=0;return this.items.forEach((t=>{t.step||e++})),e}compress(e=this.items.length){let t=this.remapping(0,e),n=t.maps.length,r=[],i=0;return this.items.forEach(((o,s)=>{if(s>=e)r.push(o),o.selection&&i++;else if(o.step){let e=o.step.map(t.slice(n)),s=e&&e.getMap();if(n--,s&&t.appendMap(s,n),e){let l=o.selection&&o.selection.map(t.slice(n));l&&i++;let a,c=new Ki(s.invert(),e,l),h=r.length-1;(a=r.length&&r[h].merge(c))?r[h]=a:r.push(c)}}else o.map&&n--}),this.items.length,0),new Ji(Hi.from(r.reverse()),i)}}Ji.empty=new Ji(Hi.empty,0);class Ki{constructor(e,t,n,r){this.map=e,this.step=t,this.selection=n,this.mirrorOffset=r}merge(e){if(this.step&&e.step&&!e.selection){let t=e.step.merge(this.step);if(t)return new Ki(t.getMap().invert(),t,this.selection)}}}class Gi{constructor(e,t,n,r,i){this.done=e,this.undone=t,this.prevRanges=n,this.prevTime=r,this.prevComposition=i}}const Zi=20;function Yi(e){let t=[];for(let n=e.length-1;n>=0&&0==t.length;n--)e[n].forEach(((e,n,r,i)=>t.push(r,i)));return t}function Qi(e,t){if(!e)return null;let n=[];for(let r=0;rnew Gi(Ji.empty,Ji.empty,null,0,-1),apply:(t,n,r)=>function(e,t,n,r){let i,o=n.getMeta(no);if(o)return o.historyState;n.getMeta(ro)&&(e=new Gi(e.done,e.undone,null,0,-1));let s=n.getMeta("appendedTransaction");if(0==n.steps.length)return e;if(s&&s.getMeta(no))return s.getMeta(no).redo?new Gi(e.done.addTransform(n,void 0,r,to(t)),e.undone,Yi(n.mapping.maps),e.prevTime,e.prevComposition):new Gi(e.done,e.undone.addTransform(n,void 0,r,to(t)),null,e.prevTime,e.prevComposition);if(!1===n.getMeta("addToHistory")||s&&!1===s.getMeta("addToHistory"))return(i=n.getMeta("rebased"))?new Gi(e.done.rebased(n,i),e.undone.rebased(n,i),Qi(e.prevRanges,n.mapping),e.prevTime,e.prevComposition):new Gi(e.done.addMaps(n.mapping.maps),e.undone.addMaps(n.mapping.maps),Qi(e.prevRanges,n.mapping),e.prevTime,e.prevComposition);{let i=n.getMeta("composition"),o=0==e.prevTime||!s&&e.prevComposition!=i&&(e.prevTime<(n.time||0)-r.newGroupDelay||!function(e,t){if(!t)return!1;if(!e.docChanged)return!0;let n=!1;return e.mapping.maps[0].forEach(((e,r)=>{for(let i=0;i=t[i]&&(n=!0)})),n}(n,e.prevRanges)),l=s?Qi(e.prevRanges,n.mapping):Yi(n.mapping.maps);return new Gi(e.done.addTransform(n,o?t.selection.getBookmark():void 0,r,to(t)),Ji.empty,l,n.time,null==i?e.prevComposition:i)}}(n,r,t,e)},config:e,props:{handleDOMEvents:{beforeinput(e,t){let n=t.inputType,r="historyUndo"==n?so:"historyRedo"==n?lo:null;return!!r&&(t.preventDefault(),r(e.state,e.dispatch))}}}})}function oo(e,t){return(n,r)=>{let i=no.getState(n);if(!i||0==(e?i.undone:i.done).eventCount)return!1;if(r){let o=function(e,t,n){let r=to(t),i=no.get(t).spec.config,o=(n?e.undone:e.done).popEvent(t,r);if(!o)return null;let s=o.selection.resolve(o.transform.doc),l=(n?e.done:e.undone).addTransform(o.transform,t.selection.getBookmark(),i,r),a=new Gi(n?l:o.remaining,n?o.remaining:l,null,0,-1);return o.transform.setSelection(s).setMeta(no,{redo:n,historyState:a})}(i,n,e);o&&r(t?o.scrollIntoView():o)}return!0}}const so=oo(!1,!0),lo=oo(!0,!0);oo(!1,!1),oo(!0,!1);class ao{constructor(e,t,n={}){var r;this.match=e,this.match=e,this.handler="string"==typeof t?(r=t,function(e,t,n,i){let o=r;if(t[1]){let e=t[0].lastIndexOf(t[1]);o+=t[0].slice(e+t[1].length);let r=(n+=e)-i;r>0&&(o=t[0].slice(e-r,e)+o,n=i)}return e.tr.insertText(o,n,i)}):t,this.undoable=!1!==n.undoable,this.inCode=n.inCode||!1,this.inCodeMark=!1!==n.inCodeMark}}function co(e,t,n,r,i,o){if(e.composing)return!1;let s=e.state,l=s.doc.resolve(t),a=l.parent.textBetween(Math.max(0,l.parentOffset-500),l.parentOffset,null,"")+r;for(let c=0;ce.type.spec.code)))continue;if(l.parent.type.spec.code){if(!h.inCode)continue}else if("only"===h.inCode)continue;let u=h.match.exec(a),d=u&&u[0].length>=r.length&&h.handler(s,u,t-(u[0].length-r.length),n);if(d)return h.undoable&&d.setMeta(o,{transform:d,from:t,to:n,text:r}),e.dispatch(d),!0}return!1}new ao(/--$/,"—",{inCodeMark:!1});const ho=new ao(/\.\.\.$/,"…",{inCodeMark:!1}),uo=[new ao(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(")$/,"“",{inCodeMark:!1}),new ao(/"$/,"”",{inCodeMark:!1}),new ao(/(?:^|[\s\{\[\(\<'"\u2018\u201C])(')$/,"‘",{inCodeMark:!1}),new ao(/'$/,"’",{inCodeMark:!1})];function po(e,t,n=null){return new ao(e,((e,r,i,o)=>{let s=e.doc.resolve(i),l=n instanceof Function?n(r):n;return s.node(-1).canReplaceWith(s.index(-1),s.indexAfter(-1),t)?e.tr.delete(i,o).setBlockType(i,i,t,l):null}))}const fo=["ol",0],mo=["ul",0],go=["li",0],yo={attrs:{order:{default:1,validate:"number"}},parseDOM:[{tag:"ol",getAttrs:e=>({order:e.hasAttribute("start")?+e.getAttribute("start"):1})}],toDOM:e=>1==e.attrs.order?fo:["ol",{start:e.attrs.order},0]},ko={parseDOM:[{tag:"ul"}],toDOM:()=>mo},bo={parseDOM:[{tag:"li"}],toDOM:()=>go,defining:!0};function vo(e,t=null){return function(n,r){let{$from:i,$to:o}=n.selection,s=i.blockRange(o);if(!s)return!1;let l=r?n.tr:null;return!!function(e,t,n,r=null){let i=!1,o=t,s=t.$from.doc;if(t.depth>=2&&t.$from.node(t.depth-1).type.compatibleContent(n)&&0==t.startIndex){if(0==t.$from.index(t.depth-1))return!1;let e=s.resolve(t.start-2);o=new T(e,e,t.depth),t.endIndex=0;e--)o=c.from(n[e].type.create(n[e].attrs,o));e.step(new Oe(t.start-(r?2:0),t.end,t.start,t.end,new m(o,0,0),n.length,!0));let s=0;for(let e=0;e=i.depth-3;e--)t=c.from(i.node(e).copy(t));let s=i.indexAfter(-1){if(h>-1)return!1;e.isTextblock&&0==e.content.size&&(h=t+1)})),h>-1&&a.setSelection(nt.near(a.doc.resolve(h))),r(a.scrollIntoView())}return!0}let a=o.pos==i.end()?l.contentMatchAt(0).defaultType:null,h=n.tr.delete(i.pos,o.pos),u=a?[t?{type:e,attrs:t}:null,{type:a}]:void 0;return!!Le(h.doc,i.pos,2,u)&&(r&&r(h.split(i.pos,2,u).scrollIntoView()),!0)}}function xo(e){return function(t,n){let{$from:r,$to:i}=t.selection,o=r.blockRange(i,(t=>t.childCount>0&&t.firstChild.type==e));return!!o&&(!n||(r.node(o.depth-1).type==e?function(e,t,n,r){let i=e.tr,o=r.end,s=r.$to.end(r.depth);oo;t--)e-=i.child(t).nodeSize,r.delete(e-1,e+1);let o=r.doc.resolve(n.start),s=o.nodeAfter;if(r.mapping.map(n.end)!=n.start+o.nodeAfter.nodeSize)return!1;let l=0==n.startIndex,a=n.endIndex==i.childCount,h=o.node(-1),u=o.index(-1);if(!h.canReplace(u+(l?0:1),u+1,s.content.append(a?c.empty:c.from(i))))return!1;let d=o.pos,p=d+s.nodeSize;return r.step(new Oe(d-(l?1:0),p+(a?1:0),d+1,p-1,new m((l?c.empty:c.from(i.copy(c.empty))).append(a?c.empty:c.from(i.copy(c.empty))),l?0:1,a?0:1),l?0:1)),t(r.scrollIntoView()),!0}(t,n,o)))}}const Co=["p",0],Do=["blockquote",0],So=["hr"],_o=["pre",["code",0]],Eo=["br"],Ao={doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM:()=>Co},blockquote:{content:"block+",group:"block",defining:!0,parseDOM:[{tag:"blockquote"}],toDOM:()=>Do},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM:()=>So},heading:{attrs:{level:{default:1,validate:"number"}},content:"inline*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM:e=>["h"+e.attrs.level,0]},code_block:{content:"text*",marks:"",group:"block",code:!0,defining:!0,parseDOM:[{tag:"pre",preserveWhitespace:"full"}],toDOM:()=>_o},text:{group:"inline"},image:{inline:!0,attrs:{src:{validate:"string"},alt:{default:null,validate:"string|null"},title:{default:null,validate:"string|null"}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs:e=>({src:e.getAttribute("src"),title:e.getAttribute("title"),alt:e.getAttribute("alt")})}],toDOM(e){let{src:t,alt:n,title:r}=e.attrs;return["img",{src:t,alt:n,title:r}]}},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM:()=>Eo}},Mo=["em",0],Oo=["strong",0],To=["code",0],No={link:{attrs:{href:{validate:"string"},title:{default:null,validate:"string|null"}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}],toDOM(e){let{href:t,title:n}=e.attrs;return["a",{href:t,title:n},0]}},em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:e=>"em"==e.type.name}],toDOM:()=>Mo},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:e=>"normal"!=e.style.fontWeight&&null},{style:"font-weight=400",clearMark:e=>"strong"==e.type.name},{style:"font-weight",getAttrs:e=>/^(bold(er)?|[5-9]\d{2,})$/.test(e)&&null}],toDOM:()=>Oo},code:{code:!0,parseDOM:[{tag:"code"}],toDOM:()=>To}},Fo=(new Q({nodes:Ao,marks:No}),"markdown_escaped"),Io="auto_link",Ro="sn-editor",Bo={content:"block+",toDOM:e=>["main",{class:Ro},0],parseDOM:[{tag:"main"}]},zo={content:"inline*",defining:!0,group:"block",toDOM:e=>["h1",{class:Ro},0],parseDOM:[{tag:"h1"}]},Lo={content:"inline*",defining:!0,group:"block",toDOM:e=>["h2",{class:Ro},0],parseDOM:[{tag:"h2"}]},Po={content:"inline*",defining:!0,group:"block",toDOM:e=>["h3",{class:Ro},0],parseDOM:[{tag:"h3"}]},qo={content:"inline*",group:"block",marks:"_",toDOM:e=>["p",{class:Ro},0],parseDOM:[{tag:"p"}]};var $o;!function(e){e[e.DONE=0]="DONE",e[e.EMPTY=1]="EMPTY"}($o||($o={}));const Vo={attrs:{status:{default:$o.EMPTY}},content:"inline*",defining:!0,group:"block",marks:"_",toDOM:e=>["div",{class:"checklist-item"},["input",Object.assign({type:"checkbox"},e.attrs.status===$o.DONE&&{checked:"true"})],["p",0]],parseDOM:[{contentElement:"p",tag:"div.checklist-item",getAttrs:e=>({status:e.querySelector("input").checked?$o.DONE:$o.EMPTY})}]},jo=Object.assign(Object.assign({},Ao.code_block),{attrs:Object.assign(Object.assign({},Ao.code_block.attrs),{[Fo]:{default:!1}}),toDOM(e){const t={[`data-${Fo}`]:e.attrs[Fo]};return e.attrs[Fo]?["pre",t,["div",{class:"info"},"i"],["code",0]]:["pre",t,["code",0]]}}),Uo=new Q({nodes:{doc:Bo,paragraph:qo,checklist_item:Vo,unordered_list:Object.assign(Object.assign({},ko),{content:"list_item+",group:"block",selectable:!1}),ordered_list:Object.assign(Object.assign({},yo),{content:"list_item+",group:"block",selectable:!1}),list_item:Object.assign(Object.assign({},bo),{content:"paragraph (paragraph | ordered_list | unordered_list)*",selectable:!1}),heading1:zo,heading2:Lo,heading3:Po,text:{group:"inline"},code_block:jo},marks:{link:{attrs:{href:{default:""},title:{default:null},[Io]:{default:!1}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title"),[`data-${Io}`]:e.getAttribute(`data-${Io}`)})}],toDOM(e){let{href:t,title:n}=e.attrs;return["a",{href:t,title:n,[`data-${Io}`]:e.attrs[Io]},0]}},em:Object.assign({},No.em),strong:Object.assign({},No.strong),code:Object.assign(Object.assign({},No.code),{attrs:Object.assign(Object.assign({},No.code.attrs),{[Fo]:{default:!1}})})}});function Wo(e,t,n){return new ao(new RegExp(`${e}(\\S+(\\s+\\S+)*?)${e}$`),((e,n,r,i)=>{const[o,s]=n,{tr:l}=e;if(!s)return;const a=e.doc.resolve(r).marksAcross(e.doc.resolve(i));return l.replaceRangeWith(r,i,Uo.text(s,[...a,t.create()])).insert(l.selection.from,Uo.text(" ",[...a])).setMeta("has-forced-space-from-input-rule",{endPos:l.selection.from})}),{inCodeMark:n})}function Ho(e,t){return new ao(new RegExp(`^${e}$`),((e,n,r,i)=>{const o=e.doc.resolve(i);if(o.depth>1)return;const s=[i,r+o.parent.nodeSize-2],l=e.doc.slice(...s),{tr:a}=e;return a.deleteRange(...s),a.replaceRangeWith(r,i,t.createAndFill()),a.setSelection(nt.near(a.doc.resolve(r))),a.insert(a.selection.from,l.content),a.setSelection(nt.near(a.doc.resolve(r))),a}))}const Jo=function({rules:e}){let t=new wt({state:{init:()=>null,apply(e,t){let n=e.getMeta(this);return n||(e.selectionSet||e.docChanged?null:t)}},props:{handleTextInput:(n,r,i,o)=>co(n,r,i,o,e,t),handleDOMEvents:{compositionend:n=>{setTimeout((()=>{let{$cursor:r}=n.state.selection;r&&co(n,r.pos,r.pos,"",e,t)}))}}},isInputRules:!0});return t}({rules:[...uo,ho,...[new ao(new RegExp("<\\->$"),"↔",{inCodeMark:!1}),new ao(new RegExp("\\->$"),"→",{inCodeMark:!1})],po(/^# $/,Uo.nodes.heading1),po(/^## $/,Uo.nodes.heading2),po(/^### $/,Uo.nodes.heading3),po(/^```$/,Uo.nodes.code_block),Wo("`",Uo.marks.code,!1),Wo("\\*",Uo.marks.strong,!1),Wo("_",Uo.marks.em,!1),Ho("1. ",Uo.nodes.ordered_list),Ho("- ",Uo.nodes.unordered_list)]}),Ko="reset-has-forced-space-meta",Go=new wt({state:{init:()=>({hasForcedSpace:!1}),apply(e,t){if(e.getMeta(Ko))return{hasForcedSpace:!1};if(t.hasForcedSpace&&(e.selectionSet||e.docChanged))return{hasForcedSpace:!1};const n=e.getMeta("has-forced-space-from-input-rule");return n?{hasForcedSpace:!0,forcedSpacePos:n.endPos}:t}},props:{handleTextInput(e,t,n,r){if(this.getState(e.state).hasForcedSpace&&" "===r)return e.dispatch(e.state.tr.setMeta(Ko,!0)),!0}}}),Zo=(e,t)=>!e.selection.empty&&(t&&t(e.tr.deleteSelection().scrollIntoView()),!0);function Yo(e,t){let{$cursor:n}=e.selection;return!n||(t?!t.endOfTextblock("backward",e):n.parentOffset>0)?null:n}function Qo(e,t,n=!1){for(let r=e;r;r="start"==t?r.firstChild:r.lastChild){if(r.isTextblock)return!0;if(n&&1!=r.childCount)return!1}return!1}function Xo(e){if(!e.parent.type.spec.isolating)for(let t=e.depth-1;t>=0;t--){if(e.index(t)>0)return e.doc.resolve(e.before(t+1));if(e.node(t).type.spec.isolating)break}return null}function es(e,t){let{$cursor:n}=e.selection;return!n||(t?!t.endOfTextblock("forward",e):n.parentOffset=0;t--){let n=e.node(t);if(e.index(t)+1{let{$from:n,$to:r}=e.selection;if(e.selection instanceof at&&e.selection.node.isBlock)return!(!n.parentOffset||!Le(e.doc,n.pos)||(t&&t(e.tr.split(n.pos).scrollIntoView()),0));if(!n.depth)return!1;let i,o,s=[],l=!1,a=!1;for(let e=n.depth;;e--){if(n.node(e).isBlock){l=n.end(e)==n.pos+(n.depth-e),a=n.start(e)==n.pos-(n.depth-e),o=ns(n.node(e-1).contentMatchAt(n.indexAfter(e-1)));let t=is&&is(r.parent,l,n);s.unshift(t||(l&&o?{type:o}:null)),i=e;break}if(1==e)return!1;s.unshift(null)}let c=e.tr;(e.selection instanceof st||e.selection instanceof ht)&&c.deleteSelection();let h=c.mapping.map(n.pos),u=Le(c.doc,h,s.length,s);if(u||(s[0]=o?{type:o}:null,u=Le(c.doc,h,s.length,s)),!u)return!1;if(c.split(h,s.length,s),!l&&a&&n.node(i).type!=o){let e=c.mapping.map(n.before(i)),t=c.doc.resolve(e);o&&n.node(i-1).canReplaceWith(t.index(),t.index()+1,o)&&c.setNodeMarkup(c.mapping.map(n.before(i)),o)}return t&&t(c.scrollIntoView()),!0};var is;function ss(e,t,n,r){let i,o,s=t.nodeBefore,l=t.nodeAfter,a=s.type.spec.isolating||l.type.spec.isolating;if(!a&&function(e,t,n){let r=t.nodeBefore,i=t.nodeAfter,o=t.index();return!(!(r&&i&&r.type.compatibleContent(i.type))||(!r.content.size&&t.parent.canReplace(o-1,o)?(n&&n(e.tr.delete(t.pos-r.nodeSize,t.pos).scrollIntoView()),0):!t.parent.canReplace(o,o+1)||!i.isTextblock&&!Pe(e.doc,t.pos)||(n&&n(e.tr.join(t.pos).scrollIntoView()),0)))}(e,t,n))return!0;let h=!a&&t.parent.canReplace(t.index(),t.index()+1);if(h&&(i=(o=s.contentMatchAt(s.childCount)).findWrapping(l.type))&&o.matchType(i[0]||l.type).validEnd){if(n){let r=t.pos+l.nodeSize,o=c.empty;for(let e=i.length-1;e>=0;e--)o=c.from(i[e].create(null,o));o=c.from(s.copy(o));let a=e.tr.step(new Oe(t.pos-1,r,t.pos,r,new m(o,1,0),i.length,!0)),h=a.doc.resolve(r+2*i.length);h.nodeAfter&&h.nodeAfter.type==s.type&&Pe(a.doc,h.pos)&&a.join(h.pos),n(a.scrollIntoView())}return!0}let u=l.type.spec.isolating||r>0&&a?null:nt.findFrom(t,1),d=u&&u.$from.blockRange(u.$to),p=d&&Ie(d);if(null!=p&&p>=t.depth)return n&&n(e.tr.lift(d,p).scrollIntoView()),!0;if(h&&Qo(l,"start",!0)&&Qo(s,"end")){let r=s,i=[];for(;i.push(r),!r.isTextblock;)r=r.lastChild;let o=l,a=1;for(;!o.isTextblock;o=o.firstChild)a++;if(r.canReplace(r.childCount,r.childCount,o.content)){if(n){let r=c.empty;for(let e=i.length-1;e>=0;e--)r=c.from(i[e].copy(r));n(e.tr.step(new Oe(t.pos-i.length,t.pos+l.nodeSize,t.pos+a,t.pos+l.nodeSize-a,new m(r,i.length,0),0,!0)).scrollIntoView())}return!0}}return!1}function ls(e){return function(t,n){let r=t.selection,i=e<0?r.$from:r.$to,o=i.depth;for(;i.node(o).isInline;){if(!o)return!1;o--}return!!i.node(o).isTextblock&&(n&&n(t.tr.setSelection(st.create(t.doc,e<0?i.start(o):i.end(o)))),!0)}}const as=ls(-1),cs=ls(1);function hs(e,t=null,n){let r=!1!==(n&&n.removeWhenPresent),i=!1!==(n&&n.enterInlineAtoms),o=!(n&&n.includeWhitespace);return function(n,s){let{empty:l,$cursor:a,ranges:c}=n.selection;if(l&&!a||!function(e,t,n,r){for(let i=0;i{if(l||!r&&e.isAtom&&e.isInline&&t>=o.pos&&t+e.nodeSize<=s.pos)return!1;l=e.inlineContent&&e.type.allowsMarkType(n)})),l)return!0}return!1}(n.doc,c,e,i))return!1;if(s)if(a)e.isInSet(n.storedMarks||a.marks())?s(n.tr.removeStoredMark(e)):s(n.tr.addStoredMark(e.create(t)));else{let l,a=n.tr;i||(c=function(e){let t=[];for(let n=0;n{if(e.isAtom&&e.content.size&&e.isInline&&n>=r.pos&&n+e.nodeSize<=i.pos)return n+1>r.pos&&t.push(new rt(r,r.doc.resolve(n+1))),r=r.doc.resolve(n+1+e.content.size),!1})),r.posn.doc.rangeHasMark(t.$from.pos,t.$to.pos,e))):!c.every((t=>{let n=!1;return a.doc.nodesBetween(t.$from.pos,t.$to.pos,((r,i,o)=>{if(n)return!1;n=!e.isInSet(r.marks)&&!!o&&o.type.allowsMarkType(e)&&!(r.isText&&/^\s*$/.test(r.textBetween(Math.max(0,t.$from.pos-i),Math.min(r.nodeSize,t.$to.pos-i))))})),!n}));for(let n=0;n{let r=Yo(e,n);if(!r)return!1;let i=Xo(r);if(!i){let n=r.blockRange(),i=n&&Ie(n);return null!=i&&(t&&t(e.tr.lift(n,i).scrollIntoView()),!0)}let o=i.nodeBefore;if(ss(e,i,t,-1))return!0;if(0==r.parent.content.size&&(Qo(o,"end")||at.isSelectable(o)))for(let n=r.depth;;n--){let s=$e(e.doc,r.before(n),r.after(n),m.empty);if(s&&s.slice.size1)break}return!(!o.isAtom||i.depth!=r.depth-1)&&(t&&t(e.tr.delete(i.pos-o.nodeSize,i.pos).scrollIntoView()),!0)}),((e,t,n)=>{let{$head:r,empty:i}=e.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("backward",e):r.parentOffset>0)return!1;o=Xo(r)}let s=o&&o.nodeBefore;return!(!s||!at.isSelectable(s))&&(t&&t(e.tr.setSelection(at.create(e.doc,o.pos-s.nodeSize)).scrollIntoView()),!0)})),ps=us(Zo,((e,t,n)=>{let r=es(e,n);if(!r)return!1;let i=ts(r);if(!i)return!1;let o=i.nodeAfter;if(ss(e,i,t,1))return!0;if(0==r.parent.content.size&&(Qo(o,"start")||at.isSelectable(o))){let n=$e(e.doc,r.before(),r.after(),m.empty);if(n&&n.slice.size{let{$head:r,empty:i}=e.selection,o=r;if(!i)return!1;if(r.parent.isTextblock){if(n?!n.endOfTextblock("forward",e):r.parentOffset{let{$head:n,$anchor:r}=e.selection;return!(!n.parent.type.spec.code||!n.sameParent(r))&&(t&&t(e.tr.insertText("\n").scrollIntoView()),!0)}),((e,t)=>{let n=e.selection,{$from:r,$to:i}=n;if(n instanceof ht||r.parent.inlineContent||i.parent.inlineContent)return!1;let o=ns(i.parent.contentMatchAt(i.indexAfter()));if(!o||!o.isTextblock)return!1;if(t){let n=(!r.parentOffset&&i.index(){let{$cursor:n}=e.selection;if(!n||n.parent.content.size)return!1;if(n.depth>1&&n.after()!=n.end(-1)){let r=n.before();if(Le(e.doc,r))return t&&t(e.tr.split(r).scrollIntoView()),!0}let r=n.blockRange(),i=r&&Ie(r);return null!=i&&(t&&t(e.tr.lift(r,i).scrollIntoView()),!0)}),rs),"Mod-Enter":(e,t)=>{let{$head:n,$anchor:r}=e.selection;if(!n.parent.type.spec.code||!n.sameParent(r))return!1;let i=n.node(-1),o=n.indexAfter(-1),s=ns(i.contentMatchAt(o));if(!s||!i.canReplaceWith(o,o,s))return!1;if(t){let r=n.after(),i=e.tr.replaceWith(r,r,s.createAndFill());i.setSelection(nt.near(i.doc.resolve(r),1)),t(i.scrollIntoView())}return!0},Backspace:ds,"Mod-Backspace":ds,"Shift-Backspace":ds,Delete:ps,"Mod-Delete":ps,"Mod-a":(e,t)=>(t&&t(e.tr.setSelection(new ht(e.doc))),!0)},ms={"Ctrl-h":fs.Backspace,"Alt-Backspace":fs["Mod-Backspace"],"Ctrl-d":fs.Delete,"Ctrl-Alt-Backspace":fs["Mod-Delete"],"Alt-Delete":fs["Mod-Delete"],"Alt-d":fs["Mod-Delete"],"Ctrl-a":as,"Ctrl-e":cs};for(let e in fs)ms[e]=fs[e];const gs=("undefined"!=typeof navigator?/Mac|iP(hone|[oa]d)/.test(navigator.platform):!("undefined"==typeof os||!os.platform)&&"darwin"==os.platform())?ms:fs;function ys(e,t=[Uo.nodes.unordered_list,Uo.nodes.ordered_list]){return t.includes(e.type)}const ks="data-format";function bs(e,t){let{dispatch:n,state:r}=e,{tr:i}=r,{selection:{$from:o,$to:s}}=r;const l=ws(o,s);if(xs(o,s,l))return;if(Cs(o,s,l))return;t!==Uo.nodes.unordered_list&&t!==Uo.nodes.ordered_list&&xo(Uo.nodes.list_item)(r,n),({dispatch:n,state:r}=e),({tr:i}=r);const{selection:{from:a,to:c}}=r;i.setBlockType(a,c,t),n(i)}const vs=function(e,t){return(n=Uo.nodes.list_item,function(e,t){let{$from:r,$to:i}=e.selection,o=r.blockRange(i,(e=>e.childCount>0&&e.firstChild.type==n));if(!o)return!1;let s=o.startIndex;if(0==s)return!1;let l=o.parent,a=l.child(s-1);if(a.type!=n)return!1;if(t){let r=a.lastChild&&a.lastChild.type==l.type,i=c.from(r?n.create():null),s=new m(c.from(n.create(null,c.from(l.type.create(null,i)))),r?3:1,0),h=o.start,u=o.end;t(e.tr.step(new Oe(h-(r?3:1),u,h,u,s,1,!0)).scrollIntoView())}return!0})(e,t)||vo(Uo.nodes.unordered_list)(e,t);var n};function ws(e,t,n=[Uo.nodes.unordered_list,Uo.nodes.ordered_list]){return e.blockRange(t,(e=>ys(e,n)))||!1}function xs(e,t,n=ws(e,t)){if(!n)return!1;let r=!1;const{doc:i}=e,o=i.resolve(n.start),s=i.resolve(n.end);return n.parent.nodesBetween(o.parentOffset,s.parentOffset,(e=>!r&&!e.isTextblock&&(ys(e)?(r=!0,!1):void 0))),r}function Cs(e,t,n=ws(e,t)){return!!n&&n.depth>1}const Ds=function(e,t){return!!function(e){const{$from:t,$to:n}=e.selection,r=ws(t,n);return!!r&&t.pos===r.start+t.parentOffset+2&&r}(e)&&xo(Uo.nodes.list_item)(e,t)};class Ss{constructor(e,{onConfirm:t,onClear:n,text:r,url:i}){this.showCls="active",this.destroy=()=>{this.confirmBtn.removeEventListener("click",this.handleConfirm),this.cancelBtn.removeEventListener("click",this.handleCancel),this.clearBtn.removeEventListener("click",this.handleClear),document.removeEventListener("keydown",this.handleGlobalKeydown),this.el.classList.remove(this.showCls)},this.handleConfirm=()=>{this.onConfirm({text:this.textInput.value,url:this.urlInput.value}),this.destroy()},this.handleClear=()=>{this.onClear(),this.destroy()},this.handleCancel=()=>{this.destroy()},this.handleGlobalKeydown=e=>{const t="Enter"===e.key;if(document.activeElement===this.textInput||document.activeElement===this.urlInput&&t)return void this.handleConfirm();"Escape"===e.key&&this.handleCancel()},this.handleGlobalClick=e=>{!1===this.frameEl.contains(e.target)&&this.destroy()},this.el=e,this.textInput.value=this.text=r,this.urlInput.value=this.url=i,this.onConfirm=t,this.onClear=n,this.frameEl=e.querySelector("#frame"),n?this.clearBtn.classList.add(this.showCls):this.clearBtn.classList.remove(this.showCls),this.el.classList.add(this.showCls),this.confirmBtn.addEventListener("click",this.handleConfirm),this.cancelBtn.addEventListener("click",this.handleCancel),this.clearBtn.addEventListener("click",this.handleClear),document.addEventListener("keydown",this.handleGlobalKeydown),document.addEventListener("click",this.handleGlobalClick),this.urlInput.focus()}get textInput(){return this.el.querySelector("input#text")}get urlInput(){return this.el.querySelector("input#url")}get confirmBtn(){return this.el.querySelector("button#confirm")}get cancelBtn(){return this.el.querySelector("button#cancel")}get clearBtn(){return this.el.querySelector("button#clear")}}class _s extends wt{constructor(e,t){super({view:n=>(this.view=n,this.modalEl=t,this.toolbarEl=e,e.addEventListener("click",this.handleToolbarClick),{destroy:()=>{var t;e.removeEventListener("click",this.handleToolbarClick),this.unhighlightSelectedAttrs(),null===(t=this.modal)||void 0===t||t.destroy()},update:(e,t)=>{this.updateToolbarForSelection(e.state)}}),props:{handleKeyDown:(e,t)=>{const n=t.ctrlKey,r=t.metaKey,i=t.shiftKey;return n&&"."===t.key?(vs(this.view.state,this.view.dispatch),!0):n&&","===t.key?(Ds(this.view.state,this.view.dispatch),!0):"Tab"!==t.key||n||r?n&&"t"===t.key?(this.toggleChecklistItem(),!0):r&&"7"===t.key||n&&"u"===t.key?(this.toggleList(Uo.nodes.unordered_list,Uo.nodes.list_item),!0):n&&"o"===t.key?(this.toggleList(Uo.nodes.ordered_list,Uo.nodes.list_item),!0):n&&"="===t.key?(this.promoteHeading(this.view.state,this.view.dispatch),!0):n&&"j"===t.key?(this.swapTextBlock(Uo.nodes.paragraph),!0):n&&"Space"===t.code?function(e,t){const{$from:n,$to:r}=e.selection,i=n.blockRange(r);let o=!1;for(let e=i.startIndex,t=i.parent.child(e);e{bs(this.view,e),this.view.focus()},this.promoteHeading=(e,t)=>{const{selection:n}=e;if(!n.empty)return;const{$from:{parent:{type:r}}}=n;let i;i=r===Uo.nodes.heading2?Uo.nodes.heading1:r===Uo.nodes.heading3?Uo.nodes.heading2:r===Uo.nodes.heading1?Uo.nodes.paragraph:Uo.nodes.heading3,this.swapTextBlock(i)},this.toggleList=(e,t)=>{!function(e,t,n){const{state:{selection:{$from:r,$to:i}}}=e,o=ws(r,i,[t]);if(xs(r,i,o))return;if(Cs(r,i,o))return;if(o)return void xo(n)(e.state,e.dispatch);const s=r.blockRange(i);for(let e=s.startIndex;e{const{state:e}=this.view,{$from:t,$to:n}=e.selection,r=t.blockRange(n);for(let e=r.startIndex;e{const{doc:n,selection:r}=e,{$from:i,$to:o}=r,s=i.marks().find((e=>e.type===Uo.marks.link&&!e.attrs[Io])),l=o.marks().find((e=>e.type===Uo.marks.link&&!e.attrs[Io])),a=s&&l;if(r.empty&&!a)return!1;if(s!==l)return!1;if(!t)return!0;const c=s;let h,u,d,p;if(c){const r=i.parent.nodeAt(i.parentOffset-i.textOffset);u=i.pos-i.textOffset,h=u+r.nodeSize,d=r.text,p=c.attrs.href;const o=new st(n.resolve(u),n.resolve(h));t(e.tr.setSelection(o))}else h=o.pos,u=i.pos,d=e.doc.textBetween(i.pos,o.pos),p="";const f=c&&(()=>this.view.dispatch(this.view.state.tr.step(new _e(u,h,c))));return this.modal=new Ss(this.modalEl,{onClear:f,onConfirm:({text:e,url:t})=>{const n=Uo.marks.link.create({href:t}),r=Uo.text(e,[n]);this.view.dispatch(this.view.state.tr.replaceSelectionWith(r,!1))},text:d,url:p}),!0},this.toggleMark=e=>{hs(e)(this.view.state,this.view.dispatch),this.view.focus()},this.updateToolbarForSelection=e=>{this.unhighlightSelectedAttrs();const t=this.getSelectedFormatAttrs(e);t&&t.forEach((e=>{const t=this.toolbarEl.querySelector(`[data-format=${e}]`);t&&t.classList.add("selected")}))},this.unhighlightSelectedAttrs=()=>{this.toolbarEl.querySelectorAll(".selected").forEach((e=>{e.classList.remove("selected")}))},this.getSelectedFormatAndMarks=e=>{if(!e.selection)return;const t=[],{$from:n,$to:r}=e.selection,i=n.blockRange(r,(e=>e.type!==Uo.nodes.list_item));let o=null;for(let e=i.startIndex;ee.type))),t},this.getSelectedFormatAttrs=e=>{const[t,...n]=this.getSelectedFormatAndMarks(e),r=[];switch(t){case Uo.nodes.heading1:case Uo.nodes.heading2:case Uo.nodes.heading3:r.push("heading");break;case Uo.nodes.paragraph:r.push("paragraph");break;case Uo.nodes.unordered_list:r.push("unordered_list");break;case Uo.nodes.ordered_list:r.push("ordered_list");break;case Uo.nodes.checklist_item:r.push("checklist_item");break;default:r.push(null)}return n.forEach((e=>{switch(e){case Uo.marks.link:case Uo.marks.inline_link:r.push("link");break;case Uo.marks.em:r.push("em");break;case Uo.marks.strong:r.push("strong");break;case Uo.marks.code:r.push("code")}})),r},this.handleToolbarClick=e=>{const t=e.target.closest(`[${ks}]`);t&&(e.stopPropagation(),this.applyFormat(t.getAttribute(ks)))},this.applyFormat=e=>{switch(e){case"undo":so(this.view.state,this.view.dispatch);break;case"redo":lo(this.view.state,this.view.dispatch);break;case"paragraph":this.swapTextBlock(Uo.nodes.paragraph);break;case"code_block":this.swapTextBlock(Uo.nodes.code_block);break;case"heading":this.promoteHeading(this.view.state,this.view.dispatch);break;case"unordered_list":this.toggleList(Uo.nodes.unordered_list,Uo.nodes.list_item);break;case"ordered_list":this.toggleList(Uo.nodes.ordered_list,Uo.nodes.list_item);break;case"checklist_item":this.toggleChecklistItem();break;case"strong":case"em":case"code":this.toggleMark(Uo.marks[e]);break;case"link":this.activateLinkModal(this.view.state,this.view.dispatch);break;case"indent":vs(this.view.state,this.view.dispatch);break;case"outdent":Ds(this.view.state,this.view.dispatch)}}}}const Es="show",As=new RegExp("^https?://"),Ms=new RegExp("^mailto:");class Os extends wt{static nodeToAnchorHref(e){return As.test(e)||Ms.test(e)?e:`http://${e}`}constructor(e){super({view:e=>(this.view=e,{destroy:()=>{this.hide()},update:(e,t)=>{this.checkSelection()}})}),this.checkSelection=()=>{const e=this.view.state.selection;if(!(e instanceof st))return;const{$cursor:t}=e,n=Boolean(t&&t.nodeBefore&&t.nodeAfter&&t.nodeBefore.marks.some((e=>e.type===Uo.marks.link))&&t.nodeAfter.marks.some((e=>e.type===Uo.marks.link)));if(!1===n)return void this.hide();const r=t.nodeBefore.marks.find((e=>e.type===Uo.marks.link));this.show(t,r.attrs.href,r.attrs[Io])},this.hide=()=>{this.tooltipEl.classList.remove(Es)},this.show=(e,t,n)=>{this.linkTextEl.innerText=t,this.anchorEl.href=Os.nodeToAnchorHref(t),this.tooltipEl.classList.toggle("yes-auto-link",n),this.tooltipEl.classList.add(Es);const{left:r,top:i}=this.view.coordsAtPos(e.pos),o=this.tooltipEl.offsetWidth,s=document.documentElement.clientWidth;this.tooltipEl.style.left=r+o>s?`${Math.max(5,r-o)}px`:`${Math.max(5,r)}px`;const l=this.view.root.body;this.tooltipEl.style.top=`${i-36+l.scrollTop}px`},this.tooltipEl=e}get linkTextEl(){return this.tooltipEl.querySelector("div.text")}get anchorEl(){return this.tooltipEl.querySelector("a.link-anchor")}}class Ts extends wt{constructor(e){super({view:t=>(this.view=t,this.el=e,this.el.addEventListener("click",this.handleClick),{destroy:()=>{this.el.removeEventListener("click",this.handleClick)}})}),this.handleClick=()=>{const{state:e}=this.view,{doc:t,tr:n}=e,r=t.nodeSize-2,i=e.doc.lastChild.type;(i===Uo.nodes.code_block||i.isLeaf)&&n.insert(r,Uo.nodes.paragraph.createAndFill()),n.setSelection(nt.atEnd(n.doc)),this.view.dispatch(n),this.view.focus()}}}const Ns={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let Fs;const Is=new Uint8Array(16);const Rs=[];for(let e=0;e<256;++e)Rs.push((e+256).toString(16).slice(1));function Bs(e,t=0){return(Rs[e[t+0]]+Rs[e[t+1]]+Rs[e[t+2]]+Rs[e[t+3]]+"-"+Rs[e[t+4]]+Rs[e[t+5]]+"-"+Rs[e[t+6]]+Rs[e[t+7]]+"-"+Rs[e[t+8]]+Rs[e[t+9]]+"-"+Rs[e[t+10]]+Rs[e[t+11]]+Rs[e[t+12]]+Rs[e[t+13]]+Rs[e[t+14]]+Rs[e[t+15]]).toLowerCase()}const zs=function(e,t,n){if(Ns.randomUUID&&!t&&!e)return Ns.randomUUID();const r=(e=e||{}).random??e.rng?.()??function(){if(!Fs){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");Fs=crypto.getRandomValues.bind(crypto)}return Fs(Is)}();if(r.length<16)throw new Error("Random bytes length must be >= 16");if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){if((n=n||0)<0||n+16>t.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[n+e]=r[e];return t}return Bs(r)};var Ls=n(92),Ps=n.n(Ls);const qs="com.dylanonelson.sn-editor";function $s(e){return e&&e.content&&e.content[qs]||null}function Vs(e){return e?e.uuid:null}class js{constructor(){let e;this._item=null,this.shouldCallListeners=(e,t)=>!e.isMetadataUpdate&&(Vs(e)!==Vs(t)||function(e){const t=$s(e);return t&&t.lastSavedBy?t.lastSavedBy:null}(e)!==this._id),this._id=zs(),this._listeners=[],this._ready=new Promise((t=>{e=t})),this.componentManager=new(Ps())({targetWindow:window,options:{debug:!0,acceptsThemes:!0},onReady:()=>{this.componentManager.streamContextItem((t=>{console.debug("streamContextItem update:",t);const n=this.shouldCallListeners(t,this._item);this._item=t,n&&this._listeners.forEach((e=>{e(t)})),e()}))}})}get latestDoc(){return function(e){const t=$s(e);return t&&t.doc?t.doc:null}(this._item)}get latestText(){return(e=this._item)&&e.content&&e.content.text?e.content.text:null;var e}onUpdate(e){return this._listeners.push(e),()=>{this._listeners=this._listeners.filter((t=>t!==e))}}ready(){return this._ready}saveNote(e,t,n){const r=Object.assign(Object.assign({},this._item),{content:Object.assign(Object.assign({},this._item.content),{[qs]:{doc:e,lastSavedBy:this._id},text:t,preview_plain:n})});this.componentManager.saveItemWithPresave(r,(()=>{}),(()=>{}))}}js.SN_ITEM_SAVE_KEY="com.dylanonelson.sn-editor",js.itemSelectors={};const Us=new js;var Ws=n(415),Hs=n.n(Ws),Js=n(115),Ks=n.n(Js);const Gs="is-checked",Zs={checklist_item(e,t,n){const r=document.createElement("div");r.classList.add("checklist-item");const i=document.createElement("div");i.classList.add("checkbox"),e.attrs.status===$o.DONE?(i.classList.add(Gs),i.innerHTML=Hs()):i.innerHTML=Ks();const o=document.createElement("div");o.classList.add("click-target"),o.contentEditable="false",o.tabIndex=0;const s=document.createElement("p");o.appendChild(i),r.appendChild(o),r.appendChild(s);const l=e=>{const{relatedTarget:n,target:r}=e;if(!1===o.contains(n))return;r===t.dom&&t.focus()},a=e=>{if(!1===o.contains(e.target))return;const r=i.classList.contains(Gs),{tr:s}=t.state,l=n();s.setNodeMarkup(l,void 0,{status:r?$o.EMPTY:$o.DONE}),t.dispatch(s)};return t.dom.addEventListener("blur",l),t.dom.addEventListener("click",a),{dom:r,contentDOM:s,destroy(){t.dom.removeEventListener("blur",l),t.dom.removeEventListener("click",a)}}}};for(var Ys={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Qs={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Xs="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),el="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),tl=0;tl<10;tl++)Ys[48+tl]=Ys[96+tl]=String(tl);for(tl=1;tl<=24;tl++)Ys[tl+111]="F"+tl;for(tl=65;tl<=90;tl++)Ys[tl]=String.fromCharCode(tl+32),Qs[tl]=String.fromCharCode(tl);for(var nl in Ys)Qs.hasOwnProperty(nl)||(Qs[nl]=Ys[nl]);const rl="undefined"!=typeof navigator&&/Mac|iP(hone|[oa]d)/.test(navigator.platform),il="undefined"!=typeof navigator&&/Win/.test(navigator.platform);function ol(e){let t,n,r,i,o=e.split(/-(?!$)/),s=o[o.length-1];"Space"==s&&(s=" ");for(let e=0;e!1!==function(e){const{$cursor:t}=e.selection;return Boolean(t&&t.parent.type===Uo.nodes.checklist_item)}(e)&&(!1!==n.endOfTextblock("left")&&void(0===e.selection.$cursor.index(0)&&function(e,t=null){return function(n,r){let i=!1;for(let r=0;r{if(i)return!1;if(r.isTextblock&&!r.hasMarkup(e,t))if(r.type==e)i=!0;else{let t=n.doc.resolve(o),r=t.index();i=t.parent.canReplaceWith(r,r+1,e)}}))}if(!i)return!1;if(r){let i=n.tr;for(let r=0;r=55296&&e<=57343?"���":String.fromCharCode(e),r+=6;continue}}if(240==(248&o)&&r+91114111?t+="����":(e-=65536,t+=String.fromCharCode(55296+(e>>10),56320+(1023&e))),r+=9;continue}}t+="�"}}return t}))}dl.defaultChars=";/?:@&=+$,#",dl.componentChars="";const pl=dl,fl={};function ml(e,t,n){"string"!=typeof t&&(n=t,t=ml.defaultChars),void 0===n&&(n=!0);const r=function(e){let t=fl[e];if(t)return t;t=fl[e]=[];for(let e=0;e<128;e++){const n=String.fromCharCode(e);/^[0-9a-z]$/i.test(n)?t.push(n):t.push("%"+("0"+e.toString(16).toUpperCase()).slice(-2))}for(let n=0;n=55296&&s<=57343){if(s>=55296&&s<=56319&&t+1=56320&&n<=57343){i+=encodeURIComponent(e[t]+e[t+1]),t++;continue}}i+="%EF%BF%BD"}else i+=encodeURIComponent(e[t])}return i}ml.defaultChars=";/?:@&=+$,-_.!~*'()#",ml.componentChars="-_.!~*'()";const gl=ml;function yl(e){let t="";return t+=e.protocol||"",t+=e.slashes?"//":"",t+=e.auth?e.auth+"@":"",e.hostname&&-1!==e.hostname.indexOf(":")?t+="["+e.hostname+"]":t+=e.hostname||"",t+=e.port?":"+e.port:"",t+=e.pathname||"",t+=e.search||"",t+=e.hash||"",t}function kl(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}const bl=/^([a-z0-9.+-]+:)/i,vl=/:[0-9]*$/,wl=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,xl=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),Cl=["'"].concat(xl),Dl=["%","/","?",";","#"].concat(Cl),Sl=["/","?","#"],_l=/^[+a-z0-9A-Z_-]{0,63}$/,El=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,Al={javascript:!0,"javascript:":!0},Ml={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};kl.prototype.parse=function(e,t){let n,r,i,o=e;if(o=o.trim(),!t&&1===e.split("#").length){const e=wl.exec(o);if(e)return this.pathname=e[1],e[2]&&(this.search=e[2]),this}let s=bl.exec(o);if(s&&(s=s[0],n=s.toLowerCase(),this.protocol=s,o=o.substr(s.length)),(t||s||o.match(/^\/\/[^@\/]+@[^@\/]+/))&&(i="//"===o.substr(0,2),!i||s&&Al[s]||(o=o.substr(2),this.slashes=!0)),!Al[s]&&(i||s&&!Ml[s])){let e,t,n=-1;for(let e=0;e127?r+="x":r+=n[e];if(!r.match(_l)){const r=e.slice(0,t),i=e.slice(t+1),s=n.match(El);s&&(r.push(s[1]),i.unshift(s[2])),i.length&&(o=i.join(".")+o),this.hostname=r.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),s&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}const l=o.indexOf("#");-1!==l&&(this.hash=o.substr(l),o=o.slice(0,l));const a=o.indexOf("?");return-1!==a&&(this.search=o.substr(a),o=o.slice(0,a)),o&&(this.pathname=o),Ml[n]&&this.hostname&&!this.pathname&&(this.pathname=""),this},kl.prototype.parseHost=function(e){let t=vl.exec(e);t&&(t=t[0],":"!==t&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)};const Ol=function(e,t){if(e&&e instanceof kl)return e;const n=new kl;return n.parse(e,t),n},Tl=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061D-\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1B7D\u1B7E\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u2E52-\u2E5D\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3E]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A\uDFE2]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/,Nl=/[\$\+<->\^`\|~\xA2-\xA6\xA8\xA9\xAC\xAE-\xB1\xB4\xB8\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0384\u0385\u03F6\u0482\u058D-\u058F\u0606-\u0608\u060B\u060E\u060F\u06DE\u06E9\u06FD\u06FE\u07F6\u07FE\u07FF\u0888\u09F2\u09F3\u09FA\u09FB\u0AF1\u0B70\u0BF3-\u0BFA\u0C7F\u0D4F\u0D79\u0E3F\u0F01-\u0F03\u0F13\u0F15-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE\u0FCF\u0FD5-\u0FD8\u109E\u109F\u1390-\u1399\u166D\u17DB\u1940\u19DE-\u19FF\u1B61-\u1B6A\u1B74-\u1B7C\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2044\u2052\u207A-\u207C\u208A-\u208C\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2307\u230C-\u2328\u232B-\u2426\u2440-\u244A\u249C-\u24E9\u2500-\u2767\u2794-\u27C4\u27C7-\u27E5\u27F0-\u2982\u2999-\u29D7\u29DC-\u29FB\u29FE-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2E50\u2E51\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3004\u3012\u3013\u3020\u3036\u3037\u303E\u303F\u309B\u309C\u3190\u3191\u3196-\u319F\u31C0-\u31E3\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uAA77-\uAA79\uAB5B\uAB6A\uAB6B\uFB29\uFBB2-\uFBC2\uFD40-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE62\uFE64-\uFE66\uFE69\uFF04\uFF0B\uFF1C-\uFF1E\uFF3E\uFF40\uFF5C\uFF5E\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC]|\uD802[\uDC77\uDC78\uDEC8]|\uD805\uDF3F|\uD807[\uDFD5-\uDFF1]|\uD81A[\uDF3C-\uDF3F\uDF45]|\uD82F\uDC9C|\uD833[\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85\uDE86]|\uD838[\uDD4F\uDEFF]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0\uDCB1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC5\uDECE-\uDEDB\uDEE0-\uDEE8\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFCA]/,Fl=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Il=/[\0-\x1F\x7F-\x9F]/,Rl=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u0890\u0891\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD80D[\uDC30-\uDC3F]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/,Bl=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/,zl=new Uint16Array('ᵁ<Õıʊҝջאٵ۞ޢߖࠏ੊ઑඡ๭༉༦჊ረዡᐕᒝᓃᓟᔥ\0\0\0\0\0\0ᕫᛍᦍᰒᷝ὾⁠↰⊍⏀⏻⑂⠤⤒ⴈ⹈⿎〖㊺㘹㞬㣾㨨㩱㫠㬮ࠀEMabcfglmnoprstu\\bfms„‹•˜¦³¹ÈÏlig耻Æ䃆P耻&䀦cute耻Á䃁reve;䄂Āiyx}rc耻Â䃂;䐐r;쀀𝔄rave耻À䃀pha;䎑acr;䄀d;橓Āgp¡on;䄄f;쀀𝔸plyFunction;恡ing耻Å䃅Ācs¾Ãr;쀀𝒜ign;扔ilde耻Ã䃃ml耻Ä䃄ЀaceforsuåûþėĜĢħĪĀcrêòkslash;或Ŷöø;櫧ed;挆y;䐑ƀcrtąċĔause;戵noullis;愬a;䎒r;쀀𝔅pf;쀀𝔹eve;䋘còēmpeq;扎܀HOacdefhilorsuōőŖƀƞƢƵƷƺǜȕɳɸɾcy;䐧PY耻©䂩ƀcpyŝŢźute;䄆Ā;iŧŨ拒talDifferentialD;慅leys;愭ȀaeioƉƎƔƘron;䄌dil耻Ç䃇rc;䄈nint;戰ot;䄊ĀdnƧƭilla;䂸terDot;䂷òſi;䎧rcleȀDMPTLJNjǑǖot;抙inus;抖lus;投imes;抗oĀcsǢǸkwiseContourIntegral;戲eCurlyĀDQȃȏoubleQuote;思uote;怙ȀlnpuȞȨɇɕonĀ;eȥȦ户;橴ƀgitȯȶȺruent;扡nt;戯ourIntegral;戮ĀfrɌɎ;愂oduct;成nterClockwiseContourIntegral;戳oss;樯cr;쀀𝒞pĀ;Cʄʅ拓ap;才րDJSZacefiosʠʬʰʴʸˋ˗ˡ˦̳ҍĀ;oŹʥtrahd;椑cy;䐂cy;䐅cy;䐏ƀgrsʿ˄ˇger;怡r;憡hv;櫤Āayː˕ron;䄎;䐔lĀ;t˝˞戇a;䎔r;쀀𝔇Āaf˫̧Ācm˰̢riticalȀADGT̖̜̀̆cute;䂴oŴ̋̍;䋙bleAcute;䋝rave;䁠ilde;䋜ond;拄ferentialD;慆Ѱ̽\0\0\0͔͂\0Ѕf;쀀𝔻ƀ;DE͈͉͍䂨ot;惜qual;扐blèCDLRUVͣͲ΂ϏϢϸontourIntegraìȹoɴ͹\0\0ͻ»͉nArrow;懓Āeo·ΤftƀARTΐΖΡrrow;懐ightArrow;懔eåˊngĀLRΫτeftĀARγιrrow;柸ightArrow;柺ightArrow;柹ightĀATϘϞrrow;懒ee;抨pɁϩ\0\0ϯrrow;懑ownArrow;懕erticalBar;戥ǹABLRTaВЪаўѿͼrrowƀ;BUНОТ憓ar;椓pArrow;懵reve;䌑eft˒к\0ц\0ѐightVector;楐eeVector;楞ectorĀ;Bљњ憽ar;楖ightǔѧ\0ѱeeVector;楟ectorĀ;BѺѻ懁ar;楗eeĀ;A҆҇护rrow;憧ĀctҒҗr;쀀𝒟rok;䄐ࠀNTacdfglmopqstuxҽӀӄӋӞӢӧӮӵԡԯԶՒ՝ՠեG;䅊H耻Ð䃐cute耻É䃉ƀaiyӒӗӜron;䄚rc耻Ê䃊;䐭ot;䄖r;쀀𝔈rave耻È䃈ement;戈ĀapӺӾcr;䄒tyɓԆ\0\0ԒmallSquare;旻erySmallSquare;斫ĀgpԦԪon;䄘f;쀀𝔼silon;䎕uĀaiԼՉlĀ;TՂՃ橵ilde;扂librium;懌Āci՗՚r;愰m;橳a;䎗ml耻Ë䃋Āipժկsts;戃onentialE;慇ʀcfiosօֈ֍ֲ׌y;䐤r;쀀𝔉lledɓ֗\0\0֣mallSquare;旼erySmallSquare;斪Ͱֺ\0ֿ\0\0ׄf;쀀𝔽All;戀riertrf;愱cò׋؀JTabcdfgorstר׬ׯ׺؀ؒؖ؛؝أ٬ٲcy;䐃耻>䀾mmaĀ;d׷׸䎓;䏜reve;䄞ƀeiy؇،ؐdil;䄢rc;䄜;䐓ot;䄠r;쀀𝔊;拙pf;쀀𝔾eater̀EFGLSTصلَٖٛ٦qualĀ;Lؾؿ扥ess;招ullEqual;执reater;檢ess;扷lantEqual;橾ilde;扳cr;쀀𝒢;扫ЀAacfiosuڅڋږڛڞڪھۊRDcy;䐪Āctڐڔek;䋇;䁞irc;䄤r;愌lbertSpace;愋ǰگ\0ڲf;愍izontalLine;攀Āctۃۅòکrok;䄦mpńېۘownHumðįqual;扏܀EJOacdfgmnostuۺ۾܃܇܎ܚܞܡܨ݄ݸދޏޕcy;䐕lig;䄲cy;䐁cute耻Í䃍Āiyܓܘrc耻Î䃎;䐘ot;䄰r;愑rave耻Ì䃌ƀ;apܠܯܿĀcgܴܷr;䄪inaryI;慈lieóϝǴ݉\0ݢĀ;eݍݎ戬Āgrݓݘral;戫section;拂isibleĀCTݬݲomma;恣imes;恢ƀgptݿރވon;䄮f;쀀𝕀a;䎙cr;愐ilde;䄨ǫޚ\0ޞcy;䐆l耻Ï䃏ʀcfosuެ޷޼߂ߐĀiyޱ޵rc;䄴;䐙r;쀀𝔍pf;쀀𝕁ǣ߇\0ߌr;쀀𝒥rcy;䐈kcy;䐄΀HJacfosߤߨ߽߬߱ࠂࠈcy;䐥cy;䐌ppa;䎚Āey߶߻dil;䄶;䐚r;쀀𝔎pf;쀀𝕂cr;쀀𝒦րJTaceflmostࠥࠩࠬࡐࡣ঳সে্਷ੇcy;䐉耻<䀼ʀcmnpr࠷࠼ࡁࡄࡍute;䄹bda;䎛g;柪lacetrf;愒r;憞ƀaeyࡗ࡜ࡡron;䄽dil;䄻;䐛Āfsࡨ॰tԀACDFRTUVarࡾࢩࢱࣦ࣠ࣼयज़ΐ४Ānrࢃ࢏gleBracket;柨rowƀ;BR࢙࢚࢞憐ar;懤ightArrow;懆eiling;挈oǵࢷ\0ࣃbleBracket;柦nǔࣈ\0࣒eeVector;楡ectorĀ;Bࣛࣜ懃ar;楙loor;挊ightĀAV࣯ࣵrrow;憔ector;楎Āerँगeƀ;AVउऊऐ抣rrow;憤ector;楚iangleƀ;BEतथऩ抲ar;槏qual;抴pƀDTVषूौownVector;楑eeVector;楠ectorĀ;Bॖॗ憿ar;楘ectorĀ;B॥०憼ar;楒ightáΜs̀EFGLSTॾঋকঝঢভqualGreater;拚ullEqual;扦reater;扶ess;檡lantEqual;橽ilde;扲r;쀀𝔏Ā;eঽা拘ftarrow;懚idot;䄿ƀnpw৔ਖਛgȀLRlr৞৷ਂਐeftĀAR০৬rrow;柵ightArrow;柷ightArrow;柶eftĀarγਊightáοightáϊf;쀀𝕃erĀLRਢਬeftArrow;憙ightArrow;憘ƀchtਾੀੂòࡌ;憰rok;䅁;扪Ѐacefiosuਗ਼੝੠੷੼અઋ઎p;椅y;䐜Ādl੥੯iumSpace;恟lintrf;愳r;쀀𝔐nusPlus;戓pf;쀀𝕄cò੶;䎜ҀJacefostuણધભીଔଙඑ඗ඞcy;䐊cute;䅃ƀaey઴હાron;䅇dil;䅅;䐝ƀgswે૰଎ativeƀMTV૓૟૨ediumSpace;怋hiĀcn૦૘ë૙eryThiî૙tedĀGL૸ଆreaterGreateòٳessLesóੈLine;䀊r;쀀𝔑ȀBnptଢନଷ଺reak;恠BreakingSpace;䂠f;愕ڀ;CDEGHLNPRSTV୕ୖ୪୼஡௫ఄ౞಄ದ೘ൡඅ櫬Āou୛୤ngruent;扢pCap;扭oubleVerticalBar;戦ƀlqxஃஊ஛ement;戉ualĀ;Tஒஓ扠ilde;쀀≂̸ists;戄reater΀;EFGLSTஶஷ஽௉௓௘௥扯qual;扱ullEqual;쀀≧̸reater;쀀≫̸ess;批lantEqual;쀀⩾̸ilde;扵umpń௲௽ownHump;쀀≎̸qual;쀀≏̸eĀfsఊధtTriangleƀ;BEచఛడ拪ar;쀀⧏̸qual;括s̀;EGLSTవశ఼ౄోౘ扮qual;扰reater;扸ess;쀀≪̸lantEqual;쀀⩽̸ilde;扴estedĀGL౨౹reaterGreater;쀀⪢̸essLess;쀀⪡̸recedesƀ;ESಒಓಛ技qual;쀀⪯̸lantEqual;拠ĀeiಫಹverseElement;戌ghtTriangleƀ;BEೋೌ೒拫ar;쀀⧐̸qual;拭ĀquೝഌuareSuĀbp೨೹setĀ;E೰ೳ쀀⊏̸qual;拢ersetĀ;Eഃആ쀀⊐̸qual;拣ƀbcpഓതൎsetĀ;Eഛഞ쀀⊂⃒qual;抈ceedsȀ;ESTലള഻െ抁qual;쀀⪰̸lantEqual;拡ilde;쀀≿̸ersetĀ;E൘൛쀀⊃⃒qual;抉ildeȀ;EFT൮൯൵ൿ扁qual;扄ullEqual;扇ilde;扉erticalBar;戤cr;쀀𝒩ilde耻Ñ䃑;䎝܀Eacdfgmoprstuvලෂ෉෕ෛ෠෧෼ขภยา฿ไlig;䅒cute耻Ó䃓Āiy෎ීrc耻Ô䃔;䐞blac;䅐r;쀀𝔒rave耻Ò䃒ƀaei෮ෲ෶cr;䅌ga;䎩cron;䎟pf;쀀𝕆enCurlyĀDQฎบoubleQuote;怜uote;怘;橔Āclวฬr;쀀𝒪ash耻Ø䃘iŬื฼de耻Õ䃕es;樷ml耻Ö䃖erĀBP๋๠Āar๐๓r;怾acĀek๚๜;揞et;掴arenthesis;揜Ҁacfhilors๿ງຊຏຒດຝະ໼rtialD;戂y;䐟r;쀀𝔓i;䎦;䎠usMinus;䂱Āipຢອncareplanåڝf;愙Ȁ;eio຺ູ໠໤檻cedesȀ;EST່້໏໚扺qual;檯lantEqual;扼ilde;找me;怳Ādp໩໮uct;戏ortionĀ;aȥ໹l;戝Āci༁༆r;쀀𝒫;䎨ȀUfos༑༖༛༟OT耻"䀢r;쀀𝔔pf;愚cr;쀀𝒬؀BEacefhiorsu༾གྷཇའཱིྦྷྪྭ႖ႩႴႾarr;椐G耻®䂮ƀcnrཎནབute;䅔g;柫rĀ;tཛྷཝ憠l;椖ƀaeyཧཬཱron;䅘dil;䅖;䐠Ā;vླྀཹ愜erseĀEUྂྙĀlq྇ྎement;戋uilibrium;懋pEquilibrium;楯r»ཹo;䎡ghtЀACDFTUVa࿁࿫࿳ဢဨၛႇϘĀnr࿆࿒gleBracket;柩rowƀ;BL࿜࿝࿡憒ar;懥eftArrow;懄eiling;按oǵ࿹\0စbleBracket;柧nǔည\0နeeVector;楝ectorĀ;Bဝသ懂ar;楕loor;挋Āerိ၃eƀ;AVဵံြ抢rrow;憦ector;楛iangleƀ;BEၐၑၕ抳ar;槐qual;抵pƀDTVၣၮၸownVector;楏eeVector;楜ectorĀ;Bႂႃ憾ar;楔ectorĀ;B႑႒懀ar;楓Āpuႛ႞f;愝ndImplies;楰ightarrow;懛ĀchႹႼr;愛;憱leDelayed;槴ڀHOacfhimoqstuფჱჷჽᄙᄞᅑᅖᅡᅧᆵᆻᆿĀCcჩხHcy;䐩y;䐨FTcy;䐬cute;䅚ʀ;aeiyᄈᄉᄎᄓᄗ檼ron;䅠dil;䅞rc;䅜;䐡r;쀀𝔖ortȀDLRUᄪᄴᄾᅉownArrow»ОeftArrow»࢚ightArrow»࿝pArrow;憑gma;䎣allCircle;战pf;쀀𝕊ɲᅭ\0\0ᅰt;戚areȀ;ISUᅻᅼᆉᆯ斡ntersection;抓uĀbpᆏᆞsetĀ;Eᆗᆘ抏qual;抑ersetĀ;Eᆨᆩ抐qual;抒nion;抔cr;쀀𝒮ar;拆ȀbcmpᇈᇛሉላĀ;sᇍᇎ拐etĀ;Eᇍᇕqual;抆ĀchᇠህeedsȀ;ESTᇭᇮᇴᇿ扻qual;檰lantEqual;扽ilde;承Tháྌ;我ƀ;esሒሓሣ拑rsetĀ;Eሜም抃qual;抇et»ሓրHRSacfhiorsሾቄ቉ቕ቞ቱቶኟዂወዑORN耻Þ䃞ADE;愢ĀHc቎ቒcy;䐋y;䐦Ābuቚቜ;䀉;䎤ƀaeyብቪቯron;䅤dil;䅢;䐢r;쀀𝔗Āeiቻ኉Dzኀ\0ኇefore;戴a;䎘Ācn኎ኘkSpace;쀀  Space;怉ldeȀ;EFTካኬኲኼ戼qual;扃ullEqual;扅ilde;扈pf;쀀𝕋ipleDot;惛Āctዖዛr;쀀𝒯rok;䅦ૡዷጎጚጦ\0ጬጱ\0\0\0\0\0ጸጽ፷ᎅ\0᏿ᐄᐊᐐĀcrዻጁute耻Ú䃚rĀ;oጇገ憟cir;楉rǣጓ\0጖y;䐎ve;䅬Āiyጞጣrc耻Û䃛;䐣blac;䅰r;쀀𝔘rave耻Ù䃙acr;䅪Ādiፁ፩erĀBPፈ፝Āarፍፐr;䁟acĀekፗፙ;揟et;掵arenthesis;揝onĀ;P፰፱拃lus;抎Āgp፻፿on;䅲f;쀀𝕌ЀADETadps᎕ᎮᎸᏄϨᏒᏗᏳrrowƀ;BDᅐᎠᎤar;椒ownArrow;懅ownArrow;憕quilibrium;楮eeĀ;AᏋᏌ报rrow;憥ownáϳerĀLRᏞᏨeftArrow;憖ightArrow;憗iĀ;lᏹᏺ䏒on;䎥ing;䅮cr;쀀𝒰ilde;䅨ml耻Ü䃜ҀDbcdefosvᐧᐬᐰᐳᐾᒅᒊᒐᒖash;披ar;櫫y;䐒ashĀ;lᐻᐼ抩;櫦Āerᑃᑅ;拁ƀbtyᑌᑐᑺar;怖Ā;iᑏᑕcalȀBLSTᑡᑥᑪᑴar;戣ine;䁼eparator;杘ilde;所ThinSpace;怊r;쀀𝔙pf;쀀𝕍cr;쀀𝒱dash;抪ʀcefosᒧᒬᒱᒶᒼirc;䅴dge;拀r;쀀𝔚pf;쀀𝕎cr;쀀𝒲Ȁfiosᓋᓐᓒᓘr;쀀𝔛;䎞pf;쀀𝕏cr;쀀𝒳ҀAIUacfosuᓱᓵᓹᓽᔄᔏᔔᔚᔠcy;䐯cy;䐇cy;䐮cute耻Ý䃝Āiyᔉᔍrc;䅶;䐫r;쀀𝔜pf;쀀𝕐cr;쀀𝒴ml;䅸ЀHacdefosᔵᔹᔿᕋᕏᕝᕠᕤcy;䐖cute;䅹Āayᕄᕉron;䅽;䐗ot;䅻Dzᕔ\0ᕛoWidtè૙a;䎖r;愨pf;愤cr;쀀𝒵௡ᖃᖊᖐ\0ᖰᖶᖿ\0\0\0\0ᗆᗛᗫᙟ᙭\0ᚕ᚛ᚲᚹ\0ᚾcute耻á䃡reve;䄃̀;Ediuyᖜᖝᖡᖣᖨᖭ戾;쀀∾̳;房rc耻â䃢te肻´̆;䐰lig耻æ䃦Ā;r²ᖺ;쀀𝔞rave耻à䃠ĀepᗊᗖĀfpᗏᗔsym;愵èᗓha;䎱ĀapᗟcĀclᗤᗧr;䄁g;樿ɤᗰ\0\0ᘊʀ;adsvᗺᗻᗿᘁᘇ戧nd;橕;橜lope;橘;橚΀;elmrszᘘᘙᘛᘞᘿᙏᙙ戠;榤e»ᘙsdĀ;aᘥᘦ戡ѡᘰᘲᘴᘶᘸᘺᘼᘾ;榨;榩;榪;榫;榬;榭;榮;榯tĀ;vᙅᙆ戟bĀ;dᙌᙍ抾;榝Āptᙔᙗh;戢»¹arr;捼Āgpᙣᙧon;䄅f;쀀𝕒΀;Eaeiop዁ᙻᙽᚂᚄᚇᚊ;橰cir;橯;扊d;手s;䀧roxĀ;e዁ᚒñᚃing耻å䃥ƀctyᚡᚦᚨr;쀀𝒶;䀪mpĀ;e዁ᚯñʈilde耻ã䃣ml耻ä䃤Āciᛂᛈoninôɲnt;樑ࠀNabcdefiklnoprsu᛭ᛱᜰ᜼ᝃᝈ᝸᝽០៦ᠹᡐᜍ᤽᥈ᥰot;櫭Ācrᛶ᜞kȀcepsᜀᜅᜍᜓong;扌psilon;䏶rime;怵imĀ;e᜚᜛戽q;拍Ŷᜢᜦee;抽edĀ;gᜬᜭ挅e»ᜭrkĀ;t፜᜷brk;掶Āoyᜁᝁ;䐱quo;怞ʀcmprtᝓ᝛ᝡᝤᝨausĀ;eĊĉptyv;榰séᜌnoõēƀahwᝯ᝱ᝳ;䎲;愶een;扬r;쀀𝔟g΀costuvwឍឝឳេ៕៛៞ƀaiuបពរðݠrc;旯p»፱ƀdptឤឨឭot;樀lus;樁imes;樂ɱឹ\0\0ើcup;樆ar;昅riangleĀdu៍្own;施p;斳plus;樄eåᑄåᒭarow;植ƀako៭ᠦᠵĀcn៲ᠣkƀlst៺֫᠂ozenge;槫riangleȀ;dlr᠒᠓᠘᠝斴own;斾eft;旂ight;斸k;搣Ʊᠫ\0ᠳƲᠯ\0ᠱ;斒;斑4;斓ck;斈ĀeoᠾᡍĀ;qᡃᡆ쀀=⃥uiv;쀀≡⃥t;挐Ȁptwxᡙᡞᡧᡬf;쀀𝕓Ā;tᏋᡣom»Ꮜtie;拈؀DHUVbdhmptuvᢅᢖᢪᢻᣗᣛᣬ᣿ᤅᤊᤐᤡȀLRlrᢎᢐᢒᢔ;敗;敔;敖;敓ʀ;DUduᢡᢢᢤᢦᢨ敐;敦;敩;敤;敧ȀLRlrᢳᢵᢷᢹ;敝;敚;敜;教΀;HLRhlrᣊᣋᣍᣏᣑᣓᣕ救;敬;散;敠;敫;敢;敟ox;槉ȀLRlrᣤᣦᣨᣪ;敕;敒;攐;攌ʀ;DUduڽ᣷᣹᣻᣽;敥;敨;攬;攴inus;抟lus;択imes;抠ȀLRlrᤙᤛᤝ᤟;敛;敘;攘;攔΀;HLRhlrᤰᤱᤳᤵᤷ᤻᤹攂;敪;敡;敞;攼;攤;攜Āevģ᥂bar耻¦䂦Ȁceioᥑᥖᥚᥠr;쀀𝒷mi;恏mĀ;e᜚᜜lƀ;bhᥨᥩᥫ䁜;槅sub;柈Ŭᥴ᥾lĀ;e᥹᥺怢t»᥺pƀ;Eeįᦅᦇ;檮Ā;qۜۛೡᦧ\0᧨ᨑᨕᨲ\0ᨷᩐ\0\0᪴\0\0᫁\0\0ᬡᬮ᭍᭒\0᯽\0ᰌƀcpr᦭ᦲ᧝ute;䄇̀;abcdsᦿᧀᧄ᧊᧕᧙戩nd;橄rcup;橉Āau᧏᧒p;橋p;橇ot;橀;쀀∩︀Āeo᧢᧥t;恁îړȀaeiu᧰᧻ᨁᨅǰ᧵\0᧸s;橍on;䄍dil耻ç䃧rc;䄉psĀ;sᨌᨍ橌m;橐ot;䄋ƀdmnᨛᨠᨦil肻¸ƭptyv;榲t脀¢;eᨭᨮ䂢räƲr;쀀𝔠ƀceiᨽᩀᩍy;䑇ckĀ;mᩇᩈ朓ark»ᩈ;䏇r΀;Ecefms᩟᩠ᩢᩫ᪤᪪᪮旋;槃ƀ;elᩩᩪᩭ䋆q;扗eɡᩴ\0\0᪈rrowĀlr᩼᪁eft;憺ight;憻ʀRSacd᪒᪔᪖᪚᪟»ཇ;擈st;抛irc;抚ash;抝nint;樐id;櫯cir;槂ubsĀ;u᪻᪼晣it»᪼ˬ᫇᫔᫺\0ᬊonĀ;eᫍᫎ䀺Ā;qÇÆɭ᫙\0\0᫢aĀ;t᫞᫟䀬;䁀ƀ;fl᫨᫩᫫戁îᅠeĀmx᫱᫶ent»᫩eóɍǧ᫾\0ᬇĀ;dኻᬂot;橭nôɆƀfryᬐᬔᬗ;쀀𝕔oäɔ脀©;sŕᬝr;愗Āaoᬥᬩrr;憵ss;朗Ācuᬲᬷr;쀀𝒸Ābpᬼ᭄Ā;eᭁᭂ櫏;櫑Ā;eᭉᭊ櫐;櫒dot;拯΀delprvw᭠᭬᭷ᮂᮬᯔ᯹arrĀlr᭨᭪;椸;椵ɰ᭲\0\0᭵r;拞c;拟arrĀ;p᭿ᮀ憶;椽̀;bcdosᮏᮐᮖᮡᮥᮨ截rcap;橈Āauᮛᮞp;橆p;橊ot;抍r;橅;쀀∪︀Ȁalrv᮵ᮿᯞᯣrrĀ;mᮼᮽ憷;椼yƀevwᯇᯔᯘqɰᯎ\0\0ᯒreã᭳uã᭵ee;拎edge;拏en耻¤䂤earrowĀlrᯮ᯳eft»ᮀight»ᮽeäᯝĀciᰁᰇoninôǷnt;戱lcty;挭ঀAHabcdefhijlorstuwz᰸᰻᰿ᱝᱩᱵᲊᲞᲬᲷ᳻᳿ᴍᵻᶑᶫᶻ᷆᷍rò΁ar;楥Ȁglrs᱈ᱍ᱒᱔ger;怠eth;愸òᄳhĀ;vᱚᱛ怐»ऊūᱡᱧarow;椏aã̕Āayᱮᱳron;䄏;䐴ƀ;ao̲ᱼᲄĀgrʿᲁr;懊tseq;橷ƀglmᲑᲔᲘ耻°䂰ta;䎴ptyv;榱ĀirᲣᲨsht;楿;쀀𝔡arĀlrᲳᲵ»ࣜ»သʀaegsv᳂͸᳖᳜᳠mƀ;oș᳊᳔ndĀ;ș᳑uit;晦amma;䏝in;拲ƀ;io᳧᳨᳸䃷de脀÷;o᳧ᳰntimes;拇nø᳷cy;䑒cɯᴆ\0\0ᴊrn;挞op;挍ʀlptuwᴘᴝᴢᵉᵕlar;䀤f;쀀𝕕ʀ;emps̋ᴭᴷᴽᵂqĀ;d͒ᴳot;扑inus;戸lus;戔quare;抡blebarwedgåúnƀadhᄮᵝᵧownarrowóᲃarpoonĀlrᵲᵶefôᲴighôᲶŢᵿᶅkaro÷གɯᶊ\0\0ᶎrn;挟op;挌ƀcotᶘᶣᶦĀryᶝᶡ;쀀𝒹;䑕l;槶rok;䄑Ādrᶰᶴot;拱iĀ;fᶺ᠖斿Āah᷀᷃ròЩaòྦangle;榦Āci᷒ᷕy;䑟grarr;柿ऀDacdefglmnopqrstuxḁḉḙḸոḼṉṡṾấắẽỡἪἷὄ὎὚ĀDoḆᴴoôᲉĀcsḎḔute耻é䃩ter;橮ȀaioyḢḧḱḶron;䄛rĀ;cḭḮ扖耻ê䃪lon;払;䑍ot;䄗ĀDrṁṅot;扒;쀀𝔢ƀ;rsṐṑṗ檚ave耻è䃨Ā;dṜṝ檖ot;檘Ȁ;ilsṪṫṲṴ檙nters;揧;愓Ā;dṹṺ檕ot;檗ƀapsẅẉẗcr;䄓tyƀ;svẒẓẕ戅et»ẓpĀ1;ẝẤijạả;怄;怅怃ĀgsẪẬ;䅋p;怂ĀgpẴẸon;䄙f;쀀𝕖ƀalsỄỎỒrĀ;sỊị拕l;槣us;橱iƀ;lvỚớở䎵on»ớ;䏵ȀcsuvỪỳἋἣĀioữḱrc»Ḯɩỹ\0\0ỻíՈantĀglἂἆtr»ṝess»Ṻƀaeiἒ἖Ἒls;䀽st;扟vĀ;DȵἠD;橸parsl;槥ĀDaἯἳot;打rr;楱ƀcdiἾὁỸr;愯oô͒ĀahὉὋ;䎷耻ð䃰Āmrὓὗl耻ë䃫o;悬ƀcipὡὤὧl;䀡sôծĀeoὬὴctatioîՙnentialåչৡᾒ\0ᾞ\0ᾡᾧ\0\0ῆῌ\0ΐ\0ῦῪ \0 ⁚llingdotseñṄy;䑄male;晀ƀilrᾭᾳ῁lig;耀ffiɩᾹ\0\0᾽g;耀ffig;耀ffl;쀀𝔣lig;耀filig;쀀fjƀaltῙ῜ῡt;晭ig;耀flns;斱of;䆒ǰ΅\0ῳf;쀀𝕗ĀakֿῷĀ;vῼ´拔;櫙artint;樍Āao‌⁕Ācs‑⁒ႉ‸⁅⁈\0⁐β•‥‧‪‬\0‮耻½䂽;慓耻¼䂼;慕;慙;慛Ƴ‴\0‶;慔;慖ʴ‾⁁\0\0⁃耻¾䂾;慗;慜5;慘ƶ⁌\0⁎;慚;慝8;慞l;恄wn;挢cr;쀀𝒻ࢀEabcdefgijlnorstv₂₉₟₥₰₴⃰⃵⃺⃿℃ℒℸ̗ℾ⅒↞Ā;lٍ₇;檌ƀcmpₐₕ₝ute;䇵maĀ;dₜ᳚䎳;檆reve;䄟Āiy₪₮rc;䄝;䐳ot;䄡Ȁ;lqsؾق₽⃉ƀ;qsؾٌ⃄lanô٥Ȁ;cdl٥⃒⃥⃕c;檩otĀ;o⃜⃝檀Ā;l⃢⃣檂;檄Ā;e⃪⃭쀀⋛︀s;檔r;쀀𝔤Ā;gٳ؛mel;愷cy;䑓Ȁ;Eajٚℌℎℐ;檒;檥;檤ȀEaesℛℝ℩ℴ;扩pĀ;p℣ℤ檊rox»ℤĀ;q℮ℯ檈Ā;q℮ℛim;拧pf;쀀𝕘Āci⅃ⅆr;愊mƀ;el٫ⅎ⅐;檎;檐茀>;cdlqr׮ⅠⅪⅮⅳⅹĀciⅥⅧ;檧r;橺ot;拗Par;榕uest;橼ʀadelsↄⅪ←ٖ↛ǰ↉\0↎proø₞r;楸qĀlqؿ↖lesó₈ií٫Āen↣↭rtneqq;쀀≩︀Å↪ԀAabcefkosy⇄⇇⇱⇵⇺∘∝∯≨≽ròΠȀilmr⇐⇔⇗⇛rsðᒄf»․ilôکĀdr⇠⇤cy;䑊ƀ;cwࣴ⇫⇯ir;楈;憭ar;意irc;䄥ƀalr∁∎∓rtsĀ;u∉∊晥it»∊lip;怦con;抹r;쀀𝔥sĀew∣∩arow;椥arow;椦ʀamopr∺∾≃≞≣rr;懿tht;戻kĀlr≉≓eftarrow;憩ightarrow;憪f;쀀𝕙bar;怕ƀclt≯≴≸r;쀀𝒽asè⇴rok;䄧Ābp⊂⊇ull;恃hen»ᱛૡ⊣\0⊪\0⊸⋅⋎\0⋕⋳\0\0⋸⌢⍧⍢⍿\0⎆⎪⎴cute耻í䃭ƀ;iyݱ⊰⊵rc耻î䃮;䐸Ācx⊼⊿y;䐵cl耻¡䂡ĀfrΟ⋉;쀀𝔦rave耻ì䃬Ȁ;inoܾ⋝⋩⋮Āin⋢⋦nt;樌t;戭fin;槜ta;愩lig;䄳ƀaop⋾⌚⌝ƀcgt⌅⌈⌗r;䄫ƀelpܟ⌏⌓inåގarôܠh;䄱f;抷ed;䆵ʀ;cfotӴ⌬⌱⌽⍁are;愅inĀ;t⌸⌹戞ie;槝doô⌙ʀ;celpݗ⍌⍐⍛⍡al;抺Āgr⍕⍙eróᕣã⍍arhk;樗rod;樼Ȁcgpt⍯⍲⍶⍻y;䑑on;䄯f;쀀𝕚a;䎹uest耻¿䂿Āci⎊⎏r;쀀𝒾nʀ;EdsvӴ⎛⎝⎡ӳ;拹ot;拵Ā;v⎦⎧拴;拳Ā;iݷ⎮lde;䄩ǫ⎸\0⎼cy;䑖l耻ï䃯̀cfmosu⏌⏗⏜⏡⏧⏵Āiy⏑⏕rc;䄵;䐹r;쀀𝔧ath;䈷pf;쀀𝕛ǣ⏬\0⏱r;쀀𝒿rcy;䑘kcy;䑔Ѐacfghjos␋␖␢␧␭␱␵␻ppaĀ;v␓␔䎺;䏰Āey␛␠dil;䄷;䐺r;쀀𝔨reen;䄸cy;䑅cy;䑜pf;쀀𝕜cr;쀀𝓀஀ABEHabcdefghjlmnoprstuv⑰⒁⒆⒍⒑┎┽╚▀♎♞♥♹♽⚚⚲⛘❝❨➋⟀⠁⠒ƀart⑷⑺⑼rò৆òΕail;椛arr;椎Ā;gঔ⒋;檋ar;楢ॣ⒥\0⒪\0⒱\0\0\0\0\0⒵Ⓔ\0ⓆⓈⓍ\0⓹ute;䄺mptyv;榴raîࡌbda;䎻gƀ;dlࢎⓁⓃ;榑åࢎ;檅uo耻«䂫rЀ;bfhlpst࢙ⓞⓦⓩ⓫⓮⓱⓵Ā;f࢝ⓣs;椟s;椝ë≒p;憫l;椹im;楳l;憢ƀ;ae⓿─┄檫il;椙Ā;s┉┊檭;쀀⪭︀ƀabr┕┙┝rr;椌rk;杲Āak┢┬cĀek┨┪;䁻;䁛Āes┱┳;榋lĀdu┹┻;榏;榍Ȁaeuy╆╋╖╘ron;䄾Ādi═╔il;䄼ìࢰâ┩;䐻Ȁcqrs╣╦╭╽a;椶uoĀ;rนᝆĀdu╲╷har;楧shar;楋h;憲ʀ;fgqs▋▌উ◳◿扤tʀahlrt▘▤▷◂◨rrowĀ;t࢙□aé⓶arpoonĀdu▯▴own»њp»०eftarrows;懇ightƀahs◍◖◞rrowĀ;sࣴࢧarpoonó྘quigarro÷⇰hreetimes;拋ƀ;qs▋ও◺lanôবʀ;cdgsব☊☍☝☨c;檨otĀ;o☔☕橿Ā;r☚☛檁;檃Ā;e☢☥쀀⋚︀s;檓ʀadegs☳☹☽♉♋pproøⓆot;拖qĀgq♃♅ôউgtò⒌ôছiíলƀilr♕࣡♚sht;楼;쀀𝔩Ā;Eজ♣;檑š♩♶rĀdu▲♮Ā;l॥♳;楪lk;斄cy;䑙ʀ;achtੈ⚈⚋⚑⚖rò◁orneòᴈard;楫ri;旺Āio⚟⚤dot;䅀ustĀ;a⚬⚭掰che»⚭ȀEaes⚻⚽⛉⛔;扨pĀ;p⛃⛄檉rox»⛄Ā;q⛎⛏檇Ā;q⛎⚻im;拦Ѐabnoptwz⛩⛴⛷✚✯❁❇❐Ānr⛮⛱g;柬r;懽rëࣁgƀlmr⛿✍✔eftĀar০✇ightá৲apsto;柼ightá৽parrowĀlr✥✩efô⓭ight;憬ƀafl✶✹✽r;榅;쀀𝕝us;樭imes;樴š❋❏st;戗áፎƀ;ef❗❘᠀旊nge»❘arĀ;l❤❥䀨t;榓ʀachmt❳❶❼➅➇ròࢨorneòᶌarĀ;d྘➃;業;怎ri;抿̀achiqt➘➝ੀ➢➮➻quo;怹r;쀀𝓁mƀ;egল➪➬;檍;檏Ābu┪➳oĀ;rฟ➹;怚rok;䅂萀<;cdhilqrࠫ⟒☹⟜⟠⟥⟪⟰Āci⟗⟙;檦r;橹reå◲mes;拉arr;楶uest;橻ĀPi⟵⟹ar;榖ƀ;ef⠀भ᠛旃rĀdu⠇⠍shar;楊har;楦Āen⠗⠡rtneqq;쀀≨︀Å⠞܀Dacdefhilnopsu⡀⡅⢂⢎⢓⢠⢥⢨⣚⣢⣤ઃ⣳⤂Dot;戺Ȁclpr⡎⡒⡣⡽r耻¯䂯Āet⡗⡙;時Ā;e⡞⡟朠se»⡟Ā;sျ⡨toȀ;dluျ⡳⡷⡻owîҌefôएðᏑker;斮Āoy⢇⢌mma;権;䐼ash;怔asuredangle»ᘦr;쀀𝔪o;愧ƀcdn⢯⢴⣉ro耻µ䂵Ȁ;acdᑤ⢽⣀⣄sôᚧir;櫰ot肻·Ƶusƀ;bd⣒ᤃ⣓戒Ā;uᴼ⣘;横ţ⣞⣡p;櫛ò−ðઁĀdp⣩⣮els;抧f;쀀𝕞Āct⣸⣽r;쀀𝓂pos»ᖝƀ;lm⤉⤊⤍䎼timap;抸ఀGLRVabcdefghijlmoprstuvw⥂⥓⥾⦉⦘⧚⧩⨕⨚⩘⩝⪃⪕⪤⪨⬄⬇⭄⭿⮮ⰴⱧⱼ⳩Āgt⥇⥋;쀀⋙̸Ā;v⥐௏쀀≫⃒ƀelt⥚⥲⥶ftĀar⥡⥧rrow;懍ightarrow;懎;쀀⋘̸Ā;v⥻ే쀀≪⃒ightarrow;懏ĀDd⦎⦓ash;抯ash;抮ʀbcnpt⦣⦧⦬⦱⧌la»˞ute;䅄g;쀀∠⃒ʀ;Eiop඄⦼⧀⧅⧈;쀀⩰̸d;쀀≋̸s;䅉roø඄urĀ;a⧓⧔普lĀ;s⧓ସdz⧟\0⧣p肻 ଷmpĀ;e௹ఀʀaeouy⧴⧾⨃⨐⨓ǰ⧹\0⧻;橃on;䅈dil;䅆ngĀ;dൾ⨊ot;쀀⩭̸p;橂;䐽ash;怓΀;Aadqsxஒ⨩⨭⨻⩁⩅⩐rr;懗rĀhr⨳⨶k;椤Ā;oᏲᏰot;쀀≐̸uiöୣĀei⩊⩎ar;椨í஘istĀ;s஠டr;쀀𝔫ȀEest௅⩦⩹⩼ƀ;qs஼⩭௡ƀ;qs஼௅⩴lanô௢ií௪Ā;rஶ⪁»ஷƀAap⪊⪍⪑rò⥱rr;憮ar;櫲ƀ;svྍ⪜ྌĀ;d⪡⪢拼;拺cy;䑚΀AEadest⪷⪺⪾⫂⫅⫶⫹rò⥦;쀀≦̸rr;憚r;急Ȁ;fqs఻⫎⫣⫯tĀar⫔⫙rro÷⫁ightarro÷⪐ƀ;qs఻⪺⫪lanôౕĀ;sౕ⫴»శiíౝĀ;rవ⫾iĀ;eచథiäඐĀpt⬌⬑f;쀀𝕟膀¬;in⬙⬚⬶䂬nȀ;Edvஉ⬤⬨⬮;쀀⋹̸ot;쀀⋵̸ǡஉ⬳⬵;拷;拶iĀ;vಸ⬼ǡಸ⭁⭃;拾;拽ƀaor⭋⭣⭩rȀ;ast୻⭕⭚⭟lleì୻l;쀀⫽⃥;쀀∂̸lint;樔ƀ;ceಒ⭰⭳uåಥĀ;cಘ⭸Ā;eಒ⭽ñಘȀAait⮈⮋⮝⮧rò⦈rrƀ;cw⮔⮕⮙憛;쀀⤳̸;쀀↝̸ghtarrow»⮕riĀ;eೋೖ΀chimpqu⮽⯍⯙⬄୸⯤⯯Ȁ;cerല⯆ഷ⯉uå൅;쀀𝓃ortɭ⬅\0\0⯖ará⭖mĀ;e൮⯟Ā;q൴൳suĀbp⯫⯭å೸åഋƀbcp⯶ⰑⰙȀ;Ees⯿ⰀഢⰄ抄;쀀⫅̸etĀ;eഛⰋqĀ;qണⰀcĀ;eലⰗñസȀ;EesⰢⰣൟⰧ抅;쀀⫆̸etĀ;e൘ⰮqĀ;qൠⰣȀgilrⰽⰿⱅⱇìௗlde耻ñ䃱çృiangleĀlrⱒⱜeftĀ;eచⱚñదightĀ;eೋⱥñ೗Ā;mⱬⱭ䎽ƀ;esⱴⱵⱹ䀣ro;愖p;怇ҀDHadgilrsⲏⲔⲙⲞⲣⲰⲶⳓⳣash;抭arr;椄p;쀀≍⃒ash;抬ĀetⲨⲬ;쀀≥⃒;쀀>⃒nfin;槞ƀAetⲽⳁⳅrr;椂;쀀≤⃒Ā;rⳊⳍ쀀<⃒ie;쀀⊴⃒ĀAtⳘⳜrr;椃rie;쀀⊵⃒im;쀀∼⃒ƀAan⳰⳴ⴂrr;懖rĀhr⳺⳽k;椣Ā;oᏧᏥear;椧ቓ᪕\0\0\0\0\0\0\0\0\0\0\0\0\0ⴭ\0ⴸⵈⵠⵥ⵲ⶄᬇ\0\0ⶍⶫ\0ⷈⷎ\0ⷜ⸙⸫⸾⹃Ācsⴱ᪗ute耻ó䃳ĀiyⴼⵅrĀ;c᪞ⵂ耻ô䃴;䐾ʀabios᪠ⵒⵗLjⵚlac;䅑v;樸old;榼lig;䅓Ācr⵩⵭ir;榿;쀀𝔬ͯ⵹\0\0⵼\0ⶂn;䋛ave耻ò䃲;槁Ābmⶈ෴ar;榵Ȁacitⶕ⶘ⶥⶨrò᪀Āir⶝ⶠr;榾oss;榻nå๒;槀ƀaeiⶱⶵⶹcr;䅍ga;䏉ƀcdnⷀⷅǍron;䎿;榶pf;쀀𝕠ƀaelⷔ⷗ǒr;榷rp;榹΀;adiosvⷪⷫⷮ⸈⸍⸐⸖戨rò᪆Ȁ;efmⷷⷸ⸂⸅橝rĀ;oⷾⷿ愴f»ⷿ耻ª䂪耻º䂺gof;抶r;橖lope;橗;橛ƀclo⸟⸡⸧ò⸁ash耻ø䃸l;折iŬⸯ⸴de耻õ䃵esĀ;aǛ⸺s;樶ml耻ö䃶bar;挽ૡ⹞\0⹽\0⺀⺝\0⺢⺹\0\0⻋ຜ\0⼓\0\0⼫⾼\0⿈rȀ;astЃ⹧⹲຅脀¶;l⹭⹮䂶leìЃɩ⹸\0\0⹻m;櫳;櫽y;䐿rʀcimpt⺋⺏⺓ᡥ⺗nt;䀥od;䀮il;怰enk;怱r;쀀𝔭ƀimo⺨⺰⺴Ā;v⺭⺮䏆;䏕maô੶ne;明ƀ;tv⺿⻀⻈䏀chfork»´;䏖Āau⻏⻟nĀck⻕⻝kĀ;h⇴⻛;愎ö⇴sҀ;abcdemst⻳⻴ᤈ⻹⻽⼄⼆⼊⼎䀫cir;樣ir;樢Āouᵀ⼂;樥;橲n肻±ຝim;樦wo;樧ƀipu⼙⼠⼥ntint;樕f;쀀𝕡nd耻£䂣Ԁ;Eaceinosu່⼿⽁⽄⽇⾁⾉⾒⽾⾶;檳p;檷uå໙Ā;c໎⽌̀;acens່⽙⽟⽦⽨⽾pproø⽃urlyeñ໙ñ໎ƀaes⽯⽶⽺pprox;檹qq;檵im;拨iíໟmeĀ;s⾈ຮ怲ƀEas⽸⾐⽺ð⽵ƀdfp໬⾙⾯ƀals⾠⾥⾪lar;挮ine;挒urf;挓Ā;t໻⾴ï໻rel;抰Āci⿀⿅r;쀀𝓅;䏈ncsp;怈̀fiopsu⿚⋢⿟⿥⿫⿱r;쀀𝔮pf;쀀𝕢rime;恗cr;쀀𝓆ƀaeo⿸〉〓tĀei⿾々rnionóڰnt;樖stĀ;e【】䀿ñἙô༔઀ABHabcdefhilmnoprstux぀けさすムㄎㄫㅇㅢㅲㆎ㈆㈕㈤㈩㉘㉮㉲㊐㊰㊷ƀartぇおがròႳòϝail;検aròᱥar;楤΀cdenqrtとふへみわゔヌĀeuねぱ;쀀∽̱te;䅕iãᅮmptyv;榳gȀ;del࿑らるろ;榒;榥å࿑uo耻»䂻rր;abcfhlpstw࿜ガクシスゼゾダッデナp;極Ā;f࿠ゴs;椠;椳s;椞ë≝ð✮l;楅im;楴l;憣;憝Āaiパフil;椚oĀ;nホボ戶aló༞ƀabrョリヮrò៥rk;杳ĀakンヽcĀekヹ・;䁽;䁝Āes㄂㄄;榌lĀduㄊㄌ;榎;榐Ȁaeuyㄗㄜㄧㄩron;䅙Ādiㄡㄥil;䅗ì࿲âヺ;䑀Ȁclqsㄴㄷㄽㅄa;椷dhar;楩uoĀ;rȎȍh;憳ƀacgㅎㅟངlȀ;ipsླྀㅘㅛႜnåႻarôྩt;断ƀilrㅩဣㅮsht;楽;쀀𝔯ĀaoㅷㆆrĀduㅽㅿ»ѻĀ;l႑ㆄ;楬Ā;vㆋㆌ䏁;䏱ƀgns㆕ㇹㇼht̀ahlrstㆤㆰ㇂㇘㇤㇮rrowĀ;t࿜ㆭaéトarpoonĀduㆻㆿowîㅾp»႒eftĀah㇊㇐rrowó࿪arpoonóՑightarrows;應quigarro÷ニhreetimes;拌g;䋚ingdotseñἲƀahm㈍㈐㈓rò࿪aòՑ;怏oustĀ;a㈞㈟掱che»㈟mid;櫮Ȁabpt㈲㈽㉀㉒Ānr㈷㈺g;柭r;懾rëဃƀafl㉇㉊㉎r;榆;쀀𝕣us;樮imes;樵Āap㉝㉧rĀ;g㉣㉤䀩t;榔olint;樒arò㇣Ȁachq㉻㊀Ⴜ㊅quo;怺r;쀀𝓇Ābu・㊊oĀ;rȔȓƀhir㊗㊛㊠reåㇸmes;拊iȀ;efl㊪ၙᠡ㊫方tri;槎luhar;楨;愞ൡ㋕㋛㋟㌬㌸㍱\0㍺㎤\0\0㏬㏰\0㐨㑈㑚㒭㒱㓊㓱\0㘖\0\0㘳cute;䅛quï➺Ԁ;Eaceinpsyᇭ㋳㋵㋿㌂㌋㌏㌟㌦㌩;檴ǰ㋺\0㋼;檸on;䅡uåᇾĀ;dᇳ㌇il;䅟rc;䅝ƀEas㌖㌘㌛;檶p;檺im;择olint;樓iíሄ;䑁otƀ;be㌴ᵇ㌵担;橦΀Aacmstx㍆㍊㍗㍛㍞㍣㍭rr;懘rĀhr㍐㍒ë∨Ā;oਸ਼਴t耻§䂧i;䀻war;椩mĀin㍩ðnuóñt;朶rĀ;o㍶⁕쀀𝔰Ȁacoy㎂㎆㎑㎠rp;景Āhy㎋㎏cy;䑉;䑈rtɭ㎙\0\0㎜iäᑤaraì⹯耻­䂭Āgm㎨㎴maƀ;fv㎱㎲㎲䏃;䏂Ѐ;deglnprካ㏅㏉㏎㏖㏞㏡㏦ot;橪Ā;q኱ኰĀ;E㏓㏔檞;檠Ā;E㏛㏜檝;檟e;扆lus;樤arr;楲aròᄽȀaeit㏸㐈㐏㐗Āls㏽㐄lsetmé㍪hp;樳parsl;槤Ādlᑣ㐔e;挣Ā;e㐜㐝檪Ā;s㐢㐣檬;쀀⪬︀ƀflp㐮㐳㑂tcy;䑌Ā;b㐸㐹䀯Ā;a㐾㐿槄r;挿f;쀀𝕤aĀdr㑍ЂesĀ;u㑔㑕晠it»㑕ƀcsu㑠㑹㒟Āau㑥㑯pĀ;sᆈ㑫;쀀⊓︀pĀ;sᆴ㑵;쀀⊔︀uĀbp㑿㒏ƀ;esᆗᆜ㒆etĀ;eᆗ㒍ñᆝƀ;esᆨᆭ㒖etĀ;eᆨ㒝ñᆮƀ;afᅻ㒦ְrť㒫ֱ»ᅼaròᅈȀcemt㒹㒾㓂㓅r;쀀𝓈tmîñiì㐕aræᆾĀar㓎㓕rĀ;f㓔ឿ昆Āan㓚㓭ightĀep㓣㓪psiloîỠhé⺯s»⡒ʀbcmnp㓻㕞ሉ㖋㖎Ҁ;Edemnprs㔎㔏㔑㔕㔞㔣㔬㔱㔶抂;櫅ot;檽Ā;dᇚ㔚ot;櫃ult;櫁ĀEe㔨㔪;櫋;把lus;檿arr;楹ƀeiu㔽㕒㕕tƀ;en㔎㕅㕋qĀ;qᇚ㔏eqĀ;q㔫㔨m;櫇Ābp㕚㕜;櫕;櫓c̀;acensᇭ㕬㕲㕹㕻㌦pproø㋺urlyeñᇾñᇳƀaes㖂㖈㌛pproø㌚qñ㌗g;晪ڀ123;Edehlmnps㖩㖬㖯ሜ㖲㖴㗀㗉㗕㗚㗟㗨㗭耻¹䂹耻²䂲耻³䂳;櫆Āos㖹㖼t;檾ub;櫘Ā;dሢ㗅ot;櫄sĀou㗏㗒l;柉b;櫗arr;楻ult;櫂ĀEe㗤㗦;櫌;抋lus;櫀ƀeiu㗴㘉㘌tƀ;enሜ㗼㘂qĀ;qሢ㖲eqĀ;q㗧㗤m;櫈Ābp㘑㘓;櫔;櫖ƀAan㘜㘠㘭rr;懙rĀhr㘦㘨ë∮Ā;oਫ਩war;椪lig耻ß䃟௡㙑㙝㙠ዎ㙳㙹\0㙾㛂\0\0\0\0\0㛛㜃\0㜉㝬\0\0\0㞇ɲ㙖\0\0㙛get;挖;䏄rë๟ƀaey㙦㙫㙰ron;䅥dil;䅣;䑂lrec;挕r;쀀𝔱Ȁeiko㚆㚝㚵㚼Dz㚋\0㚑eĀ4fኄኁaƀ;sv㚘㚙㚛䎸ym;䏑Ācn㚢㚲kĀas㚨㚮pproø዁im»ኬsðኞĀas㚺㚮ð዁rn耻þ䃾Ǭ̟㛆⋧es膀×;bd㛏㛐㛘䃗Ā;aᤏ㛕r;樱;樰ƀeps㛡㛣㜀á⩍Ȁ;bcf҆㛬㛰㛴ot;挶ir;櫱Ā;o㛹㛼쀀𝕥rk;櫚á㍢rime;怴ƀaip㜏㜒㝤dåቈ΀adempst㜡㝍㝀㝑㝗㝜㝟ngleʀ;dlqr㜰㜱㜶㝀㝂斵own»ᶻeftĀ;e⠀㜾ñम;扜ightĀ;e㊪㝋ñၚot;旬inus;樺lus;樹b;槍ime;樻ezium;揢ƀcht㝲㝽㞁Āry㝷㝻;쀀𝓉;䑆cy;䑛rok;䅧Āio㞋㞎xô᝷headĀlr㞗㞠eftarro÷ࡏightarrow»ཝऀAHabcdfghlmoprstuw㟐㟓㟗㟤㟰㟼㠎㠜㠣㠴㡑㡝㡫㢩㣌㣒㣪㣶ròϭar;楣Ācr㟜㟢ute耻ú䃺òᅐrǣ㟪\0㟭y;䑞ve;䅭Āiy㟵㟺rc耻û䃻;䑃ƀabh㠃㠆㠋ròᎭlac;䅱aòᏃĀir㠓㠘sht;楾;쀀𝔲rave耻ù䃹š㠧㠱rĀlr㠬㠮»ॗ»ႃlk;斀Āct㠹㡍ɯ㠿\0\0㡊rnĀ;e㡅㡆挜r»㡆op;挏ri;旸Āal㡖㡚cr;䅫肻¨͉Āgp㡢㡦on;䅳f;쀀𝕦̀adhlsuᅋ㡸㡽፲㢑㢠ownáᎳarpoonĀlr㢈㢌efô㠭ighô㠯iƀ;hl㢙㢚㢜䏅»ᏺon»㢚parrows;懈ƀcit㢰㣄㣈ɯ㢶\0\0㣁rnĀ;e㢼㢽挝r»㢽op;挎ng;䅯ri;旹cr;쀀𝓊ƀdir㣙㣝㣢ot;拰lde;䅩iĀ;f㜰㣨»᠓Āam㣯㣲rò㢨l耻ü䃼angle;榧ހABDacdeflnoprsz㤜㤟㤩㤭㦵㦸㦽㧟㧤㧨㧳㧹㧽㨁㨠ròϷarĀ;v㤦㤧櫨;櫩asèϡĀnr㤲㤷grt;榜΀eknprst㓣㥆㥋㥒㥝㥤㦖appá␕othinçẖƀhir㓫⻈㥙opô⾵Ā;hᎷ㥢ïㆍĀiu㥩㥭gmá㎳Ābp㥲㦄setneqĀ;q㥽㦀쀀⊊︀;쀀⫋︀setneqĀ;q㦏㦒쀀⊋︀;쀀⫌︀Āhr㦛㦟etá㚜iangleĀlr㦪㦯eft»थight»ၑy;䐲ash»ံƀelr㧄㧒㧗ƀ;beⷪ㧋㧏ar;抻q;扚lip;拮Ābt㧜ᑨaòᑩr;쀀𝔳tré㦮suĀbp㧯㧱»ജ»൙pf;쀀𝕧roð໻tré㦴Ācu㨆㨋r;쀀𝓋Ābp㨐㨘nĀEe㦀㨖»㥾nĀEe㦒㨞»㦐igzag;榚΀cefoprs㨶㨻㩖㩛㩔㩡㩪irc;䅵Ādi㩀㩑Ābg㩅㩉ar;機eĀ;qᗺ㩏;扙erp;愘r;쀀𝔴pf;쀀𝕨Ā;eᑹ㩦atèᑹcr;쀀𝓌ૣណ㪇\0㪋\0㪐㪛\0\0㪝㪨㪫㪯\0\0㫃㫎\0㫘ៜ៟tré៑r;쀀𝔵ĀAa㪔㪗ròσrò৶;䎾ĀAa㪡㪤ròθrò৫að✓is;拻ƀdptឤ㪵㪾Āfl㪺ឩ;쀀𝕩imåឲĀAa㫇㫊ròώròਁĀcq㫒ីr;쀀𝓍Āpt៖㫜ré។Ѐacefiosu㫰㫽㬈㬌㬑㬕㬛㬡cĀuy㫶㫻te耻ý䃽;䑏Āiy㬂㬆rc;䅷;䑋n耻¥䂥r;쀀𝔶cy;䑗pf;쀀𝕪cr;쀀𝓎Ācm㬦㬩y;䑎l耻ÿ䃿Ԁacdefhiosw㭂㭈㭔㭘㭤㭩㭭㭴㭺㮀cute;䅺Āay㭍㭒ron;䅾;䐷ot;䅼Āet㭝㭡træᕟa;䎶r;쀀𝔷cy;䐶grarr;懝pf;쀀𝕫cr;쀀𝓏Ājn㮅㮇;怍j;怌'.split("").map((e=>e.charCodeAt(0)))),Ll=new Uint16Array("Ȁaglq\tɭ\0\0p;䀦os;䀧t;䀾t;䀼uot;䀢".split("").map((e=>e.charCodeAt(0))));var Pl;const ql=new Map([[0,65533],[128,8364],[130,8218],[131,402],[132,8222],[133,8230],[134,8224],[135,8225],[136,710],[137,8240],[138,352],[139,8249],[140,338],[142,381],[145,8216],[146,8217],[147,8220],[148,8221],[149,8226],[150,8211],[151,8212],[152,732],[153,8482],[154,353],[155,8250],[156,339],[158,382],[159,376]]),$l=null!==(Pl=String.fromCodePoint)&&void 0!==Pl?Pl:function(e){let t="";return e>65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+=String.fromCharCode(e),t};function Vl(e){var t;return e>=55296&&e<=57343||e>1114111?65533:null!==(t=ql.get(e))&&void 0!==t?t:e}var jl;!function(e){e[e.NUM=35]="NUM",e[e.SEMI=59]="SEMI",e[e.EQUALS=61]="EQUALS",e[e.ZERO=48]="ZERO",e[e.NINE=57]="NINE",e[e.LOWER_A=97]="LOWER_A",e[e.LOWER_F=102]="LOWER_F",e[e.LOWER_X=120]="LOWER_X",e[e.LOWER_Z=122]="LOWER_Z",e[e.UPPER_A=65]="UPPER_A",e[e.UPPER_F=70]="UPPER_F",e[e.UPPER_Z=90]="UPPER_Z"}(jl||(jl={}));var Ul,Wl,Hl;function Jl(e){return e>=jl.ZERO&&e<=jl.NINE}function Kl(e){return e>=jl.UPPER_A&&e<=jl.UPPER_F||e>=jl.LOWER_A&&e<=jl.LOWER_F}function Gl(e){return e===jl.EQUALS||function(e){return e>=jl.UPPER_A&&e<=jl.UPPER_Z||e>=jl.LOWER_A&&e<=jl.LOWER_Z||Jl(e)}(e)}!function(e){e[e.VALUE_LENGTH=49152]="VALUE_LENGTH",e[e.BRANCH_LENGTH=16256]="BRANCH_LENGTH",e[e.JUMP_TABLE=127]="JUMP_TABLE"}(Ul||(Ul={})),function(e){e[e.EntityStart=0]="EntityStart",e[e.NumericStart=1]="NumericStart",e[e.NumericDecimal=2]="NumericDecimal",e[e.NumericHex=3]="NumericHex",e[e.NamedEntity=4]="NamedEntity"}(Wl||(Wl={})),function(e){e[e.Legacy=0]="Legacy",e[e.Strict=1]="Strict",e[e.Attribute=2]="Attribute"}(Hl||(Hl={}));class Zl{constructor(e,t,n){this.decodeTree=e,this.emitCodePoint=t,this.errors=n,this.state=Wl.EntityStart,this.consumed=1,this.result=0,this.treeIndex=0,this.excess=1,this.decodeMode=Hl.Strict}startEntity(e){this.decodeMode=e,this.state=Wl.EntityStart,this.result=0,this.treeIndex=0,this.excess=1,this.consumed=1}write(e,t){switch(this.state){case Wl.EntityStart:return e.charCodeAt(t)===jl.NUM?(this.state=Wl.NumericStart,this.consumed+=1,this.stateNumericStart(e,t+1)):(this.state=Wl.NamedEntity,this.stateNamedEntity(e,t));case Wl.NumericStart:return this.stateNumericStart(e,t);case Wl.NumericDecimal:return this.stateNumericDecimal(e,t);case Wl.NumericHex:return this.stateNumericHex(e,t);case Wl.NamedEntity:return this.stateNamedEntity(e,t)}}stateNumericStart(e,t){return t>=e.length?-1:(32|e.charCodeAt(t))===jl.LOWER_X?(this.state=Wl.NumericHex,this.consumed+=1,this.stateNumericHex(e,t+1)):(this.state=Wl.NumericDecimal,this.stateNumericDecimal(e,t))}addToNumericResult(e,t,n,r){if(t!==n){const i=n-t;this.result=this.result*Math.pow(r,i)+parseInt(e.substr(t,i),r),this.consumed+=i}}stateNumericHex(e,t){const n=t;for(;t>14;for(;t>14,0!==i){if(o===jl.SEMI)return this.emitNamedEntityData(this.treeIndex,i,this.consumed+this.excess);this.decodeMode!==Hl.Strict&&(this.result=this.treeIndex,this.consumed+=this.excess,this.excess=0)}}return-1}emitNotTerminatedNamedEntity(){var e;const{result:t,decodeTree:n}=this,r=(n[t]&Ul.VALUE_LENGTH)>>14;return this.emitNamedEntityData(t,r,this.consumed),null===(e=this.errors)||void 0===e||e.missingSemicolonAfterCharacterReference(),this.consumed}emitNamedEntityData(e,t,n){const{decodeTree:r}=this;return this.emitCodePoint(1===t?r[e]&~Ul.VALUE_LENGTH:r[e+1],n),3===t&&this.emitCodePoint(r[e+2],n),n}end(){var e;switch(this.state){case Wl.NamedEntity:return 0===this.result||this.decodeMode===Hl.Attribute&&this.result!==this.treeIndex?0:this.emitNotTerminatedNamedEntity();case Wl.NumericDecimal:return this.emitNumericEntity(0,2);case Wl.NumericHex:return this.emitNumericEntity(0,3);case Wl.NumericStart:return null===(e=this.errors)||void 0===e||e.absenceOfDigitsInNumericCharacterReference(this.consumed),0;case Wl.EntityStart:return 0}}}function Yl(e){let t="";const n=new Zl(e,(e=>t+=$l(e)));return function(e,r){let i=0,o=0;for(;(o=e.indexOf("&",o))>=0;){t+=e.slice(i,o),n.startEntity(r);const s=n.write(e,o+1);if(s<0){i=o+n.end();break}i=o+s,o=0===s?i+1:i}const s=t+e.slice(i);return t="",s}}function Ql(e,t,n,r){const i=(t&Ul.BRANCH_LENGTH)>>7,o=t&Ul.JUMP_TABLE;if(0===i)return 0!==o&&r===o?n:-1;if(o){const t=r-o;return t<0||t>=i?-1:e[n+t]-1}let s=n,l=s+i-1;for(;s<=l;){const t=s+l>>>1,n=e[t];if(nr))return e[t+i];l=t-1}}return-1}const Xl=Yl(zl);Yl(Ll);function ea(e,t=Hl.Legacy){return Xl(e,t)}function ta(e){for(let t=1;t'"]/g,na),ra(/["&\u00A0]/g,new Map([[34,"""],[38,"&"],[160," "]])),ra(/[&<>\u00A0]/g,new Map([[38,"&"],[60,"<"],[62,">"],[160," "]]));var ia,oa;function sa(e){return"[object String]"===function(e){return Object.prototype.toString.call(e)}(e)}!function(e){e[e.XML=0]="XML",e[e.HTML=1]="HTML"}(ia||(ia={})),function(e){e[e.UTF8=0]="UTF8",e[e.ASCII=1]="ASCII",e[e.Extensive=2]="Extensive",e[e.Attribute=3]="Attribute",e[e.Text=4]="Text"}(oa||(oa={}));const la=Object.prototype.hasOwnProperty;function aa(e,t){return la.call(e,t)}function ca(e){return Array.prototype.slice.call(arguments,1).forEach((function(t){if(t){if("object"!=typeof t)throw new TypeError(t+"must be object");Object.keys(t).forEach((function(n){e[n]=t[n]}))}})),e}function ha(e,t,n){return[].concat(e.slice(0,t),n,e.slice(t+1))}function ua(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(!!(65535&~e&&65534!=(65535&e))&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function da(e){if(e>65535){const t=55296+((e-=65536)>>10),n=56320+(1023&e);return String.fromCharCode(t,n)}return String.fromCharCode(e)}const pa=/\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g,fa=new RegExp(pa.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),ma=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i;function ga(e){return e.indexOf("\\")<0?e:e.replace(pa,"$1")}function ya(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(fa,(function(e,t,n){return t||function(e,t){if(35===t.charCodeAt(0)&&ma.test(t)){const n="x"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10);return ua(n)?da(n):e}const n=ea(e);return n!==e?n:e}(e,n)}))}const ka=/[&<>"]/,ba=/[&<>"]/g,va={"&":"&","<":"<",">":">",'"':"""};function wa(e){return va[e]}function xa(e){return ka.test(e)?e.replace(ba,wa):e}const Ca=/[.?*+^$[\]\\(){}|-]/g;function Da(e){return e.replace(Ca,"\\$&")}function Sa(e){switch(e){case 9:case 32:return!0}return!1}function _a(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function Ea(e){return Tl.test(e)||Nl.test(e)}function Aa(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function Ma(e){return e=e.trim().replace(/\s+/g," "),"Ṿ"==="ẞ".toLowerCase()&&(e=e.replace(/ẞ/g,"ß")),e.toLowerCase().toUpperCase()}const Oa={mdurl:e,ucmicro:t};function Ta(e,t,n){let r,i,o,s;const l=e.posMax,a=e.pos;for(e.pos=t+1,r=1;e.pos32))return o;if(41===r){if(0===s)break;s--}i++}return t===i||0!==s||(o.str=ya(e.slice(t,i)),o.pos=i,o.ok=!0),o}function Fa(e,t,n,r){let i,o=t;const s={ok:!1,can_continue:!1,pos:0,str:"",marker:0};if(r)s.str=r.str,s.marker=r.marker;else{if(o>=n)return s;let r=e.charCodeAt(o);if(34!==r&&39!==r&&40!==r)return s;t++,o++,40===r&&(r=41),s.marker=r}for(;o"+xa(o.content)+""},Ia.code_block=function(e,t,n,r,i){const o=e[t];return""+xa(e[t].content)+"\n"},Ia.fence=function(e,t,n,r,i){const o=e[t],s=o.info?ya(o.info).trim():"";let l,a="",c="";if(s){const e=s.split(/(\s+)/g);a=e[0],c=e.slice(2).join("")}if(l=n.highlight&&n.highlight(o.content,a,c)||xa(o.content),0===l.indexOf("${l}\n`}return`
${l}
\n`},Ia.image=function(e,t,n,r,i){const o=e[t];return o.attrs[o.attrIndex("alt")][1]=i.renderInlineAsText(o.children,n,r),i.renderToken(e,t,n)},Ia.hardbreak=function(e,t,n){return n.xhtmlOut?"
\n":"
\n"},Ia.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?"
\n":"
\n":"\n"},Ia.text=function(e,t){return xa(e[t].content)},Ia.html_block=function(e,t){return e[t].content},Ia.html_inline=function(e,t){return e[t].content},Ra.prototype.renderAttrs=function(e){let t,n,r;if(!e.attrs)return"";for(r="",t=0,n=e.attrs.length;t\n":">",i},Ra.prototype.renderInline=function(e,t,n){let r="";const i=this.rules;for(let o=0,s=e.length;o=0&&(n=this.attrs[t][1]),n},Pa.prototype.attrJoin=function(e,t){const n=this.attrIndex(e);n<0?this.attrPush([e,t]):this.attrs[n][1]=this.attrs[n][1]+" "+t};const qa=Pa;function $a(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=!1,this.md=t}$a.prototype.Token=qa;const Va=$a,ja=/\r\n?|\n/g,Ua=/\0/g;function Wa(e){return/^<\/a\s*>/i.test(e)}const Ha=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,Ja=/\((c|tm|r)\)/i,Ka=/\((c|tm|r)\)/gi,Ga={c:"©",r:"®",tm:"™"};function Za(e,t){return Ga[t.toLowerCase()]}function Ya(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];"text"!==r.type||t||(r.content=r.content.replace(Ka,Za)),"link_open"===r.type&&"auto"===r.info&&t--,"link_close"===r.type&&"auto"===r.info&&t++}}function Qa(e){let t=0;for(let n=e.length-1;n>=0;n--){const r=e[n];"text"!==r.type||t||Ha.test(r.content)&&(r.content=r.content.replace(/\+-/g,"±").replace(/\.{2,}/g,"…").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/gm,"$1—").replace(/(^|\s)--(?=\s|$)/gm,"$1–").replace(/(^|[^-\s])--(?=[^-\s]|$)/gm,"$1–")),"link_open"===r.type&&"auto"===r.info&&t--,"link_close"===r.type&&"auto"===r.info&&t++}}const Xa=/['"]/,ec=/['"]/g;function tc(e,t,n){return e.slice(0,t)+n+e.slice(t+1)}function nc(e,t){let n;const r=[];for(let i=0;i=0&&!(r[n].level<=s);n--);if(r.length=n+1,"text"!==o.type)continue;let l=o.content,a=0,c=l.length;e:for(;a=0)f=l.charCodeAt(h.index-1);else for(n=i-1;n>=0&&("softbreak"!==e[n].type&&"hardbreak"!==e[n].type);n--)if(e[n].content){f=e[n].content.charCodeAt(e[n].content.length-1);break}let m=32;if(a=48&&f<=57&&(d=u=!1),u&&d&&(u=g,d=y),u||d){if(d)for(n=r.length-1;n>=0;n--){let u=r[n];if(r[n].level=0;s--){const l=i[s];if("link_close"!==l.type){if("html_inline"===l.type&&(n=l.content,/^\s]/i.test(n)&&o>0&&o--,Wa(l.content)&&o++),!(o>0)&&"text"===l.type&&e.md.linkify.test(l.content)){const n=l.content;let o=e.md.linkify.match(n);const a=[];let c=l.level,h=0;o.length>0&&0===o[0].index&&s>0&&"text_special"===i[s-1].type&&(o=o.slice(1));for(let t=0;th){const t=new e.Token("text","",0);t.content=n.slice(h,l),t.level=c,a.push(t)}const u=new e.Token("link_open","a",1);u.attrs=[["href",i]],u.level=c++,u.markup="linkify",u.info="auto",a.push(u);const d=new e.Token("text","",0);d.content=s,d.level=c,a.push(d);const p=new e.Token("link_close","a",-1);p.level=--c,p.markup="linkify",p.info="auto",a.push(p),h=o[t].lastIndex}if(h=0;t--)"inline"===e.tokens[t].type&&(Ja.test(e.tokens[t].content)&&Ya(e.tokens[t].children),Ha.test(e.tokens[t].content)&&Qa(e.tokens[t].children))}],["smartquotes",function(e){if(e.md.options.typographer)for(let t=e.tokens.length-1;t>=0;t--)"inline"===e.tokens[t].type&&Xa.test(e.tokens[t].content)&&nc(e.tokens[t].children,e)}],["text_join",function(e){let t,n;const r=e.tokens,i=r.length;for(let e=0;e0&&this.level++,this.tokens.push(r),r},sc.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},sc.prototype.skipEmptyLines=function(e){for(let t=this.lineMax;et;)if(!Sa(this.src.charCodeAt(--e)))return e+1;return e},sc.prototype.skipChars=function(e,t){for(let n=this.src.length;en;)if(t!==this.src.charCodeAt(--e))return e+1;return e},sc.prototype.getLines=function(e,t,n,r){if(e>=t)return"";const i=new Array(t-e);for(let o=0,s=e;sn?new Array(e-n+1).join(" ")+this.src.slice(c,a):this.src.slice(c,a)}return i.join("")},sc.prototype.Token=qa;const lc=sc;function ac(e,t){const n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.src.slice(n,r)}function cc(e){const t=[],n=e.length;let r=0,i=e.charCodeAt(r),o=!1,s=0,l="";for(;r=r)return-1;let o=e.src.charCodeAt(i++);if(o<48||o>57)return-1;for(;;){if(i>=r)return-1;if(o=e.src.charCodeAt(i++),!(o>=48&&o<=57)){if(41===o||46===o)break;return-1}if(i-n>=10)return-1}return i`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",pc="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",fc=new RegExp("^(?:"+dc+"|"+pc+"|\x3c!---?>|\x3c!--(?:[^-]|-[^-]|--[^>])*--\x3e|<[?][\\s\\S]*?[?]>|]*>|)"),mc=new RegExp("^(?:"+dc+"|"+pc+")"),gc=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(mc.source+"\\s*$"),/^$/,!1]];const yc=[["table",function(e,t,n,r){if(t+2>n)return!1;let i=t+1;if(e.sCount[i]=4)return!1;let o=e.bMarks[i]+e.tShift[i];if(o>=e.eMarks[i])return!1;const s=e.src.charCodeAt(o++);if(124!==s&&45!==s&&58!==s)return!1;if(o>=e.eMarks[i])return!1;const l=e.src.charCodeAt(o++);if(124!==l&&45!==l&&58!==l&&!Sa(l))return!1;if(45===s&&Sa(l))return!1;for(;o=4)return!1;c=cc(a),c.length&&""===c[0]&&c.shift(),c.length&&""===c[c.length-1]&&c.pop();const u=c.length;if(0===u||u!==h.length)return!1;if(r)return!0;const d=e.parentType;e.parentType="table";const p=e.md.block.ruler.getRules("blockquote"),f=[t,0];e.push("table_open","table",1).map=f,e.push("thead_open","thead",1).map=[t,t+1],e.push("tr_open","tr",1).map=[t,t+1];for(let t=0;t=4)break;if(c=cc(a),c.length&&""===c[0]&&c.shift(),c.length&&""===c[c.length-1]&&c.pop(),g+=u-c.length,g>65536)break;if(i===t+2){e.push("tbody_open","tbody",1).map=m=[t+2,0]}e.push("tr_open","tr",1).map=[i,i+1];for(let t=0;t=4))break;r++,i=r}e.line=i;const o=e.push("code_block","code",0);return o.content=e.getLines(t,i,4+e.blkIndent,!1)+"\n",o.map=[t,e.line],!0}],["fence",function(e,t,n,r){let i=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(e.sCount[t]-e.blkIndent>=4)return!1;if(i+3>o)return!1;const s=e.src.charCodeAt(i);if(126!==s&&96!==s)return!1;let l=i;i=e.skipChars(i,s);let a=i-l;if(a<3)return!1;const c=e.src.slice(l,i),h=e.src.slice(i,o);if(96===s&&h.indexOf(String.fromCharCode(s))>=0)return!1;if(r)return!0;let u=t,d=!1;for(;(u++,!(u>=n))&&(i=l=e.bMarks[u]+e.tShift[u],o=e.eMarks[u],!(i=4||(i=e.skipChars(i,s),i-l=4)return!1;if(62!==e.src.charCodeAt(i))return!1;if(r)return!0;const l=[],a=[],c=[],h=[],u=e.md.block.ruler.getRules("blockquote"),d=e.parentType;e.parentType="blockquote";let p,f=!1;for(p=t;p=o)break;if(62===e.src.charCodeAt(i++)&&!t){let t,n,r=e.sCount[p]+1;32===e.src.charCodeAt(i)?(i++,r++,n=!1,t=!0):9===e.src.charCodeAt(i)?(t=!0,(e.bsCount[p]+r)%4==3?(i++,r++,n=!1):n=!0):t=!1;let s=r;for(l.push(e.bMarks[p]),e.bMarks[p]=i;i=o,a.push(e.bsCount[p]),e.bsCount[p]=e.sCount[p]+1+(t?1:0),c.push(e.sCount[p]),e.sCount[p]=s-r,h.push(e.tShift[p]),e.tShift[p]=i-e.bMarks[p];continue}if(f)break;let r=!1;for(let t=0,i=u.length;t";const y=[t,0];g.map=y,e.md.block.tokenize(e,t,p),e.push("blockquote_close","blockquote",-1).markup=">",e.lineMax=s,e.parentType=d,y[1]=e.line;for(let n=0;n=4)return!1;let o=e.bMarks[t]+e.tShift[t];const s=e.src.charCodeAt(o++);if(42!==s&&45!==s&&95!==s)return!1;let l=1;for(;o=4)return!1;if(e.listIndent>=0&&e.sCount[a]-e.listIndent>=4&&e.sCount[a]=e.blkIndent&&(p=!0),(d=uc(e,a))>=0){if(h=!0,s=e.bMarks[a]+e.tShift[a],u=Number(e.src.slice(s,d-1)),p&&1!==u)return!1}else{if(!((d=hc(e,a))>=0))return!1;h=!1}if(p&&e.skipSpaces(d)>=e.eMarks[a])return!1;if(r)return!0;const f=e.src.charCodeAt(d-1),m=e.tokens.length;h?(l=e.push("ordered_list_open","ol",1),1!==u&&(l.attrs=[["start",u]])):l=e.push("bullet_list_open","ul",1);const g=[a,0];l.map=g,l.markup=String.fromCharCode(f);let y=!1;const k=e.md.block.ruler.getRules("list"),b=e.parentType;for(e.parentType="list";a=i?1:r-t,p>4&&(p=1);const m=t+p;l=e.push("list_item_open","li",1),l.markup=String.fromCharCode(f);const g=[a,0];l.map=g,h&&(l.info=e.src.slice(s,d-1));const b=e.tight,v=e.tShift[a],w=e.sCount[a],x=e.listIndent;if(e.listIndent=e.blkIndent,e.blkIndent=m,e.tight=!0,e.tShift[a]=u-e.bMarks[a],e.sCount[a]=r,u>=i&&e.isEmpty(a+1)?e.line=Math.min(e.line+2,n):e.md.block.tokenize(e,a,n,!0),e.tight&&!y||(c=!1),y=e.line-a>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=x,e.tShift[a]=v,e.sCount[a]=w,e.tight=b,l=e.push("list_item_close","li",-1),l.markup=String.fromCharCode(f),a=e.line,g[1]=a,a>=n)break;if(e.sCount[a]=4)break;let C=!1;for(let t=0,r=k.length;t=4)return!1;if(91!==e.src.charCodeAt(i))return!1;function l(t){const n=e.lineMax;if(t>=n||e.isEmpty(t))return null;let r=!1;if(e.sCount[t]-e.blkIndent>3&&(r=!0),e.sCount[t]<0&&(r=!0),!r){const r=e.md.block.ruler.getRules("reference"),i=e.parentType;e.parentType="reference";let o=!1;for(let i=0,s=r.length;i=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(i))return!1;let s=e.src.slice(i,o),l=0;for(;l=4)return!1;let s=e.src.charCodeAt(i);if(35!==s||i>=o)return!1;let l=1;for(s=e.src.charCodeAt(++i);35===s&&i6||ii&&Sa(e.src.charCodeAt(a-1))&&(o=a),e.line=t+1;const c=e.push("heading_open","h"+String(l),1);c.markup="########".slice(0,l),c.map=[t,e.line];const h=e.push("inline","",0);return h.content=e.src.slice(i,o).trim(),h.map=[t,e.line],h.children=[],e.push("heading_close","h"+String(l),-1).markup="########".slice(0,l),!0},["paragraph","reference","blockquote"]],["lheading",function(e,t,n){const r=e.md.block.ruler.getRules("paragraph");if(e.sCount[t]-e.blkIndent>=4)return!1;const i=e.parentType;e.parentType="paragraph";let o,s=0,l=t+1;for(;l3)continue;if(e.sCount[l]>=e.blkIndent){let t=e.bMarks[l]+e.tShift[l];const n=e.eMarks[l];if(t=n))){s=61===o?1:2;break}}if(e.sCount[l]<0)continue;let t=!1;for(let i=0,o=r.length;i3)continue;if(e.sCount[o]<0)continue;let t=!1;for(let i=0,s=r.length;i=n))&&!(e.sCount[s]=o){e.line=n;break}const t=e.line;let a=!1;for(let o=0;o=e.line)throw new Error("block rule didn't increment state.line");break}if(!a)throw new Error("none of the block rules matched");e.tight=!l,e.isEmpty(e.line-1)&&(l=!0),s=e.line,s0&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],i={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(r),this.tokens_meta.push(i),r},vc.prototype.scanDelims=function(e,t){const n=this.posMax,r=this.src.charCodeAt(e),i=e>0?this.src.charCodeAt(e-1):32;let o=e;for(;o?@[]^_`{|}~-".split("").forEach((function(e){Dc[e.charCodeAt(0)]=1}));const _c={tokenize:function(e,t){const n=e.pos,r=e.src.charCodeAt(n);if(t)return!1;if(126!==r)return!1;const i=e.scanDelims(e.pos,!0);let o=i.length;const s=String.fromCharCode(r);if(o<2)return!1;let l;o%2&&(l=e.push("text","",0),l.content=s,o--);for(let t=0;t=0;n--){const r=t[n];if(95!==r.marker&&42!==r.marker)continue;if(-1===r.end)continue;const i=t[r.end],o=n>0&&t[n-1].end===r.end+1&&t[n-1].marker===r.marker&&t[n-1].token===r.token-1&&t[r.end+1].token===i.token+1,s=String.fromCharCode(r.marker),l=e.tokens[r.token];l.type=o?"strong_open":"em_open",l.tag=o?"strong":"em",l.nesting=1,l.markup=o?s+s:s,l.content="";const a=e.tokens[i.token];a.type=o?"strong_close":"em_close",a.tag=o?"strong":"em",a.nesting=-1,a.markup=o?s+s:s,a.content="",o&&(e.tokens[t[n-1].token].content="",e.tokens[t[r.end+1].token].content="",n--)}}const Ac={tokenize:function(e,t){const n=e.pos,r=e.src.charCodeAt(n);if(t)return!1;if(95!==r&&42!==r)return!1;const i=e.scanDelims(e.pos,42===r);for(let t=0;t\x00-\x20]*)$/;const Tc=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,Nc=/^&([a-z][a-z0-9]{1,31});/i;function Fc(e){const t={},n=e.length;if(!n)return;let r=0,i=-2;const o=[];for(let s=0;sl;a-=o[a]+1){const t=e[a];if(t.marker===n.marker&&(t.open&&t.end<0)){let r=!1;if((t.close||n.open)&&(t.length+n.length)%3==0&&(t.length%3==0&&n.length%3==0||(r=!0)),!r){const r=a>0&&!e[a-1].open?o[a-1]+1:0;o[s]=s-a+r,o[a]=r,n.open=!1,t.end=s,t.close=!1,c=-1,i=-2;break}}}-1!==c&&(t[n.marker][(n.open?3:0)+(n.length||0)%3]=c)}}const Ic=[["text",function(e,t){let n=e.pos;for(;n0)return!1;const n=e.pos;if(n+3>e.posMax)return!1;if(58!==e.src.charCodeAt(n))return!1;if(47!==e.src.charCodeAt(n+1))return!1;if(47!==e.src.charCodeAt(n+2))return!1;const r=e.pending.match(Cc);if(!r)return!1;const i=r[1],o=e.md.linkify.matchAtStart(e.src.slice(n-i.length));if(!o)return!1;let s=o.url;if(s.length<=i.length)return!1;s=s.replace(/\*+$/,"");const l=e.md.normalizeLink(s);if(!e.md.validateLink(l))return!1;if(!t){e.pending=e.pending.slice(0,-i.length);const t=e.push("link_open","a",1);t.attrs=[["href",l]],t.markup="linkify",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(s);const n=e.push("link_close","a",-1);n.markup="linkify",n.info="auto"}return e.pos+=s.length-i.length,!0}],["newline",function(e,t){let n=e.pos;if(10!==e.src.charCodeAt(n))return!1;const r=e.pending.length-1,i=e.posMax;if(!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){let t=r-1;for(;t>=1&&32===e.pending.charCodeAt(t-1);)t--;e.pending=e.pending.slice(0,t),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(n++;n=r)return!1;let i=e.src.charCodeAt(n);if(10===i){for(t||e.push("hardbreak","br",0),n++;n=55296&&i<=56319&&n+1=56320&&t<=57343&&(o+=e.src[n+1],n++)}const s="\\"+o;if(!t){const t=e.push("text_special","",0);i<256&&0!==Dc[i]?t.content=o:t.content=s,t.markup=s,t.info="escape"}return e.pos=n+1,!0}],["backticks",function(e,t){let n=e.pos;if(96!==e.src.charCodeAt(n))return!1;const r=n;n++;const i=e.posMax;for(;n=u)return!1;if(a=f,i=e.md.helpers.parseLinkDestination(e.src,f,e.posMax),i.ok){for(s=e.md.normalizeLink(i.str),e.md.validateLink(s)?f=i.pos:s="",a=f;f=u||41!==e.src.charCodeAt(f))&&(c=!0),f++}if(c){if(void 0===e.env.references)return!1;if(f=0?r=e.src.slice(a,f++):f=p+1):f=p+1,r||(r=e.src.slice(d,p)),o=e.env.references[Ma(r)],!o)return e.pos=h,!1;s=o.href,l=o.title}if(!t){e.pos=d,e.posMax=p;const t=[["href",s]];e.push("link_open","a",1).attrs=t,l&&t.push(["title",l]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,e.push("link_close","a",-1)}return e.pos=f,e.posMax=u,!0}],["image",function(e,t){let n,r,i,o,s,l,a,c,h="";const u=e.pos,d=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;const p=e.pos+2,f=e.md.helpers.parseLinkLabel(e,e.pos+1,!1);if(f<0)return!1;if(o=f+1,o=d)return!1;for(c=o,l=e.md.helpers.parseLinkDestination(e.src,o,e.posMax),l.ok&&(h=e.md.normalizeLink(l.str),e.md.validateLink(h)?o=l.pos:h=""),c=o;o=d||41!==e.src.charCodeAt(o))return e.pos=u,!1;o++}else{if(void 0===e.env.references)return!1;if(o=0?i=e.src.slice(c,o++):o=f+1):o=f+1,i||(i=e.src.slice(p,f)),s=e.env.references[Ma(i)],!s)return e.pos=u,!1;h=s.href,a=s.title}if(!t){r=e.src.slice(p,f);const t=[];e.md.inline.parse(r,e.md,e.env,t);const n=e.push("image","img",0),i=[["src",h],["alt",""]];n.attrs=i,n.children=t,n.content=r,a&&i.push(["title",a])}return e.pos=o,e.posMax=d,!0}],["autolink",function(e,t){let n=e.pos;if(60!==e.src.charCodeAt(n))return!1;const r=e.pos,i=e.posMax;for(;;){if(++n>=i)return!1;const t=e.src.charCodeAt(n);if(60===t)return!1;if(62===t)break}const o=e.src.slice(r+1,n);if(Oc.test(o)){const n=e.md.normalizeLink(o);if(!e.md.validateLink(n))return!1;if(!t){const t=e.push("link_open","a",1);t.attrs=[["href",n]],t.markup="autolink",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(o);const r=e.push("link_close","a",-1);r.markup="autolink",r.info="auto"}return e.pos+=o.length+2,!0}if(Mc.test(o)){const n=e.md.normalizeLink("mailto:"+o);if(!e.md.validateLink(n))return!1;if(!t){const t=e.push("link_open","a",1);t.attrs=[["href",n]],t.markup="autolink",t.info="auto";e.push("text","",0).content=e.md.normalizeLinkText(o);const r=e.push("link_close","a",-1);r.markup="autolink",r.info="auto"}return e.pos+=o.length+2,!0}return!1}],["html_inline",function(e,t){if(!e.md.options.html)return!1;const n=e.posMax,r=e.pos;if(60!==e.src.charCodeAt(r)||r+2>=n)return!1;const i=e.src.charCodeAt(r+1);if(33!==i&&63!==i&&47!==i&&!function(e){const t=32|e;return t>=97&&t<=122}(i))return!1;const o=e.src.slice(r).match(fc);if(!o)return!1;if(!t){const t=e.push("html_inline","",0);t.content=o[0],s=t.content,/^\s]/i.test(s)&&e.linkLevel++,function(e){return/^<\/a\s*>/i.test(e)}(t.content)&&e.linkLevel--}var s;return e.pos+=o[0].length,!0}],["entity",function(e,t){const n=e.pos,r=e.posMax;if(38!==e.src.charCodeAt(n))return!1;if(n+1>=r)return!1;if(35===e.src.charCodeAt(n+1)){const r=e.src.slice(n).match(Tc);if(r){if(!t){const t="x"===r[1][0].toLowerCase()?parseInt(r[1].slice(1),16):parseInt(r[1],10),n=e.push("text_special","",0);n.content=ua(t)?da(t):da(65533),n.markup=r[0],n.info="entity"}return e.pos+=r[0].length,!0}}else{const r=e.src.slice(n).match(Nc);if(r){const n=ea(r[0]);if(n!==r[0]){if(!t){const t=e.push("text_special","",0);t.content=n,t.markup=r[0],t.info="entity"}return e.pos+=r[0].length,!0}}}return!1}]],Rc=[["balance_pairs",function(e){const t=e.tokens_meta,n=e.tokens_meta.length;Fc(e.delimiters);for(let e=0;e0&&r++,"text"===i[t].type&&t+1=e.pos)throw new Error("inline rule didn't increment state.pos");break}}else e.pos=e.posMax;s||e.pos++,o[t]=e.pos},Bc.prototype.tokenize=function(e){const t=this.ruler.getRules(""),n=t.length,r=e.posMax,i=e.md.options.maxNesting;for(;e.pos=e.pos)throw new Error("inline rule didn't increment state.pos");break}if(s){if(e.pos>=r)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},Bc.prototype.parse=function(e,t,n,r){const i=new this.State(e,t,n,r);this.tokenize(i);const o=this.ruler2.getRules(""),s=o.length;for(let e=0;e=3&&":"===e[t-3]||t>=3&&"/"===e[t-3]?0:r.match(n.re.no_http)[0].length:0}},"mailto:":{validate:function(e,t,n){const r=e.slice(t);return n.re.mailto||(n.re.mailto=new RegExp("^"+n.re.src_email_name+"@"+n.re.src_host_strict,"i")),n.re.mailto.test(r)?r.match(n.re.mailto)[0].length:0}}},Uc="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф".split("|");function Wc(e){const t=e.re=function(e){const t={};e=e||{},t.src_Any=Fl.source,t.src_Cc=Il.source,t.src_Z=Bl.source,t.src_P=Tl.source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");const n="[><|]";return t.src_pseudo_letter="(?:(?![><|]|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|[><|]|"+t.src_ZPCc+")(?!"+(e["---"]?"-(?!--)|":"-|")+"_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|"+n+"|[()[\\]{}.,\"'?!\\-;]).|\\[(?:(?!"+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-])|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+t.src_ZCc+"|[.]|$)|"+(e["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+",(?!"+t.src_ZCc+"|$)|;(?!"+t.src_ZCc+"|$)|\\!+(?!"+t.src_ZCc+"|[!]|$)|\\?(?!"+t.src_ZCc+"|[?]|$))+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy='(^|[><|]|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`||]|"+t.src_ZPCc+"))((?![$+<=>^`||])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}(e.__opts__),n=e.__tlds__.slice();function r(e){return e.replace("%TLDS%",t.src_tlds)}e.onCompile(),e.__tlds_replaced__||n.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),n.push(t.src_xn),t.src_tlds=n.join("|"),t.email_fuzzy=RegExp(r(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(r(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(r(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(r(t.tpl_host_fuzzy_test),"i");const i=[];function o(e,t){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+t)}e.__compiled__={},Object.keys(e.__schemas__).forEach((function(t){const n=e.__schemas__[t];if(null===n)return;const r={validate:null,link:null};if(e.__compiled__[t]=r,"[object Object]"===Pc(n))return!function(e){return"[object RegExp]"===Pc(e)}(n.validate)?qc(n.validate)?r.validate=n.validate:o(t,n):r.validate=function(e){return function(t,n){const r=t.slice(n);return e.test(r)?r.match(e)[0].length:0}}(n.validate),void(qc(n.normalize)?r.normalize=n.normalize:n.normalize?o(t,n):r.normalize=function(e,t){t.normalize(e)});!function(e){return"[object String]"===Pc(e)}(n)?o(t,n):i.push(t)})),i.forEach((function(t){e.__compiled__[e.__schemas__[t]]&&(e.__compiled__[t].validate=e.__compiled__[e.__schemas__[t]].validate,e.__compiled__[t].normalize=e.__compiled__[e.__schemas__[t]].normalize)})),e.__compiled__[""]={validate:null,normalize:function(e,t){t.normalize(e)}};const s=Object.keys(e.__compiled__).filter((function(t){return t.length>0&&e.__compiled__[t]})).map($c).join("|");e.re.schema_test=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+s+")","i"),e.re.schema_search=RegExp("(^|(?!_)(?:[><|]|"+t.src_ZPCc+"))("+s+")","ig"),e.re.schema_at_start=RegExp("^"+e.re.schema_search.source,"i"),e.re.pretest=RegExp("("+e.re.schema_test.source+")|("+e.re.host_fuzzy_test.source+")|@","i"),function(e){e.__index__=-1,e.__text_cache__=""}(e)}function Hc(e,t){const n=e.__index__,r=e.__last_index__,i=e.__text_cache__.slice(n,r);this.schema=e.__schema__.toLowerCase(),this.index=n+t,this.lastIndex=r+t,this.raw=i,this.text=i,this.url=i}function Jc(e,t){const n=new Hc(e,t);return e.__compiled__[n.schema].normalize(n,e),n}function Kc(e,t){if(!(this instanceof Kc))return new Kc(e,t);var n;t||(n=e,Object.keys(n||{}).reduce((function(e,t){return e||Vc.hasOwnProperty(t)}),!1)&&(t=e,e={})),this.__opts__=Lc({},Vc,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=Lc({},jc,e),this.__compiled__={},this.__tlds__=Uc,this.__tlds_replaced__=!1,this.re={},Wc(this)}Kc.prototype.add=function(e,t){return this.__schemas__[e]=t,Wc(this),this},Kc.prototype.set=function(e){return this.__opts__=Lc(this.__opts__,e),this},Kc.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;let t,n,r,i,o,s,l,a,c;if(this.re.schema_test.test(e))for(l=this.re.schema_search,l.lastIndex=0;null!==(t=l.exec(e));)if(i=this.testSchemaAt(e,t[2],l.lastIndex),i){this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+i;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(a=e.search(this.re.host_fuzzy_test),a>=0&&(this.__index__<0||a=0&&null!==(r=e.match(this.re.email_fuzzy))&&(o=r.index+r[1].length,s=r.index+r[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=s))),this.__index__>=0},Kc.prototype.pretest=function(e){return this.re.pretest.test(e)},Kc.prototype.testSchemaAt=function(e,t,n){return this.__compiled__[t.toLowerCase()]?this.__compiled__[t.toLowerCase()].validate(e,n,this):0},Kc.prototype.match=function(e){const t=[];let n=0;this.__index__>=0&&this.__text_cache__===e&&(t.push(Jc(this,n)),n=this.__last_index__);let r=n?e.slice(n):e;for(;this.test(r);)t.push(Jc(this,n)),r=r.slice(this.__last_index__),n+=this.__last_index__;return t.length?t:null},Kc.prototype.matchAtStart=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return null;const t=this.re.schema_at_start.exec(e);if(!t)return null;const n=this.testSchemaAt(e,t[2],t[0].length);return n?(this.__schema__=t[2],this.__index__=t.index+t[1].length,this.__last_index__=t.index+t[0].length+n,Jc(this,0)):null},Kc.prototype.tlds=function(e,t){return e=Array.isArray(e)?e:[e],t?(this.__tlds__=this.__tlds__.concat(e).sort().filter((function(e,t,n){return e!==n[t-1]})).reverse(),Wc(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,Wc(this),this)},Kc.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},Kc.prototype.onCompile=function(){};const Gc=Kc,Zc=2147483647,Yc=36,Qc=/^xn--/,Xc=/[^\0-\x7F]/,eh=/[\x2E\u3002\uFF0E\uFF61]/g,th={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},nh=Math.floor,rh=String.fromCharCode;function ih(e){throw new RangeError(th[e])}function oh(e,t){const n=e.split("@");let r="";n.length>1&&(r=n[0]+"@",e=n[1]);const i=function(e,t){const n=[];let r=e.length;for(;r--;)n[r]=t(e[r]);return n}((e=e.replace(eh,".")).split("."),t).join(".");return r+i}function sh(e){const t=[];let n=0;const r=e.length;for(;n=55296&&i<=56319&&n>1,e+=nh(e/t);e>455;r+=Yc)e=nh(e/35);return nh(r+36*e/(e+38))},ch=function(e){const t=[],n=e.length;let r=0,i=128,o=72,s=e.lastIndexOf("-");s<0&&(s=0);for(let n=0;n=128&&ih("not-basic"),t.push(e.charCodeAt(n));for(let a=s>0?s+1:0;a=n&&ih("invalid-input");const s=(l=e.charCodeAt(a++))>=48&&l<58?l-48+26:l>=65&&l<91?l-65:l>=97&&l<123?l-97:Yc;s>=Yc&&ih("invalid-input"),s>nh((Zc-r)/t)&&ih("overflow"),r+=s*t;const c=i<=o?1:i>=o+26?26:i-o;if(snh(Zc/h)&&ih("overflow"),t*=h}const c=t.length+1;o=ah(r-s,c,0==s),nh(r/c)>Zc-i&&ih("overflow"),i+=nh(r/c),r%=c,t.splice(r++,0,i)}var l;return String.fromCodePoint(...t)},hh=function(e){const t=[],n=(e=sh(e)).length;let r=128,i=0,o=72;for(const n of e)n<128&&t.push(rh(n));const s=t.length;let l=s;for(s&&t.push("-");l=r&&tnh((Zc-i)/a)&&ih("overflow"),i+=(n-r)*a,r=n;for(const n of e)if(nZc&&ih("overflow"),n===r){let e=i;for(let n=Yc;;n+=Yc){const r=n<=o?1:n>=o+26?26:n-o;if(eString.fromCodePoint(...e)},decode:ch,encode:hh,toASCII:function(e){return oh(e,(function(e){return Xc.test(e)?"xn--"+hh(e):e}))},toUnicode:function(e){return oh(e,(function(e){return Qc.test(e)?ch(e.slice(4).toLowerCase()):e}))}},dh={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}},zero:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","fragments_join"]}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"“”‘’",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline","text_join"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","fragments_join"]}}}},ph=/^(vbscript|javascript|file|data):/,fh=/^data:image\/(gif|png|jpeg|webp);/;function mh(e){const t=e.trim().toLowerCase();return!ph.test(t)||fh.test(t)}const gh=["http:","https:","mailto:"];function yh(e){const t=Ol(e,!0);if(t.hostname&&(!t.protocol||gh.indexOf(t.protocol)>=0))try{t.hostname=uh.toASCII(t.hostname)}catch(e){}return gl(yl(t))}function kh(e){const t=Ol(e,!0);if(t.hostname&&(!t.protocol||gh.indexOf(t.protocol)>=0))try{t.hostname=uh.toUnicode(t.hostname)}catch(e){}return pl(yl(t),pl.defaultChars+"%")}function bh(e,t){if(!(this instanceof bh))return new bh(e,t);t||sa(e)||(t=e||{},e="default"),this.inline=new zc,this.block=new bc,this.core=new oc,this.renderer=new Ba,this.linkify=new Gc,this.validateLink=mh,this.normalizeLink=yh,this.normalizeLinkText=kh,this.utils=r,this.helpers=ca({},i),this.options={},this.configure(e),t&&this.set(t)}bh.prototype.set=function(e){return ca(this.options,e),this},bh.prototype.configure=function(e){const t=this;if(sa(e)){const t=e;if(!(e=dh[t]))throw new Error('Wrong `markdown-it` preset "'+t+'", check name')}if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach((function(n){e.components[n].rules&&t[n].ruler.enableOnly(e.components[n].rules),e.components[n].rules2&&t[n].ruler2.enableOnly(e.components[n].rules2)})),this},bh.prototype.enable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.enable(e,!0))}),this),n=n.concat(this.inline.ruler2.enable(e,!0));const r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+r);return this},bh.prototype.disable=function(e,t){let n=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach((function(t){n=n.concat(this[t].ruler.disable(e,!0))}),this),n=n.concat(this.inline.ruler2.disable(e,!0));const r=e.filter((function(e){return n.indexOf(e)<0}));if(r.length&&!t)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+r);return this},bh.prototype.use=function(e){const t=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,t),this},bh.prototype.parse=function(e,t){if("string"!=typeof e)throw new Error("Input data should be a String");const n=new this.core.State(e,this,t);return this.core.process(n),n.tokens},bh.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},bh.prototype.parseInline=function(e,t){const n=new this.core.State(e,this,t);return n.inlineMode=!0,this.core.process(n),n.tokens},bh.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};const vh=bh,wh=new Q({nodes:{doc:{content:"block+"},paragraph:{content:"inline*",group:"block",parseDOM:[{tag:"p"}],toDOM:()=>["p",0]},blockquote:{content:"block+",group:"block",parseDOM:[{tag:"blockquote"}],toDOM:()=>["blockquote",0]},horizontal_rule:{group:"block",parseDOM:[{tag:"hr"}],toDOM:()=>["div",["hr"]]},heading:{attrs:{level:{default:1}},content:"(text | image)*",group:"block",defining:!0,parseDOM:[{tag:"h1",attrs:{level:1}},{tag:"h2",attrs:{level:2}},{tag:"h3",attrs:{level:3}},{tag:"h4",attrs:{level:4}},{tag:"h5",attrs:{level:5}},{tag:"h6",attrs:{level:6}}],toDOM:e=>["h"+e.attrs.level,0]},code_block:{content:"text*",group:"block",code:!0,defining:!0,marks:"",attrs:{params:{default:""}},parseDOM:[{tag:"pre",preserveWhitespace:"full",getAttrs:e=>({params:e.getAttribute("data-params")||""})}],toDOM:e=>["pre",e.attrs.params?{"data-params":e.attrs.params}:{},["code",0]]},ordered_list:{content:"list_item+",group:"block",attrs:{order:{default:1},tight:{default:!1}},parseDOM:[{tag:"ol",getAttrs:e=>({order:e.hasAttribute("start")?+e.getAttribute("start"):1,tight:e.hasAttribute("data-tight")})}],toDOM:e=>["ol",{start:1==e.attrs.order?null:e.attrs.order,"data-tight":e.attrs.tight?"true":null},0]},bullet_list:{content:"list_item+",group:"block",attrs:{tight:{default:!1}},parseDOM:[{tag:"ul",getAttrs:e=>({tight:e.hasAttribute("data-tight")})}],toDOM:e=>["ul",{"data-tight":e.attrs.tight?"true":null},0]},list_item:{content:"block+",defining:!0,parseDOM:[{tag:"li"}],toDOM:()=>["li",0]},text:{group:"inline"},image:{inline:!0,attrs:{src:{},alt:{default:null},title:{default:null}},group:"inline",draggable:!0,parseDOM:[{tag:"img[src]",getAttrs:e=>({src:e.getAttribute("src"),title:e.getAttribute("title"),alt:e.getAttribute("alt")})}],toDOM:e=>["img",e.attrs]},hard_break:{inline:!0,group:"inline",selectable:!1,parseDOM:[{tag:"br"}],toDOM:()=>["br"]}},marks:{em:{parseDOM:[{tag:"i"},{tag:"em"},{style:"font-style=italic"},{style:"font-style=normal",clearMark:e=>"em"==e.type.name}],toDOM:()=>["em"]},strong:{parseDOM:[{tag:"strong"},{tag:"b",getAttrs:e=>"normal"!=e.style.fontWeight&&null},{style:"font-weight=400",clearMark:e=>"strong"==e.type.name},{style:"font-weight",getAttrs:e=>/^(bold(er)?|[5-9]\d{2,})$/.test(e)&&null}],toDOM:()=>["strong"]},link:{attrs:{href:{},title:{default:null}},inclusive:!1,parseDOM:[{tag:"a[href]",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}],toDOM:e=>["a",e.attrs]},code:{code:!0,parseDOM:[{tag:"code"}],toDOM:()=>["code"]}}});class xh{constructor(e,t){this.schema=e,this.tokenHandlers=t,this.stack=[{type:e.topNodeType,attrs:null,content:[],marks:p.none}]}top(){return this.stack[this.stack.length-1]}push(e){this.stack.length&&this.top().content.push(e)}addText(e){if(!e)return;let t,n=this.top(),r=n.content,i=r[r.length-1],o=this.schema.text(e,n.marks);i&&(t=function(e,t){if(e.isText&&t.isText&&p.sameSet(e.marks,t.marks))return e.withText(e.text+t.text)}(i,o))?r[r.length-1]=t:r.push(o)}openMark(e){let t=this.top();t.marks=e.addToSet(t.marks)}closeMark(e){let t=this.top();t.marks=e.removeFromSet(t.marks)}parseTokens(e){for(let t=0;t{e.openNode(t,Ch(i,n,r,o)),e.addText(Sh(n.content)),e.closeNode()}:(n[r+"_open"]=(e,n,r,o)=>e.openNode(t,Ch(i,n,r,o)),n[r+"_close"]=e=>e.closeNode())}else if(i.node){let t=e.nodeType(i.node);n[r]=(e,n,r,o)=>e.addNode(t,Ch(i,n,r,o))}else if(i.mark){let t=e.marks[i.mark];Dh(i,r)?n[r]=(e,n,r,o)=>{e.openMark(t.create(Ch(i,n,r,o))),e.addText(Sh(n.content)),e.closeMark(t)}:(n[r+"_open"]=(e,n,r,o)=>e.openMark(t.create(Ch(i,n,r,o))),n[r+"_close"]=e=>e.closeMark(t))}else{if(!i.ignore)throw new RangeError("Unrecognized parsing spec "+JSON.stringify(i));Dh(i,r)?n[r]=_h:(n[r+"_open"]=_h,n[r+"_close"]=_h)}}return n.text=(e,t)=>e.addText(t.content),n.inline=(e,t)=>e.parseTokens(t.children),n.softbreak=n.softbreak||(e=>e.addText(" ")),n}(e,n)}parse(e,t={}){let n,r=new xh(this.schema,this.tokenHandlers);r.parseTokens(this.tokenizer.parse(e,t));do{n=r.closeNode()}while(r.stack.length);return n||this.schema.topNodeType.createAndFill()}}function Ah(e,t){for(;++t({tight:Ah(t,n)})},ordered_list:{block:"ordered_list",getAttrs:(e,t,n)=>({order:+e.attrGet("start")||1,tight:Ah(t,n)})},heading:{block:"heading",getAttrs:e=>({level:+e.tag.slice(1)})},code_block:{block:"code_block",noCloseToken:!0},fence:{block:"code_block",getAttrs:e=>({params:e.info||""}),noCloseToken:!0},hr:{node:"horizontal_rule"},image:{node:"image",getAttrs:e=>({src:e.attrGet("src"),title:e.attrGet("title")||null,alt:e.children[0]&&e.children[0].content||null})},hardbreak:{node:"hard_break"},em:{mark:"em"},strong:{mark:"strong"},link:{mark:"link",getAttrs:e=>({href:e.attrGet("href"),title:e.attrGet("title")||null})},code_inline:{mark:"code",noCloseToken:!0}});const Mh={open:"",close:"",mixable:!0};class Oh{constructor(e,t,n={}){this.nodes=e,this.marks=t,this.options=n}serialize(e,t={}){t=Object.assign({},this.options,t);let n=new Fh(this.nodes,this.marks,t);return n.renderContent(e),n.out}}const Th=new Oh({blockquote(e,t){e.wrapBlock("> ",null,t,(()=>e.renderContent(t)))},code_block(e,t){const n=t.textContent.match(/`{3,}/gm),r=n?n.sort().slice(-1)[0]+"`":"```";e.write(r+(t.attrs.params||"")+"\n"),e.text(t.textContent,!1),e.write("\n"),e.write(r),e.closeBlock(t)},heading(e,t){e.write(e.repeat("#",t.attrs.level)+" "),e.renderInline(t,!1),e.closeBlock(t)},horizontal_rule(e,t){e.write(t.attrs.markup||"---"),e.closeBlock(t)},bullet_list(e,t){e.renderList(t," ",(()=>(t.attrs.bullet||"*")+" "))},ordered_list(e,t){let n=t.attrs.order||1,r=String(n+t.childCount-1).length,i=e.repeat(" ",r+2);e.renderList(t,i,(t=>{let i=String(n+t);return e.repeat(" ",r-i.length)+i+". "}))},list_item(e,t){e.renderContent(t)},paragraph(e,t){e.renderInline(t),e.closeBlock(t)},image(e,t){e.write("!["+e.esc(t.attrs.alt||"")+"]("+t.attrs.src.replace(/[\(\)]/g,"\\$&")+(t.attrs.title?' "'+t.attrs.title.replace(/"/g,'\\"')+'"':"")+")")},hard_break(e,t,n,r){for(let i=r+1;i(e.inAutolink=function(e,t,n){if(e.attrs.title||!/^\w+:/.test(e.attrs.href))return!1;let r=t.child(n);return!(!r.isText||r.text!=e.attrs.href||r.marks[r.marks.length-1]!=e)&&(n==t.childCount-1||!e.isInSet(t.child(n+1).marks))}(t,n,r),e.inAutolink?"<":"["),close(e,t,n,r){let{inAutolink:i}=e;return e.inAutolink=void 0,i?">":"]("+t.attrs.href.replace(/[\(\)"]/g,"\\$&")+(t.attrs.title?` "${t.attrs.title.replace(/"/g,'\\"')}"`:"")+")"},mixable:!0},code:{open:(e,t,n,r)=>Nh(n.child(r),-1),close:(e,t,n,r)=>Nh(n.child(r-1),1),escape:!1}});function Nh(e,t){let n,r=/`+/g,i=0;if(e.isText)for(;n=r.exec(e.text);)i=Math.max(i,n[0].length);let o=i>0&&t>0?" `":"`";for(let e=0;e0&&t<0&&(o+=" "),o}class Fh{constructor(e,t,n){this.nodes=e,this.marks=t,this.options=n,this.delim="",this.out="",this.closed=null,this.inAutolink=void 0,this.atBlockStart=!1,this.inTightList=!1,void 0===this.options.tightLists&&(this.options.tightLists=!1),void 0===this.options.hardBreakNodeName&&(this.options.hardBreakNodeName="hard_break")}flushClose(e=2){if(this.closed){if(this.atBlank()||(this.out+="\n"),e>1){let t=this.delim,n=/\s+$/.exec(t);n&&(t=t.slice(0,t.length-n[0].length));for(let n=1;nthis.render(t,e,r)))}renderInline(e,t=!0){this.atBlockStart=t;let n=[],r="",i=(t,i,o)=>{let s=t?t.marks:[];t&&t.type.name===this.options.hardBreakNodeName&&(s=s.filter((t=>{if(o+1==e.childCount)return!1;let n=e.child(o+1);return t.isInSet(n.marks)&&(!n.isText||/\S/.test(n.text))})));let l=r;if(r="",t&&t.isText&&s.some((e=>{let t=this.getMark(e.type.name);return t&&t.expelEnclosingWhitespace&&!e.isInSet(n)}))){let[e,r,i]=/^(\s*)(.*)$/m.exec(t.text);r&&(l+=r,(t=i?t.withText(i):null)||(s=n))}if(t&&t.isText&&s.some((t=>{let n=this.getMark(t.type.name);return n&&n.expelEnclosingWhitespace&&(o==e.childCount-1||!t.isInSet(e.child(o+1).marks))}))){let[e,i,o]=/^(.*?)(\s*)$/m.exec(t.text);o&&(r=o,(t=i?t.withText(i):null)||(s=n))}let a=s.length?s[s.length-1]:null,c=a&&!1===this.getMark(a.type.name).escape,h=s.length-(c?1:0);e:for(let e=0;er?s=s.slice(0,r).concat(t).concat(s.slice(r,e)).concat(s.slice(e+1,h)):r>e&&(s=s.slice(0,e).concat(s.slice(e+1,r)).concat(t).concat(s.slice(r,h)));continue e}}}let u=0;for(;u0&&(this.atBlockStart=!1)};e.forEach(i),i(null,0,e.childCount),this.atBlockStart=!1}renderList(e,t,n){this.closed&&this.closed.type==e.type?this.flushClose(3):this.inTightList&&this.flushClose(1);let r=void 0!==e.attrs.tight?e.attrs.tight:this.options.tightLists,i=this.inTightList;this.inTightList=r,e.forEach(((i,o,s)=>{s&&r&&this.flushClose(1),this.wrapBlock(t,n(s),e,(()=>this.render(i,e,s)))})),this.inTightList=i}esc(e,t=!1){return e=e.replace(/[`*\\~\[\]_]/g,((t,n)=>"_"==t&&n>0&&n+1])/,"\\$&").replace(/^(\s*)(#{1,6})(\s|$)/,"$1\\$2$3").replace(/^(\s*\d+)\.\s/,"$1\\. ")),this.options.escapeExtraCharacters&&(e=e.replace(this.options.escapeExtraCharacters,"\\$&")),e}quote(e){let t=-1==e.indexOf('"')?'""':-1==e.indexOf("'")?"''":"()";return t[0]+e+t[1]}repeat(e,t){let n="";for(let r=0;rt.attrs[Fo]?"":"`",escape:!1,open:(e,t)=>t.attrs[Fo]?"":"`"}})),Rh=vh(),Bh=Rh.core.State.prototype.Token,zh=Rh.inline.ruler.__find__("image"),Lh=Rh.inline.ruler.__rules__[zh].fn,Ph=["[x]","[X]","[ ]"];Rh.use((e=>{e.core.ruler.after("block","checklist_item",(e=>{const t=e.src.split("\n");let n=!1,r=!1;return e.tokens=e.tokens.map((i=>{if(n&&"inline"===i.type&&(i.content=i.content.slice(3).trimLeft()),"paragraph_open"===i.type){const[o,s]=i.map,l=t[o];if(Ph.includes(l.slice(0,3))){r=!0,n=!0;const{Token:t}=e,i=new t("checklist_item_open","div",1);return i.attrPush(["status","x"===l[1].toLowerCase()?$o.DONE.toString():$o.EMPTY.toString()]),i}}else if(n&&"paragraph_close"===i.type)return n=!1,new e.Token("checklist_item_close","div",-1);return i})),r})),e.inline.ruler.at("image",(e=>{const{pos:t}=e,n=Lh(e);if(n){const n=new e.Token("code_inline","code",0);n.markup="`",n.content=e.src.slice(t,e.pos),n.attrSet(Fo,"true"),e.tokens[e.tokens.length-1]=n}return n}))}));class qh{static getTypeName(e){return e.replace("_open","").replace("_close","")}constructor(e){this.getTokens=()=>{const{fullTokenList:e,parseable:t}=this;if(!1===t){const{map:[t,n]}=e[0],r=new Bh("fence","code",0);return r.content=this.src.split("\n").slice(t,n).join("\n"),r.attrPush([Fo,"true"]),[r]}return e},this.resetInternalState=()=>{this.fullTokenList=[],this.tokenStack=[],this.parseable=!0},this.resetInternalState(),this.src=e}take(e){const{nesting:t}=e;let{type:n}=e;if(n=qh.getTypeName(n),this.fullTokenList.push(e),!1===qh.DOCUMENT_MAP.has(n)&&"inline"!==n&&(this.parseable=!1),this.parseable&&this.tokenStack.length&&t>=0){const e=qh.getTypeName(this.tokenStack[this.tokenStack.length-1].type);!1===qh.DOCUMENT_MAP.get(e).includes(n)&&(this.parseable=!1)}if(t>0&&this.tokenStack.push(e),t<0&&this.tokenStack.pop(),0===this.tokenStack.length){const e=this.getTokens();return this.resetInternalState(),e}return null}}qh.DOCUMENT_MAP=new Map([["heading1",["inline"]],["heading2",["inline"]],["heading3",["inline"]],["paragraph",["inline"]],["fence",["inline"]],["bullet_list",["list_item","inline"]],["ordered_list",["list_item","inline"]],["list_item",["paragraph","ordered_list","bullet_list"]],["checklist_item",["inline"]],["inline",[]]]);const $h=new Eh(Uo,{parse(...e){window.mip=Rh;const t=Rh.parse(...e),n=[],r=new qh(e[0]);for(let e=0;e"true"===e.attrGet(Fo)?{[Fo]:!0}:{}},heading1:{block:"heading1"},heading2:{block:"heading2"},heading3:{block:"heading3"},list_item:{block:"list_item"},ordered_list:{block:"ordered_list"},paragraph:{block:"paragraph"},checklist_item:{block:"checklist_item",getAttrs:e=>({status:e.attrGet("status")===$o.DONE.toString()?$o.DONE:$o.EMPTY})},em:{mark:"em"},strong:{mark:"strong"},code_inline:{getAttrs:e=>"true"===e.attrGet(Fo)?{[Fo]:!0}:{},mark:"code",noCloseToken:!0},link:{mark:"link",getAttrs:e=>Object.assign({href:e.attrGet("href"),title:e.attrGet("title")||null},"auto"===e.info&&{[Io]:!0})}}),Vh=new Gc;class jh extends wt{constructor(){super({appendTransaction:(e,t,n)=>(e=>{const{tr:t}=e;return t.doc.descendants(((e,n,r)=>{if(!e.isTextblock)return;const i=n+1,o=[];e.forEach(((e,t,r)=>{if(!e.isText)return;let s=e.marks.find((e=>e.type===Uo.marks.link));if(s&&!0===s.attrs[Io])if(o.length){const r=o[o.length-1];r.endPos===i+t&&(r.endPos=n+t+e.nodeSize)}else o.push({startPos:i+t,endPos:i+t+e.nodeSize})}));for(const e of o){const n=t.doc.textBetween(e.startPos,e.endPos);Vh.test(n)?t.addMark(e.startPos,e.endPos,Uo.marks.link.create({href:n,[Io]:!0})):t.removeMark(e.startPos,e.endPos,Uo.marks.link)}const s=Vh.match(e.textContent);if(s)for(const e of s){const r=n+1+e.index,i=r+e.text.length;if(!t.doc.rangeHasMark(r,i,Uo.marks.code)){if(t.doc.rangeHasMark(r,i,Uo.marks.link)){let e=[];if(t.doc.nodesBetween(r,i,(t=>{if(t.isText){const n=t.marks.find((e=>e.type===Uo.marks.link));n&&!1===n.attrs[Io]&&e.push(n)}})),e.length)continue}t.addMark(r,i,Uo.marks.link.create({href:e.url,[Io]:!0}))}}})),t})(n)})}}var Uh=function(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{a(r.next(e))}catch(e){o(e)}}function l(e){try{a(r.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,l)}a((r=r.apply(e,t||[])).next())}))};function Wh(){return Us.latestText?$h.parse(Us.latestText):Us.latestDoc?Uo.nodeFromJSON(Us.latestDoc):Uo.topNodeType.createAndFill()}!function(){Uh(this,void 0,void 0,(function*(){yield Us.ready();const e=window.view=new Bi(document.querySelector("#editor"),{state:bt.create({doc:Wh(),plugins:[...hl,new _s(document.querySelector("#toolbar"),document.querySelector("#link-modal")),new Os(document.querySelector("#link-tooltip")),new Ts(document.querySelector("#extender")),new wt({props:{nodeViews:Zs}}),new jh,Jo,Go,io()]}),dispatchTransaction(t){const n=e.state.apply(t);e.updateState(n),t.docChanged&&Us.saveNote(n.doc.toJSON(),Ih.serialize(n.doc),n.doc.textBetween(0,n.doc.nodeSize-2," "))}});Us.onUpdate((t=>{const n=e.state.plugins.filter((e=>e instanceof _s==!1));e.setProps({state:bt.create({doc:Wh(),plugins:[...n,new _s(document.querySelector("#toolbar"),document.querySelector("#link-modal"))]})})}))}))}()})()})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLHlCQUF5QixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsMEJBQTBCLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGtCQUFrQixDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsbUJBQW1CLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLHlCQUF5QixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUseUJBQXlCLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUscUJBQXFCLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsMEJBQTBCLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsOEJBQThCLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsY0FB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QUUsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsMkJBQTJCLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxFQUFFLDBCQUEwQixDQUFDLEVBQUUsNEJBQTRCLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLDJCQUEyQixDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsY0FBYyxDQUFDLEdBQUcscUJBQXFCLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsY0FBYyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksY0FBYyxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLG1C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Q0FBQyxFQUFFLHdCQUF3QixDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUseUJBQXlCLENBQUMsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsOEJBQThCLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxhQUFhLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxJQUFrQyxHQUFZLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsQ0FB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LFNBQVMsQ0FDWnh6QyxNQUFPNmlCLEdBQVlockIsT0FBTyxDQUN4QnNELElBQUtpN0UsS0FDTDN6RCxRQUFTLElBQ0pBLEVBQ0gsSUFBSTRrQyxHQUNGNWdFLFNBQVN5bkIsY0FBYyxZQUN2QnpuQixTQUFTeW5CLGNBQWMsb0JBSTdCLEdBRU4sRyxDQUVBZ1UsRSIsInNvdXJjZXMiOlsid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL2xpYi9zbmpzVHlwZXMudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvQ29tcG9uZW50UmVsYXkvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y0LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbGliL3V0aWxzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL0NvbXBvbmVudFJlbGF5Ly4vbGliL2xvZ2dlci50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci9Db21wb25lbnRSZWxheS8uL2xpYi9jb21wb25lbnRSZWxheS50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9hc3NldHMvY2hlY2tfYm94X291dGxpbmVfYmxhbmstMjRweC5zdmciLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvYXNzZXRzL2NoZWNrX2JveC0yNHB4LnN2ZyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL29yZGVyZWRtYXAvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1tb2RlbC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXRyYW5zZm9ybS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXN0YXRlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itdmlldy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3JvcGUtc2VxdWVuY2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1oaXN0b3J5L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaW5wdXRydWxlcy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXNjaGVtYS1saXN0L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itc2NoZW1hLWJhc2ljL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvc2NoZW1hLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2lucHV0UnVsZXMudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItY29tbWFuZHMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9zY2hlbWFIZWxwZXJzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL1Rvb2xiYXJQbHVnaW4udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvVG9vbHRpcFBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9FZGl0b3JFeHRlbmRlclBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmF0aXZlLmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9ybmcuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvY2xpZW50LnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL25vZGVWaWV3cy50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy93M2Mta2V5bmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1rZXltYXAvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9rZXltYXBzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21kdXJsL2xpYi9kZWNvZGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21kdXJsL2xpYi9lbmNvZGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21kdXJsL2xpYi9mb3JtYXQubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21kdXJsL2xpYi9wYXJzZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9QL3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL1MvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL3Byb3BlcnRpZXMvQW55L3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL0NjL3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL0NmL3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL1ovcmVnZXgubWpzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvZ2VuZXJhdGVkL2RlY29kZS1kYXRhLWh0bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEteG1sLnRzIiwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2ZiNTUvZW50aXRpZXMvNjFhZmQ0NzAxZWFhNzM2OTc4YjEzYzczNTFjZDNkZTlhOTZiMDRiYy9zcmMvZGVjb2RlX2NvZGVwb2ludC50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2RlY29kZS50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2dlbmVyYXRlZC9lbmNvZGUtaHRtbC50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2VzY2FwZS50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2luZGV4LnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9jb21tb24vdXRpbHMubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfbGFiZWwubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfZGVzdGluYXRpb24ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfdGl0bGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9yZW5kZXJlci5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvdG9rZW4ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL3N0YXRlX2NvcmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL25vcm1hbGl6ZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvbGlua2lmeS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvcmVwbGFjZW1lbnRzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9zbWFydHF1b3Rlcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9jb3JlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvaW5saW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS90ZXh0X2pvaW4ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9zdGF0ZV9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3RhYmxlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svbGlzdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2NvbW1vbi9odG1sX2Jsb2Nrcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2NvbW1vbi9odG1sX3JlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaHRtbF9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2NvZGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9mZW5jZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2Jsb2NrcXVvdGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9oci5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3JlZmVyZW5jZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2hlYWRpbmcubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9saGVhZGluZy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3BhcmFncmFwaC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9zdGF0ZV9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvdGV4dC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9saW5raWZ5Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VzY2FwZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9zdHJpa2V0aHJvdWdoLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VtcGhhc2lzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2F1dG9saW5rLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VudGl0eS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9iYWxhbmNlX3BhaXJzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcGFyc2VyX2lubGluZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9uZXdsaW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9saW5rLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2ltYWdlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2h0bWxfaW5saW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2ZyYWdtZW50c19qb2luLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2xpYi9yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHVueWNvZGUuanMvcHVueWNvZGUuZXM2LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvZGVmYXVsdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvemVyby5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvY29tbW9ubWFyay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbWFya2Rvd24vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9tYXJrZG93bi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9JbmxpbmVMaW5rUGx1Z2luLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiQ29tcG9uZW50UmVsYXlcIiwgW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiQ29tcG9uZW50UmVsYXlcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiQ29tcG9uZW50UmVsYXlcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIvLyBUaGUgcmVxdWlyZSBzY29wZVxudmFyIF9fd2VicGFja19yZXF1aXJlX18gPSB7fTtcblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8qKlxuICogRGVjbGFyaW5nIHR5cGVzIG5lZWRlZCBmcm9tIHNuanMuXG4gKiBUaGlzIGZpbGUgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHNuanMgYmVjb21lcyBhIG1vbm9yZXBvIGFuZCBwcm92aWRlcyBzdWNoIHR5cGVzLlxuICovXG5cbi8qKlxuICogVGhlIGF2YWlsYWJsZSBhY3Rpb25zIHRoYXQgYSBjb21wb25lbnQgY2FuIHBlcmZvcm0uXG4gKi9cbmV4cG9ydCBlbnVtIENvbXBvbmVudEFjdGlvbiB7XG4gIFNldFNpemUgPSAnc2V0LXNpemUnLFxuICBTdHJlYW1JdGVtcyA9ICdzdHJlYW0taXRlbXMnLFxuICBTdHJlYW1Db250ZXh0SXRlbSA9ICdzdHJlYW0tY29udGV4dC1pdGVtJyxcbiAgU2F2ZUl0ZW1zID0gJ3NhdmUtaXRlbXMnLFxuICBTZWxlY3RJdGVtID0gJ3NlbGVjdC1pdGVtJyxcbiAgQXNzb2NpYXRlSXRlbSA9ICdhc3NvY2lhdGUtaXRlbScsXG4gIERlYXNzb2NpYXRlSXRlbSA9ICdkZWFzc29jaWF0ZS1pdGVtJyxcbiAgQ2xlYXJTZWxlY3Rpb24gPSAnY2xlYXItc2VsZWN0aW9uJyxcbiAgQ3JlYXRlSXRlbSA9ICdjcmVhdGUtaXRlbScsXG4gIENyZWF0ZUl0ZW1zID0gJ2NyZWF0ZS1pdGVtcycsXG4gIERlbGV0ZUl0ZW1zID0gJ2RlbGV0ZS1pdGVtcycsXG4gIFNldENvbXBvbmVudERhdGEgPSAnc2V0LWNvbXBvbmVudC1kYXRhJyxcbiAgSW5zdGFsbExvY2FsQ29tcG9uZW50ID0gJ2luc3RhbGwtbG9jYWwtY29tcG9uZW50JyxcbiAgVG9nZ2xlQWN0aXZhdGVDb21wb25lbnQgPSAndG9nZ2xlLWFjdGl2YXRlLWNvbXBvbmVudCcsXG4gIFJlcXVlc3RQZXJtaXNzaW9ucyA9ICdyZXF1ZXN0LXBlcm1pc3Npb25zJyxcbiAgUHJlc2VudENvbmZsaWN0UmVzb2x1dGlvbiA9ICdwcmVzZW50LWNvbmZsaWN0LXJlc29sdXRpb24nLFxuICBEdXBsaWNhdGVJdGVtID0gJ2R1cGxpY2F0ZS1pdGVtJyxcbiAgQ29tcG9uZW50UmVnaXN0ZXJlZCA9ICdjb21wb25lbnQtcmVnaXN0ZXJlZCcsXG4gIEFjdGl2YXRlVGhlbWVzID0gJ3RoZW1lcycsXG4gIFJlcGx5ID0gJ3JlcGx5JyxcbiAgU2F2ZVN1Y2Nlc3MgPSAnc2F2ZS1zdWNjZXNzJyxcbiAgU2F2ZUVycm9yID0gJ3NhdmUtZXJyb3InLFxuICBUaGVtZXNBY3RpdmF0ZWQgPSAndGhlbWVzLWFjdGl2YXRlZCcsXG4gIEtleURvd24gPSAna2V5LWRvd24nLFxuICBLZXlVcCA9ICdrZXktdXAnLFxuICBDbGljayA9ICdjbGljaydcbn1cblxuZXhwb3J0IGVudW0gRW52aXJvbm1lbnQge1xuICBXZWIgPSAxLFxuICBEZXNrdG9wID0gMixcbiAgTW9iaWxlID0gM1xufVxuXG5leHBvcnQgZW51bSBDb250ZW50VHlwZSB7XG4gIEFueSA9ICcqJyxcbiAgSXRlbSA9ICdTRnxJdGVtJyxcbiAgUm9vdEtleSA9ICdTTnxSb290S2V5fE5vU3luYycsXG4gIEl0ZW1zS2V5ID0gJ1NOfEl0ZW1zS2V5JyxcbiAgRW5jcnlwdGVkU3RvcmFnZSA9ICdTTnxFbmNyeXB0ZWRTdG9yYWdlJyxcbiAgTm90ZSA9ICdOb3RlJyxcbiAgVGFnID0gJ1RhZycsXG4gIFNtYXJ0VGFnID0gJ1NOfFNtYXJ0VGFnJyxcbiAgQ29tcG9uZW50ID0gJ1NOfENvbXBvbmVudCcsXG4gIEVkaXRvciA9ICdTTnxFZGl0b3InLFxuICBBY3Rpb25zRXh0ZW5zaW9uID0gJ0V4dGVuc2lvbicsXG4gIFVzZXJQcmVmcyA9ICdTTnxVc2VyUHJlZmVyZW5jZXMnLFxuICBIaXN0b3J5U2Vzc2lvbiA9ICdTTnxIaXN0b3J5U2Vzc2lvbicsXG4gIFRoZW1lID0gJ1NOfFRoZW1lJyxcbiAgTWZhID0gJ1NGfE1GQScsXG4gIFNlcnZlckV4dGVuc2lvbiA9ICdTRnxFeHRlbnNpb24nLFxuICBGaWxlc2FmZUNyZWRlbnRpYWxzID0gJ1NOfEZpbGVTYWZlfENyZWRlbnRpYWxzJyxcbiAgRmlsZXNhZmVGaWxlTWV0YWRhdGEgPSAnU058RmlsZVNhZmV8RmlsZU1ldGFkYXRhJyxcbiAgRmlsZXNhZmVJbnRlZ3JhdGlvbiA9ICdTTnxGaWxlU2FmZXxJbnRlZ3JhdGlvbicsXG4gIEV4dGVuc2lvblJlcG8gPSAnU058RXh0ZW5zaW9uUmVwbycsXG59XG5cbmV4cG9ydCBlbnVtIEFwcERhdGFGaWVsZCB7XG4gIFBpbm5lZCA9ICdwaW5uZWQnLFxuICBBcmNoaXZlZCA9ICdhcmNoaXZlZCcsXG4gIExvY2tlZCA9ICdsb2NrZWQnLFxuICBVc2VyTW9kaWZpZWREYXRlID0gJ2NsaWVudF91cGRhdGVkX2F0JyxcbiAgRGVmYXVsdEVkaXRvciA9ICdkZWZhdWx0RWRpdG9yJyxcbiAgTW9iaWxlUnVsZXMgPSAnbW9iaWxlUnVsZXMnLFxuICBOb3RBdmFpbGFibGVPbk1vYmlsZSA9ICdub3RBdmFpbGFibGVPbk1vYmlsZScsXG4gIE1vYmlsZUFjdGl2ZSA9ICdtb2JpbGVBY3RpdmUnLFxuICBMYXN0U2l6ZSA9ICdsYXN0U2l6ZScsXG4gIFByZWZlcnNQbGFpbkVkaXRvciA9ICdwcmVmZXJzUGxhaW5FZGl0b3InLFxuICBDb21wb25lbnRJbnN0YWxsRXJyb3IgPSAnaW5zdGFsbEVycm9yJ1xufVxuIiwiLy8gVW5pcXVlIElEIGNyZWF0aW9uIHJlcXVpcmVzIGEgaGlnaCBxdWFsaXR5IHJhbmRvbSAjIGdlbmVyYXRvci4gSW4gdGhlIGJyb3dzZXIgd2UgdGhlcmVmb3JlXG4vLyByZXF1aXJlIHRoZSBjcnlwdG8gQVBJIGFuZCBkbyBub3Qgc3VwcG9ydCBidWlsdC1pbiBmYWxsYmFjayB0byBsb3dlciBxdWFsaXR5IHJhbmRvbSBudW1iZXJcbi8vIGdlbmVyYXRvcnMgKGxpa2UgTWF0aC5yYW5kb20oKSkuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uIEFsc28sXG4gICAgLy8gZmluZCB0aGUgY29tcGxldGUgaW1wbGVtZW50YXRpb24gb2YgY3J5cHRvIChtc0NyeXB0bykgb24gSUUxMS5cbiAgICBnZXRSYW5kb21WYWx1ZXMgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pIHx8IHR5cGVvZiBtc0NyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byk7XG5cbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRSYW5kb21WYWx1ZXMocm5kczgpO1xufSIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCJpbXBvcnQgUkVHRVggZnJvbSAnLi9yZWdleC5qcyc7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZTsiLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG4vKipcbiAqIENvbnZlcnQgYXJyYXkgb2YgMTYgYnl0ZSB2YWx1ZXMgdG8gVVVJRCBzdHJpbmcgZm9ybWF0IG9mIHRoZSBmb3JtOlxuICogWFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYXG4gKi9cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnkoYXJyKSB7XG4gIHZhciBvZmZzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG4gIC8vIE5vdGU6IEJlIGNhcmVmdWwgZWRpdGluZyB0aGlzIGNvZGUhICBJdCdzIGJlZW4gdHVuZWQgZm9yIHBlcmZvcm1hbmNlXG4gIC8vIGFuZCB3b3JrcyBpbiB3YXlzIHlvdSBtYXkgbm90IGV4cGVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzQzNFxuICB2YXIgdXVpZCA9IChieXRlVG9IZXhbYXJyW29mZnNldCArIDBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDNdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA1XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDZdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgN11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA4XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDldXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTBdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTNdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMTVdXSkudG9Mb3dlckNhc2UoKTsgLy8gQ29uc2lzdGVuY3kgY2hlY2sgZm9yIHZhbGlkIFVVSUQuICBJZiB0aGlzIHRocm93cywgaXQncyBsaWtlbHkgZHVlIHRvIG9uZVxuICAvLyBvZiB0aGUgZm9sbG93aW5nOlxuICAvLyAtIE9uZSBvciBtb3JlIGlucHV0IGFycmF5IHZhbHVlcyBkb24ndCBtYXAgdG8gYSBoZXggb2N0ZXQgKGxlYWRpbmcgdG9cbiAgLy8gXCJ1bmRlZmluZWRcIiBpbiB0aGUgdXVpZClcbiAgLy8gLSBJbnZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIFJGQyBgdmVyc2lvbmAgb3IgYHZhcmlhbnRgIGZpZWxkc1xuXG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCcpO1xuICB9XG5cbiAgcmV0dXJuIHV1aWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ2lmeTsiLCJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuXG5mdW5jdGlvbiB2NChvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpOyAvLyBQZXIgNC40LCBzZXQgYml0cyBmb3IgdmVyc2lvbiBhbmQgYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgXG5cbiAgcm5kc1s2XSA9IHJuZHNbNl0gJiAweDBmIHwgMHg0MDtcbiAgcm5kc1s4XSA9IHJuZHNbOF0gJiAweDNmIHwgMHg4MDsgLy8gQ29weSBieXRlcyB0byBidWZmZXIsIGlmIHByb3ZpZGVkXG5cbiAgaWYgKGJ1Zikge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICBidWZbb2Zmc2V0ICsgaV0gPSBybmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBidWY7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5KHJuZHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2NDsiLCJpbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4vc25qc1R5cGVzJ1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCdcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHsgbXNDcnlwdG86IHVua25vd247IH1cbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVXVpZCA9ICgpIDogc3RyaW5nID0+IHtcbiAgcmV0dXJuIHV1aWR2NCgpXG59XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkSnNvblN0cmluZyA9IChzdHI6IHVua25vd24pIDogYm9vbGVhbiA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShzdHIpXG4gICAgY29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXN1bHQpXG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XSdcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbnZpcm9ubWVudFRvU3RyaW5nID0gKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCkgOiBzdHJpbmcgPT4ge1xuICBjb25zdCBtYXAgPSB7XG4gICAgW0Vudmlyb25tZW50LldlYl06ICd3ZWInLFxuICAgIFtFbnZpcm9ubWVudC5EZXNrdG9wXTogJ2Rlc2t0b3AnLFxuICAgIFtFbnZpcm9ubWVudC5Nb2JpbGVdOiAnbW9iaWxlJyxcbiAgfVxuICByZXR1cm4gbWFwW2Vudmlyb25tZW50XSA/PyBtYXBbRW52aXJvbm1lbnQuV2ViXVxufVxuXG5leHBvcnQgY29uc3QgaXNOb3RVbmRlZmluZWRPck51bGwgPSAodmFsdWU6IGFueSkgOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWRcbn1cbiIsImNvbnN0IG5vb3AgPSAoKSA9PiB1bmRlZmluZWRcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyIHtcbiAgc3RhdGljIGVuYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICh3aW5kb3cuY29uc29sZSB8fCBjb25zb2xlKSA/IHRydWUgOiBmYWxzZVxuICB9XG5cbiAgc3RhdGljIGdldCBpbmZvICgpIDogYW55IHtcbiAgICBpZiAoIUxvZ2dlci5pc1N1cHBvcnRlZCB8fCAhdGhpcy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gbm9vcFxuICAgIH1cbiAgICByZXR1cm4gY29uc29sZS5sb2cuYmluZChjb25zb2xlKVxuICB9XG5cbiAgc3RhdGljIGdldCBlcnJvciAoKSA6IGFueSB7XG4gICAgaWYgKCFMb2dnZXIuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHJldHVybiBub29wXG4gICAgfVxuICAgIHJldHVybiBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSlcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQXBwRGF0YUZpZWxkLFxuICBDb21wb25lbnRBY3Rpb24sXG4gIENvbnRlbnRUeXBlLFxuICBFbnZpcm9ubWVudCxcbn0gZnJvbSAnLi9zbmpzVHlwZXMnXG5pbXBvcnQgdHlwZSB7XG4gIENvbXBvbmVudFBlcm1pc3Npb24sXG4gIEl0ZW1NZXNzYWdlUGF5bG9hZCxcbiAgTWVzc2FnZURhdGEsXG4gIFNOSXRlbSxcbiAgVXVpZFN0cmluZyxcbn0gZnJvbSAnQHN0YW5kYXJkbm90ZXMvc25qcydcbmltcG9ydCB7XG4gIGVudmlyb25tZW50VG9TdHJpbmcsXG4gIGdlbmVyYXRlVXVpZCxcbiAgaXNWYWxpZEpzb25TdHJpbmcsXG4gIGlzTm90VW5kZWZpbmVkT3JOdWxsLFxufSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IExvZ2dlciBmcm9tICcuL2xvZ2dlcidcblxuY29uc3QgREVGQVVMVF9DT0FMTEVTRURfU0FWSU5HX0RFTEFZID0gMjUwXG5cbmVudW0gTWVzc2FnZVBheWxvYWRBcGkge1xuICBDb21wb25lbnQgPSAnY29tcG9uZW50Jyxcbn1cblxudHlwZSBDb21wb25lbnQgPSB7XG4gIHV1aWQ/OiBzdHJpbmdcbiAgb3JpZ2luPzogc3RyaW5nXG4gIGRhdGE/OiBDb21wb25lbnREYXRhXG4gIHNlc3Npb25LZXk/OiBzdHJpbmdcbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmdcbiAgcGxhdGZvcm0/OiBzdHJpbmdcbiAgaXNNb2JpbGU/OiBib29sZWFuXG4gIGFjY2VwdHNUaGVtZXM6IGJvb2xlYW5cbiAgYWN0aXZlVGhlbWVzOiBzdHJpbmdbXVxufVxuXG50eXBlIENvbXBvbmVudERhdGEgPSB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIE1lc3NhZ2VQYXlsb2FkID0ge1xuICBhY3Rpb246IENvbXBvbmVudEFjdGlvblxuICBkYXRhOiBNZXNzYWdlRGF0YVxuICBjb21wb25lbnREYXRhPzogQ29tcG9uZW50RGF0YVxuICBtZXNzYWdlSWQ/OiBVdWlkU3RyaW5nXG4gIHNlc3Npb25LZXk/OiBVdWlkU3RyaW5nXG4gIGFwaTogTWVzc2FnZVBheWxvYWRBcGlcbiAgb3JpZ2luYWw/OiBNZXNzYWdlUGF5bG9hZFxuICBjYWxsYmFjaz86ICguLi5wYXJhbXM6IGFueSkgPT4gdm9pZFxufVxuXG50eXBlIENvbXBvbmVudFJlbGF5T3B0aW9ucyA9IHtcbiAgY29hbGxlc2VkU2F2aW5nPzogYm9vbGVhblxuICBjb2FsbGVzZWRTYXZpbmdEZWxheT86IG51bWJlclxuICAvKipcbiAgICogT3V0cHV0cyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gY29uc29sZS5cbiAgICovXG4gIGRlYnVnPzogYm9vbGVhblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjb21wb25lbnQgYWNjZXB0cyB0aGVtZXMuXG4gICAqL1xuICBhY2NlcHRzVGhlbWVzPzogYm9vbGVhblxufVxuXG50eXBlIENvbXBvbmVudFJlbGF5UGFyYW1zID0ge1xuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgd2luZG93IG9iamVjdCB0aGF0IHRoZSBjb21wb25lbnQgaXMgcnVubmluZyBpbi5cbiAgICovXG4gIHRhcmdldFdpbmRvdzogV2luZG93XG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgcGVybWlzc2lvbnMgdGhhdCB0aGUgY29tcG9uZW50IGNhbiByZXF1ZXN0XG4gICAqIGFjY2VzcyBvbmNlIGl0J3MgcmVhZHkuXG4gICAqL1xuICBpbml0aWFsUGVybWlzc2lvbnM/OiBDb21wb25lbnRQZXJtaXNzaW9uW11cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIHRvIGluaXRpYWxpemVcbiAgICovXG4gIG9wdGlvbnM/OiBDb21wb25lbnRSZWxheU9wdGlvbnNcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdGhhdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBvblJlYWR5PzogKCkgPT4gdm9pZFxuICAvKipcbiAgICogQSBjYWxsYmFjayB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZW1lcyBoYXZlIGJlZW4gY2hhbmdlZC5cbiAgICovXG4gIG9uVGhlbWVzQ2hhbmdlPzogKCkgPT4gdm9pZFxufVxuXG50eXBlIEl0ZW1QYXlsb2FkID0ge1xuICBjb250ZW50X3R5cGU/OiBDb250ZW50VHlwZVxuICBjb250ZW50PzogYW55XG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5lbnVtIEtleWJvYXJkTW9kaWZpZXIge1xuICBTaGlmdCA9ICdTaGlmdCcsXG4gIEN0cmwgPSAnQ29udHJvbCcsXG4gIE1ldGEgPSAnTWV0YScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbXBvbmVudFJlbGF5IHtcbiAgcHJpdmF0ZSBjb250ZW50V2luZG93OiBXaW5kb3dcbiAgcHJpdmF0ZSBpbml0aWFsUGVybWlzc2lvbnM/OiBDb21wb25lbnRQZXJtaXNzaW9uW11cbiAgcHJpdmF0ZSBvblJlYWR5Q2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gIHByaXZhdGUgY29tcG9uZW50OiBDb21wb25lbnQgPSB7IGFjdGl2ZVRoZW1lczogW10sIGFjY2VwdHNUaGVtZXM6IHRydWUgfVxuICBwcml2YXRlIHNlbnRNZXNzYWdlczogTWVzc2FnZVBheWxvYWRbXSA9IFtdXG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBNZXNzYWdlUGF5bG9hZFtdID0gW11cbiAgcHJpdmF0ZSBsYXN0U3RyZWFtZWRJdGVtPzogSXRlbVBheWxvYWRcbiAgcHJpdmF0ZSBwZW5kaW5nU2F2ZUl0ZW1zPzogSXRlbVBheWxvYWRbXVxuICBwcml2YXRlIHBlbmRpbmdTYXZlVGltZW91dD86IE5vZGVKUy5UaW1lb3V0XG4gIHByaXZhdGUgcGVuZGluZ1NhdmVQYXJhbXM/OiBhbnlcbiAgcHJpdmF0ZSBjb2FsbGVzZWRTYXZpbmcgPSB0cnVlXG4gIHByaXZhdGUgY29hbGxlc2VkU2F2aW5nRGVsYXkgPSBERUZBVUxUX0NPQUxMRVNFRF9TQVZJTkdfREVMQVlcbiAgcHJpdmF0ZSBtZXNzYWdlSGFuZGxlcj86IChldmVudDogYW55KSA9PiB2b2lkXG4gIHByaXZhdGUga2V5RG93bkV2ZW50TGlzdGVuZXI/OiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWRcbiAgcHJpdmF0ZSBrZXlVcEV2ZW50TGlzdGVuZXI/OiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWRcbiAgcHJpdmF0ZSBjbGlja0V2ZW50TGlzdGVuZXI/OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWRcbiAgcHJpdmF0ZSBvblRoZW1lc0NoYW5nZUNhbGxiYWNrPzogKCkgPT4gdm9pZFxuICBwcml2YXRlIGNvbmNlcm5UaW1lb3V0czogTm9kZUpTLlRpbWVvdXRbXSA9IFtdXG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBDb21wb25lbnRSZWxheVBhcmFtcykge1xuICAgIGlmICghcGFyYW1zIHx8ICFwYXJhbXMudGFyZ2V0V2luZG93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRlbnRXaW5kb3cgbXVzdCBiZSBhIHZhbGlkIFdpbmRvdyBvYmplY3QuJylcbiAgICB9XG4gICAgdGhpcy5jb250ZW50V2luZG93ID0gcGFyYW1zLnRhcmdldFdpbmRvd1xuICAgIHRoaXMucHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1zKVxuICAgIHRoaXMucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcigpXG4gICAgdGhpcy5yZWdpc3RlcktleWJvYXJkRXZlbnRMaXN0ZW5lcnMoKVxuICAgIHRoaXMucmVnaXN0ZXJNb3VzZUV2ZW50TGlzdGVuZXJzKClcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1zOiBDb21wb25lbnRSZWxheVBhcmFtcykge1xuICAgIGNvbnN0IHsgaW5pdGlhbFBlcm1pc3Npb25zLCBvcHRpb25zLCBvblJlYWR5LCBvblRoZW1lc0NoYW5nZSB9ID0gcGFyYW1zXG5cbiAgICBpZiAoaW5pdGlhbFBlcm1pc3Npb25zICYmIGluaXRpYWxQZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmluaXRpYWxQZXJtaXNzaW9ucyA9IGluaXRpYWxQZXJtaXNzaW9uc1xuICAgIH1cblxuICAgIGlmIChpc05vdFVuZGVmaW5lZE9yTnVsbChvcHRpb25zPy5jb2FsbGVzZWRTYXZpbmcpKSB7XG4gICAgICB0aGlzLmNvYWxsZXNlZFNhdmluZyA9IG9wdGlvbnMhLmNvYWxsZXNlZFNhdmluZyFcbiAgICB9XG4gICAgaWYgKGlzTm90VW5kZWZpbmVkT3JOdWxsKG9wdGlvbnM/LmNvYWxsZXNlZFNhdmluZ0RlbGF5KSkge1xuICAgICAgdGhpcy5jb2FsbGVzZWRTYXZpbmdEZWxheSA9IG9wdGlvbnMhLmNvYWxsZXNlZFNhdmluZ0RlbGF5IVxuICAgIH1cbiAgICBpZiAoaXNOb3RVbmRlZmluZWRPck51bGwob3B0aW9ucz8uYWNjZXB0c1RoZW1lcykpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50LmFjY2VwdHNUaGVtZXMgPSBvcHRpb25zPy5hY2NlcHRzVGhlbWVzID8/IHRydWVcbiAgICB9XG4gICAgaWYgKGlzTm90VW5kZWZpbmVkT3JOdWxsKG9uUmVhZHkpKSB7XG4gICAgICB0aGlzLm9uUmVhZHlDYWxsYmFjayA9IG9uUmVhZHlcbiAgICB9XG4gICAgaWYgKGlzTm90VW5kZWZpbmVkT3JOdWxsKG9uVGhlbWVzQ2hhbmdlKSkge1xuICAgICAgdGhpcy5vblRoZW1lc0NoYW5nZUNhbGxiYWNrID0gb25UaGVtZXNDaGFuZ2VcbiAgICB9XG5cbiAgICBMb2dnZXIuZW5hYmxlZCA9IG9wdGlvbnM/LmRlYnVnID8/IGZhbHNlXG4gIH1cblxuICBwdWJsaWMgZGVpbml0KCk6IHZvaWQge1xuICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21wb25lbnQgPSB7XG4gICAgICBhY2NlcHRzVGhlbWVzOiB0cnVlLFxuICAgICAgYWN0aXZlVGhlbWVzOiBbXSxcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlUXVldWUgPSBbXVxuICAgIHRoaXMuc2VudE1lc3NhZ2VzID0gW11cbiAgICB0aGlzLmxhc3RTdHJlYW1lZEl0ZW0gPSB1bmRlZmluZWRcbiAgICB0aGlzLnBlbmRpbmdTYXZlSXRlbXMgPSB1bmRlZmluZWRcbiAgICB0aGlzLnBlbmRpbmdTYXZlVGltZW91dCA9IHVuZGVmaW5lZFxuICAgIHRoaXMucGVuZGluZ1NhdmVQYXJhbXMgPSB1bmRlZmluZWRcblxuICAgIGlmICh0aGlzLm1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ21lc3NhZ2UnLFxuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyLFxuICAgICAgKVxuICAgICAgdGhpcy5jb250ZW50V2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLm1lc3NhZ2VIYW5kbGVyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmtleURvd25FdmVudExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2tleWRvd24nLFxuICAgICAgICB0aGlzLmtleURvd25FdmVudExpc3RlbmVyLFxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmtleVVwRXZlbnRMaXN0ZW5lcikge1xuICAgICAgdGhpcy5jb250ZW50V2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5rZXlVcEV2ZW50TGlzdGVuZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xpY2tFdmVudExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrRXZlbnRMaXN0ZW5lcilcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5tZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBMb2dnZXIuaW5mbygnQ29tcG9uZW50cyBBUEkgTWVzc2FnZSByZWNlaXZlZDonLCBldmVudC5kYXRhKVxuXG4gICAgICAvKipcbiAgICAgICAqIFdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHdpbmRvdy5wYXJlbnQub3JpZ2luIGR1ZSB0byBjcm9zcy1kb21haW4gcmVzdHJpY3Rpb25zLlxuICAgICAgICogQ2hlY2sgcmVmZXJyZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgZGVmZXIgdG8gY2hlY2tpbmcgZm9yIGZpcnN0LXJ1biB2YWx1ZS5cbiAgICAgICAqIENyYWZ0IFVSTCBvYmplY3RzIHNvIHRoYXQgZXhhbXBsZS5jb20gPT09IGV4YW1wbGUuY29tL1xuICAgICAgICovXG4gICAgICBpZiAoZG9jdW1lbnQucmVmZXJyZXIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJyZXIgPSBuZXcgVVJMKGRvY3VtZW50LnJlZmVycmVyKS5vcmlnaW5cbiAgICAgICAgY29uc3QgZXZlbnRPcmlnaW4gPSBuZXcgVVJMKGV2ZW50Lm9yaWdpbikub3JpZ2luXG5cbiAgICAgICAgaWYgKHJlZmVycmVyICE9PSBldmVudE9yaWdpbikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1vYmlsZSBlbnZpcm9ubWVudCBzZW5kcyBkYXRhIGFzIEpTT04gc3RyaW5nLlxuICAgICAgY29uc3QgeyBkYXRhIH0gPSBldmVudFxuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IGlzVmFsaWRKc29uU3RyaW5nKGRhdGEpID8gSlNPTi5wYXJzZShkYXRhKSA6IGRhdGFcblxuICAgICAgaWYgKCFwYXJzZWREYXRhKSB7XG4gICAgICAgIExvZ2dlci5lcnJvcignSW52YWxpZCBkYXRhIHJlY2VpdmVkLiBTa2lwcGluZy4uLicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBDb21wb25lbnQgUmVnaXN0ZXJlZCBtZXNzYWdlIHdpbGwgYmUgdGhlIG1vc3QgcmVsaWFibGUgb25lLCBzbyB3ZSB3b24ndCBjaGFuZ2UgaXQgYWZ0ZXIgYW55IHN1YnNlcXVlbnQgZXZlbnRzLFxuICAgICAgICogaW4gY2FzZSB5b3UgcmVjZWl2ZSBhbiBldmVudCBmcm9tIGFub3RoZXIgd2luZG93LlxuICAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXBvbmVudC5vcmlnaW4gPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHBhcnNlZERhdGEuYWN0aW9uID09PSBDb21wb25lbnRBY3Rpb24uQ29tcG9uZW50UmVnaXN0ZXJlZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Lm9yaWdpbiA9IGV2ZW50Lm9yaWdpblxuICAgICAgfSBlbHNlIGlmIChldmVudC5vcmlnaW4gIT09IHRoaXMuY29tcG9uZW50Lm9yaWdpbikge1xuICAgICAgICAvLyBJZiBldmVudCBvcmlnaW4gZG9lc24ndCBtYXRjaCBmaXJzdC1ydW4gdmFsdWUsIHJldHVybi5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZShwYXJzZWREYXRhKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vYmlsZSAoUmVhY3QgTmF0aXZlKSB1c2VzIGBkb2N1bWVudGAsIHdlYi9kZXNrdG9wIHVzZXMgYHdpbmRvd2AuYWRkRXZlbnRMaXN0ZW5lclxuICAgICAqIGZvciBwb3N0TWVzc2FnZSBBUEkgdG8gd29yayBwcm9wZXJseS5cbiAgICAgKiBVcGRhdGUgTWF5IDIwMTk6XG4gICAgICogQXMgcGFydCBvZiB0cmFuc2l0aW9uaW5nIFJlYWN0IE5hdGl2ZSB3ZWJ2aWV3IGludG8gdGhlIGNvbW11bml0eSBwYWNrYWdlLFxuICAgICAqIHdlJ2xsIG5vdyBvbmx5IG5lZWQgdG8gdXNlIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyLlxuICAgICAqIEhvd2V2ZXIsIHdlIHdhbnQgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgTW9iaWxlIDwgdjMuMC41LCBzbyB3ZSdsbCBrZWVwIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJcbiAgICAgKiBBbHNvLCBldmVuIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG9mIHJlYWN0LW5hdGl2ZS13ZWJ2aWV3LCBBbmRyb2lkIG1heSBzdGlsbCByZXF1aXJlIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgKHdoaWxlIGlPUyBzdGlsbCBvbmx5IHJlcXVpcmVzIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKVxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1uYXRpdmUtY29tbXVuaXR5L3JlYWN0LW5hdGl2ZS13ZWJ2aWV3L2lzc3Vlcy8zMjMjaXNzdWVjb21tZW50LTQ2Nzc2NzkzM1xuICAgICAqL1xuICAgIHRoaXMuY29udGVudFdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ21lc3NhZ2UnLFxuICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcixcbiAgICAgIGZhbHNlLFxuICAgIClcbiAgICB0aGlzLmNvbnRlbnRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMubWVzc2FnZUhhbmRsZXIsIGZhbHNlKVxuXG4gICAgTG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIG1lc3NhZ2VzLi4uJylcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJLZXlib2FyZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMua2V5RG93bkV2ZW50TGlzdGVuZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIExvZ2dlci5pbmZvKGBBIGtleSBoYXMgYmVlbiBwcmVzc2VkOiAke2V2ZW50LmtleX1gKVxuXG4gICAgICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICB0aGlzLmtleURvd25FdmVudChLZXlib2FyZE1vZGlmaWVyLkN0cmwpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgIHRoaXMua2V5RG93bkV2ZW50KEtleWJvYXJkTW9kaWZpZXIuU2hpZnQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQua2V5ID09PSAnTWV0YScpIHtcbiAgICAgICAgdGhpcy5rZXlEb3duRXZlbnQoS2V5Ym9hcmRNb2RpZmllci5NZXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMua2V5VXBFdmVudExpc3RlbmVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICBMb2dnZXIuaW5mbyhgQSBrZXkgaGFzIGJlZW4gcmVsZWFzZWQ6ICR7ZXZlbnQua2V5fWApXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2tpbmcgdXNpbmcgZXZlbnQua2V5IGluc3RlYWQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYm9vbGVhbiBwcm9wZXJ0aWVzLlxuICAgICAgICovXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnQ29udHJvbCcpIHtcbiAgICAgICAgdGhpcy5rZXlVcEV2ZW50KEtleWJvYXJkTW9kaWZpZXIuQ3RybClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICAgIHRoaXMua2V5VXBFdmVudChLZXlib2FyZE1vZGlmaWVyLlNoaWZ0KVxuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdNZXRhJykge1xuICAgICAgICB0aGlzLmtleVVwRXZlbnQoS2V5Ym9hcmRNb2RpZmllci5NZXRhKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY29udGVudFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2tleWRvd24nLFxuICAgICAgdGhpcy5rZXlEb3duRXZlbnRMaXN0ZW5lcixcbiAgICAgIGZhbHNlLFxuICAgIClcbiAgICB0aGlzLmNvbnRlbnRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLmtleVVwRXZlbnRMaXN0ZW5lciwgZmFsc2UpXG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTW91c2VFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLmNsaWNrRXZlbnRMaXN0ZW5lciA9IChfZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIExvZ2dlci5pbmZvKCdBIGNsaWNrIGhhcyBiZWVuIHBlcmZvcm1lZC4nKVxuXG4gICAgICB0aGlzLm1vdXNlQ2xpY2tFdmVudCgpXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0V2ZW50TGlzdGVuZXIsIGZhbHNlKVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKHBheWxvYWQ6IE1lc3NhZ2VQYXlsb2FkKSB7XG4gICAgc3dpdGNoIChwYXlsb2FkLmFjdGlvbikge1xuICAgICAgY2FzZSBDb21wb25lbnRBY3Rpb24uQ29tcG9uZW50UmVnaXN0ZXJlZDpcbiAgICAgICAgdGhpcy5jb21wb25lbnQuc2Vzc2lvbktleSA9IHBheWxvYWQuc2Vzc2lvbktleVxuICAgICAgICBpZiAocGF5bG9hZC5jb21wb25lbnREYXRhKSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQuZGF0YSA9IHBheWxvYWQuY29tcG9uZW50RGF0YVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25SZWFkeShwYXlsb2FkLmRhdGEpXG4gICAgICAgIExvZ2dlci5pbmZvKCdDb21wb25lbnQgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgd2l0aCBwYXlsb2FkOicsIHBheWxvYWQpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgQ29tcG9uZW50QWN0aW9uLkFjdGl2YXRlVGhlbWVzOlxuICAgICAgICB0aGlzLmFjdGl2YXRlVGhlbWVzKHBheWxvYWQuZGF0YS50aGVtZXMpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKCFwYXlsb2FkLm9yaWdpbmFsKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIGNhbGxiYWNrIGZyb20gcXVldWUuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsTWVzc2FnZSA9IHRoaXMuc2VudE1lc3NhZ2VzPy5maWx0ZXIoXG4gICAgICAgICAgKG1lc3NhZ2U6IE1lc3NhZ2VQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5tZXNzYWdlSWQgPT09IHBheWxvYWQub3JpZ2luYWw/Lm1lc3NhZ2VJZFxuICAgICAgICAgIH0sXG4gICAgICAgIClbMF1cblxuICAgICAgICBpZiAoIW9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICAgIC8vIENvbm5lY3Rpb24gbXVzdCBoYXZlIGJlZW4gcmVzZXQuIFdlIHNob3VsZCBhbGVydCB0aGUgdXNlciB1bmxlc3MgaXQncyBhIHJlcGx5LFxuICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgbWF5IGhhdmUgYmVlbiBkZWFsbG9jYXRlZCBhbmQgcmVpbml0aWFsaXplZCBhbmQgbG9zdCB0aGVcbiAgICAgICAgICAvLyBvcmlnaW5hbCBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uTmFtZSA9IHRoaXMuY29udGVudFdpbmRvdy5kb2N1bWVudC50aXRsZVxuICAgICAgICAgIGNvbnN0IGFsZXJ0TWVzc2FnZSA9IChcbiAgICAgICAgICAgIGBUaGUgZXh0ZW5zaW9uICcke2V4dGVuc2lvbk5hbWV9JyBpcyBhdHRlbXB0aW5nIHRvIGNvbW11bmljYXRlIHdpdGggU3RhbmRhcmQgTm90ZXMsIGAgK1xuICAgICAgICAgICAgJ2J1dCBhbiBlcnJvciBpcyBwcmV2ZW50aW5nIGl0IGZyb20gZG9pbmcgc28uIFBsZWFzZSByZXN0YXJ0IHRoaXMgZXh0ZW5zaW9uIGFuZCB0cnkgYWdhaW4uJ1xuICAgICAgICAgICkucmVwbGFjZSgnICAnLCAnICcpXG5cbiAgICAgICAgICBMb2dnZXIuaW5mbyhhbGVydE1lc3NhZ2UpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbE1lc3NhZ2U/LmNhbGxiYWNrPy4ocGF5bG9hZC5kYXRhKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25SZWFkeShkYXRhOiBNZXNzYWdlRGF0YSkge1xuICAgIHRoaXMuY29tcG9uZW50LmVudmlyb25tZW50ID0gZGF0YS5lbnZpcm9ubWVudFxuICAgIHRoaXMuY29tcG9uZW50LnBsYXRmb3JtID0gZGF0YS5wbGF0Zm9ybVxuICAgIHRoaXMuY29tcG9uZW50LnV1aWQgPSBkYXRhLnV1aWRcblxuICAgIGlmICh0aGlzLmluaXRpYWxQZXJtaXNzaW9ucyAmJiB0aGlzLmluaXRpYWxQZXJtaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcXVlc3RQZXJtaXNzaW9ucyh0aGlzLmluaXRpYWxQZXJtaXNzaW9ucylcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdGhpcy5tZXNzYWdlUXVldWUpIHtcbiAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZS5hY3Rpb24sIG1lc3NhZ2UuZGF0YSwgbWVzc2FnZS5jYWxsYmFjaylcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZSA9IFtdXG5cbiAgICBMb2dnZXIuaW5mbygnRGF0YSBwYXNzZWQgdG8gb25SZWFkeTonLCBkYXRhKVxuXG4gICAgdGhpcy5hY3RpdmF0ZVRoZW1lcyhkYXRhLmFjdGl2ZVRoZW1lVXJscyB8fCBbXSlcblxuICAgIC8vIEFmdGVyIGFjdGl2YXRlVGhlbWVzIGlzIGRvbmUsIHdlIHdhbnQgdG8gc2VuZCBhIG1lc3NhZ2Ugd2l0aCB0aGUgVGhlbWVzQWN0aXZhdGVkIGFjdGlvbi5cbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5UaGVtZXNBY3RpdmF0ZWQsIHt9KVxuXG4gICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUmVhZHlDYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbXBvbmVudCBVVUlELlxuICAgKi9cbiAgcHVibGljIGdldFNlbGZDb21wb25lbnRVVUlEKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnV1aWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbXBvbmVudCBpcyBydW5uaW5nIGluIGEgRGVza3RvcCBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBpc1J1bm5pbmdJbkRlc2t0b3BBcHBsaWNhdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jb21wb25lbnQuZW52aXJvbm1lbnQgPT09IGVudmlyb25tZW50VG9TdHJpbmcoRW52aXJvbm1lbnQuRGVza3RvcClcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaXMgcnVubmluZyBpbiBhIE1vYmlsZSBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBpc1J1bm5pbmdJbk1vYmlsZUFwcGxpY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbXBvbmVudC5lbnZpcm9ubWVudCA9PT0gZW52aXJvbm1lbnRUb1N0cmluZyhFbnZpcm9ubWVudC5Nb2JpbGUpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbXBvbmVudCdzIGRhdGEgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBkYXRhIG9iamVjdC5cbiAgICogQHJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHZhbHVlIGZvciB0aGUga2V5IGRvZXMgbm90IGV4aXN0LiBSZXR1cm5zIHRoZSBzdG9yZWQgdmFsdWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBvbmVudERhdGFWYWx1ZUZvcktleShrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudC5kYXRhKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmRhdGFba2V5XVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbXBvbmVudCdzIGRhdGEgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBkYXRhIG9iamVjdC5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzdG9yZSB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS5cbiAgICovXG4gIHB1YmxpYyBzZXRDb21wb25lbnREYXRhVmFsdWVGb3JLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29tcG9uZW50LmRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvbXBvbmVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuJylcbiAgICB9XG4gICAgaWYgKCFrZXkgfHwgKGtleSAmJiBrZXkubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUga2V5IGZvciB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgYSB2YWxpZCBzdHJpbmcuJylcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnQuZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMuY29tcG9uZW50LmRhdGEsXG4gICAgICBba2V5XTogdmFsdWUsXG4gICAgfVxuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLlNldENvbXBvbmVudERhdGEsIHtcbiAgICAgIGNvbXBvbmVudERhdGE6IHRoaXMuY29tcG9uZW50LmRhdGEsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGNvbXBvbmVudCdzIGRhdGEgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGNsZWFyQ29tcG9uZW50RGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0ge31cbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5TZXRDb21wb25lbnREYXRhLCB7XG4gICAgICBjb21wb25lbnREYXRhOiB0aGlzLmNvbXBvbmVudC5kYXRhLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHBvc3RNZXNzYWdlKFxuICAgIGFjdGlvbjogQ29tcG9uZW50QWN0aW9uLFxuICAgIGRhdGE6IE1lc3NhZ2VEYXRhLFxuICAgIGNhbGxiYWNrPzogKC4uLnBhcmFtczogYW55KSA9PiB2b2lkLFxuICApIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc2Vzc2lvbktleSBpcyBub3Qgc2V0LCB3ZSBwdXNoIHRoZSBtZXNzYWdlIHRvIHF1ZXVlXG4gICAgICogdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBsYXRlciBvbi5cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMuY29tcG9uZW50LnNlc3Npb25LZXkpIHtcbiAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2goe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGFwaTogTWVzc2FnZVBheWxvYWRBcGkuQ29tcG9uZW50LFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGRhdGEsXG4gICAgICBtZXNzYWdlSWQ6IHRoaXMuZ2VuZXJhdGVVVUlEKCksXG4gICAgICBzZXNzaW9uS2V5OiB0aGlzLmNvbXBvbmVudC5zZXNzaW9uS2V5LFxuICAgICAgYXBpOiBNZXNzYWdlUGF5bG9hZEFwaS5Db21wb25lbnQsXG4gICAgfVxuXG4gICAgY29uc3Qgc2VudE1lc3NhZ2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpKVxuICAgIHNlbnRNZXNzYWdlLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnNlbnRNZXNzYWdlcy5wdXNoKHNlbnRNZXNzYWdlKVxuXG4gICAgbGV0IHBvc3RNZXNzYWdlUGF5bG9hZFxuXG4gICAgLy8gTW9iaWxlIChSZWFjdCBOYXRpdmUpIHJlcXVpcmVzIGEgc3RyaW5nIGZvciB0aGUgcG9zdE1lc3NhZ2UgQVBJLlxuICAgIGlmICh0aGlzLmlzUnVubmluZ0luTW9iaWxlQXBwbGljYXRpb24oKSkge1xuICAgICAgcG9zdE1lc3NhZ2VQYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdE1lc3NhZ2VQYXlsb2FkID0gbWVzc2FnZVxuICAgIH1cblxuICAgIExvZ2dlci5pbmZvKCdQb3N0aW5nIG1lc3NhZ2U6JywgcG9zdE1lc3NhZ2VQYXlsb2FkKVxuICAgIHRoaXMuY29udGVudFdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICBwb3N0TWVzc2FnZVBheWxvYWQsXG4gICAgICB0aGlzLmNvbXBvbmVudC5vcmlnaW4hLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdFBlcm1pc3Npb25zKFxuICAgIHBlcm1pc3Npb25zOiBDb21wb25lbnRQZXJtaXNzaW9uW10sXG4gICAgY2FsbGJhY2s/OiAoLi4ucGFyYW1zOiBhbnkpID0+IHZvaWQsXG4gICkge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoXG4gICAgICBDb21wb25lbnRBY3Rpb24uUmVxdWVzdFBlcm1pc3Npb25zLFxuICAgICAgeyBwZXJtaXNzaW9ucyB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZhdGVUaGVtZXMoaW5jb21pbmdVcmxzOiBzdHJpbmdbXSA9IFtdKSB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudC5hY2NlcHRzVGhlbWVzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBMb2dnZXIuaW5mbygnSW5jb21pbmcgdGhlbWVzOicsIGluY29taW5nVXJscylcblxuICAgIGNvbnN0IHsgYWN0aXZlVGhlbWVzIH0gPSB0aGlzLmNvbXBvbmVudFxuXG4gICAgaWYgKFxuICAgICAgYWN0aXZlVGhlbWVzICYmXG4gICAgICBhY3RpdmVUaGVtZXMuc29ydCgpLnRvU3RyaW5nKCkgPT0gaW5jb21pbmdVcmxzLnNvcnQoKS50b1N0cmluZygpXG4gICAgKSB7XG4gICAgICAvLyBJbmNvbWluZyB0aGVtZSBVUkxzIGFyZSBzYW1lIGFzIGFjdGl2ZSwgZG8gbm90aGluZy5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCB0aGVtZXNUb0FjdGl2YXRlID0gaW5jb21pbmdVcmxzXG4gICAgY29uc3QgdGhlbWVzVG9EZWFjdGl2YXRlID0gW11cblxuICAgIGZvciAoY29uc3QgYWN0aXZlVXJsIG9mIGFjdGl2ZVRoZW1lcykge1xuICAgICAgaWYgKCFpbmNvbWluZ1VybHMuaW5jbHVkZXMoYWN0aXZlVXJsKSkge1xuICAgICAgICAvLyBBY3RpdmUgbm90IHByZXNlbnQgaW4gaW5jb21pbmcsIGRlYWN0aXZhdGUgaXQuXG4gICAgICAgIHRoZW1lc1RvRGVhY3RpdmF0ZS5wdXNoKGFjdGl2ZVVybClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFscmVhZHkgcHJlc2VudCBpbiBhY3RpdmUgdGhlbWVzLCByZW1vdmUgaXQgZnJvbSB0aGVtZXNUb0FjdGl2YXRlLlxuICAgICAgICB0aGVtZXNUb0FjdGl2YXRlID0gdGhlbWVzVG9BY3RpdmF0ZS5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IGFjdGl2ZVVybFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIExvZ2dlci5pbmZvKCdEZWFjdGl2YXRpbmcgdGhlbWVzOicsIHRoZW1lc1RvRGVhY3RpdmF0ZSlcbiAgICBMb2dnZXIuaW5mbygnQWN0aXZhdGluZyB0aGVtZXM6JywgdGhlbWVzVG9BY3RpdmF0ZSlcblxuICAgIGZvciAoY29uc3QgdGhlbWVVcmwgb2YgdGhlbWVzVG9EZWFjdGl2YXRlKSB7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVUaGVtZSh0aGVtZVVybClcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudC5hY3RpdmVUaGVtZXMgPSBpbmNvbWluZ1VybHNcblxuICAgIGZvciAoY29uc3QgdGhlbWVVcmwgb2YgdGhlbWVzVG9BY3RpdmF0ZSkge1xuICAgICAgaWYgKCF0aGVtZVVybCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5rID0gdGhpcy5jb250ZW50V2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKVxuICAgICAgbGluay5pZCA9IGJ0b2EodGhlbWVVcmwpXG4gICAgICBsaW5rLmhyZWYgPSB0aGVtZVVybFxuICAgICAgbGluay50eXBlID0gJ3RleHQvY3NzJ1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCdcbiAgICAgIGxpbmsubWVkaWEgPSAnc2NyZWVuLHByaW50J1xuICAgICAgbGluay5jbGFzc05hbWUgPSAnY3VzdG9tLXRoZW1lJ1xuICAgICAgdGhpcy5jb250ZW50V2luZG93LmRvY3VtZW50XG4gICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gICAgICAgIC5hcHBlbmRDaGlsZChsaW5rKVxuICAgIH1cblxuICAgIHRoaXMub25UaGVtZXNDaGFuZ2VDYWxsYmFjayAmJiB0aGlzLm9uVGhlbWVzQ2hhbmdlQ2FsbGJhY2soKVxuICB9XG5cbiAgcHJpdmF0ZSB0aGVtZUVsZW1lbnRGb3JVcmwodGhlbWVVcmw6IHN0cmluZykge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShcbiAgICAgIHRoaXMuY29udGVudFdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjdXN0b20tdGhlbWUnKSxcbiAgICApLnNsaWNlKClcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgLy8gV2UgdXNlZCB0byBzZWFyY2ggaGVyZSBieSBgaHJlZmAsIGJ1dCBvbiBkZXNrdG9wLCB3aXRoIGxvY2FsIGZpbGU6Ly8gdXJscywgdGhhdCBkaWRuJ3Qgd29yayBmb3Igc29tZSByZWFzb24uXG4gICAgICByZXR1cm4gZWxlbWVudC5pZCA9PSBidG9hKHRoZW1lVXJsKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGRlYWN0aXZhdGVUaGVtZSh0aGVtZVVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGhlbWVFbGVtZW50Rm9yVXJsKHRoZW1lVXJsKVxuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKVxuICAgICAgZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVVVSUQoKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlVXVpZCgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBwbGF0Zm9ybSB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXRmb3JtKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnBsYXRmb3JtXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCB3aGVyZSB0aGUgY29tcG9uZW50IGlzIHJ1bm5pbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVudmlyb25tZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmVudmlyb25tZW50XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtcyBhIGNvbGxlY3Rpb24gb2YgSXRlbXMsIGZpbHRlcmVkIGJ5IGNvbnRlbnQgdHlwZS5cbiAgICogTmV3IGl0ZW1zIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGFzIHRoZXkgY29tZS5cbiAgICogQHBhcmFtIGNvbnRlbnRUeXBlcyBBIGNvbGxlY3Rpb24gb2YgQ29udGVudCBUeXBlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGUgc3RyZWFtZWQgaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgc3RyZWFtSXRlbXMoXG4gICAgY29udGVudFR5cGVzOiBDb250ZW50VHlwZVtdLFxuICAgIGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKFxuICAgICAgQ29tcG9uZW50QWN0aW9uLlN0cmVhbUl0ZW1zLFxuICAgICAgeyBjb250ZW50X3R5cGVzOiBjb250ZW50VHlwZXMgfSxcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY2FsbGJhY2soZGF0YS5pdGVtcylcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbXMgdGhlIGN1cnJlbnQgSXRlbSBpbiBjb250ZXh0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSBzdHJlYW1lZCBpdGVtLlxuICAgKi9cbiAgcHVibGljIHN0cmVhbUNvbnRleHRJdGVtKGNhbGxiYWNrOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uU3RyZWFtQ29udGV4dEl0ZW0sIHt9LCAoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgeyBpdGVtIH0gPSBkYXRhXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoaXMgaXMgYSBuZXcgY29udGV4dCBpdGVtIHRoYW4gdGhlIGNvbnRleHQgaXRlbSB0aGUgY29tcG9uZW50IHdhcyBjdXJyZW50bHkgZW50ZXJ0YWluaW5nLFxuICAgICAgICogd2Ugd2FudCB0byBpbW1lZGlhdGVseSBjb21taXQgYW55IHBlbmRpbmcgc2F2ZXMsIGJlY2F1c2UgaWYgeW91IHNlbmQgdGhlIG5ldyBjb250ZXh0IGl0ZW0gdG8gdGhlXG4gICAgICAgKiBjb21wb25lbnQgYmVmb3JlIGl0IGhhcyBjb21taXRlZCBpdHMgcHJlc2F2ZSwgaXQgd2lsbCBlbmQgdXAgZmlyc3QgcmVwbGFjaW5nIHRoZSBVSSB3aXRoIG5ldyBjb250ZXh0IGl0ZW0sXG4gICAgICAgKiBhbmQgd2hlbiB0aGUgZGVib3VuY2VyIGV4ZWN1dGVzIHRvIHJlYWQgdGhlIGNvbXBvbmVudCBVSSwgaXQgd2lsbCBiZSByZWFkaW5nIHRoZSBuZXcgVUkgZm9yIHRoZSBwcmV2aW91cyBpdGVtLlxuICAgICAgICovXG4gICAgICBjb25zdCBpc05ld0l0ZW0gPVxuICAgICAgICAhdGhpcy5sYXN0U3RyZWFtZWRJdGVtIHx8IHRoaXMubGFzdFN0cmVhbWVkSXRlbS51dWlkICE9PSBpdGVtLnV1aWRcblxuICAgICAgaWYgKGlzTmV3SXRlbSAmJiB0aGlzLnBlbmRpbmdTYXZlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nU2F2ZVRpbWVvdXQpXG4gICAgICAgIHRoaXMucGVyZm9ybVNhdmluZ09mSXRlbXModGhpcy5wZW5kaW5nU2F2ZVBhcmFtcylcbiAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZVRpbWVvdXQgPSB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5wZW5kaW5nU2F2ZVBhcmFtcyA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICB0aGlzLmxhc3RTdHJlYW1lZEl0ZW0gPSBpdGVtXG4gICAgICBjYWxsYmFjayh0aGlzLmxhc3RTdHJlYW1lZEl0ZW0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGEgYFRhZ2AgaXRlbS5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIEl0ZW0gKGBUYWdgIG9yIGBTbWFydFRhZ2ApIHRvIHNlbGVjdC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEl0ZW1QYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShDb21wb25lbnRBY3Rpb24uU2VsZWN0SXRlbSwge1xuICAgICAgaXRlbTogdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBjdXJyZW50IHNlbGVjdGVkIGBUYWdgIChpZiBhbnkpLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLkNsZWFyU2VsZWN0aW9uLCB7XG4gICAgICBjb250ZW50X3R5cGU6IENvbnRlbnRUeXBlLlRhZyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHN0b3JlcyBhbiBJdGVtIGluIHRoZSBpdGVtIHN0b3JlLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgSXRlbSdzIHBheWxvYWQgY29udGVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSBjcmVhdGVkIEl0ZW0uXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlSXRlbShpdGVtOiBJdGVtUGF5bG9hZCwgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKFxuICAgICAgQ29tcG9uZW50QWN0aW9uLkNyZWF0ZUl0ZW0sXG4gICAgICB7IGl0ZW06IHRoaXMuanNvbk9iamVjdEZvckl0ZW0oaXRlbSkgfSxcbiAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IHsgaXRlbSB9ID0gZGF0YVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBTTiBhcHAgaGFkIGFuIGlzc3VlIHdoZXJlIHRoZSBpdGVtIGluIHRoZSByZXBseSB0byBDb21wb25lbnRBY3Rpb25zLkNyZWF0ZUl0ZW1zXG4gICAgICAgICAqIHdvdWxkIGJlIG5lc3RlZCBpbnNpZGUgXCJpdGVtc1wiIGFuZCBub3QgXCJpdGVtXCIuIFNvIGhhbmRsZSBib3RoIGNhc2VzIGhlcmUuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoIWl0ZW0gJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpdGVtID0gZGF0YS5pdGVtc1swXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzb2NpYXRlSXRlbShpdGVtKVxuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhpdGVtKVxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc3RvcmVzIGEgY29sbGVjdGlvbiBvZiBJdGVtcyBpbiB0aGUgaXRlbSBzdG9yZS5cbiAgICogQHBhcmFtIGl0ZW1zIFRoZSBJdGVtKHMpIHBheWxvYWQgY29sbGVjdGlvbi5cbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSBjcmVhdGVkIEl0ZW0ocykuXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlSXRlbXMoXG4gICAgaXRlbXM6IEl0ZW1QYXlsb2FkW10sXG4gICAgY2FsbGJhY2s6IChkYXRhOiBhbnkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1hcHBlZCA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSlcbiAgICB0aGlzLnBvc3RNZXNzYWdlKFxuICAgICAgQ29tcG9uZW50QWN0aW9uLkNyZWF0ZUl0ZW1zLFxuICAgICAgeyBpdGVtczogbWFwcGVkIH0sXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGRhdGEuaXRlbXMpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NvY2lhdGVzIGEgYFRhZ2Agd2l0aCB0aGUgY3VycmVudCBOb3RlLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgYFRhZ2AgaXRlbSB0byBhc3NvY2lhdGUuXG4gICAqL1xuICBwdWJsaWMgYXNzb2NpYXRlSXRlbShpdGVtOiBJdGVtUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLkFzc29jaWF0ZUl0ZW0sIHtcbiAgICAgIGl0ZW06IHRoaXMuanNvbk9iamVjdEZvckl0ZW0oaXRlbSksXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFzc29jaWF0ZXMgYSBgVGFnYCB3aXRoIHRoZSBjdXJyZW50IE5vdGUuXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBgVGFnYCBpdGVtIHRvIGRlYXNzb2NpYXRlLlxuICAgKi9cbiAgcHVibGljIGRlYXNzb2NpYXRlSXRlbShpdGVtOiBJdGVtUGF5bG9hZCk6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLkRlYXNzb2NpYXRlSXRlbSwge1xuICAgICAgaXRlbTogdGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gSXRlbSBmcm9tIHRoZSBpdGVtIHN0b3JlLlxuICAgKiBAcGFyYW0gaXRlbSBUaGUgSXRlbSB0byBkZWxldGUuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlSXRlbShcbiAgICBpdGVtOiBJdGVtUGF5bG9hZCxcbiAgICBjYWxsYmFjazogKGRhdGE6IEl0ZW1NZXNzYWdlUGF5bG9hZCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGVJdGVtcyhbaXRlbV0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBjb2xsZWN0aW9uIG9mIEl0ZW1zIGZyb20gdGhlIGl0ZW0gc3RvcmUuXG4gICAqIEBwYXJhbSBpdGVtcyBUaGUgSXRlbShzKSB0byBkZWxldGUuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlSXRlbXMoXG4gICAgaXRlbXM6IEl0ZW1QYXlsb2FkW10sXG4gICAgY2FsbGJhY2s6IChkYXRhOiBJdGVtTWVzc2FnZVBheWxvYWQpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGl0ZW1zOiBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNvbk9iamVjdEZvckl0ZW0oaXRlbSlcbiAgICAgIH0pLFxuICAgIH1cbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5EZWxldGVJdGVtcywgcGFyYW1zLCAoZGF0YSkgPT4ge1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgY3VzdG9tIGFjdGlvbiB0byB0aGUgY29tcG9uZW50IG1hbmFnZXIuXG4gICAqIEBwYXJhbSBhY3Rpb25cbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzZW5kQ3VzdG9tRXZlbnQoXG4gICAgYWN0aW9uOiBDb21wb25lbnRBY3Rpb24sXG4gICAgZGF0YTogYW55LFxuICAgIGNhbGxiYWNrPzogKGRhdGE6IGFueSkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZShhY3Rpb24sIGRhdGEsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKGRhdGEpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhbiBleGlzdGluZyBJdGVtIGluIHRoZSBpdGVtIHN0b3JlLlxuICAgKiBAcGFyYW0gaXRlbSBBbiBleGlzdGluZyBJdGVtIHRvIGJlIHNhdmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIHNraXBEZWJvdW5jZXJcbiAgICovXG4gIHB1YmxpYyBzYXZlSXRlbShcbiAgICBpdGVtOiBJdGVtUGF5bG9hZCxcbiAgICBjYWxsYmFjaz86ICgpID0+IHZvaWQsXG4gICAgc2tpcERlYm91bmNlciA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVJdGVtcyhbaXRlbV0sIGNhbGxiYWNrLCBza2lwRGVib3VuY2VyKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBjYWxsYmFjayBiZWZvcmUgc2F2aW5nIGFuIEl0ZW0uXG4gICAqIEBwYXJhbSBpdGVtIEFuIGV4aXN0aW5nIEl0ZW0gdG8gYmUgc2F2ZWQuXG4gICAqIEBwYXJhbSBwcmVzYXZlIEFsbG93cyBjbGllbnRzIHRvIHBlcmZvcm0gYW55IGFjdGlvbnMgbGFzdCBzZWNvbmQgYmVmb3JlIHRoZSBzYXZlIGFjdHVhbGx5IG9jY3VycyAobGlrZSBzZXR0aW5nIHByZXZpZXdzKS5cbiAgICogU2F2ZXMgZGVib3VuY2UgYnkgZGVmYXVsdCwgc28gaWYgYSBjbGllbnQgbmVlZHMgdG8gY29tcHV0ZSBhIHByb3BlcnR5IG9uIGFuIGl0ZW0gYmVmb3JlIHNhdmluZywgaXQncyBiZXN0IHRvXG4gICAqIGhvb2sgaW50byB0aGUgZGVib3VuY2UgY3ljbGUgc28gdGhhdCBjbGllbnRzIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IHRoZWlyIG93biBkZWJvdW5jaW5nLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBzYXZlSXRlbVdpdGhQcmVzYXZlKFxuICAgIGl0ZW06IEl0ZW1QYXlsb2FkLFxuICAgIHByZXNhdmU6IGFueSxcbiAgICBjYWxsYmFjaz86ICgpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUl0ZW1zV2l0aFByZXNhdmUoW2l0ZW1dLCBwcmVzYXZlLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgYmVmb3JlIHNhdmluZyBhIGNvbGxlY3Rpb24gb2YgSXRlbXMuXG4gICAqIEBwYXJhbSBpdGVtcyBBIGNvbGxlY3Rpb24gb2YgZXhpc3RpbmcgSXRlbXMgdG8gYmUgc2F2ZWQuXG4gICAqIEBwYXJhbSBwcmVzYXZlIEFsbG93cyBjbGllbnRzIHRvIHBlcmZvcm0gYW55IGFjdGlvbnMgbGFzdCBzZWNvbmQgYmVmb3JlIHRoZSBzYXZlIGFjdHVhbGx5IG9jY3VycyAobGlrZSBzZXR0aW5nIHByZXZpZXdzKS5cbiAgICogU2F2ZXMgZGVib3VuY2UgYnkgZGVmYXVsdCwgc28gaWYgYSBjbGllbnQgbmVlZHMgdG8gY29tcHV0ZSBhIHByb3BlcnR5IG9uIGFuIGl0ZW0gYmVmb3JlIHNhdmluZywgaXQncyBiZXN0IHRvXG4gICAqIGhvb2sgaW50byB0aGUgZGVib3VuY2UgY3ljbGUgc28gdGhhdCBjbGllbnRzIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IHRoZWlyIG93biBkZWJvdW5jaW5nLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBzYXZlSXRlbXNXaXRoUHJlc2F2ZShcbiAgICBpdGVtczogSXRlbVBheWxvYWRbXSxcbiAgICBwcmVzYXZlOiBhbnksXG4gICAgY2FsbGJhY2s/OiAoKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVJdGVtcyhpdGVtcywgY2FsbGJhY2ssIGZhbHNlLCBwcmVzYXZlKVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtU2F2aW5nT2ZJdGVtcyh7XG4gICAgaXRlbXMsXG4gICAgcHJlc2F2ZSxcbiAgICBjYWxsYmFjayxcbiAgfToge1xuICAgIGl0ZW1zOiBJdGVtUGF5bG9hZFtdXG4gICAgcHJlc2F2ZTogKCkgPT4gdm9pZFxuICAgIGNhbGxiYWNrPzogKCkgPT4gdm9pZFxuICB9KSB7XG4gICAgY29uc3QgQ29uY2VybkludGVydmFsTVMgPSA1MDAwXG4gICAgY29uc3QgY29uY2VyblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29uY2VyblRpbWVvdXRzLmZvckVhY2goKHRpbWVvdXQpID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSlcbiAgICAgIGFsZXJ0KFxuICAgICAgICAnVGhpcyBlZGl0b3IgaXMgdW5hYmxlIHRvIGNvbW11bmljYXRlIHdpdGggU3RhbmRhcmQgTm90ZXMuICcgK1xuICAgICAgICAgICdZb3VyIGNoYW5nZXMgbWF5IG5vdCBiZSBzYXZlZC4gUGxlYXNlIGJhY2t1cCB5b3VyIGNoYW5nZXMsIHRoZW4gcmVzdGFydCB0aGUgJyArXG4gICAgICAgICAgJ2FwcGxpY2F0aW9uIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgIClcbiAgICB9LCBDb25jZXJuSW50ZXJ2YWxNUylcblxuICAgIHRoaXMuY29uY2VyblRpbWVvdXRzLnB1c2goY29uY2VyblRpbWVvdXQpXG5cbiAgICAvKipcbiAgICAgKiBQcmVzYXZlIGJsb2NrIGFsbG93cyBjbGllbnQgdG8gZ2FpbiB0aGUgYmVuZWZpdCBvZiBwZXJmb3JtaW5nIHNvbWV0aGluZyBpbiB0aGUgZGVib3VuY2UgY3ljbGUuXG4gICAgICovXG4gICAgcHJlc2F2ZSAmJiBwcmVzYXZlKClcblxuICAgIGNvbnN0IG1hcHBlZEl0ZW1zID0gW11cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIG1hcHBlZEl0ZW1zLnB1c2godGhpcy5qc29uT2JqZWN0Rm9ySXRlbShpdGVtKSlcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNvbmNlcm5UaW1lb3V0cy5mb3JFYWNoKCh0aW1lb3V0KSA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpXG4gICAgICBjYWxsYmFjaz8uKClcbiAgICB9XG5cbiAgICB0aGlzLnBvc3RNZXNzYWdlKFxuICAgICAgQ29tcG9uZW50QWN0aW9uLlNhdmVJdGVtcyxcbiAgICAgIHsgaXRlbXM6IG1hcHBlZEl0ZW1zIH0sXG4gICAgICB3cmFwcGVkQ2FsbGJhY2ssXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgY29sbGVjdGlvbiBvZiBleGlzdGluZyBJdGVtcy5cbiAgICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0byBiZSBzYXZlZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBza2lwRGVib3VuY2VyIEFsbG93cyBzYXZlcyB0byBnbyB0aHJvdWdoIHJpZ2h0IGF3YXkgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGltZW91dC5cbiAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHNhdmluZyBpdGVtcyB2aWEgb3RoZXIgbWVhbnMgYmVzaWRlcyBrZXlzdHJva2VzLlxuICAgKiBAcGFyYW0gcHJlc2F2ZVxuICAgKi9cbiAgcHVibGljIHNhdmVJdGVtcyhcbiAgICBpdGVtczogSXRlbVBheWxvYWRbXSxcbiAgICBjYWxsYmFjaz86ICgpID0+IHZvaWQsXG4gICAgc2tpcERlYm91bmNlciA9IGZhbHNlLFxuICAgIHByZXNhdmU/OiBhbnksXG4gICk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2hlbiB3ZSBjbGVhciBhIHBlbmRpbmcgc2F2ZSB0aW1lb3V0LFxuICAgICAqIHdlIGNhcnJ5IG92ZXIgdGhvc2UgcGVuZGluZyBpdGVtcyBpbnRvIHRoZSBuZXcgc2F2ZS5cbiAgICAgKi9cbiAgICBpZiAoIXRoaXMucGVuZGluZ1NhdmVJdGVtcykge1xuICAgICAgdGhpcy5wZW5kaW5nU2F2ZUl0ZW1zID0gW11cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2FsbGVzZWRTYXZpbmcgJiYgIXNraXBEZWJvdW5jZXIpIHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdTYXZlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nU2F2ZVRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluY29taW5nSWRzID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnV1aWQpXG4gICAgICAvKipcbiAgICAgICAqIFJlcGxhY2UgYW55IGV4aXN0aW5nIHNhdmUgaXRlbXMgd2l0aCBpbmNvbWluZyB2YWx1ZXMuXG4gICAgICAgKiBPbmx5IGtlZXAgaXRlbXMgaGVyZSB3aG8gYXJlIG5vdCBpbiBpbmNvbWluZ0lkcy5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcHJlZXhpc3RpbmdJdGVtcyA9IHRoaXMucGVuZGluZ1NhdmVJdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuICFpbmNvbWluZ0lkcy5pbmNsdWRlcyhpdGVtLnV1aWQpXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgbmV3IGl0ZW1zLCBub3cgdGhhdCB3ZSd2ZSBtYWRlIHN1cmUgaXQncyBjbGVhcmVkIG9mIGluY29taW5nIGl0ZW1zLlxuICAgICAgdGhpcy5wZW5kaW5nU2F2ZUl0ZW1zID0gcHJlZXhpc3RpbmdJdGVtcy5jb25jYXQoaXRlbXMpXG5cbiAgICAgIC8vIFdlJ2xsIHBvdGVudGlhbGx5IG5lZWQgdG8gY29tbWl0IGVhcmx5IGlmIHN0cmVhbS1jb250ZXh0LWl0ZW0gbWVzc2FnZSBjb21lcyBpbi5cbiAgICAgIHRoaXMucGVuZGluZ1NhdmVQYXJhbXMgPSB7XG4gICAgICAgIGl0ZW1zOiB0aGlzLnBlbmRpbmdTYXZlSXRlbXMsXG4gICAgICAgIHByZXNhdmUsXG4gICAgICAgIGNhbGxiYWNrLFxuICAgICAgfVxuXG4gICAgICB0aGlzLnBlbmRpbmdTYXZlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnBlcmZvcm1TYXZpbmdPZkl0ZW1zKHRoaXMucGVuZGluZ1NhdmVQYXJhbXMpXG4gICAgICAgIHRoaXMucGVuZGluZ1NhdmVJdGVtcyA9IFtdXG4gICAgICAgIHRoaXMucGVuZGluZ1NhdmVUaW1lb3V0ID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMucGVuZGluZ1NhdmVQYXJhbXMgPSBudWxsXG4gICAgICB9LCB0aGlzLmNvYWxsZXNlZFNhdmluZ0RlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBlcmZvcm1TYXZpbmdPZkl0ZW1zKHsgaXRlbXMsIHByZXNhdmUsIGNhbGxiYWNrIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBuZXcgY29udGFpbmVyIHNpemUgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHdpZHRoIFRoZSBuZXcgd2lkdGguXG4gICAqIEBwYXJhbSBoZWlnaHQgVGhlIG5ldyBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgc2V0U2l6ZSh3aWR0aDogc3RyaW5nIHwgbnVtYmVyLCBoZWlnaHQ6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UoQ29tcG9uZW50QWN0aW9uLlNldFNpemUsIHtcbiAgICAgIHR5cGU6ICdjb250YWluZXInLFxuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgS2V5RG93biBrZXlib2FyZCBldmVudCB0byB0aGUgU3RhbmRhcmQgTm90ZXMgcGFyZW50IGFwcGxpY2F0aW9uLlxuICAgKiBAcGFyYW0ga2V5Ym9hcmRNb2RpZmllciBUaGUga2V5Ym9hcmQgbW9kaWZpZXIgdGhhdCB3YXMgcHJlc3NlZC5cbiAgICovXG4gIHByaXZhdGUga2V5RG93bkV2ZW50KGtleWJvYXJkTW9kaWZpZXI6IEtleWJvYXJkTW9kaWZpZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5LZXlEb3duLCB7IGtleWJvYXJkTW9kaWZpZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgS2V5VXAga2V5Ym9hcmQgZXZlbnQgdG8gdGhlIFN0YW5kYXJkIE5vdGVzIHBhcmVudCBhcHBsaWNhdGlvbi5cbiAgICogQHBhcmFtIGtleWJvYXJkTW9kaWZpZXIgVGhlIGtleWJvYXJkIG1vZGlmaWVyIHRoYXQgd2FzIHJlbGVhc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBrZXlVcEV2ZW50KGtleWJvYXJkTW9kaWZpZXI6IEtleWJvYXJkTW9kaWZpZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5LZXlVcCwgeyBrZXlib2FyZE1vZGlmaWVyIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIENsaWNrIG1vdXNlIGV2ZW50IHRvIHRoZSBTdGFuZGFyZCBOb3RlcyBwYXJlbnQgYXBwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIG1vdXNlQ2xpY2tFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLnBvc3RNZXNzYWdlKENvbXBvbmVudEFjdGlvbi5DbGljaywge30pXG4gIH1cblxuICBwcml2YXRlIGpzb25PYmplY3RGb3JJdGVtKGl0ZW06IFNOSXRlbSB8IEl0ZW1QYXlsb2FkKSB7XG4gICAgY29uc3QgY29weSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pIGFzIGFueVxuICAgIGNvcHkuY2hpbGRyZW4gPSBudWxsXG4gICAgY29weS5wYXJlbnQgPSBudWxsXG4gICAgcmV0dXJuIGNvcHlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBJdGVtJ3MgYXBwRGF0YSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkuXG4gICAqIFVzZXMgdGhlIGRlZmF1bHQgZG9tYWluIChvcmcuc3RhbmRhcmRub3Rlcy5zbikuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aXRoIEl0ZW1zIHJldHVybmVkIGZyb20gc3RyZWFtQ29udGV4dEl0ZW0oKSBhbmQgc3RyZWFtSXRlbXMoKVxuICAgKiBAcGFyYW0gaXRlbSBUaGUgSXRlbSB0byBnZXQgdGhlIGFwcERhdGEgdmFsdWUgZnJvbS5cbiAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBnZXRJdGVtQXBwRGF0YVZhbHVlKFxuICAgIGl0ZW06IEl0ZW1NZXNzYWdlUGF5bG9hZCB8IHVuZGVmaW5lZCxcbiAgICBrZXk6IEFwcERhdGFGaWVsZCB8IHN0cmluZyxcbiAgKTogYW55IHtcbiAgICBjb25zdCBkZWZhdWx0RG9tYWluID0gJ29yZy5zdGFuZGFyZG5vdGVzLnNuJ1xuICAgIHJldHVybiBpdGVtPy5jb250ZW50Py5hcHBEYXRhPy5bZGVmYXVsdERvbWFpbl1ba2V5XVxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjwvc3ZnPlwiIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiPjxwYXRoIGQ9XFxcIk0wIDBoMjR2MjRIMHpcXFwiIGZpbGw9XFxcIm5vbmVcXFwiPjwvcGF0aD48cGF0aCBkPVxcXCJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5elxcXCI+PC9wYXRoPjwvc3ZnPlwiIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIDo6LSBQZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBvcmRlcmVkIG1hcHBpbmcgZnJvbVxuLy8gc3RyaW5ncyB0byB2YWx1ZXMsIHdpdGggc29tZSBjb252ZW5pZW50IHVwZGF0ZSBtZXRob2RzLlxuZnVuY3Rpb24gT3JkZXJlZE1hcChjb250ZW50KSB7XG4gIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG59XG5cbk9yZGVyZWRNYXAucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogT3JkZXJlZE1hcCxcblxuICBmaW5kOiBmdW5jdGlvbihrZXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGlcbiAgICByZXR1cm4gLTFcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nKSDihpIgP2FueVxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIGBrZXlgLCBvciByZXR1cm4gdW5kZWZpbmVkIHdoZW5cbiAgLy8gbm8gc3VjaCBrZXkgZXhpc3RzLlxuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChrZXkpO1xuICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55LCA/c3RyaW5nKSDihpIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IHJlcGxhY2luZyB0aGUgdmFsdWUgb2YgYGtleWAgd2l0aCBhIG5ld1xuICAvLyB2YWx1ZSwgb3IgYWRkaW5nIGEgYmluZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtYXAuIElmIGBuZXdLZXlgIGlzXG4gIC8vIGdpdmVuLCB0aGUga2V5IG9mIHRoZSBiaW5kaW5nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGtleS5cbiAgdXBkYXRlOiBmdW5jdGlvbihrZXksIHZhbHVlLCBuZXdLZXkpIHtcbiAgICB2YXIgc2VsZiA9IG5ld0tleSAmJiBuZXdLZXkgIT0ga2V5ID8gdGhpcy5yZW1vdmUobmV3S2V5KSA6IHRoaXM7XG4gICAgdmFyIGZvdW5kID0gc2VsZi5maW5kKGtleSksIGNvbnRlbnQgPSBzZWxmLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIGNvbnRlbnQucHVzaChuZXdLZXkgfHwga2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO1xuICAgICAgaWYgKG5ld0tleSkgY29udGVudFtmb3VuZF0gPSBuZXdLZXk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIFJldHVybiBhIG1hcCB3aXRoIHRoZSBnaXZlbiBrZXkgcmVtb3ZlZCwgaWYgaXQgZXhpc3RlZC5cbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHJldHVybiB0aGlzXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBjb250ZW50LnNwbGljZShmb3VuZCwgMik7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55KSDihpIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBuZXcga2V5IHRvIHRoZSBzdGFydCBvZiB0aGUgbWFwLlxuICBhZGRUb1N0YXJ0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKFtrZXksIHZhbHVlXS5jb25jYXQodGhpcy5yZW1vdmUoa2V5KS5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIG5ldyBrZXkgdG8gdGhlIGVuZCBvZiB0aGUgbWFwLlxuICBhZGRUb0VuZDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy5yZW1vdmUoa2V5KS5jb250ZW50LnNsaWNlKCk7XG4gICAgY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIHN0cmluZywgYW55KSDihpIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBrZXkgYWZ0ZXIgdGhlIGdpdmVuIGtleS4gSWYgYHBsYWNlYCBpcyBub3QgZm91bmQsIHRoZSBuZXdcbiAgLy8ga2V5IGlzIGFkZGVkIHRvIHRoZSBlbmQuXG4gIGFkZEJlZm9yZTogZnVuY3Rpb24ocGxhY2UsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgd2l0aG91dCA9IHRoaXMucmVtb3ZlKGtleSksIGNvbnRlbnQgPSB3aXRob3V0LmNvbnRlbnQuc2xpY2UoKTtcbiAgICB2YXIgZm91bmQgPSB3aXRob3V0LmZpbmQocGxhY2UpO1xuICAgIGNvbnRlbnQuc3BsaWNlKGZvdW5kID09IC0xID8gY29udGVudC5sZW5ndGggOiBmb3VuZCwgMCwga2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkpXG4gIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBtYXAsIGluXG4gIC8vIG9yZGVyLlxuICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICBmKHRoaXMuY29udGVudFtpXSwgdGhpcy5jb250ZW50W2kgKyAxXSk7XG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgcHJlcGVuZGluZyB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYCBiZWZvcmUgdGhlIGtleXMgaW4gYG1hcGAuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKG1hcC5jb250ZW50LmNvbmNhdCh0aGlzLnN1YnRyYWN0KG1hcCkuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgYXBwZW5kaW5nIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgIGFmdGVyIHRoZSBrZXlzIGluIGBtYXBgLlxuICBhcHBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKHRoaXMuc3VidHJhY3QobWFwKS5jb250ZW50LmNvbmNhdChtYXAuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYC5cbiAgc3VidHJhY3Q6IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVtb3ZlKG1hcC5jb250ZW50W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAvLyBUdXJuIG9yZGVyZWQgbWFwIGludG8gYSBwbGFpbiBvYmplY3QuXG4gIHRvT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgcmVzdWx0W2tleV0gPSB2YWx1ZTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LFxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgYW1vdW50IG9mIGtleXMgaW4gdGhpcyBtYXAuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID4+IDFcbiAgfVxufTtcblxuLy8gOjogKD91bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSDihpIgT3JkZXJlZE1hcFxuLy8gUmV0dXJuIGEgbWFwIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuIElmIG51bGwsIGNyZWF0ZSBhbiBlbXB0eVxuLy8gbWFwLiBJZiBnaXZlbiBhbiBvcmRlcmVkIG1hcCwgcmV0dXJuIHRoYXQgbWFwIGl0c2VsZi4gSWYgZ2l2ZW4gYW5cbi8vIG9iamVjdCwgY3JlYXRlIGEgbWFwIGZyb20gdGhlIG9iamVjdCdzIHByb3BlcnRpZXMuXG5PcmRlcmVkTWFwLmZyb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcmRlcmVkTWFwKSByZXR1cm4gdmFsdWVcbiAgdmFyIGNvbnRlbnQgPSBbXTtcbiAgaWYgKHZhbHVlKSBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSBjb250ZW50LnB1c2gocHJvcCwgdmFsdWVbcHJvcF0pO1xuICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9yZGVyZWRNYXA7XG4iLCJpbXBvcnQgT3JkZXJlZE1hcCBmcm9tICdvcmRlcmVkbWFwJztcblxuZnVuY3Rpb24gZmluZERpZmZTdGFydChhLCBiLCBwb3MpIHtcbiAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICBpZiAoaSA9PSBhLmNoaWxkQ291bnQgfHwgaSA9PSBiLmNoaWxkQ291bnQpXG4gICAgICAgICAgICByZXR1cm4gYS5jaGlsZENvdW50ID09IGIuY2hpbGRDb3VudCA/IG51bGwgOiBwb3M7XG4gICAgICAgIGxldCBjaGlsZEEgPSBhLmNoaWxkKGkpLCBjaGlsZEIgPSBiLmNoaWxkKGkpO1xuICAgICAgICBpZiAoY2hpbGRBID09IGNoaWxkQikge1xuICAgICAgICAgICAgcG9zICs9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgY2hpbGRBLnRleHRbal0gPT0gY2hpbGRCLnRleHRbal07IGorKylcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkQS5jb250ZW50LnNpemUgfHwgY2hpbGRCLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZERpZmZTdGFydChjaGlsZEEuY29udGVudCwgY2hpbGRCLmNvbnRlbnQsIHBvcyArIDEpO1xuICAgICAgICAgICAgaWYgKGlubmVyICE9IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyO1xuICAgICAgICB9XG4gICAgICAgIHBvcyArPSBjaGlsZEEubm9kZVNpemU7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZERpZmZFbmQoYSwgYiwgcG9zQSwgcG9zQikge1xuICAgIGZvciAobGV0IGlBID0gYS5jaGlsZENvdW50LCBpQiA9IGIuY2hpbGRDb3VudDs7KSB7XG4gICAgICAgIGlmIChpQSA9PSAwIHx8IGlCID09IDApXG4gICAgICAgICAgICByZXR1cm4gaUEgPT0gaUIgPyBudWxsIDogeyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIGxldCBjaGlsZEEgPSBhLmNoaWxkKC0taUEpLCBjaGlsZEIgPSBiLmNoaWxkKC0taUIpLCBzaXplID0gY2hpbGRBLm5vZGVTaXplO1xuICAgICAgICBpZiAoY2hpbGRBID09IGNoaWxkQikge1xuICAgICAgICAgICAgcG9zQSAtPSBzaXplO1xuICAgICAgICAgICAgcG9zQiAtPSBzaXplO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKVxuICAgICAgICAgICAgcmV0dXJuIHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgICAgICAgbGV0IHNhbWUgPSAwLCBtaW5TaXplID0gTWF0aC5taW4oY2hpbGRBLnRleHQubGVuZ3RoLCBjaGlsZEIudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgd2hpbGUgKHNhbWUgPCBtaW5TaXplICYmIGNoaWxkQS50ZXh0W2NoaWxkQS50ZXh0Lmxlbmd0aCAtIHNhbWUgLSAxXSA9PSBjaGlsZEIudGV4dFtjaGlsZEIudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0pIHtcbiAgICAgICAgICAgICAgICBzYW1lKys7XG4gICAgICAgICAgICAgICAgcG9zQS0tO1xuICAgICAgICAgICAgICAgIHBvc0ItLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRBLmNvbnRlbnQuc2l6ZSB8fCBjaGlsZEIuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBmaW5kRGlmZkVuZChjaGlsZEEuY29udGVudCwgY2hpbGRCLmNvbnRlbnQsIHBvc0EgLSAxLCBwb3NCIC0gMSk7XG4gICAgICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlubmVyO1xuICAgICAgICB9XG4gICAgICAgIHBvc0EgLT0gc2l6ZTtcbiAgICAgICAgcG9zQiAtPSBzaXplO1xuICAgIH1cbn1cblxuLyoqXG5BIGZyYWdtZW50IHJlcHJlc2VudHMgYSBub2RlJ3MgY29sbGVjdGlvbiBvZiBjaGlsZCBub2Rlcy5cblxuTGlrZSBub2RlcywgZnJhZ21lbnRzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcywgYW5kIHlvdVxuc2hvdWxkIG5vdCBtdXRhdGUgdGhlbSBvciB0aGVpciBjb250ZW50LiBSYXRoZXIsIHlvdSBjcmVhdGUgbmV3XG5pbnN0YW5jZXMgd2hlbmV2ZXIgbmVlZGVkLiBUaGUgQVBJIHRyaWVzIHRvIG1ha2UgdGhpcyBlYXN5LlxuKi9cbmNsYXNzIEZyYWdtZW50IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBjaGlsZCBub2RlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgY29udGVudCwgc2l6ZSkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplIHx8IDA7XG4gICAgICAgIGlmIChzaXplID09IG51bGwpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5zaXplICs9IGNvbnRlbnRbaV0ubm9kZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIEludm9rZSBhIGNhbGxiYWNrIGZvciBhbGwgZGVzY2VuZGFudCBub2RlcyBiZXR3ZWVuIHRoZSBnaXZlbiB0d29cbiAgICBwb3NpdGlvbnMgKHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXMgZnJhZ21lbnQpLiBEb2Vzbid0IGRlc2NlbmRcbiAgICBpbnRvIGEgbm9kZSB3aGVuIHRoZSBjYWxsYmFjayByZXR1cm5zIGBmYWxzZWAuXG4gICAgKi9cbiAgICBub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIG5vZGVTdGFydCA9IDAsIHBhcmVudCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgcG9zIDwgdG87IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jb250ZW50W2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tICYmIGYoY2hpbGQsIG5vZGVTdGFydCArIHBvcywgcGFyZW50IHx8IG51bGwsIGkpICE9PSBmYWxzZSAmJiBjaGlsZC5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBwb3MgKyAxO1xuICAgICAgICAgICAgICAgIGNoaWxkLm5vZGVzQmV0d2VlbihNYXRoLm1heCgwLCBmcm9tIC0gc3RhcnQpLCBNYXRoLm1pbihjaGlsZC5jb250ZW50LnNpemUsIHRvIC0gc3RhcnQpLCBmLCBub2RlU3RhcnQgKyBzdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgbm9kZS4gYHBvc2Agd2lsbCBiZVxuICAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQuIFRoZSBjYWxsYmFjayBtYXkgcmV0dXJuXG4gICAgYGZhbHNlYCB0byBwcmV2ZW50IHRyYXZlcnNhbCBvZiBhIGdpdmVuIG5vZGUncyBjaGlsZHJlbi5cbiAgICAqL1xuICAgIGRlc2NlbmRhbnRzKGYpIHtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oMCwgdGhpcy5zaXplLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0cmFjdCB0aGUgdGV4dCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC4gU2VlIHRoZSBzYW1lIG1ldGhvZCBvblxuICAgIFtgTm9kZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnRleHRCZXR3ZWVuKS5cbiAgICAqL1xuICAgIHRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpIHtcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiLCBmaXJzdCA9IHRydWU7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICBsZXQgbm9kZVRleHQgPSBub2RlLmlzVGV4dCA/IG5vZGUudGV4dC5zbGljZShNYXRoLm1heChmcm9tLCBwb3MpIC0gcG9zLCB0byAtIHBvcylcbiAgICAgICAgICAgICAgICA6ICFub2RlLmlzTGVhZiA/IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgOiBsZWFmVGV4dCA/ICh0eXBlb2YgbGVhZlRleHQgPT09IFwiZnVuY3Rpb25cIiA/IGxlYWZUZXh0KG5vZGUpIDogbGVhZlRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGUudHlwZS5zcGVjLmxlYWZUZXh0ID8gbm9kZS50eXBlLnNwZWMubGVhZlRleHQobm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0Jsb2NrICYmIChub2RlLmlzTGVhZiAmJiBub2RlVGV4dCB8fCBub2RlLmlzVGV4dGJsb2NrKSAmJiBibG9ja1NlcGFyYXRvcikge1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gYmxvY2tTZXBhcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0ICs9IG5vZGVUZXh0O1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBjb250YWluaW5nIHRoZSBjb21iaW5lZCBjb250ZW50IG9mIHRoaXNcbiAgICBmcmFnbWVudCBhbmQgdGhlIG90aGVyLlxuICAgICovXG4gICAgYXBwZW5kKG90aGVyKSB7XG4gICAgICAgIGlmICghb3RoZXIuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmxhc3RDaGlsZCwgZmlyc3QgPSBvdGhlci5maXJzdENoaWxkLCBjb250ZW50ID0gdGhpcy5jb250ZW50LnNsaWNlKCksIGkgPSAwO1xuICAgICAgICBpZiAobGFzdC5pc1RleHQgJiYgbGFzdC5zYW1lTWFya3VwKGZpcnN0KSkge1xuICAgICAgICAgICAgY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdID0gbGFzdC53aXRoVGV4dChsYXN0LnRleHQgKyBmaXJzdC50ZXh0KTtcbiAgICAgICAgICAgIGkgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBpIDwgb3RoZXIuY29udGVudC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNvbnRlbnQucHVzaChvdGhlci5jb250ZW50W2ldKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50LCB0aGlzLnNpemUgKyBvdGhlci5zaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3V0IG91dCB0aGUgc3ViLWZyYWdtZW50IGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBjdXQoZnJvbSwgdG8gPSB0aGlzLnNpemUpIHtcbiAgICAgICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdLCBzaXplID0gMDtcbiAgICAgICAgaWYgKHRvID4gZnJvbSlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jb250ZW50W2ldLCBlbmQgPSBwb3MgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgZnJvbSB8fCBlbmQgPiB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzVGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dChNYXRoLm1heCgwLCBmcm9tIC0gcG9zKSwgTWF0aC5taW4oY2hpbGQudGV4dC5sZW5ndGgsIHRvIC0gcG9zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5jdXQoTWF0aC5tYXgoMCwgZnJvbSAtIHBvcyAtIDEpLCBNYXRoLm1pbihjaGlsZC5jb250ZW50LnNpemUsIHRvIC0gcG9zIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHJlc3VsdCwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY3V0QnlJbmRleChmcm9tLCB0bykge1xuICAgICAgICBpZiAoZnJvbSA9PSB0bylcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodGhpcy5jb250ZW50LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBpbiB3aGljaCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaXNcbiAgICByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAqL1xuICAgIHJlcGxhY2VDaGlsZChpbmRleCwgbm9kZSkge1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuY29udGVudFtpbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09IG5vZGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICAgICAgbGV0IHNpemUgPSB0aGlzLnNpemUgKyBub2RlLm5vZGVTaXplIC0gY3VycmVudC5ub2RlU2l6ZTtcbiAgICAgICAgY29weVtpbmRleF0gPSBub2RlO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvcHksIHNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgYnkgcHJlcGVuZGluZyB0aGUgZ2l2ZW4gbm9kZSB0byB0aGlzXG4gICAgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBhZGRUb1N0YXJ0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChbbm9kZV0uY29uY2F0KHRoaXMuY29udGVudCksIHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBub2RlIHRvIHRoaXNcbiAgICBmcmFnbWVudC5cbiAgICAqL1xuICAgIGFkZFRvRW5kKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh0aGlzLmNvbnRlbnQuY29uY2F0KG5vZGUpLCB0aGlzLnNpemUgKyBub2RlLm5vZGVTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGlzIGZyYWdtZW50IHRvIGFub3RoZXIgb25lLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGggIT0gb3RoZXIuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRbaV0uZXEob3RoZXIuY29udGVudFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICAgICovXG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50WzBdIDogbnVsbDsgfVxuICAgIC8qKlxuICAgIFRoZSBsYXN0IGNoaWxkIG9mIHRoZSBmcmFnbWVudCwgb3IgYG51bGxgIGlmIGl0IGlzIGVtcHR5LlxuICAgICovXG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdIDogbnVsbDsgfVxuICAgIC8qKlxuICAgIFRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgaW4gdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIGdldCBjaGlsZENvdW50KCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFJhaXNlIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuICAgICovXG4gICAgY2hpbGQoaW5kZXgpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggXCIgKyBpbmRleCArIFwiIG91dCBvZiByYW5nZSBmb3IgXCIgKyB0aGlzKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LCBpZiBpdCBleGlzdHMuXG4gICAgKi9cbiAgICBtYXliZUNoaWxkKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRbaW5kZXhdIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgYGZgIGZvciBldmVyeSBjaGlsZCBub2RlLCBwYXNzaW5nIHRoZSBub2RlLCBpdHMgb2Zmc2V0XG4gICAgaW50byB0aGlzIHBhcmVudCBub2RlLCBhbmQgaXRzIGluZGV4LlxuICAgICovXG4gICAgZm9yRWFjaChmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jb250ZW50W2ldO1xuICAgICAgICAgICAgZihjaGlsZCwgcCwgaSk7XG4gICAgICAgICAgICBwICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHRoaXMgZnJhZ21lbnQgYW5kIGFub3RoZXJcbiAgICBmcmFnbWVudCBkaWZmZXIsIG9yIGBudWxsYCBpZiB0aGV5IGFyZSB0aGUgc2FtZS5cbiAgICAqL1xuICAgIGZpbmREaWZmU3RhcnQob3RoZXIsIHBvcyA9IDApIHtcbiAgICAgICAgcmV0dXJuIGZpbmREaWZmU3RhcnQodGhpcywgb3RoZXIsIHBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGZpcnN0IHBvc2l0aW9uLCBzZWFyY2hpbmcgZnJvbSB0aGUgZW5kLCBhdCB3aGljaCB0aGlzXG4gICAgZnJhZ21lbnQgYW5kIHRoZSBnaXZlbiBmcmFnbWVudCBkaWZmZXIsIG9yIGBudWxsYCBpZiB0aGV5IGFyZVxuICAgIHRoZSBzYW1lLiBTaW5jZSB0aGlzIHBvc2l0aW9uIHdpbGwgbm90IGJlIHRoZSBzYW1lIGluIGJvdGhcbiAgICBub2RlcywgYW4gb2JqZWN0IHdpdGggdHdvIHNlcGFyYXRlIHBvc2l0aW9ucyBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIGZpbmREaWZmRW5kKG90aGVyLCBwb3MgPSB0aGlzLnNpemUsIG90aGVyUG9zID0gb3RoZXIuc2l6ZSkge1xuICAgICAgICByZXR1cm4gZmluZERpZmZFbmQodGhpcywgb3RoZXIsIHBvcywgb3RoZXJQb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBpbmRleCBhbmQgaW5uZXIgb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiByZWxhdGl2ZVxuICAgIHBvc2l0aW9uIGluIHRoaXMgZnJhZ21lbnQuIFRoZSByZXN1bHQgb2JqZWN0IHdpbGwgYmUgcmV1c2VkXG4gICAgKG92ZXJ3cml0dGVuKSB0aGUgbmV4dCB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmluZEluZGV4KHBvcywgcm91bmQgPSAtMSkge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoMCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA9PSB0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgodGhpcy5jb250ZW50Lmxlbmd0aCwgcG9zKTtcbiAgICAgICAgaWYgKHBvcyA+IHRoaXMuc2l6ZSB8fCBwb3MgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBvc2l0aW9uICR7cG9zfSBvdXRzaWRlIG9mIGZyYWdtZW50ICgke3RoaXN9KWApO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyUG9zID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGN1ciA9IHRoaXMuY2hpbGQoaSksIGVuZCA9IGN1clBvcyArIGN1ci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPj0gcG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBwb3MgfHwgcm91bmQgPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSArIDEsIGVuZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KGksIGN1clBvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgZGVidWdnaW5nIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7IHJldHVybiBcIjxcIiArIHRoaXMudG9TdHJpbmdJbm5lcigpICsgXCI+XCI7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nSW5uZXIoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuam9pbihcIiwgXCIpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50Lm1hcChuID0+IG4udG9KU09OKCkpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBmcmFnbWVudCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRnJhZ21lbnQuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodmFsdWUubWFwKHNjaGVtYS5ub2RlRnJvbUpTT04pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBmcmFnbWVudCBmcm9tIGFuIGFycmF5IG9mIG5vZGVzLiBFbnN1cmVzIHRoYXQgYWRqYWNlbnRcbiAgICB0ZXh0IG5vZGVzIHdpdGggdGhlIHNhbWUgbWFya3MgYXJlIGpvaW5lZCB0b2dldGhlci5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJyYXkoYXJyYXkpIHtcbiAgICAgICAgaWYgKCFhcnJheS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGxldCBqb2luZWQsIHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgc2l6ZSArPSBub2RlLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkgJiYgbm9kZS5pc1RleHQgJiYgYXJyYXlbaSAtIDFdLnNhbWVNYXJrdXAobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW5lZClcbiAgICAgICAgICAgICAgICAgICAgam9pbmVkID0gYXJyYXkuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXSA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUZXh0KGpvaW5lZFtqb2luZWQubGVuZ3RoIC0gMV0udGV4dCArIG5vZGUudGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChqb2luZWQpIHtcbiAgICAgICAgICAgICAgICBqb2luZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGpvaW5lZCB8fCBhcnJheSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZyYWdtZW50IGZyb20gc29tZXRoaW5nIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGFcbiAgICBzZXQgb2Ygbm9kZXMuIEZvciBgbnVsbGAsIGl0IHJldHVybnMgdGhlIGVtcHR5IGZyYWdtZW50LiBGb3IgYVxuICAgIGZyYWdtZW50LCB0aGUgZnJhZ21lbnQgaXRzZWxmLiBGb3IgYSBub2RlIG9yIGFycmF5IG9mIG5vZGVzLCBhXG4gICAgZnJhZ21lbnQgY29udGFpbmluZyB0aG9zZSBub2Rlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tKG5vZGVzKSB7XG4gICAgICAgIGlmICghbm9kZXMpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChub2RlcyBpbnN0YW5jZW9mIEZyYWdtZW50KVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tQXJyYXkobm9kZXMpO1xuICAgICAgICBpZiAobm9kZXMuYXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2Rlc10sIG5vZGVzLm5vZGVTaXplKTtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gbm90IGNvbnZlcnQgXCIgKyBub2RlcyArIFwiIHRvIGEgRnJhZ21lbnRcIiArXG4gICAgICAgICAgICAobm9kZXMubm9kZXNCZXR3ZWVuID8gXCIgKGxvb2tzIGxpa2UgbXVsdGlwbGUgdmVyc2lvbnMgb2YgcHJvc2VtaXJyb3ItbW9kZWwgd2VyZSBsb2FkZWQpXCIgOiBcIlwiKSk7XG4gICAgfVxufVxuLyoqXG5BbiBlbXB0eSBmcmFnbWVudC4gSW50ZW5kZWQgdG8gYmUgcmV1c2VkIHdoZW5ldmVyIGEgbm9kZSBkb2Vzbid0XG5jb250YWluIGFueXRoaW5nIChyYXRoZXIgdGhhbiBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGZyYWdtZW50IGZvclxuZWFjaCBsZWFmIG5vZGUpLlxuKi9cbkZyYWdtZW50LmVtcHR5ID0gbmV3IEZyYWdtZW50KFtdLCAwKTtcbmNvbnN0IGZvdW5kID0geyBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG5mdW5jdGlvbiByZXRJbmRleChpbmRleCwgb2Zmc2V0KSB7XG4gICAgZm91bmQuaW5kZXggPSBpbmRleDtcbiAgICBmb3VuZC5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlRGVlcChhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghKGEgJiYgdHlwZW9mIGEgPT0gXCJvYmplY3RcIikgfHxcbiAgICAgICAgIShiICYmIHR5cGVvZiBiID09IFwib2JqZWN0XCIpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSAhPSBhcnJheSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghY29tcGFyZURlZXAoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICAgICAgaWYgKCEocCBpbiBiKSB8fCAhY29tcGFyZURlZXAoYVtwXSwgYltwXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuQSBtYXJrIGlzIGEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBub2RlLFxuc3VjaCBhcyBpdCBiZWluZyBlbXBoYXNpemVkLCBpbiBjb2RlIGZvbnQsIG9yIGEgbGluay4gSXQgaGFzIGFcbnR5cGUgYW5kIG9wdGlvbmFsbHkgYSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgZnVydGhlclxuaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHRhcmdldCBvZiB0aGUgbGluaykuIE1hcmtzIGFyZSBjcmVhdGVkXG50aHJvdWdoIGEgYFNjaGVtYWAsIHdoaWNoIGNvbnRyb2xzIHdoaWNoIHR5cGVzIGV4aXN0IGFuZCB3aGljaFxuYXR0cmlidXRlcyB0aGV5IGhhdmUuXG4qL1xuY2xhc3MgTWFyayB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtYXJrLlxuICAgICovXG4gICAgYXR0cnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHNldCBvZiBtYXJrcywgY3JlYXRlIGEgbmV3IHNldCB3aGljaCBjb250YWlucyB0aGlzIG9uZSBhc1xuICAgIHdlbGwsIGluIHRoZSByaWdodCBwb3NpdGlvbi4gSWYgdGhpcyBtYXJrIGlzIGFscmVhZHkgaW4gdGhlIHNldCxcbiAgICB0aGUgc2V0IGl0c2VsZiBpcyByZXR1cm5lZC4gSWYgYW55IG1hcmtzIHRoYXQgYXJlIHNldCB0byBiZVxuICAgIFtleGNsdXNpdmVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgd2l0aCB0aGlzIG1hcmsgYXJlIHByZXNlbnQsXG4gICAgdGhvc2UgYXJlIHJlcGxhY2VkIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgYWRkVG9TZXQoc2V0KSB7XG4gICAgICAgIGxldCBjb3B5LCBwbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBvdGhlciA9IHNldFtpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKG90aGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZS5leGNsdWRlcyhvdGhlci50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG90aGVyLnR5cGUuZXhjbHVkZXModGhpcy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlZCAmJiBvdGhlci50eXBlLnJhbmsgPiB0aGlzLnR5cGUucmFuaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5LnB1c2gob3RoZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoKTtcbiAgICAgICAgaWYgKCFwbGFjZWQpXG4gICAgICAgICAgICBjb3B5LnB1c2godGhpcyk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgdGhpcyBtYXJrIGZyb20gdGhlIGdpdmVuIHNldCwgcmV0dXJuaW5nIGEgbmV3IHNldC4gSWYgdGhpc1xuICAgIG1hcmsgaXMgbm90IGluIHRoZSBzZXQsIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGlzIGluIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBoYXMgdGhlIHNhbWUgdHlwZSBhbmQgYXR0cmlidXRlcyBhc1xuICAgIGFub3RoZXIgbWFyay5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAodGhpcy50eXBlID09IG90aGVyLnR5cGUgJiYgY29tcGFyZURlZXAodGhpcy5hdHRycywgb3RoZXIuYXR0cnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCB0aGlzIG1hcmsgdG8gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIEpTT04uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTWFyay5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubWFya3NbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlIGlzIG5vIG1hcmsgdHlwZSAke2pzb24udHlwZX0gaW4gdGhpcyBzY2hlbWFgKTtcbiAgICAgICAgbGV0IG1hcmsgPSB0eXBlLmNyZWF0ZShqc29uLmF0dHJzKTtcbiAgICAgICAgdHlwZS5jaGVja0F0dHJzKG1hcmsuYXR0cnMpO1xuICAgICAgICByZXR1cm4gbWFyaztcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHR3byBzZXRzIG9mIG1hcmtzIGFyZSBpZGVudGljYWwuXG4gICAgKi9cbiAgICBzdGF0aWMgc2FtZVNldChhLCBiKSB7XG4gICAgICAgIGlmIChhID09IGIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWFbaV0uZXEoYltpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcHJvcGVybHkgc29ydGVkIG1hcmsgc2V0IGZyb20gbnVsbCwgYSBzaW5nbGUgbWFyaywgb3IgYW5cbiAgICB1bnNvcnRlZCBhcnJheSBvZiBtYXJrcy5cbiAgICAqL1xuICAgIHN0YXRpYyBzZXRGcm9tKG1hcmtzKSB7XG4gICAgICAgIGlmICghbWFya3MgfHwgQXJyYXkuaXNBcnJheShtYXJrcykgJiYgbWFya3MubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gTWFyay5ub25lO1xuICAgICAgICBpZiAobWFya3MgaW5zdGFuY2VvZiBNYXJrKVxuICAgICAgICAgICAgcmV0dXJuIFttYXJrc107XG4gICAgICAgIGxldCBjb3B5ID0gbWFya3Muc2xpY2UoKTtcbiAgICAgICAgY29weS5zb3J0KChhLCBiKSA9PiBhLnR5cGUucmFuayAtIGIudHlwZS5yYW5rKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2V0IG9mIG1hcmtzLlxuKi9cbk1hcmsubm9uZSA9IFtdO1xuXG4vKipcbkVycm9yIHR5cGUgcmFpc2VkIGJ5IFtgTm9kZS5yZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVwbGFjZSkgd2hlblxuZ2l2ZW4gYW4gaW52YWxpZCByZXBsYWNlbWVudC5cbiovXG5jbGFzcyBSZXBsYWNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG4vKlxuUmVwbGFjZUVycm9yID0gZnVuY3Rpb24odGhpczogYW55LCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgbGV0IGVyciA9IEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSlcbiAgOyhlcnIgYXMgYW55KS5fX3Byb3RvX18gPSBSZXBsYWNlRXJyb3IucHJvdG90eXBlXG4gIHJldHVybiBlcnJcbn0gYXMgYW55XG5cblJlcGxhY2VFcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSlcblJlcGxhY2VFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZXBsYWNlRXJyb3JcblJlcGxhY2VFcnJvci5wcm90b3R5cGUubmFtZSA9IFwiUmVwbGFjZUVycm9yXCJcbiovXG4vKipcbkEgc2xpY2UgcmVwcmVzZW50cyBhIHBpZWNlIGN1dCBvdXQgb2YgYSBsYXJnZXIgZG9jdW1lbnQuIEl0XG5zdG9yZXMgbm90IG9ubHkgYSBmcmFnbWVudCwgYnV0IGFsc28gdGhlIGRlcHRoIHVwIHRvIHdoaWNoIG5vZGVzIG9uXG5ib3RoIHNpZGUgYXJlIOKAmG9wZW7igJkgKGN1dCB0aHJvdWdoKS5cbiovXG5jbGFzcyBTbGljZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UuIFdoZW4gc3BlY2lmeWluZyBhIG5vbi16ZXJvIG9wZW4gZGVwdGgsIHlvdSBtdXN0XG4gICAgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vZGVzIG9mIGF0IGxlYXN0IHRoYXQgZGVwdGggYXQgdGhlXG4gICAgYXBwcm9wcmlhdGUgc2lkZSBvZiB0aGUgZnJhZ21lbnTigJRpLmUuIGlmIHRoZSBmcmFnbWVudCBpcyBhblxuICAgIGVtcHR5IHBhcmFncmFwaCBub2RlLCBgb3BlblN0YXJ0YCBhbmQgYG9wZW5FbmRgIGNhbid0IGJlIGdyZWF0ZXJcbiAgICB0aGFuIDEuXG4gICAgXG4gICAgSXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIGNvbnRlbnQgb2Ygb3BlbiBub2RlcyB0byBjb25mb3JtIHRvXG4gICAgdGhlIHNjaGVtYSdzIGNvbnRlbnQgY29uc3RyYWludHMsIHRob3VnaCBpdCBzaG91bGQgYmUgYSB2YWxpZFxuICAgIHN0YXJ0L2VuZC9taWRkbGUgZm9yIHN1Y2ggYSBub2RlLCBkZXBlbmRpbmcgb24gd2hpY2ggc2lkZXMgYXJlXG4gICAgb3Blbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSdzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgb3BlbiBkZXB0aCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LlxuICAgICovXG4gICAgb3BlblN0YXJ0LCBcbiAgICAvKipcbiAgICBUaGUgb3BlbiBkZXB0aCBhdCB0aGUgZW5kLlxuICAgICovXG4gICAgb3BlbkVuZCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLm9wZW5TdGFydCA9IG9wZW5TdGFydDtcbiAgICAgICAgdGhpcy5vcGVuRW5kID0gb3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgdGhpcyBzbGljZSB3b3VsZCBhZGQgd2hlbiBpbnNlcnRlZCBpbnRvIGEgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5zaXplIC0gdGhpcy5vcGVuU3RhcnQgLSB0aGlzLm9wZW5FbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW5zZXJ0QXQocG9zLCBmcmFnbWVudCkge1xuICAgICAgICBsZXQgY29udGVudCA9IGluc2VydEludG8odGhpcy5jb250ZW50LCBwb3MgKyB0aGlzLm9wZW5TdGFydCwgZnJhZ21lbnQpO1xuICAgICAgICByZXR1cm4gY29udGVudCAmJiBuZXcgU2xpY2UoY29udGVudCwgdGhpcy5vcGVuU3RhcnQsIHRoaXMub3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVtb3ZlQmV0d2Vlbihmcm9tLCB0bykge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKHJlbW92ZVJhbmdlKHRoaXMuY29udGVudCwgZnJvbSArIHRoaXMub3BlblN0YXJ0LCB0byArIHRoaXMub3BlblN0YXJ0KSwgdGhpcy5vcGVuU3RhcnQsIHRoaXMub3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3RzIHdoZXRoZXIgdGhpcyBzbGljZSBpcyBlcXVhbCB0byBhbm90aGVyIHNsaWNlLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5lcShvdGhlci5jb250ZW50KSAmJiB0aGlzLm9wZW5TdGFydCA9PSBvdGhlci5vcGVuU3RhcnQgJiYgdGhpcy5vcGVuRW5kID09IG90aGVyLm9wZW5FbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQgKyBcIihcIiArIHRoaXMub3BlblN0YXJ0ICsgXCIsXCIgKyB0aGlzLm9wZW5FbmQgKyBcIilcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29udmVydCBhIHNsaWNlIHRvIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGpzb24gPSB7IGNvbnRlbnQ6IHRoaXMuY29udGVudC50b0pTT04oKSB9O1xuICAgICAgICBpZiAodGhpcy5vcGVuU3RhcnQgPiAwKVxuICAgICAgICAgICAganNvbi5vcGVuU3RhcnQgPSB0aGlzLm9wZW5TdGFydDtcbiAgICAgICAgaWYgKHRoaXMub3BlbkVuZCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5FbmQgPSB0aGlzLm9wZW5FbmQ7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHNsaWNlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHJldHVybiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IGpzb24ub3BlblN0YXJ0IHx8IDAsIG9wZW5FbmQgPSBqc29uLm9wZW5FbmQgfHwgMDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcGVuU3RhcnQgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2Ygb3BlbkVuZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBTbGljZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShGcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCksIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNsaWNlIGZyb20gYSBmcmFnbWVudCBieSB0YWtpbmcgdGhlIG1heGltdW0gcG9zc2libGVcbiAgICBvcGVuIHZhbHVlIG9uIGJvdGggc2lkZSBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgbWF4T3BlbihmcmFnbWVudCwgb3Blbklzb2xhdGluZyA9IHRydWUpIHtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IDAsIG9wZW5FbmQgPSAwO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsgbiAmJiAhbi5pc0xlYWYgJiYgKG9wZW5Jc29sYXRpbmcgfHwgIW4udHlwZS5zcGVjLmlzb2xhdGluZyk7IG4gPSBuLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgZm9yIChsZXQgbiA9IGZyYWdtZW50Lmxhc3RDaGlsZDsgbiAmJiAhbi5pc0xlYWYgJiYgKG9wZW5Jc29sYXRpbmcgfHwgIW4udHlwZS5zcGVjLmlzb2xhdGluZyk7IG4gPSBuLmxhc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5FbmQrKztcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShmcmFnbWVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzbGljZS5cbiovXG5TbGljZS5lbXB0eSA9IG5ldyBTbGljZShGcmFnbWVudC5lbXB0eSwgMCwgMCk7XG5mdW5jdGlvbiByZW1vdmVSYW5nZShjb250ZW50LCBmcm9tLCB0bykge1xuICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IGNvbnRlbnQuZmluZEluZGV4KGZyb20pLCBjaGlsZCA9IGNvbnRlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgbGV0IHsgaW5kZXg6IGluZGV4VG8sIG9mZnNldDogb2Zmc2V0VG8gfSA9IGNvbnRlbnQuZmluZEluZGV4KHRvKTtcbiAgICBpZiAob2Zmc2V0ID09IGZyb20gfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChvZmZzZXRUbyAhPSB0byAmJiAhY29udGVudC5jaGlsZChpbmRleFRvKS5pc1RleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJlbW92aW5nIG5vbi1mbGF0IHJhbmdlXCIpO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZnJvbSkuYXBwZW5kKGNvbnRlbnQuY3V0KHRvKSk7XG4gICAgfVxuICAgIGlmIChpbmRleCAhPSBpbmRleFRvKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJlbW92aW5nIG5vbi1mbGF0IHJhbmdlXCIpO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2VDaGlsZChpbmRleCwgY2hpbGQuY29weShyZW1vdmVSYW5nZShjaGlsZC5jb250ZW50LCBmcm9tIC0gb2Zmc2V0IC0gMSwgdG8gLSBvZmZzZXQgLSAxKSkpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW50byhjb250ZW50LCBkaXN0LCBpbnNlcnQsIHBhcmVudCkge1xuICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IGNvbnRlbnQuZmluZEluZGV4KGRpc3QpLCBjaGlsZCA9IGNvbnRlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgaWYgKG9mZnNldCA9PSBkaXN0IHx8IGNoaWxkLmlzVGV4dCkge1xuICAgICAgICBpZiAocGFyZW50ICYmICFwYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXgsIGluc2VydCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQuY3V0KDAsIGRpc3QpLmFwcGVuZChpbnNlcnQpLmFwcGVuZChjb250ZW50LmN1dChkaXN0KSk7XG4gICAgfVxuICAgIGxldCBpbm5lciA9IGluc2VydEludG8oY2hpbGQuY29udGVudCwgZGlzdCAtIG9mZnNldCAtIDEsIGluc2VydCk7XG4gICAgcmV0dXJuIGlubmVyICYmIGNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBjaGlsZC5jb3B5KGlubmVyKSk7XG59XG5mdW5jdGlvbiByZXBsYWNlKCRmcm9tLCAkdG8sIHNsaWNlKSB7XG4gICAgaWYgKHNsaWNlLm9wZW5TdGFydCA+ICRmcm9tLmRlcHRoKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiSW5zZXJ0ZWQgY29udGVudCBkZWVwZXIgdGhhbiBpbnNlcnRpb24gcG9zaXRpb25cIik7XG4gICAgaWYgKCRmcm9tLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0ICE9ICR0by5kZXB0aCAtIHNsaWNlLm9wZW5FbmQpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJJbmNvbnNpc3RlbnQgb3BlbiBkZXB0aHNcIik7XG4gICAgcmV0dXJuIHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgMCk7XG59XG5mdW5jdGlvbiByZXBsYWNlT3V0ZXIoJGZyb20sICR0bywgc2xpY2UsIGRlcHRoKSB7XG4gICAgbGV0IGluZGV4ID0gJGZyb20uaW5kZXgoZGVwdGgpLCBub2RlID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgaWYgKGluZGV4ID09ICR0by5pbmRleChkZXB0aCkgJiYgZGVwdGggPCAkZnJvbS5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCkge1xuICAgICAgICBsZXQgaW5uZXIgPSByZXBsYWNlT3V0ZXIoJGZyb20sICR0bywgc2xpY2UsIGRlcHRoICsgMSk7XG4gICAgICAgIHJldHVybiBub2RlLmNvcHkobm9kZS5jb250ZW50LnJlcGxhY2VDaGlsZChpbmRleCwgaW5uZXIpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXNsaWNlLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICByZXR1cm4gY2xvc2Uobm9kZSwgcmVwbGFjZVR3b1dheSgkZnJvbSwgJHRvLCBkZXB0aCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICghc2xpY2Uub3BlblN0YXJ0ICYmICFzbGljZS5vcGVuRW5kICYmICRmcm9tLmRlcHRoID09IGRlcHRoICYmICR0by5kZXB0aCA9PSBkZXB0aCkgeyAvLyBTaW1wbGUsIGZsYXQgY2FzZVxuICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ucGFyZW50LCBjb250ZW50ID0gcGFyZW50LmNvbnRlbnQ7XG4gICAgICAgIHJldHVybiBjbG9zZShwYXJlbnQsIGNvbnRlbnQuY3V0KDAsICRmcm9tLnBhcmVudE9mZnNldCkuYXBwZW5kKHNsaWNlLmNvbnRlbnQpLmFwcGVuZChjb250ZW50LmN1dCgkdG8ucGFyZW50T2Zmc2V0KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gcHJlcGFyZVNsaWNlRm9yUmVwbGFjZShzbGljZSwgJGZyb20pO1xuICAgICAgICByZXR1cm4gY2xvc2Uobm9kZSwgcmVwbGFjZVRocmVlV2F5KCRmcm9tLCBzdGFydCwgZW5kLCAkdG8sIGRlcHRoKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tKb2luKG1haW4sIHN1Yikge1xuICAgIGlmICghc3ViLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQobWFpbi50eXBlKSlcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkNhbm5vdCBqb2luIFwiICsgc3ViLnR5cGUubmFtZSArIFwiIG9udG8gXCIgKyBtYWluLnR5cGUubmFtZSk7XG59XG5mdW5jdGlvbiBqb2luYWJsZSgkYmVmb3JlLCAkYWZ0ZXIsIGRlcHRoKSB7XG4gICAgbGV0IG5vZGUgPSAkYmVmb3JlLm5vZGUoZGVwdGgpO1xuICAgIGNoZWNrSm9pbihub2RlLCAkYWZ0ZXIubm9kZShkZXB0aCkpO1xuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gYWRkTm9kZShjaGlsZCwgdGFyZ2V0KSB7XG4gICAgbGV0IGxhc3QgPSB0YXJnZXQubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA+PSAwICYmIGNoaWxkLmlzVGV4dCAmJiBjaGlsZC5zYW1lTWFya3VwKHRhcmdldFtsYXN0XSkpXG4gICAgICAgIHRhcmdldFtsYXN0XSA9IGNoaWxkLndpdGhUZXh0KHRhcmdldFtsYXN0XS50ZXh0ICsgY2hpbGQudGV4dCk7XG4gICAgZWxzZVxuICAgICAgICB0YXJnZXQucHVzaChjaGlsZCk7XG59XG5mdW5jdGlvbiBhZGRSYW5nZSgkc3RhcnQsICRlbmQsIGRlcHRoLCB0YXJnZXQpIHtcbiAgICBsZXQgbm9kZSA9ICgkZW5kIHx8ICRzdGFydCkubm9kZShkZXB0aCk7XG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwLCBlbmRJbmRleCA9ICRlbmQgPyAkZW5kLmluZGV4KGRlcHRoKSA6IG5vZGUuY2hpbGRDb3VudDtcbiAgICBpZiAoJHN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSAkc3RhcnQuaW5kZXgoZGVwdGgpO1xuICAgICAgICBpZiAoJHN0YXJ0LmRlcHRoID4gZGVwdGgpIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgkc3RhcnQudGV4dE9mZnNldCkge1xuICAgICAgICAgICAgYWRkTm9kZSgkc3RhcnQubm9kZUFmdGVyLCB0YXJnZXQpO1xuICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKylcbiAgICAgICAgYWRkTm9kZShub2RlLmNoaWxkKGkpLCB0YXJnZXQpO1xuICAgIGlmICgkZW5kICYmICRlbmQuZGVwdGggPT0gZGVwdGggJiYgJGVuZC50ZXh0T2Zmc2V0KVxuICAgICAgICBhZGROb2RlKCRlbmQubm9kZUJlZm9yZSwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGNsb3NlKG5vZGUsIGNvbnRlbnQpIHtcbiAgICBub2RlLnR5cGUuY2hlY2tDb250ZW50KGNvbnRlbnQpO1xuICAgIHJldHVybiBub2RlLmNvcHkoY29udGVudCk7XG59XG5mdW5jdGlvbiByZXBsYWNlVGhyZWVXYXkoJGZyb20sICRzdGFydCwgJGVuZCwgJHRvLCBkZXB0aCkge1xuICAgIGxldCBvcGVuU3RhcnQgPSAkZnJvbS5kZXB0aCA+IGRlcHRoICYmIGpvaW5hYmxlKCRmcm9tLCAkc3RhcnQsIGRlcHRoICsgMSk7XG4gICAgbGV0IG9wZW5FbmQgPSAkdG8uZGVwdGggPiBkZXB0aCAmJiBqb2luYWJsZSgkZW5kLCAkdG8sIGRlcHRoICsgMSk7XG4gICAgbGV0IGNvbnRlbnQgPSBbXTtcbiAgICBhZGRSYW5nZShudWxsLCAkZnJvbSwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIGlmIChvcGVuU3RhcnQgJiYgb3BlbkVuZCAmJiAkc3RhcnQuaW5kZXgoZGVwdGgpID09ICRlbmQuaW5kZXgoZGVwdGgpKSB7XG4gICAgICAgIGNoZWNrSm9pbihvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5TdGFydCwgcmVwbGFjZVRocmVlV2F5KCRmcm9tLCAkc3RhcnQsICRlbmQsICR0bywgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG9wZW5TdGFydClcbiAgICAgICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlblN0YXJ0LCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkc3RhcnQsIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICAgICAgYWRkUmFuZ2UoJHN0YXJ0LCAkZW5kLCBkZXB0aCwgY29udGVudCk7XG4gICAgICAgIGlmIChvcGVuRW5kKVxuICAgICAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuRW5kLCByZXBsYWNlVHdvV2F5KCRlbmQsICR0bywgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgIH1cbiAgICBhZGRSYW5nZSgkdG8sIG51bGwsIGRlcHRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gcmVwbGFjZVR3b1dheSgkZnJvbSwgJHRvLCBkZXB0aCkge1xuICAgIGxldCBjb250ZW50ID0gW107XG4gICAgYWRkUmFuZ2UobnVsbCwgJGZyb20sIGRlcHRoLCBjb250ZW50KTtcbiAgICBpZiAoJGZyb20uZGVwdGggPiBkZXB0aCkge1xuICAgICAgICBsZXQgdHlwZSA9IGpvaW5hYmxlKCRmcm9tLCAkdG8sIGRlcHRoICsgMSk7XG4gICAgICAgIGFkZE5vZGUoY2xvc2UodHlwZSwgcmVwbGFjZVR3b1dheSgkZnJvbSwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGFkZFJhbmdlKCR0bywgbnVsbCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCk7XG59XG5mdW5jdGlvbiBwcmVwYXJlU2xpY2VGb3JSZXBsYWNlKHNsaWNlLCAkYWxvbmcpIHtcbiAgICBsZXQgZXh0cmEgPSAkYWxvbmcuZGVwdGggLSBzbGljZS5vcGVuU3RhcnQsIHBhcmVudCA9ICRhbG9uZy5ub2RlKGV4dHJhKTtcbiAgICBsZXQgbm9kZSA9IHBhcmVudC5jb3B5KHNsaWNlLmNvbnRlbnQpO1xuICAgIGZvciAobGV0IGkgPSBleHRyYSAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICBub2RlID0gJGFsb25nLm5vZGUoaSkuY29weShGcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICByZXR1cm4geyBzdGFydDogbm9kZS5yZXNvbHZlTm9DYWNoZShzbGljZS5vcGVuU3RhcnQgKyBleHRyYSksXG4gICAgICAgIGVuZDogbm9kZS5yZXNvbHZlTm9DYWNoZShub2RlLmNvbnRlbnQuc2l6ZSAtIHNsaWNlLm9wZW5FbmQgLSBleHRyYSkgfTtcbn1cblxuLyoqXG5Zb3UgY2FuIFtfcmVzb2x2ZV9dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnJlc29sdmUpIGEgcG9zaXRpb24gdG8gZ2V0IG1vcmVcbmluZm9ybWF0aW9uIGFib3V0IGl0LiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHN1Y2ggYVxucmVzb2x2ZWQgcG9zaXRpb24sIHByb3ZpZGluZyB2YXJpb3VzIHBpZWNlcyBvZiBjb250ZXh0XG5pbmZvcm1hdGlvbiwgYW5kIHNvbWUgaGVscGVyIG1ldGhvZHMuXG5cblRocm91Z2hvdXQgdGhpcyBpbnRlcmZhY2UsIG1ldGhvZHMgdGhhdCB0YWtlIGFuIG9wdGlvbmFsIGBkZXB0aGBcbnBhcmFtZXRlciB3aWxsIGludGVycHJldCB1bmRlZmluZWQgYXMgYHRoaXMuZGVwdGhgIGFuZCBuZWdhdGl2ZVxubnVtYmVycyBhcyBgdGhpcy5kZXB0aCArIHZhbHVlYC5cbiovXG5jbGFzcyBSZXNvbHZlZFBvcyB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gdGhhdCB3YXMgcmVzb2x2ZWQuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcGF0aCwgXG4gICAgLyoqXG4gICAgVGhlIG9mZnNldCB0aGlzIHBvc2l0aW9uIGhhcyBpbnRvIGl0cyBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIHBhcmVudE9mZnNldCkge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5wYXJlbnRPZmZzZXQgPSBwYXJlbnRPZmZzZXQ7XG4gICAgICAgIHRoaXMuZGVwdGggPSBwYXRoLmxlbmd0aCAvIDMgLSAxO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc29sdmVEZXB0aCh2YWwpIHtcbiAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwdGg7XG4gICAgICAgIGlmICh2YWwgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwdGggKyB2YWw7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBwYXJlbnQgbm9kZSB0aGF0IHRoZSBwb3NpdGlvbiBwb2ludHMgaW50by4gTm90ZSB0aGF0IGV2ZW4gaWZcbiAgICBhIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCB0aGF0IG5vZGUgaXMgbm90IGNvbnNpZGVyZWRcbiAgICB0aGUgcGFyZW504oCUdGV4dCBub2RlcyBhcmUg4oCYZmxhdOKAmSBpbiB0aGlzIG1vZGVsLCBhbmQgaGF2ZSBubyBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHRoaXMubm9kZSh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSByb290IG5vZGUgaW4gd2hpY2ggdGhlIHBvc2l0aW9uIHdhcyByZXNvbHZlZC5cbiAgICAqL1xuICAgIGdldCBkb2MoKSB7IHJldHVybiB0aGlzLm5vZGUoMCk7IH1cbiAgICAvKipcbiAgICBUaGUgYW5jZXN0b3Igbm9kZSBhdCB0aGUgZ2l2ZW4gbGV2ZWwuIGBwLm5vZGUocC5kZXB0aClgIGlzIHRoZVxuICAgIHNhbWUgYXMgYHAucGFyZW50YC5cbiAgICAqL1xuICAgIG5vZGUoZGVwdGgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnJlc29sdmVEZXB0aChkZXB0aCkgKiAzXTsgfVxuICAgIC8qKlxuICAgIFRoZSBpbmRleCBpbnRvIHRoZSBhbmNlc3RvciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuIElmIHRoaXMgcG9pbnRzXG4gICAgYXQgdGhlIDNyZCBub2RlIGluIHRoZSAybmQgcGFyYWdyYXBoIG9uIHRoZSB0b3AgbGV2ZWwsIGZvclxuICAgIGV4YW1wbGUsIGBwLmluZGV4KDApYCBpcyAxIGFuZCBgcC5pbmRleCgxKWAgaXMgMi5cbiAgICAqL1xuICAgIGluZGV4KGRlcHRoKSB7IHJldHVybiB0aGlzLnBhdGhbdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpICogMyArIDFdOyB9XG4gICAgLyoqXG4gICAgVGhlIGluZGV4IHBvaW50aW5nIGFmdGVyIHRoaXMgcG9zaXRpb24gaW50byB0aGUgYW5jZXN0b3IgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwuXG4gICAgKi9cbiAgICBpbmRleEFmdGVyKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleChkZXB0aCkgKyAoZGVwdGggPT0gdGhpcy5kZXB0aCAmJiAhdGhpcy50ZXh0T2Zmc2V0ID8gMCA6IDEpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuXG4gICAgbGV2ZWwuXG4gICAgKi9cbiAgICBzdGFydChkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIGRlcHRoID09IDAgPyAwIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgMTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW5cbiAgICBsZXZlbC5cbiAgICAqL1xuICAgIGVuZChkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQoZGVwdGgpICsgdGhpcy5ub2RlKGRlcHRoKS5jb250ZW50LnNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGRpcmVjdGx5IGJlZm9yZSB0aGUgd3JhcHBpbmcgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbCwgb3IsIHdoZW4gYGRlcHRoYCBpcyBgdGhpcy5kZXB0aCArIDFgLCB0aGUgb3JpZ2luYWxcbiAgICBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGJlZm9yZShkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlcmUgaXMgbm8gcG9zaXRpb24gYmVmb3JlIHRoZSB0b3AtbGV2ZWwgbm9kZVwiKTtcbiAgICAgICAgcmV0dXJuIGRlcHRoID09IHRoaXMuZGVwdGggKyAxID8gdGhpcy5wb3MgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV07XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGRpcmVjdGx5IGFmdGVyIHRoZSB3cmFwcGluZyBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLCBvciB0aGUgb3JpZ2luYWwgcG9zaXRpb24gd2hlbiBgZGVwdGhgIGlzIGB0aGlzLmRlcHRoICsgMWAuXG4gICAgKi9cbiAgICBhZnRlcihkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlcmUgaXMgbm8gcG9zaXRpb24gYWZ0ZXIgdGhlIHRvcC1sZXZlbCBub2RlXCIpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gdGhpcy5kZXB0aCArIDEgPyB0aGlzLnBvcyA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIHRoaXMucGF0aFtkZXB0aCAqIDNdLm5vZGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGVuIHRoaXMgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIHRoaXMgcmV0dXJucyB0aGVcbiAgICBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb3NpdGlvbiBhbmQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IG5vZGUuXG4gICAgV2lsbCBiZSB6ZXJvIGZvciBwb3NpdGlvbnMgdGhhdCBwb2ludCBiZXR3ZWVuIG5vZGVzLlxuICAgICovXG4gICAgZ2V0IHRleHRPZmZzZXQoKSB7IHJldHVybiB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG5vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIHBvc2l0aW9uLCBpZiBhbnkuIElmIHRoZSBwb3NpdGlvblxuICAgIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IG9mIHRoYXQgbm9kZSBhZnRlciB0aGVcbiAgICBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIGdldCBub2RlQWZ0ZXIoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudCwgaW5kZXggPSB0aGlzLmluZGV4KHRoaXMuZGVwdGgpO1xuICAgICAgICBpZiAoaW5kZXggPT0gcGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGRPZmYgPSB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV0sIGNoaWxkID0gcGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGRPZmYgPyBwYXJlbnQuY2hpbGQoaW5kZXgpLmN1dChkT2ZmKSA6IGNoaWxkO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG5vZGUgZGlyZWN0bHkgYmVmb3JlIHRoZSBwb3NpdGlvbiwgaWYgYW55LiBJZiB0aGVcbiAgICBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgb25seSB0aGUgcGFydCBvZiB0aGF0IG5vZGVcbiAgICBiZWZvcmUgdGhlIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZ2V0IG5vZGVCZWZvcmUoKSB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuaW5kZXgodGhpcy5kZXB0aCk7XG4gICAgICAgIGxldCBkT2ZmID0gdGhpcy5wb3MgLSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoZE9mZilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZChpbmRleCkuY3V0KDAsIGRPZmYpO1xuICAgICAgICByZXR1cm4gaW5kZXggPT0gMCA/IG51bGwgOiB0aGlzLnBhcmVudC5jaGlsZChpbmRleCAtIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBvc2l0aW9uIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgcGFyZW50IG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gZGVwdGggKHdoaWNoIGRlZmF1bHRzIHRvIGB0aGlzLmRlcHRoYCkuXG4gICAgKi9cbiAgICBwb3NBdEluZGV4KGluZGV4LCBkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnBhdGhbZGVwdGggKiAzXSwgcG9zID0gZGVwdGggPT0gMCA/IDAgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspXG4gICAgICAgICAgICBwb3MgKz0gbm9kZS5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBtYXJrcyBhdCB0aGlzIHBvc2l0aW9uLCBmYWN0b3JpbmcgaW4gdGhlIHN1cnJvdW5kaW5nXG4gICAgbWFya3MnIFtgaW5jbHVzaXZlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmluY2x1c2l2ZSkgcHJvcGVydHkuIElmIHRoZVxuICAgIHBvc2l0aW9uIGlzIGF0IHRoZSBzdGFydCBvZiBhIG5vbi1lbXB0eSBub2RlLCB0aGUgbWFya3Mgb2YgdGhlXG4gICAgbm9kZSBhZnRlciBpdCAoaWYgYW55KSBhcmUgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBtYXJrcygpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50LCBpbmRleCA9IHRoaXMuaW5kZXgoKTtcbiAgICAgICAgLy8gSW4gYW4gZW1wdHkgcGFyZW50LCByZXR1cm4gdGhlIGVtcHR5IGFycmF5XG4gICAgICAgIGlmIChwYXJlbnQuY29udGVudC5zaXplID09IDApXG4gICAgICAgICAgICByZXR1cm4gTWFyay5ub25lO1xuICAgICAgICAvLyBXaGVuIGluc2lkZSBhIHRleHQgbm9kZSwganVzdCByZXR1cm4gdGhlIHRleHQgbm9kZSdzIG1hcmtzXG4gICAgICAgIGlmICh0aGlzLnRleHRPZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LmNoaWxkKGluZGV4KS5tYXJrcztcbiAgICAgICAgbGV0IG1haW4gPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCAtIDEpLCBvdGhlciA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgLy8gSWYgdGhlIGBhZnRlcmAgZmxhZyBpcyB0cnVlIG9mIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlLCBtYWtlXG4gICAgICAgIC8vIHRoZSBub2RlIGFmdGVyIHRoaXMgcG9zaXRpb24gdGhlIG1haW4gcmVmZXJlbmNlLlxuICAgICAgICBpZiAoIW1haW4pIHtcbiAgICAgICAgICAgIGxldCB0bXAgPSBtYWluO1xuICAgICAgICAgICAgbWFpbiA9IG90aGVyO1xuICAgICAgICAgICAgb3RoZXIgPSB0bXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGFsbCBtYXJrcyBpbiB0aGUgbWFpbiBub2RlLCBleGNlcHQgdGhvc2UgdGhhdCBoYXZlXG4gICAgICAgIC8vIGBpbmNsdXNpdmVgIHNldCB0byBmYWxzZSBhbmQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvdGhlciBub2RlLlxuICAgICAgICBsZXQgbWFya3MgPSBtYWluLm1hcmtzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKG1hcmtzW2ldLnR5cGUuc3BlYy5pbmNsdXNpdmUgPT09IGZhbHNlICYmICghb3RoZXIgfHwgIW1hcmtzW2ldLmlzSW5TZXQob3RoZXIubWFya3MpKSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzW2ktLV0ucmVtb3ZlRnJvbVNldChtYXJrcyk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBtYXJrcyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgaWYgYW55LCBleGNlcHQgdGhvc2VcbiAgICB0aGF0IGFyZSBub24taW5jbHVzaXZlIGFuZCBub3QgcHJlc2VudCBhdCBwb3NpdGlvbiBgJGVuZGAuIFRoaXNcbiAgICBpcyBtb3N0bHkgdXNlZnVsIGZvciBnZXR0aW5nIHRoZSBzZXQgb2YgbWFya3MgdG8gcHJlc2VydmUgYWZ0ZXIgYVxuICAgIGRlbGV0aW9uLiBXaWxsIHJldHVybiBgbnVsbGAgaWYgdGhpcyBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mXG4gICAgaXRzIHBhcmVudCBub2RlIG9yIGl0cyBwYXJlbnQgbm9kZSBpc24ndCBhIHRleHRibG9jayAoaW4gd2hpY2hcbiAgICBjYXNlIG5vIG1hcmtzIHNob3VsZCBiZSBwcmVzZXJ2ZWQpLlxuICAgICovXG4gICAgbWFya3NBY3Jvc3MoJGVuZCkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSB0aGlzLnBhcmVudC5tYXliZUNoaWxkKHRoaXMuaW5kZXgoKSk7XG4gICAgICAgIGlmICghYWZ0ZXIgfHwgIWFmdGVyLmlzSW5saW5lKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBtYXJrcyA9IGFmdGVyLm1hcmtzLCBuZXh0ID0gJGVuZC5wYXJlbnQubWF5YmVDaGlsZCgkZW5kLmluZGV4KCkpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKG1hcmtzW2ldLnR5cGUuc3BlYy5pbmNsdXNpdmUgPT09IGZhbHNlICYmICghbmV4dCB8fCAhbWFya3NbaV0uaXNJblNldChuZXh0Lm1hcmtzKSkpXG4gICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrc1tpLS1dLnJlbW92ZUZyb21TZXQobWFya3MpO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBkZXB0aCB1cCB0byB3aGljaCB0aGlzIHBvc2l0aW9uIGFuZCB0aGUgZ2l2ZW4gKG5vbi1yZXNvbHZlZClcbiAgICBwb3NpdGlvbiBzaGFyZSB0aGUgc2FtZSBwYXJlbnQgbm9kZXMuXG4gICAgKi9cbiAgICBzaGFyZWREZXB0aChwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLmRlcHRoOyBkZXB0aCA+IDA7IGRlcHRoLS0pXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydChkZXB0aCkgPD0gcG9zICYmIHRoaXMuZW5kKGRlcHRoKSA+PSBwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlcHRoO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHJhbmdlIGJhc2VkIG9uIHRoZSBwbGFjZSB3aGVyZSB0aGlzIHBvc2l0aW9uIGFuZCB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbiBkaXZlcmdlIGFyb3VuZCBibG9jayBjb250ZW50LiBJZiBib3RoIHBvaW50IGludG9cbiAgICB0aGUgc2FtZSB0ZXh0YmxvY2ssIGZvciBleGFtcGxlLCBhIHJhbmdlIGFyb3VuZCB0aGF0IHRleHRibG9ja1xuICAgIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZXkgcG9pbnQgaW50byBkaWZmZXJlbnQgYmxvY2tzLCB0aGUgcmFuZ2VcbiAgICBhcm91bmQgdGhvc2UgYmxvY2tzIGluIHRoZWlyIHNoYXJlZCBhbmNlc3RvciBpcyByZXR1cm5lZC4gWW91IGNhblxuICAgIHBhc3MgaW4gYW4gb3B0aW9uYWwgcHJlZGljYXRlIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHBhcmVudFxuICAgIG5vZGUgdG8gc2VlIGlmIGEgcmFuZ2UgaW50byB0aGF0IHBhcmVudCBpcyBhY2NlcHRhYmxlLlxuICAgICovXG4gICAgYmxvY2tSYW5nZShvdGhlciA9IHRoaXMsIHByZWQpIHtcbiAgICAgICAgaWYgKG90aGVyLnBvcyA8IHRoaXMucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG90aGVyLmJsb2NrUmFuZ2UodGhpcyk7XG4gICAgICAgIGZvciAobGV0IGQgPSB0aGlzLmRlcHRoIC0gKHRoaXMucGFyZW50LmlubGluZUNvbnRlbnQgfHwgdGhpcy5wb3MgPT0gb3RoZXIucG9zID8gMSA6IDApOyBkID49IDA7IGQtLSlcbiAgICAgICAgICAgIGlmIChvdGhlci5wb3MgPD0gdGhpcy5lbmQoZCkgJiYgKCFwcmVkIHx8IHByZWQodGhpcy5ub2RlKGQpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlUmFuZ2UodGhpcywgb3RoZXIsIGQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGUgZ2l2ZW4gcG9zaXRpb24gc2hhcmVzIHRoZSBzYW1lIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgc2FtZVBhcmVudChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3MgLSB0aGlzLnBhcmVudE9mZnNldCA9PSBvdGhlci5wb3MgLSBvdGhlci5wYXJlbnRPZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgZ3JlYXRlciBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBtYXgob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLnBvcyA+IHRoaXMucG9zID8gb3RoZXIgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIHNtYWxsZXIgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbWluKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlci5wb3MgPCB0aGlzLnBvcyA/IG90aGVyIDogdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMuZGVwdGg7IGkrKylcbiAgICAgICAgICAgIHN0ciArPSAoc3RyID8gXCIvXCIgOiBcIlwiKSArIHRoaXMubm9kZShpKS50eXBlLm5hbWUgKyBcIl9cIiArIHRoaXMuaW5kZXgoaSAtIDEpO1xuICAgICAgICByZXR1cm4gc3RyICsgXCI6XCIgKyB0aGlzLnBhcmVudE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZShkb2MsIHBvcykge1xuICAgICAgICBpZiAoIShwb3MgPj0gMCAmJiBwb3MgPD0gZG9jLmNvbnRlbnQuc2l6ZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlBvc2l0aW9uIFwiICsgcG9zICsgXCIgb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgICBsZXQgcGF0aCA9IFtdO1xuICAgICAgICBsZXQgc3RhcnQgPSAwLCBwYXJlbnRPZmZzZXQgPSBwb3M7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSBkb2M7Oykge1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChwYXJlbnRPZmZzZXQpO1xuICAgICAgICAgICAgbGV0IHJlbSA9IHBhcmVudE9mZnNldCAtIG9mZnNldDtcbiAgICAgICAgICAgIHBhdGgucHVzaChub2RlLCBpbmRleCwgc3RhcnQgKyBvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFyZW0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZChpbmRleCk7XG4gICAgICAgICAgICBpZiAobm9kZS5pc1RleHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBwYXJlbnRPZmZzZXQgPSByZW0gLSAxO1xuICAgICAgICAgICAgc3RhcnQgKz0gb2Zmc2V0ICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkUG9zKHBvcywgcGF0aCwgcGFyZW50T2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgcmVzb2x2ZUNhY2hlZChkb2MsIHBvcykge1xuICAgICAgICBsZXQgY2FjaGUgPSByZXNvbHZlQ2FjaGUuZ2V0KGRvYyk7XG4gICAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZS5lbHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsdCA9IGNhY2hlLmVsdHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVsdC5wb3MgPT0gcG9zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZUNhY2hlLnNldChkb2MsIGNhY2hlID0gbmV3IFJlc29sdmVDYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IGNhY2hlLmVsdHNbY2FjaGUuaV0gPSBSZXNvbHZlZFBvcy5yZXNvbHZlKGRvYywgcG9zKTtcbiAgICAgICAgY2FjaGUuaSA9IChjYWNoZS5pICsgMSkgJSByZXNvbHZlQ2FjaGVTaXplO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmNsYXNzIFJlc29sdmVDYWNoZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZWx0cyA9IFtdO1xuICAgICAgICB0aGlzLmkgPSAwO1xuICAgIH1cbn1cbmNvbnN0IHJlc29sdmVDYWNoZVNpemUgPSAxMiwgcmVzb2x2ZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuUmVwcmVzZW50cyBhIGZsYXQgcmFuZ2Ugb2YgY29udGVudCwgaS5lLiBvbmUgdGhhdCBzdGFydHMgYW5kXG5lbmRzIGluIHRoZSBzYW1lIG5vZGUuXG4qL1xuY2xhc3MgTm9kZVJhbmdlIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBub2RlIHJhbmdlLiBgJGZyb21gIGFuZCBgJHRvYCBzaG91bGQgcG9pbnQgaW50byB0aGVcbiAgICBzYW1lIG5vZGUgdW50aWwgYXQgbGVhc3QgdGhlIGdpdmVuIGBkZXB0aGAsIHNpbmNlIGEgbm9kZSByYW5nZVxuICAgIGRlbm90ZXMgYW4gYWRqYWNlbnQgc2V0IG9mIG5vZGVzIGluIGEgc2luZ2xlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQSByZXNvbHZlZCBwb3NpdGlvbiBhbG9uZyB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQuIE1heSBoYXZlIGFcbiAgICBgZGVwdGhgIGdyZWF0ZXIgdGhhbiB0aGlzIG9iamVjdCdzIGBkZXB0aGAgcHJvcGVydHksIHNpbmNlXG4gICAgdGhlc2UgYXJlIHRoZSBwb3NpdGlvbnMgdGhhdCB3ZXJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgcmFuZ2UsXG4gICAgbm90IHJlLXJlc29sdmVkIHBvc2l0aW9ucyBkaXJlY3RseSBhdCBpdHMgYm91bmRhcmllcy5cbiAgICAqL1xuICAgICRmcm9tLCBcbiAgICAvKipcbiAgICBBIHBvc2l0aW9uIGFsb25nIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQuIFNlZVxuICAgIGNhdmVhdCBmb3IgW2AkZnJvbWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlUmFuZ2UuJGZyb20pLlxuICAgICovXG4gICAgJHRvLCBcbiAgICAvKipcbiAgICBUaGUgZGVwdGggb2YgdGhlIG5vZGUgdGhhdCB0aGlzIHJhbmdlIHBvaW50cyBpbnRvLlxuICAgICovXG4gICAgZGVwdGgpIHtcbiAgICAgICAgdGhpcy4kZnJvbSA9ICRmcm9tO1xuICAgICAgICB0aGlzLiR0byA9ICR0bztcbiAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGdldCBzdGFydCgpIHsgcmV0dXJuIHRoaXMuJGZyb20uYmVmb3JlKHRoaXMuZGVwdGggKyAxKTsgfVxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgIGdldCBlbmQoKSB7IHJldHVybiB0aGlzLiR0by5hZnRlcih0aGlzLmRlcHRoICsgMSk7IH1cbiAgICAvKipcbiAgICBUaGUgcGFyZW50IG5vZGUgdGhhdCB0aGUgcmFuZ2UgcG9pbnRzIGludG8uXG4gICAgKi9cbiAgICBnZXQgcGFyZW50KCkgeyByZXR1cm4gdGhpcy4kZnJvbS5ub2RlKHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IGluZGV4IG9mIHRoZSByYW5nZSBpbiB0aGUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBnZXQgc3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuJGZyb20uaW5kZXgodGhpcy5kZXB0aCk7IH1cbiAgICAvKipcbiAgICBUaGUgZW5kIGluZGV4IG9mIHRoZSByYW5nZSBpbiB0aGUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBnZXQgZW5kSW5kZXgoKSB7IHJldHVybiB0aGlzLiR0by5pbmRleEFmdGVyKHRoaXMuZGVwdGgpOyB9XG59XG5cbmNvbnN0IGVtcHR5QXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5UaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBub2RlIGluIHRoZSB0cmVlIHRoYXQgbWFrZXMgdXAgYVxuUHJvc2VNaXJyb3IgZG9jdW1lbnQuIFNvIGEgZG9jdW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYE5vZGVgLCB3aXRoXG5jaGlsZHJlbiB0aGF0IGFyZSBhbHNvIGluc3RhbmNlcyBvZiBgTm9kZWAuXG5cbk5vZGVzIGFyZSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlcy4gSW5zdGVhZCBvZiBjaGFuZ2luZyB0aGVtLCB5b3VcbmNyZWF0ZSBuZXcgb25lcyB3aXRoIHRoZSBjb250ZW50IHlvdSB3YW50LiBPbGQgb25lcyBrZWVwIHBvaW50aW5nXG5hdCB0aGUgb2xkIGRvY3VtZW50IHNoYXBlLiBUaGlzIGlzIG1hZGUgY2hlYXBlciBieSBzaGFyaW5nXG5zdHJ1Y3R1cmUgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgZGF0YSBhcyBtdWNoIGFzIHBvc3NpYmxlLCB3aGljaCBhXG50cmVlIHNoYXBlIGxpa2UgdGhpcyAod2l0aG91dCBiYWNrIHBvaW50ZXJzKSBtYWtlcyBlYXN5LlxuXG4qKkRvIG5vdCoqIGRpcmVjdGx5IG11dGF0ZSB0aGUgcHJvcGVydGllcyBvZiBhIGBOb2RlYCBvYmplY3QuIFNlZVxuW3RoZSBndWlkZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZG9jKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiovXG5jbGFzcyBOb2RlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIG5vZGUgdGhhdCB0aGlzIGlzLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgQW4gb2JqZWN0IG1hcHBpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHZhbHVlcy4gVGhlIGtpbmQgb2ZcbiAgICBhdHRyaWJ1dGVzIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGFyZVxuICAgIFtkZXRlcm1pbmVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuYXR0cnMpIGJ5IHRoZSBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBhdHRycywgXG4gICAgLy8gQSBmcmFnbWVudCBob2xkaW5nIHRoZSBub2RlJ3MgY2hpbGRyZW4uXG4gICAgY29udGVudCwgXG4gICAgLyoqXG4gICAgVGhlIG1hcmtzICh0aGluZ3MgbGlrZSB3aGV0aGVyIGl0IGlzIGVtcGhhc2l6ZWQgb3IgcGFydCBvZiBhXG4gICAgbGluaykgYXBwbGllZCB0byB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBtYXJrcyA9IE1hcmsubm9uZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudCB8fCBGcmFnbWVudC5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGFycmF5IG9mIHRoaXMgbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgICovXG4gICAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmNvbnRlbnQ7IH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSBvZiB0aGlzIG5vZGUsIGFzIGRlZmluZWQgYnkgdGhlIGludGVnZXItYmFzZWQgW2luZGV4aW5nXG4gICAgc2NoZW1lXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyNkb2MuaW5kZXhpbmcpLiBGb3IgdGV4dCBub2RlcywgdGhpcyBpcyB0aGVcbiAgICBhbW91bnQgb2YgY2hhcmFjdGVycy4gRm9yIG90aGVyIGxlYWYgbm9kZXMsIGl0IGlzIG9uZS4gRm9yXG4gICAgbm9uLWxlYWYgbm9kZXMsIGl0IGlzIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IHBsdXMgdHdvICh0aGVcbiAgICBzdGFydCBhbmQgZW5kIHRva2VuKS5cbiAgICAqL1xuICAgIGdldCBub2RlU2l6ZSgpIHsgcmV0dXJuIHRoaXMuaXNMZWFmID8gMSA6IDIgKyB0aGlzLmNvbnRlbnQuc2l6ZTsgfVxuICAgIC8qKlxuICAgIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB0aGUgbm9kZSBoYXMuXG4gICAgKi9cbiAgICBnZXQgY2hpbGRDb3VudCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5jaGlsZENvdW50OyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4gUmFpc2VzIGFuIGVycm9yIHdoZW4gdGhlXG4gICAgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlxuICAgICovXG4gICAgY2hpbGQoaW5kZXgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5jaGlsZChpbmRleCk7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LCBpZiBpdCBleGlzdHMuXG4gICAgKi9cbiAgICBtYXliZUNoaWxkKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRlbnQubWF5YmVDaGlsZChpbmRleCk7IH1cbiAgICAvKipcbiAgICBDYWxsIGBmYCBmb3IgZXZlcnkgY2hpbGQgbm9kZSwgcGFzc2luZyB0aGUgbm9kZSwgaXRzIG9mZnNldFxuICAgIGludG8gdGhpcyBwYXJlbnQgbm9kZSwgYW5kIGl0cyBpbmRleC5cbiAgICAqL1xuICAgIGZvckVhY2goZikgeyB0aGlzLmNvbnRlbnQuZm9yRWFjaChmKTsgfVxuICAgIC8qKlxuICAgIEludm9rZSBhIGNhbGxiYWNrIGZvciBhbGwgZGVzY2VuZGFudCBub2RlcyByZWN1cnNpdmVseSBiZXR3ZWVuXG4gICAgdGhlIGdpdmVuIHR3byBwb3NpdGlvbnMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gc3RhcnQgb2YgdGhpc1xuICAgIG5vZGUncyBjb250ZW50LiBUaGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoIHRoZSBub2RlLCBpdHNcbiAgICBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgbm9kZSAobWV0aG9kIHJlY2VpdmVyKSxcbiAgICBpdHMgcGFyZW50IG5vZGUsIGFuZCBpdHMgY2hpbGQgaW5kZXguIFdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnNcbiAgICBmYWxzZSBmb3IgYSBnaXZlbiBub2RlLCB0aGF0IG5vZGUncyBjaGlsZHJlbiB3aWxsIG5vdCBiZVxuICAgIHJlY3Vyc2VkIG92ZXIuIFRoZSBsYXN0IHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFcbiAgICBzdGFydGluZyBwb3NpdGlvbiB0byBjb3VudCBmcm9tLlxuICAgICovXG4gICAgbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBzdGFydFBvcyA9IDApIHtcbiAgICAgICAgdGhpcy5jb250ZW50Lm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgc3RhcnRQb3MsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDYWxsIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgZXZlcnkgZGVzY2VuZGFudCBub2RlLiBEb2Vzbid0XG4gICAgZGVzY2VuZCBpbnRvIGEgbm9kZSB3aGVuIHRoZSBjYWxsYmFjayByZXR1cm5zIGBmYWxzZWAuXG4gICAgKi9cbiAgICBkZXNjZW5kYW50cyhmKSB7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKDAsIHRoaXMuY29udGVudC5zaXplLCBmKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uY2F0ZW5hdGVzIGFsbCB0aGUgdGV4dCBub2RlcyBmb3VuZCBpbiB0aGlzIGZyYWdtZW50IGFuZCBpdHNcbiAgICBjaGlsZHJlbi5cbiAgICAqL1xuICAgIGdldCB0ZXh0Q29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlzTGVhZiAmJiB0aGlzLnR5cGUuc3BlYy5sZWFmVGV4dClcbiAgICAgICAgICAgID8gdGhpcy50eXBlLnNwZWMubGVhZlRleHQodGhpcylcbiAgICAgICAgICAgIDogdGhpcy50ZXh0QmV0d2VlbigwLCB0aGlzLmNvbnRlbnQuc2l6ZSwgXCJcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBhbGwgdGV4dCBiZXR3ZWVuIHBvc2l0aW9ucyBgZnJvbWAgYW5kIGB0b2AuIFdoZW5cbiAgICBgYmxvY2tTZXBhcmF0b3JgIGlzIGdpdmVuLCBpdCB3aWxsIGJlIGluc2VydGVkIHRvIHNlcGFyYXRlIHRleHRcbiAgICBmcm9tIGRpZmZlcmVudCBibG9jayBub2Rlcy4gSWYgYGxlYWZUZXh0YCBpcyBnaXZlbiwgaXQnbGwgYmVcbiAgICBpbnNlcnRlZCBmb3IgZXZlcnkgbm9uLXRleHQgbGVhZiBub2RlIGVuY291bnRlcmVkLCBvdGhlcndpc2VcbiAgICBbYGxlYWZUZXh0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjXmxlYWZUZXh0KSB3aWxsIGJlIHVzZWQuXG4gICAgKi9cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhpcyBub2RlJ3MgZmlyc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICBjaGlsZHJlbi5cbiAgICAqL1xuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7IH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoaXMgbm9kZSdzIGxhc3QgY2hpbGQsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgbm9cbiAgICBjaGlsZHJlbi5cbiAgICAqL1xuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGFzdENoaWxkOyB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHR3byBub2RlcyByZXByZXNlbnQgdGhlIHNhbWUgcGllY2Ugb2YgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCAodGhpcy5zYW1lTWFya3VwKG90aGVyKSAmJiB0aGlzLmNvbnRlbnQuZXEob3RoZXIuY29udGVudCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoZSBtYXJrdXAgKHR5cGUsIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcykgb2YgdGhpcyBub2RlIHRvXG4gICAgdGhvc2Ugb2YgYW5vdGhlci4gUmV0dXJucyBgdHJ1ZWAgaWYgYm90aCBoYXZlIHRoZSBzYW1lIG1hcmt1cC5cbiAgICAqL1xuICAgIHNhbWVNYXJrdXAob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTWFya3VwKG90aGVyLnR5cGUsIG90aGVyLmF0dHJzLCBvdGhlci5tYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhpcyBub2RlJ3MgbWFya3VwIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIHR5cGUsXG4gICAgYXR0cmlidXRlcywgYW5kIG1hcmtzLlxuICAgICovXG4gICAgaGFzTWFya3VwKHR5cGUsIGF0dHJzLCBtYXJrcykge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IHR5cGUgJiZcbiAgICAgICAgICAgIGNvbXBhcmVEZWVwKHRoaXMuYXR0cnMsIGF0dHJzIHx8IHR5cGUuZGVmYXVsdEF0dHJzIHx8IGVtcHR5QXR0cnMpICYmXG4gICAgICAgICAgICBNYXJrLnNhbWVTZXQodGhpcy5tYXJrcywgbWFya3MgfHwgTWFyay5ub25lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG5vZGUgd2l0aCB0aGUgc2FtZSBtYXJrdXAgYXMgdGhpcyBub2RlLCBjb250YWluaW5nXG4gICAgdGhlIGdpdmVuIGNvbnRlbnQgKG9yIGVtcHR5LCBpZiBubyBjb250ZW50IGlzIGdpdmVuKS5cbiAgICAqL1xuICAgIGNvcHkoY29udGVudCA9IG51bGwpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gdGhpcy5jb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIGNvbnRlbnQsIHRoaXMubWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSwgd2l0aCB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtzIGluc3RlYWRcbiAgICBvZiB0aGUgbm9kZSdzIG93biBtYXJrcy5cbiAgICAqL1xuICAgIG1hcmsobWFya3MpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtzID09IHRoaXMubWFya3MgPyB0aGlzIDogbmV3IE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLmNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUgd2l0aCBvbmx5IHRoZSBjb250ZW50IGJldHdlZW4gdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb25zLiBJZiBgdG9gIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlIGVuZCBvZlxuICAgIHRoZSBub2RlLlxuICAgICovXG4gICAgY3V0KGZyb20sIHRvID0gdGhpcy5jb250ZW50LnNpemUpIHtcbiAgICAgICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5jb3B5KHRoaXMuY29udGVudC5jdXQoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3V0IG91dCB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLCBhbmRcbiAgICByZXR1cm4gaXQgYXMgYSBgU2xpY2VgIG9iamVjdC5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20sIHRvID0gdGhpcy5jb250ZW50LnNpemUsIGluY2x1ZGVQYXJlbnRzID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGZyb20gPT0gdG8pXG4gICAgICAgICAgICByZXR1cm4gU2xpY2UuZW1wdHk7XG4gICAgICAgIGxldCAkZnJvbSA9IHRoaXMucmVzb2x2ZShmcm9tKSwgJHRvID0gdGhpcy5yZXNvbHZlKHRvKTtcbiAgICAgICAgbGV0IGRlcHRoID0gaW5jbHVkZVBhcmVudHMgPyAwIDogJGZyb20uc2hhcmVkRGVwdGgodG8pO1xuICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5zdGFydChkZXB0aCksIG5vZGUgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBub2RlLmNvbnRlbnQuY3V0KCRmcm9tLnBvcyAtIHN0YXJ0LCAkdG8ucG9zIC0gc3RhcnQpO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGNvbnRlbnQsICRmcm9tLmRlcHRoIC0gZGVwdGgsICR0by5kZXB0aCAtIGRlcHRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zIHdpdGhcbiAgICB0aGUgZ2l2ZW4gc2xpY2UuIFRoZSBzbGljZSBtdXN0ICdmaXQnLCBtZWFuaW5nIGl0cyBvcGVuIHNpZGVzXG4gICAgbXVzdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQsIGFuZCBpdHNcbiAgICBjb250ZW50IG5vZGVzIG11c3QgYmUgdmFsaWQgY2hpbGRyZW4gZm9yIHRoZSBub2RlIHRoZXkgYXJlIHBsYWNlZFxuICAgIGludG8uIElmIGFueSBvZiB0aGlzIGlzIHZpb2xhdGVkLCBhbiBlcnJvciBvZiB0eXBlXG4gICAgW2BSZXBsYWNlRXJyb3JgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUmVwbGFjZUVycm9yKSBpcyB0aHJvd24uXG4gICAgKi9cbiAgICByZXBsYWNlKGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICByZXR1cm4gcmVwbGFjZSh0aGlzLnJlc29sdmUoZnJvbSksIHRoaXMucmVzb2x2ZSh0byksIHNsaWNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgbm9kZSBkaXJlY3RseSBhZnRlciB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBub2RlQXQocG9zKSB7XG4gICAgICAgIGZvciAobGV0IG5vZGUgPSB0aGlzOzspIHtcbiAgICAgICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IG5vZGUuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBwb3MgfHwgbm9kZS5pc1RleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICBwb3MgLT0gb2Zmc2V0ICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSAoZGlyZWN0KSBjaGlsZCBub2RlIGFmdGVyIHRoZSBnaXZlbiBvZmZzZXQsIGlmIGFueSxcbiAgICBhbmQgcmV0dXJuIGl0IGFsb25nIHdpdGggaXRzIGluZGV4IGFuZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhpc1xuICAgIG5vZGUuXG4gICAgKi9cbiAgICBjaGlsZEFmdGVyKHBvcykge1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSB0aGlzLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudC5tYXliZUNoaWxkKGluZGV4KSwgaW5kZXgsIG9mZnNldCB9O1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSAoZGlyZWN0KSBjaGlsZCBub2RlIGJlZm9yZSB0aGUgZ2l2ZW4gb2Zmc2V0LCBpZiBhbnksXG4gICAgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIGl0cyBpbmRleCBhbmQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoaXNcbiAgICBub2RlLlxuICAgICovXG4gICAgY2hpbGRCZWZvcmUocG9zKSB7XG4gICAgICAgIGlmIChwb3MgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IG51bGwsIGluZGV4OiAwLCBvZmZzZXQ6IDAgfTtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gdGhpcy5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICBpZiAob2Zmc2V0IDwgcG9zKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50LmNoaWxkKGluZGV4KSwgaW5kZXgsIG9mZnNldCB9O1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuY29udGVudC5jaGlsZChpbmRleCAtIDEpO1xuICAgICAgICByZXR1cm4geyBub2RlLCBpbmRleDogaW5kZXggLSAxLCBvZmZzZXQ6IG9mZnNldCAtIG5vZGUubm9kZVNpemUgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVzb2x2ZSB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LCByZXR1cm5pbmcgYW5cbiAgICBbb2JqZWN0XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUmVzb2x2ZWRQb3MpIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgaXRzIGNvbnRleHQuXG4gICAgKi9cbiAgICByZXNvbHZlKHBvcykgeyByZXR1cm4gUmVzb2x2ZWRQb3MucmVzb2x2ZUNhY2hlZCh0aGlzLCBwb3MpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNvbHZlTm9DYWNoZShwb3MpIHsgcmV0dXJuIFJlc29sdmVkUG9zLnJlc29sdmUodGhpcywgcG9zKTsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciBhIGdpdmVuIG1hcmsgb3IgbWFyayB0eXBlIG9jY3VycyBpbiB0aGlzIGRvY3VtZW50XG4gICAgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIHJhbmdlSGFzTWFyayhmcm9tLCB0bywgdHlwZSkge1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRvID4gZnJvbSlcbiAgICAgICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBub2RlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFmb3VuZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgYmxvY2sgKG5vbi1pbmxpbmUgbm9kZSlcbiAgICAqL1xuICAgIGdldCBpc0Jsb2NrKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzQmxvY2s7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHRibG9jayBub2RlLCBhIGJsb2NrIG5vZGUgd2l0aCBpbmxpbmVcbiAgICBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzVGV4dGJsb2NrKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzVGV4dGJsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBhbGxvd3MgaW5saW5lIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaW5saW5lQ29udGVudCgpIHsgcmV0dXJuIHRoaXMudHlwZS5pbmxpbmVDb250ZW50OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYW4gaW5saW5lIG5vZGUgKGEgdGV4dCBub2RlIG9yIGEgbm9kZSB0aGF0IGNhblxuICAgIGFwcGVhciBhbW9uZyB0ZXh0KS5cbiAgICAqL1xuICAgIGdldCBpc0lubGluZSgpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0lubGluZTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dCBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzVGV4dCgpIHsgcmV0dXJuIHRoaXMudHlwZS5pc1RleHQ7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIGxlYWYgbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc0xlYWYoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNMZWFmOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYW4gYXRvbSwgaS5lLiB3aGVuIGl0IGRvZXMgbm90IGhhdmUgZGlyZWN0bHlcbiAgICBlZGl0YWJsZSBjb250ZW50LiBUaGlzIGlzIHVzdWFsbHkgdGhlIHNhbWUgYXMgYGlzTGVhZmAsIGJ1dCBjYW5cbiAgICBiZSBjb25maWd1cmVkIHdpdGggdGhlIFtgYXRvbWAgcHJvcGVydHldKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5hdG9tKVxuICAgIG9uIGEgbm9kZSdzIHNwZWMgKHR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaXMgZGlzcGxheWVkIGFzXG4gICAgYW4gdW5lZGl0YWJsZSBbbm9kZSB2aWV3XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5Ob2RlVmlldykpLlxuICAgICovXG4gICAgZ2V0IGlzQXRvbSgpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0F0b207IH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlIGZvciBkZWJ1Z2dpbmdcbiAgICBwdXJwb3Nlcy5cbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKHRoaXMpO1xuICAgICAgICBsZXQgbmFtZSA9IHRoaXMudHlwZS5uYW1lO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBuYW1lICs9IFwiKFwiICsgdGhpcy5jb250ZW50LnRvU3RyaW5nSW5uZXIoKSArIFwiKVwiO1xuICAgICAgICByZXR1cm4gd3JhcE1hcmtzKHRoaXMubWFya3MsIG5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRlbnQgbWF0Y2ggaW4gdGhpcyBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICAqL1xuICAgIGNvbnRlbnRNYXRjaEF0KGluZGV4KSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHRoaXMudHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudCh0aGlzLmNvbnRlbnQsIDAsIGluZGV4KTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxlZCBjb250ZW50TWF0Y2hBdCBvbiBhIG5vZGUgd2l0aCBpbnZhbGlkIGNvbnRlbnRcIik7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHJlcGxhY2luZyB0aGUgcmFuZ2UgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgKGJ5XG4gICAgY2hpbGQgaW5kZXgpIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50IGZyYWdtZW50ICh3aGljaCBkZWZhdWx0c1xuICAgIHRvIHRoZSBlbXB0eSBmcmFnbWVudCkgd291bGQgbGVhdmUgdGhlIG5vZGUncyBjb250ZW50IHZhbGlkLiBZb3VcbiAgICBjYW4gb3B0aW9uYWxseSBwYXNzIGBzdGFydGAgYW5kIGBlbmRgIGluZGljZXMgaW50byB0aGVcbiAgICByZXBsYWNlbWVudCBmcmFnbWVudC5cbiAgICAqL1xuICAgIGNhblJlcGxhY2UoZnJvbSwgdG8sIHJlcGxhY2VtZW50ID0gRnJhZ21lbnQuZW1wdHksIHN0YXJ0ID0gMCwgZW5kID0gcmVwbGFjZW1lbnQuY2hpbGRDb3VudCkge1xuICAgICAgICBsZXQgb25lID0gdGhpcy5jb250ZW50TWF0Y2hBdChmcm9tKS5tYXRjaEZyYWdtZW50KHJlcGxhY2VtZW50LCBzdGFydCwgZW5kKTtcbiAgICAgICAgbGV0IHR3byA9IG9uZSAmJiBvbmUubWF0Y2hGcmFnbWVudCh0aGlzLmNvbnRlbnQsIHRvKTtcbiAgICAgICAgaWYgKCF0d28gfHwgIXR3by52YWxpZEVuZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMudHlwZS5hbGxvd3NNYXJrcyhyZXBsYWNlbWVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHJlcGxhY2luZyB0aGUgcmFuZ2UgYGZyb21gIHRvIGB0b2AgKGJ5IGluZGV4KSB3aXRoXG4gICAgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIHdvdWxkIGxlYXZlIHRoZSBub2RlJ3MgY29udGVudCB2YWxpZC5cbiAgICAqL1xuICAgIGNhblJlcGxhY2VXaXRoKGZyb20sIHRvLCB0eXBlLCBtYXJrcykge1xuICAgICAgICBpZiAobWFya3MgJiYgIXRoaXMudHlwZS5hbGxvd3NNYXJrcyhtYXJrcykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMuY29udGVudE1hdGNoQXQoZnJvbSkubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBsZXQgZW5kID0gc3RhcnQgJiYgc3RhcnQubWF0Y2hGcmFnbWVudCh0aGlzLmNvbnRlbnQsIHRvKTtcbiAgICAgICAgcmV0dXJuIGVuZCA/IGVuZC52YWxpZEVuZCA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIG5vZGUncyBjb250ZW50IGNvdWxkIGJlIGFwcGVuZGVkIHRvIHRoaXNcbiAgICBub2RlLiBJZiB0aGF0IG5vZGUgaXMgZW1wdHksIHRoaXMgd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmIHRoZXJlXG4gICAgaXMgYXQgbGVhc3Qgb25lIG5vZGUgdHlwZSB0aGF0IGNhbiBhcHBlYXIgaW4gYm90aCBub2RlcyAodG8gYXZvaWRcbiAgICBtZXJnaW5nIGNvbXBsZXRlbHkgaW5jb21wYXRpYmxlIG5vZGVzKS5cbiAgICAqL1xuICAgIGNhbkFwcGVuZChvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuUmVwbGFjZSh0aGlzLmNoaWxkQ291bnQsIHRoaXMuY2hpbGRDb3VudCwgb3RoZXIuY29udGVudCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQob3RoZXIudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhpcyBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMgY29uZm9ybSB0byB0aGVcbiAgICBzY2hlbWEsIGFuZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGV5IGRvIG5vdC5cbiAgICAqL1xuICAgIGNoZWNrKCkge1xuICAgICAgICB0aGlzLnR5cGUuY2hlY2tDb250ZW50KHRoaXMuY29udGVudCk7XG4gICAgICAgIHRoaXMudHlwZS5jaGVja0F0dHJzKHRoaXMuYXR0cnMpO1xuICAgICAgICBsZXQgY29weSA9IE1hcmsubm9uZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFyayA9IHRoaXMubWFya3NbaV07XG4gICAgICAgICAgICBtYXJrLnR5cGUuY2hlY2tBdHRycyhtYXJrLmF0dHJzKTtcbiAgICAgICAgICAgIGNvcHkgPSBtYXJrLmFkZFRvU2V0KGNvcHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghTWFyay5zYW1lU2V0KGNvcHksIHRoaXMubWFya3MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY29sbGVjdGlvbiBvZiBtYXJrcyBmb3Igbm9kZSAke3RoaXMudHlwZS5uYW1lfTogJHt0aGlzLm1hcmtzLm1hcChtID0+IG0udHlwZS5uYW1lKX1gKTtcbiAgICAgICAgdGhpcy5jb250ZW50LmZvckVhY2gobm9kZSA9PiBub2RlLmNoZWNrKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgb2JqID0geyB0eXBlOiB0aGlzLnR5cGUubmFtZSB9O1xuICAgICAgICBmb3IgKGxldCBfIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgICAgIG9iai5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBvYmouY29udGVudCA9IHRoaXMuY29udGVudC50b0pTT04oKTtcbiAgICAgICAgaWYgKHRoaXMubWFya3MubGVuZ3RoKVxuICAgICAgICAgICAgb2JqLm1hcmtzID0gdGhpcy5tYXJrcy5tYXAobiA9PiBuLnRvSlNPTigpKTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTm9kZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IG1hcmtzID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoanNvbi5tYXJrcykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb24ubWFya3MpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBtYXJrIGRhdGEgZm9yIE5vZGUuZnJvbUpTT05cIik7XG4gICAgICAgICAgICBtYXJrcyA9IGpzb24ubWFya3MubWFwKHNjaGVtYS5tYXJrRnJvbUpTT04pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YganNvbi50ZXh0ICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIHRleHQgbm9kZSBpbiBKU09OXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS50ZXh0KGpzb24udGV4dCwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpO1xuICAgICAgICBsZXQgbm9kZSA9IHNjaGVtYS5ub2RlVHlwZShqc29uLnR5cGUpLmNyZWF0ZShqc29uLmF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgICAgIG5vZGUudHlwZS5jaGVja0F0dHJzKG5vZGUuYXR0cnMpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG59XG5Ob2RlLnByb3RvdHlwZS50ZXh0ID0gdW5kZWZpbmVkO1xuY2xhc3MgVGV4dE5vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGF0dHJzLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBzdXBlcih0eXBlLCBhdHRycywgbnVsbCwgbWFya3MpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdCBhbGxvd2VkXCIpO1xuICAgICAgICB0aGlzLnRleHQgPSBjb250ZW50O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRleHQpKTtcbiAgICB9XG4gICAgZ2V0IHRleHRDb250ZW50KCkgeyByZXR1cm4gdGhpcy50ZXh0OyB9XG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8pIHsgcmV0dXJuIHRoaXMudGV4dC5zbGljZShmcm9tLCB0byk7IH1cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgbWFyayhtYXJrcykge1xuICAgICAgICByZXR1cm4gbWFya3MgPT0gdGhpcy5tYXJrcyA/IHRoaXMgOiBuZXcgVGV4dE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0aGlzLnRleHQsIG1hcmtzKTtcbiAgICB9XG4gICAgd2l0aFRleHQodGV4dCkge1xuICAgICAgICBpZiAodGV4dCA9PSB0aGlzLnRleHQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRleHQsIHRoaXMubWFya3MpO1xuICAgIH1cbiAgICBjdXQoZnJvbSA9IDAsIHRvID0gdGhpcy50ZXh0Lmxlbmd0aCkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMudGV4dC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMud2l0aFRleHQodGhpcy50ZXh0LnNsaWNlKGZyb20sIHRvKSk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbWVNYXJrdXAob3RoZXIpICYmIHRoaXMudGV4dCA9PSBvdGhlci50ZXh0O1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBiYXNlID0gc3VwZXIudG9KU09OKCk7XG4gICAgICAgIGJhc2UudGV4dCA9IHRoaXMudGV4dDtcbiAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE1hcmtzKG1hcmtzLCBzdHIpIHtcbiAgICBmb3IgKGxldCBpID0gbWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHN0ciA9IG1hcmtzW2ldLnR5cGUubmFtZSArIFwiKFwiICsgc3RyICsgXCIpXCI7XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG5JbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBtYXRjaCBzdGF0ZSBvZiBhIG5vZGUgdHlwZSdzXG5bY29udGVudCBleHByZXNzaW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29udGVudCksIGFuZCBjYW4gYmUgdXNlZCB0b1xuZmluZCBvdXQgd2hldGhlciBmdXJ0aGVyIGNvbnRlbnQgbWF0Y2hlcyBoZXJlLCBhbmQgd2hldGhlciBhIGdpdmVuXG5wb3NpdGlvbiBpcyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiovXG5jbGFzcyBDb250ZW50TWF0Y2gge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbWF0Y2ggc3RhdGUgcmVwcmVzZW50cyBhIHZhbGlkIGVuZCBvZiB0aGUgbm9kZS5cbiAgICAqL1xuICAgIHZhbGlkRW5kKSB7XG4gICAgICAgIHRoaXMudmFsaWRFbmQgPSB2YWxpZEVuZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm5leHQgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLndyYXBDYWNoZSA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShzdHJpbmcsIG5vZGVUeXBlcykge1xuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFRva2VuU3RyZWFtKHN0cmluZywgbm9kZVR5cGVzKTtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gQ29udGVudE1hdGNoLmVtcHR5O1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiVW5leHBlY3RlZCB0cmFpbGluZyB0ZXh0XCIpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBkZmEobmZhKGV4cHIpKTtcbiAgICAgICAgY2hlY2tGb3JEZWFkRW5kcyhtYXRjaCwgc3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXRjaCBhIG5vZGUgdHlwZSwgcmV0dXJuaW5nIGEgbWF0Y2ggYWZ0ZXIgdGhhdCBub2RlIGlmXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoVHlwZSh0eXBlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMubmV4dFtpXS50eXBlID09IHR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dFtpXS5uZXh0O1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1hdGNoIGEgZnJhZ21lbnQuIFJldHVybnMgdGhlIHJlc3VsdGluZyBtYXRjaCB3aGVuXG4gICAgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIG1hdGNoRnJhZ21lbnQoZnJhZywgc3RhcnQgPSAwLCBlbmQgPSBmcmFnLmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IGN1ciA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgY3VyICYmIGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIGN1ciA9IGN1ci5tYXRjaFR5cGUoZnJhZy5jaGlsZChpKS50eXBlKTtcbiAgICAgICAgcmV0dXJuIGN1cjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGggIT0gMCAmJiB0aGlzLm5leHRbMF0udHlwZS5pc0lubGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBmaXJzdCBtYXRjaGluZyBub2RlIHR5cGUgYXQgdGhpcyBtYXRjaCBwb3NpdGlvbiB0aGF0IGNhblxuICAgIGJlIGdlbmVyYXRlZC5cbiAgICAqL1xuICAgIGdldCBkZWZhdWx0VHlwZSgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUgfSA9IHRoaXMubmV4dFtpXTtcbiAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wYXRpYmxlKG90aGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvdGhlci5uZXh0Lmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5leHRbaV0udHlwZSA9PSBvdGhlci5uZXh0W2pdLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtYXRjaCB0aGUgZ2l2ZW4gZnJhZ21lbnQsIGFuZCBpZiB0aGF0IGZhaWxzLCBzZWUgaWYgaXQgY2FuXG4gICAgYmUgbWFkZSB0byBtYXRjaCBieSBpbnNlcnRpbmcgbm9kZXMgaW4gZnJvbnQgb2YgaXQuIFdoZW5cbiAgICBzdWNjZXNzZnVsLCByZXR1cm4gYSBmcmFnbWVudCBvZiBpbnNlcnRlZCBub2RlcyAod2hpY2ggbWF5IGJlXG4gICAgZW1wdHkgaWYgbm90aGluZyBoYWQgdG8gYmUgaW5zZXJ0ZWQpLiBXaGVuIGB0b0VuZGAgaXMgdHJ1ZSwgb25seVxuICAgIHJldHVybiBhIGZyYWdtZW50IGlmIHRoZSByZXN1bHRpbmcgbWF0Y2ggZ29lcyB0byB0aGUgZW5kIG9mIHRoZVxuICAgIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGZpbGxCZWZvcmUoYWZ0ZXIsIHRvRW5kID0gZmFsc2UsIHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIGxldCBzZWVuID0gW3RoaXNdO1xuICAgICAgICBmdW5jdGlvbiBzZWFyY2gobWF0Y2gsIHR5cGVzKSB7XG4gICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBtYXRjaC5tYXRjaEZyYWdtZW50KGFmdGVyLCBzdGFydEluZGV4KTtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCAmJiAoIXRvRW5kIHx8IGZpbmlzaGVkLnZhbGlkRW5kKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbSh0eXBlcy5tYXAodHAgPT4gdHAuY3JlYXRlQW5kRmlsbCgpKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSAmJiBzZWVuLmluZGV4T2YobmV4dCkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBzZWFyY2gobmV4dCwgdHlwZXMuY29uY2F0KHR5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWFyY2godGhpcywgW10pO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgc2V0IG9mIHdyYXBwaW5nIG5vZGUgdHlwZXMgdGhhdCB3b3VsZCBhbGxvdyBhIG5vZGUgb2YgdGhlXG4gICAgZ2l2ZW4gdHlwZSB0byBhcHBlYXIgYXQgdGhpcyBwb3NpdGlvbi4gVGhlIHJlc3VsdCBtYXkgYmUgZW1wdHlcbiAgICAod2hlbiBpdCBmaXRzIGRpcmVjdGx5KSBhbmQgd2lsbCBiZSBudWxsIHdoZW4gbm8gc3VjaCB3cmFwcGluZ1xuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIGZpbmRXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndyYXBDYWNoZS5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXBDYWNoZVtpXSA9PSB0YXJnZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcENhY2hlW2kgKyAxXTtcbiAgICAgICAgbGV0IGNvbXB1dGVkID0gdGhpcy5jb21wdXRlV3JhcHBpbmcodGFyZ2V0KTtcbiAgICAgICAgdGhpcy53cmFwQ2FjaGUucHVzaCh0YXJnZXQsIGNvbXB1dGVkKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXB1dGVXcmFwcGluZyh0YXJnZXQpIHtcbiAgICAgICAgbGV0IHNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpLCBhY3RpdmUgPSBbeyBtYXRjaDogdGhpcywgdHlwZTogbnVsbCwgdmlhOiBudWxsIH1dO1xuICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhY3RpdmUuc2hpZnQoKSwgbWF0Y2ggPSBjdXJyZW50Lm1hdGNoO1xuICAgICAgICAgICAgaWYgKG1hdGNoLm1hdGNoVHlwZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9iaiA9IGN1cnJlbnQ7IG9iai50eXBlOyBvYmogPSBvYmoudmlhKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvYmoudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLm5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5uZXh0W2ldO1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc0xlYWYgJiYgIXR5cGUuaGFzUmVxdWlyZWRBdHRycygpICYmICEodHlwZS5uYW1lIGluIHNlZW4pICYmICghY3VycmVudC50eXBlIHx8IG5leHQudmFsaWRFbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKHsgbWF0Y2g6IHR5cGUuY29udGVudE1hdGNoLCB0eXBlLCB2aWE6IGN1cnJlbnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5bdHlwZS5uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIG91dGdvaW5nIGVkZ2VzIHRoaXMgbm9kZSBoYXMgaW4gdGhlIGZpbml0ZVxuICAgIGF1dG9tYXRvbiB0aGF0IGRlc2NyaWJlcyB0aGUgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZ2V0IGVkZ2VDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dC5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgX25f4oCLdGggb3V0Z29pbmcgZWRnZSBmcm9tIHRoaXMgbm9kZSBpbiB0aGUgZmluaXRlXG4gICAgYXV0b21hdG9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBlZGdlKG4pIHtcbiAgICAgICAgaWYgKG4gPj0gdGhpcy5uZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSdzIG5vICR7bn10aCBlZGdlIGluIHRoaXMgY29udGVudCBtYXRjaGApO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0W25dO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc2VlbiA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBzY2FuKG0pIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChtKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzZWVuLmluZGV4T2YobS5uZXh0W2ldLm5leHQpID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBzY2FuKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBzY2FuKHRoaXMpO1xuICAgICAgICByZXR1cm4gc2Vlbi5tYXAoKG0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXQgPSBpICsgKG0udmFsaWRFbmQgPyBcIipcIiA6IFwiIFwiKSArIFwiIFwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgb3V0ICs9IChpID8gXCIsIFwiIDogXCJcIikgKyBtLm5leHRbaV0udHlwZS5uYW1lICsgXCItPlwiICsgc2Vlbi5pbmRleE9mKG0ubmV4dFtpXS5uZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIik7XG4gICAgfVxufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5Db250ZW50TWF0Y2guZW1wdHkgPSBuZXcgQ29udGVudE1hdGNoKHRydWUpO1xuY2xhc3MgVG9rZW5TdHJlYW0ge1xuICAgIGNvbnN0cnVjdG9yKHN0cmluZywgbm9kZVR5cGVzKSB7XG4gICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nO1xuICAgICAgICB0aGlzLm5vZGVUeXBlcyA9IG5vZGVUeXBlcztcbiAgICAgICAgdGhpcy5pbmxpbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudG9rZW5zID0gc3RyaW5nLnNwbGl0KC9cXHMqKD89XFxifFxcV3wkKS8pO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbdGhpcy50b2tlbnMubGVuZ3RoIC0gMV0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnBvcCgpO1xuICAgICAgICBpZiAodGhpcy50b2tlbnNbMF0gPT0gXCJcIilcbiAgICAgICAgICAgIHRoaXMudG9rZW5zLnNoaWZ0KCk7XG4gICAgfVxuICAgIGdldCBuZXh0KCkgeyByZXR1cm4gdGhpcy50b2tlbnNbdGhpcy5wb3NdOyB9XG4gICAgZWF0KHRvaykgeyByZXR1cm4gdGhpcy5uZXh0ID09IHRvayAmJiAodGhpcy5wb3MrKyB8fCB0cnVlKTsgfVxuICAgIGVycihzdHIpIHsgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN0ciArIFwiIChpbiBjb250ZW50IGV4cHJlc3Npb24gJ1wiICsgdGhpcy5zdHJpbmcgKyBcIicpXCIpOyB9XG59XG5mdW5jdGlvbiBwYXJzZUV4cHIoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclNlcShzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0uZWF0KFwifFwiKSk7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwiY2hvaWNlXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTZXEoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHJzID0gW107XG4gICAgZG8ge1xuICAgICAgICBleHBycy5wdXNoKHBhcnNlRXhwclN1YnNjcmlwdChzdHJlYW0pKTtcbiAgICB9IHdoaWxlIChzdHJlYW0ubmV4dCAmJiBzdHJlYW0ubmV4dCAhPSBcIilcIiAmJiBzdHJlYW0ubmV4dCAhPSBcInxcIik7XG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwic2VxXCIsIGV4cHJzIH07XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJTdWJzY3JpcHQoc3RyZWFtKSB7XG4gICAgbGV0IGV4cHIgPSBwYXJzZUV4cHJBdG9tKHN0cmVhbSk7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAoc3RyZWFtLmVhdChcIitcIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcInBsdXNcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwiKlwiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwic3RhclwiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCI/XCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJvcHRcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwie1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSBwYXJzZUV4cHJSYW5nZShzdHJlYW0sIGV4cHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGV4cHI7XG59XG5mdW5jdGlvbiBwYXJzZU51bShzdHJlYW0pIHtcbiAgICBpZiAoL1xcRC8udGVzdChzdHJlYW0ubmV4dCkpXG4gICAgICAgIHN0cmVhbS5lcnIoXCJFeHBlY3RlZCBudW1iZXIsIGdvdCAnXCIgKyBzdHJlYW0ubmV4dCArIFwiJ1wiKTtcbiAgICBsZXQgcmVzdWx0ID0gTnVtYmVyKHN0cmVhbS5uZXh0KTtcbiAgICBzdHJlYW0ucG9zKys7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclJhbmdlKHN0cmVhbSwgZXhwcikge1xuICAgIGxldCBtaW4gPSBwYXJzZU51bShzdHJlYW0pLCBtYXggPSBtaW47XG4gICAgaWYgKHN0cmVhbS5lYXQoXCIsXCIpKSB7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dCAhPSBcIn1cIilcbiAgICAgICAgICAgIG1heCA9IHBhcnNlTnVtKHN0cmVhbSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1heCA9IC0xO1xuICAgIH1cbiAgICBpZiAoIXN0cmVhbS5lYXQoXCJ9XCIpKVxuICAgICAgICBzdHJlYW0uZXJyKFwiVW5jbG9zZWQgYnJhY2VkIHJhbmdlXCIpO1xuICAgIHJldHVybiB7IHR5cGU6IFwicmFuZ2VcIiwgbWluLCBtYXgsIGV4cHIgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVOYW1lKHN0cmVhbSwgbmFtZSkge1xuICAgIGxldCB0eXBlcyA9IHN0cmVhbS5ub2RlVHlwZXMsIHR5cGUgPSB0eXBlc1tuYW1lXTtcbiAgICBpZiAodHlwZSlcbiAgICAgICAgcmV0dXJuIFt0eXBlXTtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgdHlwZU5hbWUgaW4gdHlwZXMpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlc1t0eXBlTmFtZV07XG4gICAgICAgIGlmICh0eXBlLmlzSW5Hcm91cChuYW1lKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHR5cGUpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKVxuICAgICAgICBzdHJlYW0uZXJyKFwiTm8gbm9kZSB0eXBlIG9yIGdyb3VwICdcIiArIG5hbWUgKyBcIicgZm91bmRcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwckF0b20oc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbS5lYXQoXCIoXCIpKSB7XG4gICAgICAgIGxldCBleHByID0gcGFyc2VFeHByKHN0cmVhbSk7XG4gICAgICAgIGlmICghc3RyZWFtLmVhdChcIilcIikpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiTWlzc2luZyBjbG9zaW5nIHBhcmVuXCIpO1xuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoIS9cXFcvLnRlc3Qoc3RyZWFtLm5leHQpKSB7XG4gICAgICAgIGxldCBleHBycyA9IHJlc29sdmVOYW1lKHN0cmVhbSwgc3RyZWFtLm5leHQpLm1hcCh0eXBlID0+IHtcbiAgICAgICAgICAgIGlmIChzdHJlYW0uaW5saW5lID09IG51bGwpXG4gICAgICAgICAgICAgICAgc3RyZWFtLmlubGluZSA9IHR5cGUuaXNJbmxpbmU7XG4gICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0uaW5saW5lICE9IHR5cGUuaXNJbmxpbmUpXG4gICAgICAgICAgICAgICAgc3RyZWFtLmVycihcIk1peGluZyBpbmxpbmUgYW5kIGJsb2NrIGNvbnRlbnRcIik7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiBcIm5hbWVcIiwgdmFsdWU6IHR5cGUgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5wb3MrKztcbiAgICAgICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA9PSAxID8gZXhwcnNbMF0gOiB7IHR5cGU6IFwiY2hvaWNlXCIsIGV4cHJzIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHJlYW0uZXJyKFwiVW5leHBlY3RlZCB0b2tlbiAnXCIgKyBzdHJlYW0ubmV4dCArIFwiJ1wiKTtcbiAgICB9XG59XG4vLyBDb25zdHJ1Y3QgYW4gTkZBIGZyb20gYW4gZXhwcmVzc2lvbiBhcyByZXR1cm5lZCBieSB0aGUgcGFyc2VyLiBUaGVcbi8vIE5GQSBpcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBzdGF0ZXMsIHdoaWNoIGFyZSB0aGVtc2VsdmVzXG4vLyBhcnJheXMgb2YgZWRnZXMsIHdoaWNoIGFyZSBge3Rlcm0sIHRvfWAgb2JqZWN0cy4gVGhlIGZpcnN0IHN0YXRlIGlzXG4vLyB0aGUgZW50cnkgc3RhdGUgYW5kIHRoZSBsYXN0IG5vZGUgaXMgdGhlIHN1Y2Nlc3Mgc3RhdGUuXG4vL1xuLy8gTm90ZSB0aGF0IHVubGlrZSB0eXBpY2FsIE5GQXMsIHRoZSBlZGdlIG9yZGVyaW5nIGluIHRoaXMgb25lIGlzXG4vLyBzaWduaWZpY2FudCwgaW4gdGhhdCBpdCBpcyB1c2VkIHRvIGNvbnRydWN0IGZpbGxlciBjb250ZW50IHdoZW5cbi8vIG5lY2Vzc2FyeS5cbmZ1bmN0aW9uIG5mYShleHByKSB7XG4gICAgbGV0IG5mYSA9IFtbXV07XG4gICAgY29ubmVjdChjb21waWxlKGV4cHIsIDApLCBub2RlKCkpO1xuICAgIHJldHVybiBuZmE7XG4gICAgZnVuY3Rpb24gbm9kZSgpIHsgcmV0dXJuIG5mYS5wdXNoKFtdKSAtIDE7IH1cbiAgICBmdW5jdGlvbiBlZGdlKGZyb20sIHRvLCB0ZXJtKSB7XG4gICAgICAgIGxldCBlZGdlID0geyB0ZXJtLCB0byB9O1xuICAgICAgICBuZmFbZnJvbV0ucHVzaChlZGdlKTtcbiAgICAgICAgcmV0dXJuIGVkZ2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbm5lY3QoZWRnZXMsIHRvKSB7XG4gICAgICAgIGVkZ2VzLmZvckVhY2goZWRnZSA9PiBlZGdlLnRvID0gdG8pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21waWxlKGV4cHIsIGZyb20pIHtcbiAgICAgICAgaWYgKGV4cHIudHlwZSA9PSBcImNob2ljZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwci5leHBycy5yZWR1Y2UoKG91dCwgZXhwcikgPT4gb3V0LmNvbmNhdChjb21waWxlKGV4cHIsIGZyb20pKSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcInNlcVwiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gY29tcGlsZShleHByLmV4cHJzW2ldLCBmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBleHByLmV4cHJzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgICAgIGNvbm5lY3QobmV4dCwgZnJvbSA9IG5vZGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwic3RhclwiKSB7XG4gICAgICAgICAgICBsZXQgbG9vcCA9IG5vZGUoKTtcbiAgICAgICAgICAgIGVkZ2UoZnJvbSwgbG9vcCk7XG4gICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBsb29wKSwgbG9vcCk7XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UobG9vcCldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcInBsdXNcIikge1xuICAgICAgICAgICAgbGV0IGxvb3AgPSBub2RlKCk7XG4gICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBmcm9tKSwgbG9vcCk7XG4gICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBsb29wKSwgbG9vcCk7XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UobG9vcCldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcIm9wdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UoZnJvbSldLmNvbmNhdChjb21waWxlKGV4cHIuZXhwciwgZnJvbSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcInJhbmdlXCIpIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSBmcm9tO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLm1pbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlKCk7XG4gICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgY3VyID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLm1heCA9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGN1ciksIGN1cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZXhwci5taW47IGkgPCBleHByLm1heDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICBlZGdlKGN1ciwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGN1ciksIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbZWRnZShjdXIpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShmcm9tLCB1bmRlZmluZWQsIGV4cHIudmFsdWUpXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZXhwciB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gY21wKGEsIGIpIHsgcmV0dXJuIGIgLSBhOyB9XG4vLyBHZXQgdGhlIHNldCBvZiBub2RlcyByZWFjaGFibGUgYnkgbnVsbCBlZGdlcyBmcm9tIGBub2RlYC4gT21pdFxuLy8gbm9kZXMgd2l0aCBvbmx5IGEgc2luZ2xlIG51bGwtb3V0LWVkZ2UsIHNpbmNlIHRoZXkgbWF5IGxlYWQgdG9cbi8vIG5lZWRsZXNzIGR1cGxpY2F0ZWQgbm9kZXMuXG5mdW5jdGlvbiBudWxsRnJvbShuZmEsIG5vZGUpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgc2Nhbihub2RlKTtcbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoY21wKTtcbiAgICBmdW5jdGlvbiBzY2FuKG5vZGUpIHtcbiAgICAgICAgbGV0IGVkZ2VzID0gbmZhW25vZGVdO1xuICAgICAgICBpZiAoZWRnZXMubGVuZ3RoID09IDEgJiYgIWVkZ2VzWzBdLnRlcm0pXG4gICAgICAgICAgICByZXR1cm4gc2NhbihlZGdlc1swXS50byk7XG4gICAgICAgIHJlc3VsdC5wdXNoKG5vZGUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyB0ZXJtLCB0byB9ID0gZWRnZXNbaV07XG4gICAgICAgICAgICBpZiAoIXRlcm0gJiYgcmVzdWx0LmluZGV4T2YodG8pID09IC0xKVxuICAgICAgICAgICAgICAgIHNjYW4odG8pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gQ29tcGlsZXMgYW4gTkZBIGFzIHByb2R1Y2VkIGJ5IGBuZmFgIGludG8gYSBERkEsIG1vZGVsZWQgYXMgYSBzZXRcbi8vIG9mIHN0YXRlIG9iamVjdHMgKGBDb250ZW50TWF0Y2hgIGluc3RhbmNlcykgd2l0aCB0cmFuc2l0aW9uc1xuLy8gYmV0d2VlbiB0aGVtLlxuZnVuY3Rpb24gZGZhKG5mYSkge1xuICAgIGxldCBsYWJlbGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICByZXR1cm4gZXhwbG9yZShudWxsRnJvbShuZmEsIDApKTtcbiAgICBmdW5jdGlvbiBleHBsb3JlKHN0YXRlcykge1xuICAgICAgICBsZXQgb3V0ID0gW107XG4gICAgICAgIHN0YXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgbmZhW25vZGVdLmZvckVhY2goKHsgdGVybSwgdG8gfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGVybSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGxldCBzZXQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChvdXRbaV1bMF0gPT0gdGVybSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IG91dFtpXVsxXTtcbiAgICAgICAgICAgICAgICBudWxsRnJvbShuZmEsIHRvKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNldClcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFt0ZXJtLCBzZXQgPSBbXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0LmluZGV4T2Yobm9kZSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHN0YXRlID0gbGFiZWxlZFtzdGF0ZXMuam9pbihcIixcIildID0gbmV3IENvbnRlbnRNYXRjaChzdGF0ZXMuaW5kZXhPZihuZmEubGVuZ3RoIC0gMSkgPiAtMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGVzID0gb3V0W2ldWzFdLnNvcnQoY21wKTtcbiAgICAgICAgICAgIHN0YXRlLm5leHQucHVzaCh7IHR5cGU6IG91dFtpXVswXSwgbmV4dDogbGFiZWxlZFtzdGF0ZXMuam9pbihcIixcIildIHx8IGV4cGxvcmUoc3RhdGVzKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tGb3JEZWFkRW5kcyhtYXRjaCwgc3RyZWFtKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHdvcmsgPSBbbWF0Y2hdOyBpIDwgd29yay5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc3RhdGUgPSB3b3JrW2ldLCBkZWFkID0gIXN0YXRlLnZhbGlkRW5kLCBub2RlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN0YXRlLm5leHQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IHN0YXRlLm5leHRbal07XG4gICAgICAgICAgICBub2Rlcy5wdXNoKHR5cGUubmFtZSk7XG4gICAgICAgICAgICBpZiAoZGVhZCAmJiAhKHR5cGUuaXNUZXh0IHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKSlcbiAgICAgICAgICAgICAgICBkZWFkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAod29yay5pbmRleE9mKG5leHQpID09IC0xKVxuICAgICAgICAgICAgICAgIHdvcmsucHVzaChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVhZClcbiAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJPbmx5IG5vbi1nZW5lcmF0YWJsZSBub2RlcyAoXCIgKyBub2Rlcy5qb2luKFwiLCBcIikgKyBcIikgaW4gYSByZXF1aXJlZCBwb3NpdGlvbiAoc2VlIGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI2dlbmVyYXRhYmxlKVwiKTtcbiAgICB9XG59XG5cbi8vIEZvciBub2RlIHR5cGVzIHdoZXJlIGFsbCBhdHRycyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAob3Igd2hpY2ggZG9uJ3Rcbi8vIGhhdmUgYW55IGF0dHJpYnV0ZXMpLCBidWlsZCB1cCBhIHNpbmdsZSByZXVzYWJsZSBkZWZhdWx0IGF0dHJpYnV0ZVxuLy8gb2JqZWN0LCBhbmQgdXNlIGl0IGZvciBhbGwgbm9kZXMgdGhhdCBkb24ndCBzcGVjaWZ5IHNwZWNpZmljXG4vLyBhdHRyaWJ1dGVzLlxuZnVuY3Rpb24gZGVmYXVsdEF0dHJzKGF0dHJzKSB7XG4gICAgbGV0IGRlZmF1bHRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBhdHRyTmFtZSBpbiBhdHRycykge1xuICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW2F0dHJOYW1lXTtcbiAgICAgICAgaWYgKCFhdHRyLmhhc0RlZmF1bHQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgZGVmYXVsdHNbYXR0ck5hbWVdID0gYXR0ci5kZWZhdWx0O1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdHM7XG59XG5mdW5jdGlvbiBjb21wdXRlQXR0cnMoYXR0cnMsIHZhbHVlKSB7XG4gICAgbGV0IGJ1aWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBnaXZlbiA9IHZhbHVlICYmIHZhbHVlW25hbWVdO1xuICAgICAgICBpZiAoZ2l2ZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGF0dHIgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChhdHRyLmhhc0RlZmF1bHQpXG4gICAgICAgICAgICAgICAgZ2l2ZW4gPSBhdHRyLmRlZmF1bHQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyB2YWx1ZSBzdXBwbGllZCBmb3IgYXR0cmlidXRlIFwiICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVpbHRbbmFtZV0gPSBnaXZlbjtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0O1xufVxuZnVuY3Rpb24gY2hlY2tBdHRycyhhdHRycywgdmFsdWVzLCB0eXBlLCBuYW1lKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiB2YWx1ZXMpXG4gICAgICAgIGlmICghKG5hbWUgaW4gYXR0cnMpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVuc3VwcG9ydGVkIGF0dHJpYnV0ZSAke25hbWV9IGZvciAke3R5cGV9IG9mIHR5cGUgJHtuYW1lfWApO1xuICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGF0dHIgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgaWYgKGF0dHIudmFsaWRhdGUpXG4gICAgICAgICAgICBhdHRyLnZhbGlkYXRlKHZhbHVlc1tuYW1lXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdEF0dHJzKHR5cGVOYW1lLCBhdHRycykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChhdHRycylcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycylcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IG5ldyBBdHRyaWJ1dGUodHlwZU5hbWUsIG5hbWUsIGF0dHJzW25hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5Ob2RlIHR5cGVzIGFyZSBvYmplY3RzIGFsbG9jYXRlZCBvbmNlIHBlciBgU2NoZW1hYCBhbmQgdXNlZCB0b1xuW3RhZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUudHlwZSkgYE5vZGVgIGluc3RhbmNlcy4gVGhleSBjb250YWluIGluZm9ybWF0aW9uXG5hYm91dCB0aGUgbm9kZSB0eXBlLCBzdWNoIGFzIGl0cyBuYW1lIGFuZCB3aGF0IGtpbmQgb2Ygbm9kZSBpdFxucmVwcmVzZW50cy5cbiovXG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSB0aGUgbm9kZSB0eXBlIGhhcyBpbiB0aGlzIHNjaGVtYS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEEgbGluayBiYWNrIHRvIHRoZSBgU2NoZW1hYCB0aGUgbm9kZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIHRoYXQgdGhpcyB0eXBlIGlzIGJhc2VkIG9uXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHNldCBvZiBtYXJrcyBhbGxvd2VkIGluIHRoaXMgbm9kZS4gYG51bGxgIG1lYW5zIGFsbCBtYXJrc1xuICAgICAgICBhcmUgYWxsb3dlZC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrU2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBzcGVjLmdyb3VwID8gc3BlYy5ncm91cC5zcGxpdChcIiBcIikgOiBbXTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhuYW1lLCBzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXR0cnMgPSBkZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIHRoaXMuY29udGVudE1hdGNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5pbmxpbmVDb250ZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0Jsb2NrID0gIShzcGVjLmlubGluZSB8fCBuYW1lID09IFwidGV4dFwiKTtcbiAgICAgICAgdGhpcy5pc1RleHQgPSBuYW1lID09IFwidGV4dFwiO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHRoaXMgaXMgYW4gaW5saW5lIHR5cGUuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiAhdGhpcy5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB0aGlzIGlzIGEgdGV4dGJsb2NrIHR5cGUsIGEgYmxvY2sgdGhhdCBjb250YWlucyBpbmxpbmVcbiAgICBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzVGV4dGJsb2NrKCkgeyByZXR1cm4gdGhpcy5pc0Jsb2NrICYmIHRoaXMuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgZm9yIG5vZGUgdHlwZXMgdGhhdCBhbGxvdyBubyBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzTGVhZigpIHsgcmV0dXJuIHRoaXMuY29udGVudE1hdGNoID09IENvbnRlbnRNYXRjaC5lbXB0eTsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgaXMgYW4gYXRvbSwgaS5lLiB3aGVuIGl0IGRvZXMgbm90IGhhdmVcbiAgICBkaXJlY3RseSBlZGl0YWJsZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlzQXRvbSgpIHsgcmV0dXJuIHRoaXMuaXNMZWFmIHx8ICEhdGhpcy5zcGVjLmF0b207IH1cbiAgICAvKipcbiAgICBSZXR1cm4gdHJ1ZSB3aGVuIHRoaXMgbm9kZSB0eXBlIGlzIHBhcnQgb2YgdGhlIGdpdmVuXG4gICAgW2dyb3VwXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZ3JvdXApLlxuICAgICovXG4gICAgaXNJbkdyb3VwKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3Vwcy5pbmRleE9mKGdyb3VwKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgbm9kZSB0eXBlJ3MgW3doaXRlc3BhY2VdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy53aGl0ZXNwYWNlKSBvcHRpb24uXG4gICAgKi9cbiAgICBnZXQgd2hpdGVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy53aGl0ZXNwYWNlIHx8ICh0aGlzLnNwZWMuY29kZSA/IFwicHJlXCIgOiBcIm5vcm1hbFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhpcyBub2RlIHR5cGUgaGFzIGFueSByZXF1aXJlZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgaGFzUmVxdWlyZWRBdHRycygpIHtcbiAgICAgICAgZm9yIChsZXQgbiBpbiB0aGlzLmF0dHJzKVxuICAgICAgICAgICAgaWYgKHRoaXMuYXR0cnNbbl0uaXNSZXF1aXJlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG5vZGUgYWxsb3dzIHNvbWUgb2YgdGhlIHNhbWUgY29udGVudCBhc1xuICAgIHRoZSBnaXZlbiBub2RlIHR5cGUuXG4gICAgKi9cbiAgICBjb21wYXRpYmxlQ29udGVudChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCB0aGlzLmNvbnRlbnRNYXRjaC5jb21wYXRpYmxlKG90aGVyLmNvbnRlbnRNYXRjaCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcHV0ZUF0dHJzKGF0dHJzKSB7XG4gICAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXR0cnM7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlQXR0cnModGhpcy5hdHRycywgYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBgTm9kZWAgb2YgdGhpcyB0eXBlLiBUaGUgZ2l2ZW4gYXR0cmlidXRlcyBhcmVcbiAgICBjaGVja2VkIGFuZCBkZWZhdWx0ZWQgKHlvdSBjYW4gcGFzcyBgbnVsbGAgdG8gdXNlIHRoZSB0eXBlJ3NcbiAgICBkZWZhdWx0cyBlbnRpcmVseSwgaWYgbm8gcmVxdWlyZWQgYXR0cmlidXRlcyBleGlzdCkuIGBjb250ZW50YFxuICAgIG1heSBiZSBhIGBGcmFnbWVudGAsIGEgbm9kZSwgYW4gYXJyYXkgb2Ygbm9kZXMsIG9yXG4gICAgYG51bGxgLiBTaW1pbGFybHkgYG1hcmtzYCBtYXkgYmUgYG51bGxgIHRvIGRlZmF1bHQgdG8gdGhlIGVtcHR5XG4gICAgc2V0IG9mIG1hcmtzLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNUZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZVR5cGUuY3JlYXRlIGNhbid0IGNvbnN0cnVjdCB0ZXh0IG5vZGVzXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpLCBGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYGNyZWF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZS5jcmVhdGUpLCBidXQgY2hlY2sgdGhlIGdpdmVuIGNvbnRlbnRcbiAgICBhZ2FpbnN0IHRoZSBub2RlIHR5cGUncyBjb250ZW50IHJlc3RyaWN0aW9ucywgYW5kIHRocm93IGFuIGVycm9yXG4gICAgaWYgaXQgZG9lc24ndCBtYXRjaC5cbiAgICAqL1xuICAgIGNyZWF0ZUNoZWNrZWQoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgICAgICAgdGhpcy5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyksIGNvbnRlbnQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgY3JlYXRlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlLmNyZWF0ZSksIGJ1dCBzZWUgaWYgaXQgaXNcbiAgICBuZWNlc3NhcnkgdG8gYWRkIG5vZGVzIHRvIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGdpdmVuIGZyYWdtZW50XG4gICAgdG8gbWFrZSBpdCBmaXQgdGhlIG5vZGUuIElmIG5vIGZpdHRpbmcgd3JhcHBpbmcgY2FuIGJlIGZvdW5kLFxuICAgIHJldHVybiBudWxsLiBOb3RlIHRoYXQsIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJlcXVpcmVkIG5vZGVzIGNhblxuICAgIGFsd2F5cyBiZSBjcmVhdGVkLCB0aGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQgaWYgeW91IHBhc3MgbnVsbCBvclxuICAgIGBGcmFnbWVudC5lbXB0eWAgYXMgY29udGVudC5cbiAgICAqL1xuICAgIGNyZWF0ZUFuZEZpbGwoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBhdHRycyA9IHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKTtcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20oY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSB0aGlzLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb250ZW50ID0gYmVmb3JlLmFwcGVuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2hlZCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGxldCBhZnRlciA9IG1hdGNoZWQgJiYgbWF0Y2hlZC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgYXR0cnMsIGNvbnRlbnQuYXBwZW5kKGFmdGVyKSwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgdmFsaWQgY29udGVudCBmb3IgdGhpcyBub2RlXG4gICAgdHlwZS5cbiAgICAqL1xuICAgIHZhbGlkQ29udGVudChjb250ZW50KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LnZhbGlkRW5kKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93c01hcmtzKGNvbnRlbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRocm93cyBhIFJhbmdlRXJyb3IgaWYgdGhlIGdpdmVuIGZyYWdtZW50IGlzIG5vdCB2YWxpZCBjb250ZW50IGZvciB0aGlzXG4gICAgbm9kZSB0eXBlLlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hlY2tDb250ZW50KGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkQ29udGVudChjb250ZW50KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIGNvbnRlbnQgZm9yIG5vZGUgJHt0aGlzLm5hbWV9OiAke2NvbnRlbnQudG9TdHJpbmcoKS5zbGljZSgwLCA1MCl9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hlY2tBdHRycyhhdHRycykge1xuICAgICAgICBjaGVja0F0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCBcIm5vZGVcIiwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbWFyayB0eXBlIGlzIGFsbG93ZWQgaW4gdGhpcyBub2RlLlxuICAgICovXG4gICAgYWxsb3dzTWFya1R5cGUobWFya1R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFya1NldCA9PSBudWxsIHx8IHRoaXMubWFya1NldC5pbmRleE9mKG1hcmtUeXBlKSA+IC0xO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBhcmUgYWxsb3dlZCBpbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBhbGxvd3NNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5tYXJrU2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIHRoZSBtYXJrcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gc2V0LlxuICAgICovXG4gICAgYWxsb3dlZE1hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtTZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBtYXJrcztcbiAgICAgICAgbGV0IGNvcHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrVHlwZShtYXJrc1tpXS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weSA9IG1hcmtzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29weSkge1xuICAgICAgICAgICAgICAgIGNvcHkucHVzaChtYXJrc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjb3B5ID8gbWFya3MgOiBjb3B5Lmxlbmd0aCA/IGNvcHkgOiBNYXJrLm5vbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNvbXBpbGUobm9kZXMsIHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobmFtZSwgc3BlYykgPT4gcmVzdWx0W25hbWVdID0gbmV3IE5vZGVUeXBlKG5hbWUsIHNjaGVtYSwgc3BlYykpO1xuICAgICAgICBsZXQgdG9wVHlwZSA9IHNjaGVtYS5zcGVjLnRvcE5vZGUgfHwgXCJkb2NcIjtcbiAgICAgICAgaWYgKCFyZXN1bHRbdG9wVHlwZV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNjaGVtYSBpcyBtaXNzaW5nIGl0cyB0b3Agbm9kZSB0eXBlICgnXCIgKyB0b3BUeXBlICsgXCInKVwiKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRXZlcnkgc2NoZW1hIG5lZWRzIGEgJ3RleHQnIHR5cGVcIik7XG4gICAgICAgIGZvciAobGV0IF8gaW4gcmVzdWx0LnRleHQuYXR0cnMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB0ZXh0IG5vZGUgdHlwZSBzaG91bGQgbm90IGhhdmUgYXR0cmlidXRlc1wiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZU5hbWUsIGF0dHJOYW1lLCB0eXBlKSB7XG4gICAgbGV0IHR5cGVzID0gdHlwZS5zcGxpdChcInxcIik7XG4gICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICBsZXQgbmFtZSA9IHZhbHVlID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsdWU7XG4gICAgICAgIGlmICh0eXBlcy5pbmRleE9mKG5hbWUpIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSBvZiB0eXBlICR7dHlwZXN9IGZvciBhdHRyaWJ1dGUgJHthdHRyTmFtZX0gb24gdHlwZSAke3R5cGVOYW1lfSwgZ290ICR7bmFtZX1gKTtcbiAgICB9O1xufVxuLy8gQXR0cmlidXRlIGRlc2NyaXB0b3JzXG5jbGFzcyBBdHRyaWJ1dGUge1xuICAgIGNvbnN0cnVjdG9yKHR5cGVOYW1lLCBhdHRyTmFtZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmhhc0RlZmF1bHQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgXCJkZWZhdWx0XCIpO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0eXBlb2Ygb3B0aW9ucy52YWxpZGF0ZSA9PSBcInN0cmluZ1wiID8gdmFsaWRhdGVUeXBlKHR5cGVOYW1lLCBhdHRyTmFtZSwgb3B0aW9ucy52YWxpZGF0ZSkgOiBvcHRpb25zLnZhbGlkYXRlO1xuICAgIH1cbiAgICBnZXQgaXNSZXF1aXJlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmhhc0RlZmF1bHQ7XG4gICAgfVxufVxuLy8gTWFya3Ncbi8qKlxuTGlrZSBub2RlcywgbWFya3MgKHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9kZXMgdG8gc2lnbmlmeVxudGhpbmdzIGxpa2UgZW1waGFzaXMgb3IgYmVpbmcgcGFydCBvZiBhIGxpbmspIGFyZVxuW3RhZ2dlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmsudHlwZSkgd2l0aCB0eXBlIG9iamVjdHMsIHdoaWNoIGFyZVxuaW5zdGFudGlhdGVkIG9uY2UgcGVyIGBTY2hlbWFgLlxuKi9cbmNsYXNzIE1hcmtUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIG9mIHRoZSBtYXJrIHR5cGUuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJhbmssIFxuICAgIC8qKlxuICAgIFRoZSBzY2hlbWEgdGhhdCB0aGlzIG1hcmsgdHlwZSBpbnN0YW5jZSBpcyBwYXJ0IG9mLlxuICAgICovXG4gICAgc2NoZW1hLCBcbiAgICAvKipcbiAgICBUaGUgc3BlYyBvbiB3aGljaCB0aGUgdHlwZSBpcyBiYXNlZC5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBpbml0QXR0cnMobmFtZSwgc3BlYy5hdHRycyk7XG4gICAgICAgIHRoaXMuZXhjbHVkZWQgPSBudWxsO1xuICAgICAgICBsZXQgZGVmYXVsdHMgPSBkZWZhdWx0QXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBkZWZhdWx0cyA/IG5ldyBNYXJrKHRoaXMsIGRlZmF1bHRzKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgb2YgdGhpcyB0eXBlLiBgYXR0cnNgIG1heSBiZSBgbnVsbGAgb3IgYW4gb2JqZWN0XG4gICAgY29udGFpbmluZyBvbmx5IHNvbWUgb2YgdGhlIG1hcmsncyBhdHRyaWJ1dGVzLiBUaGUgb3RoZXJzLCBpZlxuICAgIHRoZXkgaGF2ZSBkZWZhdWx0cywgd2lsbCBiZSBhZGRlZC5cbiAgICAqL1xuICAgIGNyZWF0ZShhdHRycyA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFhdHRycyAmJiB0aGlzLmluc3RhbmNlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiBuZXcgTWFyayh0aGlzLCBjb21wdXRlQXR0cnModGhpcy5hdHRycywgYXR0cnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGlsZShtYXJrcywgc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpLCByYW5rID0gMDtcbiAgICAgICAgbWFya3MuZm9yRWFjaCgobmFtZSwgc3BlYykgPT4gcmVzdWx0W25hbWVdID0gbmV3IE1hcmtUeXBlKG5hbWUsIHJhbmsrKywgc2NoZW1hLCBzcGVjKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LCBhIG5ldyBzZXRcbiAgICB3aXRob3V0IGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHRoZSBpbnB1dCBzZXQgaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgc2V0ID0gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgYSBtYXJrIG9mIHRoaXMgdHlwZSBpbiB0aGUgZ2l2ZW4gc2V0LlxuICAgICovXG4gICAgaXNJblNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0W2ldLnR5cGUgPT0gdGhpcylcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0W2ldO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoZWNrQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgY2hlY2tBdHRycyh0aGlzLmF0dHJzLCBhdHRycywgXCJtYXJrXCIsIHRoaXMubmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJpZXMgd2hldGhlciBhIGdpdmVuIG1hcmsgdHlwZSBpc1xuICAgIFtleGNsdWRlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmV4Y2x1ZGVzKSBieSB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGV4Y2x1ZGVzKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2x1ZGVkLmluZGV4T2Yob3RoZXIpID4gLTE7XG4gICAgfVxufVxuLyoqXG5BIGRvY3VtZW50IHNjaGVtYS4gSG9sZHMgW25vZGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZSkgYW5kIFttYXJrXG50eXBlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1R5cGUpIG9iamVjdHMgZm9yIHRoZSBub2RlcyBhbmQgbWFya3MgdGhhdCBtYXlcbm9jY3VyIGluIGNvbmZvcm1pbmcgZG9jdW1lbnRzLCBhbmQgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3JcbmNyZWF0aW5nIGFuZCBkZXNlcmlhbGl6aW5nIHN1Y2ggZG9jdW1lbnRzLlxuXG5XaGVuIGdpdmVuLCB0aGUgdHlwZSBwYXJhbWV0ZXJzIHByb3ZpZGUgdGhlIG5hbWVzIG9mIHRoZSBub2RlcyBhbmRcbm1hcmtzIGluIHRoaXMgc2NoZW1hLlxuKi9cbmNsYXNzIFNjaGVtYSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgc2NoZW1hIGZyb20gYSBzY2hlbWEgW3NwZWNpZmljYXRpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5TY2hlbWFTcGVjKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHNwZWMpIHtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBbbGluZWJyZWFrXG4gICAgICAgIHJlcGxhY2VtZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMubGluZWJyZWFrUmVwbGFjZW1lbnQpIG5vZGUgZGVmaW5lZFxuICAgICAgICBpbiB0aGlzIHNjaGVtYSwgaWYgYW55LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpbmVicmVha1JlcGxhY2VtZW50ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEFuIG9iamVjdCBmb3Igc3RvcmluZyB3aGF0ZXZlciB2YWx1ZXMgbW9kdWxlcyBtYXkgd2FudCB0b1xuICAgICAgICBjb21wdXRlIGFuZCBjYWNoZSBwZXIgc2NoZW1hLiAoSWYgeW91IHdhbnQgdG8gc3RvcmUgc29tZXRoaW5nXG4gICAgICAgIGluIGl0LCB0cnkgdG8gdXNlIHByb3BlcnR5IG5hbWVzIHVubGlrZWx5IHRvIGNsYXNoLilcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgaW5zdGFuY2VTcGVjID0gdGhpcy5zcGVjID0ge307XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gc3BlYylcbiAgICAgICAgICAgIGluc3RhbmNlU3BlY1twcm9wXSA9IHNwZWNbcHJvcF07XG4gICAgICAgIGluc3RhbmNlU3BlYy5ub2RlcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm5vZGVzKSxcbiAgICAgICAgICAgIGluc3RhbmNlU3BlYy5tYXJrcyA9IE9yZGVyZWRNYXAuZnJvbShzcGVjLm1hcmtzIHx8IHt9KSxcbiAgICAgICAgICAgIHRoaXMubm9kZXMgPSBOb2RlVHlwZS5jb21waWxlKHRoaXMuc3BlYy5ub2RlcywgdGhpcyk7XG4gICAgICAgIHRoaXMubWFya3MgPSBNYXJrVHlwZS5jb21waWxlKHRoaXMuc3BlYy5tYXJrcywgdGhpcyk7XG4gICAgICAgIGxldCBjb250ZW50RXhwckNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm5vZGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcCBpbiB0aGlzLm1hcmtzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKHByb3AgKyBcIiBjYW4gbm90IGJlIGJvdGggYSBub2RlIGFuZCBhIG1hcmtcIik7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubm9kZXNbcHJvcF0sIGNvbnRlbnRFeHByID0gdHlwZS5zcGVjLmNvbnRlbnQgfHwgXCJcIiwgbWFya0V4cHIgPSB0eXBlLnNwZWMubWFya3M7XG4gICAgICAgICAgICB0eXBlLmNvbnRlbnRNYXRjaCA9IGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdIHx8XG4gICAgICAgICAgICAgICAgKGNvbnRlbnRFeHByQ2FjaGVbY29udGVudEV4cHJdID0gQ29udGVudE1hdGNoLnBhcnNlKGNvbnRlbnRFeHByLCB0aGlzLm5vZGVzKSk7XG4gICAgICAgICAgICB0eXBlLmlubGluZUNvbnRlbnQgPSB0eXBlLmNvbnRlbnRNYXRjaC5pbmxpbmVDb250ZW50O1xuICAgICAgICAgICAgaWYgKHR5cGUuc3BlYy5saW5lYnJlYWtSZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmVicmVha1JlcGxhY2VtZW50KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11bHRpcGxlIGxpbmVicmVhayBub2RlcyBkZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pc0lubGluZSB8fCAhdHlwZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTGluZWJyZWFrIHJlcGxhY2VtZW50IG5vZGVzIG11c3QgYmUgaW5saW5lIGxlYWYgbm9kZXNcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lYnJlYWtSZXBsYWNlbWVudCA9IHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0eXBlLm1hcmtTZXQgPSBtYXJrRXhwciA9PSBcIl9cIiA/IG51bGwgOlxuICAgICAgICAgICAgICAgIG1hcmtFeHByID8gZ2F0aGVyTWFya3ModGhpcywgbWFya0V4cHIuc3BsaXQoXCIgXCIpKSA6XG4gICAgICAgICAgICAgICAgICAgIG1hcmtFeHByID09IFwiXCIgfHwgIXR5cGUuaW5saW5lQ29udGVudCA/IFtdIDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRoaXMubWFya3MpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5tYXJrc1twcm9wXSwgZXhjbCA9IHR5cGUuc3BlYy5leGNsdWRlcztcbiAgICAgICAgICAgIHR5cGUuZXhjbHVkZWQgPSBleGNsID09IG51bGwgPyBbdHlwZV0gOiBleGNsID09IFwiXCIgPyBbXSA6IGdhdGhlck1hcmtzKHRoaXMsIGV4Y2wuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVGcm9tSlNPTiA9IHRoaXMubm9kZUZyb21KU09OLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubWFya0Zyb21KU09OID0gdGhpcy5tYXJrRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50b3BOb2RlVHlwZSA9IHRoaXMubm9kZXNbdGhpcy5zcGVjLnRvcE5vZGUgfHwgXCJkb2NcIl07XG4gICAgICAgIHRoaXMuY2FjaGVkLndyYXBwaW5ncyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5vZGUgaW4gdGhpcyBzY2hlbWEuIFRoZSBgdHlwZWAgbWF5IGJlIGEgc3RyaW5nIG9yIGFcbiAgICBgTm9kZVR5cGVgIGluc3RhbmNlLiBBdHRyaWJ1dGVzIHdpbGwgYmUgZXh0ZW5kZWQgd2l0aCBkZWZhdWx0cyxcbiAgICBgY29udGVudGAgbWF5IGJlIGEgYEZyYWdtZW50YCwgYG51bGxgLCBhIGBOb2RlYCwgb3IgYW4gYXJyYXkgb2ZcbiAgICBub2Rlcy5cbiAgICAqL1xuICAgIG5vZGUodHlwZSwgYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLm5vZGVUeXBlKHR5cGUpO1xuICAgICAgICBlbHNlIGlmICghKHR5cGUgaW5zdGFuY2VvZiBOb2RlVHlwZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgbm9kZSB0eXBlOiBcIiArIHR5cGUpO1xuICAgICAgICBlbHNlIGlmICh0eXBlLnNjaGVtYSAhPSB0aGlzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJOb2RlIHR5cGUgZnJvbSBkaWZmZXJlbnQgc2NoZW1hIHVzZWQgKFwiICsgdHlwZS5uYW1lICsgXCIpXCIpO1xuICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGVDaGVja2VkKGF0dHJzLCBjb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRleHQgbm9kZSBpbiB0aGUgc2NoZW1hLiBFbXB0eSB0ZXh0IG5vZGVzIGFyZSBub3RcbiAgICBhbGxvd2VkLlxuICAgICovXG4gICAgdGV4dCh0ZXh0LCBtYXJrcykge1xuICAgICAgICBsZXQgdHlwZSA9IHRoaXMubm9kZXMudGV4dDtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Tm9kZSh0eXBlLCB0eXBlLmRlZmF1bHRBdHRycywgdGV4dCwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIG1hcmsodHlwZSwgYXR0cnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0eXBlID0gdGhpcy5tYXJrc1t0eXBlXTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlKGF0dHJzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBub2RlIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFRoaXMgbWV0aG9kIGlzXG4gICAgYm91bmQuXG4gICAgKi9cbiAgICBub2RlRnJvbUpTT04oanNvbikge1xuICAgICAgICByZXR1cm4gTm9kZS5mcm9tSlNPTih0aGlzLCBqc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBtYXJrIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFRoaXMgbWV0aG9kIGlzXG4gICAgYm91bmQuXG4gICAgKi9cbiAgICBtYXJrRnJvbUpTT04oanNvbikge1xuICAgICAgICByZXR1cm4gTWFyay5mcm9tSlNPTih0aGlzLCBqc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBub2RlVHlwZShuYW1lKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMubm9kZXNbbmFtZV07XG4gICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVua25vd24gbm9kZSB0eXBlOiBcIiArIG5hbWUpO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2F0aGVyTWFya3Moc2NoZW1hLCBtYXJrcykge1xuICAgIGxldCBmb3VuZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5hbWUgPSBtYXJrc1tpXSwgbWFyayA9IHNjaGVtYS5tYXJrc1tuYW1lXSwgb2sgPSBtYXJrO1xuICAgICAgICBpZiAobWFyaykge1xuICAgICAgICAgICAgZm91bmQucHVzaChtYXJrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gc2NoZW1hLm1hcmtzKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBzY2hlbWEubWFya3NbcHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJfXCIgfHwgKG1hcmsuc3BlYy5ncm91cCAmJiBtYXJrLnNwZWMuZ3JvdXAuc3BsaXQoXCIgXCIpLmluZGV4T2YobmFtZSkgPiAtMSkpXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnB1c2gob2sgPSBtYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9rKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiVW5rbm93biBtYXJrIHR5cGU6ICdcIiArIG1hcmtzW2ldICsgXCInXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGlzVGFnUnVsZShydWxlKSB7IHJldHVybiBydWxlLnRhZyAhPSBudWxsOyB9XG5mdW5jdGlvbiBpc1N0eWxlUnVsZShydWxlKSB7IHJldHVybiBydWxlLnN0eWxlICE9IG51bGw7IH1cbi8qKlxuQSBET00gcGFyc2VyIHJlcHJlc2VudHMgYSBzdHJhdGVneSBmb3IgcGFyc2luZyBET00gY29udGVudCBpbnRvIGFcblByb3NlTWlycm9yIGRvY3VtZW50IGNvbmZvcm1pbmcgdG8gYSBnaXZlbiBzY2hlbWEuIEl0cyBiZWhhdmlvciBpc1xuZGVmaW5lZCBieSBhbiBhcnJheSBvZiBbcnVsZXNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUpLlxuKi9cbmNsYXNzIERPTVBhcnNlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGFyc2VyIHRoYXQgdGFyZ2V0cyB0aGUgZ2l2ZW4gc2NoZW1hLCB1c2luZyB0aGUgZ2l2ZW5cbiAgICBwYXJzaW5nIHJ1bGVzLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSBpbnRvIHdoaWNoIHRoZSBwYXJzZXIgcGFyc2VzLlxuICAgICovXG4gICAgc2NoZW1hLCBcbiAgICAvKipcbiAgICBUaGUgc2V0IG9mIFtwYXJzZSBydWxlc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlBhcnNlUnVsZSkgdGhhdCB0aGUgcGFyc2VyXG4gICAgdXNlcywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZS5cbiAgICAqL1xuICAgIHJ1bGVzKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnJ1bGVzID0gcnVsZXM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWdzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBbXTtcbiAgICAgICAgbGV0IG1hdGNoZWRTdHlsZXMgPSB0aGlzLm1hdGNoZWRTdHlsZXMgPSBbXTtcbiAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgIGlmIChpc1RhZ1J1bGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3MucHVzaChydWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzU3R5bGVSdWxlKHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3AgPSAvW149XSovLmV4ZWMocnVsZS5zdHlsZSlbMF07XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRTdHlsZXMuaW5kZXhPZihwcm9wKSA8IDApXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTdHlsZXMucHVzaChwcm9wKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT25seSBub3JtYWxpemUgbGlzdCBlbGVtZW50cyB3aGVuIGxpc3RzIGluIHRoZSBzY2hlbWEgY2FuJ3QgZGlyZWN0bHkgY29udGFpbiB0aGVtc2VsdmVzXG4gICAgICAgIHRoaXMubm9ybWFsaXplTGlzdHMgPSAhdGhpcy50YWdzLnNvbWUociA9PiB7XG4gICAgICAgICAgICBpZiAoIS9eKHVsfG9sKVxcYi8udGVzdChyLnRhZykgfHwgIXIubm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHNjaGVtYS5ub2Rlc1tyLm5vZGVdO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuY29udGVudE1hdGNoLm1hdGNoVHlwZShub2RlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFBhcnNlIGEgZG9jdW1lbnQgZnJvbSB0aGUgY29udGVudCBvZiBhIERPTSBub2RlLlxuICAgICovXG4gICAgcGFyc2UoZG9tLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBuZXcgUGFyc2VDb250ZXh0KHRoaXMsIG9wdGlvbnMsIGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5hZGRBbGwoZG9tLCBNYXJrLm5vbmUsIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBub2RlLCBsaWtlXG4gICAgW2BwYXJzZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5ET01QYXJzZXIucGFyc2UpLCBhbmQgdGFrZXMgdGhlIHNhbWUgc2V0IG9mXG4gICAgb3B0aW9ucy4gQnV0IHVubGlrZSB0aGF0IG1ldGhvZCwgd2hpY2ggcHJvZHVjZXMgYSB3aG9sZSBub2RlLFxuICAgIHRoaXMgb25lIHJldHVybnMgYSBzbGljZSB0aGF0IGlzIG9wZW4gYXQgdGhlIHNpZGVzLCBtZWFuaW5nIHRoYXRcbiAgICB0aGUgc2NoZW1hIGNvbnN0cmFpbnRzIGFyZW4ndCBhcHBsaWVkIHRvIHRoZSBzdGFydCBvZiBub2RlcyB0b1xuICAgIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBhbmQgdGhlIGVuZCBvZiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICovXG4gICAgcGFyc2VTbGljZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkQWxsKGRvbSwgTWFyay5ub25lLCBvcHRpb25zLmZyb20sIG9wdGlvbnMudG8pO1xuICAgICAgICByZXR1cm4gU2xpY2UubWF4T3Blbihjb250ZXh0LmZpbmlzaCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaFRhZyhkb20sIGNvbnRleHQsIGFmdGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZnRlciA/IHRoaXMudGFncy5pbmRleE9mKGFmdGVyKSArIDEgOiAwOyBpIDwgdGhpcy50YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMudGFnc1tpXTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzKGRvbSwgcnVsZS50YWcpICYmXG4gICAgICAgICAgICAgICAgKHJ1bGUubmFtZXNwYWNlID09PSB1bmRlZmluZWQgfHwgZG9tLm5hbWVzcGFjZVVSSSA9PSBydWxlLm5hbWVzcGFjZSkgJiZcbiAgICAgICAgICAgICAgICAoIXJ1bGUuY29udGV4dCB8fCBjb250ZXh0Lm1hdGNoZXNDb250ZXh0KHJ1bGUuY29udGV4dCkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuZ2V0QXR0cnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJ1bGUuZ2V0QXR0cnMoZG9tKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5hdHRycyA9IHJlc3VsdCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF0Y2hTdHlsZShwcm9wLCB2YWx1ZSwgY29udGV4dCwgYWZ0ZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFmdGVyID8gdGhpcy5zdHlsZXMuaW5kZXhPZihhZnRlcikgKyAxIDogMDsgaSA8IHRoaXMuc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMuc3R5bGVzW2ldLCBzdHlsZSA9IHJ1bGUuc3R5bGU7XG4gICAgICAgICAgICBpZiAoc3R5bGUuaW5kZXhPZihwcm9wKSAhPSAwIHx8XG4gICAgICAgICAgICAgICAgcnVsZS5jb250ZXh0ICYmICFjb250ZXh0Lm1hdGNoZXNDb250ZXh0KHJ1bGUuY29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIHN0eWxlIHN0cmluZyBlaXRoZXIgcHJlY2lzZWx5IG1hdGNoZXMgdGhlIHByb3AsXG4gICAgICAgICAgICAgICAgLy8gb3IgaGFzIGFuICc9JyBzaWduIGFmdGVyIHRoZSBwcm9wLCBmb2xsb3dlZCBieSB0aGUgZ2l2ZW5cbiAgICAgICAgICAgICAgICAvLyB2YWx1ZS5cbiAgICAgICAgICAgICAgICBzdHlsZS5sZW5ndGggPiBwcm9wLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAoc3R5bGUuY2hhckNvZGVBdChwcm9wLmxlbmd0aCkgIT0gNjEgfHwgc3R5bGUuc2xpY2UocHJvcC5sZW5ndGggKyAxKSAhPSB2YWx1ZSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocnVsZS5nZXRBdHRycykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBydWxlLmdldEF0dHJzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgcnVsZS5hdHRycyA9IHJlc3VsdCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBzY2hlbWFSdWxlcyhzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBpbnNlcnQocnVsZSkge1xuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gcnVsZS5wcmlvcml0eSA9PSBudWxsID8gNTAgOiBydWxlLnByaW9yaXR5LCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSByZXN1bHRbaV0sIG5leHRQcmlvcml0eSA9IG5leHQucHJpb3JpdHkgPT0gbnVsbCA/IDUwIDogbmV4dC5wcmlvcml0eTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFByaW9yaXR5IDwgcHJpb3JpdHkpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnNwbGljZShpLCAwLCBydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHNjaGVtYS5tYXJrcykge1xuICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2NoZW1hLm1hcmtzW25hbWVdLnNwZWMucGFyc2VET007XG4gICAgICAgICAgICBpZiAocnVsZXMpXG4gICAgICAgICAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KHJ1bGUgPSBjb3B5KHJ1bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocnVsZS5tYXJrIHx8IHJ1bGUuaWdub3JlIHx8IHJ1bGUuY2xlYXJNYXJrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubWFyayA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBzY2hlbWEubm9kZXMpIHtcbiAgICAgICAgICAgIGxldCBydWxlcyA9IHNjaGVtYS5ub2Rlc1tuYW1lXS5zcGVjLnBhcnNlRE9NO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKVxuICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydChydWxlID0gY29weShydWxlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHJ1bGUubm9kZSB8fCBydWxlLmlnbm9yZSB8fCBydWxlLm1hcmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5ub2RlID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBET00gcGFyc2VyIHVzaW5nIHRoZSBwYXJzaW5nIHJ1bGVzIGxpc3RlZCBpbiBhXG4gICAgc2NoZW1hJ3MgW25vZGUgc3BlY3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5wYXJzZURPTSksIHJlb3JkZXJlZCBieVxuICAgIFtwcmlvcml0eV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlBhcnNlUnVsZS5wcmlvcml0eSkuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tUGFyc2VyIHx8XG4gICAgICAgICAgICAoc2NoZW1hLmNhY2hlZC5kb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKHNjaGVtYSwgRE9NUGFyc2VyLnNjaGVtYVJ1bGVzKHNjaGVtYSkpKTtcbiAgICB9XG59XG5jb25zdCBibG9ja1RhZ3MgPSB7XG4gICAgYWRkcmVzczogdHJ1ZSwgYXJ0aWNsZTogdHJ1ZSwgYXNpZGU6IHRydWUsIGJsb2NrcXVvdGU6IHRydWUsIGNhbnZhczogdHJ1ZSxcbiAgICBkZDogdHJ1ZSwgZGl2OiB0cnVlLCBkbDogdHJ1ZSwgZmllbGRzZXQ6IHRydWUsIGZpZ2NhcHRpb246IHRydWUsIGZpZ3VyZTogdHJ1ZSxcbiAgICBmb290ZXI6IHRydWUsIGZvcm06IHRydWUsIGgxOiB0cnVlLCBoMjogdHJ1ZSwgaDM6IHRydWUsIGg0OiB0cnVlLCBoNTogdHJ1ZSxcbiAgICBoNjogdHJ1ZSwgaGVhZGVyOiB0cnVlLCBoZ3JvdXA6IHRydWUsIGhyOiB0cnVlLCBsaTogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9sOiB0cnVlLFxuICAgIG91dHB1dDogdHJ1ZSwgcDogdHJ1ZSwgcHJlOiB0cnVlLCBzZWN0aW9uOiB0cnVlLCB0YWJsZTogdHJ1ZSwgdGZvb3Q6IHRydWUsIHVsOiB0cnVlXG59O1xuY29uc3QgaWdub3JlVGFncyA9IHtcbiAgICBoZWFkOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2JqZWN0OiB0cnVlLCBzY3JpcHQ6IHRydWUsIHN0eWxlOiB0cnVlLCB0aXRsZTogdHJ1ZVxufTtcbmNvbnN0IGxpc3RUYWdzID0geyBvbDogdHJ1ZSwgdWw6IHRydWUgfTtcbi8vIFVzaW5nIGEgYml0ZmllbGQgZm9yIG5vZGUgY29udGV4dCBvcHRpb25zXG5jb25zdCBPUFRfUFJFU0VSVkVfV1MgPSAxLCBPUFRfUFJFU0VSVkVfV1NfRlVMTCA9IDIsIE9QVF9PUEVOX0xFRlQgPSA0O1xuZnVuY3Rpb24gd3NPcHRpb25zRm9yKHR5cGUsIHByZXNlcnZlV2hpdGVzcGFjZSwgYmFzZSkge1xuICAgIGlmIChwcmVzZXJ2ZVdoaXRlc3BhY2UgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIChwcmVzZXJ2ZVdoaXRlc3BhY2UgPyBPUFRfUFJFU0VSVkVfV1MgOiAwKSB8XG4gICAgICAgICAgICAocHJlc2VydmVXaGl0ZXNwYWNlID09PSBcImZ1bGxcIiA/IE9QVF9QUkVTRVJWRV9XU19GVUxMIDogMCk7XG4gICAgcmV0dXJuIHR5cGUgJiYgdHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCIgPyBPUFRfUFJFU0VSVkVfV1MgfCBPUFRfUFJFU0VSVkVfV1NfRlVMTCA6IGJhc2UgJiB+T1BUX09QRU5fTEVGVDtcbn1cbmNsYXNzIE5vZGVDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBhdHRycywgbWFya3MsIHNvbGlkLCBtYXRjaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5zb2xpZCA9IHNvbGlkO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBbXTtcbiAgICAgICAgLy8gTWFya3MgYXBwbGllZCB0byB0aGUgbm9kZSdzIGNoaWxkcmVuXG4gICAgICAgIHRoaXMuYWN0aXZlTWFya3MgPSBNYXJrLm5vbmU7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaCB8fCAob3B0aW9ucyAmIE9QVF9PUEVOX0xFRlQgPyBudWxsIDogdHlwZS5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICBmaW5kV3JhcHBpbmcobm9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWF0Y2gpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIGxldCBmaWxsID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgICAgICAgICAgaWYgKGZpbGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZpbGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaCwgd3JhcDtcbiAgICAgICAgICAgICAgICBpZiAod3JhcCA9IHN0YXJ0LmZpbmRXcmFwcGluZyhub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2guZmluZFdyYXBwaW5nKG5vZGUudHlwZSk7XG4gICAgfVxuICAgIGZpbmlzaChvcGVuRW5kKSB7XG4gICAgICAgIGlmICghKHRoaXMub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykpIHsgLy8gU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgbGV0IGxhc3QgPSB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdLCBtO1xuICAgICAgICAgICAgaWYgKGxhc3QgJiYgbGFzdC5pc1RleHQgJiYgKG0gPSAvWyBcXHRcXHJcXG5cXHUwMDBjXSskLy5leGVjKGxhc3QudGV4dCkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBsYXN0O1xuICAgICAgICAgICAgICAgIGlmIChsYXN0LnRleHQubGVuZ3RoID09IG1bMF0ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbdGhpcy5jb250ZW50Lmxlbmd0aCAtIDFdID0gdGV4dC53aXRoVGV4dCh0ZXh0LnRleHQuc2xpY2UoMCwgdGV4dC50ZXh0Lmxlbmd0aCAtIG1bMF0ubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHRoaXMuY29udGVudCk7XG4gICAgICAgIGlmICghb3BlbkVuZCAmJiB0aGlzLm1hdGNoKVxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuYXBwZW5kKHRoaXMubWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID8gdGhpcy50eXBlLmNyZWF0ZSh0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKSA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIGlubGluZUNvbnRleHQobm9kZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5pbmxpbmVDb250ZW50O1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRbMF0uaXNJbmxpbmU7XG4gICAgICAgIHJldHVybiBub2RlLnBhcmVudE5vZGUgJiYgIWJsb2NrVGFncy5oYXNPd25Qcm9wZXJ0eShub2RlLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxufVxuY2xhc3MgUGFyc2VDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgcGFyc2VyIHdlIGFyZSB1c2luZy5cbiAgICBwYXJzZXIsIFxuICAgIC8vIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGlzIHBhcnNlLlxuICAgIG9wdGlvbnMsIGlzT3Blbikge1xuICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5pc09wZW4gPSBpc09wZW47XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gZmFsc2U7XG4gICAgICAgIGxldCB0b3BOb2RlID0gb3B0aW9ucy50b3BOb2RlLCB0b3BDb250ZXh0O1xuICAgICAgICBsZXQgdG9wT3B0aW9ucyA9IHdzT3B0aW9uc0ZvcihudWxsLCBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZSwgMCkgfCAoaXNPcGVuID8gT1BUX09QRU5fTEVGVCA6IDApO1xuICAgICAgICBpZiAodG9wTm9kZSlcbiAgICAgICAgICAgIHRvcENvbnRleHQgPSBuZXcgTm9kZUNvbnRleHQodG9wTm9kZS50eXBlLCB0b3BOb2RlLmF0dHJzLCBNYXJrLm5vbmUsIHRydWUsIG9wdGlvbnMudG9wTWF0Y2ggfHwgdG9wTm9kZS50eXBlLmNvbnRlbnRNYXRjaCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIGVsc2UgaWYgKGlzT3BlbilcbiAgICAgICAgICAgIHRvcENvbnRleHQgPSBuZXcgTm9kZUNvbnRleHQobnVsbCwgbnVsbCwgTWFyay5ub25lLCB0cnVlLCBudWxsLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChwYXJzZXIuc2NoZW1hLnRvcE5vZGVUeXBlLCBudWxsLCBNYXJrLm5vbmUsIHRydWUsIG51bGwsIHRvcE9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5vZGVzID0gW3RvcENvbnRleHRdO1xuICAgICAgICB0aGlzLmZpbmQgPSBvcHRpb25zLmZpbmRQb3NpdGlvbnM7XG4gICAgICAgIHRoaXMubmVlZHNCbG9jayA9IGZhbHNlO1xuICAgIH1cbiAgICBnZXQgdG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1t0aGlzLm9wZW5dO1xuICAgIH1cbiAgICAvLyBBZGQgYSBET00gbm9kZSB0byB0aGUgY29udGVudC4gVGV4dCBpcyBpbnNlcnRlZCBhcyB0ZXh0IG5vZGUsXG4gICAgLy8gb3RoZXJ3aXNlLCB0aGUgbm9kZSBpcyBwYXNzZWQgdG8gYGFkZEVsZW1lbnRgIG9yLCBpZiBpdCBoYXMgYVxuICAgIC8vIGBzdHlsZWAgYXR0cmlidXRlLCBgYWRkRWxlbWVudFdpdGhTdHlsZXNgLlxuICAgIGFkZERPTShkb20sIG1hcmtzKSB7XG4gICAgICAgIGlmIChkb20ubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHRoaXMuYWRkVGV4dE5vZGUoZG9tLCBtYXJrcyk7XG4gICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSwgbWFya3MpO1xuICAgIH1cbiAgICBhZGRUZXh0Tm9kZShkb20sIG1hcmtzKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGRvbS5ub2RlVmFsdWU7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCwgcHJlc2VydmVXUyA9ICh0b3Aub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XU19GVUxMKSA/IFwiZnVsbFwiXG4gICAgICAgICAgICA6IHRoaXMubG9jYWxQcmVzZXJ2ZVdTIHx8ICh0b3Aub3B0aW9ucyAmIE9QVF9QUkVTRVJWRV9XUykgPiAwO1xuICAgICAgICBpZiAocHJlc2VydmVXUyA9PT0gXCJmdWxsXCIgfHxcbiAgICAgICAgICAgIHRvcC5pbmxpbmVDb250ZXh0KGRvbSkgfHxcbiAgICAgICAgICAgIC9bXiBcXHRcXHJcXG5cXHUwMDBjXS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICghcHJlc2VydmVXUykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvWyBcXHRcXHJcXG5cXHUwMDBjXSsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3RhcnRzIHdpdGggd2hpdGVzcGFjZSwgYW5kIHRoZXJlIGlzIG5vIG5vZGUgYmVmb3JlIGl0LCBvclxuICAgICAgICAgICAgICAgIC8vIGEgaGFyZCBicmVhaywgb3IgYSB0ZXh0IG5vZGUgdGhhdCBlbmRzIHdpdGggd2hpdGVzcGFjZSwgc3RyaXAgdGhlXG4gICAgICAgICAgICAgICAgLy8gbGVhZGluZyBzcGFjZS5cbiAgICAgICAgICAgICAgICBpZiAoL15bIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSAmJiB0aGlzLm9wZW4gPT0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlQmVmb3JlID0gdG9wLmNvbnRlbnRbdG9wLmNvbnRlbnQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb21Ob2RlQmVmb3JlID0gZG9tLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlQmVmb3JlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9tTm9kZUJlZm9yZSAmJiBkb21Ob2RlQmVmb3JlLm5vZGVOYW1lID09ICdCUicpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAobm9kZUJlZm9yZS5pc1RleHQgJiYgL1sgXFx0XFxyXFxuXFx1MDAwY10kLy50ZXN0KG5vZGVCZWZvcmUudGV4dCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcmVzZXJ2ZVdTICE9PSBcImZ1bGxcIikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCIgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Tm9kZSh0aGlzLnBhcnNlci5zY2hlbWEudGV4dCh2YWx1ZSksIG1hcmtzLCAhL1xcUy8udGVzdCh2YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5maW5kSW5UZXh0KGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0YWcgYW5kIHVzZSB0aGF0IHRvIHBhcnNlLiBJZlxuICAgIC8vIG5vbmUgaXMgZm91bmQsIHRoZSBlbGVtZW50J3MgY29udGVudCBub2RlcyBhcmUgYWRkZWQgZGlyZWN0bHkuXG4gICAgYWRkRWxlbWVudChkb20sIG1hcmtzLCBtYXRjaEFmdGVyKSB7XG4gICAgICAgIGxldCBvdXRlcldTID0gdGhpcy5sb2NhbFByZXNlcnZlV1MsIHRvcCA9IHRoaXMudG9wO1xuICAgICAgICBpZiAoZG9tLnRhZ05hbWUgPT0gXCJQUkVcIiB8fCAvcHJlLy50ZXN0KGRvbS5zdHlsZSAmJiBkb20uc3R5bGUud2hpdGVTcGFjZSkpXG4gICAgICAgICAgICB0aGlzLmxvY2FsUHJlc2VydmVXUyA9IHRydWU7XG4gICAgICAgIGxldCBuYW1lID0gZG9tLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJ1bGVJRDtcbiAgICAgICAgaWYgKGxpc3RUYWdzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHRoaXMucGFyc2VyLm5vcm1hbGl6ZUxpc3RzKVxuICAgICAgICAgICAgbm9ybWFsaXplTGlzdChkb20pO1xuICAgICAgICBsZXQgcnVsZSA9ICh0aGlzLm9wdGlvbnMucnVsZUZyb21Ob2RlICYmIHRoaXMub3B0aW9ucy5ydWxlRnJvbU5vZGUoZG9tKSkgfHxcbiAgICAgICAgICAgIChydWxlSUQgPSB0aGlzLnBhcnNlci5tYXRjaFRhZyhkb20sIHRoaXMsIG1hdGNoQWZ0ZXIpKTtcbiAgICAgICAgb3V0OiBpZiAocnVsZSA/IHJ1bGUuaWdub3JlIDogaWdub3JlVGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZUZhbGxiYWNrKGRvbSwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFydWxlIHx8IHJ1bGUuc2tpcCB8fCBydWxlLmNsb3NlUGFyZW50KSB7XG4gICAgICAgICAgICBpZiAocnVsZSAmJiBydWxlLmNsb3NlUGFyZW50KVxuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IE1hdGgubWF4KDAsIHRoaXMub3BlbiAtIDEpO1xuICAgICAgICAgICAgZWxzZSBpZiAocnVsZSAmJiBydWxlLnNraXAubm9kZVR5cGUpXG4gICAgICAgICAgICAgICAgZG9tID0gcnVsZS5za2lwO1xuICAgICAgICAgICAgbGV0IHN5bmMsIG9sZE5lZWRzQmxvY2sgPSB0aGlzLm5lZWRzQmxvY2s7XG4gICAgICAgICAgICBpZiAoYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcC5jb250ZW50Lmxlbmd0aCAmJiB0b3AuY29udGVudFswXS5pc0lubGluZSAmJiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuLS07XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXRvcC50eXBlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWRvbS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWFmRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICAgICAgYnJlYWsgb3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGlubmVyTWFya3MgPSBydWxlICYmIHJ1bGUuc2tpcCA/IG1hcmtzIDogdGhpcy5yZWFkU3R5bGVzKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbGwoZG9tLCBpbm5lck1hcmtzKTtcbiAgICAgICAgICAgIGlmIChzeW5jKVxuICAgICAgICAgICAgICAgIHRoaXMuc3luYyh0b3ApO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gb2xkTmVlZHNCbG9jaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpbm5lck1hcmtzID0gdGhpcy5yZWFkU3R5bGVzKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgaW5uZXJNYXJrcywgcnVsZS5jb25zdW1pbmcgPT09IGZhbHNlID8gcnVsZUlEIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvY2FsUHJlc2VydmVXUyA9IG91dGVyV1M7XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgbGVhZiBET00gbm9kZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgaWdub3JlZFxuICAgIGxlYWZGYWxsYmFjayhkb20sIG1hcmtzKSB7XG4gICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmIHRoaXMudG9wLnR5cGUgJiYgdGhpcy50b3AudHlwZS5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgdGhpcy5hZGRUZXh0Tm9kZShkb20ub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlxcblwiKSwgbWFya3MpO1xuICAgIH1cbiAgICAvLyBDYWxsZWQgZm9yIGlnbm9yZWQgbm9kZXNcbiAgICBpZ25vcmVGYWxsYmFjayhkb20sIG1hcmtzKSB7XG4gICAgICAgIC8vIElnbm9yZWQgQlIgbm9kZXMgc2hvdWxkIGF0IGxlYXN0IGNyZWF0ZSBhbiBpbmxpbmUgY29udGV4dFxuICAgICAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiQlJcIiAmJiAoIXRoaXMudG9wLnR5cGUgfHwgIXRoaXMudG9wLnR5cGUuaW5saW5lQ29udGVudCkpXG4gICAgICAgICAgICB0aGlzLmZpbmRQbGFjZSh0aGlzLnBhcnNlci5zY2hlbWEudGV4dChcIi1cIiksIG1hcmtzLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gUnVuIGFueSBzdHlsZSBwYXJzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlJ3Mgc3R5bGVzLiBFaXRoZXJcbiAgICAvLyByZXR1cm4gYW4gdXBkYXRlZCBhcnJheSBvZiBtYXJrcywgb3IgbnVsbCB0byBpbmRpY2F0ZSBzb21lIG9mIHRoZVxuICAgIC8vIHN0eWxlcyBoYWQgYSBydWxlIHdpdGggYGlnbm9yZWAgc2V0LlxuICAgIHJlYWRTdHlsZXMoZG9tLCBtYXJrcykge1xuICAgICAgICBsZXQgc3R5bGVzID0gZG9tLnN0eWxlO1xuICAgICAgICAvLyBCZWNhdXNlIG1hbnkgcHJvcGVydGllcyB3aWxsIG9ubHkgc2hvdyB1cCBpbiAnbm9ybWFsaXplZCcgZm9ybVxuICAgICAgICAvLyBpbiBgc3R5bGUuaXRlbWAgKGkuZS4gdGV4dC1kZWNvcmF0aW9uIGJlY29tZXNcbiAgICAgICAgLy8gdGV4dC1kZWNvcmF0aW9uLWxpbmUsIHRleHQtZGVjb3JhdGlvbi1jb2xvciwgZXRjKSwgd2UgZGlyZWN0bHlcbiAgICAgICAgLy8gcXVlcnkgdGhlIHN0eWxlcyBtZW50aW9uZWQgaW4gb3VyIHJ1bGVzIGluc3RlYWQgb2YgaXRlcmF0aW5nXG4gICAgICAgIC8vIG92ZXIgdGhlIGl0ZW1zLlxuICAgICAgICBpZiAoc3R5bGVzICYmIHN0eWxlcy5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFyc2VyLm1hdGNoZWRTdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMucGFyc2VyLm1hdGNoZWRTdHlsZXNbaV0sIHZhbHVlID0gc3R5bGVzLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhZnRlciA9IHVuZGVmaW5lZDs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHRoaXMucGFyc2VyLm1hdGNoU3R5bGUobmFtZSwgdmFsdWUsIHRoaXMsIGFmdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmlnbm9yZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmNsZWFyTWFyaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmZpbHRlcihtID0+ICFydWxlLmNsZWFyTWFyayhtKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5jb25jYXQodGhpcy5wYXJzZXIuc2NoZW1hLm1hcmtzW3J1bGUubWFya10uY3JlYXRlKHJ1bGUuYXR0cnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmNvbnN1bWluZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBydWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLy8gTG9vayB1cCBhIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBub2RlLiBJZiBub25lIGFyZSBmb3VuZCwgcmV0dXJuXG4gICAgLy8gZmFsc2UuIE90aGVyd2lzZSwgYXBwbHkgaXQsIHVzZSBpdHMgcmV0dXJuIHZhbHVlIHRvIGRyaXZlIHRoZSB3YXlcbiAgICAvLyB0aGUgbm9kZSdzIGNvbnRlbnQgaXMgd3JhcHBlZCwgYW5kIHJldHVybiB0cnVlLlxuICAgIGFkZEVsZW1lbnRCeVJ1bGUoZG9tLCBydWxlLCBtYXJrcywgY29udGludWVBZnRlcikge1xuICAgICAgICBsZXQgc3luYywgbm9kZVR5cGU7XG4gICAgICAgIGlmIChydWxlLm5vZGUpIHtcbiAgICAgICAgICAgIG5vZGVUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW3J1bGUubm9kZV07XG4gICAgICAgICAgICBpZiAoIW5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IHRoaXMuZW50ZXIobm9kZVR5cGUsIHJ1bGUuYXR0cnMgfHwgbnVsbCwgbWFya3MsIHJ1bGUucHJlc2VydmVXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtzID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuaW5zZXJ0Tm9kZShub2RlVHlwZS5jcmVhdGUocnVsZS5hdHRycyksIG1hcmtzLCBkb20ubm9kZU5hbWUgPT0gXCJCUlwiKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhZkZhbGxiYWNrKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtUeXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm1hcmtzW3J1bGUubWFya107XG4gICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmNvbmNhdChtYXJrVHlwZS5jcmVhdGUocnVsZS5hdHRycykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydEluID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChub2RlVHlwZSAmJiBub2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRpbnVlQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudChkb20sIG1hcmtzLCBjb250aW51ZUFmdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlLmdldENvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50KGRvbSwgdGhpcy5wYXJzZXIuc2NoZW1hKS5mb3JFYWNoKG5vZGUgPT4gdGhpcy5pbnNlcnROb2RlKG5vZGUsIG1hcmtzLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRET00gPSBkb207XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUuY29udGVudEVsZW1lbnQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gZG9tLnF1ZXJ5U2VsZWN0b3IocnVsZS5jb250ZW50RWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQoZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IHJ1bGUuY29udGVudEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLmZpbmRBcm91bmQoZG9tLCBjb250ZW50RE9NLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsKGNvbnRlbnRET00sIG1hcmtzKTtcbiAgICAgICAgICAgIHRoaXMuZmluZEFyb3VuZChkb20sIGNvbnRlbnRET00sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3luYyAmJiB0aGlzLnN5bmMoc3RhcnRJbikpXG4gICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICB9XG4gICAgLy8gQWRkIGFsbCBjaGlsZCBub2RlcyBiZXR3ZWVuIGBzdGFydEluZGV4YCBhbmQgYGVuZEluZGV4YCAob3IgdGhlXG4gICAgLy8gd2hvbGUgbm9kZSwgaWYgbm90IGdpdmVuKS4gSWYgYHN5bmNgIGlzIHBhc3NlZCwgdXNlIGl0IHRvXG4gICAgLy8gc3luY2hyb25pemUgYWZ0ZXIgZXZlcnkgYmxvY2sgZWxlbWVudC5cbiAgICBhZGRBbGwocGFyZW50LCBtYXJrcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gc3RhcnRJbmRleCB8fCAwO1xuICAgICAgICBmb3IgKGxldCBkb20gPSBzdGFydEluZGV4ID8gcGFyZW50LmNoaWxkTm9kZXNbc3RhcnRJbmRleF0gOiBwYXJlbnQuZmlyc3RDaGlsZCwgZW5kID0gZW5kSW5kZXggPT0gbnVsbCA/IG51bGwgOiBwYXJlbnQuY2hpbGROb2Rlc1tlbmRJbmRleF07IGRvbSAhPSBlbmQ7IGRvbSA9IGRvbS5uZXh0U2libGluZywgKytpbmRleCkge1xuICAgICAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRE9NKGRvbSwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZEF0UG9pbnQocGFyZW50LCBpbmRleCk7XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgd2F5IHRvIGZpdCB0aGUgZ2l2ZW4gbm9kZSB0eXBlIGludG8gdGhlIGN1cnJlbnRcbiAgICAvLyBjb250ZXh0LiBNYXkgYWRkIGludGVybWVkaWF0ZSB3cmFwcGVycyBhbmQvb3IgbGVhdmUgbm9uLXNvbGlkXG4gICAgLy8gbm9kZXMgdGhhdCB3ZSdyZSBpbi5cbiAgICBmaW5kUGxhY2Uobm9kZSwgbWFya3MsIGNhdXRpb3VzKSB7XG4gICAgICAgIGxldCByb3V0ZSwgc3luYztcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSB0aGlzLm9wZW4sIHBlbmFsdHkgPSAwOyBkZXB0aCA+PSAwOyBkZXB0aC0tKSB7XG4gICAgICAgICAgICBsZXQgY3ggPSB0aGlzLm5vZGVzW2RlcHRoXTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGN4LmZpbmRXcmFwcGluZyhub2RlKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiAoIXJvdXRlIHx8IHJvdXRlLmxlbmd0aCA+IGZvdW5kLmxlbmd0aCArIHBlbmFsdHkpKSB7XG4gICAgICAgICAgICAgICAgcm91dGUgPSBmb3VuZDtcbiAgICAgICAgICAgICAgICBzeW5jID0gY3g7XG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN4LnNvbGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhdXRpb3VzKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBwZW5hbHR5ICs9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3V0ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnN5bmMoc3luYyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBtYXJrcyA9IHRoaXMuZW50ZXJJbm5lcihyb3V0ZVtpXSwgbnVsbCwgbWFya3MsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gaW5zZXJ0IHRoZSBnaXZlbiBub2RlLCBhZGp1c3RpbmcgdGhlIGNvbnRleHQgd2hlbiBuZWVkZWQuXG4gICAgaW5zZXJ0Tm9kZShub2RlLCBtYXJrcywgY2F1dGlvdXMpIHtcbiAgICAgICAgaWYgKG5vZGUuaXNJbmxpbmUgJiYgdGhpcy5uZWVkc0Jsb2NrICYmICF0aGlzLnRvcC50eXBlKSB7XG4gICAgICAgICAgICBsZXQgYmxvY2sgPSB0aGlzLnRleHRibG9ja0Zyb21Db250ZXh0KCk7XG4gICAgICAgICAgICBpZiAoYmxvY2spXG4gICAgICAgICAgICAgICAgbWFya3MgPSB0aGlzLmVudGVySW5uZXIoYmxvY2ssIG51bGwsIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHRoaXMuZmluZFBsYWNlKG5vZGUsIG1hcmtzLCBjYXV0aW91cyk7XG4gICAgICAgIGlmIChpbm5lck1hcmtzKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgICAgIGlmICh0b3AubWF0Y2gpXG4gICAgICAgICAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoLm1hdGNoVHlwZShub2RlLnR5cGUpO1xuICAgICAgICAgICAgbGV0IG5vZGVNYXJrcyA9IE1hcmsubm9uZTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gb2YgaW5uZXJNYXJrcy5jb25jYXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID8gdG9wLnR5cGUuYWxsb3dzTWFya1R5cGUobS50eXBlKSA6IG1hcmtNYXlBcHBseShtLnR5cGUsIG5vZGUudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIG5vZGVNYXJrcyA9IG0uYWRkVG9TZXQobm9kZU1hcmtzKTtcbiAgICAgICAgICAgIHRvcC5jb250ZW50LnB1c2gobm9kZS5tYXJrKG5vZGVNYXJrcykpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gc3RhcnQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLCBhZGp1c3RpbmcgdGhlIGNvbnRleHQgd2hlblxuICAgIC8vIG5lY2Vzc2FyeS5cbiAgICBlbnRlcih0eXBlLCBhdHRycywgbWFya3MsIHByZXNlcnZlV1MpIHtcbiAgICAgICAgbGV0IGlubmVyTWFya3MgPSB0aGlzLmZpbmRQbGFjZSh0eXBlLmNyZWF0ZShhdHRycyksIG1hcmtzLCBmYWxzZSk7XG4gICAgICAgIGlmIChpbm5lck1hcmtzKVxuICAgICAgICAgICAgaW5uZXJNYXJrcyA9IHRoaXMuZW50ZXJJbm5lcih0eXBlLCBhdHRycywgbWFya3MsIHRydWUsIHByZXNlcnZlV1MpO1xuICAgICAgICByZXR1cm4gaW5uZXJNYXJrcztcbiAgICB9XG4gICAgLy8gT3BlbiBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAgICBlbnRlcklubmVyKHR5cGUsIGF0dHJzLCBtYXJrcywgc29saWQgPSBmYWxzZSwgcHJlc2VydmVXUykge1xuICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2ggJiYgdG9wLm1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB3c09wdGlvbnNGb3IodHlwZSwgcHJlc2VydmVXUywgdG9wLm9wdGlvbnMpO1xuICAgICAgICBpZiAoKHRvcC5vcHRpb25zICYgT1BUX09QRU5fTEVGVCkgJiYgdG9wLmNvbnRlbnQubGVuZ3RoID09IDApXG4gICAgICAgICAgICBvcHRpb25zIHw9IE9QVF9PUEVOX0xFRlQ7XG4gICAgICAgIGxldCBhcHBseU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICBtYXJrcyA9IG1hcmtzLmZpbHRlcihtID0+IHtcbiAgICAgICAgICAgIGlmICh0b3AudHlwZSA/IHRvcC50eXBlLmFsbG93c01hcmtUeXBlKG0udHlwZSkgOiBtYXJrTWF5QXBwbHkobS50eXBlLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5TWFya3MgPSBtLmFkZFRvU2V0KGFwcGx5TWFya3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKG5ldyBOb2RlQ29udGV4dCh0eXBlLCBhdHRycywgYXBwbHlNYXJrcywgc29saWQsIG51bGwsIG9wdGlvbnMpKTtcbiAgICAgICAgdGhpcy5vcGVuKys7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGFsbCBub2RlcyBhYm92ZSB0aGlzLm9wZW4gYXJlIGZpbmlzaGVkIGFuZCBhZGRlZCB0b1xuICAgIC8vIHRoZWlyIHBhcmVudHNcbiAgICBjbG9zZUV4dHJhKG9wZW5FbmQgPSBmYWxzZSkge1xuICAgICAgICBsZXQgaSA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGkgPiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGZvciAoOyBpID4gdGhpcy5vcGVuOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpIC0gMV0uY29udGVudC5wdXNoKHRoaXMubm9kZXNbaV0uZmluaXNoKG9wZW5FbmQpKTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMubGVuZ3RoID0gdGhpcy5vcGVuICsgMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IDA7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSh0aGlzLmlzT3Blbik7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzWzBdLmZpbmlzaCghISh0aGlzLmlzT3BlbiB8fCB0aGlzLm9wdGlvbnMudG9wT3BlbikpO1xuICAgIH1cbiAgICBzeW5jKHRvKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW47IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ub2Rlc1tpXSA9PSB0bykge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlbiA9IGk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxvY2FsUHJlc2VydmVXUykge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbaV0ub3B0aW9ucyB8PSBPUFRfUFJFU0VSVkVfV1M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgY3VycmVudFBvcygpIHtcbiAgICAgICAgdGhpcy5jbG9zZUV4dHJhKCk7XG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLm5vZGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gY29udGVudC5sZW5ndGggLSAxOyBqID49IDA7IGotLSlcbiAgICAgICAgICAgICAgICBwb3MgKz0gY29udGVudFtqXS5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChpKVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIGZpbmRBdFBvaW50KHBhcmVudCwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ubm9kZSA9PSBwYXJlbnQgJiYgdGhpcy5maW5kW2ldLm9mZnNldCA9PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRJbnNpZGUocGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ucG9zID09IG51bGwgJiYgcGFyZW50Lm5vZGVUeXBlID09IDEgJiYgcGFyZW50LmNvbnRhaW5zKHRoaXMuZmluZFtpXS5ub2RlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEFyb3VuZChwYXJlbnQsIGNvbnRlbnQsIGJlZm9yZSkge1xuICAgICAgICBpZiAocGFyZW50ICE9IGNvbnRlbnQgJiYgdGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLnBvcyA9PSBudWxsICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxICYmIHBhcmVudC5jb250YWlucyh0aGlzLmZpbmRbaV0ubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IGNvbnRlbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5maW5kW2ldLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zICYgKGJlZm9yZSA/IDIgOiA0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kSW5UZXh0KHRleHROb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ubm9kZSA9PSB0ZXh0Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcyAtICh0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gdGhpcy5maW5kW2ldLm9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8vIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gY29udGV4dCBzdHJpbmcgbWF0Y2hlcyB0aGlzIGNvbnRleHQuXG4gICAgbWF0Y2hlc0NvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dC5pbmRleE9mKFwifFwiKSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuc3BsaXQoL1xccypcXHxcXHMqLykuc29tZSh0aGlzLm1hdGNoZXNDb250ZXh0LCB0aGlzKTtcbiAgICAgICAgbGV0IHBhcnRzID0gY29udGV4dC5zcGxpdChcIi9cIik7XG4gICAgICAgIGxldCBvcHRpb24gPSB0aGlzLm9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgbGV0IHVzZVJvb3QgPSAhdGhpcy5pc09wZW4gJiYgKCFvcHRpb24gfHwgb3B0aW9uLnBhcmVudC50eXBlID09IHRoaXMubm9kZXNbMF0udHlwZSk7XG4gICAgICAgIGxldCBtaW5EZXB0aCA9IC0ob3B0aW9uID8gb3B0aW9uLmRlcHRoICsgMSA6IDApICsgKHVzZVJvb3QgPyAwIDogMSk7XG4gICAgICAgIGxldCBtYXRjaCA9IChpLCBkZXB0aCkgPT4ge1xuICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGFydCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IHBhcnRzLmxlbmd0aCAtIDEgfHwgaSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBkZXB0aCA+PSBtaW5EZXB0aDsgZGVwdGgtLSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaChpIC0gMSwgZGVwdGgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGRlcHRoID4gMCB8fCAoZGVwdGggPT0gMCAmJiB1c2VSb290KSA/IHRoaXMubm9kZXNbZGVwdGhdLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogb3B0aW9uICYmIGRlcHRoID49IG1pbkRlcHRoID8gb3B0aW9uLm5vZGUoZGVwdGggLSBtaW5EZXB0aCkudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IChuZXh0Lm5hbWUgIT0gcGFydCAmJiAhbmV4dC5pc0luR3JvdXAocGFydCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbWF0Y2gocGFydHMubGVuZ3RoIC0gMSwgdGhpcy5vcGVuKTtcbiAgICB9XG4gICAgdGV4dGJsb2NrRnJvbUNvbnRleHQoKSB7XG4gICAgICAgIGxldCAkY29udGV4dCA9IHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAoJGNvbnRleHQpXG4gICAgICAgICAgICBmb3IgKGxldCBkID0gJGNvbnRleHQuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlZmx0ID0gJGNvbnRleHQubm9kZShkKS5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleEFmdGVyKGQpKS5kZWZhdWx0VHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoZGVmbHQgJiYgZGVmbHQuaXNUZXh0YmxvY2sgJiYgZGVmbHQuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMucGFyc2VyLnNjaGVtYS5ub2Rlc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmIHR5cGUuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGRpcmVjdGx5IG5lc3RlZCBsaXN0IG5vZGVzIHByb2R1Y2VkIGJ5IHNvbWVcbi8vIHRvb2xzIGFuZCBhbGxvd2VkIGJ5IGJyb3dzZXJzIHRvIG1lYW4gdGhhdCB0aGUgbmVzdGVkIGxpc3QgaXNcbi8vIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGxpc3QgaXRlbSBhYm92ZSBpdC5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3QoZG9tKSB7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZCwgcHJldkl0ZW0gPSBudWxsOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IGNoaWxkLm5vZGVUeXBlID09IDEgPyBjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgaWYgKG5hbWUgJiYgbGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgcHJldkl0ZW0pIHtcbiAgICAgICAgICAgIHByZXZJdGVtLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIGNoaWxkID0gcHJldkl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcImxpXCIpIHtcbiAgICAgICAgICAgIHByZXZJdGVtID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSkge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gQXBwbHkgYSBDU1Mgc2VsZWN0b3IuXG5mdW5jdGlvbiBtYXRjaGVzKGRvbSwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gKGRvbS5tYXRjaGVzIHx8IGRvbS5tc01hdGNoZXNTZWxlY3RvciB8fCBkb20ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS5tb3pNYXRjaGVzU2VsZWN0b3IpLmNhbGwoZG9tLCBzZWxlY3Rvcik7XG59XG5mdW5jdGlvbiBjb3B5KG9iaikge1xuICAgIGxldCBjb3B5ID0ge307XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG4vLyBVc2VkIHdoZW4gZmluZGluZyBhIG1hcmsgYXQgdGhlIHRvcCBsZXZlbCBvZiBhIGZyYWdtZW50IHBhcnNlLlxuLy8gQ2hlY2tzIHdoZXRoZXIgaXQgd291bGQgYmUgcmVhc29uYWJsZSB0byBhcHBseSBhIGdpdmVuIG1hcmsgdHlwZSB0b1xuLy8gYSBnaXZlbiBub2RlLCBieSBsb29raW5nIGF0IHRoZSB3YXkgdGhlIG1hcmsgb2NjdXJzIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBtYXJrTWF5QXBwbHkobWFya1R5cGUsIG5vZGVUeXBlKSB7XG4gICAgbGV0IG5vZGVzID0gbm9kZVR5cGUuc2NoZW1hLm5vZGVzO1xuICAgIGZvciAobGV0IG5hbWUgaW4gbm9kZXMpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IG5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIXBhcmVudC5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHNlZW4gPSBbXSwgc2NhbiA9IChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG1hdGNoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2guZWRnZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBtYXRjaC5lZGdlKGkpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG5vZGVUeXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5leHQpIDwgMCAmJiBzY2FuKG5leHQpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHNjYW4ocGFyZW50LmNvbnRlbnRNYXRjaCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBET00gc2VyaWFsaXplciBrbm93cyBob3cgdG8gY29udmVydCBQcm9zZU1pcnJvciBub2RlcyBhbmRcbm1hcmtzIG9mIHZhcmlvdXMgdHlwZXMgdG8gRE9NIG5vZGVzLlxuKi9cbmNsYXNzIERPTVNlcmlhbGl6ZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNlcmlhbGl6ZXIuIGBub2Rlc2Agc2hvdWxkIG1hcCBub2RlIG5hbWVzIHRvIGZ1bmN0aW9uc1xuICAgIHRoYXQgdGFrZSBhIG5vZGUgYW5kIHJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgRE9NLiBgbWFya3NgIGRvZXMgdGhlIHNhbWUgZm9yIG1hcmsgbmFtZXMsIGJ1dCBhbHNvIGdldHMgYW5cbiAgICBhcmd1bWVudCB0aGF0IHRlbGxzIGl0IHdoZXRoZXIgdGhlIG1hcmsncyBjb250ZW50IGlzIGJsb2NrIG9yXG4gICAgaW5saW5lIGNvbnRlbnQgKGZvciB0eXBpY2FsIHVzZSwgaXQnbGwgYWx3YXlzIGJlIGlubGluZSkuIEEgbWFya1xuICAgIHNlcmlhbGl6ZXIgbWF5IGJlIGBudWxsYCB0byBpbmRpY2F0ZSB0aGF0IG1hcmtzIG9mIHRoYXQgdHlwZVxuICAgIHNob3VsZCBub3QgYmUgc2VyaWFsaXplZC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHNlcmlhbGl6YXRpb24gZnVuY3Rpb25zLlxuICAgICovXG4gICAgbWFya3MpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGlzIGZyYWdtZW50IHRvIGEgRE9NIGZyYWdtZW50LiBXaGVuXG4gICAgbm90IGluIHRoZSBicm93c2VyLCB0aGUgYGRvY3VtZW50YCBvcHRpb24sIGNvbnRhaW5pbmcgYSBET01cbiAgICBkb2N1bWVudCwgc2hvdWxkIGJlIHBhc3NlZCBzbyB0aGF0IHRoZSBzZXJpYWxpemVyIGNhbiBjcmVhdGVcbiAgICBub2Rlcy5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZyYWdtZW50KGZyYWdtZW50LCBvcHRpb25zID0ge30sIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IGRvYyhvcHRpb25zKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGxldCB0b3AgPSB0YXJnZXQsIGFjdGl2ZSA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGggfHwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQga2VlcCA9IDAsIHJlbmRlcmVkID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGggJiYgcmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubWFya3NbcmVuZGVyZWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFya3NbbmV4dC50eXBlLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0LmVxKGFjdGl2ZVtrZWVwXVswXSkgfHwgbmV4dC50eXBlLnNwZWMuc3Bhbm5pbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB0b3AgPSBhY3RpdmUucG9wKClbMV07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlbmRlcmVkIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IG5vZGUubWFya3NbcmVuZGVyZWQrK107XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXJrRE9NID0gdGhpcy5zZXJpYWxpemVNYXJrKGFkZCwgbm9kZS5pc0lubGluZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrRE9NKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChbYWRkLCB0b3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZChtYXJrRE9NLmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBtYXJrRE9NLmNvbnRlbnRET00gfHwgbWFya0RPTS5kb207XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3AuYXBwZW5kQ2hpbGQodGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgeyBkb20sIGNvbnRlbnRET00gfSA9IHJlbmRlclNwZWMoZG9jKG9wdGlvbnMpLCB0aGlzLm5vZGVzW25vZGUudHlwZS5uYW1lXShub2RlKSwgbnVsbCwgbm9kZS5hdHRycyk7XG4gICAgICAgIGlmIChjb250ZW50RE9NKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbm90IGFsbG93ZWQgaW4gYSBsZWFmIG5vZGUgc3BlY1wiKTtcbiAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplRnJhZ21lbnQobm9kZS5jb250ZW50LCBvcHRpb25zLCBjb250ZW50RE9NKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBub2RlIHRvIGEgRE9NIG5vZGUuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdVxuICAgIG5lZWQgdG8gc2VyaWFsaXplIGEgcGFydCBvZiBhIGRvY3VtZW50LCBhcyBvcHBvc2VkIHRvIHRoZSB3aG9sZVxuICAgIGRvY3VtZW50LiBUbyBzZXJpYWxpemUgYSB3aG9sZSBkb2N1bWVudCwgdXNlXG4gICAgW2BzZXJpYWxpemVGcmFnbWVudGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5ET01TZXJpYWxpemVyLnNlcmlhbGl6ZUZyYWdtZW50KSBvblxuICAgIGl0cyBbY29udGVudF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUuY29udGVudCkuXG4gICAgKi9cbiAgICBzZXJpYWxpemVOb2RlKG5vZGUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgZG9tID0gdGhpcy5zZXJpYWxpemVOb2RlSW5uZXIobm9kZSwgb3B0aW9ucyk7XG4gICAgICAgIGZvciAobGV0IGkgPSBub2RlLm1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgd3JhcCA9IHRoaXMuc2VyaWFsaXplTWFyayhub2RlLm1hcmtzW2ldLCBub2RlLmlzSW5saW5lLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmICh3cmFwKSB7XG4gICAgICAgICAgICAgICAgKHdyYXAuY29udGVudERPTSB8fCB3cmFwLmRvbSkuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSB3cmFwLmRvbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlcmlhbGl6ZU1hcmsobWFyaywgaW5saW5lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHRvRE9NID0gdGhpcy5tYXJrc1ttYXJrLnR5cGUubmFtZV07XG4gICAgICAgIHJldHVybiB0b0RPTSAmJiByZW5kZXJTcGVjKGRvYyhvcHRpb25zKSwgdG9ET00obWFyaywgaW5saW5lKSwgbnVsbCwgbWFyay5hdHRycyk7XG4gICAgfVxuICAgIHN0YXRpYyByZW5kZXJTcGVjKGRvYywgc3RydWN0dXJlLCB4bWxOUyA9IG51bGwsIGJsb2NrQXJyYXlzSW4pIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TLCBibG9ja0FycmF5c0luKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQnVpbGQgYSBzZXJpYWxpemVyIHVzaW5nIHRoZSBbYHRvRE9NYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnRvRE9NKVxuICAgIHByb3BlcnRpZXMgaW4gYSBzY2hlbWEncyBub2RlIGFuZCBtYXJrIHNwZWNzLlxuICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmRvbVNlcmlhbGl6ZXIgfHxcbiAgICAgICAgICAgIChzY2hlbWEuY2FjaGVkLmRvbVNlcmlhbGl6ZXIgPSBuZXcgRE9NU2VyaWFsaXplcih0aGlzLm5vZGVzRnJvbVNjaGVtYShzY2hlbWEpLCB0aGlzLm1hcmtzRnJvbVNjaGVtYShzY2hlbWEpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBub2RlIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCBhcyBhIGJhc2UgdG8gYnVpbGQgYSBjdXN0b20gc2VyaWFsaXplciBmcm9tLlxuICAgICovXG4gICAgc3RhdGljIG5vZGVzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGdhdGhlclRvRE9NKHNjaGVtYS5ub2Rlcyk7XG4gICAgICAgIGlmICghcmVzdWx0LnRleHQpXG4gICAgICAgICAgICByZXN1bHQudGV4dCA9IG5vZGUgPT4gbm9kZS50ZXh0O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBHYXRoZXIgdGhlIHNlcmlhbGl6ZXJzIGluIGEgc2NoZW1hJ3MgbWFyayBzcGVjcyBpbnRvIGFuIG9iamVjdC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXJrc0Zyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBnYXRoZXJUb0RPTShzY2hlbWEubWFya3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdhdGhlclRvRE9NKG9iaikge1xuICAgIGxldCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9iaikge1xuICAgICAgICBsZXQgdG9ET00gPSBvYmpbbmFtZV0uc3BlYy50b0RPTTtcbiAgICAgICAgaWYgKHRvRE9NKVxuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gdG9ET007XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBkb2Mob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmRvY3VtZW50IHx8IHdpbmRvdy5kb2N1bWVudDtcbn1cbmNvbnN0IHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBzdXNwaWNpb3VzQXR0cmlidXRlcyhhdHRycykge1xuICAgIGxldCB2YWx1ZSA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZS5nZXQoYXR0cnMpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICBzdXNwaWNpb3VzQXR0cmlidXRlQ2FjaGUuc2V0KGF0dHJzLCB2YWx1ZSA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVzSW5uZXIoYXR0cnMpKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzdXNwaWNpb3VzQXR0cmlidXRlc0lubmVyKGF0dHJzKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgZnVuY3Rpb24gc2Nhbih2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVbMF0gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbih2YWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2Nhbih2YWx1ZVtwcm9wXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2NhbihhdHRycyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TLCBibG9ja0FycmF5c0luKSB7XG4gICAgaWYgKHR5cGVvZiBzdHJ1Y3R1cmUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIHsgZG9tOiBkb2MuY3JlYXRlVGV4dE5vZGUoc3RydWN0dXJlKSB9O1xuICAgIGlmIChzdHJ1Y3R1cmUubm9kZVR5cGUgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHsgZG9tOiBzdHJ1Y3R1cmUgfTtcbiAgICBpZiAoc3RydWN0dXJlLmRvbSAmJiBzdHJ1Y3R1cmUuZG9tLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmU7XG4gICAgbGV0IHRhZ05hbWUgPSBzdHJ1Y3R1cmVbMF0sIHN1c3BpY2lvdXM7XG4gICAgaWYgKHR5cGVvZiB0YWdOYW1lICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBhcnJheSBwYXNzZWQgdG8gcmVuZGVyU3BlY1wiKTtcbiAgICBpZiAoYmxvY2tBcnJheXNJbiAmJiAoc3VzcGljaW91cyA9IHN1c3BpY2lvdXNBdHRyaWJ1dGVzKGJsb2NrQXJyYXlzSW4pKSAmJlxuICAgICAgICBzdXNwaWNpb3VzLmluZGV4T2Yoc3RydWN0dXJlKSA+IC0xKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVzaW5nIGFuIGFycmF5IGZyb20gYW4gYXR0cmlidXRlIG9iamVjdCBhcyBhIERPTSBzcGVjLiBUaGlzIG1heSBiZSBhbiBhdHRlbXB0ZWQgY3Jvc3Mgc2l0ZSBzY3JpcHRpbmcgYXR0YWNrLlwiKTtcbiAgICBsZXQgc3BhY2UgPSB0YWdOYW1lLmluZGV4T2YoXCIgXCIpO1xuICAgIGlmIChzcGFjZSA+IDApIHtcbiAgICAgICAgeG1sTlMgPSB0YWdOYW1lLnNsaWNlKDAsIHNwYWNlKTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2Uoc3BhY2UgKyAxKTtcbiAgICB9XG4gICAgbGV0IGNvbnRlbnRET007XG4gICAgbGV0IGRvbSA9ICh4bWxOUyA/IGRvYy5jcmVhdGVFbGVtZW50TlMoeG1sTlMsIHRhZ05hbWUpIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSkpO1xuICAgIGxldCBhdHRycyA9IHN0cnVjdHVyZVsxXSwgc3RhcnQgPSAxO1xuICAgIGlmIChhdHRycyAmJiB0eXBlb2YgYXR0cnMgPT0gXCJvYmplY3RcIiAmJiBhdHRycy5ub2RlVHlwZSA9PSBudWxsICYmICFBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgICAgICBzdGFydCA9IDI7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICBpZiAoYXR0cnNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZSA9IG5hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKHNwYWNlID4gMClcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZU5TKG5hbWUuc2xpY2UoMCwgc3BhY2UpLCBuYW1lLnNsaWNlKHNwYWNlICsgMSksIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdHJ1Y3R1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gc3RydWN0dXJlW2ldO1xuICAgICAgICBpZiAoY2hpbGQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpIDwgc3RydWN0dXJlLmxlbmd0aCAtIDEgfHwgaSA+IHN0YXJ0KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ29udGVudCBob2xlIG11c3QgYmUgdGhlIG9ubHkgY2hpbGQgb2YgaXRzIHBhcmVudCBub2RlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9tLCBjb250ZW50RE9NOiBkb20gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB7IGRvbTogaW5uZXIsIGNvbnRlbnRET006IGlubmVyQ29udGVudCB9ID0gcmVuZGVyU3BlYyhkb2MsIGNoaWxkLCB4bWxOUywgYmxvY2tBcnJheXNJbik7XG4gICAgICAgICAgICBkb20uYXBwZW5kQ2hpbGQoaW5uZXIpO1xuICAgICAgICAgICAgaWYgKGlubmVyQ29udGVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11bHRpcGxlIGNvbnRlbnQgaG9sZXNcIik7XG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IGlubmVyQ29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkb20sIGNvbnRlbnRET00gfTtcbn1cblxuZXhwb3J0IHsgQ29udGVudE1hdGNoLCBET01QYXJzZXIsIERPTVNlcmlhbGl6ZXIsIEZyYWdtZW50LCBNYXJrLCBNYXJrVHlwZSwgTm9kZSwgTm9kZVJhbmdlLCBOb2RlVHlwZSwgUmVwbGFjZUVycm9yLCBSZXNvbHZlZFBvcywgU2NoZW1hLCBTbGljZSB9O1xuIiwiaW1wb3J0IHsgUmVwbGFjZUVycm9yLCBTbGljZSwgRnJhZ21lbnQsIE1hcmtUeXBlLCBNYXJrIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuXG4vLyBSZWNvdmVyeSB2YWx1ZXMgZW5jb2RlIGEgcmFuZ2UgaW5kZXggYW5kIGFuIG9mZnNldC4gVGhleSBhcmVcbi8vIHJlcHJlc2VudGVkIGFzIG51bWJlcnMsIGJlY2F1c2UgdG9ucyBvZiB0aGVtIHdpbGwgYmUgY3JlYXRlZCB3aGVuXG4vLyBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgYSBsYXJnZSBudW1iZXIgb2YgZGVjb3JhdGlvbnMuIFRoZSBudW1iZXInc1xuLy8gbG93ZXIgMTYgYml0cyBwcm92aWRlIHRoZSBpbmRleCwgdGhlIHJlbWFpbmluZyBiaXRzIHRoZSBvZmZzZXQuXG4vL1xuLy8gTm90ZTogV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYml0IHNoaWZ0IG9wZXJhdG9ycyB0byBlbi0gYW5kXG4vLyBkZWNvZGUgdGhlc2UsIHNpbmNlIHRob3NlIGNsaXAgdG8gMzIgYml0cywgd2hpY2ggd2UgbWlnaHQgaW4gcmFyZVxuLy8gY2FzZXMgd2FudCB0byBvdmVyZmxvdy4gQSA2NC1iaXQgZmxvYXQgY2FuIHJlcHJlc2VudCA0OC1iaXRcbi8vIGludGVnZXJzIHByZWNpc2VseS5cbmNvbnN0IGxvd2VyMTYgPSAweGZmZmY7XG5jb25zdCBmYWN0b3IxNiA9IE1hdGgucG93KDIsIDE2KTtcbmZ1bmN0aW9uIG1ha2VSZWNvdmVyKGluZGV4LCBvZmZzZXQpIHsgcmV0dXJuIGluZGV4ICsgb2Zmc2V0ICogZmFjdG9yMTY7IH1cbmZ1bmN0aW9uIHJlY292ZXJJbmRleCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgJiBsb3dlcjE2OyB9XG5mdW5jdGlvbiByZWNvdmVyT2Zmc2V0KHZhbHVlKSB7IHJldHVybiAodmFsdWUgLSAodmFsdWUgJiBsb3dlcjE2KSkgLyBmYWN0b3IxNjsgfVxuY29uc3QgREVMX0JFRk9SRSA9IDEsIERFTF9BRlRFUiA9IDIsIERFTF9BQ1JPU1MgPSA0LCBERUxfU0lERSA9IDg7XG4vKipcbkFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtYXBwZWQgcG9zaXRpb24gd2l0aCBleHRyYVxuaW5mb3JtYXRpb24uXG4qL1xuY2xhc3MgTWFwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBtYXBwZWQgdmVyc2lvbiBvZiB0aGUgcG9zaXRpb24uXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZGVsSW5mbywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmRlbEluZm8gPSBkZWxJbmZvO1xuICAgICAgICB0aGlzLnJlY292ZXIgPSByZWNvdmVyO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgcG9zaXRpb24gd2FzIGRlbGV0ZWQsIHRoYXQgaXMsIHdoZXRoZXIgdGhlXG4gICAgc3RlcCByZW1vdmVkIHRoZSB0b2tlbiBvbiB0aGUgc2lkZSBxdWVyaWVkICh2aWEgdGhlIGBhc3NvY2ApXG4gICAgYXJndW1lbnQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZCgpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiBERUxfU0lERSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIHRva2VuIGJlZm9yZSB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRCZWZvcmUoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgKERFTF9CRUZPUkUgfCBERUxfQUNST1NTKSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoZSB0b2tlbiBhZnRlciB0aGUgbWFwcGVkIHBvc2l0aW9uIHdhcyBkZWxldGVkLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBZnRlcigpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiAoREVMX0FGVEVSIHwgREVMX0FDUk9TUykpID4gMDsgfVxuICAgIC8qKlxuICAgIFRlbGxzIHdoZXRoZXIgYW55IG9mIHRoZSBzdGVwcyBtYXBwZWQgdGhyb3VnaCBkZWxldGVzIGFjcm9zcyB0aGVcbiAgICBwb3NpdGlvbiAoaW5jbHVkaW5nIGJvdGggdGhlIHRva2VuIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlXG4gICAgcG9zaXRpb24pLlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWRBY3Jvc3MoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgREVMX0FDUk9TUykgPiAwOyB9XG59XG4vKipcbkEgbWFwIGRlc2NyaWJpbmcgdGhlIGRlbGV0aW9ucyBhbmQgaW5zZXJ0aW9ucyBtYWRlIGJ5IGEgc3RlcCwgd2hpY2hcbmNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gcG9zaXRpb25zIGluIHRoZVxucHJlLXN0ZXAgdmVyc2lvbiBvZiBhIGRvY3VtZW50IGFuZCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGVcbnBvc3Qtc3RlcCB2ZXJzaW9uLlxuKi9cbmNsYXNzIFN0ZXBNYXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBvc2l0aW9uIG1hcC4gVGhlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50IGFyZVxuICAgIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIG51bWJlcnMsIGluIHdoaWNoIGVhY2ggZ3JvdXAgb2YgdGhyZWVcbiAgICByZXByZXNlbnRzIGEgbW9kaWZpZWQgY2h1bmsgYXMgYFtzdGFydCwgb2xkU2l6ZSwgbmV3U2l6ZV1gLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByYW5nZXMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgaW52ZXJ0ZWQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcztcbiAgICAgICAgdGhpcy5pbnZlcnRlZCA9IGludmVydGVkO1xuICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGggJiYgU3RlcE1hcC5lbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXIodmFsdWUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleCh2YWx1ZSk7XG4gICAgICAgIGlmICghdGhpcy5pbnZlcnRlZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKiAzICsgMl0gLSB0aGlzLnJhbmdlc1tpICogMyArIDFdO1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbaW5kZXggKiAzXSArIGRpZmYgKyByZWNvdmVyT2Zmc2V0KHZhbHVlKTtcbiAgICB9XG4gICAgbWFwUmVzdWx0KHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgZmFsc2UpOyB9XG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIF9tYXAocG9zLCBhc3NvYywgc2ltcGxlKSB7XG4gICAgICAgIGxldCBkaWZmID0gMCwgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBuZXdTaXplID0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2lkZSA9ICFvbGRTaXplID8gYXNzb2MgOiBwb3MgPT0gc3RhcnQgPyAtMSA6IHBvcyA9PSBlbmQgPyAxIDogYXNzb2M7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHN0YXJ0ICsgZGlmZiArIChzaWRlIDwgMCA/IDAgOiBuZXdTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoc2ltcGxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIGxldCByZWNvdmVyID0gcG9zID09IChhc3NvYyA8IDAgPyBzdGFydCA6IGVuZCkgPyBudWxsIDogbWFrZVJlY292ZXIoaSAvIDMsIHBvcyAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICBsZXQgZGVsID0gcG9zID09IHN0YXJ0ID8gREVMX0FGVEVSIDogcG9zID09IGVuZCA/IERFTF9CRUZPUkUgOiBERUxfQUNST1NTO1xuICAgICAgICAgICAgICAgIGlmIChhc3NvYyA8IDAgPyBwb3MgIT0gc3RhcnQgOiBwb3MgIT0gZW5kKVxuICAgICAgICAgICAgICAgICAgICBkZWwgfD0gREVMX1NJREU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBSZXN1bHQocmVzdWx0LCBkZWwsIHJlY292ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlID8gcG9zICsgZGlmZiA6IG5ldyBNYXBSZXN1bHQocG9zICsgZGlmZiwgMCwgbnVsbCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG91Y2hlcyhwb3MsIHJlY292ZXIpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBpbmRleCA9IHJlY292ZXJJbmRleChyZWNvdmVyKTtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0gLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgZW5kID0gc3RhcnQgKyBvbGRTaXplO1xuICAgICAgICAgICAgaWYgKHBvcyA8PSBlbmQgJiYgaSA9PSBpbmRleCAqIDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkaWZmICs9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF0gLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmFuZ2VzIGluY2x1ZGVkIGluXG4gICAgdGhpcyBtYXAuXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgbGV0IG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGRpZmYgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldLCBvbGRTdGFydCA9IHN0YXJ0IC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCksIG5ld1N0YXJ0ID0gc3RhcnQgKyAodGhpcy5pbnZlcnRlZCA/IDAgOiBkaWZmKTtcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgbmV3U2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF07XG4gICAgICAgICAgICBmKG9sZFN0YXJ0LCBvbGRTdGFydCArIG9sZFNpemUsIG5ld1N0YXJ0LCBuZXdTdGFydCArIG5ld1NpemUpO1xuICAgICAgICAgICAgZGlmZiArPSBuZXdTaXplIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcC4gVGhlIHJlc3VsdCBjYW4gYmUgdXNlZCB0b1xuICAgIG1hcCBwb3NpdGlvbnMgaW4gdGhlIHBvc3Qtc3RlcCBkb2N1bWVudCB0byB0aGUgcHJlLXN0ZXAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RlcE1hcCh0aGlzLnJhbmdlcywgIXRoaXMuaW52ZXJ0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaW52ZXJ0ZWQgPyBcIi1cIiA6IFwiXCIpICsgSlNPTi5zdHJpbmdpZnkodGhpcy5yYW5nZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXAgdGhhdCBtb3ZlcyBhbGwgcG9zaXRpb25zIGJ5IG9mZnNldCBgbmAgKHdoaWNoIG1heSBiZVxuICAgIG5lZ2F0aXZlKS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gYXBwbHlpbmcgc3RlcHMgbWVhbnQgZm9yIGFcbiAgICBzdWItZG9jdW1lbnQgdG8gYSBsYXJnZXIgZG9jdW1lbnQsIG9yIHZpY2UtdmVyc2EuXG4gICAgKi9cbiAgICBzdGF0aWMgb2Zmc2V0KG4pIHtcbiAgICAgICAgcmV0dXJuIG4gPT0gMCA/IFN0ZXBNYXAuZW1wdHkgOiBuZXcgU3RlcE1hcChuIDwgMCA/IFswLCAtbiwgMF0gOiBbMCwgMCwgbl0pO1xuICAgIH1cbn1cbi8qKlxuQSBTdGVwTWFwIHRoYXQgY29udGFpbnMgbm8gY2hhbmdlZCByYW5nZXMuXG4qL1xuU3RlcE1hcC5lbXB0eSA9IG5ldyBTdGVwTWFwKFtdKTtcbi8qKlxuQSBtYXBwaW5nIHJlcHJlc2VudHMgYSBwaXBlbGluZSBvZiB6ZXJvIG9yIG1vcmUgW3N0ZXBcbm1hcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcE1hcCkuIEl0IGhhcyBzcGVjaWFsIHByb3Zpc2lvbnMgZm9yIGxvc3NsZXNzbHlcbmhhbmRsaW5nIG1hcHBpbmcgcG9zaXRpb25zIHRocm91Z2ggYSBzZXJpZXMgb2Ygc3RlcHMgaW4gd2hpY2ggc29tZVxuc3RlcHMgYXJlIGludmVydGVkIHZlcnNpb25zIG9mIGVhcmxpZXIgc3RlcHMuIChUaGlzIGNvbWVzIHVwIHdoZW5cbuKAmFtyZWJhc2luZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jdHJhbnNmb3JtLnJlYmFzaW5nKeKAmSBzdGVwcyBmb3JcbmNvbGxhYm9yYXRpb24gb3IgaGlzdG9yeSBtYW5hZ2VtZW50LilcbiovXG5jbGFzcyBNYXBwaW5nIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgbWFwcGluZyB3aXRoIHRoZSBnaXZlbiBwb3NpdGlvbiBtYXBzLlxuICAgICovXG4gICAgY29uc3RydWN0b3IobWFwcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtaXJyb3IsIFxuICAgIC8qKlxuICAgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYG1hcHNgIGFycmF5LCB1c2VkIHdoZW4gYG1hcGAgb3JcbiAgICBgbWFwUmVzdWx0YCBpcyBjYWxsZWQuXG4gICAgKi9cbiAgICBmcm9tID0gMCwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbiBpbiB0aGUgYG1hcHNgIGFycmF5LlxuICAgICovXG4gICAgdG8gPSBtYXBzID8gbWFwcy5sZW5ndGggOiAwKSB7XG4gICAgICAgIHRoaXMubWlycm9yID0gbWlycm9yO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuX21hcHMgPSBtYXBzIHx8IFtdO1xuICAgICAgICB0aGlzLm93bkRhdGEgPSAhKG1hcHMgfHwgbWlycm9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHN0ZXAgbWFwcyBpbiB0aGlzIG1hcHBpbmcuXG4gICAgKi9cbiAgICBnZXQgbWFwcygpIHsgcmV0dXJuIHRoaXMuX21hcHM7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXBwaW5nIHRoYXQgbWFwcyBvbmx5IHRocm91Z2ggYSBwYXJ0IG9mIHRoaXMgb25lLlxuICAgICovXG4gICAgc2xpY2UoZnJvbSA9IDAsIHRvID0gdGhpcy5tYXBzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IE1hcHBpbmcodGhpcy5fbWFwcywgdGhpcy5taXJyb3IsIGZyb20sIHRvKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGEgc3RlcCBtYXAgdG8gdGhlIGVuZCBvZiB0aGlzIG1hcHBpbmcuIElmIGBtaXJyb3JzYCBpc1xuICAgIGdpdmVuLCBpdCBzaG91bGQgYmUgdGhlIGluZGV4IG9mIHRoZSBzdGVwIG1hcCB0aGF0IGlzIHRoZSBtaXJyb3JcbiAgICBpbWFnZSBvZiB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcChtYXAsIG1pcnJvcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm93bkRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcHMgPSB0aGlzLl9tYXBzLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLm1pcnJvciA9IHRoaXMubWlycm9yICYmIHRoaXMubWlycm9yLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLm93bkRhdGEgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG8gPSB0aGlzLl9tYXBzLnB1c2gobWFwKTtcbiAgICAgICAgaWYgKG1pcnJvcnMgIT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuc2V0TWlycm9yKHRoaXMuX21hcHMubGVuZ3RoIC0gMSwgbWlycm9ycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhbGwgdGhlIHN0ZXAgbWFwcyBpbiBhIGdpdmVuIG1hcHBpbmcgdG8gdGhpcyBvbmUgKHByZXNlcnZpbmdcbiAgICBtaXJyb3JpbmcgaW5mb3JtYXRpb24pLlxuICAgICovXG4gICAgYXBwZW5kTWFwcGluZyhtYXBwaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBzdGFydFNpemUgPSB0aGlzLl9tYXBzLmxlbmd0aDsgaSA8IG1hcHBpbmcuX21hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtaXJyID0gbWFwcGluZy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZE1hcChtYXBwaW5nLl9tYXBzW2ldLCBtaXJyICE9IG51bGwgJiYgbWlyciA8IGkgPyBzdGFydFNpemUgKyBtaXJyIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kcyB0aGUgb2Zmc2V0IG9mIHRoZSBzdGVwIG1hcCB0aGF0IG1pcnJvcnMgdGhlIG1hcCBhdCB0aGVcbiAgICBnaXZlbiBvZmZzZXQsIGluIHRoaXMgbWFwcGluZyAoYXMgcGVyIHRoZSBzZWNvbmQgYXJndW1lbnQgdG9cbiAgICBgYXBwZW5kTWFwYCkuXG4gICAgKi9cbiAgICBnZXRNaXJyb3Iobikge1xuICAgICAgICBpZiAodGhpcy5taXJyb3IpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWlycm9yLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pcnJvcltpXSA9PSBuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5taXJyb3JbaSArIChpICUgMiA/IC0xIDogMSldO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNldE1pcnJvcihuLCBtKSB7XG4gICAgICAgIGlmICghdGhpcy5taXJyb3IpXG4gICAgICAgICAgICB0aGlzLm1pcnJvciA9IFtdO1xuICAgICAgICB0aGlzLm1pcnJvci5wdXNoKG4sIG0pO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBlbmQgdGhlIGludmVyc2Ugb2YgdGhlIGdpdmVuIG1hcHBpbmcgdG8gdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhcHBlbmRNYXBwaW5nSW52ZXJ0ZWQobWFwcGluZykge1xuICAgICAgICBmb3IgKGxldCBpID0gbWFwcGluZy5tYXBzLmxlbmd0aCAtIDEsIHRvdGFsU2l6ZSA9IHRoaXMuX21hcHMubGVuZ3RoICsgbWFwcGluZy5fbWFwcy5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgbWlyciA9IG1hcHBpbmcuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRNYXAobWFwcGluZy5fbWFwc1tpXS5pbnZlcnQoKSwgbWlyciAhPSBudWxsICYmIG1pcnIgPiBpID8gdG90YWxTaXplIC0gbWlyciAtIDEgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFwcGluZy5cbiAgICAqL1xuICAgIGludmVydCgpIHtcbiAgICAgICAgbGV0IGludmVyc2UgPSBuZXcgTWFwcGluZztcbiAgICAgICAgaW52ZXJzZS5hcHBlbmRNYXBwaW5nSW52ZXJ0ZWQodGhpcyk7XG4gICAgICAgIHJldHVybiBpbnZlcnNlO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgbWFwcGluZy5cbiAgICAqL1xuICAgIG1hcChwb3MsIGFzc29jID0gMSkge1xuICAgICAgICBpZiAodGhpcy5taXJyb3IpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIHRydWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcm9tOyBpIDwgdGhpcy50bzsgaSsrKVxuICAgICAgICAgICAgcG9zID0gdGhpcy5fbWFwc1tpXS5tYXAocG9zLCBhc3NvYyk7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXBwaW5nLCByZXR1cm5pbmcgYSBtYXBwaW5nXG4gICAgcmVzdWx0LlxuICAgICovXG4gICAgbWFwUmVzdWx0KHBvcywgYXNzb2MgPSAxKSB7IHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgZmFsc2UpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBfbWFwKHBvcywgYXNzb2MsIHNpbXBsZSkge1xuICAgICAgICBsZXQgZGVsSW5mbyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyb207IGkgPCB0aGlzLnRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSB0aGlzLl9tYXBzW2ldLCByZXN1bHQgPSBtYXAubWFwUmVzdWx0KHBvcywgYXNzb2MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZWNvdmVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29yciA9IHRoaXMuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgICAgIGlmIChjb3JyICE9IG51bGwgJiYgY29yciA+IGkgJiYgY29yciA8IHRoaXMudG8pIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNvcnI7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuX21hcHNbY29ycl0ucmVjb3ZlcihyZXN1bHQucmVjb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbEluZm8gfD0gcmVzdWx0LmRlbEluZm87XG4gICAgICAgICAgICBwb3MgPSByZXN1bHQucG9zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW1wbGUgPyBwb3MgOiBuZXcgTWFwUmVzdWx0KHBvcywgZGVsSW5mbywgbnVsbCk7XG4gICAgfVxufVxuXG5jb25zdCBzdGVwc0J5SUQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqXG5BIHN0ZXAgb2JqZWN0IHJlcHJlc2VudHMgYW4gYXRvbWljIGNoYW5nZS4gSXQgZ2VuZXJhbGx5IGFwcGxpZXNcbm9ubHkgdG8gdGhlIGRvY3VtZW50IGl0IHdhcyBjcmVhdGVkIGZvciwgc2luY2UgdGhlIHBvc2l0aW9uc1xuc3RvcmVkIGluIGl0IHdpbGwgb25seSBtYWtlIHNlbnNlIGZvciB0aGF0IGRvY3VtZW50LlxuXG5OZXcgc3RlcHMgYXJlIGRlZmluZWQgYnkgY3JlYXRpbmcgY2xhc3NlcyB0aGF0IGV4dGVuZCBgU3RlcGAsXG5vdmVycmlkaW5nIHRoZSBgYXBwbHlgLCBgaW52ZXJ0YCwgYG1hcGAsIGBnZXRNYXBgIGFuZCBgZnJvbUpTT05gXG5tZXRob2RzLCBhbmQgcmVnaXN0ZXJpbmcgeW91ciBjbGFzcyB3aXRoIGEgdW5pcXVlXG5KU09OLXNlcmlhbGl6YXRpb24gaWRlbnRpZmllciB1c2luZ1xuW2BTdGVwLmpzb25JRGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcF5qc29uSUQpLlxuKi9cbmNsYXNzIFN0ZXAge1xuICAgIC8qKlxuICAgIEdldCB0aGUgc3RlcCBtYXAgdGhhdCByZXByZXNlbnRzIHRoZSBjaGFuZ2VzIG1hZGUgYnkgdGhpcyBzdGVwLFxuICAgIGFuZCB3aGljaCBjYW4gYmUgdXNlZCB0byB0cmFuc2Zvcm0gYmV0d2VlbiBwb3NpdGlvbnMgaW4gdGhlIG9sZFxuICAgIGFuZCB0aGUgbmV3IGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0TWFwKCkgeyByZXR1cm4gU3RlcE1hcC5lbXB0eTsgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtZXJnZSB0aGlzIHN0ZXAgd2l0aCBhbm90aGVyIG9uZSwgdG8gYmUgYXBwbGllZCBkaXJlY3RseVxuICAgIGFmdGVyIGl0LiBSZXR1cm5zIHRoZSBtZXJnZWQgc3RlcCB3aGVuIHBvc3NpYmxlLCBudWxsIGlmIHRoZVxuICAgIHN0ZXBzIGNhbid0IGJlIG1lcmdlZC5cbiAgICAqL1xuICAgIG1lcmdlKG90aGVyKSB7IHJldHVybiBudWxsOyB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzdGVwIGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFdpbGwgY2FsbFxuICAgIHRocm91Z2ggdG8gdGhlIHN0ZXAgY2xhc3MnIG93biBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8ICFqc29uLnN0ZXBUeXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgdHlwZSA9IHN0ZXBzQnlJRFtqc29uLnN0ZXBUeXBlXTtcbiAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIHN0ZXAgdHlwZSAke2pzb24uc3RlcFR5cGV9IGRlZmluZWRgKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuZnJvbUpTT04oc2NoZW1hLCBqc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBzZXJpYWxpemUgc3RlcHMgdG8gSlNPTiwgZWFjaCBzdGVwIG5lZWRzIGEgc3RyaW5nXG4gICAgSUQgdG8gYXR0YWNoIHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBVc2UgdGhpcyBtZXRob2QgdG9cbiAgICByZWdpc3RlciBhbiBJRCBmb3IgeW91ciBzdGVwIGNsYXNzZXMuIFRyeSB0byBwaWNrIHNvbWV0aGluZ1xuICAgIHRoYXQncyB1bmxpa2VseSB0byBjbGFzaCB3aXRoIHN0ZXBzIGZyb20gb3RoZXIgbW9kdWxlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBqc29uSUQoaWQsIHN0ZXBDbGFzcykge1xuICAgICAgICBpZiAoaWQgaW4gc3RlcHNCeUlEKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEdXBsaWNhdGUgdXNlIG9mIHN0ZXAgSlNPTiBJRCBcIiArIGlkKTtcbiAgICAgICAgc3RlcHNCeUlEW2lkXSA9IHN0ZXBDbGFzcztcbiAgICAgICAgc3RlcENsYXNzLnByb3RvdHlwZS5qc29uSUQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHN0ZXBDbGFzcztcbiAgICB9XG59XG4vKipcblRoZSByZXN1bHQgb2YgW2FwcGx5aW5nXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXAuYXBwbHkpIGEgc3RlcC4gQ29udGFpbnMgZWl0aGVyIGFcbm5ldyBkb2N1bWVudCBvciBhIGZhaWx1cmUgdmFsdWUuXG4qL1xuY2xhc3MgU3RlcFJlc3VsdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHJhbnNmb3JtZWQgZG9jdW1lbnQsIGlmIHN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBkb2MsIFxuICAgIC8qKlxuICAgIFRoZSBmYWlsdXJlIG1lc3NhZ2UsIGlmIHVuc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIGZhaWxlZCkge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgdGhpcy5mYWlsZWQgPSBmYWlsZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHN1Y2Nlc3NmdWwgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBzdGF0aWMgb2soZG9jKSB7IHJldHVybiBuZXcgU3RlcFJlc3VsdChkb2MsIG51bGwpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZmFpbGVkIHN0ZXAgcmVzdWx0LlxuICAgICovXG4gICAgc3RhdGljIGZhaWwobWVzc2FnZSkgeyByZXR1cm4gbmV3IFN0ZXBSZXN1bHQobnVsbCwgbWVzc2FnZSk7IH1cbiAgICAvKipcbiAgICBDYWxsIFtgTm9kZS5yZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVwbGFjZSkgd2l0aCB0aGUgZ2l2ZW5cbiAgICBhcmd1bWVudHMuIENyZWF0ZSBhIHN1Y2Nlc3NmdWwgcmVzdWx0IGlmIGl0IHN1Y2NlZWRzLCBhbmQgYVxuICAgIGZhaWxlZCBvbmUgaWYgaXQgdGhyb3dzIGEgYFJlcGxhY2VFcnJvcmAuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVJlcGxhY2UoZG9jLCBmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0Lm9rKGRvYy5yZXBsYWNlKGZyb20sIHRvLCBzbGljZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlcGxhY2VFcnJvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKGUubWVzc2FnZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXBGcmFnbWVudChmcmFnbWVudCwgZiwgcGFyZW50KSB7XG4gICAgbGV0IG1hcHBlZCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhZ21lbnQuY2hpbGRDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGZyYWdtZW50LmNoaWxkKGkpO1xuICAgICAgICBpZiAoY2hpbGQuY29udGVudC5zaXplKVxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5jb3B5KG1hcEZyYWdtZW50KGNoaWxkLmNvbnRlbnQsIGYsIGNoaWxkKSk7XG4gICAgICAgIGlmIChjaGlsZC5pc0lubGluZSlcbiAgICAgICAgICAgIGNoaWxkID0gZihjaGlsZCwgcGFyZW50LCBpKTtcbiAgICAgICAgbWFwcGVkLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgICByZXR1cm4gRnJhZ21lbnQuZnJvbUFycmF5KG1hcHBlZCk7XG59XG4vKipcbkFkZCBhIG1hcmsgdG8gYWxsIGlubGluZSBjb250ZW50IGJldHdlZW4gdHdvIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBBZGRNYXJrU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmsgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgbWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgbWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHRvIGFkZC5cbiAgICAqL1xuICAgIG1hcmspIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG9sZFNsaWNlID0gZG9jLnNsaWNlKHRoaXMuZnJvbSwgdGhpcy50byksICRmcm9tID0gZG9jLnJlc29sdmUodGhpcy5mcm9tKTtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRmcm9tLm5vZGUoJGZyb20uc2hhcmVkRGVwdGgodGhpcy50bykpO1xuICAgICAgICBsZXQgc2xpY2UgPSBuZXcgU2xpY2UobWFwRnJhZ21lbnQob2xkU2xpY2UuY29udGVudCwgKG5vZGUsIHBhcmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFub2RlLmlzQXRvbSB8fCAhcGFyZW50LnR5cGUuYWxsb3dzTWFya1R5cGUodGhpcy5tYXJrLnR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFyayh0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICB9LCBwYXJlbnQpLCBvbGRTbGljZS5vcGVuU3RhcnQsIG9sZFNsaWNlLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgc2xpY2UpO1xuICAgIH1cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTWFya1N0ZXAodGhpcy5mcm9tLCB0aGlzLnRvLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy50bywgLTEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkICYmIHRvLmRlbGV0ZWQgfHwgZnJvbS5wb3MgPj0gdG8ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTWFya1N0ZXAoZnJvbS5wb3MsIHRvLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQWRkTWFya1N0ZXAgJiZcbiAgICAgICAgICAgIG90aGVyLm1hcmsuZXEodGhpcy5tYXJrKSAmJlxuICAgICAgICAgICAgdGhpcy5mcm9tIDw9IG90aGVyLnRvICYmIHRoaXMudG8gPj0gb3RoZXIuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTWFya1N0ZXAoTWF0aC5taW4odGhpcy5mcm9tLCBvdGhlci5mcm9tKSwgTWF0aC5tYXgodGhpcy50bywgb3RoZXIudG8pLCB0aGlzLm1hcmspO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJhZGRNYXJrXCIsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSxcbiAgICAgICAgICAgIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgQWRkTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTWFya1N0ZXAoanNvbi5mcm9tLCBqc29uLnRvLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYWRkTWFya1wiLCBBZGRNYXJrU3RlcCk7XG4vKipcblJlbW92ZSBhIG1hcmsgZnJvbSBhbGwgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLlxuKi9cbmNsYXNzIFJlbW92ZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyay1yZW1vdmluZyBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSB1bm1hcmtlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIHVubWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHRvIHJlbW92ZS5cbiAgICAqL1xuICAgIG1hcmspIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG9sZFNsaWNlID0gZG9jLnNsaWNlKHRoaXMuZnJvbSwgdGhpcy50byk7XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShtYXBGcmFnbWVudChvbGRTbGljZS5jb250ZW50LCBub2RlID0+IHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm1hcmsodGhpcy5tYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICB9LCBkb2MpLCBvbGRTbGljZS5vcGVuU3RhcnQsIG9sZFNsaWNlLm9wZW5FbmQpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgc2xpY2UpO1xuICAgIH1cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTWFya1N0ZXAodGhpcy5mcm9tLCB0aGlzLnRvLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy50bywgLTEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkICYmIHRvLmRlbGV0ZWQgfHwgZnJvbS5wb3MgPj0gdG8ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTWFya1N0ZXAoZnJvbS5wb3MsIHRvLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgUmVtb3ZlTWFya1N0ZXAgJiZcbiAgICAgICAgICAgIG90aGVyLm1hcmsuZXEodGhpcy5tYXJrKSAmJlxuICAgICAgICAgICAgdGhpcy5mcm9tIDw9IG90aGVyLnRvICYmIHRoaXMudG8gPj0gb3RoZXIuZnJvbSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTWFya1N0ZXAoTWF0aC5taW4odGhpcy5mcm9tLCBvdGhlci5mcm9tKSwgTWF0aC5tYXgodGhpcy50bywgb3RoZXIudG8pLCB0aGlzLm1hcmspO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJyZW1vdmVNYXJrXCIsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSxcbiAgICAgICAgICAgIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8gfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgUmVtb3ZlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTWFya1N0ZXAoanNvbi5mcm9tLCBqc29uLnRvLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwicmVtb3ZlTWFya1wiLCBSZW1vdmVNYXJrU3RlcCk7XG4vKipcbkFkZCBhIG1hcmsgdG8gYSBzcGVjaWZpYyBub2RlLlxuKi9cbmNsYXNzIEFkZE5vZGVNYXJrU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5vZGUgbWFyayBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgbm9kZS5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gYWRkLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBub2RlID0gZG9jLm5vZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJObyBub2RlIGF0IG1hcmsgc3RlcCdzIHBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IG5vZGUudHlwZS5jcmVhdGUobm9kZS5hdHRycywgbnVsbCwgdGhpcy5tYXJrLmFkZFRvU2V0KG5vZGUubWFya3MpKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIGxldCBub2RlID0gZG9jLm5vZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbmV3U2V0ID0gdGhpcy5tYXJrLmFkZFRvU2V0KG5vZGUubWFya3MpO1xuICAgICAgICAgICAgaWYgKG5ld1NldC5sZW5ndGggPT0gbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5tYXJrc1tpXS5pc0luU2V0KG5ld1NldCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgbm9kZS5tYXJrc1tpXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGROb2RlTWFya1N0ZXAodGhpcy5wb3MsIHRoaXMubWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAodGhpcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBBZGROb2RlTWFya1N0ZXAocG9zLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJhZGROb2RlTWFya1wiLCBwb3M6IHRoaXMucG9zLCBtYXJrOiB0aGlzLm1hcmsudG9KU09OKCkgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgQWRkTm9kZU1hcmtTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcChqc29uLnBvcywgc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uLm1hcmspKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcImFkZE5vZGVNYXJrXCIsIEFkZE5vZGVNYXJrU3RlcCk7XG4vKipcblJlbW92ZSBhIG1hcmsgZnJvbSBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgUmVtb3ZlTm9kZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyay1yZW1vdmluZyBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgbm9kZS5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gcmVtb3ZlLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBub2RlID0gZG9jLm5vZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJObyBub2RlIGF0IG1hcmsgc3RlcCdzIHBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IG5vZGUudHlwZS5jcmVhdGUobm9kZS5hdHRycywgbnVsbCwgdGhpcy5tYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLm1hcmsuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IFJlbW92ZU5vZGVNYXJrU3RlcChwb3MucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcInJlbW92ZU5vZGVNYXJrXCIsIHBvczogdGhpcy5wb3MsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZW1vdmVOb2RlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKGpzb24ucG9zLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwicmVtb3ZlTm9kZU1hcmtcIiwgUmVtb3ZlTm9kZU1hcmtTdGVwKTtcblxuLyoqXG5SZXBsYWNlIGEgcGFydCBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIHNsaWNlIG9mIG5ldyBjb250ZW50LlxuKi9cbmNsYXNzIFJlcGxhY2VTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgVGhlIGdpdmVuIGBzbGljZWAgc2hvdWxkIGZpdCB0aGUgJ2dhcCcgYmV0d2VlbiBgZnJvbWAgYW5kXG4gICAgYHRvYOKAlHRoZSBkZXB0aHMgbXVzdCBsaW5lIHVwLCBhbmQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzIG11c3QgYmVcbiAgICBhYmxlIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSBvcGVuIHNpZGVzIG9mIHRoZSBzbGljZS4gV2hlblxuICAgIGBzdHJ1Y3R1cmVgIGlzIHRydWUsIHRoZSBzdGVwIHdpbGwgZmFpbCBpZiB0aGUgY29udGVudCBiZXR3ZWVuXG4gICAgZnJvbSBhbmQgdG8gaXMgbm90IGp1c3QgYSBzZXF1ZW5jZSBvZiBjbG9zaW5nIGFuZCB0aGVuIG9wZW5pbmdcbiAgICB0b2tlbnMgKHRoaXMgaXMgdG8gZ3VhcmQgYWdhaW5zdCByZWJhc2VkIHJlcGxhY2Ugc3RlcHNcbiAgICBvdmVyd3JpdGluZyBzb21ldGhpbmcgdGhleSB3ZXJlbid0IHN1cHBvc2VkIHRvKS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgc2xpY2UgdG8gaW5zZXJ0LlxuICAgICovXG4gICAgc2xpY2UsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RydWN0dXJlID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlID0gc3RydWN0dXJlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlICYmIGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvKSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJTdHJ1Y3R1cmUgcmVwbGFjZSB3b3VsZCBvdmVyd3JpdGUgY29udGVudFwiKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMuc2xpY2UpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RlcE1hcChbdGhpcy5mcm9tLCB0aGlzLnRvIC0gdGhpcy5mcm9tLCB0aGlzLnNsaWNlLnNpemVdKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKHRoaXMuZnJvbSwgdGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplLCBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWRBY3Jvc3MgJiYgdG8uZGVsZXRlZEFjcm9zcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGZyb20ucG9zLCBNYXRoLm1heChmcm9tLnBvcywgdG8ucG9zKSwgdGhpcy5zbGljZSwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFJlcGxhY2VTdGVwKSB8fCBvdGhlci5zdHJ1Y3R1cmUgfHwgdGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuZnJvbSArIHRoaXMuc2xpY2Uuc2l6ZSA9PSBvdGhlci5mcm9tICYmICF0aGlzLnNsaWNlLm9wZW5FbmQgJiYgIW90aGVyLnNsaWNlLm9wZW5TdGFydCkge1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5zbGljZS5zaXplICsgb3RoZXIuc2xpY2Uuc2l6ZSA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZSh0aGlzLnNsaWNlLmNvbnRlbnQuYXBwZW5kKG90aGVyLnNsaWNlLmNvbnRlbnQpLCB0aGlzLnNsaWNlLm9wZW5TdGFydCwgb3RoZXIuc2xpY2Uub3BlbkVuZCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKHRoaXMuZnJvbSwgdGhpcy50byArIChvdGhlci50byAtIG90aGVyLmZyb20pLCBzbGljZSwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG90aGVyLnRvID09IHRoaXMuZnJvbSAmJiAhdGhpcy5zbGljZS5vcGVuU3RhcnQgJiYgIW90aGVyLnNsaWNlLm9wZW5FbmQpIHtcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuc2xpY2Uuc2l6ZSArIG90aGVyLnNsaWNlLnNpemUgPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2Uob3RoZXIuc2xpY2UuY29udGVudC5hcHBlbmQodGhpcy5zbGljZS5jb250ZW50KSwgb3RoZXIuc2xpY2Uub3BlblN0YXJ0LCB0aGlzLnNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcChvdGhlci5mcm9tLCB0aGlzLnRvLCBzbGljZSwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQganNvbiA9IHsgc3RlcFR5cGU6IFwicmVwbGFjZVwiLCBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvIH07XG4gICAgICAgIGlmICh0aGlzLnNsaWNlLnNpemUpXG4gICAgICAgICAgICBqc29uLnNsaWNlID0gdGhpcy5zbGljZS50b0pTT04oKTtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAganNvbi5zdHJ1Y3R1cmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgUmVwbGFjZVN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoanNvbi5mcm9tLCBqc29uLnRvLCBTbGljZS5mcm9tSlNPTihzY2hlbWEsIGpzb24uc2xpY2UpLCAhIWpzb24uc3RydWN0dXJlKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcInJlcGxhY2VcIiwgUmVwbGFjZVN0ZXApO1xuLyoqXG5SZXBsYWNlIGEgcGFydCBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIHNsaWNlIG9mIGNvbnRlbnQsIGJ1dFxucHJlc2VydmUgYSByYW5nZSBvZiB0aGUgcmVwbGFjZWQgY29udGVudCBieSBtb3ZpbmcgaXQgaW50byB0aGVcbnNsaWNlLlxuKi9cbmNsYXNzIFJlcGxhY2VBcm91bmRTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcmVwbGFjZS1hcm91bmQgc3RlcCB3aXRoIHRoZSBnaXZlbiByYW5nZSBhbmQgZ2FwLlxuICAgIGBpbnNlcnRgIHNob3VsZCBiZSB0aGUgcG9pbnQgaW4gdGhlIHNsaWNlIGludG8gd2hpY2ggdGhlIGNvbnRlbnRcbiAgICBvZiB0aGUgZ2FwIHNob3VsZCBiZSBtb3ZlZC4gYHN0cnVjdHVyZWAgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXNcbiAgICBpdCBoYXMgaW4gdGhlIFtgUmVwbGFjZVN0ZXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlJlcGxhY2VTdGVwKSBjbGFzcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgcHJlc2VydmVkIHJhbmdlLlxuICAgICovXG4gICAgZ2FwRnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiBwcmVzZXJ2ZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBnYXBUbywgXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlIHRvIGluc2VydC5cbiAgICAqL1xuICAgIHNsaWNlLCBcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gaW4gdGhlIHNsaWNlIHdoZXJlIHRoZSBwcmVzZXJ2ZWQgcmFuZ2Ugc2hvdWxkIGJlXG4gICAgaW5zZXJ0ZWQuXG4gICAgKi9cbiAgICBpbnNlcnQsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RydWN0dXJlID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLmdhcEZyb20gPSBnYXBGcm9tO1xuICAgICAgICB0aGlzLmdhcFRvID0gZ2FwVG87XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlID0gc3RydWN0dXJlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlICYmIChjb250ZW50QmV0d2Vlbihkb2MsIHRoaXMuZnJvbSwgdGhpcy5nYXBGcm9tKSB8fFxuICAgICAgICAgICAgY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmdhcFRvLCB0aGlzLnRvKSkpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiU3RydWN0dXJlIGdhcC1yZXBsYWNlIHdvdWxkIG92ZXJ3cml0ZSBjb250ZW50XCIpO1xuICAgICAgICBsZXQgZ2FwID0gZG9jLnNsaWNlKHRoaXMuZ2FwRnJvbSwgdGhpcy5nYXBUbyk7XG4gICAgICAgIGlmIChnYXAub3BlblN0YXJ0IHx8IGdhcC5vcGVuRW5kKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIkdhcCBpcyBub3QgYSBmbGF0IHJhbmdlXCIpO1xuICAgICAgICBsZXQgaW5zZXJ0ZWQgPSB0aGlzLnNsaWNlLmluc2VydEF0KHRoaXMuaW5zZXJ0LCBnYXAuY29udGVudCk7XG4gICAgICAgIGlmICghaW5zZXJ0ZWQpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiQ29udGVudCBkb2VzIG5vdCBmaXQgaW4gZ2FwXCIpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgaW5zZXJ0ZWQpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RlcE1hcChbdGhpcy5mcm9tLCB0aGlzLmdhcEZyb20gLSB0aGlzLmZyb20sIHRoaXMuaW5zZXJ0LFxuICAgICAgICAgICAgdGhpcy5nYXBUbywgdGhpcy50byAtIHRoaXMuZ2FwVG8sIHRoaXMuc2xpY2Uuc2l6ZSAtIHRoaXMuaW5zZXJ0XSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IGdhcCA9IHRoaXMuZ2FwVG8gLSB0aGlzLmdhcEZyb207XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAodGhpcy5mcm9tLCB0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUgKyBnYXAsIHRoaXMuZnJvbSArIHRoaXMuaW5zZXJ0LCB0aGlzLmZyb20gKyB0aGlzLmluc2VydCArIGdhcCwgZG9jLnNsaWNlKHRoaXMuZnJvbSwgdGhpcy50bykucmVtb3ZlQmV0d2Vlbih0aGlzLmdhcEZyb20gLSB0aGlzLmZyb20sIHRoaXMuZ2FwVG8gLSB0aGlzLmZyb20pLCB0aGlzLmdhcEZyb20gLSB0aGlzLmZyb20sIHRoaXMuc3RydWN0dXJlKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgbGV0IGdhcEZyb20gPSB0aGlzLmZyb20gPT0gdGhpcy5nYXBGcm9tID8gZnJvbS5wb3MgOiBtYXBwaW5nLm1hcCh0aGlzLmdhcEZyb20sIC0xKTtcbiAgICAgICAgbGV0IGdhcFRvID0gdGhpcy50byA9PSB0aGlzLmdhcFRvID8gdG8ucG9zIDogbWFwcGluZy5tYXAodGhpcy5nYXBUbywgMSk7XG4gICAgICAgIGlmICgoZnJvbS5kZWxldGVkQWNyb3NzICYmIHRvLmRlbGV0ZWRBY3Jvc3MpIHx8IGdhcEZyb20gPCBmcm9tLnBvcyB8fCBnYXBUbyA+IHRvLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGZyb20ucG9zLCB0by5wb3MsIGdhcEZyb20sIGdhcFRvLCB0aGlzLnNsaWNlLCB0aGlzLmluc2VydCwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0geyBzdGVwVHlwZTogXCJyZXBsYWNlQXJvdW5kXCIsIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8sXG4gICAgICAgICAgICBnYXBGcm9tOiB0aGlzLmdhcEZyb20sIGdhcFRvOiB0aGlzLmdhcFRvLCBpbnNlcnQ6IHRoaXMuaW5zZXJ0IH07XG4gICAgICAgIGlmICh0aGlzLnNsaWNlLnNpemUpXG4gICAgICAgICAgICBqc29uLnNsaWNlID0gdGhpcy5zbGljZS50b0pTT04oKTtcbiAgICAgICAgaWYgKHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAganNvbi5zdHJ1Y3R1cmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5mcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24udG8gIT0gXCJudW1iZXJcIiB8fFxuICAgICAgICAgICAgdHlwZW9mIGpzb24uZ2FwRnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmdhcFRvICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaW5zZXJ0ICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VBcm91bmRTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKGpzb24uZnJvbSwganNvbi50bywganNvbi5nYXBGcm9tLCBqc29uLmdhcFRvLCBTbGljZS5mcm9tSlNPTihzY2hlbWEsIGpzb24uc2xpY2UpLCBqc29uLmluc2VydCwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlQXJvdW5kXCIsIFJlcGxhY2VBcm91bmRTdGVwKTtcbmZ1bmN0aW9uIGNvbnRlbnRCZXR3ZWVuKGRvYywgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgZGlzdCA9IHRvIC0gZnJvbSwgZGVwdGggPSAkZnJvbS5kZXB0aDtcbiAgICB3aGlsZSAoZGlzdCA+IDAgJiYgZGVwdGggPiAwICYmICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRmcm9tLm5vZGUoZGVwdGgpLmNoaWxkQ291bnQpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZGlzdC0tO1xuICAgIH1cbiAgICBpZiAoZGlzdCA+IDApIHtcbiAgICAgICAgbGV0IG5leHQgPSAkZnJvbS5ub2RlKGRlcHRoKS5tYXliZUNoaWxkKCRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpKTtcbiAgICAgICAgd2hpbGUgKGRpc3QgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dC5maXJzdENoaWxkO1xuICAgICAgICAgICAgZGlzdC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gYWRkTWFyayh0ciwgZnJvbSwgdG8sIG1hcmspIHtcbiAgICBsZXQgcmVtb3ZlZCA9IFtdLCBhZGRlZCA9IFtdO1xuICAgIGxldCByZW1vdmluZywgYWRkaW5nO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MsIHBhcmVudCkgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBtYXJrcyA9IG5vZGUubWFya3M7XG4gICAgICAgIGlmICghbWFyay5pc0luU2V0KG1hcmtzKSAmJiBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrLnR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChwb3MsIGZyb20pLCBlbmQgPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0byk7XG4gICAgICAgICAgICBsZXQgbmV3U2V0ID0gbWFyay5hZGRUb1NldChtYXJrcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXJrc1tpXS5pc0luU2V0KG5ld1NldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92aW5nICYmIHJlbW92aW5nLnRvID09IHN0YXJ0ICYmIHJlbW92aW5nLm1hcmsuZXEobWFya3NbaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcudG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQucHVzaChyZW1vdmluZyA9IG5ldyBSZW1vdmVNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrc1tpXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhZGRpbmcgJiYgYWRkaW5nLnRvID09IHN0YXJ0KVxuICAgICAgICAgICAgICAgIGFkZGluZy50byA9IGVuZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKGFkZGluZyA9IG5ldyBBZGRNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZW1vdmVkLmZvckVhY2gocyA9PiB0ci5zdGVwKHMpKTtcbiAgICBhZGRlZC5mb3JFYWNoKHMgPT4gdHIuc3RlcChzKSk7XG59XG5mdW5jdGlvbiByZW1vdmVNYXJrKHRyLCBmcm9tLCB0bywgbWFyaykge1xuICAgIGxldCBtYXRjaGVkID0gW10sIHN0ZXAgPSAwO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgaWYgKCFub2RlLmlzSW5saW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdGVwKys7XG4gICAgICAgIGxldCB0b1JlbW92ZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXJrIGluc3RhbmNlb2YgTWFya1R5cGUpIHtcbiAgICAgICAgICAgIGxldCBzZXQgPSBub2RlLm1hcmtzLCBmb3VuZDtcbiAgICAgICAgICAgIHdoaWxlIChmb3VuZCA9IG1hcmsuaXNJblNldChzZXQpKSB7XG4gICAgICAgICAgICAgICAgKHRvUmVtb3ZlIHx8ICh0b1JlbW92ZSA9IFtdKSkucHVzaChmb3VuZCk7XG4gICAgICAgICAgICAgICAgc2V0ID0gZm91bmQucmVtb3ZlRnJvbVNldChzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGlmIChtYXJrLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgdG9SZW1vdmUgPSBbbWFya107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b1JlbW92ZSA9IG5vZGUubWFya3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvUmVtb3ZlICYmIHRvUmVtb3ZlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKHBvcyArIG5vZGUubm9kZVNpemUsIHRvKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0b1JlbW92ZVtpXSwgZm91bmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gbWF0Y2hlZFtqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG0uc3RlcCA9PSBzdGVwIC0gMSAmJiBzdHlsZS5lcShtYXRjaGVkW2pdLnN0eWxlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICBmb3VuZC5zdGVwID0gc3RlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQucHVzaCh7IHN0eWxlLCBmcm9tOiBNYXRoLm1heChwb3MsIGZyb20pLCB0bzogZW5kLCBzdGVwIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIG1hdGNoZWQuZm9yRWFjaChtID0+IHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKG0uZnJvbSwgbS50bywgbS5zdHlsZSkpKTtcbn1cbmZ1bmN0aW9uIGNsZWFySW5jb21wYXRpYmxlKHRyLCBwb3MsIHBhcmVudFR5cGUsIG1hdGNoID0gcGFyZW50VHlwZS5jb250ZW50TWF0Y2gsIGNsZWFyTmV3bGluZXMgPSB0cnVlKSB7XG4gICAgbGV0IG5vZGUgPSB0ci5kb2Mubm9kZUF0KHBvcyk7XG4gICAgbGV0IHJlcGxTdGVwcyA9IFtdLCBjdXIgPSBwb3MgKyAxO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZS5jaGlsZChpKSwgZW5kID0gY3VyICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGxldCBhbGxvd2VkID0gbWF0Y2gubWF0Y2hUeXBlKGNoaWxkLnR5cGUpO1xuICAgICAgICBpZiAoIWFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJlcGxTdGVwcy5wdXNoKG5ldyBSZXBsYWNlU3RlcChjdXIsIGVuZCwgU2xpY2UuZW1wdHkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoID0gYWxsb3dlZDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hpbGQubWFya3MubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRUeXBlLmFsbG93c01hcmtUeXBlKGNoaWxkLm1hcmtzW2pdLnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICB0ci5zdGVwKG5ldyBSZW1vdmVNYXJrU3RlcChjdXIsIGVuZCwgY2hpbGQubWFya3Nbal0pKTtcbiAgICAgICAgICAgIGlmIChjbGVhck5ld2xpbmVzICYmIGNoaWxkLmlzVGV4dCAmJiBwYXJlbnRUeXBlLndoaXRlc3BhY2UgIT0gXCJwcmVcIikge1xuICAgICAgICAgICAgICAgIGxldCBtLCBuZXdsaW5lID0gL1xccj9cXG58XFxyL2csIHNsaWNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChtID0gbmV3bGluZS5leGVjKGNoaWxkLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2xpY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGljZSA9IG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHBhcmVudFR5cGUuc2NoZW1hLnRleHQoXCIgXCIsIHBhcmVudFR5cGUuYWxsb3dlZE1hcmtzKGNoaWxkLm1hcmtzKSkpLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbFN0ZXBzLnB1c2gobmV3IFJlcGxhY2VTdGVwKGN1ciArIG0uaW5kZXgsIGN1ciArIG0uaW5kZXggKyBtWzBdLmxlbmd0aCwgc2xpY2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gZW5kO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoLnZhbGlkRW5kKSB7XG4gICAgICAgIGxldCBmaWxsID0gbWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgICAgIHRyLnJlcGxhY2UoY3VyLCBjdXIsIG5ldyBTbGljZShmaWxsLCAwLCAwKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSByZXBsU3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIHRyLnN0ZXAocmVwbFN0ZXBzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2FuQ3V0KG5vZGUsIHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gKHN0YXJ0ID09IDAgfHwgbm9kZS5jYW5SZXBsYWNlKHN0YXJ0LCBub2RlLmNoaWxkQ291bnQpKSAmJlxuICAgICAgICAoZW5kID09IG5vZGUuY2hpbGRDb3VudCB8fCBub2RlLmNhblJlcGxhY2UoMCwgZW5kKSk7XG59XG4vKipcblRyeSB0byBmaW5kIGEgdGFyZ2V0IGRlcHRoIHRvIHdoaWNoIHRoZSBjb250ZW50IGluIHRoZSBnaXZlbiByYW5nZVxuY2FuIGJlIGxpZnRlZC4gV2lsbCBub3QgZ28gYWNyb3NzXG5baXNvbGF0aW5nXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuaXNvbGF0aW5nKSBwYXJlbnQgbm9kZXMuXG4qL1xuZnVuY3Rpb24gbGlmdFRhcmdldChyYW5nZSkge1xuICAgIGxldCBwYXJlbnQgPSByYW5nZS5wYXJlbnQ7XG4gICAgbGV0IGNvbnRlbnQgPSBwYXJlbnQuY29udGVudC5jdXRCeUluZGV4KHJhbmdlLnN0YXJ0SW5kZXgsIHJhbmdlLmVuZEluZGV4KTtcbiAgICBmb3IgKGxldCBkZXB0aCA9IHJhbmdlLmRlcHRoOzsgLS1kZXB0aCkge1xuICAgICAgICBsZXQgbm9kZSA9IHJhbmdlLiRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgICBsZXQgaW5kZXggPSByYW5nZS4kZnJvbS5pbmRleChkZXB0aCksIGVuZEluZGV4ID0gcmFuZ2UuJHRvLmluZGV4QWZ0ZXIoZGVwdGgpO1xuICAgICAgICBpZiAoZGVwdGggPCByYW5nZS5kZXB0aCAmJiBub2RlLmNhblJlcGxhY2UoaW5kZXgsIGVuZEluZGV4LCBjb250ZW50KSlcbiAgICAgICAgICAgIHJldHVybiBkZXB0aDtcbiAgICAgICAgaWYgKGRlcHRoID09IDAgfHwgbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nIHx8ICFjYW5DdXQobm9kZSwgaW5kZXgsIGVuZEluZGV4KSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGxpZnQodHIsIHJhbmdlLCB0YXJnZXQpIHtcbiAgICBsZXQgeyAkZnJvbSwgJHRvLCBkZXB0aCB9ID0gcmFuZ2U7XG4gICAgbGV0IGdhcFN0YXJ0ID0gJGZyb20uYmVmb3JlKGRlcHRoICsgMSksIGdhcEVuZCA9ICR0by5hZnRlcihkZXB0aCArIDEpO1xuICAgIGxldCBzdGFydCA9IGdhcFN0YXJ0LCBlbmQgPSBnYXBFbmQ7XG4gICAgbGV0IGJlZm9yZSA9IEZyYWdtZW50LmVtcHR5LCBvcGVuU3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGQgPSBkZXB0aCwgc3BsaXR0aW5nID0gZmFsc2U7IGQgPiB0YXJnZXQ7IGQtLSlcbiAgICAgICAgaWYgKHNwbGl0dGluZyB8fCAkZnJvbS5pbmRleChkKSA+IDApIHtcbiAgICAgICAgICAgIHNwbGl0dGluZyA9IHRydWU7XG4gICAgICAgICAgICBiZWZvcmUgPSBGcmFnbWVudC5mcm9tKCRmcm9tLm5vZGUoZCkuY29weShiZWZvcmUpKTtcbiAgICAgICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQtLTtcbiAgICAgICAgfVxuICAgIGxldCBhZnRlciA9IEZyYWdtZW50LmVtcHR5LCBvcGVuRW5kID0gMDtcbiAgICBmb3IgKGxldCBkID0gZGVwdGgsIHNwbGl0dGluZyA9IGZhbHNlOyBkID4gdGFyZ2V0OyBkLS0pXG4gICAgICAgIGlmIChzcGxpdHRpbmcgfHwgJHRvLmFmdGVyKGQgKyAxKSA8ICR0by5lbmQoZCkpIHtcbiAgICAgICAgICAgIHNwbGl0dGluZyA9IHRydWU7XG4gICAgICAgICAgICBhZnRlciA9IEZyYWdtZW50LmZyb20oJHRvLm5vZGUoZCkuY29weShhZnRlcikpO1xuICAgICAgICAgICAgb3BlbkVuZCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kKys7XG4gICAgICAgIH1cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCwgZW5kLCBnYXBTdGFydCwgZ2FwRW5kLCBuZXcgU2xpY2UoYmVmb3JlLmFwcGVuZChhZnRlciksIG9wZW5TdGFydCwgb3BlbkVuZCksIGJlZm9yZS5zaXplIC0gb3BlblN0YXJ0LCB0cnVlKSk7XG59XG4vKipcblRyeSB0byBmaW5kIGEgdmFsaWQgd2F5IHRvIHdyYXAgdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIGluIGFcbm5vZGUgb2YgdGhlIGdpdmVuIHR5cGUuIE1heSBpbnRyb2R1Y2UgZXh0cmEgbm9kZXMgYXJvdW5kIGFuZCBpbnNpZGVcbnRoZSB3cmFwcGVyIG5vZGUsIGlmIG5lY2Vzc2FyeS4gUmV0dXJucyBudWxsIGlmIG5vIHZhbGlkIHdyYXBwaW5nXG5jb3VsZCBiZSBmb3VuZC4gV2hlbiBgaW5uZXJSYW5nZWAgaXMgZ2l2ZW4sIHRoYXQgcmFuZ2UncyBjb250ZW50IGlzXG51c2VkIGFzIHRoZSBjb250ZW50IHRvIGZpdCBpbnRvIHRoZSB3cmFwcGluZywgaW5zdGVhZCBvZiB0aGVcbmNvbnRlbnQgb2YgYHJhbmdlYC5cbiovXG5mdW5jdGlvbiBmaW5kV3JhcHBpbmcocmFuZ2UsIG5vZGVUeXBlLCBhdHRycyA9IG51bGwsIGlubmVyUmFuZ2UgPSByYW5nZSkge1xuICAgIGxldCBhcm91bmQgPSBmaW5kV3JhcHBpbmdPdXRzaWRlKHJhbmdlLCBub2RlVHlwZSk7XG4gICAgbGV0IGlubmVyID0gYXJvdW5kICYmIGZpbmRXcmFwcGluZ0luc2lkZShpbm5lclJhbmdlLCBub2RlVHlwZSk7XG4gICAgaWYgKCFpbm5lcilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGFyb3VuZC5tYXAod2l0aEF0dHJzKVxuICAgICAgICAuY29uY2F0KHsgdHlwZTogbm9kZVR5cGUsIGF0dHJzIH0pLmNvbmNhdChpbm5lci5tYXAod2l0aEF0dHJzKSk7XG59XG5mdW5jdGlvbiB3aXRoQXR0cnModHlwZSkgeyByZXR1cm4geyB0eXBlLCBhdHRyczogbnVsbCB9OyB9XG5mdW5jdGlvbiBmaW5kV3JhcHBpbmdPdXRzaWRlKHJhbmdlLCB0eXBlKSB7XG4gICAgbGV0IHsgcGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gcmFuZ2U7XG4gICAgbGV0IGFyb3VuZCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdChzdGFydEluZGV4KS5maW5kV3JhcHBpbmcodHlwZSk7XG4gICAgaWYgKCFhcm91bmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBvdXRlciA9IGFyb3VuZC5sZW5ndGggPyBhcm91bmRbMF0gOiB0eXBlO1xuICAgIHJldHVybiBwYXJlbnQuY2FuUmVwbGFjZVdpdGgoc3RhcnRJbmRleCwgZW5kSW5kZXgsIG91dGVyKSA/IGFyb3VuZCA6IG51bGw7XG59XG5mdW5jdGlvbiBmaW5kV3JhcHBpbmdJbnNpZGUocmFuZ2UsIHR5cGUpIHtcbiAgICBsZXQgeyBwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSByYW5nZTtcbiAgICBsZXQgaW5uZXIgPSBwYXJlbnQuY2hpbGQoc3RhcnRJbmRleCk7XG4gICAgbGV0IGluc2lkZSA9IHR5cGUuY29udGVudE1hdGNoLmZpbmRXcmFwcGluZyhpbm5lci50eXBlKTtcbiAgICBpZiAoIWluc2lkZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGxhc3RUeXBlID0gaW5zaWRlLmxlbmd0aCA/IGluc2lkZVtpbnNpZGUubGVuZ3RoIC0gMV0gOiB0eXBlO1xuICAgIGxldCBpbm5lck1hdGNoID0gbGFzdFR5cGUuY29udGVudE1hdGNoO1xuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpbm5lck1hdGNoICYmIGkgPCBlbmRJbmRleDsgaSsrKVxuICAgICAgICBpbm5lck1hdGNoID0gaW5uZXJNYXRjaC5tYXRjaFR5cGUocGFyZW50LmNoaWxkKGkpLnR5cGUpO1xuICAgIGlmICghaW5uZXJNYXRjaCB8fCAhaW5uZXJNYXRjaC52YWxpZEVuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGluc2lkZTtcbn1cbmZ1bmN0aW9uIHdyYXAodHIsIHJhbmdlLCB3cmFwcGVycykge1xuICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgZm9yIChsZXQgaSA9IHdyYXBwZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChjb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IHdyYXBwZXJzW2ldLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoIHx8ICFtYXRjaC52YWxpZEVuZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIldyYXBwZXIgdHlwZSBnaXZlbiB0byBUcmFuc2Zvcm0ud3JhcCBkb2VzIG5vdCBmb3JtIHZhbGlkIGNvbnRlbnQgb2YgaXRzIHBhcmVudCB3cmFwcGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHdyYXBwZXJzW2ldLnR5cGUuY3JlYXRlKHdyYXBwZXJzW2ldLmF0dHJzLCBjb250ZW50KSk7XG4gICAgfVxuICAgIGxldCBzdGFydCA9IHJhbmdlLnN0YXJ0LCBlbmQgPSByYW5nZS5lbmQ7XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnQsIGVuZCwgc3RhcnQsIGVuZCwgbmV3IFNsaWNlKGNvbnRlbnQsIDAsIDApLCB3cmFwcGVycy5sZW5ndGgsIHRydWUpKTtcbn1cbmZ1bmN0aW9uIHNldEJsb2NrVHlwZSh0ciwgZnJvbSwgdG8sIHR5cGUsIGF0dHJzKSB7XG4gICAgaWYgKCF0eXBlLmlzVGV4dGJsb2NrKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlR5cGUgZ2l2ZW4gdG8gc2V0QmxvY2tUeXBlIHNob3VsZCBiZSBhIHRleHRibG9ja1wiKTtcbiAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aDtcbiAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgIGxldCBhdHRyc0hlcmUgPSB0eXBlb2YgYXR0cnMgPT0gXCJmdW5jdGlvblwiID8gYXR0cnMobm9kZSkgOiBhdHRycztcbiAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2sgJiYgIW5vZGUuaGFzTWFya3VwKHR5cGUsIGF0dHJzSGVyZSkgJiZcbiAgICAgICAgICAgIGNhbkNoYW5nZVR5cGUodHIuZG9jLCB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MpLCB0eXBlKSkge1xuICAgICAgICAgICAgbGV0IGNvbnZlcnROZXdsaW5lcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZS5zY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlID0gdHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCIsIHN1cHBvcnRMaW5lYnJlYWsgPSAhIXR5cGUuY29udGVudE1hdGNoLm1hdGNoVHlwZSh0eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZSAmJiAhc3VwcG9ydExpbmVicmVhaylcbiAgICAgICAgICAgICAgICAgICAgY29udmVydE5ld2xpbmVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXByZSAmJiBzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TmV3bGluZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRW5zdXJlIGFsbCBtYXJrdXAgdGhhdCBpc24ndCBhbGxvd2VkIGluIHRoZSBuZXcgbm9kZSB0eXBlIGlzIGNsZWFyZWRcbiAgICAgICAgICAgIGlmIChjb252ZXJ0TmV3bGluZXMgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VMaW5lYnJlYWtzKHRyLCBub2RlLCBwb3MsIG1hcEZyb20pO1xuICAgICAgICAgICAgY2xlYXJJbmNvbXBhdGlibGUodHIsIHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcywgMSksIHR5cGUsIHVuZGVmaW5lZCwgY29udmVydE5ld2xpbmVzID09PSBudWxsKTtcbiAgICAgICAgICAgIGxldCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKTtcbiAgICAgICAgICAgIGxldCBzdGFydE0gPSBtYXBwaW5nLm1hcChwb3MsIDEpLCBlbmRNID0gbWFwcGluZy5tYXAocG9zICsgbm9kZS5ub2RlU2l6ZSwgMSk7XG4gICAgICAgICAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydE0sIGVuZE0sIHN0YXJ0TSArIDEsIGVuZE0gLSAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh0eXBlLmNyZWF0ZShhdHRyc0hlcmUsIG51bGwsIG5vZGUubWFya3MpKSwgMCwgMCksIDEsIHRydWUpKTtcbiAgICAgICAgICAgIGlmIChjb252ZXJ0TmV3bGluZXMgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgcmVwbGFjZU5ld2xpbmVzKHRyLCBub2RlLCBwb3MsIG1hcEZyb20pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXBsYWNlTmV3bGluZXModHIsIG5vZGUsIHBvcywgbWFwRnJvbSkge1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIG9mZnNldCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgICAgICBsZXQgbSwgbmV3bGluZSA9IC9cXHI/XFxufFxcci9nO1xuICAgICAgICAgICAgd2hpbGUgKG0gPSBuZXdsaW5lLmV4ZWMoY2hpbGQudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MgKyAxICsgb2Zmc2V0ICsgbS5pbmRleCk7XG4gICAgICAgICAgICAgICAgdHIucmVwbGFjZVdpdGgoc3RhcnQsIHN0YXJ0ICsgMSwgbm9kZS50eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudC5jcmVhdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VMaW5lYnJlYWtzKHRyLCBub2RlLCBwb3MsIG1hcEZyb20pIHtcbiAgICBub2RlLmZvckVhY2goKGNoaWxkLCBvZmZzZXQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT0gY2hpbGQudHlwZS5zY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIDEgKyBvZmZzZXQpO1xuICAgICAgICAgICAgdHIucmVwbGFjZVdpdGgoc3RhcnQsIHN0YXJ0ICsgMSwgbm9kZS50eXBlLnNjaGVtYS50ZXh0KFwiXFxuXCIpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gY2FuQ2hhbmdlVHlwZShkb2MsIHBvcywgdHlwZSkge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKSwgaW5kZXggPSAkcG9zLmluZGV4KCk7XG4gICAgcmV0dXJuICRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCArIDEsIHR5cGUpO1xufVxuLyoqXG5DaGFuZ2UgdGhlIHR5cGUsIGF0dHJpYnV0ZXMsIGFuZC9vciBtYXJrcyBvZiB0aGUgbm9kZSBhdCBgcG9zYC5cbldoZW4gYHR5cGVgIGlzbid0IGdpdmVuLCB0aGUgZXhpc3Rpbmcgbm9kZSB0eXBlIGlzIHByZXNlcnZlZCxcbiovXG5mdW5jdGlvbiBzZXROb2RlTWFya3VwKHRyLCBwb3MsIHR5cGUsIGF0dHJzLCBtYXJrcykge1xuICAgIGxldCBub2RlID0gdHIuZG9jLm5vZGVBdChwb3MpO1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBub2RlIGF0IGdpdmVuIHBvc2l0aW9uXCIpO1xuICAgIGlmICghdHlwZSlcbiAgICAgICAgdHlwZSA9IG5vZGUudHlwZTtcbiAgICBsZXQgbmV3Tm9kZSA9IHR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBtYXJrcyB8fCBub2RlLm1hcmtzKTtcbiAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgIHJldHVybiB0ci5yZXBsYWNlV2l0aChwb3MsIHBvcyArIG5vZGUubm9kZVNpemUsIG5ld05vZGUpO1xuICAgIGlmICghdHlwZS52YWxpZENvbnRlbnQobm9kZS5jb250ZW50KSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGNvbnRlbnQgZm9yIG5vZGUgdHlwZSBcIiArIHR5cGUubmFtZSk7XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCBwb3MgKyAxLCBwb3MgKyBub2RlLm5vZGVTaXplIC0gMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20obmV3Tm9kZSksIDAsIDApLCAxLCB0cnVlKSk7XG59XG4vKipcbkNoZWNrIHdoZXRoZXIgc3BsaXR0aW5nIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBpcyBhbGxvd2VkLlxuKi9cbmZ1bmN0aW9uIGNhblNwbGl0KGRvYywgcG9zLCBkZXB0aCA9IDEsIHR5cGVzQWZ0ZXIpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyksIGJhc2UgPSAkcG9zLmRlcHRoIC0gZGVwdGg7XG4gICAgbGV0IGlubmVyVHlwZSA9ICh0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbdHlwZXNBZnRlci5sZW5ndGggLSAxXSkgfHwgJHBvcy5wYXJlbnQ7XG4gICAgaWYgKGJhc2UgPCAwIHx8ICRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcgfHxcbiAgICAgICAgISRwb3MucGFyZW50LmNhblJlcGxhY2UoJHBvcy5pbmRleCgpLCAkcG9zLnBhcmVudC5jaGlsZENvdW50KSB8fFxuICAgICAgICAhaW5uZXJUeXBlLnR5cGUudmFsaWRDb250ZW50KCRwb3MucGFyZW50LmNvbnRlbnQuY3V0QnlJbmRleCgkcG9zLmluZGV4KCksICRwb3MucGFyZW50LmNoaWxkQ291bnQpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMSwgaSA9IGRlcHRoIC0gMjsgZCA+IGJhc2U7IGQtLSwgaS0tKSB7XG4gICAgICAgIGxldCBub2RlID0gJHBvcy5ub2RlKGQpLCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgIGlmIChub2RlLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByZXN0ID0gbm9kZS5jb250ZW50LmN1dEJ5SW5kZXgoaW5kZXgsIG5vZGUuY2hpbGRDb3VudCk7XG4gICAgICAgIGxldCBvdmVycmlkZUNoaWxkID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2kgKyAxXTtcbiAgICAgICAgaWYgKG92ZXJyaWRlQ2hpbGQpXG4gICAgICAgICAgICByZXN0ID0gcmVzdC5yZXBsYWNlQ2hpbGQoMCwgb3ZlcnJpZGVDaGlsZC50eXBlLmNyZWF0ZShvdmVycmlkZUNoaWxkLmF0dHJzKSk7XG4gICAgICAgIGxldCBhZnRlciA9ICh0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaV0pIHx8IG5vZGU7XG4gICAgICAgIGlmICghbm9kZS5jYW5SZXBsYWNlKGluZGV4ICsgMSwgbm9kZS5jaGlsZENvdW50KSB8fCAhYWZ0ZXIudHlwZS52YWxpZENvbnRlbnQocmVzdCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXhBZnRlcihiYXNlKTtcbiAgICBsZXQgYmFzZVR5cGUgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbMF07XG4gICAgcmV0dXJuICRwb3Mubm9kZShiYXNlKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIGJhc2VUeXBlID8gYmFzZVR5cGUudHlwZSA6ICRwb3Mubm9kZShiYXNlICsgMSkudHlwZSk7XG59XG5mdW5jdGlvbiBzcGxpdCh0ciwgcG9zLCBkZXB0aCA9IDEsIHR5cGVzQWZ0ZXIpIHtcbiAgICBsZXQgJHBvcyA9IHRyLmRvYy5yZXNvbHZlKHBvcyksIGJlZm9yZSA9IEZyYWdtZW50LmVtcHR5LCBhZnRlciA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoLCBlID0gJHBvcy5kZXB0aCAtIGRlcHRoLCBpID0gZGVwdGggLSAxOyBkID4gZTsgZC0tLCBpLS0pIHtcbiAgICAgICAgYmVmb3JlID0gRnJhZ21lbnQuZnJvbSgkcG9zLm5vZGUoZCkuY29weShiZWZvcmUpKTtcbiAgICAgICAgbGV0IHR5cGVBZnRlciA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpXTtcbiAgICAgICAgYWZ0ZXIgPSBGcmFnbWVudC5mcm9tKHR5cGVBZnRlciA/IHR5cGVBZnRlci50eXBlLmNyZWF0ZSh0eXBlQWZ0ZXIuYXR0cnMsIGFmdGVyKSA6ICRwb3Mubm9kZShkKS5jb3B5KGFmdGVyKSk7XG4gICAgfVxuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VTdGVwKHBvcywgcG9zLCBuZXcgU2xpY2UoYmVmb3JlLmFwcGVuZChhZnRlciksIGRlcHRoLCBkZXB0aCksIHRydWUpKTtcbn1cbi8qKlxuVGVzdCB3aGV0aGVyIHRoZSBibG9ja3MgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIHBvc2l0aW9uIGNhbiBiZVxuam9pbmVkLlxuKi9cbmZ1bmN0aW9uIGNhbkpvaW4oZG9jLCBwb3MpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyksIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgIHJldHVybiBqb2luYWJsZSgkcG9zLm5vZGVCZWZvcmUsICRwb3Mubm9kZUFmdGVyKSAmJlxuICAgICAgICAkcG9zLnBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCArIDEpO1xufVxuZnVuY3Rpb24gY2FuQXBwZW5kV2l0aFN1YnN0aXR1dGVkTGluZWJyZWFrcyhhLCBiKSB7XG4gICAgaWYgKCFiLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgYS50eXBlLmNvbXBhdGlibGVDb250ZW50KGIudHlwZSk7XG4gICAgbGV0IG1hdGNoID0gYS5jb250ZW50TWF0Y2hBdChhLmNoaWxkQ291bnQpO1xuICAgIGxldCB7IGxpbmVicmVha1JlcGxhY2VtZW50IH0gPSBhLnR5cGUuc2NoZW1hO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYi5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gYi5jaGlsZChpKTtcbiAgICAgICAgbGV0IHR5cGUgPSBjaGlsZC50eXBlID09IGxpbmVicmVha1JlcGxhY2VtZW50ID8gYS50eXBlLnNjaGVtYS5ub2Rlcy50ZXh0IDogY2hpbGQudHlwZTtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghYS50eXBlLmFsbG93c01hcmtzKGNoaWxkLm1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoLnZhbGlkRW5kO1xufVxuZnVuY3Rpb24gam9pbmFibGUoYSwgYikge1xuICAgIHJldHVybiAhIShhICYmIGIgJiYgIWEuaXNMZWFmICYmIGNhbkFwcGVuZFdpdGhTdWJzdGl0dXRlZExpbmVicmVha3MoYSwgYikpO1xufVxuLyoqXG5GaW5kIGFuIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBwb3NpdGlvbiB0aGF0IGNhbiBiZSBqb2luZWQgdG8gdGhlXG5ibG9jayBiZWZvcmUgKG9yIGFmdGVyIGlmIGBkaXJgIGlzIHBvc2l0aXZlKS4gUmV0dXJucyB0aGUgam9pbmFibGVcbnBvaW50LCBpZiBhbnkuXG4qL1xuZnVuY3Rpb24gam9pblBvaW50KGRvYywgcG9zLCBkaXIgPSAtMSkge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aDs7IGQtLSkge1xuICAgICAgICBsZXQgYmVmb3JlLCBhZnRlciwgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICBpZiAoZCA9PSAkcG9zLmRlcHRoKSB7XG4gICAgICAgICAgICBiZWZvcmUgPSAkcG9zLm5vZGVCZWZvcmU7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZUFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZShkICsgMSk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgYWZ0ZXIgPSAkcG9zLm5vZGUoZCkubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiZWZvcmUgPSAkcG9zLm5vZGUoZCkubWF5YmVDaGlsZChpbmRleCAtIDEpO1xuICAgICAgICAgICAgYWZ0ZXIgPSAkcG9zLm5vZGUoZCArIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWZvcmUgJiYgIWJlZm9yZS5pc1RleHRibG9jayAmJiBqb2luYWJsZShiZWZvcmUsIGFmdGVyKSAmJlxuICAgICAgICAgICAgJHBvcy5ub2RlKGQpLmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSkpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBpZiAoZCA9PSAwKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIHBvcyA9IGRpciA8IDAgPyAkcG9zLmJlZm9yZShkKSA6ICRwb3MuYWZ0ZXIoZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gam9pbih0ciwgcG9zLCBkZXB0aCkge1xuICAgIGxldCBjb252ZXJ0TmV3bGluZXMgPSBudWxsO1xuICAgIGxldCB7IGxpbmVicmVha1JlcGxhY2VtZW50IH0gPSB0ci5kb2MudHlwZS5zY2hlbWE7XG4gICAgbGV0ICRiZWZvcmUgPSB0ci5kb2MucmVzb2x2ZShwb3MgLSBkZXB0aCksIGJlZm9yZVR5cGUgPSAkYmVmb3JlLm5vZGUoKS50eXBlO1xuICAgIGlmIChsaW5lYnJlYWtSZXBsYWNlbWVudCAmJiBiZWZvcmVUeXBlLmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHByZSA9IGJlZm9yZVR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiO1xuICAgICAgICBsZXQgc3VwcG9ydExpbmVicmVhayA9ICEhYmVmb3JlVHlwZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKGxpbmVicmVha1JlcGxhY2VtZW50KTtcbiAgICAgICAgaWYgKHByZSAmJiAhc3VwcG9ydExpbmVicmVhaylcbiAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IGZhbHNlO1xuICAgICAgICBlbHNlIGlmICghcHJlICYmIHN1cHBvcnRMaW5lYnJlYWspXG4gICAgICAgICAgICBjb252ZXJ0TmV3bGluZXMgPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aDtcbiAgICBpZiAoY29udmVydE5ld2xpbmVzID09PSBmYWxzZSkge1xuICAgICAgICBsZXQgJGFmdGVyID0gdHIuZG9jLnJlc29sdmUocG9zICsgZGVwdGgpO1xuICAgICAgICByZXBsYWNlTGluZWJyZWFrcyh0ciwgJGFmdGVyLm5vZGUoKSwgJGFmdGVyLmJlZm9yZSgpLCBtYXBGcm9tKTtcbiAgICB9XG4gICAgaWYgKGJlZm9yZVR5cGUuaW5saW5lQ29udGVudClcbiAgICAgICAgY2xlYXJJbmNvbXBhdGlibGUodHIsIHBvcyArIGRlcHRoIC0gMSwgYmVmb3JlVHlwZSwgJGJlZm9yZS5ub2RlKCkuY29udGVudE1hdGNoQXQoJGJlZm9yZS5pbmRleCgpKSwgY29udmVydE5ld2xpbmVzID09IG51bGwpO1xuICAgIGxldCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKSwgc3RhcnQgPSBtYXBwaW5nLm1hcChwb3MgLSBkZXB0aCk7XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAoc3RhcnQsIG1hcHBpbmcubWFwKHBvcyArIGRlcHRoLCAtMSksIFNsaWNlLmVtcHR5LCB0cnVlKSk7XG4gICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gdHJ1ZSkge1xuICAgICAgICBsZXQgJGZ1bGwgPSB0ci5kb2MucmVzb2x2ZShzdGFydCk7XG4gICAgICAgIHJlcGxhY2VOZXdsaW5lcyh0ciwgJGZ1bGwubm9kZSgpLCAkZnVsbC5iZWZvcmUoKSwgdHIuc3RlcHMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHBvaW50IHdoZXJlIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSBjYW4gYmUgaW5zZXJ0ZWRcbm5lYXIgYHBvc2AsIGJ5IHNlYXJjaGluZyB1cCB0aGUgbm9kZSBoaWVyYXJjaHkgd2hlbiBgcG9zYCBpdHNlbGZcbmlzbid0IGEgdmFsaWQgcGxhY2UgYnV0IGlzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYSBub2RlLiBSZXR1cm5cbm51bGwgaWYgbm8gcG9zaXRpb24gd2FzIGZvdW5kLlxuKi9cbmZ1bmN0aW9uIGluc2VydFBvaW50KGRvYywgcG9zLCBub2RlVHlwZSkge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoJHBvcy5wYXJlbnQuY2FuUmVwbGFjZVdpdGgoJHBvcy5pbmRleCgpLCAkcG9zLmluZGV4KCksIG5vZGVUeXBlKSlcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICBpZiAoJHBvcy5wYXJlbnRPZmZzZXQgPT0gMClcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleChkKTtcbiAgICAgICAgICAgIGlmICgkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBub2RlVHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3MuYmVmb3JlKGQgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICBpZiAoJHBvcy5wYXJlbnRPZmZzZXQgPT0gJHBvcy5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoZCk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGQpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgbm9kZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmFmdGVyKGQgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA8ICRwb3Mubm9kZShkKS5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbkZpbmRzIGEgcG9zaXRpb24gYXQgb3IgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbiB3aGVyZSB0aGUgZ2l2ZW5cbnNsaWNlIGNhbiBiZSBpbnNlcnRlZC4gV2lsbCBsb29rIGF0IHBhcmVudCBub2RlcycgbmVhcmVzdCBib3VuZGFyeVxuYW5kIHRyeSB0aGVyZSwgZXZlbiBpZiB0aGUgb3JpZ2luYWwgcG9zaXRpb24gd2Fzbid0IGRpcmVjdGx5IGF0IHRoZVxuc3RhcnQgb3IgZW5kIG9mIHRoYXQgbm9kZS4gUmV0dXJucyBudWxsIHdoZW4gbm8gcG9zaXRpb24gd2FzIGZvdW5kLlxuKi9cbmZ1bmN0aW9uIGRyb3BQb2ludChkb2MsIHBvcywgc2xpY2UpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKCFzbGljZS5jb250ZW50LnNpemUpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgbGV0IGNvbnRlbnQgPSBzbGljZS5jb250ZW50O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2Uub3BlblN0YXJ0OyBpKyspXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmZpcnN0Q2hpbGQuY29udGVudDtcbiAgICBmb3IgKGxldCBwYXNzID0gMTsgcGFzcyA8PSAoc2xpY2Uub3BlblN0YXJ0ID09IDAgJiYgc2xpY2Uuc2l6ZSA/IDIgOiAxKTsgcGFzcysrKSB7XG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgbGV0IGJpYXMgPSBkID09ICRwb3MuZGVwdGggPyAwIDogJHBvcy5wb3MgPD0gKCRwb3Muc3RhcnQoZCArIDEpICsgJHBvcy5lbmQoZCArIDEpKSAvIDIgPyAtMSA6IDE7XG4gICAgICAgICAgICBsZXQgaW5zZXJ0UG9zID0gJHBvcy5pbmRleChkKSArIChiaWFzID4gMCA/IDEgOiAwKTtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkcG9zLm5vZGUoZCksIGZpdHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChwYXNzID09IDEpIHtcbiAgICAgICAgICAgICAgICBmaXRzID0gcGFyZW50LmNhblJlcGxhY2UoaW5zZXJ0UG9zLCBpbnNlcnRQb3MsIGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXBwaW5nID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KGluc2VydFBvcykuZmluZFdyYXBwaW5nKGNvbnRlbnQuZmlyc3RDaGlsZC50eXBlKTtcbiAgICAgICAgICAgICAgICBmaXRzID0gd3JhcHBpbmcgJiYgcGFyZW50LmNhblJlcGxhY2VXaXRoKGluc2VydFBvcywgaW5zZXJ0UG9zLCB3cmFwcGluZ1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZml0cylcbiAgICAgICAgICAgICAgICByZXR1cm4gYmlhcyA9PSAwID8gJHBvcy5wb3MgOiBiaWFzIDwgMCA/ICRwb3MuYmVmb3JlKGQgKyAxKSA6ICRwb3MuYWZ0ZXIoZCArIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vKipcbuKAmEZpdOKAmSBhIHNsaWNlIGludG8gYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQsIHByb2R1Y2luZyBhXG5bc3RlcF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwKSB0aGF0IGluc2VydHMgaXQuIFdpbGwgcmV0dXJuIG51bGwgaWZcbnRoZXJlJ3Mgbm8gbWVhbmluZ2Z1bCB3YXkgdG8gaW5zZXJ0IHRoZSBzbGljZSBoZXJlLCBvciBpbnNlcnRpbmcgaXRcbndvdWxkIGJlIGEgbm8tb3AgKGFuIGVtcHR5IHNsaWNlIG92ZXIgYW4gZW1wdHkgcmFuZ2UpLlxuKi9cbmZ1bmN0aW9uIHJlcGxhY2VTdGVwKGRvYywgZnJvbSwgdG8gPSBmcm9tLCBzbGljZSA9IFNsaWNlLmVtcHR5KSB7XG4gICAgaWYgKGZyb20gPT0gdG8gJiYgIXNsaWNlLnNpemUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCAkZnJvbSA9IGRvYy5yZXNvbHZlKGZyb20pLCAkdG8gPSBkb2MucmVzb2x2ZSh0byk7XG4gICAgLy8gT3B0aW1pemF0aW9uIC0tIGF2b2lkIHdvcmsgaWYgaXQncyBvYnZpb3VzIHRoYXQgaXQncyBub3QgbmVlZGVkLlxuICAgIGlmIChmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSlcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcChmcm9tLCB0bywgc2xpY2UpO1xuICAgIHJldHVybiBuZXcgRml0dGVyKCRmcm9tLCAkdG8sIHNsaWNlKS5maXQoKTtcbn1cbmZ1bmN0aW9uIGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpIHtcbiAgICByZXR1cm4gIXNsaWNlLm9wZW5TdGFydCAmJiAhc2xpY2Uub3BlbkVuZCAmJiAkZnJvbS5zdGFydCgpID09ICR0by5zdGFydCgpICYmXG4gICAgICAgICRmcm9tLnBhcmVudC5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KCksICR0by5pbmRleCgpLCBzbGljZS5jb250ZW50KTtcbn1cbi8vIEFsZ29yaXRobSBmb3IgJ3BsYWNpbmcnIHRoZSBlbGVtZW50cyBvZiBhIHNsaWNlIGludG8gYSBnYXA6XG4vL1xuLy8gV2UgY29uc2lkZXIgdGhlIGNvbnRlbnQgb2YgZWFjaCBub2RlIHRoYXQgaXMgb3BlbiB0byB0aGUgbGVmdCB0byBiZVxuLy8gaW5kZXBlbmRlbnRseSBwbGFjZWFibGUuIEkuZS4gaW4gPHAoXCJmb29cIiksIHAoXCJiYXJcIik+LCB3aGVuIHRoZVxuLy8gcGFyYWdyYXBoIG9uIHRoZSBsZWZ0IGlzIG9wZW4sIFwiZm9vXCIgY2FuIGJlIHBsYWNlZCAoc29tZXdoZXJlIG9uXG4vLyB0aGUgbGVmdCBzaWRlIG9mIHRoZSByZXBsYWNlbWVudCBnYXApIGluZGVwZW5kZW50bHkgZnJvbSBwKFwiYmFyXCIpLlxuLy9cbi8vIFRoaXMgY2xhc3MgdHJhY2tzIHRoZSBzdGF0ZSBvZiB0aGUgcGxhY2VtZW50IHByb2dyZXNzIGluIHRoZVxuLy8gZm9sbG93aW5nIHByb3BlcnRpZXM6XG4vL1xuLy8gIC0gYGZyb250aWVyYCBob2xkcyBhIHN0YWNrIG9mIGB7dHlwZSwgbWF0Y2h9YCBvYmplY3RzIHRoYXRcbi8vICAgIHJlcHJlc2VudCB0aGUgb3BlbiBzaWRlIG9mIHRoZSByZXBsYWNlbWVudC4gSXQgc3RhcnRzIGF0XG4vLyAgICBgJGZyb21gLCB0aGVuIG1vdmVzIGZvcndhcmQgYXMgY29udGVudCBpcyBwbGFjZWQsIGFuZCBpcyBmaW5hbGx5XG4vLyAgICByZWNvbmNpbGVkIHdpdGggYCR0b2AuXG4vL1xuLy8gIC0gYHVucGxhY2VkYCBpcyBhIHNsaWNlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudCB0aGF0IGhhc24ndFxuLy8gICAgYmVlbiBwbGFjZWQgeWV0LlxuLy9cbi8vICAtIGBwbGFjZWRgIGlzIGEgZnJhZ21lbnQgb2YgcGxhY2VkIGNvbnRlbnQuIEl0cyBvcGVuLXN0YXJ0IHZhbHVlXG4vLyAgICBpcyBpbXBsaWNpdCBpbiBgJGZyb21gLCBhbmQgaXRzIG9wZW4tZW5kIHZhbHVlIGluIGBmcm9udGllcmAuXG5jbGFzcyBGaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCRmcm9tLCAkdG8sIHVucGxhY2VkKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSB1bnBsYWNlZDtcbiAgICAgICAgdGhpcy5mcm9udGllciA9IFtdO1xuICAgICAgICB0aGlzLnBsYWNlZCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAkZnJvbS5kZXB0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9ICRmcm9tLm5vZGUoaSk7XG4gICAgICAgICAgICB0aGlzLmZyb250aWVyLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAgICAgICBtYXRjaDogbm9kZS5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleEFmdGVyKGkpKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9ICRmcm9tLmRlcHRoOyBpID4gMDsgaS0tKVxuICAgICAgICAgICAgdGhpcy5wbGFjZWQgPSBGcmFnbWVudC5mcm9tKCRmcm9tLm5vZGUoaSkuY29weSh0aGlzLnBsYWNlZCkpO1xuICAgIH1cbiAgICBnZXQgZGVwdGgoKSB7IHJldHVybiB0aGlzLmZyb250aWVyLmxlbmd0aCAtIDE7IH1cbiAgICBmaXQoKSB7XG4gICAgICAgIC8vIEFzIGxvbmcgYXMgdGhlcmUncyB1bnBsYWNlZCBjb250ZW50LCB0cnkgdG8gcGxhY2Ugc29tZSBvZiBpdC5cbiAgICAgICAgLy8gSWYgdGhhdCBmYWlscywgZWl0aGVyIGluY3JlYXNlIHRoZSBvcGVuIHNjb3JlIG9mIHRoZSB1bnBsYWNlZFxuICAgICAgICAvLyBzbGljZSwgb3IgZHJvcCBub2RlcyBmcm9tIGl0LCBhbmQgdGhlbiB0cnkgYWdhaW4uXG4gICAgICAgIHdoaWxlICh0aGlzLnVucGxhY2VkLnNpemUpIHtcbiAgICAgICAgICAgIGxldCBmaXQgPSB0aGlzLmZpbmRGaXR0YWJsZSgpO1xuICAgICAgICAgICAgaWYgKGZpdClcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlTm9kZXMoZml0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Nb3JlKCkgfHwgdGhpcy5kcm9wTm9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZW4gdGhlcmUncyBpbmxpbmUgY29udGVudCBkaXJlY3RseSBhZnRlciB0aGUgZnJvbnRpZXIgX2FuZF9cbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgYHRoaXMuJHRvYCwgd2UgbXVzdCBnZW5lcmF0ZSBhIGBSZXBsYWNlQXJvdW5kYFxuICAgICAgICAvLyBzdGVwIHRoYXQgcHVsbHMgdGhhdCBjb250ZW50IGludG8gdGhlIG5vZGUgYWZ0ZXIgdGhlIGZyb250aWVyLlxuICAgICAgICAvLyBUaGF0IG1lYW5zIHRoZSBmaXR0aW5nIG11c3QgYmUgZG9uZSB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0YmxvY2tcbiAgICAgICAgLy8gbm9kZSBhZnRlciBgdGhpcy4kdG9gLCBub3QgYHRoaXMuJHRvYCBpdHNlbGYuXG4gICAgICAgIGxldCBtb3ZlSW5saW5lID0gdGhpcy5tdXN0TW92ZUlubGluZSgpLCBwbGFjZWRTaXplID0gdGhpcy5wbGFjZWQuc2l6ZSAtIHRoaXMuZGVwdGggLSB0aGlzLiRmcm9tLmRlcHRoO1xuICAgICAgICBsZXQgJGZyb20gPSB0aGlzLiRmcm9tLCAkdG8gPSB0aGlzLmNsb3NlKG1vdmVJbmxpbmUgPCAwID8gdGhpcy4kdG8gOiAkZnJvbS5kb2MucmVzb2x2ZShtb3ZlSW5saW5lKSk7XG4gICAgICAgIGlmICghJHRvKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIElmIGNsb3NpbmcgdG8gYCR0b2Agc3VjY2VlZGVkLCBjcmVhdGUgYSBzdGVwXG4gICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5wbGFjZWQsIG9wZW5TdGFydCA9ICRmcm9tLmRlcHRoLCBvcGVuRW5kID0gJHRvLmRlcHRoO1xuICAgICAgICB3aGlsZSAob3BlblN0YXJ0ICYmIG9wZW5FbmQgJiYgY29udGVudC5jaGlsZENvdW50ID09IDEpIHsgLy8gTm9ybWFsaXplIGJ5IGRyb3BwaW5nIG9wZW4gcGFyZW50IG5vZGVzXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQ7XG4gICAgICAgICAgICBvcGVuU3RhcnQtLTtcbiAgICAgICAgICAgIG9wZW5FbmQtLTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2xpY2UgPSBuZXcgU2xpY2UoY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgaWYgKG1vdmVJbmxpbmUgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoJGZyb20ucG9zLCBtb3ZlSW5saW5lLCB0aGlzLiR0by5wb3MsIHRoaXMuJHRvLmVuZCgpLCBzbGljZSwgcGxhY2VkU2l6ZSk7XG4gICAgICAgIGlmIChzbGljZS5zaXplIHx8ICRmcm9tLnBvcyAhPSB0aGlzLiR0by5wb3MpIC8vIERvbid0IGdlbmVyYXRlIG5vLW9wIHN0ZXBzXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKCRmcm9tLnBvcywgJHRvLnBvcywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gRmluZCBhIHBvc2l0aW9uIG9uIHRoZSBzdGFydCBzcGluZSBvZiBgdGhpcy51bnBsYWNlZGAgdGhhdCBoYXNcbiAgICAvLyBjb250ZW50IHRoYXQgY2FuIGJlIG1vdmVkIHNvbWV3aGVyZSBvbiB0aGUgZnJvbnRpZXIuIFJldHVybnMgdHdvXG4gICAgLy8gZGVwdGhzLCBvbmUgZm9yIHRoZSBzbGljZSBhbmQgb25lIGZvciB0aGUgZnJvbnRpZXIuXG4gICAgZmluZEZpdHRhYmxlKCkge1xuICAgICAgICBsZXQgc3RhcnREZXB0aCA9IHRoaXMudW5wbGFjZWQub3BlblN0YXJ0O1xuICAgICAgICBmb3IgKGxldCBjdXIgPSB0aGlzLnVucGxhY2VkLmNvbnRlbnQsIGQgPSAwLCBvcGVuRW5kID0gdGhpcy51bnBsYWNlZC5vcGVuRW5kOyBkIDwgc3RhcnREZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGN1ci5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKGN1ci5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgICAgICAgICBvcGVuRW5kID0gMDtcbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuc3BlYy5pc29sYXRpbmcgJiYgb3BlbkVuZCA8PSBkKSB7XG4gICAgICAgICAgICAgICAgc3RhcnREZXB0aCA9IGQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXIgPSBub2RlLmNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSB0cnkgd3JhcHBpbmcgbm9kZXMgKHBhc3MgMikgYWZ0ZXIgZmluZGluZyBhIHBsYWNlIHdpdGhvdXRcbiAgICAgICAgLy8gd3JhcHBpbmcgZmFpbGVkLlxuICAgICAgICBmb3IgKGxldCBwYXNzID0gMTsgcGFzcyA8PSAyOyBwYXNzKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNsaWNlRGVwdGggPSBwYXNzID09IDEgPyBzdGFydERlcHRoIDogdGhpcy51bnBsYWNlZC5vcGVuU3RhcnQ7IHNsaWNlRGVwdGggPj0gMDsgc2xpY2VEZXB0aC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyYWdtZW50LCBwYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzbGljZURlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGNvbnRlbnRBdCh0aGlzLnVucGxhY2VkLmNvbnRlbnQsIHNsaWNlRGVwdGggLSAxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHBhcmVudC5jb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLnVucGxhY2VkLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZnJvbnRpZXJEZXB0aCA9IHRoaXMuZGVwdGg7IGZyb250aWVyRGVwdGggPj0gMDsgZnJvbnRpZXJEZXB0aC0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG1hdGNoIH0gPSB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdLCB3cmFwLCBpbmplY3QgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBwYXNzIDEsIGlmIHRoZSBuZXh0IG5vZGUgbWF0Y2hlcywgb3IgdGhlcmUgaXMgbm8gbmV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBub2RlIGJ1dCB0aGUgcGFyZW50cyBsb29rIGNvbXBhdGlibGUsIHdlJ3ZlIGZvdW5kIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDEgJiYgKGZpcnN0ID8gbWF0Y2gubWF0Y2hUeXBlKGZpcnN0LnR5cGUpIHx8IChpbmplY3QgPSBtYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmZyb20oZmlyc3QpLCBmYWxzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmVudCAmJiB0eXBlLmNvbXBhdGlibGVDb250ZW50KHBhcmVudC50eXBlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzbGljZURlcHRoLCBmcm9udGllckRlcHRoLCBwYXJlbnQsIGluamVjdCB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBwYXNzIDIsIGxvb2sgZm9yIGEgc2V0IG9mIHdyYXBwaW5nIG5vZGVzIHRoYXQgbWFrZVxuICAgICAgICAgICAgICAgICAgICAvLyBgZmlyc3RgIGZpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXNzID09IDIgJiYgZmlyc3QgJiYgKHdyYXAgPSBtYXRjaC5maW5kV3JhcHBpbmcoZmlyc3QudHlwZSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2xpY2VEZXB0aCwgZnJvbnRpZXJEZXB0aCwgcGFyZW50LCB3cmFwIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNvbnRpbnVlIGxvb2tpbmcgZnVydGhlciB1cCBpZiB0aGUgcGFyZW50IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZml0IGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgbWF0Y2gubWF0Y2hUeXBlKHBhcmVudC50eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvcGVuTW9yZSgpIHtcbiAgICAgICAgbGV0IHsgY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPSB0aGlzLnVucGxhY2VkO1xuICAgICAgICBsZXQgaW5uZXIgPSBjb250ZW50QXQoY29udGVudCwgb3BlblN0YXJ0KTtcbiAgICAgICAgaWYgKCFpbm5lci5jaGlsZENvdW50IHx8IGlubmVyLmZpcnN0Q2hpbGQuaXNMZWFmKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnVucGxhY2VkID0gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCArIDEsIE1hdGgubWF4KG9wZW5FbmQsIGlubmVyLnNpemUgKyBvcGVuU3RhcnQgPj0gY29udGVudC5zaXplIC0gb3BlbkVuZCA/IG9wZW5TdGFydCArIDEgOiAwKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkcm9wTm9kZSgpIHtcbiAgICAgICAgbGV0IHsgY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPSB0aGlzLnVucGxhY2VkO1xuICAgICAgICBsZXQgaW5uZXIgPSBjb250ZW50QXQoY29udGVudCwgb3BlblN0YXJ0KTtcbiAgICAgICAgaWYgKGlubmVyLmNoaWxkQ291bnQgPD0gMSAmJiBvcGVuU3RhcnQgPiAwKSB7XG4gICAgICAgICAgICBsZXQgb3BlbkF0RW5kID0gY29udGVudC5zaXplIC0gb3BlblN0YXJ0IDw9IG9wZW5TdGFydCArIGlubmVyLnNpemU7XG4gICAgICAgICAgICB0aGlzLnVucGxhY2VkID0gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoY29udGVudCwgb3BlblN0YXJ0IC0gMSwgMSksIG9wZW5TdGFydCAtIDEsIG9wZW5BdEVuZCA/IG9wZW5TdGFydCAtIDEgOiBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudW5wbGFjZWQgPSBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChjb250ZW50LCBvcGVuU3RhcnQsIDEpLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1vdmUgY29udGVudCBmcm9tIHRoZSB1bnBsYWNlZCBzbGljZSBhdCBgc2xpY2VEZXB0aGAgdG8gdGhlXG4gICAgLy8gZnJvbnRpZXIgbm9kZSBhdCBgZnJvbnRpZXJEZXB0aGAuIENsb3NlIHRoYXQgZnJvbnRpZXIgbm9kZSB3aGVuXG4gICAgLy8gYXBwbGljYWJsZS5cbiAgICBwbGFjZU5vZGVzKHsgc2xpY2VEZXB0aCwgZnJvbnRpZXJEZXB0aCwgcGFyZW50LCBpbmplY3QsIHdyYXAgfSkge1xuICAgICAgICB3aGlsZSAodGhpcy5kZXB0aCA+IGZyb250aWVyRGVwdGgpXG4gICAgICAgICAgICB0aGlzLmNsb3NlRnJvbnRpZXJOb2RlKCk7XG4gICAgICAgIGlmICh3cmFwKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3cmFwLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkZyb250aWVyTm9kZSh3cmFwW2ldKTtcbiAgICAgICAgbGV0IHNsaWNlID0gdGhpcy51bnBsYWNlZCwgZnJhZ21lbnQgPSBwYXJlbnQgPyBwYXJlbnQuY29udGVudCA6IHNsaWNlLmNvbnRlbnQ7XG4gICAgICAgIGxldCBvcGVuU3RhcnQgPSBzbGljZS5vcGVuU3RhcnQgLSBzbGljZURlcHRoO1xuICAgICAgICBsZXQgdGFrZW4gPSAwLCBhZGQgPSBbXTtcbiAgICAgICAgbGV0IHsgbWF0Y2gsIHR5cGUgfSA9IHRoaXMuZnJvbnRpZXJbZnJvbnRpZXJEZXB0aF07XG4gICAgICAgIGlmIChpbmplY3QpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgICAgICAgICBhZGQucHVzaChpbmplY3QuY2hpbGQoaSkpO1xuICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5tYXRjaEZyYWdtZW50KGluamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcHV0ZXMgdGhlIGFtb3VudCBvZiAoZW5kKSBvcGVuIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlXG4gICAgICAgIC8vIGZyYWdtZW50LiBXaGVuIDAsIHRoZSBwYXJlbnQgaXMgb3BlbiwgYnV0IG5vIG1vcmUuIFdoZW5cbiAgICAgICAgLy8gbmVnYXRpdmUsIG5vdGhpbmcgaXMgb3Blbi5cbiAgICAgICAgbGV0IG9wZW5FbmRDb3VudCA9IChmcmFnbWVudC5zaXplICsgc2xpY2VEZXB0aCkgLSAoc2xpY2UuY29udGVudC5zaXplIC0gc2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIC8vIFNjYW4gb3ZlciB0aGUgZnJhZ21lbnQsIGZpdHRpbmcgYXMgbWFueSBjaGlsZCBub2RlcyBhc1xuICAgICAgICAvLyBwb3NzaWJsZS5cbiAgICAgICAgd2hpbGUgKHRha2VuIDwgZnJhZ21lbnQuY2hpbGRDb3VudCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBmcmFnbWVudC5jaGlsZCh0YWtlbiksIG1hdGNoZXMgPSBtYXRjaC5tYXRjaFR5cGUobmV4dC50eXBlKTtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHRha2VuKys7XG4gICAgICAgICAgICBpZiAodGFrZW4gPiAxIHx8IG9wZW5TdGFydCA9PSAwIHx8IG5leHQuY29udGVudC5zaXplKSB7IC8vIERyb3AgZW1wdHkgb3BlbiBub2Rlc1xuICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2hlcztcbiAgICAgICAgICAgICAgICBhZGQucHVzaChjbG9zZU5vZGVTdGFydChuZXh0Lm1hcmsodHlwZS5hbGxvd2VkTWFya3MobmV4dC5tYXJrcykpLCB0YWtlbiA9PSAxID8gb3BlblN0YXJ0IDogMCwgdGFrZW4gPT0gZnJhZ21lbnQuY2hpbGRDb3VudCA/IG9wZW5FbmRDb3VudCA6IC0xKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRvRW5kID0gdGFrZW4gPT0gZnJhZ21lbnQuY2hpbGRDb3VudDtcbiAgICAgICAgaWYgKCF0b0VuZClcbiAgICAgICAgICAgIG9wZW5FbmRDb3VudCA9IC0xO1xuICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIGZyb250aWVyRGVwdGgsIEZyYWdtZW50LmZyb20oYWRkKSk7XG4gICAgICAgIHRoaXMuZnJvbnRpZXJbZnJvbnRpZXJEZXB0aF0ubWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCB0eXBlcyBtYXRjaCwgYW5kIHRoZSBlbnRpcmUgbm9kZSB3YXMgbW92ZWQsIGFuZFxuICAgICAgICAvLyBpdCdzIG5vdCBvcGVuLCBjbG9zZSB0aGlzIGZyb250aWVyIG5vZGUgcmlnaHQgYXdheS5cbiAgICAgICAgaWYgKHRvRW5kICYmIG9wZW5FbmRDb3VudCA8IDAgJiYgcGFyZW50ICYmIHBhcmVudC50eXBlID09IHRoaXMuZnJvbnRpZXJbdGhpcy5kZXB0aF0udHlwZSAmJiB0aGlzLmZyb250aWVyLmxlbmd0aCA+IDEpXG4gICAgICAgICAgICB0aGlzLmNsb3NlRnJvbnRpZXJOb2RlKCk7XG4gICAgICAgIC8vIEFkZCBuZXcgZnJvbnRpZXIgbm9kZXMgZm9yIGFueSBvcGVuIG5vZGVzIGF0IHRoZSBlbmQuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjdXIgPSBmcmFnbWVudDsgaSA8IG9wZW5FbmRDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGN1ci5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICB0aGlzLmZyb250aWVyLnB1c2goeyB0eXBlOiBub2RlLnR5cGUsIG1hdGNoOiBub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkgfSk7XG4gICAgICAgICAgICBjdXIgPSBub2RlLmNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIGB0aGlzLnVucGxhY2VkYC4gRHJvcCB0aGUgZW50aXJlIG5vZGUgZnJvbSB3aGljaCB3ZVxuICAgICAgICAvLyBwbGFjZWQgaXQgd2UgZ290IHRvIGl0cyBlbmQsIG90aGVyd2lzZSBqdXN0IGRyb3AgdGhlIHBsYWNlZFxuICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgdGhpcy51bnBsYWNlZCA9ICF0b0VuZCA/IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIHNsaWNlRGVwdGgsIHRha2VuKSwgc2xpY2Uub3BlblN0YXJ0LCBzbGljZS5vcGVuRW5kKVxuICAgICAgICAgICAgOiBzbGljZURlcHRoID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoc2xpY2UuY29udGVudCwgc2xpY2VEZXB0aCAtIDEsIDEpLCBzbGljZURlcHRoIC0gMSwgb3BlbkVuZENvdW50IDwgMCA/IHNsaWNlLm9wZW5FbmQgOiBzbGljZURlcHRoIC0gMSk7XG4gICAgfVxuICAgIG11c3RNb3ZlSW5saW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuJHRvLnBhcmVudC5pc1RleHRibG9jaylcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMuZnJvbnRpZXJbdGhpcy5kZXB0aF0sIGxldmVsO1xuICAgICAgICBpZiAoIXRvcC50eXBlLmlzVGV4dGJsb2NrIHx8ICFjb250ZW50QWZ0ZXJGaXRzKHRoaXMuJHRvLCB0aGlzLiR0by5kZXB0aCwgdG9wLnR5cGUsIHRvcC5tYXRjaCwgZmFsc2UpIHx8XG4gICAgICAgICAgICAodGhpcy4kdG8uZGVwdGggPT0gdGhpcy5kZXB0aCAmJiAobGV2ZWwgPSB0aGlzLmZpbmRDbG9zZUxldmVsKHRoaXMuJHRvKSkgJiYgbGV2ZWwuZGVwdGggPT0gdGhpcy5kZXB0aCkpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGxldCB7IGRlcHRoIH0gPSB0aGlzLiR0bywgYWZ0ZXIgPSB0aGlzLiR0by5hZnRlcihkZXB0aCk7XG4gICAgICAgIHdoaWxlIChkZXB0aCA+IDEgJiYgYWZ0ZXIgPT0gdGhpcy4kdG8uZW5kKC0tZGVwdGgpKVxuICAgICAgICAgICAgKythZnRlcjtcbiAgICAgICAgcmV0dXJuIGFmdGVyO1xuICAgIH1cbiAgICBmaW5kQ2xvc2VMZXZlbCgkdG8pIHtcbiAgICAgICAgc2NhbjogZm9yIChsZXQgaSA9IE1hdGgubWluKHRoaXMuZGVwdGgsICR0by5kZXB0aCk7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgeyBtYXRjaCwgdHlwZSB9ID0gdGhpcy5mcm9udGllcltpXTtcbiAgICAgICAgICAgIGxldCBkcm9wSW5uZXIgPSBpIDwgJHRvLmRlcHRoICYmICR0by5lbmQoaSArIDEpID09ICR0by5wb3MgKyAoJHRvLmRlcHRoIC0gKGkgKyAxKSk7XG4gICAgICAgICAgICBsZXQgZml0ID0gY29udGVudEFmdGVyRml0cygkdG8sIGksIHR5cGUsIG1hdGNoLCBkcm9wSW5uZXIpO1xuICAgICAgICAgICAgaWYgKCFmaXQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBkID0gaSAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgbWF0Y2gsIHR5cGUgfSA9IHRoaXMuZnJvbnRpZXJbZF07XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBjb250ZW50QWZ0ZXJGaXRzKCR0bywgZCwgdHlwZSwgbWF0Y2gsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcyB8fCBtYXRjaGVzLmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNjYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBkZXB0aDogaSwgZml0LCBtb3ZlOiBkcm9wSW5uZXIgPyAkdG8uZG9jLnJlc29sdmUoJHRvLmFmdGVyKGkgKyAxKSkgOiAkdG8gfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbG9zZSgkdG8pIHtcbiAgICAgICAgbGV0IGNsb3NlID0gdGhpcy5maW5kQ2xvc2VMZXZlbCgkdG8pO1xuICAgICAgICBpZiAoIWNsb3NlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHdoaWxlICh0aGlzLmRlcHRoID4gY2xvc2UuZGVwdGgpXG4gICAgICAgICAgICB0aGlzLmNsb3NlRnJvbnRpZXJOb2RlKCk7XG4gICAgICAgIGlmIChjbG9zZS5maXQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgY2xvc2UuZGVwdGgsIGNsb3NlLmZpdCk7XG4gICAgICAgICR0byA9IGNsb3NlLm1vdmU7XG4gICAgICAgIGZvciAobGV0IGQgPSBjbG9zZS5kZXB0aCArIDE7IGQgPD0gJHRvLmRlcHRoOyBkKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gJHRvLm5vZGUoZCksIGFkZCA9IG5vZGUudHlwZS5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShub2RlLmNvbnRlbnQsIHRydWUsICR0by5pbmRleChkKSk7XG4gICAgICAgICAgICB0aGlzLm9wZW5Gcm9udGllck5vZGUobm9kZS50eXBlLCBub2RlLmF0dHJzLCBhZGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAkdG87XG4gICAgfVxuICAgIG9wZW5Gcm9udGllck5vZGUodHlwZSwgYXR0cnMgPSBudWxsLCBjb250ZW50KSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdO1xuICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIHRoaXMuZGVwdGgsIEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGUoYXR0cnMsIGNvbnRlbnQpKSk7XG4gICAgICAgIHRoaXMuZnJvbnRpZXIucHVzaCh7IHR5cGUsIG1hdGNoOiB0eXBlLmNvbnRlbnRNYXRjaCB9KTtcbiAgICB9XG4gICAgY2xvc2VGcm9udGllck5vZGUoKSB7XG4gICAgICAgIGxldCBvcGVuID0gdGhpcy5mcm9udGllci5wb3AoKTtcbiAgICAgICAgbGV0IGFkZCA9IG9wZW4ubWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgICAgIGlmIChhZGQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgdGhpcy5mcm9udGllci5sZW5ndGgsIGFkZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZHJvcEZyb21GcmFnbWVudChmcmFnbWVudCwgZGVwdGgsIGNvdW50KSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBmcmFnbWVudC5jdXRCeUluZGV4KGNvdW50LCBmcmFnbWVudC5jaGlsZENvdW50KTtcbiAgICByZXR1cm4gZnJhZ21lbnQucmVwbGFjZUNoaWxkKDAsIGZyYWdtZW50LmZpcnN0Q2hpbGQuY29weShkcm9wRnJvbUZyYWdtZW50KGZyYWdtZW50LmZpcnN0Q2hpbGQuY29udGVudCwgZGVwdGggLSAxLCBjb3VudCkpKTtcbn1cbmZ1bmN0aW9uIGFkZFRvRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBjb250ZW50KSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBmcmFnbWVudC5hcHBlbmQoY29udGVudCk7XG4gICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2VDaGlsZChmcmFnbWVudC5jaGlsZENvdW50IC0gMSwgZnJhZ21lbnQubGFzdENoaWxkLmNvcHkoYWRkVG9GcmFnbWVudChmcmFnbWVudC5sYXN0Q2hpbGQuY29udGVudCwgZGVwdGggLSAxLCBjb250ZW50KSkpO1xufVxuZnVuY3Rpb24gY29udGVudEF0KGZyYWdtZW50LCBkZXB0aCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC5maXJzdENoaWxkLmNvbnRlbnQ7XG4gICAgcmV0dXJuIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gY2xvc2VOb2RlU3RhcnQobm9kZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgaWYgKG9wZW5TdGFydCA8PSAwKVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICBsZXQgZnJhZyA9IG5vZGUuY29udGVudDtcbiAgICBpZiAob3BlblN0YXJ0ID4gMSlcbiAgICAgICAgZnJhZyA9IGZyYWcucmVwbGFjZUNoaWxkKDAsIGNsb3NlTm9kZVN0YXJ0KGZyYWcuZmlyc3RDaGlsZCwgb3BlblN0YXJ0IC0gMSwgZnJhZy5jaGlsZENvdW50ID09IDEgPyBvcGVuRW5kIC0gMSA6IDApKTtcbiAgICBpZiAob3BlblN0YXJ0ID4gMCkge1xuICAgICAgICBmcmFnID0gbm9kZS50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKGZyYWcpLmFwcGVuZChmcmFnKTtcbiAgICAgICAgaWYgKG9wZW5FbmQgPD0gMClcbiAgICAgICAgICAgIGZyYWcgPSBmcmFnLmFwcGVuZChub2RlLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoZnJhZykuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5jb3B5KGZyYWcpO1xufVxuZnVuY3Rpb24gY29udGVudEFmdGVyRml0cygkdG8sIGRlcHRoLCB0eXBlLCBtYXRjaCwgb3Blbikge1xuICAgIGxldCBub2RlID0gJHRvLm5vZGUoZGVwdGgpLCBpbmRleCA9IG9wZW4gPyAkdG8uaW5kZXhBZnRlcihkZXB0aCkgOiAkdG8uaW5kZXgoZGVwdGgpO1xuICAgIGlmIChpbmRleCA9PSBub2RlLmNoaWxkQ291bnQgJiYgIXR5cGUuY29tcGF0aWJsZUNvbnRlbnQobm9kZS50eXBlKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGZpdCA9IG1hdGNoLmZpbGxCZWZvcmUobm9kZS5jb250ZW50LCB0cnVlLCBpbmRleCk7XG4gICAgcmV0dXJuIGZpdCAmJiAhaW52YWxpZE1hcmtzKHR5cGUsIG5vZGUuY29udGVudCwgaW5kZXgpID8gZml0IDogbnVsbDtcbn1cbmZ1bmN0aW9uIGludmFsaWRNYXJrcyh0eXBlLCBmcmFnbWVudCwgc3RhcnQpIHtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBmcmFnbWVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgIGlmICghdHlwZS5hbGxvd3NNYXJrcyhmcmFnbWVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBkZWZpbmVzQ29udGVudCh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGUuc3BlYy5kZWZpbmluZyB8fCB0eXBlLnNwZWMuZGVmaW5pbmdGb3JDb250ZW50O1xufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlKHRyLCBmcm9tLCB0bywgc2xpY2UpIHtcbiAgICBpZiAoIXNsaWNlLnNpemUpXG4gICAgICAgIHJldHVybiB0ci5kZWxldGVSYW5nZShmcm9tLCB0byk7XG4gICAgbGV0ICRmcm9tID0gdHIuZG9jLnJlc29sdmUoZnJvbSksICR0byA9IHRyLmRvYy5yZXNvbHZlKHRvKTtcbiAgICBpZiAoZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkpXG4gICAgICAgIHJldHVybiB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChmcm9tLCB0bywgc2xpY2UpKTtcbiAgICBsZXQgdGFyZ2V0RGVwdGhzID0gY292ZXJlZERlcHRocygkZnJvbSwgdHIuZG9jLnJlc29sdmUodG8pKTtcbiAgICAvLyBDYW4ndCByZXBsYWNlIHRoZSB3aG9sZSBkb2N1bWVudCwgc28gcmVtb3ZlIDAgaWYgaXQncyBwcmVzZW50XG4gICAgaWYgKHRhcmdldERlcHRoc1t0YXJnZXREZXB0aHMubGVuZ3RoIC0gMV0gPT0gMClcbiAgICAgICAgdGFyZ2V0RGVwdGhzLnBvcCgpO1xuICAgIC8vIE5lZ2F0aXZlIG51bWJlcnMgcmVwcmVzZW50IG5vdCBleHBhbnNpb24gb3ZlciB0aGUgd2hvbGUgbm9kZSBhdFxuICAgIC8vIHRoYXQgZGVwdGgsIGJ1dCByZXBsYWNpbmcgZnJvbSAkZnJvbS5iZWZvcmUoLUQpIHRvICR0by5wb3MuXG4gICAgbGV0IHByZWZlcnJlZFRhcmdldCA9IC0oJGZyb20uZGVwdGggKyAxKTtcbiAgICB0YXJnZXREZXB0aHMudW5zaGlmdChwcmVmZXJyZWRUYXJnZXQpO1xuICAgIC8vIFRoaXMgbG9vcCBwaWNrcyBhIHByZWZlcnJlZCB0YXJnZXQgZGVwdGgsIGlmIG9uZSBvZiB0aGUgY292ZXJpbmdcbiAgICAvLyBkZXB0aHMgaXMgbm90IG91dHNpZGUgb2YgYSBkZWZpbmluZyBub2RlLCBhbmQgYWRkcyBuZWdhdGl2ZVxuICAgIC8vIGRlcHRocyBmb3IgYW55IGRlcHRoIHRoYXQgaGFzICRmcm9tIGF0IGl0cyBzdGFydCBhbmQgZG9lcyBub3RcbiAgICAvLyBjcm9zcyBhIGRlZmluaW5nIG5vZGUuXG4gICAgZm9yIChsZXQgZCA9ICRmcm9tLmRlcHRoLCBwb3MgPSAkZnJvbS5wb3MgLSAxOyBkID4gMDsgZC0tLCBwb3MtLSkge1xuICAgICAgICBsZXQgc3BlYyA9ICRmcm9tLm5vZGUoZCkudHlwZS5zcGVjO1xuICAgICAgICBpZiAoc3BlYy5kZWZpbmluZyB8fCBzcGVjLmRlZmluaW5nQXNDb250ZXh0IHx8IHNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmICh0YXJnZXREZXB0aHMuaW5kZXhPZihkKSA+IC0xKVxuICAgICAgICAgICAgcHJlZmVycmVkVGFyZ2V0ID0gZDtcbiAgICAgICAgZWxzZSBpZiAoJGZyb20uYmVmb3JlKGQpID09IHBvcylcbiAgICAgICAgICAgIHRhcmdldERlcHRocy5zcGxpY2UoMSwgMCwgLWQpO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gZml0IGVhY2ggcG9zc2libGUgZGVwdGggb2YgdGhlIHNsaWNlIGludG8gZWFjaCBwb3NzaWJsZVxuICAgIC8vIHRhcmdldCBkZXB0aCwgc3RhcnRpbmcgd2l0aCB0aGUgcHJlZmVycmVkIGRlcHRocy5cbiAgICBsZXQgcHJlZmVycmVkVGFyZ2V0SW5kZXggPSB0YXJnZXREZXB0aHMuaW5kZXhPZihwcmVmZXJyZWRUYXJnZXQpO1xuICAgIGxldCBsZWZ0Tm9kZXMgPSBbXSwgcHJlZmVycmVkRGVwdGggPSBzbGljZS5vcGVuU3RhcnQ7XG4gICAgZm9yIChsZXQgY29udGVudCA9IHNsaWNlLmNvbnRlbnQsIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGxldCBub2RlID0gY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICBsZWZ0Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgaWYgKGkgPT0gc2xpY2Uub3BlblN0YXJ0KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnRlbnQgPSBub2RlLmNvbnRlbnQ7XG4gICAgfVxuICAgIC8vIEJhY2sgdXAgcHJlZmVycmVkRGVwdGggdG8gY292ZXIgZGVmaW5pbmcgdGV4dGJsb2NrcyBkaXJlY3RseVxuICAgIC8vIGFib3ZlIGl0LCBwb3NzaWJseSBza2lwcGluZyBhIG5vbi1kZWZpbmluZyB0ZXh0YmxvY2suXG4gICAgZm9yIChsZXQgZCA9IHByZWZlcnJlZERlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IGxlZnROb2RlID0gbGVmdE5vZGVzW2RdLCBkZWYgPSBkZWZpbmVzQ29udGVudChsZWZ0Tm9kZS50eXBlKTtcbiAgICAgICAgaWYgKGRlZiAmJiAhbGVmdE5vZGUuc2FtZU1hcmt1cCgkZnJvbS5ub2RlKE1hdGguYWJzKHByZWZlcnJlZFRhcmdldCkgLSAxKSkpXG4gICAgICAgICAgICBwcmVmZXJyZWREZXB0aCA9IGQ7XG4gICAgICAgIGVsc2UgaWYgKGRlZiB8fCAhbGVmdE5vZGUudHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gc2xpY2Uub3BlblN0YXJ0OyBqID49IDA7IGotLSkge1xuICAgICAgICBsZXQgb3BlbkRlcHRoID0gKGogKyBwcmVmZXJyZWREZXB0aCArIDEpICUgKHNsaWNlLm9wZW5TdGFydCArIDEpO1xuICAgICAgICBsZXQgaW5zZXJ0ID0gbGVmdE5vZGVzW29wZW5EZXB0aF07XG4gICAgICAgIGlmICghaW5zZXJ0KVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0RGVwdGhzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgcG9zc2libGUgZXhwYW5zaW9uIGxldmVscywgc3RhcnRpbmcgd2l0aCB0aGVcbiAgICAgICAgICAgIC8vIHByZWZlcnJlZCBvbmVcbiAgICAgICAgICAgIGxldCB0YXJnZXREZXB0aCA9IHRhcmdldERlcHRoc1soaSArIHByZWZlcnJlZFRhcmdldEluZGV4KSAlIHRhcmdldERlcHRocy5sZW5ndGhdLCBleHBhbmQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRhcmdldERlcHRoIDwgMCkge1xuICAgICAgICAgICAgICAgIGV4cGFuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRhcmdldERlcHRoID0gLXRhcmdldERlcHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRmcm9tLm5vZGUodGFyZ2V0RGVwdGggLSAxKSwgaW5kZXggPSAkZnJvbS5pbmRleCh0YXJnZXREZXB0aCAtIDEpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIGluc2VydC50eXBlLCBpbnNlcnQubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0ci5yZXBsYWNlKCRmcm9tLmJlZm9yZSh0YXJnZXREZXB0aCksIGV4cGFuZCA/ICR0by5hZnRlcih0YXJnZXREZXB0aCkgOiB0bywgbmV3IFNsaWNlKGNsb3NlRnJhZ21lbnQoc2xpY2UuY29udGVudCwgMCwgc2xpY2Uub3BlblN0YXJ0LCBvcGVuRGVwdGgpLCBvcGVuRGVwdGgsIHNsaWNlLm9wZW5FbmQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgc3RhcnRTdGVwcyA9IHRyLnN0ZXBzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gdGFyZ2V0RGVwdGhzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRyLnJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgaWYgKHRyLnN0ZXBzLmxlbmd0aCA+IHN0YXJ0U3RlcHMpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGRlcHRoID0gdGFyZ2V0RGVwdGhzW2ldO1xuICAgICAgICBpZiAoZGVwdGggPCAwKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZyb20gPSAkZnJvbS5iZWZvcmUoZGVwdGgpO1xuICAgICAgICB0byA9ICR0by5hZnRlcihkZXB0aCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xvc2VGcmFnbWVudChmcmFnbWVudCwgZGVwdGgsIG9sZE9wZW4sIG5ld09wZW4sIHBhcmVudCkge1xuICAgIGlmIChkZXB0aCA8IG9sZE9wZW4pIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoMCwgZmlyc3QuY29weShjbG9zZUZyYWdtZW50KGZpcnN0LmNvbnRlbnQsIGRlcHRoICsgMSwgb2xkT3BlbiwgbmV3T3BlbiwgZmlyc3QpKSk7XG4gICAgfVxuICAgIGlmIChkZXB0aCA+IG5ld09wZW4pIHtcbiAgICAgICAgbGV0IG1hdGNoID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KDApO1xuICAgICAgICBsZXQgc3RhcnQgPSBtYXRjaC5maWxsQmVmb3JlKGZyYWdtZW50KS5hcHBlbmQoZnJhZ21lbnQpO1xuICAgICAgICBmcmFnbWVudCA9IHN0YXJ0LmFwcGVuZChtYXRjaC5tYXRjaEZyYWdtZW50KHN0YXJ0KS5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZVdpdGgodHIsIGZyb20sIHRvLCBub2RlKSB7XG4gICAgaWYgKCFub2RlLmlzSW5saW5lICYmIGZyb20gPT0gdG8gJiYgdHIuZG9jLnJlc29sdmUoZnJvbSkucGFyZW50LmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICBsZXQgcG9pbnQgPSBpbnNlcnRQb2ludCh0ci5kb2MsIGZyb20sIG5vZGUudHlwZSk7XG4gICAgICAgIGlmIChwb2ludCAhPSBudWxsKVxuICAgICAgICAgICAgZnJvbSA9IHRvID0gcG9pbnQ7XG4gICAgfVxuICAgIHRyLnJlcGxhY2VSYW5nZShmcm9tLCB0bywgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20obm9kZSksIDAsIDApKTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVJhbmdlKHRyLCBmcm9tLCB0bykge1xuICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0ci5kb2MucmVzb2x2ZSh0byk7XG4gICAgbGV0IGNvdmVyZWQgPSBjb3ZlcmVkRGVwdGhzKCRmcm9tLCAkdG8pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY292ZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVwdGggPSBjb3ZlcmVkW2ldLCBsYXN0ID0gaSA9PSBjb3ZlcmVkLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmICgobGFzdCAmJiBkZXB0aCA9PSAwKSB8fCAkZnJvbS5ub2RlKGRlcHRoKS50eXBlLmNvbnRlbnRNYXRjaC52YWxpZEVuZClcbiAgICAgICAgICAgIHJldHVybiB0ci5kZWxldGUoJGZyb20uc3RhcnQoZGVwdGgpLCAkdG8uZW5kKGRlcHRoKSk7XG4gICAgICAgIGlmIChkZXB0aCA+IDAgJiYgKGxhc3QgfHwgJGZyb20ubm9kZShkZXB0aCAtIDEpLmNhblJlcGxhY2UoJGZyb20uaW5kZXgoZGVwdGggLSAxKSwgJHRvLmluZGV4QWZ0ZXIoZGVwdGggLSAxKSkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZSgkZnJvbS5iZWZvcmUoZGVwdGgpLCAkdG8uYWZ0ZXIoZGVwdGgpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZCA9IDE7IGQgPD0gJGZyb20uZGVwdGggJiYgZCA8PSAkdG8uZGVwdGg7IGQrKykge1xuICAgICAgICBpZiAoZnJvbSAtICRmcm9tLnN0YXJ0KGQpID09ICRmcm9tLmRlcHRoIC0gZCAmJiB0byA+ICRmcm9tLmVuZChkKSAmJiAkdG8uZW5kKGQpIC0gdG8gIT0gJHRvLmRlcHRoIC0gZCAmJlxuICAgICAgICAgICAgJGZyb20uc3RhcnQoZCAtIDEpID09ICR0by5zdGFydChkIC0gMSkgJiYgJGZyb20ubm9kZShkIC0gMSkuY2FuUmVwbGFjZSgkZnJvbS5pbmRleChkIC0gMSksICR0by5pbmRleChkIC0gMSkpKVxuICAgICAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZSgkZnJvbS5iZWZvcmUoZCksIHRvKTtcbiAgICB9XG4gICAgdHIuZGVsZXRlKGZyb20sIHRvKTtcbn1cbi8vIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGRlcHRocyBmb3Igd2hpY2ggJGZyb20gLSAkdG8gc3BhbnMgdGhlXG4vLyB3aG9sZSBjb250ZW50IG9mIHRoZSBub2RlcyBhdCB0aGF0IGRlcHRoLlxuZnVuY3Rpb24gY292ZXJlZERlcHRocygkZnJvbSwgJHRvKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdLCBtaW5EZXB0aCA9IE1hdGgubWluKCRmcm9tLmRlcHRoLCAkdG8uZGVwdGgpO1xuICAgIGZvciAobGV0IGQgPSBtaW5EZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uc3RhcnQoZCk7XG4gICAgICAgIGlmIChzdGFydCA8ICRmcm9tLnBvcyAtICgkZnJvbS5kZXB0aCAtIGQpIHx8XG4gICAgICAgICAgICAkdG8uZW5kKGQpID4gJHRvLnBvcyArICgkdG8uZGVwdGggLSBkKSB8fFxuICAgICAgICAgICAgJGZyb20ubm9kZShkKS50eXBlLnNwZWMuaXNvbGF0aW5nIHx8XG4gICAgICAgICAgICAkdG8ubm9kZShkKS50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChzdGFydCA9PSAkdG8uc3RhcnQoZCkgfHxcbiAgICAgICAgICAgIChkID09ICRmcm9tLmRlcHRoICYmIGQgPT0gJHRvLmRlcHRoICYmICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50ICYmICR0by5wYXJlbnQuaW5saW5lQ29udGVudCAmJlxuICAgICAgICAgICAgICAgIGQgJiYgJHRvLnN0YXJ0KGQgLSAxKSA9PSBzdGFydCAtIDEpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuVXBkYXRlIGFuIGF0dHJpYnV0ZSBpbiBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgQXR0clN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYW4gYXR0cmlidXRlIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlIHRvIHNldC5cbiAgICAqL1xuICAgIGF0dHIsIFxuICAgIC8vIFRoZSBhdHRyaWJ1dGUncyBuZXcgdmFsdWUuXG4gICAgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBub2RlID0gZG9jLm5vZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJObyBub2RlIGF0IGF0dHJpYnV0ZSBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gbm9kZS5hdHRycylcbiAgICAgICAgICAgIGF0dHJzW25hbWVdID0gbm9kZS5hdHRyc1tuYW1lXTtcbiAgICAgICAgYXR0cnNbdGhpcy5hdHRyXSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShhdHRycywgbnVsbCwgbm9kZS5tYXJrcyk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gU3RlcE1hcC5lbXB0eTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJTdGVwKHRoaXMucG9zLCB0aGlzLmF0dHIsIGRvYy5ub2RlQXQodGhpcy5wb3MpLmF0dHJzW3RoaXMuYXR0cl0pO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgQXR0clN0ZXAocG9zLnBvcywgdGhpcy5hdHRyLCB0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJhdHRyXCIsIHBvczogdGhpcy5wb3MsIGF0dHI6IHRoaXMuYXR0ciwgdmFsdWU6IHRoaXMudmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uYXR0ciAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBdHRyU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBdHRyU3RlcChqc29uLnBvcywganNvbi5hdHRyLCBqc29uLnZhbHVlKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcImF0dHJcIiwgQXR0clN0ZXApO1xuLyoqXG5VcGRhdGUgYW4gYXR0cmlidXRlIGluIHRoZSBkb2Mgbm9kZS5cbiovXG5jbGFzcyBEb2NBdHRyU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgICovXG4gICAgYXR0ciwgXG4gICAgLy8gVGhlIGF0dHJpYnV0ZSdzIG5ldyB2YWx1ZS5cbiAgICB2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmF0dHIgPSBhdHRyO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGRvYy5hdHRycylcbiAgICAgICAgICAgIGF0dHJzW25hbWVdID0gZG9jLmF0dHJzW25hbWVdO1xuICAgICAgICBhdHRyc1t0aGlzLmF0dHJdID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBkb2MudHlwZS5jcmVhdGUoYXR0cnMsIGRvYy5jb250ZW50LCBkb2MubWFya3MpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5vayh1cGRhdGVkKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gU3RlcE1hcC5lbXB0eTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gbmV3IERvY0F0dHJTdGVwKHRoaXMuYXR0ciwgZG9jLmF0dHJzW3RoaXMuYXR0cl0pO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJkb2NBdHRyXCIsIGF0dHI6IHRoaXMuYXR0ciwgdmFsdWU6IHRoaXMudmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYXR0ciAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBEb2NBdHRyU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEb2NBdHRyU3RlcChqc29uLmF0dHIsIGpzb24udmFsdWUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiZG9jQXR0clwiLCBEb2NBdHRyU3RlcCk7XG5cbi8qKlxuQGludGVybmFsXG4qL1xubGV0IFRyYW5zZm9ybUVycm9yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG59O1xuVHJhbnNmb3JtRXJyb3IgPSBmdW5jdGlvbiBUcmFuc2Zvcm1FcnJvcihtZXNzYWdlKSB7XG4gICAgbGV0IGVyciA9IEVycm9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG4gICAgZXJyLl9fcHJvdG9fXyA9IFRyYW5zZm9ybUVycm9yLnByb3RvdHlwZTtcbiAgICByZXR1cm4gZXJyO1xufTtcblRyYW5zZm9ybUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblRyYW5zZm9ybUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRyYW5zZm9ybUVycm9yO1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIlRyYW5zZm9ybUVycm9yXCI7XG4vKipcbkFic3RyYWN0aW9uIHRvIGJ1aWxkIHVwIGFuZCB0cmFjayBhbiBhcnJheSBvZlxuW3N0ZXBzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXApIHJlcHJlc2VudGluZyBhIGRvY3VtZW50IHRyYW5zZm9ybWF0aW9uLlxuXG5Nb3N0IHRyYW5zZm9ybWluZyBtZXRob2RzIHJldHVybiB0aGUgYFRyYW5zZm9ybWAgb2JqZWN0IGl0c2VsZiwgc29cbnRoYXQgdGhleSBjYW4gYmUgY2hhaW5lZC5cbiovXG5jbGFzcyBUcmFuc2Zvcm0ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRyYW5zZm9ybSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBjdXJyZW50IGRvY3VtZW50ICh0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBzdGVwcyBpbiB0aGVcbiAgICB0cmFuc2Zvcm0pLlxuICAgICovXG4gICAgZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNmb3JtLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0ZXBzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgZG9jdW1lbnRzIGJlZm9yZSBlYWNoIG9mIHRoZSBzdGVwcy5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kb2NzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBBIG1hcHBpbmcgd2l0aCB0aGUgbWFwcyBmb3IgZWFjaCBvZiB0aGUgc3RlcHMgaW4gdGhpcyB0cmFuc2Zvcm0uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWFwcGluZyA9IG5ldyBNYXBwaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3RhcnRpbmcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXQgYmVmb3JlKCkgeyByZXR1cm4gdGhpcy5kb2NzLmxlbmd0aCA/IHRoaXMuZG9jc1swXSA6IHRoaXMuZG9jOyB9XG4gICAgLyoqXG4gICAgQXBwbHkgYSBuZXcgc3RlcCBpbiB0aGlzIHRyYW5zZm9ybSwgc2F2aW5nIHRoZSByZXN1bHQuIFRocm93cyBhblxuICAgIGVycm9yIHdoZW4gdGhlIHN0ZXAgZmFpbHMuXG4gICAgKi9cbiAgICBzdGVwKHN0ZXApIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMubWF5YmVTdGVwKHN0ZXApO1xuICAgICAgICBpZiAocmVzdWx0LmZhaWxlZClcbiAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1FcnJvcihyZXN1bHQuZmFpbGVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBhcHBseSBhIHN0ZXAgaW4gdGhpcyB0cmFuc2Zvcm1hdGlvbiwgaWdub3JpbmcgaXQgaWYgaXRcbiAgICBmYWlscy4gUmV0dXJucyB0aGUgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBtYXliZVN0ZXAoc3RlcCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gc3RlcC5hcHBseSh0aGlzLmRvYyk7XG4gICAgICAgIGlmICghcmVzdWx0LmZhaWxlZClcbiAgICAgICAgICAgIHRoaXMuYWRkU3RlcChzdGVwLCByZXN1bHQuZG9jKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkICh3aGVuIHRoZXJlIGFyZSBhbnlcbiAgICBzdGVwcykuXG4gICAgKi9cbiAgICBnZXQgZG9jQ2hhbmdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRTdGVwKHN0ZXAsIGRvYykge1xuICAgICAgICB0aGlzLmRvY3MucHVzaCh0aGlzLmRvYyk7XG4gICAgICAgIHRoaXMuc3RlcHMucHVzaChzdGVwKTtcbiAgICAgICAgdGhpcy5tYXBwaW5nLmFwcGVuZE1hcChzdGVwLmdldE1hcCgpKTtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIHdpdGggdGhlXG4gICAgZ2l2ZW4gYHNsaWNlYC5cbiAgICAqL1xuICAgIHJlcGxhY2UoZnJvbSwgdG8gPSBmcm9tLCBzbGljZSA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIGxldCBzdGVwID0gcmVwbGFjZVN0ZXAodGhpcy5kb2MsIGZyb20sIHRvLCBzbGljZSk7XG4gICAgICAgIGlmIChzdGVwKVxuICAgICAgICAgICAgdGhpcy5zdGVwKHN0ZXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29udGVudCwgd2hpY2ggbWF5IGJlIGFcbiAgICBmcmFnbWVudCwgbm9kZSwgb3IgYXJyYXkgb2Ygbm9kZXMuXG4gICAgKi9cbiAgICByZXBsYWNlV2l0aChmcm9tLCB0bywgY29udGVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKGZyb20sIHRvLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShjb250ZW50KSwgMCwgMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWxldGUgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLlxuICAgICovXG4gICAgZGVsZXRlKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZnJvbSwgdG8sIFNsaWNlLmVtcHR5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5zZXJ0IHRoZSBnaXZlbiBjb250ZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIGluc2VydChwb3MsIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVdpdGgocG9zLCBwb3MsIGNvbnRlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIGEgcmFuZ2Ugb2YgdGhlIGRvY3VtZW50IHdpdGggYSBnaXZlbiBzbGljZSwgdXNpbmdcbiAgICBgZnJvbWAsIGB0b2AsIGFuZCB0aGUgc2xpY2Unc1xuICAgIFtgb3BlblN0YXJ0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlNsaWNlLm9wZW5TdGFydCkgcHJvcGVydHkgYXMgaGludHMsIHJhdGhlclxuICAgIHRoYW4gZml4ZWQgc3RhcnQgYW5kIGVuZCBwb2ludHMuIFRoaXMgbWV0aG9kIG1heSBncm93IHRoZVxuICAgIHJlcGxhY2VkIGFyZWEgb3IgY2xvc2Ugb3BlbiBub2RlcyBpbiB0aGUgc2xpY2UgaW4gb3JkZXIgdG8gZ2V0IGFcbiAgICBmaXQgdGhhdCBpcyBtb3JlIGluIGxpbmUgd2l0aCBXWVNJV1lHIGV4cGVjdGF0aW9ucywgYnkgZHJvcHBpbmdcbiAgICBmdWxseSBjb3ZlcmVkIHBhcmVudCBub2RlcyBvZiB0aGUgcmVwbGFjZWQgcmVnaW9uIHdoZW4gdGhleSBhcmVcbiAgICBtYXJrZWQgW25vbi1kZWZpbmluZyBhc1xuICAgIGNvbnRleHRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5kZWZpbmluZ0FzQ29udGV4dCksIG9yIGluY2x1ZGluZyBhblxuICAgIG9wZW4gcGFyZW50IG5vZGUgZnJvbSB0aGUgc2xpY2UgdGhhdCBfaXNfIG1hcmtlZCBhcyBbZGVmaW5pbmdcbiAgICBpdHMgY29udGVudF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmRlZmluaW5nRm9yQ29udGVudCkuXG4gICAgXG4gICAgVGhpcyBpcyB0aGUgbWV0aG9kLCBmb3IgZXhhbXBsZSwgdG8gaGFuZGxlIHBhc3RlLiBUaGUgc2ltaWxhclxuICAgIFtgcmVwbGFjZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uVHJhbnNmb3JtLnJlcGxhY2UpIG1ldGhvZCBpcyBhIG1vcmVcbiAgICBwcmltaXRpdmUgdG9vbCB3aGljaCB3aWxsIF9ub3RfIG1vdmUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgaXRzIGdpdmVuXG4gICAgcmFuZ2UsIGFuZCBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB5b3UgbmVlZCBtb3JlIHByZWNpc2VcbiAgICBjb250cm9sIG92ZXIgd2hhdCBoYXBwZW5zLlxuICAgICovXG4gICAgcmVwbGFjZVJhbmdlKGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICByZXBsYWNlUmFuZ2UodGhpcywgZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIGdpdmVuIHJhbmdlIHdpdGggYSBub2RlLCBidXQgdXNlIGBmcm9tYCBhbmQgYHRvYCBhc1xuICAgIGhpbnRzLCByYXRoZXIgdGhhbiBwcmVjaXNlIHBvc2l0aW9ucy4gV2hlbiBmcm9tIGFuZCB0byBhcmUgdGhlIHNhbWVcbiAgICBhbmQgYXJlIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYSBwYXJlbnQgbm9kZSBpbiB3aGljaCB0aGUgZ2l2ZW5cbiAgICBub2RlIGRvZXNuJ3QgZml0LCB0aGlzIG1ldGhvZCBtYXkgX21vdmVfIHRoZW0gb3V0IHRvd2FyZHMgYSBwYXJlbnRcbiAgICB0aGF0IGRvZXMgYWxsb3cgdGhlIGdpdmVuIG5vZGUgdG8gYmUgcGxhY2VkLiBXaGVuIHRoZSBnaXZlbiByYW5nZVxuICAgIGNvbXBsZXRlbHkgY292ZXJzIGEgcGFyZW50IG5vZGUsIHRoaXMgbWV0aG9kIG1heSBjb21wbGV0ZWx5IHJlcGxhY2VcbiAgICB0aGF0IHBhcmVudCBub2RlLlxuICAgICovXG4gICAgcmVwbGFjZVJhbmdlV2l0aChmcm9tLCB0bywgbm9kZSkge1xuICAgICAgICByZXBsYWNlUmFuZ2VXaXRoKHRoaXMsIGZyb20sIHRvLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgZ2l2ZW4gcmFuZ2UsIGV4cGFuZGluZyBpdCB0byBjb3ZlciBmdWxseSBjb3ZlcmVkXG4gICAgcGFyZW50IG5vZGVzIHVudGlsIGEgdmFsaWQgcmVwbGFjZSBpcyBmb3VuZC5cbiAgICAqL1xuICAgIGRlbGV0ZVJhbmdlKGZyb20sIHRvKSB7XG4gICAgICAgIGRlbGV0ZVJhbmdlKHRoaXMsIGZyb20sIHRvKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNwbGl0IHRoZSBjb250ZW50IGluIHRoZSBnaXZlbiByYW5nZSBvZmYgZnJvbSBpdHMgcGFyZW50LCBpZiB0aGVyZVxuICAgIGlzIHNpYmxpbmcgY29udGVudCBiZWZvcmUgb3IgYWZ0ZXIgaXQsIGFuZCBtb3ZlIGl0IHVwIHRoZSB0cmVlIHRvXG4gICAgdGhlIGRlcHRoIHNwZWNpZmllZCBieSBgdGFyZ2V0YC4gWW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdXNlXG4gICAgW2BsaWZ0VGFyZ2V0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5saWZ0VGFyZ2V0KSB0byBjb21wdXRlIGB0YXJnZXRgLCB0byBtYWtlXG4gICAgc3VyZSB0aGUgbGlmdCBpcyB2YWxpZC5cbiAgICAqL1xuICAgIGxpZnQocmFuZ2UsIHRhcmdldCkge1xuICAgICAgICBsaWZ0KHRoaXMsIHJhbmdlLCB0YXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgSm9pbiB0aGUgYmxvY2tzIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uIElmIGRlcHRoIGlzIDIsIHRoZWlyXG4gICAgbGFzdCBhbmQgZmlyc3Qgc2libGluZ3MgYXJlIGFsc28gam9pbmVkLCBhbmQgc28gb24uXG4gICAgKi9cbiAgICBqb2luKHBvcywgZGVwdGggPSAxKSB7XG4gICAgICAgIGpvaW4odGhpcywgcG9zLCBkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBXcmFwIHRoZSBnaXZlbiBbcmFuZ2VdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlUmFuZ2UpIGluIHRoZSBnaXZlbiBzZXQgb2Ygd3JhcHBlcnMuXG4gICAgVGhlIHdyYXBwZXJzIGFyZSBhc3N1bWVkIHRvIGJlIHZhbGlkIGluIHRoaXMgcG9zaXRpb24sIGFuZCBzaG91bGRcbiAgICBwcm9iYWJseSBiZSBjb21wdXRlZCB3aXRoIFtgZmluZFdyYXBwaW5nYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5maW5kV3JhcHBpbmcpLlxuICAgICovXG4gICAgd3JhcChyYW5nZSwgd3JhcHBlcnMpIHtcbiAgICAgICAgd3JhcCh0aGlzLCByYW5nZSwgd3JhcHBlcnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSB0eXBlIG9mIGFsbCB0ZXh0YmxvY2tzIChwYXJ0bHkpIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIHRvXG4gICAgdGhlIGdpdmVuIG5vZGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgc2V0QmxvY2tUeXBlKGZyb20sIHRvID0gZnJvbSwgdHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgICAgIHNldEJsb2NrVHlwZSh0aGlzLCBmcm9tLCB0bywgdHlwZSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hhbmdlIHRoZSB0eXBlLCBhdHRyaWJ1dGVzLCBhbmQvb3IgbWFya3Mgb2YgdGhlIG5vZGUgYXQgYHBvc2AuXG4gICAgV2hlbiBgdHlwZWAgaXNuJ3QgZ2l2ZW4sIHRoZSBleGlzdGluZyBub2RlIHR5cGUgaXMgcHJlc2VydmVkLFxuICAgICovXG4gICAgc2V0Tm9kZU1hcmt1cChwb3MsIHR5cGUsIGF0dHJzID0gbnVsbCwgbWFya3MpIHtcbiAgICAgICAgc2V0Tm9kZU1hcmt1cCh0aGlzLCBwb3MsIHR5cGUsIGF0dHJzLCBtYXJrcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgYSBzaW5nbGUgYXR0cmlidXRlIG9uIGEgZ2l2ZW4gbm9kZSB0byBhIG5ldyB2YWx1ZS5cbiAgICBUaGUgYHBvc2AgYWRkcmVzc2VzIHRoZSBkb2N1bWVudCBjb250ZW50LiBVc2UgYHNldERvY0F0dHJpYnV0ZWBcbiAgICB0byBzZXQgYXR0cmlidXRlcyBvbiB0aGUgZG9jdW1lbnQgaXRzZWxmLlxuICAgICovXG4gICAgc2V0Tm9kZUF0dHJpYnV0ZShwb3MsIGF0dHIsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgQXR0clN0ZXAocG9zLCBhdHRyLCB2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IGEgc2luZ2xlIGF0dHJpYnV0ZSBvbiB0aGUgZG9jdW1lbnQgdG8gYSBuZXcgdmFsdWUuXG4gICAgKi9cbiAgICBzZXREb2NBdHRyaWJ1dGUoYXR0ciwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBEb2NBdHRyU3RlcChhdHRyLCB2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGEgbWFyayB0byB0aGUgbm9kZSBhdCBwb3NpdGlvbiBgcG9zYC5cbiAgICAqL1xuICAgIGFkZE5vZGVNYXJrKHBvcywgbWFyaykge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IEFkZE5vZGVNYXJrU3RlcChwb3MsIG1hcmspKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZSBhIG1hcmsgKG9yIGFsbCBtYXJrcyBvZiB0aGUgZ2l2ZW4gdHlwZSkgZnJvbSB0aGUgbm9kZSBhdFxuICAgIHBvc2l0aW9uIGBwb3NgLlxuICAgICovXG4gICAgcmVtb3ZlTm9kZU1hcmsocG9zLCBtYXJrKSB7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5kb2Mubm9kZUF0KHBvcyk7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBwb3NpdGlvbiBcIiArIHBvcyk7XG4gICAgICAgIGlmIChtYXJrIGluc3RhbmNlb2YgTWFyaykge1xuICAgICAgICAgICAgaWYgKG1hcmsuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXAobmV3IFJlbW92ZU5vZGVNYXJrU3RlcChwb3MsIG1hcmspKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzZXQgPSBub2RlLm1hcmtzLCBmb3VuZCwgc3RlcHMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlIChmb3VuZCA9IG1hcmsuaXNJblNldChzZXQpKSB7XG4gICAgICAgICAgICAgICAgc3RlcHMucHVzaChuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcywgZm91bmQpKTtcbiAgICAgICAgICAgICAgICBzZXQgPSBmb3VuZC5yZW1vdmVGcm9tU2V0KHNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwKHN0ZXBzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIG5vZGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLCBhbmQgb3B0aW9uYWxseSwgaWYgYGRlcHRoYCBpc1xuICAgIGdyZWF0ZXIgdGhhbiBvbmUsIGFueSBudW1iZXIgb2Ygbm9kZXMgYWJvdmUgdGhhdC4gQnkgZGVmYXVsdCwgdGhlXG4gICAgcGFydHMgc3BsaXQgb2ZmIHdpbGwgaW5oZXJpdCB0aGUgbm9kZSB0eXBlIG9mIHRoZSBvcmlnaW5hbCBub2RlLlxuICAgIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgcGFzc2luZyBhbiBhcnJheSBvZiB0eXBlcyBhbmQgYXR0cmlidXRlcyB0b1xuICAgIHVzZSBhZnRlciB0aGUgc3BsaXQgKHdpdGggdGhlIG91dGVybW9zdCBub2RlcyBjb21pbmcgZmlyc3QpLlxuICAgICovXG4gICAgc3BsaXQocG9zLCBkZXB0aCA9IDEsIHR5cGVzQWZ0ZXIpIHtcbiAgICAgICAgc3BsaXQodGhpcywgcG9zLCBkZXB0aCwgdHlwZXNBZnRlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgdGhlIGdpdmVuIG1hcmsgdG8gdGhlIGlubGluZSBjb250ZW50IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLlxuICAgICovXG4gICAgYWRkTWFyayhmcm9tLCB0bywgbWFyaykge1xuICAgICAgICBhZGRNYXJrKHRoaXMsIGZyb20sIHRvLCBtYXJrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZSBtYXJrcyBmcm9tIGlubGluZSBub2RlcyBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC4gV2hlblxuICAgIGBtYXJrYCBpcyBhIHNpbmdsZSBtYXJrLCByZW1vdmUgcHJlY2lzZWx5IHRoYXQgbWFyay4gV2hlbiBpdCBpc1xuICAgIGEgbWFyayB0eXBlLCByZW1vdmUgYWxsIG1hcmtzIG9mIHRoYXQgdHlwZS4gV2hlbiBpdCBpcyBudWxsLFxuICAgIHJlbW92ZSBhbGwgbWFya3Mgb2YgYW55IHR5cGUuXG4gICAgKi9cbiAgICByZW1vdmVNYXJrKGZyb20sIHRvLCBtYXJrKSB7XG4gICAgICAgIHJlbW92ZU1hcmsodGhpcywgZnJvbSwgdG8sIG1hcmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlcyBhbGwgbWFya3MgYW5kIG5vZGVzIGZyb20gdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgYXRcbiAgICBgcG9zYCB0aGF0IGRvbid0IG1hdGNoIHRoZSBnaXZlbiBuZXcgcGFyZW50IG5vZGUgdHlwZS4gQWNjZXB0c1xuICAgIGFuIG9wdGlvbmFsIHN0YXJ0aW5nIFtjb250ZW50IG1hdGNoXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuQ29udGVudE1hdGNoKSBhc1xuICAgIHRoaXJkIGFyZ3VtZW50LlxuICAgICovXG4gICAgY2xlYXJJbmNvbXBhdGlibGUocG9zLCBwYXJlbnRUeXBlLCBtYXRjaCkge1xuICAgICAgICBjbGVhckluY29tcGF0aWJsZSh0aGlzLCBwb3MsIHBhcmVudFR5cGUsIG1hdGNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgeyBBZGRNYXJrU3RlcCwgQWRkTm9kZU1hcmtTdGVwLCBBdHRyU3RlcCwgRG9jQXR0clN0ZXAsIE1hcFJlc3VsdCwgTWFwcGluZywgUmVtb3ZlTWFya1N0ZXAsIFJlbW92ZU5vZGVNYXJrU3RlcCwgUmVwbGFjZUFyb3VuZFN0ZXAsIFJlcGxhY2VTdGVwLCBTdGVwLCBTdGVwTWFwLCBTdGVwUmVzdWx0LCBUcmFuc2Zvcm0sIFRyYW5zZm9ybUVycm9yLCBjYW5Kb2luLCBjYW5TcGxpdCwgZHJvcFBvaW50LCBmaW5kV3JhcHBpbmcsIGluc2VydFBvaW50LCBqb2luUG9pbnQsIGxpZnRUYXJnZXQsIHJlcGxhY2VTdGVwIH07XG4iLCJpbXBvcnQgeyBTbGljZSwgRnJhZ21lbnQsIE1hcmssIE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBSZXBsYWNlU3RlcCwgUmVwbGFjZUFyb3VuZFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGNsYXNzZXNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuU3VwZXJjbGFzcyBmb3IgZWRpdG9yIHNlbGVjdGlvbnMuIEV2ZXJ5IHNlbGVjdGlvbiB0eXBlIHNob3VsZFxuZXh0ZW5kIHRoaXMuIFNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuKi9cbmNsYXNzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgSW5pdGlhbGl6ZSBhIHNlbGVjdGlvbiB3aXRoIHRoZSBoZWFkIGFuZCBhbmNob3IgYW5kIHJhbmdlcy4gSWYgbm9cbiAgICByYW5nZXMgYXJlIGdpdmVuLCBjb25zdHJ1Y3RzIGEgc2luZ2xlIHJhbmdlIGFjcm9zcyBgJGFuY2hvcmAgYW5kXG4gICAgYCRoZWFkYC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBhbmNob3Igb2YgdGhlIHNlbGVjdGlvbiAodGhlIHNpZGUgdGhhdCBzdGF5cyBpblxuICAgIHBsYWNlIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCkuXG4gICAgKi9cbiAgICAkYW5jaG9yLCBcbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgaGVhZCBvZiB0aGUgc2VsZWN0aW9uICh0aGUgc2lkZSB0aGF0IG1vdmVzIHdoZW5cbiAgICB0aGUgc2VsZWN0aW9uIGlzIG1vZGlmaWVkKS5cbiAgICAqL1xuICAgICRoZWFkLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy4kYW5jaG9yID0gJGFuY2hvcjtcbiAgICAgICAgdGhpcy4kaGVhZCA9ICRoZWFkO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcyB8fCBbbmV3IFNlbGVjdGlvblJhbmdlKCRhbmNob3IubWluKCRoZWFkKSwgJGFuY2hvci5tYXgoJGhlYWQpKV07XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBhbmNob3IsIGFzIGFuIHVucmVzb2x2ZWQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy4kYW5jaG9yLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBoZWFkLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLiRoZWFkLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy4kZnJvbS5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLiR0by5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgbG93ZXIgIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0ICRmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbMF0uJGZyb207XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCB1cHBlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCAkdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1swXS4kdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgYW55IGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocmFuZ2VzW2ldLiRmcm9tLnBvcyAhPSByYW5nZXNbaV0uJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWxlY3Rpb24gYXMgYSBzbGljZS5cbiAgICAqL1xuICAgIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRmcm9tLmRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBhIHNsaWNlIG9yLCBpZiBubyBzbGljZSBpcyBnaXZlbixcbiAgICBkZWxldGUgdGhlIHNlbGVjdGlvbi4gV2lsbCBhcHBlbmQgdG8gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIC8vIFB1dCB0aGUgbmV3IHNlbGVjdGlvbiBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGVkXG4gICAgICAgIC8vIGNvbnRlbnQuIFdoZW4gdGhhdCBlbmRlZCBpbiBhbiBpbmxpbmUgbm9kZSwgc2VhcmNoIGJhY2t3YXJkcyxcbiAgICAgICAgLy8gdG8gZ2V0IHRoZSBwb3NpdGlvbiBhZnRlciB0aGF0IG5vZGUuIElmIG5vdCwgc2VhcmNoIGZvcndhcmQuXG4gICAgICAgIGxldCBsYXN0Tm9kZSA9IGNvbnRlbnQuY29udGVudC5sYXN0Q2hpbGQsIGxhc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQub3BlbkVuZDsgaSsrKSB7XG4gICAgICAgICAgICBsYXN0UGFyZW50ID0gbGFzdE5vZGU7XG4gICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV0sIG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgdHIucmVwbGFjZVJhbmdlKG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIG1hcHBpbmcubWFwKCR0by5wb3MpLCBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50KTtcbiAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIG1hcEZyb20sIChsYXN0Tm9kZSA/IGxhc3ROb2RlLmlzSW5saW5lIDogbGFzdFBhcmVudCAmJiBsYXN0UGFyZW50LmlzVGV4dGJsb2NrKSA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIGFwcGVuZGluZyB0aGUgY2hhbmdlc1xuICAgIHRvIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoLCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXSwgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIHRvID0gbWFwcGluZy5tYXAoJHRvLnBvcyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBtYXBGcm9tLCBub2RlLmlzSW5saW5lID8gLTEgOiAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gc3RhcnRpbmcgYXQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gYW5kIHNlYXJjaGluZyBiYWNrIGlmIGBkaXJgIGlzIG5lZ2F0aXZlLCBhbmQgZm9yd2FyZCBpZlxuICAgIHBvc2l0aXZlLiBXaGVuIGB0ZXh0T25seWAgaXMgdHJ1ZSwgb25seSBjb25zaWRlciBjdXJzb3JcbiAgICBzZWxlY3Rpb25zLiBXaWxsIHJldHVybiBudWxsIHdoZW4gbm8gdmFsaWQgc2VsZWN0aW9uIHBvc2l0aW9uIGlzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb20oJHBvcywgZGlyLCB0ZXh0T25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpbm5lciA9ICRwb3MucGFyZW50LmlubGluZUNvbnRlbnQgPyBuZXcgVGV4dFNlbGVjdGlvbigkcG9zKVxuICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLnBhcmVudCwgJHBvcy5wb3MsICRwb3MuaW5kZXgoKSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoIC0gMTsgZGVwdGggPj0gMDsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyIDwgMFxuICAgICAgICAgICAgICAgID8gZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5ub2RlKGRlcHRoKSwgJHBvcy5iZWZvcmUoZGVwdGggKyAxKSwgJHBvcy5pbmRleChkZXB0aCksIGRpciwgdGV4dE9ubHkpXG4gICAgICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLm5vZGUoZGVwdGgpLCAkcG9zLmFmdGVyKGRlcHRoICsgMSksICRwb3MuaW5kZXgoZGVwdGgpICsgMSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gbmVhciB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi4gU2VhcmNoZXMgZm9yd2FyZCBmaXJzdCBieSBkZWZhdWx0LCBidXQgaWYgYGJpYXNgIGlzXG4gICAgbmVnYXRpdmUsIGl0IHdpbGwgc2VhcmNoIGJhY2t3YXJkcyBmaXJzdC5cbiAgICAqL1xuICAgIHN0YXRpYyBuZWFyKCRwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGcm9tKCRwb3MsIGJpYXMpIHx8IHRoaXMuZmluZEZyb20oJHBvcywgLWJpYXMpIHx8IG5ldyBBbGxTZWxlY3Rpb24oJHBvcy5ub2RlKDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gY2xvc2VzdCB0byB0aGUgc3RhcnQgb2ZcbiAgICB0aGUgZ2l2ZW4gZG9jdW1lbnQuIFdpbGwgcmV0dXJuIGFuXG4gICAgW2BBbGxTZWxlY3Rpb25gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQWxsU2VsZWN0aW9uKSBpZiBubyB2YWxpZCBwb3NpdGlvblxuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIHN0YXRpYyBhdFN0YXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGlvbkluKGRvYywgZG9jLCAwLCAwLCAxKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIGNsb3Nlc3QgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBhdEVuZChkb2MpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25Jbihkb2MsIGRvYywgZG9jLmNvbnRlbnQuc2l6ZSwgZG9jLmNoaWxkQ291bnQsIC0xKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc2VsZWN0aW9uLiBNdXN0IGJlXG4gICAgaW1wbGVtZW50ZWQgZm9yIGN1c3RvbSBjbGFzc2VzIChhcyBhIHN0YXRpYyBjbGFzcyBtZXRob2QpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24udHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgY2xzID0gY2xhc3Nlc0J5SWRbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCFjbHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc2VsZWN0aW9uIHR5cGUgJHtqc29uLnR5cGV9IGRlZmluZWRgKTtcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tSlNPTihkb2MsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIGRlc2VyaWFsaXplIHNlbGVjdGlvbnMgZnJvbSBKU09OLCBjdXN0b20gc2VsZWN0aW9uXG4gICAgY2xhc3NlcyBtdXN0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBhbiBJRCBzdHJpbmcsIHNvIHRoYXQgdGhleVxuICAgIGNhbiBiZSBkaXNhbWJpZ3VhdGVkLiBUcnkgdG8gcGljayBzb21ldGhpbmcgdGhhdCdzIHVubGlrZWx5IHRvXG4gICAgY2xhc2ggd2l0aCBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBqc29uSUQoaWQsIHNlbGVjdGlvbkNsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBjbGFzc2VzQnlJZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRHVwbGljYXRlIHVzZSBvZiBzZWxlY3Rpb24gSlNPTiBJRCBcIiArIGlkKTtcbiAgICAgICAgY2xhc3Nlc0J5SWRbaWRdID0gc2VsZWN0aW9uQ2xhc3M7XG4gICAgICAgIHNlbGVjdGlvbkNsYXNzLnByb3RvdHlwZS5qc29uSUQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbYm9va21hcmtdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25Cb29rbWFyaykgZm9yIHRoaXMgc2VsZWN0aW9uLFxuICAgIHdoaWNoIGlzIGEgdmFsdWUgdGhhdCBjYW4gYmUgbWFwcGVkIHdpdGhvdXQgaGF2aW5nIGFjY2VzcyB0byBhXG4gICAgY3VycmVudCBkb2N1bWVudCwgYW5kIGxhdGVyIHJlc29sdmVkIHRvIGEgcmVhbCBzZWxlY3Rpb24gZm9yIGFcbiAgICBnaXZlbiBkb2N1bWVudCBhZ2Fpbi4gKFRoaXMgaXMgdXNlZCBtb3N0bHkgYnkgdGhlIGhpc3RvcnkgdG9cbiAgICB0cmFjayBhbmQgcmVzdG9yZSBvbGQgc2VsZWN0aW9ucy4pIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mXG4gICAgdGhpcyBtZXRob2QganVzdCBjb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHRvIGEgdGV4dCBzZWxlY3Rpb24gYW5kXG4gICAgcmV0dXJucyB0aGUgYm9va21hcmsgZm9yIHRoYXQuXG4gICAgKi9cbiAgICBnZXRCb29rbWFyaygpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbih0aGlzLiRhbmNob3IsIHRoaXMuJGhlYWQpLmdldEJvb2ttYXJrKCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gdHJ1ZTtcbi8qKlxuUmVwcmVzZW50cyBhIHNlbGVjdGVkIHJhbmdlIGluIGEgZG9jdW1lbnQuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgICRmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgJHRvKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgfVxufVxubGV0IHdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tUZXh0U2VsZWN0aW9uKCRwb3MpIHtcbiAgICBpZiAoIXdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiAmJiAhJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICB3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25zb2xlW1wid2FyblwiXShcIlRleHRTZWxlY3Rpb24gZW5kcG9pbnQgbm90IHBvaW50aW5nIGludG8gYSBub2RlIHdpdGggaW5saW5lIGNvbnRlbnQgKFwiICsgJHBvcy5wYXJlbnQudHlwZS5uYW1lICsgXCIpXCIpO1xuICAgIH1cbn1cbi8qKlxuQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvciBzZWxlY3Rpb24sIHdpdGggYVxuaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZSBzaWRlKSwgYm90aCBvZiB3aGljaFxucG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYSByZWd1bGFyIGN1cnNvclxucG9zaXRpb24pLlxuKi9cbmNsYXNzIFRleHRTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uIGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRhbmNob3IsICRoZWFkID0gJGFuY2hvcikge1xuICAgICAgICBjaGVja1RleHRTZWxlY3Rpb24oJGFuY2hvcik7XG4gICAgICAgIGNoZWNrVGV4dFNlbGVjdGlvbigkaGVhZCk7XG4gICAgICAgIHN1cGVyKCRhbmNob3IsICRoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHJlc29sdmVkIHBvc2l0aW9uIGlmIHRoaXMgaXMgYSBjdXJzb3Igc2VsZWN0aW9uIChhblxuICAgIGVtcHR5IHRleHQgc2VsZWN0aW9uKSwgYW5kIG51bGwgb3RoZXJ3aXNlLlxuICAgICovXG4gICAgZ2V0ICRjdXJzb3IoKSB7IHJldHVybiB0aGlzLiRhbmNob3IucG9zID09IHRoaXMuJGhlYWQucG9zID8gdGhpcy4kaGVhZCA6IG51bGw7IH1cbiAgICBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICBpZiAoISRoZWFkLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRoZWFkKTtcbiAgICAgICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRhbmNob3IgOiAkaGVhZCwgJGhlYWQpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgc3VwZXIucmVwbGFjZSh0ciwgY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50ID09IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0aGlzLiRmcm9tLm1hcmtzQWNyb3NzKHRoaXMuJHRvKTtcbiAgICAgICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBvdGhlci5hbmNob3IgPT0gdGhpcy5hbmNob3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRleHRCb29rbWFyayh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBUZXh0U2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpLCBkb2MucmVzb2x2ZShqc29uLmhlYWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICBsZXQgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcygkYW5jaG9yLCBoZWFkID09IGFuY2hvciA/ICRhbmNob3IgOiBkb2MucmVzb2x2ZShoZWFkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHRleHQgc2VsZWN0aW9uIHRoYXQgc3BhbnMgdGhlIGdpdmVuIHBvc2l0aW9ucyBvciwgaWZcbiAgICB0aGV5IGFyZW4ndCB0ZXh0IHBvc2l0aW9ucywgZmluZCBhIHRleHQgc2VsZWN0aW9uIG5lYXIgdGhlbS5cbiAgICBgYmlhc2AgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZXRob2Qgc2VhcmNoZXMgZm9yd2FyZCAoZGVmYXVsdClcbiAgICBvciBiYWNrd2FyZHMgKG5lZ2F0aXZlIG51bWJlcikgZmlyc3QuIFdpbGwgZmFsbCBiYWNrIHRvIGNhbGxpbmdcbiAgICBbYFNlbGVjdGlvbi5uZWFyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbl5uZWFyKSB3aGVuIHRoZSBkb2N1bWVudFxuICAgIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHRleHQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgICAgICBsZXQgZFBvcyA9ICRhbmNob3IucG9zIC0gJGhlYWQucG9zO1xuICAgICAgICBpZiAoIWJpYXMgfHwgZFBvcylcbiAgICAgICAgICAgIGJpYXMgPSBkUG9zID49IDAgPyAxIDogLTE7XG4gICAgICAgIGlmICghJGhlYWQucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IFNlbGVjdGlvbi5maW5kRnJvbSgkaGVhZCwgYmlhcywgdHJ1ZSkgfHwgU2VsZWN0aW9uLmZpbmRGcm9tKCRoZWFkLCAtYmlhcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgJGhlYWQgPSBmb3VuZC4kaGVhZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKGRQb3MgPT0gMCkge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAoU2VsZWN0aW9uLmZpbmRGcm9tKCRhbmNob3IsIC1iaWFzLCB0cnVlKSB8fCBTZWxlY3Rpb24uZmluZEZyb20oJGFuY2hvciwgYmlhcywgdHJ1ZSkpLiRhbmNob3I7XG4gICAgICAgICAgICAgICAgaWYgKCgkYW5jaG9yLnBvcyA8ICRoZWFkLnBvcykgIT0gKGRQb3MgPCAwKSlcbiAgICAgICAgICAgICAgICAgICAgJGFuY2hvciA9ICRoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbigkYW5jaG9yLCAkaGVhZCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLmpzb25JRChcInRleHRcIiwgVGV4dFNlbGVjdGlvbik7XG5jbGFzcyBUZXh0Qm9va21hcmsge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Qm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbihkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIGRvYy5yZXNvbHZlKHRoaXMuaGVhZCkpO1xuICAgIH1cbn1cbi8qKlxuQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhIHNpbmdsZSBub2RlLiBBbGxcbm5vZGVzIG1hcmtlZCBbc2VsZWN0YWJsZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnNlbGVjdGFibGUpIGNhbiBiZSB0aGVcbnRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGEgc2VsZWN0aW9uLCBgZnJvbWAgYW5kIGB0b2BcbnBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUsIGBhbmNob3JgIGVxdWFsc1xuYGZyb21gLCBhbmQgYGhlYWRgIGVxdWFscyBgdG9gLi5cbiovXG5jbGFzcyBOb2RlU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgICBhcmd1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRwb3MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgbGV0ICRlbmQgPSAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLnBvcyArIG5vZGUubm9kZVNpemUpO1xuICAgICAgICBzdXBlcigkcG9zLCAkZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBpZiAoZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odGhpcy5ub2RlKSwgMCwgMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgb3RoZXIuYW5jaG9yID09IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwibm9kZVwiLCBhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IE5vZGVCb29rbWFyayh0aGlzLmFuY2hvcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIG1heSBiZSBzZWxlY3RlZCBhcyBhIG5vZGVcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgaXNTZWxlY3RhYmxlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmlzVGV4dCAmJiBub2RlLnR5cGUuc3BlYy5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICB9XG59XG5Ob2RlU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5TZWxlY3Rpb24uanNvbklEKFwibm9kZVwiLCBOb2RlU2VsZWN0aW9uKTtcbmNsYXNzIE5vZGVCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBuZXcgVGV4dEJvb2ttYXJrKHBvcywgcG9zKSA6IG5ldyBOb2RlQm9va21hcmsocG9zKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyk7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICB9XG59XG4vKipcbkEgc2VsZWN0aW9uIHR5cGUgdGhhdCByZXByZXNlbnRzIHNlbGVjdGluZyB0aGUgd2hvbGUgZG9jdW1lbnRcbih3aGljaCBjYW4gbm90IG5lY2Vzc2FyaWx5IGJlIGV4cHJlc3NlZCB3aXRoIGEgdGV4dCBzZWxlY3Rpb24sIHdoZW5cbnRoZXJlIGFyZSBmb3IgZXhhbXBsZSBsZWFmIGJsb2NrIG5vZGVzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlXG5kb2N1bWVudCkuXG4qL1xuY2xhc3MgQWxsU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gYWxsLXNlbGVjdGlvbiBvdmVyIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICBzdXBlcihkb2MucmVzb2x2ZSgwKSwgZG9jLnJlc29sdmUoZG9jLmNvbnRlbnQuc2l6ZSkpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgwLCB0ci5kb2MuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgIGxldCBzZWwgPSBTZWxlY3Rpb24uYXRTdGFydCh0ci5kb2MpO1xuICAgICAgICAgICAgaWYgKCFzZWwuZXEodHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlcGxhY2UodHIsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgdHlwZTogXCJhbGxcIiB9OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBtYXAoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb247IH1cbiAgICBnZXRCb29rbWFyaygpIHsgcmV0dXJuIEFsbEJvb2ttYXJrOyB9XG59XG5TZWxlY3Rpb24uanNvbklEKFwiYWxsXCIsIEFsbFNlbGVjdGlvbik7XG5jb25zdCBBbGxCb29rbWFyayA9IHtcbiAgICBtYXAoKSB7IHJldHVybiB0aGlzOyB9LFxuICAgIHJlc29sdmUoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbn07XG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIHRleHQgZGlyZWN0aW9uIHdoZW4gc2Nhbm5pbmcgZm9yIHNlbGVjdGlvbnNcbi8vIFRyeSB0byBmaW5kIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZ2l2ZW4gbm9kZS4gYHBvc2AgcG9pbnRzIGF0IHRoZVxuLy8gcG9zaXRpb24gd2hlcmUgdGhlIHNlYXJjaCBzdGFydHMuIFdoZW4gYHRleHRgIGlzIHRydWUsIG9ubHkgcmV0dXJuXG4vLyB0ZXh0IHNlbGVjdGlvbnMuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBub2RlLCBwb3MsIGluZGV4LCBkaXIsIHRleHQgPSBmYWxzZSkge1xuICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gKGRpciA+IDAgPyAwIDogMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5jaGlsZENvdW50IDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgICAgICBpZiAoIWNoaWxkLmlzQXRvbSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZFNlbGVjdGlvbkluKGRvYywgY2hpbGQsIHBvcyArIGRpciwgZGlyIDwgMCA/IGNoaWxkLmNoaWxkQ291bnQgOiAwLCBkaXIsIHRleHQpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGV4dCAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyAtIChkaXIgPCAwID8gY2hpbGQubm9kZVNpemUgOiAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplICogZGlyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBzdGFydExlbiwgYmlhcykge1xuICAgIGxldCBsYXN0ID0gdHIuc3RlcHMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA8IHN0YXJ0TGVuKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHN0ZXAgPSB0ci5zdGVwc1tsYXN0XTtcbiAgICBpZiAoIShzdGVwIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXAgfHwgc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VBcm91bmRTdGVwKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbbGFzdF0sIGVuZDtcbiAgICBtYXAuZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiB7IGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gbmV3VG87IH0pO1xuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShlbmQpLCBiaWFzKSk7XG59XG5cbmNvbnN0IFVQREFURURfU0VMID0gMSwgVVBEQVRFRF9NQVJLUyA9IDIsIFVQREFURURfU0NST0xMID0gNDtcbi8qKlxuQW4gZWRpdG9yIHN0YXRlIHRyYW5zYWN0aW9uLCB3aGljaCBjYW4gYmUgYXBwbGllZCB0byBhIHN0YXRlIHRvXG5jcmVhdGUgYW4gdXBkYXRlZCBzdGF0ZS4gVXNlXG5bYEVkaXRvclN0YXRlLnRyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRyKSB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG5cblRyYW5zYWN0aW9ucyB0cmFjayBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCAodGhleSBhcmUgYSBzdWJjbGFzcyBvZlxuW2BUcmFuc2Zvcm1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybSkpLCBidXQgYWxzbyBvdGhlciBzdGF0ZSBjaGFuZ2VzLFxubGlrZSBzZWxlY3Rpb24gdXBkYXRlcyBhbmQgYWRqdXN0bWVudHMgb2YgdGhlIHNldCBvZiBbc3RvcmVkXG5tYXJrc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnN0b3JlZE1hcmtzKS4gSW4gYWRkaXRpb24sIHlvdSBjYW4gc3RvcmVcbm1ldGFkYXRhIHByb3BlcnRpZXMgaW4gYSB0cmFuc2FjdGlvbiwgd2hpY2ggYXJlIGV4dHJhIHBpZWNlcyBvZlxuaW5mb3JtYXRpb24gdGhhdCBjbGllbnQgY29kZSBvciBwbHVnaW5zIGNhbiB1c2UgdG8gZGVzY3JpYmUgd2hhdCBhXG50cmFuc2FjdGlvbiByZXByZXNlbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBbb3duXG5zdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpIGFjY29yZGluZ2x5LlxuXG5UaGUgW2VkaXRvciB2aWV3XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3KSB1c2VzIGEgZmV3IG1ldGFkYXRhXG5wcm9wZXJ0aWVzOiBpdCB3aWxsIGF0dGFjaCBhIHByb3BlcnR5IGBcInBvaW50ZXJcImAgd2l0aCB0aGUgdmFsdWVcbmB0cnVlYCB0byBzZWxlY3Rpb24gdHJhbnNhY3Rpb25zIGRpcmVjdGx5IGNhdXNlZCBieSBtb3VzZSBvciB0b3VjaFxuaW5wdXQsIGEgYFwiY29tcG9zaXRpb25cImAgcHJvcGVydHkgaG9sZGluZyBhbiBJRCBpZGVudGlmeWluZyB0aGVcbmNvbXBvc2l0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIHRyYW5zYWN0aW9ucyBjYXVzZWQgYnkgY29tcG9zZWQgRE9NXG5pbnB1dCwgYW5kIGEgYFwidWlFdmVudFwiYCBwcm9wZXJ0eSBvZiB0aGF0IG1heSBiZSBgXCJwYXN0ZVwiYCxcbmBcImN1dFwiYCwgb3IgYFwiZHJvcFwiYC5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcihzdGF0ZS5kb2MpO1xuICAgICAgICAvLyBUaGUgc3RlcCBjb3VudCBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHZhbGlkLlxuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IDA7XG4gICAgICAgIC8vIEJpdGZpZWxkIHRvIHRyYWNrIHdoaWNoIGFzcGVjdHMgb2YgdGhlIHN0YXRlIHdlcmUgdXBkYXRlZCBieVxuICAgICAgICAvLyB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAgICB0aGlzLnVwZGF0ZWQgPSAwO1xuICAgICAgICAvLyBPYmplY3QgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMubWV0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbidzIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBlZGl0b3JcbiAgICBzZWxlY3Rpb24gW21hcHBlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbi5tYXApIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zYWN0aW9uLCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIHdpdGhcbiAgICBbYHNldFNlbGVjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZXRTZWxlY3Rpb24pLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyU2VsZWN0aW9uRm9yIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gdGhpcy5jdXJTZWxlY3Rpb24ubWFwKHRoaXMuZG9jLCB0aGlzLm1hcHBpbmcuc2xpY2UodGhpcy5jdXJTZWxlY3Rpb25Gb3IpKTtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyU2VsZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHRyYW5zYWN0aW9uJ3MgY3VycmVudCBzZWxlY3Rpb24uIFdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgIHNlbGVjdGlvbiB0aGF0IHRoZSBlZGl0b3IgZ2V0cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhcHBsaWVkLlxuICAgICovXG4gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgICBpZiAoc2VsZWN0aW9uLiRmcm9tLmRvYyAhPSB0aGlzLmRvYylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBhc3NlZCB0byBzZXRTZWxlY3Rpb24gbXVzdCBwb2ludCBhdCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9ICh0aGlzLnVwZGF0ZWQgfCBVUERBVEVEX1NFTCkgJiB+VVBEQVRFRF9NQVJLUztcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gd2FzIGV4cGxpY2l0bHkgdXBkYXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvblNldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX1NFTCkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIGN1cnJlbnQgc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgc2V0U3RvcmVkTWFya3MobWFya3MpIHtcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9NQVJLUztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdG9yZWQgbWFya3Mgb3IsIGlmIHRoYXQgaXMgbnVsbCwgdGhlIG1hcmtzXG4gICAgYXQgdGhlIHNlbGVjdGlvbiwgbWF0Y2ggdGhlIGdpdmVuIHNldCBvZiBtYXJrcy4gRG9lcyBub3RoaW5nIGlmXG4gICAgdGhpcyBpcyBhbHJlYWR5IHRoZSBjYXNlLlxuICAgICovXG4gICAgZW5zdXJlTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpLCBtYXJrcykpXG4gICAgICAgICAgICB0aGlzLnNldFN0b3JlZE1hcmtzKG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIG1hcmsgdG8gdGhlIHNldCBvZiBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICBhZGRTdG9yZWRNYXJrKG1hcmspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlTWFya3MobWFyay5hZGRUb1NldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayBvciBtYXJrIHR5cGUgZnJvbSB0aGUgc2V0IG9mIHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIHJlbW92ZVN0b3JlZE1hcmsobWFyaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnN1cmVNYXJrcyhtYXJrLnJlbW92ZUZyb21TZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kaGVhZC5tYXJrcygpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0b3JlZCBtYXJrcyB3ZXJlIGV4cGxpY2l0bHkgc2V0IGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHN0b3JlZE1hcmtzU2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfTUFSS1MpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRTdGVwKHN0ZXAsIGRvYykge1xuICAgICAgICBzdXBlci5hZGRTdGVwKHN0ZXAsIGRvYyk7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9IHRoaXMudXBkYXRlZCAmIH5VUERBVEVEX01BUktTO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNldFRpbWUodGltZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gc2xpY2UuXG4gICAgKi9cbiAgICByZXBsYWNlU2VsZWN0aW9uKHNsaWNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UodGhpcywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXNcbiAgICB0cnVlIGFuZCB0aGUgY29udGVudCBpcyBpbmxpbmUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZVxuICAgIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSwgaW5oZXJpdE1hcmtzID0gdHJ1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGlmIChpbmhlcml0TWFya3MpXG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXJrKHRoaXMuc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi5lbXB0eSA/IHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpIDogKHNlbGVjdGlvbi4kZnJvbS5tYXJrc0Fjcm9zcyhzZWxlY3Rpb24uJHRvKSB8fCBNYXJrLm5vbmUpKSk7XG4gICAgICAgIHNlbGVjdGlvbi5yZXBsYWNlV2l0aCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICovXG4gICAgZGVsZXRlU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2UsIG9yIHRoZSBzZWxlY3Rpb24gaWYgbm8gcmFuZ2UgaXMgZ2l2ZW4sXG4gICAgd2l0aCBhIHRleHQgbm9kZSBjb250YWluaW5nIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpbnNlcnRUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSB0aGlzLmRvYy50eXBlLnNjaGVtYTtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdGlvbldpdGgoc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICAgICAgdG8gPSB0byA9PSBudWxsID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHRoaXMuc3RvcmVkTWFya3M7XG4gICAgICAgICAgICBpZiAoIW1hcmtzKSB7XG4gICAgICAgICAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRvID09IGZyb20gPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3ModGhpcy5kb2MucmVzb2x2ZSh0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBzY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5lbXB0eSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0aGlzLnNlbGVjdGlvbi4kdG8pKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhpcyB0cmFuc2FjdGlvbiwga2V5ZWQgZWl0aGVyIGJ5XG4gICAgbmFtZSBvciBieSBwbHVnaW4uXG4gICAgKi9cbiAgICBzZXRNZXRhKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tZXRhW3R5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleS5rZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhIG1ldGFkYXRhIHByb3BlcnR5IGZvciBhIGdpdmVuIG5hbWUgb3IgcGx1Z2luLlxuICAgICovXG4gICAgZ2V0TWV0YShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVt0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkua2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNhY3Rpb24gZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YSxcbiAgICBhbmQgY2FuIHRodXMgc2FmZWx5IGJlIGV4dGVuZGVkLlxuICAgICovXG4gICAgZ2V0IGlzR2VuZXJpYygpIHtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLm1ldGEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZSB0aGF0IHRoZSBlZGl0b3Igc2hvdWxkIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlld1xuICAgIHdoZW4gdXBkYXRlZCB0byB0aGUgc3RhdGUgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9TQ1JPTEw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB0cmFuc2FjdGlvbiBoYXMgaGFkIGBzY3JvbGxJbnRvVmlld2AgY2FsbGVkIG9uIGl0LlxuICAgICovXG4gICAgZ2V0IHNjcm9sbGVkSW50b1ZpZXcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9TQ1JPTEwpID4gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmQoZiwgc2VsZikge1xuICAgIHJldHVybiAhc2VsZiB8fCAhZiA/IGYgOiBmLmJpbmQoc2VsZik7XG59XG5jbGFzcyBGaWVsZERlc2Mge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2MsIHNlbGYpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbml0ID0gYmluZChkZXNjLmluaXQsIHNlbGYpO1xuICAgICAgICB0aGlzLmFwcGx5ID0gYmluZChkZXNjLmFwcGx5LCBzZWxmKTtcbiAgICB9XG59XG5jb25zdCBiYXNlRmllbGRzID0gW1xuICAgIG5ldyBGaWVsZERlc2MoXCJkb2NcIiwge1xuICAgICAgICBpbml0KGNvbmZpZykgeyByZXR1cm4gY29uZmlnLmRvYyB8fCBjb25maWcuc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLmRvYzsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzZWxlY3Rpb25cIiwge1xuICAgICAgICBpbml0KGNvbmZpZywgaW5zdGFuY2UpIHsgcmV0dXJuIGNvbmZpZy5zZWxlY3Rpb24gfHwgU2VsZWN0aW9uLmF0U3RhcnQoaW5zdGFuY2UuZG9jKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLnNlbGVjdGlvbjsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzdG9yZWRNYXJrc1wiLCB7XG4gICAgICAgIGluaXQoY29uZmlnKSB7IHJldHVybiBjb25maWcuc3RvcmVkTWFya3MgfHwgbnVsbDsgfSxcbiAgICAgICAgYXBwbHkodHIsIF9tYXJrcywgX29sZCwgc3RhdGUpIHsgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi4kY3Vyc29yID8gdHIuc3RvcmVkTWFya3MgOiBudWxsOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInNjcm9sbFRvU2VsZWN0aW9uXCIsIHtcbiAgICAgICAgaW5pdCgpIHsgcmV0dXJuIDA7IH0sXG4gICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7IHJldHVybiB0ci5zY3JvbGxlZEludG9WaWV3ID8gcHJldiArIDEgOiBwcmV2OyB9XG4gICAgfSlcbl07XG4vLyBPYmplY3Qgd3JhcHBpbmcgdGhlIHBhcnQgb2YgYSBzdGF0ZSBvYmplY3QgdGhhdCBzdGF5cyB0aGUgc2FtZVxuLy8gYWNyb3NzIHRyYW5zYWN0aW9ucy4gU3RvcmVkIGluIHRoZSBzdGF0ZSdzIGBjb25maWdgIHByb3BlcnR5LlxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBwbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5zQnlLZXkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGJhc2VGaWVsZHMuc2xpY2UoKTtcbiAgICAgICAgaWYgKHBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zQnlLZXlbcGx1Z2luLmtleV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQWRkaW5nIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBrZXllZCBwbHVnaW4gKFwiICsgcGx1Z2luLmtleSArIFwiKVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0J5S2V5W3BsdWdpbi5rZXldID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMucHVzaChuZXcgRmllbGREZXNjKHBsdWdpbi5rZXksIHBsdWdpbi5zcGVjLnN0YXRlLCBwbHVnaW4pKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuVGhlIHN0YXRlIG9mIGEgUHJvc2VNaXJyb3IgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIG9iamVjdCBvZlxudGhpcyB0eXBlLiBBIHN0YXRlIGlzIGEgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZeKAlGl0IGlzbid0XG51cGRhdGVkLCBidXQgcmF0aGVyIGEgbmV3IHN0YXRlIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gYW4gb2xkIG9uZVxudXNpbmcgdGhlIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIG1ldGhvZC5cblxuQSBzdGF0ZSBob2xkcyBhIG51bWJlciBvZiBidWlsdC1pbiBmaWVsZHMsIGFuZCBwbHVnaW5zIGNhblxuW2RlZmluZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuc3RhdGUpIGFkZGl0aW9uYWwgZmllbGRzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIG9mIHRoZSBzdGF0ZSdzIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNjaGVtYTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBsdWdpbnMgdGhhdCBhcmUgYWN0aXZlIGluIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnBsdWdpbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0byBwcm9kdWNlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUcmFuc2FjdGlvbih0cikuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmlsdGVyVHJhbnNhY3Rpb24odHIsIGlnbm9yZSA9IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChpICE9IGlnbm9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiAmJiAhcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24uY2FsbChwbHVnaW4sIHRyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVmVyYm9zZSB2YXJpYW50IG9mIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIHRoYXRcbiAgICByZXR1cm5zIHRoZSBwcmVjaXNlIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgYXBwbGllZCAod2hpY2ggbWlnaHRcbiAgICBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBbdHJhbnNhY3Rpb25cbiAgICBob29rc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuZmlsdGVyVHJhbnNhY3Rpb24pIG9mXG4gICAgcGx1Z2lucykgYWxvbmcgd2l0aCB0aGUgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHlUcmFuc2FjdGlvbihyb290VHIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclRyYW5zYWN0aW9uKHJvb3RUcikpXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogdGhpcywgdHJhbnNhY3Rpb25zOiBbXSB9O1xuICAgICAgICBsZXQgdHJzID0gW3Jvb3RUcl0sIG5ld1N0YXRlID0gdGhpcy5hcHBseUlubmVyKHJvb3RUciksIHNlZW4gPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGxvb3AgcmVwZWF0ZWRseSBnaXZlcyBwbHVnaW5zIGEgY2hhbmNlIHRvIHJlc3BvbmQgdG9cbiAgICAgICAgLy8gdHJhbnNhY3Rpb25zIGFzIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGFkZGVkLCBtYWtpbmcgc3VyZSB0byBvbmx5XG4gICAgICAgIC8vIHBhc3MgdGhlIHRyYW5zYWN0aW9ucyB0aGUgcGx1Z2luIGRpZCBub3Qgc2VlIGJlZm9yZS5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGhhdmVOZXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHNlZW4gPyBzZWVuW2ldLm4gOiAwLCBvbGRTdGF0ZSA9IHNlZW4gPyBzZWVuW2ldLnN0YXRlIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gbiA8IHRycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uLmNhbGwocGx1Z2luLCBuID8gdHJzLnNsaWNlKG4pIDogdHJzLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHIgJiYgbmV3U3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24odHIsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiLCByb290VHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGogPCBpID8geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfSA6IHsgc3RhdGU6IHRoaXMsIG46IDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnMucHVzaCh0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG5ld1N0YXRlLmFwcGx5SW5uZXIodHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZU5ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2ldID0geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhdmVOZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IG5ld1N0YXRlLCB0cmFuc2FjdGlvbnM6IHRycyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYXBwbHlJbm5lcih0cikge1xuICAgICAgICBpZiAoIXRyLmJlZm9yZS5lcSh0aGlzLmRvYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGEgbWlzbWF0Y2hlZCB0cmFuc2FjdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0luc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKHRoaXMuY29uZmlnKSwgZmllbGRzID0gdGhpcy5jb25maWcuZmllbGRzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2VbZmllbGQubmFtZV0gPSBmaWVsZC5hcHBseSh0ciwgdGhpc1tmaWVsZC5uYW1lXSwgdGhpcywgbmV3SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgZnJvbSB0aGlzIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IHRyKCkgeyByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHRoaXMpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcpIHtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZG9jID8gY29uZmlnLmRvYy50eXBlLnNjaGVtYSA6IGNvbmZpZy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRjb25maWcuZmllbGRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaW5zdGFuY2VbJGNvbmZpZy5maWVsZHNbaV0ubmFtZV0gPSAkY29uZmlnLmZpZWxkc1tpXS5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZSBiYXNlZCBvbiB0aGlzIG9uZSwgYnV0IHdpdGggYW4gYWRqdXN0ZWQgc2V0XG4gICAgb2YgYWN0aXZlIHBsdWdpbnMuIFN0YXRlIGZpZWxkcyB0aGF0IGV4aXN0IGluIGJvdGggc2V0cyBvZlxuICAgIHBsdWdpbnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiBUaG9zZSB0aGF0IG5vIGxvbmdlciBleGlzdCBhcmVcbiAgICBkcm9wcGVkLCBhbmQgdGhvc2UgdGhhdCBhcmUgbmV3IGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGVpclxuICAgIFtgaW5pdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkLmluaXQpIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgbmV3XG4gICAgY29uZmlndXJhdGlvbiBvYmplY3QuLlxuICAgICovXG4gICAgcmVjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24odGhpcy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICRjb25maWcuZmllbGRzLCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gZmllbGRzW2ldLm5hbWU7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyB0aGlzW25hbWVdIDogZmllbGRzW2ldLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBzdGF0ZSB0byBKU09OLiBJZiB5b3Ugd2FudCB0byBzZXJpYWxpemUgdGhlIHN0YXRlXG4gICAgb2YgcGx1Z2lucywgcGFzcyBhbiBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyB0byB1c2UgaW4gdGhlXG4gICAgcmVzdWx0aW5nIEpTT04gb2JqZWN0IHRvIHBsdWdpbiBvYmplY3RzLiBUaGUgYXJndW1lbnQgbWF5IGFsc28gYmVcbiAgICBhIHN0cmluZyBvciBudW1iZXIsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZCwgdG8gc3VwcG9ydCB0aGVcbiAgICB3YXkgYEpTT04uc3RyaW5naWZ5YCBjYWxscyBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gICAgKi9cbiAgICB0b0pTT04ocGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRvYzogdGhpcy5kb2MudG9KU09OKCksIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKCkgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVkTWFya3MpXG4gICAgICAgICAgICByZXN1bHQuc3RvcmVkTWFya3MgPSB0aGlzLnN0b3JlZE1hcmtzLm1hcChtID0+IG0udG9KU09OKCkpO1xuICAgICAgICBpZiAocGx1Z2luRmllbGRzICYmIHR5cGVvZiBwbHVnaW5GaWVsZHMgPT0gJ29iamVjdCcpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09IFwiZG9jXCIgfHwgcHJvcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBKU09OIGZpZWxkcyBgZG9jYCBhbmQgYHNlbGVjdGlvbmAgYXJlIHJlc2VydmVkXCIpO1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5GaWVsZHNbcHJvcF0sIHN0YXRlID0gcGx1Z2luLnNwZWMuc3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnRvSlNPTilcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gc3RhdGUudG9KU09OLmNhbGwocGx1Z2luLCB0aGlzW3BsdWdpbi5rZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhdGUuIGBjb25maWdgIHNob3VsZFxuICAgIGhhdmUgYXQgbGVhc3QgYSBgc2NoZW1hYCBmaWVsZCwgYW5kIHNob3VsZCBjb250YWluIGFycmF5IG9mXG4gICAgcGx1Z2lucyB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoLiBgcGx1Z2luRmllbGRzYCBjYW4gYmUgdXNlZFxuICAgIHRvIGRlc2VyaWFsaXplIHRoZSBzdGF0ZSBvZiBwbHVnaW5zLCBieSBhc3NvY2lhdGluZyBwbHVnaW5cbiAgICBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvcGVydHkgbmFtZXMgdGhleSB1c2UgaW4gdGhlIEpTT04gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGNvbmZpZywganNvbiwgcGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRWRpdG9yU3RhdGUuZnJvbUpTT05cIik7XG4gICAgICAgIGlmICghY29uZmlnLnNjaGVtYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVxdWlyZWQgY29uZmlnIGZpZWxkICdzY2hlbWEnIG1pc3NpbmdcIik7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oY29uZmlnLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgICRjb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gXCJkb2NcIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLmRvYyA9IE5vZGUuZnJvbUpTT04oY29uZmlnLnNjaGVtYSwganNvbi5kb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2VsZWN0aW9uID0gU2VsZWN0aW9uLmZyb21KU09OKGluc3RhbmNlLmRvYywganNvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInN0b3JlZE1hcmtzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvbi5zdG9yZWRNYXJrcylcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcmVkTWFya3MgPSBqc29uLnN0b3JlZE1hcmtzLm1hcChjb25maWcuc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbkZpZWxkc1twcm9wXSwgc3RhdGUgPSBwbHVnaW4uc3BlYy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ua2V5ID09IGZpZWxkLm5hbWUgJiYgc3RhdGUgJiYgc3RhdGUuZnJvbUpTT04gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IHN0YXRlLmZyb21KU09OLmNhbGwocGx1Z2luLCBjb25maWcsIGpzb25bcHJvcF0sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IGZpZWxkLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kUHJvcHMob2JqLCBzZWxmLCB0YXJnZXQpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICB2YWwgPSB2YWwuYmluZChzZWxmKTtcbiAgICAgICAgZWxzZSBpZiAocHJvcCA9PSBcImhhbmRsZURPTUV2ZW50c1wiKVxuICAgICAgICAgICAgdmFsID0gYmluZFByb3BzKHZhbCwgc2VsZiwge30pO1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcblBsdWdpbnMgYnVuZGxlIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gZWRpdG9yLlxuVGhleSBhcmUgcGFydCBvZiB0aGUgW2VkaXRvciBzdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlKSBhbmRcbm1heSBpbmZsdWVuY2UgdGhhdCBzdGF0ZSBhbmQgdGhlIHZpZXcgdGhhdCBjb250YWlucyBpdC5cbiovXG5jbGFzcyBQbHVnaW4ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwbHVnaW4ncyBbc3BlYyBvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjKS5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKSBleHBvcnRlZCBieSB0aGlzIHBsdWdpbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGJpbmRQcm9wcyhzcGVjLnByb3BzLCB0aGlzLCB0aGlzLnByb3BzKTtcbiAgICAgICAgdGhpcy5rZXkgPSBzcGVjLmtleSA/IHNwZWMua2V5LmtleSA6IGNyZWF0ZUtleShcInBsdWdpblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0cmFjdCB0aGUgcGx1Z2luJ3Mgc3RhdGUgZmllbGQgZnJvbSBhbiBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXRTdGF0ZShzdGF0ZSkgeyByZXR1cm4gc3RhdGVbdGhpcy5rZXldOyB9XG59XG5jb25zdCBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGNyZWF0ZUtleShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4ga2V5cylcbiAgICAgICAgcmV0dXJuIG5hbWUgKyBcIiRcIiArICsra2V5c1tuYW1lXTtcbiAgICBrZXlzW25hbWVdID0gMDtcbiAgICByZXR1cm4gbmFtZSArIFwiJFwiO1xufVxuLyoqXG5BIGtleSBpcyB1c2VkIHRvIFt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLmtleSkgcGx1Z2lucyBpbiBhIHdheVxudGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBmaW5kIHRoZW0sIGdpdmVuIGFuIGVkaXRvciBzdGF0ZS5cbkFzc2lnbmluZyBhIGtleSBkb2VzIG1lYW4gb25seSBvbmUgcGx1Z2luIG9mIHRoYXQgdHlwZSBjYW4gYmVcbmFjdGl2ZSBpbiBhIHN0YXRlLlxuKi9cbmNsYXNzIFBsdWdpbktleSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGtleS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBcImtleVwiKSB7IHRoaXMua2V5ID0gY3JlYXRlS2V5KG5hbWUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBhY3RpdmUgcGx1Z2luIHdpdGggdGhpcyBrZXksIGlmIGFueSwgZnJvbSBhbiBlZGl0b3JcbiAgICBzdGF0ZS5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkgeyByZXR1cm4gc3RhdGUuY29uZmlnLnBsdWdpbnNCeUtleVt0aGlzLmtleV07IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBsdWdpbidzIHN0YXRlIGZyb20gYW4gZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgZ2V0U3RhdGUoc3RhdGUpIHsgcmV0dXJuIHN0YXRlW3RoaXMua2V5XTsgfVxufVxuXG5leHBvcnQgeyBBbGxTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBOb2RlU2VsZWN0aW9uLCBQbHVnaW4sIFBsdWdpbktleSwgU2VsZWN0aW9uLCBTZWxlY3Rpb25SYW5nZSwgVGV4dFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfTtcbiIsImltcG9ydCB7IFRleHRTZWxlY3Rpb24sIE5vZGVTZWxlY3Rpb24sIEFsbFNlbGVjdGlvbiwgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIFNsaWNlLCBET01QYXJzZXIgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBkcm9wUG9pbnQgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuXG5jb25zdCBkb21JbmRleCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59O1xuY29uc3QgcGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbGV0IHBhcmVudCA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxMSA/IHBhcmVudC5ob3N0IDogcGFyZW50O1xufTtcbmxldCByZXVzZWRSYW5nZSA9IG51bGw7XG4vLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmFuZ2UsIGJlY2F1c2UgRE9NIHJhbmdlXG4vLyBvYmplY3RzIGFyZSBldmVyeSBleHBlbnNpdmUsIGFuZCBrZWVwIHNsb3dpbmcgZG93biBzdWJzZXF1ZW50IERPTVxuLy8gdXBkYXRlcywgZm9yIHNvbWUgcmVhc29uLlxuY29uc3QgdGV4dFJhbmdlID0gZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgbGV0IHJhbmdlID0gcmV1c2VkUmFuZ2UgfHwgKHJldXNlZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvID09IG51bGwgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiB0byk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgZnJvbSB8fCAwKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59O1xuY29uc3QgY2xlYXJSZXVzZWRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXVzZWRSYW5nZSA9IG51bGw7XG59O1xuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuY29uc3QgaXNFcXVpdmFsZW50UG9zaXRpb24gPSBmdW5jdGlvbiAobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSAmJiAoc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgLTEpIHx8XG4gICAgICAgIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIDEpKTtcbn07XG5jb25zdCBhdG9tRWxlbWVudHMgPSAvXihpbWd8YnJ8aW5wdXR8dGV4dGFyZWF8aHIpJC9pO1xuZnVuY3Rpb24gc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgZGlyKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlICYmIG9mZiA9PSB0YXJnZXRPZmYpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG9mZiA9PSAoZGlyIDwgMCA/IDAgOiBub2RlU2l6ZShub2RlKSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBoYXNCbG9ja0Rlc2Mobm9kZSkgfHwgYXRvbUVsZW1lbnRzLnRlc3Qobm9kZS5ub2RlTmFtZSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRpciA8IDAgPyBub2RlU2l6ZShub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZSQxKG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIG9mZnNldCA9IG5vZGVTaXplKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiAhaGFzQmxvY2tEZXNjKG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIkMShub2RlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0IDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzT25FZGdlKG5vZGUsIG9mZnNldCwgcGFyZW50KSB7XG4gICAgZm9yIChsZXQgYXRTdGFydCA9IG9mZnNldCA9PSAwLCBhdEVuZCA9IG9mZnNldCA9PSBub2RlU2l6ZShub2RlKTsgYXRTdGFydCB8fCBhdEVuZDspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBpbmRleCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGF0U3RhcnQgPSBhdFN0YXJ0ICYmIGluZGV4ID09IDA7XG4gICAgICAgIGF0RW5kID0gYXRFbmQgJiYgaW5kZXggPT0gbm9kZVNpemUobm9kZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzQmxvY2tEZXNjKGRvbSkge1xuICAgIGxldCBkZXNjO1xuICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKGRlc2MgPSBjdXIucG1WaWV3RGVzYylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jayAmJiAoZGVzYy5kb20gPT0gZG9tIHx8IGRlc2MuY29udGVudERPTSA9PSBkb20pO1xufVxuLy8gV29yayBhcm91bmQgQ2hyb21lIGlzc3VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzUyM1xuLy8gKGlzQ29sbGFwc2VkIGluYXBwcm9wcmlhdGVseSByZXR1cm5zIHRydWUgaW4gc2hhZG93IGRvbSlcbmNvbnN0IHNlbGVjdGlvbkNvbGxhcHNlZCA9IGZ1bmN0aW9uIChkb21TZWwpIHtcbiAgICByZXR1cm4gZG9tU2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn07XG5mdW5jdGlvbiBrZXlFdmVudChrZXlDb2RlLCBrZXkpIHtcbiAgICBsZXQgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGV2ZW50LmluaXRFdmVudChcImtleWRvd25cIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQua2V5Q29kZSA9IGtleUNvZGU7XG4gICAgZXZlbnQua2V5ID0gZXZlbnQuY29kZSA9IGtleTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5mdW5jdGlvbiBkZWVwQWN0aXZlRWxlbWVudChkb2MpIHtcbiAgICBsZXQgZWx0ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKGVsdCAmJiBlbHQuc2hhZG93Um9vdClcbiAgICAgICAgZWx0ID0gZWx0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWx0O1xufVxuZnVuY3Rpb24gY2FyZXRGcm9tUG9pbnQoZG9jLCB4LCB5KSB7XG4gICAgaWYgKGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICAgIHRyeSB7IC8vIEZpcmVmb3ggdGhyb3dzIGZvciB0aGlzIGNhbGwgaW4gaGFyZC10by1wcmVkaWN0IGNpcmN1bXN0YW5jZXMgKCM5OTQpXG4gICAgICAgICAgICBsZXQgcG9zID0gZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICAvLyBDbGlwIHRoZSBvZmZzZXQsIGJlY2F1c2UgQ2hyb21lIHdpbGwgcmV0dXJuIGEgdGV4dCBvZmZzZXRcbiAgICAgICAgICAgIC8vIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2ggY2FuJ3QgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgRE9NXG4gICAgICAgICAgICAvLyBvZmZzZXRcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogcG9zLm9mZnNldE5vZGUsIG9mZnNldDogTWF0aC5taW4obm9kZVNpemUocG9zLm9mZnNldE5vZGUpLCBwb3Mub2Zmc2V0KSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICB9XG4gICAgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiBNYXRoLm1pbihub2RlU2l6ZShyYW5nZS5zdGFydENvbnRhaW5lciksIHJhbmdlLnN0YXJ0T2Zmc2V0KSB9O1xuICAgIH1cbn1cblxuY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogbnVsbDtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgYWdlbnQgPSAobmF2ICYmIG5hdi51c2VyQWdlbnQpIHx8IFwiXCI7XG5jb25zdCBpZV9lZGdlID0gL0VkZ2VcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gL01TSUUgXFxkLy5leGVjKGFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGllX3ZlcnNpb24gPSBpZV91cHRvMTAgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgL2dlY2tvXFwvKFxcZCspL2kudGVzdChhZ2VudCk7XG5nZWNrbyAmJiArKC9GaXJlZm94XFwvKFxcZCspLy5leGVjKGFnZW50KSB8fCBbMCwgMF0pWzFdO1xuY29uc3QgX2Nocm9tZSA9ICFpZSAmJiAvQ2hyb21lXFwvKFxcZCspLy5leGVjKGFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICEhX2Nocm9tZTtcbmNvbnN0IGNocm9tZV92ZXJzaW9uID0gX2Nocm9tZSA/ICtfY2hyb21lWzFdIDogMDtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAhIW5hdiAmJiAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG4vLyBJcyB0cnVlIGZvciBib3RoIGlPUyBhbmQgaVBhZE9TIGZvciBjb252ZW5pZW5jZVxuY29uc3QgaW9zID0gc2FmYXJpICYmICgvTW9iaWxlXFwvXFx3Ky8udGVzdChhZ2VudCkgfHwgISFuYXYgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG5jb25zdCBtYWMgPSBpb3MgfHwgKG5hdiA/IC9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlKTtcbmNvbnN0IHdpbmRvd3MgPSBuYXYgPyAvV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSkgOiBmYWxzZTtcbmNvbnN0IGFuZHJvaWQgPSAvQW5kcm9pZCBcXGQvLnRlc3QoYWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gISFkb2MgJiYgXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHdlYmtpdF92ZXJzaW9uID0gd2Via2l0ID8gKygvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDA7XG5cbmZ1bmN0aW9uIHdpbmRvd1JlY3QoZG9jKSB7XG4gICAgbGV0IHZwID0gZG9jLmRlZmF1bHRWaWV3ICYmIGRvYy5kZWZhdWx0Vmlldy52aXN1YWxWaWV3cG9ydDtcbiAgICBpZiAodnApXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAwLCByaWdodDogdnAud2lkdGgsXG4gICAgICAgICAgICB0b3A6IDAsIGJvdHRvbTogdnAuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2lkZSh2YWx1ZSwgc2lkZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IHZhbHVlIDogdmFsdWVbc2lkZV07XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0KG5vZGUpIHtcbiAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gQWRqdXN0IGZvciBlbGVtZW50cyB3aXRoIHN0eWxlIFwidHJhbnNmb3JtOiBzY2FsZSgpXCJcbiAgICBsZXQgc2NhbGVYID0gKHJlY3Qud2lkdGggLyBub2RlLm9mZnNldFdpZHRoKSB8fCAxO1xuICAgIGxldCBzY2FsZVkgPSAocmVjdC5oZWlnaHQgLyBub2RlLm9mZnNldEhlaWdodCkgfHwgMTtcbiAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICByZXR1cm4geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBub2RlLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgbm9kZS5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyh2aWV3LCByZWN0LCBzdGFydERPTSkge1xuICAgIGxldCBzY3JvbGxUaHJlc2hvbGQgPSB2aWV3LnNvbWVQcm9wKFwic2Nyb2xsVGhyZXNob2xkXCIpIHx8IDAsIHNjcm9sbE1hcmdpbiA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxNYXJnaW5cIikgfHwgNTtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSBzdGFydERPTSB8fCB2aWV3LmRvbTs7KSB7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgbGV0IGF0VG9wID0gZWx0ID09IGRvYy5ib2R5O1xuICAgICAgICBsZXQgYm91bmRpbmcgPSBhdFRvcCA/IHdpbmRvd1JlY3QoZG9jKSA6IGNsaWVudFJlY3QoZWx0KTtcbiAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgKyBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJ0b3BcIikpXG4gICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wIC0gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImJvdHRvbVwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgID8gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikgLSBib3VuZGluZy50b3BcbiAgICAgICAgICAgICAgICA6IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwiYm90dG9tXCIpO1xuICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImxlZnRcIikpXG4gICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCAtIHJlY3QubGVmdCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcImxlZnRcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgLSBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJyaWdodFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwicmlnaHRcIik7XG4gICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgaWYgKGF0VG9wKSB7XG4gICAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRYID0gZWx0LnNjcm9sbExlZnQsIHN0YXJ0WSA9IGVsdC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgZWx0LnNjcm9sbExlZnQgKz0gbW92ZVg7XG4gICAgICAgICAgICAgICAgbGV0IGRYID0gZWx0LnNjcm9sbExlZnQgLSBzdGFydFgsIGRZID0gZWx0LnNjcm9sbFRvcCAtIHN0YXJ0WTtcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBkWCwgdG9wOiByZWN0LnRvcCAtIGRZLCByaWdodDogcmVjdC5yaWdodCAtIGRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gZFkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zID0gYXRUb3AgPyBcImZpeGVkXCIgOiBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCkucG9zaXRpb247XG4gICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChwb3MpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHBvcyA9PSBcImFic29sdXRlXCIgPyBwYXJlbnQub2Zmc2V0UGFyZW50IDogcGFyZW50Tm9kZShwYXJlbnQpO1xuICAgIH1cbn1cbi8vIFN0b3JlIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGVkaXRvcidzIHBhcmVudCBub2RlcywgYWxvbmcgd2l0aFxuLy8gdGhlIHRvcCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IG5lYXIgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCB3aGljaFxuLy8gd2lsbCBiZSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgdmlzaWJsZSB2aWV3cG9ydCByZW1haW5zIHN0YWJsZSBldmVuXG4vLyB3aGVuIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IGFib3ZlIGNoYW5nZXMuXG5mdW5jdGlvbiBzdG9yZVNjcm9sbFBvcyh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRZID0gTWF0aC5tYXgoMCwgcmVjdC50b3ApO1xuICAgIGxldCByZWZET00sIHJlZlRvcDtcbiAgICBmb3IgKGxldCB4ID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgeSA9IHN0YXJ0WSArIDE7IHkgPCBNYXRoLm1pbihpbm5lckhlaWdodCwgcmVjdC5ib3R0b20pOyB5ICs9IDUpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoIWRvbSB8fCBkb20gPT0gdmlldy5kb20gfHwgIXZpZXcuZG9tLmNvbnRhaW5zKGRvbSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvY2FsUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGxvY2FsUmVjdC50b3AgPj0gc3RhcnRZIC0gMjApIHtcbiAgICAgICAgICAgIHJlZkRPTSA9IGRvbTtcbiAgICAgICAgICAgIHJlZlRvcCA9IGxvY2FsUmVjdC50b3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZET006IHJlZkRPTSwgcmVmVG9wOiByZWZUb3AsIHN0YWNrOiBzY3JvbGxTdGFjayh2aWV3LmRvbSkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFN0YWNrKGRvbSkge1xuICAgIGxldCBzdGFjayA9IFtdLCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gcGFyZW50Tm9kZShjdXIpKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyBkb206IGN1ciwgdG9wOiBjdXIuc2Nyb2xsVG9wLCBsZWZ0OiBjdXIuc2Nyb2xsTGVmdCB9KTtcbiAgICAgICAgaWYgKGRvbSA9PSBkb2MpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrO1xufVxuLy8gUmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzIHRvIHRoYXQgd2hhdFxuLy8gaXQgd2FzIGJlZm9yZSwgd2hlbiBzdG9yZVNjcm9sbFBvcyB3YXMgY2FsbGVkLlxuZnVuY3Rpb24gcmVzZXRTY3JvbGxQb3MoeyByZWZET00sIHJlZlRvcCwgc3RhY2sgfSkge1xuICAgIGxldCBuZXdSZWZUb3AgPSByZWZET00gPyByZWZET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogMDtcbiAgICByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIG5ld1JlZlRvcCA9PSAwID8gMCA6IG5ld1JlZlRvcCAtIHJlZlRvcCk7XG59XG5mdW5jdGlvbiByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIGRUb3ApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGRvbSwgdG9wLCBsZWZ0IH0gPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGRvbS5zY3JvbGxUb3AgIT0gdG9wICsgZFRvcClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxUb3AgPSB0b3AgKyBkVG9wO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0b3JlZCA9IHNjcm9sbFN0YWNrKGRvbSk7XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdG9yZWQsIDApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJbk5vZGUobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGNsb3Nlc3QsIGR4Q2xvc2VzdCA9IDJlOCwgY29vcmRzQ2xvc2VzdCwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgcm93Qm90ID0gY29vcmRzLnRvcCwgcm93VG9wID0gY29vcmRzLnRvcDtcbiAgICBsZXQgZmlyc3RCZWxvdywgY29vcmRzQmVsb3c7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQsIGNoaWxkSW5kZXggPSAwOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZywgY2hpbGRJbmRleCsrKSB7XG4gICAgICAgIGxldCByZWN0cztcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZWN0cyA9IHRleHRSYW5nZShjaGlsZCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPD0gcm93Qm90ICYmIHJlY3QuYm90dG9tID49IHJvd1RvcCkge1xuICAgICAgICAgICAgICAgIHJvd0JvdCA9IE1hdGgubWF4KHJlY3QuYm90dG9tLCByb3dCb3QpO1xuICAgICAgICAgICAgICAgIHJvd1RvcCA9IE1hdGgubWluKHJlY3QudG9wLCByb3dUb3ApO1xuICAgICAgICAgICAgICAgIGxldCBkeCA9IHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gcmVjdC5sZWZ0IC0gY29vcmRzLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyBjb29yZHMubGVmdCAtIHJlY3QucmlnaHQgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChkeCA8IGR4Q2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGR4Q2xvc2VzdCA9IGR4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZHNDbG9zZXN0ID0gZHggJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0ID8gcmVjdC5yaWdodCA6IHJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogY29vcmRzLnRvcFxuICAgICAgICAgICAgICAgICAgICB9IDogY29vcmRzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVjdC50b3AgPiBjb29yZHMudG9wICYmICFmaXJzdEJlbG93ICYmIHJlY3QubGVmdCA8PSBjb29yZHMubGVmdCAmJiByZWN0LnJpZ2h0ID49IGNvb3Jkcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgZmlyc3RCZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNvb3Jkc0JlbG93ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIE1hdGgubWluKHJlY3QucmlnaHQsIGNvb3Jkcy5sZWZ0KSksIHRvcDogcmVjdC50b3AgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xvc2VzdCAmJiAoY29vcmRzLmxlZnQgPj0gcmVjdC5yaWdodCAmJiBjb29yZHMudG9wID49IHJlY3QudG9wIHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC5ib3R0b20pKVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY2xvc2VzdCAmJiBmaXJzdEJlbG93KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBmaXJzdEJlbG93O1xuICAgICAgICBjb29yZHNDbG9zZXN0ID0gY29vcmRzQmVsb3c7XG4gICAgICAgIGR4Q2xvc2VzdCA9IDA7XG4gICAgfVxuICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGZpbmRPZmZzZXRJblRleHQoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG4gICAgaWYgKCFjbG9zZXN0IHx8IChkeENsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAxKSlcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0IH07XG4gICAgcmV0dXJuIGZpbmRPZmZzZXRJbk5vZGUoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG59XG5mdW5jdGlvbiBmaW5kT2Zmc2V0SW5UZXh0KG5vZGUsIGNvb3Jkcykge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QocmFuZ2UsIDEpO1xuICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGNvb3Jkcy5sZWZ0ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiAwIH07XG59XG5mdW5jdGlvbiBpblJlY3QoY29vcmRzLCByZWN0KSB7XG4gICAgcmV0dXJuIGNvb3Jkcy5sZWZ0ID49IHJlY3QubGVmdCAtIDEgJiYgY29vcmRzLmxlZnQgPD0gcmVjdC5yaWdodCArIDEgJiZcbiAgICAgICAgY29vcmRzLnRvcCA+PSByZWN0LnRvcCAtIDEgJiYgY29vcmRzLnRvcCA8PSByZWN0LmJvdHRvbSArIDE7XG59XG5mdW5jdGlvbiB0YXJnZXRLbHVkZ2UoZG9tLCBjb29yZHMpIHtcbiAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiAvXmxpJC9pLnRlc3QocGFyZW50Lm5vZGVOYW1lKSAmJiBjb29yZHMubGVmdCA8IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KVxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIHJldHVybiBkb207XG59XG5mdW5jdGlvbiBwb3NGcm9tRWxlbWVudCh2aWV3LCBlbHQsIGNvb3Jkcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gZmluZE9mZnNldEluTm9kZShlbHQsIGNvb3JkcyksIGJpYXMgPSAtMTtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICFub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBiaWFzID0gcmVjdC5sZWZ0ICE9IHJlY3QucmlnaHQgJiYgY29vcmRzLmxlZnQgPiAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcykge1xuICAgIC8vIEJyb3dzZXIgKGluIGNhcmV0UG9zaXRpb24vUmFuZ2VGcm9tUG9pbnQpIHdpbGwgYWdyZXNzaXZlbHlcbiAgICAvLyBub3JtYWxpemUgdG93YXJkcyBuZWFyYnkgaW5saW5lIG5vZGVzLiBTaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpblxuICAgIC8vIHBvc2l0aW9ucyBiZXR3ZWVuIGJsb2NrIG5vZGVzIHRvbywgd2UgZmlyc3Qgd2FsayB1cCB0aGUgaGllcmFyY2h5XG4gICAgLy8gb2Ygbm9kZXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBibG9jayBub2RlcyB0aGF0IHRoZSBjb29yZGluYXRlc1xuICAgIC8vIGZhbGwgb3V0c2lkZSBvZi4gSWYgc28sIHdlIHRha2UgdGhlIHBvc2l0aW9uIGJlZm9yZS9hZnRlciB0aGF0XG4gICAgLy8gYmxvY2suIElmIG5vdCwgd2UgY2FsbCBgcG9zRnJvbURPTWAgb24gdGhlIHJhdyBub2RlL29mZnNldC5cbiAgICBsZXQgb3V0c2lkZUJsb2NrID0gLTE7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZSwgc2F3QmxvY2sgPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gdmlldy5kb20pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY3VyLCB0cnVlKSwgcmVjdDtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZXNjLmRvbS5ub2RlVHlwZSA9PSAxICYmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCB8fCAhZGVzYy5jb250ZW50RE9NKSAmJlxuICAgICAgICAgICAgLy8gSWdub3JlIGVsZW1lbnRzIHdpdGggemVyby1zaXplIGJvdW5kaW5nIHJlY3RhbmdsZXNcbiAgICAgICAgICAgICgocmVjdCA9IGRlc2MuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS53aWR0aCB8fCByZWN0LmhlaWdodCkpIHtcbiAgICAgICAgICAgIGlmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgdGhlIGhvcml6b250YWwgdGVzdCB0byB0aGUgaW5uZXJtb3N0IGJsb2NrLiBWZXJ0aWNhbCBmb3IgYW55IHBhcmVudC5cbiAgICAgICAgICAgICAgICBpZiAoIXNhd0Jsb2NrICYmIHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0IHx8IHJlY3QudG9wID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZUJsb2NrID0gZGVzYy5wb3NCZWZvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNhd0Jsb2NrICYmIHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCB8fCByZWN0LmJvdHRvbSA8IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICAgICAgc2F3QmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkZXNjLmNvbnRlbnRET00gJiYgb3V0c2lkZUJsb2NrIDwgMCAmJiAhZGVzYy5ub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbnNpZGUgYSBsZWFmLCByZXR1cm4gdGhlIHNpZGUgb2YgdGhlIGxlYWYgY2xvc2VyIHRvIHRoZSBjb29yZHNcbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gZGVzYy5ub2RlLmlzQmxvY2sgPyBjb29yZHMudG9wIDwgKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMlxuICAgICAgICAgICAgICAgICAgICA6IGNvb3Jkcy5sZWZ0IDwgKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlID8gZGVzYy5wb3NCZWZvcmUgOiBkZXNjLnBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGRlc2MuZG9tLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBvdXRzaWRlQmxvY2sgPiAtMSA/IG91dHNpZGVCbG9jayA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgLTEpO1xufVxuZnVuY3Rpb24gZWxlbWVudEZyb21Qb2ludChlbGVtZW50LCBjb29yZHMsIGJveCkge1xuICAgIGxldCBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgIGlmIChsZW4gJiYgYm94LnRvcCA8IGJveC5ib3R0b20pIHtcbiAgICAgICAgZm9yIChsZXQgc3RhcnRJID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGVuIC0gMSwgTWF0aC5mbG9vcihsZW4gKiAoY29vcmRzLnRvcCAtIGJveC50b3ApIC8gKGJveC5ib3R0b20gLSBib3gudG9wKSkgLSAyKSksIGkgPSBzdGFydEk7Oykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBjaGlsZC5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRGcm9tUG9pbnQoY2hpbGQsIGNvb3JkcywgcmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChpID0gKGkgKyAxKSAlIGxlbikgPT0gc3RhcnRJKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xufVxuLy8gR2l2ZW4gYW4geCx5IHBvc2l0aW9uIG9uIHRoZSBlZGl0b3IsIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LlxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzKSB7XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQsIG5vZGUsIG9mZnNldCA9IDA7XG4gICAgbGV0IGNhcmV0ID0gY2FyZXRGcm9tUG9pbnQoZG9jLCBjb29yZHMubGVmdCwgY29vcmRzLnRvcCk7XG4gICAgaWYgKGNhcmV0KVxuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGNhcmV0KTtcbiAgICBsZXQgZWx0ID0gKHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50ID8gdmlldy5yb290IDogZG9jKVxuICAgICAgICAuZWxlbWVudEZyb21Qb2ludChjb29yZHMubGVmdCwgY29vcmRzLnRvcCk7XG4gICAgbGV0IHBvcztcbiAgICBpZiAoIWVsdCB8fCAhdmlldy5kb20uY29udGFpbnMoZWx0Lm5vZGVUeXBlICE9IDEgPyBlbHQucGFyZW50Tm9kZSA6IGVsdCkpIHtcbiAgICAgICAgbGV0IGJveCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIWluUmVjdChjb29yZHMsIGJveCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgZWx0ID0gZWxlbWVudEZyb21Qb2ludCh2aWV3LmRvbSwgY29vcmRzLCBib3gpO1xuICAgICAgICBpZiAoIWVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHJldHVybnMgbm9uc2Vuc2Ugd2hlbiBvbiBhIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgaWYgKHNhZmFyaSkge1xuICAgICAgICBmb3IgKGxldCBwID0gZWx0OyBub2RlICYmIHA7IHAgPSBwYXJlbnROb2RlKHApKVxuICAgICAgICAgICAgaWYgKHAuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsdCA9IHRhcmdldEtsdWRnZShlbHQsIGNvb3Jkcyk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgICAgaWYgKGdlY2tvICYmIG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgLy8gRmlyZWZveCB3aWxsIHNvbWV0aW1lcyByZXR1cm4gb2Zmc2V0cyBpbnRvIDxpbnB1dD4gbm9kZXMsIHdoaWNoXG4gICAgICAgICAgICAvLyBoYXZlIG5vIGFjdHVhbCBjaGlsZHJlbiwgZnJvbSBjYXJldFBvc2l0aW9uRnJvbVBvaW50ICgjOTUzKVxuICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIEl0J2xsIGFsc28gbW92ZSB0aGUgcmV0dXJuZWQgcG9zaXRpb24gYmVmb3JlIGltYWdlIG5vZGVzLFxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aG9zZSBhcmUgYmVoaW5kIGl0LlxuICAgICAgICAgICAgaWYgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdLCBib3g7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiAoYm94ID0gbmV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkucmlnaHQgPD0gY29vcmRzLmxlZnQgJiZcbiAgICAgICAgICAgICAgICAgICAgYm94LmJvdHRvbSA+IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwcmV2O1xuICAgICAgICAvLyBXaGVuIGNsaWNraW5nIGFib3ZlIHRoZSByaWdodCBzaWRlIG9mIGFuIHVuZWRpdGFibGUgbm9kZSwgQ2hyb21lIHdpbGwgcmVwb3J0IGEgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHRoYXQgbm9kZS5cbiAgICAgICAgaWYgKHdlYmtpdCAmJiBvZmZzZXQgJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIChwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdKS5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgJiYgcHJldi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPj0gY29vcmRzLnRvcClcbiAgICAgICAgICAgIG9mZnNldC0tO1xuICAgICAgICAvLyBTdXNwaWNpb3VzbHkgc3BlY2lmaWMga2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyBuZXZlciByZXR1cm5pbmcgYSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICBpZiAobm9kZSA9PSB2aWV3LmRvbSAmJiBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDEgJiYgbm9kZS5sYXN0Q2hpbGQubm9kZVR5cGUgPT0gMSAmJlxuICAgICAgICAgICAgY29vcmRzLnRvcCA+IG5vZGUubGFzdENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSlcbiAgICAgICAgICAgIHBvcyA9IHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZTtcbiAgICAgICAgLy8gSWdub3JlIHBvc2l0aW9ucyBkaXJlY3RseSBhZnRlciBhIEJSLCBzaW5jZSBjYXJldCpGcm9tUG9pbnRcbiAgICAgICAgLy8gJ3JvdW5kIHVwJyBwb3NpdGlvbnMgdGhhdCB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlbHkgcGxhY2VkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgQlIgbm9kZS5cbiAgICAgICAgZWxzZSBpZiAob2Zmc2V0ID09IDAgfHwgbm9kZS5ub2RlVHlwZSAhPSAxIHx8IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5ub2RlTmFtZSAhPSBcIkJSXCIpXG4gICAgICAgICAgICBwb3MgPSBwb3NGcm9tQ2FyZXQodmlldywgbm9kZSwgb2Zmc2V0LCBjb29yZHMpO1xuICAgIH1cbiAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgIHBvcyA9IHBvc0Zyb21FbGVtZW50KHZpZXcsIGVsdCwgY29vcmRzKTtcbiAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhlbHQsIHRydWUpO1xuICAgIHJldHVybiB7IHBvcywgaW5zaWRlOiBkZXNjID8gZGVzYy5wb3NBdFN0YXJ0IC0gZGVzYy5ib3JkZXIgOiAtMSB9O1xufVxuZnVuY3Rpb24gbm9uWmVybyhyZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QudG9wIDwgcmVjdC5ib3R0b20gfHwgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodDtcbn1cbmZ1bmN0aW9uIHNpbmdsZVJlY3QodGFyZ2V0LCBiaWFzKSB7XG4gICAgbGV0IHJlY3RzID0gdGFyZ2V0LmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICBsZXQgZmlyc3QgPSByZWN0c1tiaWFzIDwgMCA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKG5vblplcm8oZmlyc3QpKVxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyZWN0cywgbm9uWmVybykgfHwgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuY29uc3QgQklESSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXS87XG4vLyBHaXZlbiBhIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBtb2RlbCwgZ2V0IGEgYm91bmRpbmcgYm94IG9mIHRoZVxuLy8gY2hhcmFjdGVyIGF0IHRoYXQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cuXG5mdW5jdGlvbiBjb29yZHNBdFBvcyh2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgeyBub2RlLCBvZmZzZXQsIGF0b20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgIGxldCBzdXBwb3J0RW1wdHlSYW5nZSA9IHdlYmtpdCB8fCBnZWNrbztcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgIC8vIFRoZXNlIGJyb3dzZXJzIHN1cHBvcnQgcXVlcnlpbmcgZW1wdHkgdGV4dCByYW5nZXMuIFByZWZlciB0aGF0IGluXG4gICAgICAgIC8vIGJpZGkgY29udGV4dCBvciB3aGVuIGF0IHRoZSBlbmQgb2YgYSBub2RlLlxuICAgICAgICBpZiAoc3VwcG9ydEVtcHR5UmFuZ2UgJiYgKEJJREkudGVzdChub2RlLm5vZGVWYWx1ZSkgfHwgKHNpZGUgPCAwID8gIW9mZnNldCA6IG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpKSkge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBvZmZzZXQsIG9mZnNldCksIHNpZGUpO1xuICAgICAgICAgICAgLy8gRmlyZWZveCByZXR1cm5zIGJhZCByZXN1bHRzICh0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBzcGFjZSlcbiAgICAgICAgICAgIC8vIHdoZW4gcXVlcnlpbmcgYSBwb3NpdGlvbiBkaXJlY3RseSBhZnRlciBsaW5lLWJyb2tlblxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZS4gRGV0ZWN0IHRoaXMgc2l0dWF0aW9uIGFuZCBhbmQga2x1ZGdlIGFyb3VuZCBpdFxuICAgICAgICAgICAgaWYgKGdlY2tvICYmIG9mZnNldCAmJiAvXFxzLy50ZXN0KG5vZGUubm9kZVZhbHVlW29mZnNldCAtIDFdKSAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdEJlZm9yZSA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCAtIDEsIG9mZnNldCAtIDEpLCAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3RCZWZvcmUudG9wID09IHJlY3QudG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0QWZ0ZXIgPSBzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBvZmZzZXQsIG9mZnNldCArIDEpLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QWZ0ZXIudG9wICE9IHJlY3QudG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYXR0ZW5WKHJlY3RBZnRlciwgcmVjdEFmdGVyLmxlZnQgPCByZWN0QmVmb3JlLmxlZnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBvZmZzZXQsIHRvID0gb2Zmc2V0LCB0YWtlU2lkZSA9IHNpZGUgPCAwID8gMSA6IC0xO1xuICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmICFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0bysrO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaWRlID49IDAgJiYgb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgICAgICB0YWtlU2lkZSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaWRlIDwgMCkge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8pLCB0YWtlU2lkZSksIHRha2VTaWRlIDwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0ICRkb20gPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcyAtIChhdG9tIHx8IDApKTtcbiAgICAvLyBSZXR1cm4gYSBob3Jpem9udGFsIGxpbmUgaW4gYmxvY2sgY29udGV4dFxuICAgIGlmICghJGRvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCAmJiAoc2lkZSA8IDAgfHwgb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlbkgoYmVmb3JlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBpZiAoYWZ0ZXIubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlbkgoYWZ0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0dGVuSChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBzaWRlID49IDApO1xuICAgIH1cbiAgICAvLyBJbmxpbmUsIG5vdCBpbiB0ZXh0IG5vZGUgKHRoaXMgaXMgbm90IEJpZGktc2FmZSlcbiAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCAmJiAoc2lkZSA8IDAgfHwgb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYmVmb3JlLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYmVmb3JlLCBub2RlU2l6ZShiZWZvcmUpIC0gKHN1cHBvcnRFbXB0eVJhbmdlID8gMCA6IDEpKVxuICAgICAgICAgICAgLy8gQlIgbm9kZXMgdGVuZCB0byBvbmx5IHJldHVybiB0aGUgcmVjdGFuZ2xlIGJlZm9yZSB0aGVtLlxuICAgICAgICAgICAgLy8gT25seSB1c2UgdGhlbSBpZiB0aGV5IGFyZSB0aGUgbGFzdCBlbGVtZW50IGluIHRoZWlyIHBhcmVudFxuICAgICAgICAgICAgOiBiZWZvcmUubm9kZVR5cGUgPT0gMSAmJiAoYmVmb3JlLm5vZGVOYW1lICE9IFwiQlJcIiB8fCAhYmVmb3JlLm5leHRTaWJsaW5nKSA/IGJlZm9yZSA6IG51bGw7XG4gICAgICAgIGlmICh0YXJnZXQpXG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0YXJnZXQsIDEpLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0IDwgbm9kZVNpemUobm9kZSkpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIHdoaWxlIChhZnRlci5wbVZpZXdEZXNjICYmIGFmdGVyLnBtVmlld0Rlc2MuaWdub3JlRm9yQ29vcmRzKVxuICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5uZXh0U2libGluZztcbiAgICAgICAgbGV0IHRhcmdldCA9ICFhZnRlciA/IG51bGwgOiBhZnRlci5ub2RlVHlwZSA9PSAzID8gdGV4dFJhbmdlKGFmdGVyLCAwLCAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICA6IGFmdGVyLm5vZGVUeXBlID09IDEgPyBhZnRlciA6IG51bGw7XG4gICAgICAgIGlmICh0YXJnZXQpXG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0YXJnZXQsIC0xKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIEFsbCBlbHNlIGZhaWxlZCwganVzdCB0cnkgdG8gZ2V0IGEgcmVjdGFuZ2xlIGZvciB0aGUgdGFyZ2V0IG5vZGVcbiAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdChub2RlLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2Uobm9kZSkgOiBub2RlLCAtc2lkZSksIHNpZGUgPj0gMCk7XG59XG5mdW5jdGlvbiBmbGF0dGVuVihyZWN0LCBsZWZ0KSB7XG4gICAgaWYgKHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QuYm90dG9tLCBsZWZ0OiB4LCByaWdodDogeCB9O1xufVxuZnVuY3Rpb24gZmxhdHRlbkgocmVjdCwgdG9wKSB7XG4gICAgaWYgKHJlY3QuaGVpZ2h0ID09IDApXG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIGxldCB5ID0gdG9wID8gcmVjdC50b3AgOiByZWN0LmJvdHRvbTtcbiAgICByZXR1cm4geyB0b3A6IHksIGJvdHRvbTogeSwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCB9O1xufVxuZnVuY3Rpb24gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgZikge1xuICAgIGxldCB2aWV3U3RhdGUgPSB2aWV3LnN0YXRlLCBhY3RpdmUgPSB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAodmlld1N0YXRlICE9IHN0YXRlKVxuICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcbiAgICBpZiAoYWN0aXZlICE9IHZpZXcuZG9tKVxuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGYoKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXdTdGF0ZSk7XG4gICAgICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20gJiYgYWN0aXZlKVxuICAgICAgICAgICAgYWN0aXZlLmZvY3VzKCk7XG4gICAgfVxufVxuLy8gV2hldGhlciB2ZXJ0aWNhbCBwb3NpdGlvbiBtb3Rpb24gaW4gYSBnaXZlbiBkaXJlY3Rpb25cbi8vIGZyb20gYSBwb3NpdGlvbiB3b3VsZCBsZWF2ZSBhIHRleHQgYmxvY2suXG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja1ZlcnRpY2FsKHZpZXcsIHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkcG9zID0gZGlyID09IFwidXBcIiA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgcmV0dXJuIHdpdGhGbHVzaGVkU3RhdGUodmlldywgc3RhdGUsICgpID0+IHtcbiAgICAgICAgbGV0IHsgbm9kZTogZG9tIH0gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcygkcG9zLnBvcywgZGlyID09IFwidXBcIiA/IC0xIDogMSk7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGRvbSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIW5lYXJlc3QpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobmVhcmVzdC5ub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICBkb20gPSBuZWFyZXN0LmNvbnRlbnRET00gfHwgbmVhcmVzdC5kb207XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20gPSBuZWFyZXN0LmRvbS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb29yZHMgPSBjb29yZHNBdFBvcyh2aWV3LCAkcG9zLnBvcywgMSk7XG4gICAgICAgIGZvciAobGV0IGNoaWxkID0gZG9tLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgYm94ZXM7XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICBib3hlcyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIGJveGVzID0gdGV4dFJhbmdlKGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBib3ggPSBib3hlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYm94LmJvdHRvbSA+IGJveC50b3AgKyAxICYmXG4gICAgICAgICAgICAgICAgICAgIChkaXIgPT0gXCJ1cFwiID8gY29vcmRzLnRvcCAtIGJveC50b3AgPiAoYm94LmJvdHRvbSAtIGNvb3Jkcy50b3ApICogMlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBib3guYm90dG9tIC0gY29vcmRzLmJvdHRvbSA+IChjb29yZHMuYm90dG9tIC0gYm94LnRvcCkgKiAyKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuY29uc3QgbWF5YmVSVEwgPSAvW1xcdTA1OTAtXFx1MDhhY10vO1xuZnVuY3Rpb24gZW5kT2ZUZXh0YmxvY2tIb3Jpem9udGFsKHZpZXcsIHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9ICRoZWFkLnBhcmVudE9mZnNldCwgYXRTdGFydCA9ICFvZmZzZXQsIGF0RW5kID0gb2Zmc2V0ID09ICRoZWFkLnBhcmVudC5jb250ZW50LnNpemU7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWwpXG4gICAgICAgIHJldHVybiAkaGVhZC5wb3MgPT0gJGhlYWQuc3RhcnQoKSB8fCAkaGVhZC5wb3MgPT0gJGhlYWQuZW5kKCk7XG4gICAgLy8gSWYgdGhlIHRleHRibG9jayBpcyBhbGwgTFRSLCBvciB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnRcbiAgICAvLyBTZWxlY3Rpb24ubW9kaWZ5IChFZGdlKSwgZmFsbCBiYWNrIHRvIGEgcHJpbWl0aXZlIGFwcHJvYWNoXG4gICAgaWYgKCFtYXliZVJUTC50ZXN0KCRoZWFkLnBhcmVudC50ZXh0Q29udGVudCkgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgIHJldHVybiBkaXIgPT0gXCJsZWZ0XCIgfHwgZGlyID09IFwiYmFja3dhcmRcIiA/IGF0U3RhcnQgOiBhdEVuZDtcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICAvLyBUaGlzIGlzIGEgaHVnZSBoYWNrLCBidXQgYXBwZWFycyB0byBiZSB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gY3VycmVudGx5IGRvOiB1c2UgYFNlbGVjdGlvbi5tb2RpZnlgIHRvIG1vdmUgdGhlIHNlbGVjdGlvbiBieVxuICAgICAgICAvLyBvbmUgY2hhcmFjdGVyLCBhbmQgc2VlIGlmIHRoYXQgbW92ZXMgdGhlIGN1cnNvciBvdXQgb2YgdGhlXG4gICAgICAgIC8vIHRleHRibG9jayAob3IgZG9lc24ndCBtb3ZlIGl0IGF0IGFsbCwgd2hlbiBhdCB0aGUgc3RhcnQvZW5kIG9mXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCkuXG4gICAgICAgIGxldCB7IGZvY3VzTm9kZTogb2xkTm9kZSwgZm9jdXNPZmZzZXQ6IG9sZE9mZiwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBvbGRCaWRpTGV2ZWwgPSBzZWwuY2FyZXRCaWRpTGV2ZWwgLy8gT25seSBmb3IgRmlyZWZveFxuICAgICAgICA7XG4gICAgICAgIHNlbC5tb2RpZnkoXCJtb3ZlXCIsIGRpciwgXCJjaGFyYWN0ZXJcIik7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSAkaGVhZC5kZXB0aCA/IHZpZXcuZG9jVmlldy5kb21BZnRlclBvcygkaGVhZC5iZWZvcmUoKSkgOiB2aWV3LmRvbTtcbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBuZXdOb2RlLCBmb2N1c09mZnNldDogbmV3T2ZmIH0gPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXdOb2RlICYmICFwYXJlbnRET00uY29udGFpbnMobmV3Tm9kZS5ub2RlVHlwZSA9PSAxID8gbmV3Tm9kZSA6IG5ld05vZGUucGFyZW50Tm9kZSkgfHxcbiAgICAgICAgICAgIChvbGROb2RlID09IG5ld05vZGUgJiYgb2xkT2ZmID09IG5ld09mZik7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gICAgICAgICAgICBpZiAob2xkTm9kZSAmJiAob2xkTm9kZSAhPSBhbmNob3JOb2RlIHx8IG9sZE9mZiAhPSBhbmNob3JPZmZzZXQpICYmIHNlbC5leHRlbmQpXG4gICAgICAgICAgICAgICAgc2VsLmV4dGVuZChvbGROb2RlLCBvbGRPZmYpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgaWYgKG9sZEJpZGlMZXZlbCAhPSBudWxsKVxuICAgICAgICAgICAgc2VsLmNhcmV0QmlkaUxldmVsID0gb2xkQmlkaUxldmVsO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xufVxubGV0IGNhY2hlZFN0YXRlID0gbnVsbDtcbmxldCBjYWNoZWREaXIgPSBudWxsO1xubGV0IGNhY2hlZFJlc3VsdCA9IGZhbHNlO1xuZnVuY3Rpb24gZW5kT2ZUZXh0YmxvY2sodmlldywgc3RhdGUsIGRpcikge1xuICAgIGlmIChjYWNoZWRTdGF0ZSA9PSBzdGF0ZSAmJiBjYWNoZWREaXIgPT0gZGlyKVxuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIGNhY2hlZFN0YXRlID0gc3RhdGU7XG4gICAgY2FjaGVkRGlyID0gZGlyO1xuICAgIHJldHVybiBjYWNoZWRSZXN1bHQgPSBkaXIgPT0gXCJ1cFwiIHx8IGRpciA9PSBcImRvd25cIlxuICAgICAgICA/IGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcilcbiAgICAgICAgOiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcik7XG59XG5cbi8vIFZpZXcgZGVzY3JpcHRpb25zIGFyZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBkZXNjcmliZSB0aGUgRE9NIHRoYXQgaXNcbi8vIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBlZGl0b3IncyBjb250ZW50LiBUaGV5IGFyZSB1c2VkIGZvcjpcbi8vXG4vLyAtIEluY3JlbWVudGFsIHJlZHJhd2luZyB3aGVuIHRoZSBkb2N1bWVudCBjaGFuZ2VzXG4vL1xuLy8gLSBGaWd1cmluZyBvdXQgd2hhdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCBhIGdpdmVuIERPTSBwb3NpdGlvblxuLy8gICBjb3JyZXNwb25kcyB0b1xuLy9cbi8vIC0gV2lyaW5nIGluIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGVkaXRpbmcgaW50ZXJmYWNlIGZvciBhXG4vLyAgIGdpdmVuIG5vZGVcbi8vXG4vLyBUaGV5IGZvcm0gYSBkb3VibHktbGlua2VkIG11dGFibGUgdHJlZSwgc3RhcnRpbmcgYXQgYHZpZXcuZG9jVmlld2AuXG5jb25zdCBOT1RfRElSVFkgPSAwLCBDSElMRF9ESVJUWSA9IDEsIENPTlRFTlRfRElSVFkgPSAyLCBOT0RFX0RJUlRZID0gMztcbi8vIFN1cGVyY2xhc3MgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mIGRlc2NyaXB0aW9ucy4gRGVmaW5lcyB0aGVpclxuLy8gYmFzaWMgc3RydWN0dXJlIGFuZCBzaGFyZWQgbWV0aG9kcy5cbmNsYXNzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGNoaWxkcmVuLCBkb20sIFxuICAgIC8vIFRoaXMgaXMgdGhlIG5vZGUgdGhhdCBob2xkcyB0aGUgY2hpbGQgdmlld3MuIEl0IG1heSBiZSBudWxsIGZvclxuICAgIC8vIGRlc2NzIHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJlbi5cbiAgICBjb250ZW50RE9NKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICB0aGlzLmNvbnRlbnRET00gPSBjb250ZW50RE9NO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICAvLyBBbiBleHBhbmRvIHByb3BlcnR5IG9uIHRoZSBET00gbm9kZSBwcm92aWRlcyBhIGxpbmsgYmFjayB0byBpdHNcbiAgICAgICAgLy8gZGVzY3JpcHRpb24uXG4gICAgICAgIGRvbS5wbVZpZXdEZXNjID0gdGhpcztcbiAgICB9XG4gICAgLy8gVXNlZCB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gZGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYVxuICAgIC8vIHdpZGdldC9tYXJrL25vZGUuXG4gICAgbWF0Y2hlc1dpZGdldCh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbWF0Y2hlc01hcmsobWFyaykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzSGFjayhub2RlTmFtZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvLyBXaGVuIHBhcnNpbmcgaW4tZWRpdG9yIGNvbnRlbnQgKGluIGRvbWNoYW5nZS5qcyksIHdlIGFsbG93XG4gICAgLy8gZGVzY3JpcHRpb25zIHRvIGRldGVybWluZSB0aGUgcGFyc2UgcnVsZXMgdGhhdCBzaG91bGQgYmUgdXNlZCB0b1xuICAgIC8vIHBhcnNlIHRoZW0uXG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8vIFVzZWQgYnkgdGhlIGVkaXRvcidzIGV2ZW50IGhhbmRsZXIgdG8gaWdub3JlIGV2ZW50cyB0aGF0IGNvbWVcbiAgICAvLyBmcm9tIGNlcnRhaW4gZGVzY3MuXG4gICAgc3RvcEV2ZW50KGV2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFRoZSBzaXplIG9mIHRoZSBjb250ZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgZGVzYy5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZTtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICAgIC8vIEZvciBibG9jayBub2RlcywgdGhpcyByZXByZXNlbnRzIHRoZSBzcGFjZSB0YWtlbiB1cCBieSB0aGVpclxuICAgIC8vIHN0YXJ0L2VuZCB0b2tlbnMuXG4gICAgZ2V0IGJvcmRlcigpIHsgcmV0dXJuIDA7IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuZG9tLnBtVmlld0Rlc2MgPT0gdGhpcylcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGVzdHJveSgpO1xuICAgIH1cbiAgICBwb3NCZWZvcmVDaGlsZChjaGlsZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gdGhpcy5wb3NBdFN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjdXIgPT0gY2hpbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjdXIuc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgcG9zQmVmb3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQucG9zQmVmb3JlQ2hpbGQodGhpcyk7XG4gICAgfVxuICAgIGdldCBwb3NBdFN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKSArIHRoaXMuYm9yZGVyIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0FmdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NCZWZvcmUgKyB0aGlzLnNpemU7XG4gICAgfVxuICAgIGdldCBwb3NBdEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIHRoaXMuc2l6ZSAtIDIgKiB0aGlzLmJvcmRlcjtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIC8vIElmIHRoZSBET00gcG9zaXRpb24gaXMgaW4gdGhlIGNvbnRlbnQsIHVzZSB0aGUgY2hpbGQgZGVzYyBhZnRlclxuICAgICAgICAvLyBpdCB0byBmaWd1cmUgb3V0IGEgcG9zaXRpb24uXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NLmNvbnRhaW5zKGRvbS5ub2RlVHlwZSA9PSAxID8gZG9tIDogZG9tLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9tQmVmb3JlLCBkZXNjO1xuICAgICAgICAgICAgICAgIGlmIChkb20gPT0gdGhpcy5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBkb21CZWZvcmUgPSBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQmVmb3JlICYmICEoKGRlc2MgPSBkb21CZWZvcmUucG1WaWV3RGVzYykgJiYgZGVzYy5wYXJlbnQgPT0gdGhpcykpXG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbUJlZm9yZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbUJlZm9yZSA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgKyBkZXNjLnNpemUgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9tQWZ0ZXIsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQWZ0ZXIgPSBkb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGRvbUFmdGVyICYmICEoKGRlc2MgPSBkb21BZnRlci5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQWZ0ZXIgPSBkb21BZnRlci5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQWZ0ZXIgPyB0aGlzLnBvc0JlZm9yZUNoaWxkKGRlc2MpIDogdGhpcy5wb3NBdEVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSB2YXJpb3VzIGhldXJpc3RpY3MsIGZhbGxpbmcgYmFjayBvbiB0aGUgYmlhc1xuICAgICAgICAvLyBwYXJhbWV0ZXIsIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHJldHVybiB0aGUgcG9zaXRpb24gYXQgdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9yIGF0IHRoZSBlbmQgb2YgdGhpcyB2aWV3IGRlc2MuXG4gICAgICAgIGxldCBhdEVuZDtcbiAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmRvbSAmJiB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGF0RW5kID0gb2Zmc2V0ID4gZG9tSW5kZXgodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRoaXMuY29udGVudERPTSkpIHtcbiAgICAgICAgICAgIGF0RW5kID0gZG9tLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuY29udGVudERPTSkgJiAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2ggPSBkb207OyBzZWFyY2ggPSBzZWFyY2gucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdEVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXRFbmQgPT0gbnVsbCAmJiBvZmZzZXQgPT0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2gubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhdEVuZCA9PSBudWxsID8gYmlhcyA+IDAgOiBhdEVuZCkgPyB0aGlzLnBvc0F0RW5kIDogdGhpcy5wb3NBdFN0YXJ0O1xuICAgIH1cbiAgICBuZWFyZXN0RGVzYyhkb20sIG9ubHlOb2RlcyA9IGZhbHNlKSB7XG4gICAgICAgIGZvciAobGV0IGZpcnN0ID0gdHJ1ZSwgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBsZXQgZGVzYyA9IHRoaXMuZ2V0RGVzYyhjdXIpLCBub2RlRE9NO1xuICAgICAgICAgICAgaWYgKGRlc2MgJiYgKCFvbmx5Tm9kZXMgfHwgZGVzYy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGRvbSBpcyBvdXRzaWRlIG9mIHRoaXMgZGVzYydzIG5vZGVET00sIGRvbid0IGNvdW50IGl0LlxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCAmJiAobm9kZURPTSA9IGRlc2Mubm9kZURPTSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIShub2RlRE9NLm5vZGVUeXBlID09IDEgPyBub2RlRE9NLmNvbnRhaW5zKGRvbS5ub2RlVHlwZSA9PSAxID8gZG9tIDogZG9tLnBhcmVudE5vZGUpIDogbm9kZURPTSA9PSBkb20pKVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RGVzYyhkb20pIHtcbiAgICAgICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZGVzYzsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgaWYgKGN1ciA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjO1xuICAgIH1cbiAgICBwb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBkb207IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKHNjYW4pO1xuICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MubG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIGRlc2MgZm9yIHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBwb3MsIGlmIGFueS4gKFdoZW4gYVxuICAgIC8vIHBhcmVudCBub2RlIG92ZXJyb2RlIHJlbmRlcmluZywgdGhlcmUgbWlnaHQgbm90IGJlIG9uZS4pXG4gICAgZGVzY0F0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IHBvcyAmJiBlbmQgIT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFjaGlsZC5ib3JkZXIgJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IGNoaWxkLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGlubmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPCBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRlc2NBdChwb3MgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5kb20sIG9mZnNldDogMCwgYXRvbTogcG9zICsgMSB9O1xuICAgICAgICAvLyBGaXJzdCBmaW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgY2hpbGQgYXJyYXlcbiAgICAgICAgbGV0IGkgPSAwLCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBjdXJQb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gY3VyUG9zICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPiBwb3MgfHwgY2hpbGQgaW5zdGFuY2VvZiBUcmFpbGluZ0hhY2tWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHBvcyAtIGN1clBvcztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1clBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIHBvaW50cyBpbnRvIHRoZSBtaWRkbGUgb2YgYSBjaGlsZCwgY2FsbCB0aHJvdWdoXG4gICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXS5kb21Gcm9tUG9zKG9mZnNldCAtIHRoaXMuY2hpbGRyZW5baV0uYm9yZGVyLCBzaWRlKTtcbiAgICAgICAgLy8gR28gYmFjayBpZiB0aGVyZSB3ZXJlIGFueSB6ZXJvLWxlbmd0aCB3aWRnZXRzIHdpdGggc2lkZSA+PSAwIGJlZm9yZSB0aGlzIHBvaW50XG4gICAgICAgIGZvciAobGV0IHByZXY7IGkgJiYgIShwcmV2ID0gdGhpcy5jaGlsZHJlbltpIC0gMV0pLnNpemUgJiYgcHJldiBpbnN0YW5jZW9mIFdpZGdldFZpZXdEZXNjICYmIHByZXYuc2lkZSA+PSAwOyBpLS0pIHsgfVxuICAgICAgICAvLyBTY2FuIHRvd2FyZHMgdGhlIGZpcnN0IHVzZWFibGUgbm9kZVxuICAgICAgICBpZiAoc2lkZSA8PSAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiwgZW50ZXIgPSB0cnVlO1xuICAgICAgICAgICAgZm9yICg7OyBpLS0sIGVudGVyID0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gaSA/IHRoaXMuY2hpbGRyZW5baSAtIDFdIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXYgfHwgcHJldi5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXYgJiYgc2lkZSAmJiBlbnRlciAmJiAhcHJldi5ib3JkZXIgJiYgIXByZXYuZG9tQXRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldi5kb21Gcm9tUG9zKHByZXYuc2l6ZSwgc2lkZSk7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIG9mZnNldDogcHJldiA/IGRvbUluZGV4KHByZXYuZG9tKSArIDEgOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbmV4dCwgZW50ZXIgPSB0cnVlO1xuICAgICAgICAgICAgZm9yICg7OyBpKyssIGVudGVyID0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jaGlsZHJlbltpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ICYmIGVudGVyICYmICFuZXh0LmJvcmRlciAmJiAhbmV4dC5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUZyb21Qb3MoMCwgc2lkZSk7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIG9mZnNldDogbmV4dCA/IGRvbUluZGV4KG5leHQuZG9tKSA6IHRoaXMuY29udGVudERPTS5jaGlsZE5vZGVzLmxlbmd0aCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgdG8gZmluZCBhIERPTSByYW5nZSBpbiBhIHNpbmdsZSBwYXJlbnQgZm9yIGEgZ2l2ZW4gY2hhbmdlZFxuICAgIC8vIHJhbmdlLlxuICAgIHBhcnNlUmFuZ2UoZnJvbSwgdG8sIGJhc2UgPSAwKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldDogMCwgdG9PZmZzZXQ6IHRoaXMuY29udGVudERPTS5jaGlsZE5vZGVzLmxlbmd0aCB9O1xuICAgICAgICBsZXQgZnJvbU9mZnNldCA9IC0xLCB0b09mZnNldCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSBiYXNlLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID09IC0xICYmIGZyb20gPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkQmFzZSA9IG9mZnNldCArIGNoaWxkLmJvcmRlcjtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBtYXliZSBkZXNjZW5kIG1hcmsgdmlld3MgdG8gcGFyc2UgYSBuYXJyb3dlciByYW5nZT9cbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBjaGlsZEJhc2UgJiYgdG8gPD0gZW5kIC0gY2hpbGQuYm9yZGVyICYmIGNoaWxkLm5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoY2hpbGQuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5wYXJzZVJhbmdlKGZyb20sIHRvLCBjaGlsZEJhc2UpO1xuICAgICAgICAgICAgICAgIGZyb20gPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPiAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXYgPSB0aGlzLmNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYuc2l6ZSAmJiBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSAmJiAhcHJldi5lbXB0eUNoaWxkQXQoMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSBkb21JbmRleChwcmV2LmRvbSkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJvbSAtPSBwcmV2LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBmcm9tT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID4gLTEgJiYgKGVuZCA+IHRvIHx8IGkgPT0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgICAgIHRvID0gZW5kO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5zaXplICYmIG5leHQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFuZXh0LmVtcHR5Q2hpbGRBdCgtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvT2Zmc2V0ID0gZG9tSW5kZXgobmV4dC5kb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdG8gKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRvT2Zmc2V0ID0gdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgZnJvbSwgdG8sIGZyb21PZmZzZXQsIHRvT2Zmc2V0IH07XG4gICAgfVxuICAgIGVtcHR5Q2hpbGRBdChzaWRlKSB7XG4gICAgICAgIGlmICh0aGlzLmJvcmRlciB8fCAhdGhpcy5jb250ZW50RE9NIHx8ICF0aGlzLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltzaWRlIDwgMCA/IDAgOiB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gY2hpbGQuc2l6ZSA9PSAwIHx8IGNoaWxkLmVtcHR5Q2hpbGRBdChzaWRlKTtcbiAgICB9XG4gICAgZG9tQWZ0ZXJQb3MocG9zKSB7XG4gICAgICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gdGhpcy5kb21Gcm9tUG9zKHBvcywgMCk7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEgfHwgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIG5vZGUgYWZ0ZXIgcG9zIFwiICsgcG9zKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgIH1cbiAgICAvLyBWaWV3IGRlc2NzIGFyZSByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBhbnkgc2VsZWN0aW9uIHRoYXQgZmFsbHNcbiAgICAvLyBlbnRpcmVseSBpbnNpZGUgb2YgdGhlbSwgc28gdGhhdCBjdXN0b20gaW1wbGVtZW50YXRpb25zIGNhbiBkb1xuICAgIC8vIGN1c3RvbSB0aGluZ3Mgd2l0aCB0aGUgc2VsZWN0aW9uLiBOb3RlIHRoYXQgdGhpcyBmYWxscyBhcGFydCB3aGVuXG4gICAgLy8gYSBzZWxlY3Rpb24gc3RhcnRzIGluIHN1Y2ggYSBub2RlIGFuZCBlbmRzIGluIGFub3RoZXIsIGluIHdoaWNoXG4gICAgLy8gY2FzZSB3ZSBqdXN0IHVzZSB3aGF0ZXZlciBkb21Gcm9tUG9zIHByb2R1Y2VzIGFzIGEgYmVzdCBlZmZvcnQuXG4gICAgc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGZhbGxzIGVudGlyZWx5IGluIGEgY2hpbGQsIGdpdmUgaXQgdG8gdGhhdCBjaGlsZFxuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKGFuY2hvciwgaGVhZCksIHRvID0gTWF0aC5tYXgoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZnNldCA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb20gPiBvZmZzZXQgJiYgdG8gPCBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNldFNlbGVjdGlvbihhbmNob3IgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIsIGhlYWQgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIsIHZpZXcsIGZvcmNlKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5jaG9yRE9NID0gdGhpcy5kb21Gcm9tUG9zKGFuY2hvciwgYW5jaG9yID8gLTEgOiAxKTtcbiAgICAgICAgbGV0IGhlYWRET00gPSBoZWFkID09IGFuY2hvciA/IGFuY2hvckRPTSA6IHRoaXMuZG9tRnJvbVBvcyhoZWFkLCBoZWFkID8gLTEgOiAxKTtcbiAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcucm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNlbFJhbmdlID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgYnJLbHVkZ2UgPSBmYWxzZTtcbiAgICAgICAgLy8gT24gRmlyZWZveCwgdXNpbmcgU2VsZWN0aW9uLmNvbGxhcHNlIHRvIHB1dCB0aGUgY3Vyc29yIGFmdGVyIGFcbiAgICAgICAgLy8gQlIgbm9kZSBmb3Igc29tZSByZWFzb24gZG9lc24ndCBhbHdheXMgd29yayAoIzEwNzMpLiBPbiBTYWZhcmksXG4gICAgICAgIC8vIHRoZSBjdXJzb3Igc29tZXRpbWVzIGluZXhwbGljYWJsZSB2aXN1YWxseSBsYWdzIGJlaGluZCBpdHNcbiAgICAgICAgLy8gcmVwb3J0ZWQgcG9zaXRpb24gaW4gc3VjaCBzaXR1YXRpb25zICgjMTA5MikuXG4gICAgICAgIGlmICgoZ2Vja28gfHwgc2FmYXJpKSAmJiBhbmNob3IgPT0gaGVhZCkge1xuICAgICAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSBhbmNob3JET007XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgYnJLbHVkZ2UgPSAhIShvZmZzZXQgJiYgbm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0gPT0gXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgLy8gSXNzdWUgIzExMjhcbiAgICAgICAgICAgICAgICBpZiAoYnJLbHVkZ2UgJiYgb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzY2FuID0gbm9kZSwgYWZ0ZXI7IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9IHNjYW4ubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIubm9kZU5hbWUgPT0gXCJCUlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JET00gPSBoZWFkRE9NID0geyBub2RlOiBhZnRlci5wYXJlbnROb2RlLCBvZmZzZXQ6IGRvbUluZGV4KGFmdGVyKSArIDEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXNjID0gc2Nhbi5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgYnJLbHVkZ2UgPSBwcmV2ICYmIChwcmV2Lm5vZGVOYW1lID09IFwiQlJcIiB8fCBwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpcmVmb3ggY2FuIGFjdCBzdHJhbmdlbHkgd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGZyb250IG9mIGFuXG4gICAgICAgIC8vIHVuZWRpdGFibGUgbm9kZS4gU2VlICMxMTYzIGFuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA5NTM2XG4gICAgICAgIGlmIChnZWNrbyAmJiBzZWxSYW5nZS5mb2N1c05vZGUgJiYgc2VsUmFuZ2UuZm9jdXNOb2RlICE9IGhlYWRET00ubm9kZSAmJiBzZWxSYW5nZS5mb2N1c05vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gc2VsUmFuZ2UuZm9jdXNOb2RlLmNoaWxkTm9kZXNbc2VsUmFuZ2UuZm9jdXNPZmZzZXRdO1xuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZvcmNlIHx8IGJyS2x1ZGdlICYmIHNhZmFyaSkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBzZWxSYW5nZS5hbmNob3JOb2RlLCBzZWxSYW5nZS5hbmNob3JPZmZzZXQpICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0LCBzZWxSYW5nZS5mb2N1c05vZGUsIHNlbFJhbmdlLmZvY3VzT2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gU2VsZWN0aW9uLmV4dGVuZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gJ2ludmVydGVkJyBzZWxlY3Rpb25cbiAgICAgICAgLy8gKG9uZSB3aGVyZSB0aGUgZm9jdXMgaXMgYmVmb3JlIHRoZSBhbmNob3IpLCBidXQgbm90IGFsbFxuICAgICAgICAvLyBicm93c2VycyBzdXBwb3J0IGl0IHlldC5cbiAgICAgICAgbGV0IGRvbVNlbEV4dGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZG9tU2VsLmV4dGVuZCB8fCBhbmNob3IgPT0gaGVhZCkgJiYgIWJyS2x1ZGdlKSB7XG4gICAgICAgICAgICBkb21TZWwuY29sbGFwc2UoYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IGhlYWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVNlbC5leHRlbmQoaGVhZERPTS5ub2RlLCBoZWFkRE9NLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZG9tU2VsRXh0ZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzIHdpdGggQ2hyb21lIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYWZ0ZXIgY2FsbGluZ1xuICAgICAgICAgICAgICAgIC8vIGNvbGxhcHNlLCBldmVuIHdoZW4gaXQgc2hvdWxkIGJlIHZhbGlkLiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBidWcsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIGl0IGlzIGRpZmZpY3VsdCB0byBpc29sYXRlLiBJZiB0aGlzIGhhcHBlbnMgZmFsbGJhY2sgdG8gdGhlIG9sZCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gd2l0aG91dCB1c2luZyBleHRlbmQuXG4gICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCB0aGlzIGNvdWxkIGNyYXNoIG9uIFNhZmFyaSBpZiB0aGUgZWRpdG9yIGlzIGhpZGRlbiwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbVNlbEV4dGVuZGVkKSB7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID4gaGVhZCkge1xuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBhbmNob3JET007XG4gICAgICAgICAgICAgICAgYW5jaG9yRE9NID0gaGVhZERPTTtcbiAgICAgICAgICAgICAgICBoZWFkRE9NID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIGRvbVNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIGRvbVNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRlbnRET00gJiYgbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiO1xuICAgIH1cbiAgICBnZXQgY29udGVudExvc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NICE9IHRoaXMuZG9tICYmICF0aGlzLmRvbS5jb250YWlucyh0aGlzLmNvbnRlbnRET00pO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgYSBzdWJ0cmVlIG9mIHRoZSBlbGVtZW50IHRyZWUgdGhhdCBoYXMgYmVlbiB0b3VjaGVkXG4gICAgLy8gYnkgYSBET00gY2hhbmdlLCBzbyB0aGF0IHRoZSBuZXh0IHVwZGF0ZSB3aWxsIHJlZHJhdyBpdC5cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMCwgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBlbmQgPyBmcm9tIDw9IGVuZCAmJiB0byA+PSBvZmZzZXQgOiBmcm9tIDwgZW5kICYmIHRvID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5zaWRlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyLCBlbmRJbnNpZGUgPSBlbmQgLSBjaGlsZC5ib3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gc3RhcnRJbnNpZGUgJiYgdG8gPD0gZW5kSW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmcm9tID09IG9mZnNldCB8fCB0byA9PSBlbmQgPyBDT05URU5UX0RJUlRZIDogQ0hJTERfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHN0YXJ0SW5zaWRlICYmIHRvID09IGVuZEluc2lkZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoaWxkLmNvbnRlbnRMb3N0IHx8IGNoaWxkLmRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IE5PREVfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1hcmtEaXJ0eShmcm9tIC0gc3RhcnRJbnNpZGUsIHRvIC0gc3RhcnRJbnNpZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSAmJiAhY2hpbGQuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IENPTlRFTlRfRElSVFkgOiBOT0RFX0RJUlRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gQ09OVEVOVF9ESVJUWTtcbiAgICB9XG4gICAgbWFya1BhcmVudHNEaXJ0eSgpIHtcbiAgICAgICAgbGV0IGxldmVsID0gMTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRoaXMucGFyZW50OyBub2RlOyBub2RlID0gbm9kZS5wYXJlbnQsIGxldmVsKyspIHtcbiAgICAgICAgICAgIGxldCBkaXJ0eSA9IGxldmVsID09IDEgPyBDT05URU5UX0RJUlRZIDogQ0hJTERfRElSVFk7XG4gICAgICAgICAgICBpZiAobm9kZS5kaXJ0eSA8IGRpcnR5KVxuICAgICAgICAgICAgICAgIG5vZGUuZGlydHkgPSBkaXJ0eTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlnbm9yZUZvckNvb3JkcygpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaXNUZXh0KHRleHQpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vLyBBIHdpZGdldCBkZXNjIHJlcHJlc2VudHMgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggaXMgYSBET00gbm9kZVxuLy8gZHJhd24gYmV0d2VlbiB0aGUgZG9jdW1lbnQgbm9kZXMuXG5jbGFzcyBXaWRnZXRWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBzZWxmLCBkb20gPSB3aWRnZXQudHlwZS50b0RPTTtcbiAgICAgICAgaWYgKHR5cGVvZiBkb20gPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgZG9tID0gZG9tKHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYucGFyZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQucG9zQmVmb3JlQ2hpbGQoc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF3aWRnZXQudHlwZS5zcGVjLnJhdykge1xuICAgICAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgICAgICAgICAgICAgZG9tID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXdpZGdldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHNlbGYgPSB0aGlzO1xuICAgIH1cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgd2lkZ2V0LnR5cGUuZXEodGhpcy53aWRnZXQudHlwZSk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHsgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07IH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IHN0b3AgPSB0aGlzLndpZGdldC5zcGVjLnN0b3BFdmVudDtcbiAgICAgICAgcmV0dXJuIHN0b3AgPyBzdG9wKGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiIHx8IHRoaXMud2lkZ2V0LnNwZWMuaWdub3JlU2VsZWN0aW9uO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndpZGdldC50eXBlLmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBzaWRlKCkgeyByZXR1cm4gdGhpcy53aWRnZXQudHlwZS5zaWRlOyB9XG59XG5jbGFzcyBDb21wb3NpdGlvblZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgZG9tLCB0ZXh0RE9NLCB0ZXh0KSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgIHRoaXMudGV4dERPTSA9IHRleHRET007XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCkge1xuICAgICAgICBpZiAoZG9tICE9IHRoaXMudGV4dERPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyAob2Zmc2V0ID8gdGhpcy5zaXplIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyBvZmZzZXQ7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMudGV4dERPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0KSB7XG4gICAgICAgIHJldHVybiBtdXQudHlwZSA9PT0gJ2NoYXJhY3RlckRhdGEnICYmIG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZTtcbiAgICB9XG59XG4vLyBBIG1hcmsgZGVzYyByZXByZXNlbnRzIGEgbWFyay4gTWF5IGhhdmUgbXVsdGlwbGUgY2hpbGRyZW4sXG4vLyBkZXBlbmRpbmcgb24gaG93IHRoZSBtYXJrIGlzIHNwbGl0LiBOb3RlIHRoYXQgbWFya3MgYXJlIGRyYXduIHVzaW5nXG4vLyBhIGZpeGVkIG5lc3Rpbmcgb3JkZXIsIGZvciBzaW1wbGljaXR5IGFuZCBwcmVkaWN0YWJpbGl0eSwgc28gaW5cbi8vIHNvbWUgY2FzZXMgdGhleSB3aWxsIGJlIHNwbGl0IG1vcmUgb2Z0ZW4gdGhhbiB3b3VsZCBhcHBlYXJcbi8vIG5lY2Vzc2FyeS5cbmNsYXNzIE1hcmtWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG1hcmssIGRvbSwgY29udGVudERPTSwgc3BlYykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIGNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKHBhcmVudCwgbWFyaywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB2aWV3Lm5vZGVWaWV3c1ttYXJrLnR5cGUubmFtZV07XG4gICAgICAgIGxldCBzcGVjID0gY3VzdG9tICYmIGN1c3RvbShtYXJrLCB2aWV3LCBpbmxpbmUpO1xuICAgICAgICBpZiAoIXNwZWMgfHwgIXNwZWMuZG9tKVxuICAgICAgICAgICAgc3BlYyA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2N1bWVudCwgbWFyay50eXBlLnNwZWMudG9ET00obWFyaywgaW5saW5lKSwgbnVsbCwgbWFyay5hdHRycyk7XG4gICAgICAgIHJldHVybiBuZXcgTWFya1ZpZXdEZXNjKHBhcmVudCwgbWFyaywgc3BlYy5kb20sIHNwZWMuY29udGVudERPTSB8fCBzcGVjLmRvbSwgc3BlYyk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHtcbiAgICAgICAgaWYgKCh0aGlzLmRpcnR5ICYgTk9ERV9ESVJUWSkgfHwgdGhpcy5tYXJrLnR5cGUuc3BlYy5yZXBhcnNlSW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB7IG1hcms6IHRoaXMubWFyay50eXBlLm5hbWUsIGF0dHJzOiB0aGlzLm1hcmsuYXR0cnMsIGNvbnRlbnRFbGVtZW50OiB0aGlzLmNvbnRlbnRET00gfTtcbiAgICB9XG4gICAgbWF0Y2hlc01hcmsobWFyaykgeyByZXR1cm4gdGhpcy5kaXJ0eSAhPSBOT0RFX0RJUlRZICYmIHRoaXMubWFyay5lcShtYXJrKTsgfVxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBzdXBlci5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICAvLyBNb3ZlIGRpcnR5IGluZm8gdG8gbmVhcmVzdCBub2RlIHZpZXdcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAoIXBhcmVudC5ub2RlKVxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAocGFyZW50LmRpcnR5IDwgdGhpcy5kaXJ0eSlcbiAgICAgICAgICAgICAgICBwYXJlbnQuZGlydHkgPSB0aGlzLmRpcnR5O1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzbGljZShmcm9tLCB0bywgdmlldykge1xuICAgICAgICBsZXQgY29weSA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy5wYXJlbnQsIHRoaXMubWFyaywgdHJ1ZSwgdmlldyk7XG4gICAgICAgIGxldCBub2RlcyA9IHRoaXMuY2hpbGRyZW4sIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGlmICh0byA8IHNpemUpXG4gICAgICAgICAgICBub2RlcyA9IHJlcGxhY2VOb2Rlcyhub2RlcywgdG8sIHNpemUsIHZpZXcpO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICBub2RlcyA9IHJlcGxhY2VOb2Rlcyhub2RlcywgMCwgZnJvbSwgdmlldyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBub2Rlc1tpXS5wYXJlbnQgPSBjb3B5O1xuICAgICAgICBjb3B5LmNoaWxkcmVuID0gbm9kZXM7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbi8vIE5vZGUgdmlldyBkZXNjcyBhcmUgdGhlIG1haW4sIG1vc3QgY29tbW9uIHR5cGUgb2YgdmlldyBkZXNjLCBhbmRcbi8vIGNvcnJlc3BvbmQgdG8gYW4gYWN0dWFsIG5vZGUgaW4gdGhlIGRvY3VtZW50LiBVbmxpa2UgbWFyayBkZXNjcyxcbi8vIHRoZXkgcG9wdWxhdGUgdGhlaXIgY2hpbGQgYXJyYXkgdGhlbXNlbHZlcy5cbmNsYXNzIE5vZGVWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHZpZXcsIHBvcykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIGNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm91dGVyRGVjbyA9IG91dGVyRGVjbztcbiAgICAgICAgdGhpcy5pbm5lckRlY28gPSBpbm5lckRlY287XG4gICAgICAgIHRoaXMubm9kZURPTSA9IG5vZGVET007XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQsIGEgbm9kZSBpcyByZW5kZXJlZCB1c2luZyB0aGUgYHRvRE9NYCBtZXRob2QgZnJvbSB0aGVcbiAgICAvLyBub2RlIHR5cGUgc3BlYy4gQnV0IGNsaWVudCBjb2RlIGNhbiB1c2UgdGhlIGBub2RlVmlld3NgIHNwZWMgdG9cbiAgICAvLyBzdXBwbHkgYSBjdXN0b20gbm9kZSB2aWV3LCB3aGljaCBjYW4gaW5mbHVlbmNlIHZhcmlvdXMgYXNwZWN0cyBvZlxuICAgIC8vIHRoZSB3YXkgdGhlIG5vZGUgd29ya3MuXG4gICAgLy9cbiAgICAvLyAoVXNpbmcgc3ViY2xhc3NpbmcgZm9yIHRoaXMgd2FzIGludGVudGlvbmFsbHkgZGVjaWRlZCBhZ2FpbnN0LFxuICAgIC8vIHNpbmNlIGl0J2QgcmVxdWlyZSBleHBvc2luZyBhIHdob2xlIHNsZXcgb2YgZmluaWNreVxuICAgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdGhlIHVzZXIgY29kZSB0aGF0IHRoZXkgcHJvYmFibHkgd2lsbFxuICAgIC8vIG5ldmVyIG5lZWQuKVxuICAgIHN0YXRpYyBjcmVhdGUocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB2aWV3Lm5vZGVWaWV3c1tub2RlLnR5cGUubmFtZV0sIGRlc2NPYmo7XG4gICAgICAgIGxldCBzcGVjID0gY3VzdG9tICYmIGN1c3RvbShub2RlLCB2aWV3LCAoKSA9PiB7XG4gICAgICAgICAgICAvLyAoVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjdXN0b20gdmlldyB0byBmaW5kIGl0c1xuICAgICAgICAgICAgLy8gb3duIHBvc2l0aW9uKVxuICAgICAgICAgICAgaWYgKCFkZXNjT2JqKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBpZiAoZGVzY09iai5wYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NPYmoucGFyZW50LnBvc0JlZm9yZUNoaWxkKGRlc2NPYmopO1xuICAgICAgICB9LCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgIGxldCBkb20gPSBzcGVjICYmIHNwZWMuZG9tLCBjb250ZW50RE9NID0gc3BlYyAmJiBzcGVjLmNvbnRlbnRET007XG4gICAgICAgIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgaWYgKCFkb20pXG4gICAgICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSAhPSAzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGV4dCBtdXN0IGJlIHJlbmRlcmVkIGFzIGEgRE9NIHRleHQgbm9kZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZG9tKSB7XG4gICAgICAgICAgICBsZXQgc3BlYyA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2N1bWVudCwgbm9kZS50eXBlLnNwZWMudG9ET00obm9kZSksIG51bGwsIG5vZGUuYXR0cnMpO1xuICAgICAgICAgICAgKHsgZG9tLCBjb250ZW50RE9NIH0gPSBzcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRlbnRET00gJiYgIW5vZGUuaXNUZXh0ICYmIGRvbS5ub2RlTmFtZSAhPSBcIkJSXCIpIHsgLy8gQ2hyb21lIGdldHMgY29uZnVzZWQgYnkgPGJyIGNvbnRlbnRlZGl0YWJsZT1mYWxzZT5cbiAgICAgICAgICAgIGlmICghZG9tLmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSlcbiAgICAgICAgICAgICAgICBkb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSlcbiAgICAgICAgICAgICAgICBkb20uZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZURPTSA9IGRvbTtcbiAgICAgICAgZG9tID0gYXBwbHlPdXRlckRlY28oZG9tLCBvdXRlckRlY28sIG5vZGUpO1xuICAgICAgICBpZiAoc3BlYylcbiAgICAgICAgICAgIHJldHVybiBkZXNjT2JqID0gbmV3IEN1c3RvbU5vZGVWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00gfHwgbnVsbCwgbm9kZURPTSwgc3BlYywgdmlldywgcG9zICsgMSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBub2RlRE9NLCB2aWV3KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlVmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NIHx8IG51bGwsIG5vZGVET00sIHZpZXcsIHBvcyArIDEpO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIC8vIEV4cGVyaW1lbnRhbCBrbHVkZ2UgdG8gYWxsb3cgb3B0LWluIHJlLXBhcnNpbmcgb2Ygbm9kZXNcbiAgICAgICAgaWYgKHRoaXMubm9kZS50eXBlLnNwZWMucmVwYXJzZUluVmlldylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBGSVhNRSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgY2FuIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gYXR0cnMgbWVhbnMgdGhhdCBpZiB0aGUgdXNlciBzb21laG93IG1hbmFnZXMgdG8gY2hhbmdlIHRoZVxuICAgICAgICAvLyBhdHRycyBpbiB0aGUgZG9tLCB0aGF0IHdvbid0IGJlIHBpY2tlZCB1cC4gTm90IGVudGlyZWx5IHN1cmVcbiAgICAgICAgLy8gd2hldGhlciB0aGlzIGlzIGEgcHJvYmxlbVxuICAgICAgICBsZXQgcnVsZSA9IHsgbm9kZTogdGhpcy5ub2RlLnR5cGUubmFtZSwgYXR0cnM6IHRoaXMubm9kZS5hdHRycyB9O1xuICAgICAgICBpZiAodGhpcy5ub2RlLnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiKVxuICAgICAgICAgICAgcnVsZS5wcmVzZXJ2ZVdoaXRlc3BhY2UgPSBcImZ1bGxcIjtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIHJ1bGUuZ2V0Q29udGVudCA9ICgpID0+IHRoaXMubm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRMb3N0KSB7XG4gICAgICAgICAgICBydWxlLmNvbnRlbnRFbGVtZW50ID0gdGhpcy5jb250ZW50RE9NO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hyb21lIGxpa2VzIHRvIHJhbmRvbWx5IHJlY3JlYXRlIHBhcmVudCBub2RlcyB3aGVuXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyB0aGluZ3MuIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGlzIHRyaWVzIHRvIGZpbmQgdGhlXG4gICAgICAgICAgICAvLyBuZXcgcGFyZW50LlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbS5jb250YWlucyhjaGlsZC5kb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5jb250ZW50RWxlbWVudCA9IGNoaWxkLmRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50ID0gKCkgPT4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiBub2RlLmVxKHRoaXMubm9kZSkgJiZcbiAgICAgICAgICAgIHNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm91dGVyRGVjbykgJiYgaW5uZXJEZWNvLmVxKHRoaXMuaW5uZXJEZWNvKTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLm5vZGUubm9kZVNpemU7IH1cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gdGhpcy5ub2RlLmlzTGVhZiA/IDAgOiAxOyB9XG4gICAgLy8gU3luY3MgYHRoaXMuY2hpbGRyZW5gIHRvIG1hdGNoIGB0aGlzLm5vZGUuY29udGVudGAgYW5kIHRoZSBsb2NhbFxuICAgIC8vIGRlY29yYXRpb25zLCBwb3NzaWJseSBpbnRyb2R1Y2luZyBuZXN0aW5nIGZvciBtYXJrcy4gVGhlbiwgaW4gYVxuICAgIC8vIHNlcGFyYXRlIHN0ZXAsIHN5bmNzIHRoZSBET00gaW5zaWRlIGB0aGlzLmNvbnRlbnRET01gIHRvXG4gICAgLy8gYHRoaXMuY2hpbGRyZW5gLlxuICAgIHVwZGF0ZUNoaWxkcmVuKHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgaW5saW5lID0gdGhpcy5ub2RlLmlubGluZUNvbnRlbnQsIG9mZiA9IHBvcztcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gdmlldy5jb21wb3NpbmcgPyB0aGlzLmxvY2FsQ29tcG9zaXRpb25JbmZvKHZpZXcsIHBvcykgOiBudWxsO1xuICAgICAgICBsZXQgbG9jYWxDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnBvcyA+IC0xID8gY29tcG9zaXRpb24gOiBudWxsO1xuICAgICAgICBsZXQgY29tcG9zaXRpb25JbkNoaWxkID0gY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucG9zIDwgMDtcbiAgICAgICAgbGV0IHVwZGF0ZXIgPSBuZXcgVmlld1RyZWVVcGRhdGVyKHRoaXMsIGxvY2FsQ29tcG9zaXRpb24gJiYgbG9jYWxDb21wb3NpdGlvbi5ub2RlLCB2aWV3KTtcbiAgICAgICAgaXRlckRlY28odGhpcy5ub2RlLCB0aGlzLmlubmVyRGVjbywgKHdpZGdldCwgaSwgaW5zaWRlTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpZGdldC5zcGVjLm1hcmtzKVxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3Mod2lkZ2V0LnNwZWMubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICBlbHNlIGlmICh3aWRnZXQudHlwZS5zaWRlID49IDAgJiYgIWluc2lkZU5vZGUpXG4gICAgICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhpID09IHRoaXMubm9kZS5jaGlsZENvdW50ID8gTWFyay5ub25lIDogdGhpcy5ub2RlLmNoaWxkKGkpLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhIGRlc2MgbWF0Y2hpbmcgdGhpcyB3aWRnZXQsIHJldXNlIGl0LFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGluc2VydCB0aGUgd2lkZ2V0IGFzIGEgbmV3IHZpZXcgZGVzYy5cbiAgICAgICAgICAgIHVwZGF0ZXIucGxhY2VXaWRnZXQod2lkZ2V0LCB2aWV3LCBvZmYpO1xuICAgICAgICB9LCAoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpKSA9PiB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHdyYXBwaW5nIG1hcmsgZGVzY3MgbWF0Y2ggdGhlIG5vZGUncyBtYXJrcy5cbiAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoY2hpbGQubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCBzdHJhdGVnaWVzIGZvciBkcmF3aW5nIHRoaXMgbm9kZVxuICAgICAgICAgICAgbGV0IGNvbXBJbmRleDtcbiAgICAgICAgICAgIGlmICh1cGRhdGVyLmZpbmROb2RlTWF0Y2goY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpKSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9zaXRpb25JbkNoaWxkICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gPiBvZmYgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byA8IG9mZiArIGNoaWxkLm5vZGVTaXplICYmXG4gICAgICAgICAgICAgICAgKGNvbXBJbmRleCA9IHVwZGF0ZXIuZmluZEluZGV4V2l0aENoaWxkKGNvbXBvc2l0aW9uLm5vZGUpKSA+IC0xICYmXG4gICAgICAgICAgICAgICAgdXBkYXRlci51cGRhdGVOb2RlQXQoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBjb21wSW5kZXgsIHZpZXcpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICh1cGRhdGVyLnVwZGF0ZU5leHROb2RlKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaSwgb2ZmKSkgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGl0IGFzIGEgbmV3IHZpZXdcbiAgICAgICAgICAgICAgICB1cGRhdGVyLmFkZE5vZGUoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBvZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gRHJvcCBhbGwgcmVtYWluaW5nIGRlc2NzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKFtdLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICBpZiAodGhpcy5ub2RlLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgdXBkYXRlci5hZGRUZXh0YmxvY2tIYWNrcygpO1xuICAgICAgICB1cGRhdGVyLmRlc3Ryb3lSZXN0KCk7XG4gICAgICAgIC8vIFN5bmMgdGhlIERPTSBpZiBhbnl0aGluZyBjaGFuZ2VkXG4gICAgICAgIGlmICh1cGRhdGVyLmNoYW5nZWQgfHwgdGhpcy5kaXJ0eSA9PSBDT05URU5UX0RJUlRZKSB7XG4gICAgICAgICAgICAvLyBNYXkgaGF2ZSB0byBwcm90ZWN0IGZvY3VzZWQgRE9NIGZyb20gYmVpbmcgY2hhbmdlZCBpZiBhIGNvbXBvc2l0aW9uIGlzIGFjdGl2ZVxuICAgICAgICAgICAgaWYgKGxvY2FsQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdGhpcy5wcm90ZWN0TG9jYWxDb21wb3NpdGlvbih2aWV3LCBsb2NhbENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIHJlbmRlckRlc2NzKHRoaXMuY29udGVudERPTSwgdGhpcy5jaGlsZHJlbiwgdmlldyk7XG4gICAgICAgICAgICBpZiAoaW9zKVxuICAgICAgICAgICAgICAgIGlvc0hhY2tzKHRoaXMuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsb2NhbENvbXBvc2l0aW9uSW5mbyh2aWV3LCBwb3MpIHtcbiAgICAgICAgLy8gT25seSBkbyBzb21ldGhpbmcgaWYgYm90aCB0aGUgc2VsZWN0aW9uIGFuZCBhIGZvY3VzZWQgdGV4dCBub2RlXG4gICAgICAgIC8vIGFyZSBpbnNpZGUgb2YgdGhpcyBub2RlXG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB8fCBmcm9tIDwgcG9zIHx8IHRvID4gcG9zICsgdGhpcy5ub2RlLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdGV4dE5vZGUgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZTtcbiAgICAgICAgaWYgKCF0ZXh0Tm9kZSB8fCAhdGhpcy5kb20uY29udGFpbnModGV4dE5vZGUucGFyZW50Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXh0IGluIHRoZSBmb2N1c2VkIG5vZGUgaW4gdGhlIG5vZGUsIHN0b3AgaWYgaXQncyBub3RcbiAgICAgICAgICAgIC8vIHRoZXJlIChtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHRocm91Z2ggb3RoZXIgbWVhbnMsIGluIHdoaWNoXG4gICAgICAgICAgICAvLyBjYXNlIGl0IHNob3VsZCBvdmVyd3JpdHRlbilcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgbGV0IHRleHRQb3MgPSBmaW5kVGV4dEluRnJhZ21lbnQodGhpcy5ub2RlLmNvbnRlbnQsIHRleHQsIGZyb20gLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0UG9zIDwgMCA/IG51bGwgOiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IHRleHRQb3MsIHRleHQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IC0xLCB0ZXh0OiBcIlwiIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgeyBub2RlLCBwb3MsIHRleHQgfSkge1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBhbHJlYWR5IHBhcnQgb2YgYSBsb2NhbCB2aWV3IGRlc2MsIGxlYXZlIGl0IHRoZXJlXG4gICAgICAgIGlmICh0aGlzLmdldERlc2Mobm9kZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0aW9uIHZpZXcgZm9yIHRoZSBvcnBoYW5lZCBub2Rlc1xuICAgICAgICBsZXQgdG9wTm9kZSA9IG5vZGU7XG4gICAgICAgIGZvciAoOzsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB3aGlsZSAodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUucHJldmlvdXNTaWJsaW5nKTtcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICAgIHRvcE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b3BOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGlmICh0b3BOb2RlLnBtVmlld0Rlc2MpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gbmV3IENvbXBvc2l0aW9uVmlld0Rlc2ModGhpcywgdG9wTm9kZSwgbm9kZSwgdGV4dCk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wdXNoKGRlc2MpO1xuICAgICAgICAvLyBQYXRjaCB1cCB0aGlzLmNoaWxkcmVuIHRvIGNvbnRhaW4gdGhlIGNvbXBvc2l0aW9uIHZpZXdcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHJlcGxhY2VOb2Rlcyh0aGlzLmNoaWxkcmVuLCBwb3MsIHBvcyArIHRleHQubGVuZ3RoLCB2aWV3LCBkZXNjKTtcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBkZXNjIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgZ2l2ZW4gbm9kZSBkZWNvcmF0aW9uLFxuICAgIC8vIGRvIHNvIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fFxuICAgICAgICAgICAgIW5vZGUuc2FtZU1hcmt1cCh0aGlzLm5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih2aWV3LCB0aGlzLnBvc0F0U3RhcnQpO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgIH1cbiAgICB1cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKSB7XG4gICAgICAgIGlmIChzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbmVlZHNXcmFwID0gdGhpcy5ub2RlRE9NLm5vZGVUeXBlICE9IDE7XG4gICAgICAgIGxldCBvbGRET00gPSB0aGlzLmRvbTtcbiAgICAgICAgdGhpcy5kb20gPSBwYXRjaE91dGVyRGVjbyh0aGlzLmRvbSwgdGhpcy5ub2RlRE9NLCBjb21wdXRlT3V0ZXJEZWNvKHRoaXMub3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCksIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCkpO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gb2xkRE9NKSB7XG4gICAgICAgICAgICBvbGRET00ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgIH1cbiAgICAvLyBNYXJrIHRoaXMgbm9kZSBhcyBiZWluZyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICB0aGlzLmRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgbm9kZSBtYXJraW5nIGZyb20gdGhpcyBub2RlLlxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZURPTS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZUF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0F0b207IH1cbn1cbi8vIENyZWF0ZSBhIHZpZXcgZGVzYyBmb3IgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBub2RlLCB0byBiZSBleHBvcnRlZFxuLy8gYW5kIHVzZWQgYnkgdGhlIHZpZXcgY2xhc3MuXG5mdW5jdGlvbiBkb2NWaWV3RGVzYyhkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIHZpZXcpIHtcbiAgICBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgZG9jKTtcbiAgICBsZXQgZG9jVmlldyA9IG5ldyBOb2RlVmlld0Rlc2ModW5kZWZpbmVkLCBkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGRvbSwgZG9tLCB2aWV3LCAwKTtcbiAgICBpZiAoZG9jVmlldy5jb250ZW50RE9NKVxuICAgICAgICBkb2NWaWV3LnVwZGF0ZUNoaWxkcmVuKHZpZXcsIDApO1xuICAgIHJldHVybiBkb2NWaWV3O1xufVxuY2xhc3MgVGV4dFZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBudWxsLCBub2RlRE9NLCB2aWV3LCAwKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBsZXQgc2tpcCA9IHRoaXMubm9kZURPTS5wYXJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoc2tpcCAmJiBza2lwICE9IHRoaXMuZG9tICYmICFza2lwLnBtSXNEZWNvKVxuICAgICAgICAgICAgc2tpcCA9IHNraXAucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIHsgc2tpcDogKHNraXAgfHwgdHJ1ZSkgfTtcbiAgICB9XG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkgfHwgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZICYmICF0aGlzLmluUGFyZW50KCkpIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgfHwgbm9kZS50ZXh0ICE9IHRoaXMubm9kZS50ZXh0KSAmJiBub2RlLnRleHQgIT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSA9IG5vZGUudGV4dDtcbiAgICAgICAgICAgIGlmICh2aWV3LnRyYWNrV3JpdGVzID09IHRoaXMubm9kZURPTSlcbiAgICAgICAgICAgICAgICB2aWV3LnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW5QYXJlbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSB0aGlzLnBhcmVudC5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5ub2RlRE9NOyBuOyBuID0gbi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgaWYgKG4gPT0gcGFyZW50RE9NKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMubm9kZURPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGlmIChkb20gPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIE1hdGgubWluKG9mZnNldCwgdGhpcy5ub2RlLnRleHQubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCwgYmlhcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwiY2hhcmFjdGVyRGF0YVwiICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLm5vZGUuY3V0KGZyb20sIHRvKSwgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2ModGhpcy5wYXJlbnQsIG5vZGUsIHRoaXMub3V0ZXJEZWNvLCB0aGlzLmlubmVyRGVjbywgZG9tLCBkb20sIHZpZXcpO1xuICAgIH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tICE9IHRoaXMubm9kZURPTSAmJiAoZnJvbSA9PSAwIHx8IHRvID09IHRoaXMubm9kZURPTS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaXNUZXh0KHRleHQpIHsgcmV0dXJuIHRoaXMubm9kZS50ZXh0ID09IHRleHQ7IH1cbn1cbi8vIEEgZHVtbXkgZGVzYyB1c2VkIHRvIHRhZyB0cmFpbGluZyBCUiBvciBJTUcgbm9kZXMgY3JlYXRlZCB0byB3b3JrXG4vLyBhcm91bmQgY29udGVudEVkaXRhYmxlIHRlcnJpYmxlbmVzcy5cbmNsYXNzIFRyYWlsaW5nSGFja1ZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIHBhcnNlUnVsZSgpIHsgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07IH1cbiAgICBtYXRjaGVzSGFjayhub2RlTmFtZSkgeyByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgdGhpcy5kb20ubm9kZU5hbWUgPT0gbm9kZU5hbWU7IH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaWdub3JlRm9yQ29vcmRzKCkgeyByZXR1cm4gdGhpcy5kb20ubm9kZU5hbWUgPT0gXCJJTUdcIjsgfVxufVxuLy8gQSBzZXBhcmF0ZSBzdWJjbGFzcyBpcyB1c2VkIGZvciBjdXN0b21pemVkIG5vZGUgdmlld3MsIHNvIHRoYXQgdGhlXG4vLyBleHRyYSBjaGVja3Mgb25seSBoYXZlIHRvIGJlIG1hZGUgZm9yIG5vZGVzIHRoYXQgYXJlIGFjdHVhbGx5XG4vLyBjdXN0b21pemVkLlxuY2xhc3MgQ3VzdG9tTm9kZVZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHNwZWMsIHZpZXcsIHBvcykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHZpZXcsIHBvcyk7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIC8vIEEgY3VzdG9tIGB1cGRhdGVgIG1ldGhvZCBnZXRzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB1cGRhdGUgZ29lc1xuICAgIC8vIHRocm91Z2guIElmIGl0IGRvZXMsIGFuZCB0aGVyZSdzIGEgYGNvbnRlbnRET01gIG5vZGUsIG91ciBsb2dpY1xuICAgIC8vIHVwZGF0ZXMgdGhlIGNoaWxkcmVuLlxuICAgIHVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSA9PSBOT0RFX0RJUlRZKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zcGVjLnVwZGF0ZSAmJiAodGhpcy5ub2RlLnR5cGUgPT0gbm9kZS50eXBlIHx8IHRoaXMuc3BlYy5tdWx0aVR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5zcGVjLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZW50RE9NICYmICFub2RlLmlzTGVhZikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLnNlbGVjdE5vZGUgPyB0aGlzLnNwZWMuc2VsZWN0Tm9kZSgpIDogc3VwZXIuc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBkZXNlbGVjdE5vZGUoKSB7XG4gICAgICAgIHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUgPyB0aGlzLnNwZWMuZGVzZWxlY3ROb2RlKCkgOiBzdXBlci5kZXNlbGVjdE5vZGUoKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zcGVjLnNldFNlbGVjdGlvbiA/IHRoaXMuc3BlYy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LnJvb3QpXG4gICAgICAgICAgICA6IHN1cGVyLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHZpZXcsIGZvcmNlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy5zdG9wRXZlbnQgPyB0aGlzLnNwZWMuc3RvcEV2ZW50KGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG59XG4vLyBTeW5jIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gbm9kZSB3aXRoIHRoZSBub2RlcyBhc3NvY2lhdGVkXG4vLyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZiB2aWV3IGRlc2NzLCByZWN1cnNpbmcgaW50byBtYXJrIGRlc2NzXG4vLyBiZWNhdXNlIHRoaXMgc2hvdWxkIHN5bmMgdGhlIHN1YnRyZWUgZm9yIGEgd2hvbGUgbm9kZSBhdCBhIHRpbWUuXG5mdW5jdGlvbiByZW5kZXJEZXNjcyhwYXJlbnRET00sIGRlc2NzLCB2aWV3KSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudERPTS5maXJzdENoaWxkLCB3cml0dGVuID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVzYyA9IGRlc2NzW2ldLCBjaGlsZERPTSA9IGRlc2MuZG9tO1xuICAgICAgICBpZiAoY2hpbGRET00ucGFyZW50Tm9kZSA9PSBwYXJlbnRET00pIHtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZERPTSAhPSBkb20pIHtcbiAgICAgICAgICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICBwYXJlbnRET00uaW5zZXJ0QmVmb3JlKGNoaWxkRE9NLCBkb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9tID8gZG9tLnByZXZpb3VzU2libGluZyA6IHBhcmVudERPTS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyhkZXNjLmNvbnRlbnRET00sIGRlc2MuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgZG9tID0gcG9zID8gcG9zLm5leHRTaWJsaW5nIDogcGFyZW50RE9NLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHdyaXR0ZW4gJiYgdmlldy50cmFja1dyaXRlcyA9PSBwYXJlbnRET00pXG4gICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xufVxuY29uc3QgT3V0ZXJEZWNvTGV2ZWwgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgICBpZiAobm9kZU5hbWUpXG4gICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTtcbn07XG5PdXRlckRlY29MZXZlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgbm9EZWNvID0gW25ldyBPdXRlckRlY29MZXZlbF07XG5mdW5jdGlvbiBjb21wdXRlT3V0ZXJEZWNvKG91dGVyRGVjbywgbm9kZSwgbmVlZHNXcmFwKSB7XG4gICAgaWYgKG91dGVyRGVjby5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG5vRGVjbztcbiAgICBsZXQgdG9wID0gbmVlZHNXcmFwID8gbm9EZWNvWzBdIDogbmV3IE91dGVyRGVjb0xldmVsLCByZXN1bHQgPSBbdG9wXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyRGVjby5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYXR0cnMgPSBvdXRlckRlY29baV0udHlwZS5hdHRycztcbiAgICAgICAgaWYgKCFhdHRycylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoYXR0cnMubm9kZU5hbWUpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwoYXR0cnMubm9kZU5hbWUpKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG5lZWRzV3JhcCAmJiByZXN1bHQubGVuZ3RoID09IDEpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9wID0gbmV3IE91dGVyRGVjb0xldmVsKG5vZGUuaXNJbmxpbmUgPyBcInNwYW5cIiA6IFwiZGl2XCIpKTtcbiAgICAgICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICB0b3AuY2xhc3MgPSAodG9wLmNsYXNzID8gdG9wLmNsYXNzICsgXCIgXCIgOiBcIlwiKSArIHZhbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHRvcC5zdHlsZSA9ICh0b3Auc3R5bGUgPyB0b3Auc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgdG9wW25hbWVdID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXRjaE91dGVyRGVjbyhvdXRlckRPTSwgbm9kZURPTSwgcHJldkNvbXB1dGVkLCBjdXJDb21wdXRlZCkge1xuICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGNhc2VcbiAgICBpZiAocHJldkNvbXB1dGVkID09IG5vRGVjbyAmJiBjdXJDb21wdXRlZCA9PSBub0RlY28pXG4gICAgICAgIHJldHVybiBub2RlRE9NO1xuICAgIGxldCBjdXJET00gPSBub2RlRE9NO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyQ29tcHV0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlY28gPSBjdXJDb21wdXRlZFtpXSwgcHJldiA9IHByZXZDb21wdXRlZFtpXTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2Lm5vZGVOYW1lID09IGRlY28ubm9kZU5hbWUgJiYgY3VyRE9NICE9IG91dGVyRE9NICYmXG4gICAgICAgICAgICAgICAgKHBhcmVudCA9IGN1ckRPTS5wYXJlbnROb2RlKSAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBkZWNvLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkZWNvLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQucG1Jc0RlY28gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjdXJET00pO1xuICAgICAgICAgICAgICAgIHByZXYgPSBub0RlY29bMF07XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdGNoQXR0cmlidXRlcyhjdXJET00sIHByZXYgfHwgbm9EZWNvWzBdLCBkZWNvKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1ckRPTTtcbn1cbmZ1bmN0aW9uIHBhdGNoQXR0cmlidXRlcyhkb20sIHByZXYsIGN1cikge1xuICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmICEobmFtZSBpbiBjdXIpKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGN1cilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmIGN1cltuYW1lXSAhPSBwcmV2W25hbWVdKVxuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBjdXJbbmFtZV0pO1xuICAgIGlmIChwcmV2LmNsYXNzICE9IGN1ci5jbGFzcykge1xuICAgICAgICBsZXQgcHJldkxpc3QgPSBwcmV2LmNsYXNzID8gcHJldi5jbGFzcy5zcGxpdChcIiBcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICAgIGxldCBjdXJMaXN0ID0gY3VyLmNsYXNzID8gY3VyLmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TGlzdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjdXJMaXN0LmluZGV4T2YocHJldkxpc3RbaV0pID09IC0xKVxuICAgICAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QucmVtb3ZlKHByZXZMaXN0W2ldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHByZXZMaXN0LmluZGV4T2YoY3VyTGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoY3VyTGlzdFtpXSk7XG4gICAgICAgIGlmIChkb20uY2xhc3NMaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAocHJldi5zdHlsZSAhPSBjdXIuc3R5bGUpIHtcbiAgICAgICAgaWYgKHByZXYuc3R5bGUpIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gL1xccyooW1xcd1xcLVxceGExLVxcdWZmZmZdKylcXHMqOig/OlwiKD86XFxcXC58W15cIl0pKlwifCcoPzpcXFxcLnxbXiddKSonfFxcKC4qP1xcKXxbXjtdKSovZywgbTtcbiAgICAgICAgICAgIHdoaWxlIChtID0gcHJvcC5leGVjKHByZXYuc3R5bGUpKVxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShtWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLnN0eWxlKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgKz0gY3VyLnN0eWxlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5T3V0ZXJEZWNvKGRvbSwgZGVjbywgbm9kZSkge1xuICAgIHJldHVybiBwYXRjaE91dGVyRGVjbyhkb20sIGRvbSwgbm9EZWNvLCBjb21wdXRlT3V0ZXJEZWNvKGRlY28sIG5vZGUsIGRvbS5ub2RlVHlwZSAhPSAxKSk7XG59XG5mdW5jdGlvbiBzYW1lT3V0ZXJEZWNvKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS50eXBlLmVxKGJbaV0udHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuLy8gSGVscGVyIGNsYXNzIGZvciBpbmNyZW1lbnRhbGx5IHVwZGF0aW5nIGEgdHJlZSBvZiBtYXJrIGRlc2NzIGFuZFxuLy8gdGhlIHdpZGdldCBhbmQgbm9kZSBkZXNjcyBpbnNpZGUgb2YgdGhlbS5cbmNsYXNzIFZpZXdUcmVlVXBkYXRlciB7XG4gICAgY29uc3RydWN0b3IodG9wLCBsb2NrLCB2aWV3KSB7XG4gICAgICAgIHRoaXMubG9jayA9IGxvY2s7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIC8vIEluZGV4IGludG8gYHRoaXMudG9wYCdzIGNoaWxkIGFycmF5LCByZXByZXNlbnRzIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIFdoZW4gZW50ZXJpbmcgYSBtYXJrLCB0aGUgY3VycmVudCB0b3AgYW5kIGluZGV4IGFyZSBwdXNoZWRcbiAgICAgICAgLy8gb250byB0aGlzLlxuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIGFueXRoaW5nIHdhcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5wcmVNYXRjaCA9IHByZU1hdGNoKHRvcC5ub2RlLmNvbnRlbnQsIHRvcCk7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYW5kIHJlbW92ZSB0aGUgY2hpbGRyZW4gYmV0d2VlbiB0aGUgZ2l2ZW4gaW5kaWNlcyBpblxuICAgIC8vIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveUJldHdlZW4oc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYWxsIHJlbWFpbmluZyBjaGlsZHJlbiBpbiBgdGhpcy50b3BgLlxuICAgIGRlc3Ryb3lSZXN0KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIGN1cnJlbnQgc3RhY2sgb2YgbWFyayBkZXNjcyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZlxuICAgIC8vIG1hcmtzLCByZXVzaW5nIGV4aXN0aW5nIG1hcmsgZGVzY3Mgd2hlbiBwb3NzaWJsZS5cbiAgICBzeW5jVG9NYXJrcyhtYXJrcywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBrZWVwID0gMCwgZGVwdGggPSB0aGlzLnN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICBsZXQgbWF4S2VlcCA9IE1hdGgubWluKGRlcHRoLCBtYXJrcy5sZW5ndGgpO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IG1heEtlZXAgJiZcbiAgICAgICAgICAgIChrZWVwID09IGRlcHRoIC0gMSA/IHRoaXMudG9wIDogdGhpcy5zdGFja1soa2VlcCArIDEpIDw8IDFdKVxuICAgICAgICAgICAgICAgIC5tYXRjaGVzTWFyayhtYXJrc1trZWVwXSkgJiYgbWFya3Nba2VlcF0udHlwZS5zcGVjLnNwYW5uaW5nICE9PSBmYWxzZSlcbiAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBkZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVzdCgpO1xuICAgICAgICAgICAgdGhpcy50b3AuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGRlcHRoIDwgbWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy50b3AsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCBNYXRoLm1pbih0aGlzLmluZGV4ICsgMywgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5tYXRjaGVzTWFyayhtYXJrc1tkZXB0aF0pICYmICF0aGlzLmlzTG9ja2VkKG5leHQuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gdGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrRGVzYyA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG1hcmtzW2RlcHRoXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCwgMCwgbWFya0Rlc2MpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wID0gbWFya0Rlc2M7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIG5vZGUgZGVzYyBtYXRjaGluZyB0aGUgZ2l2ZW4gZGF0YS4gU2tpcCBvdmVyIGl0IGFuZFxuICAgIC8vIHJldHVybiB0cnVlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICBmaW5kTm9kZU1hdGNoKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSAtMSwgdGFyZ2V0RGVzYztcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMucHJlTWF0Y2guaW5kZXggJiZcbiAgICAgICAgICAgICh0YXJnZXREZXNjID0gdGhpcy5wcmVNYXRjaC5tYXRjaGVzW2luZGV4IC0gdGhpcy5wcmVNYXRjaC5pbmRleF0pLnBhcmVudCA9PSB0aGlzLnRvcCAmJlxuICAgICAgICAgICAgdGFyZ2V0RGVzYy5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdGhpcy50b3AuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXREZXNjLCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4LCBlID0gTWF0aC5taW4odGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoLCBpICsgNSk7IGkgPCBlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pICYmICF0aGlzLnByZU1hdGNoLm1hdGNoZWQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlTm9kZUF0KG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCwgdmlldykge1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgIGlmIChjaGlsZC5kaXJ0eSA9PSBOT0RFX0RJUlRZICYmIGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NKVxuICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICBpZiAoIWNoaWxkLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmaW5kSW5kZXhXaXRoQ2hpbGQoZG9tTm9kZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcC5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkb21Ob2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvcC5jaGlsZHJlbltpXSA9PSBkZXNjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tTm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gdXBkYXRlIHRoZSBuZXh0IG5vZGUsIGlmIGFueSwgdG8gdGhlIGdpdmVuIGRhdGEuIENoZWNrc1xuICAgIC8vIHByZS1tYXRjaGVzIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG5vZGVzIHRoYXQgY291bGQgc3RpbGwgYmUgdXNlZC5cbiAgICB1cGRhdGVOZXh0Tm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaW5kZXgsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBOb2RlVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlTWF0Y2ggPSB0aGlzLnByZU1hdGNoLm1hdGNoZWQuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmVNYXRjaCAhPSBudWxsICYmIHByZU1hdGNoICE9IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRET00gPSBuZXh0LmRvbSwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAvLyBDYW4ndCB1cGRhdGUgaWYgbmV4dERPTSBpcyBvciBjb250YWlucyB0aGlzLmxvY2ssIGV4Y2VwdCBpZlxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB0ZXh0IG5vZGUgd2hvc2UgY29udGVudCBhbHJlYWR5IG1hdGNoZXMgdGhlIG5ldyB0ZXh0XG4gICAgICAgICAgICAgICAgLy8gYW5kIHdob3NlIGRlY29yYXRpb25zIG1hdGNoIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgICBsZXQgbG9ja2VkID0gdGhpcy5pc0xvY2tlZChuZXh0RE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGUuaXNUZXh0ICYmIG5leHQubm9kZSAmJiBuZXh0Lm5vZGUuaXNUZXh0ICYmIG5leHQubm9kZURPTS5ub2RlVmFsdWUgPT0gbm9kZS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmRpcnR5ICE9IE5PREVfRElSVFkgJiYgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWQgJiYgbmV4dC51cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmRvbSAhPSBuZXh0RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWxvY2tlZCAmJiAodXBkYXRlZCA9IHRoaXMucmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBXaGVuIGEgbm9kZSB3aXRoIGNvbnRlbnQgaXMgcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgbm9kZSB3aXRoXG4gICAgLy8gaWRlbnRpY2FsIGNvbnRlbnQsIG1vdmUgb3ZlciBpdHMgY2hpbGRyZW4uXG4gICAgcmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgaWYgKG5leHQuZGlydHkgfHwgbm9kZS5pc0F0b20gfHwgIW5leHQuY2hpbGRyZW4ubGVuZ3RoIHx8XG4gICAgICAgICAgICAhbmV4dC5ub2RlLmNvbnRlbnQuZXEobm9kZS5jb250ZW50KSB8fFxuICAgICAgICAgICAgIXNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCBuZXh0Lm91dGVyRGVjbykgfHwgIWlubmVyRGVjby5lcShuZXh0LmlubmVyRGVjbykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSBOb2RlVmlld0Rlc2MuY3JlYXRlKHRoaXMudG9wLCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKTtcbiAgICAgICAgaWYgKHdyYXBwZXIuY29udGVudERPTSkge1xuICAgICAgICAgICAgd3JhcHBlci5jaGlsZHJlbiA9IG5leHQuY2hpbGRyZW47XG4gICAgICAgICAgICBuZXh0LmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjaCBvZiB3cmFwcGVyLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLnBhcmVudCA9IHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cbiAgICAvLyBJbnNlcnQgdGhlIG5vZGUgYXMgYSBuZXdseSBjcmVhdGVkIG5vZGUgZGVzYy5cbiAgICBhZGROb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGRlc2MgPSBOb2RlVmlld0Rlc2MuY3JlYXRlKHRoaXMudG9wLCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKTtcbiAgICAgICAgaWYgKGRlc2MuY29udGVudERPTSlcbiAgICAgICAgICAgIGRlc2MudXBkYXRlQ2hpbGRyZW4odmlldywgcG9zICsgMSk7XG4gICAgICAgIHRoaXMudG9wLmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4KyssIDAsIGRlc2MpO1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBwbGFjZVdpZGdldCh3aWRnZXQsIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuaW5kZXggPCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA6IG51bGw7XG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQubWF0Y2hlc1dpZGdldCh3aWRnZXQpICYmXG4gICAgICAgICAgICAod2lkZ2V0ID09IG5leHQud2lkZ2V0IHx8ICFuZXh0LndpZGdldC50eXBlLnRvRE9NLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGVzYyA9IG5ldyBXaWRnZXRWaWV3RGVzYyh0aGlzLnRvcCwgd2lkZ2V0LCB2aWV3LCBwb3MpO1xuICAgICAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSBhIHRleHRibG9jayBsb29rcyBhbmQgYmVoYXZlcyBjb3JyZWN0bHkgaW5cbiAgICAvLyBjb250ZW50RWRpdGFibGUuXG4gICAgYWRkVGV4dGJsb2NrSGFja3MoKSB7XG4gICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4IC0gMV0sIHBhcmVudCA9IHRoaXMudG9wO1xuICAgICAgICB3aGlsZSAobGFzdENoaWxkIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBsYXN0Q2hpbGQ7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5bcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdENoaWxkIHx8IC8vIEVtcHR5IHRleHRibG9ja1xuICAgICAgICAgICAgIShsYXN0Q2hpbGQgaW5zdGFuY2VvZiBUZXh0Vmlld0Rlc2MpIHx8XG4gICAgICAgICAgICAvXFxuJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSB8fFxuICAgICAgICAgICAgKHRoaXMudmlldy5yZXF1aXJlc0dlY2tvSGFja05vZGUgJiYgL1xccyQvLnRlc3QobGFzdENoaWxkLm5vZGUudGV4dCkpKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBidWdzIGluIFNhZmFyaSdzIGN1cnNvciBkcmF3aW5nICgjMTE2NSkgYW5kIENocm9tZSdzIG1vdXNlIHNlbGVjdGlvbiAoIzExNTIpXG4gICAgICAgICAgICBpZiAoKHNhZmFyaSB8fCBjaHJvbWUpICYmIGxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQuZG9tLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRIYWNrTm9kZShcIklNR1wiLCBwYXJlbnQpO1xuICAgICAgICAgICAgdGhpcy5hZGRIYWNrTm9kZShcIkJSXCIsIHRoaXMudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRIYWNrTm9kZShub2RlTmFtZSwgcGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy50b3AgJiYgdGhpcy5pbmRleCA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGggJiYgcGFyZW50LmNoaWxkcmVuW3RoaXMuaW5kZXhdLm1hdGNoZXNIYWNrKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1zZXBhcmF0b3JcIjtcbiAgICAgICAgICAgICAgICBkb20uYWx0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIkJSXCIpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3ItdHJhaWxpbmdCcmVha1wiO1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBuZXcgVHJhaWxpbmdIYWNrVmlld0Rlc2ModGhpcy50b3AsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPSB0aGlzLnRvcClcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChoYWNrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgaGFjayk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzTG9ja2VkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jayAmJiAobm9kZSA9PSB0aGlzLmxvY2sgfHwgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGFpbnModGhpcy5sb2NrLnBhcmVudE5vZGUpKTtcbiAgICB9XG59XG4vLyBJdGVyYXRlIGZyb20gdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgYW5kIGFycmF5IG9mIGRlc2NzIHRvIGZpbmRcbi8vIGRpcmVjdGx5IG1hdGNoaW5nIG9uZXMsIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJlYWdlcmx5IHJldXNpbmcgdGhvc2Vcbi8vIGZvciBvdGhlciBub2Rlcy4gUmV0dXJucyB0aGUgZnJhZ21lbnQgaW5kZXggb2YgdGhlIGZpcnN0IG5vZGUgdGhhdFxuLy8gaXMgcGFydCBvZiB0aGUgc2VxdWVuY2Ugb2YgbWF0Y2hlZCBub2RlcyBhdCB0aGUgZW5kIG9mIHRoZVxuLy8gZnJhZ21lbnQuXG5mdW5jdGlvbiBwcmVNYXRjaChmcmFnLCBwYXJlbnREZXNjKSB7XG4gICAgbGV0IGN1ckRlc2MgPSBwYXJlbnREZXNjLCBkZXNjSSA9IGN1ckRlc2MuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGxldCBmSSA9IGZyYWcuY2hpbGRDb3VudCwgbWF0Y2hlZCA9IG5ldyBNYXAsIG1hdGNoZXMgPSBbXTtcbiAgICBvdXRlcjogd2hpbGUgKGZJID4gMCkge1xuICAgICAgICBsZXQgZGVzYztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGRlc2NJKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjdXJEZXNjLmNoaWxkcmVuW2Rlc2NJIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyRGVzYyA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NJID0gbmV4dC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0ktLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyRGVzYyA9PSBwYXJlbnREZXNjKSB7XG4gICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRVxuICAgICAgICAgICAgICAgIGRlc2NJID0gY3VyRGVzYy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihjdXJEZXNjKTtcbiAgICAgICAgICAgICAgICBjdXJEZXNjID0gY3VyRGVzYy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGUgPSBkZXNjLm5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm9kZSAhPSBmcmFnLmNoaWxkKGZJIC0gMSkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLS1mSTtcbiAgICAgICAgbWF0Y2hlZC5zZXQoZGVzYywgZkkpO1xuICAgICAgICBtYXRjaGVzLnB1c2goZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiB7IGluZGV4OiBmSSwgbWF0Y2hlZCwgbWF0Y2hlczogbWF0Y2hlcy5yZXZlcnNlKCkgfTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVTaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYS50eXBlLnNpZGUgLSBiLnR5cGUuc2lkZTtcbn1cbi8vIFRoaXMgZnVuY3Rpb24gYWJzdHJhY3RzIGl0ZXJhdGluZyBvdmVyIHRoZSBub2RlcyBhbmQgZGVjb3JhdGlvbnMgaW5cbi8vIGEgZnJhZ21lbnQuIENhbGxzIGBvbk5vZGVgIGZvciBlYWNoIG5vZGUsIHdpdGggaXRzIGxvY2FsIGFuZCBjaGlsZFxuLy8gZGVjb3JhdGlvbnMuIFNwbGl0cyB0ZXh0IG5vZGVzIHdoZW4gdGhlcmUgaXMgYSBkZWNvcmF0aW9uIHN0YXJ0aW5nXG4vLyBvciBlbmRpbmcgaW5zaWRlIG9mIHRoZW0uIENhbGxzIGBvbldpZGdldGAgZm9yIGVhY2ggd2lkZ2V0LlxuZnVuY3Rpb24gaXRlckRlY28ocGFyZW50LCBkZWNvLCBvbldpZGdldCwgb25Ob2RlKSB7XG4gICAgbGV0IGxvY2FscyA9IGRlY28ubG9jYWxzKHBhcmVudCksIG9mZnNldCA9IDA7XG4gICAgLy8gU2ltcGxlLCBjaGVhcCB2YXJpYW50IGZvciB3aGVuIHRoZXJlIGFyZSBubyBsb2NhbCBkZWNvcmF0aW9uc1xuICAgIGlmIChsb2NhbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaSk7XG4gICAgICAgICAgICBvbk5vZGUoY2hpbGQsIGxvY2FscywgZGVjby5mb3JDaGlsZChvZmZzZXQsIGNoaWxkKSwgaSk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGVjb0luZGV4ID0gMCwgYWN0aXZlID0gW10sIHJlc3ROb2RlID0gbnVsbDtcbiAgICBmb3IgKGxldCBwYXJlbnRJbmRleCA9IDA7Oykge1xuICAgICAgICBsZXQgd2lkZ2V0LCB3aWRnZXRzO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA9PSBvZmZzZXQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbG9jYWxzW2RlY29JbmRleCsrXTtcbiAgICAgICAgICAgIGlmIChuZXh0LndpZGdldCkge1xuICAgICAgICAgICAgICAgIGlmICghd2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICB3aWRnZXQgPSBuZXh0O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHdpZGdldHMgfHwgKHdpZGdldHMgPSBbd2lkZ2V0XSkpLnB1c2gobmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpZGdldCkge1xuICAgICAgICAgICAgaWYgKHdpZGdldHMpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXRzLnNvcnQoY29tcGFyZVNpZGUpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgb25XaWRnZXQod2lkZ2V0c1tpXSwgcGFyZW50SW5kZXgsICEhcmVzdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb25XaWRnZXQod2lkZ2V0LCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNoaWxkLCBpbmRleDtcbiAgICAgICAgaWYgKHJlc3ROb2RlKSB7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY2hpbGQgPSByZXN0Tm9kZTtcbiAgICAgICAgICAgIHJlc3ROb2RlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnRJbmRleCA8IHBhcmVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgICAgICAgICAgY2hpbGQgPSBwYXJlbnQuY2hpbGQocGFyZW50SW5kZXgrKyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChhY3RpdmVbaV0udG8gPD0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIGFjdGl2ZS5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgd2hpbGUgKGRlY29JbmRleCA8IGxvY2Fscy5sZW5ndGggJiYgbG9jYWxzW2RlY29JbmRleF0uZnJvbSA8PSBvZmZzZXQgJiYgbG9jYWxzW2RlY29JbmRleF0udG8gPiBvZmZzZXQpXG4gICAgICAgICAgICBhY3RpdmUucHVzaChsb2NhbHNbZGVjb0luZGV4KytdKTtcbiAgICAgICAgbGV0IGVuZCA9IG9mZnNldCArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgICAgICBsZXQgY3V0QXQgPSBlbmQ7XG4gICAgICAgICAgICBpZiAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgY3V0QXQgPSBsb2NhbHNbZGVjb0luZGV4XS5mcm9tO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3RpdmUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8IGN1dEF0KVxuICAgICAgICAgICAgICAgICAgICBjdXRBdCA9IGFjdGl2ZVtpXS50bztcbiAgICAgICAgICAgIGlmIChjdXRBdCA8IGVuZCkge1xuICAgICAgICAgICAgICAgIHJlc3ROb2RlID0gY2hpbGQuY3V0KGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dCgwLCBjdXRBdCAtIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgZW5kID0gY3V0QXQ7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvIDwgZW5kKVxuICAgICAgICAgICAgICAgIGRlY29JbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRlckRlY28gPSBjaGlsZC5pc0lubGluZSAmJiAhY2hpbGQuaXNMZWFmID8gYWN0aXZlLmZpbHRlcihkID0+ICFkLmlubGluZSkgOiBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgb25Ob2RlKGNoaWxkLCBvdXRlckRlY28sIGRlY28uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCksIGluZGV4KTtcbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgIH1cbn1cbi8vIExpc3QgbWFya2VycyBpbiBNb2JpbGUgU2FmYXJpIHdpbGwgbXlzdGVyaW91c2x5IGRpc2FwcGVhclxuLy8gc29tZXRpbWVzLiBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0LlxuZnVuY3Rpb24gaW9zSGFja3MoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlVMXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiT0xcIikge1xuICAgICAgICBsZXQgb2xkQ1NTID0gZG9tLnN0eWxlLmNzc1RleHQ7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTICsgXCI7IGxpc3Qtc3R5bGU6IHNxdWFyZSAhaW1wb3J0YW50XCI7XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSkubGlzdFN0eWxlO1xuICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICB9XG59XG4vLyBGaW5kIGEgcGllY2Ugb2YgdGV4dCBpbiBhbiBpbmxpbmUgZnJhZ21lbnQsIG92ZXJsYXBwaW5nIGZyb20tdG9cbmZ1bmN0aW9uIGZpbmRUZXh0SW5GcmFnbWVudChmcmFnLCB0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgZnJhZy5jaGlsZENvdW50ICYmIHBvcyA8PSB0bzspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZy5jaGlsZChpKyspLCBjaGlsZFN0YXJ0ID0gcG9zO1xuICAgICAgICBwb3MgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmICghY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBzdHIgPSBjaGlsZC50ZXh0O1xuICAgICAgICB3aGlsZSAoaSA8IGZyYWcuY2hpbGRDb3VudCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBmcmFnLmNoaWxkKGkrKyk7XG4gICAgICAgICAgICBwb3MgKz0gbmV4dC5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmICghbmV4dC5pc1RleHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdHIgKz0gbmV4dC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0byAmJiBzdHIuc2xpY2UodG8gLSB0ZXh0Lmxlbmd0aCAtIGNoaWxkU3RhcnQsIHRvIC0gY2hpbGRTdGFydCkgPT0gdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdG8gLSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGNoaWxkU3RhcnQgPCB0byA/IHN0ci5sYXN0SW5kZXhPZih0ZXh0LCB0byAtIGNoaWxkU3RhcnQgLSAxKSA6IC0xO1xuICAgICAgICAgICAgaWYgKGZvdW5kID49IDAgJiYgZm91bmQgKyB0ZXh0Lmxlbmd0aCArIGNoaWxkU3RhcnQgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRTdGFydCArIGZvdW5kO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gdG8gJiYgc3RyLmxlbmd0aCA+PSAodG8gKyB0ZXh0Lmxlbmd0aCkgLSBjaGlsZFN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgc3RyLnNsaWNlKHRvIC0gY2hpbGRTdGFydCwgdG8gLSBjaGlsZFN0YXJ0ICsgdGV4dC5sZW5ndGgpID09IHRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8vIFJlcGxhY2UgcmFuZ2UgZnJvbS10byBpbiBhbiBhcnJheSBvZiB2aWV3IGRlc2NzIHdpdGggcmVwbGFjZW1lbnRcbi8vIChtYXkgYmUgbnVsbCB0byBqdXN0IGRlbGV0ZSkuIFRoaXMgZ29lcyB2ZXJ5IG11Y2ggYWdhaW5zdCB0aGUgZ3JhaW5cbi8vIG9mIHRoZSByZXN0IG9mIHRoaXMgY29kZSwgd2hpY2ggdGVuZHMgdG8gY3JlYXRlIG5vZGVzIHdpdGggdGhlXG4vLyByaWdodCBzaGFwZSBpbiBvbmUgZ28sIHJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCB0aGVtIGFmdGVyXG4vLyBjcmVhdGlvbiwgYnV0IGlzIG5lY2Vzc2FyeSBpbiB0aGUgY29tcG9zaXRpb24gaGFjay5cbmZ1bmN0aW9uIHJlcGxhY2VOb2Rlcyhub2RlcywgZnJvbSwgdG8sIHZpZXcsIHJlcGxhY2VtZW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZXNbaV0sIHN0YXJ0ID0gb2ZmLCBlbmQgPSBvZmYgKz0gY2hpbGQuc2l6ZTtcbiAgICAgICAgaWYgKHN0YXJ0ID49IHRvIHx8IGVuZCA8PSBmcm9tKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCBmcm9tKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkLnNsaWNlKDAsIGZyb20gLSBzdGFydCwgdmlldykpO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkLnNsaWNlKHRvIC0gc3RhcnQsIGNoaWxkLnNpemUsIHZpZXcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcsIG9yaWdpbiA9IG51bGwpIHtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICBpZiAoIWRvbVNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBuZWFyZXN0RGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhkb21TZWwuZm9jdXNOb2RlKSwgaW5XaWRnZXQgPSBuZWFyZXN0RGVzYyAmJiBuZWFyZXN0RGVzYy5zaXplID09IDA7XG4gICAgbGV0IGhlYWQgPSB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIDEpO1xuICAgIGlmIChoZWFkIDwgMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0ICRoZWFkID0gZG9jLnJlc29sdmUoaGVhZCksIGFuY2hvciwgc2VsZWN0aW9uO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSkge1xuICAgICAgICBhbmNob3IgPSBoZWFkO1xuICAgICAgICB3aGlsZSAobmVhcmVzdERlc2MgJiYgIW5lYXJlc3REZXNjLm5vZGUpXG4gICAgICAgICAgICBuZWFyZXN0RGVzYyA9IG5lYXJlc3REZXNjLnBhcmVudDtcbiAgICAgICAgbGV0IG5lYXJlc3REZXNjTm9kZSA9IG5lYXJlc3REZXNjLm5vZGU7XG4gICAgICAgIGlmIChuZWFyZXN0RGVzYyAmJiBuZWFyZXN0RGVzY05vZGUuaXNBdG9tICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5lYXJlc3REZXNjTm9kZSkgJiYgbmVhcmVzdERlc2MucGFyZW50XG4gICAgICAgICAgICAmJiAhKG5lYXJlc3REZXNjTm9kZS5pc0lubGluZSAmJiBpc09uRWRnZShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIG5lYXJlc3REZXNjLmRvbSkpKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gbmVhcmVzdERlc2MucG9zQmVmb3JlO1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gbmV3IE5vZGVTZWxlY3Rpb24oaGVhZCA9PSBwb3MgPyAkaGVhZCA6IGRvYy5yZXNvbHZlKHBvcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9tU2VsIGluc3RhbmNlb2Ygdmlldy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5TZWxlY3Rpb24gJiYgZG9tU2VsLnJhbmdlQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBsZXQgbWluID0gaGVhZCwgbWF4ID0gaGVhZDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tU2VsLnJhbmdlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGRvbVNlbC5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmlldy5kb2NWaWV3LnBvc0Zyb21ET00ocmFuZ2Uuc3RhcnRDb250YWluZXIsIHJhbmdlLnN0YXJ0T2Zmc2V0LCAxKSk7XG4gICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCwgLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaW4gPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBtYXggPT0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yID8gW21heCwgbWluXSA6IFttaW4sIG1heF07XG4gICAgICAgICAgICAkaGVhZCA9IGRvYy5yZXNvbHZlKGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yID0gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmNob3IgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCAkYW5jaG9yID0gZG9jLnJlc29sdmUoYW5jaG9yKTtcbiAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICBsZXQgYmlhcyA9IG9yaWdpbiA9PSBcInBvaW50ZXJcIiB8fCAodmlldy5zdGF0ZS5zZWxlY3Rpb24uaGVhZCA8ICRoZWFkLnBvcyAmJiAhaW5XaWRnZXQpID8gMSA6IC0xO1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbn1cbmZ1bmN0aW9uIGVkaXRvck93bnNTZWxlY3Rpb24odmlldykge1xuICAgIHJldHVybiB2aWV3LmVkaXRhYmxlID8gdmlldy5oYXNGb2N1cygpIDpcbiAgICAgICAgaGFzU2VsZWN0aW9uKHZpZXcpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jb250YWlucyh2aWV3LmRvbSk7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Ub0RPTSh2aWV3LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCk7XG4gICAgaWYgKCFlZGl0b3JPd25zU2VsZWN0aW9uKHZpZXcpKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gVGhlIGRlbGF5ZWQgZHJhZyBzZWxlY3Rpb24gY2F1c2VzIGlzc3VlcyB3aXRoIENlbGwgU2VsZWN0aW9uc1xuICAgIC8vIGluIFNhZmFyaS4gQW5kIHRoZSBkcmFnIHNlbGVjdGlvbiBkZWxheSBpcyB0byB3b3JrYXJvbmQgaXNzdWVzXG4gICAgLy8gd2hpY2ggb25seSBwcmVzZW50IGluIENocm9tZS5cbiAgICBpZiAoIWZvcmNlICYmIHZpZXcuaW5wdXQubW91c2VEb3duICYmIHZpZXcuaW5wdXQubW91c2VEb3duLmFsbG93RGVmYXVsdCAmJiBjaHJvbWUpIHtcbiAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSwgY3VyU2VsID0gdmlldy5kb21PYnNlcnZlci5jdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICBpZiAoZG9tU2VsLmFuY2hvck5vZGUgJiYgY3VyU2VsLmFuY2hvck5vZGUgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0LCBjdXJTZWwuYW5jaG9yTm9kZSwgY3VyU2VsLmFuY2hvck9mZnNldCkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duLmRlbGF5ZWRTZWxlY3Rpb25TeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5kaXNjb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHZpZXcuY3Vyc29yV3JhcHBlcikge1xuICAgICAgICBzZWxlY3RDdXJzb3JXcmFwcGVyKHZpZXcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yLCBoZWFkIH0gPSBzZWwsIHJlc2V0RWRpdGFibGVGcm9tLCByZXNldEVkaXRhYmxlVG87XG4gICAgICAgIGlmIChicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSAmJiAhKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAoIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlRnJvbSA9IHRlbXBvcmFyaWx5RWRpdGFibGVOZWFyKHZpZXcsIHNlbC5mcm9tKTtcbiAgICAgICAgICAgIGlmICghc2VsLmVtcHR5ICYmICFzZWwuJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZVRvID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLnRvKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LmRvY1ZpZXcuc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpO1xuICAgICAgICBpZiAoYnJva2VuU2VsZWN0QmV0d2VlblVuZWRpdGFibGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNldEVkaXRhYmxlRnJvbSlcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlKHJlc2V0RWRpdGFibGVGcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXNldEVkaXRhYmxlVG8pXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZShyZXNldEVkaXRhYmxlVG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWwudmlzaWJsZSkge1xuICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChcIm9uc2VsZWN0aW9uY2hhbmdlXCIgaW4gZG9jdW1lbnQpXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NPblNlbGVjdGlvbkNoYW5nZSh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY29ubmVjdFNlbGVjdGlvbigpO1xufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIFdlYmtpdCBub3QgYWxsb3dpbmcgYSBzZWxlY3Rpb24gdG8gc3RhcnQvZW5kXG4vLyBiZXR3ZWVuIG5vbi1lZGl0YWJsZSBibG9jayBub2Rlcy4gV2UgYnJpZWZseSBtYWtlIHNvbWV0aGluZ1xuLy8gZWRpdGFibGUsIHNldCB0aGUgc2VsZWN0aW9uLCB0aGVuIHNldCBpdCB1bmVkaXRhYmxlIGFnYWluLlxuY29uc3QgYnJva2VuU2VsZWN0QmV0d2VlblVuZWRpdGFibGUgPSBzYWZhcmkgfHwgY2hyb21lICYmIGNocm9tZV92ZXJzaW9uIDwgNjM7XG5mdW5jdGlvbiB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBwb3MpIHtcbiAgICBsZXQgeyBub2RlLCBvZmZzZXQgfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgMCk7XG4gICAgbGV0IGFmdGVyID0gb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA/IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdIDogbnVsbDtcbiAgICBsZXQgYmVmb3JlID0gb2Zmc2V0ID8gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdIDogbnVsbDtcbiAgICBpZiAoc2FmYXJpICYmIGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShhZnRlcik7XG4gICAgaWYgKCghYWZ0ZXIgfHwgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikgJiZcbiAgICAgICAgKCFiZWZvcmUgfHwgYmVmb3JlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpKSB7XG4gICAgICAgIGlmIChhZnRlcilcbiAgICAgICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShhZnRlcik7XG4gICAgICAgIGVsc2UgaWYgKGJlZm9yZSlcbiAgICAgICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShiZWZvcmUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldEVkaXRhYmxlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGlmIChzYWZhcmkgJiYgZWxlbWVudC5kcmFnZ2FibGUpIHtcbiAgICAgICAgZWxlbWVudC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgZWxlbWVudC53YXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0RWRpdGFibGUoZWxlbWVudCkge1xuICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgIGlmIChlbGVtZW50Lndhc0RyYWdnYWJsZSkge1xuICAgICAgICBlbGVtZW50LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIGVsZW1lbnQud2FzRHJhZ2dhYmxlID0gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVDbGFzc09uU2VsZWN0aW9uQ2hhbmdlKHZpZXcpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IGRvbVNlbC5hbmNob3JOb2RlLCBvZmZzZXQgPSBkb21TZWwuYW5jaG9yT2Zmc2V0O1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9tU2VsLmFuY2hvck5vZGUgIT0gbm9kZSB8fCBkb21TZWwuYW5jaG9yT2Zmc2V0ICE9IG9mZnNldCkge1xuICAgICAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlZGl0b3JPd25zU2VsZWN0aW9uKHZpZXcpIHx8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUpXG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgfSwgMjApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBzZWxlY3RDdXJzb3JXcmFwcGVyKHZpZXcpIHtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb24oKSwgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmICghZG9tU2VsKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IG5vZGUgPSB2aWV3LmN1cnNvcldyYXBwZXIuZG9tLCBpbWcgPSBub2RlLm5vZGVOYW1lID09IFwiSU1HXCI7XG4gICAgaWYgKGltZylcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZS5wYXJlbnROb2RlLCBkb21JbmRleChub2RlKSArIDEpO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgZG9tU2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIGRvbVNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgLy8gS2x1ZGdlIHRvIGtpbGwgJ2NvbnRyb2wgc2VsZWN0aW9uJyBpbiBJRTExIHdoZW4gc2VsZWN0aW5nIGFuXG4gICAgLy8gaW52aXNpYmxlIGN1cnNvciB3cmFwcGVyLCBzaW5jZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0aG9zZSB3ZWlyZFxuICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGFuZCBhIHNlbGVjdGlvbiB0aGF0IGNvbnNpZGVycyB0aGUgYWJzb2x1dGVseVxuICAgIC8vIHBvc2l0aW9uZWQgd3JhcHBlciwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgZWRpdGFibGUgbm9kZSwgdGhlXG4gICAgLy8gZm9jdXNlZCBlbGVtZW50LlxuICAgIGlmICghaW1nICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi52aXNpYmxlICYmIGllICYmIGllX3ZlcnNpb24gPD0gMTEpIHtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIG5vZGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBzeW5jTm9kZVNlbGVjdGlvbih2aWV3LCBzZWwpIHtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbikge1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5kZXNjQXQoc2VsLmZyb20pO1xuICAgICAgICBpZiAoZGVzYyAhPSB2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjKSB7XG4gICAgICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odmlldyk7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICBkZXNjLnNlbGVjdE5vZGUoKTtcbiAgICAgICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSBkZXNjO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odmlldyk7XG4gICAgfVxufVxuLy8gQ2xlYXIgYWxsIERPTSBzdGF0ZWZ1bG5lc3Mgb2YgdGhlIGxhc3Qgbm9kZSBzZWxlY3Rpb24uXG5mdW5jdGlvbiBjbGVhck5vZGVTZWxlY3Rpb24odmlldykge1xuICAgIGlmICh2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjKSB7XG4gICAgICAgIGlmICh2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjLnBhcmVudClcbiAgICAgICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MuZGVzZWxlY3ROb2RlKCk7XG4gICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0aW9uQmV0d2Vlbih2aWV3LCAkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgIHJldHVybiB2aWV3LnNvbWVQcm9wKFwiY3JlYXRlU2VsZWN0aW9uQmV0d2VlblwiLCBmID0+IGYodmlldywgJGFuY2hvciwgJGhlYWQpKVxuICAgICAgICB8fCBUZXh0U2VsZWN0aW9uLmJldHdlZW4oJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xufVxuZnVuY3Rpb24gaGFzRm9jdXNBbmRTZWxlY3Rpb24odmlldykge1xuICAgIGlmICh2aWV3LmVkaXRhYmxlICYmICF2aWV3Lmhhc0ZvY3VzKCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzU2VsZWN0aW9uKHZpZXcpO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGlmICghc2VsLmFuY2hvck5vZGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBGaXJlZm94IHdpbGwgcmFpc2UgJ3Blcm1pc3Npb24gZGVuaWVkJyBlcnJvcnMgd2hlbiBhY2Nlc3NpbmdcbiAgICAgICAgLy8gcHJvcGVydGllcyBvZiBgc2VsLmFuY2hvck5vZGVgIHdoZW4gaXQncyBpbiBhIGdlbmVyYXRlZCBDU1NcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5hbmNob3JOb2RlLm5vZGVUeXBlID09IDMgPyBzZWwuYW5jaG9yTm9kZS5wYXJlbnROb2RlIDogc2VsLmFuY2hvck5vZGUpICYmXG4gICAgICAgICAgICAodmlldy5lZGl0YWJsZSB8fCB2aWV3LmRvbS5jb250YWlucyhzZWwuZm9jdXNOb2RlLm5vZGVUeXBlID09IDMgPyBzZWwuZm9jdXNOb2RlLnBhcmVudE5vZGUgOiBzZWwuZm9jdXNOb2RlKSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhbmNob3JJblJpZ2h0UGxhY2Uodmlldykge1xuICAgIGxldCBhbmNob3JET00gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IsIDApO1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgcmV0dXJuIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVTZWxlY3Rpb25CbG9jayhzdGF0ZSwgZGlyKSB7XG4gICAgbGV0IHsgJGFuY2hvciwgJGhlYWQgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgJHNpZGUgPSBkaXIgPiAwID8gJGFuY2hvci5tYXgoJGhlYWQpIDogJGFuY2hvci5taW4oJGhlYWQpO1xuICAgIGxldCAkc3RhcnQgPSAhJHNpZGUucGFyZW50LmlubGluZUNvbnRlbnQgPyAkc2lkZSA6ICRzaWRlLmRlcHRoID8gc3RhdGUuZG9jLnJlc29sdmUoZGlyID4gMCA/ICRzaWRlLmFmdGVyKCkgOiAkc2lkZS5iZWZvcmUoKSkgOiBudWxsO1xuICAgIHJldHVybiAkc3RhcnQgJiYgU2VsZWN0aW9uLmZpbmRGcm9tKCRzdGFydCwgZGlyKTtcbn1cbmZ1bmN0aW9uIGFwcGx5KHZpZXcsIHNlbCkge1xuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKG1vZHMuaW5kZXhPZihcInNcIikgPiAtMSkge1xuICAgICAgICAgICAgbGV0IHsgJGhlYWQgfSA9IHNlbCwgbm9kZSA9ICRoZWFkLnRleHRPZmZzZXQgPyBudWxsIDogZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXI7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5pc1RleHQgfHwgIW5vZGUuaXNMZWFmKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCAkbmV3SGVhZCA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zICsgbm9kZS5ub2RlU2l6ZSAqIChkaXIgPCAwID8gLTEgOiAxKSk7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IFRleHRTZWxlY3Rpb24oc2VsLiRhbmNob3IsICRuZXdIZWFkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXNlbC5lbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyID4gMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiKSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmIChuZXh0IGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEobWFjICYmIG1vZHMuaW5kZXhPZihcIm1cIikgPiAtMSkpIHtcbiAgICAgICAgICAgIGxldCAkaGVhZCA9IHNlbC4kaGVhZCwgbm9kZSA9ICRoZWFkLnRleHRPZmZzZXQgPyBudWxsIDogZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIsIGRlc2M7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5pc1RleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IG5vZGVQb3MgPSBkaXIgPCAwID8gJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSA6ICRoZWFkLnBvcztcbiAgICAgICAgICAgIGlmICghKG5vZGUuaXNBdG9tIHx8IChkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChub2RlUG9zKSkgJiYgIWRlc2MuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBOb2RlU2VsZWN0aW9uKGRpciA8IDAgPyB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKCRoZWFkLnBvcyAtIG5vZGUubm9kZVNpemUpIDogJGhlYWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdlYmtpdCkge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBhbmQgU2FmYXJpIHdpbGwgaW50cm9kdWNlIGV4dHJhIHBvaW50bGVzcyBjdXJzb3JcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbnMgYXJvdW5kIGlubGluZSB1bmVkaXRhYmxlIG5vZGVzLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgICAgICAgICAgLy8gdGFrZSBvdmVyIGFuZCBtb3ZlIHRoZSBjdXJzb3IgcGFzdCB0aGVtICgjOTM3KVxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGRpciA8IDAgPyBub2RlUG9zIDogbm9kZVBvcyArIG5vZGUubm9kZVNpemUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzZWwubm9kZS5pc0lubGluZSkge1xuICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IFRleHRTZWxlY3Rpb24oZGlyID4gMCA/IHNlbC4kdG8gOiBzZWwuJGZyb20pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVNlbGVjdGlvbkJsb2NrKHZpZXcuc3RhdGUsIGRpcik7XG4gICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9kZUxlbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBpc0lnbm9yYWJsZShkb20sIGRpcikge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5zaXplID09IDAgJiYgKGRpciA8IDAgfHwgZG9tLm5leHRTaWJsaW5nIHx8IGRvbS5ub2RlTmFtZSAhPSBcIkJSXCIpO1xufVxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlcyh2aWV3LCBkaXIpIHtcbiAgICByZXR1cm4gZGlyIDwgMCA/IHNraXBJZ25vcmVkTm9kZXNCZWZvcmUodmlldykgOiBza2lwSWdub3JlZE5vZGVzQWZ0ZXIodmlldyk7XG59XG4vLyBNYWtlIHN1cmUgdGhlIGN1cnNvciBpc24ndCBkaXJlY3RseSBhZnRlciBvbmUgb3IgbW9yZSBpZ25vcmVkXG4vLyBub2Rlcywgd2hpY2ggd2lsbCBjb25mdXNlIHRoZSBicm93c2VyJ3MgY3Vyc29yIG1vdGlvbiBsb2dpYy5cbmZ1bmN0aW9uIHNraXBJZ25vcmVkTm9kZXNCZWZvcmUodmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgbGV0IG5vZGUgPSBzZWwuZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IG1vdmVOb2RlLCBtb3ZlT2Zmc2V0LCBmb3JjZSA9IGZhbHNlO1xuICAgIC8vIEdlY2tvIHdpbGwgZG8gb2RkIHRoaW5ncyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgZGlyZWN0bHkgaW4gZnJvbnRcbiAgICAvLyBvZiBhIG5vbi1lZGl0YWJsZSBub2RlLCBzbyBpbiB0aGF0IGNhc2UsIG1vdmUgaXQgaW50byB0aGUgbmV4dFxuICAgIC8vIG5vZGUgaWYgcG9zc2libGUuIElzc3VlIHByb3NlbWlycm9yL3Byb3NlbWlycm9yIzgzMi5cbiAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA8IG5vZGVMZW4obm9kZSkgJiYgaXNJZ25vcmFibGUobm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIC0xKSlcbiAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGlzSWdub3JhYmxlKGJlZm9yZSwgLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IC0tb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCbG9ja05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChwcmV2ICYmIGlzSWdub3JhYmxlKHByZXYsIC0xKSkge1xuICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSBkb21JbmRleChwcmV2KTtcbiAgICAgICAgICAgICAgICBwcmV2ID0gcHJldi5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHByZXY7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZUxlbihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9yY2UpXG4gICAgICAgIHNldFNlbEZvY3VzKHZpZXcsIG5vZGUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAobW92ZU5vZGUpXG4gICAgICAgIHNldFNlbEZvY3VzKHZpZXcsIG1vdmVOb2RlLCBtb3ZlT2Zmc2V0KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGJlZm9yZSBvbmUgb3IgbW9yZSBpZ25vcmVkXG4vLyBub2Rlcy5cbmZ1bmN0aW9uIHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGVuID0gbm9kZUxlbihub2RlKTtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQ7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYWZ0ZXIsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSArK29mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAobmV4dCAmJiBpc0lnbm9yYWJsZShuZXh0LCAxKSkge1xuICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbmV4dC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSBkb21JbmRleChuZXh0KSArIDE7XG4gICAgICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuZnVuY3Rpb24gaXNCbG9ja05vZGUoZG9tKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLm5vZGUgJiYgZGVzYy5ub2RlLmlzQmxvY2s7XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkge1xuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMSAmJiBuZXh0LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgIW9mZnNldCAmJiAhaGFzQmxvY2tEZXNjKG5vZGUpKSB7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMSAmJiBuZXh0LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgIG9mZnNldCA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykge1xuICAgICAgICBsZXQgYmVmb3JlLCBhZnRlcjtcbiAgICAgICAgaWYgKGFmdGVyID0gdGV4dE5vZGVBZnRlcihub2RlLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICBub2RlID0gYWZ0ZXI7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJlZm9yZSA9IHRleHROb2RlQmVmb3JlKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICBvZmZzZXQgPSBiZWZvcmUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSkge1xuICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHNlbC5leHRlbmQobm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldztcbiAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgZW5kcyB1cCBoYXBwZW5pbmcsIHJlc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlID09IHN0YXRlKVxuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZmluZERpcmVjdGlvbih2aWV3LCBwb3MpIHtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIShjaHJvbWUgfHwgd2luZG93cykgJiYgJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgY29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAocG9zID4gJHBvcy5zdGFydCgpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdmlldy5jb29yZHNBdFBvcyhwb3MgLSAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYmVmb3JlLnRvcCArIGJlZm9yZS5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgIGlmIChtaWQgPiBjb29yZHMudG9wICYmIG1pZCA8IGNvb3Jkcy5ib3R0b20gJiYgTWF0aC5hYnMoYmVmb3JlLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUubGVmdCA8IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA8ICRwb3MuZW5kKCkpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHZpZXcuY29vcmRzQXRQb3MocG9zICsgMSk7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGFmdGVyLnRvcCArIGFmdGVyLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhhZnRlci5sZWZ0IC0gY29vcmRzLmxlZnQpID4gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkuZGlyZWN0aW9uO1xuICAgIHJldHVybiBjb21wdXRlZCA9PSBcInJ0bFwiID8gXCJydGxcIiA6IFwibHRyXCI7XG59XG4vLyBDaGVjayB3aGV0aGVyIHZlcnRpY2FsIHNlbGVjdGlvbiBtb3Rpb24gd291bGQgaW52b2x2ZSBub2RlXG4vLyBzZWxlY3Rpb25zLiBJZiBzbywgYXBwbHkgaXQgKGlmIG5vdCwgdGhlIHJlc3VsdCBpcyBsZWZ0IHRvIHRoZVxuLy8gYnJvd3NlcilcbmZ1bmN0aW9uIHNlbGVjdFZlcnRpY2FsbHkodmlldywgZGlyLCBtb2RzKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgfHwgbW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hYyAmJiBtb2RzLmluZGV4T2YoXCJtXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA8IDAgPyBcInVwXCIgOiBcImRvd25cIikpIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXh0KTtcbiAgICB9XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgc2lkZSA9IGRpciA8IDAgPyAkZnJvbSA6ICR0bztcbiAgICAgICAgbGV0IGJleW9uZCA9IHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiA/IFNlbGVjdGlvbi5uZWFyKHNpZGUsIGRpcikgOiBTZWxlY3Rpb24uZmluZEZyb20oc2lkZSwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGJleW9uZCA/IGFwcGx5KHZpZXcsIGJleW9uZCkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgZGlyKSB7XG4gICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IsIGVtcHR5IH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgbmV4dE5vZGUgPSAhJGhlYWQudGV4dE9mZnNldCAmJiAoZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiAhbmV4dE5vZGUuaXNUZXh0KSB7XG4gICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgdHIuZGVsZXRlKCRoZWFkLnBvcyAtIG5leHROb2RlLm5vZGVTaXplLCAkaGVhZC5wb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zLCAkaGVhZC5wb3MgKyBuZXh0Tm9kZS5ub2RlU2l6ZSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3dpdGNoRWRpdGFibGUodmlldywgbm9kZSwgc3RhdGUpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9IHN0YXRlO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbn1cbi8vIElzc3VlICM4NjcgLyAjMTA5MCAvIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkwMzgyMVxuLy8gSW4gd2hpY2ggU2FmYXJpIChhbmQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdCwgQ2hyb21lKSBkb2VzIHJlYWxseVxuLy8gd3JvbmcgdGhpbmdzIHdoZW4gdGhlIGRvd24gYXJyb3cgaXMgcHJlc3NlZCB3aGVuIHRoZSBjdXJzb3IgaXNcbi8vIGRpcmVjdGx5IGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBhbmQgaGFzIGFuIHVuZWRpdGFibGUgbm9kZVxuLy8gYWZ0ZXIgaXRcbmZ1bmN0aW9uIHNhZmFyaURvd25BcnJvd0J1Zyh2aWV3KSB7XG4gICAgaWYgKCFzYWZhcmkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7IGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoZm9jdXNOb2RlICYmIGZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxICYmIGZvY3VzT2Zmc2V0ID09IDAgJiZcbiAgICAgICAgZm9jdXNOb2RlLmZpcnN0Q2hpbGQgJiYgZm9jdXNOb2RlLmZpcnN0Q2hpbGQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikge1xuICAgICAgICBsZXQgY2hpbGQgPSBmb2N1c05vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgc3dpdGNoRWRpdGFibGUodmlldywgY2hpbGQsIFwidHJ1ZVwiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJmYWxzZVwiKSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBBIGJhY2tkcm9wIGtleSBtYXBwaW5nIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzXG4vLyB0aGF0IGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLiBGb3Jcbi8vIGN1cnNvci1tb3Rpb24ga2V5cywgdGhlIGNvZGUgaW4gdGhlIGhhbmRsZXJzIGFsc28gdGFrZXMgY2FyZSBvZlxuLy8gYmxvY2sgc2VsZWN0aW9ucy5cbmZ1bmN0aW9uIGdldE1vZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoZXZlbnQuY3RybEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiY1wiO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJtXCI7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiYVwiO1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwic1wiO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgIGxldCBjb2RlID0gZXZlbnQua2V5Q29kZSwgbW9kcyA9IGdldE1vZHMoZXZlbnQpO1xuICAgIGlmIChjb2RlID09IDggfHwgKG1hYyAmJiBjb2RlID09IDcyICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIEJhY2tzcGFjZSwgQ3RybC1oIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgLTEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoY29kZSA9PSA0NiAmJiAhZXZlbnQuc2hpZnRLZXkpIHx8IChtYWMgJiYgY29kZSA9PSA2OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEZWxldGUsIEN0cmwtZCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHN0b3BOYXRpdmVIb3Jpem9udGFsRGVsZXRlKHZpZXcsIDEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMTMgfHwgY29kZSA9PSAyNykgeyAvLyBFbnRlciwgRXNjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM3IHx8IChtYWMgJiYgY29kZSA9PSA2NiAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBMZWZ0IGFycm93LCBDdHJsLWIgb24gTWFjXG4gICAgICAgIGxldCBkaXIgPSBjb2RlID09IDM3ID8gKGZpbmREaXJlY3Rpb24odmlldywgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSkgPT0gXCJsdHJcIiA/IC0xIDogMSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOSB8fCAobWFjICYmIGNvZGUgPT0gNzAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gUmlnaHQgYXJyb3csIEN0cmwtZiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzkgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gMSA6IC0xKSA6IDE7XG4gICAgICAgIHJldHVybiBzZWxlY3RIb3Jpem9udGFsbHkodmlldywgZGlyLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzggfHwgKG1hYyAmJiBjb2RlID09IDgwICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIFVwIGFycm93LCBDdHJsLXAgb24gTWFjXG4gICAgICAgIHJldHVybiBzZWxlY3RWZXJ0aWNhbGx5KHZpZXcsIC0xLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIC0xKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSA0MCB8fCAobWFjICYmIGNvZGUgPT0gNzggJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gRG93biBhcnJvdywgQ3RybC1uIG9uIE1hY1xuICAgICAgICByZXR1cm4gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHx8IHNlbGVjdFZlcnRpY2FsbHkodmlldywgMSwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kcyA9PSAobWFjID8gXCJtXCIgOiBcImNcIikgJiZcbiAgICAgICAgKGNvZGUgPT0gNjYgfHwgY29kZSA9PSA3MyB8fCBjb2RlID09IDg5IHx8IGNvZGUgPT0gOTApKSB7IC8vIE1vZC1bYml5el1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKSB7XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybUNvcGllZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgbGV0IGNvbnRleHQgPSBbXSwgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICAgIHdoaWxlIChvcGVuU3RhcnQgPiAxICYmIG9wZW5FbmQgPiAxICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxICYmIGNvbnRlbnQuZmlyc3RDaGlsZC5jaGlsZENvdW50ID09IDEpIHtcbiAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgIG9wZW5FbmQtLTtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnRleHQucHVzaChub2RlLnR5cGUubmFtZSwgbm9kZS5hdHRycyAhPSBub2RlLnR5cGUuZGVmYXVsdEF0dHJzID8gbm9kZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICBsZXQgc2VyaWFsaXplciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRTZXJpYWxpemVyXCIpIHx8IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgbGV0IGRvYyA9IGRldGFjaGVkRG9jKCksIHdyYXAgPSBkb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQoY29udGVudCwgeyBkb2N1bWVudDogZG9jIH0pKTtcbiAgICBsZXQgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZCwgbmVlZHNXcmFwLCB3cmFwcGVycyA9IDA7XG4gICAgd2hpbGUgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmIChuZWVkc1dyYXAgPSB3cmFwTWFwW2ZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBuZWVkc1dyYXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQobmVlZHNXcmFwW2ldKTtcbiAgICAgICAgICAgIHdoaWxlICh3cmFwLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh3cmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgICAgIHdyYXBwZXJzKys7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICBmaXJzdENoaWxkLnNldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIiwgYCR7b3BlblN0YXJ0fSAke29wZW5FbmR9JHt3cmFwcGVycyA/IGAgLSR7d3JhcHBlcnN9YCA6IFwiXCJ9ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dCl9YCk7XG4gICAgbGV0IHRleHQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXJcIiwgZiA9PiBmKHNsaWNlLCB2aWV3KSkgfHxcbiAgICAgICAgc2xpY2UuY29udGVudC50ZXh0QmV0d2VlbigwLCBzbGljZS5jb250ZW50LnNpemUsIFwiXFxuXFxuXCIpO1xuICAgIHJldHVybiB7IGRvbTogd3JhcCwgdGV4dCwgc2xpY2UgfTtcbn1cbi8vIFJlYWQgYSBzbGljZSBvZiBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZCAob3IgZHJvcCBkYXRhKS5cbmZ1bmN0aW9uIHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCB0ZXh0LCBodG1sLCBwbGFpblRleHQsICRjb250ZXh0KSB7XG4gICAgbGV0IGluQ29kZSA9ICRjb250ZXh0LnBhcmVudC50eXBlLnNwZWMuY29kZTtcbiAgICBsZXQgZG9tLCBzbGljZTtcbiAgICBpZiAoIWh0bWwgJiYgIXRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhc1RleHQgPSB0ZXh0ICYmIChwbGFpblRleHQgfHwgaW5Db2RlIHx8ICFodG1sKTtcbiAgICBpZiAoYXNUZXh0KSB7XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJ0cmFuc2Zvcm1QYXN0ZWRUZXh0XCIsIGYgPT4geyB0ZXh0ID0gZih0ZXh0LCBpbkNvZGUgfHwgcGxhaW5UZXh0LCB2aWV3KTsgfSk7XG4gICAgICAgIGlmIChpbkNvZGUpXG4gICAgICAgICAgICByZXR1cm4gdGV4dCA/IG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHZpZXcuc3RhdGUuc2NoZW1hLnRleHQodGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpKSksIDAsIDApIDogU2xpY2UuZW1wdHk7XG4gICAgICAgIGxldCBwYXJzZWQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFBhcnNlclwiLCBmID0+IGYodGV4dCwgJGNvbnRleHQsIHBsYWluVGV4dCwgdmlldykpO1xuICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICBzbGljZSA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9ICRjb250ZXh0Lm1hcmtzKCk7XG4gICAgICAgICAgICBsZXQgeyBzY2hlbWEgfSA9IHZpZXcuc3RhdGUsIHNlcmlhbGl6ZXIgPSBET01TZXJpYWxpemVyLmZyb21TY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0ZXh0LnNwbGl0KC8oPzpcXHJcXG4/fFxcbikrLykuZm9yRWFjaChibG9jayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICAgICAgICAgIGlmIChibG9jaylcbiAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChzZXJpYWxpemVyLnNlcmlhbGl6ZU5vZGUoc2NoZW1hLnRleHQoYmxvY2ssIG1hcmtzKSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJ0cmFuc2Zvcm1QYXN0ZWRIVE1MXCIsIGYgPT4geyBodG1sID0gZihodG1sLCB2aWV3KTsgfSk7XG4gICAgICAgIGRvbSA9IHJlYWRIVE1MKGh0bWwpO1xuICAgICAgICBpZiAod2Via2l0KVxuICAgICAgICAgICAgcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSk7XG4gICAgfVxuICAgIGxldCBjb250ZXh0Tm9kZSA9IGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvcihcIltkYXRhLXBtLXNsaWNlXVwiKTtcbiAgICBsZXQgc2xpY2VEYXRhID0gY29udGV4dE5vZGUgJiYgL14oXFxkKykgKFxcZCspKD86IC0oXFxkKykpPyAoLiopLy5leGVjKGNvbnRleHROb2RlLmdldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIikgfHwgXCJcIik7XG4gICAgaWYgKHNsaWNlRGF0YSAmJiBzbGljZURhdGFbM10pXG4gICAgICAgIGZvciAobGV0IGkgPSArc2xpY2VEYXRhWzNdOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZG9tID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICAgIGxldCBwYXJzZXIgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkUGFyc2VyXCIpIHx8IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgICAgICBzbGljZSA9IHBhcnNlci5wYXJzZVNsaWNlKGRvbSwge1xuICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiAhIShhc1RleHQgfHwgc2xpY2VEYXRhKSxcbiAgICAgICAgICAgIGNvbnRleHQ6ICRjb250ZXh0LFxuICAgICAgICAgICAgcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgICAgICAgICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmICFkb20ubmV4dFNpYmxpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgZG9tLnBhcmVudE5vZGUgJiYgIWlubGluZVBhcmVudHMudGVzdChkb20ucGFyZW50Tm9kZS5ub2RlTmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNsaWNlRGF0YSkge1xuICAgICAgICBzbGljZSA9IGFkZENvbnRleHQoY2xvc2VTbGljZShzbGljZSwgK3NsaWNlRGF0YVsxXSwgK3NsaWNlRGF0YVsyXSksIHNsaWNlRGF0YVs0XSk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBIVE1MIHdhc24ndCBjcmVhdGVkIGJ5IFByb3NlTWlycm9yLiBNYWtlIHN1cmUgdG9wLWxldmVsIHNpYmxpbmdzIGFyZSBjb2hlcmVudFxuICAgICAgICBzbGljZSA9IFNsaWNlLm1heE9wZW4obm9ybWFsaXplU2libGluZ3Moc2xpY2UuY29udGVudCwgJGNvbnRleHQpLCB0cnVlKTtcbiAgICAgICAgaWYgKHNsaWNlLm9wZW5TdGFydCB8fCBzbGljZS5vcGVuRW5kKSB7XG4gICAgICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5maXJzdENoaWxkOyBvcGVuU3RhcnQgPCBzbGljZS5vcGVuU3RhcnQgJiYgIW5vZGUudHlwZS5zcGVjLmlzb2xhdGluZzsgb3BlblN0YXJ0KyssIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQpIHsgfVxuICAgICAgICAgICAgZm9yIChsZXQgbm9kZSA9IHNsaWNlLmNvbnRlbnQubGFzdENoaWxkOyBvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuRW5kKyssIG5vZGUgPSBub2RlLmxhc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBzbGljZSA9IGNsb3NlU2xpY2Uoc2xpY2UsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgaW5saW5lUGFyZW50cyA9IC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvaTtcbi8vIFRha2VzIGEgc2xpY2UgcGFyc2VkIHdpdGggcGFyc2VTbGljZSwgd2hpY2ggbWVhbnMgdGhlcmUgaGFzbid0IGJlZW5cbi8vIGFueSBjb250ZW50LWV4cHJlc3Npb24gY2hlY2tpbmcgZG9uZSBvbiB0aGUgdG9wIG5vZGVzLCB0cmllcyB0b1xuLy8gZmluZCBhIHBhcmVudCBub2RlIGluIHRoZSBjdXJyZW50IGNvbnRleHQgdGhhdCBtaWdodCBmaXQgdGhlIG5vZGVzLFxuLy8gYW5kIGlmIHN1Y2Nlc3NmdWwsIHJlYnVpbGRzIHRoZSBzbGljZSBzbyB0aGF0IGl0IGZpdHMgaW50byB0aGF0IHBhcmVudC5cbi8vXG4vLyBUaGlzIGFkZHJlc3NlcyB0aGUgcHJvYmxlbSB0aGF0IFRyYW5zZm9ybS5yZXBsYWNlIGV4cGVjdHMgYVxuLy8gY29oZXJlbnQgc2xpY2UsIGFuZCB3aWxsIGZhaWwgdG8gcGxhY2UgYSBzZXQgb2Ygc2libGluZ3MgdGhhdCBkb24ndFxuLy8gZml0IGFueXdoZXJlIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBub3JtYWxpemVTaWJsaW5ncyhmcmFnbWVudCwgJGNvbnRleHQpIHtcbiAgICBpZiAoZnJhZ21lbnQuY2hpbGRDb3VudCA8IDIpXG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICBmb3IgKGxldCBkID0gJGNvbnRleHQuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAkY29udGV4dC5ub2RlKGQpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBwYXJlbnQuY29udGVudE1hdGNoQXQoJGNvbnRleHQuaW5kZXgoZCkpO1xuICAgICAgICBsZXQgbGFzdFdyYXAsIHJlc3VsdCA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHdyYXAgPSBtYXRjaC5maW5kV3JhcHBpbmcobm9kZS50eXBlKSwgaW5MYXN0O1xuICAgICAgICAgICAgaWYgKCF3cmFwKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGluTGFzdCA9IHJlc3VsdC5sZW5ndGggJiYgbGFzdFdyYXAubGVuZ3RoICYmIGFkZFRvU2libGluZyh3cmFwLCBsYXN0V3JhcCwgbm9kZSwgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gaW5MYXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBjbG9zZVJpZ2h0KHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0sIGxhc3RXcmFwLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXBwZWQgPSB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2god3JhcHBlZCk7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5tYXRjaFR5cGUod3JhcHBlZC50eXBlKTtcbiAgICAgICAgICAgICAgICBsYXN0V3JhcCA9IHdyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb20ocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gd2l0aFdyYXBwZXJzKG5vZGUsIHdyYXAsIGZyb20gPSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IHdyYXAubGVuZ3RoIC0gMTsgaSA+PSBmcm9tOyBpLS0pXG4gICAgICAgIG5vZGUgPSB3cmFwW2ldLmNyZWF0ZShudWxsLCBGcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICByZXR1cm4gbm9kZTtcbn1cbi8vIFVzZWQgdG8gZ3JvdXAgYWRqYWNlbnQgbm9kZXMgd3JhcHBlZCBpbiBzaW1pbGFyIHBhcmVudHMgYnlcbi8vIG5vcm1hbGl6ZVNpYmxpbmdzIGludG8gdGhlIHNhbWUgcGFyZW50IG5vZGVcbmZ1bmN0aW9uIGFkZFRvU2libGluZyh3cmFwLCBsYXN0V3JhcCwgbm9kZSwgc2libGluZywgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPCB3cmFwLmxlbmd0aCAmJiBkZXB0aCA8IGxhc3RXcmFwLmxlbmd0aCAmJiB3cmFwW2RlcHRoXSA9PSBsYXN0V3JhcFtkZXB0aF0pIHtcbiAgICAgICAgbGV0IGlubmVyID0gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLmxhc3RDaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmcuY29weShzaWJsaW5nLmNvbnRlbnQucmVwbGFjZUNoaWxkKHNpYmxpbmcuY2hpbGRDb3VudCAtIDEsIGlubmVyKSk7XG4gICAgICAgIGxldCBtYXRjaCA9IHNpYmxpbmcuY29udGVudE1hdGNoQXQoc2libGluZy5jaGlsZENvdW50KTtcbiAgICAgICAgaWYgKG1hdGNoLm1hdGNoVHlwZShkZXB0aCA9PSB3cmFwLmxlbmd0aCAtIDEgPyBub2RlLnR5cGUgOiB3cmFwW2RlcHRoICsgMV0pKVxuICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmcuY29weShzaWJsaW5nLmNvbnRlbnQuYXBwZW5kKEZyYWdtZW50LmZyb20od2l0aFdyYXBwZXJzKG5vZGUsIHdyYXAsIGRlcHRoICsgMSkpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xvc2VSaWdodChub2RlLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICBsZXQgZnJhZ21lbnQgPSBub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKG5vZGUuY2hpbGRDb3VudCAtIDEsIGNsb3NlUmlnaHQobm9kZS5sYXN0Q2hpbGQsIGRlcHRoIC0gMSkpO1xuICAgIGxldCBmaWxsID0gbm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgIHJldHVybiBub2RlLmNvcHkoZnJhZ21lbnQuYXBwZW5kKGZpbGwpKTtcbn1cbmZ1bmN0aW9uIGNsb3NlUmFuZ2UoZnJhZ21lbnQsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCwgb3BlbkVuZCkge1xuICAgIGxldCBub2RlID0gc2lkZSA8IDAgPyBmcmFnbWVudC5maXJzdENoaWxkIDogZnJhZ21lbnQubGFzdENoaWxkLCBpbm5lciA9IG5vZGUuY29udGVudDtcbiAgICBpZiAoZnJhZ21lbnQuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgIG9wZW5FbmQgPSAwO1xuICAgIGlmIChkZXB0aCA8IHRvIC0gMSlcbiAgICAgICAgaW5uZXIgPSBjbG9zZVJhbmdlKGlubmVyLCBzaWRlLCBmcm9tLCB0bywgZGVwdGggKyAxLCBvcGVuRW5kKTtcbiAgICBpZiAoZGVwdGggPj0gZnJvbSlcbiAgICAgICAgaW5uZXIgPSBzaWRlIDwgMCA/IG5vZGUuY29udGVudE1hdGNoQXQoMCkuZmlsbEJlZm9yZShpbm5lciwgb3BlbkVuZCA8PSBkZXB0aCkuYXBwZW5kKGlubmVyKVxuICAgICAgICAgICAgOiBpbm5lci5hcHBlbmQobm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICByZXR1cm4gZnJhZ21lbnQucmVwbGFjZUNoaWxkKHNpZGUgPCAwID8gMCA6IGZyYWdtZW50LmNoaWxkQ291bnQgLSAxLCBub2RlLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIGNsb3NlU2xpY2Uoc2xpY2UsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGlmIChvcGVuU3RhcnQgPCBzbGljZS5vcGVuU3RhcnQpXG4gICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKGNsb3NlUmFuZ2Uoc2xpY2UuY29udGVudCwgLTEsIG9wZW5TdGFydCwgc2xpY2Uub3BlblN0YXJ0LCAwLCBzbGljZS5vcGVuRW5kKSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuRW5kKTtcbiAgICBpZiAob3BlbkVuZCA8IHNsaWNlLm9wZW5FbmQpXG4gICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKGNsb3NlUmFuZ2Uoc2xpY2UuY29udGVudCwgMSwgb3BlbkVuZCwgc2xpY2Uub3BlbkVuZCwgMCwgMCksIHNsaWNlLm9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuLy8gVHJpY2sgZnJvbSBqUXVlcnkgLS0gc29tZSBlbGVtZW50cyBtdXN0IGJlIHdyYXBwZWQgaW4gb3RoZXJcbi8vIGVsZW1lbnRzIGZvciBpbm5lckhUTUwgdG8gd29yay4gSS5lLiBpZiB5b3UgZG8gYGRpdi5pbm5lckhUTUwgPVxuLy8gXCI8dGQ+Li48L3RkPlwiYCB0aGUgdGFibGUgY2VsbHMgYXJlIGlnbm9yZWQuXG5jb25zdCB3cmFwTWFwID0ge1xuICAgIHRoZWFkOiBbXCJ0YWJsZVwiXSxcbiAgICB0Ym9keTogW1widGFibGVcIl0sXG4gICAgdGZvb3Q6IFtcInRhYmxlXCJdLFxuICAgIGNhcHRpb246IFtcInRhYmxlXCJdLFxuICAgIGNvbGdyb3VwOiBbXCJ0YWJsZVwiXSxcbiAgICBjb2w6IFtcInRhYmxlXCIsIFwiY29sZ3JvdXBcIl0sXG4gICAgdHI6IFtcInRhYmxlXCIsIFwidGJvZHlcIl0sXG4gICAgdGQ6IFtcInRhYmxlXCIsIFwidGJvZHlcIiwgXCJ0clwiXSxcbiAgICB0aDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdXG59O1xubGV0IF9kZXRhY2hlZERvYyA9IG51bGw7XG5mdW5jdGlvbiBkZXRhY2hlZERvYygpIHtcbiAgICByZXR1cm4gX2RldGFjaGVkRG9jIHx8IChfZGV0YWNoZWREb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJ0aXRsZVwiKSk7XG59XG5sZXQgX3BvbGljeSA9IG51bGw7XG5mdW5jdGlvbiBtYXliZVdyYXBUcnVzdGVkKGh0bWwpIHtcbiAgICBsZXQgdHJ1c3RlZFR5cGVzID0gd2luZG93LnRydXN0ZWRUeXBlcztcbiAgICBpZiAoIXRydXN0ZWRUeXBlcylcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgLy8gV2l0aCB0aGUgcmVxdWlyZS10cnVzdGVkLXR5cGVzLWZvciBDU1AsIENocm9tZSB3aWxsIGJsb2NrXG4gICAgLy8gaW5uZXJIVE1MLCBldmVuIG9uIGEgZGV0YWNoZWQgZG9jdW1lbnQuIFRoaXMgd3JhcHMgdGhlIHN0cmluZyBpblxuICAgIC8vIGEgd2F5IHRoYXQgbWFrZXMgdGhlIGJyb3dzZXIgYWxsb3cgdXMgdG8gdXNlIGl0cyBwYXJzZXIgYWdhaW4uXG4gICAgaWYgKCFfcG9saWN5KVxuICAgICAgICBfcG9saWN5ID0gdHJ1c3RlZFR5cGVzLmRlZmF1bHRQb2xpY3kgfHwgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeShcIlByb3NlTWlycm9yQ2xpcGJvYXJkXCIsIHsgY3JlYXRlSFRNTDogKHMpID0+IHMgfSk7XG4gICAgcmV0dXJuIF9wb2xpY3kuY3JlYXRlSFRNTChodG1sKTtcbn1cbmZ1bmN0aW9uIHJlYWRIVE1MKGh0bWwpIHtcbiAgICBsZXQgbWV0YXMgPSAvXihcXHMqPG1ldGEgW14+XSo+KSovLmV4ZWMoaHRtbCk7XG4gICAgaWYgKG1ldGFzKVxuICAgICAgICBodG1sID0gaHRtbC5zbGljZShtZXRhc1swXS5sZW5ndGgpO1xuICAgIGxldCBlbHQgPSBkZXRhY2hlZERvYygpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbGV0IGZpcnN0VGFnID0gLzwoW2Etel1bXj5cXHNdKykvaS5leGVjKGh0bWwpLCB3cmFwO1xuICAgIGlmICh3cmFwID0gZmlyc3RUYWcgJiYgd3JhcE1hcFtmaXJzdFRhZ1sxXS50b0xvd2VyQ2FzZSgpXSlcbiAgICAgICAgaHRtbCA9IHdyYXAubWFwKG4gPT4gXCI8XCIgKyBuICsgXCI+XCIpLmpvaW4oXCJcIikgKyBodG1sICsgd3JhcC5tYXAobiA9PiBcIjwvXCIgKyBuICsgXCI+XCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgIGVsdC5pbm5lckhUTUwgPSBtYXliZVdyYXBUcnVzdGVkKGh0bWwpO1xuICAgIGlmICh3cmFwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbHQgPSBlbHQucXVlcnlTZWxlY3Rvcih3cmFwW2ldKSB8fCBlbHQ7XG4gICAgcmV0dXJuIGVsdDtcbn1cbi8vIFdlYmtpdCBicm93c2VycyBkbyBzb21lIGhhcmQtdG8tcHJlZGljdCByZXBsYWNlbWVudCBvZiByZWd1bGFyXG4vLyBzcGFjZXMgd2l0aCBub24tYnJlYWtpbmcgc3BhY2VzIHdoZW4gcHV0dGluZyBjb250ZW50IG9uIHRoZVxuLy8gY2xpcGJvYXJkLiBUaGlzIHRyaWVzIHRvIGNvbnZlcnQgc3VjaCBub24tYnJlYWtpbmcgc3BhY2VzICh3aGljaFxuLy8gd2lsbCBiZSB3cmFwcGVkIGluIGEgcGxhaW4gc3BhbiBvbiBDaHJvbWUsIGEgc3BhbiB3aXRoIGNsYXNzXG4vLyBBcHBsZS1jb252ZXJ0ZWQtc3BhY2Ugb24gU2FmYXJpKSBiYWNrIHRvIHJlZ3VsYXIgc3BhY2VzLlxuZnVuY3Rpb24gcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSkge1xuICAgIGxldCBub2RlcyA9IGRvbS5xdWVyeVNlbGVjdG9yQWxsKGNocm9tZSA/IFwic3Bhbjpub3QoW2NsYXNzXSk6bm90KFtzdHlsZV0pXCIgOiBcInNwYW4uQXBwbGUtY29udmVydGVkLXNwYWNlXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLnRleHRDb250ZW50ID09IFwiXFx1MDBhMFwiICYmIG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9tLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgXCIpLCBub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRDb250ZXh0KHNsaWNlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgbGV0IHNjaGVtYSA9IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50eXBlLnNjaGVtYSwgYXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgICAgYXJyYXkgPSBKU09OLnBhcnNlKGNvbnRleHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIGxldCB0eXBlID0gc2NoZW1hLm5vZGVzW2FycmF5W2ldXTtcbiAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGFycmF5W2kgKyAxXSwgY29udGVudCkpO1xuICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgb3BlbkVuZCsrO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbi8vIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbmNvbnN0IGhhbmRsZXJzID0ge307XG5jb25zdCBlZGl0SGFuZGxlcnMgPSB7fTtcbmNvbnN0IHBhc3NpdmVIYW5kbGVycyA9IHsgdG91Y2hzdGFydDogdHJ1ZSwgdG91Y2htb3ZlOiB0cnVlIH07XG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaGlmdEtleSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdENsaWNrID0geyB0aW1lOiAwLCB4OiAwLCB5OiAwLCB0eXBlOiBcIlwiLCBidXR0b246IDAgfTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SU9TRW50ZXJGYWxsYmFja1RpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0Rm9jdXMgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaCA9IDA7XG4gICAgICAgIHRoaXMubGFzdENocm9tZURlbGV0ZSA9IDA7XG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmdUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JRCA9IDE7XG4gICAgICAgIC8vIFNldCB0byBhIGNvbXBvc2l0aW9uIElEIHdoZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBhdCBjb21wb3NpdGlvbmVuZFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgPSAwO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5oaWRlU2VsZWN0aW9uR3VhcmQgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRJbnB1dCh2aWV3KSB7XG4gICAgZm9yIChsZXQgZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1tldmVudF0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpICYmICFydW5DdXN0b21IYW5kbGVyKHZpZXcsIGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgfSwgcGFzc2l2ZUhhbmRsZXJzW2V2ZW50XSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgLy8gT24gU2FmYXJpLCBmb3IgcmVhc29ucyBiZXlvbmQgbXkgdW5kZXJzdGFuZGluZywgYWRkaW5nIGFuIGlucHV0XG4gICAgLy8gZXZlbnQgaGFuZGxlciBtYWtlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlblxuICAgIC8vIHlvdSBwcmVzcyBlbnRlciBnbyBhd2F5LlxuICAgIGlmIChzYWZhcmkpXG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICBlbnN1cmVMaXN0ZW5lcnModmlldyk7XG59XG5mdW5jdGlvbiBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgb3JpZ2luKSB7XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgIHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPSBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZGVzdHJveUlucHV0KHZpZXcpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVycylcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB2aWV3LmlucHV0LmV2ZW50SGFuZGxlcnNbdHlwZV0pO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCk7XG59XG5mdW5jdGlvbiBlbnN1cmVMaXN0ZW5lcnModmlldykge1xuICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVET01FdmVudHNcIiwgY3VycmVudEhhbmRsZXJzID0+IHtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBjdXJyZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAoIXZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSA9IGV2ZW50ID0+IHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpIHtcbiAgICByZXR1cm4gdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBoYW5kbGVycyA9PiB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gaGFuZGxlcnNbZXZlbnQudHlwZV07XG4gICAgICAgIHJldHVybiBoYW5kbGVyID8gaGFuZGxlcih2aWV3LCBldmVudCkgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IGZhbHNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZXZlbnRCZWxvbmdzVG9WaWV3KHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGUgIT0gdmlldy5kb207IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8XG4gICAgICAgICAgICAobm9kZS5wbVZpZXdEZXNjICYmIG5vZGUucG1WaWV3RGVzYy5zdG9wRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmIGhhbmRsZXJzW2V2ZW50LnR5cGVdICYmXG4gICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgaGFuZGxlcnNbZXZlbnQudHlwZV0odmlldywgZXZlbnQpO1xufVxuZWRpdEhhbmRsZXJzLmtleWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5rZXlDb2RlID09IDE2IHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBTdXBwcmVzcyBlbnRlciBrZXkgZXZlbnRzIG9uIENocm9tZSBBbmRyb2lkLCBiZWNhdXNlIHRob3NlIHRlbmRcbiAgICAvLyB0byBiZSBwYXJ0IG9mIGEgY29uZnVzZWQgc2VxdWVuY2Ugb2YgY29tcG9zaXRpb24gZXZlbnRzIGZpcmVkLFxuICAgIC8vIGFuZCBoYW5kbGluZyB0aGVtIGVhZ2VybHkgdGVuZHMgdG8gY29ycnVwdCB0aGUgaW5wdXQuXG4gICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIGV2ZW50LmtleUNvZGUgPT0gMTMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIC8vIE9uIGlPUywgaWYgd2UgcHJldmVudERlZmF1bHQgZW50ZXIga2V5IHByZXNzZXMsIHRoZSB2aXJ0dWFsXG4gICAgLy8ga2V5Ym9hcmQgZ2V0cyBjb25mdXNlZC4gU28gdGhlIGhhY2sgaGVyZSBpcyB0byBzZXQgYSBmbGFnIHRoYXRcbiAgICAvLyBtYWtlcyB0aGUgRE9NIGNoYW5nZSBjb2RlIHJlY29nbml6ZSB0aGF0IHdoYXQganVzdCBoYXBwZW5zIHNob3VsZFxuICAgIC8vIGJlIHJlcGxhY2VkIGJ5IHdoYXRldmVyIHRoZSBFbnRlciBrZXkgaGFuZGxlcnMgZG8uXG4gICAgaWYgKGlvcyAmJiBldmVudC5rZXlDb2RlID09IDEzICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gbm93O1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdElPU0VudGVyID09IG5vdykge1xuICAgICAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpO1xuICAgICAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkgfHwgY2FwdHVyZUtleURvd24odmlldywgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJrZXlcIik7XG4gICAgfVxufTtcbmVkaXRIYW5kbGVycy5rZXl1cCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDE2KVxuICAgICAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuZWRpdEhhbmRsZXJzLmtleXByZXNzID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAoaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkgfHwgIWV2ZW50LmNoYXJDb2RlIHx8XG4gICAgICAgIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fCBtYWMgJiYgZXZlbnQubWV0YUtleSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5UHJlc3NcIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgIXNlbC4kZnJvbS5zYW1lUGFyZW50KHNlbC4kdG8pKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSk7XG4gICAgICAgIGlmICghL1tcXHJcXG5dLy50ZXN0KHRleHQpICYmICF2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBzZWwuJGZyb20ucG9zLCBzZWwuJHRvLnBvcywgdGV4dCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGV2ZW50Q29vcmRzKGV2ZW50KSB7IHJldHVybiB7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9OyB9XG5mdW5jdGlvbiBpc05lYXIoZXZlbnQsIGNsaWNrKSB7XG4gICAgbGV0IGR4ID0gY2xpY2sueCAtIGV2ZW50LmNsaWVudFgsIGR5ID0gY2xpY2sueSAtIGV2ZW50LmNsaWVudFk7XG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5IDwgMTAwO1xufVxuZnVuY3Rpb24gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBwcm9wTmFtZSwgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBpZiAodmlldy5zb21lUHJvcChwcm9wTmFtZSwgZiA9PiBpID4gJHBvcy5kZXB0aCA/IGYodmlldywgcG9zLCAkcG9zLm5vZGVBZnRlciwgJHBvcy5iZWZvcmUoaSksIGV2ZW50LCB0cnVlKVxuICAgICAgICAgICAgOiBmKHZpZXcsIHBvcywgJHBvcy5ub2RlKGkpLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIGZhbHNlKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKHZpZXcsIHNlbGVjdGlvbiwgb3JpZ2luKSB7XG4gICAgaWYgKCF2aWV3LmZvY3VzZWQpXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZXEoc2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgdHIuc2V0TWV0YShcInBvaW50ZXJcIiwgdHJ1ZSk7XG4gICAgdmlldy5kaXNwYXRjaCh0cik7XG59XG5mdW5jdGlvbiBzZWxlY3RDbGlja2VkTGVhZih2aWV3LCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQXRvbSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSkge1xuICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyksIFwicG9pbnRlclwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHZpZXcsIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgPT0gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24sIHNlbGVjdGVkTm9kZSwgc2VsZWN0QXQ7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pXG4gICAgICAgIHNlbGVjdGVkTm9kZSA9IHNlbC5ub2RlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9IGkgPiAkcG9zLmRlcHRoID8gJHBvcy5ub2RlQWZ0ZXIgOiAkcG9zLm5vZGUoaSk7XG4gICAgICAgIGlmIChOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSAmJiBzZWwuJGZyb20uZGVwdGggPiAwICYmXG4gICAgICAgICAgICAgICAgaSA+PSBzZWwuJGZyb20uZGVwdGggJiYgJHBvcy5iZWZvcmUoc2VsLiRmcm9tLmRlcHRoICsgMSkgPT0gc2VsLiRmcm9tLnBvcylcbiAgICAgICAgICAgICAgICBzZWxlY3RBdCA9ICRwb3MuYmVmb3JlKHNlbC4kZnJvbS5kZXB0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VsZWN0QXQgPSAkcG9zLmJlZm9yZShpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxlY3RBdCAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgc2VsZWN0QXQpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNpbmdsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCwgc2VsZWN0Tm9kZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpIHx8XG4gICAgICAgIChzZWxlY3ROb2RlID8gc2VsZWN0Q2xpY2tlZE5vZGUodmlldywgaW5zaWRlKSA6IHNlbGVjdENsaWNrZWRMZWFmKHZpZXcsIGluc2lkZSkpO1xufVxuZnVuY3Rpb24gaGFuZGxlRG91YmxlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVEb3VibGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZURvdWJsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSk7XG59XG5mdW5jdGlvbiBoYW5kbGVUcmlwbGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZVRyaXBsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVHJpcGxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKSB8fFxuICAgICAgICBkZWZhdWx0VHJpcGxlQ2xpY2sodmlldywgaW5zaWRlLCBldmVudCk7XG59XG5mdW5jdGlvbiBkZWZhdWx0VHJpcGxlQ2xpY2sodmlldywgaW5zaWRlLCBldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gIT0gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICBpZiAoaW5zaWRlID09IC0xKSB7XG4gICAgICAgIGlmIChkb2MuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgMCwgZG9jLmNvbnRlbnQuc2l6ZSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9IGkgPiAkcG9zLmRlcHRoID8gJHBvcy5ub2RlQWZ0ZXIgOiAkcG9zLm5vZGUoaSk7XG4gICAgICAgIGxldCBub2RlUG9zID0gJHBvcy5iZWZvcmUoaSk7XG4gICAgICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBub2RlUG9zICsgMSwgbm9kZVBvcyArIDEgKyBub2RlLmNvbnRlbnQuc2l6ZSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgZWxzZSBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgTm9kZVNlbGVjdGlvbi5jcmVhdGUoZG9jLCBub2RlUG9zKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gZm9yY2VET01GbHVzaCh2aWV3KSB7XG4gICAgcmV0dXJuIGVuZENvbXBvc2l0aW9uKHZpZXcpO1xufVxuY29uc3Qgc2VsZWN0Tm9kZU1vZGlmaWVyID0gbWFjID8gXCJtZXRhS2V5XCIgOiBcImN0cmxLZXlcIjtcbmhhbmRsZXJzLm1vdXNlZG93biA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgdmlldy5pbnB1dC5zaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGxldCBmbHVzaGVkID0gZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKSwgdHlwZSA9IFwic2luZ2xlQ2xpY2tcIjtcbiAgICBpZiAobm93IC0gdmlldy5pbnB1dC5sYXN0Q2xpY2sudGltZSA8IDUwMCAmJiBpc05lYXIoZXZlbnQsIHZpZXcuaW5wdXQubGFzdENsaWNrKSAmJiAhZXZlbnRbc2VsZWN0Tm9kZU1vZGlmaWVyXSAmJlxuICAgICAgICB2aWV3LmlucHV0Lmxhc3RDbGljay5idXR0b24gPT0gZXZlbnQuYnV0dG9uKSB7XG4gICAgICAgIGlmICh2aWV3LmlucHV0Lmxhc3RDbGljay50eXBlID09IFwic2luZ2xlQ2xpY2tcIilcbiAgICAgICAgICAgIHR5cGUgPSBcImRvdWJsZUNsaWNrXCI7XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJkb3VibGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwidHJpcGxlQ2xpY2tcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0Q2xpY2sgPSB7IHRpbWU6IG5vdywgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSwgdHlwZSwgYnV0dG9uOiBldmVudC5idXR0b24gfTtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGlmICghcG9zKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKSB7XG4gICAgICAgIGlmICh2aWV3LmlucHV0Lm1vdXNlRG93bilcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duLmRvbmUoKTtcbiAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24gPSBuZXcgTW91c2VEb3duKHZpZXcsIHBvcywgZXZlbnQsICEhZmx1c2hlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCh0eXBlID09IFwiZG91YmxlQ2xpY2tcIiA/IGhhbmRsZURvdWJsZUNsaWNrIDogaGFuZGxlVHJpcGxlQ2xpY2spKHZpZXcsIHBvcy5wb3MsIHBvcy5pbnNpZGUsIGV2ZW50KSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbiAgICB9XG59O1xuY2xhc3MgTW91c2VEb3duIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBwb3MsIGV2ZW50LCBmbHVzaGVkKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZmx1c2hlZCA9IGZsdXNoZWQ7XG4gICAgICAgIHRoaXMuZGVsYXllZFNlbGVjdGlvblN5bmMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5taWdodERyYWcgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSA9ICEhZXZlbnRbc2VsZWN0Tm9kZU1vZGlmaWVyXTtcbiAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgbGV0IHRhcmdldE5vZGUsIHRhcmdldFBvcztcbiAgICAgICAgaWYgKHBvcy5pbnNpZGUgPiAtMSkge1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHZpZXcuc3RhdGUuZG9jLm5vZGVBdChwb3MuaW5zaWRlKTtcbiAgICAgICAgICAgIHRhcmdldFBvcyA9IHBvcy5pbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zLnBvcyk7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gJHBvcy5wYXJlbnQ7XG4gICAgICAgICAgICB0YXJnZXRQb3MgPSAkcG9zLmRlcHRoID8gJHBvcy5iZWZvcmUoKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZmx1c2hlZCA/IG51bGwgOiBldmVudC50YXJnZXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldERlc2MgPSB0YXJnZXQgPyB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2ModGFyZ2V0LCB0cnVlKSA6IG51bGw7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0RGVzYyAmJiB0YXJnZXREZXNjLmRvbS5ub2RlVHlwZSA9PSAxID8gdGFyZ2V0RGVzYy5kb20gOiBudWxsO1xuICAgICAgICBsZXQgeyBzZWxlY3Rpb24gfSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlICYmIHRhcmdldE5vZGUudHlwZS5zcGVjLnNlbGVjdGFibGUgIT09IGZhbHNlIHx8XG4gICAgICAgICAgICBzZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mcm9tIDw9IHRhcmdldFBvcyAmJiBzZWxlY3Rpb24udG8gPiB0YXJnZXRQb3MpXG4gICAgICAgICAgICB0aGlzLm1pZ2h0RHJhZyA9IHtcbiAgICAgICAgICAgICAgICBub2RlOiB0YXJnZXROb2RlLFxuICAgICAgICAgICAgICAgIHBvczogdGFyZ2V0UG9zLFxuICAgICAgICAgICAgICAgIGFkZEF0dHI6ICEhKHRoaXMudGFyZ2V0ICYmICF0aGlzLnRhcmdldC5kcmFnZ2FibGUpLFxuICAgICAgICAgICAgICAgIHNldFVuZWRpdGFibGU6ICEhKHRoaXMudGFyZ2V0ICYmIGdlY2tvICYmICF0aGlzLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIikpXG4gICAgICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy50YXJnZXQgJiYgdGhpcy5taWdodERyYWcgJiYgKHRoaXMubWlnaHREcmFnLmFkZEF0dHIgfHwgdGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLnNldFVuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaW5wdXQubW91c2VEb3duID09IHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJmYWxzZVwiKTtcbiAgICAgICAgICAgICAgICB9LCAyMCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LnJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy51cCA9IHRoaXMudXAuYmluZCh0aGlzKSk7XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbiAgICB9XG4gICAgZG9uZSgpIHtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy51cCk7XG4gICAgICAgIHRoaXMudmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnICYmIHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLmFkZEF0dHIpXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLnNldFVuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwiY29udGVudEVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZFNlbGVjdGlvblN5bmMpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGVjdGlvblRvRE9NKHRoaXMudmlldykpO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXQubW91c2VEb3duID0gbnVsbDtcbiAgICB9XG4gICAgdXAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kb25lKCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3LmRvbS5jb250YWlucyhldmVudC50YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZG9jICE9IHRoaXMuc3RhcnREb2MpXG4gICAgICAgICAgICBwb3MgPSB0aGlzLnZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5hbGxvd0RlZmF1bHQgfHwgIXBvcykge1xuICAgICAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHRoaXMudmlldywgXCJwb2ludGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhhbmRsZVNpbmdsZUNsaWNrKHRoaXMudmlldywgcG9zLnBvcywgcG9zLmluc2lkZSwgZXZlbnQsIHRoaXMuc2VsZWN0Tm9kZSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09IDAgJiZcbiAgICAgICAgICAgICh0aGlzLmZsdXNoZWQgfHxcbiAgICAgICAgICAgICAgICAvLyBTYWZhcmkgaWdub3JlcyBjbGlja3Mgb24gZHJhZ2dhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgKHNhZmFyaSAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAhdGhpcy5taWdodERyYWcubm9kZS5pc0F0b20pIHx8XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgc29tZXRpbWVzIHRyZWF0IGEgbm9kZSBzZWxlY3Rpb24gYXMgYVxuICAgICAgICAgICAgICAgIC8vIGN1cnNvciwgYnV0IHN0aWxsIHJlcG9ydCB0aGF0IHRoZSBub2RlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgLy8gd2hlbiBhc2tlZCB0aHJvdWdoIGdldFNlbGVjdGlvbi4gWW91J2xsIHRoZW4gZ2V0IGFcbiAgICAgICAgICAgICAgICAvLyBzaXR1YXRpb24gd2hlcmUgY2xpY2tpbmcgYXQgdGhlIHBvaW50IHdoZXJlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyAoaGlkZGVuKSBjdXJzb3IgaXMgZG9lc24ndCBjaGFuZ2UgdGhlIHNlbGVjdGlvbiwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGh1cyBkb2Vzbid0IGdldCBhIHJlYWN0aW9uIGZyb20gUHJvc2VNaXJyb3IuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyB3b3JrcyBhcm91bmQgdGhhdC5cbiAgICAgICAgICAgICAgICAoY2hyb21lICYmICF0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiZcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSksIE1hdGguYWJzKHBvcy5wb3MgLSB0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvKSkgPD0gMikpKSB7XG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odGhpcy52aWV3LCBTZWxlY3Rpb24ubmVhcih0aGlzLnZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zLnBvcykpLCBcInBvaW50ZXJcIik7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHRoaXMudmlldywgXCJwb2ludGVyXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXG4gICAgICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICB9XG4gICAgdXBkYXRlQWxsb3dEZWZhdWx0KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0RlZmF1bHQgJiYgKE1hdGguYWJzKHRoaXMuZXZlbnQueCAtIGV2ZW50LmNsaWVudFgpID4gNCB8fFxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5ldmVudC55IC0gZXZlbnQuY2xpZW50WSkgPiA0KSlcbiAgICAgICAgICAgIHRoaXMuYWxsb3dEZWZhdWx0ID0gdHJ1ZTtcbiAgICB9XG59XG5oYW5kbGVycy50b3VjaHN0YXJ0ID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0VG91Y2ggPSBEYXRlLm5vdygpO1xuICAgIGZvcmNlRE9NRmx1c2godmlldyk7XG4gICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4gZm9yY2VET01GbHVzaCh2aWV3KTtcbmZ1bmN0aW9uIGluT3JOZWFyQ29tcG9zaXRpb24odmlldywgZXZlbnQpIHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNlZSBodHRwczovL3d3dy5zdHVtLmRlLzIwMTYvMDYvMjQvaGFuZGxpbmctaW1lLWV2ZW50cy1pbi1qYXZhc2NyaXB0Ly5cbiAgICAvLyBPbiBKYXBhbmVzZSBpbnB1dCBtZXRob2QgZWRpdG9ycyAoSU1FcyksIHRoZSBFbnRlciBrZXkgaXMgdXNlZCB0byBjb25maXJtIGNoYXJhY3RlclxuICAgIC8vIHNlbGVjdGlvbi4gT24gU2FmYXJpLCB3aGVuIEVudGVyIGlzIHByZXNzZWQsIGNvbXBvc2l0aW9uZW5kIGFuZCBrZXlkb3duIGV2ZW50cyBhcmVcbiAgICAvLyBlbWl0dGVkLiBUaGUga2V5ZG93biBldmVudCB0cmlnZ2VycyBuZXdsaW5lIGluc2VydGlvbiwgd2hpY2ggd2UgZG9uJ3Qgd2FudC5cbiAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGtleWRvd24gZXZlbnQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgLy8gV2Ugb25seSBpZ25vcmUgaXQgb25jZSwgYXMgcHJlc3NpbmcgRW50ZXIgYSBzZWNvbmQgdGltZSAqc2hvdWxkKiBpbnNlcnQgYSBuZXdsaW5lLlxuICAgIC8vIEZ1cnRoZXJtb3JlLCB0aGUga2V5ZG93biBldmVudCB0aW1lc3RhbXAgbXVzdCBiZSBjbG9zZSB0byB0aGUgY29tcG9zaXRpb25FbmRlZEF0IHRpbWVzdGFtcC5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIGNvbXBvc2l0aW9uZW5kIGlzIHRyaWdnZXJlZCB3aXRob3V0IHRoZSBrZXlib2FyZFxuICAgIC8vIChlLmcuIGNoYXJhY3RlciBjb25maXJtYXRpb24gbWF5IGJlIGRvbmUgd2l0aCB0aGUgbW91c2UpLCBhbmQga2V5ZG93biBpcyB0cmlnZ2VyZWRcbiAgICAvLyBhZnRlcndhcmRzLSB3ZSB3b3VsZG4ndCB3YW50IHRvIGlnbm9yZSB0aGUga2V5ZG93biBldmVudCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKHNhZmFyaSAmJiBNYXRoLmFicyhldmVudC50aW1lU3RhbXAgLSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCkgPCA1MDApIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSAtMmU4O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gRHJvcCBhY3RpdmUgY29tcG9zaXRpb24gYWZ0ZXIgNSBzZWNvbmRzIG9mIGluYWN0aXZpdHkgb24gQW5kcm9pZFxuY29uc3QgdGltZW91dENvbXBvc2l0aW9uID0gYW5kcm9pZCA/IDUwMDAgOiAtMTtcbmVkaXRIYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9udXBkYXRlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoKCk7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCAkcG9zID0gc3RhdGUuc2VsZWN0aW9uLiR0bztcbiAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiZcbiAgICAgICAgICAgIChzdGF0ZS5zdG9yZWRNYXJrcyB8fFxuICAgICAgICAgICAgICAgICghJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3MucGFyZW50T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5zb21lKG0gPT4gbS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSkpKSkge1xuICAgICAgICAgICAgLy8gTmVlZCB0byB3cmFwIHRoZSBjdXJzb3IgaW4gbWFyayBub2RlcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lcyBpbiB0aGUgRE9NIGNvbnRleHRcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IHZpZXcuc3RhdGUuc3RvcmVkTWFya3MgfHwgJHBvcy5tYXJrcygpO1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3Lm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSk7XG4gICAgICAgICAgICAvLyBJbiBmaXJlZm94LCBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIGJ1dCBvdXRzaWRlIGEgbWFya2VkIG5vZGUsXG4gICAgICAgICAgICAvLyB0aGUgaW5zZXJ0ZWQgdGV4dCB3b24ndCBpbmhlcml0IHRoZSBtYXJrcy4gU28gdGhpcyBtb3ZlcyBpdFxuICAgICAgICAgICAgLy8gaW5zaWRlIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICAgIGlmIChnZWNrbyAmJiBzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgISRwb3MudGV4dE9mZnNldCAmJiAkcG9zLm5vZGVCZWZvcmUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0OyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgIT0gMDspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG9mZnNldCA8IDAgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGJlZm9yZSwgYmVmb3JlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgdGltZW91dENvbXBvc2l0aW9uKTtcbn07XG5lZGl0SGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSBldmVudC50aW1lU3RhbXA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IHZpZXcuZG9tT2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPyB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQgOiAwO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZSA9IG51bGw7XG4gICAgICAgIGlmICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKSk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCsrO1xuICAgICAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgMjApO1xuICAgIH1cbn07XG5mdW5jdGlvbiBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgZGVsYXkpIHtcbiAgICBjbGVhclRpbWVvdXQodmlldy5pbnB1dC5jb21wb3NpbmdUaW1lb3V0KTtcbiAgICBpZiAoZGVsYXkgPiAtMSlcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBlbmRDb21wb3NpdGlvbih2aWV3KSwgZGVsYXkpO1xufVxuZnVuY3Rpb24gY2xlYXJDb21wb3NpdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0ID0gdGltZXN0YW1wRnJvbUN1c3RvbUV2ZW50KCk7XG4gICAgfVxuICAgIHdoaWxlICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZXMubGVuZ3RoID4gMClcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLnBvcCgpLm1hcmtQYXJlbnRzRGlydHkoKTtcbn1cbmZ1bmN0aW9uIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdGV4dEJlZm9yZSA9IHRleHROb2RlQmVmb3JlJDEoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dEFmdGVyID0gdGV4dE5vZGVBZnRlciQxKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgaWYgKHRleHRCZWZvcmUgJiYgdGV4dEFmdGVyICYmIHRleHRCZWZvcmUgIT0gdGV4dEFmdGVyKSB7XG4gICAgICAgIGxldCBkZXNjQWZ0ZXIgPSB0ZXh0QWZ0ZXIucG1WaWV3RGVzYywgbGFzdENoYW5nZWQgPSB2aWV3LmRvbU9ic2VydmVyLmxhc3RDaGFuZ2VkVGV4dE5vZGU7XG4gICAgICAgIGlmICh0ZXh0QmVmb3JlID09IGxhc3RDaGFuZ2VkIHx8IHRleHRBZnRlciA9PSBsYXN0Q2hhbmdlZClcbiAgICAgICAgICAgIHJldHVybiBsYXN0Q2hhbmdlZDtcbiAgICAgICAgaWYgKCFkZXNjQWZ0ZXIgfHwgIWRlc2NBZnRlci5pc1RleHQodGV4dEFmdGVyLm5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGUgPT0gdGV4dEFmdGVyKSB7XG4gICAgICAgICAgICBsZXQgZGVzY0JlZm9yZSA9IHRleHRCZWZvcmUucG1WaWV3RGVzYztcbiAgICAgICAgICAgIGlmICghKCFkZXNjQmVmb3JlIHx8ICFkZXNjQmVmb3JlLmlzVGV4dCh0ZXh0QmVmb3JlLm5vZGVWYWx1ZSkpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHRCZWZvcmUgfHwgdGV4dEFmdGVyO1xufVxuZnVuY3Rpb24gdGltZXN0YW1wRnJvbUN1c3RvbUV2ZW50KCkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwiZXZlbnRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcDtcbn1cbi8qKlxuQGludGVybmFsXG4qL1xuZnVuY3Rpb24gZW5kQ29tcG9zaXRpb24odmlldywgcmVzdGFydGluZyA9IGZhbHNlKSB7XG4gICAgaWYgKGFuZHJvaWQgJiYgdmlldy5kb21PYnNlcnZlci5mbHVzaGluZ1Nvb24gPj0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIGNsZWFyQ29tcG9zaXRpb24odmlldyk7XG4gICAgaWYgKHJlc3RhcnRpbmcgfHwgdmlldy5kb2NWaWV3ICYmIHZpZXcuZG9jVmlldy5kaXJ0eSkge1xuICAgICAgICBsZXQgc2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3KSwgY3VyID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcShjdXIpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpKTtcbiAgICAgICAgZWxzZSBpZiAoKHZpZXcubWFya0N1cnNvciB8fCByZXN0YXJ0aW5nKSAmJiAhY3VyLiRmcm9tLm5vZGUoY3VyLiRmcm9tLnNoYXJlZERlcHRoKGN1ci50bykpLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlU2VsZWN0aW9uKCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2FwdHVyZUNvcHkodmlldywgZG9tKSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGlmICghdmlldy5kb20ucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB3cmFwID0gdmlldy5kb20ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgd3JhcC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZG9tKTtcbiAgICAvLyBEb25lIGJlY2F1c2UgSUUgd2lsbCBmaXJlIGEgc2VsZWN0aW9uY2hhbmdlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgLy8gdG8gaXRzIHN0YXJ0IHdoZW4gcmVtb3ZlQWxsUmFuZ2VzIGlzIGNhbGxlZCBhbmQgdGhlIGVkaXRvciBzdGlsbFxuICAgIC8vIGhhcyBmb2N1cyAod2hpY2ggd2lsbCBtZXNzIHVwIHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gc3RhdGUpLlxuICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHdyYXAucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSeKAlGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChpZSAmJiBpZV92ZXJzaW9uIDwgMTUpIHx8XG4gICAgKGlvcyAmJiB3ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5oYW5kbGVycy5jb3B5ID0gZWRpdEhhbmRsZXJzLmN1dCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBjdXQgPSBldmVudC50eXBlID09IFwiY3V0XCI7XG4gICAgaWYgKHNlbC5lbXB0eSlcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIElFIGFuZCBFZGdlJ3MgY2xpcGJvYXJkIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGJyb2tlblxuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHNsaWNlID0gc2VsLmNvbnRlbnQoKSwgeyBkb20sIHRleHQgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBzbGljZSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZUNvcHkodmlldywgZG9tKTtcbiAgICB9XG4gICAgaWYgKGN1dClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJjdXRcIikpO1xufTtcbmZ1bmN0aW9uIHNsaWNlU2luZ2xlTm9kZShzbGljZSkge1xuICAgIHJldHVybiBzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5vcGVuRW5kID09IDAgJiYgc2xpY2UuY29udGVudC5jaGlsZENvdW50ID09IDEgPyBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQgOiBudWxsO1xufVxuZnVuY3Rpb24gY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHBsYWluVGV4dCA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCB0YXJnZXQgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGxhaW5UZXh0ID8gXCJ0ZXh0YXJlYVwiIDogXCJkaXZcIikpO1xuICAgIGlmICghcGxhaW5UZXh0KVxuICAgICAgICB0YXJnZXQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUpXG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpO1xuICAgICAgICBpZiAocGxhaW5UZXh0KVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUsIG51bGwsIHBsYWluLCBldmVudCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnRleHRDb250ZW50LCB0YXJnZXQuaW5uZXJIVE1MLCBwbGFpbiwgZXZlbnQpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIGV2ZW50KSB7XG4gICAgbGV0IHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHByZWZlclBsYWluLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVQYXN0ZVwiLCBmID0+IGYodmlldywgZXZlbnQsIHNsaWNlIHx8IFNsaWNlLmVtcHR5KSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2luZ2xlTm9kZSA9IHNsaWNlU2luZ2xlTm9kZShzbGljZSk7XG4gICAgbGV0IHRyID0gc2luZ2xlTm9kZVxuICAgICAgICA/IHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoc2luZ2xlTm9kZSwgcHJlZmVyUGxhaW4pXG4gICAgICAgIDogdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uKHNsaWNlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInBhc3RlXCIsIHRydWUpLnNldE1ldGEoXCJ1aUV2ZW50XCIsIFwicGFzdGVcIikpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0VGV4dChjbGlwYm9hcmREYXRhKSB7XG4gICAgbGV0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHRleHQpXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGxldCB1cmlzID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKTtcbiAgICByZXR1cm4gdXJpcyA/IHVyaXMucmVwbGFjZSgvXFxyP1xcbi9nLCBcIiBcIikgOiBcIlwiO1xufVxuZWRpdEhhbmRsZXJzLnBhc3RlID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBIYW5kbGluZyBwYXN0ZSBmcm9tIEphdmFTY3JpcHQgZHVyaW5nIGNvbXBvc2l0aW9uIGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gaGFuZGxlZCBieSBicm93c2Vycywgc28gYXMgYSBkb2RneSBidXQgcHJlZmVyYWJsZSBrbHVkZ2UsIHdlIGp1c3RcbiAgICAvLyBsZXQgdGhlIGJyb3dzZXIgZG8gaXRzIG5hdGl2ZSB0aGluZyB0aGVyZSwgZXhjZXB0IG9uIEFuZHJvaWQsXG4gICAgLy8gd2hlcmUgdGhlIGVkaXRvciBpcyBhbG1vc3QgYWx3YXlzIGNvbXBvc2luZy5cbiAgICBpZiAodmlldy5jb21wb3NpbmcgJiYgIWFuZHJvaWQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZGF0YSA9IGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5jbGlwYm9hcmREYXRhO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBpZiAoZGF0YSAmJiBkb1Bhc3RlKHZpZXcsIGdldFRleHQoZGF0YSksIGRhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgcGxhaW4sIGV2ZW50KSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBlbHNlXG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3LCBldmVudCk7XG59O1xuY2xhc3MgRHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKHNsaWNlLCBtb3ZlLCBub2RlKSB7XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5jb25zdCBkcmFnQ29weU1vZGlmaWVyID0gbWFjID8gXCJhbHRLZXlcIiA6IFwiY3RybEtleVwiO1xuZnVuY3Rpb24gZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IG1vdmVzID0gdmlldy5zb21lUHJvcChcImRyYWdDb3BpZXNcIiwgdGVzdCA9PiAhdGVzdChldmVudCkpO1xuICAgIHJldHVybiBtb3ZlcyAhPSBudWxsID8gbW92ZXMgOiAhZXZlbnRbZHJhZ0NvcHlNb2RpZmllcl07XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIGxldCBtb3VzZURvd24gPSB2aWV3LmlucHV0Lm1vdXNlRG93bjtcbiAgICBpZiAobW91c2VEb3duKVxuICAgICAgICBtb3VzZURvd24uZG9uZSgpO1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwb3MgPSBzZWwuZW1wdHkgPyBudWxsIDogdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGxldCBub2RlO1xuICAgIGlmIChwb3MgJiYgcG9zLnBvcyA+PSBzZWwuZnJvbSAmJiBwb3MucG9zIDw9IChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uID8gc2VsLnRvIC0gMSA6IHNlbC50bykpIDtcbiAgICBlbHNlIGlmIChtb3VzZURvd24gJiYgbW91c2VEb3duLm1pZ2h0RHJhZykge1xuICAgICAgICBub2RlID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIG1vdXNlRG93bi5taWdodERyYWcucG9zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGV2ZW50LnRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlICYmIGRlc2MgIT0gdmlldy5kb2NWaWV3KVxuICAgICAgICAgICAgbm9kZSA9IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBkZXNjLnBvc0JlZm9yZSk7XG4gICAgfVxuICAgIGxldCBkcmFnZ2VkU2xpY2UgPSAobm9kZSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbikuY29udGVudCgpO1xuICAgIGxldCB7IGRvbSwgdGV4dCwgc2xpY2UgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBkcmFnZ2VkU2xpY2UpO1xuICAgIC8vIFByZS0xMjAgQ2hyb21lIHZlcnNpb25zIGNsZWFyIGZpbGVzIHdoZW4gY2FsbGluZyBgY2xlYXJEYXRhYCAoIzE0NzIpXG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoIHx8ICFjaHJvbWUgfHwgY2hyb21lX3ZlcnNpb24gPiAxMjApXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5jbGVhckRhdGEoKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShicm9rZW5DbGlwYm9hcmRBUEkgPyBcIlRleHRcIiA6IFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzExNTZcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcbiAgICBpZiAoIWJyb2tlbkNsaXBib2FyZEFQSSlcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIHZpZXcuZHJhZ2dpbmcgPSBuZXcgRHJhZ2dpbmcoc2xpY2UsIGRyYWdNb3Zlcyh2aWV3LCBldmVudCksIG5vZGUpO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuZHJhZ2dpbmcgPT0gZHJhZ2dpbmcpXG4gICAgICAgICAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICB9LCA1MCk7XG59O1xuZWRpdEhhbmRsZXJzLmRyYWdvdmVyID0gZWRpdEhhbmRsZXJzLmRyYWdlbnRlciA9IChfLCBlKSA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5lZGl0SGFuZGxlcnMuZHJvcCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IGRyYWdnaW5nID0gdmlldy5kcmFnZ2luZztcbiAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBldmVudFBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIWV2ZW50UG9zKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0ICRtb3VzZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZXZlbnRQb3MucG9zKTtcbiAgICBsZXQgc2xpY2UgPSBkcmFnZ2luZyAmJiBkcmFnZ2luZy5zbGljZTtcbiAgICBpZiAoc2xpY2UpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzbGljZSA9IHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCBnZXRUZXh0KGV2ZW50LmRhdGFUcmFuc2ZlciksIGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgZmFsc2UsICRtb3VzZSk7XG4gICAgfVxuICAgIGxldCBtb3ZlID0gISEoZHJhZ2dpbmcgJiYgZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVEcm9wXCIsIGYgPT4gZih2aWV3LCBldmVudCwgc2xpY2UgfHwgU2xpY2UuZW1wdHksIG1vdmUpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBpbnNlcnRQb3MgPSBzbGljZSA/IGRyb3BQb2ludCh2aWV3LnN0YXRlLmRvYywgJG1vdXNlLnBvcywgc2xpY2UpIDogJG1vdXNlLnBvcztcbiAgICBpZiAoaW5zZXJ0UG9zID09IG51bGwpXG4gICAgICAgIGluc2VydFBvcyA9ICRtb3VzZS5wb3M7XG4gICAgbGV0IHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICBpZiAobW92ZSkge1xuICAgICAgICBsZXQgeyBub2RlIH0gPSBkcmFnZ2luZztcbiAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICBub2RlLnJlcGxhY2UodHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgbGV0IHBvcyA9IHRyLm1hcHBpbmcubWFwKGluc2VydFBvcyk7XG4gICAgbGV0IGlzTm9kZSA9IHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLm9wZW5FbmQgPT0gMCAmJiBzbGljZS5jb250ZW50LmNoaWxkQ291bnQgPT0gMTtcbiAgICBsZXQgYmVmb3JlSW5zZXJ0ID0gdHIuZG9jO1xuICAgIGlmIChpc05vZGUpXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgocG9zLCBwb3MsIHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0ci5yZXBsYWNlUmFuZ2UocG9zLCBwb3MsIHNsaWNlKTtcbiAgICBpZiAodHIuZG9jLmVxKGJlZm9yZUluc2VydCkpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgJHBvcyA9IHRyLmRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKGlzTm9kZSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpICYmXG4gICAgICAgICRwb3Mubm9kZUFmdGVyICYmICRwb3Mubm9kZUFmdGVyLnNhbWVNYXJrdXAoc2xpY2UuY29udGVudC5maXJzdENoaWxkKSkge1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24obmV3IE5vZGVTZWxlY3Rpb24oJHBvcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGVuZCA9IHRyLm1hcHBpbmcubWFwKGluc2VydFBvcyk7XG4gICAgICAgIHRyLm1hcHBpbmcubWFwc1t0ci5tYXBwaW5nLm1hcHMubGVuZ3RoIC0gMV0uZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiBlbmQgPSBuZXdUbyk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRwb3MsIHRyLmRvYy5yZXNvbHZlKGVuZCkpKTtcbiAgICB9XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJkcm9wXCIpKTtcbn07XG5oYW5kbGVycy5mb2N1cyA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoIXZpZXcuZm9jdXNlZCkge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgdmlldy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5kb2NWaWV3ICYmIHZpZXcuaGFzRm9jdXMoKSAmJiAhdmlldy5kb21PYnNlcnZlci5jdXJyZW50U2VsZWN0aW9uLmVxKHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSkpXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgICAgIH0sIDIwKTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmx1ciA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgaWYgKHZpZXcuZm9jdXNlZCkge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgdmlldy5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgdmlldy5mb2N1c2VkID0gZmFsc2U7XG4gICAgfVxufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgZG8gbW9yZSB3aXRoIGJlZm9yZWlucHV0IGV2ZW50cywgYnV0IHN1cHBvcnRcbiAgICAvLyBpcyBzbyBzcG90dHkgdGhhdCBJJ20gc3RpbGwgd2FpdGluZyB0byBzZWUgd2hlcmUgdGhleSBhcmUgZ29pbmcuXG4gICAgLy8gVmVyeSBzcGVjaWZpYyBoYWNrIHRvIGRlYWwgd2l0aCBiYWNrc3BhY2Ugc29tZXRpbWVzIGZhaWxpbmcgb25cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCB3aGVuIGFmdGVyIGFuIHVuZWRpdGFibGUgbm9kZS5cbiAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiYgZXZlbnQuaW5wdXRUeXBlID09IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIpIHtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICAgICAgbGV0IHsgZG9tQ2hhbmdlQ291bnQgfSA9IHZpZXcuaW5wdXQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQuZG9tQ2hhbmdlQ291bnQgIT0gZG9tQ2hhbmdlQ291bnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBFdmVudCBhbHJlYWR5IGhhZCBzb21lIGVmZmVjdFxuICAgICAgICAgICAgLy8gVGhpcyBidWcgdGVuZHMgdG8gY2xvc2UgdGhlIHZpcnR1YWwga2V5Ym9hcmQsIHNvIHdlIHJlZm9jdXNcbiAgICAgICAgICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoOCwgXCJCYWNrc3BhY2VcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgeyAkY3Vyc29yIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIC8vIENydWRlIGFwcHJveGltYXRpb24gb2YgYmFja3NwYWNlIGJlaGF2aW9yIHdoZW4gbm8gY29tbWFuZCBoYW5kbGVkIGl0XG4gICAgICAgICAgICBpZiAoJGN1cnNvciAmJiAkY3Vyc29yLnBvcyA+IDApXG4gICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZSgkY3Vyc29yLnBvcyAtIDEsICRjdXJzb3IucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfSwgNTApO1xuICAgIH1cbn07XG4vLyBNYWtlIHN1cmUgYWxsIGhhbmRsZXJzIGdldCByZWdpc3RlcmVkXG5mb3IgKGxldCBwcm9wIGluIGVkaXRIYW5kbGVycylcbiAgICBoYW5kbGVyc1twcm9wXSA9IGVkaXRIYW5kbGVyc1twcm9wXTtcblxuZnVuY3Rpb24gY29tcGFyZU9ianMoYSwgYikge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGZvciAobGV0IHAgaW4gYSlcbiAgICAgICAgaWYgKGFbcF0gIT09IGJbcF0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgcCBpbiBiKVxuICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodG9ET00sIHNwZWMpIHtcbiAgICAgICAgdGhpcy50b0RPTSA9IHRvRE9NO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjIHx8IG5vU3BlYztcbiAgICAgICAgdGhpcy5zaWRlID0gdGhpcy5zcGVjLnNpZGUgfHwgMDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcsIHNwYW4sIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGxldCB7IHBvcywgZGVsZXRlZCB9ID0gbWFwcGluZy5tYXBSZXN1bHQoc3Bhbi5mcm9tICsgb2xkT2Zmc2V0LCB0aGlzLnNpZGUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBudWxsIDogbmV3IERlY29yYXRpb24ocG9zIC0gb2Zmc2V0LCBwb3MgLSBvZmZzZXQsIHRoaXMpO1xuICAgIH1cbiAgICB2YWxpZCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0VHlwZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLnNwZWMua2V5ICYmIHRoaXMuc3BlYy5rZXkgPT0gb3RoZXIuc3BlYy5rZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0RPTSA9PSBvdGhlci50b0RPTSAmJiBjb21wYXJlT2Jqcyh0aGlzLnNwZWMsIG90aGVyLnNwZWMpKSk7XG4gICAgfVxuICAgIGRlc3Ryb3kobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveShub2RlKTtcbiAgICB9XG59XG5jbGFzcyBJbmxpbmVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc3BlYy5pbmNsdXNpdmVTdGFydCA/IC0xIDogMSkgLSBvZmZzZXQ7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwKHNwYW4udG8gKyBvbGRPZmZzZXQsIHRoaXMuc3BlYy5pbmNsdXNpdmVFbmQgPyAxIDogLTEpIC0gb2Zmc2V0O1xuICAgICAgICByZXR1cm4gZnJvbSA+PSB0byA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKF8sIHNwYW4pIHsgcmV0dXJuIHNwYW4uZnJvbSA8IHNwYW4udG87IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgSW5saW5lVHlwZSAmJiBjb21wYXJlT2Jqcyh0aGlzLmF0dHJzLCBvdGhlci5hdHRycykgJiZcbiAgICAgICAgICAgICAgICBjb21wYXJlT2Jqcyh0aGlzLnNwZWMsIG90aGVyLnNwZWMpKTtcbiAgICB9XG4gICAgc3RhdGljIGlzKHNwYW4pIHsgcmV0dXJuIHNwYW4udHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGU7IH1cbiAgICBkZXN0cm95KCkgeyB9XG59XG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoYXR0cnMsIHNwZWMpIHtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjIHx8IG5vU3BlYztcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcsIHNwYW4sIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQoc3Bhbi5mcm9tICsgb2xkT2Zmc2V0LCAxKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLnRvICsgb2xkT2Zmc2V0LCAtMSk7XG4gICAgICAgIGlmICh0by5kZWxldGVkIHx8IHRvLnBvcyA8PSBmcm9tLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbS5wb3MgLSBvZmZzZXQsIHRvLnBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKG5vZGUsIHNwYW4pIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChzcGFuLmZyb20pLCBjaGlsZDtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBzcGFuLmZyb20gJiYgIShjaGlsZCA9IG5vZGUuY2hpbGQoaW5kZXgpKS5pc1RleHQgJiYgb2Zmc2V0ICsgY2hpbGQubm9kZVNpemUgPT0gc3Bhbi50bztcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIChvdGhlciBpbnN0YW5jZW9mIE5vZGVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBkZXN0cm95KCkgeyB9XG59XG4vKipcbkRlY29yYXRpb24gb2JqZWN0cyBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIHZpZXcgdGhyb3VnaCB0aGVcbltgZGVjb3JhdGlvbnNgIHByb3BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmRlY29yYXRpb25zKS4gVGhleSBjb21lIGluXG5zZXZlcmFsIHZhcmlhbnRz4oCUc2VlIHRoZSBzdGF0aWMgbWVtYmVycyBvZiB0aGlzIGNsYXNzIGZvciBkZXRhaWxzLlxuKi9cbmNsYXNzIERlY29yYXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvcmF0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbi4gV2lsbCBiZSB0aGUgc2FtZSBhcyBgZnJvbWAgZm9yIFt3aWRnZXRcbiAgICBkZWNvcmF0aW9uc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl53aWRnZXQpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHlwZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29weShmcm9tLCB0bykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIHRoaXMudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZXEob3RoZXIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lcShvdGhlci50eXBlKSAmJiB0aGlzLmZyb20gKyBvZmZzZXQgPT0gb3RoZXIuZnJvbSAmJiB0aGlzLnRvICsgb2Zmc2V0ID09IG90aGVyLnRvO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLm1hcChtYXBwaW5nLCB0aGlzLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZXMgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggaXMgYSBET00gbm9kZSB0aGF0J3Mgc2hvd24gaW5cbiAgICB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdVxuICAgIGRlbGF5IHJlbmRlcmluZyB0aGUgd2lkZ2V0IGJ5IHBhc3NpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmVcbiAgICBjYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGFjdHVhbGx5IGRyYXduIGluIGEgdmlldywgYnV0IHlvdSBjYW5cbiAgICBhbHNvIGRpcmVjdGx5IHBhc3MgYSBET00gbm9kZS4gYGdldFBvc2AgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGVcbiAgICB3aWRnZXQncyBjdXJyZW50IGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHdpZGdldChwb3MsIHRvRE9NLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihwb3MsIHBvcywgbmV3IFdpZGdldFR5cGUodG9ET00sIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhbiBpbmxpbmUgZGVjb3JhdGlvbiwgd2hpY2ggYWRkcyB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0b1xuICAgIGVhY2ggaW5saW5lIG5vZGUgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBzdGF0aWMgaW5saW5lKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBJbmxpbmVUeXBlKGF0dHJzLCBzcGVjKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZXMgYSBub2RlIGRlY29yYXRpb24uIGBmcm9tYCBhbmQgYHRvYCBzaG91bGQgcG9pbnQgcHJlY2lzZWx5XG4gICAgYmVmb3JlIGFuZCBhZnRlciBhIG5vZGUgaW4gdGhlIGRvY3VtZW50LiBUaGF0IG5vZGUsIGFuZCBvbmx5IHRoYXRcbiAgICBub2RlLCB3aWxsIHJlY2VpdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZShmcm9tLCB0bywgYXR0cnMsIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCBuZXcgTm9kZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNwZWMgcHJvdmlkZWQgd2hlbiBjcmVhdGluZyB0aGlzIGRlY29yYXRpb24uIENhbiBiZSB1c2VmdWxcbiAgICBpZiB5b3UndmUgc3RvcmVkIGV4dHJhIGluZm9ybWF0aW9uIGluIHRoYXQgb2JqZWN0LlxuICAgICovXG4gICAgZ2V0IHNwZWMoKSB7IHJldHVybiB0aGlzLnR5cGUuc3BlYzsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlubGluZSgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7IHJldHVybiB0aGlzLnR5cGUgaW5zdGFuY2VvZiBXaWRnZXRUeXBlOyB9XG59XG5jb25zdCBub25lID0gW10sIG5vU3BlYyA9IHt9O1xuLyoqXG5BIGNvbGxlY3Rpb24gb2YgW2RlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKSwgb3JnYW5pemVkIGluIHN1Y2hcbmEgd2F5IHRoYXQgdGhlIGRyYXdpbmcgYWxnb3JpdGhtIGNhbiBlZmZpY2llbnRseSB1c2UgYW5kIGNvbXBhcmVcbnRoZW0uIFRoaXMgaXMgYSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJl4oCUaXQgaXMgbm90IG1vZGlmaWVkLFxudXBkYXRlcyBjcmVhdGUgYSBuZXcgdmFsdWUuXG4qL1xuY2xhc3MgRGVjb3JhdGlvblNldCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2NhbCwgY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsLmxlbmd0aCA/IGxvY2FsIDogbm9uZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuIDogbm9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zLCB1c2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBnaXZlblxuICAgIGRvY3VtZW50LiBUaGlzIHdpbGwgY29uc3VtZSAobW9kaWZ5KSB0aGUgYGRlY29yYXRpb25zYCBhcnJheSwgc29cbiAgICB5b3UgbXVzdCBtYWtlIGEgY29weSBpZiB5b3Ugd2FudCBuZWVkIHRvIHByZXNlcnZlIHRoYXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRpb25zLmxlbmd0aCA/IGJ1aWxkVHJlZShkZWNvcmF0aW9ucywgZG9jLCAwLCBub1NwZWMpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYWxsIGRlY29yYXRpb25zIGluIHRoaXMgc2V0IHdoaWNoIHRvdWNoIHRoZSBnaXZlbiByYW5nZVxuICAgIChpbmNsdWRpbmcgZGVjb3JhdGlvbnMgdGhhdCBzdGFydCBvciBlbmQgZGlyZWN0bHkgYXQgdGhlXG4gICAgYm91bmRhcmllcykgYW5kIG1hdGNoIHRoZSBnaXZlbiBwcmVkaWNhdGUgb24gdGhlaXIgc3BlYy4gV2hlblxuICAgIGBzdGFydGAgYW5kIGBlbmRgIGFyZSBvbWl0dGVkLCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhlIHNldCBhcmVcbiAgICBjb25zaWRlcmVkLiBXaGVuIGBwcmVkaWNhdGVgIGlzbid0IGdpdmVuLCBhbGwgZGVjb3JhdGlvbnMgYXJlXG4gICAgYXNzdW1lZCB0byBtYXRjaC5cbiAgICAqL1xuICAgIGZpbmQoc3RhcnQsIGVuZCwgcHJlZGljYXRlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5maW5kSW5uZXIoc3RhcnQgPT0gbnVsbCA/IDAgOiBzdGFydCwgZW5kID09IG51bGwgPyAxZTkgOiBlbmQsIHJlc3VsdCwgMCwgcHJlZGljYXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmluZElubmVyKHN0YXJ0LCBlbmQsIHJlc3VsdCwgb2Zmc2V0LCBwcmVkaWNhdGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BhbiA9IHRoaXMubG9jYWxbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGVuZCAmJiBzcGFuLnRvID49IHN0YXJ0ICYmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShzcGFuLnNwZWMpKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFuLmNvcHkoc3Bhbi5mcm9tICsgb2Zmc2V0LCBzcGFuLnRvICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA8IGVuZCAmJiB0aGlzLmNoaWxkcmVuW2kgKyAxXSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkT2ZmID0gdGhpcy5jaGlsZHJlbltpXSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpICsgMl0uZmluZElubmVyKHN0YXJ0IC0gY2hpbGRPZmYsIGVuZCAtIGNoaWxkT2ZmLCByZXN1bHQsIG9mZnNldCArIGNoaWxkT2ZmLCBwcmVkaWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGUgc2V0IG9mIGRlY29yYXRpb25zIGluIHJlc3BvbnNlIHRvIGEgY2hhbmdlIGluIHRoZVxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIGRvYywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSB8fCBtYXBwaW5nLm1hcHMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwSW5uZXIobWFwcGluZywgZG9jLCAwLCAwLCBvcHRpb25zIHx8IG5vU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwSW5uZXIobWFwcGluZywgbm9kZSwgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG5ld0xvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQgPSB0aGlzLmxvY2FsW2ldLm1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgICAgICAgICBpZiAobWFwcGVkICYmIG1hcHBlZC50eXBlLnZhbGlkKG5vZGUsIG1hcHBlZCkpXG4gICAgICAgICAgICAgICAgKG5ld0xvY2FsIHx8IChuZXdMb2NhbCA9IFtdKSkucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKHRoaXMubG9jYWxbaV0uc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG1hcENoaWxkcmVuKHRoaXMuY2hpbGRyZW4sIG5ld0xvY2FsIHx8IFtdLCBtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXdMb2NhbCA/IG5ldyBEZWNvcmF0aW9uU2V0KG5ld0xvY2FsLnNvcnQoYnlQb3MpLCBub25lKSA6IGVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb25zIHRvIHRoZSBvbmVzIGluIHRoZSBzZXQsXG4gICAgcHJvZHVjaW5nIGEgbmV3IHNldC4gQ29uc3VtZXMgdGhlIGBkZWNvcmF0aW9uc2AgYXJyYXkuIE5lZWRzXG4gICAgYWNjZXNzIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50IHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHJlZVxuICAgIHN0cnVjdHVyZS5cbiAgICAqL1xuICAgIGFkZChkb2MsIGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmICghZGVjb3JhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgYWRkSW5uZXIoZG9jLCBkZWNvcmF0aW9ucywgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiwgY2hpbGRJbmRleCA9IDA7XG4gICAgICAgIGRvYy5mb3JFYWNoKChjaGlsZE5vZGUsIGNoaWxkT2Zmc2V0KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmFzZU9mZnNldCA9IGNoaWxkT2Zmc2V0ICsgb2Zmc2V0LCBmb3VuZDtcbiAgICAgICAgICAgIGlmICghKGZvdW5kID0gdGFrZVNwYW5zRm9yTm9kZShkZWNvcmF0aW9ucywgY2hpbGROb2RlLCBiYXNlT2Zmc2V0KSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZEluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2NoaWxkSW5kZXhdIDwgY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkSW5kZXhdID09IGNoaWxkT2Zmc2V0KVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkSW5kZXggKyAyXSA9IGNoaWxkcmVuW2NoaWxkSW5kZXggKyAyXS5hZGRJbm5lcihjaGlsZE5vZGUsIGZvdW5kLCBiYXNlT2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDAsIGNoaWxkT2Zmc2V0LCBjaGlsZE9mZnNldCArIGNoaWxkTm9kZS5ub2RlU2l6ZSwgYnVpbGRUcmVlKGZvdW5kLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQgKyAxLCBub1NwZWMpKTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMztcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsb2NhbCA9IG1vdmVTcGFucyhjaGlsZEluZGV4ID8gd2l0aG91dE51bGxzKGRlY29yYXRpb25zKSA6IGRlY29yYXRpb25zLCAtb2Zmc2V0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghbG9jYWxbaV0udHlwZS52YWxpZChkb2MsIGxvY2FsW2ldKSlcbiAgICAgICAgICAgICAgICBsb2NhbC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLmxlbmd0aCA/IHRoaXMubG9jYWwuY29uY2F0KGxvY2FsKS5zb3J0KGJ5UG9zKSA6IHRoaXMubG9jYWwsIGNoaWxkcmVuIHx8IHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgc2V0IHRoYXQgY29udGFpbnMgdGhlIGRlY29yYXRpb25zIGluIHRoaXMgc2V0LCBtaW51c1xuICAgIHRoZSBvbmVzIGluIHRoZSBnaXZlbiBhcnJheS5cbiAgICAqL1xuICAgIHJlbW92ZShkZWNvcmF0aW9ucykge1xuICAgICAgICBpZiAoZGVjb3JhdGlvbnMubGVuZ3RoID09IDAgfHwgdGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJbm5lcihkZWNvcmF0aW9ucywgMCk7XG4gICAgfVxuICAgIHJlbW92ZUlubmVyKGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiwgbG9jYWwgPSB0aGlzLmxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQ7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNoaWxkcmVuW2ldICsgb2Zmc2V0LCB0byA9IGNoaWxkcmVuW2kgKyAxXSArIG9mZnNldDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBzcGFuOyBqIDwgZGVjb3JhdGlvbnMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgaWYgKHNwYW4gPSBkZWNvcmF0aW9uc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbi5mcm9tID4gZnJvbSAmJiBzcGFuLnRvIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRpb25zW2pdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIChmb3VuZCB8fCAoZm91bmQgPSBbXSkpLnB1c2goc3Bhbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IGNoaWxkcmVuW2kgKyAyXS5yZW1vdmVJbm5lcihmb3VuZCwgZnJvbSArIDEpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWQgIT0gZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMl0gPSByZW1vdmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDMpO1xuICAgICAgICAgICAgICAgIGkgLT0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWwubGVuZ3RoKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHNwYW47IGkgPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWwubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxbal0uZXEoc3Bhbiwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCA9PSB0aGlzLmxvY2FsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IHRoaXMubG9jYWwuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbiA9PSB0aGlzLmNoaWxkcmVuICYmIGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIGxvY2FsLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPyBuZXcgRGVjb3JhdGlvblNldChsb2NhbCwgY2hpbGRyZW4pIDogZW1wdHk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgbm9kZSkge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5lbXB0eTtcbiAgICAgICAgbGV0IGNoaWxkLCBsb2NhbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gPT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baSArIDJdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBvZmZzZXQgKyAxLCBlbmQgPSBzdGFydCArIG5vZGUuY29udGVudC5zaXplO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkZWMgPSB0aGlzLmxvY2FsW2ldO1xuICAgICAgICAgICAgaWYgKGRlYy5mcm9tIDwgZW5kICYmIGRlYy50byA+IHN0YXJ0ICYmIChkZWMudHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChzdGFydCwgZGVjLmZyb20pIC0gc3RhcnQsIHRvID0gTWF0aC5taW4oZW5kLCBkZWMudG8pIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCB0bylcbiAgICAgICAgICAgICAgICAgICAgKGxvY2FsIHx8IChsb2NhbCA9IFtdKSkucHVzaChkZWMuY29weShmcm9tLCB0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgbGV0IGxvY2FsU2V0ID0gbmV3IERlY29yYXRpb25TZXQobG9jYWwuc29ydChieVBvcyksIG5vbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkID8gbmV3IERlY29yYXRpb25Hcm91cChbbG9jYWxTZXQsIGNoaWxkXSkgOiBsb2NhbFNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGQgfHwgZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0KSB8fFxuICAgICAgICAgICAgdGhpcy5sb2NhbC5sZW5ndGggIT0gb3RoZXIubG9jYWwubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmxlbmd0aCAhPSBvdGhlci5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2NhbFtpXS5lcShvdGhlci5sb2NhbFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSAhPSBvdGhlci5jaGlsZHJlbltpXSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baSArIDFdICE9IG90aGVyLmNoaWxkcmVuW2kgKyAxXSB8fFxuICAgICAgICAgICAgICAgICF0aGlzLmNoaWxkcmVuW2kgKyAyXS5lcShvdGhlci5jaGlsZHJlbltpICsgMl0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9jYWxzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZU92ZXJsYXAodGhpcy5sb2NhbHNJbm5lcihub2RlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9jYWxzSW5uZXIobm9kZSkge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBub25lO1xuICAgICAgICBpZiAobm9kZS5pbmxpbmVDb250ZW50IHx8ICF0aGlzLmxvY2FsLnNvbWUoSW5saW5lVHlwZS5pcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMubG9jYWxbaV0udHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubG9jYWxbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZvckVhY2hTZXQoZikgeyBmKHRoaXMpOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvblNldC5lbXB0eSA9IG5ldyBEZWNvcmF0aW9uU2V0KFtdLCBbXSk7XG4vKipcbkBpbnRlcm5hbFxuKi9cbkRlY29yYXRpb25TZXQucmVtb3ZlT3ZlcmxhcCA9IHJlbW92ZU92ZXJsYXA7XG5jb25zdCBlbXB0eSA9IERlY29yYXRpb25TZXQuZW1wdHk7XG4vLyBBbiBhYnN0cmFjdGlvbiB0aGF0IGFsbG93cyB0aGUgY29kZSBkZWFsaW5nIHdpdGggZGVjb3JhdGlvbnMgdG9cbi8vIHRyZWF0IG11bHRpcGxlIERlY29yYXRpb25TZXQgb2JqZWN0cyBhcyBpZiBpdCB3ZXJlIGEgc2luZ2xlIG9iamVjdFxuLy8gd2l0aCAoYSBzdWJzZXQgb2YpIHRoZSBzYW1lIGludGVyZmFjZS5cbmNsYXNzIERlY29yYXRpb25Hcm91cCB7XG4gICAgY29uc3RydWN0b3IobWVtYmVycykge1xuICAgICAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgZG9jKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZERlY29zID0gdGhpcy5tZW1iZXJzLm1hcChtZW1iZXIgPT4gbWVtYmVyLm1hcChtYXBwaW5nLCBkb2MsIG5vU3BlYykpO1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20obWFwcGVkRGVjb3MpO1xuICAgIH1cbiAgICBmb3JDaGlsZChvZmZzZXQsIGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZC5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5lbXB0eTtcbiAgICAgICAgbGV0IGZvdW5kID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tZW1iZXJzW2ldLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBlbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBEZWNvcmF0aW9uR3JvdXApXG4gICAgICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5jb25jYXQocmVzdWx0Lm1lbWJlcnMpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZvdW5kLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20oZm91bmQpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cCkgfHxcbiAgICAgICAgICAgIG90aGVyLm1lbWJlcnMubGVuZ3RoICE9IHRoaXMubWVtYmVycy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1lbWJlcnNbaV0uZXEob3RoZXIubWVtYmVyc1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbG9jYWxzKG5vZGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCwgc29ydGVkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbHMgPSB0aGlzLm1lbWJlcnNbaV0ubG9jYWxzSW5uZXIobm9kZSk7XG4gICAgICAgICAgICBpZiAoIWxvY2Fscy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxvY2FscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxvY2Fscy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobG9jYWxzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVtb3ZlT3ZlcmxhcChzb3J0ZWQgPyByZXN1bHQgOiByZXN1bHQuc29ydChieVBvcykpIDogbm9uZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBkZWNvcmF0aW9uIHNldHMsIG9yIHJldHVyblxuICAgIC8vIGEgc2luZ2xlIHNldCB3aGVuIHBvc3NpYmxlLlxuICAgIHN0YXRpYyBmcm9tKG1lbWJlcnMpIHtcbiAgICAgICAgc3dpdGNoIChtZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBtZW1iZXJzWzBdO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG5ldyBEZWNvcmF0aW9uR3JvdXAobWVtYmVycy5ldmVyeShtID0+IG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0KSA/IG1lbWJlcnMgOlxuICAgICAgICAgICAgICAgIG1lbWJlcnMucmVkdWNlKChyLCBtKSA9PiByLmNvbmNhdChtIGluc3RhbmNlb2YgRGVjb3JhdGlvblNldCA/IG0gOiBtLm1lbWJlcnMpLCBbXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvckVhY2hTZXQoZikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMubWVtYmVyc1tpXS5mb3JFYWNoU2V0KGYpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKG9sZENoaWxkcmVuLCBuZXdMb2NhbCwgbWFwcGluZywgbm9kZSwgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBvbGRDaGlsZHJlbi5zbGljZSgpO1xuICAgIC8vIE1hcmsgdGhlIGNoaWxkcmVuIHRoYXQgYXJlIGRpcmVjdGx5IHRvdWNoZWQgYnkgY2hhbmdlcywgYW5kXG4gICAgLy8gbW92ZSB0aG9zZSB0aGF0IGFyZSBhZnRlciB0aGUgY2hhbmdlcy5cbiAgICBmb3IgKGxldCBpID0gMCwgYmFzZU9mZnNldCA9IG9sZE9mZnNldDsgaSA8IG1hcHBpbmcubWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbW92ZWQgPSAwO1xuICAgICAgICBtYXBwaW5nLm1hcHNbaV0uZm9yRWFjaCgob2xkU3RhcnQsIG9sZEVuZCwgbmV3U3RhcnQsIG5ld0VuZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGRTaXplID0gKG5ld0VuZCAtIG5ld1N0YXJ0KSAtIChvbGRFbmQgLSBvbGRTdGFydCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGNoaWxkcmVuW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCB8fCBvbGRTdGFydCA+IGVuZCArIGJhc2VPZmZzZXQgLSBtb3ZlZClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY2hpbGRyZW5baV0gKyBiYXNlT2Zmc2V0IC0gbW92ZWQ7XG4gICAgICAgICAgICAgICAgaWYgKG9sZEVuZCA+PSBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSBvbGRTdGFydCA8PSBzdGFydCA/IC0yIDogLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9sZFN0YXJ0ID49IGJhc2VPZmZzZXQgJiYgZFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gKz0gZFNpemU7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSArPSBkU2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb3ZlZCArPSBkU2l6ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJhc2VPZmZzZXQgPSBtYXBwaW5nLm1hcHNbaV0ubWFwKGJhc2VPZmZzZXQsIC0xKTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgY2hpbGQgbm9kZXMgdGhhdCBzdGlsbCBjb3JyZXNwb25kIHRvIGEgc2luZ2xlIG5vZGUsXG4gICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBtYXBJbm5lciBvbiB0aGVtIGFuZCB1cGRhdGUgdGhlaXIgcG9zaXRpb25zLlxuICAgIGxldCBtdXN0UmVidWlsZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPCAwKSB7IC8vIFRvdWNoZWQgbm9kZXNcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPT0gLTIpIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gLTE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0KSwgZnJvbUxvY2FsID0gZnJvbSAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChmcm9tTG9jYWwgPCAwIHx8IGZyb21Mb2NhbCA+PSBub2RlLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE11c3QgcmVhZCBvbGRDaGlsZHJlbiBiZWNhdXNlIGNoaWxkcmVuIHdhcyB0YWdnZWQgd2l0aCAtMVxuICAgICAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAob2xkQ2hpbGRyZW5baSArIDFdICsgb2xkT2Zmc2V0LCAtMSksIHRvTG9jYWwgPSB0byAtIG9mZnNldDtcbiAgICAgICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQ6IGNoaWxkT2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KGZyb21Mb2NhbCk7XG4gICAgICAgICAgICBsZXQgY2hpbGROb2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGRPZmZzZXQgPT0gZnJvbUxvY2FsICYmIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplID09IHRvTG9jYWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hpbGRyZW5baSArIDJdXG4gICAgICAgICAgICAgICAgICAgIC5tYXBJbm5lcihtYXBwaW5nLCBjaGlsZE5vZGUsIGZyb20gKyAxLCBvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgIT0gZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gPSBmcm9tTG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IHRvTG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IC0yO1xuICAgICAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgLy8gUmVtYWluaW5nIGNoaWxkcmVuIG11c3QgYmUgY29sbGVjdGVkIGFuZCByZWJ1aWx0IGludG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZVxuICAgIGlmIChtdXN0UmVidWlsZCkge1xuICAgICAgICBsZXQgZGVjb3JhdGlvbnMgPSBtYXBBbmRHYXRoZXJSZW1haW5pbmdEZWNvcmF0aW9ucyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG5ld0xvY2FsLCBtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucyk7XG4gICAgICAgIGxldCBidWlsdCA9IGJ1aWxkVHJlZShkZWNvcmF0aW9ucywgbm9kZSwgMCwgb3B0aW9ucyk7XG4gICAgICAgIG5ld0xvY2FsID0gYnVpbHQubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdIDwgMCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAzKTtcbiAgICAgICAgICAgICAgICBpIC09IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGJ1aWx0LmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1aWx0LmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bal0gPCBmcm9tKVxuICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShqLCAwLCBidWlsdC5jaGlsZHJlbltpXSwgYnVpbHQuY2hpbGRyZW5baSArIDFdLCBidWlsdC5jaGlsZHJlbltpICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvblNldChuZXdMb2NhbC5zb3J0KGJ5UG9zKSwgY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gbW92ZVNwYW5zKHNwYW5zLCBvZmZzZXQpIHtcbiAgICBpZiAoIW9mZnNldCB8fCAhc3BhbnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3BhbnM7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERlY29yYXRpb24oc3Bhbi5mcm9tICsgb2Zmc2V0LCBzcGFuLnRvICsgb2Zmc2V0LCBzcGFuLnR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1hcEFuZEdhdGhlclJlbWFpbmluZ0RlY29yYXRpb25zKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgZGVjb3JhdGlvbnMsIG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgLy8gR2F0aGVyIGFsbCBkZWNvcmF0aW9ucyBmcm9tIHRoZSByZW1haW5pbmcgbWFya2VkIGNoaWxkcmVuXG4gICAgZnVuY3Rpb24gZ2F0aGVyKHNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gc2V0LmxvY2FsW2ldLm1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMub25SZW1vdmUpXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlbW92ZShzZXQubG9jYWxbaV0uc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBnYXRoZXIoc2V0LmNoaWxkcmVuW2kgKyAyXSwgc2V0LmNoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPT0gLTEpXG4gICAgICAgICAgICBnYXRoZXIoY2hpbGRyZW5baSArIDJdLCBvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmZ1bmN0aW9uIHRha2VTcGFuc0Zvck5vZGUoc3BhbnMsIG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGVuZCA9IG9mZnNldCArIG5vZGUubm9kZVNpemUsIGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgoc3BhbiA9IHNwYW5zW2ldKSAmJiBzcGFuLmZyb20gPiBvZmZzZXQgJiYgc3Bhbi50byA8IGVuZCkge1xuICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgIHNwYW5zW2ldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiB3aXRob3V0TnVsbHMoYXJyYXkpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IG51bGwpXG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEJ1aWxkIHVwIGEgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2V0IG9mIGRlY29yYXRpb25zLiBgb2Zmc2V0YFxuLy8gaXMgYSBiYXNlIG9mZnNldCB0aGF0IHNob3VsZCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGBmcm9tYCBhbmQgYHRvYFxuLy8gcG9zaXRpb25zIGluIHRoZSBzcGFucyAoc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIG5ldyBzcGFuc1xuLy8gZm9yIHJlY3Vyc2l2ZSBjYWxscykuXG5mdW5jdGlvbiBidWlsZFRyZWUoc3BhbnMsIG5vZGUsIG9mZnNldCwgb3B0aW9ucykge1xuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBoYXNOdWxscyA9IGZhbHNlO1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGROb2RlLCBsb2NhbFN0YXJ0KSA9PiB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRha2VTcGFuc0Zvck5vZGUoc3BhbnMsIGNoaWxkTm9kZSwgbG9jYWxTdGFydCArIG9mZnNldCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgaGFzTnVsbHMgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHN1YnRyZWUgPSBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgb2Zmc2V0ICsgbG9jYWxTdGFydCArIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHN1YnRyZWUgIT0gZW1wdHkpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChsb2NhbFN0YXJ0LCBsb2NhbFN0YXJ0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBzdWJ0cmVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBsb2NhbHMgPSBtb3ZlU3BhbnMoaGFzTnVsbHMgPyB3aXRob3V0TnVsbHMoc3BhbnMpIDogc3BhbnMsIC1vZmZzZXQpLnNvcnQoYnlQb3MpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWxvY2Fsc1tpXS50eXBlLnZhbGlkKG5vZGUsIGxvY2Fsc1tpXSkpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUobG9jYWxzW2ldLnNwZWMpO1xuICAgICAgICAgICAgbG9jYWxzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGxvY2Fscy5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoID8gbmV3IERlY29yYXRpb25TZXQobG9jYWxzLCBjaGlsZHJlbikgOiBlbXB0eTtcbn1cbi8vIFVzZWQgdG8gc29ydCBkZWNvcmF0aW9ucyBzbyB0aGF0IG9uZXMgd2l0aCBhIGxvdyBzdGFydCBwb3NpdGlvblxuLy8gY29tZSBmaXJzdCwgYW5kIHdpdGhpbiBhIHNldCB3aXRoIHRoZSBzYW1lIHN0YXJ0IHBvc2l0aW9uLCB0aG9zZVxuLy8gd2l0aCBhbiBzbWFsbGVyIGVuZCBwb3NpdGlvbiBjb21lIGZpcnN0LlxuZnVuY3Rpb24gYnlQb3MoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS50byAtIGIudG87XG59XG4vLyBTY2FuIGEgc29ydGVkIGFycmF5IG9mIGRlY29yYXRpb25zIGZvciBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgc3BhbnMsXG4vLyBhbmQgc3BsaXQgdGhvc2Ugc28gdGhhdCBvbmx5IGZ1bGx5IG92ZXJsYXBwaW5nIHNwYW5zIGFyZSBsZWZ0ICh0b1xuLy8gbWFrZSBzdWJzZXF1ZW50IHJlbmRlcmluZyBlYXNpZXIpLiBXaWxsIHJldHVybiB0aGUgaW5wdXQgYXJyYXkgaWZcbi8vIG5vIHBhcnRpYWxseSBvdmVybGFwcGluZyBzcGFucyBhcmUgZm91bmQgKHRoZSBjb21tb24gY2FzZSkuXG5mdW5jdGlvbiByZW1vdmVPdmVybGFwKHNwYW5zKSB7XG4gICAgbGV0IHdvcmtpbmcgPSBzcGFucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtpbmcubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGxldCBzcGFuID0gd29ya2luZ1tpXTtcbiAgICAgICAgaWYgKHNwYW4uZnJvbSAhPSBzcGFuLnRvKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgd29ya2luZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gd29ya2luZ1tqXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5mcm9tID09IHNwYW4uZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC50byAhPSBzcGFuLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZyA9PSBzcGFucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gc3BhbnMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2VkIGJ5IGEgcGFydGlhbGx5IG92ZXJsYXBwaW5nIGxhcmdlciBzcGFuLiBTcGxpdCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFuLlxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ1tqXSA9IG5leHQuY29weShuZXh0LmZyb20sIHNwYW4udG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWhlYWQod29ya2luZywgaiArIDEsIG5leHQuY29weShzcGFuLnRvLCBuZXh0LnRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5mcm9tIDwgc3Bhbi50bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gc3BhbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IHNwYW5zLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZW5kIG9mIHRoaXMgb25lIG92ZXJsYXBzIHdpdGggYSBzdWJzZXF1ZW50IHNwYW4uIFNwbGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdbaV0gPSBzcGFuLmNvcHkoc3Bhbi5mcm9tLCBuZXh0LmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWhlYWQod29ya2luZywgaiwgc3Bhbi5jb3B5KG5leHQuZnJvbSwgc3Bhbi50bykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmtpbmc7XG59XG5mdW5jdGlvbiBpbnNlcnRBaGVhZChhcnJheSwgaSwgZGVjbykge1xuICAgIHdoaWxlIChpIDwgYXJyYXkubGVuZ3RoICYmIGJ5UG9zKGRlY28sIGFycmF5W2ldKSA+IDApXG4gICAgICAgIGkrKztcbiAgICBhcnJheS5zcGxpY2UoaSwgMCwgZGVjbyk7XG59XG4vLyBHZXQgdGhlIGRlY29yYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBwcm9wcyBvZiBhIHZpZXcuXG5mdW5jdGlvbiB2aWV3RGVjb3JhdGlvbnModmlldykge1xuICAgIGxldCBmb3VuZCA9IFtdO1xuICAgIHZpZXcuc29tZVByb3AoXCJkZWNvcmF0aW9uc1wiLCBmID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGYodmlldy5zdGF0ZSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IGVtcHR5KVxuICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIGlmICh2aWV3LmN1cnNvcldyYXBwZXIpXG4gICAgICAgIGZvdW5kLnB1c2goRGVjb3JhdGlvblNldC5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIFt2aWV3LmN1cnNvcldyYXBwZXIuZGVjb10pKTtcbiAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20oZm91bmQpO1xufVxuXG5jb25zdCBvYnNlcnZlT3B0aW9ucyA9IHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG59O1xuLy8gSUUxMSBoYXMgdmVyeSBicm9rZW4gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB3ZSBhbHNvIGxpc3RlbiB0byBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcbmNvbnN0IHVzZUNoYXJEYXRhID0gaWUgJiYgaWVfdmVyc2lvbiA8PSAxMTtcbmNsYXNzIFNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBzZXQoc2VsKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IHNlbC5hbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IHNlbC5hbmNob3JPZmZzZXQ7XG4gICAgICAgIHRoaXMuZm9jdXNOb2RlID0gc2VsLmZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IHRoaXMuZm9jdXNOb2RlID0gbnVsbDtcbiAgICB9XG4gICAgZXEoc2VsKSB7XG4gICAgICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSA9PSB0aGlzLmFuY2hvck5vZGUgJiYgc2VsLmFuY2hvck9mZnNldCA9PSB0aGlzLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSA9PSB0aGlzLmZvY3VzTm9kZSAmJiBzZWwuZm9jdXNPZmZzZXQgPT0gdGhpcy5mb2N1c09mZnNldDtcbiAgICB9XG59XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGFuZGxlRE9NQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlID0gaGFuZGxlRE9NQ2hhbmdlO1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gLTE7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIHRoaXMub25DaGFyRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZWRUZXh0Tm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAmJlxuICAgICAgICAgICAgbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXRhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIGJhY2tzcGFjaW5nIG91dCBhIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUgYWZ0ZXIgYSBCUiBub2RlKSBjYWxsIHRoZSBvYnNlcnZlciBjYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLCB3aGljaCB3aWxsIGNhdXNlXG4gICAgICAgICAgICAgICAgLy8gUHJvc2VNaXJyb3IgdG8gbWlzcyB0aGUgY2hhbmdlIChzZWUgIzkzMClcbiAgICAgICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBtdXRhdGlvbnMuc29tZShtID0+IG0udHlwZSA9PSBcImNoaWxkTGlzdFwiICYmIG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICBtLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbS5vbGRWYWx1ZS5sZW5ndGggPiBtLnRhcmdldC5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZS50YXJnZXQsIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLCBvbGRWYWx1ZTogZS5wcmV2VmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgZmx1c2hTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5mbHVzaGluZ1Nvb24gPCAwKVxuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuZmx1c2hpbmdTb29uID0gLTE7IHRoaXMuZmx1c2goKTsgfSwgMjApO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5mbHVzaGluZ1Nvb24gPiAtMSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmZsdXNoaW5nU29vbik7XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMudmlldy5kb20sIG9ic2VydmVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuY29ubmVjdFNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgbGV0IHRha2UgPSB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICAgICAgICBpZiAodGFrZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRha2UubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh0YWtlW2ldKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoKCksIDIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGNvbm5lY3RTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmlldy5kb20ub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0U2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnZpZXcuZG9tLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCkge1xuICAgICAgICB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSBmYWxzZSwgNTApO1xuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgaWYgKCFoYXNGb2N1c0FuZFNlbGVjdGlvbih0aGlzLnZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMpXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KTtcbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiAhdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHNlbCA9IHRoaXMudmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICAgICAgLy8gU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFXG4gICAgICAgICAgICBpZiAoc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIHNldEN1clNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldCh0aGlzLnZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSk7XG4gICAgfVxuICAgIGlnbm9yZVNlbGVjdGlvbkNoYW5nZShzZWwpIHtcbiAgICAgICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBhbmNlc3RvcnMgPSBuZXcgU2V0LCBjb250YWluZXI7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBzZWwuZm9jdXNOb2RlOyBzY2FuOyBzY2FuID0gcGFyZW50Tm9kZShzY2FuKSlcbiAgICAgICAgICAgIGFuY2VzdG9ycy5hZGQoc2Nhbik7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBzZWwuYW5jaG9yTm9kZTsgc2Nhbjsgc2NhbiA9IHBhcmVudE5vZGUoc2NhbikpXG4gICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmhhcyhzY2FuKSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHNjYW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gY29udGFpbmVyICYmIHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGNvbnRhaW5lcik7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2MuaWdub3JlTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgICAgIHRhcmdldDogY29udGFpbmVyLm5vZGVUeXBlID09IDMgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lclxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcilcbiAgICAgICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlO1xuICAgIH1cbiAgICBmbHVzaCgpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCF2aWV3LmRvY1ZpZXcgfHwgdGhpcy5mbHVzaGluZ1Nvb24gPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG11dGF0aW9ucyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKG11dGF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSAhdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgJiYgIXRoaXMuY3VycmVudFNlbGVjdGlvbi5lcShzZWwpICYmIGhhc0ZvY3VzQW5kU2VsZWN0aW9uKHZpZXcpICYmICF0aGlzLmlnbm9yZVNlbGVjdGlvbkNoYW5nZShzZWwpO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlLCBhZGRlZCA9IFtdO1xuICAgICAgICBpZiAodmlldy5lZGl0YWJsZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZWdpc3Rlck11dGF0aW9uKG11dGF0aW9uc1tpXSwgYWRkZWQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IGZyb20gPCAwID8gcmVzdWx0LmZyb20gOiBNYXRoLm1pbihyZXN1bHQuZnJvbSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIHRvID0gdG8gPCAwID8gcmVzdWx0LnRvIDogTWF0aC5tYXgocmVzdWx0LnRvLCB0byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChnZWNrbyAmJiBhZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBicnMgPSBhZGRlZC5maWx0ZXIobiA9PiBuLm5vZGVOYW1lID09IFwiQlJcIik7XG4gICAgICAgICAgICBpZiAoYnJzLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IFthLCBiXSA9IGJycztcbiAgICAgICAgICAgICAgICBpZiAoYS5wYXJlbnROb2RlICYmIGEucGFyZW50Tm9kZS5wYXJlbnROb2RlID09IGIucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgYi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGEucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmb2N1c05vZGUgfSA9IHRoaXMuY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiciBvZiBicnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGJyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lID09IFwiTElcIiAmJiAoIWZvY3VzTm9kZSB8fCBibG9ja1BhcmVudCh2aWV3LCBmb2N1c05vZGUpICE9IHBhcmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBici5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlYWRTZWwgPSBudWxsO1xuICAgICAgICAvLyBJZiBpdCBsb29rcyBsaWtlIHRoZSBicm93c2VyIGhhcyByZXNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZVxuICAgICAgICAvLyBzdGFydCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgZm9jdXMsIHJlc3RvcmUgdGhlIHNlbGVjdGlvbiBmcm9tXG4gICAgICAgIC8vIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgbmV3U2VsICYmIHZpZXcuaW5wdXQubGFzdEZvY3VzID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgTWF0aC5tYXgodmlldy5pbnB1dC5sYXN0VG91Y2gsIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUpIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGFwc2VkKHNlbCkgJiYgKHJlYWRTZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpKSAmJlxuICAgICAgICAgICAgcmVhZFNlbC5lcShTZWxlY3Rpb24ubmVhcih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKDApLCAxKSkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gMDtcbiAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICAgICAgdmlldy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZyb20gPiAtMSB8fCBuZXdTZWwpIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gLTEpIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBjaGVja0NTUyh2aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGVTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQoc2VsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3Rlck11dGF0aW9uKG11dCwgYWRkZWQpIHtcbiAgICAgICAgLy8gSWdub3JlIG11dGF0aW9ucyBpbnNpZGUgbm9kZXMgdGhhdCB3ZXJlIGFscmVhZHkgbm90ZWQgYXMgaW5zZXJ0ZWRcbiAgICAgICAgaWYgKGFkZGVkLmluZGV4T2YobXV0LnRhcmdldCkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKG11dC50YXJnZXQpO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIgJiZcbiAgICAgICAgICAgIChkZXNjID09IHRoaXMudmlldy5kb2NWaWV3IHx8IG11dC5hdHRyaWJ1dGVOYW1lID09IFwiY29udGVudGVkaXRhYmxlXCIgfHxcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNvbWV0aW1lcyBmaXJlcyBzcHVyaW91cyBldmVudHMgZm9yIG51bGwvZW1wdHkgc3R5bGVzXG4gICAgICAgICAgICAgICAgKG11dC5hdHRyaWJ1dGVOYW1lID09IFwic3R5bGVcIiAmJiAhbXV0Lm9sZFZhbHVlICYmICFtdXQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFkZXNjIHx8IGRlc2MuaWdub3JlTXV0YXRpb24obXV0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJjaGlsZExpc3RcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBub2RlID0gbXV0LmFkZGVkTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYWRkZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2VkVGV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlc2MuY29udGVudERPTSAmJiBkZXNjLmNvbnRlbnRET00gIT0gZGVzYy5kb20gJiYgIWRlc2MuY29udGVudERPTS5jb250YWlucyhtdXQudGFyZ2V0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmcm9tOiBkZXNjLnBvc0JlZm9yZSwgdG86IGRlc2MucG9zQWZ0ZXIgfTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbXV0LnByZXZpb3VzU2libGluZywgbmV4dCA9IG11dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmIG11dC5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIElFMTEgZ2l2ZXMgdXMgaW5jb3JyZWN0IG5leHQvcHJldiBzaWJsaW5ncyBmb3Igc29tZVxuICAgICAgICAgICAgICAgIC8vIGluc2VydGlvbnMsIHNvIGlmIHRoZXJlIGFyZSBhZGRlZCBub2RlcywgcmVjb21wdXRlIHRob3NlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBwcmV2aW91c1NpYmxpbmcsIG5leHRTaWJsaW5nIH0gPSBtdXQuYWRkZWROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmcgfHwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChtdXQuYWRkZWROb2RlcywgcHJldmlvdXNTaWJsaW5nKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRTaWJsaW5nIHx8IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwobXV0LmFkZGVkTm9kZXMsIG5leHRTaWJsaW5nKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb21PZmZzZXQgPSBwcmV2ICYmIHByZXYucGFyZW50Tm9kZSA9PSBtdXQudGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBkb21JbmRleChwcmV2KSArIDEgOiAwO1xuICAgICAgICAgICAgbGV0IGZyb20gPSBkZXNjLmxvY2FsUG9zRnJvbURPTShtdXQudGFyZ2V0LCBmcm9tT2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICBsZXQgdG9PZmZzZXQgPSBuZXh0ICYmIG5leHQucGFyZW50Tm9kZSA9PSBtdXQudGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBkb21JbmRleChuZXh0KSA6IG11dC50YXJnZXQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdG8gPSBkZXNjLmxvY2FsUG9zRnJvbURPTShtdXQudGFyZ2V0LCB0b09mZnNldCwgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tLCB0byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG11dC50eXBlID09IFwiYXR0cmlidXRlc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciwgdG86IGRlc2MucG9zQXRFbmQgKyBkZXNjLmJvcmRlciB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBcImNoYXJhY3RlckRhdGFcIlxuICAgICAgICAgICAgdGhpcy5sYXN0Q2hhbmdlZFRleHROb2RlID0gbXV0LnRhcmdldDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZGVzYy5wb3NBdFN0YXJ0LFxuICAgICAgICAgICAgICAgIHRvOiBkZXNjLnBvc0F0RW5kLFxuICAgICAgICAgICAgICAgIC8vIEFuIGV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIGEgdGV4dCBjaGFuZ2UgdGhhdCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgLy8gYW55IHRleHQuIE1hcmsgdGhlIGRvbSBjaGFuZ2UgdG8gZmFsbCBiYWNrIHRvIGFzc3VtaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiB3YXMgdHlwZWQgb3ZlciB3aXRoIGFuIGlkZW50aWNhbCB2YWx1ZSBpZiBpdCBjYW4ndFxuICAgICAgICAgICAgICAgIC8vIGZpbmQgYW5vdGhlciBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdHlwZU92ZXI6IG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBjc3NDaGVja2VkID0gbmV3IFdlYWtNYXAoKTtcbmxldCBjc3NDaGVja1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tDU1Modmlldykge1xuICAgIGlmIChjc3NDaGVja2VkLmhhcyh2aWV3KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNzc0NoZWNrZWQuc2V0KHZpZXcsIG51bGwpO1xuICAgIGlmIChbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlLWxpbmUnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodmlldy5kb20pLndoaXRlU3BhY2UpICE9PSAtMSkge1xuICAgICAgICB2aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGdlY2tvO1xuICAgICAgICBpZiAoY3NzQ2hlY2tXYXJuZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnNvbGVbXCJ3YXJuXCJdKFwiUHJvc2VNaXJyb3IgZXhwZWN0cyB0aGUgQ1NTIHdoaXRlLXNwYWNlIHByb3BlcnR5IHRvIGJlIHNldCwgcHJlZmVyYWJseSB0byAncHJlLXdyYXAnLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsb2FkIHN0eWxlL3Byb3NlbWlycm9yLmNzcyBmcm9tIHRoZSBwcm9zZW1pcnJvci12aWV3IHBhY2thZ2UuXCIpO1xuICAgICAgICBjc3NDaGVja1dhcm5lZCA9IHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIHJhbmdlKSB7XG4gICAgbGV0IGFuY2hvck5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1cnJlbnRBbmNob3IgPSB2aWV3LmRvbUF0UG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VycmVudEFuY2hvci5ub2RlLCBjdXJyZW50QW5jaG9yLm9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkpXG4gICAgICAgIFthbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXRdID0gW2ZvY3VzTm9kZSwgZm9jdXNPZmZzZXQsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldF07XG4gICAgcmV0dXJuIHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH07XG59XG4vLyBVc2VkIHRvIHdvcmsgYXJvdW5kIGEgU2FmYXJpIFNlbGVjdGlvbi9zaGFkb3cgRE9NIGJ1Z1xuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTQgZml4XG5mdW5jdGlvbiBzYWZhcmlTaGFkb3dTZWxlY3Rpb25SYW5nZSh2aWV3LCBzZWxlY3Rpb24pIHtcbiAgICBpZiAoc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKSB7XG4gICAgICAgIGxldCByYW5nZSA9IHNlbGVjdGlvbi5nZXRDb21wb3NlZFJhbmdlcyh2aWV3LnJvb3QpWzBdO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIHJhbmdlKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kO1xuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjIpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93Um9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl04oCUdXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIGZvdW5kID8gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIGZvdW5kKSA6IG51bGw7XG59XG5mdW5jdGlvbiBibG9ja1BhcmVudCh2aWV3LCBub2RlKSB7XG4gICAgZm9yIChsZXQgcCA9IG5vZGUucGFyZW50Tm9kZTsgcCAmJiBwICE9IHZpZXcuZG9tOyBwID0gcC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKHAsIHRydWUpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUuaXNCbG9jaylcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLy8gTm90ZSB0aGF0IGFsbCByZWZlcmVuY2luZyBhbmQgcGFyc2luZyBpcyBkb25lIHdpdGggdGhlXG4vLyBzdGFydC1vZi1vcGVyYXRpb24gc2VsZWN0aW9uIGFuZCBkb2N1bWVudCwgc2luY2UgdGhhdCdzIHRoZSBvbmVcbi8vIHRoYXQgdGhlIERPTSByZXByZXNlbnRzLiBJZiBhbnkgY2hhbmdlcyBjYW1lIGluIGluIHRoZSBtZWFudGltZSxcbi8vIHRoZSBtb2RpZmljYXRpb24gaXMgbWFwcGVkIG92ZXIgdGhvc2UgYmVmb3JlIGl0IGlzIGFwcGxpZWQsIGluXG4vLyByZWFkRE9NQ2hhbmdlLlxuZnVuY3Rpb24gcGFyc2VCZXR3ZWVuKHZpZXcsIGZyb21fLCB0b18pIHtcbiAgICBsZXQgeyBub2RlOiBwYXJlbnQsIGZyb21PZmZzZXQsIHRvT2Zmc2V0LCBmcm9tLCB0byB9ID0gdmlldy5kb2NWaWV3LnBhcnNlUmFuZ2UoZnJvbV8sIHRvXyk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgZmluZDtcbiAgICBsZXQgYW5jaG9yID0gZG9tU2VsLmFuY2hvck5vZGU7XG4gICAgaWYgKGFuY2hvciAmJiB2aWV3LmRvbS5jb250YWlucyhhbmNob3Iubm9kZVR5cGUgPT0gMSA/IGFuY2hvciA6IGFuY2hvci5wYXJlbnROb2RlKSkge1xuICAgICAgICBmaW5kID0gW3sgbm9kZTogYW5jaG9yLCBvZmZzZXQ6IGRvbVNlbC5hbmNob3JPZmZzZXQgfV07XG4gICAgICAgIGlmICghc2VsZWN0aW9uQ29sbGFwc2VkKGRvbVNlbCkpXG4gICAgICAgICAgICBmaW5kLnB1c2goeyBub2RlOiBkb21TZWwuZm9jdXNOb2RlLCBvZmZzZXQ6IGRvbVNlbC5mb2N1c09mZnNldCB9KTtcbiAgICB9XG4gICAgLy8gV29yayBhcm91bmQgaXNzdWUgaW4gQ2hyb21lIHdoZXJlIGJhY2tzcGFjaW5nIHNvbWV0aW1lcyByZXBsYWNlc1xuICAgIC8vIHRoZSBkZWxldGVkIGNvbnRlbnQgd2l0aCBhIHJhbmRvbSBCUiBub2RlIChpc3N1ZXMgIzc5OSwgIzgzMSlcbiAgICBpZiAoY2hyb21lICYmIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPT09IDgpIHtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gdG9PZmZzZXQ7IG9mZiA+IGZyb21PZmZzZXQ7IG9mZi0tKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW29mZiAtIDFdLCBkZXNjID0gbm9kZS5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiICYmICFkZXNjKSB7XG4gICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBvZmY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MgfHwgZGVzYy5zaXplKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdGFydERvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGxldCBwYXJzZXIgPSB2aWV3LnNvbWVQcm9wKFwiZG9tUGFyc2VyXCIpIHx8IERPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKTtcbiAgICBsZXQgJGZyb20gPSBzdGFydERvYy5yZXNvbHZlKGZyb20pO1xuICAgIGxldCBzZWwgPSBudWxsLCBkb2MgPSBwYXJzZXIucGFyc2UocGFyZW50LCB7XG4gICAgICAgIHRvcE5vZGU6ICRmcm9tLnBhcmVudCxcbiAgICAgICAgdG9wTWF0Y2g6ICRmcm9tLnBhcmVudC5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleCgpKSxcbiAgICAgICAgdG9wT3BlbjogdHJ1ZSxcbiAgICAgICAgZnJvbTogZnJvbU9mZnNldCxcbiAgICAgICAgdG86IHRvT2Zmc2V0LFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICRmcm9tLnBhcmVudC50eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiA/IFwiZnVsbFwiIDogdHJ1ZSxcbiAgICAgICAgZmluZFBvc2l0aW9uczogZmluZCxcbiAgICAgICAgcnVsZUZyb21Ob2RlLFxuICAgICAgICBjb250ZXh0OiAkZnJvbVxuICAgIH0pO1xuICAgIGlmIChmaW5kICYmIGZpbmRbMF0ucG9zICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGFuY2hvciA9IGZpbmRbMF0ucG9zLCBoZWFkID0gZmluZFsxXSAmJiBmaW5kWzFdLnBvcztcbiAgICAgICAgaWYgKGhlYWQgPT0gbnVsbClcbiAgICAgICAgICAgIGhlYWQgPSBhbmNob3I7XG4gICAgICAgIHNlbCA9IHsgYW5jaG9yOiBhbmNob3IgKyBmcm9tLCBoZWFkOiBoZWFkICsgZnJvbSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkb2MsIHNlbCwgZnJvbSwgdG8gfTtcbn1cbmZ1bmN0aW9uIHJ1bGVGcm9tTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIGlmIChkZXNjKSB7XG4gICAgICAgIHJldHVybiBkZXNjLnBhcnNlUnVsZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmIGRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgIC8vIFNhZmFyaSByZXBsYWNlcyB0aGUgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgd2l0aCBhIEJSXG4gICAgICAgIC8vIGRpcmVjdGx5IGluIHRoZSBsaXN0IG5vZGUgKD8hKSBpZiB5b3UgZGVsZXRlIHRoZSBsYXN0XG4gICAgICAgIC8vIGNoYXJhY3RlciBpbiBhIGxpc3QgaXRlbSBvciB0YWJsZSBjZWxsICgjNzA4LCAjODYyKVxuICAgICAgICBpZiAoc2FmYXJpICYmIC9eKHVsfG9sKSQvaS50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgbGV0IHNraXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgc2tpcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbS5wYXJlbnROb2RlLmxhc3RDaGlsZCA9PSBkb20gfHwgc2FmYXJpICYmIC9eKHRyfHRhYmxlKSQvaS50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZG9tLm5vZGVOYW1lID09IFwiSU1HXCIgJiYgZG9tLmdldEF0dHJpYnV0ZShcIm1hcmstcGxhY2Vob2xkZXJcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuY29uc3QgaXNJbmxpbmUgPSAvXihhfGFiYnJ8YWNyb255bXxifGJkW2lvXXxiaWd8YnJ8YnV0dG9ufGNpdGV8Y29kZXxkYXRhKGxpc3QpP3xkZWx8ZGZufGVtfGl8aW5zfGtiZHxsYWJlbHxtYXB8bWFya3xtZXRlcnxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzbWFsbHxzcGFufHN0cm9uZ3xzdVticF18dGltZXx1fHR0fHZhcikkL2k7XG5mdW5jdGlvbiByZWFkRE9NQ2hhbmdlKHZpZXcsIGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWROb2Rlcykge1xuICAgIGxldCBjb21wb3NpdGlvbklEID0gdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzIHx8ICh2aWV3LmNvbXBvc2luZyA/IHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCA6IDApO1xuICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IDA7XG4gICAgaWYgKGZyb20gPCAwKSB7XG4gICAgICAgIGxldCBvcmlnaW4gPSB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25UaW1lID4gRGF0ZS5ub3coKSAtIDUwID8gdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luIDogbnVsbDtcbiAgICAgICAgbGV0IG5ld1NlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldywgb3JpZ2luKTtcbiAgICAgICAgaWYgKG5ld1NlbCAmJiAhdmlldy5zdGF0ZS5zZWxlY3Rpb24uZXEobmV3U2VsKSkge1xuICAgICAgICAgICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkICYmXG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gMTMgJiYgRGF0ZS5ub3coKSAtIDEwMCA8IHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lICYmXG4gICAgICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3U2VsKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW4gPT0gXCJwb2ludGVyXCIpXG4gICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcInBvaW50ZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gPT0gXCJrZXlcIilcbiAgICAgICAgICAgICAgICB0ci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uSUQpO1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgJGJlZm9yZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNoYXJlZCA9ICRiZWZvcmUuc2hhcmVkRGVwdGgodG8pO1xuICAgIGZyb20gPSAkYmVmb3JlLmJlZm9yZShzaGFyZWQgKyAxKTtcbiAgICB0byA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUodG8pLmFmdGVyKHNoYXJlZCArIDEpO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgcGFyc2UgPSBwYXJzZUJldHdlZW4odmlldywgZnJvbSwgdG8pO1xuICAgIGxldCBkb2MgPSB2aWV3LnN0YXRlLmRvYywgY29tcGFyZSA9IGRvYy5zbGljZShwYXJzZS5mcm9tLCBwYXJzZS50byk7XG4gICAgbGV0IHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZTtcbiAgICAvLyBQcmVmZXIgYW5jaG9yaW5nIHRvIGVuZCB3aGVuIEJhY2tzcGFjZSBpcyBwcmVzc2VkXG4gICAgaWYgKHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPT09IDggJiYgRGF0ZS5ub3coKSAtIDEwMCA8IHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lKSB7XG4gICAgICAgIHByZWZlcnJlZFBvcyA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByZWZlcnJlZFBvcyA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcInN0YXJ0XCI7XG4gICAgfVxuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBudWxsO1xuICAgIGxldCBjaGFuZ2UgPSBmaW5kRGlmZihjb21wYXJlLmNvbnRlbnQsIHBhcnNlLmRvYy5jb250ZW50LCBwYXJzZS5mcm9tLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpO1xuICAgIGlmIChjaGFuZ2UpXG4gICAgICAgIHZpZXcuaW5wdXQuZG9tQ2hhbmdlQ291bnQrKztcbiAgICBpZiAoKGlvcyAmJiB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA+IERhdGUubm93KCkgLSAyMjUgfHwgYW5kcm9pZCkgJiZcbiAgICAgICAgYWRkZWROb2Rlcy5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PSAxICYmICFpc0lubGluZS50ZXN0KG4ubm9kZU5hbWUpKSAmJlxuICAgICAgICAoIWNoYW5nZSB8fCBjaGFuZ2UuZW5kQSA+PSBjaGFuZ2UuZW5kQikgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpIHtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIGlmICh0eXBlT3ZlciAmJiBzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgJiYgc2VsLiRoZWFkLnNhbWVQYXJlbnQoc2VsLiRhbmNob3IpICYmXG4gICAgICAgICAgICAhdmlldy5jb21wb3NpbmcgJiYgIShwYXJzZS5zZWwgJiYgcGFyc2Uuc2VsLmFuY2hvciAhPSBwYXJzZS5zZWwuaGVhZCkpIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IHsgc3RhcnQ6IHNlbC5mcm9tLCBlbmRBOiBzZWwudG8sIGVuZEI6IHNlbC50byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBhcnNlLnNlbCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWwgPSByZXNvbHZlU2VsZWN0aW9uKHZpZXcsIHZpZXcuc3RhdGUuZG9jLCBwYXJzZS5zZWwpO1xuICAgICAgICAgICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb3ZlcndyaXRpbmcgYSBzZWxlY3Rpb24gYnkgdHlwaW5nIG1hdGNoZXNcbiAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBzZWxlY3RlZCBjb250ZW50LCBjcmVhdGluZyBhIGNoYW5nZVxuICAgIC8vIHRoYXQncyBzbWFsbGVyIHRoYW4gd2hhdCB3YXMgYWN0dWFsbHkgb3ZlcndyaXR0ZW4uXG4gICAgaWYgKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJlxuICAgICAgICBjaGFuZ2Uuc3RhcnQgPT0gY2hhbmdlLmVuZEIgJiZcbiAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChjaGFuZ2Uuc3RhcnQgPiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tICYmIGNoYW5nZS5zdGFydCA8PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tICsgMiAmJlxuICAgICAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA+PSBwYXJzZS5mcm9tKSB7XG4gICAgICAgICAgICBjaGFuZ2Uuc3RhcnQgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoYW5nZS5lbmRBIDwgdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gJiYgY2hhbmdlLmVuZEEgPj0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byA8PSBwYXJzZS50bykge1xuICAgICAgICAgICAgY2hhbmdlLmVuZEIgKz0gKHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIC0gY2hhbmdlLmVuZEEpO1xuICAgICAgICAgICAgY2hhbmdlLmVuZEEgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50bztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJRTExIHdpbGwgaW5zZXJ0IGEgbm9uLWJyZWFraW5nIHNwYWNlIF9haGVhZF8gb2YgdGhlIHNwYWNlIGFmdGVyXG4gICAgLy8gdGhlIGN1cnNvciBzcGFjZSB3aGVuIGFkZGluZyBhIHNwYWNlIGJlZm9yZSBhbm90aGVyIHNwYWNlLiBXaGVuXG4gICAgLy8gdGhhdCBoYXBwZW5lZCwgYWRqdXN0IHRoZSBjaGFuZ2UgdG8gY292ZXIgdGhlIHNwYWNlIGluc3RlYWQuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgY2hhbmdlLmVuZEIgPT0gY2hhbmdlLnN0YXJ0ICsgMSAmJlxuICAgICAgICBjaGFuZ2UuZW5kQSA9PSBjaGFuZ2Uuc3RhcnQgJiYgY2hhbmdlLnN0YXJ0ID4gcGFyc2UuZnJvbSAmJlxuICAgICAgICBwYXJzZS5kb2MudGV4dEJldHdlZW4oY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSAtIDEsIGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20gKyAxKSA9PSBcIiBcXHUwMGEwXCIpIHtcbiAgICAgICAgY2hhbmdlLnN0YXJ0LS07XG4gICAgICAgIGNoYW5nZS5lbmRBLS07XG4gICAgICAgIGNoYW5nZS5lbmRCLS07XG4gICAgfVxuICAgIGxldCAkZnJvbSA9IHBhcnNlLmRvYy5yZXNvbHZlTm9DYWNoZShjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJHRvID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSk7XG4gICAgbGV0ICRmcm9tQSA9IGRvYy5yZXNvbHZlKGNoYW5nZS5zdGFydCk7XG4gICAgbGV0IGlubGluZUNoYW5nZSA9ICRmcm9tLnNhbWVQYXJlbnQoJHRvKSAmJiAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCAmJiAkZnJvbUEuZW5kKCkgPj0gY2hhbmdlLmVuZEE7XG4gICAgbGV0IG5leHRTZWw7XG4gICAgLy8gSWYgdGhpcyBsb29rcyBsaWtlIHRoZSBlZmZlY3Qgb2YgcHJlc3NpbmcgRW50ZXIgKG9yIHdhcyByZWNvcmRlZFxuICAgIC8vIGFzIGJlaW5nIGFuIGlPUyBlbnRlciBwcmVzcyksIGp1c3QgZGlzcGF0Y2ggYW4gRW50ZXIga2V5IGluc3RlYWQuXG4gICAgaWYgKCgoaW9zICYmIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID4gRGF0ZS5ub3coKSAtIDIyNSAmJlxuICAgICAgICAoIWlubGluZUNoYW5nZSB8fCBhZGRlZE5vZGVzLnNvbWUobiA9PiBuLm5vZGVOYW1lID09IFwiRElWXCIgfHwgbi5ub2RlTmFtZSA9PSBcIlBcIikpKSB8fFxuICAgICAgICAoIWlubGluZUNoYW5nZSAmJiAkZnJvbS5wb3MgPCBwYXJzZS5kb2MuY29udGVudC5zaXplICYmXG4gICAgICAgICAgICAoISRmcm9tLnNhbWVQYXJlbnQoJHRvKSB8fCAhJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQpICYmXG4gICAgICAgICAgICAhL1xcUy8udGVzdChwYXJzZS5kb2MudGV4dEJldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCBcIlwiLCBcIlwiKSkgJiZcbiAgICAgICAgICAgIChuZXh0U2VsID0gU2VsZWN0aW9uLmZpbmRGcm9tKHBhcnNlLmRvYy5yZXNvbHZlKCRmcm9tLnBvcyArIDEpLCAxLCB0cnVlKSkgJiZcbiAgICAgICAgICAgIG5leHRTZWwuaGVhZCA+ICRmcm9tLnBvcykpICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpKSB7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTYW1lIGZvciBiYWNrc3BhY2VcbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yID4gY2hhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGxvb2tzTGlrZUJhY2tzcGFjZShkb2MsIGNoYW5nZS5zdGFydCwgY2hhbmdlLmVuZEEsICRmcm9tLCAkdG8pICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKSB7XG4gICAgICAgIGlmIChhbmRyb2lkICYmIGNocm9tZSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCk7IC8vICM4MjBcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgd2lsbCBvY2Nhc2lvbmFsbHksIGR1cmluZyBjb21wb3NpdGlvbiwgZGVsZXRlIHRoZVxuICAgIC8vIGVudGlyZSBjb21wb3NpdGlvbiBhbmQgdGhlbiBpbW1lZGlhdGVseSBpbnNlcnQgaXQgYWdhaW4uIFRoaXMgaXNcbiAgICAvLyB1c2VkIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbi5cbiAgICBpZiAoY2hyb21lICYmIGNoYW5nZS5lbmRCID09IGNoYW5nZS5zdGFydClcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0Q2hyb21lRGVsZXRlID0gRGF0ZS5ub3coKTtcbiAgICAvLyBUaGlzIHRyaWVzIHRvIGRldGVjdCBBbmRyb2lkIHZpcnR1YWwga2V5Ym9hcmRcbiAgICAvLyBlbnRlci1hbmQtcGljay1zdWdnZXN0aW9uIGFjdGlvbi4gVGhhdCBzb21ldGltZXMgKHNlZSBpc3N1ZVxuICAgIC8vICMxMDU5KSBmaXJzdCBmaXJlcyBhIERPTSBtdXRhdGlvbiwgYmVmb3JlIG1vdmluZyB0aGUgc2VsZWN0aW9uIHRvXG4gICAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgYmxvY2suIEFuZCB0aGVuLCBiZWNhdXNlIFByb3NlTWlycm9yIGNsZWFucyB1cFxuICAgIC8vIHRoZSBET00gc2VsZWN0aW9uLCBpdCBnaXZlcyB1cCBtb3ZpbmcgdGhlIHNlbGVjdGlvbiBlbnRpcmVseSxcbiAgICAvLyBsZWF2aW5nIHRoZSBjdXJzb3IgaW4gdGhlIHdyb25nIHBsYWNlLiBXaGVuIHRoYXQgaGFwcGVucywgd2UgZHJvcFxuICAgIC8vIHRoZSBuZXcgcGFyYWdyYXBoIGZyb20gdGhlIGluaXRpYWwgY2hhbmdlLCBhbmQgZmlyZSBhIHNpbXVsYXRlZFxuICAgIC8vIGVudGVyIGtleSBhZnRlcndhcmRzLlxuICAgIGlmIChhbmRyb2lkICYmICFpbmxpbmVDaGFuZ2UgJiYgJGZyb20uc3RhcnQoKSAhPSAkdG8uc3RhcnQoKSAmJiAkdG8ucGFyZW50T2Zmc2V0ID09IDAgJiYgJGZyb20uZGVwdGggPT0gJHRvLmRlcHRoICYmXG4gICAgICAgIHBhcnNlLnNlbCAmJiBwYXJzZS5zZWwuYW5jaG9yID09IHBhcnNlLnNlbC5oZWFkICYmIHBhcnNlLnNlbC5oZWFkID09IGNoYW5nZS5lbmRBKSB7XG4gICAgICAgIGNoYW5nZS5lbmRCIC09IDI7XG4gICAgICAgICR0byA9IHBhcnNlLmRvYy5yZXNvbHZlTm9DYWNoZShjaGFuZ2UuZW5kQiAtIHBhcnNlLmZyb20pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGZ1bmN0aW9uIChmKSB7IHJldHVybiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKTsgfSk7XG4gICAgICAgIH0sIDIwKTtcbiAgICB9XG4gICAgbGV0IGNoRnJvbSA9IGNoYW5nZS5zdGFydCwgY2hUbyA9IGNoYW5nZS5lbmRBO1xuICAgIGxldCB0ciwgc3RvcmVkTWFya3MsIG1hcmtDaGFuZ2U7XG4gICAgaWYgKGlubGluZUNoYW5nZSkge1xuICAgICAgICBpZiAoJGZyb20ucG9zID09ICR0by5wb3MpIHsgLy8gRGVsZXRpb25cbiAgICAgICAgICAgIC8vIElFMTEgc29tZXRpbWVzIHdlaXJkbHkgbW92ZXMgdGhlIERPTSBzZWxlY3Rpb24gYXJvdW5kIGFmdGVyXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSB0ZXh0YmxvY2tcbiAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmICRmcm9tLnBhcmVudE9mZnNldCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGVjdGlvblRvRE9NKHZpZXcpLCAyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIuZGVsZXRlKGNoRnJvbSwgY2hUbyk7XG4gICAgICAgICAgICBzdG9yZWRNYXJrcyA9IGRvYy5yZXNvbHZlKGNoYW5nZS5zdGFydCkubWFya3NBY3Jvc3MoZG9jLnJlc29sdmUoY2hhbmdlLmVuZEEpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICggLy8gQWRkaW5nIG9yIHJlbW92aW5nIGEgbWFya1xuICAgICAgICBjaGFuZ2UuZW5kQSA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICAgICAgKG1hcmtDaGFuZ2UgPSBpc01hcmtDaGFuZ2UoJGZyb20ucGFyZW50LmNvbnRlbnQuY3V0KCRmcm9tLnBhcmVudE9mZnNldCwgJHRvLnBhcmVudE9mZnNldCksICRmcm9tQS5wYXJlbnQuY29udGVudC5jdXQoJGZyb21BLnBhcmVudE9mZnNldCwgY2hhbmdlLmVuZEEgLSAkZnJvbUEuc3RhcnQoKSkpKSkge1xuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgICAgICAgICAgaWYgKG1hcmtDaGFuZ2UudHlwZSA9PSBcImFkZFwiKVxuICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoY2hGcm9tLCBjaFRvLCBtYXJrQ2hhbmdlLm1hcmspO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRyLnJlbW92ZU1hcmsoY2hGcm9tLCBjaFRvLCBtYXJrQ2hhbmdlLm1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRmcm9tLnBhcmVudC5jaGlsZCgkZnJvbS5pbmRleCgpKS5pc1RleHQgJiYgJGZyb20uaW5kZXgoKSA9PSAkdG8uaW5kZXgoKSAtICgkdG8udGV4dE9mZnNldCA/IDAgOiAxKSkge1xuICAgICAgICAgICAgLy8gQm90aCBwb3NpdGlvbnMgaW4gdGhlIHNhbWUgdGV4dCBub2RlIC0tIHNpbXBseSBpbnNlcnQgdGV4dFxuICAgICAgICAgICAgbGV0IHRleHQgPSAkZnJvbS5wYXJlbnQudGV4dEJldHdlZW4oJGZyb20ucGFyZW50T2Zmc2V0LCAkdG8ucGFyZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBjaEZyb20sIGNoVG8sIHRleHQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIuaW5zZXJ0VGV4dCh0ZXh0LCBjaEZyb20sIGNoVG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdHIpXG4gICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5yZXBsYWNlKGNoRnJvbSwgY2hUbywgcGFyc2UuZG9jLnNsaWNlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20sIGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSkpO1xuICAgIGlmIChwYXJzZS5zZWwpIHtcbiAgICAgICAgbGV0IHNlbCA9IHJlc29sdmVTZWxlY3Rpb24odmlldywgdHIuZG9jLCBwYXJzZS5zZWwpO1xuICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIGR1cmluZyBjb21wb3NpdGlvbiwgcmVwb3J0IHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gaW4gdGhlIHdyb25nIHBsYWNlLiBJZiBpdCBsb29rcyBsaWtlIHRoYXQgaXNcbiAgICAgICAgLy8gaGFwcGVuaW5nLCBkb24ndCB1cGRhdGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgLy8gRWRnZSBqdXN0IGRvZXNuJ3QgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgd2hlbiB5b3Ugc3RhcnQgdHlwaW5nXG4gICAgICAgIC8vIGluIGFuIGVtcHR5IGJsb2NrIG9yIGJldHdlZW4gYnIgbm9kZXMuXG4gICAgICAgIGlmIChzZWwgJiYgIShjaHJvbWUgJiYgdmlldy5jb21wb3NpbmcgJiYgc2VsLmVtcHR5ICYmXG4gICAgICAgICAgICAoY2hhbmdlLnN0YXJ0ICE9IGNoYW5nZS5lbmRCIHx8IHZpZXcuaW5wdXQubGFzdENocm9tZURlbGV0ZSA8IERhdGUubm93KCkgLSAxMDApICYmXG4gICAgICAgICAgICAoc2VsLmhlYWQgPT0gY2hGcm9tIHx8IHNlbC5oZWFkID09IHRyLm1hcHBpbmcubWFwKGNoVG8pIC0gMSkgfHxcbiAgICAgICAgICAgIGllICYmIHNlbC5lbXB0eSAmJiBzZWwuaGVhZCA9PSBjaEZyb20pKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgfVxuICAgIGlmIChzdG9yZWRNYXJrcylcbiAgICAgICAgdHIuZW5zdXJlTWFya3Moc3RvcmVkTWFya3MpO1xuICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTZWxlY3Rpb24odmlldywgZG9jLCBwYXJzZWRTZWwpIHtcbiAgICBpZiAoTWF0aC5tYXgocGFyc2VkU2VsLmFuY2hvciwgcGFyc2VkU2VsLmhlYWQpID4gZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkJldHdlZW4odmlldywgZG9jLnJlc29sdmUocGFyc2VkU2VsLmFuY2hvciksIGRvYy5yZXNvbHZlKHBhcnNlZFNlbC5oZWFkKSk7XG59XG4vLyBHaXZlbiB0d28gc2FtZS1sZW5ndGgsIG5vbi1lbXB0eSBmcmFnbWVudHMgb2YgaW5saW5lIGNvbnRlbnQsXG4vLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlyc3QgY291bGQgYmUgY3JlYXRlZCBmcm9tIHRoZSBzZWNvbmQgYnlcbi8vIHJlbW92aW5nIG9yIGFkZGluZyBhIHNpbmdsZSBtYXJrIHR5cGUuXG5mdW5jdGlvbiBpc01hcmtDaGFuZ2UoY3VyLCBwcmV2KSB7XG4gICAgbGV0IGN1ck1hcmtzID0gY3VyLmZpcnN0Q2hpbGQubWFya3MsIHByZXZNYXJrcyA9IHByZXYuZmlyc3RDaGlsZC5tYXJrcztcbiAgICBsZXQgYWRkZWQgPSBjdXJNYXJrcywgcmVtb3ZlZCA9IHByZXZNYXJrcywgdHlwZSwgbWFyaywgdXBkYXRlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldk1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICBhZGRlZCA9IHByZXZNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KGFkZGVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICByZW1vdmVkID0gY3VyTWFya3NbaV0ucmVtb3ZlRnJvbVNldChyZW1vdmVkKTtcbiAgICBpZiAoYWRkZWQubGVuZ3RoID09IDEgJiYgcmVtb3ZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICBtYXJrID0gYWRkZWRbMF07XG4gICAgICAgIHR5cGUgPSBcImFkZFwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhZGRlZC5sZW5ndGggPT0gMCAmJiByZW1vdmVkLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIG1hcmsgPSByZW1vdmVkWzBdO1xuICAgICAgICB0eXBlID0gXCJyZW1vdmVcIjtcbiAgICAgICAgdXBkYXRlID0gKG5vZGUpID0+IG5vZGUubWFyayhtYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgdXBkYXRlZC5wdXNoKHVwZGF0ZShwcmV2LmNoaWxkKGkpKSk7XG4gICAgaWYgKEZyYWdtZW50LmZyb20odXBkYXRlZCkuZXEoY3VyKSlcbiAgICAgICAgcmV0dXJuIHsgbWFyaywgdHlwZSB9O1xufVxuZnVuY3Rpb24gbG9va3NMaWtlQmFja3NwYWNlKG9sZCwgc3RhcnQsIGVuZCwgJG5ld1N0YXJ0LCAkbmV3RW5kKSB7XG4gICAgaWYgKCAvLyBUaGUgY29udGVudCBtdXN0IGhhdmUgc2hydW5rXG4gICAgZW5kIC0gc3RhcnQgPD0gJG5ld0VuZC5wb3MgLSAkbmV3U3RhcnQucG9zIHx8XG4gICAgICAgIC8vIG5ld0VuZCBtdXN0IHBvaW50IGRpcmVjdGx5IGF0IG9yIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJsb2NrIHRoYXQgbmV3U3RhcnQgcG9pbnRzIGludG9cbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXdTdGFydCwgdHJ1ZSwgZmFsc2UpIDwgJG5ld0VuZC5wb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHN0YXJ0ID0gb2xkLnJlc29sdmUoc3RhcnQpO1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSwgcmF0aGVyIHRoYW4gam9pbmluZyBibG9ja3MsIHRoZSBjaGFuZ2UganVzdCByZW1vdmVkIGFuIGVudGlyZSBibG9ja1xuICAgIGlmICghJG5ld1N0YXJ0LnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBsZXQgYWZ0ZXIgPSAkc3RhcnQubm9kZUFmdGVyO1xuICAgICAgICByZXR1cm4gYWZ0ZXIgIT0gbnVsbCAmJiBlbmQgPT0gc3RhcnQgKyBhZnRlci5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLy8gU3RhcnQgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIGEgYmxvY2tcbiAgICBpZiAoJHN0YXJ0LnBhcmVudE9mZnNldCA8ICRzdGFydC5wYXJlbnQuY29udGVudC5zaXplIHx8ICEkc3RhcnQucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRuZXh0ID0gb2xkLnJlc29sdmUoc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRzdGFydCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgIC8vIFRoZSBuZXh0IHRleHRibG9jayBtdXN0IHN0YXJ0IGJlZm9yZSBlbmQgYW5kIGVuZCBuZWFyIGl0XG4gICAgaWYgKCEkbmV4dC5wYXJlbnQuaXNUZXh0YmxvY2sgfHwgJG5leHQucG9zID4gZW5kIHx8XG4gICAgICAgIHNraXBDbG9zaW5nQW5kT3BlbmluZygkbmV4dCwgdHJ1ZSwgZmFsc2UpIDwgZW5kKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gVGhlIGZyYWdtZW50cyBhZnRlciB0aGUgam9pbiBwb2ludCBtdXN0IG1hdGNoXG4gICAgcmV0dXJuICRuZXdTdGFydC5wYXJlbnQuY29udGVudC5jdXQoJG5ld1N0YXJ0LnBhcmVudE9mZnNldCkuZXEoJG5leHQucGFyZW50LmNvbnRlbnQpO1xufVxuZnVuY3Rpb24gc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRwb3MsIGZyb21FbmQsIG1heU9wZW4pIHtcbiAgICBsZXQgZGVwdGggPSAkcG9zLmRlcHRoLCBlbmQgPSBmcm9tRW5kID8gJHBvcy5lbmQoKSA6ICRwb3MucG9zO1xuICAgIHdoaWxlIChkZXB0aCA+IDAgJiYgKGZyb21FbmQgfHwgJHBvcy5pbmRleEFmdGVyKGRlcHRoKSA9PSAkcG9zLm5vZGUoZGVwdGgpLmNoaWxkQ291bnQpKSB7XG4gICAgICAgIGRlcHRoLS07XG4gICAgICAgIGVuZCsrO1xuICAgICAgICBmcm9tRW5kID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXlPcGVuKSB7XG4gICAgICAgIGxldCBuZXh0ID0gJHBvcy5ub2RlKGRlcHRoKS5tYXliZUNoaWxkKCRwb3MuaW5kZXhBZnRlcihkZXB0aCkpO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAhbmV4dC5pc0xlYWYpIHtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5kO1xufVxuZnVuY3Rpb24gZmluZERpZmYoYSwgYiwgcG9zLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpIHtcbiAgICBsZXQgc3RhcnQgPSBhLmZpbmREaWZmU3RhcnQoYiwgcG9zKTtcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgYTogZW5kQSwgYjogZW5kQiB9ID0gYS5maW5kRGlmZkVuZChiLCBwb3MgKyBhLnNpemUsIHBvcyArIGIuc2l6ZSk7XG4gICAgaWYgKHByZWZlcnJlZFNpZGUgPT0gXCJlbmRcIikge1xuICAgICAgICBsZXQgYWRqdXN0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBNYXRoLm1pbihlbmRBLCBlbmRCKSk7XG4gICAgICAgIHByZWZlcnJlZFBvcyAtPSBlbmRBICsgYWRqdXN0IC0gc3RhcnQ7XG4gICAgfVxuICAgIGlmIChlbmRBIDwgc3RhcnQgJiYgYS5zaXplIDwgYi5zaXplKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IHN0YXJ0ICYmIHByZWZlcnJlZFBvcyA+PSBlbmRBID8gc3RhcnQgLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBzdGFydCAtPSBtb3ZlO1xuICAgICAgICBpZiAoc3RhcnQgJiYgc3RhcnQgPCBiLnNpemUgJiYgaXNTdXJyb2dhdGVQYWlyKGIudGV4dEJldHdlZW4oc3RhcnQgLSAxLCBzdGFydCArIDEpKSlcbiAgICAgICAgICAgIHN0YXJ0ICs9IG1vdmUgPyAxIDogLTE7XG4gICAgICAgIGVuZEIgPSBzdGFydCArIChlbmRCIC0gZW5kQSk7XG4gICAgICAgIGVuZEEgPSBzdGFydDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZW5kQiA8IHN0YXJ0KSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IHN0YXJ0ICYmIHByZWZlcnJlZFBvcyA+PSBlbmRCID8gc3RhcnQgLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBzdGFydCAtPSBtb3ZlO1xuICAgICAgICBpZiAoc3RhcnQgJiYgc3RhcnQgPCBhLnNpemUgJiYgaXNTdXJyb2dhdGVQYWlyKGEudGV4dEJldHdlZW4oc3RhcnQgLSAxLCBzdGFydCArIDEpKSlcbiAgICAgICAgICAgIHN0YXJ0ICs9IG1vdmUgPyAxIDogLTE7XG4gICAgICAgIGVuZEEgPSBzdGFydCArIChlbmRBIC0gZW5kQik7XG4gICAgICAgIGVuZEIgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZEEsIGVuZEIgfTtcbn1cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCAhPSAyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGEgPSBzdHIuY2hhckNvZGVBdCgwKSwgYiA9IHN0ci5jaGFyQ29kZUF0KDEpO1xuICAgIHJldHVybiBhID49IDB4REMwMCAmJiBhIDw9IDB4REZGRiAmJiBiID49IDB4RDgwMCAmJiBiIDw9IDB4REJGRjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3BhcnNlRnJvbUNsaXBib2FyZCA9IHBhcnNlRnJvbUNsaXBib2FyZDtcbi8qKlxuQGludGVybmFsXG4qL1xuY29uc3QgX19lbmRDb21wb3NpdGlvbiA9IGVuZENvbXBvc2l0aW9uO1xuLyoqXG5BbiBlZGl0b3IgdmlldyBtYW5hZ2VzIHRoZSBET00gc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhblxuZWRpdGFibGUgZG9jdW1lbnQuIEl0cyBzdGF0ZSBhbmQgYmVoYXZpb3IgYXJlIGRldGVybWluZWQgYnkgaXRzXG5bcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzKS5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB2aWV3LiBgcGxhY2VgIG1heSBiZSBhIERPTSBub2RlIHRoYXQgdGhlIGVkaXRvciBzaG91bGRcbiAgICBiZSBhcHBlbmRlZCB0bywgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcGxhY2UgaXQgaW50byB0aGUgZG9jdW1lbnQsXG4gICAgb3IgYW4gb2JqZWN0IHdob3NlIGBtb3VudGAgcHJvcGVydHkgaG9sZHMgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZVxuICAgIGRvY3VtZW50IGNvbnRhaW5lci4gSWYgaXQgaXMgYG51bGxgLCB0aGUgZWRpdG9yIHdpbGwgbm90IGJlXG4gICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IocGxhY2UsIHByb3BzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgS2x1ZGdlIHVzZWQgdG8gd29yayBhcm91bmQgYSBDaHJvbWUgYnVnIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrQ3Vyc29yID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBJbnB1dFN0YXRlO1xuICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luVmlld3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEhvbGRzIGB0cnVlYCB3aGVuIGEgaGFjayBub2RlIGlzIG5lZWRlZCBpbiBGaXJlZm94IHRvIHByZXZlbnQgdGhlXG4gICAgICAgIFtzcGFjZSBpcyBlYXRlbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy82NTEpXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgV2hlbiBlZGl0b3IgY29udGVudCBpcyBiZWluZyBkcmFnZ2VkLCB0aGlzIG9iamVjdCBjb250YWluc1xuICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBzbGljZSBhbmQgd2hldGhlciBpdCBpcyBiZWluZ1xuICAgICAgICBjb3BpZWQgb3IgbW92ZWQuIEF0IGFueSBvdGhlciB0aW1lLCBpdCBpcyBudWxsLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHByb3BzLnN0YXRlO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zIHx8IFtdO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kb20gPSAocGxhY2UgJiYgcGxhY2UubW91bnQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChwbGFjZSkge1xuICAgICAgICAgICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKVxuICAgICAgICAgICAgICAgIHBsYWNlLmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwbGFjZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcGxhY2UodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocGxhY2UubW91bnQpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIHRoaXMubm9kZVZpZXdzID0gYnVpbGROb2RlVmlld3ModGhpcyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IGRvY1ZpZXdEZXNjKHRoaXMuc3RhdGUuZG9jLCBjb21wdXRlRG9jRGVjbyh0aGlzKSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcywgKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpID0+IHJlYWRET01DaGFuZ2UodGhpcywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIGluaXRJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cygpO1xuICAgIH1cbiAgICAvKipcbiAgICBIb2xkcyBgdHJ1ZWAgd2hlbiBhXG4gICAgW2NvbXBvc2l0aW9uXShodHRwczovL3czYy5naXRodWIuaW8vdWlldmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50cylcbiAgICBpcyBhY3RpdmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dC5jb21wb3Npbmc7IH1cbiAgICAvKipcbiAgICBUaGUgdmlldydzIGN1cnJlbnQgW3Byb3BzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcykuXG4gICAgKi9cbiAgICBnZXQgcHJvcHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcm9wcy5zdGF0ZSAhPSB0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuX3Byb3BzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wc1tuYW1lXSA9IHByZXZbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9wcm9wcy5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BzO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcncyBwcm9wcy4gV2lsbCBpbW1lZGlhdGVseSBjYXVzZSBhbiB1cGRhdGUgdG9cbiAgICB0aGUgRE9NLlxuICAgICovXG4gICAgdXBkYXRlKHByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wcy5oYW5kbGVET01FdmVudHMgIT0gdGhpcy5fcHJvcHMuaGFuZGxlRE9NRXZlbnRzKVxuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBsZXQgcHJldlByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgICAgIHRoaXMuX3Byb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBwcm9wcy5wbHVnaW5zLmZvckVhY2goY2hlY2tTdGF0ZUNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGVJbm5lcihwcm9wcy5zdGF0ZSwgcHJldlByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB2aWV3IGJ5IHVwZGF0aW5nIGV4aXN0aW5nIHByb3BzIG9iamVjdCB3aXRoIHRoZSBvYmplY3RcbiAgICBnaXZlbiBhcyBhcmd1bWVudC4gRXF1aXZhbGVudCB0byBgdmlldy51cGRhdGUoT2JqZWN0LmFzc2lnbih7fSxcbiAgICB2aWV3LnByb3BzLCBwcm9wcykpYC5cbiAgICAqL1xuICAgIHNldFByb3BzKHByb3BzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0ge307XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5fcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gdGhpcy5fcHJvcHNbbmFtZV07XG4gICAgICAgIHVwZGF0ZWQuc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKVxuICAgICAgICAgICAgdXBkYXRlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICB0aGlzLnVwZGF0ZSh1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSBlZGl0b3IncyBgc3RhdGVgIHByb3AsIHdpdGhvdXQgdG91Y2hpbmcgYW55IG9mIHRoZVxuICAgIG90aGVyIHByb3BzLlxuICAgICovXG4gICAgdXBkYXRlU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHN0YXRlLCB0aGlzLl9wcm9wcyk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHByZXZQcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5zdGF0ZSwgcmVkcmF3ID0gZmFsc2UsIHVwZGF0ZVNlbCA9IGZhbHNlO1xuICAgICAgICAvLyBXaGVuIHN0b3JlZCBtYXJrcyBhcmUgYWRkZWQsIHN0b3AgY29tcG9zaXRpb24sIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgLy8gYmUgZGlzcGxheWVkLlxuICAgICAgICBpZiAoc3RhdGUuc3RvcmVkTWFya3MgJiYgdGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgIGNsZWFyQ29tcG9zaXRpb24odGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgbGV0IHBsdWdpbnNDaGFuZ2VkID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucztcbiAgICAgICAgaWYgKHBsdWdpbnNDaGFuZ2VkIHx8IHRoaXMuX3Byb3BzLnBsdWdpbnMgIT0gcHJldlByb3BzLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMubm9kZVZpZXdzICE9IHByZXZQcm9wcy5ub2RlVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkTm9kZVZpZXdzKG5vZGVWaWV3cywgdGhpcy5ub2RlVmlld3MpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBub2RlVmlld3M7XG4gICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgcHJldlByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpIHtcbiAgICAgICAgICAgIGVuc3VyZUxpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIGxldCBpbm5lckRlY28gPSB2aWV3RGVjb3JhdGlvbnModGhpcyksIG91dGVyRGVjbyA9IGNvbXB1dGVEb2NEZWNvKHRoaXMpO1xuICAgICAgICBsZXQgc2Nyb2xsID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykgPyBcInJlc2V0XCJcbiAgICAgICAgICAgIDogc3RhdGUuc2Nyb2xsVG9TZWxlY3Rpb24gPiBwcmV2LnNjcm9sbFRvU2VsZWN0aW9uID8gXCJ0byBzZWxlY3Rpb25cIiA6IFwicHJlc2VydmVcIjtcbiAgICAgICAgbGV0IHVwZGF0ZURvYyA9IHJlZHJhdyB8fCAhdGhpcy5kb2NWaWV3Lm1hdGNoZXNOb2RlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBpZiAodXBkYXRlRG9jIHx8ICFzdGF0ZS5zZWxlY3Rpb24uZXEocHJldi5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgdXBkYXRlU2VsID0gdHJ1ZTtcbiAgICAgICAgbGV0IG9sZFNjcm9sbFBvcyA9IHNjcm9sbCA9PSBcInByZXNlcnZlXCIgJiYgdXBkYXRlU2VsICYmIHRoaXMuZG9tLnN0eWxlLm92ZXJmbG93QW5jaG9yID09IG51bGwgJiYgc3RvcmVTY3JvbGxQb3ModGhpcyk7XG4gICAgICAgIGlmICh1cGRhdGVTZWwpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYW4gaXNzdWUgaW4gQ2hyb21lLCBJRSwgYW5kIEVkZ2Ugd2hlcmUgY2hhbmdpbmdcbiAgICAgICAgICAgIC8vIHRoZSBET00gYXJvdW5kIGFuIGFjdGl2ZSBzZWxlY3Rpb24gcHV0cyBpdCBpbnRvIGEgYnJva2VuXG4gICAgICAgICAgICAvLyBzdGF0ZSB3aGVyZSB0aGUgdGhpbmcgdGhlIHVzZXIgc2VlcyBkaWZmZXJzIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVwb3J0ZWQgYnkgdGhlIFNlbGVjdGlvbiBvYmplY3QgKCM3MTAsICM5NzMsXG4gICAgICAgICAgICAvLyAjMTAxMSwgIzEwMTMsICMxMDM1KS5cbiAgICAgICAgICAgIGxldCBmb3JjZVNlbFVwZGF0ZSA9IHVwZGF0ZURvYyAmJiAoaWUgfHwgY2hyb21lKSAmJiAhdGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICAgICAhcHJldi5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChwcmV2LnNlbGVjdGlvbiwgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVEb2MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSB0aGF0IHRoZSBzZWxlY3Rpb24gcG9pbnRzIGludG8gaXMgd3JpdHRlbiB0byxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgc29tZXRpbWVzIHN0YXJ0cyBtaXNyZXBvcnRpbmcgdGhlIHNlbGVjdGlvbiwgc28gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYWNrcyB0aGF0IGFuZCBmb3JjZXMgYSBzZWxlY3Rpb24gcmVzZXQgd2hlbiBvdXIgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlkIHdyaXRlIHRvIHRoZSBub2RlLlxuICAgICAgICAgICAgICAgIGxldCBjaHJvbWVLbHVkZ2UgPSBjaHJvbWUgPyAodGhpcy50cmFja1dyaXRlcyA9IHRoaXMuZG9tU2VsZWN0aW9uUmFuZ2UoKS5mb2N1c05vZGUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQuY29tcG9zaXRpb25Ob2RlID0gZmluZENvbXBvc2l0aW9uTm9kZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcudXBkYXRlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gZG9jVmlld0Rlc2Moc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbywgdGhpcy5kb20sIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hyb21lS2x1ZGdlICYmICF0aGlzLnRyYWNrV3JpdGVzKVxuICAgICAgICAgICAgICAgICAgICBmb3JjZVNlbFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBmb3IgYW4gaXNzdWUgd2hlcmUgYW4gdXBkYXRlIGFycml2aW5nIHJpZ2h0IGJldHdlZW5cbiAgICAgICAgICAgIC8vIGEgRE9NIHNlbGVjdGlvbiBjaGFuZ2UgYW5kIHRoZSBcInNlbGVjdGlvbmNoYW5nZVwiIGV2ZW50IGZvciBpdFxuICAgICAgICAgICAgLy8gY2FuIGNhdXNlIGEgc3B1cmlvdXMgRE9NIHNlbGVjdGlvbiB1cGRhdGUsIGRpc3J1cHRpbmcgbW91c2VcbiAgICAgICAgICAgIC8vIGRyYWcgc2VsZWN0aW9uLlxuICAgICAgICAgICAgaWYgKGZvcmNlU2VsVXBkYXRlIHx8XG4gICAgICAgICAgICAgICAgISh0aGlzLmlucHV0Lm1vdXNlRG93biAmJiB0aGlzLmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpKSAmJlxuICAgICAgICAgICAgICAgICAgICBhbmNob3JJblJpZ2h0UGxhY2UodGhpcykpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odGhpcywgZm9yY2VTZWxVcGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3luY05vZGVTZWxlY3Rpb24odGhpcywgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUGx1Z2luVmlld3MocHJldik7XG4gICAgICAgIGlmICgoKF9hID0gdGhpcy5kcmFnZ2luZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICYmICFwcmV2LmRvYy5lcShzdGF0ZS5kb2MpKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkTm9kZSh0aGlzLmRyYWdnaW5nLCBwcmV2KTtcbiAgICAgICAgaWYgKHNjcm9sbCA9PSBcInJlc2V0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2Nyb2xsID09IFwidG8gc2VsZWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvbGRTY3JvbGxQb3MpIHtcbiAgICAgICAgICAgIHJlc2V0U2Nyb2xsUG9zKG9sZFNjcm9sbFBvcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzY3JvbGxUb1NlbGVjdGlvbigpIHtcbiAgICAgICAgbGV0IHN0YXJ0RE9NID0gdGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpLmZvY3VzTm9kZTtcbiAgICAgICAgaWYgKCFzdGFydERPTSB8fCAhdGhpcy5kb20uY29udGFpbnMoc3RhcnRET00ubm9kZVR5cGUgPT0gMSA/IHN0YXJ0RE9NIDogc3RhcnRET00ucGFyZW50Tm9kZSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb21lUHJvcChcImhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uXCIsIGYgPT4gZih0aGlzKSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5kb2NWaWV3LmRvbUFmdGVyUG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZyb20pO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0aGlzLmNvb3Jkc0F0UG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmhlYWQsIDEpLCBzdGFydERPTSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveVBsdWdpblZpZXdzKCkge1xuICAgICAgICBsZXQgdmlldztcbiAgICAgICAgd2hpbGUgKHZpZXcgPSB0aGlzLnBsdWdpblZpZXdzLnBvcCgpKVxuICAgICAgICAgICAgaWYgKHZpZXcuZGVzdHJveSlcbiAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2luVmlld3MocHJldlN0YXRlKSB7XG4gICAgICAgIGlmICghcHJldlN0YXRlIHx8IHByZXZTdGF0ZS5wbHVnaW5zICE9IHRoaXMuc3RhdGUucGx1Z2lucyB8fCB0aGlzLmRpcmVjdFBsdWdpbnMgIT0gdGhpcy5wcmV2RGlyZWN0UGx1Z2lucykge1xuICAgICAgICAgICAgdGhpcy5wcmV2RGlyZWN0UGx1Z2lucyA9IHRoaXMuZGlyZWN0UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGlyZWN0UGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmRpcmVjdFBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLnZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luVmlld3MucHVzaChwbHVnaW4uc3BlYy52aWV3KHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuc3RhdGUucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpblZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpblZpZXcgPSB0aGlzLnBsdWdpblZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW5WaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luVmlldy51cGRhdGUodGhpcywgcHJldlN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEcmFnZ2VkTm9kZShkcmFnZ2luZywgcHJldikge1xuICAgICAgICBsZXQgc2VsID0gZHJhZ2dpbmcubm9kZSwgZm91bmQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZG9jLm5vZGVBdChzZWwuZnJvbSkgPT0gc2VsLm5vZGUpIHtcbiAgICAgICAgICAgIGZvdW5kID0gc2VsLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW92ZWRQb3MgPSBzZWwuZnJvbSArICh0aGlzLnN0YXRlLmRvYy5jb250ZW50LnNpemUgLSBwcmV2LmRvYy5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgbGV0IG1vdmVkID0gbW92ZWRQb3MgPiAwICYmIHRoaXMuc3RhdGUuZG9jLm5vZGVBdChtb3ZlZFBvcyk7XG4gICAgICAgICAgICBpZiAobW92ZWQgPT0gc2VsLm5vZGUpXG4gICAgICAgICAgICAgICAgZm91bmQgPSBtb3ZlZFBvcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKGRyYWdnaW5nLnNsaWNlLCBkcmFnZ2luZy5tb3ZlLCBmb3VuZCA8IDAgPyB1bmRlZmluZWQgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnN0YXRlLmRvYywgZm91bmQpKTtcbiAgICB9XG4gICAgc29tZVByb3AocHJvcE5hbWUsIGYpIHtcbiAgICAgICAgbGV0IHByb3AgPSB0aGlzLl9wcm9wcyAmJiB0aGlzLl9wcm9wc1twcm9wTmFtZV0sIHZhbHVlO1xuICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJvcCA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwbHVnaW5zID0gdGhpcy5zdGF0ZS5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2lucylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wID0gcGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCAmJiAodmFsdWUgPSBmID8gZihwcm9wKSA6IHByb3ApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIHZpZXcgaGFzIGZvY3VzLlxuICAgICovXG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIElFIG5vdCBoYW5kbGluZyBmb2N1cyBjb3JyZWN0bHkgaWYgcmVzaXplIGhhbmRsZXMgYXJlIHNob3duLlxuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggcmVzaXplIGhhbmRsZXMsIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgLy8gd2lsbCBiZSB0aGF0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGlzLmRvbS5cbiAgICAgICAgaWYgKGllKSB7XG4gICAgICAgICAgICAvLyBJZiBhY3RpdmVFbGVtZW50IGlzIHdpdGhpbiB0aGlzLmRvbSwgYW5kIHRoZXJlIGFyZSBubyBvdGhlciBlbGVtZW50c1xuICAgICAgICAgICAgLy8gc2V0dGluZyBgY29udGVudGVkaXRhYmxlYCB0byBmYWxzZSBpbiBiZXR3ZWVuLCB0cmVhdCBpdCBhcyBmb2N1c2VkLlxuICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyhub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiB0aGlzLmRvbSAhPSBub2RlICYmIHRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBGb2N1cyB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSlcbiAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh0aGlzLmRvbSk7XG4gICAgICAgIHNlbGVjdGlvblRvRE9NKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZG9jdW1lbnQgcm9vdCBpbiB3aGljaCB0aGUgZWRpdG9yIGV4aXN0cy4gVGhpcyB3aWxsXG4gICAgdXN1YWxseSBiZSB0aGUgdG9wLWxldmVsIGBkb2N1bWVudGAsIGJ1dCBtaWdodCBiZSBhIFtzaGFkb3dcbiAgICBET01dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYl9Db21wb25lbnRzL1NoYWRvd19ET00pXG4gICAgcm9vdCBpZiB0aGUgZWRpdG9yIGlzIGluc2lkZSBvbmUuXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3Jvb3Q7XG4gICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IHRoaXMuZG9tLnBhcmVudE5vZGU7IHNlYXJjaDsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLm5vZGVUeXBlID09IDkgfHwgKHNlYXJjaC5ub2RlVHlwZSA9PSAxMSAmJiBzZWFyY2guaG9zdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2guZ2V0U2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNlYXJjaCkuZ2V0U2VsZWN0aW9uID0gKCkgPT4gc2VhcmNoLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290ID0gc2VhcmNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiBhbiBleGlzdGluZyBlZGl0b3IgdmlldyBpcyBtb3ZlZCB0byBhIG5ldyBkb2N1bWVudCBvclxuICAgIHNoYWRvdyB0cmVlLCBjYWxsIHRoaXMgdG8gbWFrZSBpdCByZWNvbXB1dGUgaXRzIHJvb3QuXG4gICAgKi9cbiAgICB1cGRhdGVSb290KCkge1xuICAgICAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2l2ZW4gYSBwYWlyIG9mIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGVtLiBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuXG4gICAgY29vcmRpbmF0ZXMgYXJlbid0IGluc2lkZSBvZiB0aGUgZWRpdG9yLiBXaGVuIGFuIG9iamVjdCBpc1xuICAgIHJldHVybmVkLCBpdHMgYHBvc2AgcHJvcGVydHkgaXMgdGhlIHBvc2l0aW9uIG5lYXJlc3QgdG8gdGhlXG4gICAgY29vcmRpbmF0ZXMsIGFuZCBpdHMgYGluc2lkZWAgcHJvcGVydHkgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZVxuICAgIGlubmVyIG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gZmFsbHMgaW5zaWRlIG9mLCBvciAtMSBpZiBpdCBpcyBhdFxuICAgIHRoZSB0b3AgbGV2ZWwsIG5vdCBpbiBhbnkgbm9kZS5cbiAgICAqL1xuICAgIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgYGxlZnRgIGFuZCBgcmlnaHRgIHdpbGwgYmUgdGhlIHNhbWUgbnVtYmVyLCBhcyB0aGlzIHJldHVybnMgYVxuICAgIGZsYXQgY3Vyc29yLWlzaCByZWN0YW5nbGUuIElmIHRoZSBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB0aGluZ3NcbiAgICB0aGF0IGFyZW4ndCBkaXJlY3RseSBhZGphY2VudCwgYHNpZGVgIGRldGVybWluZXMgd2hpY2ggZWxlbWVudFxuICAgIGlzIHVzZWQuIFdoZW4gPCAwLCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIHBvc2l0aW9uIGlzIHVzZWQsXG4gICAgb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGFmdGVyLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICByZXR1cm4gY29vcmRzQXRQb3ModGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGRvY3VtZW50XG4gICAgcG9zaXRpb24uIFdoZW4gYHNpZGVgIGlzIG5lZ2F0aXZlLCBmaW5kIHRoZSBwb3NpdGlvbiBhcyBjbG9zZSBhc1xuICAgIHBvc3NpYmxlIHRvIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgcG9zaXRpb24uIFdoZW4gcG9zaXRpdmUsXG4gICAgcHJlZmVyIHBvc2l0aW9ucyBjbG9zZSB0byB0aGUgY29udGVudCBhZnRlciB0aGUgcG9zaXRpb24uIFdoZW5cbiAgICB6ZXJvLCBwcmVmZXIgYXMgc2hhbGxvdyBhIHBvc2l0aW9uIGFzIHBvc3NpYmxlLlxuICAgIFxuICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkICoqbm90KiogbXV0YXRlIHRoZSBlZGl0b3IncyBpbnRlcm5hbCBET00sXG4gICAgb25seSBpbnNwZWN0IGl0IChhbmQgZXZlbiB0aGF0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IG5vZGUgYWZ0ZXIgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uIE1heSByZXR1cm4gYG51bGxgIHdoZW4gdGhlIHBvc2l0aW9uIGRvZXNuJ3QgcG9pbnRcbiAgICBpbiBmcm9udCBvZiBhIG5vZGUgb3IgaWYgdGhlIG5vZGUgaXMgaW5zaWRlIGFuIG9wYXF1ZSBub2RlIHZpZXcuXG4gICAgXG4gICAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhYmxlIHRvIGNhbGwgdGhpbmdzIGxpa2VcbiAgICBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBvbiB0aGF0IERPTSBub2RlLiBEbyAqKm5vdCoqIG11dGF0ZSB0aGVcbiAgICBlZGl0b3IgRE9NIGRpcmVjdGx5LCBvciBhZGQgc3R5bGluZyB0aGlzIHdheSwgc2luY2UgdGhhdCB3aWxsIGJlXG4gICAgaW1tZWRpYXRlbHkgb3ZlcnJpZGVuIGJ5IHRoZSBlZGl0b3IgYXMgaXQgcmVkcmF3cyB0aGUgbm9kZS5cbiAgICAqL1xuICAgIG5vZGVET00ocG9zKSB7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5kb2NWaWV3LmRlc2NBdChwb3MpO1xuICAgICAgICByZXR1cm4gZGVzYyA/IGRlc2Mubm9kZURPTSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBET01cbiAgICBwb3NpdGlvbi4gKFdoZW5ldmVyIHBvc3NpYmxlLCBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3BlY3QgdGhlXG4gICAgZG9jdW1lbnQgc3RydWN0dXJlIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBwb2tpbmcgYXJvdW5kIGluIHRoZVxuICAgIERPTSwgYnV0IHNvbWV0aW1lc+KAlGZvciBleGFtcGxlIHdoZW4gaW50ZXJwcmV0aW5nIGFuIGV2ZW50XG4gICAgdGFyZ2V04oCUeW91IGRvbid0IGhhdmUgYSBjaG9pY2UuKVxuICAgIFxuICAgIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB3aGljaCBzaWRlIG9mIGEgRE9NXG4gICAgbm9kZSB0byB1c2Ugd2hlbiB0aGUgcG9zaXRpb24gaXMgaW5zaWRlIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0LCBiaWFzID0gLTEpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgYmlhcyk7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRE9NIHBvc2l0aW9uIG5vdCBpbnNpZGUgdGhlIGVkaXRvclwiKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBvdXQgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2sgd2hlblxuICAgIG1vdmluZyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gV2hlbiwgZm9yIGV4YW1wbGUsIGdpdmVuIGBcImxlZnRcImAsXG4gICAgaXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgbGVmdCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvclxuICAgIHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoYXQgcG9zaXRpb24ncyBwYXJlbnQgdGV4dGJsb2NrLiBXaWxsIGFwcGx5XG4gICAgdG8gdGhlIHZpZXcncyBjdXJyZW50IHN0YXRlIGJ5IGRlZmF1bHQsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0b1xuICAgIHBhc3MgYSBkaWZmZXJlbnQgc3RhdGUuXG4gICAgKi9cbiAgICBlbmRPZlRleHRibG9jayhkaXIsIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBlbmRPZlRleHRibG9jayh0aGlzLCBzdGF0ZSB8fCB0aGlzLnN0YXRlLCBkaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gdGhlIGVkaXRvcidzIHBhc3RlIGxvZ2ljIHdpdGggdGhlIGdpdmVuIEhUTUwgc3RyaW5nLiBUaGVcbiAgICBgZXZlbnRgLCBpZiBnaXZlbiwgd2lsbCBiZSBwYXNzZWQgdG8gdGhlXG4gICAgW2BoYW5kbGVQYXN0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmhhbmRsZVBhc3RlKSBob29rLlxuICAgICovXG4gICAgcGFzdGVIVE1MKGh0bWwsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIFwiXCIsIGh0bWwsIGZhbHNlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gcGxhaW4tdGV4dCBpbnB1dC5cbiAgICAqL1xuICAgIHBhc3RlVGV4dCh0ZXh0LCBldmVudCkge1xuICAgICAgICByZXR1cm4gZG9QYXN0ZSh0aGlzLCB0ZXh0LCBudWxsLCB0cnVlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gc2xpY2UgYXMgaXQgd291bGQgYmUgaWYgaXQgd2FzIGNvcGllZCBmcm9tXG4gICAgdGhpcyBlZGl0b3IuIFJldHVybnMgYSBET00gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFcbiAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2xpY2UgYXMgaXRzIGNoaWxkcmVuLCBhIHRleHR1YWxcbiAgICByZXByZXNlbnRhdGlvbiwgYW5kIHRoZSB0cmFuc2Zvcm1lZCBzbGljZSAod2hpY2ggY2FuIGJlXG4gICAgZGlmZmVyZW50IGZyb20gdGhlIGdpdmVuIGlucHV0IGR1ZSB0byBob29rcyBsaWtlXG4gICAgW2B0cmFuc2Zvcm1Db3BpZWRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcy50cmFuc2Zvcm1Db3BpZWQpKS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZvckNsaXBib2FyZChzbGljZSkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHRoaXMsIHNsaWNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlcyB0aGUgZWRpdG9yIGZyb20gdGhlIERPTSBhbmQgZGVzdHJveXMgYWxsIFtub2RlXG4gICAgdmlld3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3Lk5vZGVWaWV3KS5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5kb2NWaWV3KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZXN0cm95SW5wdXQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGUodGhpcy5zdGF0ZS5kb2MsIFtdLCB2aWV3RGVjb3JhdGlvbnModGhpcyksIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG51bGw7XG4gICAgICAgIGNsZWFyUmV1c2VkUmFuZ2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyB0cnVlIHdoZW4gdGhlIHZpZXcgaGFzIGJlZW5cbiAgICBbZGVzdHJveWVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRlc3Ryb3kpIChhbmQgdGh1cyBzaG91bGQgbm90IGJlXG4gICAgdXNlZCBhbnltb3JlKS5cbiAgICAqL1xuICAgIGdldCBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldyA9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2VkIGZvciB0ZXN0aW5nLlxuICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIERpc3BhdGNoIGEgdHJhbnNhY3Rpb24uIFdpbGwgY2FsbFxuICAgIFtgZGlzcGF0Y2hUcmFuc2FjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzLmRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgd2hlbiBnaXZlbiwgYW5kIG90aGVyd2lzZSBkZWZhdWx0cyB0byBhcHBseWluZyB0aGUgdHJhbnNhY3Rpb24gdG9cbiAgICB0aGUgY3VycmVudCBzdGF0ZSBhbmQgY2FsbGluZ1xuICAgIFtgdXBkYXRlU3RhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnVwZGF0ZVN0YXRlKSB3aXRoIHRoZSByZXN1bHQuXG4gICAgVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIHZpZXcgaW5zdGFuY2UsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgZWFzaWx5IHBhc3NlZCBhcm91bmQuXG4gICAgKi9cbiAgICBkaXNwYXRjaCh0cikge1xuICAgICAgICBsZXQgZGlzcGF0Y2hUcmFuc2FjdGlvbiA9IHRoaXMuX3Byb3BzLmRpc3BhdGNoVHJhbnNhY3Rpb247XG4gICAgICAgIGlmIChkaXNwYXRjaFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbi5jYWxsKHRoaXMsIHRyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh0aGlzLnN0YXRlLmFwcGx5KHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLmRvbVNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbClcbiAgICAgICAgICAgIHJldHVybiB7IGZvY3VzTm9kZTogbnVsbCwgZm9jdXNPZmZzZXQ6IDAsIGFuY2hvck5vZGU6IG51bGwsIGFuY2hvck9mZnNldDogMCB9O1xuICAgICAgICByZXR1cm4gc2FmYXJpICYmIHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gMTEgJiZcbiAgICAgICAgICAgIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tICYmIHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHRoaXMsIHNlbCkgfHwgc2VsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbVNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlRG9jRGVjbyh2aWV3KSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBhdHRycy5jbGFzcyA9IFwiUHJvc2VNaXJyb3JcIjtcbiAgICBhdHRycy5jb250ZW50ZWRpdGFibGUgPSBTdHJpbmcodmlldy5lZGl0YWJsZSk7XG4gICAgdmlldy5zb21lUHJvcChcImF0dHJpYnV0ZXNcIiwgdmFsdWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUodmlldy5zdGF0ZSk7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGZvciAobGV0IGF0dHIgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBcImNsYXNzXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLmNsYXNzICs9IFwiIFwiICsgdmFsdWVbYXR0cl07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ciA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLnN0eWxlID0gKGF0dHJzLnN0eWxlID8gYXR0cnMuc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsdWVbYXR0cl07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWF0dHJzW2F0dHJdICYmIGF0dHIgIT0gXCJjb250ZW50ZWRpdGFibGVcIiAmJiBhdHRyICE9IFwibm9kZU5hbWVcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0cl0gPSBTdHJpbmcodmFsdWVbYXR0cl0pO1xuICAgICAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghYXR0cnMudHJhbnNsYXRlKVxuICAgICAgICBhdHRycy50cmFuc2xhdGUgPSBcIm5vXCI7XG4gICAgcmV0dXJuIFtEZWNvcmF0aW9uLm5vZGUoMCwgdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplLCBhdHRycyldO1xufVxuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yV3JhcHBlcih2aWV3KSB7XG4gICAgaWYgKHZpZXcubWFya0N1cnNvcikge1xuICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3Itc2VwYXJhdG9yXCI7XG4gICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJtYXJrLXBsYWNlaG9sZGVyXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcImFsdFwiLCBcIlwiKTtcbiAgICAgICAgdmlldy5jdXJzb3JXcmFwcGVyID0geyBkb20sIGRlY286IERlY29yYXRpb24ud2lkZ2V0KHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20sIGRvbSwgeyByYXc6IHRydWUsIG1hcmtzOiB2aWV3Lm1hcmtDdXJzb3IgfSkgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXcuY3Vyc29yV3JhcHBlciA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RWRpdGFibGUodmlldykge1xuICAgIHJldHVybiAhdmlldy5zb21lUHJvcChcImVkaXRhYmxlXCIsIHZhbHVlID0+IHZhbHVlKHZpZXcuc3RhdGUpID09PSBmYWxzZSk7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChzZWwxLCBzZWwyKSB7XG4gICAgbGV0IGRlcHRoID0gTWF0aC5taW4oc2VsMS4kYW5jaG9yLnNoYXJlZERlcHRoKHNlbDEuaGVhZCksIHNlbDIuJGFuY2hvci5zaGFyZWREZXB0aChzZWwyLmhlYWQpKTtcbiAgICByZXR1cm4gc2VsMS4kYW5jaG9yLnN0YXJ0KGRlcHRoKSAhPSBzZWwyLiRhbmNob3Iuc3RhcnQoZGVwdGgpO1xufVxuZnVuY3Rpb24gYnVpbGROb2RlVmlld3Modmlldykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIGFkZChvYmopIHtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHByb3ApKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gICAgdmlldy5zb21lUHJvcChcIm5vZGVWaWV3c1wiLCBhZGQpO1xuICAgIHZpZXcuc29tZVByb3AoXCJtYXJrVmlld3NcIiwgYWRkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2hhbmdlZE5vZGVWaWV3cyhhLCBiKSB7XG4gICAgbGV0IG5BID0gMCwgbkIgPSAwO1xuICAgIGZvciAobGV0IHByb3AgaW4gYSkge1xuICAgICAgICBpZiAoYVtwcm9wXSAhPSBiW3Byb3BdKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG5BKys7XG4gICAgfVxuICAgIGZvciAobGV0IF8gaW4gYilcbiAgICAgICAgbkIrKztcbiAgICByZXR1cm4gbkEgIT0gbkI7XG59XG5mdW5jdGlvbiBjaGVja1N0YXRlQ29tcG9uZW50KHBsdWdpbikge1xuICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSB8fCBwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiB8fCBwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJQbHVnaW5zIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgdmlldyBtdXN0IG5vdCBoYXZlIGEgc3RhdGUgY29tcG9uZW50XCIpO1xufVxuXG5leHBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3LCBfX2VuZENvbXBvc2l0aW9uLCBfX3BhcnNlRnJvbUNsaXBib2FyZCB9O1xuIiwidmFyIEdPT0RfTEVBRl9TSVpFID0gMjAwO1xuXG4vLyA6OiBjbGFzczxUPiBBIHJvcGUgc2VxdWVuY2UgaXMgYSBwZXJzaXN0ZW50IHNlcXVlbmNlIGRhdGEgc3RydWN0dXJlXG4vLyB0aGF0IHN1cHBvcnRzIGFwcGVuZGluZywgcHJlcGVuZGluZywgYW5kIHNsaWNpbmcgd2l0aG91dCBkb2luZyBhXG4vLyBmdWxsIGNvcHkuIEl0IGlzIHJlcHJlc2VudGVkIGFzIGEgbW9zdGx5LWJhbGFuY2VkIHRyZWUuXG52YXIgUm9wZVNlcXVlbmNlID0gZnVuY3Rpb24gUm9wZVNlcXVlbmNlICgpIHt9O1xuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICBvdGhlciA9IFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKTtcblxuICByZXR1cm4gKCF0aGlzLmxlbmd0aCAmJiBvdGhlcikgfHxcbiAgICAob3RoZXIubGVuZ3RoIDwgR09PRF9MRUFGX1NJWkUgJiYgdGhpcy5sZWFmQXBwZW5kKG90aGVyKSkgfHxcbiAgICAodGhpcy5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiBvdGhlci5sZWFmUHJlcGVuZCh0aGlzKSkgfHxcbiAgICB0aGlzLmFwcGVuZElubmVyKG90aGVyKVxufTtcblxuLy8gOjogKHVuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+Pikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gUHJlcGVuZCBhbiBhcnJheSBvciBvdGhlciByb3BlIHRvIHRoaXMgb25lLCByZXR1cm5pbmcgYSBuZXcgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIHByZXBlbmQgKG90aGVyKSB7XG4gIGlmICghb3RoZXIubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgcmV0dXJuIFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKS5hcHBlbmQodGhpcylcbn07XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kSW5uZXIgPSBmdW5jdGlvbiBhcHBlbmRJbm5lciAob3RoZXIpIHtcbiAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG59O1xuXG4vLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXBlc2VudGluZyBhIHN1Yi1zZXF1ZW5jZSBvZiB0aGlzIHJvcGUuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tID49IHRvKSB7IHJldHVybiBSb3BlU2VxdWVuY2UuZW1wdHkgfVxuICByZXR1cm4gdGhpcy5zbGljZUlubmVyKE1hdGgubWF4KDAsIGZyb20pLCBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdG8pKVxufTtcblxuLy8gOjogKG51bWJlcikg4oaSIFRcbi8vIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gIGlmIChpIDwgMCB8fCBpID49IHRoaXMubGVuZ3RoKSB7IHJldHVybiB1bmRlZmluZWQgfVxuICByZXR1cm4gdGhpcy5nZXRJbm5lcihpKVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSDihpIgP2Jvb2wsID9udW1iZXIsID9udW1iZXIpXG4vLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGJldHdlZW4gdGhlIGdpdmVuXG4vLyBpbmRpY2VzLiBUaGlzIHRlbmRzIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gbG9vcGluZyBvdmVyIHRoZVxuLy8gaW5kaWNlcyBhbmQgY2FsbGluZyBgZ2V0YCwgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgdG8gZGVzY2VuZCB0aGVcbi8vIHRyZWUgZm9yIGV2ZXJ5IGVsZW1lbnQuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoIChmLCBmcm9tLCB0bykge1xuICAgIGlmICggZnJvbSA9PT0gdm9pZCAwICkgZnJvbSA9IDA7XG4gICAgaWYgKCB0byA9PT0gdm9pZCAwICkgdG8gPSB0aGlzLmxlbmd0aDtcblxuICBpZiAoZnJvbSA8PSB0bylcbiAgICB7IHRoaXMuZm9yRWFjaElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSDihpIgVSwgP251bWJlciwgP251bWJlcikg4oaSIFtVXVxuLy8gTWFwIHRoZSBnaXZlbiBmdW5jdGlvbnMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJvcGUsIHByb2R1Y2luZ1xuLy8gYSBmbGF0IGFycmF5LlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbHQsIGkpIHsgcmV0dXJuIHJlc3VsdC5wdXNoKGYoZWx0LCBpKSk7IH0sIGZyb20sIHRvKTtcbiAgcmV0dXJuIHJlc3VsdFxufTtcblxuLy8gOjogKD91bmlvbjxbVF0sIFJvcGVTZXF1ZW5jZTxUPj4pIOKGkiBSb3BlU2VxdWVuY2U8VD5cbi8vIENyZWF0ZSBhIHJvcGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBhcnJheSwgb3IgcmV0dXJuIHRoZSByb3BlXG4vLyBpdHNlbGYgaWYgYSByb3BlIHdhcyBnaXZlbi5cblJvcGVTZXF1ZW5jZS5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmFsdWVzKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSb3BlU2VxdWVuY2UpIHsgcmV0dXJuIHZhbHVlcyB9XG4gIHJldHVybiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA/IG5ldyBMZWFmKHZhbHVlcykgOiBSb3BlU2VxdWVuY2UuZW1wdHlcbn07XG5cbnZhciBMZWFmID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIExlYWYodmFsdWVzKSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIExlYWYuX19wcm90b19fID0gUm9wZVNlcXVlbmNlO1xuICBMZWFmLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIExlYWYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGVhZjtcblxuICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBsZW5ndGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVwdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICBMZWFmLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgcmV0dXJuIG5ldyBMZWFmKHRoaXMudmFsdWVzLnNsaWNlKGZyb20sIHRvKSlcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5nZXRJbm5lciA9IGZ1bmN0aW9uIGdldElubmVyIChpKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2ldXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaElubmVyID0gZnVuY3Rpb24gZm9yRWFjaElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb20gLSAxOyBpID49IHRvOyBpLS0pXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUubGVhZkFwcGVuZCA9IGZ1bmN0aW9uIGxlYWZBcHBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuY29uY2F0KG90aGVyLmZsYXR0ZW4oKSkpIH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aCA8PSBHT09EX0xFQUZfU0laRSlcbiAgICAgIHsgcmV0dXJuIG5ldyBMZWFmKG90aGVyLmZsYXR0ZW4oKS5jb25jYXQodGhpcy52YWx1ZXMpKSB9XG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmxlbmd0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMuZGVwdGguZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMCB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMZWFmLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgcmV0dXJuIExlYWY7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG4vLyA6OiBSb3BlU2VxdWVuY2Vcbi8vIFRoZSBlbXB0eSByb3BlIHNlcXVlbmNlLlxuUm9wZVNlcXVlbmNlLmVtcHR5ID0gbmV3IExlYWYoW10pO1xuXG52YXIgQXBwZW5kID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIEFwcGVuZChsZWZ0LCByaWdodCkge1xuICAgIFJvcGVTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIHRoaXMubGVuZ3RoID0gbGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGg7XG4gICAgdGhpcy5kZXB0aCA9IE1hdGgubWF4KGxlZnQuZGVwdGgsIHJpZ2h0LmRlcHRoKSArIDE7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIEFwcGVuZC5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIEFwcGVuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSb3BlU2VxdWVuY2UgJiYgUm9wZVNlcXVlbmNlLnByb3RvdHlwZSApO1xuICBBcHBlbmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXBwZW5kO1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uIGZsYXR0ZW4gKCkge1xuICAgIHJldHVybiB0aGlzLmxlZnQuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnJpZ2h0LmZsYXR0ZW4oKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gaSA8IHRoaXMubGVmdC5sZW5ndGggPyB0aGlzLmxlZnQuZ2V0KGkpIDogdGhpcy5yaWdodC5nZXQoaSAtIHRoaXMubGVmdC5sZW5ndGgpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA8IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hJbm5lcihmLCBmcm9tLCBNYXRoLm1pbih0bywgbGVmdExlbiksIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbm5lcihmLCBNYXRoLm1heChmcm9tIC0gbGVmdExlbiwgMCksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbnZlcnRlZElubmVyID0gZnVuY3Rpb24gZm9yRWFjaEludmVydGVkSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA+IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBmcm9tIC0gbGVmdExlbiwgTWF0aC5tYXgodG8sIGxlZnRMZW4pIC0gbGVmdExlbiwgc3RhcnQgKyBsZWZ0TGVuKSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgTWF0aC5taW4oZnJvbSwgbGVmdExlbiksIHRvLCBzdGFydCkgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmICh0byA8PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgdG8pIH1cbiAgICBpZiAoZnJvbSA+PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKGZyb20gLSBsZWZ0TGVuLCB0byAtIGxlZnRMZW4pIH1cbiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKGZyb20sIGxlZnRMZW4pLmFwcGVuZCh0aGlzLnJpZ2h0LnNsaWNlKDAsIHRvIC0gbGVmdExlbikpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICB2YXIgaW5uZXIgPSB0aGlzLnJpZ2h0LmxlYWZBcHBlbmQob3RoZXIpO1xuICAgIGlmIChpbm5lcikgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIGlubmVyKSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMubGVmdC5sZWFmUHJlcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKGlubmVyLCB0aGlzLnJpZ2h0KSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlZnQuZGVwdGggPj0gTWF0aC5tYXgodGhpcy5yaWdodC5kZXB0aCwgb3RoZXIuZGVwdGgpICsgMSlcbiAgICAgIHsgcmV0dXJuIG5ldyBBcHBlbmQodGhpcy5sZWZ0LCBuZXcgQXBwZW5kKHRoaXMucmlnaHQsIG90aGVyKSkgfVxuICAgIHJldHVybiBuZXcgQXBwZW5kKHRoaXMsIG90aGVyKVxuICB9O1xuXG4gIHJldHVybiBBcHBlbmQ7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBSb3BlU2VxdWVuY2U7XG4iLCJpbXBvcnQgUm9wZVNlcXVlbmNlIGZyb20gJ3JvcGUtc2VxdWVuY2UnO1xuaW1wb3J0IHsgTWFwcGluZyB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBQbHVnaW5LZXksIFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuLy8gUHJvc2VNaXJyb3IncyBoaXN0b3J5IGlzbid0IHNpbXBseSBhIHdheSB0byByb2xsIGJhY2sgdG8gYSBwcmV2aW91c1xuLy8gc3RhdGUsIGJlY2F1c2UgUHJvc2VNaXJyb3Igc3VwcG9ydHMgYXBwbHlpbmcgY2hhbmdlcyB3aXRob3V0IGFkZGluZ1xuLy8gdGhlbSB0byB0aGUgaGlzdG9yeSAoZm9yIGV4YW1wbGUgZHVyaW5nIGNvbGxhYm9yYXRpb24pLlxuLy9cbi8vIFRvIHRoaXMgZW5kLCBlYWNoICdCcmFuY2gnIChvbmUgZm9yIHRoZSB1bmRvIGhpc3RvcnkgYW5kIG9uZSBmb3Jcbi8vIHRoZSByZWRvIGhpc3RvcnkpIGtlZXBzIGFuIGFycmF5IG9mICdJdGVtcycsIHdoaWNoIGNhbiBvcHRpb25hbGx5XG4vLyBob2xkIGEgc3RlcCAoYW4gYWN0dWFsIHVuZG9hYmxlIGNoYW5nZSksIGFuZCBhbHdheXMgaG9sZCBhIHBvc2l0aW9uXG4vLyBtYXAgKHdoaWNoIGlzIG5lZWRlZCB0byBtb3ZlIGNoYW5nZXMgYmVsb3cgdGhlbSB0byBhcHBseSB0byB0aGVcbi8vIGN1cnJlbnQgZG9jdW1lbnQpLlxuLy9cbi8vIEFuIGl0ZW0gdGhhdCBoYXMgYm90aCBhIHN0ZXAgYW5kIGEgc2VsZWN0aW9uIGJvb2ttYXJrIGlzIHRoZSBzdGFydFxuLy8gb2YgYW4gJ2V2ZW50JyDigJQgYSBncm91cCBvZiBjaGFuZ2VzIHRoYXQgd2lsbCBiZSB1bmRvbmUgb3IgcmVkb25lIGF0XG4vLyBvbmNlLiAoSXQgc3RvcmVzIG9ubHkgdGhlIGJvb2ttYXJrLCBzaW5jZSB0aGF0IHdheSB3ZSBkb24ndCBoYXZlIHRvXG4vLyBwcm92aWRlIGEgZG9jdW1lbnQgdW50aWwgdGhlIHNlbGVjdGlvbiBpcyBhY3R1YWxseSBhcHBsaWVkLCB3aGljaFxuLy8gaXMgdXNlZnVsIHdoZW4gY29tcHJlc3NpbmcuKVxuLy8gVXNlZCB0byBzY2hlZHVsZSBoaXN0b3J5IGNvbXByZXNzaW9uXG5jb25zdCBtYXhfZW1wdHlfaXRlbXMgPSA1MDA7XG5jbGFzcyBCcmFuY2gge1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1zLCBldmVudENvdW50KSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgdGhpcy5ldmVudENvdW50ID0gZXZlbnRDb3VudDtcbiAgICB9XG4gICAgLy8gUG9wIHRoZSBsYXRlc3QgZXZlbnQgb2ZmIHRoZSBicmFuY2gncyBoaXN0b3J5IGFuZCBhcHBseSBpdFxuICAgIC8vIHRvIGEgZG9jdW1lbnQgdHJhbnNmb3JtLlxuICAgIHBvcEV2ZW50KHN0YXRlLCBwcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50Q291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICAgIGZvciAoOzsgZW5kLS0pIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5pdGVtcy5nZXQoZW5kIC0gMSk7XG4gICAgICAgICAgICBpZiAobmV4dC5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAtLWVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVtYXAsIG1hcEZyb207XG4gICAgICAgIGlmIChwcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgICAgICByZW1hcCA9IHRoaXMucmVtYXBwaW5nKGVuZCwgdGhpcy5pdGVtcy5sZW5ndGgpO1xuICAgICAgICAgICAgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0cmFuc2Zvcm0gPSBzdGF0ZS50cjtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiwgcmVtYWluaW5nO1xuICAgICAgICBsZXQgYWRkQWZ0ZXIgPSBbXSwgYWRkQmVmb3JlID0gW107XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFpdGVtLnN0ZXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbWFwID0gdGhpcy5yZW1hcHBpbmcoZW5kLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgICAgIGFkZEJlZm9yZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZW1hcCkge1xuICAgICAgICAgICAgICAgIGFkZEJlZm9yZS5wdXNoKG5ldyBJdGVtKGl0ZW0ubWFwKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBpdGVtLnN0ZXAubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKSwgbWFwO1xuICAgICAgICAgICAgICAgIGlmIChzdGVwICYmIHRyYW5zZm9ybS5tYXliZVN0ZXAoc3RlcCkuZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcCA9IHRyYW5zZm9ybS5tYXBwaW5nLm1hcHNbdHJhbnNmb3JtLm1hcHBpbmcubWFwcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQWZ0ZXIucHVzaChuZXcgSXRlbShtYXAsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhZGRBZnRlci5sZW5ndGggKyBhZGRCZWZvcmUubGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBpZiAobWFwKVxuICAgICAgICAgICAgICAgICAgICByZW1hcC5hcHBlbmRNYXAobWFwLCBtYXBGcm9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5tYXliZVN0ZXAoaXRlbS5zdGVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdGVtLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHJlbWFwID8gaXRlbS5zZWxlY3Rpb24ubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKSA6IGl0ZW0uc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IG5ldyBCcmFuY2godGhpcy5pdGVtcy5zbGljZSgwLCBlbmQpLmFwcGVuZChhZGRCZWZvcmUucmV2ZXJzZSgpLmNvbmNhdChhZGRBZnRlcikpLCB0aGlzLmV2ZW50Q291bnQgLSAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaXRlbXMubGVuZ3RoLCAwKTtcbiAgICAgICAgcmV0dXJuIHsgcmVtYWluaW5nOiByZW1haW5pbmcsIHRyYW5zZm9ybSwgc2VsZWN0aW9uOiBzZWxlY3Rpb24gfTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJyYW5jaCB3aXRoIHRoZSBnaXZlbiB0cmFuc2Zvcm0gYWRkZWQuXG4gICAgYWRkVHJhbnNmb3JtKHRyYW5zZm9ybSwgc2VsZWN0aW9uLCBoaXN0T3B0aW9ucywgcHJlc2VydmVJdGVtcykge1xuICAgICAgICBsZXQgbmV3SXRlbXMgPSBbXSwgZXZlbnRDb3VudCA9IHRoaXMuZXZlbnRDb3VudDtcbiAgICAgICAgbGV0IG9sZEl0ZW1zID0gdGhpcy5pdGVtcywgbGFzdEl0ZW0gPSAhcHJlc2VydmVJdGVtcyAmJiBvbGRJdGVtcy5sZW5ndGggPyBvbGRJdGVtcy5nZXQob2xkSXRlbXMubGVuZ3RoIC0gMSkgOiBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zZm9ybS5zdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0ZXAgPSB0cmFuc2Zvcm0uc3RlcHNbaV0uaW52ZXJ0KHRyYW5zZm9ybS5kb2NzW2ldKTtcbiAgICAgICAgICAgIGxldCBpdGVtID0gbmV3IEl0ZW0odHJhbnNmb3JtLm1hcHBpbmcubWFwc1tpXSwgc3RlcCwgc2VsZWN0aW9uKSwgbWVyZ2VkO1xuICAgICAgICAgICAgaWYgKG1lcmdlZCA9IGxhc3RJdGVtICYmIGxhc3RJdGVtLm1lcmdlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaXRlbSA9IG1lcmdlZDtcbiAgICAgICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICAgICAgbmV3SXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvbGRJdGVtcyA9IG9sZEl0ZW1zLnNsaWNlKDAsIG9sZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3SXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBldmVudENvdW50Kys7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZUl0ZW1zKVxuICAgICAgICAgICAgICAgIGxhc3RJdGVtID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3ZlcmZsb3cgPSBldmVudENvdW50IC0gaGlzdE9wdGlvbnMuZGVwdGg7XG4gICAgICAgIGlmIChvdmVyZmxvdyA+IERFUFRIX09WRVJGTE9XKSB7XG4gICAgICAgICAgICBvbGRJdGVtcyA9IGN1dE9mZkV2ZW50cyhvbGRJdGVtcywgb3ZlcmZsb3cpO1xuICAgICAgICAgICAgZXZlbnRDb3VudCAtPSBvdmVyZmxvdztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEJyYW5jaChvbGRJdGVtcy5hcHBlbmQobmV3SXRlbXMpLCBldmVudENvdW50KTtcbiAgICB9XG4gICAgcmVtYXBwaW5nKGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBtYXBzID0gbmV3IE1hcHBpbmc7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IG1pcnJvclBvcyA9IGl0ZW0ubWlycm9yT2Zmc2V0ICE9IG51bGwgJiYgaSAtIGl0ZW0ubWlycm9yT2Zmc2V0ID49IGZyb21cbiAgICAgICAgICAgICAgICA/IG1hcHMubWFwcy5sZW5ndGggLSBpdGVtLm1pcnJvck9mZnNldCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG1hcHMuYXBwZW5kTWFwKGl0ZW0ubWFwLCBtaXJyb3JQb3MpO1xuICAgICAgICB9LCBmcm9tLCB0byk7XG4gICAgICAgIHJldHVybiBtYXBzO1xuICAgIH1cbiAgICBhZGRNYXBzKGFycmF5KSB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50Q291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEJyYW5jaCh0aGlzLml0ZW1zLmFwcGVuZChhcnJheS5tYXAobWFwID0+IG5ldyBJdGVtKG1hcCkpKSwgdGhpcy5ldmVudENvdW50KTtcbiAgICB9XG4gICAgLy8gV2hlbiB0aGUgY29sbGFiIG1vZHVsZSByZWNlaXZlcyByZW1vdGUgY2hhbmdlcywgdGhlIGhpc3RvcnkgaGFzXG4gICAgLy8gdG8ga25vdyBhYm91dCB0aG9zZSwgc28gdGhhdCBpdCBjYW4gYWRqdXN0IHRoZSBzdGVwcyB0aGF0IHdlcmVcbiAgICAvLyByZWJhc2VkIG9uIHRvcCBvZiB0aGUgcmVtb3RlIGNoYW5nZXMsIGFuZCBpbmNsdWRlIHRoZSBwb3NpdGlvblxuICAgIC8vIG1hcHMgZm9yIHRoZSByZW1vdGUgY2hhbmdlcyBpbiBpdHMgYXJyYXkgb2YgaXRlbXMuXG4gICAgcmViYXNlZChyZWJhc2VkVHJhbnNmb3JtLCByZWJhc2VkQ291bnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50Q291bnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgbGV0IHJlYmFzZWRJdGVtcyA9IFtdLCBzdGFydCA9IE1hdGgubWF4KDAsIHRoaXMuaXRlbXMubGVuZ3RoIC0gcmViYXNlZENvdW50KTtcbiAgICAgICAgbGV0IG1hcHBpbmcgPSByZWJhc2VkVHJhbnNmb3JtLm1hcHBpbmc7XG4gICAgICAgIGxldCBuZXdVbnRpbCA9IHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHMubGVuZ3RoO1xuICAgICAgICBsZXQgZXZlbnRDb3VudCA9IHRoaXMuZXZlbnRDb3VudDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoaXRlbS5zZWxlY3Rpb24pXG4gICAgICAgICAgICBldmVudENvdW50LS07IH0sIHN0YXJ0KTtcbiAgICAgICAgbGV0IGlSZWJhc2VkID0gcmViYXNlZENvdW50O1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5nZXRNaXJyb3IoLS1pUmViYXNlZCk7XG4gICAgICAgICAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbmV3VW50aWwgPSBNYXRoLm1pbihuZXdVbnRpbCwgcG9zKTtcbiAgICAgICAgICAgIGxldCBtYXAgPSBtYXBwaW5nLm1hcHNbcG9zXTtcbiAgICAgICAgICAgIGlmIChpdGVtLnN0ZXApIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IHJlYmFzZWRUcmFuc2Zvcm0uc3RlcHNbcG9zXS5pbnZlcnQocmViYXNlZFRyYW5zZm9ybS5kb2NzW3Bvc10pO1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSBpdGVtLnNlbGVjdGlvbiAmJiBpdGVtLnNlbGVjdGlvbi5tYXAobWFwcGluZy5zbGljZShpUmViYXNlZCArIDEsIHBvcykpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQrKztcbiAgICAgICAgICAgICAgICByZWJhc2VkSXRlbXMucHVzaChuZXcgSXRlbShtYXAsIHN0ZXAsIHNlbGVjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmViYXNlZEl0ZW1zLnB1c2gobmV3IEl0ZW0obWFwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHN0YXJ0KTtcbiAgICAgICAgbGV0IG5ld01hcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJlYmFzZWRDb3VudDsgaSA8IG5ld1VudGlsOyBpKyspXG4gICAgICAgICAgICBuZXdNYXBzLnB1c2gobmV3IEl0ZW0obWFwcGluZy5tYXBzW2ldKSk7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgc3RhcnQpLmFwcGVuZChuZXdNYXBzKS5hcHBlbmQocmViYXNlZEl0ZW1zKTtcbiAgICAgICAgbGV0IGJyYW5jaCA9IG5ldyBCcmFuY2goaXRlbXMsIGV2ZW50Q291bnQpO1xuICAgICAgICBpZiAoYnJhbmNoLmVtcHR5SXRlbUNvdW50KCkgPiBtYXhfZW1wdHlfaXRlbXMpXG4gICAgICAgICAgICBicmFuY2ggPSBicmFuY2guY29tcHJlc3ModGhpcy5pdGVtcy5sZW5ndGggLSByZWJhc2VkSXRlbXMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGJyYW5jaDtcbiAgICB9XG4gICAgZW1wdHlJdGVtQ291bnQoKSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHsgaWYgKCFpdGVtLnN0ZXApXG4gICAgICAgICAgICBjb3VudCsrOyB9KTtcbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cbiAgICAvLyBDb21wcmVzc2luZyBhIGJyYW5jaCBtZWFucyByZXdyaXRpbmcgaXQgdG8gcHVzaCB0aGUgYWlyIChtYXAtb25seVxuICAgIC8vIGl0ZW1zKSBvdXQuIER1cmluZyBjb2xsYWJvcmF0aW9uLCB0aGVzZSBuYXR1cmFsbHkgYWNjdW11bGF0ZVxuICAgIC8vIGJlY2F1c2UgZWFjaCByZW1vdGUgY2hhbmdlIGFkZHMgb25lLiBUaGUgYHVwdG9gIGFyZ3VtZW50IGlzIHVzZWRcbiAgICAvLyB0byBlbnN1cmUgdGhhdCBvbmx5IHRoZSBpdGVtcyBiZWxvdyBhIGdpdmVuIGxldmVsIGFyZSBjb21wcmVzc2VkLFxuICAgIC8vIGJlY2F1c2UgYHJlYmFzZWRgIHJlbGllcyBvbiBhIGNsZWFuLCB1bnRvdWNoZWQgc2V0IG9mIGl0ZW1zIGluXG4gICAgLy8gb3JkZXIgdG8gYXNzb2NpYXRlIG9sZCBpdGVtcyB3aXRoIHJlYmFzZWQgc3RlcHMuXG4gICAgY29tcHJlc3ModXB0byA9IHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCByZW1hcCA9IHRoaXMucmVtYXBwaW5nKDAsIHVwdG8pLCBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgIGxldCBpdGVtcyA9IFtdLCBldmVudHMgPSAwO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpID49IHVwdG8pIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLnNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtLnN0ZXApIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IGl0ZW0uc3RlcC5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpLCBtYXAgPSBzdGVwICYmIHN0ZXAuZ2V0TWFwKCk7XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgICAgIGlmIChtYXApXG4gICAgICAgICAgICAgICAgICAgIHJlbWFwLmFwcGVuZE1hcChtYXAsIG1hcEZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSBpdGVtLnNlbGVjdGlvbiAmJiBpdGVtLnNlbGVjdGlvbi5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzKys7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdJdGVtID0gbmV3IEl0ZW0obWFwLmludmVydCgpLCBzdGVwLCBzZWxlY3Rpb24pLCBtZXJnZWQsIGxhc3QgPSBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVyZ2VkID0gaXRlbXMubGVuZ3RoICYmIGl0ZW1zW2xhc3RdLm1lcmdlKG5ld0l0ZW0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNbbGFzdF0gPSBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5tYXApIHtcbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuaXRlbXMubGVuZ3RoLCAwKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2goUm9wZVNlcXVlbmNlLmZyb20oaXRlbXMucmV2ZXJzZSgpKSwgZXZlbnRzKTtcbiAgICB9XG59XG5CcmFuY2guZW1wdHkgPSBuZXcgQnJhbmNoKFJvcGVTZXF1ZW5jZS5lbXB0eSwgMCk7XG5mdW5jdGlvbiBjdXRPZmZFdmVudHMoaXRlbXMsIG4pIHtcbiAgICBsZXQgY3V0UG9pbnQ7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24gJiYgKG4tLSA9PSAwKSkge1xuICAgICAgICAgICAgY3V0UG9pbnQgPSBpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZW1zLnNsaWNlKGN1dFBvaW50KTtcbn1cbmNsYXNzIEl0ZW0ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSAoZm9yd2FyZCkgc3RlcCBtYXAgZm9yIHRoaXMgaXRlbS5cbiAgICBtYXAsIFxuICAgIC8vIFRoZSBpbnZlcnRlZCBzdGVwXG4gICAgc3RlcCwgXG4gICAgLy8gSWYgdGhpcyBpcyBub24tbnVsbCwgdGhpcyBpdGVtIGlzIHRoZSBzdGFydCBvZiBhIGdyb3VwLCBhbmRcbiAgICAvLyB0aGlzIHNlbGVjdGlvbiBpcyB0aGUgc3RhcnRpbmcgc2VsZWN0aW9uIGZvciB0aGUgZ3JvdXAgKHRoZSBvbmVcbiAgICAvLyB0aGF0IHdhcyBhY3RpdmUgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIHdhcyBhcHBsaWVkKVxuICAgIHNlbGVjdGlvbiwgXG4gICAgLy8gSWYgdGhpcyBpdGVtIGlzIHRoZSBpbnZlcnNlIG9mIGEgcHJldmlvdXMgbWFwcGluZyBvbiB0aGUgc3RhY2ssXG4gICAgLy8gdGhpcyBwb2ludHMgYXQgdGhlIGludmVyc2UncyBvZmZzZXRcbiAgICBtaXJyb3JPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuc3RlcCA9IHN0ZXA7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLm1pcnJvck9mZnNldCA9IG1pcnJvck9mZnNldDtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RlcCAmJiBvdGhlci5zdGVwICYmICFvdGhlci5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCBzdGVwID0gb3RoZXIuc3RlcC5tZXJnZSh0aGlzLnN0ZXApO1xuICAgICAgICAgICAgaWYgKHN0ZXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVtKHN0ZXAuZ2V0TWFwKCkuaW52ZXJ0KCksIHN0ZXAsIHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIFRoZSB2YWx1ZSBvZiB0aGUgc3RhdGUgZmllbGQgdGhhdCB0cmFja3MgdW5kby9yZWRvIGhpc3RvcnkgZm9yIHRoYXRcbi8vIHN0YXRlLiBXaWxsIGJlIHN0b3JlZCBpbiB0aGUgcGx1Z2luIHN0YXRlIHdoZW4gdGhlIGhpc3RvcnkgcGx1Z2luXG4vLyBpcyBhY3RpdmUuXG5jbGFzcyBIaXN0b3J5U3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKGRvbmUsIHVuZG9uZSwgcHJldlJhbmdlcywgcHJldlRpbWUsIHByZXZDb21wb3NpdGlvbikge1xuICAgICAgICB0aGlzLmRvbmUgPSBkb25lO1xuICAgICAgICB0aGlzLnVuZG9uZSA9IHVuZG9uZTtcbiAgICAgICAgdGhpcy5wcmV2UmFuZ2VzID0gcHJldlJhbmdlcztcbiAgICAgICAgdGhpcy5wcmV2VGltZSA9IHByZXZUaW1lO1xuICAgICAgICB0aGlzLnByZXZDb21wb3NpdGlvbiA9IHByZXZDb21wb3NpdGlvbjtcbiAgICB9XG59XG5jb25zdCBERVBUSF9PVkVSRkxPVyA9IDIwO1xuLy8gUmVjb3JkIGEgdHJhbnNmb3JtYXRpb24gaW4gdW5kbyBoaXN0b3J5LlxuZnVuY3Rpb24gYXBwbHlUcmFuc2FjdGlvbihoaXN0b3J5LCBzdGF0ZSwgdHIsIG9wdGlvbnMpIHtcbiAgICBsZXQgaGlzdG9yeVRyID0gdHIuZ2V0TWV0YShoaXN0b3J5S2V5KSwgcmViYXNlZDtcbiAgICBpZiAoaGlzdG9yeVRyKVxuICAgICAgICByZXR1cm4gaGlzdG9yeVRyLmhpc3RvcnlTdGF0ZTtcbiAgICBpZiAodHIuZ2V0TWV0YShjbG9zZUhpc3RvcnlLZXkpKVxuICAgICAgICBoaXN0b3J5ID0gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUsIGhpc3RvcnkudW5kb25lLCBudWxsLCAwLCAtMSk7XG4gICAgbGV0IGFwcGVuZGVkID0gdHIuZ2V0TWV0YShcImFwcGVuZGVkVHJhbnNhY3Rpb25cIik7XG4gICAgaWYgKHRyLnN0ZXBzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5O1xuICAgIH1cbiAgICBlbHNlIGlmIChhcHBlbmRlZCAmJiBhcHBlbmRlZC5nZXRNZXRhKGhpc3RvcnlLZXkpKSB7XG4gICAgICAgIGlmIChhcHBlbmRlZC5nZXRNZXRhKGhpc3RvcnlLZXkpLnJlZG8pXG4gICAgICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUuYWRkVHJhbnNmb3JtKHRyLCB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIGhpc3RvcnkudW5kb25lLCByYW5nZXNGb3IodHIubWFwcGluZy5tYXBzKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUsIGhpc3RvcnkudW5kb25lLmFkZFRyYW5zZm9ybSh0ciwgdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBudWxsLCBoaXN0b3J5LnByZXZUaW1lLCBoaXN0b3J5LnByZXZDb21wb3NpdGlvbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRyLmdldE1ldGEoXCJhZGRUb0hpc3RvcnlcIikgIT09IGZhbHNlICYmICEoYXBwZW5kZWQgJiYgYXBwZW5kZWQuZ2V0TWV0YShcImFkZFRvSGlzdG9yeVwiKSA9PT0gZmFsc2UpKSB7XG4gICAgICAgIC8vIEdyb3VwIHRyYW5zZm9ybXMgdGhhdCBvY2N1ciBpbiBxdWljayBzdWNjZXNzaW9uIGludG8gb25lIGV2ZW50LlxuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSB0ci5nZXRNZXRhKFwiY29tcG9zaXRpb25cIik7XG4gICAgICAgIGxldCBuZXdHcm91cCA9IGhpc3RvcnkucHJldlRpbWUgPT0gMCB8fFxuICAgICAgICAgICAgKCFhcHBlbmRlZCAmJiBoaXN0b3J5LnByZXZDb21wb3NpdGlvbiAhPSBjb21wb3NpdGlvbiAmJlxuICAgICAgICAgICAgICAgIChoaXN0b3J5LnByZXZUaW1lIDwgKHRyLnRpbWUgfHwgMCkgLSBvcHRpb25zLm5ld0dyb3VwRGVsYXkgfHwgIWlzQWRqYWNlbnRUbyh0ciwgaGlzdG9yeS5wcmV2UmFuZ2VzKSkpO1xuICAgICAgICBsZXQgcHJldlJhbmdlcyA9IGFwcGVuZGVkID8gbWFwUmFuZ2VzKGhpc3RvcnkucHJldlJhbmdlcywgdHIubWFwcGluZykgOiByYW5nZXNGb3IodHIubWFwcGluZy5tYXBzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZFRyYW5zZm9ybSh0ciwgbmV3R3JvdXAgPyBzdGF0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSA6IHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgQnJhbmNoLmVtcHR5LCBwcmV2UmFuZ2VzLCB0ci50aW1lLCBjb21wb3NpdGlvbiA9PSBudWxsID8gaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24gOiBjb21wb3NpdGlvbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlYmFzZWQgPSB0ci5nZXRNZXRhKFwicmViYXNlZFwiKSkge1xuICAgICAgICAvLyBVc2VkIGJ5IHRoZSBjb2xsYWIgbW9kdWxlIHRvIHRlbGwgdGhlIGhpc3RvcnkgdGhhdCBzb21lIG9mIGl0c1xuICAgICAgICAvLyBjb250ZW50IGhhcyBiZWVuIHJlYmFzZWQuXG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5yZWJhc2VkKHRyLCByZWJhc2VkKSwgaGlzdG9yeS51bmRvbmUucmViYXNlZCh0ciwgcmViYXNlZCksIG1hcFJhbmdlcyhoaXN0b3J5LnByZXZSYW5nZXMsIHRyLm1hcHBpbmcpLCBoaXN0b3J5LnByZXZUaW1lLCBoaXN0b3J5LnByZXZDb21wb3NpdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUuYWRkTWFwcyh0ci5tYXBwaW5nLm1hcHMpLCBoaXN0b3J5LnVuZG9uZS5hZGRNYXBzKHRyLm1hcHBpbmcubWFwcyksIG1hcFJhbmdlcyhoaXN0b3J5LnByZXZSYW5nZXMsIHRyLm1hcHBpbmcpLCBoaXN0b3J5LnByZXZUaW1lLCBoaXN0b3J5LnByZXZDb21wb3NpdGlvbik7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNBZGphY2VudFRvKHRyYW5zZm9ybSwgcHJldlJhbmdlcykge1xuICAgIGlmICghcHJldlJhbmdlcylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdHJhbnNmb3JtLmRvY0NoYW5nZWQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBhZGphY2VudCA9IGZhbHNlO1xuICAgIHRyYW5zZm9ybS5tYXBwaW5nLm1hcHNbMF0uZm9yRWFjaCgoc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZSYW5nZXMubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBpZiAoc3RhcnQgPD0gcHJldlJhbmdlc1tpICsgMV0gJiYgZW5kID49IHByZXZSYW5nZXNbaV0pXG4gICAgICAgICAgICAgICAgYWRqYWNlbnQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHJldHVybiBhZGphY2VudDtcbn1cbmZ1bmN0aW9uIHJhbmdlc0ZvcihtYXBzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBtYXBzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiByZXN1bHQubGVuZ3RoID09IDA7IGktLSlcbiAgICAgICAgbWFwc1tpXS5mb3JFYWNoKChfZnJvbSwgX3RvLCBmcm9tLCB0bykgPT4gcmVzdWx0LnB1c2goZnJvbSwgdG8pKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwUmFuZ2VzKHJhbmdlcywgbWFwcGluZykge1xuICAgIGlmICghcmFuZ2VzKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChyYW5nZXNbaV0sIDEpLCB0byA9IG1hcHBpbmcubWFwKHJhbmdlc1tpICsgMV0sIC0xKTtcbiAgICAgICAgaWYgKGZyb20gPD0gdG8pXG4gICAgICAgICAgICByZXN1bHQucHVzaChmcm9tLCB0byk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBBcHBseSB0aGUgbGF0ZXN0IGV2ZW50IGZyb20gb25lIGJyYW5jaCB0byB0aGUgZG9jdW1lbnQgYW5kIHNoaWZ0IHRoZSBldmVudFxuLy8gb250byB0aGUgb3RoZXIgYnJhbmNoLlxuZnVuY3Rpb24gaGlzdFRyYW5zYWN0aW9uKGhpc3RvcnksIHN0YXRlLCByZWRvKSB7XG4gICAgbGV0IHByZXNlcnZlSXRlbXMgPSBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSk7XG4gICAgbGV0IGhpc3RPcHRpb25zID0gaGlzdG9yeUtleS5nZXQoc3RhdGUpLnNwZWMuY29uZmlnO1xuICAgIGxldCBwb3AgPSAocmVkbyA/IGhpc3RvcnkudW5kb25lIDogaGlzdG9yeS5kb25lKS5wb3BFdmVudChzdGF0ZSwgcHJlc2VydmVJdGVtcyk7XG4gICAgaWYgKCFwb3ApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBzZWxlY3Rpb24gPSBwb3Auc2VsZWN0aW9uLnJlc29sdmUocG9wLnRyYW5zZm9ybS5kb2MpO1xuICAgIGxldCBhZGRlZCA9IChyZWRvID8gaGlzdG9yeS5kb25lIDogaGlzdG9yeS51bmRvbmUpLmFkZFRyYW5zZm9ybShwb3AudHJhbnNmb3JtLCBzdGF0ZS5zZWxlY3Rpb24uZ2V0Qm9va21hcmsoKSwgaGlzdE9wdGlvbnMsIHByZXNlcnZlSXRlbXMpO1xuICAgIGxldCBuZXdIaXN0ID0gbmV3IEhpc3RvcnlTdGF0ZShyZWRvID8gYWRkZWQgOiBwb3AucmVtYWluaW5nLCByZWRvID8gcG9wLnJlbWFpbmluZyA6IGFkZGVkLCBudWxsLCAwLCAtMSk7XG4gICAgcmV0dXJuIHBvcC50cmFuc2Zvcm0uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikuc2V0TWV0YShoaXN0b3J5S2V5LCB7IHJlZG8sIGhpc3RvcnlTdGF0ZTogbmV3SGlzdCB9KTtcbn1cbmxldCBjYWNoZWRQcmVzZXJ2ZUl0ZW1zID0gZmFsc2UsIGNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zID0gbnVsbDtcbi8vIENoZWNrIHdoZXRoZXIgYW55IHBsdWdpbiBpbiB0aGUgZ2l2ZW4gc3RhdGUgaGFzIGFcbi8vIGBoaXN0b3J5UHJlc2VydmVJdGVtc2AgcHJvcGVydHkgaW4gaXRzIHNwZWMsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdFxuLy8gcHJlc2VydmUgc3RlcHMgZXhhY3RseSBhcyB0aGV5IGNhbWUgaW4sIHNvIHRoYXQgdGhleSBjYW4gYmVcbi8vIHJlYmFzZWQuXG5mdW5jdGlvbiBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkge1xuICAgIGxldCBwbHVnaW5zID0gc3RhdGUucGx1Z2lucztcbiAgICBpZiAoY2FjaGVkUHJlc2VydmVJdGVtc1BsdWdpbnMgIT0gcGx1Z2lucykge1xuICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zID0gZmFsc2U7XG4gICAgICAgIGNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zID0gcGx1Z2lucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHBsdWdpbnNbaV0uc3BlYy5oaXN0b3J5UHJlc2VydmVJdGVtcykge1xuICAgICAgICAgICAgICAgIGNhY2hlZFByZXNlcnZlSXRlbXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkUHJlc2VydmVJdGVtcztcbn1cbi8qKlxuU2V0IGEgZmxhZyBvbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gdGhhdCB3aWxsIHByZXZlbnQgZnVydGhlciBzdGVwc1xuZnJvbSBiZWluZyBhcHBlbmRlZCB0byBhbiBleGlzdGluZyBoaXN0b3J5IGV2ZW50IChzbyB0aGF0IHRoZXlcbnJlcXVpcmUgYSBzZXBhcmF0ZSB1bmRvIGNvbW1hbmQgdG8gdW5kbykuXG4qL1xuZnVuY3Rpb24gY2xvc2VIaXN0b3J5KHRyKSB7XG4gICAgcmV0dXJuIHRyLnNldE1ldGEoY2xvc2VIaXN0b3J5S2V5LCB0cnVlKTtcbn1cbmNvbnN0IGhpc3RvcnlLZXkgPSBuZXcgUGx1Z2luS2V5KFwiaGlzdG9yeVwiKTtcbmNvbnN0IGNsb3NlSGlzdG9yeUtleSA9IG5ldyBQbHVnaW5LZXkoXCJjbG9zZUhpc3RvcnlcIik7XG4vKipcblJldHVybnMgYSBwbHVnaW4gdGhhdCBlbmFibGVzIHRoZSB1bmRvIGhpc3RvcnkgZm9yIGFuIGVkaXRvci4gVGhlXG5wbHVnaW4gd2lsbCB0cmFjayB1bmRvIGFuZCByZWRvIHN0YWNrcywgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGVcbltgdW5kb2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNoaXN0b3J5LnVuZG8pIGFuZCBbYHJlZG9gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jaGlzdG9yeS5yZWRvKSBjb21tYW5kcy5cblxuWW91IGNhbiBzZXQgYW4gYFwiYWRkVG9IaXN0b3J5XCJgIFttZXRhZGF0YVxucHJvcGVydHldKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZXRNZXRhKSBvZiBgZmFsc2VgIG9uIGEgdHJhbnNhY3Rpb25cbnRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyByb2xsZWQgYmFjayBieSB1bmRvLlxuKi9cbmZ1bmN0aW9uIGhpc3RvcnkoY29uZmlnID0ge30pIHtcbiAgICBjb25maWcgPSB7IGRlcHRoOiBjb25maWcuZGVwdGggfHwgMTAwLFxuICAgICAgICBuZXdHcm91cERlbGF5OiBjb25maWcubmV3R3JvdXBEZWxheSB8fCA1MDAgfTtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogaGlzdG9yeUtleSxcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoQnJhbmNoLmVtcHR5LCBCcmFuY2guZW1wdHksIG51bGwsIDAsIC0xKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHBseSh0ciwgaGlzdCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHlUcmFuc2FjdGlvbihoaXN0LCBzdGF0ZSwgdHIsIGNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgICAgIGJlZm9yZWlucHV0KHZpZXcsIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0VHlwZSA9IGUuaW5wdXRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWFuZCA9IGlucHV0VHlwZSA9PSBcImhpc3RvcnlVbmRvXCIgPyB1bmRvIDogaW5wdXRUeXBlID09IFwiaGlzdG9yeVJlZG9cIiA/IHJlZG8gOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbW1hbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBidWlsZENvbW1hbmQocmVkbywgc2Nyb2xsKSB7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgaWYgKCFoaXN0IHx8IChyZWRvID8gaGlzdC51bmRvbmUgOiBoaXN0LmRvbmUpLmV2ZW50Q291bnQgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgdHIgPSBoaXN0VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIHJlZG8pO1xuICAgICAgICAgICAgaWYgKHRyKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHNjcm9sbCA/IHRyLnNjcm9sbEludG9WaWV3KCkgOiB0cik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgdW5kb2VzIHRoZSBsYXN0IGNoYW5nZSwgaWYgYW55LlxuKi9cbmNvbnN0IHVuZG8gPSBidWlsZENvbW1hbmQoZmFsc2UsIHRydWUpO1xuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCByZWRvZXMgdGhlIGxhc3QgdW5kb25lIGNoYW5nZSwgaWYgYW55LlxuKi9cbmNvbnN0IHJlZG8gPSBidWlsZENvbW1hbmQodHJ1ZSwgdHJ1ZSk7XG4vKipcbkEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHVuZG9lcyB0aGUgbGFzdCBjaGFuZ2UuIERvbid0IHNjcm9sbCB0aGVcbnNlbGVjdGlvbiBpbnRvIHZpZXcuXG4qL1xuY29uc3QgdW5kb05vU2Nyb2xsID0gYnVpbGRDb21tYW5kKGZhbHNlLCBmYWxzZSk7XG4vKipcbkEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHJlZG9lcyB0aGUgbGFzdCB1bmRvbmUgY2hhbmdlLiBEb24ndFxuc2Nyb2xsIHRoZSBzZWxlY3Rpb24gaW50byB2aWV3LlxuKi9cbmNvbnN0IHJlZG9Ob1Njcm9sbCA9IGJ1aWxkQ29tbWFuZCh0cnVlLCBmYWxzZSk7XG4vKipcblRoZSBhbW91bnQgb2YgdW5kb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIHVuZG9EZXB0aChzdGF0ZSkge1xuICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIGhpc3QgPyBoaXN0LmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG4vKipcblRoZSBhbW91bnQgb2YgcmVkb2FibGUgZXZlbnRzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGVkaXRvciBzdGF0ZS5cbiovXG5mdW5jdGlvbiByZWRvRGVwdGgoc3RhdGUpIHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIHJldHVybiBoaXN0ID8gaGlzdC51bmRvbmUuZXZlbnRDb3VudCA6IDA7XG59XG5cbmV4cG9ydCB7IGNsb3NlSGlzdG9yeSwgaGlzdG9yeSwgcmVkbywgcmVkb0RlcHRoLCByZWRvTm9TY3JvbGwsIHVuZG8sIHVuZG9EZXB0aCwgdW5kb05vU2Nyb2xsIH07XG4iLCJpbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBmaW5kV3JhcHBpbmcsIGNhbkpvaW4gfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuXG4vKipcbklucHV0IHJ1bGVzIGFyZSByZWd1bGFyIGV4cHJlc3Npb25zIGRlc2NyaWJpbmcgYSBwaWVjZSBvZiB0ZXh0XG50aGF0LCB3aGVuIHR5cGVkLCBjYXVzZXMgc29tZXRoaW5nIHRvIGhhcHBlbi4gVGhpcyBtaWdodCBiZVxuY2hhbmdpbmcgdHdvIGRhc2hlcyBpbnRvIGFuIGVtZGFzaCwgd3JhcHBpbmcgYSBwYXJhZ3JhcGggc3RhcnRpbmdcbndpdGggYFwiPiBcImAgaW50byBhIGJsb2NrcXVvdGUsIG9yIHNvbWV0aGluZyBlbnRpcmVseSBkaWZmZXJlbnQuXG4qL1xuY2xhc3MgSW5wdXRSdWxlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW5wdXQgcnVsZS4gVGhlIHJ1bGUgYXBwbGllcyB3aGVuIHRoZSB1c2VyIHR5cGVkXG4gICAgc29tZXRoaW5nIGFuZCB0aGUgdGV4dCBkaXJlY3RseSBpbiBmcm9udCBvZiB0aGUgY3Vyc29yIG1hdGNoZXNcbiAgICBgbWF0Y2hgLCB3aGljaCBzaG91bGQgZW5kIHdpdGggYCRgLlxuICAgIFxuICAgIFRoZSBgaGFuZGxlcmAgY2FuIGJlIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIHRoZSBtYXRjaGVkIHRleHQsIG9yXG4gICAgdGhlIGZpcnN0IG1hdGNoZWQgZ3JvdXAgaW4gdGhlIHJlZ2V4cCwgaXMgcmVwbGFjZWQgYnkgdGhhdFxuICAgIHN0cmluZy5cbiAgICBcbiAgICBPciBhIGl0IGNhbiBiZSBhIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBtYXRjaFxuICAgIGFycmF5IHByb2R1Y2VkIGJ5XG4gICAgW2BSZWdFeHAuZXhlY2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1JlZ0V4cC9leGVjKSxcbiAgICBhcyB3ZWxsIGFzIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBtYXRjaGVkIHJhbmdlLCBhbmQgd2hpY2ggY2FuXG4gICAgcmV0dXJuIGEgW3RyYW5zYWN0aW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIHRoYXQgZGVzY3JpYmVzIHRoZVxuICAgIHJ1bGUncyBlZmZlY3QsIG9yIG51bGwgdG8gaW5kaWNhdGUgdGhlIGlucHV0IHdhcyBub3QgaGFuZGxlZC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF0Y2gsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm1hdGNoID0gbWF0Y2g7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgdGhpcy5oYW5kbGVyID0gdHlwZW9mIGhhbmRsZXIgPT0gXCJzdHJpbmdcIiA/IHN0cmluZ0hhbmRsZXIoaGFuZGxlcikgOiBoYW5kbGVyO1xuICAgICAgICB0aGlzLnVuZG9hYmxlID0gb3B0aW9ucy51bmRvYWJsZSAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5Db2RlID0gb3B0aW9ucy5pbkNvZGUgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuaW5Db2RlTWFyayA9IG9wdGlvbnMuaW5Db2RlTWFyayAhPT0gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gc3RyaW5nSGFuZGxlcihzdHJpbmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkge1xuICAgICAgICBsZXQgaW5zZXJ0ID0gc3RyaW5nO1xuICAgICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBtYXRjaFswXS5sYXN0SW5kZXhPZihtYXRjaFsxXSk7XG4gICAgICAgICAgICBpbnNlcnQgKz0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0ICsgbWF0Y2hbMV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIHN0YXJ0ICs9IG9mZnNldDtcbiAgICAgICAgICAgIGxldCBjdXRPZmYgPSBzdGFydCAtIGVuZDtcbiAgICAgICAgICAgIGlmIChjdXRPZmYgPiAwKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0ID0gbWF0Y2hbMF0uc2xpY2Uob2Zmc2V0IC0gY3V0T2ZmLCBvZmZzZXQpICsgaW5zZXJ0O1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS50ci5pbnNlcnRUZXh0KGluc2VydCwgc3RhcnQsIGVuZCk7XG4gICAgfTtcbn1cbmNvbnN0IE1BWF9NQVRDSCA9IDUwMDtcbi8qKlxuQ3JlYXRlIGFuIGlucHV0IHJ1bGVzIHBsdWdpbi4gV2hlbiBlbmFibGVkLCBpdCB3aWxsIGNhdXNlIHRleHRcbmlucHV0IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIGdpdmVuIHJ1bGVzIHRvIHRyaWdnZXIgdGhlIHJ1bGUnc1xuYWN0aW9uLlxuKi9cbmZ1bmN0aW9uIGlucHV0UnVsZXMoeyBydWxlcyB9KSB7XG4gICAgbGV0IHBsdWdpbiA9IG5ldyBQbHVnaW4oe1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgaW5pdCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICBhcHBseSh0ciwgcHJldikge1xuICAgICAgICAgICAgICAgIGxldCBzdG9yZWQgPSB0ci5nZXRNZXRhKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChzdG9yZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyLnNlbGVjdGlvblNldCB8fCB0ci5kb2NDaGFuZ2VkID8gbnVsbCA6IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBoYW5kbGVUZXh0SW5wdXQodmlldywgZnJvbSwgdG8sIHRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVuKHZpZXcsIGZyb20sIHRvLCB0ZXh0LCBydWxlcywgcGx1Z2luKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbmVuZDogKHZpZXcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeyAkY3Vyc29yIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bih2aWV3LCAkY3Vyc29yLnBvcywgJGN1cnNvci5wb3MsIFwiXCIsIHJ1bGVzLCBwbHVnaW4pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGlzSW5wdXRSdWxlczogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBwbHVnaW47XG59XG5mdW5jdGlvbiBydW4odmlldywgZnJvbSwgdG8sIHRleHQsIHJ1bGVzLCBwbHVnaW4pIHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc3RhdGUgPSB2aWV3LnN0YXRlLCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgIGxldCB0ZXh0QmVmb3JlID0gJGZyb20ucGFyZW50LnRleHRCZXR3ZWVuKE1hdGgubWF4KDAsICRmcm9tLnBhcmVudE9mZnNldCAtIE1BWF9NQVRDSCksICRmcm9tLnBhcmVudE9mZnNldCwgbnVsbCwgXCJcXHVmZmZjXCIpICsgdGV4dDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBydWxlID0gcnVsZXNbaV07XG4gICAgICAgIGlmICghcnVsZS5pbkNvZGVNYXJrICYmICRmcm9tLm1hcmtzKCkuc29tZShtID0+IG0udHlwZS5zcGVjLmNvZGUpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmICgkZnJvbS5wYXJlbnQudHlwZS5zcGVjLmNvZGUpIHtcbiAgICAgICAgICAgIGlmICghcnVsZS5pbkNvZGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnVsZS5pbkNvZGUgPT09IFwib25seVwiKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWF0Y2ggPSBydWxlLm1hdGNoLmV4ZWModGV4dEJlZm9yZSk7XG4gICAgICAgIGxldCB0ciA9IG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCA+PSB0ZXh0Lmxlbmd0aCAmJlxuICAgICAgICAgICAgcnVsZS5oYW5kbGVyKHN0YXRlLCBtYXRjaCwgZnJvbSAtIChtYXRjaFswXS5sZW5ndGggLSB0ZXh0Lmxlbmd0aCksIHRvKTtcbiAgICAgICAgaWYgKCF0cilcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAocnVsZS51bmRvYWJsZSlcbiAgICAgICAgICAgIHRyLnNldE1ldGEocGx1Z2luLCB7IHRyYW5zZm9ybTogdHIsIGZyb20sIHRvLCB0ZXh0IH0pO1xuICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuVGhpcyBpcyBhIGNvbW1hbmQgdGhhdCB3aWxsIHVuZG8gYW4gaW5wdXQgcnVsZSwgaWYgYXBwbHlpbmcgc3VjaCBhXG5ydWxlIHdhcyB0aGUgbGFzdCB0aGluZyB0aGF0IHRoZSB1c2VyIGRpZC5cbiovXG5jb25zdCB1bmRvSW5wdXRSdWxlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBwbHVnaW5zID0gc3RhdGUucGx1Z2lucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnNbaV0sIHVuZG9hYmxlO1xuICAgICAgICBpZiAocGx1Z2luLnNwZWMuaXNJbnB1dFJ1bGVzICYmICh1bmRvYWJsZSA9IHBsdWdpbi5nZXRTdGF0ZShzdGF0ZSkpKSB7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ciwgdG9VbmRvID0gdW5kb2FibGUudHJhbnNmb3JtO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSB0b1VuZG8uc3RlcHMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgICAgIHRyLnN0ZXAodG9VbmRvLnN0ZXBzW2pdLmludmVydCh0b1VuZG8uZG9jc1tqXSkpO1xuICAgICAgICAgICAgICAgIGlmICh1bmRvYWJsZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXJrcyA9IHRyLmRvYy5yZXNvbHZlKHVuZG9hYmxlLmZyb20pLm1hcmtzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VXaXRoKHVuZG9hYmxlLmZyb20sIHVuZG9hYmxlLnRvLCBzdGF0ZS5zY2hlbWEudGV4dCh1bmRvYWJsZS50ZXh0LCBtYXJrcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHIuZGVsZXRlKHVuZG9hYmxlLmZyb20sIHVuZG9hYmxlLnRvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG5Db252ZXJ0cyBkb3VibGUgZGFzaGVzIHRvIGFuIGVtZGFzaC5cbiovXG5jb25zdCBlbURhc2ggPSBuZXcgSW5wdXRSdWxlKC8tLSQvLCBcIuKAlFwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG5Db252ZXJ0cyB0aHJlZSBkb3RzIHRvIGFuIGVsbGlwc2lzIGNoYXJhY3Rlci5cbiovXG5jb25zdCBlbGxpcHNpcyA9IG5ldyBJbnB1dFJ1bGUoL1xcLlxcLlxcLiQvLCBcIuKAplwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG7igJxTbWFydOKAnSBvcGVuaW5nIGRvdWJsZSBxdW90ZXMuXG4qL1xuY29uc3Qgb3BlbkRvdWJsZVF1b3RlID0gbmV3IElucHV0UnVsZSgvKD86XnxbXFxzXFx7XFxbXFwoXFw8J1wiXFx1MjAxOFxcdTIwMUNdKShcIikkLywgXCLigJxcIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxu4oCcU21hcnTigJ0gY2xvc2luZyBkb3VibGUgcXVvdGVzLlxuKi9cbmNvbnN0IGNsb3NlRG91YmxlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC9cIiQvLCBcIuKAnVwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG7igJxTbWFydOKAnSBvcGVuaW5nIHNpbmdsZSBxdW90ZXMuXG4qL1xuY29uc3Qgb3BlblNpbmdsZVF1b3RlID0gbmV3IElucHV0UnVsZSgvKD86XnxbXFxzXFx7XFxbXFwoXFw8J1wiXFx1MjAxOFxcdTIwMUNdKSgnKSQvLCBcIuKAmFwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG7igJxTbWFydOKAnSBjbG9zaW5nIHNpbmdsZSBxdW90ZXMuXG4qL1xuY29uc3QgY2xvc2VTaW5nbGVRdW90ZSA9IG5ldyBJbnB1dFJ1bGUoLyckLywgXCLigJlcIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxuU21hcnQtcXVvdGUgcmVsYXRlZCBpbnB1dCBydWxlcy5cbiovXG5jb25zdCBzbWFydFF1b3RlcyA9IFtvcGVuRG91YmxlUXVvdGUsIGNsb3NlRG91YmxlUXVvdGUsIG9wZW5TaW5nbGVRdW90ZSwgY2xvc2VTaW5nbGVRdW90ZV07XG5cbi8qKlxuQnVpbGQgYW4gaW5wdXQgcnVsZSBmb3IgYXV0b21hdGljYWxseSB3cmFwcGluZyBhIHRleHRibG9jayB3aGVuIGFcbmdpdmVuIHN0cmluZyBpcyB0eXBlZC4gVGhlIGByZWdleHBgIGFyZ3VtZW50IGlzXG5kaXJlY3RseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgYElucHV0UnVsZWAgY29uc3RydWN0b3IuIFlvdSdsbFxucHJvYmFibHkgd2FudCB0aGUgcmVnZXhwIHRvIHN0YXJ0IHdpdGggYF5gLCBzbyB0aGF0IHRoZSBwYXR0ZXJuIGNhblxub25seSBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2suXG5cbmBub2RlVHlwZWAgaXMgdGhlIHR5cGUgb2Ygbm9kZSB0byB3cmFwIGluLiBJZiBpdCBuZWVkcyBhdHRyaWJ1dGVzLFxueW91IGNhbiBlaXRoZXIgcGFzcyB0aGVtIGRpcmVjdGx5LCBvciBwYXNzIGEgZnVuY3Rpb24gdGhhdCB3aWxsXG5jb21wdXRlIHRoZW0gZnJvbSB0aGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoLlxuXG5CeSBkZWZhdWx0LCBpZiB0aGVyZSdzIGEgbm9kZSB3aXRoIHRoZSBzYW1lIHR5cGUgYWJvdmUgdGhlIG5ld2x5XG53cmFwcGVkIG5vZGUsIHRoZSBydWxlIHdpbGwgdHJ5IHRvIFtqb2luXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybS5qb2luKSB0aG9zZVxudHdvIG5vZGVzLiBZb3UgY2FuIHBhc3MgYSBqb2luIHByZWRpY2F0ZSwgd2hpY2ggdGFrZXMgYSByZWd1bGFyXG5leHByZXNzaW9uIG1hdGNoIGFuZCB0aGUgbm9kZSBiZWZvcmUgdGhlIHdyYXBwZWQgbm9kZSwgYW5kIGNhblxucmV0dXJuIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgam9pbiBzaG91bGQgaGFwcGVuLlxuKi9cbmZ1bmN0aW9uIHdyYXBwaW5nSW5wdXRSdWxlKHJlZ2V4cCwgbm9kZVR5cGUsIGdldEF0dHJzID0gbnVsbCwgam9pblByZWRpY2F0ZSkge1xuICAgIHJldHVybiBuZXcgSW5wdXRSdWxlKHJlZ2V4cCwgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgICBsZXQgYXR0cnMgPSBnZXRBdHRycyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gZ2V0QXR0cnMobWF0Y2gpIDogZ2V0QXR0cnM7XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLmRlbGV0ZShzdGFydCwgZW5kKTtcbiAgICAgICAgbGV0ICRzdGFydCA9IHRyLmRvYy5yZXNvbHZlKHN0YXJ0KSwgcmFuZ2UgPSAkc3RhcnQuYmxvY2tSYW5nZSgpLCB3cmFwcGluZyA9IHJhbmdlICYmIGZpbmRXcmFwcGluZyhyYW5nZSwgbm9kZVR5cGUsIGF0dHJzKTtcbiAgICAgICAgaWYgKCF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0ci53cmFwKHJhbmdlLCB3cmFwcGluZyk7XG4gICAgICAgIGxldCBiZWZvcmUgPSB0ci5kb2MucmVzb2x2ZShzdGFydCAtIDEpLm5vZGVCZWZvcmU7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgYmVmb3JlLnR5cGUgPT0gbm9kZVR5cGUgJiYgY2FuSm9pbih0ci5kb2MsIHN0YXJ0IC0gMSkgJiZcbiAgICAgICAgICAgICgham9pblByZWRpY2F0ZSB8fCBqb2luUHJlZGljYXRlKG1hdGNoLCBiZWZvcmUpKSlcbiAgICAgICAgICAgIHRyLmpvaW4oc3RhcnQgLSAxKTtcbiAgICAgICAgcmV0dXJuIHRyO1xuICAgIH0pO1xufVxuLyoqXG5CdWlsZCBhbiBpbnB1dCBydWxlIHRoYXQgY2hhbmdlcyB0aGUgdHlwZSBvZiBhIHRleHRibG9jayB3aGVuIHRoZVxubWF0Y2hlZCB0ZXh0IGlzIHR5cGVkIGludG8gaXQuIFlvdSdsbCB1c3VhbGx5IHdhbnQgdG8gc3RhcnQgeW91clxucmVnZXhwIHdpdGggYF5gIHRvIHRoYXQgaXQgaXMgb25seSBtYXRjaGVkIGF0IHRoZSBzdGFydCBvZiBhXG50ZXh0YmxvY2suIFRoZSBvcHRpb25hbCBgZ2V0QXR0cnNgIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb21wdXRlXG50aGUgbmV3IG5vZGUncyBhdHRyaWJ1dGVzLCBhbmQgd29ya3MgdGhlIHNhbWUgYXMgaW4gdGhlXG5gd3JhcHBpbmdJbnB1dFJ1bGVgIGZ1bmN0aW9uLlxuKi9cbmZ1bmN0aW9uIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUocmVnZXhwLCBub2RlVHlwZSwgZ2V0QXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUocmVnZXhwLCAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGxldCAkc3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShzdGFydCk7XG4gICAgICAgIGxldCBhdHRycyA9IGdldEF0dHJzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBnZXRBdHRycyhtYXRjaCkgOiBnZXRBdHRycztcbiAgICAgICAgaWYgKCEkc3RhcnQubm9kZSgtMSkuY2FuUmVwbGFjZVdpdGgoJHN0YXJ0LmluZGV4KC0xKSwgJHN0YXJ0LmluZGV4QWZ0ZXIoLTEpLCBub2RlVHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHN0YXRlLnRyXG4gICAgICAgICAgICAuZGVsZXRlKHN0YXJ0LCBlbmQpXG4gICAgICAgICAgICAuc2V0QmxvY2tUeXBlKHN0YXJ0LCBzdGFydCwgbm9kZVR5cGUsIGF0dHJzKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHsgSW5wdXRSdWxlLCBjbG9zZURvdWJsZVF1b3RlLCBjbG9zZVNpbmdsZVF1b3RlLCBlbGxpcHNpcywgZW1EYXNoLCBpbnB1dFJ1bGVzLCBvcGVuRG91YmxlUXVvdGUsIG9wZW5TaW5nbGVRdW90ZSwgc21hcnRRdW90ZXMsIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUsIHVuZG9JbnB1dFJ1bGUsIHdyYXBwaW5nSW5wdXRSdWxlIH07XG4iLCJpbXBvcnQgeyBmaW5kV3JhcHBpbmcsIFJlcGxhY2VBcm91bmRTdGVwLCBjYW5TcGxpdCwgbGlmdFRhcmdldCwgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBOb2RlUmFuZ2UsIEZyYWdtZW50LCBTbGljZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3Qgb2xET00gPSBbXCJvbFwiLCAwXSwgdWxET00gPSBbXCJ1bFwiLCAwXSwgbGlET00gPSBbXCJsaVwiLCAwXTtcbi8qKlxuQW4gb3JkZXJlZCBsaXN0IFtub2RlIHNwZWNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykuIEhhcyBhIHNpbmdsZVxuYXR0cmlidXRlLCBgb3JkZXJgLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgYXQgd2hpY2ggdGhlIGxpc3RcbnN0YXJ0cyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuIFJlcHJlc2VudGVkIGFzIGFuIGA8b2w+YFxuZWxlbWVudC5cbiovXG5jb25zdCBvcmRlcmVkTGlzdCA9IHtcbiAgICBhdHRyczogeyBvcmRlcjogeyBkZWZhdWx0OiAxLCB2YWxpZGF0ZTogXCJudW1iZXJcIiB9IH0sXG4gICAgcGFyc2VET006IFt7IHRhZzogXCJvbFwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBvcmRlcjogZG9tLmhhc0F0dHJpYnV0ZShcInN0YXJ0XCIpID8gK2RvbS5nZXRBdHRyaWJ1dGUoXCJzdGFydFwiKSA6IDEgfTtcbiAgICAgICAgICAgIH0gfV0sXG4gICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5hdHRycy5vcmRlciA9PSAxID8gb2xET00gOiBbXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyIH0sIDBdO1xuICAgIH1cbn07XG4vKipcbkEgYnVsbGV0IGxpc3Qgbm9kZSBzcGVjLCByZXByZXNlbnRlZCBpbiB0aGUgRE9NIGFzIGA8dWw+YC5cbiovXG5jb25zdCBidWxsZXRMaXN0ID0ge1xuICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwidWxcIiB9XSxcbiAgICB0b0RPTSgpIHsgcmV0dXJuIHVsRE9NOyB9XG59O1xuLyoqXG5BIGxpc3QgaXRlbSAoYDxsaT5gKSBzcGVjLlxuKi9cbmNvbnN0IGxpc3RJdGVtID0ge1xuICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwibGlcIiB9XSxcbiAgICB0b0RPTSgpIHsgcmV0dXJuIGxpRE9NOyB9LFxuICAgIGRlZmluaW5nOiB0cnVlXG59O1xuZnVuY3Rpb24gYWRkKG9iaiwgcHJvcHMpIHtcbiAgICBsZXQgY29weSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gb2JqKVxuICAgICAgICBjb3B5W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpXG4gICAgICAgIGNvcHlbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICByZXR1cm4gY29weTtcbn1cbi8qKlxuQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFkZGluZyBsaXN0LXJlbGF0ZWQgbm9kZSB0eXBlcyB0byBhIG1hcFxuc3BlY2lmeWluZyB0aGUgbm9kZXMgZm9yIGEgc2NoZW1hLiBBZGRzXG5bYG9yZGVyZWRMaXN0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0Lm9yZGVyZWRMaXN0KSBhcyBgXCJvcmRlcmVkX2xpc3RcImAsXG5bYGJ1bGxldExpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3QuYnVsbGV0TGlzdCkgYXMgYFwiYnVsbGV0X2xpc3RcImAsIGFuZFxuW2BsaXN0SXRlbWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5saXN0SXRlbSkgYXMgYFwibGlzdF9pdGVtXCJgLlxuXG5gaXRlbUNvbnRlbnRgIGRldGVybWluZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGxpc3QgaXRlbXMuXG5JZiB5b3Ugd2FudCB0aGUgY29tbWFuZHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB0byBhcHBseSB0byB5b3VyXG5saXN0IHN0cnVjdHVyZSwgaXQgc2hvdWxkIGhhdmUgYSBzaGFwZSBsaWtlIGBcInBhcmFncmFwaCBibG9jaypcImAgb3JcbmBcInBhcmFncmFwaCAob3JkZXJlZF9saXN0IHwgYnVsbGV0X2xpc3QpKlwiYC4gYGxpc3RHcm91cGAgY2FuIGJlXG5naXZlbiB0byBhc3NpZ24gYSBncm91cCBuYW1lIHRvIHRoZSBsaXN0IG5vZGUgdHlwZXMsIGZvciBleGFtcGxlXG5gXCJibG9ja1wiYC5cbiovXG5mdW5jdGlvbiBhZGRMaXN0Tm9kZXMobm9kZXMsIGl0ZW1Db250ZW50LCBsaXN0R3JvdXApIHtcbiAgICByZXR1cm4gbm9kZXMuYXBwZW5kKHtcbiAgICAgICAgb3JkZXJlZF9saXN0OiBhZGQob3JkZXJlZExpc3QsIHsgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsIGdyb3VwOiBsaXN0R3JvdXAgfSksXG4gICAgICAgIGJ1bGxldF9saXN0OiBhZGQoYnVsbGV0TGlzdCwgeyBjb250ZW50OiBcImxpc3RfaXRlbStcIiwgZ3JvdXA6IGxpc3RHcm91cCB9KSxcbiAgICAgICAgbGlzdF9pdGVtOiBhZGQobGlzdEl0ZW0sIHsgY29udGVudDogaXRlbUNvbnRlbnQgfSlcbiAgICB9KTtcbn1cbi8qKlxuUmV0dXJucyBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgc2VsZWN0aW9uIGluIGEgbGlzdCB3aXRoXG50aGUgZ2l2ZW4gdHlwZSBhbiBhdHRyaWJ1dGVzLiBJZiBgZGlzcGF0Y2hgIGlzIG51bGwsIG9ubHkgcmV0dXJuIGFcbnZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBwb3NzaWJsZSwgYnV0IGRvbid0IGFjdHVhbGx5XG5wZXJmb3JtIHRoZSBjaGFuZ2UuXG4qL1xuZnVuY3Rpb24gd3JhcEluTGlzdChsaXN0VHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCB0ciA9IGRpc3BhdGNoID8gc3RhdGUudHIgOiBudWxsO1xuICAgICAgICBpZiAoIXdyYXBSYW5nZUluTGlzdCh0ciwgcmFuZ2UsIGxpc3RUeXBlLCBhdHRycykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5UcnkgdG8gd3JhcCB0aGUgZ2l2ZW4gbm9kZSByYW5nZSBpbiBhIGxpc3Qgb2YgdGhlIGdpdmVuIHR5cGUuXG5SZXR1cm4gYHRydWVgIHdoZW4gdGhpcyBpcyBwb3NzaWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuIFdoZW4gYHRyYFxuaXMgbm9uLW51bGwsIHRoZSB3cmFwcGluZyBpcyBhZGRlZCB0byB0aGF0IHRyYW5zYWN0aW9uLiBXaGVuIGl0IGlzXG5gbnVsbGAsIHRoZSBmdW5jdGlvbiBvbmx5IHF1ZXJpZXMgd2hldGhlciB0aGUgd3JhcHBpbmcgaXNcbnBvc3NpYmxlLlxuKi9cbmZ1bmN0aW9uIHdyYXBSYW5nZUluTGlzdCh0ciwgcmFuZ2UsIGxpc3RUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICBsZXQgZG9Kb2luID0gZmFsc2UsIG91dGVyUmFuZ2UgPSByYW5nZSwgZG9jID0gcmFuZ2UuJGZyb20uZG9jO1xuICAgIC8vIFRoaXMgaXMgYXQgdGhlIHRvcCBvZiBhbiBleGlzdGluZyBsaXN0IGl0ZW1cbiAgICBpZiAocmFuZ2UuZGVwdGggPj0gMiAmJiByYW5nZS4kZnJvbS5ub2RlKHJhbmdlLmRlcHRoIC0gMSkudHlwZS5jb21wYXRpYmxlQ29udGVudChsaXN0VHlwZSkgJiYgcmFuZ2Uuc3RhcnRJbmRleCA9PSAwKSB7XG4gICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAocmFuZ2UuJGZyb20uaW5kZXgocmFuZ2UuZGVwdGggLSAxKSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgJGluc2VydCA9IGRvYy5yZXNvbHZlKHJhbmdlLnN0YXJ0IC0gMik7XG4gICAgICAgIG91dGVyUmFuZ2UgPSBuZXcgTm9kZVJhbmdlKCRpbnNlcnQsICRpbnNlcnQsIHJhbmdlLmRlcHRoKTtcbiAgICAgICAgaWYgKHJhbmdlLmVuZEluZGV4IDwgcmFuZ2UucGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UocmFuZ2UuJGZyb20sIGRvYy5yZXNvbHZlKHJhbmdlLiR0by5lbmQocmFuZ2UuZGVwdGgpKSwgcmFuZ2UuZGVwdGgpO1xuICAgICAgICBkb0pvaW4gPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgd3JhcCA9IGZpbmRXcmFwcGluZyhvdXRlclJhbmdlLCBsaXN0VHlwZSwgYXR0cnMsIHJhbmdlKTtcbiAgICBpZiAoIXdyYXApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHIpXG4gICAgICAgIGRvV3JhcEluTGlzdCh0ciwgcmFuZ2UsIHdyYXAsIGRvSm9pbiwgbGlzdFR5cGUpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZG9XcmFwSW5MaXN0KHRyLCByYW5nZSwgd3JhcHBlcnMsIGpvaW5CZWZvcmUsIGxpc3RUeXBlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBpID0gd3JhcHBlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHdyYXBwZXJzW2ldLnR5cGUuY3JlYXRlKHdyYXBwZXJzW2ldLmF0dHJzLCBjb250ZW50KSk7XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAocmFuZ2Uuc3RhcnQgLSAoam9pbkJlZm9yZSA/IDIgOiAwKSwgcmFuZ2UuZW5kLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCBuZXcgU2xpY2UoY29udGVudCwgMCwgMCksIHdyYXBwZXJzLmxlbmd0aCwgdHJ1ZSkpO1xuICAgIGxldCBmb3VuZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3cmFwcGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKHdyYXBwZXJzW2ldLnR5cGUgPT0gbGlzdFR5cGUpXG4gICAgICAgICAgICBmb3VuZCA9IGkgKyAxO1xuICAgIGxldCBzcGxpdERlcHRoID0gd3JhcHBlcnMubGVuZ3RoIC0gZm91bmQ7XG4gICAgbGV0IHNwbGl0UG9zID0gcmFuZ2Uuc3RhcnQgKyB3cmFwcGVycy5sZW5ndGggLSAoam9pbkJlZm9yZSA/IDIgOiAwKSwgcGFyZW50ID0gcmFuZ2UucGFyZW50O1xuICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydEluZGV4LCBlID0gcmFuZ2UuZW5kSW5kZXgsIGZpcnN0ID0gdHJ1ZTsgaSA8IGU7IGkrKywgZmlyc3QgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWZpcnN0ICYmIGNhblNwbGl0KHRyLmRvYywgc3BsaXRQb3MsIHNwbGl0RGVwdGgpKSB7XG4gICAgICAgICAgICB0ci5zcGxpdChzcGxpdFBvcywgc3BsaXREZXB0aCk7XG4gICAgICAgICAgICBzcGxpdFBvcyArPSAyICogc3BsaXREZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBzcGxpdFBvcyArPSBwYXJlbnQuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0cjtcbn1cbi8qKlxuQnVpbGQgYSBjb21tYW5kIHRoYXQgc3BsaXRzIGEgbm9uLWVtcHR5IHRleHRibG9jayBhdCB0aGUgdG9wIGxldmVsXG5vZiBhIGxpc3QgaXRlbSBieSBhbHNvIHNwbGl0dGluZyB0aGF0IGxpc3QgaXRlbS5cbiovXG5mdW5jdGlvbiBzcGxpdExpc3RJdGVtKGl0ZW1UeXBlLCBpdGVtQXR0cnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvLCBub2RlIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8ICRmcm9tLmRlcHRoIDwgMiB8fCAhJGZyb20uc2FtZVBhcmVudCgkdG8pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZ3JhbmRQYXJlbnQgPSAkZnJvbS5ub2RlKC0xKTtcbiAgICAgICAgaWYgKGdyYW5kUGFyZW50LnR5cGUgIT0gaXRlbVR5cGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICgkZnJvbS5wYXJlbnQuY29udGVudC5zaXplID09IDAgJiYgJGZyb20ubm9kZSgtMSkuY2hpbGRDb3VudCA9PSAkZnJvbS5pbmRleEFmdGVyKC0xKSkge1xuICAgICAgICAgICAgLy8gSW4gYW4gZW1wdHkgYmxvY2suIElmIHRoaXMgaXMgYSBuZXN0ZWQgbGlzdCwgdGhlIHdyYXBwaW5nXG4gICAgICAgICAgICAvLyBsaXN0IGl0ZW0gc2hvdWxkIGJlIHNwbGl0LiBPdGhlcndpc2UsIGJhaWwgb3V0IGFuZCBsZXQgbmV4dFxuICAgICAgICAgICAgLy8gY29tbWFuZCBoYW5kbGUgbGlmdGluZy5cbiAgICAgICAgICAgIGlmICgkZnJvbS5kZXB0aCA9PSAzIHx8ICRmcm9tLm5vZGUoLTMpLnR5cGUgIT0gaXRlbVR5cGUgfHxcbiAgICAgICAgICAgICAgICAkZnJvbS5pbmRleCgtMikgIT0gJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCAtIDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXAgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGhCZWZvcmUgPSAkZnJvbS5pbmRleCgtMSkgPyAxIDogJGZyb20uaW5kZXgoLTIpID8gMiA6IDM7XG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBmcmFnbWVudCBjb250YWluaW5nIGVtcHR5IHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBvdXRlciBsaXN0IGl0ZW0gdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBjdXJzb3JcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGggLSBkZXB0aEJlZm9yZTsgZCA+PSAkZnJvbS5kZXB0aCAtIDM7IGQtLSlcbiAgICAgICAgICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KHdyYXApKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGhBZnRlciA9ICRmcm9tLmluZGV4QWZ0ZXIoLTEpIDwgJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCA/IDFcbiAgICAgICAgICAgICAgICAgICAgOiAkZnJvbS5pbmRleEFmdGVyKC0yKSA8ICRmcm9tLm5vZGUoLTMpLmNoaWxkQ291bnQgPyAyIDogMztcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBzZWNvbmQgbGlzdCBpdGVtIHdpdGggYW4gZW1wdHkgZGVmYXVsdCBzdGFydCBub2RlXG4gICAgICAgICAgICAgICAgd3JhcCA9IHdyYXAuYXBwZW5kKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlQW5kRmlsbCgpKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uYmVmb3JlKCRmcm9tLmRlcHRoIC0gKGRlcHRoQmVmb3JlIC0gMSkpO1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnJlcGxhY2Uoc3RhcnQsICRmcm9tLmFmdGVyKC1kZXB0aEFmdGVyKSwgbmV3IFNsaWNlKHdyYXAsIDQgLSBkZXB0aEJlZm9yZSwgMCkpO1xuICAgICAgICAgICAgICAgIGxldCBzZWwgPSAtMTtcbiAgICAgICAgICAgICAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKHN0YXJ0LCB0ci5kb2MuY29udGVudC5zaXplLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWwgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2sgJiYgbm9kZS5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IHBvcyArIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc2VsKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRUeXBlID0gJHRvLnBvcyA9PSAkZnJvbS5lbmQoKSA/IGdyYW5kUGFyZW50LmNvbnRlbnRNYXRjaEF0KDApLmRlZmF1bHRUeXBlIDogbnVsbDtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuZGVsZXRlKCRmcm9tLnBvcywgJHRvLnBvcyk7XG4gICAgICAgIGxldCB0eXBlcyA9IG5leHRUeXBlID8gW2l0ZW1BdHRycyA/IHsgdHlwZTogaXRlbVR5cGUsIGF0dHJzOiBpdGVtQXR0cnMgfSA6IG51bGwsIHsgdHlwZTogbmV4dFR5cGUgfV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY2FuU3BsaXQodHIuZG9jLCAkZnJvbS5wb3MsIDIsIHR5cGVzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc3BsaXQoJGZyb20ucG9zLCAyLCB0eXBlcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcbkFjdHMgbGlrZSBbYHNwbGl0TGlzdEl0ZW1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3Quc3BsaXRMaXN0SXRlbSksIGJ1dFxud2l0aG91dCByZXNldHRpbmcgdGhlIHNldCBvZiBhY3RpdmUgbWFya3MgYXQgdGhlIGN1cnNvci5cbiovXG5mdW5jdGlvbiBzcGxpdExpc3RJdGVtS2VlcE1hcmtzKGl0ZW1UeXBlLCBpdGVtQXR0cnMpIHtcbiAgICBsZXQgc3BsaXQgPSBzcGxpdExpc3RJdGVtKGl0ZW1UeXBlLCBpdGVtQXR0cnMpO1xuICAgIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIHJldHVybiBzcGxpdChzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzIHx8IChzdGF0ZS5zZWxlY3Rpb24uJHRvLnBhcmVudE9mZnNldCAmJiBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ubWFya3MoKSk7XG4gICAgICAgICAgICBpZiAobWFya3MpXG4gICAgICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCB0byBsaWZ0IHRoZSBsaXN0IGl0ZW0gYXJvdW5kIHRoZSBzZWxlY3Rpb24gdXAgaW50b1xuYSB3cmFwcGluZyBsaXN0LlxuKi9cbmZ1bmN0aW9uIGxpZnRMaXN0SXRlbShpdGVtVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIG5vZGUgPT4gbm9kZS5jaGlsZENvdW50ID4gMCAmJiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PSBpdGVtVHlwZSk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghZGlzcGF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCRmcm9tLm5vZGUocmFuZ2UuZGVwdGggLSAxKS50eXBlID09IGl0ZW1UeXBlKSAvLyBJbnNpZGUgYSBwYXJlbnQgbGlzdFxuICAgICAgICAgICAgcmV0dXJuIGxpZnRUb091dGVyTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIGl0ZW1UeXBlLCByYW5nZSk7XG4gICAgICAgIGVsc2UgLy8gT3V0ZXIgbGlzdCBub2RlXG4gICAgICAgICAgICByZXR1cm4gbGlmdE91dE9mTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIHJhbmdlKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlmdFRvT3V0ZXJMaXN0KHN0YXRlLCBkaXNwYXRjaCwgaXRlbVR5cGUsIHJhbmdlKSB7XG4gICAgbGV0IHRyID0gc3RhdGUudHIsIGVuZCA9IHJhbmdlLmVuZCwgZW5kT2ZMaXN0ID0gcmFuZ2UuJHRvLmVuZChyYW5nZS5kZXB0aCk7XG4gICAgaWYgKGVuZCA8IGVuZE9mTGlzdCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgc2libGluZ3MgYWZ0ZXIgdGhlIGxpZnRlZCBpdGVtcywgd2hpY2ggbXVzdCBiZWNvbWVcbiAgICAgICAgLy8gY2hpbGRyZW4gb2YgdGhlIGxhc3QgaXRlbVxuICAgICAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChlbmQgLSAxLCBlbmRPZkxpc3QsIGVuZCwgZW5kT2ZMaXN0LCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGUobnVsbCwgcmFuZ2UucGFyZW50LmNvcHkoKSkpLCAxLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UodHIuZG9jLnJlc29sdmUocmFuZ2UuJGZyb20ucG9zKSwgdHIuZG9jLnJlc29sdmUoZW5kT2ZMaXN0KSwgcmFuZ2UuZGVwdGgpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0ci5saWZ0KHJhbmdlLCB0YXJnZXQpO1xuICAgIGxldCAkYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcChlbmQsIC0xKSAtIDEpO1xuICAgIGlmIChjYW5Kb2luKHRyLmRvYywgJGFmdGVyLnBvcykgJiYgJGFmdGVyLm5vZGVCZWZvcmUudHlwZSA9PSAkYWZ0ZXIubm9kZUFmdGVyLnR5cGUpXG4gICAgICAgIHRyLmpvaW4oJGFmdGVyLnBvcyk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBsaWZ0T3V0T2ZMaXN0KHN0YXRlLCBkaXNwYXRjaCwgcmFuZ2UpIHtcbiAgICBsZXQgdHIgPSBzdGF0ZS50ciwgbGlzdCA9IHJhbmdlLnBhcmVudDtcbiAgICAvLyBNZXJnZSB0aGUgbGlzdCBpdGVtcyBpbnRvIGEgc2luZ2xlIGJpZyBpdGVtXG4gICAgZm9yIChsZXQgcG9zID0gcmFuZ2UuZW5kLCBpID0gcmFuZ2UuZW5kSW5kZXggLSAxLCBlID0gcmFuZ2Uuc3RhcnRJbmRleDsgaSA+IGU7IGktLSkge1xuICAgICAgICBwb3MgLT0gbGlzdC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKHBvcyAtIDEsIHBvcyArIDEpO1xuICAgIH1cbiAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUocmFuZ2Uuc3RhcnQpLCBpdGVtID0gJHN0YXJ0Lm5vZGVBZnRlcjtcbiAgICBpZiAodHIubWFwcGluZy5tYXAocmFuZ2UuZW5kKSAhPSByYW5nZS5zdGFydCArICRzdGFydC5ub2RlQWZ0ZXIubm9kZVNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXRTdGFydCA9IHJhbmdlLnN0YXJ0SW5kZXggPT0gMCwgYXRFbmQgPSByYW5nZS5lbmRJbmRleCA9PSBsaXN0LmNoaWxkQ291bnQ7XG4gICAgbGV0IHBhcmVudCA9ICRzdGFydC5ub2RlKC0xKSwgaW5kZXhCZWZvcmUgPSAkc3RhcnQuaW5kZXgoLTEpO1xuICAgIGlmICghcGFyZW50LmNhblJlcGxhY2UoaW5kZXhCZWZvcmUgKyAoYXRTdGFydCA/IDAgOiAxKSwgaW5kZXhCZWZvcmUgKyAxLCBpdGVtLmNvbnRlbnQuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QpKSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc3RhcnQgPSAkc3RhcnQucG9zLCBlbmQgPSBzdGFydCArIGl0ZW0ubm9kZVNpemU7XG4gICAgLy8gU3RyaXAgb2ZmIHRoZSBzdXJyb3VuZGluZyBsaXN0LiBBdCB0aGUgc2lkZXMgd2hlcmUgd2UncmUgbm90IGF0XG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGV4aXN0aW5nIGxpc3QgaXMgY2xvc2VkLiBBdCBzaWRlcyB3aGVyZVxuICAgIC8vIHRoaXMgaXMgdGhlIGVuZCwgaXQgaXMgb3ZlcndyaXR0ZW4gdG8gaXRzIGVuZC5cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCAtIChhdFN0YXJ0ID8gMSA6IDApLCBlbmQgKyAoYXRFbmQgPyAxIDogMCksIHN0YXJ0ICsgMSwgZW5kIC0gMSwgbmV3IFNsaWNlKChhdFN0YXJ0ID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKVxuICAgICAgICAuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKSwgYXRTdGFydCA/IDAgOiAxLCBhdEVuZCA/IDAgOiAxKSwgYXRTdGFydCA/IDAgOiAxKSk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgdG8gc2luayB0aGUgbGlzdCBpdGVtIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGRvd25cbmludG8gYW4gaW5uZXIgbGlzdC5cbiovXG5mdW5jdGlvbiBzaW5rTGlzdEl0ZW0oaXRlbVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCBub2RlID0+IG5vZGUuY2hpbGRDb3VudCA+IDAgJiYgbm9kZS5maXJzdENoaWxkLnR5cGUgPT0gaXRlbVR5cGUpO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHJhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBwYXJlbnQgPSByYW5nZS5wYXJlbnQsIG5vZGVCZWZvcmUgPSBwYXJlbnQuY2hpbGQoc3RhcnRJbmRleCAtIDEpO1xuICAgICAgICBpZiAobm9kZUJlZm9yZS50eXBlICE9IGl0ZW1UeXBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBuZXN0ZWRCZWZvcmUgPSBub2RlQmVmb3JlLmxhc3RDaGlsZCAmJiBub2RlQmVmb3JlLmxhc3RDaGlsZC50eXBlID09IHBhcmVudC50eXBlO1xuICAgICAgICAgICAgbGV0IGlubmVyID0gRnJhZ21lbnQuZnJvbShuZXN0ZWRCZWZvcmUgPyBpdGVtVHlwZS5jcmVhdGUoKSA6IG51bGwpO1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20ocGFyZW50LnR5cGUuY3JlYXRlKG51bGwsIGlubmVyKSkpKSwgbmVzdGVkQmVmb3JlID8gMyA6IDEsIDApO1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHJhbmdlLnN0YXJ0LCBhZnRlciA9IHJhbmdlLmVuZDtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKGJlZm9yZSAtIChuZXN0ZWRCZWZvcmUgPyAzIDogMSksIGFmdGVyLCBiZWZvcmUsIGFmdGVyLCBzbGljZSwgMSwgdHJ1ZSkpXG4gICAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFkZExpc3ROb2RlcywgYnVsbGV0TGlzdCwgbGlmdExpc3RJdGVtLCBsaXN0SXRlbSwgb3JkZXJlZExpc3QsIHNpbmtMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbUtlZXBNYXJrcywgd3JhcEluTGlzdCwgd3JhcFJhbmdlSW5MaXN0IH07XG4iLCJpbXBvcnQgeyBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbmNvbnN0IHBET00gPSBbXCJwXCIsIDBdLCBibG9ja3F1b3RlRE9NID0gW1wiYmxvY2txdW90ZVwiLCAwXSwgaHJET00gPSBbXCJoclwiXSwgcHJlRE9NID0gW1wicHJlXCIsIFtcImNvZGVcIiwgMF1dLCBickRPTSA9IFtcImJyXCJdO1xuLyoqXG5bU3BlY3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykgZm9yIHRoZSBub2RlcyBkZWZpbmVkIGluIHRoaXMgc2NoZW1hLlxuKi9cbmNvbnN0IG5vZGVzID0ge1xuICAgIC8qKlxuICAgIE5vZGVTcGVjIFRoZSB0b3AgbGV2ZWwgZG9jdW1lbnQgbm9kZS5cbiAgICAqL1xuICAgIGRvYzoge1xuICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiXG4gICAgfSxcbiAgICAvKipcbiAgICBBIHBsYWluIHBhcmFncmFwaCB0ZXh0YmxvY2suIFJlcHJlc2VudGVkIGluIHRoZSBET01cbiAgICBhcyBhIGA8cD5gIGVsZW1lbnQuXG4gICAgKi9cbiAgICBwYXJhZ3JhcGg6IHtcbiAgICAgICAgY29udGVudDogXCJpbmxpbmUqXCIsXG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicFwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHBET007IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgYmxvY2txdW90ZSAoYDxibG9ja3F1b3RlPmApIHdyYXBwaW5nIG9uZSBvciBtb3JlIGJsb2Nrcy5cbiAgICAqL1xuICAgIGJsb2NrcXVvdGU6IHtcbiAgICAgICAgY29udGVudDogXCJibG9jaytcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYmxvY2txdW90ZVwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGJsb2NrcXVvdGVET007IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgaG9yaXpvbnRhbCBydWxlIChgPGhyPmApLlxuICAgICovXG4gICAgaG9yaXpvbnRhbF9ydWxlOiB7XG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaHJcIiB9XSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBockRPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBoZWFkaW5nIHRleHRibG9jaywgd2l0aCBhIGBsZXZlbGAgYXR0cmlidXRlIHRoYXRcbiAgICBzaG91bGQgaG9sZCB0aGUgbnVtYmVyIDEgdG8gNi4gUGFyc2VkIGFuZCBzZXJpYWxpemVkIGFzIGA8aDE+YCB0b1xuICAgIGA8aDY+YCBlbGVtZW50cy5cbiAgICAqL1xuICAgIGhlYWRpbmc6IHtcbiAgICAgICAgYXR0cnM6IHsgbGV2ZWw6IHsgZGVmYXVsdDogMSwgdmFsaWRhdGU6IFwibnVtYmVyXCIgfSB9LFxuICAgICAgICBjb250ZW50OiBcImlubGluZSpcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaDFcIiwgYXR0cnM6IHsgbGV2ZWw6IDEgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDJcIiwgYXR0cnM6IHsgbGV2ZWw6IDIgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDNcIiwgYXR0cnM6IHsgbGV2ZWw6IDMgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDRcIiwgYXR0cnM6IHsgbGV2ZWw6IDQgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDVcIiwgYXR0cnM6IHsgbGV2ZWw6IDUgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDZcIiwgYXR0cnM6IHsgbGV2ZWw6IDYgfSB9XSxcbiAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wiaFwiICsgbm9kZS5hdHRycy5sZXZlbCwgMF07IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgY29kZSBsaXN0aW5nLiBEaXNhbGxvd3MgbWFya3Mgb3Igbm9uLXRleHQgaW5saW5lXG4gICAgbm9kZXMgYnkgZGVmYXVsdC4gUmVwcmVzZW50ZWQgYXMgYSBgPHByZT5gIGVsZW1lbnQgd2l0aCBhXG4gICAgYDxjb2RlPmAgZWxlbWVudCBpbnNpZGUgb2YgaXQuXG4gICAgKi9cbiAgICBjb2RlX2Jsb2NrOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwidGV4dCpcIixcbiAgICAgICAgbWFya3M6IFwiXCIsXG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInByZVwiLCBwcmVzZXJ2ZVdoaXRlc3BhY2U6IFwiZnVsbFwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHByZURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgVGhlIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIHRleHQ6IHtcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgIEFuIGlubGluZSBpbWFnZSAoYDxpbWc+YCkgbm9kZS4gU3VwcG9ydHMgYHNyY2AsXG4gICAgYGFsdGAsIGFuZCBgaHJlZmAgYXR0cmlidXRlcy4gVGhlIGxhdHRlciB0d28gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICBzdHJpbmcuXG4gICAgKi9cbiAgICBpbWFnZToge1xuICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBzcmM6IHsgdmFsaWRhdGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIGFsdDogeyBkZWZhdWx0OiBudWxsLCB2YWxpZGF0ZTogXCJzdHJpbmd8bnVsbFwiIH0sXG4gICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsLCB2YWxpZGF0ZTogXCJzdHJpbmd8bnVsbFwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJpbWdbc3JjXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogZG9tLmdldEF0dHJpYnV0ZShcInNyY1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IGRvbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IGxldCB7IHNyYywgYWx0LCB0aXRsZSB9ID0gbm9kZS5hdHRyczsgcmV0dXJuIFtcImltZ1wiLCB7IHNyYywgYWx0LCB0aXRsZSB9XTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBoYXJkIGxpbmUgYnJlYWssIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDxicj5gLlxuICAgICovXG4gICAgaGFyZF9icmVhazoge1xuICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgIGdyb3VwOiBcImlubGluZVwiLFxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJiclwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGJyRE9NOyB9XG4gICAgfVxufTtcbmNvbnN0IGVtRE9NID0gW1wiZW1cIiwgMF0sIHN0cm9uZ0RPTSA9IFtcInN0cm9uZ1wiLCAwXSwgY29kZURPTSA9IFtcImNvZGVcIiwgMF07XG4vKipcbltTcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjKSBmb3IgdGhlIG1hcmtzIGluIHRoZSBzY2hlbWEuXG4qL1xuY29uc3QgbWFya3MgPSB7XG4gICAgLyoqXG4gICAgQSBsaW5rLiBIYXMgYGhyZWZgIGFuZCBgdGl0bGVgIGF0dHJpYnV0ZXMuIGB0aXRsZWBcbiAgICBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLiBSZW5kZXJlZCBhbmQgcGFyc2VkIGFzIGFuIGA8YT5gXG4gICAgZWxlbWVudC5cbiAgICAqL1xuICAgIGxpbms6IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGhyZWY6IHsgdmFsaWRhdGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfVxuICAgICAgICB9LFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImFbaHJlZl1cIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhyZWY6IGRvbS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLCB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIH07XG4gICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgdG9ET00obm9kZSkgeyBsZXQgeyBocmVmLCB0aXRsZSB9ID0gbm9kZS5hdHRyczsgcmV0dXJuIFtcImFcIiwgeyBocmVmLCB0aXRsZSB9LCAwXTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQW4gZW1waGFzaXMgbWFyay4gUmVuZGVyZWQgYXMgYW4gYDxlbT5gIGVsZW1lbnQuIEhhcyBwYXJzZSBydWxlc1xuICAgIHRoYXQgYWxzbyBtYXRjaCBgPGk+YCBhbmQgYGZvbnQtc3R5bGU6IGl0YWxpY2AuXG4gICAgKi9cbiAgICBlbToge1xuICAgICAgICBwYXJzZURPTTogW1xuICAgICAgICAgICAgeyB0YWc6IFwiaVwiIH0sIHsgdGFnOiBcImVtXCIgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1pdGFsaWNcIiB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPW5vcm1hbFwiLCBjbGVhck1hcms6IG0gPT4gbS50eXBlLm5hbWUgPT0gXCJlbVwiIH1cbiAgICAgICAgXSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBlbURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBzdHJvbmcgbWFyay4gUmVuZGVyZWQgYXMgYDxzdHJvbmc+YCwgcGFyc2UgcnVsZXMgYWxzbyBtYXRjaFxuICAgIGA8Yj5gIGFuZCBgZm9udC13ZWlnaHQ6IGJvbGRgLlxuICAgICovXG4gICAgc3Ryb25nOiB7XG4gICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICB7IHRhZzogXCJzdHJvbmdcIiB9LFxuICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBhcm91bmQgYSBHb29nbGUgRG9jcyBtaXNiZWhhdmlvciB3aGVyZVxuICAgICAgICAgICAgLy8gcGFzdGVkIGNvbnRlbnQgd2lsbCBiZSBpbmV4cGxpY2FibHkgd3JhcHBlZCBpbiBgPGI+YFxuICAgICAgICAgICAgLy8gdGFncyB3aXRoIGEgZm9udC13ZWlnaHQgbm9ybWFsLlxuICAgICAgICAgICAgeyB0YWc6IFwiYlwiLCBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuc3R5bGUuZm9udFdlaWdodCAhPSBcIm5vcm1hbFwiICYmIG51bGwgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHQ9NDAwXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtd2VpZ2h0XCIsIGdldEF0dHJzOiAodmFsdWUpID0+IC9eKGJvbGQoZXIpP3xbNS05XVxcZHsyLH0pJC8udGVzdCh2YWx1ZSkgJiYgbnVsbCB9LFxuICAgICAgICBdLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHN0cm9uZ0RPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQ29kZSBmb250IG1hcmsuIFJlcHJlc2VudGVkIGFzIGEgYDxjb2RlPmAgZWxlbWVudC5cbiAgICAqL1xuICAgIGNvZGU6IHtcbiAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJjb2RlXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gY29kZURPTTsgfVxuICAgIH1cbn07XG4vKipcblRoaXMgc2NoZW1hIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gdGhlIGRvY3VtZW50IHNjaGVtYSB1c2VkIGJ5XG5bQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLyksIG1pbnVzIHRoZSBsaXN0IGVsZW1lbnRzLFxud2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIFtgcHJvc2VtaXJyb3Itc2NoZW1hLWxpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3QpXG5tb2R1bGUuXG5cblRvIHJldXNlIGVsZW1lbnRzIGZyb20gdGhpcyBzY2hlbWEsIGV4dGVuZCBvciByZWFkIGZyb20gaXRzXG5gc3BlYy5ub2Rlc2AgYW5kIGBzcGVjLm1hcmtzYCBbcHJvcGVydGllc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlNjaGVtYS5zcGVjKS5cbiovXG5jb25zdCBzY2hlbWEgPSBuZXcgU2NoZW1hKHsgbm9kZXMsIG1hcmtzIH0pO1xuXG5leHBvcnQgeyBtYXJrcywgbm9kZXMsIHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgYnVsbGV0TGlzdCwgbGlzdEl0ZW0sIG9yZGVyZWRMaXN0IH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWxpc3QnO1xuaW1wb3J0IHsgbWFya3MsIG5vZGVzIH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWJhc2ljJztcbmltcG9ydCB7IE5vZGVTcGVjLCBTY2hlbWEsIFNjaGVtYVNwZWMgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9FU0NBUEVEX0FUVFIgPSAnbWFya2Rvd25fZXNjYXBlZCc7XG5leHBvcnQgY29uc3QgQVVUT19MSU5LX0FUVFIgPSAnYXV0b19saW5rJzsgLy8gTGlua3MgYXV0by1kZXRlY3RlZCBmcm9tIHVzZXIgaW5wdXQsIGFzIG9wcG9zZWQgdG8gbGlua3MgYWRkZWQgYXMgbWV0YWRhdGEgYnkgdGhlIHVzZXJcblxuY29uc3QgRURJVE9SX0NMUyA9ICdzbi1lZGl0b3InO1xuXG5jb25zdCBkb2NTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2Jsb2NrKycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydtYWluJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFtcbiAgICB7XG4gICAgICB0YWc6ICdtYWluJyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3QgaGVhZGluZzFTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydoMScsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnaDEnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBoZWFkaW5nMlNwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGRlZmluaW5nOiB0cnVlLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ2gyJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFt7IHRhZzogJ2gyJyB9XSxcbn07XG5cbmNvbnN0IGhlYWRpbmczU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIGdyb3VwOiAnYmxvY2snLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsnaDMnLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW3sgdGFnOiAnaDMnIH1dLFxufTtcblxuY29uc3QgcGFyYWdyYXBoU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIG1hcmtzOiAnXycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydwJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFt7IHRhZzogJ3AnIH1dLFxufTtcblxuZXhwb3J0IGVudW0gQ2hlY2tib3hTdGF0dXMge1xuICBET05FLFxuICBFTVBUWSxcbn1cblxuY29uc3QgY2hlY2tsaXN0SXRlbVNwZWM6IE5vZGVTcGVjID0ge1xuICBhdHRyczoge1xuICAgIHN0YXR1czoge1xuICAgICAgZGVmYXVsdDogQ2hlY2tib3hTdGF0dXMuRU1QVFksXG4gICAgfSxcbiAgfSxcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIG1hcmtzOiAnXycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzOiAnY2hlY2tsaXN0LWl0ZW0nIH0sXG4gICAgICBbXG4gICAgICAgICdpbnB1dCcsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgIC4uLihub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSAmJiB7IGNoZWNrZWQ6ICd0cnVlJyB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBbJ3AnLCAwXSxcbiAgICBdO1xuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIGNvbnRlbnRFbGVtZW50OiAncCcsXG4gICAgICB0YWc6ICdkaXYuY2hlY2tsaXN0LWl0ZW0nLFxuICAgICAgZ2V0QXR0cnMobm9kZSkge1xuICAgICAgICAvLyBXaWxsIGJlIHR5cGUgTm9kZSB3aGVuIHBhcnNlRE9NIHN1cHBsaWVzIGEgJ3RhZycgcnVsZVxuICAgICAgICBjb25zdCBpbnB1dCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogISEoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZFxuICAgICAgICAgICAgPyBDaGVja2JveFN0YXR1cy5ET05FXG4gICAgICAgICAgICA6IENoZWNrYm94U3RhdHVzLkVNUFRZLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3QgdGV4dFNwZWM6IE5vZGVTcGVjID0ge1xuICBncm91cDogJ2lubGluZScsXG59O1xuXG5jb25zdCBjb2RlQmxvY2tTcGVjOiBOb2RlU3BlYyA9IHtcbiAgLi4ubm9kZXMuY29kZV9ibG9jayxcbiAgYXR0cnM6IHtcbiAgICAuLi5ub2Rlcy5jb2RlX2Jsb2NrLmF0dHJzLFxuICAgIFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxuICB0b0RPTShub2RlKSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBbYGRhdGEtJHtNQVJLRE9XTl9FU0NBUEVEX0FUVFJ9YF06IG5vZGUuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSxcbiAgICB9O1xuICAgIHJldHVybiBub2RlLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl1cbiAgICAgID8gWydwcmUnLCBhdHRycywgWydkaXYnLCB7IGNsYXNzOiAnaW5mbycgfSwgJ2knXSwgWydjb2RlJywgMF1dXG4gICAgICA6IFsncHJlJywgYXR0cnMsIFsnY29kZScsIDBdXTtcbiAgfSxcbn07XG5cbmNvbnN0IHNwZWM6IFNjaGVtYVNwZWMgPSB7XG4gIG5vZGVzOiB7XG4gICAgZG9jOiBkb2NTcGVjLFxuICAgIC8vIE9yZGVyIG1hdHRlcnMgaGVyZS4gcG0gYXBwYXJlbnRseSBpbnNlcnRzIHRoZSBmaXJzdCB2YWxpZCBub2RlIG9uIGVudGVyLlxuICAgIHBhcmFncmFwaDogcGFyYWdyYXBoU3BlYyxcbiAgICBjaGVja2xpc3RfaXRlbTogY2hlY2tsaXN0SXRlbVNwZWMsXG4gICAgdW5vcmRlcmVkX2xpc3Q6IHtcbiAgICAgIC4uLmJ1bGxldExpc3QsXG4gICAgICBjb250ZW50OiAnbGlzdF9pdGVtKycsXG4gICAgICBncm91cDogJ2Jsb2NrJyxcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgb3JkZXJlZF9saXN0OiB7XG4gICAgICAuLi5vcmRlcmVkTGlzdCxcbiAgICAgIGNvbnRlbnQ6ICdsaXN0X2l0ZW0rJyxcbiAgICAgIGdyb3VwOiAnYmxvY2snLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICBsaXN0X2l0ZW06IHtcbiAgICAgIC4uLmxpc3RJdGVtLFxuICAgICAgY29udGVudDogJ3BhcmFncmFwaCAocGFyYWdyYXBoIHwgb3JkZXJlZF9saXN0IHwgdW5vcmRlcmVkX2xpc3QpKicsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIGhlYWRpbmcxOiBoZWFkaW5nMVNwZWMsXG4gICAgaGVhZGluZzI6IGhlYWRpbmcyU3BlYyxcbiAgICBoZWFkaW5nMzogaGVhZGluZzNTcGVjLFxuICAgIHRleHQ6IHRleHRTcGVjLFxuICAgIGNvZGVfYmxvY2s6IGNvZGVCbG9ja1NwZWMsXG4gIH0sXG4gIG1hcmtzOiB7XG4gICAgbGluazoge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgaHJlZjogeyBkZWZhdWx0OiAnJyB9LFxuICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICAgIFtBVVRPX0xJTktfQVRUUl06IHsgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAgIH0sXG4gICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgcGFyc2VET006IFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2FbaHJlZl0nLFxuICAgICAgICAgIGdldEF0dHJzKGRvbTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGhyZWY6IGRvbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyksXG4gICAgICAgICAgICAgIFtgZGF0YS0ke0FVVE9fTElOS19BVFRSfWBdOiBkb20uZ2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIGBkYXRhLSR7QVVUT19MSU5LX0FUVFJ9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0b0RPTShub2RlKSB7XG4gICAgICAgIGxldCB7IGhyZWYsIHRpdGxlIH0gPSBub2RlLmF0dHJzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICdhJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBbYGRhdGEtJHtBVVRPX0xJTktfQVRUUn1gXTogbm9kZS5hdHRyc1tBVVRPX0xJTktfQVRUUl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAwLFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGVtOiB7XG4gICAgICAuLi5tYXJrcy5lbSxcbiAgICB9LFxuICAgIHN0cm9uZzoge1xuICAgICAgLi4ubWFya3Muc3Ryb25nLFxuICAgIH0sXG4gICAgY29kZToge1xuICAgICAgLi4ubWFya3MuY29kZSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIC4uLm1hcmtzLmNvZGUuYXR0cnMsXG4gICAgICAgIFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYShzcGVjKTtcbiIsImltcG9ydCB7XG4gIGlucHV0UnVsZXMsXG4gIHNtYXJ0UXVvdGVzLFxuICBlbGxpcHNpcyxcbiAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcbiAgSW5wdXRSdWxlLFxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcbmltcG9ydCB7IFBsdWdpbiwgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgTWFya1R5cGUsIE5vZGVUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5mdW5jdGlvbiBtYXJrV3JhcHBpbmdSdWxlKFxuICBjOiBzdHJpbmcsXG4gIG1hcmtUeXBlOiBNYXJrVHlwZSxcbiAgaXNWYWxpZEluc2lkZUNvZGVNYXJrOiBib29sZWFuLFxuKSB7XG4gIHJldHVybiBuZXcgSW5wdXRSdWxlKFxuICAgIG5ldyBSZWdFeHAoYCR7Y30oXFxcXFMrKFxcXFxzK1xcXFxTKykqPykke2N9JGApLFxuICAgIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgIGNvbnN0IFtfLCB0ZXh0XSA9IG1hdGNoO1xuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGU7XG4gICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGlzdGluZ01hcmtzID0gc3RhdGUuZG9jXG4gICAgICAgIC5yZXNvbHZlKHN0YXJ0KVxuICAgICAgICAubWFya3NBY3Jvc3Moc3RhdGUuZG9jLnJlc29sdmUoZW5kKSk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRyXG4gICAgICAgICAgLnJlcGxhY2VSYW5nZVdpdGgoXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIHNjaGVtYS50ZXh0KHRleHQsIFsuLi5leGlzdGluZ01hcmtzLCBtYXJrVHlwZS5jcmVhdGUoKV0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAvLyBBZGQgYSBzcGFjZSBhZnRlciB0aGUgdGV4dCBzbyB0aGUgaW5jbHVzaXZlIG1hcmsgcnVsZSBkb2Vzbid0IGFmZmVjdCB0aGUgZW5zdWluZyBpbnB1dFxuICAgICAgICAgIC5pbnNlcnQodHIuc2VsZWN0aW9uLmZyb20sIHNjaGVtYS50ZXh0KCcgJywgWy4uLmV4aXN0aW5nTWFya3NdKSlcbiAgICAgICAgICAuc2V0TWV0YSgnaGFzLWZvcmNlZC1zcGFjZS1mcm9tLWlucHV0LXJ1bGUnLCB7XG4gICAgICAgICAgICBlbmRQb3M6IHRyLnNlbGVjdGlvbi5mcm9tLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAge1xuICAgICAgaW5Db2RlTWFyazogaXNWYWxpZEluc2lkZUNvZGVNYXJrLFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RUeXBlUnVsZShwcmVmaXg6IHN0cmluZywgbGlzdFR5cGU6IE5vZGVUeXBlKTogSW5wdXRSdWxlIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoXG4gICAgbmV3IFJlZ0V4cChgXiR7cHJlZml4fSRgKSxcbiAgICAoc3RhdGUsIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LCBzdGFydCwgZW5kKSA9PiB7XG4gICAgICBjb25zdCAkZW5kID0gc3RhdGUuZG9jLnJlc29sdmUoZW5kKTtcbiAgICAgIGlmICgkZW5kLmRlcHRoID4gMSkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHJlYWR5IGluIGEgbGlzdDsgYWxsIG90aGVyIHBvc2l0aW9ucyBzaG91bGQgYmVcbiAgICAgICAgLy8gZGVwdGggMS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3VidHJhY3QgMiBoZXJlLCBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG5vZGUuXG4gICAgICBjb25zdCByYW5nZUFmdGVyUHJlZml4OiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgICBlbmQsXG4gICAgICAgIHN0YXJ0ICsgJGVuZC5wYXJlbnQubm9kZVNpemUgLSAyLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHNsaWNlQWZ0ZXJQcmVmaXggPSBzdGF0ZS5kb2Muc2xpY2UoLi4ucmFuZ2VBZnRlclByZWZpeCk7XG4gICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgIHRyLmRlbGV0ZVJhbmdlKC4uLnJhbmdlQWZ0ZXJQcmVmaXgpO1xuICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChzdGFydCwgZW5kLCBsaXN0VHlwZS5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHN0YXJ0KSkpO1xuICAgICAgdHIuaW5zZXJ0KHRyLnNlbGVjdGlvbi5mcm9tLCBzbGljZUFmdGVyUHJlZml4LmNvbnRlbnQpO1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHN0YXJ0KSkpO1xuICAgICAgcmV0dXJuIHRyO1xuICAgIH0sXG4gICk7XG59XG5cbmNvbnN0IGFycm93Q2hhcnMgPSBbXG4gIG5ldyBJbnB1dFJ1bGUobmV3IFJlZ0V4cCgnPFxcXFwtPiQnKSwgJ+KGlCcsIHsgaW5Db2RlTWFyazogZmFsc2UgfSksXG4gIG5ldyBJbnB1dFJ1bGUobmV3IFJlZ0V4cCgnXFxcXC0+JCcpLCAn4oaSJywgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KSxcbl07XG5cbmV4cG9ydCBjb25zdCBpbnB1dFJ1bGVzUGx1Z2luID0gaW5wdXRSdWxlcyh7XG4gIHJ1bGVzOiBbXG4gICAgLi4uc21hcnRRdW90ZXMsXG4gICAgZWxsaXBzaXMsXG4gICAgLi4uYXJyb3dDaGFycyxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmcxKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyMgJC8sIHNjaGVtYS5ub2Rlcy5oZWFkaW5nMiksXG4gICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSgvXiMjIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmczKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eYGBgJC8sIHNjaGVtYS5ub2Rlcy5jb2RlX2Jsb2NrKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdgJywgc2NoZW1hLm1hcmtzLmNvZGUsIGZhbHNlKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdcXFxcKicsIHNjaGVtYS5tYXJrcy5zdHJvbmcsIGZhbHNlKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdfJywgc2NoZW1hLm1hcmtzLmVtLCBmYWxzZSksXG4gICAgbGlzdFR5cGVSdWxlKCcxLiAnLCBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0KSxcbiAgICBsaXN0VHlwZVJ1bGUoJy0gJywgc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0KSxcbiAgXSxcbn0pO1xuXG5jb25zdCBSRVNFVF9IQVNfRk9SQ0VEX1NQQUNFX01FVEEgPSAncmVzZXQtaGFzLWZvcmNlZC1zcGFjZS1tZXRhJztcblxuLy8gQ3JlYXRlIGEgcGx1Z2luIHRoYXQgc3dhbGxvd3MgYSBzcGFjZSB0eXBlZCBieSB0aGUgdXNlciB3aGVuIHRoZXkndmUganVzdFxuLy8gaW52b2tlZCBhbiBpbnB1dCBydWxlIHRoYXQgaW5zZXJ0ZWQgYSBzcGFjZSBmb3IgdGhlbSwgdG8gYXZvaWQgdW5pbnRlbnRpb25hbFxuLy8gZG91YmxlIHNwYWNlcy5cbmV4cG9ydCBjb25zdCBpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4gPSBuZXcgUGx1Z2luPFxuICB7IGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSB9IHwgeyBoYXNGb3JjZWRTcGFjZTogdHJ1ZTsgZm9yY2VkU3BhY2VQb3M6IG51bWJlciB9XG4+KHtcbiAgc3RhdGU6IHtcbiAgICBpbml0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzRm9yY2VkU3BhY2U6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGFwcGx5KHRyLCBwcmV2aW91cykge1xuICAgICAgaWYgKHRyLmdldE1ldGEoUkVTRVRfSEFTX0ZPUkNFRF9TUEFDRV9NRVRBKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2aW91cy5oYXNGb3JjZWRTcGFjZSkge1xuICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHNjZW5hcmlvLCB0aGlzIGxvZ2ljIGNvdWxkIGJlIGluc3VmZmljaWVudCwgYnV0IGl0XG4gICAgICAgIC8vIHNob3VsZCB3b3JrIGZpbmUgZm9yIGFsbCBjdXJyZW50IHVzZSBjYXNlcy4gV2Ugd2FudCB0byBndWFyYW50ZWUgdGhhdFxuICAgICAgICAvLyBfb25seV8gd2hlbiB0aGUgdXNlciB0eXBlcyBhIHNwYWNlIGltbWVkaWF0ZWx5IGFmdGVyIHR5cGluZyB0aGVcbiAgICAgICAgLy8gY2xvc2luZyB3cmFwcGluZyBtYXJrIGNoYXJhY3RlciBkbyB3ZSBzdXBwcmVzcyB0aGF0IHNwYWNlIGNoYXJhY3Rlci5cbiAgICAgICAgLy8gU28gaWYgdGhleSBkbyBhbnl0aGluZyBlbHNlLCBsaWtlIGdvIHNvbWV3aGVyZSBlbHNlIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAvLyBvciB0eXBlIGEgZGlmZmVyZW50IGNoYXJhY3Rlciwgd2Ugc2hvdWxkIGNsZWFyIHRoZSBwbHVnaW4gc3RhdGUuIFRoaXNcbiAgICAgICAgLy8gY291bGQgZmFpbCBpbiBhIGNvbGxhYm9yYXRpdmUgc2NlbmFyaW8sIHdoZXJlIG90aGVycyBjb3VsZCBjaGFuZ2UgdGhlXG4gICAgICAgIC8vIGRvY3VtZW50LCBvciB3aXRoIHBsdWdpbnMgdGhhdCBtb2RpZnkgdGhlIGRvY3VtZW50IHdpdGhvdXQgZGlyZWN0XG4gICAgICAgIC8vIGlucHV0IGZyb20gdGhlIHVzZXIuXG4gICAgICAgIGlmICh0ci5zZWxlY3Rpb25TZXQgfHwgdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNGb3JjZWRTcGFjZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVnaW5NZXRhID0gdHIuZ2V0TWV0YSgnaGFzLWZvcmNlZC1zcGFjZS1mcm9tLWlucHV0LXJ1bGUnKTtcbiAgICAgIGlmIChwbHVnaW5NZXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzRm9yY2VkU3BhY2U6IHRydWUsXG4gICAgICAgICAgZm9yY2VkU3BhY2VQb3M6IHBsdWdpbk1ldGEuZW5kUG9zLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfSxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBoYW5kbGVUZXh0SW5wdXQodmlldywgX2Zyb20sIF90bywgdGV4dCkge1xuICAgICAgaWYgKHRoaXMuZ2V0U3RhdGUodmlldy5zdGF0ZSkuaGFzRm9yY2VkU3BhY2UgJiYgdGV4dCA9PT0gJyAnKSB7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRNZXRhKFJFU0VUX0hBU19GT1JDRURfU1BBQ0VfTUVUQSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufSk7XG4iLCJpbXBvcnQgeyBsaWZ0VGFyZ2V0LCByZXBsYWNlU3RlcCwgUmVwbGFjZVN0ZXAsIGNhbkpvaW4sIGpvaW5Qb2ludCwgY2FuU3BsaXQsIFJlcGxhY2VBcm91bmRTdGVwLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgU2xpY2UsIEZyYWdtZW50IH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgTm9kZVNlbGVjdGlvbiwgU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uLCBBbGxTZWxlY3Rpb24sIFNlbGVjdGlvblJhbmdlIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vKipcbkRlbGV0ZSB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4qL1xuY29uc3QgZGVsZXRlU2VsZWN0aW9uID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldykge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImJhY2t3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0ID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAkY3Vyc29yO1xufVxuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2ssIHRyeSB0b1xucmVkdWNlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoYXQgYmxvY2sgYW5kIHRoZSBvbmUgYmVmb3JlIGl04oCUaWZcbnRoZXJlJ3MgYSBibG9jayBkaXJlY3RseSBiZWZvcmUgaXQgdGhhdCBjYW4gYmUgam9pbmVkLCBqb2luIHRoZW0uXG5JZiBub3QsIHRyeSB0byBtb3ZlIHRoZSBzZWxlY3RlZCBibG9jayBjbG9zZXIgdG8gdGhlIG5leHQgb25lIGluXG50aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGxpZnRpbmcgaXQgb3V0IG9mIGl0cyBwYXJlbnQgb3IgbW92aW5nIGl0XG5pbnRvIGEgcGFyZW50IG9mIHRoZSBwcmV2aW91cyBibG9jay4gV2lsbCB1c2UgdGhlIHZpZXcgZm9yIGFjY3VyYXRlXG4oYmlkaS1hd2FyZSkgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEJlZm9yZSgkY3Vyc29yKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSB0aGlzLCB0cnkgdG8gbGlmdFxuICAgIGlmICghJGN1dCkge1xuICAgICAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmU7XG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgaWYgKGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoLCAtMSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGJlbG93IGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBhYm92ZSBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBiZWxvdyBhbmQgc2VsZWN0IHRoZSBvbmUgYWJvdmUuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpIHx8IE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGJlZm9yZSkpKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gJGN1cnNvci5kZXB0aDs7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZShkZXB0aCksICRjdXJzb3IuYWZ0ZXIoZGVwdGgpLCBTbGljZS5lbXB0eSk7XG4gICAgICAgICAgICBpZiAoZGVsU3RlcCAmJiBkZWxTdGVwLnNsaWNlLnNpemUgPCBkZWxTdGVwLnRvIC0gZGVsU3RlcC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAoZGVsU3RlcCk7XG4gICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbih0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFNlbGVjdGlvbi5maW5kRnJvbSh0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcywgLTEpKSwgLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgJGN1dC5wb3MgLSBiZWZvcmUubm9kZVNpemUpKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlcHRoID09IDEgfHwgJGN1cnNvci5ub2RlKGRlcHRoIC0gMSkuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5vZGUgYmVmb3JlIGlzIGFuIGF0b20sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkY3V0LnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5BIG1vcmUgbGltaXRlZCBmb3JtIG9mIFtgam9pbkJhY2t3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5CYWNrd2FyZClcbnRoYXQgb25seSB0cmllcyB0byBqb2luIHRoZSBjdXJyZW50IHRleHRibG9jayB0byB0aGUgb25lIGJlZm9yZVxuaXQsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLlxuKi9cbmNvbnN0IGpvaW5UZXh0YmxvY2tCYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRjdXJzb3IpO1xuICAgIHJldHVybiAkY3V0ID8gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSA6IGZhbHNlO1xufTtcbi8qKlxuQSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBbYGpvaW5Gb3J3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5Gb3J3YXJkKVxudGhhdCBvbmx5IHRyaWVzIHRvIGpvaW4gdGhlIGN1cnJlbnQgdGV4dGJsb2NrIHRvIHRoZSBvbmUgYWZ0ZXJcbml0LCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2suXG4qL1xuY29uc3Qgam9pblRleHRibG9ja0ZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRBZnRlcigkY3Vyc29yKTtcbiAgICByZXR1cm4gJGN1dCA/IGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlLCBiZWZvcmVUZXh0ID0gYmVmb3JlLCBiZWZvcmVQb3MgPSAkY3V0LnBvcyAtIDE7XG4gICAgZm9yICg7ICFiZWZvcmVUZXh0LmlzVGV4dGJsb2NrOyBiZWZvcmVQb3MtLSkge1xuICAgICAgICBpZiAoYmVmb3JlVGV4dC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSBiZWZvcmVUZXh0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFjaGlsZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYmVmb3JlVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyUG9zID0gJGN1dC5wb3MgKyAxO1xuICAgIGZvciAoOyAhYWZ0ZXJUZXh0LmlzVGV4dGJsb2NrOyBhZnRlclBvcysrKSB7XG4gICAgICAgIGlmIChhZnRlclRleHQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGFmdGVyVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgc3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgYmVmb3JlUG9zLCBhZnRlclBvcywgU2xpY2UuZW1wdHkpO1xuICAgIGlmICghc3RlcCB8fCBzdGVwLmZyb20gIT0gYmVmb3JlUG9zIHx8XG4gICAgICAgIHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCAmJiBzdGVwLnNsaWNlLnNpemUgPj0gYWZ0ZXJQb3MgLSBiZWZvcmVQb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChzdGVwKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgYmVmb3JlUG9zKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRleHRibG9ja0F0KG5vZGUsIHNpZGUsIG9ubHkgPSBmYWxzZSkge1xuICAgIGZvciAobGV0IHNjYW4gPSBub2RlOyBzY2FuOyBzY2FuID0gKHNpZGUgPT0gXCJzdGFydFwiID8gc2Nhbi5maXJzdENoaWxkIDogc2Nhbi5sYXN0Q2hpbGQpKSB7XG4gICAgICAgIGlmIChzY2FuLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvbmx5ICYmIHNjYW4uY2hpbGRDb3VudCAhPSAxKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLCBzZWxlY3RcbnRoZSBub2RlIGJlZm9yZSB0aGF0IHRleHRibG9jaywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbmJvdW5kIHRvIGtleXMgbGlrZSBiYWNrc3BhY2UsIGFmdGVyXG5bYGpvaW5CYWNrd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luQmFja3dhcmQpIG9yIG90aGVyIGRlbGV0aW5nXG5jb21tYW5kcywgYXMgYSBmYWxsLWJhY2sgYmVoYXZpb3Igd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgYWxsb3dcbmRlbGV0aW9uIGF0IHRoZSBzZWxlY3RlZCBwb2ludC5cbiovXG5jb25zdCBzZWxlY3ROb2RlQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiYmFja3dhcmRcIiwgc3RhdGUpIDogJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGhlYWQpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9ICRjdXQgJiYgJGN1dC5ub2RlQmVmb3JlO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zIC0gbm9kZS5ub2RlU2l6ZSkpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGZpbmRDdXRCZWZvcmUoJHBvcykge1xuICAgIGlmICghJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCRwb3MuaW5kZXgoaSkgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmRvYy5yZXNvbHZlKCRwb3MuYmVmb3JlKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGkpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpIHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJmb3J3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0IDwgJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuICRjdXJzb3I7XG59XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhXG50ZXh0YmxvY2ssIHRyeSB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHRoYXQgYmxvY2tcbmFuZCB0aGUgb25lIGFmdGVyIGl0LCBlaXRoZXIgYnkgam9pbmluZyB0aGVtIG9yIGJ5IG1vdmluZyB0aGUgb3RoZXJcbmJsb2NrIGNsb3NlciB0byB0aGlzIG9uZSBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUuIFdpbGwgdXNlIHRoZSB2aWV3XG5mb3IgYWNjdXJhdGUgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEFmdGVyKCRjdXJzb3IpO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCEkY3V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXI7XG4gICAgLy8gVHJ5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIGlmIChkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCwgMSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGFib3ZlIGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBiZWxvdyBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBhYm92ZSBhbmQgc2VsZWN0IHRoZSBvbmUgYmVsb3cuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiKSB8fCBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShhZnRlcikpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIikgPyBTZWxlY3Rpb24uZmluZEZyb20odHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoJGN1dC5wb3MpKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRjdXQucG9zKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhbiBhdG9tLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jaywgc2VsZWN0XG50aGUgbm9kZSBjb21pbmcgYWZ0ZXIgdGhhdCB0ZXh0YmxvY2ssIGlmIHBvc3NpYmxlLiBUaGlzIGlzIGludGVuZGVkXG50byBiZSBib3VuZCB0byBrZXlzIGxpa2UgZGVsZXRlLCBhZnRlclxuW2Bqb2luRm9yd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luRm9yd2FyZCkgYW5kIHNpbWlsYXIgZGVsZXRpbmdcbmNvbW1hbmRzLCB0byBwcm92aWRlIGEgZmFsbC1iYWNrIGJlaGF2aW9yIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0XG5hbGxvdyBkZWxldGlvbiBhdCB0aGUgc2VsZWN0ZWQgcG9pbnQuXG4qL1xuY29uc3Qgc2VsZWN0Tm9kZUZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiZm9yd2FyZFwiLCBzdGF0ZSkgOiAkaGVhZC5wYXJlbnRPZmZzZXQgPCAkaGVhZC5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAkY3V0ID0gZmluZEN1dEFmdGVyKCRoZWFkKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSAkY3V0ICYmICRjdXQubm9kZUFmdGVyO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZmluZEN1dEFmdGVyKCRwb3MpIHtcbiAgICBpZiAoISRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkcG9zLm5vZGUoaSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5pbmRleChpKSArIDEgPCBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5kb2MucmVzb2x2ZSgkcG9zLmFmdGVyKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuSm9pbiB0aGUgc2VsZWN0ZWQgYmxvY2sgb3IsIGlmIHRoZXJlIGlzIGEgdGV4dCBzZWxlY3Rpb24sIHRoZVxuY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCwgd2l0aFxudGhlIHNpYmxpbmcgYWJvdmUgaXQuXG4qL1xuY29uc3Qgam9pblVwID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIG5vZGVTZWwgPSBzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uLCBwb2ludDtcbiAgICBpZiAobm9kZVNlbCkge1xuICAgICAgICBpZiAoc2VsLm5vZGUuaXNUZXh0YmxvY2sgfHwgIWNhbkpvaW4oc3RhdGUuZG9jLCBzZWwuZnJvbSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLmZyb207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHNlbC5mcm9tLCAtMSk7XG4gICAgICAgIGlmIChwb2ludCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuam9pbihwb2ludCk7XG4gICAgICAgIGlmIChub2RlU2VsKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgcG9pbnQgLSBzdGF0ZS5kb2MucmVzb2x2ZShwb2ludCkubm9kZUJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5Kb2luIHRoZSBzZWxlY3RlZCBibG9jaywgb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igb2YgdGhlIHNlbGVjdGlvblxudGhhdCBjYW4gYmUgam9pbmVkLCB3aXRoIHRoZSBzaWJsaW5nIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGpvaW5Eb3duID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIHBvaW50O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChzZWwubm9kZS5pc1RleHRibG9jayB8fCAhY2FuSm9pbihzdGF0ZS5kb2MsIHNlbC50bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLnRvO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzZWwudG8sIDEpO1xuICAgICAgICBpZiAocG9pbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5qb2luKHBvaW50KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkxpZnQgdGhlIHNlbGVjdGVkIGJsb2NrLCBvciB0aGUgY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGVcbnNlbGVjdGlvbiB0aGF0IGNhbiBiZSBsaWZ0ZWQsIG91dCBvZiBpdHMgcGFyZW50IG5vZGUuXG4qL1xuY29uc3QgbGlmdCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aG9zZSB0eXBlIGhhcyBhIHRydXRoeVxuW2Bjb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvZGUpIHByb3BlcnR5IGluIGl0cyBzcGVjLCByZXBsYWNlIHRoZVxuc2VsZWN0aW9uIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci5cbiovXG5jb25zdCBuZXdsaW5lSW5Db2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmluc2VydFRleHQoXCJcXG5cIikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZGVmYXVsdEJsb2NrQXQobWF0Y2gpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCB7IHR5cGUgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSlcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aXRoIGEgdHJ1dGh5XG5bYGNvZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29kZSkgcHJvcGVydHkgaW4gaXRzIHNwZWMsIGNyZWF0ZSBhXG5kZWZhdWx0IGJsb2NrIGFmdGVyIHRoZSBjb2RlIGJsb2NrLCBhbmQgbW92ZSB0aGUgY3Vyc29yIHRoZXJlLlxuKi9cbmNvbnN0IGV4aXRDb2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYWJvdmUgPSAkaGVhZC5ub2RlKC0xKSwgYWZ0ZXIgPSAkaGVhZC5pbmRleEFmdGVyKC0xKSwgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgaWYgKCF0eXBlIHx8ICFhYm92ZS5jYW5SZXBsYWNlV2l0aChhZnRlciwgYWZ0ZXIsIHR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBwb3MgPSAkaGVhZC5hZnRlcigpLCB0ciA9IHN0YXRlLnRyLnJlcGxhY2VXaXRoKHBvcywgcG9zLCB0eXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShwb3MpLCAxKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIGEgYmxvY2sgbm9kZSBpcyBzZWxlY3RlZCwgY3JlYXRlIGFuIGVtcHR5IHBhcmFncmFwaCBiZWZvcmUgKGlmXG5pdCBpcyBpdHMgcGFyZW50J3MgZmlyc3QgY2hpbGQpIG9yIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGNyZWF0ZVBhcmFncmFwaE5lYXIgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiB8fCAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCAkdG8ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KCR0by5wYXJlbnQuY29udGVudE1hdGNoQXQoJHRvLmluZGV4QWZ0ZXIoKSkpO1xuICAgIGlmICghdHlwZSB8fCAhdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgc2lkZSA9ICghJGZyb20ucGFyZW50T2Zmc2V0ICYmICR0by5pbmRleCgpIDwgJHRvLnBhcmVudC5jaGlsZENvdW50ID8gJGZyb20gOiAkdG8pLnBvcztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuaW5zZXJ0KHNpZGUsIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgc2lkZSArIDEpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgdGhlIGN1cnNvciBpcyBpbiBhbiBlbXB0eSB0ZXh0YmxvY2sgdGhhdCBjYW4gYmUgbGlmdGVkLCBsaWZ0IHRoZVxuYmxvY2suXG4qL1xuY29uc3QgbGlmdEVtcHR5QmxvY2sgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGN1cnNvci5kZXB0aCA+IDEgJiYgJGN1cnNvci5hZnRlcigpICE9ICRjdXJzb3IuZW5kKC0xKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gJGN1cnNvci5iZWZvcmUoKTtcbiAgICAgICAgaWYgKGNhblNwbGl0KHN0YXRlLmRvYywgYmVmb3JlKSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNwbGl0KGJlZm9yZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuQ3JlYXRlIGEgdmFyaWFudCBvZiBbYHNwbGl0QmxvY2tgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuc3BsaXRCbG9jaykgdGhhdCB1c2VzXG5hIGN1c3RvbSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIG5ld2x5IHNwbGl0IG9mZiBibG9jay5cbiovXG5mdW5jdGlvbiBzcGxpdEJsb2NrQXMoc3BsaXROb2RlKSB7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzdGF0ZS5zZWxlY3Rpb24ubm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoc3RhdGUuZG9jLCAkZnJvbS5wb3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zcGxpdCgkZnJvbS5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkZnJvbS5kZXB0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHR5cGVzID0gW107XG4gICAgICAgIGxldCBzcGxpdERlcHRoLCBkZWZsdCwgYXRFbmQgPSBmYWxzZSwgYXRTdGFydCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGg7OyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gJGZyb20ubm9kZShkKTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICBhdEVuZCA9ICRmcm9tLmVuZChkKSA9PSAkZnJvbS5wb3MgKyAoJGZyb20uZGVwdGggLSBkKTtcbiAgICAgICAgICAgICAgICBhdFN0YXJ0ID0gJGZyb20uc3RhcnQoZCkgPT0gJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCk7XG4gICAgICAgICAgICAgICAgZGVmbHQgPSBkZWZhdWx0QmxvY2tBdCgkZnJvbS5ub2RlKGQgLSAxKS5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleEFmdGVyKGQgLSAxKSkpO1xuICAgICAgICAgICAgICAgIGxldCBzcGxpdFR5cGUgPSBzcGxpdE5vZGUgJiYgc3BsaXROb2RlKCR0by5wYXJlbnQsIGF0RW5kLCAkZnJvbSk7XG4gICAgICAgICAgICAgICAgdHlwZXMudW5zaGlmdChzcGxpdFR5cGUgfHwgKGF0RW5kICYmIGRlZmx0ID8geyB0eXBlOiBkZWZsdCB9IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgIHNwbGl0RGVwdGggPSBkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGQgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHR5cGVzLnVuc2hpZnQobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uIHx8IHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICBsZXQgc3BsaXRQb3MgPSB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpO1xuICAgICAgICBsZXQgY2FuID0gY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgdHlwZXMubGVuZ3RoLCB0eXBlcyk7XG4gICAgICAgIGlmICghY2FuKSB7XG4gICAgICAgICAgICB0eXBlc1swXSA9IGRlZmx0ID8geyB0eXBlOiBkZWZsdCB9IDogbnVsbDtcbiAgICAgICAgICAgIGNhbiA9IGNhblNwbGl0KHRyLmRvYywgc3BsaXRQb3MsIHR5cGVzLmxlbmd0aCwgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2FuKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0ci5zcGxpdChzcGxpdFBvcywgdHlwZXMubGVuZ3RoLCB0eXBlcyk7XG4gICAgICAgIGlmICghYXRFbmQgJiYgYXRTdGFydCAmJiAkZnJvbS5ub2RlKHNwbGl0RGVwdGgpLnR5cGUgIT0gZGVmbHQpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZShzcGxpdERlcHRoKSksICRmaXJzdCA9IHRyLmRvYy5yZXNvbHZlKGZpcnN0KTtcbiAgICAgICAgICAgIGlmIChkZWZsdCAmJiAkZnJvbS5ub2RlKHNwbGl0RGVwdGggLSAxKS5jYW5SZXBsYWNlV2l0aCgkZmlyc3QuaW5kZXgoKSwgJGZpcnN0LmluZGV4KCkgKyAxLCBkZWZsdCkpXG4gICAgICAgICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5iZWZvcmUoc3BsaXREZXB0aCkpLCBkZWZsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblNwbGl0IHRoZSBwYXJlbnQgYmxvY2sgb2YgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIHNlbGVjdGlvbiBpcyBhIHRleHRcbnNlbGVjdGlvbiwgYWxzbyBkZWxldGUgaXRzIGNvbnRlbnQuXG4qL1xuY29uc3Qgc3BsaXRCbG9jayA9IHNwbGl0QmxvY2tBcygpO1xuLyoqXG5BY3RzIGxpa2UgW2BzcGxpdEJsb2NrYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnNwbGl0QmxvY2spLCBidXQgd2l0aG91dFxucmVzZXR0aW5nIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzIGF0IHRoZSBjdXJzb3IuXG4qL1xuY29uc3Qgc3BsaXRCbG9ja0tlZXBNYXJrcyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gc3BsaXRCbG9jayhzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgbGV0IG1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3MgfHwgKHN0YXRlLnNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKTtcbiAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgfSkpO1xufTtcbi8qKlxuTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBub2RlIHdyYXBwaW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgaWZcbmFueS4gKFdpbGwgbm90IHNlbGVjdCB0aGUgZG9jdW1lbnQgbm9kZS4pXG4qL1xuY29uc3Qgc2VsZWN0UGFyZW50Tm9kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgdG8gfSA9IHN0YXRlLnNlbGVjdGlvbiwgcG9zO1xuICAgIGxldCBzYW1lID0gJGZyb20uc2hhcmVkRGVwdGgodG8pO1xuICAgIGlmIChzYW1lID09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBwb3MgPSAkZnJvbS5iZWZvcmUoc2FtZSk7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBwb3MpKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5TZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuKi9cbmNvbnN0IHNlbGVjdEFsbCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgQWxsU2VsZWN0aW9uKHN0YXRlLmRvYykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBqb2luTWF5YmVDbGVhcihzdGF0ZSwgJHBvcywgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJHBvcy5ub2RlQmVmb3JlLCBhZnRlciA9ICRwb3Mubm9kZUFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgIWJlZm9yZS50eXBlLmNvbXBhdGlibGVDb250ZW50KGFmdGVyLnR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFiZWZvcmUuY29udGVudC5zaXplICYmICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXggLSAxLCBpbmRleCkpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRwb3MucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoISRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSkgfHwgIShhZnRlci5pc1RleHRibG9jayB8fCBjYW5Kb2luKHN0YXRlLmRvYywgJHBvcy5wb3MpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuam9pbigkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCwgZGlyKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgY29ubiwgbWF0Y2g7XG4gICAgbGV0IGlzb2xhdGVkID0gYmVmb3JlLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgYWZ0ZXIudHlwZS5zcGVjLmlzb2xhdGluZztcbiAgICBpZiAoIWlzb2xhdGVkICYmIGpvaW5NYXliZUNsZWFyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBjYW5EZWxBZnRlciA9ICFpc29sYXRlZCAmJiAkY3V0LnBhcmVudC5jYW5SZXBsYWNlKCRjdXQuaW5kZXgoKSwgJGN1dC5pbmRleCgpICsgMSk7XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmXG4gICAgICAgIChjb25uID0gKG1hdGNoID0gYmVmb3JlLmNvbnRlbnRNYXRjaEF0KGJlZm9yZS5jaGlsZENvdW50KSkuZmluZFdyYXBwaW5nKGFmdGVyLnR5cGUpKSAmJlxuICAgICAgICBtYXRjaC5tYXRjaFR5cGUoY29ublswXSB8fCBhZnRlci50eXBlKS52YWxpZEVuZCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCB3cmFwID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY29ubi5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbShjb25uW2ldLmNyZWF0ZShudWxsLCB3cmFwKSk7XG4gICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbShiZWZvcmUuY29weSh3cmFwKSk7XG4gICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIDEsIGVuZCwgJGN1dC5wb3MsIGVuZCwgbmV3IFNsaWNlKHdyYXAsIDEsIDApLCBjb25uLmxlbmd0aCwgdHJ1ZSkpO1xuICAgICAgICAgICAgbGV0ICRqb2luQXQgPSB0ci5kb2MucmVzb2x2ZShlbmQgKyAyICogY29ubi5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCRqb2luQXQubm9kZUFmdGVyICYmICRqb2luQXQubm9kZUFmdGVyLnR5cGUgPT0gYmVmb3JlLnR5cGUgJiZcbiAgICAgICAgICAgICAgICBjYW5Kb2luKHRyLmRvYywgJGpvaW5BdC5wb3MpKVxuICAgICAgICAgICAgICAgIHRyLmpvaW4oJGpvaW5BdC5wb3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBzZWxBZnRlciA9IGFmdGVyLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgKGRpciA+IDAgJiYgaXNvbGF0ZWQpID8gbnVsbCA6IFNlbGVjdGlvbi5maW5kRnJvbSgkY3V0LCAxKTtcbiAgICBsZXQgcmFuZ2UgPSBzZWxBZnRlciAmJiBzZWxBZnRlci4kZnJvbS5ibG9ja1JhbmdlKHNlbEFmdGVyLiR0byksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgPj0gJGN1dC5kZXB0aCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmIHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIsIHRydWUpICYmIHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIikpIHtcbiAgICAgICAgbGV0IGF0ID0gYmVmb3JlLCB3cmFwID0gW107XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIHdyYXAucHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBhdCA9IGF0Lmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyRGVwdGggPSAxO1xuICAgICAgICBmb3IgKDsgIWFmdGVyVGV4dC5pc1RleHRibG9jazsgYWZ0ZXJUZXh0ID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBhZnRlckRlcHRoKys7XG4gICAgICAgIGlmIChhdC5jYW5SZXBsYWNlKGF0LmNoaWxkQ291bnQsIGF0LmNoaWxkQ291bnQsIGFmdGVyVGV4dC5jb250ZW50KSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB3cmFwLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBGcmFnbWVudC5mcm9tKHdyYXBbaV0uY29weShlbmQpKTtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIHdyYXAubGVuZ3RoLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCAkY3V0LnBvcyArIGFmdGVyRGVwdGgsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUgLSBhZnRlckRlcHRoLCBuZXcgU2xpY2UoZW5kLCB3cmFwLmxlbmd0aCwgMCksIDAsIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdFRleHRibG9ja1NpZGUoc2lkZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sICRwb3MgPSBzaWRlIDwgMCA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7XG4gICAgICAgIHdoaWxlICgkcG9zLm5vZGUoZGVwdGgpLmlzSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkcG9zLm5vZGUoZGVwdGgpLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBzaWRlIDwgMCA/ICRwb3Muc3RhcnQoZGVwdGgpIDogJHBvcy5lbmQoZGVwdGgpKSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5Nb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IHRleHQgYmxvY2suXG4qL1xuY29uc3Qgc2VsZWN0VGV4dGJsb2NrU3RhcnQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKC0xKTtcbi8qKlxuTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiovXG5jb25zdCBzZWxlY3RUZXh0YmxvY2tFbmQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKDEpO1xuLy8gUGFyYW1ldGVyaXplZCBjb21tYW5kc1xuLyoqXG5XcmFwIHRoZSBzZWxlY3Rpb24gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuXG5hdHRyaWJ1dGVzLlxuKi9cbmZ1bmN0aW9uIHdyYXBJbihub2RlVHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci53cmFwKHJhbmdlLCB3cmFwcGluZykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblJldHVybnMgYSBjb21tYW5kIHRoYXQgdHJpZXMgdG8gc2V0IHRoZSBzZWxlY3RlZCB0ZXh0YmxvY2tzIHRvIHRoZVxuZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4qL1xuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKG5vZGVUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgYXBwbGljYWJsZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoICYmICFhcHBsaWNhYmxlOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tOiB7IHBvczogZnJvbSB9LCAkdG86IHsgcG9zOiB0byB9IH0gPSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzW2ldO1xuICAgICAgICAgICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhYmxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUuaGFzTWFya3VwKG5vZGVUeXBlLCBhdHRycykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09IG5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9ICRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCArIDEsIG5vZGVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcGxpY2FibGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbTogeyBwb3M6IGZyb20gfSwgJHRvOiB7IHBvczogdG8gfSB9ID0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICB0ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFya0FwcGxpZXMoZG9jLCByYW5nZXMsIHR5cGUsIGVudGVyQXRvbXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgIGxldCBjYW4gPSAkZnJvbS5kZXB0aCA9PSAwID8gZG9jLmlubGluZUNvbnRlbnQgJiYgZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUodHlwZSkgOiBmYWxzZTtcbiAgICAgICAgZG9jLm5vZGVzQmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGlmIChjYW4gfHwgIWVudGVyQXRvbXMgJiYgbm9kZS5pc0F0b20gJiYgbm9kZS5pc0lubGluZSAmJiBwb3MgPj0gJGZyb20ucG9zICYmIHBvcyArIG5vZGUubm9kZVNpemUgPD0gJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYW4gPSBub2RlLmlubGluZUNvbnRlbnQgJiYgbm9kZS50eXBlLmFsbG93c01hcmtUeXBlKHR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZW1vdmVJbmxpbmVBdG9tcyhyYW5nZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICAkZnJvbS5kb2Mubm9kZXNCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNBdG9tICYmIG5vZGUuY29udGVudC5zaXplICYmIG5vZGUuaXNJbmxpbmUgJiYgcG9zID49ICRmcm9tLnBvcyAmJiBwb3MgKyBub2RlLm5vZGVTaXplIDw9ICR0by5wb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgMSA+ICRmcm9tLnBvcylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFNlbGVjdGlvblJhbmdlKCRmcm9tLCAkZnJvbS5kb2MucmVzb2x2ZShwb3MgKyAxKSkpO1xuICAgICAgICAgICAgICAgICRmcm9tID0gJGZyb20uZG9jLnJlc29sdmUocG9zICsgMSArIG5vZGUuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoJGZyb20ucG9zIDwgJHRvLnBvcylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTZWxlY3Rpb25SYW5nZSgkZnJvbSwgJHRvKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB0b2dnbGVzIHRoZSBnaXZlbiBtYXJrIHdpdGggdGhlXG5naXZlbiBhdHRyaWJ1dGVzLiBXaWxsIHJldHVybiBgZmFsc2VgIHdoZW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5kb2Vzbid0IHN1cHBvcnQgdGhhdCBtYXJrLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBtYXJrIGlmIGFueSBtYXJrc1xub2YgdGhhdCB0eXBlIGV4aXN0IGluIHRoZSBzZWxlY3Rpb24sIG9yIGFkZCBpdCBvdGhlcndpc2UuIElmIHRoZVxuc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGlzIGFwcGxpZXMgdG8gdGhlIFtzdG9yZWRcbm1hcmtzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuc3RvcmVkTWFya3MpIGluc3RlYWQgb2YgYSByYW5nZSBvZiB0aGVcbmRvY3VtZW50LlxuKi9cbmZ1bmN0aW9uIHRvZ2dsZU1hcmsobWFya1R5cGUsIGF0dHJzID0gbnVsbCwgb3B0aW9ucykge1xuICAgIGxldCByZW1vdmVXaGVuUHJlc2VudCA9IChvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlV2hlblByZXNlbnQpICE9PSBmYWxzZTtcbiAgICBsZXQgZW50ZXJBdG9tcyA9IChvcHRpb25zICYmIG9wdGlvbnMuZW50ZXJJbmxpbmVBdG9tcykgIT09IGZhbHNlO1xuICAgIGxldCBkcm9wU3BhY2UgPSAhKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlV2hpdGVzcGFjZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgZW1wdHksICRjdXJzb3IsIHJhbmdlcyB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoKGVtcHR5ICYmICEkY3Vyc29yKSB8fCAhbWFya0FwcGxpZXMoc3RhdGUuZG9jLCByYW5nZXMsIG1hcmtUeXBlLCBlbnRlckF0b21zKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBpZiAoJGN1cnNvcikge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrVHlwZS5pc0luU2V0KHN0YXRlLnN0b3JlZE1hcmtzIHx8ICRjdXJzb3IubWFya3MoKSkpXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnJlbW92ZVN0b3JlZE1hcmsobWFya1R5cGUpKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmFkZFN0b3JlZE1hcmsobWFya1R5cGUuY3JlYXRlKGF0dHJzKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGFkZCwgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgICAgICAgICBpZiAoIWVudGVyQXRvbXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHJlbW92ZUlubGluZUF0b21zKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZVdoZW5QcmVzZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZCA9ICFyYW5nZXMuc29tZShyID0+IHN0YXRlLmRvYy5yYW5nZUhhc01hcmsoci4kZnJvbS5wb3MsIHIuJHRvLnBvcywgbWFya1R5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZCA9ICFyYW5nZXMuZXZlcnkociA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWlzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihyLiRmcm9tLnBvcywgci4kdG8ucG9zLCAobm9kZSwgcG9zLCBwYXJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgPSAhbWFya1R5cGUuaXNJblNldChub2RlLm1hcmtzKSAmJiAhIXBhcmVudCAmJiBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShub2RlLmlzVGV4dCAmJiAvXlxccyokLy50ZXN0KG5vZGUudGV4dEJldHdlZW4oTWF0aC5tYXgoMCwgci4kZnJvbS5wb3MgLSBwb3MpLCBNYXRoLm1pbihub2RlLm5vZGVTaXplLCByLiR0by5wb3MgLSBwb3MpKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1pc3Npbmc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKCRmcm9tLnBvcywgJHRvLnBvcywgbWFya1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSAkZnJvbS5wb3MsIHRvID0gJHRvLnBvcywgc3RhcnQgPSAkZnJvbS5ub2RlQWZ0ZXIsIGVuZCA9ICR0by5ub2RlQmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlU3RhcnQgPSBkcm9wU3BhY2UgJiYgc3RhcnQgJiYgc3RhcnQuaXNUZXh0ID8gL15cXHMqLy5leGVjKHN0YXJ0LnRleHQpWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VFbmQgPSBkcm9wU3BhY2UgJiYgZW5kICYmIGVuZC5pc1RleHQgPyAvXFxzKiQvLmV4ZWMoZW5kLnRleHQpWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSArIHNwYWNlU3RhcnQgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gc3BhY2VTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtPSBzcGFjZUVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoZnJvbSwgdG8sIG1hcmtUeXBlLmNyZWF0ZShhdHRycykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5mdW5jdGlvbiB3cmFwRGlzcGF0Y2hGb3JKb2luKGRpc3BhdGNoLCBpc0pvaW5hYmxlKSB7XG4gICAgcmV0dXJuICh0cikgPT4ge1xuICAgICAgICBpZiAoIXRyLmlzR2VuZXJpYylcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh0cik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ci5tYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJhbmdlcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSBtYXAubWFwKHJhbmdlc1tqXSk7XG4gICAgICAgICAgICBtYXAuZm9yRWFjaCgoX3MsIF9lLCBmcm9tLCB0bykgPT4gcmFuZ2VzLnB1c2goZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIGpvaW5hYmxlIHBvaW50cyBleGlzdCBpbnNpZGUgdGhvc2UgcmFuZ2VzLFxuICAgICAgICAvLyBieSBjaGVja2luZyBhbGwgbm9kZSBib3VuZGFyaWVzIGluIHRoZWlyIHBhcmVudCBub2Rlcy5cbiAgICAgICAgbGV0IGpvaW5hYmxlID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1tpXSwgdG8gPSByYW5nZXNbaSArIDFdO1xuICAgICAgICAgICAgbGV0ICRmcm9tID0gdHIuZG9jLnJlc29sdmUoZnJvbSksIGRlcHRoID0gJGZyb20uc2hhcmVkRGVwdGgodG8pLCBwYXJlbnQgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gJGZyb20uaW5kZXhBZnRlcihkZXB0aCksIHBvcyA9ICRmcm9tLmFmdGVyKGRlcHRoICsgMSk7IHBvcyA8PSB0bzsgKytpbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggJiYgam9pbmFibGUuaW5kZXhPZihwb3MpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBwYXJlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS50eXBlID09IGFmdGVyLnR5cGUgJiYgaXNKb2luYWJsZShiZWZvcmUsIGFmdGVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5hYmxlLnB1c2gocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zICs9IGFmdGVyLm5vZGVTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpvaW4gdGhlIGpvaW5hYmxlIHBvaW50c1xuICAgICAgICBqb2luYWJsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IGkgPSBqb2luYWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGNhbkpvaW4odHIuZG9jLCBqb2luYWJsZVtpXSkpXG4gICAgICAgICAgICAgICAgdHIuam9pbihqb2luYWJsZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgIH07XG59XG4vKipcbldyYXAgYSBjb21tYW5kIHNvIHRoYXQsIHdoZW4gaXQgcHJvZHVjZXMgYSB0cmFuc2Zvcm0gdGhhdCBjYXVzZXNcbnR3byBqb2luYWJsZSBub2RlcyB0byBlbmQgdXAgbmV4dCB0byBlYWNoIG90aGVyLCB0aG9zZSBhcmUgam9pbmVkLlxuTm9kZXMgYXJlIGNvbnNpZGVyZWQgam9pbmFibGUgd2hlbiB0aGV5IGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZFxud2hlbiB0aGUgYGlzSm9pbmFibGVgIHByZWRpY2F0ZSByZXR1cm5zIHRydWUgZm9yIHRoZW0gb3IsIGlmIGFuXG5hcnJheSBvZiBzdHJpbmdzIHdhcyBwYXNzZWQsIGlmIHRoZWlyIG5vZGUgdHlwZSBuYW1lIGlzIGluIHRoYXRcbmFycmF5LlxuKi9cbmZ1bmN0aW9uIGF1dG9Kb2luKGNvbW1hbmQsIGlzSm9pbmFibGUpIHtcbiAgICBsZXQgY2FuSm9pbiA9IEFycmF5LmlzQXJyYXkoaXNKb2luYWJsZSkgPyAobm9kZSkgPT4gaXNKb2luYWJsZS5pbmRleE9mKG5vZGUudHlwZS5uYW1lKSA+IC0xXG4gICAgICAgIDogaXNKb2luYWJsZTtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4gY29tbWFuZChzdGF0ZSwgZGlzcGF0Y2ggJiYgd3JhcERpc3BhdGNoRm9ySm9pbihkaXNwYXRjaCwgY2FuSm9pbiksIHZpZXcpO1xufVxuLyoqXG5Db21iaW5lIGEgbnVtYmVyIG9mIGNvbW1hbmQgZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHdoaWNoXG5jYWxscyB0aGVtIG9uZSBieSBvbmUgdW50aWwgb25lIHJldHVybnMgdHJ1ZSkuXG4qL1xuZnVuY3Rpb24gY2hhaW5Db21tYW5kcyguLi5jb21tYW5kcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY29tbWFuZHNbaV0oc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG5sZXQgYmFja3NwYWNlID0gY2hhaW5Db21tYW5kcyhkZWxldGVTZWxlY3Rpb24sIGpvaW5CYWNrd2FyZCwgc2VsZWN0Tm9kZUJhY2t3YXJkKTtcbmxldCBkZWwgPSBjaGFpbkNvbW1hbmRzKGRlbGV0ZVNlbGVjdGlvbiwgam9pbkZvcndhcmQsIHNlbGVjdE5vZGVGb3J3YXJkKTtcbi8qKlxuQSBiYXNpYyBrZXltYXAgY29udGFpbmluZyBiaW5kaW5ncyBub3Qgc3BlY2lmaWMgdG8gYW55IHNjaGVtYS5cbkJpbmRzIHRoZSBmb2xsb3dpbmcga2V5cyAod2hlbiBtdWx0aXBsZSBjb21tYW5kcyBhcmUgbGlzdGVkLCB0aGV5XG5hcmUgY2hhaW5lZCB3aXRoIFtgY2hhaW5Db21tYW5kc2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5jaGFpbkNvbW1hbmRzKSk6XG5cbiogKipFbnRlcioqIHRvIGBuZXdsaW5lSW5Db2RlYCwgYGNyZWF0ZVBhcmFncmFwaE5lYXJgLCBgbGlmdEVtcHR5QmxvY2tgLCBgc3BsaXRCbG9ja2BcbiogKipNb2QtRW50ZXIqKiB0byBgZXhpdENvZGVgXG4qICoqQmFja3NwYWNlKiogYW5kICoqTW9kLUJhY2tzcGFjZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkJhY2t3YXJkYCwgYHNlbGVjdE5vZGVCYWNrd2FyZGBcbiogKipEZWxldGUqKiBhbmQgKipNb2QtRGVsZXRlKiogdG8gYGRlbGV0ZVNlbGVjdGlvbmAsIGBqb2luRm9yd2FyZGAsIGBzZWxlY3ROb2RlRm9yd2FyZGBcbiogKipNb2QtRGVsZXRlKiogdG8gYGRlbGV0ZVNlbGVjdGlvbmAsIGBqb2luRm9yd2FyZGAsIGBzZWxlY3ROb2RlRm9yd2FyZGBcbiogKipNb2QtYSoqIHRvIGBzZWxlY3RBbGxgXG4qL1xuY29uc3QgcGNCYXNlS2V5bWFwID0ge1xuICAgIFwiRW50ZXJcIjogY2hhaW5Db21tYW5kcyhuZXdsaW5lSW5Db2RlLCBjcmVhdGVQYXJhZ3JhcGhOZWFyLCBsaWZ0RW1wdHlCbG9jaywgc3BsaXRCbG9jayksXG4gICAgXCJNb2QtRW50ZXJcIjogZXhpdENvZGUsXG4gICAgXCJCYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiTW9kLUJhY2tzcGFjZVwiOiBiYWNrc3BhY2UsXG4gICAgXCJTaGlmdC1CYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiRGVsZXRlXCI6IGRlbCxcbiAgICBcIk1vZC1EZWxldGVcIjogZGVsLFxuICAgIFwiTW9kLWFcIjogc2VsZWN0QWxsXG59O1xuLyoqXG5BIGNvcHkgb2YgYHBjQmFzZUtleW1hcGAgdGhhdCBhbHNvIGJpbmRzICoqQ3RybC1oKiogbGlrZSBCYWNrc3BhY2UsXG4qKkN0cmwtZCoqIGxpa2UgRGVsZXRlLCAqKkFsdC1CYWNrc3BhY2UqKiBsaWtlIEN0cmwtQmFja3NwYWNlLCBhbmRcbioqQ3RybC1BbHQtQmFja3NwYWNlKiosICoqQWx0LURlbGV0ZSoqLCBhbmQgKipBbHQtZCoqIGxpa2VcbkN0cmwtRGVsZXRlLlxuKi9cbmNvbnN0IG1hY0Jhc2VLZXltYXAgPSB7XG4gICAgXCJDdHJsLWhcIjogcGNCYXNlS2V5bWFwW1wiQmFja3NwYWNlXCJdLFxuICAgIFwiQWx0LUJhY2tzcGFjZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtQmFja3NwYWNlXCJdLFxuICAgIFwiQ3RybC1kXCI6IHBjQmFzZUtleW1hcFtcIkRlbGV0ZVwiXSxcbiAgICBcIkN0cmwtQWx0LUJhY2tzcGFjZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtRGVsZXRlXCJdLFxuICAgIFwiQWx0LURlbGV0ZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtRGVsZXRlXCJdLFxuICAgIFwiQWx0LWRcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkN0cmwtYVwiOiBzZWxlY3RUZXh0YmxvY2tTdGFydCxcbiAgICBcIkN0cmwtZVwiOiBzZWxlY3RUZXh0YmxvY2tFbmRcbn07XG5mb3IgKGxldCBrZXkgaW4gcGNCYXNlS2V5bWFwKVxuICAgIG1hY0Jhc2VLZXltYXBba2V5XSA9IHBjQmFzZUtleW1hcFtrZXldO1xuY29uc3QgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gL01hY3xpUChob25lfFtvYV1kKS8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIDogdHlwZW9mIG9zICE9IFwidW5kZWZpbmVkXCIgJiYgb3MucGxhdGZvcm0gPyBvcy5wbGF0Zm9ybSgpID09IFwiZGFyd2luXCIgOiBmYWxzZTtcbi8qKlxuRGVwZW5kaW5nIG9uIHRoZSBkZXRlY3RlZCBwbGF0Zm9ybSwgdGhpcyB3aWxsIGhvbGRcbltgcGNCYXNla2V5bWFwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnBjQmFzZUtleW1hcCkgb3JcbltgbWFjQmFzZUtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5tYWNCYXNlS2V5bWFwKS5cbiovXG5jb25zdCBiYXNlS2V5bWFwID0gbWFjID8gbWFjQmFzZUtleW1hcCA6IHBjQmFzZUtleW1hcDtcblxuZXhwb3J0IHsgYXV0b0pvaW4sIGJhc2VLZXltYXAsIGNoYWluQ29tbWFuZHMsIGNyZWF0ZVBhcmFncmFwaE5lYXIsIGRlbGV0ZVNlbGVjdGlvbiwgZXhpdENvZGUsIGpvaW5CYWNrd2FyZCwgam9pbkRvd24sIGpvaW5Gb3J3YXJkLCBqb2luVGV4dGJsb2NrQmFja3dhcmQsIGpvaW5UZXh0YmxvY2tGb3J3YXJkLCBqb2luVXAsIGxpZnQsIGxpZnRFbXB0eUJsb2NrLCBtYWNCYXNlS2V5bWFwLCBuZXdsaW5lSW5Db2RlLCBwY0Jhc2VLZXltYXAsIHNlbGVjdEFsbCwgc2VsZWN0Tm9kZUJhY2t3YXJkLCBzZWxlY3ROb2RlRm9yd2FyZCwgc2VsZWN0UGFyZW50Tm9kZSwgc2VsZWN0VGV4dGJsb2NrRW5kLCBzZWxlY3RUZXh0YmxvY2tTdGFydCwgc2V0QmxvY2tUeXBlLCBzcGxpdEJsb2NrLCBzcGxpdEJsb2NrQXMsIHNwbGl0QmxvY2tLZWVwTWFya3MsIHRvZ2dsZU1hcmssIHdyYXBJbiB9O1xuIiwiaW1wb3J0IHsgTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGlzdEJsb2NrKFxuICBub2RlOiBOb2RlLFxuICBsaXN0VHlwZXMgPSBbc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0LCBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0XSxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gbGlzdFR5cGVzLmluY2x1ZGVzKG5vZGUudHlwZSk7XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4sIEVkaXRvclN0YXRlLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHtcbiAgbGlmdExpc3RJdGVtLFxuICBzaW5rTGlzdEl0ZW0sXG4gIHdyYXBJbkxpc3QsXG59IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1saXN0JztcbmltcG9ydCB7IE1hcmtUeXBlLCBOb2RlUmFuZ2UsIE5vZGVUeXBlLCBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFJlbW92ZU1hcmtTdGVwIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IHVuZG8sIHJlZG8gfSBmcm9tICdwcm9zZW1pcnJvci1oaXN0b3J5JztcbmltcG9ydCB7IHRvZ2dsZU1hcmsgfSBmcm9tICdwcm9zZW1pcnJvci1jb21tYW5kcyc7XG5pbXBvcnQgeyBBVVRPX0xJTktfQVRUUiwgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgc2VsZWN0UGFyZW50Tm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IENoZWNrYm94U3RhdHVzIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgaXNMaXN0QmxvY2sgfSBmcm9tICcuL3NjaGVtYUhlbHBlcnMnO1xuXG5jb25zdCBBUFBMWV9GT1JNQVRfQVRUUiA9ICdkYXRhLWZvcm1hdCc7XG5cbnR5cGUgQ29tbWFuZCA9IHR5cGVvZiBzZWxlY3RQYXJlbnROb2RlO1xuXG4vKipcbiAqIFN3YXAgdGV4dCBibG9ja3MgdG8gYSBnaXZlbiBub2RlIHR5cGVcbiAqIFRoaXMgaGFuZGxlcyBsaWZ0aW5nIGxpc3QgaXRlbXMgaWYgbmVlZGVkIGJlZm9yZSBjb252ZXJ0aW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzd2FwVGV4dEJsb2NrKHZpZXc6IEVkaXRvclZpZXcsIG5vZGVUeXBlOiBOb2RlVHlwZSk6IHZvaWQge1xuICBsZXQgeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXc7XG4gIGxldCB7IHRyIH0gPSBzdGF0ZTtcbiAgbGV0IHtcbiAgICBzZWxlY3Rpb246IHsgJGZyb20sICR0byB9LFxuICB9ID0gc3RhdGU7XG5cbiAgY29uc3QgbGlzdEJsb2NrUmFuZ2UgPSBnZXRMaXN0QmxvY2tSYW5nZSgkZnJvbSwgJHRvKTtcbiAgaWYgKGNvbnRhaW5zTmVzdGVkTGlzdCgkZnJvbSwgJHRvLCBsaXN0QmxvY2tSYW5nZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzV2l0aGluTmVzdGVkTGlzdCgkZnJvbSwgJHRvLCBsaXN0QmxvY2tSYW5nZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKFxuICAgIG5vZGVUeXBlICE9PSBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QgJiZcbiAgICBub2RlVHlwZSAhPT0gc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdFxuICApIHtcbiAgICBsaWZ0TGlzdEl0ZW0oc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgfVxuXG4gICh7IGRpc3BhdGNoLCBzdGF0ZSB9ID0gdmlldyk7XG4gICh7IHRyIH0gPSBzdGF0ZSk7XG4gIGNvbnN0IHtcbiAgICBzZWxlY3Rpb246IHsgZnJvbSwgdG8gfSxcbiAgfSA9IHN0YXRlO1xuICB0ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIG5vZGVUeXBlKTtcbiAgZGlzcGF0Y2godHIpO1xufVxuXG5leHBvcnQgY29uc3QgaW5kZW50TGlzdFNlbGVjdGlvbjogQ29tbWFuZCA9IGZ1bmN0aW9uIChcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICBkaXNwYXRjaDogRWRpdG9yVmlld1snZGlzcGF0Y2gnXSB8IHVuZGVmaW5lZCxcbikge1xuICByZXR1cm4gKFxuICAgIHNpbmtMaXN0SXRlbShzY2hlbWEubm9kZXMubGlzdF9pdGVtKShzdGF0ZSwgZGlzcGF0Y2gpIHx8XG4gICAgd3JhcEluTGlzdChzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QpKHN0YXRlLCBkaXNwYXRjaClcbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGdldExpc3RCbG9ja1JhbmdlKFxuICAkZnJvbTogUmVzb2x2ZWRQb3MsXG4gICR0bzogUmVzb2x2ZWRQb3MsXG4gIGxpc3RUeXBlcyA9IFtzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3RdLFxuKTogTm9kZVJhbmdlIHwgZmFsc2Uge1xuICBjb25zdCBsaXN0QmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCAobm9kZSkgPT5cbiAgICBpc0xpc3RCbG9jayhub2RlLCBsaXN0VHlwZXMpLFxuICApO1xuICByZXR1cm4gbGlzdEJsb2NrUmFuZ2UgfHwgZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zTmVzdGVkTGlzdChcbiAgJGZyb206IFJlc29sdmVkUG9zLFxuICAkdG86IFJlc29sdmVkUG9zLFxuICBsaXN0QmxvY2tSYW5nZSA9IGdldExpc3RCbG9ja1JhbmdlKCRmcm9tLCAkdG8pLFxuKTogYm9vbGVhbiB7XG4gIGlmICghbGlzdEJsb2NrUmFuZ2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGNvbnRhaW5zTmVzdGVkTGlzdCA9IGZhbHNlO1xuICBjb25zdCB7IGRvYyB9ID0gJGZyb207XG4gIGNvbnN0ICRyYW5nZVN0YXJ0ID0gZG9jLnJlc29sdmUobGlzdEJsb2NrUmFuZ2Uuc3RhcnQpO1xuICBjb25zdCAkcmFuZ2VFbmQgPSBkb2MucmVzb2x2ZShsaXN0QmxvY2tSYW5nZS5lbmQpO1xuICBsaXN0QmxvY2tSYW5nZS5wYXJlbnQubm9kZXNCZXR3ZWVuKFxuICAgICRyYW5nZVN0YXJ0LnBhcmVudE9mZnNldCxcbiAgICAkcmFuZ2VFbmQucGFyZW50T2Zmc2V0LFxuICAgIChub2RlKSA9PiB7XG4gICAgICBpZiAoY29udGFpbnNOZXN0ZWRMaXN0IHx8IG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzTGlzdEJsb2NrKG5vZGUpKSB7XG4gICAgICAgIGNvbnRhaW5zTmVzdGVkTGlzdCA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICApO1xuICByZXR1cm4gY29udGFpbnNOZXN0ZWRMaXN0O1xufVxuXG5mdW5jdGlvbiBpc1dpdGhpbk5lc3RlZExpc3QoXG4gICRmcm9tOiBSZXNvbHZlZFBvcyxcbiAgJHRvOiBSZXNvbHZlZFBvcyxcbiAgbGlzdEJsb2NrUmFuZ2UgPSBnZXRMaXN0QmxvY2tSYW5nZSgkZnJvbSwgJHRvKSxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWxpc3RCbG9ja1JhbmdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSBkZXB0aCBvZiB0aGUgbGlzdCBpdGVtIG5vZGVzIHdpdGhpbiB0aGUgbGlzdEJsb2NrUmFuZ2Ugd2lsbCBiZSAxIGlmXG4gIC8vIHRoZXkgYXJlIGluIGEgdG9wIGxldmVsIGxpc3QuXG4gIHJldHVybiBsaXN0QmxvY2tSYW5nZS5kZXB0aCA+IDE7XG59XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIGNhbiBiZSBvdXRkZW50ZWQgaWY6IE9uZSwgaXQgaXMgd2l0aGluIGEgbGlzdC4gQW5kIHR3byxcbiAqIHRoZSBiZWdpbm5pbmcgKGllLCB0aGUgdG9wKSBvZiB0aGUgc2VsZWN0aW9uIHBvaW50cyBpbnRvIHRoZSBzYW1lIGxpc3QgaXRlbVxuICogYXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgb3V0ZGVudGVkIGJ5IHRoZSBvdXRkZW50IGNvbW1hbmQuIFRoaXMgaXMgaW1wb3J0YW50XG4gKiBiZWNhdXNlIGlmIHRoZSBzZWxlY3Rpb24gaXMgd2l0aGluIGEgc3VibGlzdCBvZiB3aGF0IGdldHMgb3V0ZGVudGVkLCBpdCBmZWVsc1xuICogdW5leHBlY3RlZDsgbGlzdCBpdGVtcyBtYW55IGxldmVscyB1cCBhbmQgYWJvdmUgdGhlIHNlbGVjdGlvbiBjYW4gYmUgY2hhbmdlZFxuICogYXMgYSByZXN1bHQuIENoYW5naW5nIGxpc3QgaXRlbXMgYmVsb3cgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzbid0IGlkZWFsXG4gKiBlaXRoZXIsIGJ1dCBpdCBtYWtlcyBtb3JlIGludHVpdGl2ZSBzZW5zZSB0aGFuIHRoZSBpbnZlcnNlLlxuICpcbiAqIElmIHRoZSBzZWxlY3Rpb24gY2Fubm90IGJlIG91dGRlbnRlZCwgcmV0dXJuIGZhbHNlLiBJZiBpdCBjYW4gYmUgb3V0ZGVudGVkLFxuICogcmV0dXJuIHRoZSBub2RlIHJhbmdlIHRoYXQgc3Vycm91bmRzIHRoZSBzZWxlY3RlZCBsaXN0IGl0ZW1zLlxuICovXG5mdW5jdGlvbiBjYW5PdXRkZW50TGlzdFNlbGVjdGlvbihzdGF0ZTogRWRpdG9yU3RhdGUpOiBOb2RlUmFuZ2UgfCBmYWxzZSB7XG4gIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICBjb25zdCBsaXN0QmxvY2tSYW5nZSA9IGdldExpc3RCbG9ja1JhbmdlKCRmcm9tLCAkdG8pO1xuICBpZiAoIWxpc3RCbG9ja1JhbmdlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgJGZyb20gcG9zaXRpb24gcG9pbnRzIGludG8gYSBzdWJsaXN0IG9yIGlmIGl0c1xuICAvLyBwYXJlbnQgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiB0aGUgbm9kZSByYW5nZS4gQWRkIDIgdG9cbiAgLy8gJGZyb20ucGFyZW50T2Zmc2V0IHRvIGFjY291bnQgZm9yIHRoZSBvcGVuaW5nIHRva2VuIG9mIGJvdGggdGhlIGxpc3QgaXRlbVxuICAvLyBhbmQgdGhlIHBhcmFncmFwaC5cbiAgaWYgKCRmcm9tLnBvcyAhPT0gbGlzdEJsb2NrUmFuZ2Uuc3RhcnQgKyAkZnJvbS5wYXJlbnRPZmZzZXQgKyAyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXN0QmxvY2tSYW5nZTtcbn1cblxuZXhwb3J0IGNvbnN0IG91dGRlbnRMaXN0U2VsZWN0aW9uOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGlmICghY2FuT3V0ZGVudExpc3RTZWxlY3Rpb24oc3RhdGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaWZ0TGlzdEl0ZW0oc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSkoc3RhdGUsIGRpc3BhdGNoKTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHRoZSBsaXN0IHR5cGUgb2YgdGhlIHNlbGVjdGlvbi5cbiAqIC0gSWYgdGhlIHNlbGVjdGlvbiBvdmVybGFwcyB3aXRoIGxpc3Qgbm9kZXMgYW5kIG5vbi1saXN0IG5vZGVzLCBvciBpZiBpdFxuICogICBpbmNsdWRlcyBhbnkgcG9ydGlvbiBvZiBhIG5lc3RlZCBsaXN0LCBkbyBub3RoaW5nXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gaXMgbm90IGEgbGlzdCwgY2hhbmdlIGl0IGludG8gb25lXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gaXMgYSBsaXN0IGJ1dCBub3QgdGhlIGRlc2lyZWQgbGlzdCB0eXBlLCBjaGFuZ2UgaXQgaW50b1xuICogICB0aGUgZGVzaXJlZCBsaXN0IHR5cGVcbiAqIC0gSWYgdGhlIHNlbGVjdGlvbiBpcyB0aGUgcGFzc2VkIGluIGxpc3QgdHlwZSwgY2hhbmdlIGl0IGludG8gYSBwYXJhZ3JhcGhcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUxpc3QgPSBmdW5jdGlvbiAoXG4gIHZpZXc6IEVkaXRvclZpZXcsXG4gIGxpc3RUeXBlOiBOb2RlVHlwZSxcbiAgaXRlbVR5cGU6IE5vZGVUeXBlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBzdGF0ZToge1xuICAgICAgc2VsZWN0aW9uOiB7ICRmcm9tLCAkdG8gfSxcbiAgICB9LFxuICB9ID0gdmlldztcblxuICBjb25zdCBsaXN0QmxvY2tSYW5nZSA9IGdldExpc3RCbG9ja1JhbmdlKCRmcm9tLCAkdG8sIFtsaXN0VHlwZV0pO1xuICBpZiAoY29udGFpbnNOZXN0ZWRMaXN0KCRmcm9tLCAkdG8sIGxpc3RCbG9ja1JhbmdlKSkge1xuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gb3ZlcmxhcHMgd2l0aCBhIG5lc3RlZCBsaXN0LCBkbyBub3RoaW5nLlxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNXaXRoaW5OZXN0ZWRMaXN0KCRmcm9tLCAkdG8sIGxpc3RCbG9ja1JhbmdlKSkge1xuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgd2l0aGluIGEgbmVzdGVkIGxpc3QsIGRvIG5vdGhpbmcuXG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChsaXN0QmxvY2tSYW5nZSkge1xuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gc3BhbnMgZXhjbHVzaXZlbHkgYSBsaXN0IGF0IGRlcHRoIDEgbGlmdCB0aGUgc2VsZWN0ZWRcbiAgICAvLyBpdGVtcyBvdXQgYW5kIGJlIGRvbmUuXG4gICAgbGlmdExpc3RJdGVtKGl0ZW1UeXBlKSh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBvdXRzaWRlIG9mIGEgbGlzdCwgY2hlY2sgaWYgaXQgaXMgcGFydGlhbGx5IGluc2lkZSBhIGxpc3QuXG4gIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG4gIGZvciAoXG4gICAgbGV0IGluZGV4ID0gYmxvY2tSYW5nZS5zdGFydEluZGV4O1xuICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICBpbmRleCArPSAxXG4gICkge1xuICAgIGlmIChpc0xpc3RCbG9jayhibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCksIFtsaXN0VHlwZV0pKSB7XG4gICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIHBhcnRpYWxseSBpbnNpZGUgYSBsaXN0LCBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW50aXJlbHkgb3V0c2lkZSBhIGxpc3QsIGNvbnZlcnQgZXZlcnl0aGluZyB0byBhIHBhcmFncmFwaFxuICAvLyBzbyBpdCBjYW4gc3Vic2VxdWVudGx5IGJlY29tZSBhIGxpc3RcbiAgc3dhcFRleHRCbG9jayh2aWV3LCBzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgd3JhcEluTGlzdChsaXN0VHlwZSkodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCk7XG59O1xuXG5jb25zdCB0b2dnbGVDaGVja2xpc3RJdGVtU3RhdGU6IENvbW1hbmQgPSBmdW5jdGlvbiAoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgZGlzcGF0Y2g6IEVkaXRvclZpZXdbJ2Rpc3BhdGNoJ10gfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG5cbiAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcblxuICBsZXQgaGFzQ2hlY2tlZCA9IGZhbHNlO1xuICBmb3IgKFxuICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleCwgY2hpbGQgPSBibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgIGluZGV4ICs9IDFcbiAgKSB7XG4gICAgaWYgKGNoaWxkLnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQuYXR0cnMuc3RhdHVzID09PSBDaGVja2JveFN0YXR1cy5ET05FKSB7XG4gICAgICBoYXNDaGVja2VkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuICBmb3IgKFxuICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleCxcbiAgICAgIGNoaWxkID0gYmxvY2tSYW5nZS5wYXJlbnQuY2hpbGQoaW5kZXgpLFxuICAgICAgcG9zID0gYmxvY2tSYW5nZS5zdGFydDtcbiAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgaW5kZXggKz0gMVxuICApIHtcbiAgICB0ci5zZXROb2RlTWFya3VwKHBvcywgdW5kZWZpbmVkLCB7XG4gICAgICBzdGF0dXM6IGhhc0NoZWNrZWQgPyBDaGVja2JveFN0YXR1cy5FTVBUWSA6IENoZWNrYm94U3RhdHVzLkRPTkUsXG4gICAgfSk7XG4gICAgcG9zICs9IGNoaWxkLm5vZGVTaXplO1xuICB9XG5cbiAgZGlzcGF0Y2godHIpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnR5cGUgbW9kYWxDb25maXJtSGFuZGxlciA9IChwYXJhbXM6IHsgdGV4dDogc3RyaW5nOyB1cmw6IHN0cmluZyB9KSA9PiB2b2lkO1xuXG5jbGFzcyBMaW5rTW9kYWwge1xuICBwcml2YXRlIGVsOiBFbGVtZW50O1xuICBwcml2YXRlIGZyYW1lRWw6IEVsZW1lbnQ7XG4gIHByaXZhdGUgdGV4dDogc3RyaW5nO1xuICBwcml2YXRlIHVybDogc3RyaW5nO1xuICBwcml2YXRlIG9uQ29uZmlybTogbW9kYWxDb25maXJtSGFuZGxlcjtcbiAgcHJpdmF0ZSBvbkNsZWFyPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzaG93Q2xzID0gJ2FjdGl2ZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWw6IEVsZW1lbnQsXG4gICAge1xuICAgICAgb25Db25maXJtLFxuICAgICAgb25DbGVhcixcbiAgICAgIHRleHQsXG4gICAgICB1cmwsXG4gICAgfToge1xuICAgICAgb25DbGVhcj86ICgpID0+IHZvaWQ7XG4gICAgICBvbkNvbmZpcm06IG1vZGFsQ29uZmlybUhhbmRsZXI7XG4gICAgICB0ZXh0OiBzdHJpbmc7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICB9LFxuICApIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy50ZXh0SW5wdXQudmFsdWUgPSB0aGlzLnRleHQgPSB0ZXh0O1xuICAgIHRoaXMudXJsSW5wdXQudmFsdWUgPSB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLm9uQ29uZmlybSA9IG9uQ29uZmlybTtcbiAgICB0aGlzLm9uQ2xlYXIgPSBvbkNsZWFyO1xuICAgIHRoaXMuZnJhbWVFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJyNmcmFtZScpO1xuXG4gICAgaWYgKG9uQ2xlYXIpIHtcbiAgICAgIHRoaXMuY2xlYXJCdG4uY2xhc3NMaXN0LmFkZCh0aGlzLnNob3dDbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyQnRuLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5zaG93Q2xzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQodGhpcy5zaG93Q2xzKTtcbiAgICB0aGlzLmNvbmZpcm1CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNvbmZpcm0pO1xuICAgIHRoaXMuY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYW5jZWwpO1xuICAgIHRoaXMuY2xlYXJCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsZWFyKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVHbG9iYWxLZXlkb3duKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlR2xvYmFsQ2xpY2spO1xuICAgIHRoaXMudXJsSW5wdXQuZm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95ID0gKCkgPT4ge1xuICAgIHRoaXMuY29uZmlybUJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ29uZmlybSk7XG4gICAgdGhpcy5jYW5jZWxCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhbmNlbCk7XG4gICAgdGhpcy5jbGVhckJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xlYXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUdsb2JhbEtleWRvd24pO1xuICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNob3dDbHMpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ29uZmlybSA9ICgpID0+IHtcbiAgICB0aGlzLm9uQ29uZmlybSh7XG4gICAgICB0ZXh0OiB0aGlzLnRleHRJbnB1dC52YWx1ZSxcbiAgICAgIHVybDogdGhpcy51cmxJbnB1dC52YWx1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2xlYXIgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkNsZWFyKCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVHbG9iYWxLZXlkb3duID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc0VudGVyID0gZS5rZXkgPT09ICdFbnRlcic7XG4gICAgaWYgKFxuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50ZXh0SW5wdXQgfHxcbiAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnVybElucHV0ICYmIGlzRW50ZXIpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbmZpcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNFc2MgPSBlLmtleSA9PT0gJ0VzY2FwZSc7XG4gICAgaWYgKGlzRXNjKSB7XG4gICAgICB0aGlzLmhhbmRsZUNhbmNlbCgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUdsb2JhbENsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5mcmFtZUVsLmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfTtcblxuICBnZXQgdGV4dElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0I3RleHQnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgZ2V0IHVybElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0I3VybCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBnZXQgY29uZmlybUJ0bigpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdidXR0b24jY29uZmlybScpO1xuICB9XG5cbiAgZ2V0IGNhbmNlbEJ0bigpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdidXR0b24jY2FuY2VsJyk7XG4gIH1cblxuICBnZXQgY2xlYXJCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignYnV0dG9uI2NsZWFyJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRvb2xiYXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHZpZXc6IEVkaXRvclZpZXc7XG4gIHByaXZhdGUgbW9kYWxFbDogRWxlbWVudDtcbiAgcHJpdmF0ZSB0b29sYmFyRWw6IEVsZW1lbnQ7XG4gIHByaXZhdGUgbW9kYWw6IExpbmtNb2RhbDtcblxuICBwcml2YXRlIHN3YXBUZXh0QmxvY2sgPSAobm9kZVR5cGU6IE5vZGVUeXBlKSA9PiB7XG4gICAgc3dhcFRleHRCbG9jayh0aGlzLnZpZXcsIG5vZGVUeXBlKTtcbiAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgfTtcblxuICBwcml2YXRlIHByb21vdGVIZWFkaW5nID0gKHN0YXRlOiBFZGl0b3JTdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvbiB9ID0gc3RhdGU7XG4gICAgaWYgKCFzZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgJGZyb206IHtcbiAgICAgICAgcGFyZW50OiB7IHR5cGUgfSxcbiAgICAgIH0sXG4gICAgfSA9IHNlbGVjdGlvbjtcbiAgICBsZXQgbmV4dFR5cGU6IE5vZGVUeXBlO1xuICAgIGlmICh0eXBlID09PSBzY2hlbWEubm9kZXMuaGVhZGluZzIpIHtcbiAgICAgIG5leHRUeXBlID0gc2NoZW1hLm5vZGVzLmhlYWRpbmcxO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gc2NoZW1hLm5vZGVzLmhlYWRpbmczKSB7XG4gICAgICBuZXh0VHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMSkge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMucGFyYWdyYXBoO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0VHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMztcbiAgICB9XG4gICAgdGhpcy5zd2FwVGV4dEJsb2NrKG5leHRUeXBlKTtcbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZUxpc3QgPSAobGlzdFR5cGU6IE5vZGVUeXBlLCBpdGVtVHlwZTogTm9kZVR5cGUpID0+IHtcbiAgICB0b2dnbGVMaXN0KHRoaXMudmlldywgbGlzdFR5cGUsIGl0ZW1UeXBlKTtcbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZUNoZWNrbGlzdEl0ZW0gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGluZGV4ID0gYmxvY2tSYW5nZS5zdGFydEluZGV4O1xuICAgICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgICAgaW5kZXggKz0gMVxuICAgICkge1xuICAgICAgaWYgKGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KS50eXBlID09PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pIHtcbiAgICAgICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pO1xuICB9O1xuXG4gIHByaXZhdGUgYWN0aXZhdGVMaW5rTW9kYWw6IENvbW1hbmQgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgY29uc3QgeyBkb2MsIHNlbGVjdGlvbiB9ID0gc3RhdGU7XG4gICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzZWxlY3Rpb247XG4gICAgY29uc3QgbGlua01hcmtBdFN0YXJ0ID0gJGZyb21cbiAgICAgIC5tYXJrcygpXG4gICAgICAuZmluZChcbiAgICAgICAgKG1hcmspID0+XG4gICAgICAgICAgbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayAmJiAhbWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0sXG4gICAgICApO1xuICAgIGNvbnN0IGxpbmtNYXJrQXRFbmQgPSAkdG9cbiAgICAgIC5tYXJrcygpXG4gICAgICAuZmluZChcbiAgICAgICAgKG1hcmspID0+XG4gICAgICAgICAgbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayAmJiAhbWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0sXG4gICAgICApO1xuICAgIGNvbnN0IHNlbGVjdGlvbklzSW5zaWRlTGluayA9IGxpbmtNYXJrQXRTdGFydCAmJiBsaW5rTWFya0F0RW5kO1xuXG4gICAgaWYgKHNlbGVjdGlvbi5lbXB0eSAmJiAhc2VsZWN0aW9uSXNJbnNpZGVMaW5rKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChsaW5rTWFya0F0U3RhcnQgIT09IGxpbmtNYXJrQXRFbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFkaXNwYXRjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFyayA9IGxpbmtNYXJrQXRTdGFydDtcbiAgICBsZXQgZW5kLCBzdGFydCwgdGV4dCwgdXJsO1xuICAgIGlmIChtYXJrKSB7XG4gICAgICBjb25zdCB0ZXh0Tm9kZSA9ICRmcm9tLnBhcmVudC5ub2RlQXQoXG4gICAgICAgICRmcm9tLnBhcmVudE9mZnNldCAtICRmcm9tLnRleHRPZmZzZXQsXG4gICAgICApO1xuICAgICAgc3RhcnQgPSAkZnJvbS5wb3MgLSAkZnJvbS50ZXh0T2Zmc2V0O1xuICAgICAgZW5kID0gc3RhcnQgKyB0ZXh0Tm9kZS5ub2RlU2l6ZTtcbiAgICAgIHRleHQgPSB0ZXh0Tm9kZS50ZXh0O1xuICAgICAgdXJsID0gbWFyay5hdHRycy5ocmVmO1xuICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oXG4gICAgICAgIGRvYy5yZXNvbHZlKHN0YXJ0KSxcbiAgICAgICAgZG9jLnJlc29sdmUoZW5kKSxcbiAgICAgICk7XG4gICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuZCA9ICR0by5wb3M7XG4gICAgICBzdGFydCA9ICRmcm9tLnBvcztcbiAgICAgIHRleHQgPSBzdGF0ZS5kb2MudGV4dEJldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zKTtcbiAgICAgIHVybCA9ICcnO1xuICAgIH1cblxuICAgIGNvbnN0IG9uQ2xlYXIgPVxuICAgICAgbWFyayAmJlxuICAgICAgKCgpID0+XG4gICAgICAgIHRoaXMudmlldy5kaXNwYXRjaChcbiAgICAgICAgICB0aGlzLnZpZXcuc3RhdGUudHIuc3RlcChuZXcgUmVtb3ZlTWFya1N0ZXAoc3RhcnQsIGVuZCwgbWFyaykpLFxuICAgICAgICApKTtcblxuICAgIHRoaXMubW9kYWwgPSBuZXcgTGlua01vZGFsKHRoaXMubW9kYWxFbCwge1xuICAgICAgb25DbGVhcixcbiAgICAgIG9uQ29uZmlybTogKHsgdGV4dCwgdXJsIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWFyayA9IHNjaGVtYS5tYXJrcy5saW5rLmNyZWF0ZSh7IGhyZWY6IHVybCB9KTtcbiAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBzY2hlbWEudGV4dCh0ZXh0LCBbbWFya10pO1xuICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goXG4gICAgICAgICAgdGhpcy52aWV3LnN0YXRlLnRyLnJlcGxhY2VTZWxlY3Rpb25XaXRoKHRleHROb2RlLCBmYWxzZSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgdGV4dCxcbiAgICAgIHVybCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHByaXZhdGUgdG9nZ2xlTWFyayA9IChtYXJrOiBNYXJrVHlwZSkgPT4ge1xuICAgIHRvZ2dsZU1hcmsobWFyaykodGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgIHRoaXMudmlldy5mb2N1cygpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHRvb2xiYXJFbDogRWxlbWVudCwgbW9kYWxFbDogRWxlbWVudCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZpZXc6ICh2aWV3SW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlld0luc3RhbmNlO1xuICAgICAgICB0aGlzLm1vZGFsRWwgPSBtb2RhbEVsO1xuICAgICAgICB0aGlzLnRvb2xiYXJFbCA9IHRvb2xiYXJFbDtcblxuICAgICAgICB0b29sYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZVRvb2xiYXJDbGljayk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICB0b29sYmFyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZVRvb2xiYXJDbGljayk7XG4gICAgICAgICAgICB0aGlzLnVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycygpO1xuICAgICAgICAgICAgdGhpcy5tb2RhbD8uZGVzdHJveSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlOiAodmlldywgX3ByZXZpb3VzU3RhdGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVG9vbGJhckZvclNlbGVjdGlvbih2aWV3LnN0YXRlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGhhbmRsZUtleURvd246IChfdmlldywgZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhc0N0cmwgPSBlLmN0cmxLZXk7XG4gICAgICAgICAgY29uc3QgaGFzTW9kID0gZS5tZXRhS2V5O1xuICAgICAgICAgIGNvbnN0IGhhc1NoaWZ0ID0gZS5zaGlmdEtleTtcblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAnLicpIHtcbiAgICAgICAgICAgIGluZGVudExpc3RTZWxlY3Rpb24odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAnLCcpIHtcbiAgICAgICAgICAgIG91dGRlbnRMaXN0U2VsZWN0aW9uKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdUYWInICYmICFoYXNDdHJsICYmICFoYXNNb2QpIHtcbiAgICAgICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgICBvdXRkZW50TGlzdFNlbGVjdGlvbih0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpbmRlbnRMaXN0U2VsZWN0aW9uKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ3QnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUNoZWNrbGlzdEl0ZW0oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICc3Jykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0KFxuICAgICAgICAgICAgICBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICd1Jykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0KFxuICAgICAgICAgICAgICBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICdvJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0KHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICc9Jykge1xuICAgICAgICAgICAgdGhpcy5wcm9tb3RlSGVhZGluZyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ2onKSB7XG4gICAgICAgICAgICB0aGlzLnN3YXBUZXh0QmxvY2soc2NoZW1hLm5vZGVzLnBhcmFncmFwaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2dnbGVDaGVja2xpc3RJdGVtU3RhdGUoXG4gICAgICAgICAgICAgIHRoaXMudmlldy5zdGF0ZSxcbiAgICAgICAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAneicpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRvKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAneScpIHtcbiAgICAgICAgICAgIHJldHVybiByZWRvKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAnaScpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFyayhzY2hlbWEubWFya3MuZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc01vZCAmJiBlLmtleSA9PT0gJ2InKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzLnN0cm9uZyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFyayhzY2hlbWEubWFya3MuY29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAnaycpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVMaW5rTW9kYWwodGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVRvb2xiYXJGb3JTZWxlY3Rpb24gPSAoc3RhdGU6IEVkaXRvclN0YXRlKSA9PiB7XG4gICAgdGhpcy51bmhpZ2hsaWdodFNlbGVjdGVkQXR0cnMoKTtcbiAgICBjb25zdCBzZWxlY3RlZEF0dHJzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEF0dHJzKHN0YXRlKTtcbiAgICBpZiAoc2VsZWN0ZWRBdHRycykge1xuICAgICAgc2VsZWN0ZWRBdHRycy5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ0biA9IHRoaXMudG9vbGJhckVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWZvcm1hdD0ke2F0dHJ9XWApO1xuICAgICAgICBpZiAoYnRuKSB7XG4gICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB1bmhpZ2hsaWdodFNlbGVjdGVkQXR0cnMgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRCdG5zID0gdGhpcy50b29sYmFyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNlbGVjdGVkJyk7XG4gICAgc2VsZWN0ZWRCdG5zLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gICAgfSk7XG4gIH07XG4gIGdldFNlbGVjdGVkRm9ybWF0QW5kTWFya3MgPSAoc3RhdGU6IEVkaXRvclN0YXRlKSA9PiB7XG4gICAgaWYgKCFzdGF0ZS5zZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKFxuICAgICAgJHRvLFxuICAgICAgKG5vZGUpID0+IG5vZGUudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICApO1xuXG4gICAgbGV0IHNlbGVjdGVkID0gbnVsbDtcbiAgICBmb3IgKFxuICAgICAgbGV0IGluZGV4ID0gYmxvY2tSYW5nZS5zdGFydEluZGV4O1xuICAgICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgICAgaW5kZXggKz0gMVxuICAgICkge1xuICAgICAgY29uc3QgY2hpbGQgPSBibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgICBjb25zdCBjdXJyZW50VHlwZSA9XG4gICAgICAgIGNoaWxkLnR5cGUgPT09IHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW1cbiAgICAgICAgICA/IGJsb2NrUmFuZ2UucGFyZW50LnR5cGVcbiAgICAgICAgICA6IGNoaWxkLnR5cGU7XG5cbiAgICAgIGlmIChzZWxlY3RlZCA9PT0gbnVsbCkge1xuICAgICAgICBzZWxlY3RlZCA9IGN1cnJlbnRUeXBlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxlY3RlZCAhPT0gY3VycmVudFR5cGUpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnB1c2goc2VsZWN0ZWQpO1xuXG4gICAgbGV0IG1hcmtzID0gJGZyb20ucG9zID09PSAkdG8ucG9zID8gJGZyb20ubWFya3MoKSA6ICRmcm9tLm1hcmtzQWNyb3NzKCR0byk7XG4gICAgaWYgKHN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiBzdGF0ZS5zdG9yZWRNYXJrcykge1xuICAgICAgbWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcztcbiAgICB9XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLm1hcmtzLm1hcCgobWFyaykgPT4gbWFyay50eXBlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBnZXRTZWxlY3RlZEZvcm1hdEF0dHJzID0gKHN0YXRlOiBFZGl0b3JTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IFtub2RlVHlwZSwgLi4ubWFya1R5cGVzXSA9IHRoaXMuZ2V0U2VsZWN0ZWRGb3JtYXRBbmRNYXJrcyhzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5oZWFkaW5nMTpcbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLmhlYWRpbmcyOlxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuaGVhZGluZzM6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2hlYWRpbmcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGg6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ3BhcmFncmFwaCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0OiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCd1bm9yZGVyZWRfbGlzdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdDoge1xuICAgICAgICByZXN1bHQucHVzaCgnb3JkZXJlZF9saXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW06IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2NoZWNrbGlzdF9pdGVtJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya1R5cGVzLmZvckVhY2goKG1hcmtUeXBlKSA9PiB7XG4gICAgICBzd2l0Y2ggKG1hcmtUeXBlKSB7XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmxpbms6IHtcbiAgICAgICAgICByZXN1bHQucHVzaCgnbGluaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmlubGluZV9saW5rOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2xpbmsnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5lbToge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdlbScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLnN0cm9uZzoge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdzdHJvbmcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5jb2RlOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2NvZGUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBoYW5kbGVUb29sYmFyQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KGBbJHtBUFBMWV9GT1JNQVRfQVRUUn1dYCk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXQoYnV0dG9uLmdldEF0dHJpYnV0ZShBUFBMWV9GT1JNQVRfQVRUUikpO1xuICAgIH1cbiAgfTtcblxuICBhcHBseUZvcm1hdCA9IChkYXRhRm9ybWF0U3RyOiBzdHJpbmcpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGFGb3JtYXRTdHIpIHtcbiAgICAgIGNhc2UgJ3VuZG8nOiB7XG4gICAgICAgIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlZG8nOiB7XG4gICAgICAgIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvZGVfYmxvY2snOiB7XG4gICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMuY29kZV9ibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGluZyc6IHtcbiAgICAgICAgdGhpcy5wcm9tb3RlSGVhZGluZyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5vcmRlcmVkX2xpc3QnOiB7XG4gICAgICAgIHRoaXMudG9nZ2xlTGlzdChzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29yZGVyZWRfbGlzdCc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVMaXN0KHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NoZWNrbGlzdF9pdGVtJzoge1xuICAgICAgICB0aGlzLnRvZ2dsZUNoZWNrbGlzdEl0ZW0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJvbmcnOlxuICAgICAgY2FzZSAnZW0nOlxuICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1tkYXRhRm9ybWF0U3RyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5kZW50Jzoge1xuICAgICAgICBpbmRlbnRMaXN0U2VsZWN0aW9uKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdvdXRkZW50Jzoge1xuICAgICAgICBvdXRkZW50TGlzdFNlbGVjdGlvbih0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRQb3MgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQge1xuICBQbHVnaW4sXG4gIEVkaXRvclN0YXRlLFxuICBTZWxlY3Rpb24sXG4gIFRleHRTZWxlY3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBBVVRPX0xJTktfQVRUUiwgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5jb25zdCBTSE9XX0NMUyA9ICdzaG93JztcblxuY29uc3QgSFRUUF9MSU5LID0gbmV3IFJlZ0V4cCgnXmh0dHBzPzovLycpO1xuXG5jb25zdCBNQUlMVE9fTElOSyA9IG5ldyBSZWdFeHAoJ15tYWlsdG86Jyk7XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSB0b29sdGlwRWw6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIHZpZXc6IEVkaXRvclZpZXc7XG5cbiAgc3RhdGljIG5vZGVUb0FuY2hvckhyZWYodXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoSFRUUF9MSU5LLnRlc3QodXJsKSB8fCBNQUlMVE9fTElOSy50ZXN0KHVybCkpIHtcbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIHJldHVybiBgaHR0cDovLyR7dXJsfWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihlbDogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2aWV3OiAodmlld0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXdJbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZTogKHZpZXcsIHByZXZpb3VzU3RhdGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTZWxlY3Rpb24oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudG9vbHRpcEVsID0gZWw7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU2VsZWN0aW9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHJldHVybjtcbiAgICBjb25zdCB7ICRjdXJzb3IgfSA9IHNlbGVjdGlvbjtcblxuICAgIGNvbnN0IHdpdGhpbkxpbmsgPSBCb29sZWFuKFxuICAgICAgJGN1cnNvciAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVCZWZvcmUgJiZcbiAgICAgICAgJGN1cnNvci5ub2RlQWZ0ZXIgJiZcbiAgICAgICAgJGN1cnNvci5ub2RlQmVmb3JlLm1hcmtzLnNvbWUoXG4gICAgICAgICAgKG1hcmspID0+IG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgICAgICkgJiZcbiAgICAgICAgJGN1cnNvci5ub2RlQWZ0ZXIubWFya3Muc29tZSgobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayksXG4gICAgKTtcblxuICAgIGlmICh3aXRoaW5MaW5rID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWFyayA9ICRjdXJzb3Iubm9kZUJlZm9yZS5tYXJrcy5maW5kKFxuICAgICAgKG1hcmspID0+IG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgKTtcblxuICAgIHRoaXMuc2hvdygkY3Vyc29yLCBtYXJrLmF0dHJzLmhyZWYsIG1hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdKTtcbiAgfTtcblxuICBwcml2YXRlIGhpZGUgPSAoKSA9PiB7XG4gICAgdGhpcy50b29sdGlwRWwuY2xhc3NMaXN0LnJlbW92ZShTSE9XX0NMUyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBzaG93ID0gKCRwb3M6IFJlc29sdmVkUG9zLCB1cmw6IHN0cmluZywgaXNBdXRvTGluazogYm9vbGVhbikgPT4ge1xuICAgIHRoaXMubGlua1RleHRFbC5pbm5lclRleHQgPSB1cmw7XG4gICAgdGhpcy5hbmNob3JFbC5ocmVmID0gVG9vbHRpcFBsdWdpbi5ub2RlVG9BbmNob3JIcmVmKHVybCk7XG4gICAgdGhpcy50b29sdGlwRWwuY2xhc3NMaXN0LnRvZ2dsZSgneWVzLWF1dG8tbGluaycsIGlzQXV0b0xpbmspO1xuICAgIHRoaXMudG9vbHRpcEVsLmNsYXNzTGlzdC5hZGQoU0hPV19DTFMpO1xuXG4gICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IHRoaXMudmlldy5jb29yZHNBdFBvcygkcG9zLnBvcyk7XG4gICAgY29uc3QgYWN0dWFsV2lkdGggPSB0aGlzLnRvb2x0aXBFbC5vZmZzZXRXaWR0aDtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAvLyB0b29sdGlwIG1heC13aWR0aCBpcyAxMDAlIC0gMTAsIGZvciA1cHggb2Ygc3BhY2UgZnJvbSBlYWNoIHdpbmRvdyBlZGdlXG4gICAgaWYgKGxlZnQgKyBhY3R1YWxXaWR0aCA+IGF2YWlsYWJsZVdpZHRoKSB7XG4gICAgICB0aGlzLnRvb2x0aXBFbC5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5tYXgoNSwgbGVmdCAtIGFjdHVhbFdpZHRoKX1weGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCg1LCBsZWZ0KX1weGA7XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbGVkID0gKHRoaXMudmlldy5yb290IGFzIERvY3VtZW50KS5ib2R5O1xuICAgIC8vIFB1bGwgdG9wIHVwIGJ5IHByZXN1bWVkIGhlaWdodCBvZiB0b29sdGlwIHBsdXMgc29tZSBtYXJnaW5cbiAgICB0aGlzLnRvb2x0aXBFbC5zdHlsZS50b3AgPSBgJHt0b3AgLSAzNiArIHNjcm9sbGVkLnNjcm9sbFRvcH1weGA7XG4gIH07XG5cbiAgZ2V0IGxpbmtUZXh0RWwoKTogSFRNTFNwYW5FbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwRWwucXVlcnlTZWxlY3RvcignZGl2LnRleHQnKTtcbiAgfVxuXG4gIGdldCBhbmNob3JFbCgpOiBIVE1MQW5jaG9yRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMudG9vbHRpcEVsLnF1ZXJ5U2VsZWN0b3IoJ2EubGluay1hbmNob3InKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGx1Z2luLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JFeHRlbmRlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSBlbDogSFRNTERpdkVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoZXh0ZW5kZXJFbDogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2aWV3OiAodmlld0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXdJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5lbCA9IGV4dGVuZGVyRWw7XG5cbiAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2sgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHsgZG9jLCB0ciB9ID0gc3RhdGU7XG4gICAgY29uc3QgbGFzdFBvcyA9IGRvYy5ub2RlU2l6ZSAtIDI7XG4gICAgY29uc3QgbGFzdE5vZGVUeXBlID0gc3RhdGUuZG9jLmxhc3RDaGlsZC50eXBlO1xuICAgIGlmIChsYXN0Tm9kZVR5cGUgPT09IHNjaGVtYS5ub2Rlcy5jb2RlX2Jsb2NrIHx8IGxhc3ROb2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgIHRyLmluc2VydChsYXN0UG9zLCBzY2hlbWEubm9kZXMucGFyYWdyYXBoLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgfVxuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24uYXRFbmQodHIuZG9jKSk7XG4gICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgfTtcbn1cbiIsImNvbnN0IHJhbmRvbVVVSUQgPSB0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCAmJiBjcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGNyeXB0byk7XG5leHBvcnQgZGVmYXVsdCB7IHJhbmRvbVVVSUQgfTtcbiIsImxldCBnZXRSYW5kb21WYWx1ZXM7XG5jb25zdCBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJuZygpIHtcbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICBpZiAodHlwZW9mIGNyeXB0byA9PT0gJ3VuZGVmaW5lZCcgfHwgIWNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBnZXRSYW5kb21WYWx1ZXMgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcbiAgICB9XG4gICAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59XG4iLCJpbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5jb25zdCBieXRlVG9IZXggPSBbXTtcbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc2xpY2UoMSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCA9IDApIHtcbiAgICByZXR1cm4gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArXG4gICAgICAgICctJyArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gK1xuICAgICAgICAnLScgK1xuICAgICAgICBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArXG4gICAgICAgIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICtcbiAgICAgICAgJy0nICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICtcbiAgICAgICAgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAgIGNvbnN0IHV1aWQgPSB1bnNhZmVTdHJpbmdpZnkoYXJyLCBvZmZzZXQpO1xuICAgIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWQ7XG59XG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7XG4iLCJpbXBvcnQgbmF0aXZlIGZyb20gJy4vbmF0aXZlLmpzJztcbmltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHsgdW5zYWZlU3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAobmF0aXZlLnJhbmRvbVVVSUQgJiYgIWJ1ZiAmJiAhb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmF0aXZlLnJhbmRvbVVVSUQoKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgcm5kcyA9IG9wdGlvbnMucmFuZG9tID8/IG9wdGlvbnMucm5nPy4oKSA/PyBybmcoKTtcbiAgICBpZiAocm5kcy5sZW5ndGggPCAxNikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhbmRvbSBieXRlcyBsZW5ndGggbXVzdCBiZSA+PSAxNicpO1xuICAgIH1cbiAgICBybmRzWzZdID0gKHJuZHNbNl0gJiAweDBmKSB8IDB4NDA7XG4gICAgcm5kc1s4XSA9IChybmRzWzhdICYgMHgzZikgfCAweDgwO1xuICAgIGlmIChidWYpIHtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIDE2ID4gYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFVVSUQgYnl0ZSByYW5nZSAke29mZnNldH06JHtvZmZzZXQgKyAxNX0gaXMgb3V0IG9mIGJ1ZmZlciBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgcmV0dXJuIHVuc2FmZVN0cmluZ2lmeShybmRzKTtcbn1cbmV4cG9ydCBkZWZhdWx0IHY0O1xuIiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICdAc3RhbmRhcmRub3Rlcy9jb21wb25lbnQtcmVsYXknO1xuaW1wb3J0IHsgbWFya2Rvd25QYXJzZXIgfSBmcm9tICcuL21hcmtkb3duJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcblxuY29uc3QgU05fSVRFTV9TQVZFX0tFWSA9ICdjb20uZHlsYW5vbmVsc29uLnNuLWVkaXRvcic7XG5cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZWRDb250ZW50KGl0ZW06IEl0ZW0pIHtcbiAgY29uc3QgcmVzdWx0ID0gaXRlbSAmJiBpdGVtLmNvbnRlbnQgJiYgaXRlbS5jb250ZW50W1NOX0lURU1fU0FWRV9LRVldO1xuICByZXR1cm4gcmVzdWx0IHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFV1aWQoaXRlbTogSXRlbSkge1xuICBpZiAoaXRlbSkge1xuICAgIHJldHVybiBpdGVtLnV1aWQ7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFRleHQoaXRlbTogSXRlbSkge1xuICByZXR1cm4gaXRlbSAmJiBpdGVtLmNvbnRlbnQgJiYgaXRlbS5jb250ZW50LnRleHQgPyBpdGVtLmNvbnRlbnQudGV4dCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldERvYyhpdGVtOiBJdGVtKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBnZXROYW1lc3BhY2VkQ29udGVudChpdGVtKTtcbiAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5kb2MpIHtcbiAgICByZXR1cm4gY29udGVudC5kb2M7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldExhc3RTYXZlZEJ5KGl0ZW06IEl0ZW0pIHtcbiAgY29uc3QgY29udGVudCA9IGdldE5hbWVzcGFjZWRDb250ZW50KGl0ZW0pO1xuICBpZiAoY29udGVudCAmJiBjb250ZW50Lmxhc3RTYXZlZEJ5KSB7XG4gICAgcmV0dXJuIGNvbnRlbnQubGFzdFNhdmVkQnk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNsYXNzIENsaWVudCB7XG4gIHN0YXRpYyBTTl9JVEVNX1NBVkVfS0VZID0gJ2NvbS5keWxhbm9uZWxzb24uc24tZWRpdG9yJztcblxuICBwcml2YXRlIHN0YXRpYyBpdGVtU2VsZWN0b3JzID0ge307XG5cbiAgcHJpdmF0ZSBfaXRlbTogSXRlbSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfcmVhZHk6IFByb21pc2U8dm9pZD47XG5cbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcblxuICBwcml2YXRlIF9saXN0ZW5lcnM6ICgoe30pID0+IHZvaWQpW107XG5cbiAgcHJpdmF0ZSBjb21wb25lbnRNYW5hZ2VyOiBDb21wb25lbnRNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2lkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG5cbiAgICBsZXQgcmVzb2x2ZUNsaWVudFJlYWR5O1xuICAgIHRoaXMuX3JlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHJlc29sdmVDbGllbnRSZWFkeSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbXBvbmVudE1hbmFnZXIgPSBuZXcgQ29tcG9uZW50TWFuYWdlcih7XG4gICAgICB0YXJnZXRXaW5kb3c6IHdpbmRvdyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZGVidWc6IHRydWUsXG4gICAgICAgIGFjY2VwdHNUaGVtZXM6IHRydWUsXG4gICAgICB9LFxuICAgICAgb25SZWFkeTogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudE1hbmFnZXIuc3RyZWFtQ29udGV4dEl0ZW0oKGl0ZW06IEl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdzdHJlYW1Db250ZXh0SXRlbSB1cGRhdGU6JywgaXRlbSk7XG5cbiAgICAgICAgICBjb25zdCBjYWxsTGlzdGVuZXJzID0gdGhpcy5zaG91bGRDYWxsTGlzdGVuZXJzKGl0ZW0sIHRoaXMuX2l0ZW0pO1xuXG4gICAgICAgICAgdGhpcy5faXRlbSA9IGl0ZW07XG5cbiAgICAgICAgICBpZiAoY2FsbExpc3RlbmVycykge1xuICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxpc3RlbmVyKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZUNsaWVudFJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsYXRlc3REb2MoKSB7XG4gICAgcmV0dXJuIGdldERvYyh0aGlzLl9pdGVtKTtcbiAgfVxuXG4gIGdldCBsYXRlc3RUZXh0KCkge1xuICAgIHJldHVybiBnZXRUZXh0KHRoaXMuX2l0ZW0pO1xuICB9XG5cbiAgb25VcGRhdGUoY2FsbGJhY2s6ICh7fSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmZpbHRlcihcbiAgICAgICAgKGxpc3RlbmVyKSA9PiBsaXN0ZW5lciAhPT0gY2FsbGJhY2ssXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICByZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHk7XG4gIH1cblxuICBzYXZlTm90ZShqc29uRG9jOiB7fSwgbWREb2M6IHN0cmluZywgdGV4dFByZXZpZXc6IHN0cmluZykge1xuICAgIGNvbnN0IHRvU2F2ZSA9IHtcbiAgICAgIC4uLnRoaXMuX2l0ZW0sXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIC4uLnRoaXMuX2l0ZW0uY29udGVudCxcbiAgICAgICAgW1NOX0lURU1fU0FWRV9LRVldOiB7XG4gICAgICAgICAgZG9jOiBqc29uRG9jLFxuICAgICAgICAgIGxhc3RTYXZlZEJ5OiB0aGlzLl9pZCxcbiAgICAgICAgfSxcbiAgICAgICAgdGV4dDogbWREb2MsXG4gICAgICAgIHByZXZpZXdfcGxhaW46IHRleHRQcmV2aWV3LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuY29tcG9uZW50TWFuYWdlci5zYXZlSXRlbVdpdGhQcmVzYXZlKFxuICAgICAgdG9TYXZlLFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBQcmVzYXZlIGNhbGxiYWNrXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBTYXZlIGNvbXBsZXRlIGNhbGxiYWNrXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBzaG91bGRDYWxsTGlzdGVuZXJzID0gKG5leHRJdGVtLCBwcmV2aW91c0l0ZW0pID0+IHtcbiAgICBpZiAobmV4dEl0ZW0uaXNNZXRhZGF0YVVwZGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgZ2V0VXVpZChuZXh0SXRlbSkgIT09IGdldFV1aWQocHJldmlvdXNJdGVtKSB8fFxuICAgICAgZ2V0TGFzdFNhdmVkQnkobmV4dEl0ZW0pICE9PSB0aGlzLl9pZFxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KCk7XG4iLCJpbXBvcnQgeyBDaGVja2JveFN0YXR1cywgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgRWRpdG9yUHJvcHMgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IENoZWNrYm94T3V0bGluZSwgQ2hlY2tib3ggfSBmcm9tICcuL2Fzc2V0cyc7XG5cbmNvbnN0IENIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FID0gJ2lzLWNoZWNrZWQnO1xuY29uc3QgQ0xJQ0tfVEFSR0VUX0NMQVNTTkFNRSA9ICdjbGljay10YXJnZXQnO1xuXG5leHBvcnQgY29uc3Qgbm9kZVZpZXdzOiBFZGl0b3JQcm9wczx0eXBlb2Ygc2NoZW1hPlsnbm9kZVZpZXdzJ10gPSB7XG4gIGNoZWNrbGlzdF9pdGVtKG5vZGUsIHZpZXcsIGdldFBvcykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdjaGVja2xpc3QtaXRlbScpO1xuXG4gICAgY29uc3QgaW5wdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbnB1dERpdi5jbGFzc0xpc3QuYWRkKCdjaGVja2JveCcpO1xuICAgIGlmIChub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSkge1xuICAgICAgaW5wdXREaXYuY2xhc3NMaXN0LmFkZChDSEVDS0JPWF9DSEVDS0VEX0NMQVNTTkFNRSk7XG4gICAgICBpbnB1dERpdi5pbm5lckhUTUwgPSBDaGVja2JveDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXREaXYuaW5uZXJIVE1MID0gQ2hlY2tib3hPdXRsaW5lO1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWNrVGFyZ2V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2xpY2tUYXJnZXREaXYuY2xhc3NMaXN0LmFkZChDTElDS19UQVJHRVRfQ0xBU1NOQU1FKTtcbiAgICBjbGlja1RhcmdldERpdi5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnO1xuICAgIGNsaWNrVGFyZ2V0RGl2LnRhYkluZGV4ID0gMDtcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICBjbGlja1RhcmdldERpdi5hcHBlbmRDaGlsZChpbnB1dERpdik7XG4gICAgZGl2LmFwcGVuZENoaWxkKGNsaWNrVGFyZ2V0RGl2KTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQocCk7XG5cbiAgICBjb25zdCBmb2N1c0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVsYXRlZFRhcmdldCwgdGFyZ2V0IH0gPSBldmVudDtcbiAgICAgIGlmIChjbGlja1RhcmdldERpdi5jb250YWlucyhyZWxhdGVkVGFyZ2V0IGFzIE5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAvLyBJbnB1dCBpcyB0YWtpbmcgZm9jdXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3SGFzRm9jdXMgPSB0YXJnZXQgPT09IHZpZXcuZG9tO1xuICAgICAgaWYgKHZpZXdIYXNGb2N1cykge1xuICAgICAgICAvLyBUaGUgdmlldyB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGlucHV0XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xpY2tIYW5kbGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoY2xpY2tUYXJnZXREaXYuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja2VkID0gaW5wdXREaXYuY2xhc3NMaXN0LmNvbnRhaW5zKENIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FKTtcbiAgICAgIGNvbnN0IHsgdHIgfSA9IHZpZXcuc3RhdGU7XG4gICAgICBjb25zdCBwb3MgPSAoZ2V0UG9zIGFzICgpID0+IG51bWJlcikoKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc3RhdHVzOiBjaGVja2VkID8gQ2hlY2tib3hTdGF0dXMuRU1QVFkgOiBDaGVja2JveFN0YXR1cy5ET05FLFxuICAgICAgfSk7XG4gICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB9O1xuXG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZvY3VzSGFuZGxlcik7XG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbTogZGl2LFxuICAgICAgY29udGVudERPTTogcCxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmb2N1c0hhbmRsZXIpO1xuICAgICAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIiwiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsImltcG9ydCB7IGtleU5hbWUsIGJhc2UgfSBmcm9tICd3M2Mta2V5bmFtZSc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbmNvbnN0IG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjfGlQKGhvbmV8W29hXWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk7XG5jb25zdCB3aW5kb3dzID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9XaW4vLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICAgIGxldCBwYXJ0cyA9IG5hbWUuc3BsaXQoLy0oPyEkKS8pLCByZXN1bHQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAocmVzdWx0ID09IFwiU3BhY2VcIilcbiAgICAgICAgcmVzdWx0ID0gXCIgXCI7XG4gICAgbGV0IGFsdCwgY3RybCwgc2hpZnQsIG1ldGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKG1hYylcbiAgICAgICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogXCIgKyBtb2QpO1xuICAgIH1cbiAgICBpZiAoYWx0KVxuICAgICAgICByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgICBpZiAoY3RybClcbiAgICAgICAgcmVzdWx0ID0gXCJDdHJsLVwiICsgcmVzdWx0O1xuICAgIGlmIChtZXRhKVxuICAgICAgICByZXN1bHQgPSBcIk1ldGEtXCIgKyByZXN1bHQ7XG4gICAgaWYgKHNoaWZ0KVxuICAgICAgICByZXN1bHQgPSBcIlNoaWZ0LVwiICsgcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemUobWFwKSB7XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICBjb3B5W25vcm1hbGl6ZUtleU5hbWUocHJvcCldID0gbWFwW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCA9IHRydWUpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vKipcbkNyZWF0ZSBhIGtleW1hcCBwbHVnaW4gZm9yIHRoZSBnaXZlbiBzZXQgb2YgYmluZGluZ3MuXG5cbkJpbmRpbmdzIHNob3VsZCBtYXAga2V5IG5hbWVzIHRvIFtjb21tYW5kXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMpLXN0eWxlXG5mdW5jdGlvbnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYChFZGl0b3JTdGF0ZSwgZGlzcGF0Y2gsXG5FZGl0b3JWaWV3KWAgYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhleSd2ZSBoYW5kbGVkXG50aGUga2V5LiBOb3RlIHRoYXQgdGhlIHZpZXcgYXJndW1lbnQgaXNuJ3QgcGFydCBvZiB0aGUgY29tbWFuZFxucHJvdG9jb2wsIGJ1dCBjYW4gYmUgdXNlZCBhcyBhbiBlc2NhcGUgaGF0Y2ggaWYgYSBiaW5kaW5nIG5lZWRzIHRvXG5kaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBVSS5cblxuS2V5IG5hbWVzIG1heSBiZSBzdHJpbmdzIGxpa2UgYFwiU2hpZnQtQ3RybC1FbnRlclwiYOKAlGEga2V5XG5pZGVudGlmaWVyIHByZWZpeGVkIHdpdGggemVybyBvciBtb3JlIG1vZGlmaWVycy4gS2V5IGlkZW50aWZpZXJzXG5hcmUgYmFzZWQgb24gdGhlIHN0cmluZ3MgdGhhdCBjYW4gYXBwZWFyIGluXG5bYEtleUV2ZW50LmtleWBdKGh0dHBzOmRldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkpLlxuVXNlIGxvd2VyY2FzZSBsZXR0ZXJzIHRvIHJlZmVyIHRvIGxldHRlciBrZXlzIChvciB1cHBlcmNhc2UgbGV0dGVyc1xuaWYgeW91IHdhbnQgc2hpZnQgdG8gYmUgaGVsZCkuIFlvdSBtYXkgdXNlIGBcIlNwYWNlXCJgIGFzIGFuIGFsaWFzXG5mb3IgdGhlIGBcIiBcImAgbmFtZS5cblxuTW9kaWZpZXJzIGNhbiBiZSBnaXZlbiBpbiBhbnkgb3JkZXIuIGBTaGlmdC1gIChvciBgcy1gKSwgYEFsdC1gIChvclxuYGEtYCksIGBDdHJsLWAgKG9yIGBjLWAgb3IgYENvbnRyb2wtYCkgYW5kIGBDbWQtYCAob3IgYG0tYCBvclxuYE1ldGEtYCkgYXJlIHJlY29nbml6ZWQuIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgaG9sZGluZ1xuc2hpZnQsIHRoZSBgU2hpZnQtYCBwcmVmaXggaXMgaW1wbGllZCwgYW5kIHNob3VsZCBub3QgYmUgYWRkZWRcbmV4cGxpY2l0bHkuXG5cbllvdSBjYW4gdXNlIGBNb2QtYCBhcyBhIHNob3J0aGFuZCBmb3IgYENtZC1gIG9uIE1hYyBhbmQgYEN0cmwtYCBvblxub3RoZXIgcGxhdGZvcm1zLlxuXG5Zb3UgY2FuIGFkZCBtdWx0aXBsZSBrZXltYXAgcGx1Z2lucyB0byBhbiBlZGl0b3IuIFRoZSBvcmRlciBpblxud2hpY2ggdGhleSBhcHBlYXIgZGV0ZXJtaW5lcyB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBlYXJseSBpblxudGhlIGFycmF5IGdldCB0byBkaXNwYXRjaCBmaXJzdCkuXG4qL1xuZnVuY3Rpb24ga2V5bWFwKGJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oeyBwcm9wczogeyBoYW5kbGVLZXlEb3duOiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykgfSB9KTtcbn1cbi8qKlxuR2l2ZW4gYSBzZXQgb2YgYmluZGluZ3MgKHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhc1xuW2BrZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8ja2V5bWFwLmtleW1hcCkpLCByZXR1cm4gYSBba2V5ZG93blxuaGFuZGxlcl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlS2V5RG93bikgdGhhdCBoYW5kbGVzIHRoZW0uXG4qL1xuZnVuY3Rpb24ga2V5ZG93bkhhbmRsZXIoYmluZGluZ3MpIHtcbiAgICBsZXQgbWFwID0gbm9ybWFsaXplKGJpbmRpbmdzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZpZXcsIGV2ZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCksIGJhc2VOYW1lLCBkaXJlY3QgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50KV07XG4gICAgICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0KHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEEgY2hhcmFjdGVyIGtleVxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPT0gMSAmJiBuYW1lICE9IFwiIFwiKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBuYW1lIHdhcyBhbHJlYWR5IG1vZGlmaWVkIGJ5IHNoaWZ0LCB0cnkgbG9va2luZ1xuICAgICAgICAgICAgICAgIC8vIGl0IHVwIHdpdGhvdXQgaXRzIHNoaWZ0IG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgbGV0IG5vU2hpZnQgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBmYWxzZSldO1xuICAgICAgICAgICAgICAgIGlmIChub1NoaWZ0ICYmIG5vU2hpZnQodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxuICAgICAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAgICAgISh3aW5kb3dzICYmIGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgZmFsbGluZyBiYWNrIHRvIHRoZSBrZXlDb2RlIHdoZW4gdGhlcmUncyBhIG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgLy8gYWN0aXZlIG9yIHRoZSBjaGFyYWN0ZXIgcHJvZHVjZWQgaXNuJ3QgQVNDSUksIGFuZCBvdXIgdGFibGVcbiAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcyBhIGRpZmZlcmVudCBuYW1lIGZyb20gdGhlIHRoZSBrZXlDb2RlLiBTZWUgIzY2OCxcbiAgICAgICAgICAgICAgICAvLyAjMTA2MCwgIzE1MjkuXG4gICAgICAgICAgICAgICAgbGV0IGZyb21Db2RlID0gbWFwW21vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQpXTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUNvZGUgJiYgZnJvbUNvZGUodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBrZXlkb3duSGFuZGxlciwga2V5bWFwIH07XG4iLCJpbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgUGx1Z2luLFxuICBTZWxlY3Rpb24sXG4gIFRleHRTZWxlY3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IGJhc2VLZXltYXAsIHNldEJsb2NrVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IGtleW1hcCB9IGZyb20gJ3Byb3NlbWlycm9yLWtleW1hcCc7XG5pbXBvcnQgeyBzcGxpdExpc3RJdGVtIH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWxpc3QnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5mdW5jdGlvbiByZWN1cnNpdmVEZWxldGVFbXB0eSh0cjogVHJhbnNhY3Rpb24sICRwb3M6IFJlc29sdmVkUG9zKTogVHJhbnNhY3Rpb24ge1xuICBjb25zdCBwYXJlbnROb2RlID0gJHBvcy5wYXJlbnQ7XG4gIGlmIChwYXJlbnROb2RlLm5vZGVTaXplID09PSAyKSB7XG4gICAgY29uc3QgeyBwb3MgfSA9ICRwb3M7XG4gICAgcmV0dXJuIHJlY3Vyc2l2ZURlbGV0ZUVtcHR5KFxuICAgICAgdHIuZGVsZXRlUmFuZ2UocG9zIC0gMSwgcG9zICsgMSksXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcChwb3MpKSxcbiAgICApO1xuICB9XG4gIHJldHVybiB0cjtcbn1cblxuZnVuY3Rpb24gZW5zdXJlVGV4dFNlbGVjdGlvbkluRW1wdHlOb2RlKHN0YXRlOiBFZGl0b3JTdGF0ZSk6IGJvb2xlYW4ge1xuICBjb25zdCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uO1xuICByZXR1cm4gQm9vbGVhbigkY3Vyc29yICYmICRjdXJzb3IucGFyZW50Lm5vZGVTaXplID09PSAyKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlQ2hlY2tsaXN0SXRlbVRleHRTZWxlY3Rpb24oc3RhdGU6IEVkaXRvclN0YXRlKSB7XG4gIGNvbnN0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb247XG4gIHJldHVybiBCb29sZWFuKFxuICAgICRjdXJzb3IgJiYgJGN1cnNvci5wYXJlbnQudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtLFxuICApO1xufVxuXG5leHBvcnQgY29uc3Qga2V5bWFwUGx1Z2luczogUGx1Z2luW10gPSBbXG4gIC8vIGNoZWNrbGlzdCBpdGVtIGhhbmRsZXJzXG4gIGtleW1hcCh7XG4gICAgQmFja3NwYWNlKHN0YXRlLCBkaXNwYXRjaCwgdmlldykge1xuICAgICAgaWYgKGVuc3VyZUNoZWNrbGlzdEl0ZW1UZXh0U2VsZWN0aW9uKHN0YXRlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXcuZW5kT2ZUZXh0YmxvY2soJ2xlZnQnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uKS4kY3Vyc29yLmluZGV4KDApID09PSAwKSB7XG4gICAgICAgIHNldEJsb2NrVHlwZShzY2hlbWEubm9kZXMucGFyYWdyYXBoKShzdGF0ZSwgZGlzcGF0Y2gpO1xuICAgICAgfVxuICAgIH0sXG4gICAgRW50ZXIoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICBjb25zdCB7IHNlbGVjdGlvbiwgdHIgfSA9IHN0YXRlO1xuICAgICAgY29uc3QgeyAkZnJvbSwgZnJvbSB9ID0gc2VsZWN0aW9uO1xuICAgICAgaWYgKCRmcm9tLnBhcmVudC50eXBlICE9PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBuZXh0JEZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgIGlmIChuZXh0JEZyb20ucGFyZW50Lm5vZGVTaXplID09PSAyKSB7XG4gICAgICAgIGNvbnN0IG5leHRGcm9tID0gbmV4dCRGcm9tLnBvcztcbiAgICAgICAgLy8gVGhlIG5vZGUgaXMgZW1wdHlcbiAgICAgICAgdHIucmVwbGFjZVdpdGgoXG4gICAgICAgICAgbmV4dEZyb20gLSAxLFxuICAgICAgICAgIG5leHRGcm9tICsgMSxcbiAgICAgICAgICBzY2hlbWEubm9kZXMucGFyYWdyYXBoLmNyZWF0ZUFuZEZpbGwoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG5leHRGcm9tIC0gMSkpKTtcbiAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRyLnNwbGl0KGZyb20sIHVuZGVmaW5lZCwgW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KSxcbiAgLy8gbGlzdCBpdGVtIGhhbmRsZXJzXG4gIGtleW1hcCh7XG4gICAgQmFja3NwYWNlKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgaWYgKGVuc3VyZVRleHRTZWxlY3Rpb25JbkVtcHR5Tm9kZShzdGF0ZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgeyAkY3Vyc29yIH0gPSBzZWxlY3Rpb247XG4gICAgICBjb25zdCBwb3NzaWJsZVNlbGVjdGlvbiA9IFNlbGVjdGlvbi5maW5kRnJvbShcbiAgICAgICAgc3RhdGUuZG9jLnJlc29sdmUoJGN1cnNvci5iZWZvcmUoKSksXG4gICAgICAgIC0xLFxuICAgICAgICB0cnVlLFxuICAgICAgICAvLyBXZSBjYW4gYXNzZXJ0IHRoaXMgaGVyZSBiYyBvZiB0aGUgdGV4dE9ubHkgYXJnIGFib3ZlXG4gICAgICApIGFzIFRleHRTZWxlY3Rpb247XG4gICAgICBpZiAoIXBvc3NpYmxlU2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NzaWJsZVNlbGVjdGlvbi4kY3Vyc29yLm5vZGUoLTEpLnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHRyID0gc3RhdGUudHIuc2V0U2VsZWN0aW9uKHBvc3NpYmxlU2VsZWN0aW9uKTtcbiAgICAgIHRyID0gcmVjdXJzaXZlRGVsZXRlRW1wdHkodHIsICRjdXJzb3IpO1xuICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBFbnRlcjogc3BsaXRMaXN0SXRlbShzY2hlbWEubm9kZXMubGlzdF9pdGVtKSxcbiAgfSksXG4gIGtleW1hcChiYXNlS2V5bWFwKSxcbl07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cbmNvbnN0IGRlY29kZUNhY2hlID0ge31cblxuZnVuY3Rpb24gZ2V0RGVjb2RlQ2FjaGUgKGV4Y2x1ZGUpIHtcbiAgbGV0IGNhY2hlID0gZGVjb2RlQ2FjaGVbZXhjbHVkZV1cbiAgaWYgKGNhY2hlKSB7IHJldHVybiBjYWNoZSB9XG5cbiAgY2FjaGUgPSBkZWNvZGVDYWNoZVtleGNsdWRlXSA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxuICAgIGNhY2hlLnB1c2goY2gpXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGV4Y2x1ZGUuY2hhckNvZGVBdChpKVxuICAgIGNhY2hlW2NoXSA9ICclJyArICgnMCcgKyBjaC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSkuc2xpY2UoLTIpXG4gIH1cblxuICByZXR1cm4gY2FjaGVcbn1cblxuLy8gRGVjb2RlIHBlcmNlbnQtZW5jb2RlZCBzdHJpbmcuXG4vL1xuZnVuY3Rpb24gZGVjb2RlIChzdHJpbmcsIGV4Y2x1ZGUpIHtcbiAgaWYgKHR5cGVvZiBleGNsdWRlICE9PSAnc3RyaW5nJykge1xuICAgIGV4Y2x1ZGUgPSBkZWNvZGUuZGVmYXVsdENoYXJzXG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldERlY29kZUNhY2hlKGV4Y2x1ZGUpXG5cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oJVthLWYwLTldezJ9KSsvZ2ksIGZ1bmN0aW9uIChzZXEpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2VxLmxlbmd0aDsgaSA8IGw7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDEsIGkgKyAzKSwgMTYpXG5cbiAgICAgIGlmIChiMSA8IDB4ODApIHtcbiAgICAgICAgcmVzdWx0ICs9IGNhY2hlW2IxXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhFMCkgPT09IDB4QzAgJiYgKGkgKyAzIDwgbCkpIHtcbiAgICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHhcbiAgICAgICAgY29uc3QgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpXG5cbiAgICAgICAgaWYgKChiMiAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgY29uc3QgY2hyID0gKChiMSA8PCA2KSAmIDB4N0MwKSB8IChiMiAmIDB4M0YpXG5cbiAgICAgICAgICBpZiAoY2hyIDwgMHg4MCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gM1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKChiMSAmIDB4RjApID09PSAweEUwICYmIChpICsgNiA8IGwpKSB7XG4gICAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICAgIGNvbnN0IGIyID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA0LCBpICsgNiksIDE2KVxuICAgICAgICBjb25zdCBiMyA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNywgaSArIDkpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBjb25zdCBjaHIgPSAoKGIxIDw8IDEyKSAmIDB4RjAwMCkgfCAoKGIyIDw8IDYpICYgMHhGQzApIHwgKGIzICYgMHgzRilcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwMCB8fCAoY2hyID49IDB4RDgwMCAmJiBjaHIgPD0gMHhERkZGKSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZFxcdWZmZmQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpICs9IDZcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgoYjEgJiAweEY4KSA9PT0gMHhGMCAmJiAoaSArIDkgPCBsKSkge1xuICAgICAgICAvLyAxMTExMTB4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgICBjb25zdCBiMiA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNCwgaSArIDYpLCAxNilcbiAgICAgICAgY29uc3QgYjMgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDcsIGkgKyA5KSwgMTYpXG4gICAgICAgIGNvbnN0IGI0ID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyAxMCwgaSArIDEyKSwgMTYpXG5cbiAgICAgICAgaWYgKChiMiAmIDB4QzApID09PSAweDgwICYmIChiMyAmIDB4QzApID09PSAweDgwICYmIChiNCAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgbGV0IGNociA9ICgoYjEgPDwgMTgpICYgMHgxQzAwMDApIHwgKChiMiA8PCAxMikgJiAweDNGMDAwKSB8ICgoYjMgPDwgNikgJiAweEZDMCkgfCAoYjQgJiAweDNGKVxuXG4gICAgICAgICAgaWYgKGNociA8IDB4MTAwMDAgfHwgY2hyID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFx1ZmZmZFxcdWZmZmRcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hyIC09IDB4MTAwMDBcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCArIChjaHIgPj4gMTApLCAweERDMDAgKyAoY2hyICYgMHgzRkYpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gOVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJ1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSlcbn1cblxuZGVjb2RlLmRlZmF1bHRDaGFycyA9ICc7Lz86QCY9KyQsIydcbmRlY29kZS5jb21wb25lbnRDaGFycyA9ICcnXG5cbmV4cG9ydCBkZWZhdWx0IGRlY29kZVxuIiwiY29uc3QgZW5jb2RlQ2FjaGUgPSB7fVxuXG4vLyBDcmVhdGUgYSBsb29rdXAgYXJyYXkgd2hlcmUgYW55dGhpbmcgYnV0IGNoYXJhY3RlcnMgaW4gYGNoYXJzYCBzdHJpbmdcbi8vIGFuZCBhbHBoYW51bWVyaWMgY2hhcnMgaXMgcGVyY2VudC1lbmNvZGVkLlxuLy9cbmZ1bmN0aW9uIGdldEVuY29kZUNhY2hlIChleGNsdWRlKSB7XG4gIGxldCBjYWNoZSA9IGVuY29kZUNhY2hlW2V4Y2x1ZGVdXG4gIGlmIChjYWNoZSkgeyByZXR1cm4gY2FjaGUgfVxuXG4gIGNhY2hlID0gZW5jb2RlQ2FjaGVbZXhjbHVkZV0gPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcbiAgICBjb25zdCBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcblxuICAgIGlmICgvXlswLTlhLXpdJC9pLnRlc3QoY2gpKSB7XG4gICAgICAvLyBhbHdheXMgYWxsb3cgdW5lbmNvZGVkIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICBjYWNoZS5wdXNoKGNoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZS5wdXNoKCclJyArICgnMCcgKyBpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMikpXG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNsdWRlLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGVbZXhjbHVkZS5jaGFyQ29kZUF0KGkpXSA9IGV4Y2x1ZGVbaV1cbiAgfVxuXG4gIHJldHVybiBjYWNoZVxufVxuXG4vLyBFbmNvZGUgdW5zYWZlIGNoYXJhY3RlcnMgd2l0aCBwZXJjZW50LWVuY29kaW5nLCBza2lwcGluZyBhbHJlYWR5XG4vLyBlbmNvZGVkIHNlcXVlbmNlcy5cbi8vXG4vLyAgLSBzdHJpbmcgICAgICAgLSBzdHJpbmcgdG8gZW5jb2RlXG4vLyAgLSBleGNsdWRlICAgICAgLSBsaXN0IG9mIGNoYXJhY3RlcnMgdG8gaWdub3JlIChpbiBhZGRpdGlvbiB0byBhLXpBLVowLTkpXG4vLyAgLSBrZWVwRXNjYXBlZCAgLSBkb24ndCBlbmNvZGUgJyUnIGluIGEgY29ycmVjdCBlc2NhcGUgc2VxdWVuY2UgKGRlZmF1bHQ6IHRydWUpXG4vL1xuZnVuY3Rpb24gZW5jb2RlIChzdHJpbmcsIGV4Y2x1ZGUsIGtlZXBFc2NhcGVkKSB7XG4gIGlmICh0eXBlb2YgZXhjbHVkZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBlbmNvZGUoc3RyaW5nLCBrZWVwRXNjYXBlZClcbiAgICBrZWVwRXNjYXBlZCA9IGV4Y2x1ZGVcbiAgICBleGNsdWRlID0gZW5jb2RlLmRlZmF1bHRDaGFyc1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZWVwRXNjYXBlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBrZWVwRXNjYXBlZCA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RW5jb2RlQ2FjaGUoZXhjbHVkZSlcbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBzdHJpbmcubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICBpZiAoa2VlcEVzY2FwZWQgJiYgY29kZSA9PT0gMHgyNSAvKiAlICovICYmIGkgKyAyIDwgbCkge1xuICAgICAgaWYgKC9eWzAtOWEtZl17Mn0kL2kudGVzdChzdHJpbmcuc2xpY2UoaSArIDEsIGkgKyAzKSkpIHtcbiAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5zbGljZShpLCBpICsgMylcbiAgICAgICAgaSArPSAyXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPCAxMjgpIHtcbiAgICAgIHJlc3VsdCArPSBjYWNoZVtjb2RlXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSAweEQ4MDAgJiYgY29kZSA8PSAweERGRkYpIHtcbiAgICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REJGRiAmJiBpICsgMSA8IGwpIHtcbiAgICAgICAgY29uc3QgbmV4dENvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSlcbiAgICAgICAgaWYgKG5leHRDb2RlID49IDB4REMwMCAmJiBuZXh0Q29kZSA8PSAweERGRkYpIHtcbiAgICAgICAgICByZXN1bHQgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ1tpXSArIHN0cmluZ1tpICsgMV0pXG4gICAgICAgICAgaSsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0ICs9ICclRUYlQkYlQkQnXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nW2ldKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5lbmNvZGUuZGVmYXVsdENoYXJzID0gXCI7Lz86QCY9KyQsLV8uIX4qJygpI1wiXG5lbmNvZGUuY29tcG9uZW50Q2hhcnMgPSBcIi1fLiF+KicoKVwiXG5cbmV4cG9ydCBkZWZhdWx0IGVuY29kZVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0ICh1cmwpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgcmVzdWx0ICs9IHVybC5wcm90b2NvbCB8fCAnJ1xuICByZXN1bHQgKz0gdXJsLnNsYXNoZXMgPyAnLy8nIDogJydcbiAgcmVzdWx0ICs9IHVybC5hdXRoID8gdXJsLmF1dGggKyAnQCcgOiAnJ1xuXG4gIGlmICh1cmwuaG9zdG5hbWUgJiYgdXJsLmhvc3RuYW1lLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICAvLyBpcHY2IGFkZHJlc3NcbiAgICByZXN1bHQgKz0gJ1snICsgdXJsLmhvc3RuYW1lICsgJ10nXG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ICs9IHVybC5ob3N0bmFtZSB8fCAnJ1xuICB9XG5cbiAgcmVzdWx0ICs9IHVybC5wb3J0ID8gJzonICsgdXJsLnBvcnQgOiAnJ1xuICByZXN1bHQgKz0gdXJsLnBhdGhuYW1lIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuc2VhcmNoIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuaGFzaCB8fCAnJ1xuXG4gIHJldHVybiByZXN1bHRcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy9cbi8vIENoYW5nZXMgZnJvbSBqb3llbnQvbm9kZTpcbi8vXG4vLyAxLiBObyBsZWFkaW5nIHNsYXNoIGluIHBhdGhzLFxuLy8gICAgZS5nLiBpbiBgdXJsLnBhcnNlKCdodHRwOi8vZm9vP2JhcicpYCBwYXRobmFtZSBpcyBgYCwgbm90IGAvYFxuLy9cbi8vIDIuIEJhY2tzbGFzaGVzIGFyZSBub3QgcmVwbGFjZWQgd2l0aCBzbGFzaGVzLFxuLy8gICAgc28gYGh0dHA6XFxcXGV4YW1wbGUub3JnXFxgIGlzIHRyZWF0ZWQgbGlrZSBhIHJlbGF0aXZlIHBhdGhcbi8vXG4vLyAzLiBUcmFpbGluZyBjb2xvbiBpcyB0cmVhdGVkIGxpa2UgYSBwYXJ0IG9mIHRoZSBwYXRoLFxuLy8gICAgaS5lLiBpbiBgaHR0cDovL2V4YW1wbGUub3JnOmZvb2AgcGF0aG5hbWUgaXMgYDpmb29gXG4vL1xuLy8gNC4gTm90aGluZyBpcyBVUkwtZW5jb2RlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdCxcbi8vICAgIChpbiBqb3llbnQvbm9kZSBzb21lIGNoYXJzIGluIGF1dGggYW5kIHBhdGhzIGFyZSBlbmNvZGVkKVxuLy9cbi8vIDUuIGB1cmwucGFyc2UoKWAgZG9lcyBub3QgaGF2ZSBgcGFyc2VRdWVyeVN0cmluZ2AgYXJndW1lbnRcbi8vXG4vLyA2LiBSZW1vdmVkIGV4dHJhbmVvdXMgcmVzdWx0IHByb3BlcnRpZXM6IGBob3N0YCwgYHBhdGhgLCBgcXVlcnlgLCBldGMuLFxuLy8gICAgd2hpY2ggY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIG90aGVyIHBhcnRzIG9mIHRoZSB1cmwuXG4vL1xuXG5mdW5jdGlvbiBVcmwgKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbFxuICB0aGlzLnNsYXNoZXMgPSBudWxsXG4gIHRoaXMuYXV0aCA9IG51bGxcbiAgdGhpcy5wb3J0ID0gbnVsbFxuICB0aGlzLmhvc3RuYW1lID0gbnVsbFxuICB0aGlzLmhhc2ggPSBudWxsXG4gIHRoaXMuc2VhcmNoID0gbnVsbFxuICB0aGlzLnBhdGhuYW1lID0gbnVsbFxufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxuY29uc3QgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaVxuY29uc3QgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvXG5cbi8vIFNwZWNpYWwgY2FzZSBmb3IgYSBzaW1wbGUgcGF0aCBVUkxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuY29uc3Qgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvXG5cbi8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4vLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuY29uc3QgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J11cblxuLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbmNvbnN0IHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKVxuXG4vLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG5jb25zdCBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKVxuLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbi8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2Vcbi8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuLy8gdGhlbS5cbmNvbnN0IG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpXG5jb25zdCBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ11cbmNvbnN0IGhvc3RuYW1lTWF4TGVuID0gMjU1XG5jb25zdCBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvXG5jb25zdCBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkL1xuLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4vLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG5jb25zdCBob3N0bGVzc1Byb3RvY29sID0ge1xuICBqYXZhc2NyaXB0OiB0cnVlLFxuICAnamF2YXNjcmlwdDonOiB0cnVlXG59XG4vLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbmNvbnN0IHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgaHR0cDogdHJ1ZSxcbiAgaHR0cHM6IHRydWUsXG4gIGZ0cDogdHJ1ZSxcbiAgZ29waGVyOiB0cnVlLFxuICBmaWxlOiB0cnVlLFxuICAnaHR0cDonOiB0cnVlLFxuICAnaHR0cHM6JzogdHJ1ZSxcbiAgJ2Z0cDonOiB0cnVlLFxuICAnZ29waGVyOic6IHRydWUsXG4gICdmaWxlOic6IHRydWVcbn1cblxuZnVuY3Rpb24gdXJsUGFyc2UgKHVybCwgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmxcblxuICBjb25zdCB1ID0gbmV3IFVybCgpXG4gIHUucGFyc2UodXJsLCBzbGFzaGVzRGVub3RlSG9zdClcbiAgcmV0dXJuIHVcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh1cmwsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGxldCBsb3dlclByb3RvLCBoZWMsIHNsYXNoZXNcbiAgbGV0IHJlc3QgPSB1cmxcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKVxuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICBjb25zdCBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KVxuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXVxuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm90byA9IHByb3RvY29sUGF0dGVybi5leGVjKHJlc3QpXG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF1cbiAgICBsb3dlclByb3RvID0gcHJvdG8udG9Mb3dlckNhc2UoKVxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpXG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLydcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc3Vic3RyKDIpXG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICBsZXQgaG9zdEVuZCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYyA9IHJlc3QuaW5kZXhPZihob3N0RW5kaW5nQ2hhcnNbaV0pXG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHtcbiAgICAgICAgaG9zdEVuZCA9IGhlY1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgIGxldCBhdXRoLCBhdFNpZ25cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKVxuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgIC8vIFB1bGwgdGhhdCBvZmYuXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbilcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpXG4gICAgICB0aGlzLmF1dGggPSBhdXRoXG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKVxuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKSB7XG4gICAgICAgIGhvc3RFbmQgPSBoZWNcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKHJlc3RbaG9zdEVuZCAtIDFdID09PSAnOicpIHsgaG9zdEVuZC0tIH1cbiAgICBjb25zdCBob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpXG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KGhvc3QpXG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJydcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgY29uc3QgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmXG4gICAgICAgIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nXG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgY29uc3QgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLylcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gaG9zdHBhcnRzW2ldXG4gICAgICAgIGlmICghcGFydCkgeyBjb250aW51ZSB9XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIGxldCBuZXdwYXJ0ID0gJydcbiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8vIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgIC8vIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgbmV3cGFydCArPSAneCdcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFBhcnRzID0gaG9zdHBhcnRzLnNsaWNlKDAsIGkpXG4gICAgICAgICAgICBjb25zdCBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKVxuICAgICAgICAgICAgY29uc3QgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydClcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSlcbiAgICAgICAgICAgICAgbm90SG9zdC51bnNoaWZ0KGJpdFsyXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gbm90SG9zdC5qb2luKCcuJykgKyByZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJ1xuICAgIH1cblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpXG4gICAgfVxuICB9XG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgY29uc3QgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpXG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpXG4gIH1cbiAgY29uc3QgcW0gPSByZXN0LmluZGV4T2YoJz8nKVxuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSlcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSlcbiAgfVxuICBpZiAocmVzdCkgeyB0aGlzLnBhdGhuYW1lID0gcmVzdCB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJydcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24gKGhvc3QpIHtcbiAgbGV0IHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpXG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF1cbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKVxuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aClcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdCB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVybFBhcnNlXG4iLCJleHBvcnQgZGVmYXVsdCAvWyEtIyUtXFwqLC1cXC86O1xcP0BcXFstXFxdX1xce1xcfVxceEExXFx4QTdcXHhBQlxceEI2XFx4QjdcXHhCQlxceEJGXFx1MDM3RVxcdTAzODdcXHUwNTVBLVxcdTA1NUZcXHUwNTg5XFx1MDU4QVxcdTA1QkVcXHUwNUMwXFx1MDVDM1xcdTA1QzZcXHUwNUYzXFx1MDVGNFxcdTA2MDlcXHUwNjBBXFx1MDYwQ1xcdTA2MERcXHUwNjFCXFx1MDYxRC1cXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwOUZEXFx1MEE3NlxcdTBBRjBcXHUwQzc3XFx1MEM4NFxcdTBERjRcXHUwRTRGXFx1MEU1QVxcdTBFNUJcXHUwRjA0LVxcdTBGMTJcXHUwRjE0XFx1MEYzQS1cXHUwRjNEXFx1MEY4NVxcdTBGRDAtXFx1MEZENFxcdTBGRDlcXHUwRkRBXFx1MTA0QS1cXHUxMDRGXFx1MTBGQlxcdTEzNjAtXFx1MTM2OFxcdTE0MDBcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQjdEXFx1MUI3RVxcdTFCRkMtXFx1MUJGRlxcdTFDM0ItXFx1MUMzRlxcdTFDN0VcXHUxQzdGXFx1MUNDMC1cXHUxQ0M3XFx1MUNEM1xcdTIwMTAtXFx1MjAyN1xcdTIwMzAtXFx1MjA0M1xcdTIwNDUtXFx1MjA1MVxcdTIwNTMtXFx1MjA1RVxcdTIwN0RcXHUyMDdFXFx1MjA4RFxcdTIwOEVcXHUyMzA4LVxcdTIzMEJcXHUyMzI5XFx1MjMyQVxcdTI3NjgtXFx1Mjc3NVxcdTI3QzVcXHUyN0M2XFx1MjdFNi1cXHUyN0VGXFx1Mjk4My1cXHUyOTk4XFx1MjlEOC1cXHUyOURCXFx1MjlGQ1xcdTI5RkRcXHUyQ0Y5LVxcdTJDRkNcXHUyQ0ZFXFx1MkNGRlxcdTJENzBcXHUyRTAwLVxcdTJFMkVcXHUyRTMwLVxcdTJFNEZcXHUyRTUyLVxcdTJFNURcXHUzMDAxLVxcdTMwMDNcXHUzMDA4LVxcdTMwMTFcXHUzMDE0LVxcdTMwMUZcXHUzMDMwXFx1MzAzRFxcdTMwQTBcXHUzMEZCXFx1QTRGRVxcdUE0RkZcXHVBNjBELVxcdUE2MEZcXHVBNjczXFx1QTY3RVxcdUE2RjItXFx1QTZGN1xcdUE4NzQtXFx1QTg3N1xcdUE4Q0VcXHVBOENGXFx1QThGOC1cXHVBOEZBXFx1QThGQ1xcdUE5MkVcXHVBOTJGXFx1QTk1RlxcdUE5QzEtXFx1QTlDRFxcdUE5REVcXHVBOURGXFx1QUE1Qy1cXHVBQTVGXFx1QUFERVxcdUFBREZcXHVBQUYwXFx1QUFGMVxcdUFCRUJcXHVGRDNFXFx1RkQzRlxcdUZFMTAtXFx1RkUxOVxcdUZFMzAtXFx1RkU1MlxcdUZFNTQtXFx1RkU2MVxcdUZFNjNcXHVGRTY4XFx1RkU2QVxcdUZFNkJcXHVGRjAxLVxcdUZGMDNcXHVGRjA1LVxcdUZGMEFcXHVGRjBDLVxcdUZGMEZcXHVGRjFBXFx1RkYxQlxcdUZGMUZcXHVGRjIwXFx1RkYzQi1cXHVGRjNEXFx1RkYzRlxcdUZGNUJcXHVGRjVEXFx1RkY1Ri1cXHVGRjY1XXxcXHVEODAwW1xcdUREMDAtXFx1REQwMlxcdURGOUZcXHVERkQwXXxcXHVEODAxXFx1REQ2RnxcXHVEODAyW1xcdURDNTdcXHVERDFGXFx1REQzRlxcdURFNTAtXFx1REU1OFxcdURFN0ZcXHVERUYwLVxcdURFRjZcXHVERjM5LVxcdURGM0ZcXHVERjk5LVxcdURGOUNdfFxcdUQ4MDNbXFx1REVBRFxcdURGNTUtXFx1REY1OVxcdURGODYtXFx1REY4OV18XFx1RDgwNFtcXHVEQzQ3LVxcdURDNERcXHVEQ0JCXFx1RENCQ1xcdURDQkUtXFx1RENDMVxcdURENDAtXFx1REQ0M1xcdURENzRcXHVERDc1XFx1RERDNS1cXHVEREM4XFx1RERDRFxcdUREREJcXHVERERELVxcdUREREZcXHVERTM4LVxcdURFM0RcXHVERUE5XXxcXHVEODA1W1xcdURDNEItXFx1REM0RlxcdURDNUFcXHVEQzVCXFx1REM1RFxcdURDQzZcXHVEREMxLVxcdURERDdcXHVERTQxLVxcdURFNDNcXHVERTYwLVxcdURFNkNcXHVERUI5XFx1REYzQy1cXHVERjNFXXxcXHVEODA2W1xcdURDM0JcXHVERDQ0LVxcdURENDZcXHVEREUyXFx1REUzRi1cXHVERTQ2XFx1REU5QS1cXHVERTlDXFx1REU5RS1cXHVERUEyXFx1REYwMC1cXHVERjA5XXxcXHVEODA3W1xcdURDNDEtXFx1REM0NVxcdURDNzBcXHVEQzcxXFx1REVGN1xcdURFRjhcXHVERjQzLVxcdURGNEZcXHVERkZGXXxcXHVEODA5W1xcdURDNzAtXFx1REM3NF18XFx1RDgwQltcXHVERkYxXFx1REZGMl18XFx1RDgxQVtcXHVERTZFXFx1REU2RlxcdURFRjVcXHVERjM3LVxcdURGM0JcXHVERjQ0XXxcXHVEODFCW1xcdURFOTctXFx1REU5QVxcdURGRTJdfFxcdUQ4MkZcXHVEQzlGfFxcdUQ4MzZbXFx1REU4Ny1cXHVERThCXXxcXHVEODNBW1xcdURENUVcXHVERDVGXS8iLCJleHBvcnQgZGVmYXVsdCAvW1xcJFxcKzwtPlxcXmBcXHx+XFx4QTItXFx4QTZcXHhBOFxceEE5XFx4QUNcXHhBRS1cXHhCMVxceEI0XFx4QjhcXHhEN1xceEY3XFx1MDJDMi1cXHUwMkM1XFx1MDJEMi1cXHUwMkRGXFx1MDJFNS1cXHUwMkVCXFx1MDJFRFxcdTAyRUYtXFx1MDJGRlxcdTAzNzVcXHUwMzg0XFx1MDM4NVxcdTAzRjZcXHUwNDgyXFx1MDU4RC1cXHUwNThGXFx1MDYwNi1cXHUwNjA4XFx1MDYwQlxcdTA2MEVcXHUwNjBGXFx1MDZERVxcdTA2RTlcXHUwNkZEXFx1MDZGRVxcdTA3RjZcXHUwN0ZFXFx1MDdGRlxcdTA4ODhcXHUwOUYyXFx1MDlGM1xcdTA5RkFcXHUwOUZCXFx1MEFGMVxcdTBCNzBcXHUwQkYzLVxcdTBCRkFcXHUwQzdGXFx1MEQ0RlxcdTBENzlcXHUwRTNGXFx1MEYwMS1cXHUwRjAzXFx1MEYxM1xcdTBGMTUtXFx1MEYxN1xcdTBGMUEtXFx1MEYxRlxcdTBGMzRcXHUwRjM2XFx1MEYzOFxcdTBGQkUtXFx1MEZDNVxcdTBGQzctXFx1MEZDQ1xcdTBGQ0VcXHUwRkNGXFx1MEZENS1cXHUwRkQ4XFx1MTA5RVxcdTEwOUZcXHUxMzkwLVxcdTEzOTlcXHUxNjZEXFx1MTdEQlxcdTE5NDBcXHUxOURFLVxcdTE5RkZcXHUxQjYxLVxcdTFCNkFcXHUxQjc0LVxcdTFCN0NcXHUxRkJEXFx1MUZCRi1cXHUxRkMxXFx1MUZDRC1cXHUxRkNGXFx1MUZERC1cXHUxRkRGXFx1MUZFRC1cXHUxRkVGXFx1MUZGRFxcdTFGRkVcXHUyMDQ0XFx1MjA1MlxcdTIwN0EtXFx1MjA3Q1xcdTIwOEEtXFx1MjA4Q1xcdTIwQTAtXFx1MjBDMFxcdTIxMDBcXHUyMTAxXFx1MjEwMy1cXHUyMTA2XFx1MjEwOFxcdTIxMDlcXHUyMTE0XFx1MjExNi1cXHUyMTE4XFx1MjExRS1cXHUyMTIzXFx1MjEyNVxcdTIxMjdcXHUyMTI5XFx1MjEyRVxcdTIxM0FcXHUyMTNCXFx1MjE0MC1cXHUyMTQ0XFx1MjE0QS1cXHUyMTREXFx1MjE0RlxcdTIxOEFcXHUyMThCXFx1MjE5MC1cXHUyMzA3XFx1MjMwQy1cXHUyMzI4XFx1MjMyQi1cXHUyNDI2XFx1MjQ0MC1cXHUyNDRBXFx1MjQ5Qy1cXHUyNEU5XFx1MjUwMC1cXHUyNzY3XFx1Mjc5NC1cXHUyN0M0XFx1MjdDNy1cXHUyN0U1XFx1MjdGMC1cXHUyOTgyXFx1Mjk5OS1cXHUyOUQ3XFx1MjlEQy1cXHUyOUZCXFx1MjlGRS1cXHUyQjczXFx1MkI3Ni1cXHUyQjk1XFx1MkI5Ny1cXHUyQkZGXFx1MkNFNS1cXHUyQ0VBXFx1MkU1MFxcdTJFNTFcXHUyRTgwLVxcdTJFOTlcXHUyRTlCLVxcdTJFRjNcXHUyRjAwLVxcdTJGRDVcXHUyRkYwLVxcdTJGRkZcXHUzMDA0XFx1MzAxMlxcdTMwMTNcXHUzMDIwXFx1MzAzNlxcdTMwMzdcXHUzMDNFXFx1MzAzRlxcdTMwOUJcXHUzMDlDXFx1MzE5MFxcdTMxOTFcXHUzMTk2LVxcdTMxOUZcXHUzMUMwLVxcdTMxRTNcXHUzMUVGXFx1MzIwMC1cXHUzMjFFXFx1MzIyQS1cXHUzMjQ3XFx1MzI1MFxcdTMyNjAtXFx1MzI3RlxcdTMyOEEtXFx1MzJCMFxcdTMyQzAtXFx1MzNGRlxcdTREQzAtXFx1NERGRlxcdUE0OTAtXFx1QTRDNlxcdUE3MDAtXFx1QTcxNlxcdUE3MjBcXHVBNzIxXFx1QTc4OVxcdUE3OEFcXHVBODI4LVxcdUE4MkJcXHVBODM2LVxcdUE4MzlcXHVBQTc3LVxcdUFBNzlcXHVBQjVCXFx1QUI2QVxcdUFCNkJcXHVGQjI5XFx1RkJCMi1cXHVGQkMyXFx1RkQ0MC1cXHVGRDRGXFx1RkRDRlxcdUZERkMtXFx1RkRGRlxcdUZFNjJcXHVGRTY0LVxcdUZFNjZcXHVGRTY5XFx1RkYwNFxcdUZGMEJcXHVGRjFDLVxcdUZGMUVcXHVGRjNFXFx1RkY0MFxcdUZGNUNcXHVGRjVFXFx1RkZFMC1cXHVGRkU2XFx1RkZFOC1cXHVGRkVFXFx1RkZGQ1xcdUZGRkRdfFxcdUQ4MDBbXFx1REQzNy1cXHVERDNGXFx1REQ3OS1cXHVERDg5XFx1REQ4Qy1cXHVERDhFXFx1REQ5MC1cXHVERDlDXFx1RERBMFxcdURERDAtXFx1RERGQ118XFx1RDgwMltcXHVEQzc3XFx1REM3OFxcdURFQzhdfFxcdUQ4MDVcXHVERjNGfFxcdUQ4MDdbXFx1REZENS1cXHVERkYxXXxcXHVEODFBW1xcdURGM0MtXFx1REYzRlxcdURGNDVdfFxcdUQ4MkZcXHVEQzlDfFxcdUQ4MzNbXFx1REY1MC1cXHVERkMzXXxcXHVEODM0W1xcdURDMDAtXFx1RENGNVxcdUREMDAtXFx1REQyNlxcdUREMjktXFx1REQ2NFxcdURENkEtXFx1REQ2Q1xcdUREODNcXHVERDg0XFx1REQ4Qy1cXHVEREE5XFx1RERBRS1cXHVEREVBXFx1REUwMC1cXHVERTQxXFx1REU0NVxcdURGMDAtXFx1REY1Nl18XFx1RDgzNVtcXHVERUMxXFx1REVEQlxcdURFRkJcXHVERjE1XFx1REYzNVxcdURGNEZcXHVERjZGXFx1REY4OVxcdURGQTlcXHVERkMzXXxcXHVEODM2W1xcdURDMDAtXFx1RERGRlxcdURFMzctXFx1REUzQVxcdURFNkQtXFx1REU3NFxcdURFNzYtXFx1REU4M1xcdURFODVcXHVERTg2XXxcXHVEODM4W1xcdURENEZcXHVERUZGXXxcXHVEODNCW1xcdURDQUNcXHVEQ0IwXFx1REQyRVxcdURFRjBcXHVERUYxXXxcXHVEODNDW1xcdURDMDAtXFx1REMyQlxcdURDMzAtXFx1REM5M1xcdURDQTAtXFx1RENBRVxcdURDQjEtXFx1RENCRlxcdURDQzEtXFx1RENDRlxcdURDRDEtXFx1RENGNVxcdUREMEQtXFx1RERBRFxcdURERTYtXFx1REUwMlxcdURFMTAtXFx1REUzQlxcdURFNDAtXFx1REU0OFxcdURFNTBcXHVERTUxXFx1REU2MC1cXHVERTY1XFx1REYwMC1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1REVEN1xcdURFREMtXFx1REVFQ1xcdURFRjAtXFx1REVGQ1xcdURGMDAtXFx1REY3NlxcdURGN0ItXFx1REZEOVxcdURGRTAtXFx1REZFQlxcdURGRjBdfFxcdUQ4M0VbXFx1REMwMC1cXHVEQzBCXFx1REMxMC1cXHVEQzQ3XFx1REM1MC1cXHVEQzU5XFx1REM2MC1cXHVEQzg3XFx1REM5MC1cXHVEQ0FEXFx1RENCMFxcdURDQjFcXHVERDAwLVxcdURFNTNcXHVERTYwLVxcdURFNkRcXHVERTcwLVxcdURFN0NcXHVERTgwLVxcdURFODhcXHVERTkwLVxcdURFQkRcXHVERUJGLVxcdURFQzVcXHVERUNFLVxcdURFREJcXHVERUUwLVxcdURFRThcXHVERUYwLVxcdURFRjhcXHVERjAwLVxcdURGOTJcXHVERjk0LVxcdURGQ0FdLyIsImV4cG9ydCBkZWZhdWx0IC9bXFwwLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vIiwiZXhwb3J0IGRlZmF1bHQgL1tcXDAtXFx4MUZcXHg3Ri1cXHg5Rl0vIiwiZXhwb3J0IGRlZmF1bHQgL1tcXHhBRFxcdTA2MDAtXFx1MDYwNVxcdTA2MUNcXHUwNkREXFx1MDcwRlxcdTA4OTBcXHUwODkxXFx1MDhFMlxcdTE4MEVcXHUyMDBCLVxcdTIwMEZcXHUyMDJBLVxcdTIwMkVcXHUyMDYwLVxcdTIwNjRcXHUyMDY2LVxcdTIwNkZcXHVGRUZGXFx1RkZGOS1cXHVGRkZCXXxcXHVEODA0W1xcdURDQkRcXHVEQ0NEXXxcXHVEODBEW1xcdURDMzAtXFx1REMzRl18XFx1RDgyRltcXHVEQ0EwLVxcdURDQTNdfFxcdUQ4MzRbXFx1REQ3My1cXHVERDdBXXxcXHVEQjQwW1xcdURDMDFcXHVEQzIwLVxcdURDN0ZdLyIsImV4cG9ydCBkZWZhdWx0IC9bIFxceEEwXFx1MTY4MFxcdTIwMDAtXFx1MjAwQVxcdTIwMjhcXHUyMDI5XFx1MjAyRlxcdTIwNUZcXHUzMDAwXS8iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIi8vIFV0aWxpdGllc1xuLy9cblxuaW1wb3J0ICogYXMgbWR1cmwgZnJvbSAnbWR1cmwnXG5pbXBvcnQgKiBhcyB1Y21pY3JvIGZyb20gJ3VjLm1pY3JvJ1xuaW1wb3J0IHsgZGVjb2RlSFRNTCB9IGZyb20gJ2VudGl0aWVzJ1xuXG5mdW5jdGlvbiBfY2xhc3MgKG9iaikgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgfVxuXG5mdW5jdGlvbiBpc1N0cmluZyAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScgfVxuXG5jb25zdCBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIGhhcyAob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxufVxuXG4vLyBNZXJnZSBvYmplY3RzXG4vL1xuZnVuY3Rpb24gYXNzaWduIChvYmogLyogZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uICovKSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG5cbiAgc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICBpZiAoIXNvdXJjZSkgeyByZXR1cm4gfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG9iamVjdCcpXG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIG9ialtrZXldID0gc291cmNlW2tleV1cbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBvYmpcbn1cblxuLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBhcnJheSBhbmQgcHV0IGFub3RoZXIgYXJyYXkgYXQgdGhvc2UgcG9zaXRpb24uXG4vLyBVc2VmdWwgZm9yIHNvbWUgb3BlcmF0aW9ucyB3aXRoIHRva2Vuc1xuZnVuY3Rpb24gYXJyYXlSZXBsYWNlQXQgKHNyYywgcG9zLCBuZXdFbGVtZW50cykge1xuICByZXR1cm4gW10uY29uY2F0KHNyYy5zbGljZSgwLCBwb3MpLCBuZXdFbGVtZW50cywgc3JjLnNsaWNlKHBvcyArIDEpKVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRW50aXR5Q29kZSAoYykge1xuICAvKiBlc2xpbnQgbm8tYml0d2lzZTowICovXG4gIC8vIGJyb2tlbiBzZXF1ZW5jZVxuICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gbmV2ZXIgdXNlZFxuICBpZiAoYyA+PSAweEZERDAgJiYgYyA8PSAweEZERUYpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKChjICYgMHhGRkZGKSA9PT0gMHhGRkZGIHx8IChjICYgMHhGRkZGKSA9PT0gMHhGRkZFKSB7IHJldHVybiBmYWxzZSB9XG4gIC8vIGNvbnRyb2wgY29kZXNcbiAgaWYgKGMgPj0gMHgwMCAmJiBjIDw9IDB4MDgpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKGMgPT09IDB4MEIpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKGMgPj0gMHgwRSAmJiBjIDw9IDB4MUYpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKGMgPj0gMHg3RiAmJiBjIDw9IDB4OUYpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gb3V0IG9mIHJhbmdlXG4gIGlmIChjID4gMHgxMEZGRkYpIHsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gZnJvbUNvZGVQb2ludCAoYykge1xuICAvKiBlc2xpbnQgbm8tYml0d2lzZTowICovXG4gIGlmIChjID4gMHhmZmZmKSB7XG4gICAgYyAtPSAweDEwMDAwXG4gICAgY29uc3Qgc3Vycm9nYXRlMSA9IDB4ZDgwMCArIChjID4+IDEwKVxuICAgIGNvbnN0IHN1cnJvZ2F0ZTIgPSAweGRjMDAgKyAoYyAmIDB4M2ZmKVxuXG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3Vycm9nYXRlMSwgc3Vycm9nYXRlMilcbiAgfVxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjKVxufVxuXG5jb25zdCBVTkVTQ0FQRV9NRF9SRSAgPSAvXFxcXChbIVwiIyQlJicoKSorLFxcLS4vOjs8PT4/QFtcXFxcXFxdXl9ge3x9fl0pL2dcbmNvbnN0IEVOVElUWV9SRSAgICAgICA9IC8mKFthLXojXVthLXowLTldezEsMzF9KTsvZ2lcbmNvbnN0IFVORVNDQVBFX0FMTF9SRSA9IG5ldyBSZWdFeHAoVU5FU0NBUEVfTURfUkUuc291cmNlICsgJ3wnICsgRU5USVRZX1JFLnNvdXJjZSwgJ2dpJylcblxuY29uc3QgRElHSVRBTF9FTlRJVFlfVEVTVF9SRSA9IC9eIygoPzp4W2EtZjAtOV17MSw4fXxbMC05XXsxLDh9KSkkL2lcblxuZnVuY3Rpb24gcmVwbGFjZUVudGl0eVBhdHRlcm4gKG1hdGNoLCBuYW1lKSB7XG4gIGlmIChuYW1lLmNoYXJDb2RlQXQoMCkgPT09IDB4MjMvKiAjICovICYmIERJR0lUQUxfRU5USVRZX1RFU1RfUkUudGVzdChuYW1lKSkge1xuICAgIGNvbnN0IGNvZGUgPSBuYW1lWzFdLnRvTG93ZXJDYXNlKCkgPT09ICd4J1xuICAgICAgPyBwYXJzZUludChuYW1lLnNsaWNlKDIpLCAxNilcbiAgICAgIDogcGFyc2VJbnQobmFtZS5zbGljZSgxKSwgMTApXG5cbiAgICBpZiAoaXNWYWxpZEVudGl0eUNvZGUoY29kZSkpIHtcbiAgICAgIHJldHVybiBmcm9tQ29kZVBvaW50KGNvZGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cblxuICBjb25zdCBkZWNvZGVkID0gZGVjb2RlSFRNTChtYXRjaClcbiAgaWYgKGRlY29kZWQgIT09IG1hdGNoKSB7XG4gICAgcmV0dXJuIGRlY29kZWRcbiAgfVxuXG4gIHJldHVybiBtYXRjaFxufVxuXG4vKiBmdW5jdGlvbiByZXBsYWNlRW50aXRpZXMoc3RyKSB7XG4gIGlmIChzdHIuaW5kZXhPZignJicpIDwgMCkgeyByZXR1cm4gc3RyOyB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKEVOVElUWV9SRSwgcmVwbGFjZUVudGl0eVBhdHRlcm4pO1xufSAqL1xuXG5mdW5jdGlvbiB1bmVzY2FwZU1kIChzdHIpIHtcbiAgaWYgKHN0ci5pbmRleE9mKCdcXFxcJykgPCAwKSB7IHJldHVybiBzdHIgfVxuICByZXR1cm4gc3RyLnJlcGxhY2UoVU5FU0NBUEVfTURfUkUsICckMScpXG59XG5cbmZ1bmN0aW9uIHVuZXNjYXBlQWxsIChzdHIpIHtcbiAgaWYgKHN0ci5pbmRleE9mKCdcXFxcJykgPCAwICYmIHN0ci5pbmRleE9mKCcmJykgPCAwKSB7IHJldHVybiBzdHIgfVxuXG4gIHJldHVybiBzdHIucmVwbGFjZShVTkVTQ0FQRV9BTExfUkUsIGZ1bmN0aW9uIChtYXRjaCwgZXNjYXBlZCwgZW50aXR5KSB7XG4gICAgaWYgKGVzY2FwZWQpIHsgcmV0dXJuIGVzY2FwZWQgfVxuICAgIHJldHVybiByZXBsYWNlRW50aXR5UGF0dGVybihtYXRjaCwgZW50aXR5KVxuICB9KVxufVxuXG5jb25zdCBIVE1MX0VTQ0FQRV9URVNUX1JFID0gL1smPD5cIl0vXG5jb25zdCBIVE1MX0VTQ0FQRV9SRVBMQUNFX1JFID0gL1smPD5cIl0vZ1xuY29uc3QgSFRNTF9SRVBMQUNFTUVOVFMgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7J1xufVxuXG5mdW5jdGlvbiByZXBsYWNlVW5zYWZlQ2hhciAoY2gpIHtcbiAgcmV0dXJuIEhUTUxfUkVQTEFDRU1FTlRTW2NoXVxufVxuXG5mdW5jdGlvbiBlc2NhcGVIdG1sIChzdHIpIHtcbiAgaWYgKEhUTUxfRVNDQVBFX1RFU1RfUkUudGVzdChzdHIpKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKEhUTUxfRVNDQVBFX1JFUExBQ0VfUkUsIHJlcGxhY2VVbnNhZmVDaGFyKVxuICB9XG4gIHJldHVybiBzdHJcbn1cblxuY29uc3QgUkVHRVhQX0VTQ0FQRV9SRSA9IC9bLj8qK14kW1xcXVxcXFwoKXt9fC1dL2dcblxuZnVuY3Rpb24gZXNjYXBlUkUgKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoUkVHRVhQX0VTQ0FQRV9SRSwgJ1xcXFwkJicpXG59XG5cbmZ1bmN0aW9uIGlzU3BhY2UgKGNvZGUpIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAweDA5OlxuICAgIGNhc2UgMHgyMDpcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIFpzICh1bmljb2RlIGNsYXNzKSB8fCBbXFx0XFxmXFx2XFxyXFxuXVxuZnVuY3Rpb24gaXNXaGl0ZVNwYWNlIChjb2RlKSB7XG4gIGlmIChjb2RlID49IDB4MjAwMCAmJiBjb2RlIDw9IDB4MjAwQSkgeyByZXR1cm4gdHJ1ZSB9XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgMHgwOTogLy8gXFx0XG4gICAgY2FzZSAweDBBOiAvLyBcXG5cbiAgICBjYXNlIDB4MEI6IC8vIFxcdlxuICAgIGNhc2UgMHgwQzogLy8gXFxmXG4gICAgY2FzZSAweDBEOiAvLyBcXHJcbiAgICBjYXNlIDB4MjA6XG4gICAgY2FzZSAweEEwOlxuICAgIGNhc2UgMHgxNjgwOlxuICAgIGNhc2UgMHgyMDJGOlxuICAgIGNhc2UgMHgyMDVGOlxuICAgIGNhc2UgMHgzMDAwOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG4vLyBDdXJyZW50bHkgd2l0aG91dCBhc3RyYWwgY2hhcmFjdGVycyBzdXBwb3J0LlxuZnVuY3Rpb24gaXNQdW5jdENoYXIgKGNoKSB7XG4gIHJldHVybiB1Y21pY3JvLlAudGVzdChjaCkgfHwgdWNtaWNyby5TLnRlc3QoY2gpXG59XG5cbi8vIE1hcmtkb3duIEFTQ0lJIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMuXG4vL1xuLy8gISwgXCIsICMsICQsICUsICYsICcsICgsICksICosICssICwsIC0sIC4sIC8sIDosIDssIDwsID0sID4sID8sIEAsIFssIFxcLCBdLCBeLCBfLCBgLCB7LCB8LCB9LCBvciB+XG4vLyBodHRwOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjE1LyNhc2NpaS1wdW5jdHVhdGlvbi1jaGFyYWN0ZXJcbi8vXG4vLyBEb24ndCBjb25mdXNlIHdpdGggdW5pY29kZSBwdW5jdHVhdGlvbiAhISEgSXQgbGFja3Mgc29tZSBjaGFycyBpbiBhc2NpaSByYW5nZS5cbi8vXG5mdW5jdGlvbiBpc01kQXNjaWlQdW5jdCAoY2gpIHtcbiAgc3dpdGNoIChjaCkge1xuICAgIGNhc2UgMHgyMS8qICEgKi86XG4gICAgY2FzZSAweDIyLyogXCIgKi86XG4gICAgY2FzZSAweDIzLyogIyAqLzpcbiAgICBjYXNlIDB4MjQvKiAkICovOlxuICAgIGNhc2UgMHgyNS8qICUgKi86XG4gICAgY2FzZSAweDI2LyogJiAqLzpcbiAgICBjYXNlIDB4MjcvKiAnICovOlxuICAgIGNhc2UgMHgyOC8qICggKi86XG4gICAgY2FzZSAweDI5LyogKSAqLzpcbiAgICBjYXNlIDB4MkEvKiAqICovOlxuICAgIGNhc2UgMHgyQi8qICsgKi86XG4gICAgY2FzZSAweDJDLyogLCAqLzpcbiAgICBjYXNlIDB4MkQvKiAtICovOlxuICAgIGNhc2UgMHgyRS8qIC4gKi86XG4gICAgY2FzZSAweDJGLyogLyAqLzpcbiAgICBjYXNlIDB4M0EvKiA6ICovOlxuICAgIGNhc2UgMHgzQi8qIDsgKi86XG4gICAgY2FzZSAweDNDLyogPCAqLzpcbiAgICBjYXNlIDB4M0QvKiA9ICovOlxuICAgIGNhc2UgMHgzRS8qID4gKi86XG4gICAgY2FzZSAweDNGLyogPyAqLzpcbiAgICBjYXNlIDB4NDAvKiBAICovOlxuICAgIGNhc2UgMHg1Qi8qIFsgKi86XG4gICAgY2FzZSAweDVDLyogXFwgKi86XG4gICAgY2FzZSAweDVELyogXSAqLzpcbiAgICBjYXNlIDB4NUUvKiBeICovOlxuICAgIGNhc2UgMHg1Ri8qIF8gKi86XG4gICAgY2FzZSAweDYwLyogYCAqLzpcbiAgICBjYXNlIDB4N0IvKiB7ICovOlxuICAgIGNhc2UgMHg3Qy8qIHwgKi86XG4gICAgY2FzZSAweDdELyogfSAqLzpcbiAgICBjYXNlIDB4N0UvKiB+ICovOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLy8gSGVwbGVyIHRvIHVuaWZ5IFtyZWZlcmVuY2UgbGFiZWxzXS5cbi8vXG5mdW5jdGlvbiBub3JtYWxpemVSZWZlcmVuY2UgKHN0cikge1xuICAvLyBUcmltIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG4gIC8vXG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpXG5cbiAgLy8gSW4gbm9kZSB2MTAgJ+G6nicudG9Mb3dlckNhc2UoKSA9PT0gJ+G5vicsIHdoaWNoIGlzIHByZXN1bWVkIHRvIGJlIGEgYnVnXG4gIC8vIGZpeGVkIGluIHYxMiAoY291bGRuJ3QgZmluZCBhbnkgZGV0YWlscykuXG4gIC8vXG4gIC8vIFNvIHRyZWF0IHRoaXMgb25lIGFzIGEgc3BlY2lhbCBjYXNlXG4gIC8vIChyZW1vdmUgdGhpcyB3aGVuIG5vZGUgdjEwIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpLlxuICAvL1xuICBpZiAoJ+G6nicudG9Mb3dlckNhc2UoKSA9PT0gJ+G5vicpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgv4bqeL2csICfDnycpXG4gIH1cblxuICAvLyAudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpIHNob3VsZCBnZXQgcmlkIG9mIGFsbCBkaWZmZXJlbmNlc1xuICAvLyBiZXR3ZWVuIGxldHRlciB2YXJpYW50cy5cbiAgLy9cbiAgLy8gU2ltcGxlIC50b0xvd2VyQ2FzZSgpIGRvZXNuJ3Qgbm9ybWFsaXplIDEyNSBjb2RlIHBvaW50cyBjb3JyZWN0bHksXG4gIC8vIGFuZCAudG9VcHBlckNhc2UgZG9lc24ndCBub3JtYWxpemUgNiBvZiB0aGVtIChsaXN0IG9mIGV4Y2VwdGlvbnM6XG4gIC8vIMSwLCDPtCwg4bqeLCDihKYsIOKEqiwg4oSrIC0gdGhvc2UgYXJlIGFscmVhZHkgdXBwZXJjYXNlZCwgYnV0IGhhdmUgZGlmZmVyZW50bHlcbiAgLy8gdXBwZXJjYXNlZCB2ZXJzaW9ucykuXG4gIC8vXG4gIC8vIEhlcmUncyBhbiBleGFtcGxlIHNob3dpbmcgaG93IGl0IGhhcHBlbnMuIExldHMgdGFrZSBncmVlayBsZXR0ZXIgb21lZ2E6XG4gIC8vIHVwcGVyY2FzZSBVKzAzOTggKM6YKSwgVSswM2Y0ICjPtCkgYW5kIGxvd2VyY2FzZSBVKzAzYjggKM64KSwgVSswM2QxICjPkSlcbiAgLy9cbiAgLy8gVW5pY29kZSBlbnRyaWVzOlxuICAvLyAwMzk4O0dSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBO0x1OzA7TDs7Ozs7Tjs7OzswM0I4O1xuICAvLyAwM0I4O0dSRUVLIFNNQUxMIExFVFRFUiBUSEVUQTtMbDswO0w7Ozs7O047OzswMzk4OzswMzk4XG4gIC8vIDAzRDE7R1JFRUsgVEhFVEEgU1lNQk9MO0xsOzA7TDs8Y29tcGF0PiAwM0I4Ozs7O047R1JFRUsgU01BTEwgTEVUVEVSIFNDUklQVCBUSEVUQTs7MDM5ODs7MDM5OFxuICAvLyAwM0Y0O0dSRUVLIENBUElUQUwgVEhFVEEgU1lNQk9MO0x1OzA7TDs8Y29tcGF0PiAwMzk4Ozs7O047Ozs7MDNCODtcbiAgLy9cbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uIHNob3VsZCB0cmVhdCBhbGwgb2YgdGhlbSBhcyBlcXVpdmFsZW50LlxuICAvL1xuICAvLyBCdXQgLnRvTG93ZXJDYXNlKCkgZG9lc24ndCBjaGFuZ2Ugz5EgKGl0J3MgYWxyZWFkeSBsb3dlcmNhc2UpLFxuICAvLyBhbmQgLnRvVXBwZXJDYXNlKCkgZG9lc24ndCBjaGFuZ2Ugz7QgKGFscmVhZHkgdXBwZXJjYXNlKS5cbiAgLy9cbiAgLy8gQXBwbHlpbmcgZmlyc3QgbG93ZXIgdGhlbiB1cHBlciBjYXNlIG5vcm1hbGl6ZXMgYW55IGNoYXJhY3RlcjpcbiAgLy8gJ1xcdTAzOThcXHUwM2Y0XFx1MDNiOFxcdTAzZDEnLnRvTG93ZXJDYXNlKCkudG9VcHBlckNhc2UoKSA9PT0gJ1xcdTAzOThcXHUwMzk4XFx1MDM5OFxcdTAzOTgnXG4gIC8vXG4gIC8vIE5vdGU6IHRoaXMgaXMgZXF1aXZhbGVudCB0byB1bmljb2RlIGNhc2UgZm9sZGluZzsgdW5pY29kZSBub3JtYWxpemF0aW9uXG4gIC8vIGlzIGEgZGlmZmVyZW50IHN0ZXAgdGhhdCBpcyBub3QgcmVxdWlyZWQgaGVyZS5cbiAgLy9cbiAgLy8gRmluYWwgcmVzdWx0IHNob3VsZCBiZSB1cHBlcmNhc2VkLCBiZWNhdXNlIGl0J3MgbGF0ZXIgc3RvcmVkIGluIGFuIG9iamVjdFxuICAvLyAodGhpcyBhdm9pZCBhIGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBtZW1iZXJzLFxuICAvLyBtb3N0IG5vdGFibHksIGBfX3Byb3RvX19gKVxuICAvL1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkudG9VcHBlckNhc2UoKVxufVxuXG4vLyBSZS1leHBvcnQgbGlicmFyaWVzIGNvbW1vbmx5IHVzZWQgaW4gYm90aCBtYXJrZG93bi1pdCBhbmQgaXRzIHBsdWdpbnMsXG4vLyBzbyBwbHVnaW5zIHdvbid0IGhhdmUgdG8gZGVwZW5kIG9uIHRoZW0gZXhwbGljaXRseSwgd2hpY2ggcmVkdWNlcyB0aGVpclxuLy8gYnVuZGxlZCBzaXplIChlLmcuIGEgYnJvd3NlciBidWlsZCkuXG4vL1xuY29uc3QgbGliID0geyBtZHVybCwgdWNtaWNybyB9XG5cbmV4cG9ydCB7XG4gIGxpYixcbiAgYXNzaWduLFxuICBpc1N0cmluZyxcbiAgaGFzLFxuICB1bmVzY2FwZU1kLFxuICB1bmVzY2FwZUFsbCxcbiAgaXNWYWxpZEVudGl0eUNvZGUsXG4gIGZyb21Db2RlUG9pbnQsXG4gIGVzY2FwZUh0bWwsXG4gIGFycmF5UmVwbGFjZUF0LFxuICBpc1NwYWNlLFxuICBpc1doaXRlU3BhY2UsXG4gIGlzTWRBc2NpaVB1bmN0LFxuICBpc1B1bmN0Q2hhcixcbiAgZXNjYXBlUkUsXG4gIG5vcm1hbGl6ZVJlZmVyZW5jZVxufVxuIiwiLy8gUGFyc2UgbGluayBsYWJlbFxuLy9cbi8vIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGZpcnN0IGNoYXJhY3RlciAoXCJbXCIpIGFscmVhZHkgbWF0Y2hlcztcbi8vIHJldHVybnMgdGhlIGVuZCBvZiB0aGUgbGFiZWxcbi8vXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlTGlua0xhYmVsIChzdGF0ZSwgc3RhcnQsIGRpc2FibGVOZXN0ZWQpIHtcbiAgbGV0IGxldmVsLCBmb3VuZCwgbWFya2VyLCBwcmV2UG9zXG5cbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG4gIGNvbnN0IG9sZFBvcyA9IHN0YXRlLnBvc1xuXG4gIHN0YXRlLnBvcyA9IHN0YXJ0ICsgMVxuICBsZXZlbCA9IDFcblxuICB3aGlsZSAoc3RhdGUucG9zIDwgbWF4KSB7XG4gICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKVxuICAgIGlmIChtYXJrZXIgPT09IDB4NUQgLyogXSAqLykge1xuICAgICAgbGV2ZWwtLVxuICAgICAgaWYgKGxldmVsID09PSAwKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHByZXZQb3MgPSBzdGF0ZS5wb3NcbiAgICBzdGF0ZS5tZC5pbmxpbmUuc2tpcFRva2VuKHN0YXRlKVxuICAgIGlmIChtYXJrZXIgPT09IDB4NUIgLyogWyAqLykge1xuICAgICAgaWYgKHByZXZQb3MgPT09IHN0YXRlLnBvcyAtIDEpIHtcbiAgICAgICAgLy8gaW5jcmVhc2UgbGV2ZWwgaWYgd2UgZmluZCB0ZXh0IGBbYCwgd2hpY2ggaXMgbm90IGEgcGFydCBvZiBhbnkgdG9rZW5cbiAgICAgICAgbGV2ZWwrK1xuICAgICAgfSBlbHNlIGlmIChkaXNhYmxlTmVzdGVkKSB7XG4gICAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbGFiZWxFbmQgPSAtMVxuXG4gIGlmIChmb3VuZCkge1xuICAgIGxhYmVsRW5kID0gc3RhdGUucG9zXG4gIH1cblxuICAvLyByZXN0b3JlIG9sZCBzdGF0ZVxuICBzdGF0ZS5wb3MgPSBvbGRQb3NcblxuICByZXR1cm4gbGFiZWxFbmRcbn1cbiIsIi8vIFBhcnNlIGxpbmsgZGVzdGluYXRpb25cbi8vXG5cbmltcG9ydCB7IHVuZXNjYXBlQWxsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VMaW5rRGVzdGluYXRpb24gKHN0ciwgc3RhcnQsIG1heCkge1xuICBsZXQgY29kZVxuICBsZXQgcG9zID0gc3RhcnRcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgb2s6IGZhbHNlLFxuICAgIHBvczogMCxcbiAgICBzdHI6ICcnXG4gIH1cblxuICBpZiAoc3RyLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgzQyAvKiA8ICovKSB7XG4gICAgcG9zKytcbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgICAgaWYgKGNvZGUgPT09IDB4MEEgLyogXFxuICovKSB7IHJldHVybiByZXN1bHQgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4M0MgLyogPCAqLykgeyByZXR1cm4gcmVzdWx0IH1cbiAgICAgIGlmIChjb2RlID09PSAweDNFIC8qID4gKi8pIHtcbiAgICAgICAgcmVzdWx0LnBvcyA9IHBvcyArIDFcbiAgICAgICAgcmVzdWx0LnN0ciA9IHVuZXNjYXBlQWxsKHN0ci5zbGljZShzdGFydCArIDEsIHBvcykpXG4gICAgICAgIHJlc3VsdC5vayA9IHRydWVcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4NUMgLyogXFwgKi8gJiYgcG9zICsgMSA8IG1heCkge1xuICAgICAgICBwb3MgKz0gMlxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBwb3MrK1xuICAgIH1cblxuICAgIC8vIG5vIGNsb3NpbmcgJz4nXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLy8gdGhpcyBzaG91bGQgYmUgLi4uIH0gZWxzZSB7IC4uLiBicmFuY2hcblxuICBsZXQgbGV2ZWwgPSAwXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKGNvZGUgPT09IDB4MjApIHsgYnJlYWsgfVxuXG4gICAgLy8gYXNjaWkgY29udHJvbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGNvZGUgPCAweDIwIHx8IGNvZGUgPT09IDB4N0YpIHsgYnJlYWsgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4NUMgLyogXFwgKi8gJiYgcG9zICsgMSA8IG1heCkge1xuICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KHBvcyArIDEpID09PSAweDIwKSB7IGJyZWFrIH1cbiAgICAgIHBvcyArPSAyXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSAweDI4IC8qICggKi8pIHtcbiAgICAgIGxldmVsKytcbiAgICAgIGlmIChsZXZlbCA+IDMyKSB7IHJldHVybiByZXN1bHQgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSAweDI5IC8qICkgKi8pIHtcbiAgICAgIGlmIChsZXZlbCA9PT0gMCkgeyBicmVhayB9XG4gICAgICBsZXZlbC0tXG4gICAgfVxuXG4gICAgcG9zKytcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gcG9zKSB7IHJldHVybiByZXN1bHQgfVxuICBpZiAobGV2ZWwgIT09IDApIHsgcmV0dXJuIHJlc3VsdCB9XG5cbiAgcmVzdWx0LnN0ciA9IHVuZXNjYXBlQWxsKHN0ci5zbGljZShzdGFydCwgcG9zKSlcbiAgcmVzdWx0LnBvcyA9IHBvc1xuICByZXN1bHQub2sgPSB0cnVlXG4gIHJldHVybiByZXN1bHRcbn1cbiIsIi8vIFBhcnNlIGxpbmsgdGl0bGVcbi8vXG5cbmltcG9ydCB7IHVuZXNjYXBlQWxsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuLy8gUGFyc2UgbGluayB0aXRsZSB3aXRoaW4gYHN0cmAgaW4gW3N0YXJ0LCBtYXhdIHJhbmdlLFxuLy8gb3IgY29udGludWUgcHJldmlvdXMgcGFyc2luZyBpZiBgcHJldl9zdGF0ZWAgaXMgZGVmaW5lZCAoZXF1YWwgdG8gcmVzdWx0IG9mIGxhc3QgZXhlY3V0aW9uKS5cbi8vXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUxpbmtUaXRsZSAoc3RyLCBzdGFydCwgbWF4LCBwcmV2X3N0YXRlKSB7XG4gIGxldCBjb2RlXG4gIGxldCBwb3MgPSBzdGFydFxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIC8vIGlmIGB0cnVlYCwgdGhpcyBpcyBhIHZhbGlkIGxpbmsgdGl0bGVcbiAgICBvazogZmFsc2UsXG4gICAgLy8gaWYgYHRydWVgLCB0aGlzIGxpbmsgY2FuIGJlIGNvbnRpbnVlZCBvbiB0aGUgbmV4dCBsaW5lXG4gICAgY2FuX2NvbnRpbnVlOiBmYWxzZSxcbiAgICAvLyBpZiBgb2tgLCBpdCdzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjbG9zaW5nIG1hcmtlclxuICAgIHBvczogMCxcbiAgICAvLyBpZiBgb2tgLCBpdCdzIHRoZSB1bmVzY2FwZWQgdGl0bGVcbiAgICBzdHI6ICcnLFxuICAgIC8vIGV4cGVjdGVkIGNsb3NpbmcgbWFya2VyIGNoYXJhY3RlciBjb2RlXG4gICAgbWFya2VyOiAwXG4gIH1cblxuICBpZiAocHJldl9zdGF0ZSkge1xuICAgIC8vIHRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgYSBwcmV2aW91cyBwYXJzZUxpbmtUaXRsZSBjYWxsIG9uIHRoZSBuZXh0IGxpbmUsXG4gICAgLy8gdXNlZCBpbiByZWZlcmVuY2UgbGlua3Mgb25seVxuICAgIHN0YXRlLnN0ciA9IHByZXZfc3RhdGUuc3RyXG4gICAgc3RhdGUubWFya2VyID0gcHJldl9zdGF0ZS5tYXJrZXJcbiAgfSBlbHNlIHtcbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gc3RhdGUgfVxuXG4gICAgbGV0IG1hcmtlciA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAobWFya2VyICE9PSAweDIyIC8qIFwiICovICYmIG1hcmtlciAhPT0gMHgyNyAvKiAnICovICYmIG1hcmtlciAhPT0gMHgyOCAvKiAoICovKSB7IHJldHVybiBzdGF0ZSB9XG5cbiAgICBzdGFydCsrXG4gICAgcG9zKytcblxuICAgIC8vIGlmIG9wZW5pbmcgbWFya2VyIGlzIFwiKFwiLCBzd2l0Y2ggaXQgdG8gY2xvc2luZyBtYXJrZXIgXCIpXCJcbiAgICBpZiAobWFya2VyID09PSAweDI4KSB7IG1hcmtlciA9IDB4MjkgfVxuXG4gICAgc3RhdGUubWFya2VyID0gbWFya2VyXG4gIH1cblxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoY29kZSA9PT0gc3RhdGUubWFya2VyKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBwb3MgKyAxXG4gICAgICBzdGF0ZS5zdHIgKz0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICAgICAgc3RhdGUub2sgPSB0cnVlXG4gICAgICByZXR1cm4gc3RhdGVcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjggLyogKCAqLyAmJiBzdGF0ZS5tYXJrZXIgPT09IDB4MjkgLyogKSAqLykge1xuICAgICAgcmV0dXJuIHN0YXRlXG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVDIC8qIFxcICovICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgcG9zKytcbiAgfVxuXG4gIC8vIG5vIGNsb3NpbmcgbWFya2VyIGZvdW5kLCBidXQgdGhpcyBsaW5rIHRpdGxlIG1heSBjb250aW51ZSBvbiB0aGUgbmV4dCBsaW5lIChmb3IgcmVmZXJlbmNlcylcbiAgc3RhdGUuY2FuX2NvbnRpbnVlID0gdHJ1ZVxuICBzdGF0ZS5zdHIgKz0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICByZXR1cm4gc3RhdGVcbn1cbiIsIi8qKlxuICogY2xhc3MgUmVuZGVyZXJcbiAqXG4gKiBHZW5lcmF0ZXMgSFRNTCBmcm9tIHBhcnNlZCB0b2tlbiBzdHJlYW0uIEVhY2ggaW5zdGFuY2UgaGFzIGluZGVwZW5kZW50XG4gKiBjb3B5IG9mIHJ1bGVzLiBUaG9zZSBjYW4gYmUgcmV3cml0dGVuIHdpdGggZWFzZS4gQWxzbywgeW91IGNhbiBhZGQgbmV3XG4gKiBydWxlcyBpZiB5b3UgY3JlYXRlIHBsdWdpbiBhbmQgYWRkcyBuZXcgdG9rZW4gdHlwZXMuXG4gKiovXG5cbmltcG9ydCB7IGFzc2lnbiwgdW5lc2NhcGVBbGwsIGVzY2FwZUh0bWwgfSBmcm9tICcuL2NvbW1vbi91dGlscy5tanMnXG5cbmNvbnN0IGRlZmF1bHRfcnVsZXMgPSB7fVxuXG5kZWZhdWx0X3J1bGVzLmNvZGVfaW5saW5lID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG5cbiAgcmV0dXJuICAnPGNvZGUnICsgc2xmLnJlbmRlckF0dHJzKHRva2VuKSArICc+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbCh0b2tlbi5jb250ZW50KSArXG4gICAgICAgICAgJzwvY29kZT4nXG59XG5cbmRlZmF1bHRfcnVsZXMuY29kZV9ibG9jayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzbGYpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuXG4gIHJldHVybiAgJzxwcmUnICsgc2xmLnJlbmRlckF0dHJzKHRva2VuKSArICc+PGNvZGU+JyArXG4gICAgICAgICAgZXNjYXBlSHRtbCh0b2tlbnNbaWR4XS5jb250ZW50KSArXG4gICAgICAgICAgJzwvY29kZT48L3ByZT5cXG4nXG59XG5cbmRlZmF1bHRfcnVsZXMuZmVuY2UgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2xmKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cbiAgY29uc3QgaW5mbyA9IHRva2VuLmluZm8gPyB1bmVzY2FwZUFsbCh0b2tlbi5pbmZvKS50cmltKCkgOiAnJ1xuICBsZXQgbGFuZ05hbWUgPSAnJ1xuICBsZXQgbGFuZ0F0dHJzID0gJydcblxuICBpZiAoaW5mbykge1xuICAgIGNvbnN0IGFyciA9IGluZm8uc3BsaXQoLyhcXHMrKS9nKVxuICAgIGxhbmdOYW1lID0gYXJyWzBdXG4gICAgbGFuZ0F0dHJzID0gYXJyLnNsaWNlKDIpLmpvaW4oJycpXG4gIH1cblxuICBsZXQgaGlnaGxpZ2h0ZWRcbiAgaWYgKG9wdGlvbnMuaGlnaGxpZ2h0KSB7XG4gICAgaGlnaGxpZ2h0ZWQgPSBvcHRpb25zLmhpZ2hsaWdodCh0b2tlbi5jb250ZW50LCBsYW5nTmFtZSwgbGFuZ0F0dHJzKSB8fCBlc2NhcGVIdG1sKHRva2VuLmNvbnRlbnQpXG4gIH0gZWxzZSB7XG4gICAgaGlnaGxpZ2h0ZWQgPSBlc2NhcGVIdG1sKHRva2VuLmNvbnRlbnQpXG4gIH1cblxuICBpZiAoaGlnaGxpZ2h0ZWQuaW5kZXhPZignPHByZScpID09PSAwKSB7XG4gICAgcmV0dXJuIGhpZ2hsaWdodGVkICsgJ1xcbidcbiAgfVxuXG4gIC8vIElmIGxhbmd1YWdlIGV4aXN0cywgaW5qZWN0IGNsYXNzIGdlbnRseSwgd2l0aG91dCBtb2RpZnlpbmcgb3JpZ2luYWwgdG9rZW4uXG4gIC8vIE1heSBiZSwgb25lIGRheSB3ZSB3aWxsIGFkZCAuZGVlcENsb25lKCkgZm9yIHRva2VuIGFuZCBzaW1wbGlmeSB0aGlzIHBhcnQsIGJ1dFxuICAvLyBub3cgd2UgcHJlZmVyIHRvIGtlZXAgdGhpbmdzIGxvY2FsLlxuICBpZiAoaW5mbykge1xuICAgIGNvbnN0IGkgPSB0b2tlbi5hdHRySW5kZXgoJ2NsYXNzJylcbiAgICBjb25zdCB0bXBBdHRycyA9IHRva2VuLmF0dHJzID8gdG9rZW4uYXR0cnMuc2xpY2UoKSA6IFtdXG5cbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRtcEF0dHJzLnB1c2goWydjbGFzcycsIG9wdGlvbnMubGFuZ1ByZWZpeCArIGxhbmdOYW1lXSlcbiAgICB9IGVsc2Uge1xuICAgICAgdG1wQXR0cnNbaV0gPSB0bXBBdHRyc1tpXS5zbGljZSgpXG4gICAgICB0bXBBdHRyc1tpXVsxXSArPSAnICcgKyBvcHRpb25zLmxhbmdQcmVmaXggKyBsYW5nTmFtZVxuICAgIH1cblxuICAgIC8vIEZha2UgdG9rZW4ganVzdCB0byByZW5kZXIgYXR0cmlidXRlc1xuICAgIGNvbnN0IHRtcFRva2VuID0ge1xuICAgICAgYXR0cnM6IHRtcEF0dHJzXG4gICAgfVxuXG4gICAgcmV0dXJuIGA8cHJlPjxjb2RlJHtzbGYucmVuZGVyQXR0cnModG1wVG9rZW4pfT4ke2hpZ2hsaWdodGVkfTwvY29kZT48L3ByZT5cXG5gXG4gIH1cblxuICByZXR1cm4gYDxwcmU+PGNvZGUke3NsZi5yZW5kZXJBdHRycyh0b2tlbil9PiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPlxcbmBcbn1cblxuZGVmYXVsdF9ydWxlcy5pbWFnZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzbGYpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuXG4gIC8vIFwiYWx0XCIgYXR0ciBNVVNUIGJlIHNldCwgZXZlbiBpZiBlbXB0eS4gQmVjYXVzZSBpdCdzIG1hbmRhdG9yeSBhbmRcbiAgLy8gc2hvdWxkIGJlIHBsYWNlZCBvbiBwcm9wZXIgcG9zaXRpb24gZm9yIHRlc3RzLlxuICAvL1xuICAvLyBSZXBsYWNlIGNvbnRlbnQgd2l0aCBhY3R1YWwgdmFsdWVcblxuICB0b2tlbi5hdHRyc1t0b2tlbi5hdHRySW5kZXgoJ2FsdCcpXVsxXSA9XG4gICAgc2xmLnJlbmRlcklubGluZUFzVGV4dCh0b2tlbi5jaGlsZHJlbiwgb3B0aW9ucywgZW52KVxuXG4gIHJldHVybiBzbGYucmVuZGVyVG9rZW4odG9rZW5zLCBpZHgsIG9wdGlvbnMpXG59XG5cbmRlZmF1bHRfcnVsZXMuaGFyZGJyZWFrID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zIC8qLCBlbnYgKi8pIHtcbiAgcmV0dXJuIG9wdGlvbnMueGh0bWxPdXQgPyAnPGJyIC8+XFxuJyA6ICc8YnI+XFxuJ1xufVxuZGVmYXVsdF9ydWxlcy5zb2Z0YnJlYWsgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMgLyosIGVudiAqLykge1xuICByZXR1cm4gb3B0aW9ucy5icmVha3MgPyAob3B0aW9ucy54aHRtbE91dCA/ICc8YnIgLz5cXG4nIDogJzxicj5cXG4nKSA6ICdcXG4nXG59XG5cbmRlZmF1bHRfcnVsZXMudGV4dCA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmNvbnRlbnQpXG59XG5cbmRlZmF1bHRfcnVsZXMuaHRtbF9ibG9jayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiB0b2tlbnNbaWR4XS5jb250ZW50XG59XG5kZWZhdWx0X3J1bGVzLmh0bWxfaW5saW5lID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuIHRva2Vuc1tpZHhdLmNvbnRlbnRcbn1cblxuLyoqXG4gKiBuZXcgUmVuZGVyZXIoKVxuICpcbiAqIENyZWF0ZXMgbmV3IFtbUmVuZGVyZXJdXSBpbnN0YW5jZSBhbmQgZmlsbCBbW1JlbmRlcmVyI3J1bGVzXV0gd2l0aCBkZWZhdWx0cy5cbiAqKi9cbmZ1bmN0aW9uIFJlbmRlcmVyICgpIHtcbiAgLyoqXG4gICAqIFJlbmRlcmVyI3J1bGVzIC0+IE9iamVjdFxuICAgKlxuICAgKiBDb250YWlucyByZW5kZXIgcnVsZXMgZm9yIHRva2Vucy4gQ2FuIGJlIHVwZGF0ZWQgYW5kIGV4dGVuZGVkLlxuICAgKlxuICAgKiAjIyMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICAgKlxuICAgKiBtZC5yZW5kZXJlci5ydWxlcy5zdHJvbmdfb3BlbiAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnPGI+JzsgfTtcbiAgICogbWQucmVuZGVyZXIucnVsZXMuc3Ryb25nX2Nsb3NlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJzwvYj4nOyB9O1xuICAgKlxuICAgKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVySW5saW5lKC4uLik7XG4gICAqIGBgYFxuICAgKlxuICAgKiBFYWNoIHJ1bGUgaXMgY2FsbGVkIGFzIGluZGVwZW5kZW50IHN0YXRpYyBmdW5jdGlvbiB3aXRoIGZpeGVkIHNpZ25hdHVyZTpcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBmdW5jdGlvbiBteV90b2tlbl9yZW5kZXIodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgcmVuZGVyZXIpIHtcbiAgICogICAvLyAuLi5cbiAgICogICByZXR1cm4gcmVuZGVyZWRIVE1MO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUgW3NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3JlbmRlcmVyLm1qcylcbiAgICogZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMuXG4gICAqKi9cbiAgdGhpcy5ydWxlcyA9IGFzc2lnbih7fSwgZGVmYXVsdF9ydWxlcylcbn1cblxuLyoqXG4gKiBSZW5kZXJlci5yZW5kZXJBdHRycyh0b2tlbikgLT4gU3RyaW5nXG4gKlxuICogUmVuZGVyIHRva2VuIGF0dHJpYnV0ZXMgdG8gc3RyaW5nLlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlckF0dHJzID0gZnVuY3Rpb24gcmVuZGVyQXR0cnMgKHRva2VuKSB7XG4gIGxldCBpLCBsLCByZXN1bHRcblxuICBpZiAoIXRva2VuLmF0dHJzKSB7IHJldHVybiAnJyB9XG5cbiAgcmVzdWx0ID0gJydcblxuICBmb3IgKGkgPSAwLCBsID0gdG9rZW4uYXR0cnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgcmVzdWx0ICs9ICcgJyArIGVzY2FwZUh0bWwodG9rZW4uYXR0cnNbaV1bMF0pICsgJz1cIicgKyBlc2NhcGVIdG1sKHRva2VuLmF0dHJzW2ldWzFdKSArICdcIidcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZW5kZXJlci5yZW5kZXJUb2tlbih0b2tlbnMsIGlkeCwgb3B0aW9ucykgLT4gU3RyaW5nXG4gKiAtIHRva2VucyAoQXJyYXkpOiBsaXN0IG9mIHRva2Vuc1xuICogLSBpZHggKE51bWJlZCk6IHRva2VuIGluZGV4IHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKlxuICogRGVmYXVsdCB0b2tlbiByZW5kZXJlci4gQ2FuIGJlIG92ZXJyaWRlbiBieSBjdXN0b20gZnVuY3Rpb25cbiAqIGluIFtbUmVuZGVyZXIjcnVsZXNdXS5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJUb2tlbiA9IGZ1bmN0aW9uIHJlbmRlclRva2VuICh0b2tlbnMsIGlkeCwgb3B0aW9ucykge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG4gIGxldCByZXN1bHQgPSAnJ1xuXG4gIC8vIFRpZ2h0IGxpc3QgcGFyYWdyYXBoc1xuICBpZiAodG9rZW4uaGlkZGVuKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBJbnNlcnQgYSBuZXdsaW5lIGJldHdlZW4gaGlkZGVuIHBhcmFncmFwaCBhbmQgc3Vic2VxdWVudCBvcGVuaW5nXG4gIC8vIGJsb2NrLWxldmVsIHRhZy5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGhlcmUgd2Ugc2hvdWxkIGluc2VydCBhIG5ld2xpbmUgYmVmb3JlIGJsb2NrcXVvdGU6XG4gIC8vICAtIGFcbiAgLy8gICAgPlxuICAvL1xuICBpZiAodG9rZW4uYmxvY2sgJiYgdG9rZW4ubmVzdGluZyAhPT0gLTEgJiYgaWR4ICYmIHRva2Vuc1tpZHggLSAxXS5oaWRkZW4pIHtcbiAgICByZXN1bHQgKz0gJ1xcbidcbiAgfVxuXG4gIC8vIEFkZCB0b2tlbiBuYW1lLCBlLmcuIGA8aW1nYFxuICByZXN1bHQgKz0gKHRva2VuLm5lc3RpbmcgPT09IC0xID8gJzwvJyA6ICc8JykgKyB0b2tlbi50YWdcblxuICAvLyBFbmNvZGUgYXR0cmlidXRlcywgZS5nLiBgPGltZyBzcmM9XCJmb29cImBcbiAgcmVzdWx0ICs9IHRoaXMucmVuZGVyQXR0cnModG9rZW4pXG5cbiAgLy8gQWRkIGEgc2xhc2ggZm9yIHNlbGYtY2xvc2luZyB0YWdzLCBlLmcuIGA8aW1nIHNyYz1cImZvb1wiIC9gXG4gIGlmICh0b2tlbi5uZXN0aW5nID09PSAwICYmIG9wdGlvbnMueGh0bWxPdXQpIHtcbiAgICByZXN1bHQgKz0gJyAvJ1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBhZGQgYSBuZXdsaW5lIGFmdGVyIHRoaXMgdGFnXG4gIGxldCBuZWVkTGYgPSBmYWxzZVxuICBpZiAodG9rZW4uYmxvY2spIHtcbiAgICBuZWVkTGYgPSB0cnVlXG5cbiAgICBpZiAodG9rZW4ubmVzdGluZyA9PT0gMSkge1xuICAgICAgaWYgKGlkeCArIDEgPCB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5leHRUb2tlbiA9IHRva2Vuc1tpZHggKyAxXVxuXG4gICAgICAgIGlmIChuZXh0VG9rZW4udHlwZSA9PT0gJ2lubGluZScgfHwgbmV4dFRva2VuLmhpZGRlbikge1xuICAgICAgICAgIC8vIEJsb2NrLWxldmVsIHRhZyBjb250YWluaW5nIGFuIGlubGluZSB0YWcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBuZWVkTGYgPSBmYWxzZVxuICAgICAgICB9IGVsc2UgaWYgKG5leHRUb2tlbi5uZXN0aW5nID09PSAtMSAmJiBuZXh0VG9rZW4udGFnID09PSB0b2tlbi50YWcpIHtcbiAgICAgICAgICAvLyBPcGVuaW5nIHRhZyArIGNsb3NpbmcgdGFnIG9mIHRoZSBzYW1lIHR5cGUuIEUuZy4gYDxsaT48L2xpPmAuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBuZWVkTGYgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzdWx0ICs9IG5lZWRMZiA/ICc+XFxuJyA6ICc+J1xuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZW5kZXJlci5yZW5kZXJJbmxpbmUodG9rZW5zLCBvcHRpb25zLCBlbnYpIC0+IFN0cmluZ1xuICogLSB0b2tlbnMgKEFycmF5KTogbGlzdCBvbiBibG9jayB0b2tlbnMgdG8gcmVuZGVyXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHBhcmFtcyBvZiBwYXJzZXIgaW5zdGFuY2VcbiAqIC0gZW52IChPYmplY3QpOiBhZGRpdGlvbmFsIGRhdGEgZnJvbSBwYXJzZWQgaW5wdXQgKHJlZmVyZW5jZXMsIGZvciBleGFtcGxlKVxuICpcbiAqIFRoZSBzYW1lIGFzIFtbUmVuZGVyZXIucmVuZGVyXV0sIGJ1dCBmb3Igc2luZ2xlIHRva2VuIG9mIGBpbmxpbmVgIHR5cGUuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVySW5saW5lID0gZnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucywgZW52KSB7XG4gIGxldCByZXN1bHQgPSAnJ1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXNcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gdG9rZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgdHlwZSA9IHRva2Vuc1tpXS50eXBlXG5cbiAgICBpZiAodHlwZW9mIHJ1bGVzW3R5cGVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzdWx0ICs9IHJ1bGVzW3R5cGVdKHRva2VucywgaSwgb3B0aW9ucywgZW52LCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5yZW5kZXJUb2tlbih0b2tlbnMsIGksIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKiogaW50ZXJuYWxcbiAqIFJlbmRlcmVyLnJlbmRlcklubGluZUFzVGV4dCh0b2tlbnMsIG9wdGlvbnMsIGVudikgLT4gU3RyaW5nXG4gKiAtIHRva2VucyAoQXJyYXkpOiBsaXN0IG9uIGJsb2NrIHRva2VucyB0byByZW5kZXJcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcGFyYW1zIG9mIHBhcnNlciBpbnN0YW5jZVxuICogLSBlbnYgKE9iamVjdCk6IGFkZGl0aW9uYWwgZGF0YSBmcm9tIHBhcnNlZCBpbnB1dCAocmVmZXJlbmNlcywgZm9yIGV4YW1wbGUpXG4gKlxuICogU3BlY2lhbCBrbHVkZ2UgZm9yIGltYWdlIGBhbHRgIGF0dHJpYnV0ZXMgdG8gY29uZm9ybSBDb21tb25NYXJrIHNwZWMuXG4gKiBEb24ndCB0cnkgdG8gdXNlIGl0ISBTcGVjIHJlcXVpcmVzIHRvIHNob3cgYGFsdGAgY29udGVudCB3aXRoIHN0cmlwcGVkIG1hcmt1cCxcbiAqIGluc3RlYWQgb2Ygc2ltcGxlIGVzY2FwaW5nLlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlcklubGluZUFzVGV4dCA9IGZ1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMsIGVudikge1xuICBsZXQgcmVzdWx0ID0gJydcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gdG9rZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3dpdGNoICh0b2tlbnNbaV0udHlwZSkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJlc3VsdCArPSB0b2tlbnNbaV0uY29udGVudFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICByZXN1bHQgKz0gdGhpcy5yZW5kZXJJbmxpbmVBc1RleHQodG9rZW5zW2ldLmNoaWxkcmVuLCBvcHRpb25zLCBlbnYpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdodG1sX2lubGluZSc6XG4gICAgICBjYXNlICdodG1sX2Jsb2NrJzpcbiAgICAgICAgcmVzdWx0ICs9IHRva2Vuc1tpXS5jb250ZW50XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzb2Z0YnJlYWsnOlxuICAgICAgY2FzZSAnaGFyZGJyZWFrJzpcbiAgICAgICAgcmVzdWx0ICs9ICdcXG4nXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBhbGwgb3RoZXIgdG9rZW5zIGFyZSBza2lwcGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlcih0b2tlbnMsIG9wdGlvbnMsIGVudikgLT4gU3RyaW5nXG4gKiAtIHRva2VucyAoQXJyYXkpOiBsaXN0IG9uIGJsb2NrIHRva2VucyB0byByZW5kZXJcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcGFyYW1zIG9mIHBhcnNlciBpbnN0YW5jZVxuICogLSBlbnYgKE9iamVjdCk6IGFkZGl0aW9uYWwgZGF0YSBmcm9tIHBhcnNlZCBpbnB1dCAocmVmZXJlbmNlcywgZm9yIGV4YW1wbGUpXG4gKlxuICogVGFrZXMgdG9rZW4gc3RyZWFtIGFuZCBnZW5lcmF0ZXMgSFRNTC4gUHJvYmFibHksIHlvdSB3aWxsIG5ldmVyIG5lZWQgdG8gY2FsbFxuICogdGhpcyBtZXRob2QgZGlyZWN0bHkuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucywgZW52KSB7XG4gIGxldCByZXN1bHQgPSAnJ1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXNcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gdG9rZW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgdHlwZSA9IHRva2Vuc1tpXS50eXBlXG5cbiAgICBpZiAodHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlcklubGluZSh0b2tlbnNbaV0uY2hpbGRyZW4sIG9wdGlvbnMsIGVudilcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBydWxlc1t0eXBlXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJlc3VsdCArPSBydWxlc1t0eXBlXSh0b2tlbnMsIGksIG9wdGlvbnMsIGVudiwgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IHRoaXMucmVuZGVyVG9rZW4odG9rZW5zLCBpLCBvcHRpb25zLCBlbnYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlclxuIiwiLyoqXG4gKiBjbGFzcyBSdWxlclxuICpcbiAqIEhlbHBlciBjbGFzcywgdXNlZCBieSBbW01hcmtkb3duSXQjY29yZV1dLCBbW01hcmtkb3duSXQjYmxvY2tdXSBhbmRcbiAqIFtbTWFya2Rvd25JdCNpbmxpbmVdXSB0byBtYW5hZ2Ugc2VxdWVuY2VzIG9mIGZ1bmN0aW9ucyAocnVsZXMpOlxuICpcbiAqIC0ga2VlcCBydWxlcyBpbiBkZWZpbmVkIG9yZGVyXG4gKiAtIGFzc2lnbiB0aGUgbmFtZSB0byBlYWNoIHJ1bGVcbiAqIC0gZW5hYmxlL2Rpc2FibGUgcnVsZXNcbiAqIC0gYWRkL3JlcGxhY2UgcnVsZXNcbiAqIC0gYWxsb3cgYXNzaWduIHJ1bGVzIHRvIGFkZGl0aW9uYWwgbmFtZWQgY2hhaW5zIChpbiB0aGUgc2FtZSlcbiAqIC0gY2FjaGVpbmcgbGlzdHMgb2YgYWN0aXZlIHJ1bGVzXG4gKlxuICogWW91IHdpbGwgbm90IG5lZWQgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkgdW50aWwgd3JpdGUgcGx1Z2lucy4gRm9yIHNpbXBsZVxuICogcnVsZXMgY29udHJvbCB1c2UgW1tNYXJrZG93bkl0LmRpc2FibGVdXSwgW1tNYXJrZG93bkl0LmVuYWJsZV1dIGFuZFxuICogW1tNYXJrZG93bkl0LnVzZV1dLlxuICoqL1xuXG4vKipcbiAqIG5ldyBSdWxlcigpXG4gKiovXG5mdW5jdGlvbiBSdWxlciAoKSB7XG4gIC8vIExpc3Qgb2YgYWRkZWQgcnVsZXMuIEVhY2ggZWxlbWVudCBpczpcbiAgLy9cbiAgLy8ge1xuICAvLyAgIG5hbWU6IFhYWCxcbiAgLy8gICBlbmFibGVkOiBCb29sZWFuLFxuICAvLyAgIGZuOiBGdW5jdGlvbigpLFxuICAvLyAgIGFsdDogWyBuYW1lMiwgbmFtZTMgXVxuICAvLyB9XG4gIC8vXG4gIHRoaXMuX19ydWxlc19fID0gW11cblxuICAvLyBDYWNoZWQgcnVsZSBjaGFpbnMuXG4gIC8vXG4gIC8vIEZpcnN0IGxldmVsIC0gY2hhaW4gbmFtZSwgJycgZm9yIGRlZmF1bHQuXG4gIC8vIFNlY29uZCBsZXZlbCAtIGRpZ2luYWwgYW5jaG9yIGZvciBmYXN0IGZpbHRlcmluZyBieSBjaGFyY29kZXMuXG4gIC8vXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vLyBIZWxwZXIgbWV0aG9kcywgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5XG5cbi8vIEZpbmQgcnVsZSBpbmRleCBieSBuYW1lXG4vL1xuUnVsZXIucHJvdG90eXBlLl9fZmluZF9fID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9fcnVsZXNfXy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aGlzLl9fcnVsZXNfX1tpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuLy8gQnVpbGQgcnVsZXMgbG9va3VwIGNhY2hlXG4vL1xuUnVsZXIucHJvdG90eXBlLl9fY29tcGlsZV9fID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuICBjb25zdCBjaGFpbnMgPSBbJyddXG5cbiAgLy8gY29sbGVjdCB1bmlxdWUgbmFtZXNcbiAgc2VsZi5fX3J1bGVzX18uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgIGlmICghcnVsZS5lbmFibGVkKSB7IHJldHVybiB9XG5cbiAgICBydWxlLmFsdC5mb3JFYWNoKGZ1bmN0aW9uIChhbHROYW1lKSB7XG4gICAgICBpZiAoY2hhaW5zLmluZGV4T2YoYWx0TmFtZSkgPCAwKSB7XG4gICAgICAgIGNoYWlucy5wdXNoKGFsdE5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBzZWxmLl9fY2FjaGVfXyA9IHt9XG5cbiAgY2hhaW5zLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgc2VsZi5fX2NhY2hlX19bY2hhaW5dID0gW11cbiAgICBzZWxmLl9fcnVsZXNfXy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICBpZiAoIXJ1bGUuZW5hYmxlZCkgeyByZXR1cm4gfVxuXG4gICAgICBpZiAoY2hhaW4gJiYgcnVsZS5hbHQuaW5kZXhPZihjaGFpbikgPCAwKSB7IHJldHVybiB9XG5cbiAgICAgIHNlbGYuX19jYWNoZV9fW2NoYWluXS5wdXNoKHJ1bGUuZm4pXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBSdWxlci5hdChuYW1lLCBmbiBbLCBvcHRpb25zXSlcbiAqIC0gbmFtZSAoU3RyaW5nKTogcnVsZSBuYW1lIHRvIHJlcGxhY2UuXG4gKiAtIGZuIChGdW5jdGlvbik6IG5ldyBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBuZXcgcnVsZSBvcHRpb25zIChub3QgbWFuZGF0b3J5KS5cbiAqXG4gKiBSZXBsYWNlIHJ1bGUgYnkgbmFtZSB3aXRoIG5ldyBmdW5jdGlvbiAmIG9wdGlvbnMuIFRocm93cyBlcnJvciBpZiBuYW1lIG5vdFxuICogZm91bmQuXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBSZXBsYWNlIGV4aXN0aW5nIHR5cG9ncmFwaGVyIHJlcGxhY2VtZW50IHJ1bGUgd2l0aCBuZXcgb25lOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiBtZC5jb3JlLnJ1bGVyLmF0KCdyZXBsYWNlbWVudHMnLCBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gKiAgIC8vLi4uXG4gKiB9KTtcbiAqIGBgYFxuICoqL1xuUnVsZXIucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gKG5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5fX2ZpbmRfXyhuYW1lKVxuICBjb25zdCBvcHQgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKGluZGV4ID09PSAtMSkgeyB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlciBydWxlIG5vdCBmb3VuZDogJyArIG5hbWUpIH1cblxuICB0aGlzLl9fcnVsZXNfX1tpbmRleF0uZm4gPSBmblxuICB0aGlzLl9fcnVsZXNfX1tpbmRleF0uYWx0ID0gb3B0LmFsdCB8fCBbXVxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLyoqXG4gKiBSdWxlci5iZWZvcmUoYmVmb3JlTmFtZSwgcnVsZU5hbWUsIGZuIFssIG9wdGlvbnNdKVxuICogLSBiZWZvcmVOYW1lIChTdHJpbmcpOiBuZXcgcnVsZSB3aWxsIGJlIGFkZGVkIGJlZm9yZSB0aGlzIG9uZS5cbiAqIC0gcnVsZU5hbWUgKFN0cmluZyk6IG5hbWUgb2YgYWRkZWQgcnVsZS5cbiAqIC0gZm4gKEZ1bmN0aW9uKTogcnVsZSBmdW5jdGlvbi5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcnVsZSBvcHRpb25zIChub3QgbWFuZGF0b3J5KS5cbiAqXG4gKiBBZGQgbmV3IHJ1bGUgdG8gY2hhaW4gYmVmb3JlIG9uZSB3aXRoIGdpdmVuIG5hbWUuIFNlZSBhbHNvXG4gKiBbW1J1bGVyLmFmdGVyXV0sIFtbUnVsZXIucHVzaF1dLlxuICpcbiAqICMjIyMjIE9wdGlvbnM6XG4gKlxuICogLSBfX2FsdF9fIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiBcImFsdGVybmF0ZVwiIGNoYWlucy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmJsb2NrLnJ1bGVyLmJlZm9yZSgncGFyYWdyYXBoJywgJ215X3J1bGUnLCBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gKiAgIC8vLi4uXG4gKiB9KTtcbiAqIGBgYFxuICoqL1xuUnVsZXIucHJvdG90eXBlLmJlZm9yZSA9IGZ1bmN0aW9uIChiZWZvcmVOYW1lLCBydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3QgaW5kZXggPSB0aGlzLl9fZmluZF9fKGJlZm9yZU5hbWUpXG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoaW5kZXggPT09IC0xKSB7IHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgYmVmb3JlTmFtZSkgfVxuXG4gIHRoaXMuX19ydWxlc19fLnNwbGljZShpbmRleCwgMCwge1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIuYWZ0ZXIoYWZ0ZXJOYW1lLCBydWxlTmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIGFmdGVyTmFtZSAoU3RyaW5nKTogbmV3IHJ1bGUgd2lsbCBiZSBhZGRlZCBhZnRlciB0aGlzIG9uZS5cbiAqIC0gcnVsZU5hbWUgKFN0cmluZyk6IG5hbWUgb2YgYWRkZWQgcnVsZS5cbiAqIC0gZm4gKEZ1bmN0aW9uKTogcnVsZSBmdW5jdGlvbi5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcnVsZSBvcHRpb25zIChub3QgbWFuZGF0b3J5KS5cbiAqXG4gKiBBZGQgbmV3IHJ1bGUgdG8gY2hhaW4gYWZ0ZXIgb25lIHdpdGggZ2l2ZW4gbmFtZS4gU2VlIGFsc29cbiAqIFtbUnVsZXIuYmVmb3JlXV0sIFtbUnVsZXIucHVzaF1dLlxuICpcbiAqICMjIyMjIE9wdGlvbnM6XG4gKlxuICogLSBfX2FsdF9fIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiBcImFsdGVybmF0ZVwiIGNoYWlucy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmlubGluZS5ydWxlci5hZnRlcigndGV4dCcsICdteV9ydWxlJywgZnVuY3Rpb24gcmVwbGFjZShzdGF0ZSkge1xuICogICAvLy4uLlxuICogfSk7XG4gKiBgYGBcbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5hZnRlciA9IGZ1bmN0aW9uIChhZnRlck5hbWUsIHJ1bGVOYW1lLCBmbiwgb3B0aW9ucykge1xuICBjb25zdCBpbmRleCA9IHRoaXMuX19maW5kX18oYWZ0ZXJOYW1lKVxuICBjb25zdCBvcHQgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKGluZGV4ID09PSAtMSkgeyB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlciBydWxlIG5vdCBmb3VuZDogJyArIGFmdGVyTmFtZSkgfVxuXG4gIHRoaXMuX19ydWxlc19fLnNwbGljZShpbmRleCArIDEsIDAsIHtcbiAgICBuYW1lOiBydWxlTmFtZSxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGZuLFxuICAgIGFsdDogb3B0LmFsdCB8fCBbXVxuICB9KVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bGVyLnB1c2gocnVsZU5hbWUsIGZuIFssIG9wdGlvbnNdKVxuICogLSBydWxlTmFtZSAoU3RyaW5nKTogbmFtZSBvZiBhZGRlZCBydWxlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIFB1c2ggbmV3IHJ1bGUgdG8gdGhlIGVuZCBvZiBjaGFpbi4gU2VlIGFsc29cbiAqIFtbUnVsZXIuYmVmb3JlXV0sIFtbUnVsZXIuYWZ0ZXJdXS5cbiAqXG4gKiAjIyMjIyBPcHRpb25zOlxuICpcbiAqIC0gX19hbHRfXyAtIGFycmF5IHdpdGggbmFtZXMgb2YgXCJhbHRlcm5hdGVcIiBjaGFpbnMuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiBtZC5jb3JlLnJ1bGVyLnB1c2goJ215X3J1bGUnLCBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gKiAgIC8vLi4uXG4gKiB9KTtcbiAqIGBgYFxuICoqL1xuUnVsZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAocnVsZU5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICB0aGlzLl9fcnVsZXNfXy5wdXNoKHtcbiAgICBuYW1lOiBydWxlTmFtZSxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGZuLFxuICAgIGFsdDogb3B0LmFsdCB8fCBbXVxuICB9KVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bGVyLmVuYWJsZShsaXN0IFssIGlnbm9yZUludmFsaWRdKSAtPiBBcnJheVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBsaXN0IG9mIHJ1bGUgbmFtZXMgdG8gZW5hYmxlLlxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRW5hYmxlIHJ1bGVzIHdpdGggZ2l2ZW4gbmFtZXMuIElmIGFueSBydWxlIG5hbWUgbm90IGZvdW5kIC0gdGhyb3cgRXJyb3IuXG4gKiBFcnJvcnMgY2FuIGJlIGRpc2FibGVkIGJ5IHNlY29uZCBwYXJhbS5cbiAqXG4gKiBSZXR1cm5zIGxpc3Qgb2YgZm91bmQgcnVsZSBuYW1lcyAoaWYgbm8gZXhjZXB0aW9uIGhhcHBlbmVkKS5cbiAqXG4gKiBTZWUgYWxzbyBbW1J1bGVyLmRpc2FibGVdXSwgW1tSdWxlci5lbmFibGVPbmx5XV0uXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgLy8gU2VhcmNoIGJ5IG5hbWUgYW5kIGVuYWJsZVxuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9fZmluZF9fKG5hbWUpXG5cbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgaWYgKGlnbm9yZUludmFsaWQpIHsgcmV0dXJuIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbWFuYWdlcjogaW52YWxpZCBydWxlIG5hbWUgJyArIG5hbWUpXG4gICAgfVxuICAgIHRoaXMuX19ydWxlc19fW2lkeF0uZW5hYmxlZCA9IHRydWVcbiAgICByZXN1bHQucHVzaChuYW1lKVxuICB9LCB0aGlzKVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUnVsZXIuZW5hYmxlT25seShsaXN0IFssIGlnbm9yZUludmFsaWRdKVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBsaXN0IG9mIHJ1bGUgbmFtZXMgdG8gZW5hYmxlICh3aGl0ZWxpc3QpLlxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRW5hYmxlIHJ1bGVzIHdpdGggZ2l2ZW4gbmFtZXMsIGFuZCBkaXNhYmxlIGV2ZXJ5dGhpbmcgZWxzZS4gSWYgYW55IHJ1bGUgbmFtZVxuICogbm90IGZvdW5kIC0gdGhyb3cgRXJyb3IuIEVycm9ycyBjYW4gYmUgZGlzYWJsZWQgYnkgc2Vjb25kIHBhcmFtLlxuICpcbiAqIFNlZSBhbHNvIFtbUnVsZXIuZGlzYWJsZV1dLCBbW1J1bGVyLmVuYWJsZV1dLlxuICoqL1xuUnVsZXIucHJvdG90eXBlLmVuYWJsZU9ubHkgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgdGhpcy5fX3J1bGVzX18uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkgeyBydWxlLmVuYWJsZWQgPSBmYWxzZSB9KVxuXG4gIHRoaXMuZW5hYmxlKGxpc3QsIGlnbm9yZUludmFsaWQpXG59XG5cbi8qKlxuICogUnVsZXIuZGlzYWJsZShsaXN0IFssIGlnbm9yZUludmFsaWRdKSAtPiBBcnJheVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBsaXN0IG9mIHJ1bGUgbmFtZXMgdG8gZGlzYWJsZS5cbiAqIC0gaWdub3JlSW52YWxpZCAoQm9vbGVhbik6IHNldCBgdHJ1ZWAgdG8gaWdub3JlIGVycm9ycyB3aGVuIHJ1bGUgbm90IGZvdW5kLlxuICpcbiAqIERpc2FibGUgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcy4gSWYgYW55IHJ1bGUgbmFtZSBub3QgZm91bmQgLSB0aHJvdyBFcnJvci5cbiAqIEVycm9ycyBjYW4gYmUgZGlzYWJsZWQgYnkgc2Vjb25kIHBhcmFtLlxuICpcbiAqIFJldHVybnMgbGlzdCBvZiBmb3VuZCBydWxlIG5hbWVzIChpZiBubyBleGNlcHRpb24gaGFwcGVuZWQpLlxuICpcbiAqIFNlZSBhbHNvIFtbUnVsZXIuZW5hYmxlXV0sIFtbUnVsZXIuZW5hYmxlT25seV1dLlxuICoqL1xuUnVsZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyBTZWFyY2ggYnkgbmFtZSBhbmQgZGlzYWJsZVxuICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLl9fZmluZF9fKG5hbWUpXG5cbiAgICBpZiAoaWR4IDwgMCkge1xuICAgICAgaWYgKGlnbm9yZUludmFsaWQpIHsgcmV0dXJuIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZXMgbWFuYWdlcjogaW52YWxpZCBydWxlIG5hbWUgJyArIG5hbWUpXG4gICAgfVxuICAgIHRoaXMuX19ydWxlc19fW2lkeF0uZW5hYmxlZCA9IGZhbHNlXG4gICAgcmVzdWx0LnB1c2gobmFtZSlcbiAgfSwgdGhpcylcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJ1bGVyLmdldFJ1bGVzKGNoYWluTmFtZSkgLT4gQXJyYXlcbiAqXG4gKiBSZXR1cm4gYXJyYXkgb2YgYWN0aXZlIGZ1bmN0aW9ucyAocnVsZXMpIGZvciBnaXZlbiBjaGFpbiBuYW1lLiBJdCBhbmFseXplc1xuICogcnVsZXMgY29uZmlndXJhdGlvbiwgY29tcGlsZXMgY2FjaGVzIGlmIG5vdCBleGlzdHMgYW5kIHJldHVybnMgcmVzdWx0LlxuICpcbiAqIERlZmF1bHQgY2hhaW4gbmFtZSBpcyBgJydgIChlbXB0eSBzdHJpbmcpLiBJdCBjYW4ndCBiZSBza2lwcGVkLiBUaGF0J3NcbiAqIGRvbmUgaW50ZW50aW9uYWxseSwgdG8ga2VlcCBzaWduYXR1cmUgbW9ub21vcnBoaWMgZm9yIGhpZ2ggc3BlZWQuXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZ2V0UnVsZXMgPSBmdW5jdGlvbiAoY2hhaW5OYW1lKSB7XG4gIGlmICh0aGlzLl9fY2FjaGVfXyA9PT0gbnVsbCkge1xuICAgIHRoaXMuX19jb21waWxlX18oKVxuICB9XG5cbiAgLy8gQ2hhaW4gY2FuIGJlIGVtcHR5LCBpZiBydWxlcyBkaXNhYmxlZC4gQnV0IHdlIHN0aWxsIGhhdmUgdG8gcmV0dXJuIEFycmF5LlxuICByZXR1cm4gdGhpcy5fX2NhY2hlX19bY2hhaW5OYW1lXSB8fCBbXVxufVxuXG5leHBvcnQgZGVmYXVsdCBSdWxlclxuIiwiLy8gVG9rZW4gY2xhc3NcblxuLyoqXG4gKiBjbGFzcyBUb2tlblxuICoqL1xuXG4vKipcbiAqIG5ldyBUb2tlbih0eXBlLCB0YWcsIG5lc3RpbmcpXG4gKlxuICogQ3JlYXRlIG5ldyB0b2tlbiBhbmQgZmlsbCBwYXNzZWQgcHJvcGVydGllcy5cbiAqKi9cbmZ1bmN0aW9uIFRva2VuICh0eXBlLCB0YWcsIG5lc3RpbmcpIHtcbiAgLyoqXG4gICAqIFRva2VuI3R5cGUgLT4gU3RyaW5nXG4gICAqXG4gICAqIFR5cGUgb2YgdGhlIHRva2VuIChzdHJpbmcsIGUuZy4gXCJwYXJhZ3JhcGhfb3BlblwiKVxuICAgKiovXG4gIHRoaXMudHlwZSAgICAgPSB0eXBlXG5cbiAgLyoqXG4gICAqIFRva2VuI3RhZyAtPiBTdHJpbmdcbiAgICpcbiAgICogaHRtbCB0YWcgbmFtZSwgZS5nLiBcInBcIlxuICAgKiovXG4gIHRoaXMudGFnICAgICAgPSB0YWdcblxuICAvKipcbiAgICogVG9rZW4jYXR0cnMgLT4gQXJyYXlcbiAgICpcbiAgICogSHRtbCBhdHRyaWJ1dGVzLiBGb3JtYXQ6IGBbIFsgbmFtZTEsIHZhbHVlMSBdLCBbIG5hbWUyLCB2YWx1ZTIgXSBdYFxuICAgKiovXG4gIHRoaXMuYXR0cnMgICAgPSBudWxsXG5cbiAgLyoqXG4gICAqIFRva2VuI21hcCAtPiBBcnJheVxuICAgKlxuICAgKiBTb3VyY2UgbWFwIGluZm8uIEZvcm1hdDogYFsgbGluZV9iZWdpbiwgbGluZV9lbmQgXWBcbiAgICoqL1xuICB0aGlzLm1hcCAgICAgID0gbnVsbFxuXG4gIC8qKlxuICAgKiBUb2tlbiNuZXN0aW5nIC0+IE51bWJlclxuICAgKlxuICAgKiBMZXZlbCBjaGFuZ2UgKG51bWJlciBpbiB7LTEsIDAsIDF9IHNldCksIHdoZXJlOlxuICAgKlxuICAgKiAtICBgMWAgbWVhbnMgdGhlIHRhZyBpcyBvcGVuaW5nXG4gICAqIC0gIGAwYCBtZWFucyB0aGUgdGFnIGlzIHNlbGYtY2xvc2luZ1xuICAgKiAtIGAtMWAgbWVhbnMgdGhlIHRhZyBpcyBjbG9zaW5nXG4gICAqKi9cbiAgdGhpcy5uZXN0aW5nICA9IG5lc3RpbmdcblxuICAvKipcbiAgICogVG9rZW4jbGV2ZWwgLT4gTnVtYmVyXG4gICAqXG4gICAqIG5lc3RpbmcgbGV2ZWwsIHRoZSBzYW1lIGFzIGBzdGF0ZS5sZXZlbGBcbiAgICoqL1xuICB0aGlzLmxldmVsICAgID0gMFxuXG4gIC8qKlxuICAgKiBUb2tlbiNjaGlsZHJlbiAtPiBBcnJheVxuICAgKlxuICAgKiBBbiBhcnJheSBvZiBjaGlsZCBub2RlcyAoaW5saW5lIGFuZCBpbWcgdG9rZW5zKVxuICAgKiovXG4gIHRoaXMuY2hpbGRyZW4gPSBudWxsXG5cbiAgLyoqXG4gICAqIFRva2VuI2NvbnRlbnQgLT4gU3RyaW5nXG4gICAqXG4gICAqIEluIGEgY2FzZSBvZiBzZWxmLWNsb3NpbmcgdGFnIChjb2RlLCBodG1sLCBmZW5jZSwgZXRjLiksXG4gICAqIGl0IGhhcyBjb250ZW50cyBvZiB0aGlzIHRhZy5cbiAgICoqL1xuICB0aGlzLmNvbnRlbnQgID0gJydcblxuICAvKipcbiAgICogVG9rZW4jbWFya3VwIC0+IFN0cmluZ1xuICAgKlxuICAgKiAnKicgb3IgJ18nIGZvciBlbXBoYXNpcywgZmVuY2Ugc3RyaW5nIGZvciBmZW5jZSwgZXRjLlxuICAgKiovXG4gIHRoaXMubWFya3VwICAgPSAnJ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNpbmZvIC0+IFN0cmluZ1xuICAgKlxuICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uOlxuICAgKlxuICAgKiAtIEluZm8gc3RyaW5nIGZvciBcImZlbmNlXCIgdG9rZW5zXG4gICAqIC0gVGhlIHZhbHVlIFwiYXV0b1wiIGZvciBhdXRvbGluayBcImxpbmtfb3BlblwiIGFuZCBcImxpbmtfY2xvc2VcIiB0b2tlbnNcbiAgICogLSBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBpdGVtIG1hcmtlciBmb3Igb3JkZXJlZC1saXN0IFwibGlzdF9pdGVtX29wZW5cIiB0b2tlbnNcbiAgICoqL1xuICB0aGlzLmluZm8gICAgID0gJydcblxuICAvKipcbiAgICogVG9rZW4jbWV0YSAtPiBPYmplY3RcbiAgICpcbiAgICogQSBwbGFjZSBmb3IgcGx1Z2lucyB0byBzdG9yZSBhbiBhcmJpdHJhcnkgZGF0YVxuICAgKiovXG4gIHRoaXMubWV0YSAgICAgPSBudWxsXG5cbiAgLyoqXG4gICAqIFRva2VuI2Jsb2NrIC0+IEJvb2xlYW5cbiAgICpcbiAgICogVHJ1ZSBmb3IgYmxvY2stbGV2ZWwgdG9rZW5zLCBmYWxzZSBmb3IgaW5saW5lIHRva2Vucy5cbiAgICogVXNlZCBpbiByZW5kZXJlciB0byBjYWxjdWxhdGUgbGluZSBicmVha3NcbiAgICoqL1xuICB0aGlzLmJsb2NrICAgID0gZmFsc2VcblxuICAvKipcbiAgICogVG9rZW4jaGlkZGVuIC0+IEJvb2xlYW5cbiAgICpcbiAgICogSWYgaXQncyB0cnVlLCBpZ25vcmUgdGhpcyBlbGVtZW50IHdoZW4gcmVuZGVyaW5nLiBVc2VkIGZvciB0aWdodCBsaXN0c1xuICAgKiB0byBoaWRlIHBhcmFncmFwaHMuXG4gICAqKi9cbiAgdGhpcy5oaWRkZW4gICA9IGZhbHNlXG59XG5cbi8qKlxuICogVG9rZW4uYXR0ckluZGV4KG5hbWUpIC0+IE51bWJlclxuICpcbiAqIFNlYXJjaCBhdHRyaWJ1dGUgaW5kZXggYnkgbmFtZS5cbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRySW5kZXggPSBmdW5jdGlvbiBhdHRySW5kZXggKG5hbWUpIHtcbiAgaWYgKCF0aGlzLmF0dHJzKSB7IHJldHVybiAtMSB9XG5cbiAgY29uc3QgYXR0cnMgPSB0aGlzLmF0dHJzXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGF0dHJzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGF0dHJzW2ldWzBdID09PSBuYW1lKSB7IHJldHVybiBpIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRyUHVzaChhdHRyRGF0YSlcbiAqXG4gKiBBZGQgYFsgbmFtZSwgdmFsdWUgXWAgYXR0cmlidXRlIHRvIGxpc3QuIEluaXQgYXR0cnMgaWYgbmVjZXNzYXJ5XG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0clB1c2ggPSBmdW5jdGlvbiBhdHRyUHVzaCAoYXR0ckRhdGEpIHtcbiAgaWYgKHRoaXMuYXR0cnMpIHtcbiAgICB0aGlzLmF0dHJzLnB1c2goYXR0ckRhdGEpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hdHRycyA9IFthdHRyRGF0YV1cbiAgfVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJTZXQobmFtZSwgdmFsdWUpXG4gKlxuICogU2V0IGBuYW1lYCBhdHRyaWJ1dGUgdG8gYHZhbHVlYC4gT3ZlcnJpZGUgb2xkIHZhbHVlIGlmIGV4aXN0cy5cbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRyU2V0ID0gZnVuY3Rpb24gYXR0clNldCAobmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgaWR4ID0gdGhpcy5hdHRySW5kZXgobmFtZSlcbiAgY29uc3QgYXR0ckRhdGEgPSBbbmFtZSwgdmFsdWVdXG5cbiAgaWYgKGlkeCA8IDApIHtcbiAgICB0aGlzLmF0dHJQdXNoKGF0dHJEYXRhKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuYXR0cnNbaWR4XSA9IGF0dHJEYXRhXG4gIH1cbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRyR2V0KG5hbWUpXG4gKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBhdHRyaWJ1dGUgYG5hbWVgLCBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJHZXQgPSBmdW5jdGlvbiBhdHRyR2V0IChuYW1lKSB7XG4gIGNvbnN0IGlkeCA9IHRoaXMuYXR0ckluZGV4KG5hbWUpXG4gIGxldCB2YWx1ZSA9IG51bGxcbiAgaWYgKGlkeCA+PSAwKSB7XG4gICAgdmFsdWUgPSB0aGlzLmF0dHJzW2lkeF1bMV1cbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRySm9pbihuYW1lLCB2YWx1ZSlcbiAqXG4gKiBKb2luIHZhbHVlIHRvIGV4aXN0aW5nIGF0dHJpYnV0ZSB2aWEgc3BhY2UuIE9yIGNyZWF0ZSBuZXcgYXR0cmlidXRlIGlmIG5vdFxuICogZXhpc3RzLiBVc2VmdWwgdG8gb3BlcmF0ZSB3aXRoIHRva2VuIGNsYXNzZXMuXG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0ckpvaW4gPSBmdW5jdGlvbiBhdHRySm9pbiAobmFtZSwgdmFsdWUpIHtcbiAgY29uc3QgaWR4ID0gdGhpcy5hdHRySW5kZXgobmFtZSlcblxuICBpZiAoaWR4IDwgMCkge1xuICAgIHRoaXMuYXR0clB1c2goW25hbWUsIHZhbHVlXSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmF0dHJzW2lkeF1bMV0gPSB0aGlzLmF0dHJzW2lkeF1bMV0gKyAnICcgKyB2YWx1ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRva2VuXG4iLCIvLyBDb3JlIHN0YXRlIG9iamVjdFxuLy9cblxuaW1wb3J0IFRva2VuIGZyb20gJy4uL3Rva2VuLm1qcydcblxuZnVuY3Rpb24gU3RhdGVDb3JlIChzcmMsIG1kLCBlbnYpIHtcbiAgdGhpcy5zcmMgPSBzcmNcbiAgdGhpcy5lbnYgPSBlbnZcbiAgdGhpcy50b2tlbnMgPSBbXVxuICB0aGlzLmlubGluZU1vZGUgPSBmYWxzZVxuICB0aGlzLm1kID0gbWQgLy8gbGluayB0byBwYXJzZXIgaW5zdGFuY2Vcbn1cblxuLy8gcmUtZXhwb3J0IFRva2VuIGNsYXNzIHRvIHVzZSBpbiBjb3JlIHJ1bGVzXG5TdGF0ZUNvcmUucHJvdG90eXBlLlRva2VuID0gVG9rZW5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVDb3JlXG4iLCIvLyBOb3JtYWxpemUgaW5wdXQgc3RyaW5nXG5cbi8vIGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNsaW5lLWVuZGluZ1xuY29uc3QgTkVXTElORVNfUkUgID0gL1xcclxcbj98XFxuL2dcbmNvbnN0IE5VTExfUkUgICAgICA9IC9cXDAvZ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemUgKHN0YXRlKSB7XG4gIGxldCBzdHJcblxuICAvLyBOb3JtYWxpemUgbmV3bGluZXNcbiAgc3RyID0gc3RhdGUuc3JjLnJlcGxhY2UoTkVXTElORVNfUkUsICdcXG4nKVxuXG4gIC8vIFJlcGxhY2UgTlVMTCBjaGFyYWN0ZXJzXG4gIHN0ciA9IHN0ci5yZXBsYWNlKE5VTExfUkUsICdcXHVGRkZEJylcblxuICBzdGF0ZS5zcmMgPSBzdHJcbn1cbiIsIi8vIFJlcGxhY2UgbGluay1saWtlIHRleHRzIHdpdGggbGluayBub2Rlcy5cbi8vXG4vLyBDdXJyZW50bHkgcmVzdHJpY3RlZCBieSBgbWQudmFsaWRhdGVMaW5rKClgIHRvIGh0dHAvaHR0cHMvZnRwXG4vL1xuXG5pbXBvcnQgeyBhcnJheVJlcGxhY2VBdCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmZ1bmN0aW9uIGlzTGlua09wZW4gKHN0cikge1xuICByZXR1cm4gL148YVs+XFxzXS9pLnRlc3Qoc3RyKVxufVxuZnVuY3Rpb24gaXNMaW5rQ2xvc2UgKHN0cikge1xuICByZXR1cm4gL148XFwvYVxccyo+L2kudGVzdChzdHIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmtpZnkgKHN0YXRlKSB7XG4gIGNvbnN0IGJsb2NrVG9rZW5zID0gc3RhdGUudG9rZW5zXG5cbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLmxpbmtpZnkpIHsgcmV0dXJuIH1cblxuICBmb3IgKGxldCBqID0gMCwgbCA9IGJsb2NrVG9rZW5zLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgIGlmIChibG9ja1Rva2Vuc1tqXS50eXBlICE9PSAnaW5saW5lJyB8fFxuICAgICAgICAhc3RhdGUubWQubGlua2lmeS5wcmV0ZXN0KGJsb2NrVG9rZW5zW2pdLmNvbnRlbnQpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGxldCB0b2tlbnMgPSBibG9ja1Rva2Vuc1tqXS5jaGlsZHJlblxuXG4gICAgbGV0IGh0bWxMaW5rTGV2ZWwgPSAwXG5cbiAgICAvLyBXZSBzY2FuIGZyb20gdGhlIGVuZCwgdG8ga2VlcCBwb3NpdGlvbiB3aGVuIG5ldyB0YWdzIGFkZGVkLlxuICAgIC8vIFVzZSByZXZlcnNlZCBsb2dpYyBpbiBsaW5rcyBzdGFydC9lbmQgbWF0Y2hcbiAgICBmb3IgKGxldCBpID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSB0b2tlbnNbaV1cblxuICAgICAgLy8gU2tpcCBjb250ZW50IG9mIG1hcmtkb3duIGxpbmtzXG4gICAgICBpZiAoY3VycmVudFRva2VuLnR5cGUgPT09ICdsaW5rX2Nsb3NlJykge1xuICAgICAgICBpLS1cbiAgICAgICAgd2hpbGUgKHRva2Vuc1tpXS5sZXZlbCAhPT0gY3VycmVudFRva2VuLmxldmVsICYmIHRva2Vuc1tpXS50eXBlICE9PSAnbGlua19vcGVuJykge1xuICAgICAgICAgIGktLVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFNraXAgY29udGVudCBvZiBodG1sIHRhZyBsaW5rc1xuICAgICAgaWYgKGN1cnJlbnRUb2tlbi50eXBlID09PSAnaHRtbF9pbmxpbmUnKSB7XG4gICAgICAgIGlmIChpc0xpbmtPcGVuKGN1cnJlbnRUb2tlbi5jb250ZW50KSAmJiBodG1sTGlua0xldmVsID4gMCkge1xuICAgICAgICAgIGh0bWxMaW5rTGV2ZWwtLVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xpbmtDbG9zZShjdXJyZW50VG9rZW4uY29udGVudCkpIHtcbiAgICAgICAgICBodG1sTGlua0xldmVsKytcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGh0bWxMaW5rTGV2ZWwgPiAwKSB7IGNvbnRpbnVlIH1cblxuICAgICAgaWYgKGN1cnJlbnRUb2tlbi50eXBlID09PSAndGV4dCcgJiYgc3RhdGUubWQubGlua2lmeS50ZXN0KGN1cnJlbnRUb2tlbi5jb250ZW50KSkge1xuICAgICAgICBjb25zdCB0ZXh0ID0gY3VycmVudFRva2VuLmNvbnRlbnRcbiAgICAgICAgbGV0IGxpbmtzID0gc3RhdGUubWQubGlua2lmeS5tYXRjaCh0ZXh0KVxuXG4gICAgICAgIC8vIE5vdyBzcGxpdCBzdHJpbmcgdG8gbm9kZXNcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBbXVxuICAgICAgICBsZXQgbGV2ZWwgPSBjdXJyZW50VG9rZW4ubGV2ZWxcbiAgICAgICAgbGV0IGxhc3RQb3MgPSAwXG5cbiAgICAgICAgLy8gZm9yYmlkIGVzY2FwZSBzZXF1ZW5jZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyxcbiAgICAgICAgLy8gdGhpcyBhdm9pZHMgaHR0cFxcOi8vZXhhbXBsZS5jb20vIGZyb20gYmVpbmcgbGlua2lmaWVkIGFzXG4gICAgICAgIC8vIGh0dHA6PGEgaHJlZj1cIi8vZXhhbXBsZS5jb20vXCI+Ly9leGFtcGxlLmNvbS88L2E+XG4gICAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBsaW5rc1swXS5pbmRleCA9PT0gMCAmJlxuICAgICAgICAgICAgaSA+IDAgJiZcbiAgICAgICAgICAgIHRva2Vuc1tpIC0gMV0udHlwZSA9PT0gJ3RleHRfc3BlY2lhbCcpIHtcbiAgICAgICAgICBsaW5rcyA9IGxpbmtzLnNsaWNlKDEpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBsbiA9IDA7IGxuIDwgbGlua3MubGVuZ3RoOyBsbisrKSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbGlua3NbbG5dLnVybFxuICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHVybClcbiAgICAgICAgICBpZiAoIXN0YXRlLm1kLnZhbGlkYXRlTGluayhmdWxsVXJsKSkgeyBjb250aW51ZSB9XG5cbiAgICAgICAgICBsZXQgdXJsVGV4dCA9IGxpbmtzW2xuXS50ZXh0XG5cbiAgICAgICAgICAvLyBMaW5raWZpZXIgbWlnaHQgc2VuZCByYXcgaG9zdG5hbWVzIGxpa2UgXCJleGFtcGxlLmNvbVwiLCB3aGVyZSB1cmxcbiAgICAgICAgICAvLyBzdGFydHMgd2l0aCBkb21haW4gbmFtZS4gU28gd2UgcHJlcGVuZCBodHRwOi8vIGluIHRob3NlIGNhc2VzLFxuICAgICAgICAgIC8vIGFuZCByZW1vdmUgaXQgYWZ0ZXJ3YXJkcy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIGlmICghbGlua3NbbG5dLnNjaGVtYSkge1xuICAgICAgICAgICAgdXJsVGV4dCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KCdodHRwOi8vJyArIHVybFRleHQpLnJlcGxhY2UoL15odHRwOlxcL1xcLy8sICcnKVxuICAgICAgICAgIH0gZWxzZSBpZiAobGlua3NbbG5dLnNjaGVtYSA9PT0gJ21haWx0bzonICYmICEvXm1haWx0bzovaS50ZXN0KHVybFRleHQpKSB7XG4gICAgICAgICAgICB1cmxUZXh0ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQoJ21haWx0bzonICsgdXJsVGV4dCkucmVwbGFjZSgvXm1haWx0bzovLCAnJylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdXJsVGV4dCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KHVybFRleHQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcG9zID0gbGlua3NbbG5dLmluZGV4XG5cbiAgICAgICAgICBpZiAocG9zID4gbGFzdFBvcykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gICA9IG5ldyBzdGF0ZS5Ub2tlbigndGV4dCcsICcnLCAwKVxuICAgICAgICAgICAgdG9rZW4uY29udGVudCA9IHRleHQuc2xpY2UobGFzdFBvcywgcG9zKVxuICAgICAgICAgICAgdG9rZW4ubGV2ZWwgICA9IGxldmVsXG4gICAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHRva2VuX28gICA9IG5ldyBzdGF0ZS5Ub2tlbignbGlua19vcGVuJywgJ2EnLCAxKVxuICAgICAgICAgIHRva2VuX28uYXR0cnMgICA9IFtbJ2hyZWYnLCBmdWxsVXJsXV1cbiAgICAgICAgICB0b2tlbl9vLmxldmVsICAgPSBsZXZlbCsrXG4gICAgICAgICAgdG9rZW5fby5tYXJrdXAgID0gJ2xpbmtpZnknXG4gICAgICAgICAgdG9rZW5fby5pbmZvICAgID0gJ2F1dG8nXG4gICAgICAgICAgbm9kZXMucHVzaCh0b2tlbl9vKVxuXG4gICAgICAgICAgY29uc3QgdG9rZW5fdCAgID0gbmV3IHN0YXRlLlRva2VuKCd0ZXh0JywgJycsIDApXG4gICAgICAgICAgdG9rZW5fdC5jb250ZW50ID0gdXJsVGV4dFxuICAgICAgICAgIHRva2VuX3QubGV2ZWwgICA9IGxldmVsXG4gICAgICAgICAgbm9kZXMucHVzaCh0b2tlbl90KVxuXG4gICAgICAgICAgY29uc3QgdG9rZW5fYyAgID0gbmV3IHN0YXRlLlRva2VuKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICAgICAgICB0b2tlbl9jLmxldmVsICAgPSAtLWxldmVsXG4gICAgICAgICAgdG9rZW5fYy5tYXJrdXAgID0gJ2xpbmtpZnknXG4gICAgICAgICAgdG9rZW5fYy5pbmZvICAgID0gJ2F1dG8nXG4gICAgICAgICAgbm9kZXMucHVzaCh0b2tlbl9jKVxuXG4gICAgICAgICAgbGFzdFBvcyA9IGxpbmtzW2xuXS5sYXN0SW5kZXhcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdFBvcyA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW4gICA9IG5ldyBzdGF0ZS5Ub2tlbigndGV4dCcsICcnLCAwKVxuICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSB0ZXh0LnNsaWNlKGxhc3RQb3MpXG4gICAgICAgICAgdG9rZW4ubGV2ZWwgICA9IGxldmVsXG4gICAgICAgICAgbm9kZXMucHVzaCh0b2tlbilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlcGxhY2UgY3VycmVudCBub2RlXG4gICAgICAgIGJsb2NrVG9rZW5zW2pdLmNoaWxkcmVuID0gdG9rZW5zID0gYXJyYXlSZXBsYWNlQXQodG9rZW5zLCBpLCBub2RlcylcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIFNpbXBsZSB0eXBvZ3JhcGhpYyByZXBsYWNlbWVudHNcbi8vXG4vLyAoYykgKEMpIOKGkiDCqVxuLy8gKHRtKSAoVE0pIOKGkiDihKJcbi8vIChyKSAoUikg4oaSIMKuXG4vLyArLSDihpIgwrFcbi8vIC4uLiDihpIg4oCmIChhbHNvID8uLi4uIOKGkiA/Li4sICEuLi4uIOKGkiAhLi4pXG4vLyA/Pz8/Pz8/PyDihpIgPz8/LCAhISEhISDihpIgISEhLCBgLCxgIOKGkiBgLGBcbi8vIC0tIOKGkiAmbmRhc2g7LCAtLS0g4oaSICZtZGFzaDtcbi8vXG5cbi8vIFRPRE86XG4vLyAtIGZyYWN0aW9uYWxzIDEvMiwgMS80LCAzLzQgLT4gwr0sIMK8LCDCvlxuLy8gLSBtdWx0aXBsaWNhdGlvbnMgMiB4IDQgLT4gMiDDlyA0XG5cbmNvbnN0IFJBUkVfUkUgPSAvXFwrLXxcXC5cXC58XFw/XFw/XFw/XFw/fCEhISF8LCx8LS0vXG5cbi8vIFdvcmthcm91bmQgZm9yIHBoYW50b21qcyAtIG5lZWQgcmVnZXggd2l0aG91dCAvZyBmbGFnLFxuLy8gb3Igcm9vdCBjaGVjayB3aWxsIGZhaWwgZXZlcnkgc2Vjb25kIHRpbWVcbmNvbnN0IFNDT1BFRF9BQkJSX1RFU1RfUkUgPSAvXFwoKGN8dG18cilcXCkvaVxuXG5jb25zdCBTQ09QRURfQUJCUl9SRSA9IC9cXCgoY3x0bXxyKVxcKS9pZ1xuY29uc3QgU0NPUEVEX0FCQlIgPSB7XG4gIGM6ICfCqScsXG4gIHI6ICfCricsXG4gIHRtOiAn4oSiJ1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRm4gKG1hdGNoLCBuYW1lKSB7XG4gIHJldHVybiBTQ09QRURfQUJCUltuYW1lLnRvTG93ZXJDYXNlKCldXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2Vfc2NvcGVkIChpbmxpbmVUb2tlbnMpIHtcbiAgbGV0IGluc2lkZV9hdXRvbGluayA9IDBcblxuICBmb3IgKGxldCBpID0gaW5saW5lVG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmxpbmVUb2tlbnNbaV1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgIWluc2lkZV9hdXRvbGluaykge1xuICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQucmVwbGFjZShTQ09QRURfQUJCUl9SRSwgcmVwbGFjZUZuKVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19vcGVuJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluay0tXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX2Nsb3NlJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluaysrXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VfcmFyZSAoaW5saW5lVG9rZW5zKSB7XG4gIGxldCBpbnNpZGVfYXV0b2xpbmsgPSAwXG5cbiAgZm9yIChsZXQgaSA9IGlubGluZVRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHRva2VuID0gaW5saW5lVG9rZW5zW2ldXG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnICYmICFpbnNpZGVfYXV0b2xpbmspIHtcbiAgICAgIGlmIChSQVJFX1JFLnRlc3QodG9rZW4uY29udGVudCkpIHtcbiAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZSgvXFwrLS9nLCAnwrEnKVxuICAgICAgICAgIC8vIC4uLCAuLi4sIC4uLi4uLi4gLT4g4oCmXG4gICAgICAgICAgLy8gYnV0ID8uLi4uLiAmICEuLi4uLiAtPiA/Li4gJiAhLi5cbiAgICAgICAgICAucmVwbGFjZSgvXFwuezIsfS9nLCAn4oCmJykucmVwbGFjZSgvKFs/IV0p4oCmL2csICckMS4uJylcbiAgICAgICAgICAucmVwbGFjZSgvKFs/IV0pezQsfS9nLCAnJDEkMSQxJykucmVwbGFjZSgvLHsyLH0vZywgJywnKVxuICAgICAgICAgIC8vIGVtLWRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvKF58W14tXSktLS0oPz1bXi1dfCQpL21nLCAnJDFcXHUyMDE0JylcbiAgICAgICAgICAvLyBlbi1kYXNoXG4gICAgICAgICAgLnJlcGxhY2UoLyhefFxccyktLSg/PVxcc3wkKS9tZywgJyQxXFx1MjAxMycpXG4gICAgICAgICAgLnJlcGxhY2UoLyhefFteLVxcc10pLS0oPz1bXi1cXHNdfCQpL21nLCAnJDFcXHUyMDEzJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpbmtfb3BlbicgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmstLVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19jbG9zZScgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmsrK1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXBsYWNlIChzdGF0ZSkge1xuICBsZXQgYmxrSWR4XG5cbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLnR5cG9ncmFwaGVyKSB7IHJldHVybiB9XG5cbiAgZm9yIChibGtJZHggPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMTsgYmxrSWR4ID49IDA7IGJsa0lkeC0tKSB7XG4gICAgaWYgKHN0YXRlLnRva2Vuc1tibGtJZHhdLnR5cGUgIT09ICdpbmxpbmUnKSB7IGNvbnRpbnVlIH1cblxuICAgIGlmIChTQ09QRURfQUJCUl9URVNUX1JFLnRlc3Qoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY29udGVudCkpIHtcbiAgICAgIHJlcGxhY2Vfc2NvcGVkKHN0YXRlLnRva2Vuc1tibGtJZHhdLmNoaWxkcmVuKVxuICAgIH1cblxuICAgIGlmIChSQVJFX1JFLnRlc3Qoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY29udGVudCkpIHtcbiAgICAgIHJlcGxhY2VfcmFyZShzdGF0ZS50b2tlbnNbYmxrSWR4XS5jaGlsZHJlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8vIENvbnZlcnQgc3RyYWlnaHQgcXVvdGF0aW9uIG1hcmtzIHRvIHR5cG9ncmFwaGljIG9uZXNcbi8vXG5cbmltcG9ydCB7IGlzV2hpdGVTcGFjZSwgaXNQdW5jdENoYXIsIGlzTWRBc2NpaVB1bmN0IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgUVVPVEVfVEVTVF9SRSA9IC9bJ1wiXS9cbmNvbnN0IFFVT1RFX1JFID0gL1snXCJdL2dcbmNvbnN0IEFQT1NUUk9QSEUgPSAnXFx1MjAxOScgLyog4oCZICovXG5cbmZ1bmN0aW9uIHJlcGxhY2VBdCAoc3RyLCBpbmRleCwgY2gpIHtcbiAgcmV0dXJuIHN0ci5zbGljZSgwLCBpbmRleCkgKyBjaCArIHN0ci5zbGljZShpbmRleCArIDEpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NfaW5saW5lcyAodG9rZW5zLCBzdGF0ZSkge1xuICBsZXQgalxuXG4gIGNvbnN0IHN0YWNrID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICBjb25zdCB0aGlzTGV2ZWwgPSB0b2tlbnNbaV0ubGV2ZWxcblxuICAgIGZvciAoaiA9IHN0YWNrLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBpZiAoc3RhY2tbal0ubGV2ZWwgPD0gdGhpc0xldmVsKSB7IGJyZWFrIH1cbiAgICB9XG4gICAgc3RhY2subGVuZ3RoID0gaiArIDFcblxuICAgIGlmICh0b2tlbi50eXBlICE9PSAndGV4dCcpIHsgY29udGludWUgfVxuXG4gICAgbGV0IHRleHQgPSB0b2tlbi5jb250ZW50XG4gICAgbGV0IHBvcyA9IDBcbiAgICBsZXQgbWF4ID0gdGV4dC5sZW5ndGhcblxuICAgIC8qIGVzbGludCBuby1sYWJlbHM6MCxibG9jay1zY29wZWQtdmFyOjAgKi9cbiAgICBPVVRFUjpcbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBRVU9URV9SRS5sYXN0SW5kZXggPSBwb3NcbiAgICAgIGNvbnN0IHQgPSBRVU9URV9SRS5leGVjKHRleHQpXG4gICAgICBpZiAoIXQpIHsgYnJlYWsgfVxuXG4gICAgICBsZXQgY2FuT3BlbiA9IHRydWVcbiAgICAgIGxldCBjYW5DbG9zZSA9IHRydWVcbiAgICAgIHBvcyA9IHQuaW5kZXggKyAxXG4gICAgICBjb25zdCBpc1NpbmdsZSA9ICh0WzBdID09PSBcIidcIilcblxuICAgICAgLy8gRmluZCBwcmV2aW91cyBjaGFyYWN0ZXIsXG4gICAgICAvLyBkZWZhdWx0IHRvIHNwYWNlIGlmIGl0J3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgLy9cbiAgICAgIGxldCBsYXN0Q2hhciA9IDB4MjBcblxuICAgICAgaWYgKHQuaW5kZXggLSAxID49IDApIHtcbiAgICAgICAgbGFzdENoYXIgPSB0ZXh0LmNoYXJDb2RlQXQodC5pbmRleCAtIDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBpZiAodG9rZW5zW2pdLnR5cGUgPT09ICdzb2Z0YnJlYWsnIHx8IHRva2Vuc1tqXS50eXBlID09PSAnaGFyZGJyZWFrJykgYnJlYWsgLy8gbGFzdENoYXIgZGVmYXVsdHMgdG8gMHgyMFxuICAgICAgICAgIGlmICghdG9rZW5zW2pdLmNvbnRlbnQpIGNvbnRpbnVlIC8vIHNob3VsZCBza2lwIGFsbCB0b2tlbnMgZXhjZXB0ICd0ZXh0JywgJ2h0bWxfaW5saW5lJyBvciAnY29kZV9pbmxpbmUnXG5cbiAgICAgICAgICBsYXN0Q2hhciA9IHRva2Vuc1tqXS5jb250ZW50LmNoYXJDb2RlQXQodG9rZW5zW2pdLmNvbnRlbnQubGVuZ3RoIC0gMSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBjaGFyYWN0ZXIsXG4gICAgICAvLyBkZWZhdWx0IHRvIHNwYWNlIGlmIGl0J3MgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgLy9cbiAgICAgIGxldCBuZXh0Q2hhciA9IDB4MjBcblxuICAgICAgaWYgKHBvcyA8IG1heCkge1xuICAgICAgICBuZXh0Q2hhciA9IHRleHQuY2hhckNvZGVBdChwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0b2tlbnNbal0udHlwZSA9PT0gJ3NvZnRicmVhaycgfHwgdG9rZW5zW2pdLnR5cGUgPT09ICdoYXJkYnJlYWsnKSBicmVhayAvLyBuZXh0Q2hhciBkZWZhdWx0cyB0byAweDIwXG4gICAgICAgICAgaWYgKCF0b2tlbnNbal0uY29udGVudCkgY29udGludWUgLy8gc2hvdWxkIHNraXAgYWxsIHRva2VucyBleGNlcHQgJ3RleHQnLCAnaHRtbF9pbmxpbmUnIG9yICdjb2RlX2lubGluZSdcblxuICAgICAgICAgIG5leHRDaGFyID0gdG9rZW5zW2pdLmNvbnRlbnQuY2hhckNvZGVBdCgwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNMYXN0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobGFzdENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobGFzdENoYXIpKVxuICAgICAgY29uc3QgaXNOZXh0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobmV4dENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXIpKVxuXG4gICAgICBjb25zdCBpc0xhc3RXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKGxhc3RDaGFyKVxuICAgICAgY29uc3QgaXNOZXh0V2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZShuZXh0Q2hhcilcblxuICAgICAgaWYgKGlzTmV4dFdoaXRlU3BhY2UpIHtcbiAgICAgICAgY2FuT3BlbiA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzTmV4dFB1bmN0Q2hhcikge1xuICAgICAgICBpZiAoIShpc0xhc3RXaGl0ZVNwYWNlIHx8IGlzTGFzdFB1bmN0Q2hhcikpIHtcbiAgICAgICAgICBjYW5PcGVuID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNMYXN0V2hpdGVTcGFjZSkge1xuICAgICAgICBjYW5DbG9zZSA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzTGFzdFB1bmN0Q2hhcikge1xuICAgICAgICBpZiAoIShpc05leHRXaGl0ZVNwYWNlIHx8IGlzTmV4dFB1bmN0Q2hhcikpIHtcbiAgICAgICAgICBjYW5DbG9zZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDaGFyID09PSAweDIyIC8qIFwiICovICYmIHRbMF0gPT09ICdcIicpIHtcbiAgICAgICAgaWYgKGxhc3RDaGFyID49IDB4MzAgLyogMCAqLyAmJiBsYXN0Q2hhciA8PSAweDM5IC8qIDkgKi8pIHtcbiAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IDFcIlwiIC0gY291bnQgZmlyc3QgcXVvdGUgYXMgYW4gaW5jaFxuICAgICAgICAgIGNhbkNsb3NlID0gY2FuT3BlbiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhbk9wZW4gJiYgY2FuQ2xvc2UpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBxdW90ZXMgaW4gdGhlIG1pZGRsZSBvZiBwdW5jdHVhdGlvbiBzZXF1ZW5jZSwgYnV0IG5vdFxuICAgICAgICAvLyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB3b3JkcywgaS5lLjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gMS4gZm9vIFwiIGJhciBcIiBiYXogLSBub3QgcmVwbGFjZWRcbiAgICAgICAgLy8gMi4gZm9vLVwiLWJhci1cIi1iYXogLSByZXBsYWNlZFxuICAgICAgICAvLyAzLiBmb29cImJhclwiYmF6ICAgICAtIG5vdCByZXBsYWNlZFxuICAgICAgICAvL1xuICAgICAgICBjYW5PcGVuID0gaXNMYXN0UHVuY3RDaGFyXG4gICAgICAgIGNhbkNsb3NlID0gaXNOZXh0UHVuY3RDaGFyXG4gICAgICB9XG5cbiAgICAgIGlmICghY2FuT3BlbiAmJiAhY2FuQ2xvc2UpIHtcbiAgICAgICAgLy8gbWlkZGxlIG9mIHdvcmRcbiAgICAgICAgaWYgKGlzU2luZ2xlKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHJlcGxhY2VBdCh0b2tlbi5jb250ZW50LCB0LmluZGV4LCBBUE9TVFJPUEhFKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5DbG9zZSkge1xuICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgY2xvc2luZyBxdW90ZSwgcmV3aW5kIHRoZSBzdGFjayB0byBnZXQgYSBtYXRjaFxuICAgICAgICBmb3IgKGogPSBzdGFjay5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGxldCBpdGVtID0gc3RhY2tbal1cbiAgICAgICAgICBpZiAoc3RhY2tbal0ubGV2ZWwgPCB0aGlzTGV2ZWwpIHsgYnJlYWsgfVxuICAgICAgICAgIGlmIChpdGVtLnNpbmdsZSA9PT0gaXNTaW5nbGUgJiYgc3RhY2tbal0ubGV2ZWwgPT09IHRoaXNMZXZlbCkge1xuICAgICAgICAgICAgaXRlbSA9IHN0YWNrW2pdXG5cbiAgICAgICAgICAgIGxldCBvcGVuUXVvdGVcbiAgICAgICAgICAgIGxldCBjbG9zZVF1b3RlXG4gICAgICAgICAgICBpZiAoaXNTaW5nbGUpIHtcbiAgICAgICAgICAgICAgb3BlblF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbMl1cbiAgICAgICAgICAgICAgY2xvc2VRdW90ZSA9IHN0YXRlLm1kLm9wdGlvbnMucXVvdGVzWzNdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcGVuUXVvdGUgPSBzdGF0ZS5tZC5vcHRpb25zLnF1b3Rlc1swXVxuICAgICAgICAgICAgICBjbG9zZVF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbMV1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVwbGFjZSB0b2tlbi5jb250ZW50ICpiZWZvcmUqIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50LFxuICAgICAgICAgICAgLy8gYmVjYXVzZSwgaWYgdGhleSBhcmUgcG9pbnRpbmcgYXQgdGhlIHNhbWUgdG9rZW4sIHJlcGxhY2VBdFxuICAgICAgICAgICAgLy8gY291bGQgbWVzcyB1cCBpbmRpY2VzIHdoZW4gcXVvdGUgbGVuZ3RoICE9IDFcbiAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgY2xvc2VRdW90ZSlcbiAgICAgICAgICAgIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50ID0gcmVwbGFjZUF0KFxuICAgICAgICAgICAgICB0b2tlbnNbaXRlbS50b2tlbl0uY29udGVudCwgaXRlbS5wb3MsIG9wZW5RdW90ZSlcblxuICAgICAgICAgICAgcG9zICs9IGNsb3NlUXVvdGUubGVuZ3RoIC0gMVxuICAgICAgICAgICAgaWYgKGl0ZW0udG9rZW4gPT09IGkpIHsgcG9zICs9IG9wZW5RdW90ZS5sZW5ndGggLSAxIH1cblxuICAgICAgICAgICAgdGV4dCA9IHRva2VuLmNvbnRlbnRcbiAgICAgICAgICAgIG1heCA9IHRleHQubGVuZ3RoXG5cbiAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGpcbiAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5PcGVuKSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIHRva2VuOiBpLFxuICAgICAgICAgIHBvczogdC5pbmRleCxcbiAgICAgICAgICBzaW5nbGU6IGlzU2luZ2xlLFxuICAgICAgICAgIGxldmVsOiB0aGlzTGV2ZWxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoY2FuQ2xvc2UgJiYgaXNTaW5nbGUpIHtcbiAgICAgICAgdG9rZW4uY29udGVudCA9IHJlcGxhY2VBdCh0b2tlbi5jb250ZW50LCB0LmluZGV4LCBBUE9TVFJPUEhFKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbWFydHF1b3RlcyAoc3RhdGUpIHtcbiAgLyogZXNsaW50IG1heC1kZXB0aDowICovXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy50eXBvZ3JhcGhlcikgeyByZXR1cm4gfVxuXG4gIGZvciAobGV0IGJsa0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxOyBibGtJZHggPj0gMDsgYmxrSWR4LS0pIHtcbiAgICBpZiAoc3RhdGUudG9rZW5zW2Jsa0lkeF0udHlwZSAhPT0gJ2lubGluZScgfHxcbiAgICAgICAgIVFVT1RFX1RFU1RfUkUudGVzdChzdGF0ZS50b2tlbnNbYmxrSWR4XS5jb250ZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBwcm9jZXNzX2lubGluZXMoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY2hpbGRyZW4sIHN0YXRlKVxuICB9XG59XG4iLCIvKiogaW50ZXJuYWxcbiAqIGNsYXNzIENvcmVcbiAqXG4gKiBUb3AtbGV2ZWwgcnVsZXMgZXhlY3V0b3IuIEdsdWVzIGJsb2NrL2lubGluZSBwYXJzZXJzIGFuZCBkb2VzIGludGVybWVkaWF0ZVxuICogdHJhbnNmb3JtYXRpb25zLlxuICoqL1xuXG5pbXBvcnQgUnVsZXIgZnJvbSAnLi9ydWxlci5tanMnXG5pbXBvcnQgU3RhdGVDb3JlIGZyb20gJy4vcnVsZXNfY29yZS9zdGF0ZV9jb3JlLm1qcydcblxuaW1wb3J0IHJfbm9ybWFsaXplIGZyb20gJy4vcnVsZXNfY29yZS9ub3JtYWxpemUubWpzJ1xuaW1wb3J0IHJfYmxvY2sgZnJvbSAnLi9ydWxlc19jb3JlL2Jsb2NrLm1qcydcbmltcG9ydCByX2lubGluZSBmcm9tICcuL3J1bGVzX2NvcmUvaW5saW5lLm1qcydcbmltcG9ydCByX2xpbmtpZnkgZnJvbSAnLi9ydWxlc19jb3JlL2xpbmtpZnkubWpzJ1xuaW1wb3J0IHJfcmVwbGFjZW1lbnRzIGZyb20gJy4vcnVsZXNfY29yZS9yZXBsYWNlbWVudHMubWpzJ1xuaW1wb3J0IHJfc21hcnRxdW90ZXMgZnJvbSAnLi9ydWxlc19jb3JlL3NtYXJ0cXVvdGVzLm1qcydcbmltcG9ydCByX3RleHRfam9pbiBmcm9tICcuL3J1bGVzX2NvcmUvdGV4dF9qb2luLm1qcydcblxuY29uc3QgX3J1bGVzID0gW1xuICBbJ25vcm1hbGl6ZScsICAgICAgcl9ub3JtYWxpemVdLFxuICBbJ2Jsb2NrJywgICAgICAgICAgcl9ibG9ja10sXG4gIFsnaW5saW5lJywgICAgICAgICByX2lubGluZV0sXG4gIFsnbGlua2lmeScsICAgICAgICByX2xpbmtpZnldLFxuICBbJ3JlcGxhY2VtZW50cycsICAgcl9yZXBsYWNlbWVudHNdLFxuICBbJ3NtYXJ0cXVvdGVzJywgICAgcl9zbWFydHF1b3Rlc10sXG4gIC8vIGB0ZXh0X2pvaW5gIGZpbmRzIGB0ZXh0X3NwZWNpYWxgIHRva2VucyAoZm9yIGVzY2FwZSBzZXF1ZW5jZXMpXG4gIC8vIGFuZCBqb2lucyB0aGVtIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRleHRcbiAgWyd0ZXh0X2pvaW4nLCAgICAgIHJfdGV4dF9qb2luXVxuXVxuXG4vKipcbiAqIG5ldyBDb3JlKClcbiAqKi9cbmZ1bmN0aW9uIENvcmUgKCkge1xuICAvKipcbiAgICogQ29yZSNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBjb3JlIHJ1bGVzLlxuICAgKiovXG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlci5wdXNoKF9ydWxlc1tpXVswXSwgX3J1bGVzW2ldWzFdKVxuICB9XG59XG5cbi8qKlxuICogQ29yZS5wcm9jZXNzKHN0YXRlKVxuICpcbiAqIEV4ZWN1dGVzIGNvcmUgY2hhaW4gcnVsZXMuXG4gKiovXG5Db3JlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHJ1bGVzW2ldKHN0YXRlKVxuICB9XG59XG5cbkNvcmUucHJvdG90eXBlLlN0YXRlID0gU3RhdGVDb3JlXG5cbmV4cG9ydCBkZWZhdWx0IENvcmVcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJsb2NrIChzdGF0ZSkge1xuICBsZXQgdG9rZW5cblxuICBpZiAoc3RhdGUuaW5saW5lTW9kZSkge1xuICAgIHRva2VuICAgICAgICAgID0gbmV3IHN0YXRlLlRva2VuKCdpbmxpbmUnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ICA9IHN0YXRlLnNyY1xuICAgIHRva2VuLm1hcCAgICAgID0gWzAsIDFdXG4gICAgdG9rZW4uY2hpbGRyZW4gPSBbXVxuICAgIHN0YXRlLnRva2Vucy5wdXNoKHRva2VuKVxuICB9IGVsc2Uge1xuICAgIHN0YXRlLm1kLmJsb2NrLnBhcnNlKHN0YXRlLnNyYywgc3RhdGUubWQsIHN0YXRlLmVudiwgc3RhdGUudG9rZW5zKVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmxpbmUgKHN0YXRlKSB7XG4gIGNvbnN0IHRva2VucyA9IHN0YXRlLnRva2Vuc1xuXG4gIC8vIFBhcnNlIGlubGluZXNcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgdG9rID0gdG9rZW5zW2ldXG4gICAgaWYgKHRvay50eXBlID09PSAnaW5saW5lJykge1xuICAgICAgc3RhdGUubWQuaW5saW5lLnBhcnNlKHRvay5jb250ZW50LCBzdGF0ZS5tZCwgc3RhdGUuZW52LCB0b2suY2hpbGRyZW4pXG4gICAgfVxuICB9XG59XG4iLCIvLyBKb2luIHJhdyB0ZXh0IHRva2VucyB3aXRoIHRoZSByZXN0IG9mIHRoZSB0ZXh0XG4vL1xuLy8gVGhpcyBpcyBzZXQgYXMgYSBzZXBhcmF0ZSBydWxlIHRvIHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgZm9yIHBsdWdpbnNcbi8vIHRvIHJ1biB0ZXh0IHJlcGxhY2VtZW50cyBhZnRlciB0ZXh0IGpvaW4sIGJ1dCBiZWZvcmUgZXNjYXBlIGpvaW4uXG4vL1xuLy8gRm9yIGV4YW1wbGUsIGBcXDopYCBzaG91bGRuJ3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBlbW9qaS5cbi8vXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRleHRfam9pbiAoc3RhdGUpIHtcbiAgbGV0IGN1cnIsIGxhc3RcbiAgY29uc3QgYmxvY2tUb2tlbnMgPSBzdGF0ZS50b2tlbnNcbiAgY29uc3QgbCA9IGJsb2NrVG9rZW5zLmxlbmd0aFxuXG4gIGZvciAobGV0IGogPSAwOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnKSBjb250aW51ZVxuXG4gICAgY29uc3QgdG9rZW5zID0gYmxvY2tUb2tlbnNbal0uY2hpbGRyZW5cbiAgICBjb25zdCBtYXggPSB0b2tlbnMubGVuZ3RoXG5cbiAgICBmb3IgKGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICAgIGlmICh0b2tlbnNbY3Vycl0udHlwZSA9PT0gJ3RleHRfc3BlY2lhbCcpIHtcbiAgICAgICAgdG9rZW5zW2N1cnJdLnR5cGUgPSAndGV4dCdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGN1cnIgPSBsYXN0ID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgICBpZiAodG9rZW5zW2N1cnJdLnR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgICAgIGN1cnIgKyAxIDwgbWF4ICYmXG4gICAgICAgICAgdG9rZW5zW2N1cnIgKyAxXS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgLy8gY29sbGFwc2UgdHdvIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50ID0gdG9rZW5zW2N1cnJdLmNvbnRlbnQgKyB0b2tlbnNbY3VyciArIDFdLmNvbnRlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXJyICE9PSBsYXN0KSB7IHRva2Vuc1tsYXN0XSA9IHRva2Vuc1tjdXJyXSB9XG5cbiAgICAgICAgbGFzdCsrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnIgIT09IGxhc3QpIHtcbiAgICAgIHRva2Vucy5sZW5ndGggPSBsYXN0XG4gICAgfVxuICB9XG59XG4iLCIvLyBQYXJzZXIgc3RhdGUgY2xhc3NcblxuaW1wb3J0IFRva2VuIGZyb20gJy4uL3Rva2VuLm1qcydcbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5mdW5jdGlvbiBTdGF0ZUJsb2NrIChzcmMsIG1kLCBlbnYsIHRva2Vucykge1xuICB0aGlzLnNyYyA9IHNyY1xuXG4gIC8vIGxpbmsgdG8gcGFyc2VyIGluc3RhbmNlXG4gIHRoaXMubWQgICAgID0gbWRcblxuICB0aGlzLmVudiA9IGVudlxuXG4gIC8vXG4gIC8vIEludGVybmFsIHN0YXRlIHZhcnRpYWJsZXNcbiAgLy9cblxuICB0aGlzLnRva2VucyA9IHRva2Vuc1xuXG4gIHRoaXMuYk1hcmtzID0gW10gIC8vIGxpbmUgYmVnaW4gb2Zmc2V0cyBmb3IgZmFzdCBqdW1wc1xuICB0aGlzLmVNYXJrcyA9IFtdICAvLyBsaW5lIGVuZCBvZmZzZXRzIGZvciBmYXN0IGp1bXBzXG4gIHRoaXMudFNoaWZ0ID0gW10gIC8vIG9mZnNldHMgb2YgdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyYWN0ZXJzICh0YWJzIG5vdCBleHBhbmRlZClcbiAgdGhpcy5zQ291bnQgPSBbXSAgLy8gaW5kZW50cyBmb3IgZWFjaCBsaW5lICh0YWJzIGV4cGFuZGVkKVxuXG4gIC8vIEFuIGFtb3VudCBvZiB2aXJ0dWFsIHNwYWNlcyAodGFicyBleHBhbmRlZCkgYmV0d2VlbiBiZWdpbm5pbmdcbiAgLy8gb2YgZWFjaCBsaW5lIChiTWFya3MpIGFuZCByZWFsIGJlZ2lubmluZyBvZiB0aGF0IGxpbmUuXG4gIC8vXG4gIC8vIEl0IGV4aXN0cyBvbmx5IGFzIGEgaGFjayBiZWNhdXNlIGJsb2NrcXVvdGVzIG92ZXJyaWRlIGJNYXJrc1xuICAvLyBsb3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHByb2Nlc3MuXG4gIC8vXG4gIC8vIEl0J3MgdXNlZCBvbmx5IHdoZW4gZXhwYW5kaW5nIHRhYnMsIHlvdSBjYW4gdGhpbmsgYWJvdXQgaXQgYXNcbiAgLy8gYW4gaW5pdGlhbCB0YWIgbGVuZ3RoLCBlLmcuIGJzQ291bnQ9MjEgYXBwbGllZCB0byBzdHJpbmcgYFxcdDEyM2BcbiAgLy8gbWVhbnMgZmlyc3QgdGFiIHNob3VsZCBiZSBleHBhbmRlZCB0byA0LTIxJTQgPT09IDMgc3BhY2VzLlxuICAvL1xuICB0aGlzLmJzQ291bnQgPSBbXVxuXG4gIC8vIGJsb2NrIHBhcnNlciB2YXJpYWJsZXNcblxuICAvLyByZXF1aXJlZCBibG9jayBjb250ZW50IGluZGVudCAoZm9yIGV4YW1wbGUsIGlmIHdlIGFyZVxuICAvLyBpbnNpZGUgYSBsaXN0LCBpdCB3b3VsZCBiZSBwb3NpdGlvbmVkIGFmdGVyIGxpc3QgbWFya2VyKVxuICB0aGlzLmJsa0luZGVudCAgPSAwXG4gIHRoaXMubGluZSAgICAgICA9IDAgLy8gbGluZSBpbmRleCBpbiBzcmNcbiAgdGhpcy5saW5lTWF4ICAgID0gMCAvLyBsaW5lcyBjb3VudFxuICB0aGlzLnRpZ2h0ICAgICAgPSBmYWxzZSAgLy8gbG9vc2UvdGlnaHQgbW9kZSBmb3IgbGlzdHNcbiAgdGhpcy5kZEluZGVudCAgID0gLTEgLy8gaW5kZW50IG9mIHRoZSBjdXJyZW50IGRkIGJsb2NrICgtMSBpZiB0aGVyZSBpc24ndCBhbnkpXG4gIHRoaXMubGlzdEluZGVudCA9IC0xIC8vIGluZGVudCBvZiB0aGUgY3VycmVudCBsaXN0IGJsb2NrICgtMSBpZiB0aGVyZSBpc24ndCBhbnkpXG5cbiAgLy8gY2FuIGJlICdibG9ja3F1b3RlJywgJ2xpc3QnLCAncm9vdCcsICdwYXJhZ3JhcGgnIG9yICdyZWZlcmVuY2UnXG4gIC8vIHVzZWQgaW4gbGlzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgaW50ZXJydXB0IGEgcGFyYWdyYXBoXG4gIHRoaXMucGFyZW50VHlwZSA9ICdyb290J1xuXG4gIHRoaXMubGV2ZWwgPSAwXG5cbiAgLy8gQ3JlYXRlIGNhY2hlc1xuICAvLyBHZW5lcmF0ZSBtYXJrZXJzLlxuICBjb25zdCBzID0gdGhpcy5zcmNcblxuICBmb3IgKGxldCBzdGFydCA9IDAsIHBvcyA9IDAsIGluZGVudCA9IDAsIG9mZnNldCA9IDAsIGxlbiA9IHMubGVuZ3RoLCBpbmRlbnRfZm91bmQgPSBmYWxzZTsgcG9zIDwgbGVuOyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gcy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmICghaW5kZW50X2ZvdW5kKSB7XG4gICAgICBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgICAgaW5kZW50KytcblxuICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICBvZmZzZXQgKz0gNCAtIG9mZnNldCAlIDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnRfZm91bmQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAweDBBIHx8IHBvcyA9PT0gbGVuIC0gMSkge1xuICAgICAgaWYgKGNoICE9PSAweDBBKSB7IHBvcysrIH1cbiAgICAgIHRoaXMuYk1hcmtzLnB1c2goc3RhcnQpXG4gICAgICB0aGlzLmVNYXJrcy5wdXNoKHBvcylcbiAgICAgIHRoaXMudFNoaWZ0LnB1c2goaW5kZW50KVxuICAgICAgdGhpcy5zQ291bnQucHVzaChvZmZzZXQpXG4gICAgICB0aGlzLmJzQ291bnQucHVzaCgwKVxuXG4gICAgICBpbmRlbnRfZm91bmQgPSBmYWxzZVxuICAgICAgaW5kZW50ID0gMFxuICAgICAgb2Zmc2V0ID0gMFxuICAgICAgc3RhcnQgPSBwb3MgKyAxXG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBmYWtlIGVudHJ5IHRvIHNpbXBsaWZ5IGNhY2hlIGJvdW5kcyBjaGVja3NcbiAgdGhpcy5iTWFya3MucHVzaChzLmxlbmd0aClcbiAgdGhpcy5lTWFya3MucHVzaChzLmxlbmd0aClcbiAgdGhpcy50U2hpZnQucHVzaCgwKVxuICB0aGlzLnNDb3VudC5wdXNoKDApXG4gIHRoaXMuYnNDb3VudC5wdXNoKDApXG5cbiAgdGhpcy5saW5lTWF4ID0gdGhpcy5iTWFya3MubGVuZ3RoIC0gMSAvLyBkb24ndCBjb3VudCBsYXN0IGZha2UgbGluZVxufVxuXG4vLyBQdXNoIG5ldyB0b2tlbiB0byBcInN0cmVhbVwiLlxuLy9cblN0YXRlQmxvY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodHlwZSwgdGFnLCBuZXN0aW5nKSB7XG4gIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKHR5cGUsIHRhZywgbmVzdGluZylcbiAgdG9rZW4uYmxvY2sgPSB0cnVlXG5cbiAgaWYgKG5lc3RpbmcgPCAwKSB0aGlzLmxldmVsLS0gLy8gY2xvc2luZyB0YWdcbiAgdG9rZW4ubGV2ZWwgPSB0aGlzLmxldmVsXG4gIGlmIChuZXN0aW5nID4gMCkgdGhpcy5sZXZlbCsrIC8vIG9wZW5pbmcgdGFnXG5cbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgcmV0dXJuIHRva2VuXG59XG5cblN0YXRlQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5IChsaW5lKSB7XG4gIHJldHVybiB0aGlzLmJNYXJrc1tsaW5lXSArIHRoaXMudFNoaWZ0W2xpbmVdID49IHRoaXMuZU1hcmtzW2xpbmVdXG59XG5cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBFbXB0eUxpbmVzID0gZnVuY3Rpb24gc2tpcEVtcHR5TGluZXMgKGZyb20pIHtcbiAgZm9yIChsZXQgbWF4ID0gdGhpcy5saW5lTWF4OyBmcm9tIDwgbWF4OyBmcm9tKyspIHtcbiAgICBpZiAodGhpcy5iTWFya3NbZnJvbV0gKyB0aGlzLnRTaGlmdFtmcm9tXSA8IHRoaXMuZU1hcmtzW2Zyb21dKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnJvbVxufVxuXG4vLyBTa2lwIHNwYWNlcyBmcm9tIGdpdmVuIHBvc2l0aW9uLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcFNwYWNlcyA9IGZ1bmN0aW9uIHNraXBTcGFjZXMgKHBvcykge1xuICBmb3IgKGxldCBtYXggPSB0aGlzLnNyYy5sZW5ndGg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmICghaXNTcGFjZShjaCkpIHsgYnJlYWsgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBzcGFjZXMgZnJvbSBnaXZlbiBwb3NpdGlvbiBpbiByZXZlcnNlLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcFNwYWNlc0JhY2sgPSBmdW5jdGlvbiBza2lwU3BhY2VzQmFjayAocG9zLCBtaW4pIHtcbiAgaWYgKHBvcyA8PSBtaW4pIHsgcmV0dXJuIHBvcyB9XG5cbiAgd2hpbGUgKHBvcyA+IG1pbikge1xuICAgIGlmICghaXNTcGFjZSh0aGlzLnNyYy5jaGFyQ29kZUF0KC0tcG9zKSkpIHsgcmV0dXJuIHBvcyArIDEgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBjaGFyIGNvZGVzIGZyb20gZ2l2ZW4gcG9zaXRpb25cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBDaGFycyA9IGZ1bmN0aW9uIHNraXBDaGFycyAocG9zLCBjb2RlKSB7XG4gIGZvciAobGV0IG1heCA9IHRoaXMuc3JjLmxlbmd0aDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGlmICh0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IGNvZGUpIHsgYnJlYWsgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBjaGFyIGNvZGVzIHJldmVyc2UgZnJvbSBnaXZlbiBwb3NpdGlvbiAtIDFcblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBDaGFyc0JhY2sgPSBmdW5jdGlvbiBza2lwQ2hhcnNCYWNrIChwb3MsIGNvZGUsIG1pbikge1xuICBpZiAocG9zIDw9IG1pbikgeyByZXR1cm4gcG9zIH1cblxuICB3aGlsZSAocG9zID4gbWluKSB7XG4gICAgaWYgKGNvZGUgIT09IHRoaXMuc3JjLmNoYXJDb2RlQXQoLS1wb3MpKSB7IHJldHVybiBwb3MgKyAxIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIGN1dCBsaW5lcyByYW5nZSBmcm9tIHNvdXJjZS5cblN0YXRlQmxvY2sucHJvdG90eXBlLmdldExpbmVzID0gZnVuY3Rpb24gZ2V0TGluZXMgKGJlZ2luLCBlbmQsIGluZGVudCwga2VlcExhc3RMRikge1xuICBpZiAoYmVnaW4gPj0gZW5kKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBxdWV1ZSA9IG5ldyBBcnJheShlbmQgLSBiZWdpbilcblxuICBmb3IgKGxldCBpID0gMCwgbGluZSA9IGJlZ2luOyBsaW5lIDwgZW5kOyBsaW5lKyssIGkrKykge1xuICAgIGxldCBsaW5lSW5kZW50ID0gMFxuICAgIGNvbnN0IGxpbmVTdGFydCA9IHRoaXMuYk1hcmtzW2xpbmVdXG4gICAgbGV0IGZpcnN0ID0gbGluZVN0YXJ0XG4gICAgbGV0IGxhc3RcblxuICAgIGlmIChsaW5lICsgMSA8IGVuZCB8fCBrZWVwTGFzdExGKSB7XG4gICAgICAvLyBObyBuZWVkIGZvciBib3VuZHMgY2hlY2sgYmVjYXVzZSB3ZSBoYXZlIGZha2UgZW50cnkgb24gdGFpbC5cbiAgICAgIGxhc3QgPSB0aGlzLmVNYXJrc1tsaW5lXSArIDFcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IHRoaXMuZU1hcmtzW2xpbmVdXG4gICAgfVxuXG4gICAgd2hpbGUgKGZpcnN0IDwgbGFzdCAmJiBsaW5lSW5kZW50IDwgaW5kZW50KSB7XG4gICAgICBjb25zdCBjaCA9IHRoaXMuc3JjLmNoYXJDb2RlQXQoZmlyc3QpXG5cbiAgICAgIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICBsaW5lSW5kZW50ICs9IDQgLSAobGluZUluZGVudCArIHRoaXMuYnNDb3VudFtsaW5lXSkgJSA0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZUluZGVudCsrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlyc3QgLSBsaW5lU3RhcnQgPCB0aGlzLnRTaGlmdFtsaW5lXSkge1xuICAgICAgICAvLyBwYXRjaGVkIHRTaGlmdCBtYXNrZWQgY2hhcmFjdGVycyB0byBsb29rIGxpa2Ugc3BhY2VzIChibG9ja3F1b3RlcywgbGlzdCBtYXJrZXJzKVxuICAgICAgICBsaW5lSW5kZW50KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGZpcnN0KytcbiAgICB9XG5cbiAgICBpZiAobGluZUluZGVudCA+IGluZGVudCkge1xuICAgICAgLy8gcGFydGlhbGx5IGV4cGFuZGluZyB0YWJzIGluIGNvZGUgYmxvY2tzLCBlLmcgJ1xcdFxcdGZvb2JhcidcbiAgICAgIC8vIHdpdGggaW5kZW50PTIgYmVjb21lcyAnICBcXHRmb29iYXInXG4gICAgICBxdWV1ZVtpXSA9IG5ldyBBcnJheShsaW5lSW5kZW50IC0gaW5kZW50ICsgMSkuam9pbignICcpICsgdGhpcy5zcmMuc2xpY2UoZmlyc3QsIGxhc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlW2ldID0gdGhpcy5zcmMuc2xpY2UoZmlyc3QsIGxhc3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1ZXVlLmpvaW4oJycpXG59XG5cbi8vIHJlLWV4cG9ydCBUb2tlbiBjbGFzcyB0byB1c2UgaW4gYmxvY2sgcnVsZXNcblN0YXRlQmxvY2sucHJvdG90eXBlLlRva2VuID0gVG9rZW5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVCbG9ja1xuIiwiLy8gR0ZNIHRhYmxlLCBodHRwczovL2dpdGh1Yi5naXRodWIuY29tL2dmbS8jdGFibGVzLWV4dGVuc2lvbi1cblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbi8vIExpbWl0IHRoZSBhbW91bnQgb2YgZW1wdHkgYXV0b2NvbXBsZXRlZCBjZWxscyBpbiBhIHRhYmxlLFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9pc3N1ZXMvMTAwMCxcbi8vXG4vLyBCb3RoIHB1bGxkb3duLWNtYXJrIGFuZCBjb21tb25tYXJrLWhzIGxpbWl0IHRoZSBudW1iZXIgb2YgY2VsbHMgdGhpcyB3YXkgdG8gfjIwMGsuXG4vLyBXZSBzZXQgaXQgdG8gNjVrLCB3aGljaCBjYW4gZXhwYW5kIHVzZXIgaW5wdXQgYnkgYSBmYWN0b3Igb2YgeDM3MFxuLy8gKDI1NngyNTYgc3F1YXJlIGlzIDEuOGtCIGV4cGFuZGVkIGludG8gNjUwa0IpLlxuY29uc3QgTUFYX0FVVE9DT01QTEVURURfQ0VMTFMgPSAweDEwMDAwXG5cbmZ1bmN0aW9uIGdldExpbmUgKHN0YXRlLCBsaW5lKSB7XG4gIGNvbnN0IHBvcyA9IHN0YXRlLmJNYXJrc1tsaW5lXSArIHN0YXRlLnRTaGlmdFtsaW5lXVxuICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3NbbGluZV1cblxuICByZXR1cm4gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxufVxuXG5mdW5jdGlvbiBlc2NhcGVkU3BsaXQgKHN0cikge1xuICBjb25zdCByZXN1bHQgPSBbXVxuICBjb25zdCBtYXggPSBzdHIubGVuZ3RoXG5cbiAgbGV0IHBvcyA9IDBcbiAgbGV0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICBsZXQgaXNFc2NhcGVkID0gZmFsc2VcbiAgbGV0IGxhc3RQb3MgPSAwXG4gIGxldCBjdXJyZW50ID0gJydcblxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgaWYgKGNoID09PSAweDdjLyogfCAqLykge1xuICAgICAgaWYgKCFpc0VzY2FwZWQpIHtcbiAgICAgICAgLy8gcGlwZSBzZXBhcmF0aW5nIGNlbGxzLCAnfCdcbiAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudCArIHN0ci5zdWJzdHJpbmcobGFzdFBvcywgcG9zKSlcbiAgICAgICAgY3VycmVudCA9ICcnXG4gICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2NhcGVkIHBpcGUsICdcXHwnXG4gICAgICAgIGN1cnJlbnQgKz0gc3RyLnN1YnN0cmluZyhsYXN0UG9zLCBwb3MgLSAxKVxuICAgICAgICBsYXN0UG9zID0gcG9zXG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNFc2NhcGVkID0gKGNoID09PSAweDVjLyogXFwgKi8pXG4gICAgcG9zKytcblxuICAgIGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICB9XG5cbiAgcmVzdWx0LnB1c2goY3VycmVudCArIHN0ci5zdWJzdHJpbmcobGFzdFBvcykpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0YWJsZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIC8vIHNob3VsZCBoYXZlIGF0IGxlYXN0IHR3byBsaW5lc1xuICBpZiAoc3RhcnRMaW5lICsgMiA+IGVuZExpbmUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZWNvbmQgbGluZSBzaG91bGQgYmUgJ3wnLCAnLScsICc6JyxcbiAgLy8gYW5kIG5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgYnV0IHNwYWNlcztcbiAgLy8gYmFzaWNhbGx5LCB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIC9eWy06fF1bLTp8XFxzXSokLyByZWdleHBcblxuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgaWYgKHBvcyA+PSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgZmlyc3RDaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICBpZiAoZmlyc3RDaCAhPT0gMHg3Qy8qIHwgKi8gJiYgZmlyc3RDaCAhPT0gMHgyRC8qIC0gKi8gJiYgZmlyc3RDaCAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAocG9zID49IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBzZWNvbmRDaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICBpZiAoc2Vjb25kQ2ggIT09IDB4N0MvKiB8ICovICYmIHNlY29uZENoICE9PSAweDJELyogLSAqLyAmJiBzZWNvbmRDaCAhPT0gMHgzQS8qIDogKi8gJiYgIWlzU3BhY2Uoc2Vjb25kQ2gpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBpZiBmaXJzdCBjaGFyYWN0ZXIgaXMgJy0nLCB0aGVuIHNlY29uZCBjaGFyYWN0ZXIgbXVzdCBub3QgYmUgYSBzcGFjZVxuICAvLyAoZHVlIHRvIHBhcnNpbmcgYW1iaWd1aXR5IHdpdGggbGlzdClcbiAgaWYgKGZpcnN0Q2ggPT09IDB4MkQvKiAtICovICYmIGlzU3BhY2Uoc2Vjb25kQ2gpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgd2hpbGUgKHBvcyA8IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHtcbiAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmIChjaCAhPT0gMHg3Qy8qIHwgKi8gJiYgY2ggIT09IDB4MkQvKiAtICovICYmIGNoICE9PSAweDNBLyogOiAqLyAmJiAhaXNTcGFjZShjaCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHBvcysrXG4gIH1cblxuICBsZXQgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBzdGFydExpbmUgKyAxKVxuICBsZXQgY29sdW1ucyA9IGxpbmVUZXh0LnNwbGl0KCd8JylcbiAgY29uc3QgYWxpZ25zID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdCA9IGNvbHVtbnNbaV0udHJpbSgpXG4gICAgaWYgKCF0KSB7XG4gICAgICAvLyBhbGxvdyBlbXB0eSBjb2x1bW5zIGJlZm9yZSBhbmQgYWZ0ZXIgdGFibGUsIGJ1dCBub3QgaW4gYmV0d2VlbiBjb2x1bW5zO1xuICAgICAgLy8gZS5nLiBhbGxvdyBgIHwtLS18IGAsIGRpc2FsbG93IGAgLS0tfHwtLS0gYFxuICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gY29sdW1ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIS9eOj8tKzo/JC8udGVzdCh0KSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmICh0LmNoYXJDb2RlQXQodC5sZW5ndGggLSAxKSA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGFsaWducy5wdXNoKHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzQS8qIDogKi8gPyAnY2VudGVyJyA6ICdyaWdodCcpXG4gICAgfSBlbHNlIGlmICh0LmNoYXJDb2RlQXQoMCkgPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBhbGlnbnMucHVzaCgnbGVmdCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWducy5wdXNoKCcnKVxuICAgIH1cbiAgfVxuXG4gIGxpbmVUZXh0ID0gZ2V0TGluZShzdGF0ZSwgc3RhcnRMaW5lKS50cmltKClcbiAgaWYgKGxpbmVUZXh0LmluZGV4T2YoJ3wnKSA9PT0gLTEpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgY29sdW1ucyA9IGVzY2FwZWRTcGxpdChsaW5lVGV4dClcbiAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbMF0gPT09ICcnKSBjb2x1bW5zLnNoaWZ0KClcbiAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbY29sdW1ucy5sZW5ndGggLSAxXSA9PT0gJycpIGNvbHVtbnMucG9wKClcblxuICAvLyBoZWFkZXIgcm93IHdpbGwgZGVmaW5lIGFuIGFtb3VudCBvZiBjb2x1bW5zIGluIHRoZSBlbnRpcmUgdGFibGUsXG4gIC8vIGFuZCBhbGlnbiByb3cgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgKHRoZSByZXN0IG9mIHRoZSByb3dzIGNhbiBkaWZmZXIpXG4gIGNvbnN0IGNvbHVtbkNvdW50ID0gY29sdW1ucy5sZW5ndGhcbiAgaWYgKGNvbHVtbkNvdW50ID09PSAwIHx8IGNvbHVtbkNvdW50ICE9PSBhbGlnbnMubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICd0YWJsZSdcblxuICAvLyB1c2UgJ2Jsb2NrcXVvdGUnIGxpc3RzIGZvciB0ZXJtaW5hdGlvbiBiZWNhdXNlIGl0J3NcbiAgLy8gdGhlIG1vc3Qgc2ltaWxhciB0byB0YWJsZXNcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2Jsb2NrcXVvdGUnKVxuXG4gIGNvbnN0IHRva2VuX3RvID0gc3RhdGUucHVzaCgndGFibGVfb3BlbicsICd0YWJsZScsIDEpXG4gIGNvbnN0IHRhYmxlTGluZXMgPSBbc3RhcnRMaW5lLCAwXVxuICB0b2tlbl90by5tYXAgPSB0YWJsZUxpbmVzXG5cbiAgY29uc3QgdG9rZW5fdGhvID0gc3RhdGUucHVzaCgndGhlYWRfb3BlbicsICd0aGVhZCcsIDEpXG4gIHRva2VuX3Roby5tYXAgPSBbc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxXVxuXG4gIGNvbnN0IHRva2VuX2h0cm8gPSBzdGF0ZS5wdXNoKCd0cl9vcGVuJywgJ3RyJywgMSlcbiAgdG9rZW5faHRyby5tYXAgPSBbc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuX2hvID0gc3RhdGUucHVzaCgndGhfb3BlbicsICd0aCcsIDEpXG4gICAgaWYgKGFsaWduc1tpXSkge1xuICAgICAgdG9rZW5faG8uYXR0cnMgID0gW1snc3R5bGUnLCAndGV4dC1hbGlnbjonICsgYWxpZ25zW2ldXV1cbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbl9pbCA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICAgIHRva2VuX2lsLmNvbnRlbnQgID0gY29sdW1uc1tpXS50cmltKClcbiAgICB0b2tlbl9pbC5jaGlsZHJlbiA9IFtdXG5cbiAgICBzdGF0ZS5wdXNoKCd0aF9jbG9zZScsICd0aCcsIC0xKVxuICB9XG5cbiAgc3RhdGUucHVzaCgndHJfY2xvc2UnLCAndHInLCAtMSlcbiAgc3RhdGUucHVzaCgndGhlYWRfY2xvc2UnLCAndGhlYWQnLCAtMSlcblxuICBsZXQgdGJvZHlMaW5lc1xuICBsZXQgYXV0b2NvbXBsZXRlZENlbGxzID0gMFxuXG4gIGZvciAobmV4dExpbmUgPSBzdGFydExpbmUgKyAyOyBuZXh0TGluZSA8IGVuZExpbmU7IG5leHRMaW5lKyspIHtcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG4gICAgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBuZXh0TGluZSkudHJpbSgpXG4gICAgaWYgKCFsaW5lVGV4dCkgeyBicmVhayB9XG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyBicmVhayB9XG4gICAgY29sdW1ucyA9IGVzY2FwZWRTcGxpdChsaW5lVGV4dClcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggJiYgY29sdW1uc1swXSA9PT0gJycpIGNvbHVtbnMuc2hpZnQoKVxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCAmJiBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0gPT09ICcnKSBjb2x1bW5zLnBvcCgpXG5cbiAgICAvLyBub3RlOiBhdXRvY29tcGxldGUgY291bnQgY2FuIGJlIG5lZ2F0aXZlIGlmIHVzZXIgc3BlY2lmaWVzIG1vcmUgY29sdW1ucyB0aGFuIGhlYWRlcixcbiAgICAvLyBidXQgdGhhdCBkb2VzIG5vdCBhZmZlY3QgaW50ZW5kZWQgdXNlICh3aGljaCBpcyBsaW1pdGluZyBleHBhbnNpb24pXG4gICAgYXV0b2NvbXBsZXRlZENlbGxzICs9IGNvbHVtbkNvdW50IC0gY29sdW1ucy5sZW5ndGhcbiAgICBpZiAoYXV0b2NvbXBsZXRlZENlbGxzID4gTUFYX0FVVE9DT01QTEVURURfQ0VMTFMpIHsgYnJlYWsgfVxuXG4gICAgaWYgKG5leHRMaW5lID09PSBzdGFydExpbmUgKyAyKSB7XG4gICAgICBjb25zdCB0b2tlbl90Ym8gPSBzdGF0ZS5wdXNoKCd0Ym9keV9vcGVuJywgJ3Rib2R5JywgMSlcbiAgICAgIHRva2VuX3Riby5tYXAgPSB0Ym9keUxpbmVzID0gW3N0YXJ0TGluZSArIDIsIDBdXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5fdHJvID0gc3RhdGUucHVzaCgndHJfb3BlbicsICd0cicsIDEpXG4gICAgdG9rZW5fdHJvLm1hcCA9IFtuZXh0TGluZSwgbmV4dExpbmUgKyAxXVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB0b2tlbl90ZG8gPSBzdGF0ZS5wdXNoKCd0ZF9vcGVuJywgJ3RkJywgMSlcbiAgICAgIGlmIChhbGlnbnNbaV0pIHtcbiAgICAgICAgdG9rZW5fdGRvLmF0dHJzICA9IFtbJ3N0eWxlJywgJ3RleHQtYWxpZ246JyArIGFsaWduc1tpXV1dXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuX2lsID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gICAgICB0b2tlbl9pbC5jb250ZW50ICA9IGNvbHVtbnNbaV0gPyBjb2x1bW5zW2ldLnRyaW0oKSA6ICcnXG4gICAgICB0b2tlbl9pbC5jaGlsZHJlbiA9IFtdXG5cbiAgICAgIHN0YXRlLnB1c2goJ3RkX2Nsb3NlJywgJ3RkJywgLTEpXG4gICAgfVxuICAgIHN0YXRlLnB1c2goJ3RyX2Nsb3NlJywgJ3RyJywgLTEpXG4gIH1cblxuICBpZiAodGJvZHlMaW5lcykge1xuICAgIHN0YXRlLnB1c2goJ3Rib2R5X2Nsb3NlJywgJ3Rib2R5JywgLTEpXG4gICAgdGJvZHlMaW5lc1sxXSA9IG5leHRMaW5lXG4gIH1cblxuICBzdGF0ZS5wdXNoKCd0YWJsZV9jbG9zZScsICd0YWJsZScsIC0xKVxuICB0YWJsZUxpbmVzWzFdID0gbmV4dExpbmVcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIExpc3RzXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG4vLyBTZWFyY2ggYFstKypdW1xcbiBdYCwgcmV0dXJucyBuZXh0IHBvcyBhZnRlciBtYXJrZXIgb24gc3VjY2Vzc1xuLy8gb3IgLTEgb24gZmFpbC5cbmZ1bmN0aW9uIHNraXBCdWxsZXRMaXN0TWFya2VyIChzdGF0ZSwgc3RhcnRMaW5lKSB7XG4gIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG5cbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG4gIC8vIENoZWNrIGJ1bGxldFxuICBpZiAobWFya2VyICE9PSAweDJBLyogKiAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDJELyogLSAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDJCLyogKyAqLykge1xuICAgIHJldHVybiAtMVxuICB9XG5cbiAgaWYgKHBvcyA8IG1heCkge1xuICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKCFpc1NwYWNlKGNoKSkge1xuICAgICAgLy8gXCIgLXRlc3QgXCIgLSBpcyBub3QgYSBsaXN0IGl0ZW1cbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2VhcmNoIGBcXGQrWy4pXVtcXG4gXWAsIHJldHVybnMgbmV4dCBwb3MgYWZ0ZXIgbWFya2VyIG9uIHN1Y2Nlc3Ncbi8vIG9yIC0xIG9uIGZhaWwuXG5mdW5jdGlvbiBza2lwT3JkZXJlZExpc3RNYXJrZXIgKHN0YXRlLCBzdGFydExpbmUpIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIGxldCBwb3MgPSBzdGFydFxuXG4gIC8vIExpc3QgbWFya2VyIHNob3VsZCBoYXZlIGF0IGxlYXN0IDIgY2hhcnMgKGRpZ2l0ICsgZG90KVxuICBpZiAocG9zICsgMSA+PSBtYXgpIHsgcmV0dXJuIC0xIH1cblxuICBsZXQgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcblxuICBpZiAoY2ggPCAweDMwLyogMCAqLyB8fCBjaCA+IDB4MzkvKiA5ICovKSB7IHJldHVybiAtMSB9XG5cbiAgZm9yICg7Oykge1xuICAgIC8vIEVPTCAtPiBmYWlsXG4gICAgaWYgKHBvcyA+PSBtYXgpIHsgcmV0dXJuIC0xIH1cblxuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG5cbiAgICBpZiAoY2ggPj0gMHgzMC8qIDAgKi8gJiYgY2ggPD0gMHgzOS8qIDkgKi8pIHtcbiAgICAgIC8vIExpc3QgbWFya2VyIHNob3VsZCBoYXZlIG5vIG1vcmUgdGhhbiA5IGRpZ2l0c1xuICAgICAgLy8gKHByZXZlbnRzIGludGVnZXIgb3ZlcmZsb3cgaW4gYnJvd3NlcnMpXG4gICAgICBpZiAocG9zIC0gc3RhcnQgPj0gMTApIHsgcmV0dXJuIC0xIH1cblxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBmb3VuZCB2YWxpZCBtYXJrZXJcbiAgICBpZiAoY2ggPT09IDB4MjkvKiApICovIHx8IGNoID09PSAweDJlLyogLiAqLykge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIGlmIChwb3MgPCBtYXgpIHtcbiAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmICghaXNTcGFjZShjaCkpIHtcbiAgICAgIC8vIFwiIDEudGVzdCBcIiAtIGlzIG5vdCBhIGxpc3QgaXRlbVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuZnVuY3Rpb24gbWFya1RpZ2h0UGFyYWdyYXBocyAoc3RhdGUsIGlkeCkge1xuICBjb25zdCBsZXZlbCA9IHN0YXRlLmxldmVsICsgMlxuXG4gIGZvciAobGV0IGkgPSBpZHggKyAyLCBsID0gc3RhdGUudG9rZW5zLmxlbmd0aCAtIDI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoc3RhdGUudG9rZW5zW2ldLmxldmVsID09PSBsZXZlbCAmJiBzdGF0ZS50b2tlbnNbaV0udHlwZSA9PT0gJ3BhcmFncmFwaF9vcGVuJykge1xuICAgICAgc3RhdGUudG9rZW5zW2kgKyAyXS5oaWRkZW4gPSB0cnVlXG4gICAgICBzdGF0ZS50b2tlbnNbaV0uaGlkZGVuID0gdHJ1ZVxuICAgICAgaSArPSAyXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3QgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgbWF4LCBwb3MsIHN0YXJ0LCB0b2tlblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmVcbiAgbGV0IHRpZ2h0ID0gdHJ1ZVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBTcGVjaWFsIGNhc2U6XG4gIC8vICAtIGl0ZW0gMVxuICAvLyAgIC0gaXRlbSAyXG4gIC8vICAgIC0gaXRlbSAzXG4gIC8vICAgICAtIGl0ZW0gNFxuICAvLyAgICAgIC0gdGhpcyBvbmUgaXMgYSBwYXJhZ3JhcGggY29udGludWF0aW9uXG4gIGlmIChzdGF0ZS5saXN0SW5kZW50ID49IDAgJiZcbiAgICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5saXN0SW5kZW50ID49IDQgJiZcbiAgICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBpc1Rlcm1pbmF0aW5nUGFyYWdyYXBoID0gZmFsc2VcblxuICAvLyBsaW1pdCBjb25kaXRpb25zIHdoZW4gbGlzdCBjYW4gaW50ZXJydXB0XG4gIC8vIGEgcGFyYWdyYXBoICh2YWxpZGF0aW9uIG1vZGUgb25seSlcbiAgaWYgKHNpbGVudCAmJiBzdGF0ZS5wYXJlbnRUeXBlID09PSAncGFyYWdyYXBoJykge1xuICAgIC8vIE5leHQgbGlzdCBpdGVtIHNob3VsZCBzdGlsbCB0ZXJtaW5hdGUgcHJldmlvdXMgbGlzdCBpdGVtO1xuICAgIC8vXG4gICAgLy8gVGhpcyBjb2RlIGNhbiBmYWlsIGlmIHBsdWdpbnMgdXNlIGJsa0luZGVudCBhcyB3ZWxsIGFzIGxpc3RzLFxuICAgIC8vIGJ1dCBJIGhvcGUgdGhlIHNwZWMgZ2V0cyBmaXhlZCBsb25nIGJlZm9yZSB0aGF0IGhhcHBlbnMuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA+PSBzdGF0ZS5ibGtJbmRlbnQpIHtcbiAgICAgIGlzVGVybWluYXRpbmdQYXJhZ3JhcGggPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZWN0IGxpc3QgdHlwZSBhbmQgcG9zaXRpb24gYWZ0ZXIgbWFya2VyXG4gIGxldCBpc09yZGVyZWRcbiAgbGV0IG1hcmtlclZhbHVlXG4gIGxldCBwb3NBZnRlck1hcmtlclxuICBpZiAoKHBvc0FmdGVyTWFya2VyID0gc2tpcE9yZGVyZWRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSkpID49IDApIHtcbiAgICBpc09yZGVyZWQgPSB0cnVlXG4gICAgc3RhcnQgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIG1hcmtlclZhbHVlID0gTnVtYmVyKHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zQWZ0ZXJNYXJrZXIgLSAxKSlcblxuICAgIC8vIElmIHdlJ3JlIHN0YXJ0aW5nIGEgbmV3IG9yZGVyZWQgbGlzdCByaWdodCBhZnRlclxuICAgIC8vIGEgcGFyYWdyYXBoLCBpdCBzaG91bGQgc3RhcnQgd2l0aCAxLlxuICAgIGlmIChpc1Rlcm1pbmF0aW5nUGFyYWdyYXBoICYmIG1hcmtlclZhbHVlICE9PSAxKSByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICgocG9zQWZ0ZXJNYXJrZXIgPSBza2lwQnVsbGV0TGlzdE1hcmtlcihzdGF0ZSwgbmV4dExpbmUpKSA+PSAwKSB7XG4gICAgaXNPcmRlcmVkID0gZmFsc2VcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIHdlJ3JlIHN0YXJ0aW5nIGEgbmV3IHVub3JkZXJlZCBsaXN0IHJpZ2h0IGFmdGVyXG4gIC8vIGEgcGFyYWdyYXBoLCBmaXJzdCBsaW5lIHNob3VsZCBub3QgYmUgZW1wdHkuXG4gIGlmIChpc1Rlcm1pbmF0aW5nUGFyYWdyYXBoKSB7XG4gICAgaWYgKHN0YXRlLnNraXBTcGFjZXMocG9zQWZ0ZXJNYXJrZXIpID49IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gRm9yIHZhbGlkYXRpb24gbW9kZSB3ZSBjYW4gdGVybWluYXRlIGltbWVkaWF0ZWx5XG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8vIFdlIHNob3VsZCB0ZXJtaW5hdGUgbGlzdCBvbiBzdHlsZSBjaGFuZ2UuIFJlbWVtYmVyIGZpcnN0IG9uZSB0byBjb21wYXJlLlxuICBjb25zdCBtYXJrZXJDaGFyQ29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvc0FmdGVyTWFya2VyIC0gMSlcblxuICAvLyBTdGFydCBsaXN0XG4gIGNvbnN0IGxpc3RUb2tJZHggPSBzdGF0ZS50b2tlbnMubGVuZ3RoXG5cbiAgaWYgKGlzT3JkZXJlZCkge1xuICAgIHRva2VuICAgICAgID0gc3RhdGUucHVzaCgnb3JkZXJlZF9saXN0X29wZW4nLCAnb2wnLCAxKVxuICAgIGlmIChtYXJrZXJWYWx1ZSAhPT0gMSkge1xuICAgICAgdG9rZW4uYXR0cnMgPSBbWydzdGFydCcsIG1hcmtlclZhbHVlXV1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdG9rZW4gICAgICAgPSBzdGF0ZS5wdXNoKCdidWxsZXRfbGlzdF9vcGVuJywgJ3VsJywgMSlcbiAgfVxuXG4gIGNvbnN0IGxpc3RMaW5lcyA9IFtuZXh0TGluZSwgMF1cbiAgdG9rZW4ubWFwICAgID0gbGlzdExpbmVzXG4gIHRva2VuLm1hcmt1cCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyQ2hhckNvZGUpXG5cbiAgLy9cbiAgLy8gSXRlcmF0ZSBsaXN0IGl0ZW1zXG4gIC8vXG5cbiAgbGV0IHByZXZFbXB0eUVuZCA9IGZhbHNlXG4gIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdsaXN0JylcblxuICBjb25zdCBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZVxuICBzdGF0ZS5wYXJlbnRUeXBlID0gJ2xpc3QnXG5cbiAgd2hpbGUgKG5leHRMaW5lIDwgZW5kTGluZSkge1xuICAgIHBvcyA9IHBvc0FmdGVyTWFya2VyXG4gICAgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgY29uc3QgaW5pdGlhbCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gKyBwb3NBZnRlck1hcmtlciAtIChzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXSlcbiAgICBsZXQgb2Zmc2V0ID0gaW5pdGlhbFxuXG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICAgIGlmIChjaCA9PT0gMHgwOSkge1xuICAgICAgICBvZmZzZXQgKz0gNCAtIChvZmZzZXQgKyBzdGF0ZS5ic0NvdW50W25leHRMaW5lXSkgJSA0XG4gICAgICB9IGVsc2UgaWYgKGNoID09PSAweDIwKSB7XG4gICAgICAgIG9mZnNldCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBwb3MrK1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRTdGFydCA9IHBvc1xuICAgIGxldCBpbmRlbnRBZnRlck1hcmtlclxuXG4gICAgaWYgKGNvbnRlbnRTdGFydCA+PSBtYXgpIHtcbiAgICAgIC8vIHRyaW1taW5nIHNwYWNlIGluIFwiLSAgICBcXG4gIDNcIiBjYXNlLCBpbmRlbnQgaXMgMSBoZXJlXG4gICAgICBpbmRlbnRBZnRlck1hcmtlciA9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZW50QWZ0ZXJNYXJrZXIgPSBvZmZzZXQgLSBpbml0aWFsXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBtb3JlIHRoYW4gNCBzcGFjZXMsIHRoZSBpbmRlbnQgaXMgMVxuICAgIC8vICh0aGUgcmVzdCBpcyBqdXN0IGluZGVudGVkIGNvZGUgYmxvY2spXG4gICAgaWYgKGluZGVudEFmdGVyTWFya2VyID4gNCkgeyBpbmRlbnRBZnRlck1hcmtlciA9IDEgfVxuXG4gICAgLy8gXCIgIC0gIHRlc3RcIlxuICAgIC8vICBeXl5eXiAtIGNhbGN1bGF0aW5nIHRvdGFsIGxlbmd0aCBvZiB0aGlzIHRoaW5nXG4gICAgY29uc3QgaW5kZW50ID0gaW5pdGlhbCArIGluZGVudEFmdGVyTWFya2VyXG5cbiAgICAvLyBSdW4gc3VicGFyc2VyICYgd3JpdGUgdG9rZW5zXG4gICAgdG9rZW4gICAgICAgID0gc3RhdGUucHVzaCgnbGlzdF9pdGVtX29wZW4nLCAnbGknLCAxKVxuICAgIHRva2VuLm1hcmt1cCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyQ2hhckNvZGUpXG4gICAgY29uc3QgaXRlbUxpbmVzID0gW25leHRMaW5lLCAwXVxuICAgIHRva2VuLm1hcCAgICA9IGl0ZW1MaW5lc1xuICAgIGlmIChpc09yZGVyZWQpIHtcbiAgICAgIHRva2VuLmluZm8gPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvc0FmdGVyTWFya2VyIC0gMSlcbiAgICB9XG5cbiAgICAvLyBjaGFuZ2UgY3VycmVudCBzdGF0ZSwgdGhlbiByZXN0b3JlIGl0IGFmdGVyIHBhcnNlciBzdWJjYWxsXG4gICAgY29uc3Qgb2xkVGlnaHQgPSBzdGF0ZS50aWdodFxuICAgIGNvbnN0IG9sZFRTaGlmdCA9IHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICBjb25zdCBvbGRTQ291bnQgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdXG5cbiAgICAvLyAgLSBleGFtcGxlIGxpc3RcbiAgICAvLyBeIGxpc3RJbmRlbnQgcG9zaXRpb24gd2lsbCBiZSBoZXJlXG4gICAgLy8gICBeIGJsa0luZGVudCBwb3NpdGlvbiB3aWxsIGJlIGhlcmVcbiAgICAvL1xuICAgIGNvbnN0IG9sZExpc3RJbmRlbnQgPSBzdGF0ZS5saXN0SW5kZW50XG4gICAgc3RhdGUubGlzdEluZGVudCA9IHN0YXRlLmJsa0luZGVudFxuICAgIHN0YXRlLmJsa0luZGVudCA9IGluZGVudFxuXG4gICAgc3RhdGUudGlnaHQgPSB0cnVlXG4gICAgc3RhdGUudFNoaWZ0W25leHRMaW5lXSA9IGNvbnRlbnRTdGFydCAtIHN0YXRlLmJNYXJrc1tuZXh0TGluZV1cbiAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdID0gb2Zmc2V0XG5cbiAgICBpZiAoY29udGVudFN0YXJ0ID49IG1heCAmJiBzdGF0ZS5pc0VtcHR5KG5leHRMaW5lICsgMSkpIHtcbiAgICAgIC8vIHdvcmthcm91bmQgZm9yIHRoaXMgY2FzZVxuICAgICAgLy8gKGxpc3QgaXRlbSBpcyBlbXB0eSwgbGlzdCB0ZXJtaW5hdGVzIGJlZm9yZSBcImZvb1wiKTpcbiAgICAgIC8vIH5+fn5+fn5+XG4gICAgICAvLyAgIC1cbiAgICAgIC8vXG4gICAgICAvLyAgICAgZm9vXG4gICAgICAvLyB+fn5+fn5+flxuICAgICAgc3RhdGUubGluZSA9IE1hdGgubWluKHN0YXRlLmxpbmUgKyAyLCBlbmRMaW5lKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5tZC5ibG9jay50b2tlbml6ZShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpXG4gICAgfVxuXG4gICAgLy8gSWYgYW55IG9mIGxpc3QgaXRlbSBpcyB0aWdodCwgbWFyayBsaXN0IGFzIHRpZ2h0XG4gICAgaWYgKCFzdGF0ZS50aWdodCB8fCBwcmV2RW1wdHlFbmQpIHtcbiAgICAgIHRpZ2h0ID0gZmFsc2VcbiAgICB9XG4gICAgLy8gSXRlbSBiZWNvbWUgbG9vc2UgaWYgZmluaXNoIHdpdGggZW1wdHkgbGluZSxcbiAgICAvLyBidXQgd2Ugc2hvdWxkIGZpbHRlciBsYXN0IGVsZW1lbnQsIGJlY2F1c2UgaXQgbWVhbnMgbGlzdCBmaW5pc2hcbiAgICBwcmV2RW1wdHlFbmQgPSAoc3RhdGUubGluZSAtIG5leHRMaW5lKSA+IDEgJiYgc3RhdGUuaXNFbXB0eShzdGF0ZS5saW5lIC0gMSlcblxuICAgIHN0YXRlLmJsa0luZGVudCA9IHN0YXRlLmxpc3RJbmRlbnRcbiAgICBzdGF0ZS5saXN0SW5kZW50ID0gb2xkTGlzdEluZGVudFxuICAgIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPSBvbGRUU2hpZnRcbiAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdID0gb2xkU0NvdW50XG4gICAgc3RhdGUudGlnaHQgPSBvbGRUaWdodFxuXG4gICAgdG9rZW4gICAgICAgID0gc3RhdGUucHVzaCgnbGlzdF9pdGVtX2Nsb3NlJywgJ2xpJywgLTEpXG4gICAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcblxuICAgIG5leHRMaW5lID0gc3RhdGUubGluZVxuICAgIGl0ZW1MaW5lc1sxXSA9IG5leHRMaW5lXG5cbiAgICBpZiAobmV4dExpbmUgPj0gZW5kTGluZSkgeyBicmVhayB9XG5cbiAgICAvL1xuICAgIC8vIFRyeSB0byBjaGVjayBpZiBsaXN0IGlzIHRlcm1pbmF0ZWQgb3IgY29udGludWVkLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgYnJlYWsgfVxuXG4gICAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IGJyZWFrIH1cblxuICAgIC8vIGZhaWwgaWYgdGVybWluYXRpbmcgYmxvY2sgZm91bmRcbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWsgfVxuXG4gICAgLy8gZmFpbCBpZiBsaXN0IGhhcyBhbm90aGVyIHR5cGVcbiAgICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgICBwb3NBZnRlck1hcmtlciA9IHNraXBPcmRlcmVkTGlzdE1hcmtlcihzdGF0ZSwgbmV4dExpbmUpXG4gICAgICBpZiAocG9zQWZ0ZXJNYXJrZXIgPCAwKSB7IGJyZWFrIH1cbiAgICAgIHN0YXJ0ID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zQWZ0ZXJNYXJrZXIgPSBza2lwQnVsbGV0TGlzdE1hcmtlcihzdGF0ZSwgbmV4dExpbmUpXG4gICAgICBpZiAocG9zQWZ0ZXJNYXJrZXIgPCAwKSB7IGJyZWFrIH1cbiAgICB9XG5cbiAgICBpZiAobWFya2VyQ2hhckNvZGUgIT09IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvc0FmdGVyTWFya2VyIC0gMSkpIHsgYnJlYWsgfVxuICB9XG5cbiAgLy8gRmluYWxpemUgbGlzdFxuICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgdG9rZW4gPSBzdGF0ZS5wdXNoKCdvcmRlcmVkX2xpc3RfY2xvc2UnLCAnb2wnLCAtMSlcbiAgfSBlbHNlIHtcbiAgICB0b2tlbiA9IHN0YXRlLnB1c2goJ2J1bGxldF9saXN0X2Nsb3NlJywgJ3VsJywgLTEpXG4gIH1cbiAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcblxuICBsaXN0TGluZXNbMV0gPSBuZXh0TGluZVxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuXG4gIC8vIG1hcmsgcGFyYWdyYXBocyB0aWdodCBpZiBuZWVkZWRcbiAgaWYgKHRpZ2h0KSB7XG4gICAgbWFya1RpZ2h0UGFyYWdyYXBocyhzdGF0ZSwgbGlzdFRva0lkeClcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBMaXN0IG9mIHZhbGlkIGh0bWwgYmxvY2tzIG5hbWVzLCBhY2NvcmRpbmcgdG8gY29tbW9ubWFyayBzcGVjXG4vLyBodHRwczovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4zMC8jaHRtbC1ibG9ja3NcblxuZXhwb3J0IGRlZmF1bHQgW1xuICAnYWRkcmVzcycsXG4gICdhcnRpY2xlJyxcbiAgJ2FzaWRlJyxcbiAgJ2Jhc2UnLFxuICAnYmFzZWZvbnQnLFxuICAnYmxvY2txdW90ZScsXG4gICdib2R5JyxcbiAgJ2NhcHRpb24nLFxuICAnY2VudGVyJyxcbiAgJ2NvbCcsXG4gICdjb2xncm91cCcsXG4gICdkZCcsXG4gICdkZXRhaWxzJyxcbiAgJ2RpYWxvZycsXG4gICdkaXInLFxuICAnZGl2JyxcbiAgJ2RsJyxcbiAgJ2R0JyxcbiAgJ2ZpZWxkc2V0JyxcbiAgJ2ZpZ2NhcHRpb24nLFxuICAnZmlndXJlJyxcbiAgJ2Zvb3RlcicsXG4gICdmb3JtJyxcbiAgJ2ZyYW1lJyxcbiAgJ2ZyYW1lc2V0JyxcbiAgJ2gxJyxcbiAgJ2gyJyxcbiAgJ2gzJyxcbiAgJ2g0JyxcbiAgJ2g1JyxcbiAgJ2g2JyxcbiAgJ2hlYWQnLFxuICAnaGVhZGVyJyxcbiAgJ2hyJyxcbiAgJ2h0bWwnLFxuICAnaWZyYW1lJyxcbiAgJ2xlZ2VuZCcsXG4gICdsaScsXG4gICdsaW5rJyxcbiAgJ21haW4nLFxuICAnbWVudScsXG4gICdtZW51aXRlbScsXG4gICduYXYnLFxuICAnbm9mcmFtZXMnLFxuICAnb2wnLFxuICAnb3B0Z3JvdXAnLFxuICAnb3B0aW9uJyxcbiAgJ3AnLFxuICAncGFyYW0nLFxuICAnc2VhcmNoJyxcbiAgJ3NlY3Rpb24nLFxuICAnc3VtbWFyeScsXG4gICd0YWJsZScsXG4gICd0Ym9keScsXG4gICd0ZCcsXG4gICd0Zm9vdCcsXG4gICd0aCcsXG4gICd0aGVhZCcsXG4gICd0aXRsZScsXG4gICd0cicsXG4gICd0cmFjaycsXG4gICd1bCdcbl1cbiIsIi8vIFJlZ2V4cHMgdG8gbWF0Y2ggaHRtbCBlbGVtZW50c1xuXG5jb25zdCBhdHRyX25hbWUgICAgID0gJ1thLXpBLVpfOl1bYS16QS1aMC05Oi5fLV0qJ1xuXG5jb25zdCB1bnF1b3RlZCAgICAgID0gJ1teXCJcXCc9PD5gXFxcXHgwMC1cXFxceDIwXSsnXG5jb25zdCBzaW5nbGVfcXVvdGVkID0gXCInW14nXSonXCJcbmNvbnN0IGRvdWJsZV9xdW90ZWQgPSAnXCJbXlwiXSpcIidcblxuY29uc3QgYXR0cl92YWx1ZSAgPSAnKD86JyArIHVucXVvdGVkICsgJ3wnICsgc2luZ2xlX3F1b3RlZCArICd8JyArIGRvdWJsZV9xdW90ZWQgKyAnKSdcblxuY29uc3QgYXR0cmlidXRlICAgPSAnKD86XFxcXHMrJyArIGF0dHJfbmFtZSArICcoPzpcXFxccyo9XFxcXHMqJyArIGF0dHJfdmFsdWUgKyAnKT8pJ1xuXG5jb25zdCBvcGVuX3RhZyAgICA9ICc8W0EtWmEtel1bQS1aYS16MC05XFxcXC1dKicgKyBhdHRyaWJ1dGUgKyAnKlxcXFxzKlxcXFwvPz4nXG5cbmNvbnN0IGNsb3NlX3RhZyAgID0gJzxcXFxcL1tBLVphLXpdW0EtWmEtejAtOVxcXFwtXSpcXFxccyo+J1xuY29uc3QgY29tbWVudCAgICAgPSAnPCEtLS0/Pnw8IS0tKD86W14tXXwtW14tXXwtLVtePl0pKi0tPidcbmNvbnN0IHByb2Nlc3NpbmcgID0gJzxbP11bXFxcXHNcXFxcU10qP1s/XT4nXG5jb25zdCBkZWNsYXJhdGlvbiA9ICc8IVtBLVphLXpdW14+XSo+J1xuY29uc3QgY2RhdGEgICAgICAgPSAnPCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qP1xcXFxdXFxcXF0+J1xuXG5jb25zdCBIVE1MX1RBR19SRSA9IG5ldyBSZWdFeHAoJ14oPzonICsgb3Blbl90YWcgKyAnfCcgKyBjbG9zZV90YWcgKyAnfCcgKyBjb21tZW50ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICd8JyArIHByb2Nlc3NpbmcgKyAnfCcgKyBkZWNsYXJhdGlvbiArICd8JyArIGNkYXRhICsgJyknKVxuY29uc3QgSFRNTF9PUEVOX0NMT1NFX1RBR19SRSA9IG5ldyBSZWdFeHAoJ14oPzonICsgb3Blbl90YWcgKyAnfCcgKyBjbG9zZV90YWcgKyAnKScpXG5cbmV4cG9ydCB7IEhUTUxfVEFHX1JFLCBIVE1MX09QRU5fQ0xPU0VfVEFHX1JFIH1cbiIsIi8vIEhUTUwgYmxvY2tcblxuaW1wb3J0IGJsb2NrX25hbWVzIGZyb20gJy4uL2NvbW1vbi9odG1sX2Jsb2Nrcy5tanMnXG5pbXBvcnQgeyBIVE1MX09QRU5fQ0xPU0VfVEFHX1JFIH0gZnJvbSAnLi4vY29tbW9uL2h0bWxfcmUubWpzJ1xuXG4vLyBBbiBhcnJheSBvZiBvcGVuaW5nIGFuZCBjb3JyZXNwb25kaW5nIGNsb3Npbmcgc2VxdWVuY2VzIGZvciBodG1sIHRhZ3MsXG4vLyBsYXN0IGFyZ3VtZW50IGRlZmluZXMgd2hldGhlciBpdCBjYW4gdGVybWluYXRlIGEgcGFyYWdyYXBoIG9yIG5vdFxuLy9cbmNvbnN0IEhUTUxfU0VRVUVOQ0VTID0gW1xuICBbL148KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKD89KFxcc3w+fCQpKS9pLCAvPFxcLyhzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKT4vaSwgdHJ1ZV0sXG4gIFsvXjwhLS0vLCAgICAgICAgLy0tPi8sICAgdHJ1ZV0sXG4gIFsvXjxcXD8vLCAgICAgICAgIC9cXD8+LywgICB0cnVlXSxcbiAgWy9ePCFbQS1aXS8sICAgICAvPi8sICAgICB0cnVlXSxcbiAgWy9ePCFcXFtDREFUQVxcWy8sIC9cXF1cXF0+LywgdHJ1ZV0sXG4gIFtuZXcgUmVnRXhwKCdePC8/KCcgKyBibG9ja19uYW1lcy5qb2luKCd8JykgKyAnKSg/PShcXFxcc3wvPz58JCkpJywgJ2knKSwgL14kLywgdHJ1ZV0sXG4gIFtuZXcgUmVnRXhwKEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUuc291cmNlICsgJ1xcXFxzKiQnKSwgIC9eJC8sIGZhbHNlXVxuXVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBodG1sX2Jsb2NrIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMuaHRtbCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBsaW5lVGV4dCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcblxuICBsZXQgaSA9IDBcbiAgZm9yICg7IGkgPCBIVE1MX1NFUVVFTkNFUy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChIVE1MX1NFUVVFTkNFU1tpXVswXS50ZXN0KGxpbmVUZXh0KSkgeyBicmVhayB9XG4gIH1cbiAgaWYgKGkgPT09IEhUTUxfU0VRVUVOQ0VTLmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICAvLyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgY2FuIGJlIGEgdGVybWluYXRvciwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgcmV0dXJuIEhUTUxfU0VRVUVOQ0VTW2ldWzJdXG4gIH1cblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgLy8gSWYgd2UgYXJlIGhlcmUgLSB3ZSBkZXRlY3RlZCBIVE1MIGJsb2NrLlxuICAvLyBMZXQncyByb2xsIGRvd24gdGlsbCBibG9jayBlbmQuXG4gIGlmICghSFRNTF9TRVFVRU5DRVNbaV1bMV0udGVzdChsaW5lVGV4dCkpIHtcbiAgICBmb3IgKDsgbmV4dExpbmUgPCBlbmRMaW5lOyBuZXh0TGluZSsrKSB7XG4gICAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG4gICAgICBsaW5lVGV4dCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcblxuICAgICAgaWYgKEhUTUxfU0VRVUVOQ0VTW2ldWzFdLnRlc3QobGluZVRleHQpKSB7XG4gICAgICAgIGlmIChsaW5lVGV4dC5sZW5ndGggIT09IDApIHsgbmV4dExpbmUrKyB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG5cbiAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ2h0bWxfYmxvY2snLCAnJywgMClcbiAgdG9rZW4ubWFwICAgICA9IFtzdGFydExpbmUsIG5leHRMaW5lXVxuICB0b2tlbi5jb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBuZXh0TGluZSwgc3RhdGUuYmxrSW5kZW50LCB0cnVlKVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvKiogaW50ZXJuYWxcbiAqIGNsYXNzIFBhcnNlckJsb2NrXG4gKlxuICogQmxvY2stbGV2ZWwgdG9rZW5pemVyLlxuICoqL1xuXG5pbXBvcnQgUnVsZXIgZnJvbSAnLi9ydWxlci5tanMnXG5pbXBvcnQgU3RhdGVCbG9jayBmcm9tICcuL3J1bGVzX2Jsb2NrL3N0YXRlX2Jsb2NrLm1qcydcblxuaW1wb3J0IHJfdGFibGUgZnJvbSAnLi9ydWxlc19ibG9jay90YWJsZS5tanMnXG5pbXBvcnQgcl9jb2RlIGZyb20gJy4vcnVsZXNfYmxvY2svY29kZS5tanMnXG5pbXBvcnQgcl9mZW5jZSBmcm9tICcuL3J1bGVzX2Jsb2NrL2ZlbmNlLm1qcydcbmltcG9ydCByX2Jsb2NrcXVvdGUgZnJvbSAnLi9ydWxlc19ibG9jay9ibG9ja3F1b3RlLm1qcydcbmltcG9ydCByX2hyIGZyb20gJy4vcnVsZXNfYmxvY2svaHIubWpzJ1xuaW1wb3J0IHJfbGlzdCBmcm9tICcuL3J1bGVzX2Jsb2NrL2xpc3QubWpzJ1xuaW1wb3J0IHJfcmVmZXJlbmNlIGZyb20gJy4vcnVsZXNfYmxvY2svcmVmZXJlbmNlLm1qcydcbmltcG9ydCByX2h0bWxfYmxvY2sgZnJvbSAnLi9ydWxlc19ibG9jay9odG1sX2Jsb2NrLm1qcydcbmltcG9ydCByX2hlYWRpbmcgZnJvbSAnLi9ydWxlc19ibG9jay9oZWFkaW5nLm1qcydcbmltcG9ydCByX2xoZWFkaW5nIGZyb20gJy4vcnVsZXNfYmxvY2svbGhlYWRpbmcubWpzJ1xuaW1wb3J0IHJfcGFyYWdyYXBoIGZyb20gJy4vcnVsZXNfYmxvY2svcGFyYWdyYXBoLm1qcydcblxuY29uc3QgX3J1bGVzID0gW1xuICAvLyBGaXJzdCAyIHBhcmFtcyAtIHJ1bGUgbmFtZSAmIHNvdXJjZS4gU2Vjb25kYXJ5IGFycmF5IC0gbGlzdCBvZiBydWxlcyxcbiAgLy8gd2hpY2ggY2FuIGJlIHRlcm1pbmF0ZWQgYnkgdGhpcyBvbmUuXG4gIFsndGFibGUnLCAgICAgIHJfdGFibGUsICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJ11dLFxuICBbJ2NvZGUnLCAgICAgICByX2NvZGVdLFxuICBbJ2ZlbmNlJywgICAgICByX2ZlbmNlLCAgICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJywgJ2xpc3QnXV0sXG4gIFsnYmxvY2txdW90ZScsIHJfYmxvY2txdW90ZSwgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCddXSxcbiAgWydocicsICAgICAgICAgcl9ociwgICAgICAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZScsICdsaXN0J11dLFxuICBbJ2xpc3QnLCAgICAgICByX2xpc3QsICAgICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJ11dLFxuICBbJ3JlZmVyZW5jZScsICByX3JlZmVyZW5jZV0sXG4gIFsnaHRtbF9ibG9jaycsIHJfaHRtbF9ibG9jaywgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnXV0sXG4gIFsnaGVhZGluZycsICAgIHJfaGVhZGluZywgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnXV0sXG4gIFsnbGhlYWRpbmcnLCAgIHJfbGhlYWRpbmddLFxuICBbJ3BhcmFncmFwaCcsICByX3BhcmFncmFwaF1cbl1cblxuLyoqXG4gKiBuZXcgUGFyc2VyQmxvY2soKVxuICoqL1xuZnVuY3Rpb24gUGFyc2VyQmxvY2sgKCkge1xuICAvKipcbiAgICogUGFyc2VyQmxvY2sjcnVsZXIgLT4gUnVsZXJcbiAgICpcbiAgICogW1tSdWxlcl1dIGluc3RhbmNlLiBLZWVwIGNvbmZpZ3VyYXRpb24gb2YgYmxvY2sgcnVsZXMuXG4gICAqKi9cbiAgdGhpcy5ydWxlciA9IG5ldyBSdWxlcigpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0sIHsgYWx0OiAoX3J1bGVzW2ldWzJdIHx8IFtdKS5zbGljZSgpIH0pXG4gIH1cbn1cblxuLy8gR2VuZXJhdGUgdG9rZW5zIGZvciBpbnB1dCByYW5nZVxuLy9cblBhcnNlckJsb2NrLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lKSB7XG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG4gIGNvbnN0IG1heE5lc3RpbmcgPSBzdGF0ZS5tZC5vcHRpb25zLm1heE5lc3RpbmdcbiAgbGV0IGxpbmUgPSBzdGFydExpbmVcbiAgbGV0IGhhc0VtcHR5TGluZXMgPSBmYWxzZVxuXG4gIHdoaWxlIChsaW5lIDwgZW5kTGluZSkge1xuICAgIHN0YXRlLmxpbmUgPSBsaW5lID0gc3RhdGUuc2tpcEVtcHR5TGluZXMobGluZSlcbiAgICBpZiAobGluZSA+PSBlbmRMaW5lKSB7IGJyZWFrIH1cblxuICAgIC8vIFRlcm1pbmF0aW9uIGNvbmRpdGlvbiBmb3IgbmVzdGVkIGNhbGxzLlxuICAgIC8vIE5lc3RlZCBjYWxscyBjdXJyZW50bHkgdXNlZCBmb3IgYmxvY2txdW90ZXMgJiBsaXN0c1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgYnJlYWsgfVxuXG4gICAgLy8gSWYgbmVzdGluZyBsZXZlbCBleGNlZWRlZCAtIHNraXAgdGFpbCB0byB0aGUgZW5kLiBUaGF0J3Mgbm90IG9yZGluYXJ5XG4gICAgLy8gc2l0dWF0aW9uIGFuZCB3ZSBzaG91bGQgbm90IGNhcmUgYWJvdXQgY29udGVudC5cbiAgICBpZiAoc3RhdGUubGV2ZWwgPj0gbWF4TmVzdGluZykge1xuICAgICAgc3RhdGUubGluZSA9IGVuZExpbmVcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgLy8gVHJ5IGFsbCBwb3NzaWJsZSBydWxlcy5cbiAgICAvLyBPbiBzdWNjZXNzLCBydWxlIHNob3VsZDpcbiAgICAvL1xuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS5saW5lYFxuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS50b2tlbnNgXG4gICAgLy8gLSByZXR1cm4gdHJ1ZVxuICAgIGNvbnN0IHByZXZMaW5lID0gc3RhdGUubGluZVxuICAgIGxldCBvayA9IGZhbHNlXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCBsaW5lLCBlbmRMaW5lLCBmYWxzZSlcbiAgICAgIGlmIChvaykge1xuICAgICAgICBpZiAocHJldkxpbmUgPj0gc3RhdGUubGluZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImJsb2NrIHJ1bGUgZGlkbid0IGluY3JlbWVudCBzdGF0ZS5saW5lXCIpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB1c2VyIGRpc2FibGVzIHBhcmFncmFwaCBydWxlXG4gICAgaWYgKCFvaykgdGhyb3cgbmV3IEVycm9yKCdub25lIG9mIHRoZSBibG9jayBydWxlcyBtYXRjaGVkJylcblxuICAgIC8vIHNldCBzdGF0ZS50aWdodCBpZiB3ZSBoYWQgYW4gZW1wdHkgbGluZSBiZWZvcmUgY3VycmVudCB0YWdcbiAgICAvLyBpLmUuIGxhdGVzdCBlbXB0eSBsaW5lIHNob3VsZCBub3QgY291bnRcbiAgICBzdGF0ZS50aWdodCA9ICFoYXNFbXB0eUxpbmVzXG5cbiAgICAvLyBwYXJhZ3JhcGggbWlnaHQgXCJlYXRcIiBvbmUgbmV3bGluZSBhZnRlciBpdCBpbiBuZXN0ZWQgbGlzdHNcbiAgICBpZiAoc3RhdGUuaXNFbXB0eShzdGF0ZS5saW5lIC0gMSkpIHtcbiAgICAgIGhhc0VtcHR5TGluZXMgPSB0cnVlXG4gICAgfVxuXG4gICAgbGluZSA9IHN0YXRlLmxpbmVcblxuICAgIGlmIChsaW5lIDwgZW5kTGluZSAmJiBzdGF0ZS5pc0VtcHR5KGxpbmUpKSB7XG4gICAgICBoYXNFbXB0eUxpbmVzID0gdHJ1ZVxuICAgICAgbGluZSsrXG4gICAgICBzdGF0ZS5saW5lID0gbGluZVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlckJsb2NrLnBhcnNlKHN0ciwgbWQsIGVudiwgb3V0VG9rZW5zKVxuICpcbiAqIFByb2Nlc3MgaW5wdXQgc3RyaW5nIGFuZCBwdXNoIGJsb2NrIHRva2VucyBpbnRvIGBvdXRUb2tlbnNgXG4gKiovXG5QYXJzZXJCbG9jay5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc3JjLCBtZCwgZW52LCBvdXRUb2tlbnMpIHtcbiAgaWYgKCFzcmMpIHsgcmV0dXJuIH1cblxuICBjb25zdCBzdGF0ZSA9IG5ldyB0aGlzLlN0YXRlKHNyYywgbWQsIGVudiwgb3V0VG9rZW5zKVxuXG4gIHRoaXMudG9rZW5pemUoc3RhdGUsIHN0YXRlLmxpbmUsIHN0YXRlLmxpbmVNYXgpXG59XG5cblBhcnNlckJsb2NrLnByb3RvdHlwZS5TdGF0ZSA9IFN0YXRlQmxvY2tcblxuZXhwb3J0IGRlZmF1bHQgUGFyc2VyQmxvY2tcbiIsIi8vIENvZGUgYmxvY2sgKDQgc3BhY2VzIHBhZGRlZClcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29kZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZS8qLCBzaWxlbnQgKi8pIHtcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50IDwgNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcbiAgbGV0IGxhc3QgPSBuZXh0TGluZVxuXG4gIHdoaWxlIChuZXh0TGluZSA8IGVuZExpbmUpIHtcbiAgICBpZiAoc3RhdGUuaXNFbXB0eShuZXh0TGluZSkpIHtcbiAgICAgIG5leHRMaW5lKytcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkge1xuICAgICAgbmV4dExpbmUrK1xuICAgICAgbGFzdCA9IG5leHRMaW5lXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBicmVha1xuICB9XG5cbiAgc3RhdGUubGluZSA9IGxhc3RcblxuICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgnY29kZV9ibG9jaycsICdjb2RlJywgMClcbiAgdG9rZW4uY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSwgbGFzdCwgNCArIHN0YXRlLmJsa0luZGVudCwgZmFsc2UpICsgJ1xcbidcbiAgdG9rZW4ubWFwICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIGZlbmNlcyAoYGBgIGxhbmcsIH5+fiBsYW5nKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmZW5jZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGxldCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHBvcyArIDMgPiBtYXgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgaWYgKG1hcmtlciAhPT0gMHg3RS8qIH4gKi8gJiYgbWFya2VyICE9PSAweDYwIC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHNjYW4gbWFya2VyIGxlbmd0aFxuICBsZXQgbWVtID0gcG9zXG4gIHBvcyA9IHN0YXRlLnNraXBDaGFycyhwb3MsIG1hcmtlcilcblxuICBsZXQgbGVuID0gcG9zIC0gbWVtXG5cbiAgaWYgKGxlbiA8IDMpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBtYXJrdXAgPSBzdGF0ZS5zcmMuc2xpY2UobWVtLCBwb3MpXG4gIGNvbnN0IHBhcmFtcyA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcblxuICBpZiAobWFya2VyID09PSAweDYwIC8qIGAgKi8pIHtcbiAgICBpZiAocGFyYW1zLmluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpKSA+PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBTaW5jZSBzdGFydCBpcyBmb3VuZCwgd2UgY2FuIHJlcG9ydCBzdWNjZXNzIGhlcmUgaW4gdmFsaWRhdGlvbiBtb2RlXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8vIHNlYXJjaCBlbmQgb2YgYmxvY2tcbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lXG4gIGxldCBoYXZlRW5kTWFya2VyID0gZmFsc2VcblxuICBmb3IgKDs7KSB7XG4gICAgbmV4dExpbmUrK1xuICAgIGlmIChuZXh0TGluZSA+PSBlbmRMaW5lKSB7XG4gICAgICAvLyB1bmNsb3NlZCBibG9jayBzaG91bGQgYmUgYXV0b2Nsb3NlZCBieSBlbmQgb2YgZG9jdW1lbnQuXG4gICAgICAvLyBhbHNvIGJsb2NrIHNlZW1zIHRvIGJlIGF1dG9jbG9zZWQgYnkgZW5kIG9mIHBhcmVudFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBwb3MgPSBtZW0gPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkge1xuICAgICAgLy8gbm9uLWVtcHR5IGxpbmUgd2l0aCBuZWdhdGl2ZSBpbmRlbnQgc2hvdWxkIHN0b3AgdGhlIGxpc3Q6XG4gICAgICAvLyAtIGBgYFxuICAgICAgLy8gIHRlc3RcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IG1hcmtlcikgeyBjb250aW51ZSB9XG5cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7XG4gICAgICAvLyBjbG9zaW5nIGZlbmNlIHNob3VsZCBiZSBpbmRlbnRlZCBsZXNzIHRoYW4gNCBzcGFjZXNcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcG9zID0gc3RhdGUuc2tpcENoYXJzKHBvcywgbWFya2VyKVxuXG4gICAgLy8gY2xvc2luZyBjb2RlIGZlbmNlIG11c3QgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgb3BlbmluZyBvbmVcbiAgICBpZiAocG9zIC0gbWVtIDwgbGVuKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0YWlsIGhhcyBzcGFjZXMgb25seVxuICAgIHBvcyA9IHN0YXRlLnNraXBTcGFjZXMocG9zKVxuXG4gICAgaWYgKHBvcyA8IG1heCkgeyBjb250aW51ZSB9XG5cbiAgICBoYXZlRW5kTWFya2VyID0gdHJ1ZVxuICAgIC8vIGZvdW5kIVxuICAgIGJyZWFrXG4gIH1cblxuICAvLyBJZiBhIGZlbmNlIGhhcyBoZWFkaW5nIHNwYWNlcywgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGl0cyBpbm5lciBibG9ja1xuICBsZW4gPSBzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZSArIChoYXZlRW5kTWFya2VyID8gMSA6IDApXG5cbiAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ2ZlbmNlJywgJ2NvZGUnLCAwKVxuICB0b2tlbi5pbmZvICAgID0gcGFyYW1zXG4gIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUgKyAxLCBuZXh0TGluZSwgbGVuLCB0cnVlKVxuICB0b2tlbi5tYXJrdXAgID0gbWFya3VwXG4gIHRva2VuLm1hcCAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBCbG9jayBxdW90ZXNcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJsb2NrcXVvdGUgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICBjb25zdCBvbGRMaW5lTWF4ID0gc3RhdGUubGluZU1heFxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gY2hlY2sgdGhlIGJsb2NrIHF1b3RlIG1hcmtlclxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgzRS8qID4gKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyB3ZSBrbm93IHRoYXQgaXQncyBnb2luZyB0byBiZSBhIHZhbGlkIGJsb2NrcXVvdGUsXG4gIC8vIHNvIG5vIHBvaW50IHRyeWluZyB0byBmaW5kIHRoZSBlbmQgb2YgaXQgaW4gc2lsZW50IG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgY29uc3Qgb2xkQk1hcmtzICA9IFtdXG4gIGNvbnN0IG9sZEJTQ291bnQgPSBbXVxuICBjb25zdCBvbGRTQ291bnQgID0gW11cbiAgY29uc3Qgb2xkVFNoaWZ0ICA9IFtdXG5cbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2Jsb2NrcXVvdGUnKVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAnYmxvY2txdW90ZSdcbiAgbGV0IGxhc3RMaW5lRW1wdHkgPSBmYWxzZVxuICBsZXQgbmV4dExpbmVcblxuICAvLyBTZWFyY2ggdGhlIGVuZCBvZiB0aGUgYmxvY2tcbiAgLy9cbiAgLy8gQmxvY2sgZW5kcyB3aXRoIGVpdGhlcjpcbiAgLy8gIDEuIGFuIGVtcHR5IGxpbmUgb3V0c2lkZTpcbiAgLy8gICAgIGBgYFxuICAvLyAgICAgPiB0ZXN0XG4gIC8vXG4gIC8vICAgICBgYGBcbiAgLy8gIDIuIGFuIGVtcHR5IGxpbmUgaW5zaWRlOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+XG4gIC8vICAgICB0ZXN0XG4gIC8vICAgICBgYGBcbiAgLy8gIDMuIGFub3RoZXIgdGFnOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+IHRlc3RcbiAgLy8gICAgICAtIC0gLVxuICAvLyAgICAgYGBgXG4gIGZvciAobmV4dExpbmUgPSBzdGFydExpbmU7IG5leHRMaW5lIDwgZW5kTGluZTsgbmV4dExpbmUrKykge1xuICAgIC8vIGNoZWNrIGlmIGl0J3Mgb3V0ZGVudGVkLCBpLmUuIGl0J3MgaW5zaWRlIGxpc3QgaXRlbSBhbmQgaW5kZW50ZWRcbiAgICAvLyBsZXNzIHRoYW4gc2FpZCBsaXN0IGl0ZW06XG4gICAgLy9cbiAgICAvLyBgYGBcbiAgICAvLyAxLiBhbnl0aGluZ1xuICAgIC8vICAgID4gY3VycmVudCBibG9ja3F1b3RlXG4gICAgLy8gMi4gY2hlY2tpbmcgdGhpcyBsaW5lXG4gICAgLy8gYGBgXG4gICAgY29uc3QgaXNPdXRkZW50ZWQgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50XG5cbiAgICBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgIGlmIChwb3MgPj0gbWF4KSB7XG4gICAgICAvLyBDYXNlIDE6IGxpbmUgaXMgbm90IGluc2lkZSB0aGUgYmxvY2txdW90ZSwgYW5kIHRoaXMgbGluZSBpcyBlbXB0eS5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKSA9PT0gMHgzRS8qID4gKi8gJiYgIWlzT3V0ZGVudGVkKSB7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgaW5zaWRlIHRoZSBibG9ja3F1b3RlLlxuXG4gICAgICAvLyBzZXQgb2Zmc2V0IHBhc3Qgc3BhY2VzIGFuZCBcIj5cIlxuICAgICAgbGV0IGluaXRpYWwgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdICsgMVxuICAgICAgbGV0IHNwYWNlQWZ0ZXJNYXJrZXJcbiAgICAgIGxldCBhZGp1c3RUYWJcblxuICAgICAgLy8gc2tpcCBvbmUgb3B0aW9uYWwgc3BhY2UgYWZ0ZXIgJz4nXG4gICAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyMCAvKiBzcGFjZSAqLykge1xuICAgICAgICAvLyAnID4gICB0ZXN0ICdcbiAgICAgICAgLy8gICAgIF4gLS0gcG9zaXRpb24gc3RhcnQgb2YgbGluZSBoZXJlOlxuICAgICAgICBwb3MrK1xuICAgICAgICBpbml0aWFsKytcbiAgICAgICAgYWRqdXN0VGFiID0gZmFsc2VcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgwOSAvKiB0YWIgKi8pIHtcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IHRydWVcblxuICAgICAgICBpZiAoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdICsgaW5pdGlhbCkgJSA0ID09PSAzKSB7XG4gICAgICAgICAgLy8gJyAgPlxcdCAgdGVzdCAnXG4gICAgICAgICAgLy8gICAgICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmUgKHRhYiBoYXMgd2lkdGg9PT0xKVxuICAgICAgICAgIHBvcysrXG4gICAgICAgICAgaW5pdGlhbCsrXG4gICAgICAgICAgYWRqdXN0VGFiID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAnID5cXHQgIHRlc3QgJ1xuICAgICAgICAgIC8vICAgIF4gLS0gcG9zaXRpb24gc3RhcnQgb2YgbGluZSBoZXJlICsgc2hpZnQgYnNDb3VudCBzbGlnaHRseVxuICAgICAgICAgIC8vICAgICAgICAgdG8gbWFrZSBleHRyYSBzcGFjZSBhcHBlYXJcbiAgICAgICAgICBhZGp1c3RUYWIgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYWNlQWZ0ZXJNYXJrZXIgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBsZXQgb2Zmc2V0ID0gaW5pdGlhbFxuICAgICAgb2xkQk1hcmtzLnB1c2goc3RhdGUuYk1hcmtzW25leHRMaW5lXSlcbiAgICAgIHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gPSBwb3NcblxuICAgICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgICAgICBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICAgIG9mZnNldCArPSA0IC0gKG9mZnNldCArIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdICsgKGFkanVzdFRhYiA/IDEgOiAwKSkgJSA0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCsrXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBwb3MrK1xuICAgICAgfVxuXG4gICAgICBsYXN0TGluZUVtcHR5ID0gcG9zID49IG1heFxuXG4gICAgICBvbGRCU0NvdW50LnB1c2goc3RhdGUuYnNDb3VudFtuZXh0TGluZV0pXG4gICAgICBzdGF0ZS5ic0NvdW50W25leHRMaW5lXSA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gKyAxICsgKHNwYWNlQWZ0ZXJNYXJrZXIgPyAxIDogMClcblxuICAgICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvZmZzZXQgLSBpbml0aWFsXG5cbiAgICAgIG9sZFRTaGlmdC5wdXNoKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0pXG4gICAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gcG9zIC0gc3RhdGUuYk1hcmtzW25leHRMaW5lXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IGxpbmUgaXMgbm90IGluc2lkZSB0aGUgYmxvY2txdW90ZSwgYW5kIHRoZSBsYXN0IGxpbmUgd2FzIGVtcHR5LlxuICAgIGlmIChsYXN0TGluZUVtcHR5KSB7IGJyZWFrIH1cblxuICAgIC8vIENhc2UgMzogYW5vdGhlciB0YWcgZm91bmQuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXJtaW5hdGUpIHtcbiAgICAgIC8vIFF1aXJrIHRvIGVuZm9yY2UgXCJoYXJkIHRlcm1pbmF0aW9uIG1vZGVcIiBmb3IgcGFyYWdyYXBocztcbiAgICAgIC8vIG5vcm1hbGx5IGlmIHlvdSBjYWxsIGB0b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lLCBuZXh0TGluZSlgLFxuICAgICAgLy8gcGFyYWdyYXBocyB3aWxsIGxvb2sgYmVsb3cgbmV4dExpbmUgZm9yIHBhcmFncmFwaCBjb250aW51YXRpb24sXG4gICAgICAvLyBidXQgaWYgYmxvY2txdW90ZSBpcyB0ZXJtaW5hdGVkIGJ5IGFub3RoZXIgdGFnLCB0aGV5IHNob3VsZG4ndFxuICAgICAgc3RhdGUubGluZU1heCA9IG5leHRMaW5lXG5cbiAgICAgIGlmIChzdGF0ZS5ibGtJbmRlbnQgIT09IDApIHtcbiAgICAgICAgLy8gc3RhdGUuYmxrSW5kZW50IHdhcyBub24temVybywgd2Ugbm93IHNldCBpdCB0byB6ZXJvLFxuICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBhbGwgb2Zmc2V0cyB0byBhcHBlYXIgYXNcbiAgICAgICAgLy8gaWYgaW5kZW50IHdhc24ndCBjaGFuZ2VkXG4gICAgICAgIG9sZEJNYXJrcy5wdXNoKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0pXG4gICAgICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICAgICAgb2xkVFNoaWZ0LnB1c2goc3RhdGUudFNoaWZ0W25leHRMaW5lXSlcbiAgICAgICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcbiAgICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSAtPSBzdGF0ZS5ibGtJbmRlbnRcbiAgICAgIH1cblxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKVxuICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgIG9sZFNDb3VudC5wdXNoKHN0YXRlLnNDb3VudFtuZXh0TGluZV0pXG5cbiAgICAvLyBBIG5lZ2F0aXZlIGluZGVudGF0aW9uIG1lYW5zIHRoYXQgdGhpcyBpcyBhIHBhcmFncmFwaCBjb250aW51YXRpb25cbiAgICAvL1xuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSAtMVxuICB9XG5cbiAgY29uc3Qgb2xkSW5kZW50ID0gc3RhdGUuYmxrSW5kZW50XG4gIHN0YXRlLmJsa0luZGVudCA9IDBcblxuICBjb25zdCB0b2tlbl9vICA9IHN0YXRlLnB1c2goJ2Jsb2NrcXVvdGVfb3BlbicsICdibG9ja3F1b3RlJywgMSlcbiAgdG9rZW5fby5tYXJrdXAgPSAnPidcbiAgY29uc3QgbGluZXMgPSBbc3RhcnRMaW5lLCAwXVxuICB0b2tlbl9vLm1hcCAgICA9IGxpbmVzXG5cbiAgc3RhdGUubWQuYmxvY2sudG9rZW5pemUoc3RhdGUsIHN0YXJ0TGluZSwgbmV4dExpbmUpXG5cbiAgY29uc3QgdG9rZW5fYyAgPSBzdGF0ZS5wdXNoKCdibG9ja3F1b3RlX2Nsb3NlJywgJ2Jsb2NrcXVvdGUnLCAtMSlcbiAgdG9rZW5fYy5tYXJrdXAgPSAnPidcblxuICBzdGF0ZS5saW5lTWF4ID0gb2xkTGluZU1heFxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuICBsaW5lc1sxXSA9IHN0YXRlLmxpbmVcblxuICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRTaGlmdDsgdGhpcyBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJzZXJcbiAgLy8gaGFzIGFscmVhZHkgYmVlbiBoZXJlLCBidXQganVzdCB0byBtYWtlIHN1cmUgd2UgY2FuIGRvIHRoYXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkVFNoaWZ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3RhdGUuYk1hcmtzW2kgKyBzdGFydExpbmVdID0gb2xkQk1hcmtzW2ldXG4gICAgc3RhdGUudFNoaWZ0W2kgKyBzdGFydExpbmVdID0gb2xkVFNoaWZ0W2ldXG4gICAgc3RhdGUuc0NvdW50W2kgKyBzdGFydExpbmVdID0gb2xkU0NvdW50W2ldXG4gICAgc3RhdGUuYnNDb3VudFtpICsgc3RhcnRMaW5lXSA9IG9sZEJTQ291bnRbaV1cbiAgfVxuICBzdGF0ZS5ibGtJbmRlbnQgPSBvbGRJbmRlbnRcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gSG9yaXpvbnRhbCBydWxlXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBociAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG5cbiAgLy8gQ2hlY2sgaHIgbWFya2VyXG4gIGlmIChtYXJrZXIgIT09IDB4MkEvKiAqICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkQvKiAtICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4NUYvKiBfICovKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBtYXJrZXJzIGNhbiBiZSBtaXhlZCB3aXRoIHNwYWNlcywgYnV0IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCAzIG9mIHRoZW1cblxuICBsZXQgY250ID0gMVxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgICBpZiAoY2ggIT09IG1hcmtlciAmJiAhaXNTcGFjZShjaCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAoY2ggPT09IG1hcmtlcikgeyBjbnQrKyB9XG4gIH1cblxuICBpZiAoY250IDwgMykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW4gID0gc3RhdGUucHVzaCgnaHInLCAnaHInLCAwKVxuICB0b2tlbi5tYXAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuICB0b2tlbi5tYXJrdXAgPSBBcnJheShjbnQgKyAxKS5qb2luKFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKSlcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiaW1wb3J0IHsgaXNTcGFjZSwgbm9ybWFsaXplUmVmZXJlbmNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVmZXJlbmNlIChzdGF0ZSwgc3RhcnRMaW5lLCBfZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGxldCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBmdW5jdGlvbiBnZXROZXh0TGluZSAobmV4dExpbmUpIHtcbiAgICBjb25zdCBlbmRMaW5lID0gc3RhdGUubGluZU1heFxuXG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUgfHwgc3RhdGUuaXNFbXB0eShuZXh0TGluZSkpIHtcbiAgICAgIC8vIGVtcHR5IGxpbmUgb3IgZW5kIG9mIGlucHV0XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGxldCBpc0NvbnRpbnVhdGlvbiA9IGZhbHNlXG5cbiAgICAvLyB0aGlzIHdvdWxkIGJlIGEgY29kZSBibG9jayBub3JtYWxseSwgYnV0IGFmdGVyIHBhcmFncmFwaFxuICAgIC8vIGl0J3MgY29uc2lkZXJlZCBhIGxhenkgY29udGludWF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCdzIHRoZXJlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPiAzKSB7IGlzQ29udGludWF0aW9uID0gdHJ1ZSB9XG5cbiAgICAvLyBxdWlyayBmb3IgYmxvY2txdW90ZXMsIHRoaXMgbGluZSBzaG91bGQgYWxyZWFkeSBiZSBjaGVja2VkIGJ5IHRoYXQgcnVsZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgMCkgeyBpc0NvbnRpbnVhdGlvbiA9IHRydWUgfVxuXG4gICAgaWYgKCFpc0NvbnRpbnVhdGlvbikge1xuICAgICAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ3JlZmVyZW5jZScpXG4gICAgICBjb25zdCBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZVxuICAgICAgc3RhdGUucGFyZW50VHlwZSA9ICdyZWZlcmVuY2UnXG5cbiAgICAgIC8vIFNvbWUgdGFncyBjYW4gdGVybWluYXRlIHBhcmFncmFwaCB3aXRob3V0IGVtcHR5IGxpbmUuXG4gICAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuICAgICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgICAvLyB0ZXJtaW5hdGVkIGJ5IGFub3RoZXIgYmxvY2tcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgIC8vIG1heCArIDEgZXhwbGljaXRseSBpbmNsdWRlcyB0aGUgbmV3bGluZVxuICAgIHJldHVybiBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXggKyAxKVxuICB9XG5cbiAgbGV0IHN0ciA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heCArIDEpXG5cbiAgbWF4ID0gc3RyLmxlbmd0aFxuICBsZXQgbGFiZWxFbmQgPSAtMVxuXG4gIGZvciAocG9zID0gMTsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjaCA9PT0gMHg1QiAvKiBbICovKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVEIC8qIF0gKi8pIHtcbiAgICAgIGxhYmVsRW5kID0gcG9zXG4gICAgICBicmVha1xuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MEEgLyogXFxuICovKSB7XG4gICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgICAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgICAgIG5leHRMaW5lKytcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDVDIC8qIFxcICovKSB7XG4gICAgICBwb3MrK1xuICAgICAgaWYgKHBvcyA8IG1heCAmJiBzdHIuY2hhckNvZGVBdChwb3MpID09PSAweDBBKSB7XG4gICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgICAgIGlmIChsaW5lQ29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgICAgICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICAgICAgICBuZXh0TGluZSsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobGFiZWxFbmQgPCAwIHx8IHN0ci5jaGFyQ29kZUF0KGxhYmVsRW5kICsgMSkgIT09IDB4M0EvKiA6ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gW2xhYmVsXTogICBkZXN0aW5hdGlvbiAgICd0aXRsZSdcbiAgLy8gICAgICAgICBeXl4gc2tpcCBvcHRpb25hbCB3aGl0ZXNwYWNlIGhlcmVcbiAgZm9yIChwb3MgPSBsYWJlbEVuZCArIDI7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoY2ggPT09IDB4MEEpIHtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgICBpZiAobGluZUNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICAgICAgbmV4dExpbmUrK1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgIC8qIGVzbGludCBuby1lbXB0eTowICovXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy8gW2xhYmVsXTogICBkZXN0aW5hdGlvbiAgICd0aXRsZSdcbiAgLy8gICAgICAgICAgICBeXl5eXl5eXl5eXiBwYXJzZSB0aGlzXG4gIGNvbnN0IGRlc3RSZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0Rlc3RpbmF0aW9uKHN0ciwgcG9zLCBtYXgpXG4gIGlmICghZGVzdFJlcy5vaykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IGhyZWYgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKGRlc3RSZXMuc3RyKVxuICBpZiAoIXN0YXRlLm1kLnZhbGlkYXRlTGluayhocmVmKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHBvcyA9IGRlc3RSZXMucG9zXG5cbiAgLy8gc2F2ZSBjdXJzb3Igc3RhdGUsIHdlIGNvdWxkIHJlcXVpcmUgdG8gcm9sbGJhY2sgbGF0ZXJcbiAgY29uc3QgZGVzdEVuZFBvcyA9IHBvc1xuICBjb25zdCBkZXN0RW5kTGluZU5vID0gbmV4dExpbmVcblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgXl5eIHNraXBwaW5nIHRob3NlIHNwYWNlc1xuICBjb25zdCBzdGFydCA9IHBvc1xuICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjaCA9PT0gMHgwQSkge1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgIGlmIChsaW5lQ29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICBuZXh0TGluZSsrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgLyogZXNsaW50IG5vLWVtcHR5OjAgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXiBwYXJzZSB0aGlzXG4gIGxldCB0aXRsZVJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rVGl0bGUoc3RyLCBwb3MsIG1heClcbiAgd2hpbGUgKHRpdGxlUmVzLmNhbl9jb250aW51ZSkge1xuICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgaWYgKGxpbmVDb250ZW50ID09PSBudWxsKSBicmVha1xuICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgIHBvcyA9IG1heFxuICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICBuZXh0TGluZSsrXG4gICAgdGl0bGVSZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua1RpdGxlKHN0ciwgcG9zLCBtYXgsIHRpdGxlUmVzKVxuICB9XG4gIGxldCB0aXRsZVxuXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhcnQgIT09IHBvcyAmJiB0aXRsZVJlcy5vaykge1xuICAgIHRpdGxlID0gdGl0bGVSZXMuc3RyXG4gICAgcG9zID0gdGl0bGVSZXMucG9zXG4gIH0gZWxzZSB7XG4gICAgdGl0bGUgPSAnJ1xuICAgIHBvcyA9IGRlc3RFbmRQb3NcbiAgICBuZXh0TGluZSA9IGRlc3RFbmRMaW5lTm9cbiAgfVxuXG4gIC8vIHNraXAgdHJhaWxpbmcgc3BhY2VzIHVudGlsIHRoZSByZXN0IG9mIHRoZSBsaW5lXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoIWlzU3BhY2UoY2gpKSB7IGJyZWFrIH1cbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHBvcyA8IG1heCAmJiBzdHIuY2hhckNvZGVBdChwb3MpICE9PSAweDBBKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICAvLyBnYXJiYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgYWZ0ZXIgdGl0bGUsXG4gICAgICAvLyBidXQgaXQgY291bGQgc3RpbGwgYmUgYSB2YWxpZCByZWZlcmVuY2UgaWYgd2Ugcm9sbCBiYWNrXG4gICAgICB0aXRsZSA9ICcnXG4gICAgICBwb3MgPSBkZXN0RW5kUG9zXG4gICAgICBuZXh0TGluZSA9IGRlc3RFbmRMaW5lTm9cbiAgICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgICAgIGlmICghaXNTcGFjZShjaCkpIHsgYnJlYWsgfVxuICAgICAgICBwb3MrK1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwb3MgPCBtYXggJiYgc3RyLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgwQSkge1xuICAgIC8vIGdhcmJhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgbGFiZWwgPSBub3JtYWxpemVSZWZlcmVuY2Uoc3RyLnNsaWNlKDEsIGxhYmVsRW5kKSlcbiAgaWYgKCFsYWJlbCkge1xuICAgIC8vIENvbW1vbk1hcmsgMC4yMCBkaXNhbGxvd3MgZW1wdHkgbGFiZWxzXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBSZWZlcmVuY2UgY2FuIG5vdCB0ZXJtaW5hdGUgYW55dGhpbmcuIFRoaXMgY2hlY2sgaXMgZm9yIHNhZmV0eSBvbmx5LlxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgaWYgKHR5cGVvZiBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9IHt9XG4gIH1cbiAgaWYgKHR5cGVvZiBzdGF0ZS5lbnYucmVmZXJlbmNlc1tsYWJlbF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RhdGUuZW52LnJlZmVyZW5jZXNbbGFiZWxdID0geyB0aXRsZSwgaHJlZiB9XG4gIH1cblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIGhlYWRpbmcgKCMsICMjLCAuLi4pXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoZWFkaW5nIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgY2ggID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChjaCAhPT0gMHgyMy8qICMgKi8gfHwgcG9zID49IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIGNvdW50IGhlYWRpbmcgbGV2ZWxcbiAgbGV0IGxldmVsID0gMVxuICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KCsrcG9zKVxuICB3aGlsZSAoY2ggPT09IDB4MjMvKiAjICovICYmIHBvcyA8IG1heCAmJiBsZXZlbCA8PSA2KSB7XG4gICAgbGV2ZWwrK1xuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytwb3MpXG4gIH1cblxuICBpZiAobGV2ZWwgPiA2IHx8IChwb3MgPCBtYXggJiYgIWlzU3BhY2UoY2gpKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8vIExldCdzIGN1dCB0YWlscyBsaWtlICcgICAgIyMjICAnIGZyb20gdGhlIGVuZCBvZiBzdHJpbmdcblxuICBtYXggPSBzdGF0ZS5za2lwU3BhY2VzQmFjayhtYXgsIHBvcylcbiAgY29uc3QgdG1wID0gc3RhdGUuc2tpcENoYXJzQmFjayhtYXgsIDB4MjMsIHBvcykgLy8gI1xuICBpZiAodG1wID4gcG9zICYmIGlzU3BhY2Uoc3RhdGUuc3JjLmNoYXJDb2RlQXQodG1wIC0gMSkpKSB7XG4gICAgbWF4ID0gdG1wXG4gIH1cblxuICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGNvbnN0IHRva2VuX28gID0gc3RhdGUucHVzaCgnaGVhZGluZ19vcGVuJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgMSlcbiAgdG9rZW5fby5tYXJrdXAgPSAnIyMjIyMjIyMnLnNsaWNlKDAsIGxldmVsKVxuICB0b2tlbl9vLm1hcCAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KS50cmltKClcbiAgdG9rZW5faS5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG4gIHRva2VuX2kuY2hpbGRyZW4gPSBbXVxuXG4gIGNvbnN0IHRva2VuX2MgID0gc3RhdGUucHVzaCgnaGVhZGluZ19jbG9zZScsICdoJyArIFN0cmluZyhsZXZlbCksIC0xKVxuICB0b2tlbl9jLm1hcmt1cCA9ICcjIyMjIyMjIycuc2xpY2UoMCwgbGV2ZWwpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIGxoZWFkaW5nICgtLS0sID09PSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGhlYWRpbmcgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUvKiwgc2lsZW50ICovKSB7XG4gIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdwYXJhZ3JhcGgnKVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdwYXJhZ3JhcGgnIC8vIHVzZSBwYXJhZ3JhcGggdG8gbWF0Y2ggdGVybWluYXRvclJ1bGVzXG5cbiAgLy8ganVtcCBsaW5lLWJ5LWxpbmUgdW50aWwgZW1wdHkgb25lIG9yIEVPRlxuICBsZXQgbGV2ZWwgPSAwXG4gIGxldCBtYXJrZXJcbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGZvciAoOyBuZXh0TGluZSA8IGVuZExpbmUgJiYgIXN0YXRlLmlzRW1wdHkobmV4dExpbmUpOyBuZXh0TGluZSsrKSB7XG4gICAgLy8gdGhpcyB3b3VsZCBiZSBhIGNvZGUgYmxvY2sgbm9ybWFsbHksIGJ1dCBhZnRlciBwYXJhZ3JhcGhcbiAgICAvLyBpdCdzIGNvbnNpZGVyZWQgYSBsYXp5IGNvbnRpbnVhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQncyB0aGVyZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID4gMykgeyBjb250aW51ZSB9XG5cbiAgICAvL1xuICAgIC8vIENoZWNrIGZvciB1bmRlcmxpbmUgaW4gc2V0ZXh0IGhlYWRlclxuICAgIC8vXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPj0gc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICAgIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgICAgaWYgKHBvcyA8IG1heCkge1xuICAgICAgICBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHgyRC8qIC0gKi8gfHwgbWFya2VyID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIHBvcyA9IHN0YXRlLnNraXBDaGFycyhwb3MsIG1hcmtlcilcbiAgICAgICAgICBwb3MgPSBzdGF0ZS5za2lwU3BhY2VzKHBvcylcblxuICAgICAgICAgIGlmIChwb3MgPj0gbWF4KSB7XG4gICAgICAgICAgICBsZXZlbCA9IChtYXJrZXIgPT09IDB4M0QvKiA9ICovID8gMSA6IDIpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHF1aXJrIGZvciBibG9ja3F1b3RlcywgdGhpcyBsaW5lIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgYnkgdGhhdCBydWxlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCAwKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIFNvbWUgdGFncyBjYW4gdGVybWluYXRlIHBhcmFncmFwaCB3aXRob3V0IGVtcHR5IGxpbmUuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrIH1cbiAgfVxuXG4gIGlmICghbGV2ZWwpIHtcbiAgICAvLyBEaWRuJ3QgZmluZCB2YWxpZCB1bmRlcmxpbmVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCBzdGF0ZS5ibGtJbmRlbnQsIGZhbHNlKS50cmltKClcblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW5fbyAgICA9IHN0YXRlLnB1c2goJ2hlYWRpbmdfb3BlbicsICdoJyArIFN0cmluZyhsZXZlbCksIDEpXG4gIHRva2VuX28ubWFya3VwICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcbiAgdG9rZW5fby5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gY29udGVudFxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZSAtIDFdXG4gIHRva2VuX2kuY2hpbGRyZW4gPSBbXVxuXG4gIGNvbnN0IHRva2VuX2MgICAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX2Nsb3NlJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgLTEpXG4gIHRva2VuX2MubWFya3VwICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQYXJhZ3JhcGhcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyYWdyYXBoIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lKSB7XG4gIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdwYXJhZ3JhcGgnKVxuICBjb25zdCBvbGRQYXJlbnRUeXBlID0gc3RhdGUucGFyZW50VHlwZVxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAncGFyYWdyYXBoJ1xuXG4gIC8vIGp1bXAgbGluZS1ieS1saW5lIHVudGlsIGVtcHR5IG9uZSBvciBFT0ZcbiAgZm9yICg7IG5leHRMaW5lIDwgZW5kTGluZSAmJiAhc3RhdGUuaXNFbXB0eShuZXh0TGluZSk7IG5leHRMaW5lKyspIHtcbiAgICAvLyB0aGlzIHdvdWxkIGJlIGEgY29kZSBibG9jayBub3JtYWxseSwgYnV0IGFmdGVyIHBhcmFncmFwaFxuICAgIC8vIGl0J3MgY29uc2lkZXJlZCBhIGxhenkgY29udGludWF0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hhdCdzIHRoZXJlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPiAzKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIHF1aXJrIGZvciBibG9ja3F1b3RlcywgdGhpcyBsaW5lIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgYnkgdGhhdCBydWxlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCAwKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIFNvbWUgdGFncyBjYW4gdGVybWluYXRlIHBhcmFncmFwaCB3aXRob3V0IGVtcHR5IGxpbmUuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrIH1cbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCBzdGF0ZS5ibGtJbmRlbnQsIGZhbHNlKS50cmltKClcblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcblxuICBjb25zdCB0b2tlbl9vICAgID0gc3RhdGUucHVzaCgncGFyYWdyYXBoX29wZW4nLCAncCcsIDEpXG4gIHRva2VuX28ubWFwICAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuXG4gIGNvbnN0IHRva2VuX2kgICAgPSBzdGF0ZS5wdXNoKCdpbmxpbmUnLCAnJywgMClcbiAgdG9rZW5faS5jb250ZW50ICA9IGNvbnRlbnRcbiAgdG9rZW5faS5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG4gIHRva2VuX2kuY2hpbGRyZW4gPSBbXVxuXG4gIHN0YXRlLnB1c2goJ3BhcmFncmFwaF9jbG9zZScsICdwJywgLTEpXG5cbiAgc3RhdGUucGFyZW50VHlwZSA9IG9sZFBhcmVudFR5cGVcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gSW5saW5lIHBhcnNlciBzdGF0ZVxuXG5pbXBvcnQgVG9rZW4gZnJvbSAnLi4vdG9rZW4ubWpzJ1xuaW1wb3J0IHsgaXNXaGl0ZVNwYWNlLCBpc1B1bmN0Q2hhciwgaXNNZEFzY2lpUHVuY3QgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5mdW5jdGlvbiBTdGF0ZUlubGluZSAoc3JjLCBtZCwgZW52LCBvdXRUb2tlbnMpIHtcbiAgdGhpcy5zcmMgPSBzcmNcbiAgdGhpcy5lbnYgPSBlbnZcbiAgdGhpcy5tZCA9IG1kXG4gIHRoaXMudG9rZW5zID0gb3V0VG9rZW5zXG4gIHRoaXMudG9rZW5zX21ldGEgPSBBcnJheShvdXRUb2tlbnMubGVuZ3RoKVxuXG4gIHRoaXMucG9zID0gMFxuICB0aGlzLnBvc01heCA9IHRoaXMuc3JjLmxlbmd0aFxuICB0aGlzLmxldmVsID0gMFxuICB0aGlzLnBlbmRpbmcgPSAnJ1xuICB0aGlzLnBlbmRpbmdMZXZlbCA9IDBcblxuICAvLyBTdG9yZXMgeyBzdGFydDogZW5kIH0gcGFpcnMuIFVzZWZ1bCBmb3IgYmFja3RyYWNrXG4gIC8vIG9wdGltaXphdGlvbiBvZiBwYWlycyBwYXJzZSAoZW1waGFzaXMsIHN0cmlrZXMpLlxuICB0aGlzLmNhY2hlID0ge31cblxuICAvLyBMaXN0IG9mIGVtcGhhc2lzLWxpa2UgZGVsaW1pdGVycyBmb3IgY3VycmVudCB0YWdcbiAgdGhpcy5kZWxpbWl0ZXJzID0gW11cblxuICAvLyBTdGFjayBvZiBkZWxpbWl0ZXIgbGlzdHMgZm9yIHVwcGVyIGxldmVsIHRhZ3NcbiAgdGhpcy5fcHJldl9kZWxpbWl0ZXJzID0gW11cblxuICAvLyBiYWNrdGljayBsZW5ndGggPT4gbGFzdCBzZWVuIHBvc2l0aW9uXG4gIHRoaXMuYmFja3RpY2tzID0ge31cbiAgdGhpcy5iYWNrdGlja3NTY2FubmVkID0gZmFsc2VcblxuICAvLyBDb3VudGVyIHVzZWQgdG8gZGlzYWJsZSBpbmxpbmUgbGlua2lmeS1pdCBleGVjdXRpb25cbiAgLy8gaW5zaWRlIDxhPiBhbmQgbWFya2Rvd24gbGlua3NcbiAgdGhpcy5saW5rTGV2ZWwgPSAwXG59XG5cbi8vIEZsdXNoIHBlbmRpbmcgdGV4dFxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5wdXNoUGVuZGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgdG9rZW4gPSBuZXcgVG9rZW4oJ3RleHQnLCAnJywgMClcbiAgdG9rZW4uY29udGVudCA9IHRoaXMucGVuZGluZ1xuICB0b2tlbi5sZXZlbCA9IHRoaXMucGVuZGluZ0xldmVsXG4gIHRoaXMudG9rZW5zLnB1c2godG9rZW4pXG4gIHRoaXMucGVuZGluZyA9ICcnXG4gIHJldHVybiB0b2tlblxufVxuXG4vLyBQdXNoIG5ldyB0b2tlbiB0byBcInN0cmVhbVwiLlxuLy8gSWYgcGVuZGluZyB0ZXh0IGV4aXN0cyAtIGZsdXNoIGl0IGFzIHRleHQgdG9rZW5cbi8vXG5TdGF0ZUlubGluZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0eXBlLCB0YWcsIG5lc3RpbmcpIHtcbiAgaWYgKHRoaXMucGVuZGluZykge1xuICAgIHRoaXMucHVzaFBlbmRpbmcoKVxuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBuZXcgVG9rZW4odHlwZSwgdGFnLCBuZXN0aW5nKVxuICBsZXQgdG9rZW5fbWV0YSA9IG51bGxcblxuICBpZiAobmVzdGluZyA8IDApIHtcbiAgICAvLyBjbG9zaW5nIHRhZ1xuICAgIHRoaXMubGV2ZWwtLVxuICAgIHRoaXMuZGVsaW1pdGVycyA9IHRoaXMuX3ByZXZfZGVsaW1pdGVycy5wb3AoKVxuICB9XG5cbiAgdG9rZW4ubGV2ZWwgPSB0aGlzLmxldmVsXG5cbiAgaWYgKG5lc3RpbmcgPiAwKSB7XG4gICAgLy8gb3BlbmluZyB0YWdcbiAgICB0aGlzLmxldmVsKytcbiAgICB0aGlzLl9wcmV2X2RlbGltaXRlcnMucHVzaCh0aGlzLmRlbGltaXRlcnMpXG4gICAgdGhpcy5kZWxpbWl0ZXJzID0gW11cbiAgICB0b2tlbl9tZXRhID0geyBkZWxpbWl0ZXJzOiB0aGlzLmRlbGltaXRlcnMgfVxuICB9XG5cbiAgdGhpcy5wZW5kaW5nTGV2ZWwgPSB0aGlzLmxldmVsXG4gIHRoaXMudG9rZW5zLnB1c2godG9rZW4pXG4gIHRoaXMudG9rZW5zX21ldGEucHVzaCh0b2tlbl9tZXRhKVxuICByZXR1cm4gdG9rZW5cbn1cblxuLy8gU2NhbiBhIHNlcXVlbmNlIG9mIGVtcGhhc2lzLWxpa2UgbWFya2VycywgYW5kIGRldGVybWluZSB3aGV0aGVyXG4vLyBpdCBjYW4gc3RhcnQgYW4gZW1waGFzaXMgc2VxdWVuY2Ugb3IgZW5kIGFuIGVtcGhhc2lzIHNlcXVlbmNlLlxuLy9cbi8vICAtIHN0YXJ0IC0gcG9zaXRpb24gdG8gc2NhbiBmcm9tIChpdCBzaG91bGQgcG9pbnQgYXQgYSB2YWxpZCBtYXJrZXIpO1xuLy8gIC0gY2FuU3BsaXRXb3JkIC0gZGV0ZXJtaW5lIGlmIHRoZXNlIG1hcmtlcnMgY2FuIGJlIGZvdW5kIGluc2lkZSBhIHdvcmRcbi8vXG5TdGF0ZUlubGluZS5wcm90b3R5cGUuc2NhbkRlbGltcyA9IGZ1bmN0aW9uIChzdGFydCwgY2FuU3BsaXRXb3JkKSB7XG4gIGNvbnN0IG1heCA9IHRoaXMucG9zTWF4XG4gIGNvbnN0IG1hcmtlciA9IHRoaXMuc3JjLmNoYXJDb2RlQXQoc3RhcnQpXG5cbiAgLy8gdHJlYXQgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGFzIGEgd2hpdGVzcGFjZVxuICBjb25zdCBsYXN0Q2hhciA9IHN0YXJ0ID4gMCA/IHRoaXMuc3JjLmNoYXJDb2RlQXQoc3RhcnQgLSAxKSA6IDB4MjBcblxuICBsZXQgcG9zID0gc3RhcnRcbiAgd2hpbGUgKHBvcyA8IG1heCAmJiB0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IG1hcmtlcikgeyBwb3MrKyB9XG5cbiAgY29uc3QgY291bnQgPSBwb3MgLSBzdGFydFxuXG4gIC8vIHRyZWF0IGVuZCBvZiB0aGUgbGluZSBhcyBhIHdoaXRlc3BhY2VcbiAgY29uc3QgbmV4dENoYXIgPSBwb3MgPCBtYXggPyB0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcykgOiAweDIwXG5cbiAgY29uc3QgaXNMYXN0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobGFzdENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobGFzdENoYXIpKVxuICBjb25zdCBpc05leHRQdW5jdENoYXIgPSBpc01kQXNjaWlQdW5jdChuZXh0Q2hhcikgfHwgaXNQdW5jdENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0Q2hhcikpXG5cbiAgY29uc3QgaXNMYXN0V2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZShsYXN0Q2hhcilcbiAgY29uc3QgaXNOZXh0V2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZShuZXh0Q2hhcilcblxuICBjb25zdCBsZWZ0X2ZsYW5raW5nID1cbiAgICAhaXNOZXh0V2hpdGVTcGFjZSAmJiAoIWlzTmV4dFB1bmN0Q2hhciB8fCBpc0xhc3RXaGl0ZVNwYWNlIHx8IGlzTGFzdFB1bmN0Q2hhcilcbiAgY29uc3QgcmlnaHRfZmxhbmtpbmcgPVxuICAgICFpc0xhc3RXaGl0ZVNwYWNlICYmICghaXNMYXN0UHVuY3RDaGFyIHx8IGlzTmV4dFdoaXRlU3BhY2UgfHwgaXNOZXh0UHVuY3RDaGFyKVxuXG4gIGNvbnN0IGNhbl9vcGVuICA9IGxlZnRfZmxhbmtpbmcgICYmIChjYW5TcGxpdFdvcmQgfHwgIXJpZ2h0X2ZsYW5raW5nIHx8IGlzTGFzdFB1bmN0Q2hhcilcbiAgY29uc3QgY2FuX2Nsb3NlID0gcmlnaHRfZmxhbmtpbmcgJiYgKGNhblNwbGl0V29yZCB8fCAhbGVmdF9mbGFua2luZyAgfHwgaXNOZXh0UHVuY3RDaGFyKVxuXG4gIHJldHVybiB7IGNhbl9vcGVuLCBjYW5fY2xvc2UsIGxlbmd0aDogY291bnQgfVxufVxuXG4vLyByZS1leHBvcnQgVG9rZW4gY2xhc3MgdG8gdXNlIGluIGJsb2NrIHJ1bGVzXG5TdGF0ZUlubGluZS5wcm90b3R5cGUuVG9rZW4gPSBUb2tlblxuXG5leHBvcnQgZGVmYXVsdCBTdGF0ZUlubGluZVxuIiwiLy8gU2tpcCB0ZXh0IGNoYXJhY3RlcnMgZm9yIHRleHQgdG9rZW4sIHBsYWNlIHRob3NlIHRvIHBlbmRpbmcgYnVmZmVyXG4vLyBhbmQgaW5jcmVtZW50IGN1cnJlbnQgcG9zXG5cbi8vIFJ1bGUgdG8gc2tpcCBwdXJlIHRleHRcbi8vICd7fSQlQH4rPTonIHJlc2VydmVkIGZvciBleHRlbnRpb25zXG5cbi8vICEsIFwiLCAjLCAkLCAlLCAmLCAnLCAoLCApLCAqLCArLCAsLCAtLCAuLCAvLCA6LCA7LCA8LCA9LCA+LCA/LCBALCBbLCBcXCwgXSwgXiwgXywgYCwgeywgfCwgfSwgb3IgflxuXG4vLyAhISEhIERvbid0IGNvbmZ1c2Ugd2l0aCBcIk1hcmtkb3duIEFTQ0lJIFB1bmN0dWF0aW9uXCIgY2hhcnNcbi8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTUvI2FzY2lpLXB1bmN0dWF0aW9uLWNoYXJhY3RlclxuZnVuY3Rpb24gaXNUZXJtaW5hdG9yQ2hhciAoY2gpIHtcbiAgc3dpdGNoIChjaCkge1xuICAgIGNhc2UgMHgwQS8qIFxcbiAqLzpcbiAgICBjYXNlIDB4MjEvKiAhICovOlxuICAgIGNhc2UgMHgyMy8qICMgKi86XG4gICAgY2FzZSAweDI0LyogJCAqLzpcbiAgICBjYXNlIDB4MjUvKiAlICovOlxuICAgIGNhc2UgMHgyNi8qICYgKi86XG4gICAgY2FzZSAweDJBLyogKiAqLzpcbiAgICBjYXNlIDB4MkIvKiArICovOlxuICAgIGNhc2UgMHgyRC8qIC0gKi86XG4gICAgY2FzZSAweDNBLyogOiAqLzpcbiAgICBjYXNlIDB4M0MvKiA8ICovOlxuICAgIGNhc2UgMHgzRC8qID0gKi86XG4gICAgY2FzZSAweDNFLyogPiAqLzpcbiAgICBjYXNlIDB4NDAvKiBAICovOlxuICAgIGNhc2UgMHg1Qi8qIFsgKi86XG4gICAgY2FzZSAweDVDLyogXFwgKi86XG4gICAgY2FzZSAweDVELyogXSAqLzpcbiAgICBjYXNlIDB4NUUvKiBeICovOlxuICAgIGNhc2UgMHg1Ri8qIF8gKi86XG4gICAgY2FzZSAweDYwLyogYCAqLzpcbiAgICBjYXNlIDB4N0IvKiB7ICovOlxuICAgIGNhc2UgMHg3RC8qIH0gKi86XG4gICAgY2FzZSAweDdFLyogfiAqLzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRleHQgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIHdoaWxlIChwb3MgPCBzdGF0ZS5wb3NNYXggJiYgIWlzVGVybWluYXRvckNoYXIoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSkpIHtcbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHBvcyA9PT0gc3RhdGUucG9zKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhdGUucG9zLCBwb3MpIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBBbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgZm9yIG1lbW9yeS5cbi8vXG4vLyBJdCBjb3N0cyAxMCUgb2YgcGVyZm9ybWFuY2UsIGJ1dCBhbGxvd3MgZXh0ZW5kIHRlcm1pbmF0b3JzIGxpc3QsIGlmIHBsYWNlIGl0XG4vLyB0byBgUGFyc2VySW5saW5lYCBwcm9wZXJ0eS4gUHJvYmFibHksIHdpbGwgc3dpdGNoIHRvIGl0IHNvbWV0aW1lLCBzdWNoXG4vLyBmbGV4aWJpbGl0eSByZXF1aXJlZC5cblxuLypcbnZhciBURVJNSU5BVE9SX1JFID0gL1tcXG4hIyQlJiorXFwtOjw9PkBbXFxcXFxcXV5fYHt9fl0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRleHQoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgcG9zID0gc3RhdGUucG9zLFxuICAgICAgaWR4ID0gc3RhdGUuc3JjLnNsaWNlKHBvcykuc2VhcmNoKFRFUk1JTkFUT1JfUkUpO1xuXG4gIC8vIGZpcnN0IGNoYXIgaXMgdGVybWluYXRvciAtPiBlbXB0eSB0ZXh0XG4gIGlmIChpZHggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gbm8gdGVybWluYXRvciAtPiB0ZXh0IHRpbGwgZW5kIG9mIHN0cmluZ1xuICBpZiAoaWR4IDwgMCkge1xuICAgIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjLnNsaWNlKHBvcyk7IH1cbiAgICBzdGF0ZS5wb3MgPSBzdGF0ZS5zcmMubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBwb3MgKyBpZHgpOyB9XG5cbiAgc3RhdGUucG9zICs9IGlkeDtcblxuICByZXR1cm4gdHJ1ZTtcbn07ICovXG4iLCIvLyBQcm9jZXNzIGxpbmtzIGxpa2UgaHR0cHM6Ly9leGFtcGxlLm9yZy9cblxuLy8gUkZDMzk4Njogc2NoZW1lID0gQUxQSEEgKiggQUxQSEEgLyBESUdJVCAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiApXG5jb25zdCBTQ0hFTUVfUkUgPSAvKD86XnxbXmEtejAtOS4rLV0pKFthLXpdW2EtejAtOS4rLV0qKSQvaVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5raWZ5IChzdGF0ZSwgc2lsZW50KSB7XG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5saW5raWZ5KSByZXR1cm4gZmFsc2VcbiAgaWYgKHN0YXRlLmxpbmtMZXZlbCA+IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAocG9zICsgMyA+IG1heCkgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNBLyogOiAqLykgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKSAhPT0gMHgyRi8qIC8gKi8pIHJldHVybiBmYWxzZVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMikgIT09IDB4MkYvKiAvICovKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtYXRjaCA9IHN0YXRlLnBlbmRpbmcubWF0Y2goU0NIRU1FX1JFKVxuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwcm90byA9IG1hdGNoWzFdXG5cbiAgY29uc3QgbGluayA9IHN0YXRlLm1kLmxpbmtpZnkubWF0Y2hBdFN0YXJ0KHN0YXRlLnNyYy5zbGljZShwb3MgLSBwcm90by5sZW5ndGgpKVxuICBpZiAoIWxpbmspIHJldHVybiBmYWxzZVxuXG4gIGxldCB1cmwgPSBsaW5rLnVybFxuXG4gIC8vIGludmFsaWQgbGluaywgYnV0IHN0aWxsIGRldGVjdGVkIGJ5IGxpbmtpZnkgc29tZWhvdztcbiAgLy8gbmVlZCB0byBjaGVjayB0byBwcmV2ZW50IGluZmluaXRlIGxvb3AgYmVsb3dcbiAgaWYgKHVybC5sZW5ndGggPD0gcHJvdG8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICAvLyBkaXNhbGxvdyAnKicgYXQgdGhlIGVuZCBvZiB0aGUgbGluayAoY29uZmxpY3RzIHdpdGggZW1waGFzaXMpXG4gIHVybCA9IHVybC5yZXBsYWNlKC9cXCorJC8sICcnKVxuXG4gIGNvbnN0IGZ1bGxVcmwgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHVybClcbiAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHJldHVybiBmYWxzZVxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucGVuZGluZyA9IHN0YXRlLnBlbmRpbmcuc2xpY2UoMCwgLXByb3RvLmxlbmd0aClcblxuICAgIGNvbnN0IHRva2VuX28gPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgdG9rZW5fby5hdHRycyA9IFtbJ2hyZWYnLCBmdWxsVXJsXV1cbiAgICB0b2tlbl9vLm1hcmt1cCA9ICdsaW5raWZ5J1xuICAgIHRva2VuX28uaW5mbyA9ICdhdXRvJ1xuXG4gICAgY29uc3QgdG9rZW5fdCA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbl90LmNvbnRlbnQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCh1cmwpXG5cbiAgICBjb25zdCB0b2tlbl9jID0gc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gICAgdG9rZW5fYy5tYXJrdXAgPSAnbGlua2lmeSdcbiAgICB0b2tlbl9jLmluZm8gPSAnYXV0bydcbiAgfVxuXG4gIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoIC0gcHJvdG8ubGVuZ3RoXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZXNzIGVzY2FwZWQgY2hhcnMgYW5kIGhhcmRicmVha3NcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmNvbnN0IEVTQ0FQRUQgPSBbXVxuXG5mb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7IEVTQ0FQRUQucHVzaCgwKSB9XG5cbidcXFxcIVwiIyQlJlxcJygpKissLi86Ozw9Pj9AW11eX2B7fH1+LSdcbiAgLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaCkgeyBFU0NBUEVEW2NoLmNoYXJDb2RlQXQoMCldID0gMSB9KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlc2NhcGUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHg1Qy8qIFxcICovKSByZXR1cm4gZmFsc2VcbiAgcG9zKytcblxuICAvLyAnXFwnIGF0IHRoZSBlbmQgb2YgdGhlIGlubGluZSBibG9ja1xuICBpZiAocG9zID49IG1heCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNoMSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAoY2gxID09PSAweDBBKSB7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHN0YXRlLnB1c2goJ2hhcmRicmVhaycsICdicicsIDApXG4gICAgfVxuXG4gICAgcG9zKytcbiAgICAvLyBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZXMgZnJvbSBuZXh0IGxpbmVcbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBjaDEgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY2gxKSkgYnJlYWtcbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgc3RhdGUucG9zID0gcG9zXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBlc2NhcGVkU3RyID0gc3RhdGUuc3JjW3Bvc11cblxuICBpZiAoY2gxID49IDB4RDgwMCAmJiBjaDEgPD0gMHhEQkZGICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICBjb25zdCBjaDIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuXG4gICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikge1xuICAgICAgZXNjYXBlZFN0ciArPSBzdGF0ZS5zcmNbcG9zICsgMV1cbiAgICAgIHBvcysrXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ1N0ciA9ICdcXFxcJyArIGVzY2FwZWRTdHJcblxuICBpZiAoIXNpbGVudCkge1xuICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgndGV4dF9zcGVjaWFsJywgJycsIDApXG5cbiAgICBpZiAoY2gxIDwgMjU2ICYmIEVTQ0FQRURbY2gxXSAhPT0gMCkge1xuICAgICAgdG9rZW4uY29udGVudCA9IGVzY2FwZWRTdHJcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4uY29udGVudCA9IG9yaWdTdHJcbiAgICB9XG5cbiAgICB0b2tlbi5tYXJrdXAgPSBvcmlnU3RyXG4gICAgdG9rZW4uaW5mbyAgID0gJ2VzY2FwZSdcbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHBvcyArIDFcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIH5+c3RyaWtlIHRocm91Z2h+flxuLy9cblxuLy8gSW5zZXJ0IGVhY2ggbWFya2VyIGFzIGEgc2VwYXJhdGUgdGV4dCB0b2tlbiwgYW5kIGFkZCBpdCB0byBkZWxpbWl0ZXIgbGlzdFxuLy9cbmZ1bmN0aW9uIHN0cmlrZXRocm91Z2hfdG9rZW5pemUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpXG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChtYXJrZXIgIT09IDB4N0UvKiB+ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc2Nhbm5lZCA9IHN0YXRlLnNjYW5EZWxpbXMoc3RhdGUucG9zLCB0cnVlKVxuICBsZXQgbGVuID0gc2Nhbm5lZC5sZW5ndGhcbiAgY29uc3QgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcblxuICBpZiAobGVuIDwgMikgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCB0b2tlblxuXG4gIGlmIChsZW4gJSAyKSB7XG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ID0gY2hcbiAgICBsZW4tLVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IGNoICsgY2hcblxuICAgIHN0YXRlLmRlbGltaXRlcnMucHVzaCh7XG4gICAgICBtYXJrZXIsXG4gICAgICBsZW5ndGg6IDAsICAgICAvLyBkaXNhYmxlIFwicnVsZSBvZiAzXCIgbGVuZ3RoIGNoZWNrcyBtZWFudCBmb3IgZW1waGFzaXNcbiAgICAgIHRva2VuOiBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMSxcbiAgICAgIGVuZDogLTEsXG4gICAgICBvcGVuOiBzY2FubmVkLmNhbl9vcGVuLFxuICAgICAgY2xvc2U6IHNjYW5uZWQuY2FuX2Nsb3NlXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRlLnBvcyArPSBzY2FubmVkLmxlbmd0aFxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHBvc3RQcm9jZXNzIChzdGF0ZSwgZGVsaW1pdGVycykge1xuICBsZXQgdG9rZW5cbiAgY29uc3QgbG9uZU1hcmtlcnMgPSBbXVxuICBjb25zdCBtYXggPSBkZWxpbWl0ZXJzLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICBjb25zdCBzdGFydERlbGltID0gZGVsaW1pdGVyc1tpXVxuXG4gICAgaWYgKHN0YXJ0RGVsaW0ubWFya2VyICE9PSAweDdFLyogfiAqLykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoc3RhcnREZWxpbS5lbmQgPT09IC0xKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGVuZERlbGltID0gZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZF1cblxuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS50b2tlbnNbc3RhcnREZWxpbS50b2tlbl1cbiAgICB0b2tlbi50eXBlICAgID0gJ3Nfb3BlbidcbiAgICB0b2tlbi50YWcgICAgID0gJ3MnXG4gICAgdG9rZW4ubmVzdGluZyA9IDFcbiAgICB0b2tlbi5tYXJrdXAgID0gJ35+J1xuICAgIHRva2VuLmNvbnRlbnQgPSAnJ1xuXG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbl1cbiAgICB0b2tlbi50eXBlICAgID0gJ3NfY2xvc2UnXG4gICAgdG9rZW4udGFnICAgICA9ICdzJ1xuICAgIHRva2VuLm5lc3RpbmcgPSAtMVxuICAgIHRva2VuLm1hcmt1cCAgPSAnfn4nXG4gICAgdG9rZW4uY29udGVudCA9ICcnXG5cbiAgICBpZiAoc3RhdGUudG9rZW5zW2VuZERlbGltLnRva2VuIC0gMV0udHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgIHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbiAtIDFdLmNvbnRlbnQgPT09ICd+Jykge1xuICAgICAgbG9uZU1hcmtlcnMucHVzaChlbmREZWxpbS50b2tlbiAtIDEpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgYSBtYXJrZXIgc2VxdWVuY2UgaGFzIGFuIG9kZCBudW1iZXIgb2YgY2hhcmFjdGVycywgaXQncyBzcGxpdHRlZFxuICAvLyBsaWtlIHRoaXM6IGB+fn5+fmAgLT4gYH5gICsgYH5+YCArIGB+fmAsIGxlYXZpbmcgb25lIG1hcmtlciBhdCB0aGVcbiAgLy8gc3RhcnQgb2YgdGhlIHNlcXVlbmNlLlxuICAvL1xuICAvLyBTbywgd2UgaGF2ZSB0byBtb3ZlIGFsbCB0aG9zZSBtYXJrZXJzIGFmdGVyIHN1YnNlcXVlbnQgc19jbG9zZSB0YWdzLlxuICAvL1xuICB3aGlsZSAobG9uZU1hcmtlcnMubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxvbmVNYXJrZXJzLnBvcCgpXG4gICAgbGV0IGogPSBpICsgMVxuXG4gICAgd2hpbGUgKGogPCBzdGF0ZS50b2tlbnMubGVuZ3RoICYmIHN0YXRlLnRva2Vuc1tqXS50eXBlID09PSAnc19jbG9zZScpIHtcbiAgICAgIGorK1xuICAgIH1cblxuICAgIGotLVxuXG4gICAgaWYgKGkgIT09IGopIHtcbiAgICAgIHRva2VuID0gc3RhdGUudG9rZW5zW2pdXG4gICAgICBzdGF0ZS50b2tlbnNbal0gPSBzdGF0ZS50b2tlbnNbaV1cbiAgICAgIHN0YXRlLnRva2Vuc1tpXSA9IHRva2VuXG4gICAgfVxuICB9XG59XG5cbi8vIFdhbGsgdGhyb3VnaCBkZWxpbWl0ZXIgbGlzdCBhbmQgcmVwbGFjZSB0ZXh0IHRva2VucyB3aXRoIHRhZ3Ncbi8vXG5mdW5jdGlvbiBzdHJpa2V0aHJvdWdoX3Bvc3RQcm9jZXNzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHBvc3RQcm9jZXNzKHN0YXRlLCBzdGF0ZS5kZWxpbWl0ZXJzKVxuXG4gIGZvciAobGV0IGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICBpZiAodG9rZW5zX21ldGFbY3Vycl0gJiYgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycykge1xuICAgICAgcG9zdFByb2Nlc3Moc3RhdGUsIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdG9rZW5pemU6IHN0cmlrZXRocm91Z2hfdG9rZW5pemUsXG4gIHBvc3RQcm9jZXNzOiBzdHJpa2V0aHJvdWdoX3Bvc3RQcm9jZXNzXG59XG4iLCIvLyBQcm9jZXNzICp0aGlzKiBhbmQgX3RoYXRfXG4vL1xuXG4vLyBJbnNlcnQgZWFjaCBtYXJrZXIgYXMgYSBzZXBhcmF0ZSB0ZXh0IHRva2VuLCBhbmQgYWRkIGl0IHRvIGRlbGltaXRlciBsaXN0XG4vL1xuZnVuY3Rpb24gZW1waGFzaXNfdG9rZW5pemUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpXG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChtYXJrZXIgIT09IDB4NUYgLyogXyAqLyAmJiBtYXJrZXIgIT09IDB4MkEgLyogKiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHNjYW5uZWQgPSBzdGF0ZS5zY2FuRGVsaW1zKHN0YXRlLnBvcywgbWFya2VyID09PSAweDJBKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Nhbm5lZC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcblxuICAgIHN0YXRlLmRlbGltaXRlcnMucHVzaCh7XG4gICAgICAvLyBDaGFyIGNvZGUgb2YgdGhlIHN0YXJ0aW5nIG1hcmtlciAobnVtYmVyKS5cbiAgICAgIC8vXG4gICAgICBtYXJrZXIsXG5cbiAgICAgIC8vIFRvdGFsIGxlbmd0aCBvZiB0aGVzZSBzZXJpZXMgb2YgZGVsaW1pdGVycy5cbiAgICAgIC8vXG4gICAgICBsZW5ndGg6IHNjYW5uZWQubGVuZ3RoLFxuXG4gICAgICAvLyBBIHBvc2l0aW9uIG9mIHRoZSB0b2tlbiB0aGlzIGRlbGltaXRlciBjb3JyZXNwb25kcyB0by5cbiAgICAgIC8vXG4gICAgICB0b2tlbjogc3RhdGUudG9rZW5zLmxlbmd0aCAtIDEsXG5cbiAgICAgIC8vIElmIHRoaXMgZGVsaW1pdGVyIGlzIG1hdGNoZWQgYXMgYSB2YWxpZCBvcGVuZXIsIGBlbmRgIHdpbGwgYmVcbiAgICAgIC8vIGVxdWFsIHRvIGl0cyBwb3NpdGlvbiwgb3RoZXJ3aXNlIGl0J3MgYC0xYC5cbiAgICAgIC8vXG4gICAgICBlbmQ6IC0xLFxuXG4gICAgICAvLyBCb29sZWFuIGZsYWdzIHRoYXQgZGV0ZXJtaW5lIGlmIHRoaXMgZGVsaW1pdGVyIGNvdWxkIG9wZW4gb3IgY2xvc2VcbiAgICAgIC8vIGFuIGVtcGhhc2lzLlxuICAgICAgLy9cbiAgICAgIG9wZW46IHNjYW5uZWQuY2FuX29wZW4sXG4gICAgICBjbG9zZTogc2Nhbm5lZC5jYW5fY2xvc2VcbiAgICB9KVxuICB9XG5cbiAgc3RhdGUucG9zICs9IHNjYW5uZWQubGVuZ3RoXG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gcG9zdFByb2Nlc3MgKHN0YXRlLCBkZWxpbWl0ZXJzKSB7XG4gIGNvbnN0IG1heCA9IGRlbGltaXRlcnMubGVuZ3RoXG5cbiAgZm9yIChsZXQgaSA9IG1heCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qgc3RhcnREZWxpbSA9IGRlbGltaXRlcnNbaV1cblxuICAgIGlmIChzdGFydERlbGltLm1hcmtlciAhPT0gMHg1Ri8qIF8gKi8gJiYgc3RhcnREZWxpbS5tYXJrZXIgIT09IDB4MkEvKiAqICovKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb25seSBvcGVuaW5nIG1hcmtlcnNcbiAgICBpZiAoc3RhcnREZWxpbS5lbmQgPT09IC0xKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGVuZERlbGltID0gZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZF1cblxuICAgIC8vIElmIHRoZSBwcmV2aW91cyBkZWxpbWl0ZXIgaGFzIHRoZSBzYW1lIG1hcmtlciBhbmQgaXMgYWRqYWNlbnQgdG8gdGhpcyBvbmUsXG4gICAgLy8gbWVyZ2UgdGhvc2UgaW50byBvbmUgc3Ryb25nIGRlbGltaXRlci5cbiAgICAvL1xuICAgIC8vIGA8ZW0+PGVtPndoYXRldmVyPC9lbT48L2VtPmAgLT4gYDxzdHJvbmc+d2hhdGV2ZXI8L3N0cm9uZz5gXG4gICAgLy9cbiAgICBjb25zdCBpc1N0cm9uZyA9IGkgPiAwICYmXG4gICAgICAgICAgICAgICBkZWxpbWl0ZXJzW2kgLSAxXS5lbmQgPT09IHN0YXJ0RGVsaW0uZW5kICsgMSAmJlxuICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBmaXJzdCB0d28gbWFya2VycyBtYXRjaCBhbmQgYWRqYWNlbnRcbiAgICAgICAgICAgICAgIGRlbGltaXRlcnNbaSAtIDFdLm1hcmtlciA9PT0gc3RhcnREZWxpbS5tYXJrZXIgJiZcbiAgICAgICAgICAgICAgIGRlbGltaXRlcnNbaSAtIDFdLnRva2VuID09PSBzdGFydERlbGltLnRva2VuIC0gMSAmJlxuICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBsYXN0IHR3byBtYXJrZXJzIGFyZSBhZGphY2VudCAod2UgY2FuIHNhZmVseSBhc3N1bWUgdGhleSBtYXRjaClcbiAgICAgICAgICAgICAgIGRlbGltaXRlcnNbc3RhcnREZWxpbS5lbmQgKyAxXS50b2tlbiA9PT0gZW5kRGVsaW0udG9rZW4gKyAxXG5cbiAgICBjb25zdCBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoc3RhcnREZWxpbS5tYXJrZXIpXG5cbiAgICBjb25zdCB0b2tlbl9vICAgPSBzdGF0ZS50b2tlbnNbc3RhcnREZWxpbS50b2tlbl1cbiAgICB0b2tlbl9vLnR5cGUgICAgPSBpc1N0cm9uZyA/ICdzdHJvbmdfb3BlbicgOiAnZW1fb3BlbidcbiAgICB0b2tlbl9vLnRhZyAgICAgPSBpc1N0cm9uZyA/ICdzdHJvbmcnIDogJ2VtJ1xuICAgIHRva2VuX28ubmVzdGluZyA9IDFcbiAgICB0b2tlbl9vLm1hcmt1cCAgPSBpc1N0cm9uZyA/IGNoICsgY2ggOiBjaFxuICAgIHRva2VuX28uY29udGVudCA9ICcnXG5cbiAgICBjb25zdCB0b2tlbl9jICAgPSBzdGF0ZS50b2tlbnNbZW5kRGVsaW0udG9rZW5dXG4gICAgdG9rZW5fYy50eXBlICAgID0gaXNTdHJvbmcgPyAnc3Ryb25nX2Nsb3NlJyA6ICdlbV9jbG9zZSdcbiAgICB0b2tlbl9jLnRhZyAgICAgPSBpc1N0cm9uZyA/ICdzdHJvbmcnIDogJ2VtJ1xuICAgIHRva2VuX2MubmVzdGluZyA9IC0xXG4gICAgdG9rZW5fYy5tYXJrdXAgID0gaXNTdHJvbmcgPyBjaCArIGNoIDogY2hcbiAgICB0b2tlbl9jLmNvbnRlbnQgPSAnJ1xuXG4gICAgaWYgKGlzU3Ryb25nKSB7XG4gICAgICBzdGF0ZS50b2tlbnNbZGVsaW1pdGVyc1tpIC0gMV0udG9rZW5dLmNvbnRlbnQgPSAnJ1xuICAgICAgc3RhdGUudG9rZW5zW2RlbGltaXRlcnNbc3RhcnREZWxpbS5lbmQgKyAxXS50b2tlbl0uY29udGVudCA9ICcnXG4gICAgICBpLS1cbiAgICB9XG4gIH1cbn1cblxuLy8gV2FsayB0aHJvdWdoIGRlbGltaXRlciBsaXN0IGFuZCByZXBsYWNlIHRleHQgdG9rZW5zIHdpdGggdGFnc1xuLy9cbmZ1bmN0aW9uIGVtcGhhc2lzX3Bvc3RfcHJvY2VzcyAoc3RhdGUpIHtcbiAgY29uc3QgdG9rZW5zX21ldGEgPSBzdGF0ZS50b2tlbnNfbWV0YVxuICBjb25zdCBtYXggPSBzdGF0ZS50b2tlbnNfbWV0YS5sZW5ndGhcblxuICBwb3N0UHJvY2VzcyhzdGF0ZSwgc3RhdGUuZGVsaW1pdGVycylcblxuICBmb3IgKGxldCBjdXJyID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgaWYgKHRva2Vuc19tZXRhW2N1cnJdICYmIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpIHtcbiAgICAgIHBvc3RQcm9jZXNzKHN0YXRlLCB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHRva2VuaXplOiBlbXBoYXNpc190b2tlbml6ZSxcbiAgcG9zdFByb2Nlc3M6IGVtcGhhc2lzX3Bvc3RfcHJvY2Vzc1xufVxuIiwiLy8gUHJvY2VzcyBhdXRvbGlua3MgJzxwcm90b2NvbDouLi4+J1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5jb25zdCBFTUFJTF9SRSAgICA9IC9eKFthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqKSQvXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAqL1xuY29uc3QgQVVUT0xJTktfUkUgPSAvXihbYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9KTooW148PlxceDAwLVxceDIwXSopJC9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXV0b2xpbmsgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoKytwb3MgPj0gbWF4KSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKGNoID09PSAweDNDIC8qIDwgKi8pIHJldHVybiBmYWxzZVxuICAgIGlmIChjaCA9PT0gMHgzRSAvKiA+ICovKSBicmVha1xuICB9XG5cbiAgY29uc3QgdXJsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0ICsgMSwgcG9zKVxuXG4gIGlmIChBVVRPTElOS19SRS50ZXN0KHVybCkpIHtcbiAgICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluayh1cmwpXG4gICAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBjb25zdCB0b2tlbl9vICAgPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICB0b2tlbl9vLmF0dHJzICAgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcblxuICAgICAgY29uc3QgdG9rZW5fdCAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgICAgdG9rZW5fdC5jb250ZW50ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsKVxuXG4gICAgICBjb25zdCB0b2tlbl9jICAgPSBzdGF0ZS5wdXNoKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICAgIHRva2VuX2MubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX2MuaW5mbyAgICA9ICdhdXRvJ1xuICAgIH1cblxuICAgIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoICsgMlxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoRU1BSUxfUkUudGVzdCh1cmwpKSB7XG4gICAgY29uc3QgZnVsbFVybCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsoJ21haWx0bzonICsgdXJsKVxuICAgIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgY29uc3QgdG9rZW5fbyAgID0gc3RhdGUucHVzaCgnbGlua19vcGVuJywgJ2EnLCAxKVxuICAgICAgdG9rZW5fby5hdHRycyAgID0gW1snaHJlZicsIGZ1bGxVcmxdXVxuICAgICAgdG9rZW5fby5tYXJrdXAgID0gJ2F1dG9saW5rJ1xuICAgICAgdG9rZW5fby5pbmZvICAgID0gJ2F1dG8nXG5cbiAgICAgIGNvbnN0IHRva2VuX3QgICA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICAgIHRva2VuX3QuY29udGVudCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KHVybClcblxuICAgICAgY29uc3QgdG9rZW5fYyAgID0gc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gICAgICB0b2tlbl9jLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9jLmluZm8gICAgPSAnYXV0bydcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgKz0gdXJsLmxlbmd0aCArIDJcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvLyBQcm9jZXNzIGh0bWwgZW50aXR5IC0gJiMxMjM7LCAmI3hBRjssICZxdW90OywgLi4uXG5cbmltcG9ydCB7IGRlY29kZUhUTUwgfSBmcm9tICdlbnRpdGllcydcbmltcG9ydCB7IGlzVmFsaWRFbnRpdHlDb2RlLCBmcm9tQ29kZVBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgRElHSVRBTF9SRSA9IC9eJiMoKD86eFthLWYwLTldezEsNn18WzAtOV17MSw3fSkpOy9pXG5jb25zdCBOQU1FRF9SRSAgID0gL14mKFthLXpdW2EtejAtOV17MSwzMX0pOy9pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVudGl0eSAoc3RhdGUsIHNpbGVudCkge1xuICBjb25zdCBwb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2VcblxuICBpZiAocG9zICsgMSA+PSBtYXgpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMSlcblxuICBpZiAoY2ggPT09IDB4MjMgLyogIyAqLykge1xuICAgIGNvbnN0IG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goRElHSVRBTF9SRSlcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBtYXRjaFsxXVswXS50b0xvd2VyQ2FzZSgpID09PSAneCcgPyBwYXJzZUludChtYXRjaFsxXS5zbGljZSgxKSwgMTYpIDogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKVxuXG4gICAgICAgIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcbiAgICAgICAgdG9rZW4uY29udGVudCA9IGlzVmFsaWRFbnRpdHlDb2RlKGNvZGUpID8gZnJvbUNvZGVQb2ludChjb2RlKSA6IGZyb21Db2RlUG9pbnQoMHhGRkZEKVxuICAgICAgICB0b2tlbi5tYXJrdXAgID0gbWF0Y2hbMF1cbiAgICAgICAgdG9rZW4uaW5mbyAgICA9ICdlbnRpdHknXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtYXRjaCA9IHN0YXRlLnNyYy5zbGljZShwb3MpLm1hdGNoKE5BTUVEX1JFKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUhUTUwobWF0Y2hbMF0pXG4gICAgICBpZiAoZGVjb2RlZCAhPT0gbWF0Y2hbMF0pIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgndGV4dF9zcGVjaWFsJywgJycsIDApXG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IGRlY29kZWRcbiAgICAgICAgICB0b2tlbi5tYXJrdXAgID0gbWF0Y2hbMF1cbiAgICAgICAgICB0b2tlbi5pbmZvICAgID0gJ2VudGl0eSdcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvLyBGb3IgZWFjaCBvcGVuaW5nIGVtcGhhc2lzLWxpa2UgbWFya2VyIGZpbmQgYSBtYXRjaGluZyBjbG9zaW5nIG9uZVxuLy9cblxuZnVuY3Rpb24gcHJvY2Vzc0RlbGltaXRlcnMgKGRlbGltaXRlcnMpIHtcbiAgY29uc3Qgb3BlbmVyc0JvdHRvbSA9IHt9XG4gIGNvbnN0IG1heCA9IGRlbGltaXRlcnMubGVuZ3RoXG5cbiAgaWYgKCFtYXgpIHJldHVyblxuXG4gIC8vIGhlYWRlcklkeCBpcyB0aGUgZmlyc3QgZGVsaW1pdGVyIG9mIHRoZSBjdXJyZW50ICh3aGVyZSBjbG9zZXIgaXMpIGRlbGltaXRlciBydW5cbiAgbGV0IGhlYWRlcklkeCA9IDBcbiAgbGV0IGxhc3RUb2tlbklkeCA9IC0yIC8vIG5lZWRzIGFueSB2YWx1ZSBsb3dlciB0aGFuIC0xXG4gIGNvbnN0IGp1bXBzID0gW11cblxuICBmb3IgKGxldCBjbG9zZXJJZHggPSAwOyBjbG9zZXJJZHggPCBtYXg7IGNsb3NlcklkeCsrKSB7XG4gICAgY29uc3QgY2xvc2VyID0gZGVsaW1pdGVyc1tjbG9zZXJJZHhdXG5cbiAgICBqdW1wcy5wdXNoKDApXG5cbiAgICAvLyBtYXJrZXJzIGJlbG9uZyB0byBzYW1lIGRlbGltaXRlciBydW4gaWY6XG4gICAgLy8gIC0gdGhleSBoYXZlIGFkamFjZW50IHRva2Vuc1xuICAgIC8vICAtIEFORCBtYXJrZXJzIGFyZSB0aGUgc2FtZVxuICAgIC8vXG4gICAgaWYgKGRlbGltaXRlcnNbaGVhZGVySWR4XS5tYXJrZXIgIT09IGNsb3Nlci5tYXJrZXIgfHwgbGFzdFRva2VuSWR4ICE9PSBjbG9zZXIudG9rZW4gLSAxKSB7XG4gICAgICBoZWFkZXJJZHggPSBjbG9zZXJJZHhcbiAgICB9XG5cbiAgICBsYXN0VG9rZW5JZHggPSBjbG9zZXIudG9rZW5cblxuICAgIC8vIExlbmd0aCBpcyBvbmx5IHVzZWQgZm9yIGVtcGhhc2lzLXNwZWNpZmljIFwicnVsZSBvZiAzXCIsXG4gICAgLy8gaWYgaXQncyBub3QgZGVmaW5lZCAoaW4gc3RyaWtldGhyb3VnaCBvciAzcmQgcGFydHkgcGx1Z2lucyksXG4gICAgLy8gd2UgY2FuIGRlZmF1bHQgaXQgdG8gMCB0byBkaXNhYmxlIHRob3NlIGNoZWNrcy5cbiAgICAvL1xuICAgIGNsb3Nlci5sZW5ndGggPSBjbG9zZXIubGVuZ3RoIHx8IDBcblxuICAgIGlmICghY2xvc2VyLmNsb3NlKSBjb250aW51ZVxuXG4gICAgLy8gUHJldmlvdXNseSBjYWxjdWxhdGVkIGxvd2VyIGJvdW5kcyAocHJldmlvdXMgZmFpbHMpXG4gICAgLy8gZm9yIGVhY2ggbWFya2VyLCBlYWNoIGRlbGltaXRlciBsZW5ndGggbW9kdWxvIDMsXG4gICAgLy8gYW5kIGZvciB3aGV0aGVyIHRoaXMgY2xvc2VyIGNhbiBiZSBhbiBvcGVuZXI7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvbW1vbm1hcmsvY21hcmsvY29tbWl0LzM0MjUwZTEyY2NlYmRjNjM3MmI4YjQ5YzQ0ZmFiNTdjNzI0NDM0NjBcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG4gICAgaWYgKCFvcGVuZXJzQm90dG9tLmhhc093blByb3BlcnR5KGNsb3Nlci5tYXJrZXIpKSB7XG4gICAgICBvcGVuZXJzQm90dG9tW2Nsb3Nlci5tYXJrZXJdID0gWy0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdXG4gICAgfVxuXG4gICAgY29uc3QgbWluT3BlbmVySWR4ID0gb3BlbmVyc0JvdHRvbVtjbG9zZXIubWFya2VyXVsoY2xvc2VyLm9wZW4gPyAzIDogMCkgKyAoY2xvc2VyLmxlbmd0aCAlIDMpXVxuXG4gICAgbGV0IG9wZW5lcklkeCA9IGhlYWRlcklkeCAtIGp1bXBzW2hlYWRlcklkeF0gLSAxXG5cbiAgICBsZXQgbmV3TWluT3BlbmVySWR4ID0gb3BlbmVySWR4XG5cbiAgICBmb3IgKDsgb3BlbmVySWR4ID4gbWluT3BlbmVySWR4OyBvcGVuZXJJZHggLT0ganVtcHNbb3BlbmVySWR4XSArIDEpIHtcbiAgICAgIGNvbnN0IG9wZW5lciA9IGRlbGltaXRlcnNbb3BlbmVySWR4XVxuXG4gICAgICBpZiAob3BlbmVyLm1hcmtlciAhPT0gY2xvc2VyLm1hcmtlcikgY29udGludWVcblxuICAgICAgaWYgKG9wZW5lci5vcGVuICYmIG9wZW5lci5lbmQgPCAwKSB7XG4gICAgICAgIGxldCBpc09kZE1hdGNoID0gZmFsc2VcblxuICAgICAgICAvLyBmcm9tIHNwZWM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG9uZSBvZiB0aGUgZGVsaW1pdGVycyBjYW4gYm90aCBvcGVuIGFuZCBjbG9zZSBlbXBoYXNpcywgdGhlbiB0aGVcbiAgICAgICAgLy8gc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBkZWxpbWl0ZXIgcnVucyBjb250YWluaW5nIHRoZSBvcGVuaW5nIGFuZFxuICAgICAgICAvLyBjbG9zaW5nIGRlbGltaXRlcnMgbXVzdCBub3QgYmUgYSBtdWx0aXBsZSBvZiAzIHVubGVzcyBib3RoIGxlbmd0aHNcbiAgICAgICAgLy8gYXJlIG11bHRpcGxlcyBvZiAzLlxuICAgICAgICAvL1xuICAgICAgICBpZiAob3BlbmVyLmNsb3NlIHx8IGNsb3Nlci5vcGVuKSB7XG4gICAgICAgICAgaWYgKChvcGVuZXIubGVuZ3RoICsgY2xvc2VyLmxlbmd0aCkgJSAzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAob3BlbmVyLmxlbmd0aCAlIDMgIT09IDAgfHwgY2xvc2VyLmxlbmd0aCAlIDMgIT09IDApIHtcbiAgICAgICAgICAgICAgaXNPZGRNYXRjaCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2RkTWF0Y2gpIHtcbiAgICAgICAgICAvLyBJZiBwcmV2aW91cyBkZWxpbWl0ZXIgY2Fubm90IGJlIGFuIG9wZW5lciwgd2UgY2FuIHNhZmVseSBza2lwXG4gICAgICAgICAgLy8gdGhlIGVudGlyZSBzZXF1ZW5jZSBpbiBmdXR1cmUgY2hlY2tzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2VcbiAgICAgICAgICAvLyBzdXJlIGFsZ29yaXRobSBoYXMgbGluZWFyIGNvbXBsZXhpdHkgKHNlZSAqXypfKl8qXypfLi4uIGNhc2UpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBvcGVuZXJJZHggPiAwICYmICFkZWxpbWl0ZXJzW29wZW5lcklkeCAtIDFdLm9wZW5cbiAgICAgICAgICAgID8ganVtcHNbb3BlbmVySWR4IC0gMV0gKyAxXG4gICAgICAgICAgICA6IDBcblxuICAgICAgICAgIGp1bXBzW2Nsb3NlcklkeF0gPSBjbG9zZXJJZHggLSBvcGVuZXJJZHggKyBsYXN0SnVtcFxuICAgICAgICAgIGp1bXBzW29wZW5lcklkeF0gPSBsYXN0SnVtcFxuXG4gICAgICAgICAgY2xvc2VyLm9wZW4gID0gZmFsc2VcbiAgICAgICAgICBvcGVuZXIuZW5kICAgPSBjbG9zZXJJZHhcbiAgICAgICAgICBvcGVuZXIuY2xvc2UgPSBmYWxzZVxuICAgICAgICAgIG5ld01pbk9wZW5lcklkeCA9IC0xXG4gICAgICAgICAgLy8gdHJlYXQgbmV4dCB0b2tlbiBhcyBzdGFydCBvZiBydW4sXG4gICAgICAgICAgLy8gaXQgb3B0aW1pemVzIHNraXBzIGluICoqPC4uLj4qKmEqKjwuLi4+KiogcGF0aG9sb2dpY2FsIGNhc2VcbiAgICAgICAgICBsYXN0VG9rZW5JZHggPSAtMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3TWluT3BlbmVySWR4ICE9PSAtMSkge1xuICAgICAgLy8gSWYgbWF0Y2ggZm9yIHRoaXMgZGVsaW1pdGVyIHJ1biBmYWlsZWQsIHdlIHdhbnQgdG8gc2V0IGxvd2VyIGJvdW5kIGZvclxuICAgICAgLy8gZnV0dXJlIGxvb2t1cHMuIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBzdXJlIGFsZ29yaXRobSBoYXMgbGluZWFyXG4gICAgICAvLyBjb21wbGV4aXR5LlxuICAgICAgLy9cbiAgICAgIC8vIFNlZSBkZXRhaWxzIGhlcmU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29tbW9ubWFyay9jbWFyay9pc3N1ZXMvMTc4I2lzc3VlY29tbWVudC0yNzA0MTc0NDJcbiAgICAgIC8vXG4gICAgICBvcGVuZXJzQm90dG9tW2Nsb3Nlci5tYXJrZXJdWyhjbG9zZXIub3BlbiA/IDMgOiAwKSArICgoY2xvc2VyLmxlbmd0aCB8fCAwKSAlIDMpXSA9IG5ld01pbk9wZW5lcklkeFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5rX3BhaXJzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHByb2Nlc3NEZWxpbWl0ZXJzKHN0YXRlLmRlbGltaXRlcnMpXG5cbiAgZm9yIChsZXQgY3VyciA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgIGlmICh0b2tlbnNfbWV0YVtjdXJyXSAmJiB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKSB7XG4gICAgICBwcm9jZXNzRGVsaW1pdGVycyh0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKVxuICAgIH1cbiAgfVxufVxuIiwiLyoqIGludGVybmFsXG4gKiBjbGFzcyBQYXJzZXJJbmxpbmVcbiAqXG4gKiBUb2tlbml6ZXMgcGFyYWdyYXBoIGNvbnRlbnQuXG4gKiovXG5cbmltcG9ydCBSdWxlciBmcm9tICcuL3J1bGVyLm1qcydcbmltcG9ydCBTdGF0ZUlubGluZSBmcm9tICcuL3J1bGVzX2lubGluZS9zdGF0ZV9pbmxpbmUubWpzJ1xuXG5pbXBvcnQgcl90ZXh0IGZyb20gJy4vcnVsZXNfaW5saW5lL3RleHQubWpzJ1xuaW1wb3J0IHJfbGlua2lmeSBmcm9tICcuL3J1bGVzX2lubGluZS9saW5raWZ5Lm1qcydcbmltcG9ydCByX25ld2xpbmUgZnJvbSAnLi9ydWxlc19pbmxpbmUvbmV3bGluZS5tanMnXG5pbXBvcnQgcl9lc2NhcGUgZnJvbSAnLi9ydWxlc19pbmxpbmUvZXNjYXBlLm1qcydcbmltcG9ydCByX2JhY2t0aWNrcyBmcm9tICcuL3J1bGVzX2lubGluZS9iYWNrdGlja3MubWpzJ1xuaW1wb3J0IHJfc3RyaWtldGhyb3VnaCBmcm9tICcuL3J1bGVzX2lubGluZS9zdHJpa2V0aHJvdWdoLm1qcydcbmltcG9ydCByX2VtcGhhc2lzIGZyb20gJy4vcnVsZXNfaW5saW5lL2VtcGhhc2lzLm1qcydcbmltcG9ydCByX2xpbmsgZnJvbSAnLi9ydWxlc19pbmxpbmUvbGluay5tanMnXG5pbXBvcnQgcl9pbWFnZSBmcm9tICcuL3J1bGVzX2lubGluZS9pbWFnZS5tanMnXG5pbXBvcnQgcl9hdXRvbGluayBmcm9tICcuL3J1bGVzX2lubGluZS9hdXRvbGluay5tanMnXG5pbXBvcnQgcl9odG1sX2lubGluZSBmcm9tICcuL3J1bGVzX2lubGluZS9odG1sX2lubGluZS5tanMnXG5pbXBvcnQgcl9lbnRpdHkgZnJvbSAnLi9ydWxlc19pbmxpbmUvZW50aXR5Lm1qcydcblxuaW1wb3J0IHJfYmFsYW5jZV9wYWlycyBmcm9tICcuL3J1bGVzX2lubGluZS9iYWxhbmNlX3BhaXJzLm1qcydcbmltcG9ydCByX2ZyYWdtZW50c19qb2luIGZyb20gJy4vcnVsZXNfaW5saW5lL2ZyYWdtZW50c19qb2luLm1qcydcblxuLy8gUGFyc2VyIHJ1bGVzXG5cbmNvbnN0IF9ydWxlcyA9IFtcbiAgWyd0ZXh0JywgICAgICAgICAgICByX3RleHRdLFxuICBbJ2xpbmtpZnknLCAgICAgICAgIHJfbGlua2lmeV0sXG4gIFsnbmV3bGluZScsICAgICAgICAgcl9uZXdsaW5lXSxcbiAgWydlc2NhcGUnLCAgICAgICAgICByX2VzY2FwZV0sXG4gIFsnYmFja3RpY2tzJywgICAgICAgcl9iYWNrdGlja3NdLFxuICBbJ3N0cmlrZXRocm91Z2gnLCAgIHJfc3RyaWtldGhyb3VnaC50b2tlbml6ZV0sXG4gIFsnZW1waGFzaXMnLCAgICAgICAgcl9lbXBoYXNpcy50b2tlbml6ZV0sXG4gIFsnbGluaycsICAgICAgICAgICAgcl9saW5rXSxcbiAgWydpbWFnZScsICAgICAgICAgICByX2ltYWdlXSxcbiAgWydhdXRvbGluaycsICAgICAgICByX2F1dG9saW5rXSxcbiAgWydodG1sX2lubGluZScsICAgICByX2h0bWxfaW5saW5lXSxcbiAgWydlbnRpdHknLCAgICAgICAgICByX2VudGl0eV1cbl1cblxuLy8gYHJ1bGUyYCBydWxlc2V0IHdhcyBjcmVhdGVkIHNwZWNpZmljYWxseSBmb3IgZW1waGFzaXMvc3RyaWtldGhyb3VnaFxuLy8gcG9zdC1wcm9jZXNzaW5nIGFuZCBtYXkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIERvbid0IHVzZSB0aGlzIGZvciBhbnl0aGluZyBleGNlcHQgcGFpcnMgKHBsdWdpbnMgd29ya2luZyB3aXRoIGBiYWxhbmNlX3BhaXJzYCkuXG4vL1xuY29uc3QgX3J1bGVzMiA9IFtcbiAgWydiYWxhbmNlX3BhaXJzJywgICByX2JhbGFuY2VfcGFpcnNdLFxuICBbJ3N0cmlrZXRocm91Z2gnLCAgIHJfc3RyaWtldGhyb3VnaC5wb3N0UHJvY2Vzc10sXG4gIFsnZW1waGFzaXMnLCAgICAgICAgcl9lbXBoYXNpcy5wb3N0UHJvY2Vzc10sXG4gIC8vIHJ1bGVzIGZvciBwYWlycyBzZXBhcmF0ZSAnKionIGludG8gaXRzIG93biB0ZXh0IHRva2Vucywgd2hpY2ggbWF5IGJlIGxlZnQgdW51c2VkLFxuICAvLyBydWxlIGJlbG93IG1lcmdlcyB1bnVzZWQgc2VnbWVudHMgYmFjayB3aXRoIHRoZSByZXN0IG9mIHRoZSB0ZXh0XG4gIFsnZnJhZ21lbnRzX2pvaW4nLCAgcl9mcmFnbWVudHNfam9pbl1cbl1cblxuLyoqXG4gKiBuZXcgUGFyc2VySW5saW5lKClcbiAqKi9cbmZ1bmN0aW9uIFBhcnNlcklubGluZSAoKSB7XG4gIC8qKlxuICAgKiBQYXJzZXJJbmxpbmUjcnVsZXIgLT4gUnVsZXJcbiAgICpcbiAgICogW1tSdWxlcl1dIGluc3RhbmNlLiBLZWVwIGNvbmZpZ3VyYXRpb24gb2YgaW5saW5lIHJ1bGVzLlxuICAgKiovXG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlci5wdXNoKF9ydWxlc1tpXVswXSwgX3J1bGVzW2ldWzFdKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcklubGluZSNydWxlcjIgLT4gUnVsZXJcbiAgICpcbiAgICogW1tSdWxlcl1dIGluc3RhbmNlLiBTZWNvbmQgcnVsZXIgdXNlZCBmb3IgcG9zdC1wcm9jZXNzaW5nXG4gICAqIChlLmcuIGluIGVtcGhhc2lzLWxpa2UgcnVsZXMpLlxuICAgKiovXG4gIHRoaXMucnVsZXIyID0gbmV3IFJ1bGVyKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IF9ydWxlczIubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyMi5wdXNoKF9ydWxlczJbaV1bMF0sIF9ydWxlczJbaV1bMV0pXG4gIH1cbn1cblxuLy8gU2tpcCBzaW5nbGUgdG9rZW4gYnkgcnVubmluZyBhbGwgcnVsZXMgaW4gdmFsaWRhdGlvbiBtb2RlO1xuLy8gcmV0dXJucyBgdHJ1ZWAgaWYgYW55IHJ1bGUgcmVwb3J0ZWQgc3VjY2Vzc1xuLy9cblBhcnNlcklubGluZS5wcm90b3R5cGUuc2tpcFRva2VuID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpXG4gIGNvbnN0IGxlbiA9IHJ1bGVzLmxlbmd0aFxuICBjb25zdCBtYXhOZXN0aW5nID0gc3RhdGUubWQub3B0aW9ucy5tYXhOZXN0aW5nXG4gIGNvbnN0IGNhY2hlID0gc3RhdGUuY2FjaGVcblxuICBpZiAodHlwZW9mIGNhY2hlW3Bvc10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RhdGUucG9zID0gY2FjaGVbcG9zXVxuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG9rID0gZmFsc2VcblxuICBpZiAoc3RhdGUubGV2ZWwgPCBtYXhOZXN0aW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgLy8gSW5jcmVtZW50IHN0YXRlLmxldmVsIGFuZCBkZWNyZW1lbnQgaXQgbGF0ZXIgdG8gbGltaXQgcmVjdXJzaW9uLlxuICAgICAgLy8gSXQncyBoYXJtbGVzcyB0byBkbyBoZXJlLCBiZWNhdXNlIG5vIHRva2VucyBhcmUgY3JlYXRlZC4gQnV0IGlkZWFsbHksXG4gICAgICAvLyB3ZSdkIG5lZWQgYSBzZXBhcmF0ZSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAvL1xuICAgICAgc3RhdGUubGV2ZWwrK1xuICAgICAgb2sgPSBydWxlc1tpXShzdGF0ZSwgdHJ1ZSlcbiAgICAgIHN0YXRlLmxldmVsLS1cblxuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIGlmIChwb3MgPj0gc3RhdGUucG9zKSB7IHRocm93IG5ldyBFcnJvcihcImlubGluZSBydWxlIGRpZG4ndCBpbmNyZW1lbnQgc3RhdGUucG9zXCIpIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVG9vIG11Y2ggbmVzdGluZywganVzdCBza2lwIHVudGlsIHRoZSBlbmQgb2YgdGhlIHBhcmFncmFwaC5cbiAgICAvL1xuICAgIC8vIE5PVEU6IHRoaXMgd2lsbCBjYXVzZSBsaW5rcyB0byBiZWhhdmUgaW5jb3JyZWN0bHkgaW4gdGhlIGZvbGxvd2luZyBjYXNlLFxuICAgIC8vICAgICAgIHdoZW4gYW4gYW1vdW50IG9mIGBbYCBpcyBleGFjdGx5IGVxdWFsIHRvIGBtYXhOZXN0aW5nICsgMWA6XG4gICAgLy9cbiAgICAvLyAgICAgICBbW1tbW1tbW1tbW1tbW1tbW1tbW1tmb29dKClcbiAgICAvL1xuICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHdvcmthcm91bmQgd2hlbiBDTSBzdGFuZGFyZCB3aWxsIGFsbG93IG5lc3RlZCBsaW5rc1xuICAgIC8vICAgICAgICh3ZSBjYW4gcmVwbGFjZSBpdCBieSBwcmV2ZW50aW5nIGxpbmtzIGZyb20gYmVpbmcgcGFyc2VkIGluXG4gICAgLy8gICAgICAgdmFsaWRhdGlvbiBtb2RlKVxuICAgIC8vXG4gICAgc3RhdGUucG9zID0gc3RhdGUucG9zTWF4XG4gIH1cblxuICBpZiAoIW9rKSB7IHN0YXRlLnBvcysrIH1cbiAgY2FjaGVbcG9zXSA9IHN0YXRlLnBvc1xufVxuXG4vLyBHZW5lcmF0ZSB0b2tlbnMgZm9yIGlucHV0IHJhbmdlXG4vL1xuUGFyc2VySW5saW5lLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpXG4gIGNvbnN0IGxlbiA9IHJ1bGVzLmxlbmd0aFxuICBjb25zdCBlbmQgPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3QgbWF4TmVzdGluZyA9IHN0YXRlLm1kLm9wdGlvbnMubWF4TmVzdGluZ1xuXG4gIHdoaWxlIChzdGF0ZS5wb3MgPCBlbmQpIHtcbiAgICAvLyBUcnkgYWxsIHBvc3NpYmxlIHJ1bGVzLlxuICAgIC8vIE9uIHN1Y2Nlc3MsIHJ1bGUgc2hvdWxkOlxuICAgIC8vXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLnBvc2BcbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUudG9rZW5zYFxuICAgIC8vIC0gcmV0dXJuIHRydWVcbiAgICBjb25zdCBwcmV2UG9zID0gc3RhdGUucG9zXG4gICAgbGV0IG9rID0gZmFsc2VcblxuICAgIGlmIChzdGF0ZS5sZXZlbCA8IG1heE5lc3RpbmcpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgb2sgPSBydWxlc1tpXShzdGF0ZSwgZmFsc2UpXG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGlmIChwcmV2UG9zID49IHN0YXRlLnBvcykgeyB0aHJvdyBuZXcgRXJyb3IoXCJpbmxpbmUgcnVsZSBkaWRuJ3QgaW5jcmVtZW50IHN0YXRlLnBvc1wiKSB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvaykge1xuICAgICAgaWYgKHN0YXRlLnBvcyA+PSBlbmQpIHsgYnJlYWsgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyY1tzdGF0ZS5wb3MrK11cbiAgfVxuXG4gIGlmIChzdGF0ZS5wZW5kaW5nKSB7XG4gICAgc3RhdGUucHVzaFBlbmRpbmcoKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VySW5saW5lLnBhcnNlKHN0ciwgbWQsIGVudiwgb3V0VG9rZW5zKVxuICpcbiAqIFByb2Nlc3MgaW5wdXQgc3RyaW5nIGFuZCBwdXNoIGlubGluZSB0b2tlbnMgaW50byBgb3V0VG9rZW5zYFxuICoqL1xuUGFyc2VySW5saW5lLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzdHIsIG1kLCBlbnYsIG91dFRva2Vucykge1xuICBjb25zdCBzdGF0ZSA9IG5ldyB0aGlzLlN0YXRlKHN0ciwgbWQsIGVudiwgb3V0VG9rZW5zKVxuXG4gIHRoaXMudG9rZW5pemUoc3RhdGUpXG5cbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyMi5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJ1bGVzW2ldKHN0YXRlKVxuICB9XG59XG5cblBhcnNlcklubGluZS5wcm90b3R5cGUuU3RhdGUgPSBTdGF0ZUlubGluZVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzZXJJbmxpbmVcbiIsIi8vIFByb2NlZXNzICdcXG4nXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBuZXdsaW5lIChzdGF0ZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5wb3NcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgwQS8qIFxcbiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHBtYXggPSBzdGF0ZS5wZW5kaW5nLmxlbmd0aCAtIDFcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgLy8gJyAgXFxuJyAtPiBoYXJkYnJlYWtcbiAgLy8gTG9va3VwIGluIHBlbmRpbmcgY2hhcnMgaXMgYmFkIHByYWN0aWNlISBEb24ndCBjb3B5IHRvIG90aGVyIHJ1bGVzIVxuICAvLyBQZW5kaW5nIHN0cmluZyBpcyBzdG9yZWQgaW4gY29uY2F0IG1vZGUsIGluZGV4ZWQgbG9va3VwcyB3aWxsIGNhdXNlXG4gIC8vIGNvbnZlcnRpb24gdG8gZmxhdCBtb2RlLlxuICBpZiAoIXNpbGVudCkge1xuICAgIGlmIChwbWF4ID49IDAgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHBtYXgpID09PSAweDIwKSB7XG4gICAgICBpZiAocG1heCA+PSAxICYmIHN0YXRlLnBlbmRpbmcuY2hhckNvZGVBdChwbWF4IC0gMSkgPT09IDB4MjApIHtcbiAgICAgICAgLy8gRmluZCB3aGl0ZXNwYWNlcyB0YWlsIG9mIHBlbmRpbmcgY2hhcnMuXG4gICAgICAgIGxldCB3cyA9IHBtYXggLSAxXG4gICAgICAgIHdoaWxlICh3cyA+PSAxICYmIHN0YXRlLnBlbmRpbmcuY2hhckNvZGVBdCh3cyAtIDEpID09PSAweDIwKSB3cy0tXG5cbiAgICAgICAgc3RhdGUucGVuZGluZyA9IHN0YXRlLnBlbmRpbmcuc2xpY2UoMCwgd3MpXG4gICAgICAgIHN0YXRlLnB1c2goJ2hhcmRicmVhaycsICdicicsIDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nID0gc3RhdGUucGVuZGluZy5zbGljZSgwLCAtMSlcbiAgICAgICAgc3RhdGUucHVzaCgnc29mdGJyZWFrJywgJ2JyJywgMClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHVzaCgnc29mdGJyZWFrJywgJ2JyJywgMClcbiAgICB9XG4gIH1cblxuICBwb3MrK1xuXG4gIC8vIHNraXAgaGVhZGluZyBzcGFjZXMgZm9yIG5leHQgbGluZVxuICB3aGlsZSAocG9zIDwgbWF4ICYmIGlzU3BhY2Uoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSkpIHsgcG9zKysgfVxuXG4gIHN0YXRlLnBvcyA9IHBvc1xuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUGFyc2UgYmFja3RpY2tzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhY2t0aWNrIChzdGF0ZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgaWYgKGNoICE9PSAweDYwLyogYCAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gcG9zXG4gIHBvcysrXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIC8vIHNjYW4gbWFya2VyIGxlbmd0aFxuICB3aGlsZSAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4NjAvKiBgICovKSB7IHBvcysrIH1cblxuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvcylcbiAgY29uc3Qgb3BlbmVyTGVuZ3RoID0gbWFya2VyLmxlbmd0aFxuXG4gIGlmIChzdGF0ZS5iYWNrdGlja3NTY2FubmVkICYmIChzdGF0ZS5iYWNrdGlja3Nbb3BlbmVyTGVuZ3RoXSB8fCAwKSA8PSBzdGFydCkge1xuICAgIGlmICghc2lsZW50KSBzdGF0ZS5wZW5kaW5nICs9IG1hcmtlclxuICAgIHN0YXRlLnBvcyArPSBvcGVuZXJMZW5ndGhcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IG1hdGNoRW5kID0gcG9zXG4gIGxldCBtYXRjaFN0YXJ0XG5cbiAgLy8gTm90aGluZyBmb3VuZCBpbiB0aGUgY2FjaGUsIHNjYW4gdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluZSAob3IgdW50aWwgbWFya2VyIGlzIGZvdW5kKVxuICB3aGlsZSAoKG1hdGNoU3RhcnQgPSBzdGF0ZS5zcmMuaW5kZXhPZignYCcsIG1hdGNoRW5kKSkgIT09IC0xKSB7XG4gICAgbWF0Y2hFbmQgPSBtYXRjaFN0YXJ0ICsgMVxuXG4gICAgLy8gc2NhbiBtYXJrZXIgbGVuZ3RoXG4gICAgd2hpbGUgKG1hdGNoRW5kIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KG1hdGNoRW5kKSA9PT0gMHg2MC8qIGAgKi8pIHsgbWF0Y2hFbmQrKyB9XG5cbiAgICBjb25zdCBjbG9zZXJMZW5ndGggPSBtYXRjaEVuZCAtIG1hdGNoU3RhcnRcblxuICAgIGlmIChjbG9zZXJMZW5ndGggPT09IG9wZW5lckxlbmd0aCkge1xuICAgICAgLy8gRm91bmQgbWF0Y2hpbmcgY2xvc2VyIGxlbmd0aC5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgnY29kZV9pbmxpbmUnLCAnY29kZScsIDApXG4gICAgICAgIHRva2VuLm1hcmt1cCA9IG1hcmtlclxuICAgICAgICB0b2tlbi5jb250ZW50ID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF0Y2hTdGFydClcbiAgICAgICAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAgICAgICAucmVwbGFjZSgvXiAoLispICQvLCAnJDEnKVxuICAgICAgfVxuICAgICAgc3RhdGUucG9zID0gbWF0Y2hFbmRcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gU29tZSBkaWZmZXJlbnQgbGVuZ3RoIGZvdW5kLCBwdXQgaXQgaW4gY2FjaGUgYXMgdXBwZXIgbGltaXQgb2Ygd2hlcmUgY2xvc2VyIGNhbiBiZSBmb3VuZFxuICAgIHN0YXRlLmJhY2t0aWNrc1tjbG9zZXJMZW5ndGhdID0gbWF0Y2hTdGFydFxuICB9XG5cbiAgLy8gU2Nhbm5lZCB0aHJvdWdoIHRoZSBlbmQsIGRpZG4ndCBmaW5kIGFueXRoaW5nXG4gIHN0YXRlLmJhY2t0aWNrc1NjYW5uZWQgPSB0cnVlXG5cbiAgaWYgKCFzaWxlbnQpIHN0YXRlLnBlbmRpbmcgKz0gbWFya2VyXG4gIHN0YXRlLnBvcyArPSBvcGVuZXJMZW5ndGhcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFByb2Nlc3MgW2xpbmtdKDx0bz4gXCJzdHVmZlwiKVxuXG5pbXBvcnQgeyBub3JtYWxpemVSZWZlcmVuY2UsIGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5rIChzdGF0ZSwgc2lsZW50KSB7XG4gIGxldCBjb2RlLCBsYWJlbCwgcmVzLCByZWZcbiAgbGV0IGhyZWYgPSAnJ1xuICBsZXQgdGl0bGUgPSAnJ1xuICBsZXQgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgbGV0IHBhcnNlUmVmZXJlbmNlID0gdHJ1ZVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG9sZFBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3QgbGFiZWxTdGFydCA9IHN0YXRlLnBvcyArIDFcbiAgY29uc3QgbGFiZWxFbmQgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0xhYmVsKHN0YXRlLCBzdGF0ZS5wb3MsIHRydWUpXG5cbiAgLy8gcGFyc2VyIGZhaWxlZCB0byBmaW5kICddJywgc28gaXQncyBub3QgYSB2YWxpZCBsaW5rXG4gIGlmIChsYWJlbEVuZCA8IDApIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgcG9zID0gbGFiZWxFbmQgKyAxXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyOC8qICggKi8pIHtcbiAgICAvL1xuICAgIC8vIElubGluZSBsaW5rXG4gICAgLy9cblxuICAgIC8vIG1pZ2h0IGhhdmUgZm91bmQgYSB2YWxpZCBzaG9ydGN1dCBsaW5rLCBkaXNhYmxlIHJlZmVyZW5jZSBwYXJzaW5nXG4gICAgcGFyc2VSZWZlcmVuY2UgPSBmYWxzZVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgcG9zKytcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjb2RlKSAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrIH1cbiAgICB9XG4gICAgaWYgKHBvcyA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgICAgXl5eXl5eIHBhcnNpbmcgbGluayBkZXN0aW5hdGlvblxuICAgIHN0YXJ0ID0gcG9zXG4gICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtEZXN0aW5hdGlvbihzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGhyZWYgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHJlcy5zdHIpXG4gICAgICBpZiAoc3RhdGUubWQudmFsaWRhdGVMaW5rKGhyZWYpKSB7XG4gICAgICAgIHBvcyA9IHJlcy5wb3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhyZWYgPSAnJ1xuICAgICAgfVxuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICBzdGFydCA9IHBvc1xuICAgICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgICBeXl5eXl5eIHBhcnNpbmcgbGluayB0aXRsZVxuICAgICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgICAgaWYgKHBvcyA8IG1heCAmJiBzdGFydCAhPT0gcG9zICYmIHJlcy5vaykge1xuICAgICAgICB0aXRsZSA9IHJlcy5zdHJcbiAgICAgICAgcG9zID0gcmVzLnBvc1xuXG4gICAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSBtYXggfHwgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyOS8qICkgKi8pIHtcbiAgICAgIC8vIHBhcnNpbmcgYSB2YWxpZCBzaG9ydGN1dCBsaW5rIGZhaWxlZCwgZmFsbGJhY2sgdG8gcmVmZXJlbmNlXG4gICAgICBwYXJzZVJlZmVyZW5jZSA9IHRydWVcbiAgICB9XG4gICAgcG9zKytcbiAgfVxuXG4gIGlmIChwYXJzZVJlZmVyZW5jZSkge1xuICAgIC8vXG4gICAgLy8gTGluayByZWZlcmVuY2VcbiAgICAvL1xuICAgIGlmICh0eXBlb2Ygc3RhdGUuZW52LnJlZmVyZW5jZXMgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4NUIvKiBbICovKSB7XG4gICAgICBzdGFydCA9IHBvcyArIDFcbiAgICAgIHBvcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHBvcylcbiAgICAgIGlmIChwb3MgPj0gMCkge1xuICAgICAgICBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKyspXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zID0gbGFiZWxFbmQgKyAxXG4gICAgfVxuXG4gICAgLy8gY292ZXJzIGxhYmVsID09PSAnJyBhbmQgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgIC8vIChjb2xsYXBzZWQgcmVmZXJlbmNlIGxpbmsgYW5kIHNob3J0Y3V0IHJlZmVyZW5jZSBsaW5rIHJlc3BlY3RpdmVseSlcbiAgICBpZiAoIWxhYmVsKSB7IGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKSB9XG5cbiAgICByZWYgPSBzdGF0ZS5lbnYucmVmZXJlbmNlc1tub3JtYWxpemVSZWZlcmVuY2UobGFiZWwpXVxuICAgIGlmICghcmVmKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBvbGRQb3NcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBocmVmID0gcmVmLmhyZWZcbiAgICB0aXRsZSA9IHJlZi50aXRsZVxuICB9XG5cbiAgLy9cbiAgLy8gV2UgZm91bmQgdGhlIGVuZCBvZiB0aGUgbGluaywgYW5kIGtub3cgZm9yIGEgZmFjdCBpdCdzIGEgdmFsaWQgbGluaztcbiAgLy8gc28gYWxsIHRoYXQncyBsZWZ0IHRvIGRvIGlzIHRvIGNhbGwgdG9rZW5pemVyLlxuICAvL1xuICBpZiAoIXNpbGVudCkge1xuICAgIHN0YXRlLnBvcyA9IGxhYmVsU3RhcnRcbiAgICBzdGF0ZS5wb3NNYXggPSBsYWJlbEVuZFxuXG4gICAgY29uc3QgdG9rZW5fbyA9IHN0YXRlLnB1c2goJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICBjb25zdCBhdHRycyA9IFtbJ2hyZWYnLCBocmVmXV1cbiAgICB0b2tlbl9vLmF0dHJzICA9IGF0dHJzXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBhdHRycy5wdXNoKFsndGl0bGUnLCB0aXRsZV0pXG4gICAgfVxuXG4gICAgc3RhdGUubGlua0xldmVsKytcbiAgICBzdGF0ZS5tZC5pbmxpbmUudG9rZW5pemUoc3RhdGUpXG4gICAgc3RhdGUubGlua0xldmVsLS1cblxuICAgIHN0YXRlLnB1c2goJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICB9XG5cbiAgc3RhdGUucG9zID0gcG9zXG4gIHN0YXRlLnBvc01heCA9IG1heFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUHJvY2VzcyAhW2ltYWdlXSg8c3JjPiBcInRpdGxlXCIpXG5cbmltcG9ydCB7IG5vcm1hbGl6ZVJlZmVyZW5jZSwgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGltYWdlIChzdGF0ZSwgc2lsZW50KSB7XG4gIGxldCBjb2RlLCBjb250ZW50LCBsYWJlbCwgcG9zLCByZWYsIHJlcywgdGl0bGUsIHN0YXJ0XG4gIGxldCBocmVmID0gJydcbiAgY29uc3Qgb2xkUG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpICE9PSAweDIxLyogISAqLykgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zICsgMSkgIT09IDB4NUIvKiBbICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgbGFiZWxTdGFydCA9IHN0YXRlLnBvcyArIDJcbiAgY29uc3QgbGFiZWxFbmQgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0xhYmVsKHN0YXRlLCBzdGF0ZS5wb3MgKyAxLCBmYWxzZSlcblxuICAvLyBwYXJzZXIgZmFpbGVkIHRvIGZpbmQgJ10nLCBzbyBpdCdzIG5vdCBhIHZhbGlkIGxpbmtcbiAgaWYgKGxhYmVsRW5kIDwgMCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHBvcyA9IGxhYmVsRW5kICsgMVxuICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4MjgvKiAoICovKSB7XG4gICAgLy9cbiAgICAvLyBJbmxpbmUgbGlua1xuICAgIC8vXG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICBwb3MrK1xuICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgIH1cbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICBeXl5eXl4gcGFyc2luZyBsaW5rIGRlc3RpbmF0aW9uXG4gICAgc3RhcnQgPSBwb3NcbiAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0Rlc3RpbmF0aW9uKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgaHJlZiA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsocmVzLnN0cilcbiAgICAgIGlmIChzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoaHJlZikpIHtcbiAgICAgICAgcG9zID0gcmVzLnBvc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHJlZiA9ICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICBzdGFydCA9IHBvc1xuICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgIH1cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgICAgICAgICAgICBeXl5eXl5eIHBhcnNpbmcgbGluayB0aXRsZVxuICAgIHJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rVGl0bGUoc3RhdGUuc3JjLCBwb3MsIHN0YXRlLnBvc01heClcbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXJ0ICE9PSBwb3MgJiYgcmVzLm9rKSB7XG4gICAgICB0aXRsZSA9IHJlcy5zdHJcbiAgICAgIHBvcyA9IHJlcy5wb3NcblxuICAgICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZSA9ICcnXG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSBtYXggfHwgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyOS8qICkgKi8pIHtcbiAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHBvcysrXG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvLyBMaW5rIHJlZmVyZW5jZVxuICAgIC8vXG4gICAgaWYgKHR5cGVvZiBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICAgIHN0YXJ0ID0gcG9zICsgMVxuICAgICAgcG9zID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtMYWJlbChzdGF0ZSwgcG9zKVxuICAgICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAgIGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MrKylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcyA9IGxhYmVsRW5kICsgMVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICB9XG5cbiAgICAvLyBjb3ZlcnMgbGFiZWwgPT09ICcnIGFuZCBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgLy8gKGNvbGxhcHNlZCByZWZlcmVuY2UgbGluayBhbmQgc2hvcnRjdXQgcmVmZXJlbmNlIGxpbmsgcmVzcGVjdGl2ZWx5KVxuICAgIGlmICghbGFiZWwpIHsgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2UobGFiZWxTdGFydCwgbGFiZWxFbmQpIH1cblxuICAgIHJlZiA9IHN0YXRlLmVudi5yZWZlcmVuY2VzW25vcm1hbGl6ZVJlZmVyZW5jZShsYWJlbCldXG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGhyZWYgPSByZWYuaHJlZlxuICAgIHRpdGxlID0gcmVmLnRpdGxlXG4gIH1cblxuICAvL1xuICAvLyBXZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSBsaW5rLCBhbmQga25vdyBmb3IgYSBmYWN0IGl0J3MgYSB2YWxpZCBsaW5rO1xuICAvLyBzbyBhbGwgdGhhdCdzIGxlZnQgdG8gZG8gaXMgdG8gY2FsbCB0b2tlbml6ZXIuXG4gIC8vXG4gIGlmICghc2lsZW50KSB7XG4gICAgY29udGVudCA9IHN0YXRlLnNyYy5zbGljZShsYWJlbFN0YXJ0LCBsYWJlbEVuZClcblxuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgc3RhdGUubWQuaW5saW5lLnBhcnNlKFxuICAgICAgY29udGVudCxcbiAgICAgIHN0YXRlLm1kLFxuICAgICAgc3RhdGUuZW52LFxuICAgICAgdG9rZW5zXG4gICAgKVxuXG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCdpbWFnZScsICdpbWcnLCAwKVxuICAgIGNvbnN0IGF0dHJzID0gW1snc3JjJywgaHJlZl0sIFsnYWx0JywgJyddXVxuICAgIHRva2VuLmF0dHJzID0gYXR0cnNcbiAgICB0b2tlbi5jaGlsZHJlbiA9IHRva2Vuc1xuICAgIHRva2VuLmNvbnRlbnQgPSBjb250ZW50XG5cbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGF0dHJzLnB1c2goWyd0aXRsZScsIHRpdGxlXSlcbiAgICB9XG4gIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcbiAgc3RhdGUucG9zTWF4ID0gbWF4XG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZXNzIGh0bWwgdGFnc1xuXG5pbXBvcnQgeyBIVE1MX1RBR19SRSB9IGZyb20gJy4uL2NvbW1vbi9odG1sX3JlLm1qcydcblxuZnVuY3Rpb24gaXNMaW5rT3BlbiAoc3RyKSB7XG4gIHJldHVybiAvXjxhWz5cXHNdL2kudGVzdChzdHIpXG59XG5mdW5jdGlvbiBpc0xpbmtDbG9zZSAoc3RyKSB7XG4gIHJldHVybiAvXjxcXC9hXFxzKj4vaS50ZXN0KHN0cilcbn1cblxuZnVuY3Rpb24gaXNMZXR0ZXIgKGNoKSB7XG4gIC8qIGVzbGludCBuby1iaXR3aXNlOjAgKi9cbiAgY29uc3QgbGMgPSBjaCB8IDB4MjAgLy8gdG8gbG93ZXIgY2FzZVxuICByZXR1cm4gKGxjID49IDB4NjEvKiBhICovKSAmJiAobGMgPD0gMHg3YS8qIHogKi8pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh0bWxfaW5saW5lIChzdGF0ZSwgc2lsZW50KSB7XG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5odG1sKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gQ2hlY2sgc3RhcnRcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgzQy8qIDwgKi8gfHxcbiAgICAgIHBvcyArIDIgPj0gbWF4KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBRdWljayBmYWlsIG9uIHNlY29uZCBjaGFyXG4gIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMSlcbiAgaWYgKGNoICE9PSAweDIxLyogISAqLyAmJlxuICAgICAgY2ggIT09IDB4M0YvKiA/ICovICYmXG4gICAgICBjaCAhPT0gMHgyRi8qIC8gKi8gJiZcbiAgICAgICFpc0xldHRlcihjaCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goSFRNTF9UQUdfUkUpXG4gIGlmICghbWF0Y2gpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoIXNpbGVudCkge1xuICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgnaHRtbF9pbmxpbmUnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ID0gbWF0Y2hbMF1cblxuICAgIGlmIChpc0xpbmtPcGVuKHRva2VuLmNvbnRlbnQpKSAgc3RhdGUubGlua0xldmVsKytcbiAgICBpZiAoaXNMaW5rQ2xvc2UodG9rZW4uY29udGVudCkpIHN0YXRlLmxpbmtMZXZlbC0tXG4gIH1cbiAgc3RhdGUucG9zICs9IG1hdGNoWzBdLmxlbmd0aFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gQ2xlYW4gdXAgdG9rZW5zIGFmdGVyIGVtcGhhc2lzIGFuZCBzdHJpa2V0aHJvdWdoIHBvc3Rwcm9jZXNzaW5nOlxuLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcyBpbnRvIG9uZSBhbmQgcmUtY2FsY3VsYXRlIGFsbCB0b2tlbiBsZXZlbHNcbi8vXG4vLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGluaXRpYWxseSBlbXBoYXNpcyBkZWxpbWl0ZXIgbWFya2VycyAoKiwgXywgfilcbi8vIGFyZSB0cmVhdGVkIGFzIHRoZWlyIG93biBzZXBhcmF0ZSB0ZXh0IHRva2Vucy4gVGhlbiBlbXBoYXNpcyBydWxlIGVpdGhlclxuLy8gbGVhdmVzIHRoZW0gYXMgdGV4dCAobmVlZGVkIHRvIG1lcmdlIHdpdGggYWRqYWNlbnQgdGV4dCkgb3IgdHVybnMgdGhlbVxuLy8gaW50byBvcGVuaW5nL2Nsb3NpbmcgdGFncyAod2hpY2ggbWVzc2VzIHVwIGxldmVscyBpbnNpZGUpLlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZnJhZ21lbnRzX2pvaW4gKHN0YXRlKSB7XG4gIGxldCBjdXJyLCBsYXN0XG4gIGxldCBsZXZlbCA9IDBcbiAgY29uc3QgdG9rZW5zID0gc3RhdGUudG9rZW5zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vucy5sZW5ndGhcblxuICBmb3IgKGN1cnIgPSBsYXN0ID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgLy8gcmUtY2FsY3VsYXRlIGxldmVscyBhZnRlciBlbXBoYXNpcy9zdHJpa2V0aHJvdWdoIHR1cm5zIHNvbWUgdGV4dCBub2Rlc1xuICAgIC8vIGludG8gb3BlbmluZy9jbG9zaW5nIHRhZ3NcbiAgICBpZiAodG9rZW5zW2N1cnJdLm5lc3RpbmcgPCAwKSBsZXZlbC0tIC8vIGNsb3NpbmcgdGFnXG4gICAgdG9rZW5zW2N1cnJdLmxldmVsID0gbGV2ZWxcbiAgICBpZiAodG9rZW5zW2N1cnJdLm5lc3RpbmcgPiAwKSBsZXZlbCsrIC8vIG9wZW5pbmcgdGFnXG5cbiAgICBpZiAodG9rZW5zW2N1cnJdLnR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgICBjdXJyICsgMSA8IG1heCAmJlxuICAgICAgICB0b2tlbnNbY3VyciArIDFdLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgLy8gY29sbGFwc2UgdHdvIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgIHRva2Vuc1tjdXJyICsgMV0uY29udGVudCA9IHRva2Vuc1tjdXJyXS5jb250ZW50ICsgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXJyICE9PSBsYXN0KSB7IHRva2Vuc1tsYXN0XSA9IHRva2Vuc1tjdXJyXSB9XG5cbiAgICAgIGxhc3QrK1xuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyICE9PSBsYXN0KSB7XG4gICAgdG9rZW5zLmxlbmd0aCA9IGxhc3RcbiAgfVxufVxuIiwiaW1wb3J0IHJlRmFjdG9yeSBmcm9tICcuL2xpYi9yZS5tanMnXG5cbi8vXG4vLyBIZWxwZXJzXG4vL1xuXG4vLyBNZXJnZSBvYmplY3RzXG4vL1xuZnVuY3Rpb24gYXNzaWduIChvYmogLyogZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uICovKSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG5cbiAgc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICBpZiAoIXNvdXJjZSkgeyByZXR1cm4gfVxuXG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIG9ialtrZXldID0gc291cmNlW2tleV1cbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gX2NsYXNzIChvYmopIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopIH1cbmZ1bmN0aW9uIGlzU3RyaW5nIChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBTdHJpbmddJyB9XG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfVxuZnVuY3Rpb24gaXNSZWdFeHAgKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nIH1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfVxuXG5mdW5jdGlvbiBlc2NhcGVSRSAoc3RyKSB7IHJldHVybiBzdHIucmVwbGFjZSgvWy4/KiteJFtcXF1cXFxcKCl7fXwtXS9nLCAnXFxcXCQmJykgfVxuXG4vL1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgZnV6enlMaW5rOiB0cnVlLFxuICBmdXp6eUVtYWlsOiB0cnVlLFxuICBmdXp6eUlQOiBmYWxzZVxufVxuXG5mdW5jdGlvbiBpc09wdGlvbnNPYmogKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqIHx8IHt9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgaykge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbiAgICByZXR1cm4gYWNjIHx8IGRlZmF1bHRPcHRpb25zLmhhc093blByb3BlcnR5KGspXG4gIH0sIGZhbHNlKVxufVxuXG5jb25zdCBkZWZhdWx0U2NoZW1hcyA9IHtcbiAgJ2h0dHA6Jzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5odHRwKSB7XG4gICAgICAgIC8vIGNvbXBpbGUgbGF6aWx5LCBiZWNhdXNlIFwiaG9zdFwiLWNvbnRhaW5pbmcgdmFyaWFibGVzIGNhbiBjaGFuZ2Ugb24gdGxkcyB1cGRhdGUuXG4gICAgICAgIHNlbGYucmUuaHR0cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgJ15cXFxcL1xcXFwvJyArIHNlbGYucmUuc3JjX2F1dGggKyBzZWxmLnJlLnNyY19ob3N0X3BvcnRfc3RyaWN0ICsgc2VsZi5yZS5zcmNfcGF0aCwgJ2knXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLnJlLmh0dHAudGVzdCh0YWlsKSkge1xuICAgICAgICByZXR1cm4gdGFpbC5tYXRjaChzZWxmLnJlLmh0dHApWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH0sXG4gICdodHRwczonOiAnaHR0cDonLFxuICAnZnRwOic6ICdodHRwOicsXG4gICcvLyc6IHtcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKHRleHQsIHBvcywgc2VsZikge1xuICAgICAgY29uc3QgdGFpbCA9IHRleHQuc2xpY2UocG9zKVxuXG4gICAgICBpZiAoIXNlbGYucmUubm9faHR0cCkge1xuICAgICAgLy8gY29tcGlsZSBsYXppbHksIGJlY2F1c2UgXCJob3N0XCItY29udGFpbmluZyB2YXJpYWJsZXMgY2FuIGNoYW5nZSBvbiB0bGRzIHVwZGF0ZS5cbiAgICAgICAgc2VsZi5yZS5ub19odHRwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAnXicgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX2F1dGggK1xuICAgICAgICAgIC8vIERvbid0IGFsbG93IHNpbmdsZS1sZXZlbCBkb21haW5zLCBiZWNhdXNlIG9mIGZhbHNlIHBvc2l0aXZlcyBsaWtlICcvL3Rlc3QnXG4gICAgICAgICAgLy8gd2l0aCBjb2RlIGNvbW1lbnRzXG4gICAgICAgICAgJyg/OmxvY2FsaG9zdHwoPzooPzonICsgc2VsZi5yZS5zcmNfZG9tYWluICsgJylcXFxcLikrJyArIHNlbGYucmUuc3JjX2RvbWFpbl9yb290ICsgJyknICtcbiAgICAgICAgICBzZWxmLnJlLnNyY19wb3J0ICtcbiAgICAgICAgICBzZWxmLnJlLnNyY19ob3N0X3Rlcm1pbmF0b3IgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX3BhdGgsXG5cbiAgICAgICAgICAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5yZS5ub19odHRwLnRlc3QodGFpbCkpIHtcbiAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSBgOi8vYCAmIGAvLy9gLCB0aGF0IHByb3RlY3RzIGZyb20gZXJyb3JzIGluIHByb3RvY29sIG5hbWVcbiAgICAgICAgaWYgKHBvcyA+PSAzICYmIHRleHRbcG9zIC0gM10gPT09ICc6JykgeyByZXR1cm4gMCB9XG4gICAgICAgIGlmIChwb3MgPj0gMyAmJiB0ZXh0W3BvcyAtIDNdID09PSAnLycpIHsgcmV0dXJuIDAgfVxuICAgICAgICByZXR1cm4gdGFpbC5tYXRjaChzZWxmLnJlLm5vX2h0dHApWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH0sXG4gICdtYWlsdG86Jzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5tYWlsdG8pIHtcbiAgICAgICAgc2VsZi5yZS5tYWlsdG8gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICdeJyArIHNlbGYucmUuc3JjX2VtYWlsX25hbWUgKyAnQCcgKyBzZWxmLnJlLnNyY19ob3N0X3N0cmljdCwgJ2knXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLnJlLm1haWx0by50ZXN0KHRhaWwpKSB7XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUubWFpbHRvKVswXS5sZW5ndGhcbiAgICAgIH1cbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG59XG5cbi8vIFJFIHBhdHRlcm4gZm9yIDItY2hhcmFjdGVyIHRsZHMgKGF1dG9nZW5lcmF0ZWQgYnkgLi9zdXBwb3J0L3RsZHNfMmNoYXJfZ2VuLmpzKVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4gKi9cbmNvbnN0IHRsZHNfMmNoX3NyY19yZSA9ICdhW2NkZWZnaWxtbm9xcnN0dXd4el18YlthYmRlZmdoaWptbm9yc3R2d3l6XXxjW2FjZGZnaGlrbG1ub3J1dnd4eXpdfGRbZWprbW96XXxlW2NlZ3JzdHVdfGZbaWprbW9yXXxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldfGhba21ucnR1XXxpW2RlbG1ub3Fyc3RdfGpbZW1vcF18a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XXxuW2FjZWZnaWxvcHJ1el18b218cFthZWZnaGtsbW5yc3R3eV18cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ4eXpdfHRbY2RmZ2hqa2xtbm9ydHZ3el18dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118eVtldF18elthbXddJ1xuXG4vLyBET04nVCB0cnkgdG8gbWFrZSBQUnMgd2l0aCBjaGFuZ2VzLiBFeHRlbmQgVExEcyB3aXRoIExpbmtpZnlJdC50bGRzKCkgaW5zdGVhZFxuY29uc3QgdGxkc19kZWZhdWx0ID0gJ2Jpenxjb218ZWR1fGdvdnxuZXR8b3JnfHByb3x3ZWJ8eHh4fGFlcm98YXNpYXxjb29wfGluZm98bXVzZXVtfG5hbWV8c2hvcHzRgNGEJy5zcGxpdCgnfCcpXG5cbmZ1bmN0aW9uIHJlc2V0U2NhbkNhY2hlIChzZWxmKSB7XG4gIHNlbGYuX19pbmRleF9fID0gLTFcbiAgc2VsZi5fX3RleHRfY2FjaGVfXyA9ICcnXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZhbGlkYXRvciAocmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0ZXh0LCBwb3MpIHtcbiAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICBpZiAocmUudGVzdCh0YWlsKSkge1xuICAgICAgcmV0dXJuIHRhaWwubWF0Y2gocmUpWzBdLmxlbmd0aFxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vcm1hbGl6ZXIgKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKG1hdGNoLCBzZWxmKSB7XG4gICAgc2VsZi5ub3JtYWxpemUobWF0Y2gpXG4gIH1cbn1cblxuLy8gU2NoZW1hcyBjb21waWxlci4gQnVpbGQgcmVnZXhwcy5cbi8vXG5mdW5jdGlvbiBjb21waWxlIChzZWxmKSB7XG4gIC8vIExvYWQgJiBjbG9uZSBSRSBwYXR0ZXJucy5cbiAgY29uc3QgcmUgPSBzZWxmLnJlID0gcmVGYWN0b3J5KHNlbGYuX19vcHRzX18pXG5cbiAgLy8gRGVmaW5lIGR5bmFtaWMgcGF0dGVybnNcbiAgY29uc3QgdGxkcyA9IHNlbGYuX190bGRzX18uc2xpY2UoKVxuXG4gIHNlbGYub25Db21waWxlKClcblxuICBpZiAoIXNlbGYuX190bGRzX3JlcGxhY2VkX18pIHtcbiAgICB0bGRzLnB1c2godGxkc18yY2hfc3JjX3JlKVxuICB9XG4gIHRsZHMucHVzaChyZS5zcmNfeG4pXG5cbiAgcmUuc3JjX3RsZHMgPSB0bGRzLmpvaW4oJ3wnKVxuXG4gIGZ1bmN0aW9uIHVudHBsICh0cGwpIHsgcmV0dXJuIHRwbC5yZXBsYWNlKCclVExEUyUnLCByZS5zcmNfdGxkcykgfVxuXG4gIHJlLmVtYWlsX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9lbWFpbF9mdXp6eSksICdpJylcbiAgcmUubGlua19mdXp6eSA9IFJlZ0V4cCh1bnRwbChyZS50cGxfbGlua19mdXp6eSksICdpJylcbiAgcmUubGlua19ub19pcF9mdXp6eSA9IFJlZ0V4cCh1bnRwbChyZS50cGxfbGlua19ub19pcF9mdXp6eSksICdpJylcbiAgcmUuaG9zdF9mdXp6eV90ZXN0ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9ob3N0X2Z1enp5X3Rlc3QpLCAnaScpXG5cbiAgLy9cbiAgLy8gQ29tcGlsZSBlYWNoIHNjaGVtYVxuICAvL1xuXG4gIGNvbnN0IGFsaWFzZXMgPSBbXVxuXG4gIHNlbGYuX19jb21waWxlZF9fID0ge30gLy8gUmVzZXQgY29tcGlsZWQgZGF0YVxuXG4gIGZ1bmN0aW9uIHNjaGVtYUVycm9yIChuYW1lLCB2YWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyhMaW5raWZ5SXQpIEludmFsaWQgc2NoZW1hIFwiJyArIG5hbWUgKyAnXCI6ICcgKyB2YWwpXG4gIH1cblxuICBPYmplY3Qua2V5cyhzZWxmLl9fc2NoZW1hc19fKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgdmFsID0gc2VsZi5fX3NjaGVtYXNfX1tuYW1lXVxuXG4gICAgLy8gc2tpcCBkaXNhYmxlZCBtZXRob2RzXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgY29tcGlsZWQgPSB7IHZhbGlkYXRlOiBudWxsLCBsaW5rOiBudWxsIH1cblxuICAgIHNlbGYuX19jb21waWxlZF9fW25hbWVdID0gY29tcGlsZWRcblxuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAoaXNSZWdFeHAodmFsLnZhbGlkYXRlKSkge1xuICAgICAgICBjb21waWxlZC52YWxpZGF0ZSA9IGNyZWF0ZVZhbGlkYXRvcih2YWwudmFsaWRhdGUpXG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsLnZhbGlkYXRlKSkge1xuICAgICAgICBjb21waWxlZC52YWxpZGF0ZSA9IHZhbC52YWxpZGF0ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hRXJyb3IobmFtZSwgdmFsKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW5jdGlvbih2YWwubm9ybWFsaXplKSkge1xuICAgICAgICBjb21waWxlZC5ub3JtYWxpemUgPSB2YWwubm9ybWFsaXplXG4gICAgICB9IGVsc2UgaWYgKCF2YWwubm9ybWFsaXplKSB7XG4gICAgICAgIGNvbXBpbGVkLm5vcm1hbGl6ZSA9IGNyZWF0ZU5vcm1hbGl6ZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hRXJyb3IobmFtZSwgdmFsKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgYWxpYXNlcy5wdXNoKG5hbWUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gIH0pXG5cbiAgLy9cbiAgLy8gQ29tcGlsZSBwb3N0cG9uZWQgYWxpYXNlc1xuICAvL1xuXG4gIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICBpZiAoIXNlbGYuX19jb21waWxlZF9fW3NlbGYuX19zY2hlbWFzX19bYWxpYXNdXSkge1xuICAgICAgLy8gU2lsZW50bHkgZmFpbCBvbiBtaXNzZWQgc2NoZW1hcyB0byBhdm9pZCBlcnJvbnMgb24gZGlzYWJsZS5cbiAgICAgIC8vIHNjaGVtYUVycm9yKGFsaWFzLCBzZWxmLl9fc2NoZW1hc19fW2FsaWFzXSk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZWxmLl9fY29tcGlsZWRfX1thbGlhc10udmFsaWRhdGUgPVxuICAgICAgc2VsZi5fX2NvbXBpbGVkX19bc2VsZi5fX3NjaGVtYXNfX1thbGlhc11dLnZhbGlkYXRlXG4gICAgc2VsZi5fX2NvbXBpbGVkX19bYWxpYXNdLm5vcm1hbGl6ZSA9XG4gICAgICBzZWxmLl9fY29tcGlsZWRfX1tzZWxmLl9fc2NoZW1hc19fW2FsaWFzXV0ubm9ybWFsaXplXG4gIH0pXG5cbiAgLy9cbiAgLy8gRmFrZSByZWNvcmQgZm9yIGd1ZXNzZWQgbGlua3NcbiAgLy9cbiAgc2VsZi5fX2NvbXBpbGVkX19bJyddID0geyB2YWxpZGF0ZTogbnVsbCwgbm9ybWFsaXplOiBjcmVhdGVOb3JtYWxpemVyKCkgfVxuXG4gIC8vXG4gIC8vIEJ1aWxkIHNjaGVtYSBjb25kaXRpb25cbiAgLy9cbiAgY29uc3Qgc2xpc3QgPSBPYmplY3Qua2V5cyhzZWxmLl9fY29tcGlsZWRfXylcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBGaWx0ZXIgZGlzYWJsZWQgJiBmYWtlIHNjaGVtYXNcbiAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDAgJiYgc2VsZi5fX2NvbXBpbGVkX19bbmFtZV1cbiAgICB9KVxuICAgIC5tYXAoZXNjYXBlUkUpXG4gICAgLmpvaW4oJ3wnKVxuICAvLyAoPyFfKSBjYXVzZSAxLjV4IHNsb3dkb3duXG4gIHNlbGYucmUuc2NoZW1hX3Rlc3QgPSBSZWdFeHAoJyhefCg/IV8pKD86Wz48XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpKCcgKyBzbGlzdCArICcpJywgJ2knKVxuICBzZWxmLnJlLnNjaGVtYV9zZWFyY2ggPSBSZWdFeHAoJyhefCg/IV8pKD86Wz48XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpKCcgKyBzbGlzdCArICcpJywgJ2lnJylcbiAgc2VsZi5yZS5zY2hlbWFfYXRfc3RhcnQgPSBSZWdFeHAoJ14nICsgc2VsZi5yZS5zY2hlbWFfc2VhcmNoLnNvdXJjZSwgJ2knKVxuXG4gIHNlbGYucmUucHJldGVzdCA9IFJlZ0V4cChcbiAgICAnKCcgKyBzZWxmLnJlLnNjaGVtYV90ZXN0LnNvdXJjZSArICcpfCgnICsgc2VsZi5yZS5ob3N0X2Z1enp5X3Rlc3Quc291cmNlICsgJyl8QCcsXG4gICAgJ2knXG4gIClcblxuICAvL1xuICAvLyBDbGVhbnVwXG4gIC8vXG5cbiAgcmVzZXRTY2FuQ2FjaGUoc2VsZilcbn1cblxuLyoqXG4gKiBjbGFzcyBNYXRjaFxuICpcbiAqIE1hdGNoIHJlc3VsdC4gU2luZ2xlIGVsZW1lbnQgb2YgYXJyYXksIHJldHVybmVkIGJ5IFtbTGlua2lmeUl0I21hdGNoXV1cbiAqKi9cbmZ1bmN0aW9uIE1hdGNoIChzZWxmLCBzaGlmdCkge1xuICBjb25zdCBzdGFydCA9IHNlbGYuX19pbmRleF9fXG4gIGNvbnN0IGVuZCA9IHNlbGYuX19sYXN0X2luZGV4X19cbiAgY29uc3QgdGV4dCA9IHNlbGYuX190ZXh0X2NhY2hlX18uc2xpY2Uoc3RhcnQsIGVuZClcblxuICAvKipcbiAgICogTWF0Y2gjc2NoZW1hIC0+IFN0cmluZ1xuICAgKlxuICAgKiBQcmVmaXggKHByb3RvY29sKSBmb3IgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5zY2hlbWEgPSBzZWxmLl9fc2NoZW1hX18udG9Mb3dlckNhc2UoKVxuICAvKipcbiAgICogTWF0Y2gjaW5kZXggLT4gTnVtYmVyXG4gICAqXG4gICAqIEZpcnN0IHBvc2l0aW9uIG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMuaW5kZXggPSBzdGFydCArIHNoaWZ0XG4gIC8qKlxuICAgKiBNYXRjaCNsYXN0SW5kZXggLT4gTnVtYmVyXG4gICAqXG4gICAqIE5leHQgcG9zaXRpb24gYWZ0ZXIgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5sYXN0SW5kZXggPSBlbmQgKyBzaGlmdFxuICAvKipcbiAgICogTWF0Y2gjcmF3IC0+IFN0cmluZ1xuICAgKlxuICAgKiBNYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnJhdyA9IHRleHRcbiAgLyoqXG4gICAqIE1hdGNoI3RleHQgLT4gU3RyaW5nXG4gICAqXG4gICAqIE5vdG1hbGl6ZWQgdGV4dCBvZiBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnRleHQgPSB0ZXh0XG4gIC8qKlxuICAgKiBNYXRjaCN1cmwgLT4gU3RyaW5nXG4gICAqXG4gICAqIE5vcm1hbGl6ZWQgdXJsIG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMudXJsID0gdGV4dFxufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXRjaCAoc2VsZiwgc2hpZnQpIHtcbiAgY29uc3QgbWF0Y2ggPSBuZXcgTWF0Y2goc2VsZiwgc2hpZnQpXG5cbiAgc2VsZi5fX2NvbXBpbGVkX19bbWF0Y2guc2NoZW1hXS5ub3JtYWxpemUobWF0Y2gsIHNlbGYpXG5cbiAgcmV0dXJuIG1hdGNoXG59XG5cbi8qKlxuICogY2xhc3MgTGlua2lmeUl0XG4gKiovXG5cbi8qKlxuICogbmV3IExpbmtpZnlJdChzY2hlbWFzLCBvcHRpb25zKVxuICogLSBzY2hlbWFzIChPYmplY3QpOiBPcHRpb25hbC4gQWRkaXRpb25hbCBzY2hlbWFzIHRvIHZhbGlkYXRlIChwcmVmaXgvdmFsaWRhdG9yKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB7IGZ1enp5TGlua3xmdXp6eUVtYWlsfGZ1enp5SVA6IHRydWV8ZmFsc2UgfVxuICpcbiAqIENyZWF0ZXMgbmV3IGxpbmtpZmllciBpbnN0YW5jZSB3aXRoIG9wdGlvbmFsIGFkZGl0aW9uYWwgc2NoZW1hcy5cbiAqIENhbiBiZSBjYWxsZWQgd2l0aG91dCBgbmV3YCBrZXl3b3JkIGZvciBjb252ZW5pZW5jZS5cbiAqXG4gKiBCeSBkZWZhdWx0IHVuZGVyc3RhbmRzOlxuICpcbiAqIC0gYGh0dHAocyk6Ly8uLi5gICwgYGZ0cDovLy4uLmAsIGBtYWlsdG86Li4uYCAmIGAvLy4uLmAgbGlua3NcbiAqIC0gXCJmdXp6eVwiIGxpbmtzIGFuZCBlbWFpbHMgKGV4YW1wbGUuY29tLCBmb29AYmFyLmNvbSkuXG4gKlxuICogYHNjaGVtYXNgIGlzIGFuIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkvdmFsdWUgZGVzY3JpYmVzIHByb3RvY29sL3J1bGU6XG4gKlxuICogLSBfX2tleV9fIC0gbGluayBwcmVmaXggKHVzdWFsbHksIHByb3RvY29sIG5hbWUgd2l0aCBgOmAgYXQgdGhlIGVuZCwgYHNreXBlOmBcbiAqICAgZm9yIGV4YW1wbGUpLiBgbGlua2lmeS1pdGAgbWFrZXMgc2h1cmUgdGhhdCBwcmVmaXggaXMgbm90IHByZWNlZWRlZCB3aXRoXG4gKiAgIGFscGhhbnVtZXJpYyBjaGFyIGFuZCBzeW1ib2xzLiBPbmx5IHdoaXRlc3BhY2VzIGFuZCBwdW5jdHVhdGlvbiBhbGxvd2VkLlxuICogLSBfX3ZhbHVlX18gLSBydWxlIHRvIGNoZWNrIHRhaWwgYWZ0ZXIgbGluayBwcmVmaXhcbiAqICAgLSBfU3RyaW5nXyAtIGp1c3QgYWxpYXMgdG8gZXhpc3RpbmcgcnVsZVxuICogICAtIF9PYmplY3RfXG4gKiAgICAgLSBfdmFsaWRhdGVfIC0gdmFsaWRhdG9yIGZ1bmN0aW9uIChzaG91bGQgcmV0dXJuIG1hdGNoZWQgbGVuZ3RoIG9uIHN1Y2Nlc3MpLFxuICogICAgICAgb3IgYFJlZ0V4cGAuXG4gKiAgICAgLSBfbm9ybWFsaXplXyAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG5vcm1hbGl6ZSB0ZXh0ICYgdXJsIG9mIG1hdGNoZWQgcmVzdWx0XG4gKiAgICAgICAoZm9yIGV4YW1wbGUsIGZvciBAdHdpdHRlciBtZW50aW9ucykuXG4gKlxuICogYG9wdGlvbnNgOlxuICpcbiAqIC0gX19mdXp6eUxpbmtfXyAtIHJlY29nbmlnZSBVUkwtcyB3aXRob3V0IGBodHRwKHMpOmAgcHJlZml4LiBEZWZhdWx0IGB0cnVlYC5cbiAqIC0gX19mdXp6eUlQX18gLSBhbGxvdyBJUHMgaW4gZnV6enkgbGlua3MgYWJvdmUuIENhbiBjb25mbGljdCB3aXRoIHNvbWUgdGV4dHNcbiAqICAgbGlrZSB2ZXJzaW9uIG51bWJlcnMuIERlZmF1bHQgYGZhbHNlYC5cbiAqIC0gX19mdXp6eUVtYWlsX18gLSByZWNvZ25pemUgZW1haWxzIHdpdGhvdXQgYG1haWx0bzpgIHByZWZpeC5cbiAqXG4gKiovXG5mdW5jdGlvbiBMaW5raWZ5SXQgKHNjaGVtYXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExpbmtpZnlJdCkpIHtcbiAgICByZXR1cm4gbmV3IExpbmtpZnlJdChzY2hlbWFzLCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgaWYgKGlzT3B0aW9uc09iaihzY2hlbWFzKSkge1xuICAgICAgb3B0aW9ucyA9IHNjaGVtYXNcbiAgICAgIHNjaGVtYXMgPSB7fVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuX19vcHRzX18gPSBhc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKVxuXG4gIC8vIENhY2hlIGxhc3QgdGVzdGVkIHJlc3VsdC4gVXNlZCB0byBza2lwIHJlcGVhdGluZyBzdGVwcyBvbiBuZXh0IGBtYXRjaGAgY2FsbC5cbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuICB0aGlzLl9fbGFzdF9pbmRleF9fID0gLTEgLy8gTmV4dCBzY2FuIHBvc2l0aW9uXG4gIHRoaXMuX19zY2hlbWFfXyA9ICcnXG4gIHRoaXMuX190ZXh0X2NhY2hlX18gPSAnJ1xuXG4gIHRoaXMuX19zY2hlbWFzX18gPSBhc3NpZ24oe30sIGRlZmF1bHRTY2hlbWFzLCBzY2hlbWFzKVxuICB0aGlzLl9fY29tcGlsZWRfXyA9IHt9XG5cbiAgdGhpcy5fX3RsZHNfXyA9IHRsZHNfZGVmYXVsdFxuICB0aGlzLl9fdGxkc19yZXBsYWNlZF9fID0gZmFsc2VcblxuICB0aGlzLnJlID0ge31cblxuICBjb21waWxlKHRoaXMpXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIExpbmtpZnlJdCNhZGQoc2NoZW1hLCBkZWZpbml0aW9uKVxuICogLSBzY2hlbWEgKFN0cmluZyk6IHJ1bGUgbmFtZSAoZml4ZWQgcGF0dGVybiBwcmVmaXgpXG4gKiAtIGRlZmluaXRpb24gKFN0cmluZ3xSZWdFeHB8T2JqZWN0KTogc2NoZW1hIGRlZmluaXRpb25cbiAqXG4gKiBBZGQgbmV3IHJ1bGUgZGVmaW5pdGlvbi4gU2VlIGNvbnN0cnVjdG9yIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKHNjaGVtYSwgZGVmaW5pdGlvbikge1xuICB0aGlzLl9fc2NoZW1hc19fW3NjaGVtYV0gPSBkZWZpbml0aW9uXG4gIGNvbXBpbGUodGhpcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I3NldChvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB7IGZ1enp5TGlua3xmdXp6eUVtYWlsfGZ1enp5SVA6IHRydWV8ZmFsc2UgfVxuICpcbiAqIFNldCByZWNvZ25pdGlvbiBvcHRpb25zIGZvciBsaW5rcyB3aXRob3V0IHNjaGVtYS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChvcHRpb25zKSB7XG4gIHRoaXMuX19vcHRzX18gPSBhc3NpZ24odGhpcy5fX29wdHNfXywgb3B0aW9ucylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjdGVzdCh0ZXh0KSAtPiBCb29sZWFuXG4gKlxuICogU2VhcmNoZXMgbGlua2lmaWFibGUgcGF0dGVybiBhbmQgcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2VzcyBvciBgZmFsc2VgIG9uIGZhaWwuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiB0ZXN0ICh0ZXh0KSB7XG4gIC8vIFJlc2V0IHNjYW4gY2FjaGVcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9IHRleHRcbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuXG4gIGlmICghdGV4dC5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgbSwgbWwsIG1lLCBsZW4sIHNoaWZ0LCBuZXh0LCByZSwgdGxkX3BvcywgYXRfcG9zXG5cbiAgLy8gdHJ5IHRvIHNjYW4gZm9yIGxpbmsgd2l0aCBzY2hlbWEgLSB0aGF0J3MgdGhlIG1vc3Qgc2ltcGxlIHJ1bGVcbiAgaWYgKHRoaXMucmUuc2NoZW1hX3Rlc3QudGVzdCh0ZXh0KSkge1xuICAgIHJlID0gdGhpcy5yZS5zY2hlbWFfc2VhcmNoXG4gICAgcmUubGFzdEluZGV4ID0gMFxuICAgIHdoaWxlICgobSA9IHJlLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgICBsZW4gPSB0aGlzLnRlc3RTY2hlbWFBdCh0ZXh0LCBtWzJdLCByZS5sYXN0SW5kZXgpXG4gICAgICBpZiAobGVuKSB7XG4gICAgICAgIHRoaXMuX19zY2hlbWFfXyA9IG1bMl1cbiAgICAgICAgdGhpcy5fX2luZGV4X18gPSBtLmluZGV4ICsgbVsxXS5sZW5ndGhcbiAgICAgICAgdGhpcy5fX2xhc3RfaW5kZXhfXyA9IG0uaW5kZXggKyBtWzBdLmxlbmd0aCArIGxlblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9fb3B0c19fLmZ1enp5TGluayAmJiB0aGlzLl9fY29tcGlsZWRfX1snaHR0cDonXSkge1xuICAgIC8vIGd1ZXNzIHNjaGVtYWxlc3MgbGlua3NcbiAgICB0bGRfcG9zID0gdGV4dC5zZWFyY2godGhpcy5yZS5ob3N0X2Z1enp5X3Rlc3QpXG4gICAgaWYgKHRsZF9wb3MgPj0gMCkge1xuICAgICAgLy8gaWYgdGxkIGlzIGxvY2F0ZWQgYWZ0ZXIgZm91bmQgbGluayAtIG5vIG5lZWQgdG8gY2hlY2sgZnV6enkgcGF0dGVyblxuICAgICAgaWYgKHRoaXMuX19pbmRleF9fIDwgMCB8fCB0bGRfcG9zIDwgdGhpcy5fX2luZGV4X18pIHtcbiAgICAgICAgaWYgKChtbCA9IHRleHQubWF0Y2godGhpcy5fX29wdHNfXy5mdXp6eUlQID8gdGhpcy5yZS5saW5rX2Z1enp5IDogdGhpcy5yZS5saW5rX25vX2lwX2Z1enp5KSkgIT09IG51bGwpIHtcbiAgICAgICAgICBzaGlmdCA9IG1sLmluZGV4ICsgbWxbMV0ubGVuZ3RoXG5cbiAgICAgICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHNoaWZ0IDwgdGhpcy5fX2luZGV4X18pIHtcbiAgICAgICAgICAgIHRoaXMuX19zY2hlbWFfXyA9ICcnXG4gICAgICAgICAgICB0aGlzLl9faW5kZXhfXyA9IHNoaWZ0XG4gICAgICAgICAgICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbWwuaW5kZXggKyBtbFswXS5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fX29wdHNfXy5mdXp6eUVtYWlsICYmIHRoaXMuX19jb21waWxlZF9fWydtYWlsdG86J10pIHtcbiAgICAvLyBndWVzcyBzY2hlbWFsZXNzIGVtYWlsc1xuICAgIGF0X3BvcyA9IHRleHQuaW5kZXhPZignQCcpXG4gICAgaWYgKGF0X3BvcyA+PSAwKSB7XG4gICAgICAvLyBXZSBjYW4ndCBza2lwIHRoaXMgY2hlY2ssIGJlY2F1c2UgdGhpcyBjYXNlcyBhcmUgcG9zc2libGU6XG4gICAgICAvLyAxOTIuMTY4LjEuMUBnbWFpbC5jb20sIG15LmluQGV4YW1wbGUuY29tXG4gICAgICBpZiAoKG1lID0gdGV4dC5tYXRjaCh0aGlzLnJlLmVtYWlsX2Z1enp5KSkgIT09IG51bGwpIHtcbiAgICAgICAgc2hpZnQgPSBtZS5pbmRleCArIG1lWzFdLmxlbmd0aFxuICAgICAgICBuZXh0ID0gbWUuaW5kZXggKyBtZVswXS5sZW5ndGhcblxuICAgICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHNoaWZ0IDwgdGhpcy5fX2luZGV4X18gfHxcbiAgICAgICAgICAgIChzaGlmdCA9PT0gdGhpcy5fX2luZGV4X18gJiYgbmV4dCA+IHRoaXMuX19sYXN0X2luZGV4X18pKSB7XG4gICAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gJ21haWx0bzonXG4gICAgICAgICAgdGhpcy5fX2luZGV4X18gPSBzaGlmdFxuICAgICAgICAgIHRoaXMuX19sYXN0X2luZGV4X18gPSBuZXh0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fX2luZGV4X18gPj0gMFxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNwcmV0ZXN0KHRleHQpIC0+IEJvb2xlYW5cbiAqXG4gKiBWZXJ5IHF1aWNrIGNoZWNrLCB0aGF0IGNhbiBnaXZlIGZhbHNlIHBvc2l0aXZlcy4gUmV0dXJucyB0cnVlIGlmIGxpbmsgTUFZIEJFXG4gKiBjYW4gZXhpc3RzLiBDYW4gYmUgdXNlZCBmb3Igc3BlZWQgb3B0aW1pemF0aW9uLCB3aGVuIHlvdSBuZWVkIHRvIGNoZWNrIHRoYXRcbiAqIGxpbmsgTk9UIGV4aXN0cy5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUucHJldGVzdCA9IGZ1bmN0aW9uIHByZXRlc3QgKHRleHQpIHtcbiAgcmV0dXJuIHRoaXMucmUucHJldGVzdC50ZXN0KHRleHQpXG59XG5cbi8qKlxuICogTGlua2lmeUl0I3Rlc3RTY2hlbWFBdCh0ZXh0LCBuYW1lLCBwb3NpdGlvbikgLT4gTnVtYmVyXG4gKiAtIHRleHQgKFN0cmluZyk6IHRleHQgdG8gc2NhblxuICogLSBuYW1lIChTdHJpbmcpOiBydWxlIChzY2hlbWEpIG5hbWVcbiAqIC0gcG9zaXRpb24gKE51bWJlcik6IHRleHQgb2Zmc2V0IHRvIGNoZWNrIGZyb21cbiAqXG4gKiBTaW1pbGFyIHRvIFtbTGlua2lmeUl0I3Rlc3RdXSBidXQgY2hlY2tzIG9ubHkgc3BlY2lmaWMgcHJvdG9jb2wgdGFpbCBleGFjdGx5XG4gKiBhdCBnaXZlbiBwb3NpdGlvbi4gUmV0dXJucyBsZW5ndGggb2YgZm91bmQgcGF0dGVybiAoMCBvbiBmYWlsKS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGVzdFNjaGVtYUF0ID0gZnVuY3Rpb24gdGVzdFNjaGVtYUF0ICh0ZXh0LCBzY2hlbWEsIHBvcykge1xuICAvLyBJZiBub3Qgc3VwcG9ydGVkIHNjaGVtYSBjaGVjayByZXF1ZXN0ZWQgLSB0ZXJtaW5hdGVcbiAgaWYgKCF0aGlzLl9fY29tcGlsZWRfX1tzY2hlbWEudG9Mb3dlckNhc2UoKV0pIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIHJldHVybiB0aGlzLl9fY29tcGlsZWRfX1tzY2hlbWEudG9Mb3dlckNhc2UoKV0udmFsaWRhdGUodGV4dCwgcG9zLCB0aGlzKVxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNtYXRjaCh0ZXh0KSAtPiBBcnJheXxudWxsXG4gKlxuICogUmV0dXJucyBhcnJheSBvZiBmb3VuZCBsaW5rIGRlc2NyaXB0aW9ucyBvciBgbnVsbGAgb24gZmFpbC4gV2Ugc3Ryb25nbHlcbiAqIHJlY29tbWVuZCB0byB1c2UgW1tMaW5raWZ5SXQjdGVzdF1dIGZpcnN0LCBmb3IgYmVzdCBzcGVlZC5cbiAqXG4gKiAjIyMjIyBSZXN1bHQgbWF0Y2ggZGVzY3JpcHRpb25cbiAqXG4gKiAtIF9fc2NoZW1hX18gLSBsaW5rIHNjaGVtYSwgY2FuIGJlIGVtcHR5IGZvciBmdXp6eSBsaW5rcywgb3IgYC8vYCBmb3JcbiAqICAgcHJvdG9jb2wtbmV1dHJhbCAgbGlua3MuXG4gKiAtIF9faW5kZXhfXyAtIG9mZnNldCBvZiBtYXRjaGVkIHRleHRcbiAqIC0gX19sYXN0SW5kZXhfXyAtIGluZGV4IG9mIG5leHQgY2hhciBhZnRlciBtYXRoY2ggZW5kXG4gKiAtIF9fcmF3X18gLSBtYXRjaGVkIHRleHRcbiAqIC0gX190ZXh0X18gLSBub3JtYWxpemVkIHRleHRcbiAqIC0gX191cmxfXyAtIGxpbmssIGdlbmVyYXRlZCBmcm9tIG1hdGNoZWQgdGV4dFxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIG1hdGNoICh0ZXh0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGxldCBzaGlmdCA9IDBcblxuICAvLyBUcnkgdG8gdGFrZSBwcmV2aW91cyBlbGVtZW50IGZyb20gY2FjaGUsIGlmIC50ZXN0KCkgY2FsbGVkIGJlZm9yZVxuICBpZiAodGhpcy5fX2luZGV4X18gPj0gMCAmJiB0aGlzLl9fdGV4dF9jYWNoZV9fID09PSB0ZXh0KSB7XG4gICAgcmVzdWx0LnB1c2goY3JlYXRlTWF0Y2godGhpcywgc2hpZnQpKVxuICAgIHNoaWZ0ID0gdGhpcy5fX2xhc3RfaW5kZXhfX1xuICB9XG5cbiAgLy8gQ3V0IGhlYWQgaWYgY2FjaGUgd2FzIHVzZWRcbiAgbGV0IHRhaWwgPSBzaGlmdCA/IHRleHQuc2xpY2Uoc2hpZnQpIDogdGV4dFxuXG4gIC8vIFNjYW4gc3RyaW5nIHVudGlsIGVuZCByZWFjaGVkXG4gIHdoaWxlICh0aGlzLnRlc3QodGFpbCkpIHtcbiAgICByZXN1bHQucHVzaChjcmVhdGVNYXRjaCh0aGlzLCBzaGlmdCkpXG5cbiAgICB0YWlsID0gdGFpbC5zbGljZSh0aGlzLl9fbGFzdF9pbmRleF9fKVxuICAgIHNoaWZ0ICs9IHRoaXMuX19sYXN0X2luZGV4X19cbiAgfVxuXG4gIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjbWF0Y2hBdFN0YXJ0KHRleHQpIC0+IE1hdGNofG51bGxcbiAqXG4gKiBSZXR1cm5zIGZ1bGx5LWZvcm1lZCAobm90IGZ1enp5KSBsaW5rIGlmIGl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nXG4gKiBvZiB0aGUgc3RyaW5nLCBhbmQgbnVsbCBvdGhlcndpc2UuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm1hdGNoQXRTdGFydCA9IGZ1bmN0aW9uIG1hdGNoQXRTdGFydCAodGV4dCkge1xuICAvLyBSZXNldCBzY2FuIGNhY2hlXG4gIHRoaXMuX190ZXh0X2NhY2hlX18gPSB0ZXh0XG4gIHRoaXMuX19pbmRleF9fID0gLTFcblxuICBpZiAoIXRleHQubGVuZ3RoKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IG0gPSB0aGlzLnJlLnNjaGVtYV9hdF9zdGFydC5leGVjKHRleHQpXG4gIGlmICghbSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBsZW4gPSB0aGlzLnRlc3RTY2hlbWFBdCh0ZXh0LCBtWzJdLCBtWzBdLmxlbmd0aClcbiAgaWYgKCFsZW4pIHJldHVybiBudWxsXG5cbiAgdGhpcy5fX3NjaGVtYV9fID0gbVsyXVxuICB0aGlzLl9faW5kZXhfXyA9IG0uaW5kZXggKyBtWzFdLmxlbmd0aFxuICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoICsgbGVuXG5cbiAgcmV0dXJuIGNyZWF0ZU1hdGNoKHRoaXMsIDApXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIExpbmtpZnlJdCN0bGRzKGxpc3QgWywga2VlcE9sZF0pIC0+IHRoaXNcbiAqIC0gbGlzdCAoQXJyYXkpOiBsaXN0IG9mIHRsZHNcbiAqIC0ga2VlcE9sZCAoQm9vbGVhbik6IG1lcmdlIHdpdGggY3VycmVudCBsaXN0IGlmIGB0cnVlYCAoYGZhbHNlYCBieSBkZWZhdWx0KVxuICpcbiAqIExvYWQgKG9yIG1lcmdlKSBuZXcgdGxkcyBsaXN0LiBUaG9zZSBhcmUgdXNlciBmb3IgZnV6enkgbGlua3MgKHdpdGhvdXQgcHJlZml4KVxuICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzLiBCeSBkZWZhdWx0IHRoaXMgYWxnb3J5dGhtIHVzZWQ6XG4gKlxuICogLSBob3N0bmFtZSB3aXRoIGFueSAyLWxldHRlciByb290IHpvbmVzIGFyZSBvay5cbiAqIC0gYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YRcbiAqICAgYXJlIG9rLlxuICogLSBlbmNvZGVkIChgeG4tLS4uLmApIHJvb3Qgem9uZXMgYXJlIG9rLlxuICpcbiAqIElmIGxpc3QgaXMgcmVwbGFjZWQsIHRoZW4gZXhhY3QgbWF0Y2ggZm9yIDItY2hhcnMgcm9vdCB6b25lcyB3aWxsIGJlIGNoZWNrZWQuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLnRsZHMgPSBmdW5jdGlvbiB0bGRzIChsaXN0LCBrZWVwT2xkKSB7XG4gIGxpc3QgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtsaXN0XVxuXG4gIGlmICgha2VlcE9sZCkge1xuICAgIHRoaXMuX190bGRzX18gPSBsaXN0LnNsaWNlKClcbiAgICB0aGlzLl9fdGxkc19yZXBsYWNlZF9fID0gdHJ1ZVxuICAgIGNvbXBpbGUodGhpcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdGhpcy5fX3RsZHNfXyA9IHRoaXMuX190bGRzX18uY29uY2F0KGxpc3QpXG4gICAgLnNvcnQoKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsLCBpZHgsIGFycikge1xuICAgICAgcmV0dXJuIGVsICE9PSBhcnJbaWR4IC0gMV1cbiAgICB9KVxuICAgIC5yZXZlcnNlKClcblxuICBjb21waWxlKHRoaXMpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogTGlua2lmeUl0I25vcm1hbGl6ZShtYXRjaClcbiAqXG4gKiBEZWZhdWx0IG5vcm1hbGl6ZXIgKGlmIHNjaGVtYSBkb2VzIG5vdCBkZWZpbmUgaXQncyBvd24pLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUgKG1hdGNoKSB7XG4gIC8vIERvIG1pbmltYWwgcG9zc2libGUgY2hhbmdlcyBieSBkZWZhdWx0LiBOZWVkIHRvIGNvbGxlY3QgZmVlZGJhY2sgcHJpb3JcbiAgLy8gdG8gbW92ZSBmb3J3YXJkIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9saW5raWZ5LWl0L2lzc3Vlcy8xXG5cbiAgaWYgKCFtYXRjaC5zY2hlbWEpIHsgbWF0Y2gudXJsID0gJ2h0dHA6Ly8nICsgbWF0Y2gudXJsIH1cblxuICBpZiAobWF0Y2guc2NoZW1hID09PSAnbWFpbHRvOicgJiYgIS9ebWFpbHRvOi9pLnRlc3QobWF0Y2gudXJsKSkge1xuICAgIG1hdGNoLnVybCA9ICdtYWlsdG86JyArIG1hdGNoLnVybFxuICB9XG59XG5cbi8qKlxuICogTGlua2lmeUl0I29uQ29tcGlsZSgpXG4gKlxuICogT3ZlcnJpZGUgdG8gbW9kaWZ5IGJhc2ljIFJlZ0V4cC1zLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5vbkNvbXBpbGUgPSBmdW5jdGlvbiBvbkNvbXBpbGUgKCkge1xufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5raWZ5SXRcbiIsImltcG9ydCB7IEFueSwgQ2MsIFosIFAgfSBmcm9tICd1Yy5taWNybydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgcmUgPSB7fVxuICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gIHJlLnNyY19BbnkgPSBBbnkuc291cmNlXG4gIHJlLnNyY19DYyA9IENjLnNvdXJjZVxuICByZS5zcmNfWiA9IFouc291cmNlXG4gIHJlLnNyY19QID0gUC5zb3VyY2VcblxuICAvLyBcXHB7XFxaXFxQXFxDY1xcQ0Z9ICh3aGl0ZSBzcGFjZXMgKyBjb250cm9sICsgZm9ybWF0ICsgcHVuY3R1YXRpb24pXG4gIHJlLnNyY19aUENjID0gW3JlLnNyY19aLCByZS5zcmNfUCwgcmUuc3JjX0NjXS5qb2luKCd8JylcblxuICAvLyBcXHB7XFxaXFxDY30gKHdoaXRlIHNwYWNlcyArIGNvbnRyb2wpXG4gIHJlLnNyY19aQ2MgPSBbcmUuc3JjX1osIHJlLnNyY19DY10uam9pbignfCcpXG5cbiAgLy8gRXhwZXJpbWVudGFsLiBMaXN0IG9mIGNoYXJzLCBjb21wbGV0ZWx5IHByb2hpYml0ZWQgaW4gbGlua3NcbiAgLy8gYmVjYXVzZSBjYW4gc2VwYXJhdGUgaXQgZnJvbSBvdGhlciBwYXJ0IG9mIHRleHRcbiAgY29uc3QgdGV4dF9zZXBhcmF0b3JzID0gJ1s+PFxcdWZmNWNdJ1xuXG4gIC8vIEFsbCBwb3NzaWJsZSB3b3JkIGNoYXJhY3RlcnMgKGV2ZXJ5dGhpbmcgd2l0aG91dCBwdW5jdHVhdGlvbiwgc3BhY2VzICYgY29udHJvbHMpXG4gIC8vIERlZmluZWQgdmlhIHB1bmN0dWF0aW9uICYgc3BhY2VzIHRvIHNhdmUgc3BhY2VcbiAgLy8gU2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIFxccHtcXExcXE5cXFNcXE19IChcXHcgYnV0IHdpdGhvdXQgYF9gKVxuICByZS5zcmNfcHNldWRvX2xldHRlciA9ICcoPzooPyEnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3wnICsgcmUuc3JjX1pQQ2MgKyAnKScgKyByZS5zcmNfQW55ICsgJyknXG4gIC8vIFRoZSBzYW1lIGFzIGFib3RoZSBidXQgd2l0aG91dCBbMC05XVxuICAvLyB2YXIgc3JjX3BzZXVkb19sZXR0ZXJfbm9uX2QgPSAnKD86KD8hWzAtOV18JyArIHNyY19aUENjICsgJyknICsgc3JjX0FueSArICcpJztcblxuICByZS5zcmNfaXA0ID1cblxuICAgICcoPzooMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJ1xuXG4gIC8vIFByb2hpYml0IGFueSBvZiBcIkAvW10oKVwiIGluIHVzZXIvcGFzcyB0byBhdm9pZCB3cm9uZyBkb21haW4gZmV0Y2guXG4gIHJlLnNyY19hdXRoID0gJyg/Oig/Oig/IScgKyByZS5zcmNfWkNjICsgJ3xbQC9cXFxcW1xcXFxdKCldKS4pK0ApPydcblxuICByZS5zcmNfcG9ydCA9XG5cbiAgICAnKD86Oig/OjYoPzpbMC00XVxcXFxkezN9fDUoPzpbMC00XVxcXFxkezJ9fDUoPzpbMC0yXVxcXFxkfDNbMC01XSkpKXxbMS01XT9cXFxcZHsxLDR9KSk/J1xuXG4gIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3IgPVxuXG4gICAgJyg/PSR8JyArIHRleHRfc2VwYXJhdG9ycyArICd8JyArIHJlLnNyY19aUENjICsgJyknICtcbiAgICAnKD8hJyArIChvcHRzWyctLS0nXSA/ICctKD8hLS0pfCcgOiAnLXwnKSArICdffDpcXFxcZHxcXFxcLi18XFxcXC4oPyEkfCcgKyByZS5zcmNfWlBDYyArICcpKSdcblxuICByZS5zcmNfcGF0aCA9XG5cbiAgICAnKD86JyArXG4gICAgICAnWy8/I10nICtcbiAgICAgICAgJyg/OicgK1xuICAgICAgICAgICcoPyEnICsgcmUuc3JjX1pDYyArICd8JyArIHRleHRfc2VwYXJhdG9ycyArICd8WygpW1xcXFxde30uLFwiXFwnPyFcXFxcLTtdKS58JyArXG4gICAgICAgICAgJ1xcXFxbKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFxcXFxdKS4pKlxcXFxdfCcgK1xuICAgICAgICAgICdcXFxcKCg/Oig/IScgKyByZS5zcmNfWkNjICsgJ3xbKV0pLikqXFxcXCl8JyArXG4gICAgICAgICAgJ1xcXFx7KD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFt9XSkuKSpcXFxcfXwnICtcbiAgICAgICAgICAnXFxcXFwiKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFtcIl0pLikrXFxcXFwifCcgK1xuICAgICAgICAgIFwiXFxcXCcoPzooPyFcIiArIHJlLnNyY19aQ2MgKyBcInxbJ10pLikrXFxcXCd8XCIgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYEknbV9raW5nYCBpZiBubyBwYWlyIGZvdW5kXG4gICAgICAgICAgXCJcXFxcJyg/PVwiICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnfFstXSl8JyArXG5cbiAgICAgICAgICAvLyBnb29nbGUgaGFzIG1hbnkgZG90cyBpbiBcImdvb2dsZSBzZWFyY2hcIiBsaW5rcyAoIzY2LCAjODEpLlxuICAgICAgICAgIC8vIGdpdGh1YiBoYXMgLi4uIGluIGNvbW1pdCByYW5nZSBsaW5rcyxcbiAgICAgICAgICAvLyBSZXN0cmljdCB0b1xuICAgICAgICAgIC8vIC0gZW5nbGlzaFxuICAgICAgICAgIC8vIC0gcGVyY2VudC1lbmNvZGVkXG4gICAgICAgICAgLy8gLSBwYXJ0cyBvZiBmaWxlIHBhdGhcbiAgICAgICAgICAvLyAtIHBhcmFtcyBzZXBhcmF0b3JcbiAgICAgICAgICAvLyB1bnRpbCBtb3JlIGV4YW1wbGVzIGZvdW5kLlxuICAgICAgICAgICdcXFxcLnsyLH1bYS16QS1aMC05JS8mXXwnICtcblxuICAgICAgICAgICdcXFxcLig/IScgKyByZS5zcmNfWkNjICsgJ3xbLl18JCl8JyArXG4gICAgICAgICAgKG9wdHNbJy0tLSddXG4gICAgICAgICAgICA/ICdcXFxcLSg/IS0tKD86W14tXXwkKSkoPzotKil8JyAvLyBgLS0tYCA9PiBsb25nIGRhc2gsIHRlcm1pbmF0ZVxuICAgICAgICAgICAgOiAnXFxcXC0rfCdcbiAgICAgICAgICApICtcbiAgICAgICAgICAvLyBhbGxvdyBgLCwsYCBpbiBwYXRoc1xuICAgICAgICAgICcsKD8hJyArIHJlLnNyY19aQ2MgKyAnfCQpfCcgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYDtgIGlmIG5vdCBmb2xsb3dlZCBieSBzcGFjZS1saWtlIGNoYXJcbiAgICAgICAgICAnOyg/IScgKyByZS5zcmNfWkNjICsgJ3wkKXwnICtcblxuICAgICAgICAgIC8vIGFsbG93IGAhISFgIGluIHBhdGhzLCBidXQgbm90IGF0IHRoZSBlbmRcbiAgICAgICAgICAnXFxcXCErKD8hJyArIHJlLnNyY19aQ2MgKyAnfFshXXwkKXwnICtcblxuICAgICAgICAgICdcXFxcPyg/IScgKyByZS5zcmNfWkNjICsgJ3xbP118JCknICtcbiAgICAgICAgJykrJyArXG4gICAgICAnfFxcXFwvJyArXG4gICAgJyk/J1xuXG4gIC8vIEFsbG93IGFueXRoaW5nIGluIG1hcmtkb3duIHNwZWMsIGZvcmJpZCBxdW90ZSAoXCIpIGF0IHRoZSBmaXJzdCBwb3NpdGlvblxuICAvLyBiZWNhdXNlIGVtYWlscyBlbmNsb3NlZCBpbiBxdW90ZXMgYXJlIGZhciBtb3JlIGNvbW1vblxuICByZS5zcmNfZW1haWxfbmFtZSA9XG5cbiAgICAnW1xcXFwtOzomPVxcXFwrXFxcXCQsXFxcXC5hLXpBLVowLTlfXVtcXFxcLTs6Jj1cXFxcK1xcXFwkLFxcXFxcIlxcXFwuYS16QS1aMC05X10qJ1xuXG4gIHJlLnNyY194biA9XG5cbiAgICAneG4tLVthLXowLTlcXFxcLV17MSw1OX0nXG5cbiAgLy8gTW9yZSB0byByZWFkIGFib3V0IGRvbWFpbiBuYW1lc1xuICAvLyBodHRwOi8vc2VydmVyZmF1bHQuY29tL3F1ZXN0aW9ucy82MzgyNjAvXG5cbiAgcmUuc3JjX2RvbWFpbl9yb290ID1cblxuICAgIC8vIEFsbG93IGxldHRlcnMgJiBkaWdpdHMgKGh0dHA6Ly90ZXN0MSlcbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfeG4gK1xuICAgICAgJ3wnICtcbiAgICAgIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJ3sxLDYzfScgK1xuICAgICcpJ1xuXG4gIHJlLnNyY19kb21haW4gPVxuXG4gICAgJyg/OicgK1xuICAgICAgcmUuc3JjX3huICtcbiAgICAgICd8JyArXG4gICAgICAnKD86JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyknICtcbiAgICAgICd8JyArXG4gICAgICAnKD86JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyg/Oi18JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyl7MCw2MX0nICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKScgK1xuICAgICcpJ1xuXG4gIHJlLnNyY19ob3N0ID1cblxuICAgICcoPzonICtcbiAgICAvLyBEb24ndCBuZWVkIElQIGNoZWNrLCBiZWNhdXNlIGRpZ2l0cyBhcmUgYWxyZWFkeSBhbGxvd2VkIGluIG5vcm1hbCBkb21haW4gbmFtZXNcbiAgICAvLyAgIHNyY19pcDQgK1xuICAgIC8vICd8JyArXG4gICAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSonICsgcmUuc3JjX2RvbWFpbi8qIF9yb290ICovICsgJyknICtcbiAgICAnKSdcblxuICByZS50cGxfaG9zdF9mdXp6eSA9XG5cbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfaXA0ICtcbiAgICAnfCcgK1xuICAgICAgJyg/Oig/Oig/OicgKyByZS5zcmNfZG9tYWluICsgJylcXFxcLikrKD86JVRMRFMlKSknICtcbiAgICAnKSdcblxuICByZS50cGxfaG9zdF9ub19pcF9mdXp6eSA9XG5cbiAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsoPzolVExEUyUpKSdcblxuICByZS5zcmNfaG9zdF9zdHJpY3QgPVxuXG4gICAgcmUuc3JjX2hvc3QgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUudHBsX2hvc3RfZnV6enlfc3RyaWN0ID1cblxuICAgIHJlLnRwbF9ob3N0X2Z1enp5ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIHJlLnNyY19ob3N0X3BvcnRfc3RyaWN0ID1cblxuICAgIHJlLnNyY19ob3N0ICsgcmUuc3JjX3BvcnQgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUudHBsX2hvc3RfcG9ydF9mdXp6eV9zdHJpY3QgPVxuXG4gICAgcmUudHBsX2hvc3RfZnV6enkgKyByZS5zcmNfcG9ydCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9wb3J0X25vX2lwX2Z1enp5X3N0cmljdCA9XG5cbiAgICByZS50cGxfaG9zdF9ub19pcF9mdXp6eSArIHJlLnNyY19wb3J0ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIC8vXG4gIC8vIE1haW4gcnVsZXNcbiAgLy9cblxuICAvLyBSdWRlIHRlc3QgZnV6enkgbGlua3MgYnkgaG9zdCwgZm9yIHF1aWNrIGRlbnlcbiAgcmUudHBsX2hvc3RfZnV6enlfdGVzdCA9XG5cbiAgICAnbG9jYWxob3N0fHd3d1xcXFwufFxcXFwuXFxcXGR7MSwzfVxcXFwufCg/OlxcXFwuKD86JVRMRFMlKSg/OicgKyByZS5zcmNfWlBDYyArICd8PnwkKSknXG5cbiAgcmUudHBsX2VtYWlsX2Z1enp5ID1cblxuICAgICAgJyhefCcgKyB0ZXh0X3NlcGFyYXRvcnMgKyAnfFwifFxcXFwofCcgKyByZS5zcmNfWkNjICsgJyknICtcbiAgICAgICcoJyArIHJlLnNyY19lbWFpbF9uYW1lICsgJ0AnICsgcmUudHBsX2hvc3RfZnV6enlfc3RyaWN0ICsgJyknXG5cbiAgcmUudHBsX2xpbmtfZnV6enkgPVxuICAgICAgLy8gRnV6enkgbGluayBjYW4ndCBiZSBwcmVwZW5kZWQgd2l0aCAuOi9cXC0gYW5kIG5vbiBwdW5jdHVhdGlvbi5cbiAgICAgIC8vIGJ1dCBjYW4gc3RhcnQgd2l0aCA+IChtYXJrZG93biBibG9ja3F1b3RlKVxuICAgICAgJyhefCg/IVsuOi9cXFxcLV9AXSkoPzpbJCs8PT5eYHxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSknICtcbiAgICAgICcoKD8hWyQrPD0+XmB8XFx1ZmY1Y10pJyArIHJlLnRwbF9ob3N0X3BvcnRfZnV6enlfc3RyaWN0ICsgcmUuc3JjX3BhdGggKyAnKSdcblxuICByZS50cGxfbGlua19ub19pcF9mdXp6eSA9XG4gICAgICAvLyBGdXp6eSBsaW5rIGNhbid0IGJlIHByZXBlbmRlZCB3aXRoIC46L1xcLSBhbmQgbm9uIHB1bmN0dWF0aW9uLlxuICAgICAgLy8gYnV0IGNhbiBzdGFydCB3aXRoID4gKG1hcmtkb3duIGJsb2NrcXVvdGUpXG4gICAgICAnKF58KD8hWy46L1xcXFwtX0BdKSg/OlskKzw9Pl5gfFxcdWZmNWNdfCcgKyByZS5zcmNfWlBDYyArICcpKScgK1xuICAgICAgJygoPyFbJCs8PT5eYHxcXHVmZjVjXSknICsgcmUudHBsX2hvc3RfcG9ydF9ub19pcF9mdXp6eV9zdHJpY3QgKyByZS5zcmNfcGF0aCArICcpJ1xuXG4gIHJldHVybiByZVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5jb25zdCBtYXhJbnQgPSAyMTQ3NDgzNjQ3OyAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cbi8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cbmNvbnN0IGJhc2UgPSAzNjtcbmNvbnN0IHRNaW4gPSAxO1xuY29uc3QgdE1heCA9IDI2O1xuY29uc3Qgc2tldyA9IDM4O1xuY29uc3QgZGFtcCA9IDcwMDtcbmNvbnN0IGluaXRpYWxCaWFzID0gNzI7XG5jb25zdCBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxuY29uc3QgZGVsaW1pdGVyID0gJy0nOyAvLyAnXFx4MkQnXG5cbi8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5jb25zdCByZWdleFB1bnljb2RlID0gL154bi0tLztcbmNvbnN0IHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx4N0ZdLzsgLy8gTm90ZTogVSswMDdGIERFTCBpcyBleGNsdWRlZCB0b28uXG5jb25zdCByZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cbi8qKiBFcnJvciBtZXNzYWdlcyAqL1xuY29uc3QgZXJyb3JzID0ge1xuXHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xufTtcblxuLyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuY29uc3QgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xuY29uc3QgZmxvb3IgPSBNYXRoLmZsb29yO1xuY29uc3Qgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcbn1cblxuLyoqXG4gKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG4gKiBpdGVtLlxuICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXAoYXJyYXksIGNhbGxiYWNrKSB7XG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXHRsZXQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRyZXN1bHRbbGVuZ3RoXSA9IGNhbGxiYWNrKGFycmF5W2xlbmd0aF0pO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG4gKiBhZGRyZXNzZXMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuICogY2hhcmFjdGVyLlxuICogQHJldHVybnMge1N0cmluZ30gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKGRvbWFpbiwgY2FsbGJhY2spIHtcblx0Y29uc3QgcGFydHMgPSBkb21haW4uc3BsaXQoJ0AnKTtcblx0bGV0IHJlc3VsdCA9ICcnO1xuXHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdGRvbWFpbiA9IHBhcnRzWzFdO1xuXHR9XG5cdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0ZG9tYWluID0gZG9tYWluLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0Y29uc3QgbGFiZWxzID0gZG9tYWluLnNwbGl0KCcuJyk7XG5cdGNvbnN0IGVuY29kZWQgPSBtYXAobGFiZWxzLCBjYWxsYmFjaykuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGxldCBjb3VudGVyID0gMDtcblx0Y29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdGNvbnN0IGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuXHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcblx0XHRcdFx0Ly8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZW5jb2RlXG4gKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuICovXG5jb25zdCB1Y3MyZW5jb2RlID0gY29kZVBvaW50cyA9PiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG4gKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcbiAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuICovXG5jb25zdCBiYXNpY1RvRGlnaXQgPSBmdW5jdGlvbihjb2RlUG9pbnQpIHtcblx0aWYgKGNvZGVQb2ludCA+PSAweDMwICYmIGNvZGVQb2ludCA8IDB4M0EpIHtcblx0XHRyZXR1cm4gMjYgKyAoY29kZVBvaW50IC0gMHgzMCk7XG5cdH1cblx0aWYgKGNvZGVQb2ludCA+PSAweDQxICYmIGNvZGVQb2ludCA8IDB4NUIpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg0MTtcblx0fVxuXHRpZiAoY29kZVBvaW50ID49IDB4NjEgJiYgY29kZVBvaW50IDwgMHg3Qikge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDYxO1xuXHR9XG5cdHJldHVybiBiYXNlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3JcbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG4gKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcbiAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG4gKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuICovXG5jb25zdCBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbihkaWdpdCwgZmxhZykge1xuXHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBhZGFwdCA9IGZ1bmN0aW9uKGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRsZXQgayA9IDA7XG5cdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdH1cblx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG4gKiBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKi9cbmNvbnN0IGRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdC8vIERvbid0IHVzZSBVQ1MtMi5cblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXHRsZXQgaSA9IDA7XG5cdGxldCBuID0gaW5pdGlhbE47XG5cdGxldCBiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG5cdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdGxldCBiYXNpYyA9IGlucHV0Lmxhc3RJbmRleE9mKGRlbGltaXRlcik7XG5cdGlmIChiYXNpYyA8IDApIHtcblx0XHRiYXNpYyA9IDA7XG5cdH1cblxuXHRmb3IgKGxldCBqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHQvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcblx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0fVxuXHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHR9XG5cblx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdGZvciAobGV0IGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xuXG5cdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHQvLyB3aGljaCBnZXRzIGFkZGVkIHRvIGBpYC4gVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llclxuXHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRjb25zdCBvbGRpID0gaTtcblx0XHRmb3IgKGxldCB3ID0gMSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cblx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UpIHtcblx0XHRcdFx0ZXJyb3IoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdH1cblx0XHRcdGlmIChkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHR9XG5cblx0XHRjb25zdCBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHR9XG5cblx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdGkgJT0gb3V0O1xuXG5cdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dC5cblx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5vdXRwdXQpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICovXG5jb25zdCBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblxuXHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBhbiBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLlxuXHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdC8vIENhY2hlIHRoZSBsZW5ndGguXG5cdGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuXHRsZXQgbiA9IGluaXRpYWxOO1xuXHRsZXQgZGVsdGEgPSAwO1xuXHRsZXQgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG5cdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcblx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cdGxldCBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoO1xuXG5cdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cblx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0fVxuXG5cdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdGxldCBtID0gbWF4SW50O1xuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHQvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdy5cblx0XHRjb25zdCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcblx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0biA9IG07XG5cblx0XHRmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiBpbnB1dCkge1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IG4pIHtcblx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXG5cdFx0XHRcdGxldCBxID0gZGVsdGE7XG5cdFx0XHRcdGZvciAobGV0IGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdGlmIChxIDwgdCkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHFNaW51c1QgPSBxIC0gdDtcblx0XHRcdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCsrZGVsdGE7XG5cdFx0KytuO1xuXG5cdH1cblx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG4gKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuICogY29udmVydCB0byBVbmljb2RlLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG4gKiBzdHJpbmcuXG4gKi9cbmNvbnN0IHRvVW5pY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG5jb25zdCB0b0FTQ0lJID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuY29uc3QgcHVueWNvZGUgPSB7XG5cdC8qKlxuXHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBTdHJpbmdcblx0ICovXG5cdCd2ZXJzaW9uJzogJzIuMy4xJyxcblx0LyoqXG5cdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHQndWNzMic6IHtcblx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHR9LFxuXHQnZGVjb2RlJzogZGVjb2RlLFxuXHQnZW5jb2RlJzogZW5jb2RlLFxuXHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcbn07XG5cbmV4cG9ydCB7IHVjczJkZWNvZGUsIHVjczJlbmNvZGUsIGRlY29kZSwgZW5jb2RlLCB0b0FTQ0lJLCB0b1VuaWNvZGUgfTtcbmV4cG9ydCBkZWZhdWx0IHB1bnljb2RlO1xuIiwiLy8gTWFpbiBwYXJzZXIgY2xhc3NcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMubWpzJ1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL2hlbHBlcnMvaW5kZXgubWpzJ1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vcmVuZGVyZXIubWpzJ1xuaW1wb3J0IFBhcnNlckNvcmUgZnJvbSAnLi9wYXJzZXJfY29yZS5tanMnXG5pbXBvcnQgUGFyc2VyQmxvY2sgZnJvbSAnLi9wYXJzZXJfYmxvY2subWpzJ1xuaW1wb3J0IFBhcnNlcklubGluZSBmcm9tICcuL3BhcnNlcl9pbmxpbmUubWpzJ1xuaW1wb3J0IExpbmtpZnlJdCBmcm9tICdsaW5raWZ5LWl0J1xuaW1wb3J0ICogYXMgbWR1cmwgZnJvbSAnbWR1cmwnXG5pbXBvcnQgcHVueWNvZGUgZnJvbSAncHVueWNvZGUuanMnXG5cbmltcG9ydCBjZmdfZGVmYXVsdCBmcm9tICcuL3ByZXNldHMvZGVmYXVsdC5tanMnXG5pbXBvcnQgY2ZnX3plcm8gZnJvbSAnLi9wcmVzZXRzL3plcm8ubWpzJ1xuaW1wb3J0IGNmZ19jb21tb25tYXJrIGZyb20gJy4vcHJlc2V0cy9jb21tb25tYXJrLm1qcydcblxuY29uc3QgY29uZmlnID0ge1xuICBkZWZhdWx0OiBjZmdfZGVmYXVsdCxcbiAgemVybzogY2ZnX3plcm8sXG4gIGNvbW1vbm1hcms6IGNmZ19jb21tb25tYXJrXG59XG5cbi8vXG4vLyBUaGlzIHZhbGlkYXRvciBjYW4gcHJvaGliaXQgbW9yZSB0aGFuIHJlYWxseSBuZWVkZWQgdG8gcHJldmVudCBYU1MuIEl0J3MgYVxuLy8gdHJhZGVvZmYgdG8ga2VlcCBjb2RlIHNpbXBsZSBhbmQgdG8gYmUgc2VjdXJlIGJ5IGRlZmF1bHQuXG4vL1xuLy8gSWYgeW91IG5lZWQgZGlmZmVyZW50IHNldHVwIC0gb3ZlcnJpZGUgdmFsaWRhdG9yIG1ldGhvZCBhcyB5b3Ugd2lzaC4gT3Jcbi8vIHJlcGxhY2UgaXQgd2l0aCBkdW1teSBmdW5jdGlvbiBhbmQgdXNlIGV4dGVybmFsIHNhbml0aXplci5cbi8vXG5cbmNvbnN0IEJBRF9QUk9UT19SRSA9IC9eKHZic2NyaXB0fGphdmFzY3JpcHR8ZmlsZXxkYXRhKTovXG5jb25zdCBHT09EX0RBVEFfUkUgPSAvXmRhdGE6aW1hZ2VcXC8oZ2lmfHBuZ3xqcGVnfHdlYnApOy9cblxuZnVuY3Rpb24gdmFsaWRhdGVMaW5rICh1cmwpIHtcbiAgLy8gdXJsIHNob3VsZCBiZSBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnQsIGFuZCBleGlzdGluZyBlbnRpdGllcyBhcmUgZGVjb2RlZFxuICBjb25zdCBzdHIgPSB1cmwudHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICByZXR1cm4gQkFEX1BST1RPX1JFLnRlc3Qoc3RyKSA/IEdPT0RfREFUQV9SRS50ZXN0KHN0cikgOiB0cnVlXG59XG5cbmNvbnN0IFJFQ09ERV9IT1NUTkFNRV9GT1IgPSBbJ2h0dHA6JywgJ2h0dHBzOicsICdtYWlsdG86J11cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluayAodXJsKSB7XG4gIGNvbnN0IHBhcnNlZCA9IG1kdXJsLnBhcnNlKHVybCwgdHJ1ZSlcblxuICBpZiAocGFyc2VkLmhvc3RuYW1lKSB7XG4gICAgLy8gRW5jb2RlIGhvc3RuYW1lcyBpbiB1cmxzIGxpa2U6XG4gICAgLy8gYGh0dHA6Ly9ob3N0L2AsIGBodHRwczovL2hvc3QvYCwgYG1haWx0bzp1c2VyQGhvc3RgLCBgLy9ob3N0L2BcbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IGVuY29kZSB1bmtub3duIHNjaGVtYXMsIGJlY2F1c2UgaXQncyBsaWtlbHkgdGhhdCB3ZSBlbmNvZGVcbiAgICAvLyBzb21ldGhpbmcgd2Ugc2hvdWxkbid0IChlLmcuIGBza3lwZTpuYW1lYCB0cmVhdGVkIGFzIGBza3lwZTpob3N0YClcbiAgICAvL1xuICAgIGlmICghcGFyc2VkLnByb3RvY29sIHx8IFJFQ09ERV9IT1NUTkFNRV9GT1IuaW5kZXhPZihwYXJzZWQucHJvdG9jb2wpID49IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZC5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkocGFyc2VkLmhvc3RuYW1lKVxuICAgICAgfSBjYXRjaCAoZXIpIHsgLyoqLyB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kdXJsLmVuY29kZShtZHVybC5mb3JtYXQocGFyc2VkKSlcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RleHQgKHVybCkge1xuICBjb25zdCBwYXJzZWQgPSBtZHVybC5wYXJzZSh1cmwsIHRydWUpXG5cbiAgaWYgKHBhcnNlZC5ob3N0bmFtZSkge1xuICAgIC8vIEVuY29kZSBob3N0bmFtZXMgaW4gdXJscyBsaWtlOlxuICAgIC8vIGBodHRwOi8vaG9zdC9gLCBgaHR0cHM6Ly9ob3N0L2AsIGBtYWlsdG86dXNlckBob3N0YCwgYC8vaG9zdC9gXG4gICAgLy9cbiAgICAvLyBXZSBkb24ndCBlbmNvZGUgdW5rbm93biBzY2hlbWFzLCBiZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UgZW5jb2RlXG4gICAgLy8gc29tZXRoaW5nIHdlIHNob3VsZG4ndCAoZS5nLiBgc2t5cGU6bmFtZWAgdHJlYXRlZCBhcyBgc2t5cGU6aG9zdGApXG4gICAgLy9cbiAgICBpZiAoIXBhcnNlZC5wcm90b2NvbCB8fCBSRUNPREVfSE9TVE5BTUVfRk9SLmluZGV4T2YocGFyc2VkLnByb3RvY29sKSA+PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQuaG9zdG5hbWUgPSBwdW55Y29kZS50b1VuaWNvZGUocGFyc2VkLmhvc3RuYW1lKVxuICAgICAgfSBjYXRjaCAoZXIpIHsgLyoqLyB9XG4gICAgfVxuICB9XG5cbiAgLy8gYWRkICclJyB0byBleGNsdWRlIGxpc3QgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvaXNzdWVzLzcyMFxuICByZXR1cm4gbWR1cmwuZGVjb2RlKG1kdXJsLmZvcm1hdChwYXJzZWQpLCBtZHVybC5kZWNvZGUuZGVmYXVsdENoYXJzICsgJyUnKVxufVxuXG4vKipcbiAqIGNsYXNzIE1hcmtkb3duSXRcbiAqXG4gKiBNYWluIHBhcnNlci9yZW5kZXJlciBjbGFzcy5cbiAqXG4gKiAjIyMjIyBVc2FnZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIG5vZGUuanMsIFwiY2xhc3NpY1wiIHdheTpcbiAqIHZhciBNYXJrZG93bkl0ID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSxcbiAqICAgICBtZCA9IG5ldyBNYXJrZG93bkl0KCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqXG4gKiAvLyBub2RlLmpzLCB0aGUgc2FtZSwgYnV0IHdpdGggc3VnYXI6XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqXG4gKiAvLyBicm93c2VyIHdpdGhvdXQgQU1ELCBhZGRlZCB0byBcIndpbmRvd1wiIG9uIHNjcmlwdCBsb2FkXG4gKiAvLyBOb3RlLCB0aGVyZSBhcmUgbm8gZGFzaC5cbiAqIHZhciBtZCA9IHdpbmRvdy5tYXJrZG93bml0KCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqIGBgYFxuICpcbiAqIFNpbmdsZSBsaW5lIHJlbmRlcmluZywgd2l0aG91dCBwYXJhZ3JhcGggd3JhcDpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVySW5saW5lKCdfX21hcmtkb3duLWl0X18gcnVsZXp6IScpO1xuICogYGBgXG4gKiovXG5cbi8qKlxuICogbmV3IE1hcmtkb3duSXQoW3ByZXNldE5hbWUsIG9wdGlvbnNdKVxuICogLSBwcmVzZXROYW1lIChTdHJpbmcpOiBvcHRpb25hbCwgYGNvbW1vbm1hcmtgIC8gYHplcm9gXG4gKiAtIG9wdGlvbnMgKE9iamVjdClcbiAqXG4gKiBDcmVhdGVzIHBhcnNlciBpbnN0YW5zZSB3aXRoIGdpdmVuIGNvbmZpZy4gQ2FuIGJlIGNhbGxlZCB3aXRob3V0IGBuZXdgLlxuICpcbiAqICMjIyMjIHByZXNldE5hbWVcbiAqXG4gKiBNYXJrZG93bkl0IHByb3ZpZGVzIG5hbWVkIHByZXNldHMgYXMgYSBjb252ZW5pZW5jZSB0byBxdWlja2x5XG4gKiBlbmFibGUvZGlzYWJsZSBhY3RpdmUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zIGZvciBjb21tb24gdXNlIGNhc2VzLlxuICpcbiAqIC0gW1wiY29tbW9ubWFya1wiXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3ByZXNldHMvY29tbW9ubWFyay5tanMpIC1cbiAqICAgY29uZmlndXJlcyBwYXJzZXIgdG8gc3RyaWN0IFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSBtb2RlLlxuICogLSBbZGVmYXVsdF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9wcmVzZXRzL2RlZmF1bHQubWpzKSAtXG4gKiAgIHNpbWlsYXIgdG8gR0ZNLCB1c2VkIHdoZW4gbm8gcHJlc2V0IG5hbWUgZ2l2ZW4uIEVuYWJsZXMgYWxsIGF2YWlsYWJsZSBydWxlcyxcbiAqICAgYnV0IHN0aWxsIHdpdGhvdXQgaHRtbCwgdHlwb2dyYXBoZXIgJiBhdXRvbGlua2VyLlxuICogLSBbXCJ6ZXJvXCJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcHJlc2V0cy96ZXJvLm1qcykgLVxuICogICBhbGwgcnVsZXMgZGlzYWJsZWQuIFVzZWZ1bCB0byBxdWlja2x5IHNldHVwIHlvdXIgY29uZmlnIHZpYSBgLmVuYWJsZSgpYC5cbiAqICAgRm9yIGV4YW1wbGUsIHdoZW4geW91IG5lZWQgb25seSBgYm9sZGAgYW5kIGBpdGFsaWNgIG1hcmt1cCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqICMjIyMjIG9wdGlvbnM6XG4gKlxuICogLSBfX2h0bWxfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gZW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2UuIEJlIGNhcmVmdWwhXG4gKiAgIFRoYXQncyBub3Qgc2FmZSEgWW91IG1heSBuZWVkIGV4dGVybmFsIHNhbml0aXplciB0byBwcm90ZWN0IG91dHB1dCBmcm9tIFhTUy5cbiAqICAgSXQncyBiZXR0ZXIgdG8gZXh0ZW5kIGZlYXR1cmVzIHZpYSBwbHVnaW5zLCBpbnN0ZWFkIG9mIGVuYWJsaW5nIEhUTUwuXG4gKiAtIF9feGh0bWxPdXRfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gYWRkICcvJyB3aGVuIGNsb3Npbmcgc2luZ2xlIHRhZ3NcbiAqICAgKGA8YnIgLz5gKS4gVGhpcyBpcyBuZWVkZWQgb25seSBmb3IgZnVsbCBDb21tb25NYXJrIGNvbXBhdGliaWxpdHkuIEluIHJlYWxcbiAqICAgd29ybGQgeW91IHdpbGwgbmVlZCBIVE1MIG91dHB1dC5cbiAqIC0gX19icmVha3NfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gY29udmVydCBgXFxuYCBpbiBwYXJhZ3JhcGhzIGludG8gYDxicj5gLlxuICogLSBfX2xhbmdQcmVmaXhfXyAtIGBsYW5ndWFnZS1gLiBDU1MgbGFuZ3VhZ2UgY2xhc3MgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzLlxuICogICBDYW4gYmUgdXNlZnVsIGZvciBleHRlcm5hbCBoaWdobGlnaHRlcnMuXG4gKiAtIF9fbGlua2lmeV9fIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0IHRvIGxpbmtzLlxuICogLSBfX3R5cG9ncmFwaGVyX18gIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBlbmFibGUgW3NvbWUgbGFuZ3VhZ2UtbmV1dHJhbFxuICogICByZXBsYWNlbWVudF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9ydWxlc19jb3JlL3JlcGxhY2VtZW50cy5tanMpICtcbiAqICAgcXVvdGVzIGJlYXV0aWZpY2F0aW9uIChzbWFydHF1b3RlcykuXG4gKiAtIF9fcXVvdGVzX18gLSBg4oCc4oCd4oCY4oCZYCwgU3RyaW5nIG9yIEFycmF5LiBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50XG4gKiAgIHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQgYW5kIHNtYXJ0cXVvdGVzIG9uLiBGb3IgZXhhbXBsZSwgeW91IGNhblxuICogICB1c2UgYCfCq8K74oCe4oCcJ2AgZm9yIFJ1c3NpYW4sIGAn4oCe4oCc4oCa4oCYJ2AgZm9yIEdlcm1hbiwgYW5kXG4gKiAgIGBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddYCBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gKiAtIF9faGlnaGxpZ2h0X18gLSBgbnVsbGAuIEhpZ2hsaWdodGVyIGZ1bmN0aW9uIGZvciBmZW5jZWQgY29kZSBibG9ja3MuXG4gKiAgIEhpZ2hsaWdodGVyIGBmdW5jdGlvbiAoc3RyLCBsYW5nKWAgc2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwuIEl0IGNhbiBhbHNvXG4gKiAgIHJldHVybiBlbXB0eSBzdHJpbmcgaWYgdGhlIHNvdXJjZSB3YXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkXG4gKiAgIGV4dGVybmFseS4gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBjb21tb25tYXJrIG1vZGVcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoJ2NvbW1vbm1hcmsnKTtcbiAqXG4gKiAvLyBkZWZhdWx0IG1vZGVcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiAvLyBlbmFibGUgZXZlcnl0aGluZ1xuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSh7XG4gKiAgIGh0bWw6IHRydWUsXG4gKiAgIGxpbmtpZnk6IHRydWUsXG4gKiAgIHR5cG9ncmFwaGVyOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyMjIFN5bnRheCBoaWdobGlnaHRpbmdcbiAqXG4gKiBgYGBqc1xuICogdmFyIGhsanMgPSByZXF1aXJlKCdoaWdobGlnaHQuanMnKSAvLyBodHRwczovL2hpZ2hsaWdodGpzLm9yZy9cbiAqXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKHtcbiAqICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoc3RyLCBsYW5nKSB7XG4gKiAgICAgaWYgKGxhbmcgJiYgaGxqcy5nZXRMYW5ndWFnZShsYW5nKSkge1xuICogICAgICAgdHJ5IHtcbiAqICAgICAgICAgcmV0dXJuIGhsanMuaGlnaGxpZ2h0KHN0ciwgeyBsYW5ndWFnZTogbGFuZywgaWdub3JlSWxsZWdhbHM6IHRydWUgfSkudmFsdWU7XG4gKiAgICAgICB9IGNhdGNoIChfXykge31cbiAqICAgICB9XG4gKlxuICogICAgIHJldHVybiAnJzsgLy8gdXNlIGV4dGVybmFsIGRlZmF1bHQgZXNjYXBpbmdcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBPciB3aXRoIGZ1bGwgd3JhcHBlciBvdmVycmlkZSAoaWYgeW91IG5lZWQgYXNzaWduIGNsYXNzIHRvIGA8cHJlPmAgb3IgYDxjb2RlPmApOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBobGpzID0gcmVxdWlyZSgnaGlnaGxpZ2h0LmpzJykgLy8gaHR0cHM6Ly9oaWdobGlnaHRqcy5vcmcvXG4gKlxuICogLy8gQWN0dWFsIGRlZmF1bHQgdmFsdWVzXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKHtcbiAqICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoc3RyLCBsYW5nKSB7XG4gKiAgICAgaWYgKGxhbmcgJiYgaGxqcy5nZXRMYW5ndWFnZShsYW5nKSkge1xuICogICAgICAgdHJ5IHtcbiAqICAgICAgICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwiaGxqc1wiPicgK1xuICogICAgICAgICAgICAgICAgaGxqcy5oaWdobGlnaHQoc3RyLCB7IGxhbmd1YWdlOiBsYW5nLCBpZ25vcmVJbGxlZ2FsczogdHJ1ZSB9KS52YWx1ZSArXG4gKiAgICAgICAgICAgICAgICAnPC9jb2RlPjwvcHJlPic7XG4gKiAgICAgICB9IGNhdGNoIChfXykge31cbiAqICAgICB9XG4gKlxuICogICAgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz1cImhsanNcIj4nICsgbWQudXRpbHMuZXNjYXBlSHRtbChzdHIpICsgJzwvY29kZT48L3ByZT4nO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqKi9cbmZ1bmN0aW9uIE1hcmtkb3duSXQgKHByZXNldE5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hcmtkb3duSXQpKSB7XG4gICAgcmV0dXJuIG5ldyBNYXJrZG93bkl0KHByZXNldE5hbWUsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBpZiAoIXV0aWxzLmlzU3RyaW5nKHByZXNldE5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gcHJlc2V0TmFtZSB8fCB7fVxuICAgICAgcHJlc2V0TmFtZSA9ICdkZWZhdWx0J1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2lubGluZSAtPiBQYXJzZXJJbmxpbmVcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tQYXJzZXJJbmxpbmVdXS4gWW91IG1heSBuZWVkIGl0IHRvIGFkZCBuZXcgcnVsZXMgd2hlblxuICAgKiB3cml0aW5nIHBsdWdpbnMuIEZvciBzaW1wbGUgcnVsZXMgY29udHJvbCB1c2UgW1tNYXJrZG93bkl0LmRpc2FibGVdXSBhbmRcbiAgICogW1tNYXJrZG93bkl0LmVuYWJsZV1dLlxuICAgKiovXG4gIHRoaXMuaW5saW5lID0gbmV3IFBhcnNlcklubGluZSgpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjYmxvY2sgLT4gUGFyc2VyQmxvY2tcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tQYXJzZXJCbG9ja11dLiBZb3UgbWF5IG5lZWQgaXQgdG8gYWRkIG5ldyBydWxlcyB3aGVuXG4gICAqIHdyaXRpbmcgcGx1Z2lucy4gRm9yIHNpbXBsZSBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dIGFuZFxuICAgKiBbW01hcmtkb3duSXQuZW5hYmxlXV0uXG4gICAqKi9cbiAgdGhpcy5ibG9jayA9IG5ldyBQYXJzZXJCbG9jaygpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjY29yZSAtPiBDb3JlXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbQ29yZV1dIGNoYWluIGV4ZWN1dG9yLiBZb3UgbWF5IG5lZWQgaXQgdG8gYWRkIG5ldyBydWxlcyB3aGVuXG4gICAqIHdyaXRpbmcgcGx1Z2lucy4gRm9yIHNpbXBsZSBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dIGFuZFxuICAgKiBbW01hcmtkb3duSXQuZW5hYmxlXV0uXG4gICAqKi9cbiAgdGhpcy5jb3JlID0gbmV3IFBhcnNlckNvcmUoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I3JlbmRlcmVyIC0+IFJlbmRlcmVyXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbUmVuZGVyZXJdXS4gVXNlIGl0IHRvIG1vZGlmeSBvdXRwdXQgbG9vay4gT3IgdG8gYWRkIHJlbmRlcmluZ1xuICAgKiBydWxlcyBmb3IgbmV3IHRva2VuIHR5cGVzLCBnZW5lcmF0ZWQgYnkgcGx1Z2lucy5cbiAgICpcbiAgICogIyMjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAgICpcbiAgICogZnVuY3Rpb24gbXlUb2tlbih0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzZWxmKSB7XG4gICAqICAgLy8uLi5cbiAgICogICByZXR1cm4gcmVzdWx0O1xuICAgKiB9O1xuICAgKlxuICAgKiBtZC5yZW5kZXJlci5ydWxlc1snbXlfdG9rZW4nXSA9IG15VG9rZW5cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBbW1JlbmRlcmVyXV0gZG9jcyBhbmQgW3NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3JlbmRlcmVyLm1qcykuXG4gICAqKi9cbiAgdGhpcy5yZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjbGlua2lmeSAtPiBMaW5raWZ5SXRcbiAgICpcbiAgICogW2xpbmtpZnktaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9saW5raWZ5LWl0KSBpbnN0YW5jZS5cbiAgICogVXNlZCBieSBbbGlua2lmeV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9ydWxlc19jb3JlL2xpbmtpZnkubWpzKVxuICAgKiBydWxlLlxuICAgKiovXG4gIHRoaXMubGlua2lmeSA9IG5ldyBMaW5raWZ5SXQoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I3ZhbGlkYXRlTGluayh1cmwpIC0+IEJvb2xlYW5cbiAgICpcbiAgICogTGluayB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBDb21tb25NYXJrIGFsbG93cyB0b28gbXVjaCBpbiBsaW5rcy4gQnkgZGVmYXVsdFxuICAgKiB3ZSBkaXNhYmxlIGBqYXZhc2NyaXB0OmAsIGB2YnNjcmlwdDpgLCBgZmlsZTpgIHNjaGVtYXMsIGFuZCBhbG1vc3QgYWxsIGBkYXRhOi4uLmAgc2NoZW1hc1xuICAgKiBleGNlcHQgc29tZSBlbWJlZGRlZCBpbWFnZSB0eXBlcy5cbiAgICpcbiAgICogWW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvdXI6XG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICAgKiAvLyBlbmFibGUgZXZlcnl0aGluZ1xuICAgKiBtZC52YWxpZGF0ZUxpbmsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9XG4gICAqIGBgYFxuICAgKiovXG4gIHRoaXMudmFsaWRhdGVMaW5rID0gdmFsaWRhdGVMaW5rXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjbm9ybWFsaXplTGluayh1cmwpIC0+IFN0cmluZ1xuICAgKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIGVuY29kZSBsaW5rIHVybCB0byBhIG1hY2hpbmUtcmVhZGFibGUgZm9ybWF0LFxuICAgKiB3aGljaCBpbmNsdWRlcyB1cmwtZW5jb2RpbmcsIHB1bnljb2RlLCBldGMuXG4gICAqKi9cbiAgdGhpcy5ub3JtYWxpemVMaW5rID0gbm9ybWFsaXplTGlua1xuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I25vcm1hbGl6ZUxpbmtUZXh0KHVybCkgLT4gU3RyaW5nXG4gICAqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGVjb2RlIGxpbmsgdXJsIHRvIGEgaHVtYW4tcmVhZGFibGUgZm9ybWF0YFxuICAgKiovXG4gIHRoaXMubm9ybWFsaXplTGlua1RleHQgPSBub3JtYWxpemVMaW5rVGV4dFxuXG4gIC8vIEV4cG9zZSB1dGlscyAmIGhlbHBlcnMgZm9yIGVhc3kgYWNjZXMgZnJvbSBwbHVnaW5zXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjdXRpbHMgLT4gdXRpbHNcbiAgICpcbiAgICogQXNzb3J0ZWQgdXRpbGl0eSBmdW5jdGlvbnMsIHVzZWZ1bCB0byB3cml0ZSBwbHVnaW5zLiBTZWUgZGV0YWlsc1xuICAgKiBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9jb21tb24vdXRpbHMubWpzKS5cbiAgICoqL1xuICB0aGlzLnV0aWxzID0gdXRpbHNcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNoZWxwZXJzIC0+IGhlbHBlcnNcbiAgICpcbiAgICogTGluayBjb21wb25lbnRzIHBhcnNlciBmdW5jdGlvbnMsIHVzZWZ1bCB0byB3cml0ZSBwbHVnaW5zLiBTZWUgZGV0YWlsc1xuICAgKiBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9oZWxwZXJzKS5cbiAgICoqL1xuICB0aGlzLmhlbHBlcnMgPSB1dGlscy5hc3NpZ24oe30sIGhlbHBlcnMpXG5cbiAgdGhpcy5vcHRpb25zID0ge31cbiAgdGhpcy5jb25maWd1cmUocHJlc2V0TmFtZSlcblxuICBpZiAob3B0aW9ucykgeyB0aGlzLnNldChvcHRpb25zKSB9XG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQuc2V0KG9wdGlvbnMpXG4gKlxuICogU2V0IHBhcnNlciBvcHRpb25zIChpbiB0aGUgc2FtZSBmb3JtYXQgYXMgaW4gY29uc3RydWN0b3IpLiBQcm9iYWJseSwgeW91XG4gKiB3aWxsIG5ldmVyIG5lZWQgaXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSBvcHRpb25zIGFmdGVyIGNvbnN0cnVjdG9yIGNhbGwuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKVxuICogICAgICAgICAgICAgLnNldCh7IGh0bWw6IHRydWUsIGJyZWFrczogdHJ1ZSB9KVxuICogICAgICAgICAgICAgLnNldCh7IHR5cG9ncmFwaGVyLCB0cnVlIH0pO1xuICogYGBgXG4gKlxuICogX19Ob3RlOl9fIFRvIGFjaGlldmUgdGhlIGJlc3QgcG9zc2libGUgcGVyZm9ybWFuY2UsIGRvbid0IG1vZGlmeSBhXG4gKiBgbWFya2Rvd24taXRgIGluc3RhbmNlIG9wdGlvbnMgb24gdGhlIGZseS4gSWYgeW91IG5lZWQgbXVsdGlwbGUgY29uZmlndXJhdGlvbnNcbiAqIGl0J3MgYmVzdCB0byBjcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIGFuZCBpbml0aWFsaXplIGVhY2ggd2l0aCBzZXBhcmF0ZVxuICogY29uZmlnLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdXRpbHMuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZSwgaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQuY29uZmlndXJlKHByZXNldHMpXG4gKlxuICogQmF0Y2ggbG9hZCBvZiBhbGwgb3B0aW9ucyBhbmQgY29tcGVuZW50IHNldHRpbmdzLiBUaGlzIGlzIGludGVybmFsIG1ldGhvZCxcbiAqIGFuZCB5b3UgcHJvYmFibHkgd2lsbCBub3QgbmVlZCBpdC4gQnV0IGlmIHlvdSB3aWxsIC0gc2VlIGF2YWlsYWJsZSBwcmVzZXRzXG4gKiBhbmQgZGF0YSBzdHJ1Y3R1cmUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC90cmVlL21hc3Rlci9saWIvcHJlc2V0cylcbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIHByZXNldHMgaW5zdGVhZCBvZiBkaXJlY3QgY29uZmlnIGxvYWRzLiBUaGF0XG4gKiB3aWxsIGdpdmUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBuZXh0IHZlcnNpb25zLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuY29uZmlndXJlID0gZnVuY3Rpb24gKHByZXNldHMpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICBpZiAodXRpbHMuaXNTdHJpbmcocHJlc2V0cykpIHtcbiAgICBjb25zdCBwcmVzZXROYW1lID0gcHJlc2V0c1xuICAgIHByZXNldHMgPSBjb25maWdbcHJlc2V0TmFtZV1cbiAgICBpZiAoIXByZXNldHMpIHsgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBgbWFya2Rvd24taXRgIHByZXNldCBcIicgKyBwcmVzZXROYW1lICsgJ1wiLCBjaGVjayBuYW1lJykgfVxuICB9XG5cbiAgaWYgKCFwcmVzZXRzKSB7IHRocm93IG5ldyBFcnJvcignV3JvbmcgYG1hcmtkb3duLWl0YCBwcmVzZXQsIGNhblxcJ3QgYmUgZW1wdHknKSB9XG5cbiAgaWYgKHByZXNldHMub3B0aW9ucykgeyBzZWxmLnNldChwcmVzZXRzLm9wdGlvbnMpIH1cblxuICBpZiAocHJlc2V0cy5jb21wb25lbnRzKSB7XG4gICAgT2JqZWN0LmtleXMocHJlc2V0cy5jb21wb25lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzKSB7XG4gICAgICAgIHNlbGZbbmFtZV0ucnVsZXIuZW5hYmxlT25seShwcmVzZXRzLmNvbXBvbmVudHNbbmFtZV0ucnVsZXMpXG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzMikge1xuICAgICAgICBzZWxmW25hbWVdLnJ1bGVyMi5lbmFibGVPbmx5KHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlczIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBNYXJrZG93bkl0LmVuYWJsZShsaXN0LCBpZ25vcmVJbnZhbGlkKVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBydWxlIG5hbWUgb3IgbGlzdCBvZiBydWxlIG5hbWVzIHRvIGVuYWJsZVxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRW5hYmxlIGxpc3Qgb3IgcnVsZXMuIEl0IHdpbGwgYXV0b21hdGljYWxseSBmaW5kIGFwcHJvcHJpYXRlIGNvbXBvbmVudHMsXG4gKiBjb250YWluaW5nIHJ1bGVzIHdpdGggZ2l2ZW4gbmFtZXMuIElmIHJ1bGUgbm90IGZvdW5kLCBhbmQgYGlnbm9yZUludmFsaWRgXG4gKiBub3Qgc2V0IC0gdGhyb3dzIGV4Y2VwdGlvbi5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpXG4gKiAgICAgICAgICAgICAuZW5hYmxlKFsnc3ViJywgJ3N1cCddKVxuICogICAgICAgICAgICAgLmRpc2FibGUoJ3NtYXJ0cXVvdGVzJyk7XG4gKiBgYGBcbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGxldCByZXN1bHQgPSBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBbJ2NvcmUnLCAnYmxvY2snLCAnaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAoY2hhaW4pIHtcbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXNbY2hhaW5dLnJ1bGVyLmVuYWJsZShsaXN0LCB0cnVlKSlcbiAgfSwgdGhpcylcblxuICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuaW5saW5lLnJ1bGVyMi5lbmFibGUobGlzdCwgdHJ1ZSkpXG5cbiAgY29uc3QgbWlzc2VkID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHJlc3VsdC5pbmRleE9mKG5hbWUpIDwgMCB9KVxuXG4gIGlmIChtaXNzZWQubGVuZ3RoICYmICFpZ25vcmVJbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXJrZG93bkl0LiBGYWlsZWQgdG8gZW5hYmxlIHVua25vd24gcnVsZShzKTogJyArIG1pc3NlZClcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQuZGlzYWJsZShsaXN0LCBpZ25vcmVJbnZhbGlkKVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBydWxlIG5hbWUgb3IgbGlzdCBvZiBydWxlIG5hbWVzIHRvIGRpc2FibGUuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW01hcmtkb3duSXQuZW5hYmxlXV0sIGJ1dCB0dXJuIHNwZWNpZmllZCBydWxlcyBvZmYuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgbGV0IHJlc3VsdCA9IFtdXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIFsnY29yZScsICdibG9jaycsICdpbmxpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpc1tjaGFpbl0ucnVsZXIuZGlzYWJsZShsaXN0LCB0cnVlKSlcbiAgfSwgdGhpcylcblxuICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuaW5saW5lLnJ1bGVyMi5kaXNhYmxlKGxpc3QsIHRydWUpKVxuXG4gIGNvbnN0IG1pc3NlZCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiByZXN1bHQuaW5kZXhPZihuYW1lKSA8IDAgfSlcblxuICBpZiAobWlzc2VkLmxlbmd0aCAmJiAhaWdub3JlSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWFya2Rvd25JdC4gRmFpbGVkIHRvIGRpc2FibGUgdW5rbm93biBydWxlKHMpOiAnICsgbWlzc2VkKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQudXNlKHBsdWdpbiwgcGFyYW1zKVxuICpcbiAqIExvYWQgc3BlY2lmaWVkIHBsdWdpbiB3aXRoIGdpdmVuIHBhcmFtcyBpbnRvIGN1cnJlbnQgcGFyc2VyIGluc3RhbmNlLlxuICogSXQncyBqdXN0IGEgc3VnYXIgdG8gY2FsbCBgcGx1Z2luKG1kLCBwYXJhbXMpYCB3aXRoIGN1cnJpbmcuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBpdGVyYXRvciA9IHJlcXVpcmUoJ21hcmtkb3duLWl0LWZvci1pbmxpbmUnKTtcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKVxuICogICAgICAgICAgICAgLnVzZShpdGVyYXRvciwgJ2Zvb19yZXBsYWNlJywgJ3RleHQnLCBmdW5jdGlvbiAodG9rZW5zLCBpZHgpIHtcbiAqICAgICAgICAgICAgICAgdG9rZW5zW2lkeF0uY29udGVudCA9IHRva2Vuc1tpZHhdLmNvbnRlbnQucmVwbGFjZSgvZm9vL2csICdiYXInKTtcbiAqICAgICAgICAgICAgIH0pO1xuICogYGBgXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAocGx1Z2luIC8qLCBwYXJhbXMsIC4uLiAqLykge1xuICBjb25zdCBhcmdzID0gW3RoaXNdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICBwbHVnaW4uYXBwbHkocGx1Z2luLCBhcmdzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQucGFyc2Uoc3JjLCBlbnYpIC0+IEFycmF5XG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBQYXJzZSBpbnB1dCBzdHJpbmcgYW5kIHJldHVybiBsaXN0IG9mIGJsb2NrIHRva2VucyAoc3BlY2lhbCB0b2tlbiB0eXBlXG4gKiBcImlubGluZVwiIHdpbGwgY29udGFpbiBsaXN0IG9mIGlubGluZSB0b2tlbnMpLiBZb3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXNcbiAqIG1ldGhvZCBkaXJlY3RseSwgdW50aWwgeW91IHdyaXRlIGN1c3RvbSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIHRvIHByb2R1Y2VcbiAqIEFTVCkuXG4gKlxuICogYGVudmAgaXMgdXNlZCB0byBwYXNzIGRhdGEgYmV0d2VlbiBcImRpc3RyaWJ1dGVkXCIgcnVsZXMgYW5kIHJldHVybiBhZGRpdGlvbmFsXG4gKiBtZXRhZGF0YSBsaWtlIHJlZmVyZW5jZSBpbmZvLCBuZWVkZWQgZm9yIHRoZSByZW5kZXJlci4gSXQgYWxzbyBjYW4gYmUgdXNlZCB0b1xuICogaW5qZWN0IGRhdGEgaW4gc3BlY2lmaWMgY2FzZXMuIFVzdWFsbHksIHlvdSB3aWxsIGJlIG9rIHRvIHBhc3MgYHt9YCxcbiAqIGFuZCB0aGVuIHBhc3MgdXBkYXRlZCBvYmplY3QgdG8gcmVuZGVyZXIuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgc2hvdWxkIGJlIGEgU3RyaW5nJylcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuY29yZS5TdGF0ZShzcmMsIHRoaXMsIGVudilcblxuICB0aGlzLmNvcmUucHJvY2VzcyhzdGF0ZSlcblxuICByZXR1cm4gc3RhdGUudG9rZW5zXG59XG5cbi8qKlxuICogTWFya2Rvd25JdC5yZW5kZXIoc3JjIFssIGVudl0pIC0+IFN0cmluZ1xuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogUmVuZGVyIG1hcmtkb3duIHN0cmluZyBpbnRvIGh0bWwuIEl0IGRvZXMgYWxsIG1hZ2ljIGZvciB5b3UgOikuXG4gKlxuICogYGVudmAgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgbWV0YWRhdGEgKGB7fWAgYnkgZGVmYXVsdCkuXG4gKiBCdXQgeW91IHdpbGwgbm90IG5lZWQgaXQgd2l0aCBoaWdoIHByb2JhYmlsaXR5LiBTZWUgYWxzbyBjb21tZW50XG4gKiBpbiBbW01hcmtkb3duSXQucGFyc2VdXS5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBlbnYgPSBlbnYgfHwge31cblxuICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5wYXJzZShzcmMsIGVudiksIHRoaXMub3B0aW9ucywgZW52KVxufVxuXG4vKiogaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQucGFyc2VJbmxpbmUoc3JjLCBlbnYpIC0+IEFycmF5XG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBUaGUgc2FtZSBhcyBbW01hcmtkb3duSXQucGFyc2VdXSBidXQgc2tpcCBhbGwgYmxvY2sgcnVsZXMuIEl0IHJldHVybnMgdGhlXG4gKiBibG9jayB0b2tlbnMgbGlzdCB3aXRoIHRoZSBzaW5nbGUgYGlubGluZWAgZWxlbWVudCwgY29udGFpbmluZyBwYXJzZWQgaW5saW5lXG4gKiB0b2tlbnMgaW4gYGNoaWxkcmVuYCBwcm9wZXJ0eS4gQWxzbyB1cGRhdGVzIGBlbnZgIG9iamVjdC5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnBhcnNlSW5saW5lID0gZnVuY3Rpb24gKHNyYywgZW52KSB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuY29yZS5TdGF0ZShzcmMsIHRoaXMsIGVudilcblxuICBzdGF0ZS5pbmxpbmVNb2RlID0gdHJ1ZVxuICB0aGlzLmNvcmUucHJvY2VzcyhzdGF0ZSlcblxuICByZXR1cm4gc3RhdGUudG9rZW5zXG59XG5cbi8qKlxuICogTWFya2Rvd25JdC5yZW5kZXJJbmxpbmUoc3JjIFssIGVudl0pIC0+IFN0cmluZ1xuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogU2ltaWxhciB0byBbW01hcmtkb3duSXQucmVuZGVyXV0gYnV0IGZvciBzaW5nbGUgcGFyYWdyYXBoIGNvbnRlbnQuIFJlc3VsdFxuICogd2lsbCBOT1QgYmUgd3JhcHBlZCBpbnRvIGA8cD5gIHRhZ3MuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5yZW5kZXJJbmxpbmUgPSBmdW5jdGlvbiAoc3JjLCBlbnYpIHtcbiAgZW52ID0gZW52IHx8IHt9XG5cbiAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2VJbmxpbmUoc3JjLCBlbnYpLCB0aGlzLm9wdGlvbnMsIGVudilcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFya2Rvd25JdFxuIiwiLy8gbWFya2Rvd24taXQgZGVmYXVsdCBvcHRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb3B0aW9uczoge1xuICAgIC8vIEVuYWJsZSBIVE1MIHRhZ3MgaW4gc291cmNlXG4gICAgaHRtbDogZmFsc2UsXG5cbiAgICAvLyBVc2UgJy8nIHRvIGNsb3NlIHNpbmdsZSB0YWdzICg8YnIgLz4pXG4gICAgeGh0bWxPdXQ6IGZhbHNlLFxuXG4gICAgLy8gQ29udmVydCAnXFxuJyBpbiBwYXJhZ3JhcGhzIGludG8gPGJyPlxuICAgIGJyZWFrczogZmFsc2UsXG5cbiAgICAvLyBDU1MgbGFuZ3VhZ2UgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzXG4gICAgbGFuZ1ByZWZpeDogJ2xhbmd1YWdlLScsXG5cbiAgICAvLyBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0cyB0byBsaW5rc1xuICAgIGxpbmtpZnk6IGZhbHNlLFxuXG4gICAgLy8gRW5hYmxlIHNvbWUgbGFuZ3VhZ2UtbmV1dHJhbCByZXBsYWNlbWVudHMgKyBxdW90ZXMgYmVhdXRpZmljYXRpb25cbiAgICB0eXBvZ3JhcGhlcjogZmFsc2UsXG5cbiAgICAvLyBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50IHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQsXG4gICAgLy8gYW5kIHNtYXJ0cXVvdGVzIG9uLiBDb3VsZCBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYW4gQXJyYXkuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgJ8KrwrvigJ7igJwnIGZvciBSdXNzaWFuLCAn4oCe4oCc4oCa4oCYJyBmb3IgR2VybWFuLFxuICAgIC8vIGFuZCBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddIGZvciBGcmVuY2ggKGluY2x1ZGluZyBuYnNwKS5cbiAgICBxdW90ZXM6ICdcXHUyMDFjXFx1MjAxZFxcdTIwMThcXHUyMDE5JywgLyog4oCc4oCd4oCY4oCZICovXG5cbiAgICAvLyBIaWdobGlnaHRlciBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwsXG4gICAgLy8gb3IgJycgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkIGV4dGVybmFseS5cbiAgICAvLyBJZiByZXN1bHQgc3RhcnRzIHdpdGggPHByZS4uLiBpbnRlcm5hbCB3cmFwcGVyIGlzIHNraXBwZWQuXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiAoLypzdHIsIGxhbmcqLykgeyByZXR1cm4gJyc7IH1cbiAgICAvL1xuICAgIGhpZ2hsaWdodDogbnVsbCxcblxuICAgIC8vIEludGVybmFsIHByb3RlY3Rpb24sIHJlY3Vyc2lvbiBsaW1pdFxuICAgIG1heE5lc3Rpbmc6IDEwMFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBjb3JlOiB7fSxcbiAgICBibG9jazoge30sXG4gICAgaW5saW5lOiB7fVxuICB9XG59XG4iLCIvLyBcIlplcm9cIiBwcmVzZXQsIHdpdGggbm90aGluZyBlbmFibGVkLiBVc2VmdWwgZm9yIG1hbnVhbCBjb25maWd1cmluZyBvZiBzaW1wbGVcbi8vIG1vZGVzLiBGb3IgZXhhbXBsZSwgdG8gcGFyc2UgYm9sZC9pdGFsaWMgb25seS5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcHRpb25zOiB7XG4gICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICBodG1sOiBmYWxzZSxcblxuICAgIC8vIFVzZSAnLycgdG8gY2xvc2Ugc2luZ2xlIHRhZ3MgKDxiciAvPilcbiAgICB4aHRtbE91dDogZmFsc2UsXG5cbiAgICAvLyBDb252ZXJ0ICdcXG4nIGluIHBhcmFncmFwaHMgaW50byA8YnI+XG4gICAgYnJlYWtzOiBmYWxzZSxcblxuICAgIC8vIENTUyBsYW5ndWFnZSBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3NcbiAgICBsYW5nUHJlZml4OiAnbGFuZ3VhZ2UtJyxcblxuICAgIC8vIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHRzIHRvIGxpbmtzXG4gICAgbGlua2lmeTogZmFsc2UsXG5cbiAgICAvLyBFbmFibGUgc29tZSBsYW5ndWFnZS1uZXV0cmFsIHJlcGxhY2VtZW50cyArIHF1b3RlcyBiZWF1dGlmaWNhdGlvblxuICAgIHR5cG9ncmFwaGVyOiBmYWxzZSxcblxuICAgIC8vIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnQgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCxcbiAgICAvLyBhbmQgc21hcnRxdW90ZXMgb24uIENvdWxkIGJlIGVpdGhlciBhIFN0cmluZyBvciBhbiBBcnJheS5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSAnwqvCu+KAnuKAnCcgZm9yIFJ1c3NpYW4sICfigJ7igJzigJrigJgnIGZvciBHZXJtYW4sXG4gICAgLy8gYW5kIFsnwqtcXHhBMCcsICdcXHhBMMK7JywgJ+KAuVxceEEwJywgJ1xceEEw4oC6J10gZm9yIEZyZW5jaCAoaW5jbHVkaW5nIG5ic3ApLlxuICAgIHF1b3RlczogJ1xcdTIwMWNcXHUyMDFkXFx1MjAxOFxcdTIwMTknLCAvKiDigJzigJ3igJjigJkgKi9cblxuICAgIC8vIEhpZ2hsaWdodGVyIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTCxcbiAgICAvLyBvciAnJyBpZiB0aGUgc291cmNlIHN0cmluZyBpcyBub3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIGVzY2FwZWQgZXh0ZXJuYWx5LlxuICAgIC8vIElmIHJlc3VsdCBzdGFydHMgd2l0aCA8cHJlLi4uIGludGVybmFsIHdyYXBwZXIgaXMgc2tpcHBlZC5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uICgvKnN0ciwgbGFuZyovKSB7IHJldHVybiAnJzsgfVxuICAgIC8vXG4gICAgaGlnaGxpZ2h0OiBudWxsLFxuXG4gICAgLy8gSW50ZXJuYWwgcHJvdGVjdGlvbiwgcmVjdXJzaW9uIGxpbWl0XG4gICAgbWF4TmVzdGluZzogMjBcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG5cbiAgICBjb3JlOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgJ2Jsb2NrJyxcbiAgICAgICAgJ2lubGluZScsXG4gICAgICAgICd0ZXh0X2pvaW4nXG4gICAgICBdXG4gICAgfSxcblxuICAgIGJsb2NrOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAncGFyYWdyYXBoJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBpbmxpbmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICd0ZXh0J1xuICAgICAgXSxcbiAgICAgIHJ1bGVzMjogW1xuICAgICAgICAnYmFsYW5jZV9wYWlycycsXG4gICAgICAgICdmcmFnbWVudHNfam9pbidcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIENvbW1vbm1hcmsgZGVmYXVsdCBvcHRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb3B0aW9uczoge1xuICAgIC8vIEVuYWJsZSBIVE1MIHRhZ3MgaW4gc291cmNlXG4gICAgaHRtbDogdHJ1ZSxcblxuICAgIC8vIFVzZSAnLycgdG8gY2xvc2Ugc2luZ2xlIHRhZ3MgKDxiciAvPilcbiAgICB4aHRtbE91dDogdHJ1ZSxcblxuICAgIC8vIENvbnZlcnQgJ1xcbicgaW4gcGFyYWdyYXBocyBpbnRvIDxicj5cbiAgICBicmVha3M6IGZhbHNlLFxuXG4gICAgLy8gQ1NTIGxhbmd1YWdlIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrc1xuICAgIGxhbmdQcmVmaXg6ICdsYW5ndWFnZS0nLFxuXG4gICAgLy8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dHMgdG8gbGlua3NcbiAgICBsaW5raWZ5OiBmYWxzZSxcblxuICAgIC8vIEVuYWJsZSBzb21lIGxhbmd1YWdlLW5ldXRyYWwgcmVwbGFjZW1lbnRzICsgcXVvdGVzIGJlYXV0aWZpY2F0aW9uXG4gICAgdHlwb2dyYXBoZXI6IGZhbHNlLFxuXG4gICAgLy8gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudCBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkLFxuICAgIC8vIGFuZCBzbWFydHF1b3RlcyBvbi4gQ291bGQgYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGFuIEFycmF5LlxuICAgIC8vXG4gICAgLy8gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlICfCq8K74oCe4oCcJyBmb3IgUnVzc2lhbiwgJ+KAnuKAnOKAmuKAmCcgZm9yIEdlcm1hbixcbiAgICAvLyBhbmQgWyfCq1xceEEwJywgJ1xceEEwwrsnLCAn4oC5XFx4QTAnLCAnXFx4QTDigLonXSBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gICAgcXVvdGVzOiAnXFx1MjAxY1xcdTIwMWRcXHUyMDE4XFx1MjAxOScsIC8qIOKAnOKAneKAmOKAmSAqL1xuXG4gICAgLy8gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLFxuICAgIC8vIG9yICcnIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgZXNjYXBlZCBleHRlcm5hbHkuXG4gICAgLy8gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24gKC8qc3RyLCBsYW5nKi8pIHsgcmV0dXJuICcnOyB9XG4gICAgLy9cbiAgICBoaWdobGlnaHQ6IG51bGwsXG5cbiAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgICBtYXhOZXN0aW5nOiAyMFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcblxuICAgIGNvcmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAnYmxvY2snLFxuICAgICAgICAnaW5saW5lJyxcbiAgICAgICAgJ3RleHRfam9pbidcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgYmxvY2s6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdibG9ja3F1b3RlJyxcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICAnZmVuY2UnLFxuICAgICAgICAnaGVhZGluZycsXG4gICAgICAgICdocicsXG4gICAgICAgICdodG1sX2Jsb2NrJyxcbiAgICAgICAgJ2xoZWFkaW5nJyxcbiAgICAgICAgJ2xpc3QnLFxuICAgICAgICAncmVmZXJlbmNlJyxcbiAgICAgICAgJ3BhcmFncmFwaCdcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgaW5saW5lOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAnYXV0b2xpbmsnLFxuICAgICAgICAnYmFja3RpY2tzJyxcbiAgICAgICAgJ2VtcGhhc2lzJyxcbiAgICAgICAgJ2VudGl0eScsXG4gICAgICAgICdlc2NhcGUnLFxuICAgICAgICAnaHRtbF9pbmxpbmUnLFxuICAgICAgICAnaW1hZ2UnLFxuICAgICAgICAnbGluaycsXG4gICAgICAgICduZXdsaW5lJyxcbiAgICAgICAgJ3RleHQnXG4gICAgICBdLFxuICAgICAgcnVsZXMyOiBbXG4gICAgICAgICdiYWxhbmNlX3BhaXJzJyxcbiAgICAgICAgJ2VtcGhhc2lzJyxcbiAgICAgICAgJ2ZyYWdtZW50c19qb2luJ1xuICAgICAgXVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU2NoZW1hLCBNYXJrIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IE1hcmtkb3duSXQgZnJvbSAnbWFya2Rvd24taXQnO1xuXG4vKipcbkRvY3VtZW50IHNjaGVtYSBmb3IgdGhlIGRhdGEgbW9kZWwgdXNlZCBieSBDb21tb25NYXJrLlxuKi9cbmNvbnN0IHNjaGVtYSA9IG5ldyBTY2hlbWEoe1xuICAgIG5vZGVzOiB7XG4gICAgICAgIGRvYzoge1xuICAgICAgICAgICAgY29udGVudDogXCJibG9jaytcIlxuICAgICAgICB9LFxuICAgICAgICBwYXJhZ3JhcGg6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiaW5saW5lKlwiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicFwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJwXCIsIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGJsb2NrcXVvdGU6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJibG9ja3F1b3RlXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImJsb2NrcXVvdGVcIiwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgaG9yaXpvbnRhbF9ydWxlOiB7XG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoclwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJkaXZcIiwgW1wiaHJcIl1dOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRpbmc6IHtcbiAgICAgICAgICAgIGF0dHJzOiB7IGxldmVsOiB7IGRlZmF1bHQ6IDEgfSB9LFxuICAgICAgICAgICAgY29udGVudDogXCIodGV4dCB8IGltYWdlKSpcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaDFcIiwgYXR0cnM6IHsgbGV2ZWw6IDEgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImgyXCIsIGF0dHJzOiB7IGxldmVsOiAyIH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoM1wiLCBhdHRyczogeyBsZXZlbDogMyB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDRcIiwgYXR0cnM6IHsgbGV2ZWw6IDQgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImg1XCIsIGF0dHJzOiB7IGxldmVsOiA1IH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoNlwiLCBhdHRyczogeyBsZXZlbDogNiB9IH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wiaFwiICsgbm9kZS5hdHRycy5sZXZlbCwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgY29kZV9ibG9jazoge1xuICAgICAgICAgICAgY29udGVudDogXCJ0ZXh0KlwiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgICAgIG1hcmtzOiBcIlwiLFxuICAgICAgICAgICAgYXR0cnM6IHsgcGFyYW1zOiB7IGRlZmF1bHQ6IFwiXCIgfSB9LFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJwcmVcIiwgcHJlc2VydmVXaGl0ZXNwYWNlOiBcImZ1bGxcIiwgZ2V0QXR0cnM6IG5vZGUgPT4gKHsgcGFyYW1zOiBub2RlLmdldEF0dHJpYnV0ZShcImRhdGEtcGFyYW1zXCIpIHx8IFwiXCIgfSkgfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJwcmVcIiwgbm9kZS5hdHRycy5wYXJhbXMgPyB7IFwiZGF0YS1wYXJhbXNcIjogbm9kZS5hdHRycy5wYXJhbXMgfSA6IHt9LCBbXCJjb2RlXCIsIDBdXTsgfVxuICAgICAgICB9LFxuICAgICAgICBvcmRlcmVkX2xpc3Q6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIGF0dHJzOiB7IG9yZGVyOiB7IGRlZmF1bHQ6IDEgfSwgdGlnaHQ6IHsgZGVmYXVsdDogZmFsc2UgfSB9LFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJvbFwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG9yZGVyOiBkb20uaGFzQXR0cmlidXRlKFwic3RhcnRcIikgPyArZG9tLmdldEF0dHJpYnV0ZShcInN0YXJ0XCIpIDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWdodDogZG9tLmhhc0F0dHJpYnV0ZShcImRhdGEtdGlnaHRcIikgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1wib2xcIiwgeyBzdGFydDogbm9kZS5hdHRycy5vcmRlciA9PSAxID8gbnVsbCA6IG5vZGUuYXR0cnMub3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGEtdGlnaHRcIjogbm9kZS5hdHRycy50aWdodCA/IFwidHJ1ZVwiIDogbnVsbCB9LCAwXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYnVsbGV0X2xpc3Q6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIGF0dHJzOiB7IHRpZ2h0OiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwidWxcIiwgZ2V0QXR0cnM6IGRvbSA9PiAoeyB0aWdodDogZG9tLmhhc0F0dHJpYnV0ZShcImRhdGEtdGlnaHRcIikgfSkgfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJ1bFwiLCB7IFwiZGF0YS10aWdodFwiOiBub2RlLmF0dHJzLnRpZ2h0ID8gXCJ0cnVlXCIgOiBudWxsIH0sIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGxpc3RfaXRlbToge1xuICAgICAgICAgICAgY29udGVudDogXCJibG9jaytcIixcbiAgICAgICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJsaVwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJsaVwiLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICBncm91cDogXCJpbmxpbmVcIlxuICAgICAgICB9LFxuICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICBzcmM6IHt9LFxuICAgICAgICAgICAgICAgIGFsdDogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICAgICAgICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImltZ1tzcmNdXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IGRvbS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IGRvbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJpbWdcIiwgbm9kZS5hdHRyc107IH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFyZF9icmVhazoge1xuICAgICAgICAgICAgaW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYnJcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiYnJcIl07IH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWFya3M6IHtcbiAgICAgICAgZW06IHtcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaVwiIH0sIHsgdGFnOiBcImVtXCIgfSxcbiAgICAgICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtc3R5bGU9aXRhbGljXCIgfSxcbiAgICAgICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtc3R5bGU9bm9ybWFsXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcImVtXCIgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiZW1cIl07IH1cbiAgICAgICAgfSxcbiAgICAgICAgc3Ryb25nOiB7XG4gICAgICAgICAgICBwYXJzZURPTTogW1xuICAgICAgICAgICAgICAgIHsgdGFnOiBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiYlwiLCBnZXRBdHRyczogbm9kZSA9PiBub2RlLnN0eWxlLmZvbnRXZWlnaHQgIT0gXCJub3JtYWxcIiAmJiBudWxsIH0sXG4gICAgICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXdlaWdodD00MDBcIiwgY2xlYXJNYXJrOiBtID0+IG0udHlwZS5uYW1lID09IFwic3Ryb25nXCIgfSxcbiAgICAgICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtd2VpZ2h0XCIsIGdldEF0dHJzOiB2YWx1ZSA9PiAvXihib2xkKGVyKT98WzUtOV1cXGR7Mix9KSQvLnRlc3QodmFsdWUpICYmIG51bGwgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wic3Ryb25nXCJdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgaHJlZjoge30sXG4gICAgICAgICAgICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYVtocmVmXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhyZWY6IGRvbS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLCB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIH07XG4gICAgICAgICAgICAgICAgICAgIH0gfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJhXCIsIG5vZGUuYXR0cnNdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGU6IHtcbiAgICAgICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImNvZGVcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiY29kZVwiXTsgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8vIEB0cy1pZ25vcmVcbmZ1bmN0aW9uIG1heWJlTWVyZ2UoYSwgYikge1xuICAgIGlmIChhLmlzVGV4dCAmJiBiLmlzVGV4dCAmJiBNYXJrLnNhbWVTZXQoYS5tYXJrcywgYi5tYXJrcykpXG4gICAgICAgIHJldHVybiBhLndpdGhUZXh0KGEudGV4dCArIGIudGV4dCk7XG59XG4vLyBPYmplY3QgdXNlZCB0byB0cmFjayB0aGUgY29udGV4dCBvZiBhIHJ1bm5pbmcgcGFyc2UuXG5jbGFzcyBNYXJrZG93blBhcnNlU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgdG9rZW5IYW5kbGVycykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy50b2tlbkhhbmRsZXJzID0gdG9rZW5IYW5kbGVycztcbiAgICAgICAgdGhpcy5zdGFjayA9IFt7IHR5cGU6IHNjaGVtYS50b3BOb2RlVHlwZSwgYXR0cnM6IG51bGwsIGNvbnRlbnQ6IFtdLCBtYXJrczogTWFyay5ub25lIH1dO1xuICAgIH1cbiAgICB0b3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIHB1c2goZWx0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YWNrLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMudG9wKCkuY29udGVudC5wdXNoKGVsdCk7XG4gICAgfVxuICAgIC8vIEFkZHMgdGhlIGdpdmVuIHRleHQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LFxuICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IG1hcmtzIGFzIHN0eWxpbmcuXG4gICAgYWRkVGV4dCh0ZXh0KSB7XG4gICAgICAgIGlmICghdGV4dClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wKCksIG5vZGVzID0gdG9wLmNvbnRlbnQsIGxhc3QgPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnNjaGVtYS50ZXh0KHRleHQsIHRvcC5tYXJrcyksIG1lcmdlZDtcbiAgICAgICAgaWYgKGxhc3QgJiYgKG1lcmdlZCA9IG1heWJlTWVyZ2UobGFzdCwgbm9kZSkpKVxuICAgICAgICAgICAgbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0gPSBtZXJnZWQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIC8vIEFkZHMgdGhlIGdpdmVuIG1hcmsgdG8gdGhlIHNldCBvZiBhY3RpdmUgbWFya3MuXG4gICAgb3Blbk1hcmsobWFyaykge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKTtcbiAgICAgICAgdG9wLm1hcmtzID0gbWFyay5hZGRUb1NldCh0b3AubWFya3MpO1xuICAgIH1cbiAgICAvLyBSZW1vdmVzIHRoZSBnaXZlbiBtYXJrIGZyb20gdGhlIHNldCBvZiBhY3RpdmUgbWFya3MuXG4gICAgY2xvc2VNYXJrKG1hcmspIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wKCk7XG4gICAgICAgIHRvcC5tYXJrcyA9IG1hcmsucmVtb3ZlRnJvbVNldCh0b3AubWFya3MpO1xuICAgIH1cbiAgICBwYXJzZVRva2Vucyh0b2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHRvayA9IHRva3NbaV07XG4gICAgICAgICAgICBsZXQgaGFuZGxlciA9IHRoaXMudG9rZW5IYW5kbGVyc1t0b2sudHlwZV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gdHlwZSBgXCIgKyB0b2sudHlwZSArIFwiYCBub3Qgc3VwcG9ydGVkIGJ5IE1hcmtkb3duIHBhcnNlclwiKTtcbiAgICAgICAgICAgIGhhbmRsZXIodGhpcywgdG9rLCB0b2tzLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgYSBub2RlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgIGFkZE5vZGUodHlwZSwgYXR0cnMsIGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wKCk7XG4gICAgICAgIGxldCBub2RlID0gdHlwZS5jcmVhdGVBbmRGaWxsKGF0dHJzLCBjb250ZW50LCB0b3AgPyB0b3AubWFya3MgOiBbXSk7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzLnB1c2gobm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICAvLyBXcmFwIHN1YnNlcXVlbnQgY29udGVudCBpbiBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUuXG4gICAgb3Blbk5vZGUodHlwZSwgYXR0cnMpIHtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgdHlwZTogdHlwZSwgYXR0cnM6IGF0dHJzLCBjb250ZW50OiBbXSwgbWFya3M6IE1hcmsubm9uZSB9KTtcbiAgICB9XG4gICAgLy8gQ2xvc2UgYW5kIHJldHVybiB0aGUgbm9kZSB0aGF0IGlzIGN1cnJlbnRseSBvbiB0b3Agb2YgdGhlIHN0YWNrLlxuICAgIGNsb3NlTm9kZSgpIHtcbiAgICAgICAgbGV0IGluZm8gPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGROb2RlKGluZm8udHlwZSwgaW5mby5hdHRycywgaW5mby5jb250ZW50KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhdHRycyhzcGVjLCB0b2tlbiwgdG9rZW5zLCBpKSB7XG4gICAgaWYgKHNwZWMuZ2V0QXR0cnMpXG4gICAgICAgIHJldHVybiBzcGVjLmdldEF0dHJzKHRva2VuLCB0b2tlbnMsIGkpO1xuICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aGVuIGBhdHRyc2AgaXMgYSBGdW5jdGlvblxuICAgIGVsc2UgaWYgKHNwZWMuYXR0cnMgaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgICAgcmV0dXJuIHNwZWMuYXR0cnModG9rZW4pO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHNwZWMuYXR0cnM7XG59XG4vLyBDb2RlIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgdG9rZW4gd2l0aCBhIGBjb250ZW50YFxuLy8gcHJvcGVydHkgaW4gTWFya2Rvd24taXQuXG5mdW5jdGlvbiBub0Nsb3NlVG9rZW4oc3BlYywgdHlwZSkge1xuICAgIHJldHVybiBzcGVjLm5vQ2xvc2VUb2tlbiB8fCB0eXBlID09IFwiY29kZV9pbmxpbmVcIiB8fCB0eXBlID09IFwiY29kZV9ibG9ja1wiIHx8IHR5cGUgPT0gXCJmZW5jZVwiO1xufVxuZnVuY3Rpb24gd2l0aG91dFRyYWlsaW5nTmV3bGluZShzdHIpIHtcbiAgICByZXR1cm4gc3RyW3N0ci5sZW5ndGggLSAxXSA9PSBcIlxcblwiID8gc3RyLnNsaWNlKDAsIHN0ci5sZW5ndGggLSAxKSA6IHN0cjtcbn1cbmZ1bmN0aW9uIG5vT3AoKSB7IH1cbmZ1bmN0aW9uIHRva2VuSGFuZGxlcnMoc2NoZW1hLCB0b2tlbnMpIHtcbiAgICBsZXQgaGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHR5cGUgaW4gdG9rZW5zKSB7XG4gICAgICAgIGxldCBzcGVjID0gdG9rZW5zW3R5cGVdO1xuICAgICAgICBpZiAoc3BlYy5ibG9jaykge1xuICAgICAgICAgICAgbGV0IG5vZGVUeXBlID0gc2NoZW1hLm5vZGVUeXBlKHNwZWMuYmxvY2spO1xuICAgICAgICAgICAgaWYgKG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5vcGVuTm9kZShub2RlVHlwZSwgYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuYWRkVGV4dCh3aXRob3V0VHJhaWxpbmdOZXdsaW5lKHRvay5jb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNsb3NlTm9kZSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfb3BlblwiXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHN0YXRlLm9wZW5Ob2RlKG5vZGVUeXBlLCBhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9jbG9zZVwiXSA9IHN0YXRlID0+IHN0YXRlLmNsb3NlTm9kZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwZWMubm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVUeXBlID0gc2NoZW1hLm5vZGVUeXBlKHNwZWMubm9kZSk7XG4gICAgICAgICAgICBoYW5kbGVyc1t0eXBlXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHN0YXRlLmFkZE5vZGUobm9kZVR5cGUsIGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BlYy5tYXJrKSB7XG4gICAgICAgICAgICBsZXQgbWFya1R5cGUgPSBzY2hlbWEubWFya3Nbc3BlYy5tYXJrXTtcbiAgICAgICAgICAgIGlmIChub0Nsb3NlVG9rZW4oc3BlYywgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUub3Blbk1hcmsobWFya1R5cGUuY3JlYXRlKGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRUZXh0KHdpdGhvdXRUcmFpbGluZ05ld2xpbmUodG9rLmNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2xvc2VNYXJrKG1hcmtUeXBlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX29wZW5cIl0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiBzdGF0ZS5vcGVuTWFyayhtYXJrVHlwZS5jcmVhdGUoYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX2Nsb3NlXCJdID0gc3RhdGUgPT4gc3RhdGUuY2xvc2VNYXJrKG1hcmtUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGVjLmlnbm9yZSkge1xuICAgICAgICAgICAgaWYgKG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gbm9PcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9vcGVuXCJdID0gbm9PcDtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfY2xvc2VcIl0gPSBub09wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVbnJlY29nbml6ZWQgcGFyc2luZyBzcGVjIFwiICsgSlNPTi5zdHJpbmdpZnkoc3BlYykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZXJzLnRleHQgPSAoc3RhdGUsIHRvaykgPT4gc3RhdGUuYWRkVGV4dCh0b2suY29udGVudCk7XG4gICAgaGFuZGxlcnMuaW5saW5lID0gKHN0YXRlLCB0b2spID0+IHN0YXRlLnBhcnNlVG9rZW5zKHRvay5jaGlsZHJlbik7XG4gICAgaGFuZGxlcnMuc29mdGJyZWFrID0gaGFuZGxlcnMuc29mdGJyZWFrIHx8IChzdGF0ZSA9PiBzdGF0ZS5hZGRUZXh0KFwiIFwiKSk7XG4gICAgcmV0dXJuIGhhbmRsZXJzO1xufVxuLyoqXG5BIGNvbmZpZ3VyYXRpb24gb2YgYSBNYXJrZG93biBwYXJzZXIuIFN1Y2ggYSBwYXJzZXIgdXNlc1xuW21hcmtkb3duLWl0XShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQpIHRvXG50b2tlbml6ZSBhIGZpbGUsIGFuZCB0aGVuIHJ1bnMgdGhlIGN1c3RvbSBydWxlcyBpdCBpcyBnaXZlbiBvdmVyXG50aGUgdG9rZW5zIHRvIGNyZWF0ZSBhIFByb3NlTWlycm9yIGRvY3VtZW50IHRyZWUuXG4qL1xuY2xhc3MgTWFya2Rvd25QYXJzZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBhcnNlciB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZVxuICAgIHRoZSBtYXJrZG93bi1pdCBwYXJzZXIgdG8gcGFyc2UgdGhlIGRpYWxlY3QgeW91IHdhbnQsIGFuZCBwcm92aWRlXG4gICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgUHJvc2VNaXJyb3IgZW50aXRpZXMgdGhvc2UgdG9rZW5zIG1hcCB0byBpblxuICAgIHRoZSBgdG9rZW5zYCBvYmplY3QsIHdoaWNoIG1hcHMgdG9rZW4gbmFtZXMgdG8gZGVzY3JpcHRpb25zIG9mXG4gICAgd2hhdCB0byBkbyB3aXRoIHRoZW0uIFN1Y2ggYSBkZXNjcmlwdGlvbiBpcyBhbiBvYmplY3QsIGFuZCBtYXlcbiAgICBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwYXJzZXIncyBkb2N1bWVudCBzY2hlbWEuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoaXMgcGFyc2VyJ3MgbWFya2Rvd24taXQgdG9rZW5pemVyLlxuICAgICovXG4gICAgdG9rZW5pemVyLCBcbiAgICAvKipcbiAgICBUaGUgdmFsdWUgb2YgdGhlIGB0b2tlbnNgIG9iamVjdCB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzXG4gICAgcGFyc2VyLiBDYW4gYmUgdXNlZnVsIHRvIGNvcHkgYW5kIG1vZGlmeSB0byBiYXNlIG90aGVyIHBhcnNlcnNcbiAgICBvbi5cbiAgICAqL1xuICAgIHRva2Vucykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIgPSB0b2tlbml6ZXI7XG4gICAgICAgIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuICAgICAgICB0aGlzLnRva2VuSGFuZGxlcnMgPSB0b2tlbkhhbmRsZXJzKHNjaGVtYSwgdG9rZW5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBzdHJpbmcgYXMgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pIG1hcmt1cCxcbiAgICBhbmQgY3JlYXRlIGEgUHJvc2VNaXJyb3IgZG9jdW1lbnQgYXMgcHJlc2NyaWJlZCBieSB0aGlzIHBhcnNlcidzXG4gICAgcnVsZXMuXG4gICAgXG4gICAgVGhlIHNlY29uZCBhcmd1bWVudCwgd2hlbiBnaXZlbiwgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlXG4gICAgW01hcmtkb3duXG4gICAgcGFyc2VyXShodHRwczovL21hcmtkb3duLWl0LmdpdGh1Yi5pby9tYXJrZG93bi1pdC8jTWFya2Rvd25JdC5wYXJzZSkuXG4gICAgKi9cbiAgICBwYXJzZSh0ZXh0LCBtYXJrZG93bkVudiA9IHt9KSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IG5ldyBNYXJrZG93blBhcnNlU3RhdGUodGhpcy5zY2hlbWEsIHRoaXMudG9rZW5IYW5kbGVycyksIGRvYztcbiAgICAgICAgc3RhdGUucGFyc2VUb2tlbnModGhpcy50b2tlbml6ZXIucGFyc2UodGV4dCwgbWFya2Rvd25FbnYpKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgZG9jID0gc3RhdGUuY2xvc2VOb2RlKCk7XG4gICAgICAgIH0gd2hpbGUgKHN0YXRlLnN0YWNrLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBkb2MgfHwgdGhpcy5zY2hlbWEudG9wTm9kZVR5cGUuY3JlYXRlQW5kRmlsbCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpc3RJc1RpZ2h0KHRva2VucywgaSkge1xuICAgIHdoaWxlICgrK2kgPCB0b2tlbnMubGVuZ3RoKVxuICAgICAgICBpZiAodG9rZW5zW2ldLnR5cGUgIT0gXCJsaXN0X2l0ZW1fb3BlblwiKVxuICAgICAgICAgICAgcmV0dXJuIHRva2Vuc1tpXS5oaWRkZW47XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG5BIHBhcnNlciBwYXJzaW5nIHVuZXh0ZW5kZWQgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pLFxud2l0aG91dCBpbmxpbmUgSFRNTCwgYW5kIHByb2R1Y2luZyBhIGRvY3VtZW50IGluIHRoZSBiYXNpYyBzY2hlbWEuXG4qL1xuY29uc3QgZGVmYXVsdE1hcmtkb3duUGFyc2VyID0gbmV3IE1hcmtkb3duUGFyc2VyKHNjaGVtYSwgTWFya2Rvd25JdChcImNvbW1vbm1hcmtcIiwgeyBodG1sOiBmYWxzZSB9KSwge1xuICAgIGJsb2NrcXVvdGU6IHsgYmxvY2s6IFwiYmxvY2txdW90ZVwiIH0sXG4gICAgcGFyYWdyYXBoOiB7IGJsb2NrOiBcInBhcmFncmFwaFwiIH0sXG4gICAgbGlzdF9pdGVtOiB7IGJsb2NrOiBcImxpc3RfaXRlbVwiIH0sXG4gICAgYnVsbGV0X2xpc3Q6IHsgYmxvY2s6IFwiYnVsbGV0X2xpc3RcIiwgZ2V0QXR0cnM6IChfLCB0b2tlbnMsIGkpID0+ICh7IHRpZ2h0OiBsaXN0SXNUaWdodCh0b2tlbnMsIGkpIH0pIH0sXG4gICAgb3JkZXJlZF9saXN0OiB7IGJsb2NrOiBcIm9yZGVyZWRfbGlzdFwiLCBnZXRBdHRyczogKHRvaywgdG9rZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgb3JkZXI6ICt0b2suYXR0ckdldChcInN0YXJ0XCIpIHx8IDEsXG4gICAgICAgICAgICB0aWdodDogbGlzdElzVGlnaHQodG9rZW5zLCBpKVxuICAgICAgICB9KSB9LFxuICAgIGhlYWRpbmc6IHsgYmxvY2s6IFwiaGVhZGluZ1wiLCBnZXRBdHRyczogdG9rID0+ICh7IGxldmVsOiArdG9rLnRhZy5zbGljZSgxKSB9KSB9LFxuICAgIGNvZGVfYmxvY2s6IHsgYmxvY2s6IFwiY29kZV9ibG9ja1wiLCBub0Nsb3NlVG9rZW46IHRydWUgfSxcbiAgICBmZW5jZTogeyBibG9jazogXCJjb2RlX2Jsb2NrXCIsIGdldEF0dHJzOiB0b2sgPT4gKHsgcGFyYW1zOiB0b2suaW5mbyB8fCBcIlwiIH0pLCBub0Nsb3NlVG9rZW46IHRydWUgfSxcbiAgICBocjogeyBub2RlOiBcImhvcml6b250YWxfcnVsZVwiIH0sXG4gICAgaW1hZ2U6IHsgbm9kZTogXCJpbWFnZVwiLCBnZXRBdHRyczogdG9rID0+ICh7XG4gICAgICAgICAgICBzcmM6IHRvay5hdHRyR2V0KFwic3JjXCIpLFxuICAgICAgICAgICAgdGl0bGU6IHRvay5hdHRyR2V0KFwidGl0bGVcIikgfHwgbnVsbCxcbiAgICAgICAgICAgIGFsdDogdG9rLmNoaWxkcmVuWzBdICYmIHRvay5jaGlsZHJlblswXS5jb250ZW50IHx8IG51bGxcbiAgICAgICAgfSkgfSxcbiAgICBoYXJkYnJlYWs6IHsgbm9kZTogXCJoYXJkX2JyZWFrXCIgfSxcbiAgICBlbTogeyBtYXJrOiBcImVtXCIgfSxcbiAgICBzdHJvbmc6IHsgbWFyazogXCJzdHJvbmdcIiB9LFxuICAgIGxpbms6IHsgbWFyazogXCJsaW5rXCIsIGdldEF0dHJzOiB0b2sgPT4gKHtcbiAgICAgICAgICAgIGhyZWY6IHRvay5hdHRyR2V0KFwiaHJlZlwiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0b2suYXR0ckdldChcInRpdGxlXCIpIHx8IG51bGxcbiAgICAgICAgfSkgfSxcbiAgICBjb2RlX2lubGluZTogeyBtYXJrOiBcImNvZGVcIiwgbm9DbG9zZVRva2VuOiB0cnVlIH1cbn0pO1xuXG5jb25zdCBibGFua01hcmsgPSB7IG9wZW46IFwiXCIsIGNsb3NlOiBcIlwiLCBtaXhhYmxlOiB0cnVlIH07XG4vKipcbkEgc3BlY2lmaWNhdGlvbiBmb3Igc2VyaWFsaXppbmcgYSBQcm9zZU1pcnJvciBkb2N1bWVudCBhc1xuTWFya2Rvd24vQ29tbW9uTWFyayB0ZXh0LlxuKi9cbmNsYXNzIE1hcmtkb3duU2VyaWFsaXplciB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgc2VyaWFsaXplciB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiBUaGUgYG5vZGVzYFxuICAgIG9iamVjdCBzaG91bGQgbWFwIG5vZGUgbmFtZXMgaW4gYSBnaXZlbiBzY2hlbWEgdG8gZnVuY3Rpb24gdGhhdFxuICAgIHRha2UgYSBzZXJpYWxpemVyIHN0YXRlIGFuZCBzdWNoIGEgbm9kZSwgYW5kIHNlcmlhbGl6ZSB0aGUgbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBub2RlIHNlcmlhbGl6ZXIgZnVuY3Rpb25zIGZvciB0aGlzIHNlcmlhbGl6ZXIuXG4gICAgKi9cbiAgICBub2RlcywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgc2VyaWFsaXplciBpbmZvLlxuICAgICovXG4gICAgbWFya3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBub2RlIHRvXG4gICAgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZy8pLlxuICAgICovXG4gICAgc2VyaWFsaXplKGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgbGV0IHN0YXRlID0gbmV3IE1hcmtkb3duU2VyaWFsaXplclN0YXRlKHRoaXMubm9kZXMsIHRoaXMubWFya3MsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5yZW5kZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gc3RhdGUub3V0O1xuICAgIH1cbn1cbi8qKlxuQSBzZXJpYWxpemVyIGZvciB0aGUgW2Jhc2ljIHNjaGVtYV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYSkuXG4qL1xuY29uc3QgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplciA9IG5ldyBNYXJrZG93blNlcmlhbGl6ZXIoe1xuICAgIGJsb2NrcXVvdGUoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUud3JhcEJsb2NrKFwiPiBcIiwgbnVsbCwgbm9kZSwgKCkgPT4gc3RhdGUucmVuZGVyQ29udGVudChub2RlKSk7XG4gICAgfSxcbiAgICBjb2RlX2Jsb2NrKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZnJvbnQgbWF0dGVyIGZlbmNlcyBhcmUgbG9uZ2VyIHRoYW4gYW55IGRhc2ggc2VxdWVuY2Ugd2l0aGluIGl0XG4gICAgICAgIGNvbnN0IGJhY2t0aWNrcyA9IG5vZGUudGV4dENvbnRlbnQubWF0Y2goL2B7Myx9L2dtKTtcbiAgICAgICAgY29uc3QgZmVuY2UgPSBiYWNrdGlja3MgPyAoYmFja3RpY2tzLnNvcnQoKS5zbGljZSgtMSlbMF0gKyBcImBcIikgOiBcImBgYFwiO1xuICAgICAgICBzdGF0ZS53cml0ZShmZW5jZSArIChub2RlLmF0dHJzLnBhcmFtcyB8fCBcIlwiKSArIFwiXFxuXCIpO1xuICAgICAgICBzdGF0ZS50ZXh0KG5vZGUudGV4dENvbnRlbnQsIGZhbHNlKTtcbiAgICAgICAgLy8gQWRkIGEgbmV3bGluZSB0byB0aGUgY3VycmVudCBjb250ZW50IGJlZm9yZSBhZGRpbmcgY2xvc2luZyBtYXJrZXJcbiAgICAgICAgc3RhdGUud3JpdGUoXCJcXG5cIik7XG4gICAgICAgIHN0YXRlLndyaXRlKGZlbmNlKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGhlYWRpbmcoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUud3JpdGUoc3RhdGUucmVwZWF0KFwiI1wiLCBub2RlLmF0dHJzLmxldmVsKSArIFwiIFwiKTtcbiAgICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGhvcml6b250YWxfcnVsZShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cml0ZShub2RlLmF0dHJzLm1hcmt1cCB8fCBcIi0tLVwiKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGJ1bGxldF9saXN0KHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLnJlbmRlckxpc3Qobm9kZSwgXCIgIFwiLCAoKSA9PiAobm9kZS5hdHRycy5idWxsZXQgfHwgXCIqXCIpICsgXCIgXCIpO1xuICAgIH0sXG4gICAgb3JkZXJlZF9saXN0KHN0YXRlLCBub2RlKSB7XG4gICAgICAgIGxldCBzdGFydCA9IG5vZGUuYXR0cnMub3JkZXIgfHwgMTtcbiAgICAgICAgbGV0IG1heFcgPSBTdHJpbmcoc3RhcnQgKyBub2RlLmNoaWxkQ291bnQgLSAxKS5sZW5ndGg7XG4gICAgICAgIGxldCBzcGFjZSA9IHN0YXRlLnJlcGVhdChcIiBcIiwgbWF4VyArIDIpO1xuICAgICAgICBzdGF0ZS5yZW5kZXJMaXN0KG5vZGUsIHNwYWNlLCBpID0+IHtcbiAgICAgICAgICAgIGxldCBuU3RyID0gU3RyaW5nKHN0YXJ0ICsgaSk7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucmVwZWF0KFwiIFwiLCBtYXhXIC0gblN0ci5sZW5ndGgpICsgblN0ciArIFwiLiBcIjtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBsaXN0X2l0ZW0oc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUucmVuZGVyQ29udGVudChub2RlKTtcbiAgICB9LFxuICAgIHBhcmFncmFwaChzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBpbWFnZShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cml0ZShcIiFbXCIgKyBzdGF0ZS5lc2Mobm9kZS5hdHRycy5hbHQgfHwgXCJcIikgKyBcIl0oXCIgKyBub2RlLmF0dHJzLnNyYy5yZXBsYWNlKC9bXFwoXFwpXS9nLCBcIlxcXFwkJlwiKSArXG4gICAgICAgICAgICAobm9kZS5hdHRycy50aXRsZSA/ICcgXCInICsgbm9kZS5hdHRycy50aXRsZS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykgKyAnXCInIDogXCJcIikgKyBcIilcIik7XG4gICAgfSxcbiAgICBoYXJkX2JyZWFrKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBpbmRleCArIDE7IGkgPCBwYXJlbnQuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICAgICAgaWYgKHBhcmVudC5jaGlsZChpKS50eXBlICE9IG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLndyaXRlKFwiXFxcXFxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgfSxcbiAgICB0ZXh0KHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLnRleHQobm9kZS50ZXh0LCAhc3RhdGUuaW5BdXRvbGluayk7XG4gICAgfVxufSwge1xuICAgIGVtOiB7IG9wZW46IFwiKlwiLCBjbG9zZTogXCIqXCIsIG1peGFibGU6IHRydWUsIGV4cGVsRW5jbG9zaW5nV2hpdGVzcGFjZTogdHJ1ZSB9LFxuICAgIHN0cm9uZzogeyBvcGVuOiBcIioqXCIsIGNsb3NlOiBcIioqXCIsIG1peGFibGU6IHRydWUsIGV4cGVsRW5jbG9zaW5nV2hpdGVzcGFjZTogdHJ1ZSB9LFxuICAgIGxpbms6IHtcbiAgICAgICAgb3BlbihzdGF0ZSwgbWFyaywgcGFyZW50LCBpbmRleCkge1xuICAgICAgICAgICAgc3RhdGUuaW5BdXRvbGluayA9IGlzUGxhaW5VUkwobWFyaywgcGFyZW50LCBpbmRleCk7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuaW5BdXRvbGluayA/IFwiPFwiIDogXCJbXCI7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlKHN0YXRlLCBtYXJrLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgICAgICBsZXQgeyBpbkF1dG9saW5rIH0gPSBzdGF0ZTtcbiAgICAgICAgICAgIHN0YXRlLmluQXV0b2xpbmsgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gaW5BdXRvbGluayA/IFwiPlwiXG4gICAgICAgICAgICAgICAgOiBcIl0oXCIgKyBtYXJrLmF0dHJzLmhyZWYucmVwbGFjZSgvW1xcKFxcKVwiXS9nLCBcIlxcXFwkJlwiKSArIChtYXJrLmF0dHJzLnRpdGxlID8gYCBcIiR7bWFyay5hdHRycy50aXRsZS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyl9XCJgIDogXCJcIikgKyBcIilcIjtcbiAgICAgICAgfSxcbiAgICAgICAgbWl4YWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgY29kZTogeyBvcGVuKF9zdGF0ZSwgX21hcmssIHBhcmVudCwgaW5kZXgpIHsgcmV0dXJuIGJhY2t0aWNrc0ZvcihwYXJlbnQuY2hpbGQoaW5kZXgpLCAtMSk7IH0sXG4gICAgICAgIGNsb3NlKF9zdGF0ZSwgX21hcmssIHBhcmVudCwgaW5kZXgpIHsgcmV0dXJuIGJhY2t0aWNrc0ZvcihwYXJlbnQuY2hpbGQoaW5kZXggLSAxKSwgMSk7IH0sXG4gICAgICAgIGVzY2FwZTogZmFsc2UgfVxufSk7XG5mdW5jdGlvbiBiYWNrdGlja3NGb3Iobm9kZSwgc2lkZSkge1xuICAgIGxldCB0aWNrcyA9IC9gKy9nLCBtLCBsZW4gPSAwO1xuICAgIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgd2hpbGUgKG0gPSB0aWNrcy5leGVjKG5vZGUudGV4dCkpXG4gICAgICAgICAgICBsZW4gPSBNYXRoLm1heChsZW4sIG1bMF0ubGVuZ3RoKTtcbiAgICBsZXQgcmVzdWx0ID0gbGVuID4gMCAmJiBzaWRlID4gMCA/IFwiIGBcIiA6IFwiYFwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIHJlc3VsdCArPSBcImBcIjtcbiAgICBpZiAobGVuID4gMCAmJiBzaWRlIDwgMClcbiAgICAgICAgcmVzdWx0ICs9IFwiIFwiO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBpc1BsYWluVVJMKGxpbmssIHBhcmVudCwgaW5kZXgpIHtcbiAgICBpZiAobGluay5hdHRycy50aXRsZSB8fCAhL15cXHcrOi8udGVzdChsaW5rLmF0dHJzLmhyZWYpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGNvbnRlbnQgPSBwYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgIGlmICghY29udGVudC5pc1RleHQgfHwgY29udGVudC50ZXh0ICE9IGxpbmsuYXR0cnMuaHJlZiB8fCBjb250ZW50Lm1hcmtzW2NvbnRlbnQubWFya3MubGVuZ3RoIC0gMV0gIT0gbGluaylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudCAtIDEgfHwgIWxpbmsuaXNJblNldChwYXJlbnQuY2hpbGQoaW5kZXggKyAxKS5tYXJrcyk7XG59XG4vKipcblRoaXMgaXMgYW4gb2JqZWN0IHVzZWQgdG8gdHJhY2sgc3RhdGUgYW5kIGV4cG9zZVxubWV0aG9kcyByZWxhdGVkIHRvIG1hcmtkb3duIHNlcmlhbGl6YXRpb24uIEluc3RhbmNlcyBhcmUgcGFzc2VkIHRvXG5ub2RlIGFuZCBtYXJrIHNlcmlhbGl6YXRpb24gbWV0aG9kcyAoc2VlIGB0b01hcmtkb3duYCkuXG4qL1xuY2xhc3MgTWFya2Rvd25TZXJpYWxpemVyU3RhdGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBub2RlcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXJrcywgXG4gICAgLyoqXG4gICAgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBzZXJpYWxpemVyLlxuICAgICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGltID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm91dCA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbG9zZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaW5BdXRvbGluayA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuaW5UaWdodExpc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudGlnaHRMaXN0cyA9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpZ2h0TGlzdHMgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuaGFyZEJyZWFrTm9kZU5hbWUgPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oYXJkQnJlYWtOb2RlTmFtZSA9IFwiaGFyZF9icmVha1wiO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZsdXNoQ2xvc2Uoc2l6ZSA9IDIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRCbGFuaygpKVxuICAgICAgICAgICAgICAgIHRoaXMub3V0ICs9IFwiXFxuXCI7XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVsaW1NaW4gPSB0aGlzLmRlbGltO1xuICAgICAgICAgICAgICAgIGxldCB0cmltID0gL1xccyskLy5leGVjKGRlbGltTWluKTtcbiAgICAgICAgICAgICAgICBpZiAodHJpbSlcbiAgICAgICAgICAgICAgICAgICAgZGVsaW1NaW4gPSBkZWxpbU1pbi5zbGljZSgwLCBkZWxpbU1pbi5sZW5ndGggLSB0cmltWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzaXplOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ICs9IGRlbGltTWluICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldE1hcmsobmFtZSkge1xuICAgICAgICBsZXQgaW5mbyA9IHRoaXMubWFya3NbbmFtZV07XG4gICAgICAgIGlmICghaW5mbykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWFyayB0eXBlIFxcYCR7bmFtZX1cXGAgbm90IHN1cHBvcnRlZCBieSBNYXJrZG93biByZW5kZXJlcmApO1xuICAgICAgICAgICAgaW5mbyA9IGJsYW5rTWFyaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mbztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIGEgYmxvY2ssIHByZWZpeGluZyBlYWNoIGxpbmUgd2l0aCBgZGVsaW1gLCBhbmQgdGhlIGZpcnN0XG4gICAgbGluZSBpbiBgZmlyc3REZWxpbWAuIGBub2RlYCBzaG91bGQgYmUgdGhlIG5vZGUgdGhhdCBpcyBjbG9zZWQgYXRcbiAgICB0aGUgZW5kIG9mIHRoZSBibG9jaywgYW5kIGBmYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmVuZGVycyB0aGVcbiAgICBjb250ZW50IG9mIHRoZSBibG9jay5cbiAgICAqL1xuICAgIHdyYXBCbG9jayhkZWxpbSwgZmlyc3REZWxpbSwgbm9kZSwgZikge1xuICAgICAgICBsZXQgb2xkID0gdGhpcy5kZWxpbTtcbiAgICAgICAgdGhpcy53cml0ZShmaXJzdERlbGltICE9IG51bGwgPyBmaXJzdERlbGltIDogZGVsaW0pO1xuICAgICAgICB0aGlzLmRlbGltICs9IGRlbGltO1xuICAgICAgICBmKCk7XG4gICAgICAgIHRoaXMuZGVsaW0gPSBvbGQ7XG4gICAgICAgIHRoaXMuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhdEJsYW5rKCkge1xuICAgICAgICByZXR1cm4gLyhefFxcbikkLy50ZXN0KHRoaXMub3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRW5zdXJlIHRoZSBjdXJyZW50IGNvbnRlbnQgZW5kcyB3aXRoIGEgbmV3bGluZS5cbiAgICAqL1xuICAgIGVuc3VyZU5ld0xpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hdEJsYW5rKCkpXG4gICAgICAgICAgICB0aGlzLm91dCArPSBcIlxcblwiO1xuICAgIH1cbiAgICAvKipcbiAgICBQcmVwYXJlIHRoZSBzdGF0ZSBmb3Igd3JpdGluZyBvdXRwdXQgKGNsb3NpbmcgY2xvc2VkIHBhcmFncmFwaHMsXG4gICAgYWRkaW5nIGRlbGltaXRlcnMsIGFuZCBzbyBvbiksIGFuZCB0aGVuIG9wdGlvbmFsbHkgYWRkIGNvbnRlbnRcbiAgICAodW5lc2NhcGVkKSB0byB0aGUgb3V0cHV0LlxuICAgICovXG4gICAgd3JpdGUoY29udGVudCkge1xuICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoKTtcbiAgICAgICAgaWYgKHRoaXMuZGVsaW0gJiYgdGhpcy5hdEJsYW5rKCkpXG4gICAgICAgICAgICB0aGlzLm91dCArPSB0aGlzLmRlbGltO1xuICAgICAgICBpZiAoY29udGVudClcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IGNvbnRlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENsb3NlIHRoZSBibG9jayBmb3IgdGhlIGdpdmVuIG5vZGUuXG4gICAgKi9cbiAgICBjbG9zZUJsb2NrKG5vZGUpIHtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgdGhlIGdpdmVuIHRleHQgdG8gdGhlIGRvY3VtZW50LiBXaGVuIGVzY2FwZSBpcyBub3QgYGZhbHNlYCxcbiAgICBpdCB3aWxsIGJlIGVzY2FwZWQuXG4gICAgKi9cbiAgICB0ZXh0KHRleHQsIGVzY2FwZSA9IHRydWUpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gdGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy53cml0ZSgpO1xuICAgICAgICAgICAgLy8gRXNjYXBlIGV4Y2xhbWF0aW9uIG1hcmtzIGluIGZyb250IG9mIGxpbmtzXG4gICAgICAgICAgICBpZiAoIWVzY2FwZSAmJiBsaW5lc1tpXVswXSA9PSBcIltcIiAmJiAvKF58W15cXFxcXSlcXCEkLy50ZXN0KHRoaXMub3V0KSlcbiAgICAgICAgICAgICAgICB0aGlzLm91dCA9IHRoaXMub3V0LnNsaWNlKDAsIHRoaXMub3V0Lmxlbmd0aCAtIDEpICsgXCJcXFxcIVwiO1xuICAgICAgICAgICAgdGhpcy5vdXQgKz0gZXNjYXBlID8gdGhpcy5lc2MobGluZXNbaV0sIHRoaXMuYXRCbG9ja1N0YXJ0KSA6IGxpbmVzW2ldO1xuICAgICAgICAgICAgaWYgKGkgIT0gbGluZXMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLm91dCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbmRlciB0aGUgZ2l2ZW4gbm9kZSBhcyBhIGJsb2NrLlxuICAgICovXG4gICAgcmVuZGVyKG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVzW25vZGUudHlwZS5uYW1lXSh0aGlzLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaWN0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuIHR5cGUgYFwiICsgbm9kZS50eXBlLm5hbWUgKyBcImAgbm90IHN1cHBvcnRlZCBieSBNYXJrZG93biByZW5kZXJlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFub2RlLnR5cGUuaXNMZWFmKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ29udGVudChub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pc0Jsb2NrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIHRoZSBjb250ZW50cyBvZiBgcGFyZW50YCBhcyBibG9jayBub2Rlcy5cbiAgICAqL1xuICAgIHJlbmRlckNvbnRlbnQocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5mb3JFYWNoKChub2RlLCBfLCBpKSA9PiB0aGlzLnJlbmRlcihub2RlLCBwYXJlbnQsIGkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIHRoZSBjb250ZW50cyBvZiBgcGFyZW50YCBhcyBpbmxpbmUgY29udGVudC5cbiAgICAqL1xuICAgIHJlbmRlcklubGluZShwYXJlbnQsIGZyb21CbG9ja1N0YXJ0ID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZyb21CbG9ja1N0YXJ0O1xuICAgICAgICBsZXQgYWN0aXZlID0gW10sIHRyYWlsaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IHByb2dyZXNzID0gKG5vZGUsIG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IG5vZGUgPyBub2RlLm1hcmtzIDogW107XG4gICAgICAgICAgICAvLyBSZW1vdmUgbWFya3MgZnJvbSBgaGFyZF9icmVha2AgdGhhdCBhcmUgdGhlIGxhc3Qgbm9kZSBpbnNpZGVcbiAgICAgICAgICAgIC8vIHRoYXQgbWFyayB0byBwcmV2ZW50IHBhcnNlciBlZGdlIGNhc2VzIHdpdGggbmV3IGxpbmVzIGp1c3RcbiAgICAgICAgICAgIC8vIGJlZm9yZSBjbG9zaW5nIG1hcmtzLlxuICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS50eXBlLm5hbWUgPT09IHRoaXMub3B0aW9ucy5oYXJkQnJlYWtOb2RlTmFtZSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmZpbHRlcihtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA9PSBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBwYXJlbnQuY2hpbGQoaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uaXNJblNldChuZXh0Lm1hcmtzKSAmJiAoIW5leHQuaXNUZXh0IHx8IC9cXFMvLnRlc3QobmV4dC50ZXh0KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsZXQgbGVhZGluZyA9IHRyYWlsaW5nO1xuICAgICAgICAgICAgdHJhaWxpbmcgPSBcIlwiO1xuICAgICAgICAgICAgLy8gSWYgd2hpdGVzcGFjZSBoYXMgdG8gYmUgZXhwZWxsZWQgZnJvbSB0aGUgbm9kZSwgYWRqdXN0XG4gICAgICAgICAgICAvLyBsZWFkaW5nIGFuZCB0cmFpbGluZyBhY2NvcmRpbmdseS5cbiAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUuaXNUZXh0ICYmIG1hcmtzLnNvbWUobWFyayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLmdldE1hcmsobWFyay50eXBlLm5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvICYmIGluZm8uZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlICYmICFtYXJrLmlzSW5TZXQoYWN0aXZlKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtfLCBsZWFkLCByZXN0XSA9IC9eKFxccyopKC4qKSQvbS5leGVjKG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZGluZyArPSBsZWFkO1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gcmVzdCA/IG5vZGUud2l0aFRleHQocmVzdCkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IGFjdGl2ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLmlzVGV4dCAmJiBtYXJrcy5zb21lKG1hcmsgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5nZXRNYXJrKG1hcmsudHlwZS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLmV4cGVsRW5jbG9zaW5nV2hpdGVzcGFjZSAmJlxuICAgICAgICAgICAgICAgICAgICAoaW5kZXggPT0gcGFyZW50LmNoaWxkQ291bnQgLSAxIHx8ICFtYXJrLmlzSW5TZXQocGFyZW50LmNoaWxkKGluZGV4ICsgMSkubWFya3MpKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtfLCByZXN0LCB0cmFpbF0gPSAvXiguKj8pKFxccyopJC9tLmV4ZWMobm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAodHJhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSB0cmFpbDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHJlc3QgPyBub2RlLndpdGhUZXh0KHJlc3QpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBhY3RpdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGlubmVyID0gbWFya3MubGVuZ3RoID8gbWFya3NbbWFya3MubGVuZ3RoIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgbGV0IG5vRXNjID0gaW5uZXIgJiYgdGhpcy5nZXRNYXJrKGlubmVyLnR5cGUubmFtZSkuZXNjYXBlID09PSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBsZW4gPSBtYXJrcy5sZW5ndGggLSAobm9Fc2MgPyAxIDogMCk7XG4gICAgICAgICAgICAvLyBUcnkgdG8gcmVvcmRlciAnbWl4YWJsZScgbWFya3MsIHN1Y2ggYXMgZW0gYW5kIHN0cm9uZywgd2hpY2hcbiAgICAgICAgICAgIC8vIGluIE1hcmtkb3duIG1heSBiZSBvcGVuZWQgYW5kIGNsb3NlZCBpbiBkaWZmZXJlbnQgb3JkZXIsIHNvXG4gICAgICAgICAgICAvLyB0aGF0IG9yZGVyIG9mIHRoZSBtYXJrcyBmb3IgdGhlIHRva2VuIG1hdGNoZXMgdGhlIG9yZGVyIGluXG4gICAgICAgICAgICAvLyBhY3RpdmUuXG4gICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gbWFya3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldE1hcmsobWFyay50eXBlLm5hbWUpLm1peGFibGUpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYWN0aXZlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGFjdGl2ZVtqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldE1hcmsob3RoZXIudHlwZS5uYW1lKS5taXhhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXJrLmVxKG90aGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3Muc2xpY2UoMCwgaikuY29uY2F0KG1hcmspLmNvbmNhdChtYXJrcy5zbGljZShqLCBpKSkuY29uY2F0KG1hcmtzLnNsaWNlKGkgKyAxLCBsZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGogPiBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3Muc2xpY2UoMCwgaSkuY29uY2F0KG1hcmtzLnNsaWNlKGkgKyAxLCBqKSkuY29uY2F0KG1hcmspLmNvbmNhdChtYXJrcy5zbGljZShqLCBsZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmluZCB0aGUgcHJlZml4IG9mIHRoZSBtYXJrIHNldCB0aGF0IGRpZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgIGxldCBrZWVwID0gMDtcbiAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgTWF0aC5taW4oYWN0aXZlLmxlbmd0aCwgbGVuKSAmJiBtYXJrc1trZWVwXS5lcShhY3RpdmVba2VlcF0pKVxuICAgICAgICAgICAgICAgICsra2VlcDtcbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtYXJrcyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkXG4gICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0KHRoaXMubWFya1N0cmluZyhhY3RpdmUucG9wKCksIGZhbHNlLCBwYXJlbnQsIGluZGV4KSwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gT3V0cHV0IGFueSBwcmV2aW91c2x5IGV4cGVsbGVkIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3V0c2lkZSB0aGUgbWFya3NcbiAgICAgICAgICAgIGlmIChsZWFkaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMudGV4dChsZWFkaW5nKTtcbiAgICAgICAgICAgIC8vIE9wZW4gdGhlIG1hcmtzIHRoYXQgbmVlZCB0byBiZSBvcGVuZWRcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGFjdGl2ZS5sZW5ndGggPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZCA9IG1hcmtzW2FjdGl2ZS5sZW5ndGhdO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaChhZGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQodGhpcy5tYXJrU3RyaW5nKGFkZCwgdHJ1ZSwgcGFyZW50LCBpbmRleCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBub2RlLiBTcGVjaWFsIGNhc2UgY29kZSBtYXJrcywgc2luY2UgdGhlaXIgY29udGVudFxuICAgICAgICAgICAgICAgIC8vIG1heSBub3QgYmUgZXNjYXBlZC5cbiAgICAgICAgICAgICAgICBpZiAobm9Fc2MgJiYgbm9kZS5pc1RleHQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCh0aGlzLm1hcmtTdHJpbmcoaW5uZXIsIHRydWUsIHBhcmVudCwgaW5kZXgpICsgbm9kZS50ZXh0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1N0cmluZyhpbm5lciwgZmFsc2UsIHBhcmVudCwgaW5kZXggKyAxKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIobm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBmaXJzdCBub24tZW1wdHkgdGV4dCBub2RlIGlzIHJlbmRlcmVkLCB0aGUgZW5kIG9mIG91dHB1dFxuICAgICAgICAgICAgLy8gaXMgbm8gbG9uZ2VyIGF0IGJsb2NrIHN0YXJ0LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEZJWE1FOiBJZiBhIG5vbi10ZXh0IG5vZGUgd3JpdGVzIHNvbWV0aGluZyB0byB0aGUgb3V0cHV0IGZvciB0aGlzXG4gICAgICAgICAgICAvLyBibG9jaywgdGhlIGVuZCBvZiBvdXRwdXQgaXMgYWxzbyBubyBsb25nZXIgYXQgYmxvY2sgc3RhcnQuIEJ1dCBob3dcbiAgICAgICAgICAgIC8vIGNhbiB3ZSBkZXRlY3QgdGhhdD9cbiAgICAgICAgICAgIGlmICgobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlLmlzVGV4dCkgJiYgbm9kZS5ub2RlU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwYXJlbnQuZm9yRWFjaChwcm9ncmVzcyk7XG4gICAgICAgIHByb2dyZXNzKG51bGwsIDAsIHBhcmVudC5jaGlsZENvdW50KTtcbiAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIGEgbm9kZSdzIGNvbnRlbnQgYXMgYSBsaXN0LiBgZGVsaW1gIHNob3VsZCBiZSB0aGUgZXh0cmFcbiAgICBpbmRlbnRhdGlvbiBhZGRlZCB0byBhbGwgbGluZXMgZXhjZXB0IHRoZSBmaXJzdCBpbiBhbiBpdGVtLFxuICAgIGBmaXJzdERlbGltYCBpcyBhIGZ1bmN0aW9uIGdvaW5nIGZyb20gYW4gaXRlbSBpbmRleCB0byBhXG4gICAgZGVsaW1pdGVyIGZvciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgaXRlbS5cbiAgICAqL1xuICAgIHJlbmRlckxpc3Qobm9kZSwgZGVsaW0sIGZpcnN0RGVsaW0pIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkICYmIHRoaXMuY2xvc2VkLnR5cGUgPT0gbm9kZS50eXBlKVxuICAgICAgICAgICAgdGhpcy5mbHVzaENsb3NlKDMpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLmluVGlnaHRMaXN0KVxuICAgICAgICAgICAgdGhpcy5mbHVzaENsb3NlKDEpO1xuICAgICAgICBsZXQgaXNUaWdodCA9IHR5cGVvZiBub2RlLmF0dHJzLnRpZ2h0ICE9IFwidW5kZWZpbmVkXCIgPyBub2RlLmF0dHJzLnRpZ2h0IDogdGhpcy5vcHRpb25zLnRpZ2h0TGlzdHM7XG4gICAgICAgIGxldCBwcmV2VGlnaHQgPSB0aGlzLmluVGlnaHRMaXN0O1xuICAgICAgICB0aGlzLmluVGlnaHRMaXN0ID0gaXNUaWdodDtcbiAgICAgICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgXywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgJiYgaXNUaWdodClcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoMSk7XG4gICAgICAgICAgICB0aGlzLndyYXBCbG9jayhkZWxpbSwgZmlyc3REZWxpbShpKSwgbm9kZSwgKCkgPT4gdGhpcy5yZW5kZXIoY2hpbGQsIG5vZGUsIGkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5UaWdodExpc3QgPSBwcmV2VGlnaHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nIHNvIHRoYXQgaXQgY2FuIHNhZmVseSBhcHBlYXIgaW4gTWFya2Rvd25cbiAgICBjb250ZW50LiBJZiBgc3RhcnRPZkxpbmVgIGlzIHRydWUsIGFsc28gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdFxuICAgIGhhdmUgc3BlY2lhbCBtZWFuaW5nIG9ubHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLlxuICAgICovXG4gICAgZXNjKHN0ciwgc3RhcnRPZkxpbmUgPSBmYWxzZSkge1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvW2AqXFxcXH5cXFtcXF1fXS9nLCAobSwgaSkgPT4gbSA9PSBcIl9cIiAmJiBpID4gMCAmJiBpICsgMSA8IHN0ci5sZW5ndGggJiYgc3RyW2kgLSAxXS5tYXRjaCgvXFx3LykgJiYgc3RyW2kgKyAxXS5tYXRjaCgvXFx3LykgPyBtIDogXCJcXFxcXCIgKyBtKTtcbiAgICAgICAgaWYgKHN0YXJ0T2ZMaW5lKVxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL14oXFwrWyBdfFtcXC0qPl0pLywgXCJcXFxcJCZcIikucmVwbGFjZSgvXihcXHMqKSgjezEsNn0pKFxcc3wkKS8sICckMVxcXFwkMiQzJykucmVwbGFjZSgvXihcXHMqXFxkKylcXC5cXHMvLCBcIiQxXFxcXC4gXCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmVzY2FwZUV4dHJhQ2hhcmFjdGVycylcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHRoaXMub3B0aW9ucy5lc2NhcGVFeHRyYUNoYXJhY3RlcnMsIFwiXFxcXCQmXCIpO1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHF1b3RlKHN0cikge1xuICAgICAgICBsZXQgd3JhcCA9IHN0ci5pbmRleE9mKCdcIicpID09IC0xID8gJ1wiXCInIDogc3RyLmluZGV4T2YoXCInXCIpID09IC0xID8gXCInJ1wiIDogXCIoKVwiO1xuICAgICAgICByZXR1cm4gd3JhcFswXSArIHN0ciArIHdyYXBbMV07XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGVhdCB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAqL1xuICAgIHJlcGVhdChzdHIsIG4pIHtcbiAgICAgICAgbGV0IG91dCA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKVxuICAgICAgICAgICAgb3V0ICs9IHN0cjtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBtYXJrZG93biBzdHJpbmcgZm9yIGEgZ2l2ZW4gb3BlbmluZyBvciBjbG9zaW5nIG1hcmsuXG4gICAgKi9cbiAgICBtYXJrU3RyaW5nKG1hcmssIG9wZW4sIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGluZm8gPSB0aGlzLmdldE1hcmsobWFyay50eXBlLm5hbWUpO1xuICAgICAgICBsZXQgdmFsdWUgPSBvcGVuID8gaW5mby5vcGVuIDogaW5mby5jbG9zZTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZSh0aGlzLCBtYXJrLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBhIHN0cmluZy4gVmFsdWVzIG9mXG4gICAgbGVhZGluZyBvciB0cmFpbGluZyBwcm9wZXJ0eSBvZiB0aGUgcmV0dXJuIG9iamVjdCB3aWxsIGJlIHVuZGVmaW5lZFxuICAgIGlmIHRoZXJlIGlzIG5vIG1hdGNoLlxuICAgICovXG4gICAgZ2V0RW5jbG9zaW5nV2hpdGVzcGFjZSh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWFkaW5nOiAodGV4dC5tYXRjaCgvXihcXHMrKS8pIHx8IFt1bmRlZmluZWRdKVswXSxcbiAgICAgICAgICAgIHRyYWlsaW5nOiAodGV4dC5tYXRjaCgvKFxccyspJC8pIHx8IFt1bmRlZmluZWRdKVswXVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IHsgTWFya2Rvd25QYXJzZXIsIE1hcmtkb3duU2VyaWFsaXplciwgTWFya2Rvd25TZXJpYWxpemVyU3RhdGUsIGRlZmF1bHRNYXJrZG93blBhcnNlciwgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplciwgc2NoZW1hIH07XG4iLCJpbXBvcnQgbWFya2Rvd25pdCBmcm9tICdtYXJrZG93bi1pdCc7XG5pbXBvcnQge1xuICBNYXJrZG93blBhcnNlcixcbiAgTWFya2Rvd25TZXJpYWxpemVyLFxuICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLFxufSBmcm9tICdwcm9zZW1pcnJvci1tYXJrZG93bic7XG5pbXBvcnQge1xuICBBVVRPX0xJTktfQVRUUixcbiAgTUFSS0RPV05fRVNDQVBFRF9BVFRSLFxuICBDaGVja2JveFN0YXR1cyxcbiAgc2NoZW1hLFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBjb25zdCBtYXJrZG93blNlcmlhbGl6ZXIgPSBuZXcgTWFya2Rvd25TZXJpYWxpemVyKFxuICB7XG4gICAgaGVhZGluZzEoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjICcpO1xuICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGhlYWRpbmcyKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBzdGF0ZS53cml0ZSgnIyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZzMoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjIyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgY2hlY2tsaXN0X2l0ZW0oc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGJveFRleHQgPVxuICAgICAgICBub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSA/ICdbeF0gJyA6ICdbIF0gJztcbiAgICAgIHN0YXRlLndyaXRlKGJveFRleHQpO1xuICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIHBhcmFncmFwaChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgaWYgKG5vZGUubm9kZVNpemUgPT09IDIpIHtcbiAgICAgICAgLy8gV3JpdGUgYSBub24tYnJlYWtpbmcgZW1wdHkgc3BhY2Ugc28gbWFya2Rvd24gcmV0YWlucyB0aGUgbGluZSBhcyBhbiBlbXB0eSBwYXJhZ3JhcGhcbiAgICAgICAgc3RhdGUud3JpdGUoJ1xcdTAwQTAnKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy5wYXJhZ3JhcGgoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgbGlzdF9pdGVtKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmxpc3RfaXRlbShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBvcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMub3JkZXJlZF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIHVub3JkZXJlZF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmJ1bGxldF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIHRleHQoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMudGV4dChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBjb2RlX2Jsb2NrKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBpZiAobm9kZS5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICBzdGF0ZS5lbnN1cmVOZXdMaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmNvZGVfYmxvY2soc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICAuLi5kZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm1hcmtzLFxuICAgIGlubGluZV9saW5rOiBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm1hcmtzLmxpbmssXG4gICAgY29kZToge1xuICAgICAgY2xvc2Uoc3RhdGUsIG1hcmspIHtcbiAgICAgICAgcmV0dXJuIG1hcmsuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSA/ICcnIDogJ2AnO1xuICAgICAgfSxcbiAgICAgIGVzY2FwZTogZmFsc2UsXG4gICAgICBvcGVuKHN0YXRlLCBtYXJrKSB7XG4gICAgICAgIHJldHVybiBtYXJrLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl0gPyAnJyA6ICdgJztcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbik7XG5cbmNvbnN0IG1hcmtkb3duSXRQYXJzZXIgPSBtYXJrZG93bml0KCk7XG5jb25zdCBUb2tlbiA9IG1hcmtkb3duSXRQYXJzZXIuY29yZS5TdGF0ZS5wcm90b3R5cGUuVG9rZW47XG4vLyBXZSBuZWVkIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBpbWFnZSBwYXJzZXIgcnVsZSBzbyB3ZSBjYW4gd3JhcCBpdCBpbiBjdXN0b21cbi8vIGxvZ2ljLiBUaGVzZSBtZXRob2RzIGFuZCBvYmplY3RzIGFyZSBtZWFudCB0byBiZSBpbnRlcm5hbCBidXQgdGhlcmUgc2VlbXMgdG9cbi8vIGJlIG5vIG90aGVyIHdheSB0byBnZXQgYXQgdGhlIGRlZmF1bHQgcnVsZXMuXG4vLyBAdHMtaWdub3JlXG5jb25zdCBpbWFnZVJ1bGVJbmRleCA9IG1hcmtkb3duSXRQYXJzZXIuaW5saW5lLnJ1bGVyLl9fZmluZF9fKCdpbWFnZScpO1xuY29uc3QgZGVmYXVsdEltYWdlUnVsZSA9XG4gIC8vIEB0cy1pZ25vcmVcbiAgbWFya2Rvd25JdFBhcnNlci5pbmxpbmUucnVsZXIuX19ydWxlc19fW2ltYWdlUnVsZUluZGV4XS5mbjtcblxuY29uc3QgQ0hFQ0tMSVNUX0lURU1fT1BFTl9NQVJLRVJTID0gWydbeF0nLCAnW1hdJywgJ1sgXSddO1xuXG5tYXJrZG93bkl0UGFyc2VyLnVzZSgobWQpID0+IHtcbiAgbWQuY29yZS5ydWxlci5hZnRlcignYmxvY2snLCAnY2hlY2tsaXN0X2l0ZW0nLCAoY29yZVN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc3JjTGluZXMgPSBjb3JlU3RhdGUuc3JjLnNwbGl0KCdcXG4nKTtcbiAgICBsZXQgaXNDaGVja2xpc3RPcGVuID0gZmFsc2U7XG4gICAgbGV0IGhhc0NoZWNrbGlzdCA9IGZhbHNlO1xuXG4gICAgY29yZVN0YXRlLnRva2VucyA9IGNvcmVTdGF0ZS50b2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgaWYgKGlzQ2hlY2tsaXN0T3BlbiAmJiB0b2tlbi50eXBlID09PSAnaW5saW5lJykge1xuICAgICAgICB0b2tlbi5jb250ZW50ID0gdG9rZW4uY29udGVudC5zbGljZSgzKS50cmltTGVmdCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGhfb3BlbicpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0TGluZSwgZW5kTGluZV0gPSB0b2tlbi5tYXA7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzcmNMaW5lc1tzdGFydExpbmVdO1xuICAgICAgICBpZiAoQ0hFQ0tMSVNUX0lURU1fT1BFTl9NQVJLRVJTLmluY2x1ZGVzKGNvbnRlbnQuc2xpY2UoMCwgMykpKSB7XG4gICAgICAgICAgaGFzQ2hlY2tsaXN0ID0gdHJ1ZTtcbiAgICAgICAgICBpc0NoZWNrbGlzdE9wZW4gPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHsgVG9rZW4gfSA9IGNvcmVTdGF0ZTtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbignY2hlY2tsaXN0X2l0ZW1fb3BlbicsICdkaXYnLCAxKTtcbiAgICAgICAgICB0b2tlbi5hdHRyUHVzaChbXG4gICAgICAgICAgICAnc3RhdHVzJyxcbiAgICAgICAgICAgIGNvbnRlbnRbMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnXG4gICAgICAgICAgICAgID8gQ2hlY2tib3hTdGF0dXMuRE9ORS50b1N0cmluZygpXG4gICAgICAgICAgICAgIDogQ2hlY2tib3hTdGF0dXMuRU1QVFkudG9TdHJpbmcoKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2xpc3RPcGVuICYmIHRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGhfY2xvc2UnKSB7XG4gICAgICAgIGlzQ2hlY2tsaXN0T3BlbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gbmV3IGNvcmVTdGF0ZS5Ub2tlbignY2hlY2tsaXN0X2l0ZW1fY2xvc2UnLCAnZGl2JywgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFzQ2hlY2tsaXN0O1xuICB9KTtcblxuICBtZC5pbmxpbmUucnVsZXIuYXQoJ2ltYWdlJywgKGlubGluZVN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBwb3M6IG9yaWdpbmFsUG9zIH0gPSBpbmxpbmVTdGF0ZTtcbiAgICBjb25zdCByZXN1bHQgPSBkZWZhdWx0SW1hZ2VSdWxlKGlubGluZVN0YXRlKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCBjb2RlVG9rZW4gPSBuZXcgaW5saW5lU3RhdGUuVG9rZW4oJ2NvZGVfaW5saW5lJywgJ2NvZGUnLCAwKTtcbiAgICAgIGNvZGVUb2tlbi5tYXJrdXAgPSAnYCc7XG4gICAgICBjb2RlVG9rZW4uY29udGVudCA9IGlubGluZVN0YXRlLnNyYy5zbGljZShvcmlnaW5hbFBvcywgaW5saW5lU3RhdGUucG9zKTtcbiAgICAgIGNvZGVUb2tlbi5hdHRyU2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUiwgJ3RydWUnKTtcbiAgICAgIGlubGluZVN0YXRlLnRva2Vuc1tpbmxpbmVTdGF0ZS50b2tlbnMubGVuZ3RoIC0gMV0gPSBjb2RlVG9rZW47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG5cbmNsYXNzIFNjcmF0Y2hUb2tlblBhcnNlciB7XG4gIHByaXZhdGUgZnVsbFRva2VuTGlzdDogbWFya2Rvd25pdC5Ub2tlbltdO1xuICBwcml2YXRlIHRva2VuU3RhY2s6IG1hcmtkb3duaXQuVG9rZW5bXTtcbiAgcHJpdmF0ZSBwYXJzZWFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3JjOiBzdHJpbmc7XG5cbiAgc3RhdGljIERPQ1VNRU5UX01BUCA9IG5ldyBNYXAoW1xuICAgIFsnaGVhZGluZzEnLCBbJ2lubGluZSddXSxcbiAgICBbJ2hlYWRpbmcyJywgWydpbmxpbmUnXV0sXG4gICAgWydoZWFkaW5nMycsIFsnaW5saW5lJ11dLFxuICAgIFsncGFyYWdyYXBoJywgWydpbmxpbmUnXV0sXG4gICAgWydmZW5jZScsIFsnaW5saW5lJ11dLFxuICAgIFsnYnVsbGV0X2xpc3QnLCBbJ2xpc3RfaXRlbScsICdpbmxpbmUnXV0sXG4gICAgWydvcmRlcmVkX2xpc3QnLCBbJ2xpc3RfaXRlbScsICdpbmxpbmUnXV0sXG4gICAgWydsaXN0X2l0ZW0nLCBbJ3BhcmFncmFwaCcsICdvcmRlcmVkX2xpc3QnLCAnYnVsbGV0X2xpc3QnXV0sXG4gICAgWydjaGVja2xpc3RfaXRlbScsIFsnaW5saW5lJ11dLFxuICAgIFsnaW5saW5lJywgW11dLFxuICBdKTtcblxuICBzdGF0aWMgZ2V0VHlwZU5hbWUodG9rZW5UeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdG9rZW5UeXBlLnJlcGxhY2UoJ19vcGVuJywgJycpLnJlcGxhY2UoJ19jbG9zZScsICcnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNyYzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNldEludGVybmFsU3RhdGUoKTtcbiAgICB0aGlzLnNyYyA9IHNyYztcbiAgfVxuXG4gIHRha2UodG9rZW46IG1hcmtkb3duaXQuVG9rZW4pOiBudWxsIHwgbWFya2Rvd25pdC5Ub2tlbltdIHtcbiAgICBjb25zdCB7IG5lc3RpbmcgfSA9IHRva2VuO1xuICAgIGxldCB7IHR5cGUgfSA9IHRva2VuO1xuICAgIHR5cGUgPSBTY3JhdGNoVG9rZW5QYXJzZXIuZ2V0VHlwZU5hbWUodHlwZSk7XG5cbiAgICB0aGlzLmZ1bGxUb2tlbkxpc3QucHVzaCh0b2tlbik7XG5cbiAgICBpZiAoXG4gICAgICBTY3JhdGNoVG9rZW5QYXJzZXIuRE9DVU1FTlRfTUFQLmhhcyh0eXBlKSA9PT0gZmFsc2UgJiZcbiAgICAgIHR5cGUgIT09ICdpbmxpbmUnXG4gICAgKSB7XG4gICAgICB0aGlzLnBhcnNlYWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhcnNlYWJsZSAmJiB0aGlzLnRva2VuU3RhY2subGVuZ3RoICYmIG5lc3RpbmcgPj0gMCkge1xuICAgICAgY29uc3QgcGFyZW50VHlwZSA9IFNjcmF0Y2hUb2tlblBhcnNlci5nZXRUeXBlTmFtZShcbiAgICAgICAgdGhpcy50b2tlblN0YWNrW3RoaXMudG9rZW5TdGFjay5sZW5ndGggLSAxXS50eXBlLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBTY3JhdGNoVG9rZW5QYXJzZXIuRE9DVU1FTlRfTUFQLmdldChwYXJlbnRUeXBlKS5pbmNsdWRlcyh0eXBlKSA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLnBhcnNlYWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXN0aW5nID4gMCkge1xuICAgICAgdGhpcy50b2tlblN0YWNrLnB1c2godG9rZW4pO1xuICAgIH1cblxuICAgIGlmIChuZXN0aW5nIDwgMCkge1xuICAgICAgdGhpcy50b2tlblN0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRva2VuU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBvdXQgPSB0aGlzLmdldFRva2VucygpO1xuICAgICAgdGhpcy5yZXNldEludGVybmFsU3RhdGUoKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFRva2VucyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGZ1bGxUb2tlbkxpc3QsIHBhcnNlYWJsZSB9ID0gdGhpcztcblxuICAgIGlmIChwYXJzZWFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcDogW2VuZExpbmUsIHN0YXJ0TGluZV0sXG4gICAgICB9ID0gZnVsbFRva2VuTGlzdFswXTtcbiAgICAgIGNvbnN0IGNvZGVUb2tlbiA9IG5ldyBUb2tlbignZmVuY2UnLCAnY29kZScsIDApO1xuICAgICAgY29kZVRva2VuLmNvbnRlbnQgPSB0aGlzLnNyY1xuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5zbGljZShlbmRMaW5lLCBzdGFydExpbmUpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgIGNvZGVUb2tlbi5hdHRyUHVzaChbTUFSS0RPV05fRVNDQVBFRF9BVFRSLCAndHJ1ZSddKTtcbiAgICAgIHJldHVybiBbY29kZVRva2VuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVsbFRva2VuTGlzdDtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0SW50ZXJuYWxTdGF0ZSA9ICgpID0+IHtcbiAgICB0aGlzLmZ1bGxUb2tlbkxpc3QgPSBbXTtcbiAgICB0aGlzLnRva2VuU3RhY2sgPSBbXTtcbiAgICB0aGlzLnBhcnNlYWJsZSA9IHRydWU7XG4gIH07XG59XG5cbmNvbnN0IHBhcnNlclNoaW0gPSAoKSA9PiAoe1xuICBwYXJzZSguLi5hcmdzKSB7XG4gICAgKHdpbmRvdyBhcyBhbnkpLm1pcCA9IG1hcmtkb3duSXRQYXJzZXI7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGluaXRpYWwgPSBtYXJrZG93bkl0UGFyc2VyLnBhcnNlKC4uLmFyZ3MpO1xuICAgIGNvbnN0IG91dCA9IFtdO1xuICAgIGNvbnN0IHRva2VuUGFyc2VyID0gbmV3IFNjcmF0Y2hUb2tlblBhcnNlcihhcmdzWzBdKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGlhbC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSBpbml0aWFsW2ldO1xuICAgICAgY29uc3QgeyBuZXN0aW5nLCB0YWcsIHR5cGUgfSA9IHRva2VuO1xuXG4gICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCdoZWFkaW5nJykgJiYgdGFnID09PSAnaDEnKSB7XG4gICAgICAgIHRva2VuLnR5cGUgPSB0b2tlbi50eXBlLnJlcGxhY2UoJ2hlYWRpbmcnLCAnaGVhZGluZzEnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ2hlYWRpbmcnKSAmJiB0YWcgPT09ICdoMicpIHtcbiAgICAgICAgdG9rZW4udHlwZSA9IHR5cGUucmVwbGFjZSgnaGVhZGluZycsICdoZWFkaW5nMicpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgnaGVhZGluZycpICYmIHRhZyA9PT0gJ2gzJykge1xuICAgICAgICB0b2tlbi50eXBlID0gdHlwZS5yZXBsYWNlKCdoZWFkaW5nJywgJ2hlYWRpbmczJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gJ2xpbmsnICYmIHRva2VuLmF0dHJHZXQoJ2hyZWYnKSA9PT0gdG9rZW4uY29udGVudCkge1xuICAgICAgICB0b2tlbi5hdHRyU2V0KEFVVE9fTElOS19BVFRSLCAndHJ1ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXRwdXQgPSB0b2tlblBhcnNlci50YWtlKHRva2VuKTtcblxuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBvdXQucHVzaCguLi5vdXRwdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IG1hcmtkb3duUGFyc2VyID0gbmV3IE1hcmtkb3duUGFyc2VyKFxuICBzY2hlbWEsXG4gIC8vIEB0cy1pZ25vcmVcbiAgcGFyc2VyU2hpbSgpLFxuICB7XG4gICAgYmxvY2txdW90ZTogeyBibG9jazogJ2NvZGVfYmxvY2snIH0sXG4gICAgYnVsbGV0X2xpc3Q6IHsgYmxvY2s6ICd1bm9yZGVyZWRfbGlzdCcgfSxcbiAgICBmZW5jZToge1xuICAgICAgYmxvY2s6ICdjb2RlX2Jsb2NrJyxcbiAgICAgIGdldEF0dHJzKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5hdHRyR2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUikgPT09ICd0cnVlJ1xuICAgICAgICAgID8geyBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXTogdHJ1ZSB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBoZWFkaW5nMTogeyBibG9jazogJ2hlYWRpbmcxJyB9LFxuICAgIGhlYWRpbmcyOiB7IGJsb2NrOiAnaGVhZGluZzInIH0sXG4gICAgaGVhZGluZzM6IHsgYmxvY2s6ICdoZWFkaW5nMycgfSxcbiAgICBsaXN0X2l0ZW06IHsgYmxvY2s6ICdsaXN0X2l0ZW0nIH0sXG4gICAgb3JkZXJlZF9saXN0OiB7IGJsb2NrOiAnb3JkZXJlZF9saXN0JyB9LFxuICAgIHBhcmFncmFwaDogeyBibG9jazogJ3BhcmFncmFwaCcgfSxcbiAgICBjaGVja2xpc3RfaXRlbToge1xuICAgICAgYmxvY2s6ICdjaGVja2xpc3RfaXRlbScsXG4gICAgICBnZXRBdHRycyh0b2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6XG4gICAgICAgICAgICB0b2suYXR0ckdldCgnc3RhdHVzJykgPT09IENoZWNrYm94U3RhdHVzLkRPTkUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICA/IENoZWNrYm94U3RhdHVzLkRPTkVcbiAgICAgICAgICAgICAgOiBDaGVja2JveFN0YXR1cy5FTVBUWSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbTogeyBtYXJrOiAnZW0nIH0sXG4gICAgc3Ryb25nOiB7IG1hcms6ICdzdHJvbmcnIH0sXG4gICAgY29kZV9pbmxpbmU6IHtcbiAgICAgIGdldEF0dHJzKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5hdHRyR2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUikgPT09ICd0cnVlJ1xuICAgICAgICAgID8geyBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXTogdHJ1ZSB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgIH0sXG4gICAgICBtYXJrOiAnY29kZScsXG4gICAgICBub0Nsb3NlVG9rZW46IHRydWUsXG4gICAgfSxcbiAgICBsaW5rOiB7XG4gICAgICBtYXJrOiAnbGluaycsXG4gICAgICBnZXRBdHRycyh0b2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB0b2suYXR0ckdldCgnaHJlZicpLFxuICAgICAgICAgIHRpdGxlOiB0b2suYXR0ckdldCgndGl0bGUnKSB8fCBudWxsLFxuICAgICAgICAgIC4uLih0b2suaW5mbyA9PT0gJ2F1dG8nICYmIHtcbiAgICAgICAgICAgIFtBVVRPX0xJTktfQVRUUl06IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4pO1xuIiwiaW1wb3J0IHsgUGx1Z2luLCBUcmFuc2FjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgTGlua2lmeUl0IGZyb20gJ2xpbmtpZnktaXQnO1xuXG5jb25zdCBsaW5raWZ5ID0gbmV3IExpbmtpZnlJdCgpO1xuXG5leHBvcnQgY29uc3QgZmluZEFuZEluc2VydElubGluZUxpbmtzID0gKHN0YXRlKTogVHJhbnNhY3Rpb24gPT4ge1xuICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcblxuICB0ci5kb2MuZGVzY2VuZGFudHMoKG5vZGUsIHBvcywgcGFyZW50KSA9PiB7XG4gICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIGZpbmQgYW5kIHZhbGlkYXRlIGFsbCBleGlzdGluZyBhdXRvbGlua3MuIElmIGFuIGF1dG9saW5rIGNvbnRhaW5zIHRleHQgdGhhdCBpcyBub3QgYSB2YWxpZCBVUkwsIHJlbW92ZSB0aGUgbGluay5cbiAgICBjb25zdCBzdGFydGluZ1Bvc2l0aW9uSW5zaWRlTm9kZSA9IHBvcyArIDE7XG4gICAgY29uc3QgYXV0b0xpbmtNYXBzOiB7IHN0YXJ0UG9zOiBudW1iZXI7IGVuZFBvczogbnVtYmVyIH1bXSA9IFtdO1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBjaGlsZExpbmtNYXJrID0gY2hpbGQubWFya3MuZmluZChcbiAgICAgICAgKG1hcmspID0+IG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgICApO1xuICAgICAgaWYgKGNoaWxkTGlua01hcmsgJiYgY2hpbGRMaW5rTWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0gPT09IHRydWUpIHtcbiAgICAgICAgaWYgKGF1dG9MaW5rTWFwcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBsYXN0TWFwID0gYXV0b0xpbmtNYXBzW2F1dG9MaW5rTWFwcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdE1hcC5lbmRQb3MgPT09IHN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlICsgb2Zmc2V0KSB7XG4gICAgICAgICAgICBsYXN0TWFwLmVuZFBvcyA9IHBvcyArIG9mZnNldCArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhdXRvTGlua01hcHMucHVzaCh7XG4gICAgICAgICAgICBzdGFydFBvczogc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgKyBvZmZzZXQsXG4gICAgICAgICAgICBlbmRQb3M6IHN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlICsgb2Zmc2V0ICsgY2hpbGQubm9kZVNpemUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgYXV0b0xpbmtNYXAgb2YgYXV0b0xpbmtNYXBzKSB7XG4gICAgICBjb25zdCBsaW5rVGV4dCA9IHRyLmRvYy50ZXh0QmV0d2VlbihcbiAgICAgICAgYXV0b0xpbmtNYXAuc3RhcnRQb3MsXG4gICAgICAgIGF1dG9MaW5rTWFwLmVuZFBvcyxcbiAgICAgICk7XG4gICAgICBpZiAoIWxpbmtpZnkudGVzdChsaW5rVGV4dCkpIHtcbiAgICAgICAgdHIucmVtb3ZlTWFyayhcbiAgICAgICAgICBhdXRvTGlua01hcC5zdGFydFBvcyxcbiAgICAgICAgICBhdXRvTGlua01hcC5lbmRQb3MsXG4gICAgICAgICAgc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGVsc2Ugc3RhdGVtZW50IGVuc3VyZXMgdGhhdCBleGlzdGluZyBhdXRvbGlua3Mgd2lsbCBjb250aW51ZSB0byB1cGRhdGUgZXZlbiBpZiB0aGV5IGFyZVxuICAgICAgICAvLyBhZGphY2VudCB0byBvdGhlciB0ZXh0OyB0aGUgcmVnZXggVVJMIHRlc3Qgd2lsbCBzdG9wIGZpbmRpbmcgdGhlbSBpbiB0aGlzIGNhc2UuXG4gICAgICAgIHRyLmFkZE1hcmsoXG4gICAgICAgICAgYXV0b0xpbmtNYXAuc3RhcnRQb3MsXG4gICAgICAgICAgYXV0b0xpbmtNYXAuZW5kUG9zLFxuICAgICAgICAgIHNjaGVtYS5tYXJrcy5saW5rLmNyZWF0ZSh7IGhyZWY6IGxpbmtUZXh0LCBbQVVUT19MSU5LX0FUVFJdOiB0cnVlIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZW4sIGZpbmQgYW5kIGluc2VydCBuZXcgYXV0b2xpbmtzIGJhc2VkIG9uIHRoZSBzYW1lIHRlc3QuXG4gICAgY29uc3QgbWF0Y2hlcyA9IGxpbmtpZnkubWF0Y2gobm9kZS50ZXh0Q29udGVudCk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHBvcyArIDEgKyBtYXRjaC5pbmRleDtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbWF0Y2gudGV4dC5sZW5ndGg7XG5cbiAgICAgIGlmICh0ci5kb2MucmFuZ2VIYXNNYXJrKHN0YXJ0LCBlbmQsIHNjaGVtYS5tYXJrcy5jb2RlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyLmRvYy5yYW5nZUhhc01hcmsoc3RhcnQsIGVuZCwgc2NoZW1hLm1hcmtzLmxpbmspKSB7XG4gICAgICAgIGxldCBsaW5rTWFya3MgPSBbXTtcbiAgICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihzdGFydCwgZW5kLCAobm9kZSkgPT4ge1xuICAgICAgICAgIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgY29uc3QgbGlua01hcmsgPSBub2RlLm1hcmtzLmZpbmQoXG4gICAgICAgICAgICAgIChtYXJrKSA9PiBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChsaW5rTWFyayAmJiBsaW5rTWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIGxpbmtNYXJrcy5wdXNoKGxpbmtNYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobGlua01hcmtzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyLmFkZE1hcmsoXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBlbmQsXG4gICAgICAgIHNjaGVtYS5tYXJrcy5saW5rLmNyZWF0ZSh7IGhyZWY6IG1hdGNoLnVybCwgW0FVVE9fTElOS19BVFRSXTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdHI7XG59O1xuXG5leHBvcnQgY2xhc3MgSW5saW5lTGlua1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGFwcGVuZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9ucywgb2xkU3RhdGUsIG5ld1N0YXRlKSB7XG4gICAgICAgIHJldHVybiBmaW5kQW5kSW5zZXJ0SW5saW5lTGlua3MobmV3U3RhdGUpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICdAc3RhbmRhcmRub3Rlcy9jb21wb25lbnQtcmVsYXknO1xuaW1wb3J0IHsgYmFzZUtleW1hcCB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQgeyBpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4sIGlucHV0UnVsZXNQbHVnaW4gfSBmcm9tICcuL2lucHV0UnVsZXMnO1xuaW1wb3J0IHsgVG9vbGJhclBsdWdpbiB9IGZyb20gJy4vVG9vbGJhclBsdWdpbic7XG5pbXBvcnQgeyBUb29sdGlwUGx1Z2luIH0gZnJvbSAnLi9Ub29sdGlwUGx1Z2luJztcbmltcG9ydCB7IEVkaXRvckV4dGVuZGVyUGx1Z2luIH0gZnJvbSAnLi9FZGl0b3JFeHRlbmRlclBsdWdpbic7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBub2RlVmlld3MgfSBmcm9tICcuL25vZGVWaWV3cyc7XG5pbXBvcnQgeyBrZXltYXBQbHVnaW5zIH0gZnJvbSAnLi9rZXltYXBzJztcbmltcG9ydCB7IG1hcmtkb3duUGFyc2VyLCBtYXJrZG93blNlcmlhbGl6ZXIgfSBmcm9tICcuL21hcmtkb3duJztcbmltcG9ydCB7IElubGluZUxpbmtQbHVnaW4gfSBmcm9tICcuL0lubGluZUxpbmtQbHVnaW4nO1xuXG5pbnRlcmZhY2UgQXBwV2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgdmlldzogRWRpdG9yVmlldztcbn1cblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IEFwcFdpbmRvdztcblxuZnVuY3Rpb24gZ2V0RG9jRm9yTmV3RWRpdG9yU3RhdGUoKSB7XG4gIHJldHVybiBjbGllbnQubGF0ZXN0VGV4dFxuICAgID8gbWFya2Rvd25QYXJzZXIucGFyc2UoY2xpZW50LmxhdGVzdFRleHQpXG4gICAgOiBjbGllbnQubGF0ZXN0RG9jXG4gICAgICA/IHNjaGVtYS5ub2RlRnJvbUpTT04oY2xpZW50LmxhdGVzdERvYylcbiAgICAgIDogc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgYXdhaXQgY2xpZW50LnJlYWR5KCk7XG5cbiAgY29uc3QgdmlldyA9ICh3aW5kb3cudmlldyA9IG5ldyBFZGl0b3JWaWV3KFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlZGl0b3InKSxcbiAgICB7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jOiBnZXREb2NGb3JOZXdFZGl0b3JTdGF0ZSgpLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgLi4ua2V5bWFwUGx1Z2lucyxcbiAgICAgICAgICBuZXcgVG9vbGJhclBsdWdpbihcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b29sYmFyJyksXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGluay1tb2RhbCcpLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IFRvb2x0aXBQbHVnaW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpbmstdG9vbHRpcCcpKSxcbiAgICAgICAgICBuZXcgRWRpdG9yRXh0ZW5kZXJQbHVnaW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2V4dGVuZGVyJykpLFxuICAgICAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgbm9kZVZpZXdzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgSW5saW5lTGlua1BsdWdpbigpLFxuICAgICAgICAgIGlucHV0UnVsZXNQbHVnaW4sXG4gICAgICAgICAgaW5wdXRSdWxlc0ZvcmNlZFNwYWNlUGx1Z2luLFxuICAgICAgICAgIGhpc3RvcnkoKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbih0cikge1xuICAgICAgICBjb25zdCBuZXh0ID0gdmlldy5zdGF0ZS5hcHBseSh0cik7XG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUobmV4dCk7XG4gICAgICAgIGlmICh0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgY2xpZW50LnNhdmVOb3RlKFxuICAgICAgICAgICAgbmV4dC5kb2MudG9KU09OKCksXG4gICAgICAgICAgICBtYXJrZG93blNlcmlhbGl6ZXIuc2VyaWFsaXplKG5leHQuZG9jKSxcbiAgICAgICAgICAgIG5leHQuZG9jLnRleHRCZXR3ZWVuKDAsIG5leHQuZG9jLm5vZGVTaXplIC0gMiwgJyAnKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICkpO1xuXG4gIGNsaWVudC5vblVwZGF0ZSgoZG9jKSA9PiB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBvcGVucyBhIG5ldyBub3RlLCBrZWVwIGFsbCB0aGUgcGx1Z2luIGluc3RhbmNlcyBleGNlcHQgdGhlIHRvb2xiYXJcbiAgICBjb25zdCBwbHVnaW5zID0gdmlldy5zdGF0ZS5wbHVnaW5zLmZpbHRlcihcbiAgICAgIChwbHVnaW4pID0+IHBsdWdpbiBpbnN0YW5jZW9mIFRvb2xiYXJQbHVnaW4gPT09IGZhbHNlLFxuICAgICk7XG5cbiAgICB2aWV3LnNldFByb3BzKHtcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICBkb2M6IGdldERvY0Zvck5ld0VkaXRvclN0YXRlKCksXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAuLi5wbHVnaW5zLFxuICAgICAgICAgIG5ldyBUb29sYmFyUGx1Z2luKFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Rvb2xiYXInKSxcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaW5rLW1vZGFsJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9KTtcbn1cblxuaW5pdCgpO1xuIl0sIm5hbWVzIjpbInNlbGYiLCJtb2R1bGUiLCJleHBvcnRzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIkNvbXBvbmVudEFjdGlvbiIsIkVudmlyb25tZW50IiwiQ29udGVudFR5cGUiLCJBcHBEYXRhRmllbGQiLCJnZXRSYW5kb21WYWx1ZXMiLCJybmRzOCIsIlVpbnQ4QXJyYXkiLCJybmciLCJjcnlwdG8iLCJiaW5kIiwibXNDcnlwdG8iLCJFcnJvciIsInV1aWQiLCJieXRlVG9IZXgiLCJpIiwicHVzaCIsInRvU3RyaW5nIiwic3Vic3RyIiwib3B0aW9ucyIsImJ1ZiIsIm9mZnNldCIsInJuZHMiLCJyYW5kb20iLCJhcnIiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsIlR5cGVFcnJvciIsImVudmlyb25tZW50VG9TdHJpbmciLCJlbnZpcm9ubWVudCIsIm1hcCIsIldlYiIsIkRlc2t0b3AiLCJNb2JpbGUiLCJpc05vdFVuZGVmaW5lZE9yTnVsbCIsInZhbHVlIiwibm9vcCIsIkxvZ2dlciIsIndpbmRvdyIsImNvbnNvbGUiLCJpc1N1cHBvcnRlZCIsInRoaXMiLCJlbmFibGVkIiwibG9nIiwiZXJyb3IiLCJNZXNzYWdlUGF5bG9hZEFwaSIsIktleWJvYXJkTW9kaWZpZXIiLCJDb21wb25lbnRSZWxheSIsImNvbnN0cnVjdG9yIiwicGFyYW1zIiwiYWN0aXZlVGhlbWVzIiwiYWNjZXB0c1RoZW1lcyIsInRhcmdldFdpbmRvdyIsImNvbnRlbnRXaW5kb3ciLCJwcm9jZXNzUGFyYW1ldGVycyIsInJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIiLCJyZWdpc3RlcktleWJvYXJkRXZlbnRMaXN0ZW5lcnMiLCJyZWdpc3Rlck1vdXNlRXZlbnRMaXN0ZW5lcnMiLCJpbml0aWFsUGVybWlzc2lvbnMiLCJvblJlYWR5Iiwib25UaGVtZXNDaGFuZ2UiLCJjb2FsbGVzZWRTYXZpbmciLCJjb2FsbGVzZWRTYXZpbmdEZWxheSIsImNvbXBvbmVudCIsIm9uUmVhZHlDYWxsYmFjayIsIm9uVGhlbWVzQ2hhbmdlQ2FsbGJhY2siLCJkZWJ1ZyIsImRlaW5pdCIsIm1lc3NhZ2VRdWV1ZSIsInNlbnRNZXNzYWdlcyIsImxhc3RTdHJlYW1lZEl0ZW0iLCJwZW5kaW5nU2F2ZUl0ZW1zIiwicGVuZGluZ1NhdmVUaW1lb3V0IiwicGVuZGluZ1NhdmVQYXJhbXMiLCJtZXNzYWdlSGFuZGxlciIsImRvY3VtZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImtleURvd25FdmVudExpc3RlbmVyIiwia2V5VXBFdmVudExpc3RlbmVyIiwiY2xpY2tFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJkYXRhIiwicmVmZXJyZXIiLCJVUkwiLCJvcmlnaW4iLCJwYXJzZWREYXRhIiwic3RyIiwicmVzdWx0IiwiSlNPTiIsInBhcnNlIiwidHlwZSIsImUiLCJhY3Rpb24iLCJDb21wb25lbnRSZWdpc3RlcmVkIiwiaGFuZGxlTWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJjdHJsS2V5Iiwia2V5RG93bkV2ZW50IiwiQ3RybCIsInNoaWZ0S2V5IiwiU2hpZnQiLCJtZXRhS2V5IiwiTWV0YSIsImtleVVwRXZlbnQiLCJfZXZlbnQiLCJtb3VzZUNsaWNrRXZlbnQiLCJwYXlsb2FkIiwic2Vzc2lvbktleSIsImNvbXBvbmVudERhdGEiLCJBY3RpdmF0ZVRoZW1lcyIsImFjdGl2YXRlVGhlbWVzIiwidGhlbWVzIiwib3JpZ2luYWwiLCJvcmlnaW5hbE1lc3NhZ2UiLCJ0IiwiZmlsdGVyIiwibWVzc2FnZSIsIm1lc3NhZ2VJZCIsImV4dGVuc2lvbk5hbWUiLCJ0aXRsZSIsImFsZXJ0TWVzc2FnZSIsInJlcGxhY2UiLCJjYWxsYmFjayIsInBsYXRmb3JtIiwicmVxdWVzdFBlcm1pc3Npb25zIiwicG9zdE1lc3NhZ2UiLCJhY3RpdmVUaGVtZVVybHMiLCJUaGVtZXNBY3RpdmF0ZWQiLCJnZXRTZWxmQ29tcG9uZW50VVVJRCIsImlzUnVubmluZ0luRGVza3RvcEFwcGxpY2F0aW9uIiwiaXNSdW5uaW5nSW5Nb2JpbGVBcHBsaWNhdGlvbiIsImdldENvbXBvbmVudERhdGFWYWx1ZUZvcktleSIsInNldENvbXBvbmVudERhdGFWYWx1ZUZvcktleSIsIlNldENvbXBvbmVudERhdGEiLCJjbGVhckNvbXBvbmVudERhdGEiLCJhcGkiLCJDb21wb25lbnQiLCJnZW5lcmF0ZVVVSUQiLCJzZW50TWVzc2FnZSIsInN0cmluZ2lmeSIsInBvc3RNZXNzYWdlUGF5bG9hZCIsInBhcmVudCIsInBlcm1pc3Npb25zIiwiUmVxdWVzdFBlcm1pc3Npb25zIiwiaW5jb21pbmdVcmxzIiwic29ydCIsInRoZW1lc1RvQWN0aXZhdGUiLCJ0aGVtZXNUb0RlYWN0aXZhdGUiLCJhY3RpdmVVcmwiLCJpbmNsdWRlcyIsImNhbmRpZGF0ZSIsInRoZW1lVXJsIiwiZGVhY3RpdmF0ZVRoZW1lIiwibGluayIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsImJ0b2EiLCJocmVmIiwicmVsIiwibWVkaWEiLCJjbGFzc05hbWUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImFwcGVuZENoaWxkIiwidGhlbWVFbGVtZW50Rm9yVXJsIiwiQXJyYXkiLCJmcm9tIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsInNsaWNlIiwiZmluZCIsImVsZW1lbnQiLCJwYXJlbnROb2RlIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQ2hpbGQiLCJ1dWlkdjQiLCJzdHJlYW1JdGVtcyIsImNvbnRlbnRUeXBlcyIsIlN0cmVhbUl0ZW1zIiwiY29udGVudF90eXBlcyIsIml0ZW1zIiwic3RyZWFtQ29udGV4dEl0ZW0iLCJTdHJlYW1Db250ZXh0SXRlbSIsIml0ZW0iLCJjbGVhclRpbWVvdXQiLCJwZXJmb3JtU2F2aW5nT2ZJdGVtcyIsInNlbGVjdEl0ZW0iLCJTZWxlY3RJdGVtIiwianNvbk9iamVjdEZvckl0ZW0iLCJjbGVhclNlbGVjdGlvbiIsIkNsZWFyU2VsZWN0aW9uIiwiY29udGVudF90eXBlIiwiVGFnIiwiY3JlYXRlSXRlbSIsIkNyZWF0ZUl0ZW0iLCJhc3NvY2lhdGVJdGVtIiwiY3JlYXRlSXRlbXMiLCJtYXBwZWQiLCJDcmVhdGVJdGVtcyIsIkFzc29jaWF0ZUl0ZW0iLCJkZWFzc29jaWF0ZUl0ZW0iLCJEZWFzc29jaWF0ZUl0ZW0iLCJkZWxldGVJdGVtIiwiZGVsZXRlSXRlbXMiLCJEZWxldGVJdGVtcyIsInNlbmRDdXN0b21FdmVudCIsInNhdmVJdGVtIiwic2tpcERlYm91bmNlciIsInNhdmVJdGVtcyIsInNhdmVJdGVtV2l0aFByZXNhdmUiLCJwcmVzYXZlIiwic2F2ZUl0ZW1zV2l0aFByZXNhdmUiLCJjb25jZXJuVGltZW91dCIsInNldFRpbWVvdXQiLCJjb25jZXJuVGltZW91dHMiLCJmb3JFYWNoIiwidGltZW91dCIsImFsZXJ0IiwibWFwcGVkSXRlbXMiLCJTYXZlSXRlbXMiLCJpbmNvbWluZ0lkcyIsInByZWV4aXN0aW5nSXRlbXMiLCJjb25jYXQiLCJzZXRTaXplIiwid2lkdGgiLCJoZWlnaHQiLCJTZXRTaXplIiwia2V5Ym9hcmRNb2RpZmllciIsIktleURvd24iLCJLZXlVcCIsIkNsaWNrIiwiY29weSIsImFzc2lnbiIsImNoaWxkcmVuIiwiZ2V0SXRlbUFwcERhdGFWYWx1ZSIsImNvbnRlbnQiLCJhcHBEYXRhIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiYSIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIk9yZGVyZWRNYXAiLCJmb3VuZCIsInVwZGF0ZSIsIm5ld0tleSIsInJlbW92ZSIsInNwbGljZSIsImFkZFRvU3RhcnQiLCJhZGRUb0VuZCIsImFkZEJlZm9yZSIsInBsYWNlIiwid2l0aG91dCIsImYiLCJwcmVwZW5kIiwic2l6ZSIsInN1YnRyYWN0IiwiYXBwZW5kIiwidG9PYmplY3QiLCJmaW5kRGlmZlN0YXJ0IiwiYiIsInBvcyIsImNoaWxkQ291bnQiLCJjaGlsZEEiLCJjaGlsZCIsImNoaWxkQiIsInNhbWVNYXJrdXAiLCJpc1RleHQiLCJ0ZXh0IiwiaiIsImlubmVyIiwibm9kZVNpemUiLCJmaW5kRGlmZkVuZCIsInBvc0EiLCJwb3NCIiwiaUEiLCJpQiIsInNhbWUiLCJtaW5TaXplIiwiTWF0aCIsIm1pbiIsIkZyYWdtZW50Iiwibm9kZXNCZXR3ZWVuIiwidG8iLCJub2RlU3RhcnQiLCJlbmQiLCJzdGFydCIsIm1heCIsImRlc2NlbmRhbnRzIiwidGV4dEJldHdlZW4iLCJibG9ja1NlcGFyYXRvciIsImxlYWZUZXh0IiwiZmlyc3QiLCJub2RlIiwibm9kZVRleHQiLCJpc0xlYWYiLCJzcGVjIiwiaXNCbG9jayIsImlzVGV4dGJsb2NrIiwib3RoZXIiLCJsYXN0IiwibGFzdENoaWxkIiwiZmlyc3RDaGlsZCIsIndpdGhUZXh0IiwiY3V0IiwiY3V0QnlJbmRleCIsImVtcHR5IiwicmVwbGFjZUNoaWxkIiwiaW5kZXgiLCJjdXJyZW50IiwiZXEiLCJSYW5nZUVycm9yIiwibWF5YmVDaGlsZCIsInAiLCJvdGhlclBvcyIsImZpbmRJbmRleCIsInJvdW5kIiwicmV0SW5kZXgiLCJjdXJQb3MiLCJ0b1N0cmluZ0lubmVyIiwiam9pbiIsInRvSlNPTiIsImZyb21KU09OIiwic2NoZW1hIiwiaXNBcnJheSIsIm5vZGVGcm9tSlNPTiIsImZyb21BcnJheSIsImFycmF5Iiwiam9pbmVkIiwibm9kZXMiLCJhdHRycyIsImNvbXBhcmVEZWVwIiwiTWFyayIsImFkZFRvU2V0Iiwic2V0IiwicGxhY2VkIiwiZXhjbHVkZXMiLCJyYW5rIiwicmVtb3ZlRnJvbVNldCIsImlzSW5TZXQiLCJuYW1lIiwiXyIsImpzb24iLCJtYXJrcyIsIm1hcmsiLCJjcmVhdGUiLCJjaGVja0F0dHJzIiwic2FtZVNldCIsInNldEZyb20iLCJub25lIiwiUmVwbGFjZUVycm9yIiwib3BlblN0YXJ0Iiwib3BlbkVuZCIsImluc2VydEF0IiwiZnJhZ21lbnQiLCJpbnNlcnRJbnRvIiwicmVtb3ZlQmV0d2VlbiIsInJlbW92ZVJhbmdlIiwibWF4T3BlbiIsIm9wZW5Jc29sYXRpbmciLCJpc29sYXRpbmciLCJpbmRleFRvIiwib2Zmc2V0VG8iLCJkaXN0IiwiaW5zZXJ0IiwiY2FuUmVwbGFjZSIsIiRmcm9tIiwiJHRvIiwiZGVwdGgiLCJyZXBsYWNlT3V0ZXIiLCIkYWxvbmciLCJleHRyYSIsInJlc29sdmVOb0NhY2hlIiwicHJlcGFyZVNsaWNlRm9yUmVwbGFjZSIsInJlcGxhY2VUaHJlZVdheSIsInBhcmVudE9mZnNldCIsInJlcGxhY2VUd29XYXkiLCJjaGVja0pvaW4iLCJtYWluIiwic3ViIiwiY29tcGF0aWJsZUNvbnRlbnQiLCJqb2luYWJsZSIsIiRiZWZvcmUiLCIkYWZ0ZXIiLCJhZGROb2RlIiwidGFyZ2V0IiwiYWRkUmFuZ2UiLCIkc3RhcnQiLCIkZW5kIiwic3RhcnRJbmRleCIsImVuZEluZGV4IiwidGV4dE9mZnNldCIsIm5vZGVBZnRlciIsIm5vZGVCZWZvcmUiLCJjaGVja0NvbnRlbnQiLCJSZXNvbHZlZFBvcyIsInBhdGgiLCJyZXNvbHZlRGVwdGgiLCJ2YWwiLCJkb2MiLCJpbmRleEFmdGVyIiwiYmVmb3JlIiwiYWZ0ZXIiLCJkT2ZmIiwicG9zQXRJbmRleCIsInRtcCIsImluY2x1c2l2ZSIsIm1hcmtzQWNyb3NzIiwiaXNJbmxpbmUiLCJuZXh0Iiwic2hhcmVkRGVwdGgiLCJibG9ja1JhbmdlIiwicHJlZCIsImlubGluZUNvbnRlbnQiLCJOb2RlUmFuZ2UiLCJzYW1lUGFyZW50IiwicmVzb2x2ZSIsInJlbSIsInJlc29sdmVDYWNoZWQiLCJjYWNoZSIsInJlc29sdmVDYWNoZSIsImVsdHMiLCJlbHQiLCJSZXNvbHZlQ2FjaGUiLCJyZXNvbHZlQ2FjaGVTaXplIiwiV2Vha01hcCIsImVtcHR5QXR0cnMiLCJOb2RlIiwic3RhcnRQb3MiLCJ0ZXh0Q29udGVudCIsImhhc01hcmt1cCIsImRlZmF1bHRBdHRycyIsImluY2x1ZGVQYXJlbnRzIiwibm9kZUF0IiwiY2hpbGRBZnRlciIsImNoaWxkQmVmb3JlIiwicmFuZ2VIYXNNYXJrIiwiaXNBdG9tIiwidG9EZWJ1Z1N0cmluZyIsIndyYXBNYXJrcyIsImNvbnRlbnRNYXRjaEF0IiwibWF0Y2giLCJjb250ZW50TWF0Y2giLCJtYXRjaEZyYWdtZW50IiwicmVwbGFjZW1lbnQiLCJvbmUiLCJ0d28iLCJ2YWxpZEVuZCIsImFsbG93c01hcmtzIiwiY2FuUmVwbGFjZVdpdGgiLCJtYXRjaFR5cGUiLCJjYW5BcHBlbmQiLCJjaGVjayIsIm0iLCJtYXJrRnJvbUpTT04iLCJub2RlVHlwZSIsIlRleHROb2RlIiwic3VwZXIiLCJiYXNlIiwiQ29udGVudE1hdGNoIiwid3JhcENhY2hlIiwic3RyaW5nIiwibm9kZVR5cGVzIiwic3RyZWFtIiwiVG9rZW5TdHJlYW0iLCJleHByIiwicGFyc2VFeHByIiwiZXJyIiwibmZhIiwibGFiZWxlZCIsImV4cGxvcmUiLCJudWxsRnJvbSIsInN0YXRlcyIsIm91dCIsInRlcm0iLCJpbmRleE9mIiwic3RhdGUiLCJjbXAiLCJkZmEiLCJjb25uZWN0IiwiY29tcGlsZSIsImVkZ2UiLCJlZGdlcyIsImV4cHJzIiwicmVkdWNlIiwibG9vcCIsImN1ciIsIndvcmsiLCJkZWFkIiwiaGFzUmVxdWlyZWRBdHRycyIsImNoZWNrRm9yRGVhZEVuZHMiLCJmcmFnIiwiZGVmYXVsdFR5cGUiLCJjb21wYXRpYmxlIiwiZmlsbEJlZm9yZSIsInRvRW5kIiwic2VlbiIsInNlYXJjaCIsInR5cGVzIiwiZmluaXNoZWQiLCJ0cCIsImNyZWF0ZUFuZEZpbGwiLCJmaW5kV3JhcHBpbmciLCJjb21wdXRlZCIsImNvbXB1dGVXcmFwcGluZyIsImFjdGl2ZSIsInZpYSIsInNoaWZ0IiwicmV2ZXJzZSIsImVkZ2VDb3VudCIsInNjYW4iLCJpbmxpbmUiLCJ0b2tlbnMiLCJzcGxpdCIsInBvcCIsImVhdCIsInRvayIsIlN5bnRheEVycm9yIiwicGFyc2VFeHByU2VxIiwicGFyc2VFeHByU3Vic2NyaXB0IiwidGVzdCIsInR5cGVOYW1lIiwiaXNJbkdyb3VwIiwicmVzb2x2ZU5hbWUiLCJwYXJzZUV4cHJBdG9tIiwicGFyc2VFeHByUmFuZ2UiLCJwYXJzZU51bSIsIk51bWJlciIsImRlZmF1bHRzIiwiYXR0ck5hbWUiLCJhdHRyIiwiaGFzRGVmYXVsdCIsImRlZmF1bHQiLCJjb21wdXRlQXR0cnMiLCJidWlsdCIsImdpdmVuIiwidmFsdWVzIiwidmFsaWRhdGUiLCJpbml0QXR0cnMiLCJBdHRyaWJ1dGUiLCJOb2RlVHlwZSIsIm1hcmtTZXQiLCJncm91cHMiLCJncm91cCIsImF0b20iLCJ3aGl0ZXNwYWNlIiwiY29kZSIsImlzUmVxdWlyZWQiLCJjcmVhdGVDaGVja2VkIiwibWF0Y2hlZCIsInZhbGlkQ29udGVudCIsImFsbG93c01hcmtUeXBlIiwibWFya1R5cGUiLCJhbGxvd2VkTWFya3MiLCJ0b3BUeXBlIiwidG9wTm9kZSIsInZhbGlkYXRlVHlwZSIsIk1hcmtUeXBlIiwiZXhjbHVkZWQiLCJpbnN0YW5jZSIsIlNjaGVtYSIsImxpbmVicmVha1JlcGxhY2VtZW50IiwiY2FjaGVkIiwiaW5zdGFuY2VTcGVjIiwiY29udGVudEV4cHJDYWNoZSIsImNvbnRlbnRFeHByIiwibWFya0V4cHIiLCJnYXRoZXJNYXJrcyIsImV4Y2wiLCJ0b3BOb2RlVHlwZSIsIndyYXBwaW5ncyIsIm9rIiwiRE9NUGFyc2VyIiwicnVsZXMiLCJ0YWdzIiwic3R5bGVzIiwibWF0Y2hlZFN0eWxlcyIsInJ1bGUiLCJ0YWciLCJpc1RhZ1J1bGUiLCJzdHlsZSIsImlzU3R5bGVSdWxlIiwiZXhlYyIsIm5vcm1hbGl6ZUxpc3RzIiwic29tZSIsImRvbSIsImNvbnRleHQiLCJQYXJzZUNvbnRleHQiLCJhZGRBbGwiLCJmaW5pc2giLCJwYXJzZVNsaWNlIiwibWF0Y2hUYWciLCJtYXRjaGVzIiwibmFtZXNwYWNlIiwibmFtZXNwYWNlVVJJIiwibWF0Y2hlc0NvbnRleHQiLCJnZXRBdHRycyIsIm1hdGNoU3R5bGUiLCJjaGFyQ29kZUF0Iiwic2NoZW1hUnVsZXMiLCJwcmlvcml0eSIsInBhcnNlRE9NIiwiaWdub3JlIiwiY2xlYXJNYXJrIiwiZnJvbVNjaGVtYSIsImRvbVBhcnNlciIsImJsb2NrVGFncyIsImFkZHJlc3MiLCJhcnRpY2xlIiwiYXNpZGUiLCJibG9ja3F1b3RlIiwiY2FudmFzIiwiZGQiLCJkaXYiLCJkbCIsImZpZWxkc2V0IiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvb3RlciIsImZvcm0iLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJoZWFkZXIiLCJoZ3JvdXAiLCJociIsImxpIiwibm9zY3JpcHQiLCJvbCIsIm91dHB1dCIsInByZSIsInNlY3Rpb24iLCJ0YWJsZSIsInRmb290IiwidWwiLCJpZ25vcmVUYWdzIiwiaGVhZCIsIm9iamVjdCIsInNjcmlwdCIsImxpc3RUYWdzIiwid3NPcHRpb25zRm9yIiwicHJlc2VydmVXaGl0ZXNwYWNlIiwiT1BUX1BSRVNFUlZFX1dTIiwiTm9kZUNvbnRleHQiLCJzb2xpZCIsImFjdGl2ZU1hcmtzIiwiZmlsbCIsIndyYXAiLCJpbmxpbmVDb250ZXh0Iiwibm9kZU5hbWUiLCJwYXJzZXIiLCJpc09wZW4iLCJvcGVuIiwibG9jYWxQcmVzZXJ2ZVdTIiwidG9wQ29udGV4dCIsInRvcE9wdGlvbnMiLCJ0b3BNYXRjaCIsImZpbmRQb3NpdGlvbnMiLCJuZWVkc0Jsb2NrIiwidG9wIiwiYWRkRE9NIiwiYWRkVGV4dE5vZGUiLCJhZGRFbGVtZW50Iiwibm9kZVZhbHVlIiwicHJlc2VydmVXUyIsImRvbU5vZGVCZWZvcmUiLCJwcmV2aW91c1NpYmxpbmciLCJpbnNlcnROb2RlIiwiZmluZEluVGV4dCIsImZpbmRJbnNpZGUiLCJtYXRjaEFmdGVyIiwib3V0ZXJXUyIsInRhZ05hbWUiLCJ3aGl0ZVNwYWNlIiwicnVsZUlEIiwicHJldkl0ZW0iLCJuZXh0U2libGluZyIsIm5vcm1hbGl6ZUxpc3QiLCJydWxlRnJvbU5vZGUiLCJpZ25vcmVGYWxsYmFjayIsInNraXAiLCJjbG9zZVBhcmVudCIsInN5bmMiLCJvbGROZWVkc0Jsb2NrIiwibGVhZkZhbGxiYWNrIiwiaW5uZXJNYXJrcyIsInJlYWRTdHlsZXMiLCJhZGRFbGVtZW50QnlSdWxlIiwiY29uc3VtaW5nIiwib3duZXJEb2N1bWVudCIsImNyZWF0ZVRleHROb2RlIiwiZmluZFBsYWNlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImNvbnRpbnVlQWZ0ZXIiLCJlbnRlciIsInN0YXJ0SW4iLCJnZXRDb250ZW50IiwiY29udGVudERPTSIsImNvbnRlbnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImZpbmRBcm91bmQiLCJjaGlsZE5vZGVzIiwiZmluZEF0UG9pbnQiLCJjYXV0aW91cyIsInJvdXRlIiwicGVuYWx0eSIsImN4IiwiZW50ZXJJbm5lciIsImJsb2NrIiwidGV4dGJsb2NrRnJvbUNvbnRleHQiLCJjbG9zZUV4dHJhIiwibm9kZU1hcmtzIiwibWFya01heUFwcGx5IiwiYXBwbHlNYXJrcyIsInRvcE9wZW4iLCJjdXJyZW50UG9zIiwiY29udGFpbnMiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsInRleHROb2RlIiwicGFydHMiLCJvcHRpb24iLCJ1c2VSb290IiwibWluRGVwdGgiLCJwYXJ0IiwiJGNvbnRleHQiLCJkZWZsdCIsInNlbGVjdG9yIiwibXNNYXRjaGVzU2VsZWN0b3IiLCJ3ZWJraXRNYXRjaGVzU2VsZWN0b3IiLCJtb3pNYXRjaGVzU2VsZWN0b3IiLCJET01TZXJpYWxpemVyIiwic2VyaWFsaXplRnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwia2VlcCIsInJlbmRlcmVkIiwic3Bhbm5pbmciLCJhZGQiLCJtYXJrRE9NIiwic2VyaWFsaXplTWFyayIsInNlcmlhbGl6ZU5vZGVJbm5lciIsInJlbmRlclNwZWMiLCJzZXJpYWxpemVOb2RlIiwidG9ET00iLCJzdHJ1Y3R1cmUiLCJ4bWxOUyIsImJsb2NrQXJyYXlzSW4iLCJkb21TZXJpYWxpemVyIiwibm9kZXNGcm9tU2NoZW1hIiwibWFya3NGcm9tU2NoZW1hIiwiZ2F0aGVyVG9ET00iLCJzdXNwaWNpb3VzQXR0cmlidXRlQ2FjaGUiLCJzdXNwaWNpb3VzQXR0cmlidXRlcyIsInN1c3BpY2lvdXNBdHRyaWJ1dGVzSW5uZXIiLCJzdXNwaWNpb3VzIiwic3BhY2UiLCJjcmVhdGVFbGVtZW50TlMiLCJzZXRBdHRyaWJ1dGVOUyIsImlubmVyQ29udGVudCIsImZhY3RvcjE2IiwicG93IiwicmVjb3ZlckluZGV4IiwiTWFwUmVzdWx0IiwiZGVsSW5mbyIsInJlY292ZXIiLCJkZWxldGVkIiwiZGVsZXRlZEJlZm9yZSIsImRlbGV0ZWRBZnRlciIsImRlbGV0ZWRBY3Jvc3MiLCJTdGVwTWFwIiwicmFuZ2VzIiwiaW52ZXJ0ZWQiLCJkaWZmIiwicmVjb3Zlck9mZnNldCIsIm1hcFJlc3VsdCIsImFzc29jIiwiX21hcCIsInNpbXBsZSIsIm9sZEluZGV4IiwibmV3SW5kZXgiLCJvbGRTaXplIiwibmV3U2l6ZSIsImRlbCIsInRvdWNoZXMiLCJvbGRTdGFydCIsIm5ld1N0YXJ0IiwiaW52ZXJ0IiwiTWFwcGluZyIsIm1hcHMiLCJtaXJyb3IiLCJfbWFwcyIsIm93bkRhdGEiLCJhcHBlbmRNYXAiLCJtaXJyb3JzIiwic2V0TWlycm9yIiwiYXBwZW5kTWFwcGluZyIsIm1hcHBpbmciLCJzdGFydFNpemUiLCJtaXJyIiwiZ2V0TWlycm9yIiwiYXBwZW5kTWFwcGluZ0ludmVydGVkIiwidG90YWxTaXplIiwiaW52ZXJzZSIsImNvcnIiLCJzdGVwc0J5SUQiLCJTdGVwIiwiZ2V0TWFwIiwibWVyZ2UiLCJzdGVwVHlwZSIsImpzb25JRCIsInN0ZXBDbGFzcyIsIlN0ZXBSZXN1bHQiLCJmYWlsZWQiLCJmYWlsIiwiZnJvbVJlcGxhY2UiLCJtYXBGcmFnbWVudCIsIkFkZE1hcmtTdGVwIiwiYXBwbHkiLCJvbGRTbGljZSIsIlJlbW92ZU1hcmtTdGVwIiwiQWRkTm9kZU1hcmtTdGVwIiwidXBkYXRlZCIsIm5ld1NldCIsIlJlbW92ZU5vZGVNYXJrU3RlcCIsImNvbnRlbnRCZXR3ZWVuIiwiUmVwbGFjZUFyb3VuZFN0ZXAiLCJnYXBGcm9tIiwiZ2FwVG8iLCJnYXAiLCJpbnNlcnRlZCIsImNsZWFySW5jb21wYXRpYmxlIiwidHIiLCJwYXJlbnRUeXBlIiwiY2xlYXJOZXdsaW5lcyIsInJlcGxTdGVwcyIsImFsbG93ZWQiLCJzdGVwIiwibmV3bGluZSIsImNhbkN1dCIsInJhbmdlIiwid2l0aEF0dHJzIiwicmVwbGFjZU5ld2xpbmVzIiwibWFwRnJvbSIsInJlcGxhY2VXaXRoIiwicmVwbGFjZUxpbmVicmVha3MiLCJjYW5TcGxpdCIsInR5cGVzQWZ0ZXIiLCIkcG9zIiwiaW5uZXJUeXBlIiwicmVzdCIsIm92ZXJyaWRlQ2hpbGQiLCJiYXNlVHlwZSIsImNhbkFwcGVuZFdpdGhTdWJzdGl0dXRlZExpbmVicmVha3MiLCJmaXRzVHJpdmlhbGx5IiwiRml0dGVyIiwiZml0IiwidW5wbGFjZWQiLCJmcm9udGllciIsImZpbmRGaXR0YWJsZSIsInBsYWNlTm9kZXMiLCJvcGVuTW9yZSIsImRyb3BOb2RlIiwibW92ZUlubGluZSIsIm11c3RNb3ZlSW5saW5lIiwicGxhY2VkU2l6ZSIsImNsb3NlIiwic3RhcnREZXB0aCIsInBhc3MiLCJzbGljZURlcHRoIiwiY29udGVudEF0IiwiZnJvbnRpZXJEZXB0aCIsImluamVjdCIsIm9wZW5BdEVuZCIsImRyb3BGcm9tRnJhZ21lbnQiLCJjbG9zZUZyb250aWVyTm9kZSIsIm9wZW5Gcm9udGllck5vZGUiLCJ0YWtlbiIsIm9wZW5FbmRDb3VudCIsImNsb3NlTm9kZVN0YXJ0IiwiYWRkVG9GcmFnbWVudCIsImxldmVsIiwiY29udGVudEFmdGVyRml0cyIsImZpbmRDbG9zZUxldmVsIiwiZHJvcElubmVyIiwibW92ZSIsImNvdW50IiwiaW52YWxpZE1hcmtzIiwiY2xvc2VGcmFnbWVudCIsIm9sZE9wZW4iLCJuZXdPcGVuIiwiY292ZXJlZERlcHRocyIsIkF0dHJTdGVwIiwiRG9jQXR0clN0ZXAiLCJUcmFuc2Zvcm1FcnJvciIsIl9fcHJvdG9fXyIsIlRyYW5zZm9ybSIsInN0ZXBzIiwiZG9jcyIsIm1heWJlU3RlcCIsImFkZFN0ZXAiLCJkb2NDaGFuZ2VkIiwicmVwbGFjZVJhbmdlIiwiZGVsZXRlUmFuZ2UiLCJ0YXJnZXREZXB0aHMiLCJwcmVmZXJyZWRUYXJnZXQiLCJ1bnNoaWZ0IiwiZGVmaW5pbmciLCJkZWZpbmluZ0FzQ29udGV4dCIsInByZWZlcnJlZFRhcmdldEluZGV4IiwibGVmdE5vZGVzIiwicHJlZmVycmVkRGVwdGgiLCJsZWZ0Tm9kZSIsImRlZiIsImRlZmluaW5nRm9yQ29udGVudCIsImFicyIsIm9wZW5EZXB0aCIsInRhcmdldERlcHRoIiwiZXhwYW5kIiwic3RhcnRTdGVwcyIsInJlcGxhY2VSYW5nZVdpdGgiLCJwb2ludCIsImluc2VydFBvaW50IiwiY292ZXJlZCIsImRlbGV0ZSIsImxpZnQiLCJnYXBTdGFydCIsImdhcEVuZCIsInNwbGl0dGluZyIsImNvbnZlcnROZXdsaW5lcyIsImJlZm9yZVR5cGUiLCJzdXBwb3J0TGluZWJyZWFrIiwiJGZ1bGwiLCJ3cmFwcGVycyIsInNldEJsb2NrVHlwZSIsImF0dHJzSGVyZSIsImNhbkNoYW5nZVR5cGUiLCJzdGFydE0iLCJlbmRNIiwic2V0Tm9kZU1hcmt1cCIsIm5ld05vZGUiLCJzZXROb2RlQXR0cmlidXRlIiwic2V0RG9jQXR0cmlidXRlIiwiYWRkTm9kZU1hcmsiLCJyZW1vdmVOb2RlTWFyayIsInR5cGVBZnRlciIsImFkZE1hcmsiLCJyZW1vdmluZyIsImFkZGluZyIsInJlbW92ZWQiLCJhZGRlZCIsInMiLCJyZW1vdmVNYXJrIiwidG9SZW1vdmUiLCJjbGFzc2VzQnlJZCIsIlNlbGVjdGlvbiIsIiRhbmNob3IiLCIkaGVhZCIsIlNlbGVjdGlvblJhbmdlIiwiYW5jaG9yIiwibGFzdE5vZGUiLCJsYXN0UGFyZW50Iiwic2VsZWN0aW9uVG9JbnNlcnRpb25FbmQiLCJmaW5kRnJvbSIsImRpciIsInRleHRPbmx5IiwiZmluZFNlbGVjdGlvbkluIiwibmVhciIsImJpYXMiLCJBbGxTZWxlY3Rpb24iLCJhdFN0YXJ0IiwiYXRFbmQiLCJjbHMiLCJzZWxlY3Rpb25DbGFzcyIsImdldEJvb2ttYXJrIiwiYmV0d2VlbiIsInZpc2libGUiLCJ3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24iLCJjaGVja1RleHRTZWxlY3Rpb24iLCIkY3Vyc29yIiwiZW5zdXJlTWFya3MiLCJUZXh0Qm9va21hcmsiLCJkUG9zIiwiTm9kZUJvb2ttYXJrIiwiaXNTZWxlY3RhYmxlIiwic2VsZWN0YWJsZSIsInNlbCIsInNlbGVjdGlvbiIsInNldFNlbGVjdGlvbiIsIkFsbEJvb2ttYXJrIiwic3RhcnRMZW4iLCJfZnJvbSIsIl90byIsIl9uZXdGcm9tIiwibmV3VG8iLCJUcmFuc2FjdGlvbiIsImN1clNlbGVjdGlvbkZvciIsIm1ldGEiLCJ0aW1lIiwiRGF0ZSIsIm5vdyIsImN1clNlbGVjdGlvbiIsInN0b3JlZE1hcmtzIiwic2VsZWN0aW9uU2V0Iiwic2V0U3RvcmVkTWFya3MiLCJhZGRTdG9yZWRNYXJrIiwicmVtb3ZlU3RvcmVkTWFyayIsInN0b3JlZE1hcmtzU2V0Iiwic2V0VGltZSIsInJlcGxhY2VTZWxlY3Rpb24iLCJyZXBsYWNlU2VsZWN0aW9uV2l0aCIsImluaGVyaXRNYXJrcyIsImRlbGV0ZVNlbGVjdGlvbiIsImluc2VydFRleHQiLCJzZXRNZXRhIiwiZ2V0TWV0YSIsImlzR2VuZXJpYyIsInNjcm9sbEludG9WaWV3Iiwic2Nyb2xsZWRJbnRvVmlldyIsIkZpZWxkRGVzYyIsImRlc2MiLCJpbml0IiwiYmFzZUZpZWxkcyIsImNvbmZpZyIsIl9tYXJrcyIsIl9vbGQiLCJwcmV2IiwiQ29uZmlndXJhdGlvbiIsInBsdWdpbnMiLCJwbHVnaW5zQnlLZXkiLCJmaWVsZHMiLCJwbHVnaW4iLCJFZGl0b3JTdGF0ZSIsImFwcGx5VHJhbnNhY3Rpb24iLCJmaWx0ZXJUcmFuc2FjdGlvbiIsInJvb3RUciIsInRyYW5zYWN0aW9ucyIsInRycyIsIm5ld1N0YXRlIiwiYXBwbHlJbm5lciIsImhhdmVOZXciLCJhcHBlbmRUcmFuc2FjdGlvbiIsIm9sZFN0YXRlIiwibmV3SW5zdGFuY2UiLCJmaWVsZCIsIiRjb25maWciLCJyZWNvbmZpZ3VyZSIsInBsdWdpbkZpZWxkcyIsImJpbmRQcm9wcyIsIkZ1bmN0aW9uIiwiUGx1Z2luIiwicHJvcHMiLCJjcmVhdGVLZXkiLCJnZXRTdGF0ZSIsImtleXMiLCJQbHVnaW5LZXkiLCJkb21JbmRleCIsImFzc2lnbmVkU2xvdCIsImhvc3QiLCJyZXVzZWRSYW5nZSIsInRleHRSYW5nZSIsImNyZWF0ZVJhbmdlIiwic2V0RW5kIiwic2V0U3RhcnQiLCJpc0VxdWl2YWxlbnRQb3NpdGlvbiIsIm9mZiIsInRhcmdldE5vZGUiLCJ0YXJnZXRPZmYiLCJzY2FuRm9yIiwiYXRvbUVsZW1lbnRzIiwiaGFzQmxvY2tEZXNjIiwiY29udGVudEVkaXRhYmxlIiwicG1WaWV3RGVzYyIsInNlbGVjdGlvbkNvbGxhcHNlZCIsImRvbVNlbCIsImZvY3VzTm9kZSIsImZvY3VzT2Zmc2V0IiwiYW5jaG9yTm9kZSIsImFuY2hvck9mZnNldCIsImtleUV2ZW50Iiwia2V5Q29kZSIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwibmF2IiwibmF2aWdhdG9yIiwiYWdlbnQiLCJ1c2VyQWdlbnQiLCJpZV9lZGdlIiwiaWVfdXB0bzEwIiwiaWVfMTF1cCIsImllIiwiaWVfdmVyc2lvbiIsImRvY3VtZW50TW9kZSIsImdlY2tvIiwiX2Nocm9tZSIsImNocm9tZSIsImNocm9tZV92ZXJzaW9uIiwic2FmYXJpIiwidmVuZG9yIiwiaW9zIiwibWF4VG91Y2hQb2ludHMiLCJtYWMiLCJ3aW5kb3dzIiwiYW5kcm9pZCIsIndlYmtpdCIsImRvY3VtZW50RWxlbWVudCIsIndlYmtpdF92ZXJzaW9uIiwid2luZG93UmVjdCIsInZwIiwiZGVmYXVsdFZpZXciLCJ2aXN1YWxWaWV3cG9ydCIsImxlZnQiLCJyaWdodCIsImJvdHRvbSIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0IiwiZ2V0U2lkZSIsInNpZGUiLCJjbGllbnRSZWN0IiwicmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInNjYWxlWCIsIm9mZnNldFdpZHRoIiwic2NhbGVZIiwib2Zmc2V0SGVpZ2h0Iiwic2Nyb2xsUmVjdEludG9WaWV3IiwidmlldyIsInN0YXJ0RE9NIiwic2Nyb2xsVGhyZXNob2xkIiwic29tZVByb3AiLCJzY3JvbGxNYXJnaW4iLCJhdFRvcCIsImJvZHkiLCJib3VuZGluZyIsIm1vdmVYIiwibW92ZVkiLCJzY3JvbGxCeSIsInN0YXJ0WCIsInNjcm9sbExlZnQiLCJzdGFydFkiLCJzY3JvbGxUb3AiLCJkWCIsImRZIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInBvc2l0aW9uIiwib2Zmc2V0UGFyZW50Iiwic2Nyb2xsU3RhY2siLCJzdGFjayIsInJlc3RvcmVTY3JvbGxTdGFjayIsImRUb3AiLCJwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkIiwiZmluZE9mZnNldEluTm9kZSIsImNvb3JkcyIsImNsb3Nlc3QiLCJjb29yZHNDbG9zZXN0IiwiZmlyc3RCZWxvdyIsImNvb3Jkc0JlbG93IiwiZHhDbG9zZXN0Iiwicm93Qm90Iiwicm93VG9wIiwiY2hpbGRJbmRleCIsInJlY3RzIiwiZ2V0Q2xpZW50UmVjdHMiLCJkeCIsImxlbiIsInNpbmdsZVJlY3QiLCJpblJlY3QiLCJmaW5kT2Zmc2V0SW5UZXh0IiwiZWxlbWVudEZyb21Qb2ludCIsImJveCIsInN0YXJ0SSIsImZsb29yIiwicG9zQXRDb29yZHMiLCJjYXJldCIsIngiLCJ5IiwiY2FyZXRQb3NpdGlvbkZyb21Qb2ludCIsIm9mZnNldE5vZGUiLCJjYXJldFJhbmdlRnJvbVBvaW50Iiwic3RhcnRDb250YWluZXIiLCJzdGFydE9mZnNldCIsImNhcmV0RnJvbVBvaW50Iiwicm9vdCIsImRyYWdnYWJsZSIsInRhcmdldEtsdWRnZSIsIm91dHNpZGVCbG9jayIsInNhd0Jsb2NrIiwiZG9jVmlldyIsIm5lYXJlc3REZXNjIiwicG9zQmVmb3JlIiwicG9zQWZ0ZXIiLCJwb3NGcm9tRE9NIiwicG9zRnJvbUNhcmV0IiwicG9zRnJvbUVsZW1lbnQiLCJpbnNpZGUiLCJwb3NBdFN0YXJ0IiwiYm9yZGVyIiwibm9uWmVybyIsIkJJREkiLCJjb29yZHNBdFBvcyIsImRvbUZyb21Qb3MiLCJzdXBwb3J0RW1wdHlSYW5nZSIsInRha2VTaWRlIiwiZmxhdHRlblYiLCJyZWN0QmVmb3JlIiwicmVjdEFmdGVyIiwiZmxhdHRlbkgiLCJpZ25vcmVGb3JDb29yZHMiLCJ3aXRoRmx1c2hlZFN0YXRlIiwidmlld1N0YXRlIiwiYWN0aXZlRWxlbWVudCIsInVwZGF0ZVN0YXRlIiwiZm9jdXMiLCJtYXliZVJUTCIsImNhY2hlZFN0YXRlIiwiY2FjaGVkRGlyIiwiY2FjaGVkUmVzdWx0IiwiZW5kT2ZUZXh0YmxvY2siLCJuZWFyZXN0IiwiYm94ZXMiLCJlbmRPZlRleHRibG9ja1ZlcnRpY2FsIiwiZG9tU2VsZWN0aW9uIiwibW9kaWZ5Iiwib2xkTm9kZSIsIm9sZE9mZiIsImRvbVNlbGVjdGlvblJhbmdlIiwib2xkQmlkaUxldmVsIiwiY2FyZXRCaWRpTGV2ZWwiLCJwYXJlbnRET00iLCJkb21BZnRlclBvcyIsIm5ld09mZiIsImNvbGxhcHNlIiwiZXh0ZW5kIiwiZW5kT2ZUZXh0YmxvY2tIb3Jpem9udGFsIiwiVmlld0Rlc2MiLCJkaXJ0eSIsIm1hdGNoZXNXaWRnZXQiLCJ3aWRnZXQiLCJtYXRjaGVzTWFyayIsIm1hdGNoZXNOb2RlIiwib3V0ZXJEZWNvIiwiaW5uZXJEZWNvIiwibWF0Y2hlc0hhY2siLCJwYXJzZVJ1bGUiLCJzdG9wRXZlbnQiLCJkZXN0cm95IiwicG9zQmVmb3JlQ2hpbGQiLCJwb3NBdEVuZCIsImxvY2FsUG9zRnJvbURPTSIsImRvbUJlZm9yZSIsImRvbUFmdGVyIiwib25seU5vZGVzIiwibm9kZURPTSIsImdldERlc2MiLCJkZXNjQXQiLCJUcmFpbGluZ0hhY2tWaWV3RGVzYyIsIldpZGdldFZpZXdEZXNjIiwiZG9tQXRvbSIsInBhcnNlUmFuZ2UiLCJmcm9tT2Zmc2V0IiwidG9PZmZzZXQiLCJjaGlsZEJhc2UiLCJlbXB0eUNoaWxkQXQiLCJmb3JjZSIsImFuY2hvckRPTSIsImhlYWRET00iLCJnZXRTZWxlY3Rpb24iLCJzZWxSYW5nZSIsImJyS2x1ZGdlIiwiZG9tU2VsRXh0ZW5kZWQiLCJyZW1vdmVBbGxSYW5nZXMiLCJpZ25vcmVNdXRhdGlvbiIsIm11dGF0aW9uIiwiY29udGVudExvc3QiLCJtYXJrRGlydHkiLCJzdGFydEluc2lkZSIsImVuZEluc2lkZSIsIm1hcmtQYXJlbnRzRGlydHkiLCJyYXciLCJjbGFzc0xpc3QiLCJzdG9wIiwiaWdub3JlU2VsZWN0aW9uIiwiQ29tcG9zaXRpb25WaWV3RGVzYyIsInRleHRET00iLCJtdXQiLCJvbGRWYWx1ZSIsIk1hcmtWaWV3RGVzYyIsImN1c3RvbSIsIm5vZGVWaWV3cyIsInJlcGFyc2VJblZpZXciLCJyZXBsYWNlTm9kZXMiLCJOb2RlVmlld0Rlc2MiLCJkZXNjT2JqIiwiaGFzQXR0cmlidXRlIiwiYXBwbHlPdXRlckRlY28iLCJDdXN0b21Ob2RlVmlld0Rlc2MiLCJUZXh0Vmlld0Rlc2MiLCJzYW1lT3V0ZXJEZWNvIiwidXBkYXRlQ2hpbGRyZW4iLCJjb21wb3NpdGlvbiIsImNvbXBvc2luZyIsImxvY2FsQ29tcG9zaXRpb25JbmZvIiwibG9jYWxDb21wb3NpdGlvbiIsImNvbXBvc2l0aW9uSW5DaGlsZCIsInVwZGF0ZXIiLCJWaWV3VHJlZVVwZGF0ZXIiLCJkZWNvIiwib25XaWRnZXQiLCJvbk5vZGUiLCJsb2NhbHMiLCJmb3JDaGlsZCIsImRlY29JbmRleCIsInJlc3ROb2RlIiwicGFyZW50SW5kZXgiLCJ3aWRnZXRzIiwiY29tcGFyZVNpZGUiLCJjdXRBdCIsIml0ZXJEZWNvIiwiaW5zaWRlTm9kZSIsInN5bmNUb01hcmtzIiwicGxhY2VXaWRnZXQiLCJjb21wSW5kZXgiLCJmaW5kTm9kZU1hdGNoIiwiZmluZEluZGV4V2l0aENoaWxkIiwidXBkYXRlTm9kZUF0IiwidXBkYXRlTmV4dE5vZGUiLCJhZGRUZXh0YmxvY2tIYWNrcyIsImRlc3Ryb3lSZXN0IiwiY2hhbmdlZCIsInByb3RlY3RMb2NhbENvbXBvc2l0aW9uIiwicmVuZGVyRGVzY3MiLCJvbGRDU1MiLCJjc3NUZXh0IiwibGlzdFN0eWxlIiwiaW9zSGFja3MiLCJpbnB1dCIsImNvbXBvc2l0aW9uTm9kZSIsInRleHRQb3MiLCJjaGlsZFN0YXJ0IiwibGFzdEluZGV4T2YiLCJmaW5kVGV4dEluRnJhZ21lbnQiLCJjb21wb3NpdGlvbk5vZGVzIiwidXBkYXRlSW5uZXIiLCJ1cGRhdGVPdXRlckRlY28iLCJuZWVkc1dyYXAiLCJvbGRET00iLCJwYXRjaE91dGVyRGVjbyIsImNvbXB1dGVPdXRlckRlY28iLCJzZWxlY3ROb2RlIiwiZGVzZWxlY3ROb2RlIiwicmVtb3ZlQXR0cmlidXRlIiwiZG9jVmlld0Rlc2MiLCJwbUlzRGVjbyIsImluUGFyZW50IiwidHJhY2tXcml0ZXMiLCJtdWx0aVR5cGUiLCJkZXNjcyIsIndyaXR0ZW4iLCJjaGlsZERPTSIsInJtIiwiaW5zZXJ0QmVmb3JlIiwiT3V0ZXJEZWNvTGV2ZWwiLCJub0RlY28iLCJjbGFzcyIsIm91dGVyRE9NIiwicHJldkNvbXB1dGVkIiwiY3VyQ29tcHV0ZWQiLCJjdXJET00iLCJwYXRjaEF0dHJpYnV0ZXMiLCJwcmV2TGlzdCIsIkJvb2xlYW4iLCJjdXJMaXN0IiwicmVtb3ZlUHJvcGVydHkiLCJsb2NrIiwicHJlTWF0Y2giLCJwYXJlbnREZXNjIiwiY3VyRGVzYyIsImRlc2NJIiwiZkkiLCJNYXAiLCJvdXRlciIsImRlc3Ryb3lCZXR3ZWVuIiwibWF4S2VlcCIsImlzTG9ja2VkIiwibWFya0Rlc2MiLCJ0YXJnZXREZXNjIiwiaGFzIiwiZG9tTm9kZSIsIm5leHRET00iLCJsb2NrZWQiLCJyZWNyZWF0ZVdyYXBwZXIiLCJ3cmFwcGVyIiwiY2giLCJyZXF1aXJlc0dlY2tvSGFja05vZGUiLCJhZGRIYWNrTm9kZSIsImFsdCIsImhhY2siLCJzZWxlY3Rpb25Gcm9tRE9NIiwiaW5XaWRnZXQiLCJuZWFyZXN0RGVzY05vZGUiLCJpc09uRWRnZSIsInJhbmdlQ291bnQiLCJnZXRSYW5nZUF0IiwiZW5kQ29udGFpbmVyIiwiZW5kT2Zmc2V0Iiwic2VsZWN0aW9uQmV0d2VlbiIsImVkaXRvck93bnNTZWxlY3Rpb24iLCJlZGl0YWJsZSIsImhhc0ZvY3VzIiwiaGFzU2VsZWN0aW9uIiwic2VsZWN0aW9uVG9ET00iLCJzeW5jTm9kZVNlbGVjdGlvbiIsIm1vdXNlRG93biIsImFsbG93RGVmYXVsdCIsImN1clNlbCIsImRvbU9ic2VydmVyIiwiY3VycmVudFNlbGVjdGlvbiIsImRlbGF5ZWRTZWxlY3Rpb25TeW5jIiwic2V0Q3VyU2VsZWN0aW9uIiwiZGlzY29ubmVjdFNlbGVjdGlvbiIsImN1cnNvcldyYXBwZXIiLCJpbWciLCJkaXNhYmxlZCIsInNlbGVjdEN1cnNvcldyYXBwZXIiLCJyZXNldEVkaXRhYmxlRnJvbSIsInJlc2V0RWRpdGFibGVUbyIsImJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlIiwidGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIiLCJyZXNldEVkaXRhYmxlIiwiaGlkZVNlbGVjdGlvbkd1YXJkIiwicmVtb3ZlQ2xhc3NPblNlbGVjdGlvbkNoYW5nZSIsImNvbm5lY3RTZWxlY3Rpb24iLCJzZXRFZGl0YWJsZSIsIndhc0RyYWdnYWJsZSIsImxhc3RTZWxlY3RlZFZpZXdEZXNjIiwiY2xlYXJOb2RlU2VsZWN0aW9uIiwiaGFzRm9jdXNBbmRTZWxlY3Rpb24iLCJtb3ZlU2VsZWN0aW9uQmxvY2siLCIkc2lkZSIsImRpc3BhdGNoIiwic2VsZWN0SG9yaXpvbnRhbGx5IiwibW9kcyIsIiRuZXdIZWFkIiwibm9kZVBvcyIsIm5vZGVMZW4iLCJpc0lnbm9yYWJsZSIsInNraXBJZ25vcmVkTm9kZXMiLCJtb3ZlTm9kZSIsIm1vdmVPZmZzZXQiLCJpc0Jsb2NrTm9kZSIsInNldFNlbEZvY3VzIiwic2tpcElnbm9yZWROb2Rlc0JlZm9yZSIsInNraXBJZ25vcmVkTm9kZXNBZnRlciIsInRleHROb2RlQWZ0ZXIiLCJ0ZXh0Tm9kZUJlZm9yZSIsImZpbmREaXJlY3Rpb24iLCJtaWQiLCJkaXJlY3Rpb24iLCJzZWxlY3RWZXJ0aWNhbGx5IiwiYmV5b25kIiwic3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUiLCJuZXh0Tm9kZSIsInN3aXRjaEVkaXRhYmxlIiwiY2FwdHVyZUtleURvd24iLCJhbHRLZXkiLCJnZXRNb2RzIiwic2FmYXJpRG93bkFycm93QnVnIiwic2VyaWFsaXplRm9yQ2xpcGJvYXJkIiwic2VyaWFsaXplciIsImRldGFjaGVkRG9jIiwid3JhcE1hcCIsInBhcnNlRnJvbUNsaXBib2FyZCIsImh0bWwiLCJwbGFpblRleHQiLCJpbkNvZGUiLCJhc1RleHQiLCJwYXJzZWQiLCJtZXRhcyIsImZpcnN0VGFnIiwiaW5uZXJIVE1MIiwidHJ1c3RlZFR5cGVzIiwiX3BvbGljeSIsImRlZmF1bHRQb2xpY3kiLCJjcmVhdGVQb2xpY3kiLCJjcmVhdGVIVE1MIiwibWF5YmVXcmFwVHJ1c3RlZCIsInJlYWRIVE1MIiwicXVlcnlTZWxlY3RvckFsbCIsInJlc3RvcmVSZXBsYWNlZFNwYWNlcyIsImNvbnRleHROb2RlIiwic2xpY2VEYXRhIiwiZ2V0QXR0cmlidXRlIiwiaW5saW5lUGFyZW50cyIsImFkZENvbnRleHQiLCJjbG9zZVNsaWNlIiwibGFzdFdyYXAiLCJpbkxhc3QiLCJhZGRUb1NpYmxpbmciLCJjbG9zZVJpZ2h0Iiwid3JhcHBlZCIsIndpdGhXcmFwcGVycyIsIm5vcm1hbGl6ZVNpYmxpbmdzIiwic2libGluZyIsImNsb3NlUmFuZ2UiLCJ0aGVhZCIsInRib2R5IiwiY2FwdGlvbiIsImNvbGdyb3VwIiwiY29sIiwidGQiLCJ0aCIsIl9kZXRhY2hlZERvYyIsImltcGxlbWVudGF0aW9uIiwiY3JlYXRlSFRNTERvY3VtZW50IiwiaGFuZGxlcnMiLCJlZGl0SGFuZGxlcnMiLCJwYXNzaXZlSGFuZGxlcnMiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwiSW5wdXRTdGF0ZSIsImxhc3RLZXlDb2RlIiwibGFzdEtleUNvZGVUaW1lIiwibGFzdENsaWNrIiwiYnV0dG9uIiwibGFzdFNlbGVjdGlvbk9yaWdpbiIsImxhc3RTZWxlY3Rpb25UaW1lIiwibGFzdElPU0VudGVyIiwibGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0IiwibGFzdEZvY3VzIiwibGFzdFRvdWNoIiwibGFzdENocm9tZURlbGV0ZSIsImNvbXBvc2luZ1RpbWVvdXQiLCJjb21wb3NpdGlvbkVuZGVkQXQiLCJjb21wb3NpdGlvbklEIiwiY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyIsImRvbUNoYW5nZUNvdW50IiwiZXZlbnRIYW5kbGVycyIsInNldFNlbGVjdGlvbk9yaWdpbiIsImVuc3VyZUxpc3RlbmVycyIsImN1cnJlbnRIYW5kbGVycyIsInJ1bkN1c3RvbUhhbmRsZXIiLCJoYW5kbGVyIiwiZGVmYXVsdFByZXZlbnRlZCIsImV2ZW50QmVsb25nc1RvVmlldyIsImJ1YmJsZXMiLCJldmVudENvb3JkcyIsImNsaWVudFgiLCJjbGllbnRZIiwicnVuSGFuZGxlck9uQ29udGV4dCIsInByb3BOYW1lIiwidXBkYXRlU2VsZWN0aW9uIiwiZm9jdXNlZCIsImhhbmRsZVNpbmdsZUNsaWNrIiwic2VsZWN0ZWROb2RlIiwic2VsZWN0QXQiLCJzZWxlY3RDbGlja2VkTm9kZSIsInNlbGVjdENsaWNrZWRMZWFmIiwiaGFuZGxlRG91YmxlQ2xpY2siLCJoYW5kbGVUcmlwbGVDbGljayIsImRlZmF1bHRUcmlwbGVDbGljayIsImZvcmNlRE9NRmx1c2giLCJlbmRDb21wb3NpdGlvbiIsImtleWRvd24iLCJpbk9yTmVhckNvbXBvc2l0aW9uIiwiZm9yY2VGbHVzaCIsInByZXZlbnREZWZhdWx0Iiwia2V5dXAiLCJrZXlwcmVzcyIsImNoYXJDb2RlIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2VsZWN0Tm9kZU1vZGlmaWVyIiwibW91c2Vkb3duIiwiZmx1c2hlZCIsImNsaWNrIiwiZHkiLCJpc05lYXIiLCJkb25lIiwiTW91c2VEb3duIiwidGFyZ2V0UG9zIiwibWlnaHREcmFnIiwic3RhcnREb2MiLCJhZGRBdHRyIiwic2V0VW5lZGl0YWJsZSIsInVwIiwidXBkYXRlQWxsb3dEZWZhdWx0IiwiYnV0dG9ucyIsInRpbWVTdGFtcCIsImNvbnRleHRtZW51IiwidGltZW91dENvbXBvc2l0aW9uIiwic2NoZWR1bGVDb21wb3NlRW5kIiwiZGVsYXkiLCJjbGVhckNvbXBvc2l0aW9uIiwidGltZXN0YW1wRnJvbUN1c3RvbUV2ZW50IiwiZmluZENvbXBvc2l0aW9uTm9kZSIsInRleHRCZWZvcmUiLCJ0ZXh0Tm9kZUJlZm9yZSQxIiwidGV4dEFmdGVyIiwidGV4dE5vZGVBZnRlciQxIiwiZGVzY0FmdGVyIiwibGFzdENoYW5nZWQiLCJsYXN0Q2hhbmdlZFRleHROb2RlIiwiZGVzY0JlZm9yZSIsInJlc3RhcnRpbmciLCJmbHVzaGluZ1Nvb24iLCJtYXJrQ3Vyc29yIiwiY29tcG9zaXRpb25zdGFydCIsImNvbXBvc2l0aW9udXBkYXRlIiwiZmx1c2giLCJjb21wb3NpdGlvbmVuZCIsInBlbmRpbmdSZWNvcmRzIiwiUHJvbWlzZSIsInRoZW4iLCJicm9rZW5DbGlwYm9hcmRBUEkiLCJkb1Bhc3RlIiwicHJlZmVyUGxhaW4iLCJzaW5nbGVOb2RlIiwic2xpY2VTaW5nbGVOb2RlIiwiZ2V0VGV4dCIsImNsaXBib2FyZERhdGEiLCJnZXREYXRhIiwidXJpcyIsImNsZWFyRGF0YSIsInNldERhdGEiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJibHVyIiwiY2FwdHVyZUNvcHkiLCJwYXN0ZSIsInBsYWluIiwiY2FwdHVyZVBhc3RlIiwiRHJhZ2dpbmciLCJkcmFnQ29weU1vZGlmaWVyIiwiZHJhZ01vdmVzIiwibW92ZXMiLCJkcmFnc3RhcnQiLCJkYXRhVHJhbnNmZXIiLCJkcmFnZ2VkU2xpY2UiLCJmaWxlcyIsImVmZmVjdEFsbG93ZWQiLCJkcmFnZ2luZyIsImRyYWdlbmQiLCJkcmFnb3ZlciIsImRyYWdlbnRlciIsImRyb3AiLCJldmVudFBvcyIsIiRtb3VzZSIsImluc2VydFBvcyIsImZpdHMiLCJ3cmFwcGluZyIsImRyb3BQb2ludCIsImlzTm9kZSIsImJlZm9yZUluc2VydCIsInJlbGF0ZWRUYXJnZXQiLCJjbGVhciIsImJlZm9yZWlucHV0IiwiaW5wdXRUeXBlIiwiZmx1c2hTb29uIiwiY29tcGFyZU9ianMiLCJXaWRnZXRUeXBlIiwibm9TcGVjIiwic3BhbiIsIm9sZE9mZnNldCIsIkRlY29yYXRpb24iLCJ2YWxpZCIsIklubGluZVR5cGUiLCJpbmNsdXNpdmVTdGFydCIsImluY2x1c2l2ZUVuZCIsImlzIiwiRGVjb3JhdGlvblNldCIsImxvY2FsIiwiZGVjb3JhdGlvbnMiLCJidWlsZFRyZWUiLCJwcmVkaWNhdGUiLCJmaW5kSW5uZXIiLCJjaGlsZE9mZiIsIm1hcElubmVyIiwibmV3TG9jYWwiLCJvblJlbW92ZSIsIm9sZENoaWxkcmVuIiwiYmFzZU9mZnNldCIsIm1vdmVkIiwib2xkRW5kIiwibmV3RW5kIiwiZFNpemUiLCJtdXN0UmVidWlsZCIsImZyb21Mb2NhbCIsInRvTG9jYWwiLCJjaGlsZE9mZnNldCIsImNoaWxkTm9kZSIsImdhdGhlciIsIm1hcEFuZEdhdGhlclJlbWFpbmluZ0RlY29yYXRpb25zIiwiYnlQb3MiLCJtYXBDaGlsZHJlbiIsImFkZElubmVyIiwidGFrZVNwYW5zRm9yTm9kZSIsIm1vdmVTcGFucyIsIndpdGhvdXROdWxscyIsInJlbW92ZUlubmVyIiwiZGVjIiwibG9jYWxTZXQiLCJEZWNvcmF0aW9uR3JvdXAiLCJyZW1vdmVPdmVybGFwIiwibG9jYWxzSW5uZXIiLCJmb3JFYWNoU2V0IiwibWVtYmVycyIsIm1hcHBlZERlY29zIiwibWVtYmVyIiwic29ydGVkIiwiZXZlcnkiLCJzcGFucyIsImhhc051bGxzIiwibG9jYWxTdGFydCIsInN1YnRyZWUiLCJ3b3JraW5nIiwiaW5zZXJ0QWhlYWQiLCJ2aWV3RGVjb3JhdGlvbnMiLCJvYnNlcnZlT3B0aW9ucyIsImNoaWxkTGlzdCIsImNoYXJhY3RlckRhdGEiLCJjaGFyYWN0ZXJEYXRhT2xkVmFsdWUiLCJhdHRyaWJ1dGVzIiwiYXR0cmlidXRlT2xkVmFsdWUiLCJ1c2VDaGFyRGF0YSIsIlNlbGVjdGlvblN0YXRlIiwiRE9NT2JzZXJ2ZXIiLCJoYW5kbGVET01DaGFuZ2UiLCJxdWV1ZSIsIm9ic2VydmVyIiwib25DaGFyRGF0YSIsInN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJyZW1vdmVkTm9kZXMiLCJwcmV2VmFsdWUiLCJvblNlbGVjdGlvbkNoYW5nZSIsInRha2VSZWNvcmRzIiwib2JzZXJ2ZSIsInRha2UiLCJkaXNjb25uZWN0Iiwic3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzIiwiaWdub3JlU2VsZWN0aW9uQ2hhbmdlIiwiY29udGFpbmVyIiwiYW5jZXN0b3JzIiwiU2V0IiwibmV3U2VsIiwidHlwZU92ZXIiLCJyZWdpc3Rlck11dGF0aW9uIiwiYnJzIiwiYnIiLCJibG9ja1BhcmVudCIsInJlYWRTZWwiLCJzY3JvbGxUb1NlbGVjdGlvbiIsImNzc0NoZWNrZWQiLCJjc3NDaGVja1dhcm5lZCIsImNoZWNrQ1NTIiwiYXR0cmlidXRlTmFtZSIsImFkZGVkTm9kZXMiLCJyYW5nZVRvU2VsZWN0aW9uUmFuZ2UiLCJjdXJyZW50QW5jaG9yIiwiZG9tQXRQb3MiLCJyZWFkRE9NQ2hhbmdlIiwic2hhcmVkIiwicHJlZmVycmVkUG9zIiwicHJlZmVycmVkU2lkZSIsImZyb21fIiwidG9fIiwicGFyc2VCZXR3ZWVuIiwiY29tcGFyZSIsImNoYW5nZSIsImVuZEEiLCJlbmRCIiwiaXNTdXJyb2dhdGVQYWlyIiwiZmluZERpZmYiLCJyZXNvbHZlU2VsZWN0aW9uIiwibmV4dFNlbCIsIiRmcm9tQSIsImlubGluZUNoYW5nZSIsIm9sZCIsIiRuZXdTdGFydCIsIiRuZXdFbmQiLCJza2lwQ2xvc2luZ0FuZE9wZW5pbmciLCIkbmV4dCIsImxvb2tzTGlrZUJhY2tzcGFjZSIsIm1hcmtDaGFuZ2UiLCJjaEZyb20iLCJjaFRvIiwiY3VyTWFya3MiLCJwcmV2TWFya3MiLCJpc01hcmtDaGFuZ2UiLCJwYXJzZWRTZWwiLCJmcm9tRW5kIiwibWF5T3BlbiIsIkVkaXRvclZpZXciLCJfcm9vdCIsIm1vdW50ZWQiLCJwcmV2RGlyZWN0UGx1Z2lucyIsInBsdWdpblZpZXdzIiwiX3Byb3BzIiwiZGlyZWN0UGx1Z2lucyIsImNoZWNrU3RhdGVDb21wb25lbnQiLCJtb3VudCIsImdldEVkaXRhYmxlIiwidXBkYXRlQ3Vyc29yV3JhcHBlciIsImJ1aWxkTm9kZVZpZXdzIiwiY29tcHV0ZURvY0RlY28iLCJwYXNzaXZlIiwiaW5pdElucHV0IiwidXBkYXRlUGx1Z2luVmlld3MiLCJoYW5kbGVET01FdmVudHMiLCJwcmV2UHJvcHMiLCJ1cGRhdGVTdGF0ZUlubmVyIiwic2V0UHJvcHMiLCJfYSIsInJlZHJhdyIsInVwZGF0ZVNlbCIsInBsdWdpbnNDaGFuZ2VkIiwibkEiLCJuQiIsImNoYW5nZWROb2RlVmlld3MiLCJzY3JvbGwiLCJ1cGRhdGVEb2MiLCJvbGRTY3JvbGxQb3MiLCJvdmVyZmxvd0FuY2hvciIsInJlZkRPTSIsInJlZlRvcCIsImlubmVySGVpZ2h0IiwibG9jYWxSZWN0Iiwic3RvcmVTY3JvbGxQb3MiLCJmb3JjZVNlbFVwZGF0ZSIsInNlbDEiLCJzZWwyIiwic2VsZWN0aW9uQ29udGV4dENoYW5nZWQiLCJjaHJvbWVLbHVkZ2UiLCJhbmNob3JJblJpZ2h0UGxhY2UiLCJ1cGRhdGVEcmFnZ2VkTm9kZSIsIm5ld1JlZlRvcCIsInJlc2V0U2Nyb2xsUG9zIiwiZGVzdHJveVBsdWdpblZpZXdzIiwicHJldlN0YXRlIiwicGx1Z2luVmlldyIsIm1vdmVkUG9zIiwicGFyZW50RWxlbWVudCIsInNldEFjdGl2ZSIsInN0b3JlZCIsInByZXZlbnRTY3JvbGwiLCJmb2N1c1ByZXZlbnRTY3JvbGwiLCJnZXRQcm90b3R5cGVPZiIsInVwZGF0ZVJvb3QiLCJwb3NBdERPTSIsInBhc3RlSFRNTCIsIkNsaXBib2FyZEV2ZW50IiwicGFzdGVUZXh0IiwiZGVzdHJveUlucHV0IiwiaXNEZXN0cm95ZWQiLCJkaXNwYXRjaEV2ZW50IiwiZGlzcGF0Y2hUcmFuc2FjdGlvbiIsInNoYWRvd1Jvb3QiLCJkZWVwQWN0aXZlRWxlbWVudCIsImdldENvbXBvc2VkUmFuZ2VzIiwicmVhZCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsImdldFRhcmdldFJhbmdlcyIsImV4ZWNDb21tYW5kIiwic2FmYXJpU2hhZG93U2VsZWN0aW9uUmFuZ2UiLCJjb250ZW50ZWRpdGFibGUiLCJ0cmFuc2xhdGUiLCJHT09EX0xFQUZfU0laRSIsIlJvcGVTZXF1ZW5jZSIsImxlYWZBcHBlbmQiLCJsZWFmUHJlcGVuZCIsImFwcGVuZElubmVyIiwiQXBwZW5kIiwic2xpY2VJbm5lciIsImdldElubmVyIiwiZm9yRWFjaElubmVyIiwiZm9yRWFjaEludmVydGVkSW5uZXIiLCJMZWFmIiwicHJvdG90eXBlQWNjZXNzb3JzIiwiY29uZmlndXJhYmxlIiwiZmxhdHRlbiIsImRlZmluZVByb3BlcnRpZXMiLCJsZWZ0TGVuIiwiQnJhbmNoIiwiZXZlbnRDb3VudCIsInBvcEV2ZW50IiwicHJlc2VydmVJdGVtcyIsInJlbWFwIiwicmVtYXBwaW5nIiwicmVtYWluaW5nIiwidHJhbnNmb3JtIiwiYWRkQWZ0ZXIiLCJJdGVtIiwiYWRkVHJhbnNmb3JtIiwiaGlzdE9wdGlvbnMiLCJuZXdJdGVtcyIsIm9sZEl0ZW1zIiwibGFzdEl0ZW0iLCJtZXJnZWQiLCJvdmVyZmxvdyIsIkRFUFRIX09WRVJGTE9XIiwiY3V0UG9pbnQiLCJjdXRPZmZFdmVudHMiLCJtaXJyb3JQb3MiLCJtaXJyb3JPZmZzZXQiLCJhZGRNYXBzIiwicmViYXNlZCIsInJlYmFzZWRUcmFuc2Zvcm0iLCJyZWJhc2VkQ291bnQiLCJyZWJhc2VkSXRlbXMiLCJuZXdVbnRpbCIsImlSZWJhc2VkIiwibmV3TWFwcyIsImJyYW5jaCIsImVtcHR5SXRlbUNvdW50IiwiY29tcHJlc3MiLCJ1cHRvIiwiZXZlbnRzIiwibmV3SXRlbSIsIkhpc3RvcnlTdGF0ZSIsInVuZG9uZSIsInByZXZSYW5nZXMiLCJwcmV2VGltZSIsInByZXZDb21wb3NpdGlvbiIsInJhbmdlc0ZvciIsIm1hcFJhbmdlcyIsImNhY2hlZFByZXNlcnZlSXRlbXMiLCJjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyIsIm11c3RQcmVzZXJ2ZUl0ZW1zIiwiaGlzdG9yeVByZXNlcnZlSXRlbXMiLCJoaXN0b3J5S2V5IiwiY2xvc2VIaXN0b3J5S2V5IiwibmV3R3JvdXBEZWxheSIsImhpc3QiLCJoaXN0b3J5IiwiaGlzdG9yeVRyIiwiaGlzdG9yeVN0YXRlIiwiYXBwZW5kZWQiLCJyZWRvIiwibmV3R3JvdXAiLCJhZGphY2VudCIsImlzQWRqYWNlbnRUbyIsImNvbW1hbmQiLCJ1bmRvIiwiYnVpbGRDb21tYW5kIiwibmV3SGlzdCIsImhpc3RUcmFuc2FjdGlvbiIsIklucHV0UnVsZSIsImN1dE9mZiIsInVuZG9hYmxlIiwiaW5Db2RlTWFyayIsInJ1biIsImVsbGlwc2lzIiwic21hcnRRdW90ZXMiLCJ0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlIiwicmVnZXhwIiwib2xET00iLCJ1bERPTSIsImxpRE9NIiwib3JkZXJlZExpc3QiLCJvcmRlciIsImJ1bGxldExpc3QiLCJsaXN0SXRlbSIsIndyYXBJbkxpc3QiLCJsaXN0VHlwZSIsImRvSm9pbiIsIm91dGVyUmFuZ2UiLCIkaW5zZXJ0IiwiaW5uZXJSYW5nZSIsImFyb3VuZCIsImZpbmRXcmFwcGluZ091dHNpZGUiLCJpbm5lck1hdGNoIiwiZmluZFdyYXBwaW5nSW5zaWRlIiwiam9pbkJlZm9yZSIsInNwbGl0RGVwdGgiLCJzcGxpdFBvcyIsImRvV3JhcEluTGlzdCIsIndyYXBSYW5nZUluTGlzdCIsInNwbGl0TGlzdEl0ZW0iLCJpdGVtVHlwZSIsIml0ZW1BdHRycyIsImdyYW5kUGFyZW50IiwiZGVwdGhCZWZvcmUiLCJkZXB0aEFmdGVyIiwibmV4dFR5cGUiLCJsaWZ0TGlzdEl0ZW0iLCJlbmRPZkxpc3QiLCJsaWZ0VG9PdXRlckxpc3QiLCJsaXN0IiwiaW5kZXhCZWZvcmUiLCJsaWZ0T3V0T2ZMaXN0IiwicERPTSIsImJsb2NrcXVvdGVET00iLCJockRPTSIsInByZURPTSIsImJyRE9NIiwicGFyYWdyYXBoIiwiaG9yaXpvbnRhbF9ydWxlIiwiaGVhZGluZyIsImNvZGVfYmxvY2siLCJpbWFnZSIsInNyYyIsImhhcmRfYnJlYWsiLCJlbURPTSIsInN0cm9uZ0RPTSIsImNvZGVET00iLCJlbSIsInN0cm9uZyIsImZvbnRXZWlnaHQiLCJNQVJLRE9XTl9FU0NBUEVEX0FUVFIiLCJBVVRPX0xJTktfQVRUUiIsIkVESVRPUl9DTFMiLCJkb2NTcGVjIiwiaGVhZGluZzFTcGVjIiwiaGVhZGluZzJTcGVjIiwiaGVhZGluZzNTcGVjIiwicGFyYWdyYXBoU3BlYyIsIkNoZWNrYm94U3RhdHVzIiwiY2hlY2tsaXN0SXRlbVNwZWMiLCJzdGF0dXMiLCJFTVBUWSIsIkRPTkUiLCJjaGVja2VkIiwiY29kZUJsb2NrU3BlYyIsImNoZWNrbGlzdF9pdGVtIiwidW5vcmRlcmVkX2xpc3QiLCJvcmRlcmVkX2xpc3QiLCJsaXN0X2l0ZW0iLCJoZWFkaW5nMSIsImhlYWRpbmcyIiwiaGVhZGluZzMiLCJtYXJrV3JhcHBpbmdSdWxlIiwiYyIsImlzVmFsaWRJbnNpZGVDb2RlTWFyayIsIlJlZ0V4cCIsImV4aXN0aW5nTWFya3MiLCJlbmRQb3MiLCJsaXN0VHlwZVJ1bGUiLCJwcmVmaXgiLCJyYW5nZUFmdGVyUHJlZml4Iiwic2xpY2VBZnRlclByZWZpeCIsImlucHV0UnVsZXNQbHVnaW4iLCJoYW5kbGVUZXh0SW5wdXQiLCJpc0lucHV0UnVsZXMiLCJpbnB1dFJ1bGVzIiwiUkVTRVRfSEFTX0ZPUkNFRF9TUEFDRV9NRVRBIiwiaW5wdXRSdWxlc0ZvcmNlZFNwYWNlUGx1Z2luIiwiaGFzRm9yY2VkU3BhY2UiLCJwcmV2aW91cyIsInBsdWdpbk1ldGEiLCJmb3JjZWRTcGFjZVBvcyIsImF0QmxvY2tTdGFydCIsInRleHRibG9ja0F0Iiwib25seSIsImZpbmRDdXRCZWZvcmUiLCJhdEJsb2NrRW5kIiwiZmluZEN1dEFmdGVyIiwiZGVmYXVsdEJsb2NrQXQiLCJzcGxpdEJsb2NrIiwic3BsaXRUeXBlIiwic3BsaXROb2RlIiwiY2FuIiwiJGZpcnN0IiwiZGVsZXRlQmFycmllciIsIiRjdXQiLCJjb25uIiwiaXNvbGF0ZWQiLCJqb2luTWF5YmVDbGVhciIsImNhbkRlbEFmdGVyIiwiJGpvaW5BdCIsInNlbEFmdGVyIiwiYXQiLCJhZnRlclRleHQiLCJhZnRlckRlcHRoIiwic2VsZWN0VGV4dGJsb2NrU2lkZSIsInNlbGVjdFRleHRibG9ja1N0YXJ0Iiwic2VsZWN0VGV4dGJsb2NrRW5kIiwidG9nZ2xlTWFyayIsInJlbW92ZVdoZW5QcmVzZW50IiwiZW50ZXJBdG9tcyIsImVudGVySW5saW5lQXRvbXMiLCJkcm9wU3BhY2UiLCJpbmNsdWRlV2hpdGVzcGFjZSIsIm1hcmtBcHBsaWVzIiwicmVtb3ZlSW5saW5lQXRvbXMiLCJtaXNzaW5nIiwic3BhY2VTdGFydCIsInNwYWNlRW5kIiwiY2hhaW5Db21tYW5kcyIsImNvbW1hbmRzIiwiYmFja3NwYWNlIiwiZGVsU3RlcCIsInBjQmFzZUtleW1hcCIsImFib3ZlIiwibWFjQmFzZUtleW1hcCIsImJhc2VLZXltYXAiLCJvcyIsImlzTGlzdEJsb2NrIiwibGlzdFR5cGVzIiwiQVBQTFlfRk9STUFUX0FUVFIiLCJzd2FwVGV4dEJsb2NrIiwibGlzdEJsb2NrUmFuZ2UiLCJnZXRMaXN0QmxvY2tSYW5nZSIsImNvbnRhaW5zTmVzdGVkTGlzdCIsImlzV2l0aGluTmVzdGVkTGlzdCIsImluZGVudExpc3RTZWxlY3Rpb24iLCJuZXN0ZWRCZWZvcmUiLCIkcmFuZ2VTdGFydCIsIiRyYW5nZUVuZCIsIm91dGRlbnRMaXN0U2VsZWN0aW9uIiwiY2FuT3V0ZGVudExpc3RTZWxlY3Rpb24iLCJMaW5rTW9kYWwiLCJlbCIsIm9uQ29uZmlybSIsIm9uQ2xlYXIiLCJ1cmwiLCJzaG93Q2xzIiwiY29uZmlybUJ0biIsImhhbmRsZUNvbmZpcm0iLCJjYW5jZWxCdG4iLCJoYW5kbGVDYW5jZWwiLCJjbGVhckJ0biIsImhhbmRsZUNsZWFyIiwiaGFuZGxlR2xvYmFsS2V5ZG93biIsInRleHRJbnB1dCIsInVybElucHV0IiwiaXNFbnRlciIsImhhbmRsZUdsb2JhbENsaWNrIiwiZnJhbWVFbCIsIlRvb2xiYXJQbHVnaW4iLCJ0b29sYmFyRWwiLCJtb2RhbEVsIiwidmlld0luc3RhbmNlIiwiaGFuZGxlVG9vbGJhckNsaWNrIiwidW5oaWdobGlnaHRTZWxlY3RlZEF0dHJzIiwibW9kYWwiLCJfcHJldmlvdXNTdGF0ZSIsInVwZGF0ZVRvb2xiYXJGb3JTZWxlY3Rpb24iLCJoYW5kbGVLZXlEb3duIiwiX3ZpZXciLCJoYXNDdHJsIiwiaGFzTW9kIiwiaGFzU2hpZnQiLCJ0b2dnbGVDaGVja2xpc3RJdGVtIiwidG9nZ2xlTGlzdCIsInByb21vdGVIZWFkaW5nIiwiaGFzQ2hlY2tlZCIsInRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZSIsImFjdGl2YXRlTGlua01vZGFsIiwibGlua01hcmtBdFN0YXJ0IiwibGlua01hcmtBdEVuZCIsInNlbGVjdGlvbklzSW5zaWRlTGluayIsIm5ld1NlbGVjdGlvbiIsInNlbGVjdGVkQXR0cnMiLCJnZXRTZWxlY3RlZEZvcm1hdEF0dHJzIiwiYnRuIiwiZ2V0U2VsZWN0ZWRGb3JtYXRBbmRNYXJrcyIsInNlbGVjdGVkIiwiY3VycmVudFR5cGUiLCJtYXJrVHlwZXMiLCJpbmxpbmVfbGluayIsInN0b3BQcm9wYWdhdGlvbiIsImFwcGx5Rm9ybWF0IiwiZGF0YUZvcm1hdFN0ciIsIlNIT1dfQ0xTIiwiSFRUUF9MSU5LIiwiTUFJTFRPX0xJTksiLCJUb29sdGlwUGx1Z2luIiwibm9kZVRvQW5jaG9ySHJlZiIsImhpZGUiLCJwcmV2aW91c1N0YXRlIiwiY2hlY2tTZWxlY3Rpb24iLCJ3aXRoaW5MaW5rIiwic2hvdyIsInRvb2x0aXBFbCIsImlzQXV0b0xpbmsiLCJsaW5rVGV4dEVsIiwiaW5uZXJUZXh0IiwiYW5jaG9yRWwiLCJ0b2dnbGUiLCJhY3R1YWxXaWR0aCIsImF2YWlsYWJsZVdpZHRoIiwic2Nyb2xsZWQiLCJFZGl0b3JFeHRlbmRlclBsdWdpbiIsImV4dGVuZGVyRWwiLCJoYW5kbGVDbGljayIsImxhc3RQb3MiLCJsYXN0Tm9kZVR5cGUiLCJyYW5kb21VVUlEIiwidW5zYWZlU3RyaW5naWZ5IiwiU05fSVRFTV9TQVZFX0tFWSIsImdldE5hbWVzcGFjZWRDb250ZW50IiwiZ2V0VXVpZCIsIkNsaWVudCIsInJlc29sdmVDbGllbnRSZWFkeSIsIl9pdGVtIiwic2hvdWxkQ2FsbExpc3RlbmVycyIsIm5leHRJdGVtIiwicHJldmlvdXNJdGVtIiwiaXNNZXRhZGF0YVVwZGF0ZSIsImxhc3RTYXZlZEJ5IiwiZ2V0TGFzdFNhdmVkQnkiLCJfaWQiLCJfbGlzdGVuZXJzIiwiX3JlYWR5IiwiY29tcG9uZW50TWFuYWdlciIsImNhbGxMaXN0ZW5lcnMiLCJsaXN0ZW5lciIsImxhdGVzdERvYyIsImdldERvYyIsImxhdGVzdFRleHQiLCJvblVwZGF0ZSIsInJlYWR5Iiwic2F2ZU5vdGUiLCJqc29uRG9jIiwibWREb2MiLCJ0ZXh0UHJldmlldyIsInRvU2F2ZSIsInByZXZpZXdfcGxhaW4iLCJpdGVtU2VsZWN0b3JzIiwiY2xpZW50IiwiQ0hFQ0tCT1hfQ0hFQ0tFRF9DTEFTU05BTUUiLCJnZXRQb3MiLCJpbnB1dERpdiIsImNsaWNrVGFyZ2V0RGl2IiwidGFiSW5kZXgiLCJmb2N1c0hhbmRsZXIiLCJjbGlja0hhbmRsZXIiLCJub3JtYWxpemVLZXlOYW1lIiwiY3RybCIsIm1vZCIsIm1vZGlmaWVycyIsImtleW1hcCIsImJpbmRpbmdzIiwia2V5ZG93bkhhbmRsZXIiLCJub3JtYWxpemUiLCJiYXNlTmFtZSIsImtleU5hbWUiLCJkaXJlY3QiLCJub1NoaWZ0IiwiZnJvbUNvZGUiLCJyZWN1cnNpdmVEZWxldGVFbXB0eSIsImtleW1hcFBsdWdpbnMiLCJCYWNrc3BhY2UiLCJlbnN1cmVDaGVja2xpc3RJdGVtVGV4dFNlbGVjdGlvbiIsImFwcGxpY2FibGUiLCJFbnRlciIsIm5leHQkRnJvbSIsIm5leHRGcm9tIiwiZW5zdXJlVGV4dFNlbGVjdGlvbkluRW1wdHlOb2RlIiwicG9zc2libGVTZWxlY3Rpb24iLCJkZWNvZGVDYWNoZSIsImRlY29kZSIsImV4Y2x1ZGUiLCJkZWZhdWx0Q2hhcnMiLCJ0b1VwcGVyQ2FzZSIsImdldERlY29kZUNhY2hlIiwic2VxIiwibCIsImIxIiwicGFyc2VJbnQiLCJiMiIsImNociIsImIzIiwiYjQiLCJjb21wb25lbnRDaGFycyIsImVuY29kZUNhY2hlIiwiZW5jb2RlIiwia2VlcEVzY2FwZWQiLCJnZXRFbmNvZGVDYWNoZSIsIm5leHRDb2RlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZm9ybWF0IiwicHJvdG9jb2wiLCJzbGFzaGVzIiwiYXV0aCIsImhvc3RuYW1lIiwicG9ydCIsInBhdGhuYW1lIiwiaGFzaCIsIlVybCIsInByb3RvY29sUGF0dGVybiIsInBvcnRQYXR0ZXJuIiwic2ltcGxlUGF0aFBhdHRlcm4iLCJ1bndpc2UiLCJhdXRvRXNjYXBlIiwibm9uSG9zdENoYXJzIiwiaG9zdEVuZGluZ0NoYXJzIiwiaG9zdG5hbWVQYXJ0UGF0dGVybiIsImhvc3RuYW1lUGFydFN0YXJ0IiwiaG9zdGxlc3NQcm90b2NvbCIsImphdmFzY3JpcHQiLCJzbGFzaGVkUHJvdG9jb2wiLCJodHRwIiwiaHR0cHMiLCJmdHAiLCJnb3BoZXIiLCJmaWxlIiwic2xhc2hlc0Rlbm90ZUhvc3QiLCJsb3dlclByb3RvIiwiaGVjIiwidHJpbSIsInNpbXBsZVBhdGgiLCJwcm90byIsImF0U2lnbiIsImhvc3RFbmQiLCJwYXJzZUhvc3QiLCJpcHY2SG9zdG5hbWUiLCJob3N0cGFydHMiLCJuZXdwYXJ0IiwiayIsInZhbGlkUGFydHMiLCJub3RIb3N0IiwiYml0IiwicW0iLCJ1IiwiaXNTdHJpbmciLCJfY2xhc3MiLCJfaGFzT3duUHJvcGVydHkiLCJzb3VyY2UiLCJhcnJheVJlcGxhY2VBdCIsIm5ld0VsZW1lbnRzIiwiaXNWYWxpZEVudGl0eUNvZGUiLCJzdXJyb2dhdGUxIiwic3Vycm9nYXRlMiIsIlVORVNDQVBFX01EX1JFIiwiVU5FU0NBUEVfQUxMX1JFIiwiRElHSVRBTF9FTlRJVFlfVEVTVF9SRSIsInVuZXNjYXBlTWQiLCJ1bmVzY2FwZUFsbCIsImVzY2FwZWQiLCJlbnRpdHkiLCJkZWNvZGVkIiwicmVwbGFjZUVudGl0eVBhdHRlcm4iLCJIVE1MX0VTQ0FQRV9URVNUX1JFIiwiSFRNTF9FU0NBUEVfUkVQTEFDRV9SRSIsIkhUTUxfUkVQTEFDRU1FTlRTIiwicmVwbGFjZVVuc2FmZUNoYXIiLCJlc2NhcGVIdG1sIiwiUkVHRVhQX0VTQ0FQRV9SRSIsImVzY2FwZVJFIiwiaXNTcGFjZSIsImlzV2hpdGVTcGFjZSIsImlzUHVuY3RDaGFyIiwiaXNNZEFzY2lpUHVuY3QiLCJub3JtYWxpemVSZWZlcmVuY2UiLCJsaWIiLCJtZHVybCIsInBhcnNlTGlua0xhYmVsIiwiZGlzYWJsZU5lc3RlZCIsIm1hcmtlciIsInByZXZQb3MiLCJwb3NNYXgiLCJvbGRQb3MiLCJtZCIsInNraXBUb2tlbiIsImxhYmVsRW5kIiwicGFyc2VMaW5rRGVzdGluYXRpb24iLCJwYXJzZUxpbmtUaXRsZSIsInByZXZfc3RhdGUiLCJjYW5fY29udGludWUiLCJkZWZhdWx0X3J1bGVzIiwiUmVuZGVyZXIiLCJjb2RlX2lubGluZSIsImlkeCIsImVudiIsInNsZiIsInRva2VuIiwicmVuZGVyQXR0cnMiLCJmZW5jZSIsImluZm8iLCJoaWdobGlnaHRlZCIsImxhbmdOYW1lIiwibGFuZ0F0dHJzIiwiaGlnaGxpZ2h0IiwiYXR0ckluZGV4IiwidG1wQXR0cnMiLCJsYW5nUHJlZml4IiwidG1wVG9rZW4iLCJyZW5kZXJJbmxpbmVBc1RleHQiLCJyZW5kZXJUb2tlbiIsImhhcmRicmVhayIsInhodG1sT3V0Iiwic29mdGJyZWFrIiwiYnJlYWtzIiwiaHRtbF9ibG9jayIsImh0bWxfaW5saW5lIiwiaGlkZGVuIiwibmVzdGluZyIsIm5lZWRMZiIsIm5leHRUb2tlbiIsInJlbmRlcklubGluZSIsInJlbmRlciIsIlJ1bGVyIiwiX19ydWxlc19fIiwiX19jYWNoZV9fIiwiX19maW5kX18iLCJfX2NvbXBpbGVfXyIsImNoYWlucyIsImFsdE5hbWUiLCJjaGFpbiIsImZuIiwib3B0IiwiYmVmb3JlTmFtZSIsInJ1bGVOYW1lIiwiYWZ0ZXJOYW1lIiwiZW5hYmxlIiwiaWdub3JlSW52YWxpZCIsImVuYWJsZU9ubHkiLCJkaXNhYmxlIiwiZ2V0UnVsZXMiLCJjaGFpbk5hbWUiLCJUb2tlbiIsIm1hcmt1cCIsImF0dHJQdXNoIiwiYXR0ckRhdGEiLCJhdHRyU2V0IiwiYXR0ckdldCIsImF0dHJKb2luIiwiU3RhdGVDb3JlIiwiaW5saW5lTW9kZSIsIk5FV0xJTkVTX1JFIiwiTlVMTF9SRSIsImlzTGlua0Nsb3NlIiwiUkFSRV9SRSIsIlNDT1BFRF9BQkJSX1RFU1RfUkUiLCJTQ09QRURfQUJCUl9SRSIsIlNDT1BFRF9BQkJSIiwidG0iLCJyZXBsYWNlRm4iLCJyZXBsYWNlX3Njb3BlZCIsImlubGluZVRva2VucyIsImluc2lkZV9hdXRvbGluayIsInJlcGxhY2VfcmFyZSIsIlFVT1RFX1RFU1RfUkUiLCJRVU9URV9SRSIsInJlcGxhY2VBdCIsInByb2Nlc3NfaW5saW5lcyIsInRoaXNMZXZlbCIsIk9VVEVSIiwibGFzdEluZGV4IiwiY2FuT3BlbiIsImNhbkNsb3NlIiwiaXNTaW5nbGUiLCJsYXN0Q2hhciIsIm5leHRDaGFyIiwiaXNMYXN0UHVuY3RDaGFyIiwiaXNOZXh0UHVuY3RDaGFyIiwiaXNMYXN0V2hpdGVTcGFjZSIsImlzTmV4dFdoaXRlU3BhY2UiLCJzaW5nbGUiLCJvcGVuUXVvdGUiLCJjbG9zZVF1b3RlIiwicXVvdGVzIiwiX3J1bGVzIiwiYmxvY2tUb2tlbnMiLCJsaW5raWZ5IiwicHJldGVzdCIsImh0bWxMaW5rTGV2ZWwiLCJjdXJyZW50VG9rZW4iLCJsaW5rcyIsImxuIiwiZnVsbFVybCIsIm5vcm1hbGl6ZUxpbmsiLCJ2YWxpZGF0ZUxpbmsiLCJ1cmxUZXh0Iiwibm9ybWFsaXplTGlua1RleHQiLCJ0b2tlbl9vIiwidG9rZW5fdCIsInRva2VuX2MiLCJibGtJZHgiLCJ0eXBvZ3JhcGhlciIsImN1cnIiLCJDb3JlIiwicnVsZXIiLCJwcm9jZXNzIiwiU3RhdGUiLCJTdGF0ZUJsb2NrIiwiYk1hcmtzIiwiZU1hcmtzIiwidFNoaWZ0Iiwic0NvdW50IiwiYnNDb3VudCIsImJsa0luZGVudCIsImxpbmUiLCJsaW5lTWF4IiwidGlnaHQiLCJkZEluZGVudCIsImxpc3RJbmRlbnQiLCJpbmRlbnQiLCJpbmRlbnRfZm91bmQiLCJpc0VtcHR5Iiwic2tpcEVtcHR5TGluZXMiLCJza2lwU3BhY2VzIiwic2tpcFNwYWNlc0JhY2siLCJza2lwQ2hhcnMiLCJza2lwQ2hhcnNCYWNrIiwiZ2V0TGluZXMiLCJiZWdpbiIsImtlZXBMYXN0TEYiLCJsaW5lSW5kZW50IiwibGluZVN0YXJ0IiwiZ2V0TGluZSIsImVzY2FwZWRTcGxpdCIsImlzRXNjYXBlZCIsInN1YnN0cmluZyIsInNraXBCdWxsZXRMaXN0TWFya2VyIiwic3RhcnRMaW5lIiwic2tpcE9yZGVyZWRMaXN0TWFya2VyIiwib3Blbl90YWciLCJjbG9zZV90YWciLCJIVE1MX1RBR19SRSIsIkhUTUxfT1BFTl9DTE9TRV9UQUdfUkUiLCJIVE1MX1NFUVVFTkNFUyIsImVuZExpbmUiLCJzaWxlbnQiLCJuZXh0TGluZSIsImZpcnN0Q2giLCJzZWNvbmRDaCIsImxpbmVUZXh0IiwiY29sdW1ucyIsImFsaWducyIsImNvbHVtbkNvdW50Iiwib2xkUGFyZW50VHlwZSIsInRlcm1pbmF0b3JSdWxlcyIsInRhYmxlTGluZXMiLCJ0b2tlbl9obyIsInRva2VuX2lsIiwidGJvZHlMaW5lcyIsImF1dG9jb21wbGV0ZWRDZWxscyIsInRlcm1pbmF0ZSIsInRva2VuX3RkbyIsIm1lbSIsImhhdmVFbmRNYXJrZXIiLCJvbGRMaW5lTWF4Iiwib2xkQk1hcmtzIiwib2xkQlNDb3VudCIsIm9sZFNDb3VudCIsIm9sZFRTaGlmdCIsImxhc3RMaW5lRW1wdHkiLCJpc091dGRlbnRlZCIsInNwYWNlQWZ0ZXJNYXJrZXIiLCJhZGp1c3RUYWIiLCJpbml0aWFsIiwib2xkSW5kZW50IiwibGluZXMiLCJ0b2tlbml6ZSIsImNudCIsImlzT3JkZXJlZCIsIm1hcmtlclZhbHVlIiwicG9zQWZ0ZXJNYXJrZXIiLCJpc1Rlcm1pbmF0aW5nUGFyYWdyYXBoIiwibWFya2VyQ2hhckNvZGUiLCJsaXN0VG9rSWR4IiwibGlzdExpbmVzIiwicHJldkVtcHR5RW5kIiwiY29udGVudFN0YXJ0IiwiaW5kZW50QWZ0ZXJNYXJrZXIiLCJpdGVtTGluZXMiLCJvbGRUaWdodCIsIm9sZExpc3RJbmRlbnQiLCJtYXJrVGlnaHRQYXJhZ3JhcGhzIiwiX2VuZExpbmUiLCJnZXROZXh0TGluZSIsImlzQ29udGludWF0aW9uIiwibGluZUNvbnRlbnQiLCJkZXN0UmVzIiwiaGVscGVycyIsImRlc3RFbmRQb3MiLCJkZXN0RW5kTGluZU5vIiwidGl0bGVSZXMiLCJsYWJlbCIsInJlZmVyZW5jZXMiLCJ0b2tlbl9pIiwiUGFyc2VyQmxvY2siLCJtYXhOZXN0aW5nIiwiaGFzRW1wdHlMaW5lcyIsInByZXZMaW5lIiwib3V0VG9rZW5zIiwiU3RhdGVJbmxpbmUiLCJ0b2tlbnNfbWV0YSIsInBlbmRpbmciLCJwZW5kaW5nTGV2ZWwiLCJkZWxpbWl0ZXJzIiwiX3ByZXZfZGVsaW1pdGVycyIsImJhY2t0aWNrcyIsImJhY2t0aWNrc1NjYW5uZWQiLCJsaW5rTGV2ZWwiLCJwdXNoUGVuZGluZyIsInRva2VuX21ldGEiLCJzY2FuRGVsaW1zIiwiY2FuU3BsaXRXb3JkIiwibGVmdF9mbGFua2luZyIsInJpZ2h0X2ZsYW5raW5nIiwiY2FuX29wZW4iLCJjYW5fY2xvc2UiLCJpc1Rlcm1pbmF0b3JDaGFyIiwiU0NIRU1FX1JFIiwiRVNDQVBFRCIsInBvc3RQcm9jZXNzIiwibG9uZU1hcmtlcnMiLCJzdGFydERlbGltIiwiZW5kRGVsaW0iLCJzY2FubmVkIiwiaXNTdHJvbmciLCJFTUFJTF9SRSIsIkFVVE9MSU5LX1JFIiwiRElHSVRBTF9SRSIsIk5BTUVEX1JFIiwicHJvY2Vzc0RlbGltaXRlcnMiLCJvcGVuZXJzQm90dG9tIiwiaGVhZGVySWR4IiwibGFzdFRva2VuSWR4IiwianVtcHMiLCJjbG9zZXJJZHgiLCJjbG9zZXIiLCJtaW5PcGVuZXJJZHgiLCJvcGVuZXJJZHgiLCJuZXdNaW5PcGVuZXJJZHgiLCJvcGVuZXIiLCJpc09kZE1hdGNoIiwibGFzdEp1bXAiLCJtYXRjaEF0U3RhcnQiLCJwbWF4Iiwid3MiLCJjaDEiLCJlc2NhcGVkU3RyIiwiY2gyIiwib3JpZ1N0ciIsIm9wZW5lckxlbmd0aCIsIm1hdGNoU3RhcnQiLCJtYXRjaEVuZCIsImNsb3Nlckxlbmd0aCIsInJlcyIsInJlZiIsInBhcnNlUmVmZXJlbmNlIiwibGFiZWxTdGFydCIsImxjIiwiaXNMZXR0ZXIiLCJfcnVsZXMyIiwiUGFyc2VySW5saW5lIiwicnVsZXIyIiwiaXNGdW5jdGlvbiIsImRlZmF1bHRPcHRpb25zIiwiZnV6enlMaW5rIiwiZnV6enlFbWFpbCIsImZ1enp5SVAiLCJkZWZhdWx0U2NoZW1hcyIsInRhaWwiLCJyZSIsInNyY19hdXRoIiwic3JjX2hvc3RfcG9ydF9zdHJpY3QiLCJzcmNfcGF0aCIsIm5vX2h0dHAiLCJzcmNfZG9tYWluIiwic3JjX2RvbWFpbl9yb290Iiwic3JjX3BvcnQiLCJzcmNfaG9zdF90ZXJtaW5hdG9yIiwibWFpbHRvIiwic3JjX2VtYWlsX25hbWUiLCJzcmNfaG9zdF9zdHJpY3QiLCJ0bGRzX2RlZmF1bHQiLCJvcHRzIiwic3JjX0FueSIsInNyY19DYyIsInNyY19aIiwic3JjX1AiLCJzcmNfWlBDYyIsInNyY19aQ2MiLCJ0ZXh0X3NlcGFyYXRvcnMiLCJzcmNfcHNldWRvX2xldHRlciIsInNyY19pcDQiLCJzcmNfeG4iLCJzcmNfaG9zdCIsInRwbF9ob3N0X2Z1enp5IiwidHBsX2hvc3Rfbm9faXBfZnV6enkiLCJ0cGxfaG9zdF9mdXp6eV9zdHJpY3QiLCJ0cGxfaG9zdF9wb3J0X2Z1enp5X3N0cmljdCIsInRwbF9ob3N0X3BvcnRfbm9faXBfZnV6enlfc3RyaWN0IiwidHBsX2hvc3RfZnV6enlfdGVzdCIsInRwbF9lbWFpbF9mdXp6eSIsInRwbF9saW5rX2Z1enp5IiwidHBsX2xpbmtfbm9faXBfZnV6enkiLCJfX29wdHNfXyIsInRsZHMiLCJfX3RsZHNfXyIsInVudHBsIiwidHBsIiwic3JjX3RsZHMiLCJvbkNvbXBpbGUiLCJfX3RsZHNfcmVwbGFjZWRfXyIsImVtYWlsX2Z1enp5IiwibGlua19mdXp6eSIsImxpbmtfbm9faXBfZnV6enkiLCJob3N0X2Z1enp5X3Rlc3QiLCJhbGlhc2VzIiwic2NoZW1hRXJyb3IiLCJfX2NvbXBpbGVkX18iLCJfX3NjaGVtYXNfXyIsImNvbXBpbGVkIiwiaXNSZWdFeHAiLCJjcmVhdGVWYWxpZGF0b3IiLCJhbGlhcyIsInNsaXN0Iiwic2NoZW1hX3Rlc3QiLCJzY2hlbWFfc2VhcmNoIiwic2NoZW1hX2F0X3N0YXJ0IiwiX19pbmRleF9fIiwiX190ZXh0X2NhY2hlX18iLCJyZXNldFNjYW5DYWNoZSIsIk1hdGNoIiwiX19sYXN0X2luZGV4X18iLCJfX3NjaGVtYV9fIiwiY3JlYXRlTWF0Y2giLCJMaW5raWZ5SXQiLCJzY2hlbWFzIiwiYWNjIiwibWwiLCJtZSIsInRsZF9wb3MiLCJhdF9wb3MiLCJ0ZXN0U2NoZW1hQXQiLCJrZWVwT2xkIiwibWF4SW50IiwicmVnZXhQdW55Y29kZSIsInJlZ2V4Tm9uQVNDSUkiLCJyZWdleFNlcGFyYXRvcnMiLCJlcnJvcnMiLCJzdHJpbmdGcm9tQ2hhckNvZGUiLCJtYXBEb21haW4iLCJkb21haW4iLCJlbmNvZGVkIiwidWNzMmRlY29kZSIsImNvdW50ZXIiLCJkaWdpdFRvQmFzaWMiLCJkaWdpdCIsImZsYWciLCJhZGFwdCIsImRlbHRhIiwibnVtUG9pbnRzIiwiZmlyc3RUaW1lIiwiYmFzZU1pbnVzVE1pbiIsImlucHV0TGVuZ3RoIiwiYmFzaWMiLCJvbGRpIiwidyIsImNvZGVQb2ludCIsImJhc2VNaW51c1QiLCJmcm9tQ29kZVBvaW50IiwiY3VycmVudFZhbHVlIiwiYmFzaWNMZW5ndGgiLCJoYW5kbGVkQ1BDb3VudCIsImhhbmRsZWRDUENvdW50UGx1c09uZSIsInEiLCJxTWludXNUIiwiY29kZVBvaW50cyIsImNvbXBvbmVudHMiLCJjb3JlIiwiemVybyIsInJ1bGVzMiIsImNvbW1vbm1hcmsiLCJCQURfUFJPVE9fUkUiLCJHT09EX0RBVEFfUkUiLCJSRUNPREVfSE9TVE5BTUVfRk9SIiwiZXIiLCJNYXJrZG93bkl0IiwicHJlc2V0TmFtZSIsInJlbmRlcmVyIiwidXRpbHMiLCJjb25maWd1cmUiLCJwcmVzZXRzIiwibWlzc2VkIiwidXNlIiwiYXJncyIsInBhcnNlSW5saW5lIiwiYnVsbGV0X2xpc3QiLCJNYXJrZG93blBhcnNlU3RhdGUiLCJ0b2tlbkhhbmRsZXJzIiwiYWRkVGV4dCIsIm1heWJlTWVyZ2UiLCJvcGVuTWFyayIsImNsb3NlTWFyayIsInBhcnNlVG9rZW5zIiwidG9rcyIsIm9wZW5Ob2RlIiwiY2xvc2VOb2RlIiwibm9DbG9zZVRva2VuIiwid2l0aG91dFRyYWlsaW5nTmV3bGluZSIsIm5vT3AiLCJNYXJrZG93blBhcnNlciIsInRva2VuaXplciIsIm1hcmtkb3duRW52IiwibGlzdElzVGlnaHQiLCJibGFua01hcmsiLCJtaXhhYmxlIiwiTWFya2Rvd25TZXJpYWxpemVyIiwic2VyaWFsaXplIiwiTWFya2Rvd25TZXJpYWxpemVyU3RhdGUiLCJyZW5kZXJDb250ZW50IiwiZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplciIsIndyYXBCbG9jayIsIndyaXRlIiwiY2xvc2VCbG9jayIsInJlcGVhdCIsInJlbmRlckxpc3QiLCJidWxsZXQiLCJtYXhXIiwiblN0ciIsImVzYyIsImluQXV0b2xpbmsiLCJleHBlbEVuY2xvc2luZ1doaXRlc3BhY2UiLCJpc1BsYWluVVJMIiwiX3N0YXRlIiwiX21hcmsiLCJiYWNrdGlja3NGb3IiLCJlc2NhcGUiLCJ0aWNrcyIsImRlbGltIiwiY2xvc2VkIiwiaW5UaWdodExpc3QiLCJ0aWdodExpc3RzIiwiaGFyZEJyZWFrTm9kZU5hbWUiLCJmbHVzaENsb3NlIiwiYXRCbGFuayIsImRlbGltTWluIiwiZ2V0TWFyayIsInN0cmljdCIsImZpcnN0RGVsaW0iLCJlbnN1cmVOZXdMaW5lIiwiZnJvbUJsb2NrU3RhcnQiLCJ0cmFpbGluZyIsInByb2dyZXNzIiwibGVhZGluZyIsImxlYWQiLCJ0cmFpbCIsIm5vRXNjIiwibWFya1N0cmluZyIsImlzVGlnaHQiLCJwcmV2VGlnaHQiLCJzdGFydE9mTGluZSIsImVzY2FwZUV4dHJhQ2hhcmFjdGVycyIsInF1b3RlIiwiZ2V0RW5jbG9zaW5nV2hpdGVzcGFjZSIsIm1hcmtkb3duU2VyaWFsaXplciIsImJveFRleHQiLCJtYXJrZG93bkl0UGFyc2VyIiwiaW1hZ2VSdWxlSW5kZXgiLCJkZWZhdWx0SW1hZ2VSdWxlIiwiQ0hFQ0tMSVNUX0lURU1fT1BFTl9NQVJLRVJTIiwiY29yZVN0YXRlIiwic3JjTGluZXMiLCJpc0NoZWNrbGlzdE9wZW4iLCJoYXNDaGVja2xpc3QiLCJ0cmltTGVmdCIsImlubGluZVN0YXRlIiwib3JpZ2luYWxQb3MiLCJjb2RlVG9rZW4iLCJTY3JhdGNoVG9rZW5QYXJzZXIiLCJnZXRUeXBlTmFtZSIsInRva2VuVHlwZSIsImdldFRva2VucyIsImZ1bGxUb2tlbkxpc3QiLCJwYXJzZWFibGUiLCJyZXNldEludGVybmFsU3RhdGUiLCJ0b2tlblN0YWNrIiwiRE9DVU1FTlRfTUFQIiwibWFya2Rvd25QYXJzZXIiLCJtaXAiLCJ0b2tlblBhcnNlciIsInN0YXJ0c1dpdGgiLCJJbmxpbmVMaW5rUGx1Z2luIiwic3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUiLCJhdXRvTGlua01hcHMiLCJjaGlsZExpbmtNYXJrIiwibGFzdE1hcCIsImF1dG9MaW5rTWFwIiwibGlua1RleHQiLCJsaW5rTWFya3MiLCJsaW5rTWFyayIsImZpbmRBbmRJbnNlcnRJbmxpbmVMaW5rcyIsImdldERvY0Zvck5ld0VkaXRvclN0YXRlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/dist/main.css b/dist/main.css index ea8cb99..875c963 100644 --- a/dist/main.css +++ b/dist/main.css @@ -1,6 +1,6 @@ -.ProseMirror{position:relative;word-wrap:break-word;font-feature-settings:"liga" 0;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap;white-space:break-spaces}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection ::selection{background:transparent}.ProseMirror-hideselection ::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror [draggable][contenteditable=false]{user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{border:2px solid #8cf;bottom:-2px;content:"";left:-32px;pointer-events:none;position:absolute;right:-2px;top:-2px}img.ProseMirror-separator{border:none!important;display:inline!important;margin:0!important}body{--base-font-size:15px;--border-color:1px solid #ccc;--h2-font-size:16px;--h1-font-size:20px;--h3-font-size:15px;--ff-sans:"Roboto",sans-serif;--ff-serif:"Roboto Slab",serif;--ff-mono:"Roboto Mono",monospace;--color-primary:#086dd6;--default-gap:14px;--h3-gap:11px;--default-item-gap:5px;--default-checkbox-gap:8px;--text-color:rgba(0,0,0,.9);--h3-text-color:rgba(0,0,0,.7);color:var(--sn-stylekit-foreground-color,var(--text-color));font-family:var(--ff-serif),serif;font-size:var(--base-font-size)}@media only screen and (max-width:720px){body{--base-font-size:16px;--h2-font-size:17px;--h3-font-size:17px}}*{background:inherit;border:0;color:inherit;font:inherit;margin:0;outline:0;padding:0}::selection{background:var(--sn-stylekit-info-color,var(--color-primary))}body,html{height:100%;overflow:auto}body{position:relative}button{cursor:pointer}strong{font-weight:700}em{font-style:italic}div.ProseMirror{padding:80px 15px 0;position:relative}div#extender{cursor:text;height:120px}h1.sn-editor{font-size:var(--h1-font-size);font-weight:300;margin-bottom:12px}.ProseMirror *+h1.sn-editor{margin-top:32px}h2.sn-editor{font-size:var(--h2-font-size);font-weight:700;margin-bottom:var(--default-gap)}.ProseMirror h1+h2.sn-editor{margin-top:20px}.ProseMirror :not(h1)+h2.sn-editor{margin-top:28px}h3.sn-editor{color:var(--h3-text-color);font-size:var(--h3-font-size);margin-bottom:var(--h3-gap);text-decoration:underline}.ProseMirror h2+h3.sn-editor{margin-top:20px}.ProseMirror :not(h1,h2)+h3.sn-editor{margin-top:22px}div.ProseMirror>p.sn-editor{line-height:1.4;margin-bottom:var(--default-gap)}:not(ul,ol,h3)+ol,:not(ul,ol,h3)+ul{margin-top:var(--default-gap)}ol,ul{margin-bottom:var(--default-gap);margin-left:25px}li{margin-bottom:var(--default-item-gap)}li ol,li ul{margin-bottom:0;margin-top:var(--default-item-gap)}code{background:var(--sn-stylekit-contrast-background-color,#efefef);font-family:var(--ff-mono),monospace}a{color:var(--sn-stylekit-info-color,blue)}pre{background:var(--sn-stylekit-contrast-background-color,#efefef);font-family:var(--ff-mono),monospace;margin-bottom:var(--default-gap);padding:4px;position:relative}pre[data-markdown_escaped=true] div.info{border:1px solid var(--sn-stylekit-info-color,var(--color-primary));border-radius:50%;color:var(--sn-stylekit-info-color,var(--color-primary));cursor:pointer;display:block;float:right;height:20px;line-height:20px;position:relative;right:6px;text-align:center;top:6px;width:20px}pre[data-markdown_escaped=true] div.info:hover:after{background:var(--sn-stylekit-background-color,#fff);border:1px solid var(--sn-stylekit-info-color,var(--color-primary));border-radius:2px;content:"This block of code was edited in another editor and contains markdown formatting that Scratch doesn't support yet. It will be serialized into markdown not as a code block but as a normal piece of markdown text.";font-size:12px;padding:5px;position:absolute;right:0;text-align:left;top:24px;width:250px;z-index:2}pre code{background:transparent}.checklist-item{align-items:flex-start;display:flex;padding-left:30px;position:relative}.checklist-item+.checklist-item{margin-top:var(--default-checkbox-gap)}.checklist-item+:not(.checklist-item){margin-top:var(--default-gap)}.checklist-item .click-target{cursor:pointer;display:block;height:32px;left:0;position:absolute;top:-4px;width:32px}.checklist-item div.checkbox{box-sizing:border-box;height:24px;left:0;margin-right:6px;min-width:24px;padding:2px;position:absolute;top:4px}.checklist-item p{line-height:24px}#toolbar-wrapper{background-color:var(--sn-stylekit-background-color,#fff);border-bottom:1px solid var(--sn-stylekit-border-color,#ccc);left:0;overflow-x:auto;position:fixed;right:0;top:0;z-index:1}#toolbar{display:flex}button[data-format]:hover{background-color:var( +.ProseMirror{position:relative;word-wrap:break-word;font-feature-settings:"liga" 0;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap;white-space:break-spaces}.ProseMirror pre{white-space:pre-wrap}.ProseMirror li{position:relative}.ProseMirror-hideselection ::selection{background:transparent}.ProseMirror-hideselection ::-moz-selection{background:transparent}.ProseMirror-hideselection{caret-color:transparent}.ProseMirror [draggable][contenteditable=false]{user-select:text}.ProseMirror-selectednode{outline:2px solid #8cf}li.ProseMirror-selectednode{outline:none}li.ProseMirror-selectednode:after{border:2px solid #8cf;bottom:-2px;content:"";left:-32px;pointer-events:none;position:absolute;right:-2px;top:-2px}img.ProseMirror-separator{border:none!important;display:inline!important;margin:0!important}body{--base-font-size:15px;--border-color:1px solid #ccc;--h2-font-size:16px;--h1-font-size:20px;--h3-font-size:15px;--ff-sans:"Roboto",sans-serif;--ff-serif:"Roboto Slab",serif;--ff-mono:"Roboto Mono",monospace;--color-primary:#086dd6;--default-gap:14px;--h3-gap:11px;--default-item-gap:5px;--default-checkbox-gap:8px;--text-color:rgba(0,0,0,.9);--h3-text-color:var(--sn-stylekit-paragraph-text-color,rgba(0,0,0,.7));color:var(--sn-stylekit-paragraph-text-color,var(--text-color));font-family:var(--ff-serif),serif;font-size:var(--base-font-size);scrollbar-color:var(--sn-stylekit-scrollbar-color,#ccc) var(--sn-stylekit-background-color,#fff)}@media only screen and (max-width:720px){body{--base-font-size:16px;--h2-font-size:17px;--h3-font-size:17px}}*{background:inherit;border:0;color:inherit;font:inherit;margin:0;outline:0;padding:0}::selection{background:var(--sn-stylekit-info-color,var(--color-primary))}body,html{height:100%;overflow:auto}body{position:relative}button{cursor:pointer}strong{font-weight:700}em{font-style:italic}div.ProseMirror{padding:80px 15px 0;position:relative}div#extender{cursor:text;height:120px}h1.sn-editor{font-size:var(--h1-font-size);font-weight:300;margin-bottom:12px}.ProseMirror *+h1.sn-editor{margin-top:32px}h2.sn-editor{font-size:var(--h2-font-size);font-weight:700;margin-bottom:var(--default-gap)}.ProseMirror h1+h2.sn-editor{margin-top:20px}.ProseMirror :not(h1)+h2.sn-editor{margin-top:28px}h3.sn-editor{color:var(--h3-text-color);font-size:var(--h3-font-size);margin-bottom:var(--h3-gap);text-decoration:underline}.ProseMirror h2+h3.sn-editor{margin-top:20px}.ProseMirror :not(h1,h2)+h3.sn-editor{margin-top:22px}div.ProseMirror>p.sn-editor{line-height:1.4;margin-bottom:var(--default-gap)}:not(ul,ol,h3)+ol,:not(ul,ol,h3)+ul{margin-top:var(--default-gap)}ol,ul{margin-bottom:var(--default-gap);margin-left:25px}li{margin-bottom:var(--default-item-gap)}li ol,li ul{margin-bottom:0;margin-top:var(--default-item-gap)}code{background:var(--sn-stylekit-contrast-background-color,#efefef);font-family:var(--ff-mono),monospace}a{color:var(--sn-stylekit-info-color,blue)}pre{background:var(--sn-stylekit-contrast-background-color,#efefef);font-family:var(--ff-mono),monospace;margin-bottom:var(--default-gap);padding:4px;position:relative}pre[data-markdown_escaped=true] div.info{border:1px solid var(--sn-stylekit-info-color,var(--color-primary));border-radius:50%;color:var(--sn-stylekit-info-color,var(--color-primary));cursor:pointer;display:block;float:right;height:20px;line-height:20px;position:relative;right:6px;text-align:center;top:6px;width:20px}pre[data-markdown_escaped=true] div.info:hover:after{background:var(--sn-stylekit-background-color,#fff);border:1px solid var(--sn-stylekit-info-color,var(--color-primary));border-radius:2px;content:"This block of code was edited in another editor and contains markdown formatting that Scratch doesn't support yet. It will be serialized into markdown not as a code block but as a normal piece of markdown text.";font-size:12px;padding:5px;position:absolute;right:0;text-align:left;top:24px;width:250px;z-index:2}pre code{background:transparent}.checklist-item{align-items:flex-start;display:flex;padding-left:30px;position:relative}.checklist-item+.checklist-item{margin-top:var(--default-checkbox-gap)}.checklist-item+:not(.checklist-item){margin-top:var(--default-gap)}.checklist-item .click-target{cursor:pointer;display:block;height:32px;left:0;position:absolute;top:-4px;width:32px}.checklist-item div.checkbox{box-sizing:border-box;height:24px;left:0;margin-right:6px;min-width:24px;padding:2px;position:absolute;top:4px}.checklist-item p{line-height:24px}#toolbar-wrapper{background-color:var(--sn-stylekit-background-color,#fff);border-bottom:1px solid var(--sn-stylekit-border-color,#ccc);left:0;overflow-x:auto;position:fixed;right:0;top:0;z-index:1}#toolbar{display:flex}button[data-format]:hover{background-color:var( --sn-stylekit-secondary-contrast-background-color,#eee )}button.selected:after{background:#aaa;bottom:0;content:"";display:block;height:3px;left:0;position:absolute;right:0}button[data-format]{background-color:var(--sn-stylekit-background-color,#fff);cursor:pointer;height:40px;margin-left:10px;padding:10px 20px;position:relative;width:65px}button[data-format] i{display:block;height:25px;width:25px}button[data-format=heading]:before,button[data-format=link]:before,button[data-format=outdent]:before{background:var(--sn-stylekit-contrast-background-color,#ccc);bottom:7px;content:"";display:block;left:-5px;position:absolute;top:7px;width:1px}button[data-format=code_block]:before{border:2px solid;border-radius:2px;bottom:8px;content:"";display:block;left:23px;position:absolute;right:23px;top:13px}button[data-format=code_block] i{background:transparent;position:relative}button[data-format=code_block] i span{background:var(--sn-stylekit-background-color,#fff);display:block;height:18px;left:0;position:absolute;top:0;width:18px;z-index:2}button[data-format=code_block]:hover span{background-color:var( --sn-stylekit-secondary-contrast-background-color,#eee )}svg{fill:currentColor}div#link-modal{align-items:center;background:rgba(0,0,0,.15);bottom:0;display:none;font-family:var(--ff-sans);justify-content:center;left:0;position:fixed;right:0;top:0}div#link-modal.active{display:flex}div#frame{align-items:center;border-radius:2px;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2);display:flex;flex-direction:column;height:230px;justify-content:center;padding:0 35px;width:350px}div#frame,div#link-modal input{background:var(--sn-stylekit-background-color,#fff);box-sizing:border-box}div#link-modal input{border:1px solid #c8c8c8;padding:5px 8px;width:100%}div#link-modal button{cursor:pointer}div#link-modal label{display:block;font-size:14px;margin-bottom:4px;text-transform:uppercase}div#link-modal label a i{display:inline-block;height:14px;position:relative;top:2px;width:14px}div#link-modal div.text-input{margin-bottom:15px;width:100%}div#link-modal div.buttons{align-items:center;display:flex;justify-content:flex-end;margin-top:10px;position:relative;top:6px;width:100%}div#link-modal button{font-size:13px;margin-left:10px;padding:4px 8px;text-transform:uppercase}div#link-modal button#clear{display:none}div#link-modal button#clear.active{display:block}div#link-modal button#confirm{color:var(--sn-stylekit-info-color,var(--color-primary))}div#link-tooltip{background:var(--sn-stylekit-background-color,#fff);border:1px solid var(--sn-stylekit-border-color,#ccc);box-shadow:0 1px 3px rgba(0,0,0,.2);box-sizing:border-box;display:none;max-width:calc(100% - 10px);padding:6px 10px;position:absolute}div#link-tooltip a,div#link-tooltip.show{align-items:center;display:flex}div#link-tooltip a{justify-content:center}div#link-tooltip div.text{display:block;margin-right:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div#link-tooltip i{display:block;flex:0 0 14px;height:14px;width:14px}div.auto-link-indicator{display:none;font-family:var(--ff-mono),monospace;font-size:10px;padding-right:6px;text-transform:uppercase}div#link-tooltip.yes-auto-link div.auto-link-indicator{display:block} -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSx3QkFJRSxZQUFhLENBRmIsb0NBQXNDLENBQ3RDLGNBQWUsQ0FFZixpQkFBa0IsQ0FKbEIsd0JBS0YsQ0FFQSx1REFDRSxhQUNGIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itdmlldy9zdHlsZS9wcm9zZW1pcnJvci5jc3MiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvc3R5bGVzLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIuUHJvc2VNaXJyb3Ige1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5Qcm9zZU1pcnJvciB7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB3aGl0ZS1zcGFjZTogYnJlYWstc3BhY2VzO1xuICAtd2Via2l0LWZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7XG4gIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7XG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogXCJsaWdhXCIgMDsgLyogdGhlIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIEVkZ2UgKi9cbn1cblxuLlByb3NlTWlycm9yIHByZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLlByb3NlTWlycm9yIGxpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24geyBjYXJldC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci9pc3N1ZXMvMTQyMSNpc3N1ZWNvbW1lbnQtMTc1OTMyMDE5MSAqL1xuLlByb3NlTWlycm9yIFtkcmFnZ2FibGVdW2NvbnRlbnRlZGl0YWJsZT1mYWxzZV0geyB1c2VyLXNlbGVjdDogdGV4dCB9XG5cbi5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xuICBvdXRsaW5lOiAycHggc29saWQgIzhjZjtcbn1cblxuLyogTWFrZSBzdXJlIGxpIHNlbGVjdGlvbnMgd3JhcCBhcm91bmQgbWFya2VycyAqL1xuXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xuICBvdXRsaW5lOiBub25lO1xufVxuXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGU6YWZ0ZXIge1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0zMnB4O1xuICByaWdodDogLTJweDsgdG9wOiAtMnB4OyBib3R0b206IC0ycHg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICM4Y2Y7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vKiBQcm90ZWN0IGFnYWluc3QgZ2VuZXJpYyBpbWcgcnVsZXMgKi9cblxuaW1nLlByb3NlTWlycm9yLXNlcGFyYXRvciB7XG4gIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG4iLCIvKiogZ2xvYmFsICovXG5AaW1wb3J0IHVybCgnfnByb3NlbWlycm9yLXZpZXcvc3R5bGUvcHJvc2VtaXJyb3IuY3NzJyk7XG5cbmJvZHkge1xuICAtLWJhc2UtZm9udC1zaXplOiAxNXB4O1xuICAtLWJvcmRlci1jb2xvcjogMXB4IHNvbGlkICNjY2M7XG4gIC0taDItZm9udC1zaXplOiAxNnB4O1xuICAtLWgxLWZvbnQtc2l6ZTogMjBweDtcbiAgLS1oMy1mb250LXNpemU6IDE1cHg7XG4gIC0tZmYtc2FuczogJ1JvYm90bycsIHNhbnMtc2VyaWY7XG4gIC0tZmYtc2VyaWY6ICdSb2JvdG8gU2xhYicsIHNlcmlmO1xuICAtLWZmLW1vbm86ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgLS1jb2xvci1wcmltYXJ5OiByZ2IoOCwgMTA5LCAyMTQpO1xuICAtLWRlZmF1bHQtZ2FwOiAxNHB4O1xuICAtLWgzLWdhcDogMTFweDtcbiAgLS1kZWZhdWx0LWl0ZW0tZ2FwOiA1cHg7XG4gIC0tZGVmYXVsdC1jaGVja2JveC1nYXA6IDhweDtcbiAgLS10ZXh0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7XG4gIC0taDMtdGV4dC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtZm9yZWdyb3VuZC1jb2xvciwgdmFyKC0tdGV4dC1jb2xvcikpO1xuICBmb250LXNpemU6IHZhcigtLWJhc2UtZm9udC1zaXplKTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZmLXNlcmlmKSwgc2VyaWY7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgYm9keSB7XG4gICAgLS1iYXNlLWZvbnQtc2l6ZTogMTZweDtcbiAgICAtLWgyLWZvbnQtc2l6ZTogMTdweDtcbiAgICAtLWgzLWZvbnQtc2l6ZTogMTdweDtcbiAgfVxufVxuXG4qIHtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgYm9yZGVyOiAwO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udDogaW5oZXJpdDtcbiAgbWFyZ2luOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4qOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbi8qIFJlc3RvcmUgcG9zaXRpb246IGZpeGVkIGJlaGF2aW9yIHdoZW4gaU9TIGtleWJvYXJkIGlzIG9wZW4gKi9cbmh0bWwsXG5ib2R5IHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGhlaWdodDogMTAwJTtcbn1cblxuYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuXG5lbSB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLyoqIGFwcGxpY2F0aW9uICovXG5cbmRpdi5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLyogODBweCB0b3AgcGFkZGluZyB0byBhY2NvdW50IGZvciA0MXB4IHRvb2xiYXIgKi9cbiAgcGFkZGluZzogODBweCAxNXB4IDAgMTVweDtcbn1cblxuZGl2I2V4dGVuZGVyIHtcbiAgY3Vyc29yOiB0ZXh0O1xuICBoZWlnaHQ6IDEyMHB4O1xufVxuXG5oMS5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgxLWZvbnQtc2l6ZSk7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqICsgaDEuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMzJweDtcbn1cblxuaDIuc24tZWRpdG9yIHtcbiAgZm9udC1zaXplOiB2YXIoLS1oMi1mb250LXNpemUpO1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMSArIGgyLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSkgKyBoMi5zbi1lZGl0b3Ige1xuICBtYXJnaW4tdG9wOiAyOHB4O1xufVxuXG5oMy5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgzLWZvbnQtc2l6ZSk7XG4gIGNvbG9yOiB2YXIoLS1oMy10ZXh0LWNvbG9yKTtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWgzLWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMiArIGgzLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSwgaDIpICsgaDMuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMjJweDtcbn1cblxuZGl2LlByb3NlTWlycm9yID4gcC5zbi1lZGl0b3Ige1xuICBsaW5lLWhlaWdodDogMS40O1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgdWwge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgb2wge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbnVsLFxub2wge1xuICBtYXJnaW4tbGVmdDogMjVweDtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xufVxuXG5saSB7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWRlZmF1bHQtaXRlbS1nYXApO1xufVxuXG5saSB1bCxcbmxpIG9sIHtcbiAgbWFyZ2luLXRvcDogdmFyKC0tZGVmYXVsdC1pdGVtLWdhcCk7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmNvZGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtY29udHJhc3QtYmFja2dyb3VuZC1jb2xvciwgI2VmZWZlZik7XG59XG5cbmEge1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtaW5mby1jb2xvciwgYmx1ZSk7XG59XG5cbnByZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWNvbnRyYXN0LWJhY2tncm91bmQtY29sb3IsICNlZmVmZWYpO1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xuICBwYWRkaW5nOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHJpZ2h0OiA2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdG9wOiA2cHg7XG4gIHdpZHRoOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvOmhvdmVyOmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWluZm8tY29sb3IsIHZhcigtLWNvbG9yLXByaW1hcnkpKTtcbiAgY29udGVudDogXCJUaGlzIGJsb2NrIG9mIGNvZGUgd2FzIGVkaXRlZCBpbiBhbm90aGVyIGVkaXRvciBhbmQgY29udGFpbnMgbWFya2Rvd24gZm9ybWF0dGluZyB0aGF0IFNjcmF0Y2ggZG9lc24ndCBzdXBwb3J0IHlldC4gSXQgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gbWFya2Rvd24gbm90IGFzIGEgY29kZSBibG9jayBidXQgYXMgYSBub3JtYWwgcGllY2Ugb2YgbWFya2Rvd24gdGV4dC5cIjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nOiA1cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHRvcDogMjRweDtcbiAgd2lkdGg6IDI1MHB4O1xuICB6LWluZGV4OiAyO1xufVxuXG5wcmUgY29kZSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0ge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jaGVja2xpc3QtaXRlbSArIC5jaGVja2xpc3QtaXRlbSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtY2hlY2tib3gtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtICsgKjpub3QoLmNoZWNrbGlzdC1pdGVtKSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIC5jbGljay10YXJnZXQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDMycHg7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNHB4O1xuICB3aWR0aDogMzJweDtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIGRpdi5jaGVja2JveCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogMjRweDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gIG1pbi13aWR0aDogMjRweDtcbiAgcGFkZGluZzogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0gcCB7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xufVxuXG4jdG9vbGJhci13cmFwcGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc24tc3R5bGVraXQtYm9yZGVyLWNvbG9yLCAjY2NjKTtcbiAgbGVmdDogMDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4jdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoXG4gICAgLS1zbi1zdHlsZWtpdC1zZWNvbmRhcnktY29udHJhc3QtYmFja2dyb3VuZC1jb2xvcixcbiAgICAjZWVlXG4gICk7XG59XG5cbmJ1dHRvbi5zZWxlY3RlZDphZnRlciB7XG4gIGJhY2tncm91bmQ6ICNhYWE7XG4gIGJvdHRvbTogMDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDNweDtcbiAgbGVmdDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0XSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDY1cHg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF0gaSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xufVxuXG5idXR0b25bZGF0YS1mb3JtYXQ9J2xpbmsnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J2hlYWRpbmcnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J291dGRlbnQnXTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjY2NjKTtcbiAgYm90dG9tOiA3cHg7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLyogaGFsZiB0aGUgMTBweCBtYXJnaW4gKi9cbiAgbGVmdDogLTVweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDdweDtcbiAgd2lkdGg6IDFweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTNweDtcbiAgYm90dG9tOiA4cHg7XG4gIGxlZnQ6IDIzcHg7XG4gIHJpZ2h0OiAyM3B4O1xuICBib3JkZXI6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ10gaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdD0nY29kZV9ibG9jayddIGkgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDE4cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMHB4O1xuICB0b3A6IDBweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgei1pbmRleDogMjtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106aG92ZXIgc3BhbiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcihcbiAgICAtLXNuLXN0eWxla2l0LXNlY29uZGFyeS1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLFxuICAgICNlZWVcbiAgKTtcbn1cblxuc3ZnIHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4vKiBtb2RhbCAqL1xuZGl2I2xpbmstbW9kYWwge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3R0b206IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zYW5zKTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIHRvcDogMDtcbn1cblxuZGl2I2xpbmstbW9kYWwuYWN0aXZlIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuZGl2I2ZyYW1lIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJveC1zaGFkb3c6XG4gICAgMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSxcbiAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAyMzBweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMzVweDtcbiAgd2lkdGg6IDM1MHB4O1xufVxuXG5kaXYjbGluay1tb2RhbCBpbnB1dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjODtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogNXB4IDhweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGJ1dHRvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuZGl2I2xpbmstbW9kYWwgbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGxhYmVsIGEgaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMnB4O1xuICB3aWR0aDogMTRweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LnRleHQtaW5wdXQge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LmJ1dHRvbnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyLmFjdGl2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5kaXYjbGluay1tb2RhbCBidXR0b24jY29uZmlybSB7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWJvcmRlci1jb2xvciwgI2NjYyk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTBweCk7XG4gIHBhZGRpbmc6IDZweCAxMHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAuc2hvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAgYSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5kaXYjbGluay10b29sdGlwIGRpdi50ZXh0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuZGl2I2xpbmstdG9vbHRpcCBpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsZXg6IDAgMCAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHdpZHRoOiAxNHB4O1xufVxuXG5kaXYuYXV0by1saW5rLWluZGljYXRvciB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1tb25vKSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuZGl2I2xpbmstdG9vbHRpcC55ZXMtYXV0by1saW5rIGRpdi5hdXRvLWxpbmstaW5kaWNhdG9yIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FDWixVQUNGLENBRUEsd0JBSUUsWUFBYSxDQUZiLG9DQUFzQyxDQUN0QyxjQUFlLENBRWYsaUJBQWtCLENBSmxCLHdCQUtGLENBRUEsdURBQ0UsYUFDRiIsInNvdXJjZXMiOlsid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXZpZXcvc3R5bGUvcHJvc2VtaXJyb3IuY3NzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3N0eWxlcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLlByb3NlTWlycm9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uUHJvc2VNaXJyb3Ige1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlcztcbiAgLXdlYmtpdC1mb250LXZhcmlhbnQtbGlnYXR1cmVzOiBub25lO1xuICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBub25lO1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IFwibGlnYVwiIDA7IC8qIHRoZSBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gd29yayBpbiBFZGdlICovXG59XG5cbi5Qcm9zZU1pcnJvciBwcmUge1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5Qcm9zZU1pcnJvciBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbi5Qcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uICo6Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbi5Qcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uIHsgY2FyZXQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzE0MjEjaXNzdWVjb21tZW50LTE3NTkzMjAxOTEgKi9cbi5Qcm9zZU1pcnJvciBbZHJhZ2dhYmxlXVtjb250ZW50ZWRpdGFibGU9ZmFsc2VdIHsgdXNlci1zZWxlY3Q6IHRleHQgfVxuXG4uUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkICM4Y2Y7XG59XG5cbi8qIE1ha2Ugc3VyZSBsaSBzZWxlY3Rpb25zIHdyYXAgYXJvdW5kIG1hcmtlcnMgKi9cblxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlOmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAtMzJweDtcbiAgcmlnaHQ6IC0ycHg7IHRvcDogLTJweDsgYm90dG9tOiAtMnB4O1xuICBib3JkZXI6IDJweCBzb2xpZCAjOGNmO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyogUHJvdGVjdCBhZ2FpbnN0IGdlbmVyaWMgaW1nIHJ1bGVzICovXG5cbmltZy5Qcm9zZU1pcnJvci1zZXBhcmF0b3Ige1xuICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuIiwiLyoqIGdsb2JhbCAqL1xuQGltcG9ydCB1cmwoJ35wcm9zZW1pcnJvci12aWV3L3N0eWxlL3Byb3NlbWlycm9yLmNzcycpO1xuXG5ib2R5IHtcbiAgLS1iYXNlLWZvbnQtc2l6ZTogMTVweDtcbiAgLS1ib3JkZXItY29sb3I6IDFweCBzb2xpZCAjY2NjO1xuICAtLWgyLWZvbnQtc2l6ZTogMTZweDtcbiAgLS1oMS1mb250LXNpemU6IDIwcHg7XG4gIC0taDMtZm9udC1zaXplOiAxNXB4O1xuICAtLWZmLXNhbnM6ICdSb2JvdG8nLCBzYW5zLXNlcmlmO1xuICAtLWZmLXNlcmlmOiAnUm9ib3RvIFNsYWInLCBzZXJpZjtcbiAgLS1mZi1tb25vOiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIC0tY29sb3ItcHJpbWFyeTogcmdiKDgsIDEwOSwgMjE0KTtcbiAgLS1kZWZhdWx0LWdhcDogMTRweDtcbiAgLS1oMy1nYXA6IDExcHg7XG4gIC0tZGVmYXVsdC1pdGVtLWdhcDogNXB4O1xuICAtLWRlZmF1bHQtY2hlY2tib3gtZ2FwOiA4cHg7XG4gIC0tdGV4dC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjkpO1xuICAtLWgzLXRleHQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LXBhcmFncmFwaC10ZXh0LWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuNykpO1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtcGFyYWdyYXBoLXRleHQtY29sb3IsIHZhcigtLXRleHQtY29sb3IpKTtcbiAgZm9udC1zaXplOiB2YXIoLS1iYXNlLWZvbnQtc2l6ZSk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zZXJpZiksIHNlcmlmO1xuICBzY3JvbGxiYXItY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LXNjcm9sbGJhci1jb2xvciwgI2NjYylcbiAgICB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgYm9keSB7XG4gICAgLS1iYXNlLWZvbnQtc2l6ZTogMTZweDtcbiAgICAtLWgyLWZvbnQtc2l6ZTogMTdweDtcbiAgICAtLWgzLWZvbnQtc2l6ZTogMTdweDtcbiAgfVxufVxuXG4qIHtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgYm9yZGVyOiAwO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udDogaW5oZXJpdDtcbiAgbWFyZ2luOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4qOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbi8qIFJlc3RvcmUgcG9zaXRpb246IGZpeGVkIGJlaGF2aW9yIHdoZW4gaU9TIGtleWJvYXJkIGlzIG9wZW4gKi9cbmh0bWwsXG5ib2R5IHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGhlaWdodDogMTAwJTtcbn1cblxuYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuXG5lbSB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLyoqIGFwcGxpY2F0aW9uICovXG5cbmRpdi5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLyogODBweCB0b3AgcGFkZGluZyB0byBhY2NvdW50IGZvciA0MXB4IHRvb2xiYXIgKi9cbiAgcGFkZGluZzogODBweCAxNXB4IDAgMTVweDtcbn1cblxuZGl2I2V4dGVuZGVyIHtcbiAgY3Vyc29yOiB0ZXh0O1xuICBoZWlnaHQ6IDEyMHB4O1xufVxuXG5oMS5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgxLWZvbnQtc2l6ZSk7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqICsgaDEuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMzJweDtcbn1cblxuaDIuc24tZWRpdG9yIHtcbiAgZm9udC1zaXplOiB2YXIoLS1oMi1mb250LXNpemUpO1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMSArIGgyLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSkgKyBoMi5zbi1lZGl0b3Ige1xuICBtYXJnaW4tdG9wOiAyOHB4O1xufVxuXG5oMy5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgzLWZvbnQtc2l6ZSk7XG4gIGNvbG9yOiB2YXIoLS1oMy10ZXh0LWNvbG9yKTtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWgzLWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMiArIGgzLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSwgaDIpICsgaDMuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMjJweDtcbn1cblxuZGl2LlByb3NlTWlycm9yID4gcC5zbi1lZGl0b3Ige1xuICBsaW5lLWhlaWdodDogMS40O1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgdWwge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgb2wge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbnVsLFxub2wge1xuICBtYXJnaW4tbGVmdDogMjVweDtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xufVxuXG5saSB7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWRlZmF1bHQtaXRlbS1nYXApO1xufVxuXG5saSB1bCxcbmxpIG9sIHtcbiAgbWFyZ2luLXRvcDogdmFyKC0tZGVmYXVsdC1pdGVtLWdhcCk7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmNvZGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtY29udHJhc3QtYmFja2dyb3VuZC1jb2xvciwgI2VmZWZlZik7XG59XG5cbmEge1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtaW5mby1jb2xvciwgYmx1ZSk7XG59XG5cbnByZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWNvbnRyYXN0LWJhY2tncm91bmQtY29sb3IsICNlZmVmZWYpO1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xuICBwYWRkaW5nOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHJpZ2h0OiA2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdG9wOiA2cHg7XG4gIHdpZHRoOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvOmhvdmVyOmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWluZm8tY29sb3IsIHZhcigtLWNvbG9yLXByaW1hcnkpKTtcbiAgY29udGVudDogXCJUaGlzIGJsb2NrIG9mIGNvZGUgd2FzIGVkaXRlZCBpbiBhbm90aGVyIGVkaXRvciBhbmQgY29udGFpbnMgbWFya2Rvd24gZm9ybWF0dGluZyB0aGF0IFNjcmF0Y2ggZG9lc24ndCBzdXBwb3J0IHlldC4gSXQgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gbWFya2Rvd24gbm90IGFzIGEgY29kZSBibG9jayBidXQgYXMgYSBub3JtYWwgcGllY2Ugb2YgbWFya2Rvd24gdGV4dC5cIjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nOiA1cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHRvcDogMjRweDtcbiAgd2lkdGg6IDI1MHB4O1xuICB6LWluZGV4OiAyO1xufVxuXG5wcmUgY29kZSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0ge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jaGVja2xpc3QtaXRlbSArIC5jaGVja2xpc3QtaXRlbSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtY2hlY2tib3gtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtICsgKjpub3QoLmNoZWNrbGlzdC1pdGVtKSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIC5jbGljay10YXJnZXQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDMycHg7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNHB4O1xuICB3aWR0aDogMzJweDtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIGRpdi5jaGVja2JveCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogMjRweDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gIG1pbi13aWR0aDogMjRweDtcbiAgcGFkZGluZzogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0gcCB7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xufVxuXG4jdG9vbGJhci13cmFwcGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc24tc3R5bGVraXQtYm9yZGVyLWNvbG9yLCAjY2NjKTtcbiAgbGVmdDogMDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4jdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoXG4gICAgLS1zbi1zdHlsZWtpdC1zZWNvbmRhcnktY29udHJhc3QtYmFja2dyb3VuZC1jb2xvcixcbiAgICAjZWVlXG4gICk7XG59XG5cbmJ1dHRvbi5zZWxlY3RlZDphZnRlciB7XG4gIGJhY2tncm91bmQ6ICNhYWE7XG4gIGJvdHRvbTogMDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDNweDtcbiAgbGVmdDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0XSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDY1cHg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF0gaSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xufVxuXG5idXR0b25bZGF0YS1mb3JtYXQ9J2xpbmsnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J2hlYWRpbmcnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J291dGRlbnQnXTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjY2NjKTtcbiAgYm90dG9tOiA3cHg7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLyogaGFsZiB0aGUgMTBweCBtYXJnaW4gKi9cbiAgbGVmdDogLTVweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDdweDtcbiAgd2lkdGg6IDFweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTNweDtcbiAgYm90dG9tOiA4cHg7XG4gIGxlZnQ6IDIzcHg7XG4gIHJpZ2h0OiAyM3B4O1xuICBib3JkZXI6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ10gaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdD0nY29kZV9ibG9jayddIGkgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDE4cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMHB4O1xuICB0b3A6IDBweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgei1pbmRleDogMjtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106aG92ZXIgc3BhbiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcihcbiAgICAtLXNuLXN0eWxla2l0LXNlY29uZGFyeS1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLFxuICAgICNlZWVcbiAgKTtcbn1cblxuc3ZnIHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4vKiBtb2RhbCAqL1xuZGl2I2xpbmstbW9kYWwge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3R0b206IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zYW5zKTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIHRvcDogMDtcbn1cblxuZGl2I2xpbmstbW9kYWwuYWN0aXZlIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuZGl2I2ZyYW1lIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJveC1zaGFkb3c6XG4gICAgMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSxcbiAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAyMzBweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMzVweDtcbiAgd2lkdGg6IDM1MHB4O1xufVxuXG5kaXYjbGluay1tb2RhbCBpbnB1dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjODtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogNXB4IDhweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGJ1dHRvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuZGl2I2xpbmstbW9kYWwgbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGxhYmVsIGEgaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMnB4O1xuICB3aWR0aDogMTRweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LnRleHQtaW5wdXQge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LmJ1dHRvbnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyLmFjdGl2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5kaXYjbGluay1tb2RhbCBidXR0b24jY29uZmlybSB7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWJvcmRlci1jb2xvciwgI2NjYyk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTBweCk7XG4gIHBhZGRpbmc6IDZweCAxMHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAuc2hvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAgYSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5kaXYjbGluay10b29sdGlwIGRpdi50ZXh0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuZGl2I2xpbmstdG9vbHRpcCBpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsZXg6IDAgMCAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHdpZHRoOiAxNHB4O1xufVxuXG5kaXYuYXV0by1saW5rLWluZGljYXRvciB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1tb25vKSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuZGl2I2xpbmstdG9vbHRpcC55ZXMtYXV0by1saW5rIGRpdi5hdXRvLWxpbmstaW5kaWNhdG9yIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/docs/bundle.js b/docs/bundle.js index bf3060b..e7b1ca9 100644 --- a/docs/bundle.js +++ b/docs/bundle.js @@ -26430,17 +26430,19 @@ class InlineLinkPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Pl __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ToolbarPlugin: () => (/* binding */ ToolbarPlugin), -/* harmony export */ indentListItem: () => (/* binding */ indentListItem), -/* harmony export */ outdentListItem: () => (/* binding */ outdentListItem), +/* harmony export */ indentListSelection: () => (/* binding */ indentListSelection), +/* harmony export */ outdentListSelection: () => (/* binding */ outdentListSelection), /* harmony export */ swapTextBlock: () => (/* binding */ swapTextBlock), /* harmony export */ toggleList: () => (/* binding */ toggleList) /* harmony export */ }); -/* harmony import */ var prosemirror_state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prosemirror-state */ "./node_modules/prosemirror-state/dist/index.js"); -/* harmony import */ var prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prosemirror-schema-list */ "./node_modules/prosemirror-schema-list/dist/index.js"); -/* harmony import */ var prosemirror_transform__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prosemirror-transform */ "./node_modules/prosemirror-transform/dist/index.js"); -/* harmony import */ var prosemirror_history__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prosemirror-history */ "./node_modules/prosemirror-history/dist/index.js"); -/* harmony import */ var prosemirror_commands__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prosemirror-commands */ "./node_modules/prosemirror-commands/dist/index.js"); +/* harmony import */ var prosemirror_state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prosemirror-state */ "./node_modules/prosemirror-state/dist/index.js"); +/* harmony import */ var prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prosemirror-schema-list */ "./node_modules/prosemirror-schema-list/dist/index.js"); +/* harmony import */ var prosemirror_transform__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prosemirror-transform */ "./node_modules/prosemirror-transform/dist/index.js"); +/* harmony import */ var prosemirror_history__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prosemirror-history */ "./node_modules/prosemirror-history/dist/index.js"); +/* harmony import */ var prosemirror_commands__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prosemirror-commands */ "./node_modules/prosemirror-commands/dist/index.js"); /* harmony import */ var _schema__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schema */ "./src/schema.ts"); +/* harmony import */ var _schemaHelpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./schemaHelpers */ "./src/schemaHelpers.ts"); + @@ -26456,9 +26458,17 @@ const APPLY_FORMAT_ATTR = 'data-format'; function swapTextBlock(view, nodeType) { let { dispatch, state } = view; let { tr } = state; + let { selection: { $from, $to }, } = state; + const listBlockRange = getListBlockRange($from, $to); + if (containsNestedList($from, $to, listBlockRange)) { + return; + } + if (isWithinNestedList($from, $to, listBlockRange)) { + return; + } if (nodeType !== _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list && nodeType !== _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.ordered_list) { - (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.liftListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch); + (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.liftListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch); } ({ dispatch, state } = view); ({ tr } = state); @@ -26466,12 +26476,73 @@ function swapTextBlock(view, nodeType) { tr.setBlockType(from, to, nodeType); dispatch(tr); } -const indentListItem = function (state, dispatch) { - return ((0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.sinkListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch) || - (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.wrapInList)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list)(state, dispatch)); +const indentListSelection = function (state, dispatch) { + return ((0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.sinkListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch) || + (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.wrapInList)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list)(state, dispatch)); }; -const outdentListItem = function (state, dispatch) { - return (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.liftListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch); +function getListBlockRange($from, $to, listTypes = [_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list, _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.ordered_list]) { + const listBlockRange = $from.blockRange($to, (node) => (0,_schemaHelpers__WEBPACK_IMPORTED_MODULE_1__.isListBlock)(node, listTypes)); + return listBlockRange || false; +} +function containsNestedList($from, $to, listBlockRange = getListBlockRange($from, $to)) { + if (!listBlockRange) { + return false; + } + let containsNestedList = false; + const { doc } = $from; + const $rangeStart = doc.resolve(listBlockRange.start); + const $rangeEnd = doc.resolve(listBlockRange.end); + listBlockRange.parent.nodesBetween($rangeStart.parentOffset, $rangeEnd.parentOffset, (node) => { + if (containsNestedList || node.isTextblock) { + return false; + } + if ((0,_schemaHelpers__WEBPACK_IMPORTED_MODULE_1__.isListBlock)(node)) { + containsNestedList = true; + return false; + } + }); + return containsNestedList; +} +function isWithinNestedList($from, $to, listBlockRange = getListBlockRange($from, $to)) { + if (!listBlockRange) { + return false; + } + // The depth of the list item nodes within the listBlockRange will be 1 if + // they are in a top level list. + return listBlockRange.depth > 1; +} +/** + * The current selection can be outdented if: One, it is within a list. And two, + * the beginning (ie, the top) of the selection points into the same list item + * as the one that will be outdented by the outdent command. This is important + * because if the selection is within a sublist of what gets outdented, it feels + * unexpected; list items many levels up and above the selection can be changed + * as a result. Changing list items below the current selection isn't ideal + * either, but it makes more intuitive sense than the inverse. + * + * If the selection cannot be outdented, return false. If it can be outdented, + * return the node range that surrounds the selected list items. + */ +function canOutdentListSelection(state) { + const { $from, $to } = state.selection; + const listBlockRange = getListBlockRange($from, $to); + if (!listBlockRange) { + return false; + } + // We need to figure out if the $from position points into a sublist or if its + // parent is the same as the first list item in the node range. Add 2 to + // $from.parentOffset to account for the opening token of both the list item + // and the paragraph. + if ($from.pos !== listBlockRange.start + $from.parentOffset + 2) { + return false; + } + return listBlockRange; +} +const outdentListSelection = function (state, dispatch) { + if (!canOutdentListSelection(state)) { + return false; + } + return (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.liftListItem)(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.list_item)(state, dispatch); }; /** * Update the list type of the selection. @@ -26484,49 +26555,33 @@ const outdentListItem = function (state, dispatch) { */ const toggleList = function (view, listType, itemType) { const { state: { selection: { $from, $to }, }, } = view; - const listBlockRange = $from.blockRange($to, (node) => node.type === listType); + const listBlockRange = getListBlockRange($from, $to, [listType]); + if (containsNestedList($from, $to, listBlockRange)) { + // If the selection overlaps with a nested list, do nothing. + return; + } + if (isWithinNestedList($from, $to, listBlockRange)) { + // If the selection is within a nested list, do nothing. + return; + } if (listBlockRange) { - // If the selection is with a list that is nested inside another list, do - // nothing. Depth of 2 accounts for the list node and the list item node. - if (listBlockRange.depth > 2) { - return; - } - const { dispatch, state } = view; - let containsNestedList = false; - const $rangeStart = state.doc.resolve(listBlockRange.start); - const $rangeEnd = state.doc.resolve(listBlockRange.end); - listBlockRange.parent.nodesBetween($rangeStart.parentOffset, $rangeEnd.parentOffset, (node) => { - console.log('node', node.type.name, node.textContent); - if (containsNestedList || node.isTextblock) { - return false; - } - if (node.type === _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list || - node.type === _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.ordered_list) { - containsNestedList = true; - return false; - } - }); - if (containsNestedList) { - return; - } - // If the selection is entirely within a list lift the selected items out - (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.liftListItem)(itemType)(state, dispatch); + // If the selection spans exclusively a list at depth 1 lift the selected + // items out and be done. + (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.liftListItem)(itemType)(view.state, view.dispatch); return; } - else { - const blockRange = $from.blockRange($to); - for (let index = blockRange.startIndex; index < blockRange.endIndex; index += 1) { - if (blockRange.parent.child(index).type === listType) { - // If the selection is partially inside a list, do nothing - return; - } + // If the selection is outside of a list, check if it is partially inside a list. + const blockRange = $from.blockRange($to); + for (let index = blockRange.startIndex; index < blockRange.endIndex; index += 1) { + if ((0,_schemaHelpers__WEBPACK_IMPORTED_MODULE_1__.isListBlock)(blockRange.parent.child(index), [listType])) { + // If the selection is partially inside a list, do nothing + return; } - // If the selection is entirely outside a list, convert everything to a paragraph - // so it can subsequently become a list - swapTextBlock(view, _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.paragraph); - const { dispatch, state } = view; - (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_1__.wrapInList)(listType)(state, dispatch); } + // If the selection is entirely outside a list, convert everything to a paragraph + // so it can subsequently become a list + swapTextBlock(view, _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.paragraph); + (0,prosemirror_schema_list__WEBPACK_IMPORTED_MODULE_2__.wrapInList)(listType)(view.state, view.dispatch); }; const toggleChecklistItemState = function (state, dispatch) { const { $from, $to } = state.selection; @@ -26631,7 +26686,7 @@ class LinkModal { return this.el.querySelector('button#clear'); } } -class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugin { +class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_3__.Plugin { constructor(toolbarEl, modalEl) { super({ view: (viewInstance) => { @@ -26656,20 +26711,20 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi const hasCtrl = e.ctrlKey; const hasMod = e.metaKey; const hasShift = e.shiftKey; - if (hasCtrl && e.key === 'l') { - indentListItem(this.view.state, this.view.dispatch); + if (hasCtrl && e.key === '.') { + indentListSelection(this.view.state, this.view.dispatch); return true; } - if (hasCtrl && e.key === 'h') { - outdentListItem(this.view.state, this.view.dispatch); + if (hasCtrl && e.key === ',') { + outdentListSelection(this.view.state, this.view.dispatch); return true; } if (e.key === 'Tab' && !hasCtrl && !hasMod) { if (hasShift) { - outdentListItem(this.view.state, this.view.dispatch); + outdentListSelection(this.view.state, this.view.dispatch); } else { - indentListItem(this.view.state, this.view.dispatch); + indentListSelection(this.view.state, this.view.dispatch); } return true; } @@ -26701,10 +26756,10 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi return toggleChecklistItemState(this.view.state, this.view.dispatch); } if (hasMod && e.key === 'z') { - return (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_3__.undo)(this.view.state, this.view.dispatch); + return (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_4__.undo)(this.view.state, this.view.dispatch); } if (hasMod && e.key === 'y') { - return (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_3__.redo)(this.view.state, this.view.dispatch); + return (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_4__.redo)(this.view.state, this.view.dispatch); } if (hasMod && e.key === 'i') { this.toggleMark(_schema__WEBPACK_IMPORTED_MODULE_0__.schema.marks.em); @@ -26755,8 +26810,7 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi toggleList(this.view, listType, itemType); }; this.toggleChecklistItem = () => { - const { dispatch, state } = this.view; - const { doc, tr } = state; + const { state } = this.view; const { $from, $to } = state.selection; const blockRange = $from.blockRange($to); for (let index = blockRange.startIndex; index < blockRange.endIndex; index += 1) { @@ -26794,7 +26848,7 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi end = start + textNode.nodeSize; text = textNode.text; url = mark.attrs.href; - const newSelection = new prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.TextSelection(doc.resolve(start), doc.resolve(end)); + const newSelection = new prosemirror_state__WEBPACK_IMPORTED_MODULE_3__.TextSelection(doc.resolve(start), doc.resolve(end)); dispatch(state.tr.setSelection(newSelection)); } else { @@ -26804,7 +26858,7 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi url = ''; } const onClear = mark && - (() => this.view.dispatch(this.view.state.tr.step(new prosemirror_transform__WEBPACK_IMPORTED_MODULE_4__.RemoveMarkStep(start, end, mark)))); + (() => this.view.dispatch(this.view.state.tr.step(new prosemirror_transform__WEBPACK_IMPORTED_MODULE_5__.RemoveMarkStep(start, end, mark)))); this.modal = new LinkModal(this.modalEl, { onClear, onConfirm: ({ text, url }) => { @@ -26818,7 +26872,7 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi return true; }; this.toggleMark = (mark) => { - (0,prosemirror_commands__WEBPACK_IMPORTED_MODULE_5__.toggleMark)(mark)(this.view.state, this.view.dispatch); + (0,prosemirror_commands__WEBPACK_IMPORTED_MODULE_6__.toggleMark)(mark)(this.view.state, this.view.dispatch); this.view.focus(); }; this.updateToolbarForSelection = (state) => { @@ -26876,7 +26930,8 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi const result = []; switch (nodeType) { case _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.heading1: - case _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.heading2: { + case _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.heading2: + case _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.heading3: { result.push('heading'); break; } @@ -26937,11 +26992,11 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi this.applyFormat = (dataFormatStr) => { switch (dataFormatStr) { case 'undo': { - (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_3__.undo)(this.view.state, this.view.dispatch); + (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_4__.undo)(this.view.state, this.view.dispatch); break; } case 'redo': { - (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_3__.redo)(this.view.state, this.view.dispatch); + (0,prosemirror_history__WEBPACK_IMPORTED_MODULE_4__.redo)(this.view.state, this.view.dispatch); break; } case 'paragraph': { @@ -26979,11 +27034,11 @@ class ToolbarPlugin extends prosemirror_state__WEBPACK_IMPORTED_MODULE_2__.Plugi break; } case 'indent': { - indentListItem(this.view.state, this.view.dispatch); + indentListSelection(this.view.state, this.view.dispatch); break; } case 'outdent': { - outdentListItem(this.view.state, this.view.dispatch); + outdentListSelection(this.view.state, this.view.dispatch); break; } default: { @@ -27174,7 +27229,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("# Scratch, a Standard Notes editor extension\n\nScratch is an editor extension for [Standard Notes](https://standardnotes.org/), a note-taking app that emphasizes privacy, security, and sustainability. If you don’t know what Standard Notes is, you are probably in the wrong place.\n\nScratch includes most of the text editing features you would expect for taking notes, like lists, checkboxes, basic text formatting, smart copy/paste, and hotkeys. It uses the library [ProseMirror](https://prosemirror.net/) to make those features possible. This page is an instance of the editor. Give it a try!\n\n## Installation\n\nTo use the Scratch editor in Standard Notes, click Extensions in the lower left hand corner of the desktop app. Click “Import Extension” and paste in the following url: . You will then have access to the editor on all the Standard Notes apps and will receive updates to the extension automatically.\n\n## Formatting your notes\n\nScratch includes a number of ways to format your notes. It has **bold**, _italic_, and `monospace` text, and it lets you add [links](https://github.com/dylanonelson/sn-scratch-editor). It includes three levels of heads, two types of lists, and todo items that have a checkbox. Scratch tries to be smart about spacing so that you don’t have to insert empty lines.\n\n## How to use this editor\n\n[ ][download the desktop client](https://standardnotes.org/) or go to the [web app](https://app.standardnotes.org/)\n\n[ ] Open the extensions menu in the lower left-hand corner\n\n[ ] Install the Scratch extension by clicking “Import Extension” and pasting the download link: `https://scratch-editor.com/ext.json`\n\n## Hotkeys\n\nYou can also see a legend for many of these hotkeys in the alt text of the toolbar buttons.\n\n- `ctrl + =` cycles through the levels of headings (there are three)\n\n- `ctrl + j` turns the current text chunk into a plain paragraph\n\n- `ctrl + u` wraps the current text chunk in a bulleted list\n\n- `ctrl + o` wraps the current text chunk in a numbered list\n\n- `ctrl + t` creates a checklist item from the current text chunk\n\n- `cmd + b` / `ctrl + b` toggles bold formatting on and off\n\n- `cmd + i` / `ctrl + i` toggles italic formatting on and off\n\n- `cmd + '` / `ctrl + '` toggles monospace formatting on and off\n\n- `cmd + space` / `ctrl + space` checks or unchecks a checkbox if your cursor is inside its attached text\n\n- `cmd + k` / `ctrl + k` opens a link editing dialog\n\n- `cmd + z` / `ctrl + z` is undo\n\n- `cmd + y` / `ctrl + y` is redo\n\n## Formatting macros\n\n- smart curly quote and apostrophe substitution\n\n- insert headings by typing `#` or `##` or `###`\n\n- insert bulleted lists by typing `-`\n\n- insert numbered lists by typing `1.`\n\n- insert bold text by wrapping it in `*`\n\n- insert italic text by wrapping it in `_`\n\n- insert a code block by typing three backticks ` ``` `\n\n## Markdown integration\n\nScratch saves your note as markdown text. That means that if you write your notes in Scratch, you can also edit them in the other markdown editors that come with Standard Notes. It also means that if you want to stop using Scratch, you can simply uninstall it and forget that it ever existed. You can see what this text looks like in markdown by viewing [the source](https://github.com/dylanonelson/sn-scratch-editor/blob/master/src/demoDocs.md).\n\nIf you edit a note in a different editor, and then open it in Scratch, Scratch will pick up your changes (assuming those changes were made to the underlying markdown text of the note, and not using some other custom format). However, there are certain kinds of formatting that markdown supports that Scratch does not, at least not yet. If you add some text of this kind, like for example a block quote, Scratch will render it as a special type of “escaped” code block. These blocks are saved back to the underlying markdown note as pure markdown, not as a code block. If you wind up with one of these special code blocks in your note, you will see an alert to that effect in the upper right-hand corner of the code block.\n\nScratch markdown is [CommonMark](https://commonmark.org/) markdown, with one exception. Scratch adds checklist items in the following form:\n\n```\n[ ] An unchecked item\n[x] A checked item\n[X] Another checked item\n```\n\nIf you create, edit, and view your checklists in Scratch, you don’t have to worry about how they look in markdown. But if you’d like to edit your notes in markdown editors, too, then know that this is what Scratch thinks of as a markdown checklist.\n\n## Coming soon\n\nScratch is a work in progress. I have a running list of things I’d like to add, provided I can find the time and motivation. You can think of the following as a list of things that Scratch _doesn’t_ have, at least not yet.\n\n1. tables, or something like them\n\n1. syntax highlighting and one-click copy-to-clipboard for code blocks\n\n1. nested lists, with full support for markdown formatting within list items\n"); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("# Scratch, a Standard Notes editor extension\n\nScratch is an editor extension for [Standard Notes](https://standardnotes.org/), a note-taking app that emphasizes privacy, security, and sustainability. If you don’t know what Standard Notes is, you are probably in the wrong place.\n\nScratch includes most of the text editing features you would expect for taking notes, like lists, checkboxes, basic text formatting, smart copy/paste, and hotkeys. It uses the library [ProseMirror](https://prosemirror.net/) to make those features possible. This page is an instance of the editor. Give it a try!\n\n## Installation\n\nTo use the Scratch editor in Standard Notes, click Extensions in the lower left hand corner of the desktop app. Click “Import Extension” and paste in the following url: . You will then have access to the editor on all the Standard Notes apps and will receive updates to the extension automatically.\n\n## Formatting your notes\n\nScratch includes a number of ways to format your notes. It has **bold**, _italic_, and `monospace` text, and it lets you add [links](https://github.com/dylanonelson/sn-scratch-editor). It includes three levels of heads, two types of lists, and todo items that have a checkbox. Scratch tries to be smart about spacing so that you don’t have to insert empty lines.\n\n## How to use this editor\n\n[ ][download the desktop client](https://standardnotes.org/) or go to the [web app](https://app.standardnotes.org/)\n\n[ ] Open the extensions menu in the lower left-hand corner\n\n[ ] Install the Scratch extension by clicking “Import Extension” and pasting the download link: `https://scratch-editor.com/ext.json`\n\n## Hotkeys\n\nYou can also see a legend for many of these hotkeys in the alt text of the toolbar buttons.\n\n- `ctrl + =` cycles through the levels of headings (there are three)\n\n- `ctrl + j` turns the current text chunk into a plain paragraph\n\n- `ctrl + u` wraps the current text chunk in a bulleted list\n\n- `ctrl + o` wraps the current text chunk in a numbered list\n\n- `ctrl + t` creates a checklist item from the current text chunk\n\n- `cmd + b` / `ctrl + b` toggles bold formatting on and off\n\n- `cmd + i` / `ctrl + i` toggles italic formatting on and off\n\n- `cmd + '` / `ctrl + '` toggles monospace formatting on and off\n\n- `cmd + space` / `ctrl + space` checks or unchecks a checkbox if your cursor is inside its attached text\n\n- `cmd + k` / `ctrl + k` opens a link editing dialog\n\n- `cmd + z` / `ctrl + z` is undo\n\n- `cmd + y` / `ctrl + y` is redo\n\n- `ctrl + .` is indent\n\n- `ctrl + ,` is outdent\n\n## Formatting macros\n\n- smart curly quote and apostrophe substitution\n\n- insert headings by typing `#` or `##` or `###`\n\n- insert bulleted lists by typing `-`\n\n- insert numbered lists by typing `1.`\n\n- insert bold text by wrapping it in `*`\n\n- insert italic text by wrapping it in `_`\n\n- insert a code block by typing three backticks ` ``` `\n\n## Markdown integration\n\nScratch saves your note as markdown text. That means that if you write your notes in Scratch, you can also edit them in the other markdown editors that come with Standard Notes. It also means that if you want to stop using Scratch, you can simply uninstall it and forget that it ever existed. You can see what this text looks like in markdown by viewing [the source](https://github.com/dylanonelson/sn-scratch-editor/blob/master/src/demoDocs.md).\n\nIf you edit a note in a different editor, and then open it in Scratch, Scratch will pick up your changes (assuming those changes were made to the underlying markdown text of the note, and not using some other custom format). However, there are certain kinds of formatting that markdown supports that Scratch does not, at least not yet. If you add some text of this kind, like for example a block quote, Scratch will render it as a special type of “escaped” code block. These blocks are saved back to the underlying markdown note as pure markdown, not as a code block. If you wind up with one of these special code blocks in your note, you will see an alert to that effect in the upper right-hand corner of the code block.\n\nScratch markdown is [CommonMark](https://commonmark.org/) markdown, with one exception. Scratch adds checklist items in the following form:\n\n```\n[ ] An unchecked item\n[x] A checked item\n[X] Another checked item\n```\n\nIf you create, edit, and view your checklists in Scratch, you don’t have to worry about how they look in markdown. But if you’d like to edit your notes in markdown editors, too, then know that this is what Scratch thinks of as a markdown checklist.\n\n## Coming soon\n\nScratch is a work in progress. I have a running list of things I’d like to add, provided I can find the time and motivation. You can think of the following as a list of things that Scratch _doesn’t_ have, at least not yet.\n\n1. tables, or something like them\n\n1. syntax highlighting and one-click copy-to-clipboard for code blocks\n"); /***/ }), @@ -27975,6 +28030,26 @@ const spec = { const schema = new prosemirror_model__WEBPACK_IMPORTED_MODULE_2__.Schema(spec); +/***/ }), + +/***/ "./src/schemaHelpers.ts": +/*!******************************!*\ + !*** ./src/schemaHelpers.ts ***! + \******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ isListBlock: () => (/* binding */ isListBlock) +/* harmony export */ }); +/* harmony import */ var _schema__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schema */ "./src/schema.ts"); + +function isListBlock(node, listTypes = [_schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.unordered_list, _schema__WEBPACK_IMPORTED_MODULE_0__.schema.nodes.ordered_list]) { + return listTypes.includes(node.type); +} + + /***/ }) /******/ }); @@ -28158,4 +28233,4 @@ __webpack_require__.r(__webpack_exports__); /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHlCQUF5QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsbUJBQW1CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHVCQUF1QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxxQkFBcUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHdCQUF3QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsNEJBQTRCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEdBQUcsQ0FBZ0IsZUFBZSxZQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEdBQUcsQ0FBZ0IsZUFBZSxZQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxlQUFlLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLG1CQUFtQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsc0JBQXNCLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsbUJBQW1CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx5QkFBeUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHlCQUF5QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsd0JBQXdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQywwQkFBMEIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMseUJBQXlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsd0JBQXdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsc0JBQXNCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxxQkFBcUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLDRCQUE0QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG1CQUFtQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsc0JBQXNCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxtQkFBbUIsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxzQkFBc0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsdUJBQXVCLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxrQkFBa0IsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQywyQkFBMkIsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxFQUFDLElBQUksR0FBRyxDQUFnQixlQUFlLFlBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCbDZ0QjtBQUNMO0FBTXhDO0FBRXJCLHdDQUF3QztBQUN4QyxJQUFZLFdBS1g7QUFMRCxXQUFZLFdBQVc7SUFDbkIsaUNBQWlDO0lBQ2pDLDJDQUFPO0lBQ1AsbUVBQW1FO0lBQ25FLDZDQUFRO0FBQ1osQ0FBQyxFQUxXLFdBQVcsS0FBWCxXQUFXLFFBS3RCO0FBRUQsSUFBWSxZQTJCWDtBQTNCRCxXQUFZLFlBQVk7SUFDcEI7OztPQUdHO0lBQ0gsK0NBQUk7SUFDSjs7OztPQUlHO0lBQ0gsaURBQUs7SUFDTDs7O09BR0c7SUFDSCx5REFBUztJQUNUOzs7T0FHRztJQUNILHlEQUFTO0lBQ1Q7OztPQUdHO0lBQ0gsK0NBQUk7QUFDUixDQUFDLEVBM0JXLFlBQVksS0FBWixZQUFZLFFBMkJ2QjtBQXNCRDs7Ozs7R0FLRztBQUNHLFNBQVUsTUFBTSxDQUNsQixJQUFZLEVBQ1osVUFBeUMsV0FBVyxDQUFDLEdBQUc7SUFFeEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFFcEUsSUFBSSxLQUFLLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTtRQUM1QixNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRSxPQUFPLHNEQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pDO0lBRUQsT0FBTyxxREFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDRyxTQUFVLFlBQVksQ0FDeEIsSUFBWSxFQUNaLFVBQXlDLFdBQVcsQ0FBQyxHQUFHOztJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDeEUsVUFBSSxDQUFDLElBQUksb0NBQVQsSUFBSSxDQUFDLElBQUksR0FBSyxvREFBWSxDQUFDLE1BQU0sRUFBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQWtCRDs7Ozs7R0FLRztBQUNHLFNBQVUsTUFBTSxDQUNsQixJQUFZLEVBQ1osVUFBeUMsV0FBVyxDQUFDLEdBQUc7SUFFeEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRXhFLHdDQUF3QztJQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUk7UUFBRSxPQUFPLHNEQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxTQUFTO1FBQUUsT0FBTywyREFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSTtRQUFFLE9BQU8sc0RBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3RCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTtRQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRTtZQUNsQyxPQUFPLDhEQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxzREFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO0lBRUQscUNBQXFDO0lBQ3JDLE9BQU8scURBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBUW9CO0FBUUE7QUFlQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqTGU7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCLDRCQUE0Qjs7QUFFNUIsMEJBQTBCLG9DQUFvQzs7QUFFOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1REFBUzs7QUFFaEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4Qix1QkFBdUI7O0FBRXZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLFNBQVM7Ozs7Ozs7Ozs7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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7O0FDalV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0Isa0RBQWtEOztBQUVsRDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThC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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxREFBcUQsT0FBTztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsS0FBSzs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQSw2Q0FBNkMsS0FBSztBQUNsRCw0Q0FBNEMsS0FBSztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDLG1EQUFJLE9BQU87QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLG9CQUFvQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFVBQVU7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEJBQTBCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsVUFBVTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsS0FBSyx1QkFBdUIsS0FBSztBQUM5RSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxXQUFXO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBNkQ7QUFDdkc7QUFDQSx5Q0FBeUMsNkRBQTZEO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFdBQVc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csUUFBUTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsVUFBVSxJQUFJLGdDQUFnQztBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsT0FBTyxnQkFBZ0IsVUFBVSxVQUFVLFNBQVMsUUFBUSxLQUFLO0FBQzVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrREFBVTtBQUN2QyxpQ0FBaUMsa0RBQVUsc0JBQXNCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxzQkFBc0I7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLHdCQUF3QjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QSw0QkFBNEIscUJBQXFCO0FBQ2pELHNCQUFzQixhQUFhO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0JBQWtCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsb0RBQUs7QUFDL0I7QUFDQSx1QkFBdUIsb0RBQUs7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFLLENBQUMsdURBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9EQUFLO0FBQy9CLHVCQUF1QixvREFBSztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLGVBQWU7QUFDZixnQkFBZ0I7QUFDaEIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyx3Q0FBd0M7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDhEQUFXLG9CQUFvQixvRUFBaUI7QUFDMUU7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRCxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw0REFBUztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtREFBSTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2SUFBNkksbURBQUk7QUFDako7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFLO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0RBQUs7QUFDN0I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsb0RBQUssQ0FBQyx1REFBUTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsdUJBQXVCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNq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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLG9EQUFLO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLG9EQUFLLENBQUMsdURBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxvREFBSztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbURBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTBTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNtRWhOO0FBQ047QUFDbEM7O0FBRWxEO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UsaUJBQWlCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixLQUFLO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCx3Q0FBd0M7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEtBQUs7QUFDN0IscUJBQXFCLG9EQUFvRDtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLGNBQWMsaUJBQWlCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLG9CQUFvQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxPQUFPO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZJQUE2STtBQUM3STtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msa0JBQWtCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFdBQVc7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUscUJBQXFCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyx3REFBd0Q7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLE9BQU87QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyw4QkFBOEI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw4QkFBOEI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0EsaUNBQWlDLDREQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHdEQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLG1CQUFtQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELDREQUFhO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrQkFBK0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0JBQStCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw2QkFBNkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Riw0REFBYTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtCQUErQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsb0JBQW9CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O3dCQUNWLElBQUkseURBQWEsQ0FDZixRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUNsQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUN0QztxQkFDRjtpQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQUE7QUFFRCxJQUFJLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7QUM3RlAiLCJzb3VyY2VzIjpbImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2RlY29kZS50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2RlY29kZV9jb2RlcG9pbnQudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9lbmNvZGUudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9lc2NhcGUudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS14bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZW5jb2RlLWh0bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2xpYi9yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9jb21tb24vaHRtbF9ibG9ja3MubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9jb21tb24vaHRtbF9yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2NvbW1vbi91dGlscy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2hlbHBlcnMvaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfZGVzdGluYXRpb24ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfbGFiZWwubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfdGl0bGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9jb3JlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcGFyc2VyX2lubGluZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvY29tbW9ubWFyay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvZGVmYXVsdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvemVyby5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3JlbmRlcmVyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXIubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9ibG9ja3F1b3RlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2ZlbmNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaGVhZGluZy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2hyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaHRtbF9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2xoZWFkaW5nLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svbGlzdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3BhcmFncmFwaC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3JlZmVyZW5jZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3N0YXRlX2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svdGFibGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL2xpbmtpZnkubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL25vcm1hbGl6ZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvcmVwbGFjZW1lbnRzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9zbWFydHF1b3Rlcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvc3RhdGVfY29yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvdGV4dF9qb2luLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2F1dG9saW5rLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9iYWxhbmNlX3BhaXJzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VtcGhhc2lzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VudGl0eS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9lc2NhcGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZnJhZ21lbnRzX2pvaW4ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaHRtbF9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaW1hZ2UubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvbGluay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9saW5raWZ5Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL25ld2xpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvc3RhdGVfaW5saW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL3N0cmlrZXRocm91Z2gubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvdGV4dC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3Rva2VuLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tZHVybC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2RlY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2VuY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2Zvcm1hdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL3BhcnNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9vcmRlcmVkbWFwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItY29tbWFuZHMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1oaXN0b3J5L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaW5wdXRydWxlcy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWtleW1hcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLW1hcmtkb3duL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtYmFzaWMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtbGlzdC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXN0YXRlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItdHJhbnNmb3JtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itdmlldy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3B1bnljb2RlLmpzL3B1bnljb2RlLmVzNi5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9yb3BlLXNlcXVlbmNlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9DYy9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9DZi9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9QL3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL1MvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvWi9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL3Byb3BlcnRpZXMvQW55L3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy93M2Mta2V5bmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9FZGl0b3JFeHRlbmRlclBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9JbmxpbmVMaW5rUGx1Z2luLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL1Rvb2xiYXJQbHVnaW4udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvVG9vbHRpcFBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9hc3NldHMvY2hlY2tfYm94LTI0cHguc3ZnIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2Fzc2V0cy9jaGVja19ib3hfb3V0bGluZV9ibGFuay0yNHB4LnN2ZyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9hc3NldHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvZGVtb0NsaWVudC50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9kZW1vRG9jcy5tZCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9pbnB1dFJ1bGVzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2tleW1hcHMudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvbWFya2Rvd24udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvbm9kZVZpZXdzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3NjaGVtYS50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3Ivd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3N0eWxlcy5jc3M/MTU1MyJdLCJzb3VyY2VzQ29udGVudCI6W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiaW1wb3J0IHJlRmFjdG9yeSBmcm9tICcuL2xpYi9yZS5tanMnXG5cbi8vXG4vLyBIZWxwZXJzXG4vL1xuXG4vLyBNZXJnZSBvYmplY3RzXG4vL1xuZnVuY3Rpb24gYXNzaWduIChvYmogLyogZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uICovKSB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG5cbiAgc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICBpZiAoIXNvdXJjZSkgeyByZXR1cm4gfVxuXG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIG9ialtrZXldID0gc291cmNlW2tleV1cbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gX2NsYXNzIChvYmopIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopIH1cbmZ1bmN0aW9uIGlzU3RyaW5nIChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBTdHJpbmddJyB9XG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgfVxuZnVuY3Rpb24gaXNSZWdFeHAgKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nIH1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24gKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfVxuXG5mdW5jdGlvbiBlc2NhcGVSRSAoc3RyKSB7IHJldHVybiBzdHIucmVwbGFjZSgvWy4/KiteJFtcXF1cXFxcKCl7fXwtXS9nLCAnXFxcXCQmJykgfVxuXG4vL1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgZnV6enlMaW5rOiB0cnVlLFxuICBmdXp6eUVtYWlsOiB0cnVlLFxuICBmdXp6eUlQOiBmYWxzZVxufVxuXG5mdW5jdGlvbiBpc09wdGlvbnNPYmogKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqIHx8IHt9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgaykge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMgKi9cbiAgICByZXR1cm4gYWNjIHx8IGRlZmF1bHRPcHRpb25zLmhhc093blByb3BlcnR5KGspXG4gIH0sIGZhbHNlKVxufVxuXG5jb25zdCBkZWZhdWx0U2NoZW1hcyA9IHtcbiAgJ2h0dHA6Jzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5odHRwKSB7XG4gICAgICAgIC8vIGNvbXBpbGUgbGF6aWx5LCBiZWNhdXNlIFwiaG9zdFwiLWNvbnRhaW5pbmcgdmFyaWFibGVzIGNhbiBjaGFuZ2Ugb24gdGxkcyB1cGRhdGUuXG4gICAgICAgIHNlbGYucmUuaHR0cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgJ15cXFxcL1xcXFwvJyArIHNlbGYucmUuc3JjX2F1dGggKyBzZWxmLnJlLnNyY19ob3N0X3BvcnRfc3RyaWN0ICsgc2VsZi5yZS5zcmNfcGF0aCwgJ2knXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLnJlLmh0dHAudGVzdCh0YWlsKSkge1xuICAgICAgICByZXR1cm4gdGFpbC5tYXRjaChzZWxmLnJlLmh0dHApWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH0sXG4gICdodHRwczonOiAnaHR0cDonLFxuICAnZnRwOic6ICdodHRwOicsXG4gICcvLyc6IHtcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKHRleHQsIHBvcywgc2VsZikge1xuICAgICAgY29uc3QgdGFpbCA9IHRleHQuc2xpY2UocG9zKVxuXG4gICAgICBpZiAoIXNlbGYucmUubm9faHR0cCkge1xuICAgICAgLy8gY29tcGlsZSBsYXppbHksIGJlY2F1c2UgXCJob3N0XCItY29udGFpbmluZyB2YXJpYWJsZXMgY2FuIGNoYW5nZSBvbiB0bGRzIHVwZGF0ZS5cbiAgICAgICAgc2VsZi5yZS5ub19odHRwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAnXicgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX2F1dGggK1xuICAgICAgICAgIC8vIERvbid0IGFsbG93IHNpbmdsZS1sZXZlbCBkb21haW5zLCBiZWNhdXNlIG9mIGZhbHNlIHBvc2l0aXZlcyBsaWtlICcvL3Rlc3QnXG4gICAgICAgICAgLy8gd2l0aCBjb2RlIGNvbW1lbnRzXG4gICAgICAgICAgJyg/OmxvY2FsaG9zdHwoPzooPzonICsgc2VsZi5yZS5zcmNfZG9tYWluICsgJylcXFxcLikrJyArIHNlbGYucmUuc3JjX2RvbWFpbl9yb290ICsgJyknICtcbiAgICAgICAgICBzZWxmLnJlLnNyY19wb3J0ICtcbiAgICAgICAgICBzZWxmLnJlLnNyY19ob3N0X3Rlcm1pbmF0b3IgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX3BhdGgsXG5cbiAgICAgICAgICAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5yZS5ub19odHRwLnRlc3QodGFpbCkpIHtcbiAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSBgOi8vYCAmIGAvLy9gLCB0aGF0IHByb3RlY3RzIGZyb20gZXJyb3JzIGluIHByb3RvY29sIG5hbWVcbiAgICAgICAgaWYgKHBvcyA+PSAzICYmIHRleHRbcG9zIC0gM10gPT09ICc6JykgeyByZXR1cm4gMCB9XG4gICAgICAgIGlmIChwb3MgPj0gMyAmJiB0ZXh0W3BvcyAtIDNdID09PSAnLycpIHsgcmV0dXJuIDAgfVxuICAgICAgICByZXR1cm4gdGFpbC5tYXRjaChzZWxmLnJlLm5vX2h0dHApWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH0sXG4gICdtYWlsdG86Jzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5tYWlsdG8pIHtcbiAgICAgICAgc2VsZi5yZS5tYWlsdG8gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICdeJyArIHNlbGYucmUuc3JjX2VtYWlsX25hbWUgKyAnQCcgKyBzZWxmLnJlLnNyY19ob3N0X3N0cmljdCwgJ2knXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLnJlLm1haWx0by50ZXN0KHRhaWwpKSB7XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUubWFpbHRvKVswXS5sZW5ndGhcbiAgICAgIH1cbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG59XG5cbi8vIFJFIHBhdHRlcm4gZm9yIDItY2hhcmFjdGVyIHRsZHMgKGF1dG9nZW5lcmF0ZWQgYnkgLi9zdXBwb3J0L3RsZHNfMmNoYXJfZ2VuLmpzKVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4gKi9cbmNvbnN0IHRsZHNfMmNoX3NyY19yZSA9ICdhW2NkZWZnaWxtbm9xcnN0dXd4el18YlthYmRlZmdoaWptbm9yc3R2d3l6XXxjW2FjZGZnaGlrbG1ub3J1dnd4eXpdfGRbZWprbW96XXxlW2NlZ3JzdHVdfGZbaWprbW9yXXxnW2FiZGVmZ2hpbG1ucHFyc3R1d3ldfGhba21ucnR1XXxpW2RlbG1ub3Fyc3RdfGpbZW1vcF18a1tlZ2hpbW5wcnd5el18bFthYmNpa3JzdHV2eV18bVthY2RlZ2hrbG1ub3BxcnN0dXZ3eHl6XXxuW2FjZWZnaWxvcHJ1el18b218cFthZWZnaGtsbW5yc3R3eV18cWF8cltlb3N1d118c1thYmNkZWdoaWprbG1ub3J0dXZ4eXpdfHRbY2RmZ2hqa2xtbm9ydHZ3el18dVthZ2tzeXpdfHZbYWNlZ2ludV18d1tmc118eVtldF18elthbXddJ1xuXG4vLyBET04nVCB0cnkgdG8gbWFrZSBQUnMgd2l0aCBjaGFuZ2VzLiBFeHRlbmQgVExEcyB3aXRoIExpbmtpZnlJdC50bGRzKCkgaW5zdGVhZFxuY29uc3QgdGxkc19kZWZhdWx0ID0gJ2Jpenxjb218ZWR1fGdvdnxuZXR8b3JnfHByb3x3ZWJ8eHh4fGFlcm98YXNpYXxjb29wfGluZm98bXVzZXVtfG5hbWV8c2hvcHzRgNGEJy5zcGxpdCgnfCcpXG5cbmZ1bmN0aW9uIHJlc2V0U2NhbkNhY2hlIChzZWxmKSB7XG4gIHNlbGYuX19pbmRleF9fID0gLTFcbiAgc2VsZi5fX3RleHRfY2FjaGVfXyA9ICcnXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZhbGlkYXRvciAocmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0ZXh0LCBwb3MpIHtcbiAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICBpZiAocmUudGVzdCh0YWlsKSkge1xuICAgICAgcmV0dXJuIHRhaWwubWF0Y2gocmUpWzBdLmxlbmd0aFxuICAgIH1cbiAgICByZXR1cm4gMFxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5vcm1hbGl6ZXIgKCkge1xuICByZXR1cm4gZnVuY3Rpb24gKG1hdGNoLCBzZWxmKSB7XG4gICAgc2VsZi5ub3JtYWxpemUobWF0Y2gpXG4gIH1cbn1cblxuLy8gU2NoZW1hcyBjb21waWxlci4gQnVpbGQgcmVnZXhwcy5cbi8vXG5mdW5jdGlvbiBjb21waWxlIChzZWxmKSB7XG4gIC8vIExvYWQgJiBjbG9uZSBSRSBwYXR0ZXJucy5cbiAgY29uc3QgcmUgPSBzZWxmLnJlID0gcmVGYWN0b3J5KHNlbGYuX19vcHRzX18pXG5cbiAgLy8gRGVmaW5lIGR5bmFtaWMgcGF0dGVybnNcbiAgY29uc3QgdGxkcyA9IHNlbGYuX190bGRzX18uc2xpY2UoKVxuXG4gIHNlbGYub25Db21waWxlKClcblxuICBpZiAoIXNlbGYuX190bGRzX3JlcGxhY2VkX18pIHtcbiAgICB0bGRzLnB1c2godGxkc18yY2hfc3JjX3JlKVxuICB9XG4gIHRsZHMucHVzaChyZS5zcmNfeG4pXG5cbiAgcmUuc3JjX3RsZHMgPSB0bGRzLmpvaW4oJ3wnKVxuXG4gIGZ1bmN0aW9uIHVudHBsICh0cGwpIHsgcmV0dXJuIHRwbC5yZXBsYWNlKCclVExEUyUnLCByZS5zcmNfdGxkcykgfVxuXG4gIHJlLmVtYWlsX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9lbWFpbF9mdXp6eSksICdpJylcbiAgcmUubGlua19mdXp6eSA9IFJlZ0V4cCh1bnRwbChyZS50cGxfbGlua19mdXp6eSksICdpJylcbiAgcmUubGlua19ub19pcF9mdXp6eSA9IFJlZ0V4cCh1bnRwbChyZS50cGxfbGlua19ub19pcF9mdXp6eSksICdpJylcbiAgcmUuaG9zdF9mdXp6eV90ZXN0ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9ob3N0X2Z1enp5X3Rlc3QpLCAnaScpXG5cbiAgLy9cbiAgLy8gQ29tcGlsZSBlYWNoIHNjaGVtYVxuICAvL1xuXG4gIGNvbnN0IGFsaWFzZXMgPSBbXVxuXG4gIHNlbGYuX19jb21waWxlZF9fID0ge30gLy8gUmVzZXQgY29tcGlsZWQgZGF0YVxuXG4gIGZ1bmN0aW9uIHNjaGVtYUVycm9yIChuYW1lLCB2YWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJyhMaW5raWZ5SXQpIEludmFsaWQgc2NoZW1hIFwiJyArIG5hbWUgKyAnXCI6ICcgKyB2YWwpXG4gIH1cblxuICBPYmplY3Qua2V5cyhzZWxmLl9fc2NoZW1hc19fKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgdmFsID0gc2VsZi5fX3NjaGVtYXNfX1tuYW1lXVxuXG4gICAgLy8gc2tpcCBkaXNhYmxlZCBtZXRob2RzXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkgeyByZXR1cm4gfVxuXG4gICAgY29uc3QgY29tcGlsZWQgPSB7IHZhbGlkYXRlOiBudWxsLCBsaW5rOiBudWxsIH1cblxuICAgIHNlbGYuX19jb21waWxlZF9fW25hbWVdID0gY29tcGlsZWRcblxuICAgIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgICBpZiAoaXNSZWdFeHAodmFsLnZhbGlkYXRlKSkge1xuICAgICAgICBjb21waWxlZC52YWxpZGF0ZSA9IGNyZWF0ZVZhbGlkYXRvcih2YWwudmFsaWRhdGUpXG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsLnZhbGlkYXRlKSkge1xuICAgICAgICBjb21waWxlZC52YWxpZGF0ZSA9IHZhbC52YWxpZGF0ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hRXJyb3IobmFtZSwgdmFsKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNGdW5jdGlvbih2YWwubm9ybWFsaXplKSkge1xuICAgICAgICBjb21waWxlZC5ub3JtYWxpemUgPSB2YWwubm9ybWFsaXplXG4gICAgICB9IGVsc2UgaWYgKCF2YWwubm9ybWFsaXplKSB7XG4gICAgICAgIGNvbXBpbGVkLm5vcm1hbGl6ZSA9IGNyZWF0ZU5vcm1hbGl6ZXIoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hRXJyb3IobmFtZSwgdmFsKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgYWxpYXNlcy5wdXNoKG5hbWUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gIH0pXG5cbiAgLy9cbiAgLy8gQ29tcGlsZSBwb3N0cG9uZWQgYWxpYXNlc1xuICAvL1xuXG4gIGFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICBpZiAoIXNlbGYuX19jb21waWxlZF9fW3NlbGYuX19zY2hlbWFzX19bYWxpYXNdXSkge1xuICAgICAgLy8gU2lsZW50bHkgZmFpbCBvbiBtaXNzZWQgc2NoZW1hcyB0byBhdm9pZCBlcnJvbnMgb24gZGlzYWJsZS5cbiAgICAgIC8vIHNjaGVtYUVycm9yKGFsaWFzLCBzZWxmLl9fc2NoZW1hc19fW2FsaWFzXSk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZWxmLl9fY29tcGlsZWRfX1thbGlhc10udmFsaWRhdGUgPVxuICAgICAgc2VsZi5fX2NvbXBpbGVkX19bc2VsZi5fX3NjaGVtYXNfX1thbGlhc11dLnZhbGlkYXRlXG4gICAgc2VsZi5fX2NvbXBpbGVkX19bYWxpYXNdLm5vcm1hbGl6ZSA9XG4gICAgICBzZWxmLl9fY29tcGlsZWRfX1tzZWxmLl9fc2NoZW1hc19fW2FsaWFzXV0ubm9ybWFsaXplXG4gIH0pXG5cbiAgLy9cbiAgLy8gRmFrZSByZWNvcmQgZm9yIGd1ZXNzZWQgbGlua3NcbiAgLy9cbiAgc2VsZi5fX2NvbXBpbGVkX19bJyddID0geyB2YWxpZGF0ZTogbnVsbCwgbm9ybWFsaXplOiBjcmVhdGVOb3JtYWxpemVyKCkgfVxuXG4gIC8vXG4gIC8vIEJ1aWxkIHNjaGVtYSBjb25kaXRpb25cbiAgLy9cbiAgY29uc3Qgc2xpc3QgPSBPYmplY3Qua2V5cyhzZWxmLl9fY29tcGlsZWRfXylcbiAgICAuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAvLyBGaWx0ZXIgZGlzYWJsZWQgJiBmYWtlIHNjaGVtYXNcbiAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA+IDAgJiYgc2VsZi5fX2NvbXBpbGVkX19bbmFtZV1cbiAgICB9KVxuICAgIC5tYXAoZXNjYXBlUkUpXG4gICAgLmpvaW4oJ3wnKVxuICAvLyAoPyFfKSBjYXVzZSAxLjV4IHNsb3dkb3duXG4gIHNlbGYucmUuc2NoZW1hX3Rlc3QgPSBSZWdFeHAoJyhefCg/IV8pKD86Wz48XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpKCcgKyBzbGlzdCArICcpJywgJ2knKVxuICBzZWxmLnJlLnNjaGVtYV9zZWFyY2ggPSBSZWdFeHAoJyhefCg/IV8pKD86Wz48XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpKCcgKyBzbGlzdCArICcpJywgJ2lnJylcbiAgc2VsZi5yZS5zY2hlbWFfYXRfc3RhcnQgPSBSZWdFeHAoJ14nICsgc2VsZi5yZS5zY2hlbWFfc2VhcmNoLnNvdXJjZSwgJ2knKVxuXG4gIHNlbGYucmUucHJldGVzdCA9IFJlZ0V4cChcbiAgICAnKCcgKyBzZWxmLnJlLnNjaGVtYV90ZXN0LnNvdXJjZSArICcpfCgnICsgc2VsZi5yZS5ob3N0X2Z1enp5X3Rlc3Quc291cmNlICsgJyl8QCcsXG4gICAgJ2knXG4gIClcblxuICAvL1xuICAvLyBDbGVhbnVwXG4gIC8vXG5cbiAgcmVzZXRTY2FuQ2FjaGUoc2VsZilcbn1cblxuLyoqXG4gKiBjbGFzcyBNYXRjaFxuICpcbiAqIE1hdGNoIHJlc3VsdC4gU2luZ2xlIGVsZW1lbnQgb2YgYXJyYXksIHJldHVybmVkIGJ5IFtbTGlua2lmeUl0I21hdGNoXV1cbiAqKi9cbmZ1bmN0aW9uIE1hdGNoIChzZWxmLCBzaGlmdCkge1xuICBjb25zdCBzdGFydCA9IHNlbGYuX19pbmRleF9fXG4gIGNvbnN0IGVuZCA9IHNlbGYuX19sYXN0X2luZGV4X19cbiAgY29uc3QgdGV4dCA9IHNlbGYuX190ZXh0X2NhY2hlX18uc2xpY2Uoc3RhcnQsIGVuZClcblxuICAvKipcbiAgICogTWF0Y2gjc2NoZW1hIC0+IFN0cmluZ1xuICAgKlxuICAgKiBQcmVmaXggKHByb3RvY29sKSBmb3IgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5zY2hlbWEgPSBzZWxmLl9fc2NoZW1hX18udG9Mb3dlckNhc2UoKVxuICAvKipcbiAgICogTWF0Y2gjaW5kZXggLT4gTnVtYmVyXG4gICAqXG4gICAqIEZpcnN0IHBvc2l0aW9uIG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMuaW5kZXggPSBzdGFydCArIHNoaWZ0XG4gIC8qKlxuICAgKiBNYXRjaCNsYXN0SW5kZXggLT4gTnVtYmVyXG4gICAqXG4gICAqIE5leHQgcG9zaXRpb24gYWZ0ZXIgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5sYXN0SW5kZXggPSBlbmQgKyBzaGlmdFxuICAvKipcbiAgICogTWF0Y2gjcmF3IC0+IFN0cmluZ1xuICAgKlxuICAgKiBNYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnJhdyA9IHRleHRcbiAgLyoqXG4gICAqIE1hdGNoI3RleHQgLT4gU3RyaW5nXG4gICAqXG4gICAqIE5vdG1hbGl6ZWQgdGV4dCBvZiBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnRleHQgPSB0ZXh0XG4gIC8qKlxuICAgKiBNYXRjaCN1cmwgLT4gU3RyaW5nXG4gICAqXG4gICAqIE5vcm1hbGl6ZWQgdXJsIG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMudXJsID0gdGV4dFxufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXRjaCAoc2VsZiwgc2hpZnQpIHtcbiAgY29uc3QgbWF0Y2ggPSBuZXcgTWF0Y2goc2VsZiwgc2hpZnQpXG5cbiAgc2VsZi5fX2NvbXBpbGVkX19bbWF0Y2guc2NoZW1hXS5ub3JtYWxpemUobWF0Y2gsIHNlbGYpXG5cbiAgcmV0dXJuIG1hdGNoXG59XG5cbi8qKlxuICogY2xhc3MgTGlua2lmeUl0XG4gKiovXG5cbi8qKlxuICogbmV3IExpbmtpZnlJdChzY2hlbWFzLCBvcHRpb25zKVxuICogLSBzY2hlbWFzIChPYmplY3QpOiBPcHRpb25hbC4gQWRkaXRpb25hbCBzY2hlbWFzIHRvIHZhbGlkYXRlIChwcmVmaXgvdmFsaWRhdG9yKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB7IGZ1enp5TGlua3xmdXp6eUVtYWlsfGZ1enp5SVA6IHRydWV8ZmFsc2UgfVxuICpcbiAqIENyZWF0ZXMgbmV3IGxpbmtpZmllciBpbnN0YW5jZSB3aXRoIG9wdGlvbmFsIGFkZGl0aW9uYWwgc2NoZW1hcy5cbiAqIENhbiBiZSBjYWxsZWQgd2l0aG91dCBgbmV3YCBrZXl3b3JkIGZvciBjb252ZW5pZW5jZS5cbiAqXG4gKiBCeSBkZWZhdWx0IHVuZGVyc3RhbmRzOlxuICpcbiAqIC0gYGh0dHAocyk6Ly8uLi5gICwgYGZ0cDovLy4uLmAsIGBtYWlsdG86Li4uYCAmIGAvLy4uLmAgbGlua3NcbiAqIC0gXCJmdXp6eVwiIGxpbmtzIGFuZCBlbWFpbHMgKGV4YW1wbGUuY29tLCBmb29AYmFyLmNvbSkuXG4gKlxuICogYHNjaGVtYXNgIGlzIGFuIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkvdmFsdWUgZGVzY3JpYmVzIHByb3RvY29sL3J1bGU6XG4gKlxuICogLSBfX2tleV9fIC0gbGluayBwcmVmaXggKHVzdWFsbHksIHByb3RvY29sIG5hbWUgd2l0aCBgOmAgYXQgdGhlIGVuZCwgYHNreXBlOmBcbiAqICAgZm9yIGV4YW1wbGUpLiBgbGlua2lmeS1pdGAgbWFrZXMgc2h1cmUgdGhhdCBwcmVmaXggaXMgbm90IHByZWNlZWRlZCB3aXRoXG4gKiAgIGFscGhhbnVtZXJpYyBjaGFyIGFuZCBzeW1ib2xzLiBPbmx5IHdoaXRlc3BhY2VzIGFuZCBwdW5jdHVhdGlvbiBhbGxvd2VkLlxuICogLSBfX3ZhbHVlX18gLSBydWxlIHRvIGNoZWNrIHRhaWwgYWZ0ZXIgbGluayBwcmVmaXhcbiAqICAgLSBfU3RyaW5nXyAtIGp1c3QgYWxpYXMgdG8gZXhpc3RpbmcgcnVsZVxuICogICAtIF9PYmplY3RfXG4gKiAgICAgLSBfdmFsaWRhdGVfIC0gdmFsaWRhdG9yIGZ1bmN0aW9uIChzaG91bGQgcmV0dXJuIG1hdGNoZWQgbGVuZ3RoIG9uIHN1Y2Nlc3MpLFxuICogICAgICAgb3IgYFJlZ0V4cGAuXG4gKiAgICAgLSBfbm9ybWFsaXplXyAtIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG5vcm1hbGl6ZSB0ZXh0ICYgdXJsIG9mIG1hdGNoZWQgcmVzdWx0XG4gKiAgICAgICAoZm9yIGV4YW1wbGUsIGZvciBAdHdpdHRlciBtZW50aW9ucykuXG4gKlxuICogYG9wdGlvbnNgOlxuICpcbiAqIC0gX19mdXp6eUxpbmtfXyAtIHJlY29nbmlnZSBVUkwtcyB3aXRob3V0IGBodHRwKHMpOmAgcHJlZml4LiBEZWZhdWx0IGB0cnVlYC5cbiAqIC0gX19mdXp6eUlQX18gLSBhbGxvdyBJUHMgaW4gZnV6enkgbGlua3MgYWJvdmUuIENhbiBjb25mbGljdCB3aXRoIHNvbWUgdGV4dHNcbiAqICAgbGlrZSB2ZXJzaW9uIG51bWJlcnMuIERlZmF1bHQgYGZhbHNlYC5cbiAqIC0gX19mdXp6eUVtYWlsX18gLSByZWNvZ25pemUgZW1haWxzIHdpdGhvdXQgYG1haWx0bzpgIHByZWZpeC5cbiAqXG4gKiovXG5mdW5jdGlvbiBMaW5raWZ5SXQgKHNjaGVtYXMsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIExpbmtpZnlJdCkpIHtcbiAgICByZXR1cm4gbmV3IExpbmtpZnlJdChzY2hlbWFzLCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgaWYgKGlzT3B0aW9uc09iaihzY2hlbWFzKSkge1xuICAgICAgb3B0aW9ucyA9IHNjaGVtYXNcbiAgICAgIHNjaGVtYXMgPSB7fVxuICAgIH1cbiAgfVxuXG4gIHRoaXMuX19vcHRzX18gPSBhc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKVxuXG4gIC8vIENhY2hlIGxhc3QgdGVzdGVkIHJlc3VsdC4gVXNlZCB0byBza2lwIHJlcGVhdGluZyBzdGVwcyBvbiBuZXh0IGBtYXRjaGAgY2FsbC5cbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuICB0aGlzLl9fbGFzdF9pbmRleF9fID0gLTEgLy8gTmV4dCBzY2FuIHBvc2l0aW9uXG4gIHRoaXMuX19zY2hlbWFfXyA9ICcnXG4gIHRoaXMuX190ZXh0X2NhY2hlX18gPSAnJ1xuXG4gIHRoaXMuX19zY2hlbWFzX18gPSBhc3NpZ24oe30sIGRlZmF1bHRTY2hlbWFzLCBzY2hlbWFzKVxuICB0aGlzLl9fY29tcGlsZWRfXyA9IHt9XG5cbiAgdGhpcy5fX3RsZHNfXyA9IHRsZHNfZGVmYXVsdFxuICB0aGlzLl9fdGxkc19yZXBsYWNlZF9fID0gZmFsc2VcblxuICB0aGlzLnJlID0ge31cblxuICBjb21waWxlKHRoaXMpXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIExpbmtpZnlJdCNhZGQoc2NoZW1hLCBkZWZpbml0aW9uKVxuICogLSBzY2hlbWEgKFN0cmluZyk6IHJ1bGUgbmFtZSAoZml4ZWQgcGF0dGVybiBwcmVmaXgpXG4gKiAtIGRlZmluaXRpb24gKFN0cmluZ3xSZWdFeHB8T2JqZWN0KTogc2NoZW1hIGRlZmluaXRpb25cbiAqXG4gKiBBZGQgbmV3IHJ1bGUgZGVmaW5pdGlvbi4gU2VlIGNvbnN0cnVjdG9yIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKHNjaGVtYSwgZGVmaW5pdGlvbikge1xuICB0aGlzLl9fc2NoZW1hc19fW3NjaGVtYV0gPSBkZWZpbml0aW9uXG4gIGNvbXBpbGUodGhpcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I3NldChvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB7IGZ1enp5TGlua3xmdXp6eUVtYWlsfGZ1enp5SVA6IHRydWV8ZmFsc2UgfVxuICpcbiAqIFNldCByZWNvZ25pdGlvbiBvcHRpb25zIGZvciBsaW5rcyB3aXRob3V0IHNjaGVtYS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gc2V0IChvcHRpb25zKSB7XG4gIHRoaXMuX19vcHRzX18gPSBhc3NpZ24odGhpcy5fX29wdHNfXywgb3B0aW9ucylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjdGVzdCh0ZXh0KSAtPiBCb29sZWFuXG4gKlxuICogU2VhcmNoZXMgbGlua2lmaWFibGUgcGF0dGVybiBhbmQgcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2VzcyBvciBgZmFsc2VgIG9uIGZhaWwuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbiB0ZXN0ICh0ZXh0KSB7XG4gIC8vIFJlc2V0IHNjYW4gY2FjaGVcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9IHRleHRcbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuXG4gIGlmICghdGV4dC5sZW5ndGgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgbSwgbWwsIG1lLCBsZW4sIHNoaWZ0LCBuZXh0LCByZSwgdGxkX3BvcywgYXRfcG9zXG5cbiAgLy8gdHJ5IHRvIHNjYW4gZm9yIGxpbmsgd2l0aCBzY2hlbWEgLSB0aGF0J3MgdGhlIG1vc3Qgc2ltcGxlIHJ1bGVcbiAgaWYgKHRoaXMucmUuc2NoZW1hX3Rlc3QudGVzdCh0ZXh0KSkge1xuICAgIHJlID0gdGhpcy5yZS5zY2hlbWFfc2VhcmNoXG4gICAgcmUubGFzdEluZGV4ID0gMFxuICAgIHdoaWxlICgobSA9IHJlLmV4ZWModGV4dCkpICE9PSBudWxsKSB7XG4gICAgICBsZW4gPSB0aGlzLnRlc3RTY2hlbWFBdCh0ZXh0LCBtWzJdLCByZS5sYXN0SW5kZXgpXG4gICAgICBpZiAobGVuKSB7XG4gICAgICAgIHRoaXMuX19zY2hlbWFfXyA9IG1bMl1cbiAgICAgICAgdGhpcy5fX2luZGV4X18gPSBtLmluZGV4ICsgbVsxXS5sZW5ndGhcbiAgICAgICAgdGhpcy5fX2xhc3RfaW5kZXhfXyA9IG0uaW5kZXggKyBtWzBdLmxlbmd0aCArIGxlblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9fb3B0c19fLmZ1enp5TGluayAmJiB0aGlzLl9fY29tcGlsZWRfX1snaHR0cDonXSkge1xuICAgIC8vIGd1ZXNzIHNjaGVtYWxlc3MgbGlua3NcbiAgICB0bGRfcG9zID0gdGV4dC5zZWFyY2godGhpcy5yZS5ob3N0X2Z1enp5X3Rlc3QpXG4gICAgaWYgKHRsZF9wb3MgPj0gMCkge1xuICAgICAgLy8gaWYgdGxkIGlzIGxvY2F0ZWQgYWZ0ZXIgZm91bmQgbGluayAtIG5vIG5lZWQgdG8gY2hlY2sgZnV6enkgcGF0dGVyblxuICAgICAgaWYgKHRoaXMuX19pbmRleF9fIDwgMCB8fCB0bGRfcG9zIDwgdGhpcy5fX2luZGV4X18pIHtcbiAgICAgICAgaWYgKChtbCA9IHRleHQubWF0Y2godGhpcy5fX29wdHNfXy5mdXp6eUlQID8gdGhpcy5yZS5saW5rX2Z1enp5IDogdGhpcy5yZS5saW5rX25vX2lwX2Z1enp5KSkgIT09IG51bGwpIHtcbiAgICAgICAgICBzaGlmdCA9IG1sLmluZGV4ICsgbWxbMV0ubGVuZ3RoXG5cbiAgICAgICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHNoaWZ0IDwgdGhpcy5fX2luZGV4X18pIHtcbiAgICAgICAgICAgIHRoaXMuX19zY2hlbWFfXyA9ICcnXG4gICAgICAgICAgICB0aGlzLl9faW5kZXhfXyA9IHNoaWZ0XG4gICAgICAgICAgICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbWwuaW5kZXggKyBtbFswXS5sZW5ndGhcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fX29wdHNfXy5mdXp6eUVtYWlsICYmIHRoaXMuX19jb21waWxlZF9fWydtYWlsdG86J10pIHtcbiAgICAvLyBndWVzcyBzY2hlbWFsZXNzIGVtYWlsc1xuICAgIGF0X3BvcyA9IHRleHQuaW5kZXhPZignQCcpXG4gICAgaWYgKGF0X3BvcyA+PSAwKSB7XG4gICAgICAvLyBXZSBjYW4ndCBza2lwIHRoaXMgY2hlY2ssIGJlY2F1c2UgdGhpcyBjYXNlcyBhcmUgcG9zc2libGU6XG4gICAgICAvLyAxOTIuMTY4LjEuMUBnbWFpbC5jb20sIG15LmluQGV4YW1wbGUuY29tXG4gICAgICBpZiAoKG1lID0gdGV4dC5tYXRjaCh0aGlzLnJlLmVtYWlsX2Z1enp5KSkgIT09IG51bGwpIHtcbiAgICAgICAgc2hpZnQgPSBtZS5pbmRleCArIG1lWzFdLmxlbmd0aFxuICAgICAgICBuZXh0ID0gbWUuaW5kZXggKyBtZVswXS5sZW5ndGhcblxuICAgICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHNoaWZ0IDwgdGhpcy5fX2luZGV4X18gfHxcbiAgICAgICAgICAgIChzaGlmdCA9PT0gdGhpcy5fX2luZGV4X18gJiYgbmV4dCA+IHRoaXMuX19sYXN0X2luZGV4X18pKSB7XG4gICAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gJ21haWx0bzonXG4gICAgICAgICAgdGhpcy5fX2luZGV4X18gPSBzaGlmdFxuICAgICAgICAgIHRoaXMuX19sYXN0X2luZGV4X18gPSBuZXh0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcy5fX2luZGV4X18gPj0gMFxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNwcmV0ZXN0KHRleHQpIC0+IEJvb2xlYW5cbiAqXG4gKiBWZXJ5IHF1aWNrIGNoZWNrLCB0aGF0IGNhbiBnaXZlIGZhbHNlIHBvc2l0aXZlcy4gUmV0dXJucyB0cnVlIGlmIGxpbmsgTUFZIEJFXG4gKiBjYW4gZXhpc3RzLiBDYW4gYmUgdXNlZCBmb3Igc3BlZWQgb3B0aW1pemF0aW9uLCB3aGVuIHlvdSBuZWVkIHRvIGNoZWNrIHRoYXRcbiAqIGxpbmsgTk9UIGV4aXN0cy5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUucHJldGVzdCA9IGZ1bmN0aW9uIHByZXRlc3QgKHRleHQpIHtcbiAgcmV0dXJuIHRoaXMucmUucHJldGVzdC50ZXN0KHRleHQpXG59XG5cbi8qKlxuICogTGlua2lmeUl0I3Rlc3RTY2hlbWFBdCh0ZXh0LCBuYW1lLCBwb3NpdGlvbikgLT4gTnVtYmVyXG4gKiAtIHRleHQgKFN0cmluZyk6IHRleHQgdG8gc2NhblxuICogLSBuYW1lIChTdHJpbmcpOiBydWxlIChzY2hlbWEpIG5hbWVcbiAqIC0gcG9zaXRpb24gKE51bWJlcik6IHRleHQgb2Zmc2V0IHRvIGNoZWNrIGZyb21cbiAqXG4gKiBTaW1pbGFyIHRvIFtbTGlua2lmeUl0I3Rlc3RdXSBidXQgY2hlY2tzIG9ubHkgc3BlY2lmaWMgcHJvdG9jb2wgdGFpbCBleGFjdGx5XG4gKiBhdCBnaXZlbiBwb3NpdGlvbi4gUmV0dXJucyBsZW5ndGggb2YgZm91bmQgcGF0dGVybiAoMCBvbiBmYWlsKS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGVzdFNjaGVtYUF0ID0gZnVuY3Rpb24gdGVzdFNjaGVtYUF0ICh0ZXh0LCBzY2hlbWEsIHBvcykge1xuICAvLyBJZiBub3Qgc3VwcG9ydGVkIHNjaGVtYSBjaGVjayByZXF1ZXN0ZWQgLSB0ZXJtaW5hdGVcbiAgaWYgKCF0aGlzLl9fY29tcGlsZWRfX1tzY2hlbWEudG9Mb3dlckNhc2UoKV0pIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIHJldHVybiB0aGlzLl9fY29tcGlsZWRfX1tzY2hlbWEudG9Mb3dlckNhc2UoKV0udmFsaWRhdGUodGV4dCwgcG9zLCB0aGlzKVxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNtYXRjaCh0ZXh0KSAtPiBBcnJheXxudWxsXG4gKlxuICogUmV0dXJucyBhcnJheSBvZiBmb3VuZCBsaW5rIGRlc2NyaXB0aW9ucyBvciBgbnVsbGAgb24gZmFpbC4gV2Ugc3Ryb25nbHlcbiAqIHJlY29tbWVuZCB0byB1c2UgW1tMaW5raWZ5SXQjdGVzdF1dIGZpcnN0LCBmb3IgYmVzdCBzcGVlZC5cbiAqXG4gKiAjIyMjIyBSZXN1bHQgbWF0Y2ggZGVzY3JpcHRpb25cbiAqXG4gKiAtIF9fc2NoZW1hX18gLSBsaW5rIHNjaGVtYSwgY2FuIGJlIGVtcHR5IGZvciBmdXp6eSBsaW5rcywgb3IgYC8vYCBmb3JcbiAqICAgcHJvdG9jb2wtbmV1dHJhbCAgbGlua3MuXG4gKiAtIF9faW5kZXhfXyAtIG9mZnNldCBvZiBtYXRjaGVkIHRleHRcbiAqIC0gX19sYXN0SW5kZXhfXyAtIGluZGV4IG9mIG5leHQgY2hhciBhZnRlciBtYXRoY2ggZW5kXG4gKiAtIF9fcmF3X18gLSBtYXRjaGVkIHRleHRcbiAqIC0gX190ZXh0X18gLSBub3JtYWxpemVkIHRleHRcbiAqIC0gX191cmxfXyAtIGxpbmssIGdlbmVyYXRlZCBmcm9tIG1hdGNoZWQgdGV4dFxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIG1hdGNoICh0ZXh0KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGxldCBzaGlmdCA9IDBcblxuICAvLyBUcnkgdG8gdGFrZSBwcmV2aW91cyBlbGVtZW50IGZyb20gY2FjaGUsIGlmIC50ZXN0KCkgY2FsbGVkIGJlZm9yZVxuICBpZiAodGhpcy5fX2luZGV4X18gPj0gMCAmJiB0aGlzLl9fdGV4dF9jYWNoZV9fID09PSB0ZXh0KSB7XG4gICAgcmVzdWx0LnB1c2goY3JlYXRlTWF0Y2godGhpcywgc2hpZnQpKVxuICAgIHNoaWZ0ID0gdGhpcy5fX2xhc3RfaW5kZXhfX1xuICB9XG5cbiAgLy8gQ3V0IGhlYWQgaWYgY2FjaGUgd2FzIHVzZWRcbiAgbGV0IHRhaWwgPSBzaGlmdCA/IHRleHQuc2xpY2Uoc2hpZnQpIDogdGV4dFxuXG4gIC8vIFNjYW4gc3RyaW5nIHVudGlsIGVuZCByZWFjaGVkXG4gIHdoaWxlICh0aGlzLnRlc3QodGFpbCkpIHtcbiAgICByZXN1bHQucHVzaChjcmVhdGVNYXRjaCh0aGlzLCBzaGlmdCkpXG5cbiAgICB0YWlsID0gdGFpbC5zbGljZSh0aGlzLl9fbGFzdF9pbmRleF9fKVxuICAgIHNoaWZ0ICs9IHRoaXMuX19sYXN0X2luZGV4X19cbiAgfVxuXG4gIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjbWF0Y2hBdFN0YXJ0KHRleHQpIC0+IE1hdGNofG51bGxcbiAqXG4gKiBSZXR1cm5zIGZ1bGx5LWZvcm1lZCAobm90IGZ1enp5KSBsaW5rIGlmIGl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nXG4gKiBvZiB0aGUgc3RyaW5nLCBhbmQgbnVsbCBvdGhlcndpc2UuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm1hdGNoQXRTdGFydCA9IGZ1bmN0aW9uIG1hdGNoQXRTdGFydCAodGV4dCkge1xuICAvLyBSZXNldCBzY2FuIGNhY2hlXG4gIHRoaXMuX190ZXh0X2NhY2hlX18gPSB0ZXh0XG4gIHRoaXMuX19pbmRleF9fID0gLTFcblxuICBpZiAoIXRleHQubGVuZ3RoKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IG0gPSB0aGlzLnJlLnNjaGVtYV9hdF9zdGFydC5leGVjKHRleHQpXG4gIGlmICghbSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBsZW4gPSB0aGlzLnRlc3RTY2hlbWFBdCh0ZXh0LCBtWzJdLCBtWzBdLmxlbmd0aClcbiAgaWYgKCFsZW4pIHJldHVybiBudWxsXG5cbiAgdGhpcy5fX3NjaGVtYV9fID0gbVsyXVxuICB0aGlzLl9faW5kZXhfXyA9IG0uaW5kZXggKyBtWzFdLmxlbmd0aFxuICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoICsgbGVuXG5cbiAgcmV0dXJuIGNyZWF0ZU1hdGNoKHRoaXMsIDApXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIExpbmtpZnlJdCN0bGRzKGxpc3QgWywga2VlcE9sZF0pIC0+IHRoaXNcbiAqIC0gbGlzdCAoQXJyYXkpOiBsaXN0IG9mIHRsZHNcbiAqIC0ga2VlcE9sZCAoQm9vbGVhbik6IG1lcmdlIHdpdGggY3VycmVudCBsaXN0IGlmIGB0cnVlYCAoYGZhbHNlYCBieSBkZWZhdWx0KVxuICpcbiAqIExvYWQgKG9yIG1lcmdlKSBuZXcgdGxkcyBsaXN0LiBUaG9zZSBhcmUgdXNlciBmb3IgZnV6enkgbGlua3MgKHdpdGhvdXQgcHJlZml4KVxuICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzLiBCeSBkZWZhdWx0IHRoaXMgYWxnb3J5dGhtIHVzZWQ6XG4gKlxuICogLSBob3N0bmFtZSB3aXRoIGFueSAyLWxldHRlciByb290IHpvbmVzIGFyZSBvay5cbiAqIC0gYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YRcbiAqICAgYXJlIG9rLlxuICogLSBlbmNvZGVkIChgeG4tLS4uLmApIHJvb3Qgem9uZXMgYXJlIG9rLlxuICpcbiAqIElmIGxpc3QgaXMgcmVwbGFjZWQsIHRoZW4gZXhhY3QgbWF0Y2ggZm9yIDItY2hhcnMgcm9vdCB6b25lcyB3aWxsIGJlIGNoZWNrZWQuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLnRsZHMgPSBmdW5jdGlvbiB0bGRzIChsaXN0LCBrZWVwT2xkKSB7XG4gIGxpc3QgPSBBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtsaXN0XVxuXG4gIGlmICgha2VlcE9sZCkge1xuICAgIHRoaXMuX190bGRzX18gPSBsaXN0LnNsaWNlKClcbiAgICB0aGlzLl9fdGxkc19yZXBsYWNlZF9fID0gdHJ1ZVxuICAgIGNvbXBpbGUodGhpcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdGhpcy5fX3RsZHNfXyA9IHRoaXMuX190bGRzX18uY29uY2F0KGxpc3QpXG4gICAgLnNvcnQoKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKGVsLCBpZHgsIGFycikge1xuICAgICAgcmV0dXJuIGVsICE9PSBhcnJbaWR4IC0gMV1cbiAgICB9KVxuICAgIC5yZXZlcnNlKClcblxuICBjb21waWxlKHRoaXMpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKlxuICogTGlua2lmeUl0I25vcm1hbGl6ZShtYXRjaClcbiAqXG4gKiBEZWZhdWx0IG5vcm1hbGl6ZXIgKGlmIHNjaGVtYSBkb2VzIG5vdCBkZWZpbmUgaXQncyBvd24pLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbiBub3JtYWxpemUgKG1hdGNoKSB7XG4gIC8vIERvIG1pbmltYWwgcG9zc2libGUgY2hhbmdlcyBieSBkZWZhdWx0LiBOZWVkIHRvIGNvbGxlY3QgZmVlZGJhY2sgcHJpb3JcbiAgLy8gdG8gbW92ZSBmb3J3YXJkIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9saW5raWZ5LWl0L2lzc3Vlcy8xXG5cbiAgaWYgKCFtYXRjaC5zY2hlbWEpIHsgbWF0Y2gudXJsID0gJ2h0dHA6Ly8nICsgbWF0Y2gudXJsIH1cblxuICBpZiAobWF0Y2guc2NoZW1hID09PSAnbWFpbHRvOicgJiYgIS9ebWFpbHRvOi9pLnRlc3QobWF0Y2gudXJsKSkge1xuICAgIG1hdGNoLnVybCA9ICdtYWlsdG86JyArIG1hdGNoLnVybFxuICB9XG59XG5cbi8qKlxuICogTGlua2lmeUl0I29uQ29tcGlsZSgpXG4gKlxuICogT3ZlcnJpZGUgdG8gbW9kaWZ5IGJhc2ljIFJlZ0V4cC1zLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5vbkNvbXBpbGUgPSBmdW5jdGlvbiBvbkNvbXBpbGUgKCkge1xufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5raWZ5SXRcbiIsImltcG9ydCB7IEFueSwgQ2MsIFosIFAgfSBmcm9tICd1Yy5taWNybydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgcmUgPSB7fVxuICBvcHRzID0gb3B0cyB8fCB7fVxuXG4gIHJlLnNyY19BbnkgPSBBbnkuc291cmNlXG4gIHJlLnNyY19DYyA9IENjLnNvdXJjZVxuICByZS5zcmNfWiA9IFouc291cmNlXG4gIHJlLnNyY19QID0gUC5zb3VyY2VcblxuICAvLyBcXHB7XFxaXFxQXFxDY1xcQ0Z9ICh3aGl0ZSBzcGFjZXMgKyBjb250cm9sICsgZm9ybWF0ICsgcHVuY3R1YXRpb24pXG4gIHJlLnNyY19aUENjID0gW3JlLnNyY19aLCByZS5zcmNfUCwgcmUuc3JjX0NjXS5qb2luKCd8JylcblxuICAvLyBcXHB7XFxaXFxDY30gKHdoaXRlIHNwYWNlcyArIGNvbnRyb2wpXG4gIHJlLnNyY19aQ2MgPSBbcmUuc3JjX1osIHJlLnNyY19DY10uam9pbignfCcpXG5cbiAgLy8gRXhwZXJpbWVudGFsLiBMaXN0IG9mIGNoYXJzLCBjb21wbGV0ZWx5IHByb2hpYml0ZWQgaW4gbGlua3NcbiAgLy8gYmVjYXVzZSBjYW4gc2VwYXJhdGUgaXQgZnJvbSBvdGhlciBwYXJ0IG9mIHRleHRcbiAgY29uc3QgdGV4dF9zZXBhcmF0b3JzID0gJ1s+PFxcdWZmNWNdJ1xuXG4gIC8vIEFsbCBwb3NzaWJsZSB3b3JkIGNoYXJhY3RlcnMgKGV2ZXJ5dGhpbmcgd2l0aG91dCBwdW5jdHVhdGlvbiwgc3BhY2VzICYgY29udHJvbHMpXG4gIC8vIERlZmluZWQgdmlhIHB1bmN0dWF0aW9uICYgc3BhY2VzIHRvIHNhdmUgc3BhY2VcbiAgLy8gU2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIFxccHtcXExcXE5cXFNcXE19IChcXHcgYnV0IHdpdGhvdXQgYF9gKVxuICByZS5zcmNfcHNldWRvX2xldHRlciA9ICcoPzooPyEnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3wnICsgcmUuc3JjX1pQQ2MgKyAnKScgKyByZS5zcmNfQW55ICsgJyknXG4gIC8vIFRoZSBzYW1lIGFzIGFib3RoZSBidXQgd2l0aG91dCBbMC05XVxuICAvLyB2YXIgc3JjX3BzZXVkb19sZXR0ZXJfbm9uX2QgPSAnKD86KD8hWzAtOV18JyArIHNyY19aUENjICsgJyknICsgc3JjX0FueSArICcpJztcblxuICByZS5zcmNfaXA0ID1cblxuICAgICcoPzooMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJ1xuXG4gIC8vIFByb2hpYml0IGFueSBvZiBcIkAvW10oKVwiIGluIHVzZXIvcGFzcyB0byBhdm9pZCB3cm9uZyBkb21haW4gZmV0Y2guXG4gIHJlLnNyY19hdXRoID0gJyg/Oig/Oig/IScgKyByZS5zcmNfWkNjICsgJ3xbQC9cXFxcW1xcXFxdKCldKS4pK0ApPydcblxuICByZS5zcmNfcG9ydCA9XG5cbiAgICAnKD86Oig/OjYoPzpbMC00XVxcXFxkezN9fDUoPzpbMC00XVxcXFxkezJ9fDUoPzpbMC0yXVxcXFxkfDNbMC01XSkpKXxbMS01XT9cXFxcZHsxLDR9KSk/J1xuXG4gIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3IgPVxuXG4gICAgJyg/PSR8JyArIHRleHRfc2VwYXJhdG9ycyArICd8JyArIHJlLnNyY19aUENjICsgJyknICtcbiAgICAnKD8hJyArIChvcHRzWyctLS0nXSA/ICctKD8hLS0pfCcgOiAnLXwnKSArICdffDpcXFxcZHxcXFxcLi18XFxcXC4oPyEkfCcgKyByZS5zcmNfWlBDYyArICcpKSdcblxuICByZS5zcmNfcGF0aCA9XG5cbiAgICAnKD86JyArXG4gICAgICAnWy8/I10nICtcbiAgICAgICAgJyg/OicgK1xuICAgICAgICAgICcoPyEnICsgcmUuc3JjX1pDYyArICd8JyArIHRleHRfc2VwYXJhdG9ycyArICd8WygpW1xcXFxde30uLFwiXFwnPyFcXFxcLTtdKS58JyArXG4gICAgICAgICAgJ1xcXFxbKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFxcXFxdKS4pKlxcXFxdfCcgK1xuICAgICAgICAgICdcXFxcKCg/Oig/IScgKyByZS5zcmNfWkNjICsgJ3xbKV0pLikqXFxcXCl8JyArXG4gICAgICAgICAgJ1xcXFx7KD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFt9XSkuKSpcXFxcfXwnICtcbiAgICAgICAgICAnXFxcXFwiKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFtcIl0pLikrXFxcXFwifCcgK1xuICAgICAgICAgIFwiXFxcXCcoPzooPyFcIiArIHJlLnNyY19aQ2MgKyBcInxbJ10pLikrXFxcXCd8XCIgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYEknbV9raW5nYCBpZiBubyBwYWlyIGZvdW5kXG4gICAgICAgICAgXCJcXFxcJyg/PVwiICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnfFstXSl8JyArXG5cbiAgICAgICAgICAvLyBnb29nbGUgaGFzIG1hbnkgZG90cyBpbiBcImdvb2dsZSBzZWFyY2hcIiBsaW5rcyAoIzY2LCAjODEpLlxuICAgICAgICAgIC8vIGdpdGh1YiBoYXMgLi4uIGluIGNvbW1pdCByYW5nZSBsaW5rcyxcbiAgICAgICAgICAvLyBSZXN0cmljdCB0b1xuICAgICAgICAgIC8vIC0gZW5nbGlzaFxuICAgICAgICAgIC8vIC0gcGVyY2VudC1lbmNvZGVkXG4gICAgICAgICAgLy8gLSBwYXJ0cyBvZiBmaWxlIHBhdGhcbiAgICAgICAgICAvLyAtIHBhcmFtcyBzZXBhcmF0b3JcbiAgICAgICAgICAvLyB1bnRpbCBtb3JlIGV4YW1wbGVzIGZvdW5kLlxuICAgICAgICAgICdcXFxcLnsyLH1bYS16QS1aMC05JS8mXXwnICtcblxuICAgICAgICAgICdcXFxcLig/IScgKyByZS5zcmNfWkNjICsgJ3xbLl18JCl8JyArXG4gICAgICAgICAgKG9wdHNbJy0tLSddXG4gICAgICAgICAgICA/ICdcXFxcLSg/IS0tKD86W14tXXwkKSkoPzotKil8JyAvLyBgLS0tYCA9PiBsb25nIGRhc2gsIHRlcm1pbmF0ZVxuICAgICAgICAgICAgOiAnXFxcXC0rfCdcbiAgICAgICAgICApICtcbiAgICAgICAgICAvLyBhbGxvdyBgLCwsYCBpbiBwYXRoc1xuICAgICAgICAgICcsKD8hJyArIHJlLnNyY19aQ2MgKyAnfCQpfCcgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYDtgIGlmIG5vdCBmb2xsb3dlZCBieSBzcGFjZS1saWtlIGNoYXJcbiAgICAgICAgICAnOyg/IScgKyByZS5zcmNfWkNjICsgJ3wkKXwnICtcblxuICAgICAgICAgIC8vIGFsbG93IGAhISFgIGluIHBhdGhzLCBidXQgbm90IGF0IHRoZSBlbmRcbiAgICAgICAgICAnXFxcXCErKD8hJyArIHJlLnNyY19aQ2MgKyAnfFshXXwkKXwnICtcblxuICAgICAgICAgICdcXFxcPyg/IScgKyByZS5zcmNfWkNjICsgJ3xbP118JCknICtcbiAgICAgICAgJykrJyArXG4gICAgICAnfFxcXFwvJyArXG4gICAgJyk/J1xuXG4gIC8vIEFsbG93IGFueXRoaW5nIGluIG1hcmtkb3duIHNwZWMsIGZvcmJpZCBxdW90ZSAoXCIpIGF0IHRoZSBmaXJzdCBwb3NpdGlvblxuICAvLyBiZWNhdXNlIGVtYWlscyBlbmNsb3NlZCBpbiBxdW90ZXMgYXJlIGZhciBtb3JlIGNvbW1vblxuICByZS5zcmNfZW1haWxfbmFtZSA9XG5cbiAgICAnW1xcXFwtOzomPVxcXFwrXFxcXCQsXFxcXC5hLXpBLVowLTlfXVtcXFxcLTs6Jj1cXFxcK1xcXFwkLFxcXFxcIlxcXFwuYS16QS1aMC05X10qJ1xuXG4gIHJlLnNyY194biA9XG5cbiAgICAneG4tLVthLXowLTlcXFxcLV17MSw1OX0nXG5cbiAgLy8gTW9yZSB0byByZWFkIGFib3V0IGRvbWFpbiBuYW1lc1xuICAvLyBodHRwOi8vc2VydmVyZmF1bHQuY29tL3F1ZXN0aW9ucy82MzgyNjAvXG5cbiAgcmUuc3JjX2RvbWFpbl9yb290ID1cblxuICAgIC8vIEFsbG93IGxldHRlcnMgJiBkaWdpdHMgKGh0dHA6Ly90ZXN0MSlcbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfeG4gK1xuICAgICAgJ3wnICtcbiAgICAgIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJ3sxLDYzfScgK1xuICAgICcpJ1xuXG4gIHJlLnNyY19kb21haW4gPVxuXG4gICAgJyg/OicgK1xuICAgICAgcmUuc3JjX3huICtcbiAgICAgICd8JyArXG4gICAgICAnKD86JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyknICtcbiAgICAgICd8JyArXG4gICAgICAnKD86JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyg/Oi18JyArIHJlLnNyY19wc2V1ZG9fbGV0dGVyICsgJyl7MCw2MX0nICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKScgK1xuICAgICcpJ1xuXG4gIHJlLnNyY19ob3N0ID1cblxuICAgICcoPzonICtcbiAgICAvLyBEb24ndCBuZWVkIElQIGNoZWNrLCBiZWNhdXNlIGRpZ2l0cyBhcmUgYWxyZWFkeSBhbGxvd2VkIGluIG5vcm1hbCBkb21haW4gbmFtZXNcbiAgICAvLyAgIHNyY19pcDQgK1xuICAgIC8vICd8JyArXG4gICAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSonICsgcmUuc3JjX2RvbWFpbi8qIF9yb290ICovICsgJyknICtcbiAgICAnKSdcblxuICByZS50cGxfaG9zdF9mdXp6eSA9XG5cbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfaXA0ICtcbiAgICAnfCcgK1xuICAgICAgJyg/Oig/Oig/OicgKyByZS5zcmNfZG9tYWluICsgJylcXFxcLikrKD86JVRMRFMlKSknICtcbiAgICAnKSdcblxuICByZS50cGxfaG9zdF9ub19pcF9mdXp6eSA9XG5cbiAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsoPzolVExEUyUpKSdcblxuICByZS5zcmNfaG9zdF9zdHJpY3QgPVxuXG4gICAgcmUuc3JjX2hvc3QgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUudHBsX2hvc3RfZnV6enlfc3RyaWN0ID1cblxuICAgIHJlLnRwbF9ob3N0X2Z1enp5ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIHJlLnNyY19ob3N0X3BvcnRfc3RyaWN0ID1cblxuICAgIHJlLnNyY19ob3N0ICsgcmUuc3JjX3BvcnQgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUudHBsX2hvc3RfcG9ydF9mdXp6eV9zdHJpY3QgPVxuXG4gICAgcmUudHBsX2hvc3RfZnV6enkgKyByZS5zcmNfcG9ydCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9wb3J0X25vX2lwX2Z1enp5X3N0cmljdCA9XG5cbiAgICByZS50cGxfaG9zdF9ub19pcF9mdXp6eSArIHJlLnNyY19wb3J0ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIC8vXG4gIC8vIE1haW4gcnVsZXNcbiAgLy9cblxuICAvLyBSdWRlIHRlc3QgZnV6enkgbGlua3MgYnkgaG9zdCwgZm9yIHF1aWNrIGRlbnlcbiAgcmUudHBsX2hvc3RfZnV6enlfdGVzdCA9XG5cbiAgICAnbG9jYWxob3N0fHd3d1xcXFwufFxcXFwuXFxcXGR7MSwzfVxcXFwufCg/OlxcXFwuKD86JVRMRFMlKSg/OicgKyByZS5zcmNfWlBDYyArICd8PnwkKSknXG5cbiAgcmUudHBsX2VtYWlsX2Z1enp5ID1cblxuICAgICAgJyhefCcgKyB0ZXh0X3NlcGFyYXRvcnMgKyAnfFwifFxcXFwofCcgKyByZS5zcmNfWkNjICsgJyknICtcbiAgICAgICcoJyArIHJlLnNyY19lbWFpbF9uYW1lICsgJ0AnICsgcmUudHBsX2hvc3RfZnV6enlfc3RyaWN0ICsgJyknXG5cbiAgcmUudHBsX2xpbmtfZnV6enkgPVxuICAgICAgLy8gRnV6enkgbGluayBjYW4ndCBiZSBwcmVwZW5kZWQgd2l0aCAuOi9cXC0gYW5kIG5vbiBwdW5jdHVhdGlvbi5cbiAgICAgIC8vIGJ1dCBjYW4gc3RhcnQgd2l0aCA+IChtYXJrZG93biBibG9ja3F1b3RlKVxuICAgICAgJyhefCg/IVsuOi9cXFxcLV9AXSkoPzpbJCs8PT5eYHxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSknICtcbiAgICAgICcoKD8hWyQrPD0+XmB8XFx1ZmY1Y10pJyArIHJlLnRwbF9ob3N0X3BvcnRfZnV6enlfc3RyaWN0ICsgcmUuc3JjX3BhdGggKyAnKSdcblxuICByZS50cGxfbGlua19ub19pcF9mdXp6eSA9XG4gICAgICAvLyBGdXp6eSBsaW5rIGNhbid0IGJlIHByZXBlbmRlZCB3aXRoIC46L1xcLSBhbmQgbm9uIHB1bmN0dWF0aW9uLlxuICAgICAgLy8gYnV0IGNhbiBzdGFydCB3aXRoID4gKG1hcmtkb3duIGJsb2NrcXVvdGUpXG4gICAgICAnKF58KD8hWy46L1xcXFwtX0BdKSg/OlskKzw9Pl5gfFxcdWZmNWNdfCcgKyByZS5zcmNfWlBDYyArICcpKScgK1xuICAgICAgJygoPyFbJCs8PT5eYHxcXHVmZjVjXSknICsgcmUudHBsX2hvc3RfcG9ydF9ub19pcF9mdXp6eV9zdHJpY3QgKyByZS5zcmNfcGF0aCArICcpJ1xuXG4gIHJldHVybiByZVxufVxuIiwiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vbGliL2luZGV4Lm1qcydcbiIsIi8vIExpc3Qgb2YgdmFsaWQgaHRtbCBibG9ja3MgbmFtZXMsIGFjY29yZGluZyB0byBjb21tb25tYXJrIHNwZWNcbi8vIGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjMwLyNodG1sLWJsb2Nrc1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gICdhZGRyZXNzJyxcbiAgJ2FydGljbGUnLFxuICAnYXNpZGUnLFxuICAnYmFzZScsXG4gICdiYXNlZm9udCcsXG4gICdibG9ja3F1b3RlJyxcbiAgJ2JvZHknLFxuICAnY2FwdGlvbicsXG4gICdjZW50ZXInLFxuICAnY29sJyxcbiAgJ2NvbGdyb3VwJyxcbiAgJ2RkJyxcbiAgJ2RldGFpbHMnLFxuICAnZGlhbG9nJyxcbiAgJ2RpcicsXG4gICdkaXYnLFxuICAnZGwnLFxuICAnZHQnLFxuICAnZmllbGRzZXQnLFxuICAnZmlnY2FwdGlvbicsXG4gICdmaWd1cmUnLFxuICAnZm9vdGVyJyxcbiAgJ2Zvcm0nLFxuICAnZnJhbWUnLFxuICAnZnJhbWVzZXQnLFxuICAnaDEnLFxuICAnaDInLFxuICAnaDMnLFxuICAnaDQnLFxuICAnaDUnLFxuICAnaDYnLFxuICAnaGVhZCcsXG4gICdoZWFkZXInLFxuICAnaHInLFxuICAnaHRtbCcsXG4gICdpZnJhbWUnLFxuICAnbGVnZW5kJyxcbiAgJ2xpJyxcbiAgJ2xpbmsnLFxuICAnbWFpbicsXG4gICdtZW51JyxcbiAgJ21lbnVpdGVtJyxcbiAgJ25hdicsXG4gICdub2ZyYW1lcycsXG4gICdvbCcsXG4gICdvcHRncm91cCcsXG4gICdvcHRpb24nLFxuICAncCcsXG4gICdwYXJhbScsXG4gICdzZWFyY2gnLFxuICAnc2VjdGlvbicsXG4gICdzdW1tYXJ5JyxcbiAgJ3RhYmxlJyxcbiAgJ3Rib2R5JyxcbiAgJ3RkJyxcbiAgJ3Rmb290JyxcbiAgJ3RoJyxcbiAgJ3RoZWFkJyxcbiAgJ3RpdGxlJyxcbiAgJ3RyJyxcbiAgJ3RyYWNrJyxcbiAgJ3VsJ1xuXVxuIiwiLy8gUmVnZXhwcyB0byBtYXRjaCBodG1sIGVsZW1lbnRzXG5cbmNvbnN0IGF0dHJfbmFtZSAgICAgPSAnW2EtekEtWl86XVthLXpBLVowLTk6Ll8tXSonXG5cbmNvbnN0IHVucXVvdGVkICAgICAgPSAnW15cIlxcJz08PmBcXFxceDAwLVxcXFx4MjBdKydcbmNvbnN0IHNpbmdsZV9xdW90ZWQgPSBcIidbXiddKidcIlxuY29uc3QgZG91YmxlX3F1b3RlZCA9ICdcIlteXCJdKlwiJ1xuXG5jb25zdCBhdHRyX3ZhbHVlICA9ICcoPzonICsgdW5xdW90ZWQgKyAnfCcgKyBzaW5nbGVfcXVvdGVkICsgJ3wnICsgZG91YmxlX3F1b3RlZCArICcpJ1xuXG5jb25zdCBhdHRyaWJ1dGUgICA9ICcoPzpcXFxccysnICsgYXR0cl9uYW1lICsgJyg/OlxcXFxzKj1cXFxccyonICsgYXR0cl92YWx1ZSArICcpPyknXG5cbmNvbnN0IG9wZW5fdGFnICAgID0gJzxbQS1aYS16XVtBLVphLXowLTlcXFxcLV0qJyArIGF0dHJpYnV0ZSArICcqXFxcXHMqXFxcXC8/PidcblxuY29uc3QgY2xvc2VfdGFnICAgPSAnPFxcXFwvW0EtWmEtel1bQS1aYS16MC05XFxcXC1dKlxcXFxzKj4nXG5jb25zdCBjb21tZW50ICAgICA9ICc8IS0tLT8+fDwhLS0oPzpbXi1dfC1bXi1dfC0tW14+XSkqLS0+J1xuY29uc3QgcHJvY2Vzc2luZyAgPSAnPFs/XVtcXFxcc1xcXFxTXSo/Wz9dPidcbmNvbnN0IGRlY2xhcmF0aW9uID0gJzwhW0EtWmEtel1bXj5dKj4nXG5jb25zdCBjZGF0YSAgICAgICA9ICc8IVxcXFxbQ0RBVEFcXFxcW1tcXFxcc1xcXFxTXSo/XFxcXF1cXFxcXT4nXG5cbmNvbnN0IEhUTUxfVEFHX1JFID0gbmV3IFJlZ0V4cCgnXig/OicgKyBvcGVuX3RhZyArICd8JyArIGNsb3NlX3RhZyArICd8JyArIGNvbW1lbnQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgcHJvY2Vzc2luZyArICd8JyArIGRlY2xhcmF0aW9uICsgJ3wnICsgY2RhdGEgKyAnKScpXG5jb25zdCBIVE1MX09QRU5fQ0xPU0VfVEFHX1JFID0gbmV3IFJlZ0V4cCgnXig/OicgKyBvcGVuX3RhZyArICd8JyArIGNsb3NlX3RhZyArICcpJylcblxuZXhwb3J0IHsgSFRNTF9UQUdfUkUsIEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUgfVxuIiwiLy8gVXRpbGl0aWVzXG4vL1xuXG5pbXBvcnQgKiBhcyBtZHVybCBmcm9tICdtZHVybCdcbmltcG9ydCAqIGFzIHVjbWljcm8gZnJvbSAndWMubWljcm8nXG5pbXBvcnQgeyBkZWNvZGVIVE1MIH0gZnJvbSAnZW50aXRpZXMnXG5cbmZ1bmN0aW9uIF9jbGFzcyAob2JqKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSB9XG5cbmZ1bmN0aW9uIGlzU3RyaW5nIChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBTdHJpbmddJyB9XG5cbmNvbnN0IF9oYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuZnVuY3Rpb24gaGFzIChvYmplY3QsIGtleSkge1xuICByZXR1cm4gX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG59XG5cbi8vIE1lcmdlIG9iamVjdHNcbi8vXG5mdW5jdGlvbiBhc3NpZ24gKG9iaiAvKiBmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4gKi8pIHtcbiAgY29uc3Qgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcblxuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGlmICghc291cmNlKSB7IHJldHVybiB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgb2JqZWN0JylcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBSZW1vdmUgZWxlbWVudCBmcm9tIGFycmF5IGFuZCBwdXQgYW5vdGhlciBhcnJheSBhdCB0aG9zZSBwb3NpdGlvbi5cbi8vIFVzZWZ1bCBmb3Igc29tZSBvcGVyYXRpb25zIHdpdGggdG9rZW5zXG5mdW5jdGlvbiBhcnJheVJlcGxhY2VBdCAoc3JjLCBwb3MsIG5ld0VsZW1lbnRzKSB7XG4gIHJldHVybiBbXS5jb25jYXQoc3JjLnNsaWNlKDAsIHBvcyksIG5ld0VsZW1lbnRzLCBzcmMuc2xpY2UocG9zICsgMSkpXG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbnRpdHlDb2RlIChjKSB7XG4gIC8qIGVzbGludCBuby1iaXR3aXNlOjAgKi9cbiAgLy8gYnJva2VuIHNlcXVlbmNlXG4gIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikgeyByZXR1cm4gZmFsc2UgfVxuICAvLyBuZXZlciB1c2VkXG4gIGlmIChjID49IDB4RkREMCAmJiBjIDw9IDB4RkRFRikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoKGMgJiAweEZGRkYpID09PSAweEZGRkYgfHwgKGMgJiAweEZGRkYpID09PSAweEZGRkUpIHsgcmV0dXJuIGZhbHNlIH1cbiAgLy8gY29udHJvbCBjb2Rlc1xuICBpZiAoYyA+PSAweDAwICYmIGMgPD0gMHgwOCkgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA9PT0gMHgwQikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA+PSAweDBFICYmIGMgPD0gMHgxRikgeyByZXR1cm4gZmFsc2UgfVxuICBpZiAoYyA+PSAweDdGICYmIGMgPD0gMHg5RikgeyByZXR1cm4gZmFsc2UgfVxuICAvLyBvdXQgb2YgcmFuZ2VcbiAgaWYgKGMgPiAweDEwRkZGRikgeyByZXR1cm4gZmFsc2UgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBmcm9tQ29kZVBvaW50IChjKSB7XG4gIC8qIGVzbGludCBuby1iaXR3aXNlOjAgKi9cbiAgaWYgKGMgPiAweGZmZmYpIHtcbiAgICBjIC09IDB4MTAwMDBcbiAgICBjb25zdCBzdXJyb2dhdGUxID0gMHhkODAwICsgKGMgPj4gMTApXG4gICAgY29uc3Qgc3Vycm9nYXRlMiA9IDB4ZGMwMCArIChjICYgMHgzZmYpXG5cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShzdXJyb2dhdGUxLCBzdXJyb2dhdGUyKVxuICB9XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpXG59XG5cbmNvbnN0IFVORVNDQVBFX01EX1JFICA9IC9cXFxcKFshXCIjJCUmJygpKissXFwtLi86Ozw9Pj9AW1xcXFxcXF1eX2B7fH1+XSkvZ1xuY29uc3QgRU5USVRZX1JFICAgICAgID0gLyYoW2EteiNdW2EtejAtOV17MSwzMX0pOy9naVxuY29uc3QgVU5FU0NBUEVfQUxMX1JFID0gbmV3IFJlZ0V4cChVTkVTQ0FQRV9NRF9SRS5zb3VyY2UgKyAnfCcgKyBFTlRJVFlfUkUuc291cmNlLCAnZ2knKVxuXG5jb25zdCBESUdJVEFMX0VOVElUWV9URVNUX1JFID0gL14jKCg/OnhbYS1mMC05XXsxLDh9fFswLTldezEsOH0pKSQvaVxuXG5mdW5jdGlvbiByZXBsYWNlRW50aXR5UGF0dGVybiAobWF0Y2gsIG5hbWUpIHtcbiAgaWYgKG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gMHgyMy8qICMgKi8gJiYgRElHSVRBTF9FTlRJVFlfVEVTVF9SRS50ZXN0KG5hbWUpKSB7XG4gICAgY29uc3QgY29kZSA9IG5hbWVbMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnXG4gICAgICA/IHBhcnNlSW50KG5hbWUuc2xpY2UoMiksIDE2KVxuICAgICAgOiBwYXJzZUludChuYW1lLnNsaWNlKDEpLCAxMClcblxuICAgIGlmIChpc1ZhbGlkRW50aXR5Q29kZShjb2RlKSkge1xuICAgICAgcmV0dXJuIGZyb21Db2RlUG9pbnQoY29kZSlcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hcbiAgfVxuXG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVIVE1MKG1hdGNoKVxuICBpZiAoZGVjb2RlZCAhPT0gbWF0Y2gpIHtcbiAgICByZXR1cm4gZGVjb2RlZFxuICB9XG5cbiAgcmV0dXJuIG1hdGNoXG59XG5cbi8qIGZ1bmN0aW9uIHJlcGxhY2VFbnRpdGllcyhzdHIpIHtcbiAgaWYgKHN0ci5pbmRleE9mKCcmJykgPCAwKSB7IHJldHVybiBzdHI7IH1cblxuICByZXR1cm4gc3RyLnJlcGxhY2UoRU5USVRZX1JFLCByZXBsYWNlRW50aXR5UGF0dGVybik7XG59ICovXG5cbmZ1bmN0aW9uIHVuZXNjYXBlTWQgKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJ1xcXFwnKSA8IDApIHsgcmV0dXJuIHN0ciB9XG4gIHJldHVybiBzdHIucmVwbGFjZShVTkVTQ0FQRV9NRF9SRSwgJyQxJylcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVBbGwgKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJ1xcXFwnKSA8IDAgJiYgc3RyLmluZGV4T2YoJyYnKSA8IDApIHsgcmV0dXJuIHN0ciB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFVORVNDQVBFX0FMTF9SRSwgZnVuY3Rpb24gKG1hdGNoLCBlc2NhcGVkLCBlbnRpdHkpIHtcbiAgICBpZiAoZXNjYXBlZCkgeyByZXR1cm4gZXNjYXBlZCB9XG4gICAgcmV0dXJuIHJlcGxhY2VFbnRpdHlQYXR0ZXJuKG1hdGNoLCBlbnRpdHkpXG4gIH0pXG59XG5cbmNvbnN0IEhUTUxfRVNDQVBFX1RFU1RfUkUgPSAvWyY8PlwiXS9cbmNvbnN0IEhUTUxfRVNDQVBFX1JFUExBQ0VfUkUgPSAvWyY8PlwiXS9nXG5jb25zdCBIVE1MX1JFUExBQ0VNRU5UUyA9IHtcbiAgJyYnOiAnJmFtcDsnLFxuICAnPCc6ICcmbHQ7JyxcbiAgJz4nOiAnJmd0OycsXG4gICdcIic6ICcmcXVvdDsnXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VVbnNhZmVDaGFyIChjaCkge1xuICByZXR1cm4gSFRNTF9SRVBMQUNFTUVOVFNbY2hdXG59XG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwgKHN0cikge1xuICBpZiAoSFRNTF9FU0NBUEVfVEVTVF9SRS50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoSFRNTF9FU0NBUEVfUkVQTEFDRV9SRSwgcmVwbGFjZVVuc2FmZUNoYXIpXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5jb25zdCBSRUdFWFBfRVNDQVBFX1JFID0gL1suPyorXiRbXFxdXFxcXCgpe318LV0vZ1xuXG5mdW5jdGlvbiBlc2NhcGVSRSAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfRVNDQVBFX1JFLCAnXFxcXCQmJylcbn1cblxuZnVuY3Rpb24gaXNTcGFjZSAoY29kZSkge1xuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4MDk6XG4gICAgY2FzZSAweDIwOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gWnMgKHVuaWNvZGUgY2xhc3MpIHx8IFtcXHRcXGZcXHZcXHJcXG5dXG5mdW5jdGlvbiBpc1doaXRlU3BhY2UgKGNvZGUpIHtcbiAgaWYgKGNvZGUgPj0gMHgyMDAwICYmIGNvZGUgPD0gMHgyMDBBKSB7IHJldHVybiB0cnVlIH1cbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAweDA5OiAvLyBcXHRcbiAgICBjYXNlIDB4MEE6IC8vIFxcblxuICAgIGNhc2UgMHgwQjogLy8gXFx2XG4gICAgY2FzZSAweDBDOiAvLyBcXGZcbiAgICBjYXNlIDB4MEQ6IC8vIFxcclxuICAgIGNhc2UgMHgyMDpcbiAgICBjYXNlIDB4QTA6XG4gICAgY2FzZSAweDE2ODA6XG4gICAgY2FzZSAweDIwMkY6XG4gICAgY2FzZSAweDIwNUY6XG4gICAgY2FzZSAweDMwMDA6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbi8vIEN1cnJlbnRseSB3aXRob3V0IGFzdHJhbCBjaGFyYWN0ZXJzIHN1cHBvcnQuXG5mdW5jdGlvbiBpc1B1bmN0Q2hhciAoY2gpIHtcbiAgcmV0dXJuIHVjbWljcm8uUC50ZXN0KGNoKSB8fCB1Y21pY3JvLlMudGVzdChjaClcbn1cblxuLy8gTWFya2Rvd24gQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVycy5cbi8vXG4vLyAhLCBcIiwgIywgJCwgJSwgJiwgJywgKCwgKSwgKiwgKywgLCwgLSwgLiwgLywgOiwgOywgPCwgPSwgPiwgPywgQCwgWywgXFwsIF0sIF4sIF8sIGAsIHssIHwsIH0sIG9yIH5cbi8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTUvI2FzY2lpLXB1bmN0dWF0aW9uLWNoYXJhY3RlclxuLy9cbi8vIERvbid0IGNvbmZ1c2Ugd2l0aCB1bmljb2RlIHB1bmN0dWF0aW9uICEhISBJdCBsYWNrcyBzb21lIGNoYXJzIGluIGFzY2lpIHJhbmdlLlxuLy9cbmZ1bmN0aW9uIGlzTWRBc2NpaVB1bmN0IChjaCkge1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAweDIxLyogISAqLzpcbiAgICBjYXNlIDB4MjIvKiBcIiAqLzpcbiAgICBjYXNlIDB4MjMvKiAjICovOlxuICAgIGNhc2UgMHgyNC8qICQgKi86XG4gICAgY2FzZSAweDI1LyogJSAqLzpcbiAgICBjYXNlIDB4MjYvKiAmICovOlxuICAgIGNhc2UgMHgyNy8qICcgKi86XG4gICAgY2FzZSAweDI4LyogKCAqLzpcbiAgICBjYXNlIDB4MjkvKiApICovOlxuICAgIGNhc2UgMHgyQS8qICogKi86XG4gICAgY2FzZSAweDJCLyogKyAqLzpcbiAgICBjYXNlIDB4MkMvKiAsICovOlxuICAgIGNhc2UgMHgyRC8qIC0gKi86XG4gICAgY2FzZSAweDJFLyogLiAqLzpcbiAgICBjYXNlIDB4MkYvKiAvICovOlxuICAgIGNhc2UgMHgzQS8qIDogKi86XG4gICAgY2FzZSAweDNCLyogOyAqLzpcbiAgICBjYXNlIDB4M0MvKiA8ICovOlxuICAgIGNhc2UgMHgzRC8qID0gKi86XG4gICAgY2FzZSAweDNFLyogPiAqLzpcbiAgICBjYXNlIDB4M0YvKiA/ICovOlxuICAgIGNhc2UgMHg0MC8qIEAgKi86XG4gICAgY2FzZSAweDVCLyogWyAqLzpcbiAgICBjYXNlIDB4NUMvKiBcXCAqLzpcbiAgICBjYXNlIDB4NUQvKiBdICovOlxuICAgIGNhc2UgMHg1RS8qIF4gKi86XG4gICAgY2FzZSAweDVGLyogXyAqLzpcbiAgICBjYXNlIDB4NjAvKiBgICovOlxuICAgIGNhc2UgMHg3Qi8qIHsgKi86XG4gICAgY2FzZSAweDdDLyogfCAqLzpcbiAgICBjYXNlIDB4N0QvKiB9ICovOlxuICAgIGNhc2UgMHg3RS8qIH4gKi86XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vLyBIZXBsZXIgdG8gdW5pZnkgW3JlZmVyZW5jZSBsYWJlbHNdLlxuLy9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlZmVyZW5jZSAoc3RyKSB7XG4gIC8vIFRyaW0gYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2VcbiAgLy9cbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csICcgJylcblxuICAvLyBJbiBub2RlIHYxMCAn4bqeJy50b0xvd2VyQ2FzZSgpID09PSAn4bm+Jywgd2hpY2ggaXMgcHJlc3VtZWQgdG8gYmUgYSBidWdcbiAgLy8gZml4ZWQgaW4gdjEyIChjb3VsZG4ndCBmaW5kIGFueSBkZXRhaWxzKS5cbiAgLy9cbiAgLy8gU28gdHJlYXQgdGhpcyBvbmUgYXMgYSBzcGVjaWFsIGNhc2VcbiAgLy8gKHJlbW92ZSB0aGlzIHdoZW4gbm9kZSB2MTAgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCkuXG4gIC8vXG4gIGlmICgn4bqeJy50b0xvd2VyQ2FzZSgpID09PSAn4bm+Jykge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC/hup4vZywgJ8OfJylcbiAgfVxuXG4gIC8vIC50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkgc2hvdWxkIGdldCByaWQgb2YgYWxsIGRpZmZlcmVuY2VzXG4gIC8vIGJldHdlZW4gbGV0dGVyIHZhcmlhbnRzLlxuICAvL1xuICAvLyBTaW1wbGUgLnRvTG93ZXJDYXNlKCkgZG9lc24ndCBub3JtYWxpemUgMTI1IGNvZGUgcG9pbnRzIGNvcnJlY3RseSxcbiAgLy8gYW5kIC50b1VwcGVyQ2FzZSBkb2Vzbid0IG5vcm1hbGl6ZSA2IG9mIHRoZW0gKGxpc3Qgb2YgZXhjZXB0aW9uczpcbiAgLy8gxLAsIM+0LCDhup4sIOKEpiwg4oSqLCDihKsgLSB0aG9zZSBhcmUgYWxyZWFkeSB1cHBlcmNhc2VkLCBidXQgaGF2ZSBkaWZmZXJlbnRseVxuICAvLyB1cHBlcmNhc2VkIHZlcnNpb25zKS5cbiAgLy9cbiAgLy8gSGVyZSdzIGFuIGV4YW1wbGUgc2hvd2luZyBob3cgaXQgaGFwcGVucy4gTGV0cyB0YWtlIGdyZWVrIGxldHRlciBvbWVnYTpcbiAgLy8gdXBwZXJjYXNlIFUrMDM5OCAozpgpLCBVKzAzZjQgKM+0KSBhbmQgbG93ZXJjYXNlIFUrMDNiOCAozrgpLCBVKzAzZDEgKM+RKVxuICAvL1xuICAvLyBVbmljb2RlIGVudHJpZXM6XG4gIC8vIDAzOTg7R1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEE7THU7MDtMOzs7OztOOzs7OzAzQjg7XG4gIC8vIDAzQjg7R1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBO0xsOzA7TDs7Ozs7Tjs7OzAzOTg7OzAzOThcbiAgLy8gMDNEMTtHUkVFSyBUSEVUQSBTWU1CT0w7TGw7MDtMOzxjb21wYXQ+IDAzQjg7Ozs7TjtHUkVFSyBTTUFMTCBMRVRURVIgU0NSSVBUIFRIRVRBOzswMzk4OzswMzk4XG4gIC8vIDAzRjQ7R1JFRUsgQ0FQSVRBTCBUSEVUQSBTWU1CT0w7THU7MDtMOzxjb21wYXQ+IDAzOTg7Ozs7Tjs7OzswM0I4O1xuICAvL1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gc2hvdWxkIHRyZWF0IGFsbCBvZiB0aGVtIGFzIGVxdWl2YWxlbnQuXG4gIC8vXG4gIC8vIEJ1dCAudG9Mb3dlckNhc2UoKSBkb2Vzbid0IGNoYW5nZSDPkSAoaXQncyBhbHJlYWR5IGxvd2VyY2FzZSksXG4gIC8vIGFuZCAudG9VcHBlckNhc2UoKSBkb2Vzbid0IGNoYW5nZSDPtCAoYWxyZWFkeSB1cHBlcmNhc2UpLlxuICAvL1xuICAvLyBBcHBseWluZyBmaXJzdCBsb3dlciB0aGVuIHVwcGVyIGNhc2Ugbm9ybWFsaXplcyBhbnkgY2hhcmFjdGVyOlxuICAvLyAnXFx1MDM5OFxcdTAzZjRcXHUwM2I4XFx1MDNkMScudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpID09PSAnXFx1MDM5OFxcdTAzOThcXHUwMzk4XFx1MDM5OCdcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBpcyBlcXVpdmFsZW50IHRvIHVuaWNvZGUgY2FzZSBmb2xkaW5nOyB1bmljb2RlIG5vcm1hbGl6YXRpb25cbiAgLy8gaXMgYSBkaWZmZXJlbnQgc3RlcCB0aGF0IGlzIG5vdCByZXF1aXJlZCBoZXJlLlxuICAvL1xuICAvLyBGaW5hbCByZXN1bHQgc2hvdWxkIGJlIHVwcGVyY2FzZWQsIGJlY2F1c2UgaXQncyBsYXRlciBzdG9yZWQgaW4gYW4gb2JqZWN0XG4gIC8vICh0aGlzIGF2b2lkIGEgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIG1lbWJlcnMsXG4gIC8vIG1vc3Qgbm90YWJseSwgYF9fcHJvdG9fX2ApXG4gIC8vXG4gIHJldHVybiBzdHIudG9Mb3dlckNhc2UoKS50b1VwcGVyQ2FzZSgpXG59XG5cbi8vIFJlLWV4cG9ydCBsaWJyYXJpZXMgY29tbW9ubHkgdXNlZCBpbiBib3RoIG1hcmtkb3duLWl0IGFuZCBpdHMgcGx1Z2lucyxcbi8vIHNvIHBsdWdpbnMgd29uJ3QgaGF2ZSB0byBkZXBlbmQgb24gdGhlbSBleHBsaWNpdGx5LCB3aGljaCByZWR1Y2VzIHRoZWlyXG4vLyBidW5kbGVkIHNpemUgKGUuZy4gYSBicm93c2VyIGJ1aWxkKS5cbi8vXG5jb25zdCBsaWIgPSB7IG1kdXJsLCB1Y21pY3JvIH1cblxuZXhwb3J0IHtcbiAgbGliLFxuICBhc3NpZ24sXG4gIGlzU3RyaW5nLFxuICBoYXMsXG4gIHVuZXNjYXBlTWQsXG4gIHVuZXNjYXBlQWxsLFxuICBpc1ZhbGlkRW50aXR5Q29kZSxcbiAgZnJvbUNvZGVQb2ludCxcbiAgZXNjYXBlSHRtbCxcbiAgYXJyYXlSZXBsYWNlQXQsXG4gIGlzU3BhY2UsXG4gIGlzV2hpdGVTcGFjZSxcbiAgaXNNZEFzY2lpUHVuY3QsXG4gIGlzUHVuY3RDaGFyLFxuICBlc2NhcGVSRSxcbiAgbm9ybWFsaXplUmVmZXJlbmNlXG59XG4iLCIvLyBKdXN0IGEgc2hvcnRjdXQgZm9yIGJ1bGsgZXhwb3J0XG5cbmltcG9ydCBwYXJzZUxpbmtMYWJlbCBmcm9tICcuL3BhcnNlX2xpbmtfbGFiZWwubWpzJ1xuaW1wb3J0IHBhcnNlTGlua0Rlc3RpbmF0aW9uIGZyb20gJy4vcGFyc2VfbGlua19kZXN0aW5hdGlvbi5tanMnXG5pbXBvcnQgcGFyc2VMaW5rVGl0bGUgZnJvbSAnLi9wYXJzZV9saW5rX3RpdGxlLm1qcydcblxuZXhwb3J0IHtcbiAgcGFyc2VMaW5rTGFiZWwsXG4gIHBhcnNlTGlua0Rlc3RpbmF0aW9uLFxuICBwYXJzZUxpbmtUaXRsZVxufVxuIiwiLy8gUGFyc2UgbGluayBkZXN0aW5hdGlvblxuLy9cblxuaW1wb3J0IHsgdW5lc2NhcGVBbGwgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUxpbmtEZXN0aW5hdGlvbiAoc3RyLCBzdGFydCwgbWF4KSB7XG4gIGxldCBjb2RlXG4gIGxldCBwb3MgPSBzdGFydFxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBvazogZmFsc2UsXG4gICAgcG9zOiAwLFxuICAgIHN0cjogJydcbiAgfVxuXG4gIGlmIChzdHIuY2hhckNvZGVBdChwb3MpID09PSAweDNDIC8qIDwgKi8pIHtcbiAgICBwb3MrK1xuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoY29kZSA9PT0gMHgwQSAvKiBcXG4gKi8pIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgICBpZiAoY29kZSA9PT0gMHgzQyAvKiA8ICovKSB7IHJldHVybiByZXN1bHQgfVxuICAgICAgaWYgKGNvZGUgPT09IDB4M0UgLyogPiAqLykge1xuICAgICAgICByZXN1bHQucG9zID0gcG9zICsgMVxuICAgICAgICByZXN1bHQuc3RyID0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0ICsgMSwgcG9zKSlcbiAgICAgICAgcmVzdWx0Lm9rID0gdHJ1ZVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gMHg1QyAvKiBcXCAqLyAmJiBwb3MgKyAxIDwgbWF4KSB7XG4gICAgICAgIHBvcyArPSAyXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgLy8gbm8gY2xvc2luZyAnPidcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyB0aGlzIHNob3VsZCBiZSAuLi4gfSBlbHNlIHsgLi4uIGJyYW5jaFxuXG4gIGxldCBsZXZlbCA9IDBcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoY29kZSA9PT0gMHgyMCkgeyBicmVhayB9XG5cbiAgICAvLyBhc2NpaSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICBpZiAoY29kZSA8IDB4MjAgfHwgY29kZSA9PT0gMHg3RikgeyBicmVhayB9XG5cbiAgICBpZiAoY29kZSA9PT0gMHg1QyAvKiBcXCAqLyAmJiBwb3MgKyAxIDwgbWF4KSB7XG4gICAgICBpZiAoc3RyLmNoYXJDb2RlQXQocG9zICsgMSkgPT09IDB4MjApIHsgYnJlYWsgfVxuICAgICAgcG9zICs9IDJcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4MjggLyogKCAqLykge1xuICAgICAgbGV2ZWwrK1xuICAgICAgaWYgKGxldmVsID4gMzIpIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDB4MjkgLyogKSAqLykge1xuICAgICAgaWYgKGxldmVsID09PSAwKSB7IGJyZWFrIH1cbiAgICAgIGxldmVsLS1cbiAgICB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSBwb3MpIHsgcmV0dXJuIHJlc3VsdCB9XG4gIGlmIChsZXZlbCAhPT0gMCkgeyByZXR1cm4gcmVzdWx0IH1cblxuICByZXN1bHQuc3RyID0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICByZXN1bHQucG9zID0gcG9zXG4gIHJlc3VsdC5vayA9IHRydWVcbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLy8gUGFyc2UgbGluayBsYWJlbFxuLy9cbi8vIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGZpcnN0IGNoYXJhY3RlciAoXCJbXCIpIGFscmVhZHkgbWF0Y2hlcztcbi8vIHJldHVybnMgdGhlIGVuZCBvZiB0aGUgbGFiZWxcbi8vXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlTGlua0xhYmVsIChzdGF0ZSwgc3RhcnQsIGRpc2FibGVOZXN0ZWQpIHtcbiAgbGV0IGxldmVsLCBmb3VuZCwgbWFya2VyLCBwcmV2UG9zXG5cbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG4gIGNvbnN0IG9sZFBvcyA9IHN0YXRlLnBvc1xuXG4gIHN0YXRlLnBvcyA9IHN0YXJ0ICsgMVxuICBsZXZlbCA9IDFcblxuICB3aGlsZSAoc3RhdGUucG9zIDwgbWF4KSB7XG4gICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKVxuICAgIGlmIChtYXJrZXIgPT09IDB4NUQgLyogXSAqLykge1xuICAgICAgbGV2ZWwtLVxuICAgICAgaWYgKGxldmVsID09PSAwKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIHByZXZQb3MgPSBzdGF0ZS5wb3NcbiAgICBzdGF0ZS5tZC5pbmxpbmUuc2tpcFRva2VuKHN0YXRlKVxuICAgIGlmIChtYXJrZXIgPT09IDB4NUIgLyogWyAqLykge1xuICAgICAgaWYgKHByZXZQb3MgPT09IHN0YXRlLnBvcyAtIDEpIHtcbiAgICAgICAgLy8gaW5jcmVhc2UgbGV2ZWwgaWYgd2UgZmluZCB0ZXh0IGBbYCwgd2hpY2ggaXMgbm90IGEgcGFydCBvZiBhbnkgdG9rZW5cbiAgICAgICAgbGV2ZWwrK1xuICAgICAgfSBlbHNlIGlmIChkaXNhYmxlTmVzdGVkKSB7XG4gICAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgbGFiZWxFbmQgPSAtMVxuXG4gIGlmIChmb3VuZCkge1xuICAgIGxhYmVsRW5kID0gc3RhdGUucG9zXG4gIH1cblxuICAvLyByZXN0b3JlIG9sZCBzdGF0ZVxuICBzdGF0ZS5wb3MgPSBvbGRQb3NcblxuICByZXR1cm4gbGFiZWxFbmRcbn1cbiIsIi8vIFBhcnNlIGxpbmsgdGl0bGVcbi8vXG5cbmltcG9ydCB7IHVuZXNjYXBlQWxsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuLy8gUGFyc2UgbGluayB0aXRsZSB3aXRoaW4gYHN0cmAgaW4gW3N0YXJ0LCBtYXhdIHJhbmdlLFxuLy8gb3IgY29udGludWUgcHJldmlvdXMgcGFyc2luZyBpZiBgcHJldl9zdGF0ZWAgaXMgZGVmaW5lZCAoZXF1YWwgdG8gcmVzdWx0IG9mIGxhc3QgZXhlY3V0aW9uKS5cbi8vXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJzZUxpbmtUaXRsZSAoc3RyLCBzdGFydCwgbWF4LCBwcmV2X3N0YXRlKSB7XG4gIGxldCBjb2RlXG4gIGxldCBwb3MgPSBzdGFydFxuXG4gIGNvbnN0IHN0YXRlID0ge1xuICAgIC8vIGlmIGB0cnVlYCwgdGhpcyBpcyBhIHZhbGlkIGxpbmsgdGl0bGVcbiAgICBvazogZmFsc2UsXG4gICAgLy8gaWYgYHRydWVgLCB0aGlzIGxpbmsgY2FuIGJlIGNvbnRpbnVlZCBvbiB0aGUgbmV4dCBsaW5lXG4gICAgY2FuX2NvbnRpbnVlOiBmYWxzZSxcbiAgICAvLyBpZiBgb2tgLCBpdCdzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjbG9zaW5nIG1hcmtlclxuICAgIHBvczogMCxcbiAgICAvLyBpZiBgb2tgLCBpdCdzIHRoZSB1bmVzY2FwZWQgdGl0bGVcbiAgICBzdHI6ICcnLFxuICAgIC8vIGV4cGVjdGVkIGNsb3NpbmcgbWFya2VyIGNoYXJhY3RlciBjb2RlXG4gICAgbWFya2VyOiAwXG4gIH1cblxuICBpZiAocHJldl9zdGF0ZSkge1xuICAgIC8vIHRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgYSBwcmV2aW91cyBwYXJzZUxpbmtUaXRsZSBjYWxsIG9uIHRoZSBuZXh0IGxpbmUsXG4gICAgLy8gdXNlZCBpbiByZWZlcmVuY2UgbGlua3Mgb25seVxuICAgIHN0YXRlLnN0ciA9IHByZXZfc3RhdGUuc3RyXG4gICAgc3RhdGUubWFya2VyID0gcHJldl9zdGF0ZS5tYXJrZXJcbiAgfSBlbHNlIHtcbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gc3RhdGUgfVxuXG4gICAgbGV0IG1hcmtlciA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAobWFya2VyICE9PSAweDIyIC8qIFwiICovICYmIG1hcmtlciAhPT0gMHgyNyAvKiAnICovICYmIG1hcmtlciAhPT0gMHgyOCAvKiAoICovKSB7IHJldHVybiBzdGF0ZSB9XG5cbiAgICBzdGFydCsrXG4gICAgcG9zKytcblxuICAgIC8vIGlmIG9wZW5pbmcgbWFya2VyIGlzIFwiKFwiLCBzd2l0Y2ggaXQgdG8gY2xvc2luZyBtYXJrZXIgXCIpXCJcbiAgICBpZiAobWFya2VyID09PSAweDI4KSB7IG1hcmtlciA9IDB4MjkgfVxuXG4gICAgc3RhdGUubWFya2VyID0gbWFya2VyXG4gIH1cblxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoY29kZSA9PT0gc3RhdGUubWFya2VyKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBwb3MgKyAxXG4gICAgICBzdGF0ZS5zdHIgKz0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICAgICAgc3RhdGUub2sgPSB0cnVlXG4gICAgICByZXR1cm4gc3RhdGVcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjggLyogKCAqLyAmJiBzdGF0ZS5tYXJrZXIgPT09IDB4MjkgLyogKSAqLykge1xuICAgICAgcmV0dXJuIHN0YXRlXG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVDIC8qIFxcICovICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgcG9zKytcbiAgfVxuXG4gIC8vIG5vIGNsb3NpbmcgbWFya2VyIGZvdW5kLCBidXQgdGhpcyBsaW5rIHRpdGxlIG1heSBjb250aW51ZSBvbiB0aGUgbmV4dCBsaW5lIChmb3IgcmVmZXJlbmNlcylcbiAgc3RhdGUuY2FuX2NvbnRpbnVlID0gdHJ1ZVxuICBzdGF0ZS5zdHIgKz0gdW5lc2NhcGVBbGwoc3RyLnNsaWNlKHN0YXJ0LCBwb3MpKVxuICByZXR1cm4gc3RhdGVcbn1cbiIsIi8vIE1haW4gcGFyc2VyIGNsYXNzXG5cbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vY29tbW9uL3V0aWxzLm1qcydcbmltcG9ydCAqIGFzIGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzL2luZGV4Lm1qcydcbmltcG9ydCBSZW5kZXJlciBmcm9tICcuL3JlbmRlcmVyLm1qcydcbmltcG9ydCBQYXJzZXJDb3JlIGZyb20gJy4vcGFyc2VyX2NvcmUubWpzJ1xuaW1wb3J0IFBhcnNlckJsb2NrIGZyb20gJy4vcGFyc2VyX2Jsb2NrLm1qcydcbmltcG9ydCBQYXJzZXJJbmxpbmUgZnJvbSAnLi9wYXJzZXJfaW5saW5lLm1qcydcbmltcG9ydCBMaW5raWZ5SXQgZnJvbSAnbGlua2lmeS1pdCdcbmltcG9ydCAqIGFzIG1kdXJsIGZyb20gJ21kdXJsJ1xuaW1wb3J0IHB1bnljb2RlIGZyb20gJ3B1bnljb2RlLmpzJ1xuXG5pbXBvcnQgY2ZnX2RlZmF1bHQgZnJvbSAnLi9wcmVzZXRzL2RlZmF1bHQubWpzJ1xuaW1wb3J0IGNmZ196ZXJvIGZyb20gJy4vcHJlc2V0cy96ZXJvLm1qcydcbmltcG9ydCBjZmdfY29tbW9ubWFyayBmcm9tICcuL3ByZXNldHMvY29tbW9ubWFyay5tanMnXG5cbmNvbnN0IGNvbmZpZyA9IHtcbiAgZGVmYXVsdDogY2ZnX2RlZmF1bHQsXG4gIHplcm86IGNmZ196ZXJvLFxuICBjb21tb25tYXJrOiBjZmdfY29tbW9ubWFya1xufVxuXG4vL1xuLy8gVGhpcyB2YWxpZGF0b3IgY2FuIHByb2hpYml0IG1vcmUgdGhhbiByZWFsbHkgbmVlZGVkIHRvIHByZXZlbnQgWFNTLiBJdCdzIGFcbi8vIHRyYWRlb2ZmIHRvIGtlZXAgY29kZSBzaW1wbGUgYW5kIHRvIGJlIHNlY3VyZSBieSBkZWZhdWx0LlxuLy9cbi8vIElmIHlvdSBuZWVkIGRpZmZlcmVudCBzZXR1cCAtIG92ZXJyaWRlIHZhbGlkYXRvciBtZXRob2QgYXMgeW91IHdpc2guIE9yXG4vLyByZXBsYWNlIGl0IHdpdGggZHVtbXkgZnVuY3Rpb24gYW5kIHVzZSBleHRlcm5hbCBzYW5pdGl6ZXIuXG4vL1xuXG5jb25zdCBCQURfUFJPVE9fUkUgPSAvXih2YnNjcmlwdHxqYXZhc2NyaXB0fGZpbGV8ZGF0YSk6L1xuY29uc3QgR09PRF9EQVRBX1JFID0gL15kYXRhOmltYWdlXFwvKGdpZnxwbmd8anBlZ3x3ZWJwKTsvXG5cbmZ1bmN0aW9uIHZhbGlkYXRlTGluayAodXJsKSB7XG4gIC8vIHVybCBzaG91bGQgYmUgbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50LCBhbmQgZXhpc3RpbmcgZW50aXRpZXMgYXJlIGRlY29kZWRcbiAgY29uc3Qgc3RyID0gdXJsLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG5cbiAgcmV0dXJuIEJBRF9QUk9UT19SRS50ZXN0KHN0cikgPyBHT09EX0RBVEFfUkUudGVzdChzdHIpIDogdHJ1ZVxufVxuXG5jb25zdCBSRUNPREVfSE9TVE5BTUVfRk9SID0gWydodHRwOicsICdodHRwczonLCAnbWFpbHRvOiddXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmsgKHVybCkge1xuICBjb25zdCBwYXJzZWQgPSBtZHVybC5wYXJzZSh1cmwsIHRydWUpXG5cbiAgaWYgKHBhcnNlZC5ob3N0bmFtZSkge1xuICAgIC8vIEVuY29kZSBob3N0bmFtZXMgaW4gdXJscyBsaWtlOlxuICAgIC8vIGBodHRwOi8vaG9zdC9gLCBgaHR0cHM6Ly9ob3N0L2AsIGBtYWlsdG86dXNlckBob3N0YCwgYC8vaG9zdC9gXG4gICAgLy9cbiAgICAvLyBXZSBkb24ndCBlbmNvZGUgdW5rbm93biBzY2hlbWFzLCBiZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UgZW5jb2RlXG4gICAgLy8gc29tZXRoaW5nIHdlIHNob3VsZG4ndCAoZS5nLiBgc2t5cGU6bmFtZWAgdHJlYXRlZCBhcyBgc2t5cGU6aG9zdGApXG4gICAgLy9cbiAgICBpZiAoIXBhcnNlZC5wcm90b2NvbCB8fCBSRUNPREVfSE9TVE5BTUVfRk9SLmluZGV4T2YocGFyc2VkLnByb3RvY29sKSA+PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQuaG9zdG5hbWUgPSBwdW55Y29kZS50b0FTQ0lJKHBhcnNlZC5ob3N0bmFtZSlcbiAgICAgIH0gY2F0Y2ggKGVyKSB7IC8qKi8gfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZHVybC5lbmNvZGUobWR1cmwuZm9ybWF0KHBhcnNlZCkpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmtUZXh0ICh1cmwpIHtcbiAgY29uc3QgcGFyc2VkID0gbWR1cmwucGFyc2UodXJsLCB0cnVlKVxuXG4gIGlmIChwYXJzZWQuaG9zdG5hbWUpIHtcbiAgICAvLyBFbmNvZGUgaG9zdG5hbWVzIGluIHVybHMgbGlrZTpcbiAgICAvLyBgaHR0cDovL2hvc3QvYCwgYGh0dHBzOi8vaG9zdC9gLCBgbWFpbHRvOnVzZXJAaG9zdGAsIGAvL2hvc3QvYFxuICAgIC8vXG4gICAgLy8gV2UgZG9uJ3QgZW5jb2RlIHVua25vd24gc2NoZW1hcywgYmVjYXVzZSBpdCdzIGxpa2VseSB0aGF0IHdlIGVuY29kZVxuICAgIC8vIHNvbWV0aGluZyB3ZSBzaG91bGRuJ3QgKGUuZy4gYHNreXBlOm5hbWVgIHRyZWF0ZWQgYXMgYHNreXBlOmhvc3RgKVxuICAgIC8vXG4gICAgaWYgKCFwYXJzZWQucHJvdG9jb2wgfHwgUkVDT0RFX0hPU1ROQU1FX0ZPUi5pbmRleE9mKHBhcnNlZC5wcm90b2NvbCkgPj0gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkLmhvc3RuYW1lID0gcHVueWNvZGUudG9Vbmljb2RlKHBhcnNlZC5ob3N0bmFtZSlcbiAgICAgIH0gY2F0Y2ggKGVyKSB7IC8qKi8gfVxuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCAnJScgdG8gZXhjbHVkZSBsaXN0IGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2lzc3Vlcy83MjBcbiAgcmV0dXJuIG1kdXJsLmRlY29kZShtZHVybC5mb3JtYXQocGFyc2VkKSwgbWR1cmwuZGVjb2RlLmRlZmF1bHRDaGFycyArICclJylcbn1cblxuLyoqXG4gKiBjbGFzcyBNYXJrZG93bkl0XG4gKlxuICogTWFpbiBwYXJzZXIvcmVuZGVyZXIgY2xhc3MuXG4gKlxuICogIyMjIyMgVXNhZ2VcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBub2RlLmpzLCBcImNsYXNzaWNcIiB3YXk6XG4gKiB2YXIgTWFya2Rvd25JdCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JyksXG4gKiAgICAgbWQgPSBuZXcgTWFya2Rvd25JdCgpO1xuICogdmFyIHJlc3VsdCA9IG1kLnJlbmRlcignIyBtYXJrZG93bi1pdCBydWxlenohJyk7XG4gKlxuICogLy8gbm9kZS5qcywgdGhlIHNhbWUsIGJ1dCB3aXRoIHN1Z2FyOlxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICogdmFyIHJlc3VsdCA9IG1kLnJlbmRlcignIyBtYXJrZG93bi1pdCBydWxlenohJyk7XG4gKlxuICogLy8gYnJvd3NlciB3aXRob3V0IEFNRCwgYWRkZWQgdG8gXCJ3aW5kb3dcIiBvbiBzY3JpcHQgbG9hZFxuICogLy8gTm90ZSwgdGhlcmUgYXJlIG5vIGRhc2guXG4gKiB2YXIgbWQgPSB3aW5kb3cubWFya2Rvd25pdCgpO1xuICogdmFyIHJlc3VsdCA9IG1kLnJlbmRlcignIyBtYXJrZG93bi1pdCBydWxlenohJyk7XG4gKiBgYGBcbiAqXG4gKiBTaW5nbGUgbGluZSByZW5kZXJpbmcsIHdpdGhvdXQgcGFyYWdyYXBoIHdyYXA6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICogdmFyIHJlc3VsdCA9IG1kLnJlbmRlcklubGluZSgnX19tYXJrZG93bi1pdF9fIHJ1bGV6eiEnKTtcbiAqIGBgYFxuICoqL1xuXG4vKipcbiAqIG5ldyBNYXJrZG93bkl0KFtwcmVzZXROYW1lLCBvcHRpb25zXSlcbiAqIC0gcHJlc2V0TmFtZSAoU3RyaW5nKTogb3B0aW9uYWwsIGBjb21tb25tYXJrYCAvIGB6ZXJvYFxuICogLSBvcHRpb25zIChPYmplY3QpXG4gKlxuICogQ3JlYXRlcyBwYXJzZXIgaW5zdGFuc2Ugd2l0aCBnaXZlbiBjb25maWcuIENhbiBiZSBjYWxsZWQgd2l0aG91dCBgbmV3YC5cbiAqXG4gKiAjIyMjIyBwcmVzZXROYW1lXG4gKlxuICogTWFya2Rvd25JdCBwcm92aWRlcyBuYW1lZCBwcmVzZXRzIGFzIGEgY29udmVuaWVuY2UgdG8gcXVpY2tseVxuICogZW5hYmxlL2Rpc2FibGUgYWN0aXZlIHN5bnRheCBydWxlcyBhbmQgb3B0aW9ucyBmb3IgY29tbW9uIHVzZSBjYXNlcy5cbiAqXG4gKiAtIFtcImNvbW1vbm1hcmtcIl0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9wcmVzZXRzL2NvbW1vbm1hcmsubWpzKSAtXG4gKiAgIGNvbmZpZ3VyZXMgcGFyc2VyIHRvIHN0cmljdCBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykgbW9kZS5cbiAqIC0gW2RlZmF1bHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcHJlc2V0cy9kZWZhdWx0Lm1qcykgLVxuICogICBzaW1pbGFyIHRvIEdGTSwgdXNlZCB3aGVuIG5vIHByZXNldCBuYW1lIGdpdmVuLiBFbmFibGVzIGFsbCBhdmFpbGFibGUgcnVsZXMsXG4gKiAgIGJ1dCBzdGlsbCB3aXRob3V0IGh0bWwsIHR5cG9ncmFwaGVyICYgYXV0b2xpbmtlci5cbiAqIC0gW1wiemVyb1wiXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3ByZXNldHMvemVyby5tanMpIC1cbiAqICAgYWxsIHJ1bGVzIGRpc2FibGVkLiBVc2VmdWwgdG8gcXVpY2tseSBzZXR1cCB5b3VyIGNvbmZpZyB2aWEgYC5lbmFibGUoKWAuXG4gKiAgIEZvciBleGFtcGxlLCB3aGVuIHlvdSBuZWVkIG9ubHkgYGJvbGRgIGFuZCBgaXRhbGljYCBtYXJrdXAgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiAjIyMjIyBvcHRpb25zOlxuICpcbiAqIC0gX19odG1sX18gLSBgZmFsc2VgLiBTZXQgYHRydWVgIHRvIGVuYWJsZSBIVE1MIHRhZ3MgaW4gc291cmNlLiBCZSBjYXJlZnVsIVxuICogICBUaGF0J3Mgbm90IHNhZmUhIFlvdSBtYXkgbmVlZCBleHRlcm5hbCBzYW5pdGl6ZXIgdG8gcHJvdGVjdCBvdXRwdXQgZnJvbSBYU1MuXG4gKiAgIEl0J3MgYmV0dGVyIHRvIGV4dGVuZCBmZWF0dXJlcyB2aWEgcGx1Z2lucywgaW5zdGVhZCBvZiBlbmFibGluZyBIVE1MLlxuICogLSBfX3hodG1sT3V0X18gLSBgZmFsc2VgLiBTZXQgYHRydWVgIHRvIGFkZCAnLycgd2hlbiBjbG9zaW5nIHNpbmdsZSB0YWdzXG4gKiAgIChgPGJyIC8+YCkuIFRoaXMgaXMgbmVlZGVkIG9ubHkgZm9yIGZ1bGwgQ29tbW9uTWFyayBjb21wYXRpYmlsaXR5LiBJbiByZWFsXG4gKiAgIHdvcmxkIHlvdSB3aWxsIG5lZWQgSFRNTCBvdXRwdXQuXG4gKiAtIF9fYnJlYWtzX18gLSBgZmFsc2VgLiBTZXQgYHRydWVgIHRvIGNvbnZlcnQgYFxcbmAgaW4gcGFyYWdyYXBocyBpbnRvIGA8YnI+YC5cbiAqIC0gX19sYW5nUHJlZml4X18gLSBgbGFuZ3VhZ2UtYC4gQ1NTIGxhbmd1YWdlIGNsYXNzIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrcy5cbiAqICAgQ2FuIGJlIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgaGlnaGxpZ2h0ZXJzLlxuICogLSBfX2xpbmtpZnlfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dCB0byBsaW5rcy5cbiAqIC0gX190eXBvZ3JhcGhlcl9fICAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gZW5hYmxlIFtzb21lIGxhbmd1YWdlLW5ldXRyYWxcbiAqICAgcmVwbGFjZW1lbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcnVsZXNfY29yZS9yZXBsYWNlbWVudHMubWpzKSArXG4gKiAgIHF1b3RlcyBiZWF1dGlmaWNhdGlvbiAoc21hcnRxdW90ZXMpLlxuICogLSBfX3F1b3Rlc19fIC0gYOKAnOKAneKAmOKAmWAsIFN0cmluZyBvciBBcnJheS4gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudFxuICogICBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkIGFuZCBzbWFydHF1b3RlcyBvbi4gRm9yIGV4YW1wbGUsIHlvdSBjYW5cbiAqICAgdXNlIGAnwqvCu+KAnuKAnCdgIGZvciBSdXNzaWFuLCBgJ+KAnuKAnOKAmuKAmCdgIGZvciBHZXJtYW4sIGFuZFxuICogICBgWyfCq1xceEEwJywgJ1xceEEwwrsnLCAn4oC5XFx4QTAnLCAnXFx4QTDigLonXWAgZm9yIEZyZW5jaCAoaW5jbHVkaW5nIG5ic3ApLlxuICogLSBfX2hpZ2hsaWdodF9fIC0gYG51bGxgLiBIaWdobGlnaHRlciBmdW5jdGlvbiBmb3IgZmVuY2VkIGNvZGUgYmxvY2tzLlxuICogICBIaWdobGlnaHRlciBgZnVuY3Rpb24gKHN0ciwgbGFuZylgIHNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLiBJdCBjYW4gYWxzb1xuICogICByZXR1cm4gZW1wdHkgc3RyaW5nIGlmIHRoZSBzb3VyY2Ugd2FzIG5vdCBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgZXNjYXBlZFxuICogICBleHRlcm5hbHkuIElmIHJlc3VsdCBzdGFydHMgd2l0aCA8cHJlLi4uIGludGVybmFsIHdyYXBwZXIgaXMgc2tpcHBlZC5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogLy8gY29tbW9ubWFyayBtb2RlXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCdjb21tb25tYXJrJyk7XG4gKlxuICogLy8gZGVmYXVsdCBtb2RlXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogLy8gZW5hYmxlIGV2ZXJ5dGhpbmdcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0Jykoe1xuICogICBodG1sOiB0cnVlLFxuICogICBsaW5raWZ5OiB0cnVlLFxuICogICB0eXBvZ3JhcGhlcjogdHJ1ZVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMjIyBTeW50YXggaGlnaGxpZ2h0aW5nXG4gKlxuICogYGBganNcbiAqIHZhciBobGpzID0gcmVxdWlyZSgnaGlnaGxpZ2h0LmpzJykgLy8gaHR0cHM6Ly9oaWdobGlnaHRqcy5vcmcvXG4gKlxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSh7XG4gKiAgIGhpZ2hsaWdodDogZnVuY3Rpb24gKHN0ciwgbGFuZykge1xuICogICAgIGlmIChsYW5nICYmIGhsanMuZ2V0TGFuZ3VhZ2UobGFuZykpIHtcbiAqICAgICAgIHRyeSB7XG4gKiAgICAgICAgIHJldHVybiBobGpzLmhpZ2hsaWdodChzdHIsIHsgbGFuZ3VhZ2U6IGxhbmcsIGlnbm9yZUlsbGVnYWxzOiB0cnVlIH0pLnZhbHVlO1xuICogICAgICAgfSBjYXRjaCAoX18pIHt9XG4gKiAgICAgfVxuICpcbiAqICAgICByZXR1cm4gJyc7IC8vIHVzZSBleHRlcm5hbCBkZWZhdWx0IGVzY2FwaW5nXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKlxuICogT3Igd2l0aCBmdWxsIHdyYXBwZXIgb3ZlcnJpZGUgKGlmIHlvdSBuZWVkIGFzc2lnbiBjbGFzcyB0byBgPHByZT5gIG9yIGA8Y29kZT5gKTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgaGxqcyA9IHJlcXVpcmUoJ2hpZ2hsaWdodC5qcycpIC8vIGh0dHBzOi8vaGlnaGxpZ2h0anMub3JnL1xuICpcbiAqIC8vIEFjdHVhbCBkZWZhdWx0IHZhbHVlc1xuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSh7XG4gKiAgIGhpZ2hsaWdodDogZnVuY3Rpb24gKHN0ciwgbGFuZykge1xuICogICAgIGlmIChsYW5nICYmIGhsanMuZ2V0TGFuZ3VhZ2UobGFuZykpIHtcbiAqICAgICAgIHRyeSB7XG4gKiAgICAgICAgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz1cImhsanNcIj4nICtcbiAqICAgICAgICAgICAgICAgIGhsanMuaGlnaGxpZ2h0KHN0ciwgeyBsYW5ndWFnZTogbGFuZywgaWdub3JlSWxsZWdhbHM6IHRydWUgfSkudmFsdWUgK1xuICogICAgICAgICAgICAgICAgJzwvY29kZT48L3ByZT4nO1xuICogICAgICAgfSBjYXRjaCAoX18pIHt9XG4gKiAgICAgfVxuICpcbiAqICAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJobGpzXCI+JyArIG1kLnV0aWxzLmVzY2FwZUh0bWwoc3RyKSArICc8L2NvZGU+PC9wcmU+JztcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiovXG5mdW5jdGlvbiBNYXJrZG93bkl0IChwcmVzZXROYW1lLCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNYXJrZG93bkl0KSkge1xuICAgIHJldHVybiBuZXcgTWFya2Rvd25JdChwcmVzZXROYW1lLCBvcHRpb25zKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgaWYgKCF1dGlscy5pc1N0cmluZyhwcmVzZXROYW1lKSkge1xuICAgICAgb3B0aW9ucyA9IHByZXNldE5hbWUgfHwge31cbiAgICAgIHByZXNldE5hbWUgPSAnZGVmYXVsdCdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFya2Rvd25JdCNpbmxpbmUgLT4gUGFyc2VySW5saW5lXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbUGFyc2VySW5saW5lXV0uIFlvdSBtYXkgbmVlZCBpdCB0byBhZGQgbmV3IHJ1bGVzIHdoZW5cbiAgICogd3JpdGluZyBwbHVnaW5zLiBGb3Igc2ltcGxlIHJ1bGVzIGNvbnRyb2wgdXNlIFtbTWFya2Rvd25JdC5kaXNhYmxlXV0gYW5kXG4gICAqIFtbTWFya2Rvd25JdC5lbmFibGVdXS5cbiAgICoqL1xuICB0aGlzLmlubGluZSA9IG5ldyBQYXJzZXJJbmxpbmUoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2Jsb2NrIC0+IFBhcnNlckJsb2NrXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbUGFyc2VyQmxvY2tdXS4gWW91IG1heSBuZWVkIGl0IHRvIGFkZCBuZXcgcnVsZXMgd2hlblxuICAgKiB3cml0aW5nIHBsdWdpbnMuIEZvciBzaW1wbGUgcnVsZXMgY29udHJvbCB1c2UgW1tNYXJrZG93bkl0LmRpc2FibGVdXSBhbmRcbiAgICogW1tNYXJrZG93bkl0LmVuYWJsZV1dLlxuICAgKiovXG4gIHRoaXMuYmxvY2sgPSBuZXcgUGFyc2VyQmxvY2soKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2NvcmUgLT4gQ29yZVxuICAgKlxuICAgKiBJbnN0YW5jZSBvZiBbW0NvcmVdXSBjaGFpbiBleGVjdXRvci4gWW91IG1heSBuZWVkIGl0IHRvIGFkZCBuZXcgcnVsZXMgd2hlblxuICAgKiB3cml0aW5nIHBsdWdpbnMuIEZvciBzaW1wbGUgcnVsZXMgY29udHJvbCB1c2UgW1tNYXJrZG93bkl0LmRpc2FibGVdXSBhbmRcbiAgICogW1tNYXJrZG93bkl0LmVuYWJsZV1dLlxuICAgKiovXG4gIHRoaXMuY29yZSA9IG5ldyBQYXJzZXJDb3JlKClcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNyZW5kZXJlciAtPiBSZW5kZXJlclxuICAgKlxuICAgKiBJbnN0YW5jZSBvZiBbW1JlbmRlcmVyXV0uIFVzZSBpdCB0byBtb2RpZnkgb3V0cHV0IGxvb2suIE9yIHRvIGFkZCByZW5kZXJpbmdcbiAgICogcnVsZXMgZm9yIG5ldyB0b2tlbiB0eXBlcywgZ2VuZXJhdGVkIGJ5IHBsdWdpbnMuXG4gICAqXG4gICAqICMjIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gICAqXG4gICAqIGZ1bmN0aW9uIG15VG9rZW4odG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2VsZikge1xuICAgKiAgIC8vLi4uXG4gICAqICAgcmV0dXJuIHJlc3VsdDtcbiAgICogfTtcbiAgICpcbiAgICogbWQucmVuZGVyZXIucnVsZXNbJ215X3Rva2VuJ10gPSBteVRva2VuXG4gICAqIGBgYFxuICAgKlxuICAgKiBTZWUgW1tSZW5kZXJlcl1dIGRvY3MgYW5kIFtzb3VyY2UgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9yZW5kZXJlci5tanMpLlxuICAgKiovXG4gIHRoaXMucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2xpbmtpZnkgLT4gTGlua2lmeUl0XG4gICAqXG4gICAqIFtsaW5raWZ5LWl0XShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbGlua2lmeS1pdCkgaW5zdGFuY2UuXG4gICAqIFVzZWQgYnkgW2xpbmtpZnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcnVsZXNfY29yZS9saW5raWZ5Lm1qcylcbiAgICogcnVsZS5cbiAgICoqL1xuICB0aGlzLmxpbmtpZnkgPSBuZXcgTGlua2lmeUl0KClcblxuICAvKipcbiAgICogTWFya2Rvd25JdCN2YWxpZGF0ZUxpbmsodXJsKSAtPiBCb29sZWFuXG4gICAqXG4gICAqIExpbmsgdmFsaWRhdGlvbiBmdW5jdGlvbi4gQ29tbW9uTWFyayBhbGxvd3MgdG9vIG11Y2ggaW4gbGlua3MuIEJ5IGRlZmF1bHRcbiAgICogd2UgZGlzYWJsZSBgamF2YXNjcmlwdDpgLCBgdmJzY3JpcHQ6YCwgYGZpbGU6YCBzY2hlbWFzLCBhbmQgYWxtb3N0IGFsbCBgZGF0YTouLi5gIHNjaGVtYXNcbiAgICogZXhjZXB0IHNvbWUgZW1iZWRkZWQgaW1hZ2UgdHlwZXMuXG4gICAqXG4gICAqIFlvdSBjYW4gY2hhbmdlIHRoaXMgYmVoYXZpb3VyOlxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAgICogLy8gZW5hYmxlIGV2ZXJ5dGhpbmdcbiAgICogbWQudmFsaWRhdGVMaW5rID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgKiBgYGBcbiAgICoqL1xuICB0aGlzLnZhbGlkYXRlTGluayA9IHZhbGlkYXRlTGlua1xuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I25vcm1hbGl6ZUxpbmsodXJsKSAtPiBTdHJpbmdcbiAgICpcbiAgICogRnVuY3Rpb24gdXNlZCB0byBlbmNvZGUgbGluayB1cmwgdG8gYSBtYWNoaW5lLXJlYWRhYmxlIGZvcm1hdCxcbiAgICogd2hpY2ggaW5jbHVkZXMgdXJsLWVuY29kaW5nLCBwdW55Y29kZSwgZXRjLlxuICAgKiovXG4gIHRoaXMubm9ybWFsaXplTGluayA9IG5vcm1hbGl6ZUxpbmtcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNub3JtYWxpemVMaW5rVGV4dCh1cmwpIC0+IFN0cmluZ1xuICAgKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRlY29kZSBsaW5rIHVybCB0byBhIGh1bWFuLXJlYWRhYmxlIGZvcm1hdGBcbiAgICoqL1xuICB0aGlzLm5vcm1hbGl6ZUxpbmtUZXh0ID0gbm9ybWFsaXplTGlua1RleHRcblxuICAvLyBFeHBvc2UgdXRpbHMgJiBoZWxwZXJzIGZvciBlYXN5IGFjY2VzIGZyb20gcGx1Z2luc1xuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I3V0aWxzIC0+IHV0aWxzXG4gICAqXG4gICAqIEFzc29ydGVkIHV0aWxpdHkgZnVuY3Rpb25zLCB1c2VmdWwgdG8gd3JpdGUgcGx1Z2lucy4gU2VlIGRldGFpbHNcbiAgICogW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvY29tbW9uL3V0aWxzLm1qcykuXG4gICAqKi9cbiAgdGhpcy51dGlscyA9IHV0aWxzXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjaGVscGVycyAtPiBoZWxwZXJzXG4gICAqXG4gICAqIExpbmsgY29tcG9uZW50cyBwYXJzZXIgZnVuY3Rpb25zLCB1c2VmdWwgdG8gd3JpdGUgcGx1Z2lucy4gU2VlIGRldGFpbHNcbiAgICogW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvaGVscGVycykuXG4gICAqKi9cbiAgdGhpcy5oZWxwZXJzID0gdXRpbHMuYXNzaWduKHt9LCBoZWxwZXJzKVxuXG4gIHRoaXMub3B0aW9ucyA9IHt9XG4gIHRoaXMuY29uZmlndXJlKHByZXNldE5hbWUpXG5cbiAgaWYgKG9wdGlvbnMpIHsgdGhpcy5zZXQob3B0aW9ucykgfVxufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBNYXJrZG93bkl0LnNldChvcHRpb25zKVxuICpcbiAqIFNldCBwYXJzZXIgb3B0aW9ucyAoaW4gdGhlIHNhbWUgZm9ybWF0IGFzIGluIGNvbnN0cnVjdG9yKS4gUHJvYmFibHksIHlvdVxuICogd2lsbCBuZXZlciBuZWVkIGl0LCBidXQgeW91IGNhbiBjaGFuZ2Ugb3B0aW9ucyBhZnRlciBjb25zdHJ1Y3RvciBjYWxsLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKClcbiAqICAgICAgICAgICAgIC5zZXQoeyBodG1sOiB0cnVlLCBicmVha3M6IHRydWUgfSlcbiAqICAgICAgICAgICAgIC5zZXQoeyB0eXBvZ3JhcGhlciwgdHJ1ZSB9KTtcbiAqIGBgYFxuICpcbiAqIF9fTm90ZTpfXyBUbyBhY2hpZXZlIHRoZSBiZXN0IHBvc3NpYmxlIHBlcmZvcm1hbmNlLCBkb24ndCBtb2RpZnkgYVxuICogYG1hcmtkb3duLWl0YCBpbnN0YW5jZSBvcHRpb25zIG9uIHRoZSBmbHkuIElmIHlvdSBuZWVkIG11bHRpcGxlIGNvbmZpZ3VyYXRpb25zXG4gKiBpdCdzIGJlc3QgdG8gY3JlYXRlIG11bHRpcGxlIGluc3RhbmNlcyBhbmQgaW5pdGlhbGl6ZSBlYWNoIHdpdGggc2VwYXJhdGVcbiAqIGNvbmZpZy5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHV0aWxzLmFzc2lnbih0aGlzLm9wdGlvbnMsIG9wdGlvbnMpXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGUsIGludGVybmFsXG4gKiBNYXJrZG93bkl0LmNvbmZpZ3VyZShwcmVzZXRzKVxuICpcbiAqIEJhdGNoIGxvYWQgb2YgYWxsIG9wdGlvbnMgYW5kIGNvbXBlbmVudCBzZXR0aW5ncy4gVGhpcyBpcyBpbnRlcm5hbCBtZXRob2QsXG4gKiBhbmQgeW91IHByb2JhYmx5IHdpbGwgbm90IG5lZWQgaXQuIEJ1dCBpZiB5b3Ugd2lsbCAtIHNlZSBhdmFpbGFibGUgcHJlc2V0c1xuICogYW5kIGRhdGEgc3RydWN0dXJlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvdHJlZS9tYXN0ZXIvbGliL3ByZXNldHMpXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBwcmVzZXRzIGluc3RlYWQgb2YgZGlyZWN0IGNvbmZpZyBsb2Fkcy4gVGhhdFxuICogd2lsbCBnaXZlIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggbmV4dCB2ZXJzaW9ucy5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uIChwcmVzZXRzKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHByZXNldHMpKSB7XG4gICAgY29uc3QgcHJlc2V0TmFtZSA9IHByZXNldHNcbiAgICBwcmVzZXRzID0gY29uZmlnW3ByZXNldE5hbWVdXG4gICAgaWYgKCFwcmVzZXRzKSB7IHRocm93IG5ldyBFcnJvcignV3JvbmcgYG1hcmtkb3duLWl0YCBwcmVzZXQgXCInICsgcHJlc2V0TmFtZSArICdcIiwgY2hlY2sgbmFtZScpIH1cbiAgfVxuXG4gIGlmICghcHJlc2V0cykgeyB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIGBtYXJrZG93bi1pdGAgcHJlc2V0LCBjYW5cXCd0IGJlIGVtcHR5JykgfVxuXG4gIGlmIChwcmVzZXRzLm9wdGlvbnMpIHsgc2VsZi5zZXQocHJlc2V0cy5vcHRpb25zKSB9XG5cbiAgaWYgKHByZXNldHMuY29tcG9uZW50cykge1xuICAgIE9iamVjdC5rZXlzKHByZXNldHMuY29tcG9uZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgaWYgKHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlcykge1xuICAgICAgICBzZWxmW25hbWVdLnJ1bGVyLmVuYWJsZU9ubHkocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzKVxuICAgICAgfVxuICAgICAgaWYgKHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlczIpIHtcbiAgICAgICAgc2VsZltuYW1lXS5ydWxlcjIuZW5hYmxlT25seShwcmVzZXRzLmNvbXBvbmVudHNbbmFtZV0ucnVsZXMyKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTWFya2Rvd25JdC5lbmFibGUobGlzdCwgaWdub3JlSW52YWxpZClcbiAqIC0gbGlzdCAoU3RyaW5nfEFycmF5KTogcnVsZSBuYW1lIG9yIGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBlbmFibGVcbiAqIC0gaWdub3JlSW52YWxpZCAoQm9vbGVhbik6IHNldCBgdHJ1ZWAgdG8gaWdub3JlIGVycm9ycyB3aGVuIHJ1bGUgbm90IGZvdW5kLlxuICpcbiAqIEVuYWJsZSBsaXN0IG9yIHJ1bGVzLiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgZmluZCBhcHByb3ByaWF0ZSBjb21wb25lbnRzLFxuICogY29udGFpbmluZyBydWxlcyB3aXRoIGdpdmVuIG5hbWVzLiBJZiBydWxlIG5vdCBmb3VuZCwgYW5kIGBpZ25vcmVJbnZhbGlkYFxuICogbm90IHNldCAtIHRocm93cyBleGNlcHRpb24uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKVxuICogICAgICAgICAgICAgLmVuYWJsZShbJ3N1YicsICdzdXAnXSlcbiAqICAgICAgICAgICAgIC5kaXNhYmxlKCdzbWFydHF1b3RlcycpO1xuICogYGBgXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBsZXQgcmVzdWx0ID0gW11cblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgWydjb3JlJywgJ2Jsb2NrJywgJ2lubGluZSddLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzW2NoYWluXS5ydWxlci5lbmFibGUobGlzdCwgdHJ1ZSkpXG4gIH0sIHRoaXMpXG5cbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLmlubGluZS5ydWxlcjIuZW5hYmxlKGxpc3QsIHRydWUpKVxuXG4gIGNvbnN0IG1pc3NlZCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiByZXN1bHQuaW5kZXhPZihuYW1lKSA8IDAgfSlcblxuICBpZiAobWlzc2VkLmxlbmd0aCAmJiAhaWdub3JlSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWFya2Rvd25JdC4gRmFpbGVkIHRvIGVuYWJsZSB1bmtub3duIHJ1bGUocyk6ICcgKyBtaXNzZWQpXG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBNYXJrZG93bkl0LmRpc2FibGUobGlzdCwgaWdub3JlSW52YWxpZClcbiAqIC0gbGlzdCAoU3RyaW5nfEFycmF5KTogcnVsZSBuYW1lIG9yIGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBkaXNhYmxlLlxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogVGhlIHNhbWUgYXMgW1tNYXJrZG93bkl0LmVuYWJsZV1dLCBidXQgdHVybiBzcGVjaWZpZWQgcnVsZXMgb2ZmLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGxldCByZXN1bHQgPSBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBbJ2NvcmUnLCAnYmxvY2snLCAnaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAoY2hhaW4pIHtcbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXNbY2hhaW5dLnJ1bGVyLmRpc2FibGUobGlzdCwgdHJ1ZSkpXG4gIH0sIHRoaXMpXG5cbiAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh0aGlzLmlubGluZS5ydWxlcjIuZGlzYWJsZShsaXN0LCB0cnVlKSlcblxuICBjb25zdCBtaXNzZWQgPSBsaXN0LmZpbHRlcihmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gcmVzdWx0LmluZGV4T2YobmFtZSkgPCAwIH0pXG5cbiAgaWYgKG1pc3NlZC5sZW5ndGggJiYgIWlnbm9yZUludmFsaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcmtkb3duSXQuIEZhaWxlZCB0byBkaXNhYmxlIHVua25vd24gcnVsZShzKTogJyArIG1pc3NlZClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBNYXJrZG93bkl0LnVzZShwbHVnaW4sIHBhcmFtcylcbiAqXG4gKiBMb2FkIHNwZWNpZmllZCBwbHVnaW4gd2l0aCBnaXZlbiBwYXJhbXMgaW50byBjdXJyZW50IHBhcnNlciBpbnN0YW5jZS5cbiAqIEl0J3MganVzdCBhIHN1Z2FyIHRvIGNhbGwgYHBsdWdpbihtZCwgcGFyYW1zKWAgd2l0aCBjdXJyaW5nLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgaXRlcmF0b3IgPSByZXF1aXJlKCdtYXJrZG93bi1pdC1mb3ItaW5saW5lJyk7XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKClcbiAqICAgICAgICAgICAgIC51c2UoaXRlcmF0b3IsICdmb29fcmVwbGFjZScsICd0ZXh0JywgZnVuY3Rpb24gKHRva2VucywgaWR4KSB7XG4gKiAgICAgICAgICAgICAgIHRva2Vuc1tpZHhdLmNvbnRlbnQgPSB0b2tlbnNbaWR4XS5jb250ZW50LnJlcGxhY2UoL2Zvby9nLCAnYmFyJyk7XG4gKiAgICAgICAgICAgICB9KTtcbiAqIGBgYFxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gKHBsdWdpbiAvKiwgcGFyYW1zLCAuLi4gKi8pIHtcbiAgY29uc3QgYXJncyA9IFt0aGlzXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSlcbiAgcGx1Z2luLmFwcGx5KHBsdWdpbiwgYXJncylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGludGVybmFsXG4gKiBNYXJrZG93bkl0LnBhcnNlKHNyYywgZW52KSAtPiBBcnJheVxuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogUGFyc2UgaW5wdXQgc3RyaW5nIGFuZCByZXR1cm4gbGlzdCBvZiBibG9jayB0b2tlbnMgKHNwZWNpYWwgdG9rZW4gdHlwZVxuICogXCJpbmxpbmVcIiB3aWxsIGNvbnRhaW4gbGlzdCBvZiBpbmxpbmUgdG9rZW5zKS4gWW91IHNob3VsZCBub3QgY2FsbCB0aGlzXG4gKiBtZXRob2QgZGlyZWN0bHksIHVudGlsIHlvdSB3cml0ZSBjdXN0b20gcmVuZGVyZXIgKGZvciBleGFtcGxlLCB0byBwcm9kdWNlXG4gKiBBU1QpLlxuICpcbiAqIGBlbnZgIGlzIHVzZWQgdG8gcGFzcyBkYXRhIGJldHdlZW4gXCJkaXN0cmlidXRlZFwiIHJ1bGVzIGFuZCByZXR1cm4gYWRkaXRpb25hbFxuICogbWV0YWRhdGEgbGlrZSByZWZlcmVuY2UgaW5mbywgbmVlZGVkIGZvciB0aGUgcmVuZGVyZXIuIEl0IGFsc28gY2FuIGJlIHVzZWQgdG9cbiAqIGluamVjdCBkYXRhIGluIHNwZWNpZmljIGNhc2VzLiBVc3VhbGx5LCB5b3Ugd2lsbCBiZSBvayB0byBwYXNzIGB7fWAsXG4gKiBhbmQgdGhlbiBwYXNzIHVwZGF0ZWQgb2JqZWN0IHRvIHJlbmRlcmVyLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc3JjLCBlbnYpIHtcbiAgaWYgKHR5cGVvZiBzcmMgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBkYXRhIHNob3VsZCBiZSBhIFN0cmluZycpXG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IG5ldyB0aGlzLmNvcmUuU3RhdGUoc3JjLCB0aGlzLCBlbnYpXG5cbiAgdGhpcy5jb3JlLnByb2Nlc3Moc3RhdGUpXG5cbiAgcmV0dXJuIHN0YXRlLnRva2Vuc1xufVxuXG4vKipcbiAqIE1hcmtkb3duSXQucmVuZGVyKHNyYyBbLCBlbnZdKSAtPiBTdHJpbmdcbiAqIC0gc3JjIChTdHJpbmcpOiBzb3VyY2Ugc3RyaW5nXG4gKiAtIGVudiAoT2JqZWN0KTogZW52aXJvbm1lbnQgc2FuZGJveFxuICpcbiAqIFJlbmRlciBtYXJrZG93biBzdHJpbmcgaW50byBodG1sLiBJdCBkb2VzIGFsbCBtYWdpYyBmb3IgeW91IDopLlxuICpcbiAqIGBlbnZgIGNhbiBiZSB1c2VkIHRvIGluamVjdCBhZGRpdGlvbmFsIG1ldGFkYXRhIChge31gIGJ5IGRlZmF1bHQpLlxuICogQnV0IHlvdSB3aWxsIG5vdCBuZWVkIGl0IHdpdGggaGlnaCBwcm9iYWJpbGl0eS4gU2VlIGFsc28gY29tbWVudFxuICogaW4gW1tNYXJrZG93bkl0LnBhcnNlXV0uXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoc3JjLCBlbnYpIHtcbiAgZW52ID0gZW52IHx8IHt9XG5cbiAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2Uoc3JjLCBlbnYpLCB0aGlzLm9wdGlvbnMsIGVudilcbn1cblxuLyoqIGludGVybmFsXG4gKiBNYXJrZG93bkl0LnBhcnNlSW5saW5lKHNyYywgZW52KSAtPiBBcnJheVxuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogVGhlIHNhbWUgYXMgW1tNYXJrZG93bkl0LnBhcnNlXV0gYnV0IHNraXAgYWxsIGJsb2NrIHJ1bGVzLiBJdCByZXR1cm5zIHRoZVxuICogYmxvY2sgdG9rZW5zIGxpc3Qgd2l0aCB0aGUgc2luZ2xlIGBpbmxpbmVgIGVsZW1lbnQsIGNvbnRhaW5pbmcgcGFyc2VkIGlubGluZVxuICogdG9rZW5zIGluIGBjaGlsZHJlbmAgcHJvcGVydHkuIEFsc28gdXBkYXRlcyBgZW52YCBvYmplY3QuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5wYXJzZUlubGluZSA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBjb25zdCBzdGF0ZSA9IG5ldyB0aGlzLmNvcmUuU3RhdGUoc3JjLCB0aGlzLCBlbnYpXG5cbiAgc3RhdGUuaW5saW5lTW9kZSA9IHRydWVcbiAgdGhpcy5jb3JlLnByb2Nlc3Moc3RhdGUpXG5cbiAgcmV0dXJuIHN0YXRlLnRva2Vuc1xufVxuXG4vKipcbiAqIE1hcmtkb3duSXQucmVuZGVySW5saW5lKHNyYyBbLCBlbnZdKSAtPiBTdHJpbmdcbiAqIC0gc3JjIChTdHJpbmcpOiBzb3VyY2Ugc3RyaW5nXG4gKiAtIGVudiAoT2JqZWN0KTogZW52aXJvbm1lbnQgc2FuZGJveFxuICpcbiAqIFNpbWlsYXIgdG8gW1tNYXJrZG93bkl0LnJlbmRlcl1dIGJ1dCBmb3Igc2luZ2xlIHBhcmFncmFwaCBjb250ZW50LiBSZXN1bHRcbiAqIHdpbGwgTk9UIGJlIHdyYXBwZWQgaW50byBgPHA+YCB0YWdzLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUucmVuZGVySW5saW5lID0gZnVuY3Rpb24gKHNyYywgZW52KSB7XG4gIGVudiA9IGVudiB8fCB7fVxuXG4gIHJldHVybiB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnBhcnNlSW5saW5lKHNyYywgZW52KSwgdGhpcy5vcHRpb25zLCBlbnYpXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1hcmtkb3duSXRcbiIsIi8qKiBpbnRlcm5hbFxuICogY2xhc3MgUGFyc2VyQmxvY2tcbiAqXG4gKiBCbG9jay1sZXZlbCB0b2tlbml6ZXIuXG4gKiovXG5cbmltcG9ydCBSdWxlciBmcm9tICcuL3J1bGVyLm1qcydcbmltcG9ydCBTdGF0ZUJsb2NrIGZyb20gJy4vcnVsZXNfYmxvY2svc3RhdGVfYmxvY2subWpzJ1xuXG5pbXBvcnQgcl90YWJsZSBmcm9tICcuL3J1bGVzX2Jsb2NrL3RhYmxlLm1qcydcbmltcG9ydCByX2NvZGUgZnJvbSAnLi9ydWxlc19ibG9jay9jb2RlLm1qcydcbmltcG9ydCByX2ZlbmNlIGZyb20gJy4vcnVsZXNfYmxvY2svZmVuY2UubWpzJ1xuaW1wb3J0IHJfYmxvY2txdW90ZSBmcm9tICcuL3J1bGVzX2Jsb2NrL2Jsb2NrcXVvdGUubWpzJ1xuaW1wb3J0IHJfaHIgZnJvbSAnLi9ydWxlc19ibG9jay9oci5tanMnXG5pbXBvcnQgcl9saXN0IGZyb20gJy4vcnVsZXNfYmxvY2svbGlzdC5tanMnXG5pbXBvcnQgcl9yZWZlcmVuY2UgZnJvbSAnLi9ydWxlc19ibG9jay9yZWZlcmVuY2UubWpzJ1xuaW1wb3J0IHJfaHRtbF9ibG9jayBmcm9tICcuL3J1bGVzX2Jsb2NrL2h0bWxfYmxvY2subWpzJ1xuaW1wb3J0IHJfaGVhZGluZyBmcm9tICcuL3J1bGVzX2Jsb2NrL2hlYWRpbmcubWpzJ1xuaW1wb3J0IHJfbGhlYWRpbmcgZnJvbSAnLi9ydWxlc19ibG9jay9saGVhZGluZy5tanMnXG5pbXBvcnQgcl9wYXJhZ3JhcGggZnJvbSAnLi9ydWxlc19ibG9jay9wYXJhZ3JhcGgubWpzJ1xuXG5jb25zdCBfcnVsZXMgPSBbXG4gIC8vIEZpcnN0IDIgcGFyYW1zIC0gcnVsZSBuYW1lICYgc291cmNlLiBTZWNvbmRhcnkgYXJyYXkgLSBsaXN0IG9mIHJ1bGVzLFxuICAvLyB3aGljaCBjYW4gYmUgdGVybWluYXRlZCBieSB0aGlzIG9uZS5cbiAgWyd0YWJsZScsICAgICAgcl90YWJsZSwgICAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnXV0sXG4gIFsnY29kZScsICAgICAgIHJfY29kZV0sXG4gIFsnZmVuY2UnLCAgICAgIHJfZmVuY2UsICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCddXSxcbiAgWydibG9ja3F1b3RlJywgcl9ibG9ja3F1b3RlLCBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZScsICdsaXN0J11dLFxuICBbJ2hyJywgICAgICAgICByX2hyLCAgICAgICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJywgJ2xpc3QnXV0sXG4gIFsnbGlzdCcsICAgICAgIHJfbGlzdCwgICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnXV0sXG4gIFsncmVmZXJlbmNlJywgIHJfcmVmZXJlbmNlXSxcbiAgWydodG1sX2Jsb2NrJywgcl9odG1sX2Jsb2NrLCBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZSddXSxcbiAgWydoZWFkaW5nJywgICAgcl9oZWFkaW5nLCAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZSddXSxcbiAgWydsaGVhZGluZycsICAgcl9saGVhZGluZ10sXG4gIFsncGFyYWdyYXBoJywgIHJfcGFyYWdyYXBoXVxuXVxuXG4vKipcbiAqIG5ldyBQYXJzZXJCbG9jaygpXG4gKiovXG5mdW5jdGlvbiBQYXJzZXJCbG9jayAoKSB7XG4gIC8qKlxuICAgKiBQYXJzZXJCbG9jayNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBibG9jayBydWxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVyID0gbmV3IFJ1bGVyKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IF9ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIucHVzaChfcnVsZXNbaV1bMF0sIF9ydWxlc1tpXVsxXSwgeyBhbHQ6IChfcnVsZXNbaV1bMl0gfHwgW10pLnNsaWNlKCkgfSlcbiAgfVxufVxuXG4vLyBHZW5lcmF0ZSB0b2tlbnMgZm9yIGlucHV0IHJhbmdlXG4vL1xuUGFyc2VyQmxvY2sucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUpIHtcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcbiAgY29uc3QgbWF4TmVzdGluZyA9IHN0YXRlLm1kLm9wdGlvbnMubWF4TmVzdGluZ1xuICBsZXQgbGluZSA9IHN0YXJ0TGluZVxuICBsZXQgaGFzRW1wdHlMaW5lcyA9IGZhbHNlXG5cbiAgd2hpbGUgKGxpbmUgPCBlbmRMaW5lKSB7XG4gICAgc3RhdGUubGluZSA9IGxpbmUgPSBzdGF0ZS5za2lwRW1wdHlMaW5lcyhsaW5lKVxuICAgIGlmIChsaW5lID49IGVuZExpbmUpIHsgYnJlYWsgfVxuXG4gICAgLy8gVGVybWluYXRpb24gY29uZGl0aW9uIGZvciBuZXN0ZWQgY2FsbHMuXG4gICAgLy8gTmVzdGVkIGNhbGxzIGN1cnJlbnRseSB1c2VkIGZvciBibG9ja3F1b3RlcyAmIGxpc3RzXG4gICAgaWYgKHN0YXRlLnNDb3VudFtsaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAvLyBJZiBuZXN0aW5nIGxldmVsIGV4Y2VlZGVkIC0gc2tpcCB0YWlsIHRvIHRoZSBlbmQuIFRoYXQncyBub3Qgb3JkaW5hcnlcbiAgICAvLyBzaXR1YXRpb24gYW5kIHdlIHNob3VsZCBub3QgY2FyZSBhYm91dCBjb250ZW50LlxuICAgIGlmIChzdGF0ZS5sZXZlbCA+PSBtYXhOZXN0aW5nKSB7XG4gICAgICBzdGF0ZS5saW5lID0gZW5kTGluZVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICAvLyBUcnkgYWxsIHBvc3NpYmxlIHJ1bGVzLlxuICAgIC8vIE9uIHN1Y2Nlc3MsIHJ1bGUgc2hvdWxkOlxuICAgIC8vXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLmxpbmVgXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLnRva2Vuc2BcbiAgICAvLyAtIHJldHVybiB0cnVlXG4gICAgY29uc3QgcHJldkxpbmUgPSBzdGF0ZS5saW5lXG4gICAgbGV0IG9rID0gZmFsc2VcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG9rID0gcnVsZXNbaV0oc3RhdGUsIGxpbmUsIGVuZExpbmUsIGZhbHNlKVxuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIGlmIChwcmV2TGluZSA+PSBzdGF0ZS5saW5lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmxvY2sgcnVsZSBkaWRuJ3QgaW5jcmVtZW50IHN0YXRlLmxpbmVcIilcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHVzZXIgZGlzYWJsZXMgcGFyYWdyYXBoIHJ1bGVcbiAgICBpZiAoIW9rKSB0aHJvdyBuZXcgRXJyb3IoJ25vbmUgb2YgdGhlIGJsb2NrIHJ1bGVzIG1hdGNoZWQnKVxuXG4gICAgLy8gc2V0IHN0YXRlLnRpZ2h0IGlmIHdlIGhhZCBhbiBlbXB0eSBsaW5lIGJlZm9yZSBjdXJyZW50IHRhZ1xuICAgIC8vIGkuZS4gbGF0ZXN0IGVtcHR5IGxpbmUgc2hvdWxkIG5vdCBjb3VudFxuICAgIHN0YXRlLnRpZ2h0ID0gIWhhc0VtcHR5TGluZXNcblxuICAgIC8vIHBhcmFncmFwaCBtaWdodCBcImVhdFwiIG9uZSBuZXdsaW5lIGFmdGVyIGl0IGluIG5lc3RlZCBsaXN0c1xuICAgIGlmIChzdGF0ZS5pc0VtcHR5KHN0YXRlLmxpbmUgLSAxKSkge1xuICAgICAgaGFzRW1wdHlMaW5lcyA9IHRydWVcbiAgICB9XG5cbiAgICBsaW5lID0gc3RhdGUubGluZVxuXG4gICAgaWYgKGxpbmUgPCBlbmRMaW5lICYmIHN0YXRlLmlzRW1wdHkobGluZSkpIHtcbiAgICAgIGhhc0VtcHR5TGluZXMgPSB0cnVlXG4gICAgICBsaW5lKytcbiAgICAgIHN0YXRlLmxpbmUgPSBsaW5lXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VyQmxvY2sucGFyc2Uoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG4gKlxuICogUHJvY2VzcyBpbnB1dCBzdHJpbmcgYW5kIHB1c2ggYmxvY2sgdG9rZW5zIGludG8gYG91dFRva2Vuc2BcbiAqKi9cblBhcnNlckJsb2NrLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzcmMsIG1kLCBlbnYsIG91dFRva2Vucykge1xuICBpZiAoIXNyYykgeyByZXR1cm4gfVxuXG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuU3RhdGUoc3JjLCBtZCwgZW52LCBvdXRUb2tlbnMpXG5cbiAgdGhpcy50b2tlbml6ZShzdGF0ZSwgc3RhdGUubGluZSwgc3RhdGUubGluZU1heClcbn1cblxuUGFyc2VyQmxvY2sucHJvdG90eXBlLlN0YXRlID0gU3RhdGVCbG9ja1xuXG5leHBvcnQgZGVmYXVsdCBQYXJzZXJCbG9ja1xuIiwiLyoqIGludGVybmFsXG4gKiBjbGFzcyBDb3JlXG4gKlxuICogVG9wLWxldmVsIHJ1bGVzIGV4ZWN1dG9yLiBHbHVlcyBibG9jay9pbmxpbmUgcGFyc2VycyBhbmQgZG9lcyBpbnRlcm1lZGlhdGVcbiAqIHRyYW5zZm9ybWF0aW9ucy5cbiAqKi9cblxuaW1wb3J0IFJ1bGVyIGZyb20gJy4vcnVsZXIubWpzJ1xuaW1wb3J0IFN0YXRlQ29yZSBmcm9tICcuL3J1bGVzX2NvcmUvc3RhdGVfY29yZS5tanMnXG5cbmltcG9ydCByX25vcm1hbGl6ZSBmcm9tICcuL3J1bGVzX2NvcmUvbm9ybWFsaXplLm1qcydcbmltcG9ydCByX2Jsb2NrIGZyb20gJy4vcnVsZXNfY29yZS9ibG9jay5tanMnXG5pbXBvcnQgcl9pbmxpbmUgZnJvbSAnLi9ydWxlc19jb3JlL2lubGluZS5tanMnXG5pbXBvcnQgcl9saW5raWZ5IGZyb20gJy4vcnVsZXNfY29yZS9saW5raWZ5Lm1qcydcbmltcG9ydCByX3JlcGxhY2VtZW50cyBmcm9tICcuL3J1bGVzX2NvcmUvcmVwbGFjZW1lbnRzLm1qcydcbmltcG9ydCByX3NtYXJ0cXVvdGVzIGZyb20gJy4vcnVsZXNfY29yZS9zbWFydHF1b3Rlcy5tanMnXG5pbXBvcnQgcl90ZXh0X2pvaW4gZnJvbSAnLi9ydWxlc19jb3JlL3RleHRfam9pbi5tanMnXG5cbmNvbnN0IF9ydWxlcyA9IFtcbiAgWydub3JtYWxpemUnLCAgICAgIHJfbm9ybWFsaXplXSxcbiAgWydibG9jaycsICAgICAgICAgIHJfYmxvY2tdLFxuICBbJ2lubGluZScsICAgICAgICAgcl9pbmxpbmVdLFxuICBbJ2xpbmtpZnknLCAgICAgICAgcl9saW5raWZ5XSxcbiAgWydyZXBsYWNlbWVudHMnLCAgIHJfcmVwbGFjZW1lbnRzXSxcbiAgWydzbWFydHF1b3RlcycsICAgIHJfc21hcnRxdW90ZXNdLFxuICAvLyBgdGV4dF9qb2luYCBmaW5kcyBgdGV4dF9zcGVjaWFsYCB0b2tlbnMgKGZvciBlc2NhcGUgc2VxdWVuY2VzKVxuICAvLyBhbmQgam9pbnMgdGhlbSB3aXRoIHRoZSByZXN0IG9mIHRoZSB0ZXh0XG4gIFsndGV4dF9qb2luJywgICAgICByX3RleHRfam9pbl1cbl1cblxuLyoqXG4gKiBuZXcgQ29yZSgpXG4gKiovXG5mdW5jdGlvbiBDb3JlICgpIHtcbiAgLyoqXG4gICAqIENvcmUjcnVsZXIgLT4gUnVsZXJcbiAgICpcbiAgICogW1tSdWxlcl1dIGluc3RhbmNlLiBLZWVwIGNvbmZpZ3VyYXRpb24gb2YgY29yZSBydWxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVyID0gbmV3IFJ1bGVyKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IF9ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIucHVzaChfcnVsZXNbaV1bMF0sIF9ydWxlc1tpXVsxXSlcbiAgfVxufVxuXG4vKipcbiAqIENvcmUucHJvY2VzcyhzdGF0ZSlcbiAqXG4gKiBFeGVjdXRlcyBjb3JlIGNoYWluIHJ1bGVzLlxuICoqL1xuQ29yZS5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpXG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBydWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBydWxlc1tpXShzdGF0ZSlcbiAgfVxufVxuXG5Db3JlLnByb3RvdHlwZS5TdGF0ZSA9IFN0YXRlQ29yZVxuXG5leHBvcnQgZGVmYXVsdCBDb3JlXG4iLCIvKiogaW50ZXJuYWxcbiAqIGNsYXNzIFBhcnNlcklubGluZVxuICpcbiAqIFRva2VuaXplcyBwYXJhZ3JhcGggY29udGVudC5cbiAqKi9cblxuaW1wb3J0IFJ1bGVyIGZyb20gJy4vcnVsZXIubWpzJ1xuaW1wb3J0IFN0YXRlSW5saW5lIGZyb20gJy4vcnVsZXNfaW5saW5lL3N0YXRlX2lubGluZS5tanMnXG5cbmltcG9ydCByX3RleHQgZnJvbSAnLi9ydWxlc19pbmxpbmUvdGV4dC5tanMnXG5pbXBvcnQgcl9saW5raWZ5IGZyb20gJy4vcnVsZXNfaW5saW5lL2xpbmtpZnkubWpzJ1xuaW1wb3J0IHJfbmV3bGluZSBmcm9tICcuL3J1bGVzX2lubGluZS9uZXdsaW5lLm1qcydcbmltcG9ydCByX2VzY2FwZSBmcm9tICcuL3J1bGVzX2lubGluZS9lc2NhcGUubWpzJ1xuaW1wb3J0IHJfYmFja3RpY2tzIGZyb20gJy4vcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5tanMnXG5pbXBvcnQgcl9zdHJpa2V0aHJvdWdoIGZyb20gJy4vcnVsZXNfaW5saW5lL3N0cmlrZXRocm91Z2gubWpzJ1xuaW1wb3J0IHJfZW1waGFzaXMgZnJvbSAnLi9ydWxlc19pbmxpbmUvZW1waGFzaXMubWpzJ1xuaW1wb3J0IHJfbGluayBmcm9tICcuL3J1bGVzX2lubGluZS9saW5rLm1qcydcbmltcG9ydCByX2ltYWdlIGZyb20gJy4vcnVsZXNfaW5saW5lL2ltYWdlLm1qcydcbmltcG9ydCByX2F1dG9saW5rIGZyb20gJy4vcnVsZXNfaW5saW5lL2F1dG9saW5rLm1qcydcbmltcG9ydCByX2h0bWxfaW5saW5lIGZyb20gJy4vcnVsZXNfaW5saW5lL2h0bWxfaW5saW5lLm1qcydcbmltcG9ydCByX2VudGl0eSBmcm9tICcuL3J1bGVzX2lubGluZS9lbnRpdHkubWpzJ1xuXG5pbXBvcnQgcl9iYWxhbmNlX3BhaXJzIGZyb20gJy4vcnVsZXNfaW5saW5lL2JhbGFuY2VfcGFpcnMubWpzJ1xuaW1wb3J0IHJfZnJhZ21lbnRzX2pvaW4gZnJvbSAnLi9ydWxlc19pbmxpbmUvZnJhZ21lbnRzX2pvaW4ubWpzJ1xuXG4vLyBQYXJzZXIgcnVsZXNcblxuY29uc3QgX3J1bGVzID0gW1xuICBbJ3RleHQnLCAgICAgICAgICAgIHJfdGV4dF0sXG4gIFsnbGlua2lmeScsICAgICAgICAgcl9saW5raWZ5XSxcbiAgWyduZXdsaW5lJywgICAgICAgICByX25ld2xpbmVdLFxuICBbJ2VzY2FwZScsICAgICAgICAgIHJfZXNjYXBlXSxcbiAgWydiYWNrdGlja3MnLCAgICAgICByX2JhY2t0aWNrc10sXG4gIFsnc3RyaWtldGhyb3VnaCcsICAgcl9zdHJpa2V0aHJvdWdoLnRva2VuaXplXSxcbiAgWydlbXBoYXNpcycsICAgICAgICByX2VtcGhhc2lzLnRva2VuaXplXSxcbiAgWydsaW5rJywgICAgICAgICAgICByX2xpbmtdLFxuICBbJ2ltYWdlJywgICAgICAgICAgIHJfaW1hZ2VdLFxuICBbJ2F1dG9saW5rJywgICAgICAgIHJfYXV0b2xpbmtdLFxuICBbJ2h0bWxfaW5saW5lJywgICAgIHJfaHRtbF9pbmxpbmVdLFxuICBbJ2VudGl0eScsICAgICAgICAgIHJfZW50aXR5XVxuXVxuXG4vLyBgcnVsZTJgIHJ1bGVzZXQgd2FzIGNyZWF0ZWQgc3BlY2lmaWNhbGx5IGZvciBlbXBoYXNpcy9zdHJpa2V0aHJvdWdoXG4vLyBwb3N0LXByb2Nlc3NpbmcgYW5kIG1heSBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4vL1xuLy8gRG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nIGV4Y2VwdCBwYWlycyAocGx1Z2lucyB3b3JraW5nIHdpdGggYGJhbGFuY2VfcGFpcnNgKS5cbi8vXG5jb25zdCBfcnVsZXMyID0gW1xuICBbJ2JhbGFuY2VfcGFpcnMnLCAgIHJfYmFsYW5jZV9wYWlyc10sXG4gIFsnc3RyaWtldGhyb3VnaCcsICAgcl9zdHJpa2V0aHJvdWdoLnBvc3RQcm9jZXNzXSxcbiAgWydlbXBoYXNpcycsICAgICAgICByX2VtcGhhc2lzLnBvc3RQcm9jZXNzXSxcbiAgLy8gcnVsZXMgZm9yIHBhaXJzIHNlcGFyYXRlICcqKicgaW50byBpdHMgb3duIHRleHQgdG9rZW5zLCB3aGljaCBtYXkgYmUgbGVmdCB1bnVzZWQsXG4gIC8vIHJ1bGUgYmVsb3cgbWVyZ2VzIHVudXNlZCBzZWdtZW50cyBiYWNrIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRleHRcbiAgWydmcmFnbWVudHNfam9pbicsICByX2ZyYWdtZW50c19qb2luXVxuXVxuXG4vKipcbiAqIG5ldyBQYXJzZXJJbmxpbmUoKVxuICoqL1xuZnVuY3Rpb24gUGFyc2VySW5saW5lICgpIHtcbiAgLyoqXG4gICAqIFBhcnNlcklubGluZSNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBpbmxpbmUgcnVsZXMuXG4gICAqKi9cbiAgdGhpcy5ydWxlciA9IG5ldyBSdWxlcigpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBfcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aGlzLnJ1bGVyLnB1c2goX3J1bGVzW2ldWzBdLCBfcnVsZXNbaV1bMV0pXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VySW5saW5lI3J1bGVyMiAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIFNlY29uZCBydWxlciB1c2VkIGZvciBwb3N0LXByb2Nlc3NpbmdcbiAgICogKGUuZy4gaW4gZW1waGFzaXMtbGlrZSBydWxlcykuXG4gICAqKi9cbiAgdGhpcy5ydWxlcjIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzMi5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIyLnB1c2goX3J1bGVzMltpXVswXSwgX3J1bGVzMltpXVsxXSlcbiAgfVxufVxuXG4vLyBTa2lwIHNpbmdsZSB0b2tlbiBieSBydW5uaW5nIGFsbCBydWxlcyBpbiB2YWxpZGF0aW9uIG1vZGU7XG4vLyByZXR1cm5zIGB0cnVlYCBpZiBhbnkgcnVsZSByZXBvcnRlZCBzdWNjZXNzXG4vL1xuUGFyc2VySW5saW5lLnByb3RvdHlwZS5za2lwVG9rZW4gPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY29uc3QgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG4gIGNvbnN0IG1heE5lc3RpbmcgPSBzdGF0ZS5tZC5vcHRpb25zLm1heE5lc3RpbmdcbiAgY29uc3QgY2FjaGUgPSBzdGF0ZS5jYWNoZVxuXG4gIGlmICh0eXBlb2YgY2FjaGVbcG9zXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0ZS5wb3MgPSBjYWNoZVtwb3NdXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgb2sgPSBmYWxzZVxuXG4gIGlmIChzdGF0ZS5sZXZlbCA8IG1heE5lc3RpbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAvLyBJbmNyZW1lbnQgc3RhdGUubGV2ZWwgYW5kIGRlY3JlbWVudCBpdCBsYXRlciB0byBsaW1pdCByZWN1cnNpb24uXG4gICAgICAvLyBJdCdzIGhhcm1sZXNzIHRvIGRvIGhlcmUsIGJlY2F1c2Ugbm8gdG9rZW5zIGFyZSBjcmVhdGVkLiBCdXQgaWRlYWxseSxcbiAgICAgIC8vIHdlJ2QgbmVlZCBhIHNlcGFyYXRlIHByaXZhdGUgc3RhdGUgdmFyaWFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgIC8vXG4gICAgICBzdGF0ZS5sZXZlbCsrXG4gICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCB0cnVlKVxuICAgICAgc3RhdGUubGV2ZWwtLVxuXG4gICAgICBpZiAob2spIHtcbiAgICAgICAgaWYgKHBvcyA+PSBzdGF0ZS5wb3MpIHsgdGhyb3cgbmV3IEVycm9yKFwiaW5saW5lIHJ1bGUgZGlkbid0IGluY3JlbWVudCBzdGF0ZS5wb3NcIikgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUb28gbXVjaCBuZXN0aW5nLCBqdXN0IHNraXAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoLlxuICAgIC8vXG4gICAgLy8gTk9URTogdGhpcyB3aWxsIGNhdXNlIGxpbmtzIHRvIGJlaGF2ZSBpbmNvcnJlY3RseSBpbiB0aGUgZm9sbG93aW5nIGNhc2UsXG4gICAgLy8gICAgICAgd2hlbiBhbiBhbW91bnQgb2YgYFtgIGlzIGV4YWN0bHkgZXF1YWwgdG8gYG1heE5lc3RpbmcgKyAxYDpcbiAgICAvL1xuICAgIC8vICAgICAgIFtbW1tbW1tbW1tbW1tbW1tbW1tbW2Zvb10oKVxuICAgIC8vXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCB3aGVuIENNIHN0YW5kYXJkIHdpbGwgYWxsb3cgbmVzdGVkIGxpbmtzXG4gICAgLy8gICAgICAgKHdlIGNhbiByZXBsYWNlIGl0IGJ5IHByZXZlbnRpbmcgbGlua3MgZnJvbSBiZWluZyBwYXJzZWQgaW5cbiAgICAvLyAgICAgICB2YWxpZGF0aW9uIG1vZGUpXG4gICAgLy9cbiAgICBzdGF0ZS5wb3MgPSBzdGF0ZS5wb3NNYXhcbiAgfVxuXG4gIGlmICghb2spIHsgc3RhdGUucG9zKysgfVxuICBjYWNoZVtwb3NdID0gc3RhdGUucG9zXG59XG5cbi8vIEdlbmVyYXRlIHRva2VucyBmb3IgaW5wdXQgcmFuZ2Vcbi8vXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnRva2VuaXplID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcbiAgY29uc3QgbGVuID0gcnVsZXMubGVuZ3RoXG4gIGNvbnN0IGVuZCA9IHN0YXRlLnBvc01heFxuICBjb25zdCBtYXhOZXN0aW5nID0gc3RhdGUubWQub3B0aW9ucy5tYXhOZXN0aW5nXG5cbiAgd2hpbGUgKHN0YXRlLnBvcyA8IGVuZCkge1xuICAgIC8vIFRyeSBhbGwgcG9zc2libGUgcnVsZXMuXG4gICAgLy8gT24gc3VjY2VzcywgcnVsZSBzaG91bGQ6XG4gICAgLy9cbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUucG9zYFxuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS50b2tlbnNgXG4gICAgLy8gLSByZXR1cm4gdHJ1ZVxuICAgIGNvbnN0IHByZXZQb3MgPSBzdGF0ZS5wb3NcbiAgICBsZXQgb2sgPSBmYWxzZVxuXG4gICAgaWYgKHN0YXRlLmxldmVsIDwgbWF4TmVzdGluZykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBvayA9IHJ1bGVzW2ldKHN0YXRlLCBmYWxzZSlcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgaWYgKHByZXZQb3MgPj0gc3RhdGUucG9zKSB7IHRocm93IG5ldyBFcnJvcihcImlubGluZSBydWxlIGRpZG4ndCBpbmNyZW1lbnQgc3RhdGUucG9zXCIpIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9rKSB7XG4gICAgICBpZiAoc3RhdGUucG9zID49IGVuZCkgeyBicmVhayB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjW3N0YXRlLnBvcysrXVxuICB9XG5cbiAgaWYgKHN0YXRlLnBlbmRpbmcpIHtcbiAgICBzdGF0ZS5wdXNoUGVuZGluZygpXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXJJbmxpbmUucGFyc2Uoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG4gKlxuICogUHJvY2VzcyBpbnB1dCBzdHJpbmcgYW5kIHB1c2ggaW5saW5lIHRva2VucyBpbnRvIGBvdXRUb2tlbnNgXG4gKiovXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgbWQsIGVudiwgb3V0VG9rZW5zKSB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuU3RhdGUoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpXG5cbiAgdGhpcy50b2tlbml6ZShzdGF0ZSlcblxuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcnVsZXNbaV0oc3RhdGUpXG4gIH1cbn1cblxuUGFyc2VySW5saW5lLnByb3RvdHlwZS5TdGF0ZSA9IFN0YXRlSW5saW5lXG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcklubGluZVxuIiwiLy8gQ29tbW9ubWFyayBkZWZhdWx0IG9wdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcHRpb25zOiB7XG4gICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICBodG1sOiB0cnVlLFxuXG4gICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIHhodG1sT3V0OiB0cnVlLFxuXG4gICAgLy8gQ29udmVydCAnXFxuJyBpbiBwYXJhZ3JhcGhzIGludG8gPGJyPlxuICAgIGJyZWFrczogZmFsc2UsXG5cbiAgICAvLyBDU1MgbGFuZ3VhZ2UgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzXG4gICAgbGFuZ1ByZWZpeDogJ2xhbmd1YWdlLScsXG5cbiAgICAvLyBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0cyB0byBsaW5rc1xuICAgIGxpbmtpZnk6IGZhbHNlLFxuXG4gICAgLy8gRW5hYmxlIHNvbWUgbGFuZ3VhZ2UtbmV1dHJhbCByZXBsYWNlbWVudHMgKyBxdW90ZXMgYmVhdXRpZmljYXRpb25cbiAgICB0eXBvZ3JhcGhlcjogZmFsc2UsXG5cbiAgICAvLyBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50IHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQsXG4gICAgLy8gYW5kIHNtYXJ0cXVvdGVzIG9uLiBDb3VsZCBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYW4gQXJyYXkuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgJ8KrwrvigJ7igJwnIGZvciBSdXNzaWFuLCAn4oCe4oCc4oCa4oCYJyBmb3IgR2VybWFuLFxuICAgIC8vIGFuZCBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddIGZvciBGcmVuY2ggKGluY2x1ZGluZyBuYnNwKS5cbiAgICBxdW90ZXM6ICdcXHUyMDFjXFx1MjAxZFxcdTIwMThcXHUyMDE5JywgLyog4oCc4oCd4oCY4oCZICovXG5cbiAgICAvLyBIaWdobGlnaHRlciBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwsXG4gICAgLy8gb3IgJycgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkIGV4dGVybmFseS5cbiAgICAvLyBJZiByZXN1bHQgc3RhcnRzIHdpdGggPHByZS4uLiBpbnRlcm5hbCB3cmFwcGVyIGlzIHNraXBwZWQuXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiAoLypzdHIsIGxhbmcqLykgeyByZXR1cm4gJyc7IH1cbiAgICAvL1xuICAgIGhpZ2hsaWdodDogbnVsbCxcblxuICAgIC8vIEludGVybmFsIHByb3RlY3Rpb24sIHJlY3Vyc2lvbiBsaW1pdFxuICAgIG1heE5lc3Rpbmc6IDIwXG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuXG4gICAgY29yZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdibG9jaycsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAndGV4dF9qb2luJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBibG9jazoge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAnY29kZScsXG4gICAgICAgICdmZW5jZScsXG4gICAgICAgICdoZWFkaW5nJyxcbiAgICAgICAgJ2hyJyxcbiAgICAgICAgJ2h0bWxfYmxvY2snLFxuICAgICAgICAnbGhlYWRpbmcnLFxuICAgICAgICAnbGlzdCcsXG4gICAgICAgICdyZWZlcmVuY2UnLFxuICAgICAgICAncGFyYWdyYXBoJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBpbmxpbmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdhdXRvbGluaycsXG4gICAgICAgICdiYWNrdGlja3MnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZW50aXR5JyxcbiAgICAgICAgJ2VzY2FwZScsXG4gICAgICAgICdodG1sX2lubGluZScsXG4gICAgICAgICdpbWFnZScsXG4gICAgICAgICdsaW5rJyxcbiAgICAgICAgJ25ld2xpbmUnLFxuICAgICAgICAndGV4dCdcbiAgICAgIF0sXG4gICAgICBydWxlczI6IFtcbiAgICAgICAgJ2JhbGFuY2VfcGFpcnMnLFxuICAgICAgICAnZW1waGFzaXMnLFxuICAgICAgICAnZnJhZ21lbnRzX2pvaW4nXG4gICAgICBdXG4gICAgfVxuICB9XG59XG4iLCIvLyBtYXJrZG93bi1pdCBkZWZhdWx0IG9wdGlvbnNcblxuZXhwb3J0IGRlZmF1bHQge1xuICBvcHRpb25zOiB7XG4gICAgLy8gRW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2VcbiAgICBodG1sOiBmYWxzZSxcblxuICAgIC8vIFVzZSAnLycgdG8gY2xvc2Ugc2luZ2xlIHRhZ3MgKDxiciAvPilcbiAgICB4aHRtbE91dDogZmFsc2UsXG5cbiAgICAvLyBDb252ZXJ0ICdcXG4nIGluIHBhcmFncmFwaHMgaW50byA8YnI+XG4gICAgYnJlYWtzOiBmYWxzZSxcblxuICAgIC8vIENTUyBsYW5ndWFnZSBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3NcbiAgICBsYW5nUHJlZml4OiAnbGFuZ3VhZ2UtJyxcblxuICAgIC8vIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHRzIHRvIGxpbmtzXG4gICAgbGlua2lmeTogZmFsc2UsXG5cbiAgICAvLyBFbmFibGUgc29tZSBsYW5ndWFnZS1uZXV0cmFsIHJlcGxhY2VtZW50cyArIHF1b3RlcyBiZWF1dGlmaWNhdGlvblxuICAgIHR5cG9ncmFwaGVyOiBmYWxzZSxcblxuICAgIC8vIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnQgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCxcbiAgICAvLyBhbmQgc21hcnRxdW90ZXMgb24uIENvdWxkIGJlIGVpdGhlciBhIFN0cmluZyBvciBhbiBBcnJheS5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSAnwqvCu+KAnuKAnCcgZm9yIFJ1c3NpYW4sICfigJ7igJzigJrigJgnIGZvciBHZXJtYW4sXG4gICAgLy8gYW5kIFsnwqtcXHhBMCcsICdcXHhBMMK7JywgJ+KAuVxceEEwJywgJ1xceEEw4oC6J10gZm9yIEZyZW5jaCAoaW5jbHVkaW5nIG5ic3ApLlxuICAgIHF1b3RlczogJ1xcdTIwMWNcXHUyMDFkXFx1MjAxOFxcdTIwMTknLCAvKiDigJzigJ3igJjigJkgKi9cblxuICAgIC8vIEhpZ2hsaWdodGVyIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTCxcbiAgICAvLyBvciAnJyBpZiB0aGUgc291cmNlIHN0cmluZyBpcyBub3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIGVzY2FwZWQgZXh0ZXJuYWx5LlxuICAgIC8vIElmIHJlc3VsdCBzdGFydHMgd2l0aCA8cHJlLi4uIGludGVybmFsIHdyYXBwZXIgaXMgc2tpcHBlZC5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uICgvKnN0ciwgbGFuZyovKSB7IHJldHVybiAnJzsgfVxuICAgIC8vXG4gICAgaGlnaGxpZ2h0OiBudWxsLFxuXG4gICAgLy8gSW50ZXJuYWwgcHJvdGVjdGlvbiwgcmVjdXJzaW9uIGxpbWl0XG4gICAgbWF4TmVzdGluZzogMTAwXG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIGNvcmU6IHt9LFxuICAgIGJsb2NrOiB7fSxcbiAgICBpbmxpbmU6IHt9XG4gIH1cbn1cbiIsIi8vIFwiWmVyb1wiIHByZXNldCwgd2l0aCBub3RoaW5nIGVuYWJsZWQuIFVzZWZ1bCBmb3IgbWFudWFsIGNvbmZpZ3VyaW5nIG9mIHNpbXBsZVxuLy8gbW9kZXMuIEZvciBleGFtcGxlLCB0byBwYXJzZSBib2xkL2l0YWxpYyBvbmx5LlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9wdGlvbnM6IHtcbiAgICAvLyBFbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZVxuICAgIGh0bWw6IGZhbHNlLFxuXG4gICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIHhodG1sT3V0OiBmYWxzZSxcblxuICAgIC8vIENvbnZlcnQgJ1xcbicgaW4gcGFyYWdyYXBocyBpbnRvIDxicj5cbiAgICBicmVha3M6IGZhbHNlLFxuXG4gICAgLy8gQ1NTIGxhbmd1YWdlIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrc1xuICAgIGxhbmdQcmVmaXg6ICdsYW5ndWFnZS0nLFxuXG4gICAgLy8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dHMgdG8gbGlua3NcbiAgICBsaW5raWZ5OiBmYWxzZSxcblxuICAgIC8vIEVuYWJsZSBzb21lIGxhbmd1YWdlLW5ldXRyYWwgcmVwbGFjZW1lbnRzICsgcXVvdGVzIGJlYXV0aWZpY2F0aW9uXG4gICAgdHlwb2dyYXBoZXI6IGZhbHNlLFxuXG4gICAgLy8gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudCBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkLFxuICAgIC8vIGFuZCBzbWFydHF1b3RlcyBvbi4gQ291bGQgYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGFuIEFycmF5LlxuICAgIC8vXG4gICAgLy8gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlICfCq8K74oCe4oCcJyBmb3IgUnVzc2lhbiwgJ+KAnuKAnOKAmuKAmCcgZm9yIEdlcm1hbixcbiAgICAvLyBhbmQgWyfCq1xceEEwJywgJ1xceEEwwrsnLCAn4oC5XFx4QTAnLCAnXFx4QTDigLonXSBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gICAgcXVvdGVzOiAnXFx1MjAxY1xcdTIwMWRcXHUyMDE4XFx1MjAxOScsIC8qIOKAnOKAneKAmOKAmSAqL1xuXG4gICAgLy8gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLFxuICAgIC8vIG9yICcnIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgZXNjYXBlZCBleHRlcm5hbHkuXG4gICAgLy8gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24gKC8qc3RyLCBsYW5nKi8pIHsgcmV0dXJuICcnOyB9XG4gICAgLy9cbiAgICBoaWdobGlnaHQ6IG51bGwsXG5cbiAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgICBtYXhOZXN0aW5nOiAyMFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcblxuICAgIGNvcmU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAnYmxvY2snLFxuICAgICAgICAnaW5saW5lJyxcbiAgICAgICAgJ3RleHRfam9pbidcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgYmxvY2s6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgICdwYXJhZ3JhcGgnXG4gICAgICBdXG4gICAgfSxcblxuICAgIGlubGluZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ3RleHQnXG4gICAgICBdLFxuICAgICAgcnVsZXMyOiBbXG4gICAgICAgICdiYWxhbmNlX3BhaXJzJyxcbiAgICAgICAgJ2ZyYWdtZW50c19qb2luJ1xuICAgICAgXVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBjbGFzcyBSZW5kZXJlclxuICpcbiAqIEdlbmVyYXRlcyBIVE1MIGZyb20gcGFyc2VkIHRva2VuIHN0cmVhbS4gRWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnRcbiAqIGNvcHkgb2YgcnVsZXMuIFRob3NlIGNhbiBiZSByZXdyaXR0ZW4gd2l0aCBlYXNlLiBBbHNvLCB5b3UgY2FuIGFkZCBuZXdcbiAqIHJ1bGVzIGlmIHlvdSBjcmVhdGUgcGx1Z2luIGFuZCBhZGRzIG5ldyB0b2tlbiB0eXBlcy5cbiAqKi9cblxuaW1wb3J0IHsgYXNzaWduLCB1bmVzY2FwZUFsbCwgZXNjYXBlSHRtbCB9IGZyb20gJy4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgZGVmYXVsdF9ydWxlcyA9IHt9XG5cbmRlZmF1bHRfcnVsZXMuY29kZV9pbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2xmKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cblxuICByZXR1cm4gICc8Y29kZScgKyBzbGYucmVuZGVyQXR0cnModG9rZW4pICsgJz4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHRva2VuLmNvbnRlbnQpICtcbiAgICAgICAgICAnPC9jb2RlPidcbn1cblxuZGVmYXVsdF9ydWxlcy5jb2RlX2Jsb2NrID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG5cbiAgcmV0dXJuICAnPHByZScgKyBzbGYucmVuZGVyQXR0cnModG9rZW4pICsgJz48Y29kZT4nICtcbiAgICAgICAgICBlc2NhcGVIdG1sKHRva2Vuc1tpZHhdLmNvbnRlbnQpICtcbiAgICAgICAgICAnPC9jb2RlPjwvcHJlPlxcbidcbn1cblxuZGVmYXVsdF9ydWxlcy5mZW5jZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzbGYpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuICBjb25zdCBpbmZvID0gdG9rZW4uaW5mbyA/IHVuZXNjYXBlQWxsKHRva2VuLmluZm8pLnRyaW0oKSA6ICcnXG4gIGxldCBsYW5nTmFtZSA9ICcnXG4gIGxldCBsYW5nQXR0cnMgPSAnJ1xuXG4gIGlmIChpbmZvKSB7XG4gICAgY29uc3QgYXJyID0gaW5mby5zcGxpdCgvKFxccyspL2cpXG4gICAgbGFuZ05hbWUgPSBhcnJbMF1cbiAgICBsYW5nQXR0cnMgPSBhcnIuc2xpY2UoMikuam9pbignJylcbiAgfVxuXG4gIGxldCBoaWdobGlnaHRlZFxuICBpZiAob3B0aW9ucy5oaWdobGlnaHQpIHtcbiAgICBoaWdobGlnaHRlZCA9IG9wdGlvbnMuaGlnaGxpZ2h0KHRva2VuLmNvbnRlbnQsIGxhbmdOYW1lLCBsYW5nQXR0cnMpIHx8IGVzY2FwZUh0bWwodG9rZW4uY29udGVudClcbiAgfSBlbHNlIHtcbiAgICBoaWdobGlnaHRlZCA9IGVzY2FwZUh0bWwodG9rZW4uY29udGVudClcbiAgfVxuXG4gIGlmIChoaWdobGlnaHRlZC5pbmRleE9mKCc8cHJlJykgPT09IDApIHtcbiAgICByZXR1cm4gaGlnaGxpZ2h0ZWQgKyAnXFxuJ1xuICB9XG5cbiAgLy8gSWYgbGFuZ3VhZ2UgZXhpc3RzLCBpbmplY3QgY2xhc3MgZ2VudGx5LCB3aXRob3V0IG1vZGlmeWluZyBvcmlnaW5hbCB0b2tlbi5cbiAgLy8gTWF5IGJlLCBvbmUgZGF5IHdlIHdpbGwgYWRkIC5kZWVwQ2xvbmUoKSBmb3IgdG9rZW4gYW5kIHNpbXBsaWZ5IHRoaXMgcGFydCwgYnV0XG4gIC8vIG5vdyB3ZSBwcmVmZXIgdG8ga2VlcCB0aGluZ3MgbG9jYWwuXG4gIGlmIChpbmZvKSB7XG4gICAgY29uc3QgaSA9IHRva2VuLmF0dHJJbmRleCgnY2xhc3MnKVxuICAgIGNvbnN0IHRtcEF0dHJzID0gdG9rZW4uYXR0cnMgPyB0b2tlbi5hdHRycy5zbGljZSgpIDogW11cblxuICAgIGlmIChpIDwgMCkge1xuICAgICAgdG1wQXR0cnMucHVzaChbJ2NsYXNzJywgb3B0aW9ucy5sYW5nUHJlZml4ICsgbGFuZ05hbWVdKVxuICAgIH0gZWxzZSB7XG4gICAgICB0bXBBdHRyc1tpXSA9IHRtcEF0dHJzW2ldLnNsaWNlKClcbiAgICAgIHRtcEF0dHJzW2ldWzFdICs9ICcgJyArIG9wdGlvbnMubGFuZ1ByZWZpeCArIGxhbmdOYW1lXG4gICAgfVxuXG4gICAgLy8gRmFrZSB0b2tlbiBqdXN0IHRvIHJlbmRlciBhdHRyaWJ1dGVzXG4gICAgY29uc3QgdG1wVG9rZW4gPSB7XG4gICAgICBhdHRyczogdG1wQXR0cnNcbiAgICB9XG5cbiAgICByZXR1cm4gYDxwcmU+PGNvZGUke3NsZi5yZW5kZXJBdHRycyh0bXBUb2tlbil9PiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPlxcbmBcbiAgfVxuXG4gIHJldHVybiBgPHByZT48Y29kZSR7c2xmLnJlbmRlckF0dHJzKHRva2VuKX0+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+XFxuYFxufVxuXG5kZWZhdWx0X3J1bGVzLmltYWdlID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG5cbiAgLy8gXCJhbHRcIiBhdHRyIE1VU1QgYmUgc2V0LCBldmVuIGlmIGVtcHR5LiBCZWNhdXNlIGl0J3MgbWFuZGF0b3J5IGFuZFxuICAvLyBzaG91bGQgYmUgcGxhY2VkIG9uIHByb3BlciBwb3NpdGlvbiBmb3IgdGVzdHMuXG4gIC8vXG4gIC8vIFJlcGxhY2UgY29udGVudCB3aXRoIGFjdHVhbCB2YWx1ZVxuXG4gIHRva2VuLmF0dHJzW3Rva2VuLmF0dHJJbmRleCgnYWx0JyldWzFdID1cbiAgICBzbGYucmVuZGVySW5saW5lQXNUZXh0KHRva2VuLmNoaWxkcmVuLCBvcHRpb25zLCBlbnYpXG5cbiAgcmV0dXJuIHNsZi5yZW5kZXJUb2tlbih0b2tlbnMsIGlkeCwgb3B0aW9ucylcbn1cblxuZGVmYXVsdF9ydWxlcy5oYXJkYnJlYWsgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMgLyosIGVudiAqLykge1xuICByZXR1cm4gb3B0aW9ucy54aHRtbE91dCA/ICc8YnIgLz5cXG4nIDogJzxicj5cXG4nXG59XG5kZWZhdWx0X3J1bGVzLnNvZnRicmVhayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucyAvKiwgZW52ICovKSB7XG4gIHJldHVybiBvcHRpb25zLmJyZWFrcyA/IChvcHRpb25zLnhodG1sT3V0ID8gJzxiciAvPlxcbicgOiAnPGJyPlxcbicpIDogJ1xcbidcbn1cblxuZGVmYXVsdF9ydWxlcy50ZXh0ID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuIGVzY2FwZUh0bWwodG9rZW5zW2lkeF0uY29udGVudClcbn1cblxuZGVmYXVsdF9ydWxlcy5odG1sX2Jsb2NrID0gZnVuY3Rpb24gKHRva2VucywgaWR4IC8qLCBvcHRpb25zLCBlbnYgKi8pIHtcbiAgcmV0dXJuIHRva2Vuc1tpZHhdLmNvbnRlbnRcbn1cbmRlZmF1bHRfcnVsZXMuaHRtbF9pbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gdG9rZW5zW2lkeF0uY29udGVudFxufVxuXG4vKipcbiAqIG5ldyBSZW5kZXJlcigpXG4gKlxuICogQ3JlYXRlcyBuZXcgW1tSZW5kZXJlcl1dIGluc3RhbmNlIGFuZCBmaWxsIFtbUmVuZGVyZXIjcnVsZXNdXSB3aXRoIGRlZmF1bHRzLlxuICoqL1xuZnVuY3Rpb24gUmVuZGVyZXIgKCkge1xuICAvKipcbiAgICogUmVuZGVyZXIjcnVsZXMgLT4gT2JqZWN0XG4gICAqXG4gICAqIENvbnRhaW5zIHJlbmRlciBydWxlcyBmb3IgdG9rZW5zLiBDYW4gYmUgdXBkYXRlZCBhbmQgZXh0ZW5kZWQuXG4gICAqXG4gICAqICMjIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gICAqXG4gICAqIG1kLnJlbmRlcmVyLnJ1bGVzLnN0cm9uZ19vcGVuICA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICc8Yj4nOyB9O1xuICAgKiBtZC5yZW5kZXJlci5ydWxlcy5zdHJvbmdfY2xvc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnPC9iPic7IH07XG4gICAqXG4gICAqIHZhciByZXN1bHQgPSBtZC5yZW5kZXJJbmxpbmUoLi4uKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEVhY2ggcnVsZSBpcyBjYWxsZWQgYXMgaW5kZXBlbmRlbnQgc3RhdGljIGZ1bmN0aW9uIHdpdGggZml4ZWQgc2lnbmF0dXJlOlxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGZ1bmN0aW9uIG15X3Rva2VuX3JlbmRlcih0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCByZW5kZXJlcikge1xuICAgKiAgIC8vIC4uLlxuICAgKiAgIHJldHVybiByZW5kZXJlZEhUTUw7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBbc291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcmVuZGVyZXIubWpzKVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVzID0gYXNzaWduKHt9LCBkZWZhdWx0X3J1bGVzKVxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlckF0dHJzKHRva2VuKSAtPiBTdHJpbmdcbiAqXG4gKiBSZW5kZXIgdG9rZW4gYXR0cmlidXRlcyB0byBzdHJpbmcuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyQXR0cnMgPSBmdW5jdGlvbiByZW5kZXJBdHRycyAodG9rZW4pIHtcbiAgbGV0IGksIGwsIHJlc3VsdFxuXG4gIGlmICghdG9rZW4uYXR0cnMpIHsgcmV0dXJuICcnIH1cblxuICByZXN1bHQgPSAnJ1xuXG4gIGZvciAoaSA9IDAsIGwgPSB0b2tlbi5hdHRycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICByZXN1bHQgKz0gJyAnICsgZXNjYXBlSHRtbCh0b2tlbi5hdHRyc1tpXVswXSkgKyAnPVwiJyArIGVzY2FwZUh0bWwodG9rZW4uYXR0cnNbaV1bMV0pICsgJ1wiJ1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlclRva2VuKHRva2VucywgaWR4LCBvcHRpb25zKSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb2YgdG9rZW5zXG4gKiAtIGlkeCAoTnVtYmVkKTogdG9rZW4gaW5kZXggdG8gcmVuZGVyXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHBhcmFtcyBvZiBwYXJzZXIgaW5zdGFuY2VcbiAqXG4gKiBEZWZhdWx0IHRva2VuIHJlbmRlcmVyLiBDYW4gYmUgb3ZlcnJpZGVuIGJ5IGN1c3RvbSBmdW5jdGlvblxuICogaW4gW1tSZW5kZXJlciNydWxlc11dLlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlclRva2VuID0gZnVuY3Rpb24gcmVuZGVyVG9rZW4gKHRva2VucywgaWR4LCBvcHRpb25zKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgLy8gVGlnaHQgbGlzdCBwYXJhZ3JhcGhzXG4gIGlmICh0b2tlbi5oaWRkZW4pIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEluc2VydCBhIG5ld2xpbmUgYmV0d2VlbiBoaWRkZW4gcGFyYWdyYXBoIGFuZCBzdWJzZXF1ZW50IG9wZW5pbmdcbiAgLy8gYmxvY2stbGV2ZWwgdGFnLlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgaGVyZSB3ZSBzaG91bGQgaW5zZXJ0IGEgbmV3bGluZSBiZWZvcmUgYmxvY2txdW90ZTpcbiAgLy8gIC0gYVxuICAvLyAgICA+XG4gIC8vXG4gIGlmICh0b2tlbi5ibG9jayAmJiB0b2tlbi5uZXN0aW5nICE9PSAtMSAmJiBpZHggJiYgdG9rZW5zW2lkeCAtIDFdLmhpZGRlbikge1xuICAgIHJlc3VsdCArPSAnXFxuJ1xuICB9XG5cbiAgLy8gQWRkIHRva2VuIG5hbWUsIGUuZy4gYDxpbWdgXG4gIHJlc3VsdCArPSAodG9rZW4ubmVzdGluZyA9PT0gLTEgPyAnPC8nIDogJzwnKSArIHRva2VuLnRhZ1xuXG4gIC8vIEVuY29kZSBhdHRyaWJ1dGVzLCBlLmcuIGA8aW1nIHNyYz1cImZvb1wiYFxuICByZXN1bHQgKz0gdGhpcy5yZW5kZXJBdHRycyh0b2tlbilcblxuICAvLyBBZGQgYSBzbGFzaCBmb3Igc2VsZi1jbG9zaW5nIHRhZ3MsIGUuZy4gYDxpbWcgc3JjPVwiZm9vXCIgL2BcbiAgaWYgKHRva2VuLm5lc3RpbmcgPT09IDAgJiYgb3B0aW9ucy54aHRtbE91dCkge1xuICAgIHJlc3VsdCArPSAnIC8nXG4gIH1cblxuICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGFkZCBhIG5ld2xpbmUgYWZ0ZXIgdGhpcyB0YWdcbiAgbGV0IG5lZWRMZiA9IGZhbHNlXG4gIGlmICh0b2tlbi5ibG9jaykge1xuICAgIG5lZWRMZiA9IHRydWVcblxuICAgIGlmICh0b2tlbi5uZXN0aW5nID09PSAxKSB7XG4gICAgICBpZiAoaWR4ICsgMSA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV4dFRva2VuID0gdG9rZW5zW2lkeCArIDFdXG5cbiAgICAgICAgaWYgKG5leHRUb2tlbi50eXBlID09PSAnaW5saW5lJyB8fCBuZXh0VG9rZW4uaGlkZGVuKSB7XG4gICAgICAgICAgLy8gQmxvY2stbGV2ZWwgdGFnIGNvbnRhaW5pbmcgYW4gaW5saW5lIHRhZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5lZWRMZiA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV4dFRva2VuLm5lc3RpbmcgPT09IC0xICYmIG5leHRUb2tlbi50YWcgPT09IHRva2VuLnRhZykge1xuICAgICAgICAgIC8vIE9wZW5pbmcgdGFnICsgY2xvc2luZyB0YWcgb2YgdGhlIHNhbWUgdHlwZS4gRS5nLiBgPGxpPjwvbGk+YC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5lZWRMZiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXN1bHQgKz0gbmVlZExmID8gJz5cXG4nIDogJz4nXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlbmRlcmVyLnJlbmRlcklubGluZSh0b2tlbnMsIG9wdGlvbnMsIGVudikgLT4gU3RyaW5nXG4gKiAtIHRva2VucyAoQXJyYXkpOiBsaXN0IG9uIGJsb2NrIHRva2VucyB0byByZW5kZXJcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcGFyYW1zIG9mIHBhcnNlciBpbnN0YW5jZVxuICogLSBlbnYgKE9iamVjdCk6IGFkZGl0aW9uYWwgZGF0YSBmcm9tIHBhcnNlZCBpbnB1dCAocmVmZXJlbmNlcywgZm9yIGV4YW1wbGUpXG4gKlxuICogVGhlIHNhbWUgYXMgW1tSZW5kZXJlci5yZW5kZXJdXSwgYnV0IGZvciBzaW5nbGUgdG9rZW4gb2YgYGlubGluZWAgdHlwZS5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJJbmxpbmUgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlc1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB0eXBlID0gdG9rZW5zW2ldLnR5cGVcblxuICAgIGlmICh0eXBlb2YgcnVsZXNbdHlwZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQgKz0gcnVsZXNbdHlwZV0odG9rZW5zLCBpLCBvcHRpb25zLCBlbnYsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlclRva2VuKHRva2VucywgaSwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKiBpbnRlcm5hbFxuICogUmVuZGVyZXIucmVuZGVySW5saW5lQXNUZXh0KHRva2Vucywgb3B0aW9ucywgZW52KSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb24gYmxvY2sgdG9rZW5zIHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKiAtIGVudiAoT2JqZWN0KTogYWRkaXRpb25hbCBkYXRhIGZyb20gcGFyc2VkIGlucHV0IChyZWZlcmVuY2VzLCBmb3IgZXhhbXBsZSlcbiAqXG4gKiBTcGVjaWFsIGtsdWRnZSBmb3IgaW1hZ2UgYGFsdGAgYXR0cmlidXRlcyB0byBjb25mb3JtIENvbW1vbk1hcmsgc3BlYy5cbiAqIERvbid0IHRyeSB0byB1c2UgaXQhIFNwZWMgcmVxdWlyZXMgdG8gc2hvdyBgYWx0YCBjb250ZW50IHdpdGggc3RyaXBwZWQgbWFya3VwLFxuICogaW5zdGVhZCBvZiBzaW1wbGUgZXNjYXBpbmcuXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVySW5saW5lQXNUZXh0ID0gZnVuY3Rpb24gKHRva2Vucywgb3B0aW9ucywgZW52KSB7XG4gIGxldCByZXN1bHQgPSAnJ1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzd2l0Y2ggKHRva2Vuc1tpXS50eXBlKSB7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmVzdWx0ICs9IHRva2Vuc1tpXS5jb250ZW50XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlcklubGluZUFzVGV4dCh0b2tlbnNbaV0uY2hpbGRyZW4sIG9wdGlvbnMsIGVudilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2h0bWxfaW5saW5lJzpcbiAgICAgIGNhc2UgJ2h0bWxfYmxvY2snOlxuICAgICAgICByZXN1bHQgKz0gdG9rZW5zW2ldLmNvbnRlbnRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NvZnRicmVhayc6XG4gICAgICBjYXNlICdoYXJkYnJlYWsnOlxuICAgICAgICByZXN1bHQgKz0gJ1xcbidcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGFsbCBvdGhlciB0b2tlbnMgYXJlIHNraXBwZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVuZGVyZXIucmVuZGVyKHRva2Vucywgb3B0aW9ucywgZW52KSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb24gYmxvY2sgdG9rZW5zIHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKiAtIGVudiAoT2JqZWN0KTogYWRkaXRpb25hbCBkYXRhIGZyb20gcGFyc2VkIGlucHV0IChyZWZlcmVuY2VzLCBmb3IgZXhhbXBsZSlcbiAqXG4gKiBUYWtlcyB0b2tlbiBzdHJlYW0gYW5kIGdlbmVyYXRlcyBIVE1MLiBQcm9iYWJseSwgeW91IHdpbGwgbmV2ZXIgbmVlZCB0byBjYWxsXG4gKiB0aGlzIG1ldGhvZCBkaXJlY3RseS5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlc1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCB0eXBlID0gdG9rZW5zW2ldLnR5cGVcblxuICAgIGlmICh0eXBlID09PSAnaW5saW5lJykge1xuICAgICAgcmVzdWx0ICs9IHRoaXMucmVuZGVySW5saW5lKHRva2Vuc1tpXS5jaGlsZHJlbiwgb3B0aW9ucywgZW52KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJ1bGVzW3R5cGVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzdWx0ICs9IHJ1bGVzW3R5cGVdKHRva2VucywgaSwgb3B0aW9ucywgZW52LCB0aGlzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5yZW5kZXJUb2tlbih0b2tlbnMsIGksIG9wdGlvbnMsIGVudilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyXG4iLCIvKipcbiAqIGNsYXNzIFJ1bGVyXG4gKlxuICogSGVscGVyIGNsYXNzLCB1c2VkIGJ5IFtbTWFya2Rvd25JdCNjb3JlXV0sIFtbTWFya2Rvd25JdCNibG9ja11dIGFuZFxuICogW1tNYXJrZG93bkl0I2lubGluZV1dIHRvIG1hbmFnZSBzZXF1ZW5jZXMgb2YgZnVuY3Rpb25zIChydWxlcyk6XG4gKlxuICogLSBrZWVwIHJ1bGVzIGluIGRlZmluZWQgb3JkZXJcbiAqIC0gYXNzaWduIHRoZSBuYW1lIHRvIGVhY2ggcnVsZVxuICogLSBlbmFibGUvZGlzYWJsZSBydWxlc1xuICogLSBhZGQvcmVwbGFjZSBydWxlc1xuICogLSBhbGxvdyBhc3NpZ24gcnVsZXMgdG8gYWRkaXRpb25hbCBuYW1lZCBjaGFpbnMgKGluIHRoZSBzYW1lKVxuICogLSBjYWNoZWluZyBsaXN0cyBvZiBhY3RpdmUgcnVsZXNcbiAqXG4gKiBZb3Ugd2lsbCBub3QgbmVlZCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSB1bnRpbCB3cml0ZSBwbHVnaW5zLiBGb3Igc2ltcGxlXG4gKiBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dLCBbW01hcmtkb3duSXQuZW5hYmxlXV0gYW5kXG4gKiBbW01hcmtkb3duSXQudXNlXV0uXG4gKiovXG5cbi8qKlxuICogbmV3IFJ1bGVyKClcbiAqKi9cbmZ1bmN0aW9uIFJ1bGVyICgpIHtcbiAgLy8gTGlzdCBvZiBhZGRlZCBydWxlcy4gRWFjaCBlbGVtZW50IGlzOlxuICAvL1xuICAvLyB7XG4gIC8vICAgbmFtZTogWFhYLFxuICAvLyAgIGVuYWJsZWQ6IEJvb2xlYW4sXG4gIC8vICAgZm46IEZ1bmN0aW9uKCksXG4gIC8vICAgYWx0OiBbIG5hbWUyLCBuYW1lMyBdXG4gIC8vIH1cbiAgLy9cbiAgdGhpcy5fX3J1bGVzX18gPSBbXVxuXG4gIC8vIENhY2hlZCBydWxlIGNoYWlucy5cbiAgLy9cbiAgLy8gRmlyc3QgbGV2ZWwgLSBjaGFpbiBuYW1lLCAnJyBmb3IgZGVmYXVsdC5cbiAgLy8gU2Vjb25kIGxldmVsIC0gZGlnaW5hbCBhbmNob3IgZm9yIGZhc3QgZmlsdGVyaW5nIGJ5IGNoYXJjb2Rlcy5cbiAgLy9cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8vIEhlbHBlciBtZXRob2RzLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHlcblxuLy8gRmluZCBydWxlIGluZGV4IGJ5IG5hbWVcbi8vXG5SdWxlci5wcm90b3R5cGUuX19maW5kX18gPSBmdW5jdGlvbiAobmFtZSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX19ydWxlc19fLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHRoaXMuX19ydWxlc19fW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vLyBCdWlsZCBydWxlcyBsb29rdXAgY2FjaGVcbi8vXG5SdWxlci5wcm90b3R5cGUuX19jb21waWxlX18gPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGNvbnN0IGNoYWlucyA9IFsnJ11cblxuICAvLyBjb2xsZWN0IHVuaXF1ZSBuYW1lc1xuICBzZWxmLl9fcnVsZXNfXy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG4gICAgaWYgKCFydWxlLmVuYWJsZWQpIHsgcmV0dXJuIH1cblxuICAgIHJ1bGUuYWx0LmZvckVhY2goZnVuY3Rpb24gKGFsdE5hbWUpIHtcbiAgICAgIGlmIChjaGFpbnMuaW5kZXhPZihhbHROYW1lKSA8IDApIHtcbiAgICAgICAgY2hhaW5zLnB1c2goYWx0TmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIHNlbGYuX19jYWNoZV9fID0ge31cblxuICBjaGFpbnMuZm9yRWFjaChmdW5jdGlvbiAoY2hhaW4pIHtcbiAgICBzZWxmLl9fY2FjaGVfX1tjaGFpbl0gPSBbXVxuICAgIHNlbGYuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICAgIGlmICghcnVsZS5lbmFibGVkKSB7IHJldHVybiB9XG5cbiAgICAgIGlmIChjaGFpbiAmJiBydWxlLmFsdC5pbmRleE9mKGNoYWluKSA8IDApIHsgcmV0dXJuIH1cblxuICAgICAgc2VsZi5fX2NhY2hlX19bY2hhaW5dLnB1c2gocnVsZS5mbilcbiAgICB9KVxuICB9KVxufVxuXG4vKipcbiAqIFJ1bGVyLmF0KG5hbWUsIGZuIFssIG9wdGlvbnNdKVxuICogLSBuYW1lIChTdHJpbmcpOiBydWxlIG5hbWUgdG8gcmVwbGFjZS5cbiAqIC0gZm4gKEZ1bmN0aW9uKTogbmV3IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IG5ldyBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIFJlcGxhY2UgcnVsZSBieSBuYW1lIHdpdGggbmV3IGZ1bmN0aW9uICYgb3B0aW9ucy4gVGhyb3dzIGVycm9yIGlmIG5hbWUgbm90XG4gKiBmb3VuZC5cbiAqXG4gKiAjIyMjIyBPcHRpb25zOlxuICpcbiAqIC0gX19hbHRfXyAtIGFycmF5IHdpdGggbmFtZXMgb2YgXCJhbHRlcm5hdGVcIiBjaGFpbnMuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIFJlcGxhY2UgZXhpc3RpbmcgdHlwb2dyYXBoZXIgcmVwbGFjZW1lbnQgcnVsZSB3aXRoIG5ldyBvbmU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmNvcmUucnVsZXIuYXQoJ3JlcGxhY2VtZW50cycsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiAobmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3QgaW5kZXggPSB0aGlzLl9fZmluZF9fKG5hbWUpXG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoaW5kZXggPT09IC0xKSB7IHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgbmFtZSkgfVxuXG4gIHRoaXMuX19ydWxlc19fW2luZGV4XS5mbiA9IGZuXG4gIHRoaXMuX19ydWxlc19fW2luZGV4XS5hbHQgPSBvcHQuYWx0IHx8IFtdXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bGVyLmJlZm9yZShiZWZvcmVOYW1lLCBydWxlTmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIGJlZm9yZU5hbWUgKFN0cmluZyk6IG5ldyBydWxlIHdpbGwgYmUgYWRkZWQgYmVmb3JlIHRoaXMgb25lLlxuICogLSBydWxlTmFtZSAoU3RyaW5nKTogbmFtZSBvZiBhZGRlZCBydWxlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIEFkZCBuZXcgcnVsZSB0byBjaGFpbiBiZWZvcmUgb25lIHdpdGggZ2l2ZW4gbmFtZS4gU2VlIGFsc29cbiAqIFtbUnVsZXIuYWZ0ZXJdXSwgW1tSdWxlci5wdXNoXV0uXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuYmxvY2sucnVsZXIuYmVmb3JlKCdwYXJhZ3JhcGgnLCAnbXlfcnVsZScsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUuYmVmb3JlID0gZnVuY3Rpb24gKGJlZm9yZU5hbWUsIHJ1bGVOYW1lLCBmbiwgb3B0aW9ucykge1xuICBjb25zdCBpbmRleCA9IHRoaXMuX19maW5kX18oYmVmb3JlTmFtZSlcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICcgKyBiZWZvcmVOYW1lKSB9XG5cbiAgdGhpcy5fX3J1bGVzX18uc3BsaWNlKGluZGV4LCAwLCB7XG4gICAgbmFtZTogcnVsZU5hbWUsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBmbixcbiAgICBhbHQ6IG9wdC5hbHQgfHwgW11cbiAgfSlcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLyoqXG4gKiBSdWxlci5hZnRlcihhZnRlck5hbWUsIHJ1bGVOYW1lLCBmbiBbLCBvcHRpb25zXSlcbiAqIC0gYWZ0ZXJOYW1lIChTdHJpbmcpOiBuZXcgcnVsZSB3aWxsIGJlIGFkZGVkIGFmdGVyIHRoaXMgb25lLlxuICogLSBydWxlTmFtZSAoU3RyaW5nKTogbmFtZSBvZiBhZGRlZCBydWxlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBydWxlIGZ1bmN0aW9uLlxuICogLSBvcHRpb25zIChPYmplY3QpOiBydWxlIG9wdGlvbnMgKG5vdCBtYW5kYXRvcnkpLlxuICpcbiAqIEFkZCBuZXcgcnVsZSB0byBjaGFpbiBhZnRlciBvbmUgd2l0aCBnaXZlbiBuYW1lLiBTZWUgYWxzb1xuICogW1tSdWxlci5iZWZvcmVdXSwgW1tSdWxlci5wdXNoXV0uXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuaW5saW5lLnJ1bGVyLmFmdGVyKCd0ZXh0JywgJ215X3J1bGUnLCBmdW5jdGlvbiByZXBsYWNlKHN0YXRlKSB7XG4gKiAgIC8vLi4uXG4gKiB9KTtcbiAqIGBgYFxuICoqL1xuUnVsZXIucHJvdG90eXBlLmFmdGVyID0gZnVuY3Rpb24gKGFmdGVyTmFtZSwgcnVsZU5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5fX2ZpbmRfXyhhZnRlck5hbWUpXG4gIGNvbnN0IG9wdCA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoaW5kZXggPT09IC0xKSB7IHRocm93IG5ldyBFcnJvcignUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAnICsgYWZ0ZXJOYW1lKSB9XG5cbiAgdGhpcy5fX3J1bGVzX18uc3BsaWNlKGluZGV4ICsgMSwgMCwge1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIucHVzaChydWxlTmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIHJ1bGVOYW1lIChTdHJpbmcpOiBuYW1lIG9mIGFkZGVkIHJ1bGUuXG4gKiAtIGZuIChGdW5jdGlvbik6IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHJ1bGUgb3B0aW9ucyAobm90IG1hbmRhdG9yeSkuXG4gKlxuICogUHVzaCBuZXcgcnVsZSB0byB0aGUgZW5kIG9mIGNoYWluLiBTZWUgYWxzb1xuICogW1tSdWxlci5iZWZvcmVdXSwgW1tSdWxlci5hZnRlcl1dLlxuICpcbiAqICMjIyMjIE9wdGlvbnM6XG4gKlxuICogLSBfX2FsdF9fIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiBcImFsdGVybmF0ZVwiIGNoYWlucy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICpcbiAqIG1kLmNvcmUucnVsZXIucHVzaCgnbXlfcnVsZScsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIHRoaXMuX19ydWxlc19fLnB1c2goe1xuICAgIG5hbWU6IHJ1bGVOYW1lLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgZm4sXG4gICAgYWx0OiBvcHQuYWx0IHx8IFtdXG4gIH0pXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIuZW5hYmxlKGxpc3QgWywgaWdub3JlSW52YWxpZF0pIC0+IEFycmF5XG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBlbmFibGUuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBFbmFibGUgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcy4gSWYgYW55IHJ1bGUgbmFtZSBub3QgZm91bmQgLSB0aHJvdyBFcnJvci5cbiAqIEVycm9ycyBjYW4gYmUgZGlzYWJsZWQgYnkgc2Vjb25kIHBhcmFtLlxuICpcbiAqIFJldHVybnMgbGlzdCBvZiBmb3VuZCBydWxlIG5hbWVzIChpZiBubyBleGNlcHRpb24gaGFwcGVuZWQpLlxuICpcbiAqIFNlZSBhbHNvIFtbUnVsZXIuZGlzYWJsZV1dLCBbW1J1bGVyLmVuYWJsZU9ubHldXS5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAobGlzdCwgaWdub3JlSW52YWxpZCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHsgbGlzdCA9IFtsaXN0XSB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyBTZWFyY2ggYnkgbmFtZSBhbmQgZW5hYmxlXG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX19maW5kX18obmFtZSlcblxuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICBpZiAoaWdub3JlSW52YWxpZCkgeyByZXR1cm4gfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAnICsgbmFtZSlcbiAgICB9XG4gICAgdGhpcy5fX3J1bGVzX19baWR4XS5lbmFibGVkID0gdHJ1ZVxuICAgIHJlc3VsdC5wdXNoKG5hbWUpXG4gIH0sIHRoaXMpXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSdWxlci5lbmFibGVPbmx5KGxpc3QgWywgaWdub3JlSW52YWxpZF0pXG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBlbmFibGUgKHdoaXRlbGlzdCkuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBFbmFibGUgcnVsZXMgd2l0aCBnaXZlbiBuYW1lcywgYW5kIGRpc2FibGUgZXZlcnl0aGluZyBlbHNlLiBJZiBhbnkgcnVsZSBuYW1lXG4gKiBub3QgZm91bmQgLSB0aHJvdyBFcnJvci4gRXJyb3JzIGNhbiBiZSBkaXNhYmxlZCBieSBzZWNvbmQgcGFyYW0uXG4gKlxuICogU2VlIGFsc28gW1tSdWxlci5kaXNhYmxlXV0sIFtbUnVsZXIuZW5hYmxlXV0uXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZW5hYmxlT25seSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICB0aGlzLl9fcnVsZXNfXy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7IHJ1bGUuZW5hYmxlZCA9IGZhbHNlIH0pXG5cbiAgdGhpcy5lbmFibGUobGlzdCwgaWdub3JlSW52YWxpZClcbn1cblxuLyoqXG4gKiBSdWxlci5kaXNhYmxlKGxpc3QgWywgaWdub3JlSW52YWxpZF0pIC0+IEFycmF5XG4gKiAtIGxpc3QgKFN0cmluZ3xBcnJheSk6IGxpc3Qgb2YgcnVsZSBuYW1lcyB0byBkaXNhYmxlLlxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRGlzYWJsZSBydWxlcyB3aXRoIGdpdmVuIG5hbWVzLiBJZiBhbnkgcnVsZSBuYW1lIG5vdCBmb3VuZCAtIHRocm93IEVycm9yLlxuICogRXJyb3JzIGNhbiBiZSBkaXNhYmxlZCBieSBzZWNvbmQgcGFyYW0uXG4gKlxuICogUmV0dXJucyBsaXN0IG9mIGZvdW5kIHJ1bGUgbmFtZXMgKGlmIG5vIGV4Y2VwdGlvbiBoYXBwZW5lZCkuXG4gKlxuICogU2VlIGFsc28gW1tSdWxlci5lbmFibGVdXSwgW1tSdWxlci5lbmFibGVPbmx5XV0uXG4gKiovXG5SdWxlci5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBjb25zdCByZXN1bHQgPSBbXVxuXG4gIC8vIFNlYXJjaCBieSBuYW1lIGFuZCBkaXNhYmxlXG4gIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuX19maW5kX18obmFtZSlcblxuICAgIGlmIChpZHggPCAwKSB7XG4gICAgICBpZiAoaWdub3JlSW52YWxpZCkgeyByZXR1cm4gfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAnICsgbmFtZSlcbiAgICB9XG4gICAgdGhpcy5fX3J1bGVzX19baWR4XS5lbmFibGVkID0gZmFsc2VcbiAgICByZXN1bHQucHVzaChuYW1lKVxuICB9LCB0aGlzKVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUnVsZXIuZ2V0UnVsZXMoY2hhaW5OYW1lKSAtPiBBcnJheVxuICpcbiAqIFJldHVybiBhcnJheSBvZiBhY3RpdmUgZnVuY3Rpb25zIChydWxlcykgZm9yIGdpdmVuIGNoYWluIG5hbWUuIEl0IGFuYWx5emVzXG4gKiBydWxlcyBjb25maWd1cmF0aW9uLCBjb21waWxlcyBjYWNoZXMgaWYgbm90IGV4aXN0cyBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogRGVmYXVsdCBjaGFpbiBuYW1lIGlzIGAnJ2AgKGVtcHR5IHN0cmluZykuIEl0IGNhbid0IGJlIHNraXBwZWQuIFRoYXQnc1xuICogZG9uZSBpbnRlbnRpb25hbGx5LCB0byBrZWVwIHNpZ25hdHVyZSBtb25vbW9ycGhpYyBmb3IgaGlnaCBzcGVlZC5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5nZXRSdWxlcyA9IGZ1bmN0aW9uIChjaGFpbk5hbWUpIHtcbiAgaWYgKHRoaXMuX19jYWNoZV9fID09PSBudWxsKSB7XG4gICAgdGhpcy5fX2NvbXBpbGVfXygpXG4gIH1cblxuICAvLyBDaGFpbiBjYW4gYmUgZW1wdHksIGlmIHJ1bGVzIGRpc2FibGVkLiBCdXQgd2Ugc3RpbGwgaGF2ZSB0byByZXR1cm4gQXJyYXkuXG4gIHJldHVybiB0aGlzLl9fY2FjaGVfX1tjaGFpbk5hbWVdIHx8IFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJ1bGVyXG4iLCIvLyBCbG9jayBxdW90ZXNcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJsb2NrcXVvdGUgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICBjb25zdCBvbGRMaW5lTWF4ID0gc3RhdGUubGluZU1heFxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gY2hlY2sgdGhlIGJsb2NrIHF1b3RlIG1hcmtlclxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgzRS8qID4gKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyB3ZSBrbm93IHRoYXQgaXQncyBnb2luZyB0byBiZSBhIHZhbGlkIGJsb2NrcXVvdGUsXG4gIC8vIHNvIG5vIHBvaW50IHRyeWluZyB0byBmaW5kIHRoZSBlbmQgb2YgaXQgaW4gc2lsZW50IG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgY29uc3Qgb2xkQk1hcmtzICA9IFtdXG4gIGNvbnN0IG9sZEJTQ291bnQgPSBbXVxuICBjb25zdCBvbGRTQ291bnQgID0gW11cbiAgY29uc3Qgb2xkVFNoaWZ0ICA9IFtdXG5cbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2Jsb2NrcXVvdGUnKVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAnYmxvY2txdW90ZSdcbiAgbGV0IGxhc3RMaW5lRW1wdHkgPSBmYWxzZVxuICBsZXQgbmV4dExpbmVcblxuICAvLyBTZWFyY2ggdGhlIGVuZCBvZiB0aGUgYmxvY2tcbiAgLy9cbiAgLy8gQmxvY2sgZW5kcyB3aXRoIGVpdGhlcjpcbiAgLy8gIDEuIGFuIGVtcHR5IGxpbmUgb3V0c2lkZTpcbiAgLy8gICAgIGBgYFxuICAvLyAgICAgPiB0ZXN0XG4gIC8vXG4gIC8vICAgICBgYGBcbiAgLy8gIDIuIGFuIGVtcHR5IGxpbmUgaW5zaWRlOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+XG4gIC8vICAgICB0ZXN0XG4gIC8vICAgICBgYGBcbiAgLy8gIDMuIGFub3RoZXIgdGFnOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+IHRlc3RcbiAgLy8gICAgICAtIC0gLVxuICAvLyAgICAgYGBgXG4gIGZvciAobmV4dExpbmUgPSBzdGFydExpbmU7IG5leHRMaW5lIDwgZW5kTGluZTsgbmV4dExpbmUrKykge1xuICAgIC8vIGNoZWNrIGlmIGl0J3Mgb3V0ZGVudGVkLCBpLmUuIGl0J3MgaW5zaWRlIGxpc3QgaXRlbSBhbmQgaW5kZW50ZWRcbiAgICAvLyBsZXNzIHRoYW4gc2FpZCBsaXN0IGl0ZW06XG4gICAgLy9cbiAgICAvLyBgYGBcbiAgICAvLyAxLiBhbnl0aGluZ1xuICAgIC8vICAgID4gY3VycmVudCBibG9ja3F1b3RlXG4gICAgLy8gMi4gY2hlY2tpbmcgdGhpcyBsaW5lXG4gICAgLy8gYGBgXG4gICAgY29uc3QgaXNPdXRkZW50ZWQgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50XG5cbiAgICBwb3MgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgIGlmIChwb3MgPj0gbWF4KSB7XG4gICAgICAvLyBDYXNlIDE6IGxpbmUgaXMgbm90IGluc2lkZSB0aGUgYmxvY2txdW90ZSwgYW5kIHRoaXMgbGluZSBpcyBlbXB0eS5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKSA9PT0gMHgzRS8qID4gKi8gJiYgIWlzT3V0ZGVudGVkKSB7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgaW5zaWRlIHRoZSBibG9ja3F1b3RlLlxuXG4gICAgICAvLyBzZXQgb2Zmc2V0IHBhc3Qgc3BhY2VzIGFuZCBcIj5cIlxuICAgICAgbGV0IGluaXRpYWwgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdICsgMVxuICAgICAgbGV0IHNwYWNlQWZ0ZXJNYXJrZXJcbiAgICAgIGxldCBhZGp1c3RUYWJcblxuICAgICAgLy8gc2tpcCBvbmUgb3B0aW9uYWwgc3BhY2UgYWZ0ZXIgJz4nXG4gICAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyMCAvKiBzcGFjZSAqLykge1xuICAgICAgICAvLyAnID4gICB0ZXN0ICdcbiAgICAgICAgLy8gICAgIF4gLS0gcG9zaXRpb24gc3RhcnQgb2YgbGluZSBoZXJlOlxuICAgICAgICBwb3MrK1xuICAgICAgICBpbml0aWFsKytcbiAgICAgICAgYWRqdXN0VGFiID0gZmFsc2VcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgwOSAvKiB0YWIgKi8pIHtcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IHRydWVcblxuICAgICAgICBpZiAoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdICsgaW5pdGlhbCkgJSA0ID09PSAzKSB7XG4gICAgICAgICAgLy8gJyAgPlxcdCAgdGVzdCAnXG4gICAgICAgICAgLy8gICAgICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmUgKHRhYiBoYXMgd2lkdGg9PT0xKVxuICAgICAgICAgIHBvcysrXG4gICAgICAgICAgaW5pdGlhbCsrXG4gICAgICAgICAgYWRqdXN0VGFiID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAnID5cXHQgIHRlc3QgJ1xuICAgICAgICAgIC8vICAgIF4gLS0gcG9zaXRpb24gc3RhcnQgb2YgbGluZSBoZXJlICsgc2hpZnQgYnNDb3VudCBzbGlnaHRseVxuICAgICAgICAgIC8vICAgICAgICAgdG8gbWFrZSBleHRyYSBzcGFjZSBhcHBlYXJcbiAgICAgICAgICBhZGp1c3RUYWIgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYWNlQWZ0ZXJNYXJrZXIgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBsZXQgb2Zmc2V0ID0gaW5pdGlhbFxuICAgICAgb2xkQk1hcmtzLnB1c2goc3RhdGUuYk1hcmtzW25leHRMaW5lXSlcbiAgICAgIHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gPSBwb3NcblxuICAgICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgICAgICBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICAgIG9mZnNldCArPSA0IC0gKG9mZnNldCArIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdICsgKGFkanVzdFRhYiA/IDEgOiAwKSkgJSA0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCsrXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cblxuICAgICAgICBwb3MrK1xuICAgICAgfVxuXG4gICAgICBsYXN0TGluZUVtcHR5ID0gcG9zID49IG1heFxuXG4gICAgICBvbGRCU0NvdW50LnB1c2goc3RhdGUuYnNDb3VudFtuZXh0TGluZV0pXG4gICAgICBzdGF0ZS5ic0NvdW50W25leHRMaW5lXSA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gKyAxICsgKHNwYWNlQWZ0ZXJNYXJrZXIgPyAxIDogMClcblxuICAgICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvZmZzZXQgLSBpbml0aWFsXG5cbiAgICAgIG9sZFRTaGlmdC5wdXNoKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0pXG4gICAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gcG9zIC0gc3RhdGUuYk1hcmtzW25leHRMaW5lXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBDYXNlIDI6IGxpbmUgaXMgbm90IGluc2lkZSB0aGUgYmxvY2txdW90ZSwgYW5kIHRoZSBsYXN0IGxpbmUgd2FzIGVtcHR5LlxuICAgIGlmIChsYXN0TGluZUVtcHR5KSB7IGJyZWFrIH1cblxuICAgIC8vIENhc2UgMzogYW5vdGhlciB0YWcgZm91bmQuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXJtaW5hdGUpIHtcbiAgICAgIC8vIFF1aXJrIHRvIGVuZm9yY2UgXCJoYXJkIHRlcm1pbmF0aW9uIG1vZGVcIiBmb3IgcGFyYWdyYXBocztcbiAgICAgIC8vIG5vcm1hbGx5IGlmIHlvdSBjYWxsIGB0b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lLCBuZXh0TGluZSlgLFxuICAgICAgLy8gcGFyYWdyYXBocyB3aWxsIGxvb2sgYmVsb3cgbmV4dExpbmUgZm9yIHBhcmFncmFwaCBjb250aW51YXRpb24sXG4gICAgICAvLyBidXQgaWYgYmxvY2txdW90ZSBpcyB0ZXJtaW5hdGVkIGJ5IGFub3RoZXIgdGFnLCB0aGV5IHNob3VsZG4ndFxuICAgICAgc3RhdGUubGluZU1heCA9IG5leHRMaW5lXG5cbiAgICAgIGlmIChzdGF0ZS5ibGtJbmRlbnQgIT09IDApIHtcbiAgICAgICAgLy8gc3RhdGUuYmxrSW5kZW50IHdhcyBub24temVybywgd2Ugbm93IHNldCBpdCB0byB6ZXJvLFxuICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBhbGwgb2Zmc2V0cyB0byBhcHBlYXIgYXNcbiAgICAgICAgLy8gaWYgaW5kZW50IHdhc24ndCBjaGFuZ2VkXG4gICAgICAgIG9sZEJNYXJrcy5wdXNoKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0pXG4gICAgICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICAgICAgb2xkVFNoaWZ0LnB1c2goc3RhdGUudFNoaWZ0W25leHRMaW5lXSlcbiAgICAgICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcbiAgICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSAtPSBzdGF0ZS5ibGtJbmRlbnRcbiAgICAgIH1cblxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKVxuICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgIG9sZFNDb3VudC5wdXNoKHN0YXRlLnNDb3VudFtuZXh0TGluZV0pXG5cbiAgICAvLyBBIG5lZ2F0aXZlIGluZGVudGF0aW9uIG1lYW5zIHRoYXQgdGhpcyBpcyBhIHBhcmFncmFwaCBjb250aW51YXRpb25cbiAgICAvL1xuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSAtMVxuICB9XG5cbiAgY29uc3Qgb2xkSW5kZW50ID0gc3RhdGUuYmxrSW5kZW50XG4gIHN0YXRlLmJsa0luZGVudCA9IDBcblxuICBjb25zdCB0b2tlbl9vICA9IHN0YXRlLnB1c2goJ2Jsb2NrcXVvdGVfb3BlbicsICdibG9ja3F1b3RlJywgMSlcbiAgdG9rZW5fby5tYXJrdXAgPSAnPidcbiAgY29uc3QgbGluZXMgPSBbc3RhcnRMaW5lLCAwXVxuICB0b2tlbl9vLm1hcCAgICA9IGxpbmVzXG5cbiAgc3RhdGUubWQuYmxvY2sudG9rZW5pemUoc3RhdGUsIHN0YXJ0TGluZSwgbmV4dExpbmUpXG5cbiAgY29uc3QgdG9rZW5fYyAgPSBzdGF0ZS5wdXNoKCdibG9ja3F1b3RlX2Nsb3NlJywgJ2Jsb2NrcXVvdGUnLCAtMSlcbiAgdG9rZW5fYy5tYXJrdXAgPSAnPidcblxuICBzdGF0ZS5saW5lTWF4ID0gb2xkTGluZU1heFxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuICBsaW5lc1sxXSA9IHN0YXRlLmxpbmVcblxuICAvLyBSZXN0b3JlIG9yaWdpbmFsIHRTaGlmdDsgdGhpcyBtaWdodCBub3QgYmUgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJzZXJcbiAgLy8gaGFzIGFscmVhZHkgYmVlbiBoZXJlLCBidXQganVzdCB0byBtYWtlIHN1cmUgd2UgY2FuIGRvIHRoYXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkVFNoaWZ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgc3RhdGUuYk1hcmtzW2kgKyBzdGFydExpbmVdID0gb2xkQk1hcmtzW2ldXG4gICAgc3RhdGUudFNoaWZ0W2kgKyBzdGFydExpbmVdID0gb2xkVFNoaWZ0W2ldXG4gICAgc3RhdGUuc0NvdW50W2kgKyBzdGFydExpbmVdID0gb2xkU0NvdW50W2ldXG4gICAgc3RhdGUuYnNDb3VudFtpICsgc3RhcnRMaW5lXSA9IG9sZEJTQ291bnRbaV1cbiAgfVxuICBzdGF0ZS5ibGtJbmRlbnQgPSBvbGRJbmRlbnRcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gQ29kZSBibG9jayAoNCBzcGFjZXMgcGFkZGVkKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2RlIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLyosIHNpbGVudCAqLykge1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPCA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuICBsZXQgbGFzdCA9IG5leHRMaW5lXG5cbiAgd2hpbGUgKG5leHRMaW5lIDwgZW5kTGluZSkge1xuICAgIGlmIChzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgICAgbmV4dExpbmUrK1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7XG4gICAgICBuZXh0TGluZSsrXG4gICAgICBsYXN0ID0gbmV4dExpbmVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGJyZWFrXG4gIH1cblxuICBzdGF0ZS5saW5lID0gbGFzdFxuXG4gIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCdjb2RlX2Jsb2NrJywgJ2NvZGUnLCAwKVxuICB0b2tlbi5jb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBsYXN0LCA0ICsgc3RhdGUuYmxrSW5kZW50LCBmYWxzZSkgKyAnXFxuJ1xuICB0b2tlbi5tYXAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gZmVuY2VzIChgYGAgbGFuZywgfn5+IGxhbmcpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZlbmNlIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAocG9zICsgMyA+IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAobWFya2VyICE9PSAweDdFLyogfiAqLyAmJiBtYXJrZXIgIT09IDB4NjAgLyogYCAqLykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gc2NhbiBtYXJrZXIgbGVuZ3RoXG4gIGxldCBtZW0gPSBwb3NcbiAgcG9zID0gc3RhdGUuc2tpcENoYXJzKHBvcywgbWFya2VyKVxuXG4gIGxldCBsZW4gPSBwb3MgLSBtZW1cblxuICBpZiAobGVuIDwgMykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG1hcmt1cCA9IHN0YXRlLnNyYy5zbGljZShtZW0sIHBvcylcbiAgY29uc3QgcGFyYW1zID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gIGlmIChtYXJrZXIgPT09IDB4NjAgLyogYCAqLykge1xuICAgIGlmIChwYXJhbXMuaW5kZXhPZihTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcikpID49IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIFNpbmNlIHN0YXJ0IGlzIGZvdW5kLCB3ZSBjYW4gcmVwb3J0IHN1Y2Nlc3MgaGVyZSBpbiB2YWxpZGF0aW9uIG1vZGVcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gc2VhcmNoIGVuZCBvZiBibG9ja1xuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmVcbiAgbGV0IGhhdmVFbmRNYXJrZXIgPSBmYWxzZVxuXG4gIGZvciAoOzspIHtcbiAgICBuZXh0TGluZSsrXG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHtcbiAgICAgIC8vIHVuY2xvc2VkIGJsb2NrIHNob3VsZCBiZSBhdXRvY2xvc2VkIGJ5IGVuZCBvZiBkb2N1bWVudC5cbiAgICAgIC8vIGFsc28gYmxvY2sgc2VlbXMgdG8gYmUgYXV0b2Nsb3NlZCBieSBlbmQgb2YgcGFyZW50XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHBvcyA9IG1lbSA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICAvLyBub24tZW1wdHkgbGluZSB3aXRoIG5lZ2F0aXZlIGluZGVudCBzaG91bGQgc3RvcCB0aGUgbGlzdDpcbiAgICAgIC8vIC0gYGBgXG4gICAgICAvLyAgdGVzdFxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gbWFya2VyKSB7IGNvbnRpbnVlIH1cblxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHtcbiAgICAgIC8vIGNsb3NpbmcgZmVuY2Ugc2hvdWxkIGJlIGluZGVudGVkIGxlc3MgdGhhbiA0IHNwYWNlc1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpXG5cbiAgICAvLyBjbG9zaW5nIGNvZGUgZmVuY2UgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBvcGVuaW5nIG9uZVxuICAgIGlmIChwb3MgLSBtZW0gPCBsZW4pIHsgY29udGludWUgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRhaWwgaGFzIHNwYWNlcyBvbmx5XG4gICAgcG9zID0gc3RhdGUuc2tpcFNwYWNlcyhwb3MpXG5cbiAgICBpZiAocG9zIDwgbWF4KSB7IGNvbnRpbnVlIH1cblxuICAgIGhhdmVFbmRNYXJrZXIgPSB0cnVlXG4gICAgLy8gZm91bmQhXG4gICAgYnJlYWtcbiAgfVxuXG4gIC8vIElmIGEgZmVuY2UgaGFzIGhlYWRpbmcgc3BhY2VzLCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZyb20gaXRzIGlubmVyIGJsb2NrXG4gIGxlbiA9IHN0YXRlLnNDb3VudFtzdGFydExpbmVdXG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lICsgKGhhdmVFbmRNYXJrZXIgPyAxIDogMClcblxuICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgnZmVuY2UnLCAnY29kZScsIDApXG4gIHRva2VuLmluZm8gICAgPSBwYXJhbXNcbiAgdG9rZW4uY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSArIDEsIG5leHRMaW5lLCBsZW4sIHRydWUpXG4gIHRva2VuLm1hcmt1cCAgPSBtYXJrdXBcbiAgdG9rZW4ubWFwICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIGhlYWRpbmcgKCMsICMjLCAuLi4pXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoZWFkaW5nIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgY2ggID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChjaCAhPT0gMHgyMy8qICMgKi8gfHwgcG9zID49IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIGNvdW50IGhlYWRpbmcgbGV2ZWxcbiAgbGV0IGxldmVsID0gMVxuICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KCsrcG9zKVxuICB3aGlsZSAoY2ggPT09IDB4MjMvKiAjICovICYmIHBvcyA8IG1heCAmJiBsZXZlbCA8PSA2KSB7XG4gICAgbGV2ZWwrK1xuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytwb3MpXG4gIH1cblxuICBpZiAobGV2ZWwgPiA2IHx8IChwb3MgPCBtYXggJiYgIWlzU3BhY2UoY2gpKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIC8vIExldCdzIGN1dCB0YWlscyBsaWtlICcgICAgIyMjICAnIGZyb20gdGhlIGVuZCBvZiBzdHJpbmdcblxuICBtYXggPSBzdGF0ZS5za2lwU3BhY2VzQmFjayhtYXgsIHBvcylcbiAgY29uc3QgdG1wID0gc3RhdGUuc2tpcENoYXJzQmFjayhtYXgsIDB4MjMsIHBvcykgLy8gI1xuICBpZiAodG1wID4gcG9zICYmIGlzU3BhY2Uoc3RhdGUuc3JjLmNoYXJDb2RlQXQodG1wIC0gMSkpKSB7XG4gICAgbWF4ID0gdG1wXG4gIH1cblxuICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGNvbnN0IHRva2VuX28gID0gc3RhdGUucHVzaCgnaGVhZGluZ19vcGVuJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgMSlcbiAgdG9rZW5fby5tYXJrdXAgPSAnIyMjIyMjIyMnLnNsaWNlKDAsIGxldmVsKVxuICB0b2tlbl9vLm1hcCAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KS50cmltKClcbiAgdG9rZW5faS5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG4gIHRva2VuX2kuY2hpbGRyZW4gPSBbXVxuXG4gIGNvbnN0IHRva2VuX2MgID0gc3RhdGUucHVzaCgnaGVhZGluZ19jbG9zZScsICdoJyArIFN0cmluZyhsZXZlbCksIC0xKVxuICB0b2tlbl9jLm1hcmt1cCA9ICcjIyMjIyMjIycuc2xpY2UoMCwgbGV2ZWwpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIEhvcml6b250YWwgcnVsZVxuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHIgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuXG4gIC8vIENoZWNrIGhyIG1hcmtlclxuICBpZiAobWFya2VyICE9PSAweDJBLyogKiAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDJELyogLSAqLyAmJlxuICAgICAgbWFya2VyICE9PSAweDVGLyogXyAqLykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gbWFya2VycyBjYW4gYmUgbWl4ZWQgd2l0aCBzcGFjZXMsIGJ1dCB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3QgMyBvZiB0aGVtXG5cbiAgbGV0IGNudCA9IDFcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG4gICAgaWYgKGNoICE9PSBtYXJrZXIgJiYgIWlzU3BhY2UoY2gpKSB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKGNoID09PSBtYXJrZXIpIHsgY250KysgfVxuICB9XG5cbiAgaWYgKGNudCA8IDMpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBzdGF0ZS5saW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGNvbnN0IHRva2VuICA9IHN0YXRlLnB1c2goJ2hyJywgJ2hyJywgMClcbiAgdG9rZW4ubWFwICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cbiAgdG9rZW4ubWFya3VwID0gQXJyYXkoY250ICsgMSkuam9pbihTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcikpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIEhUTUwgYmxvY2tcblxuaW1wb3J0IGJsb2NrX25hbWVzIGZyb20gJy4uL2NvbW1vbi9odG1sX2Jsb2Nrcy5tanMnXG5pbXBvcnQgeyBIVE1MX09QRU5fQ0xPU0VfVEFHX1JFIH0gZnJvbSAnLi4vY29tbW9uL2h0bWxfcmUubWpzJ1xuXG4vLyBBbiBhcnJheSBvZiBvcGVuaW5nIGFuZCBjb3JyZXNwb25kaW5nIGNsb3Npbmcgc2VxdWVuY2VzIGZvciBodG1sIHRhZ3MsXG4vLyBsYXN0IGFyZ3VtZW50IGRlZmluZXMgd2hldGhlciBpdCBjYW4gdGVybWluYXRlIGEgcGFyYWdyYXBoIG9yIG5vdFxuLy9cbmNvbnN0IEhUTUxfU0VRVUVOQ0VTID0gW1xuICBbL148KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKD89KFxcc3w+fCQpKS9pLCAvPFxcLyhzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKT4vaSwgdHJ1ZV0sXG4gIFsvXjwhLS0vLCAgICAgICAgLy0tPi8sICAgdHJ1ZV0sXG4gIFsvXjxcXD8vLCAgICAgICAgIC9cXD8+LywgICB0cnVlXSxcbiAgWy9ePCFbQS1aXS8sICAgICAvPi8sICAgICB0cnVlXSxcbiAgWy9ePCFcXFtDREFUQVxcWy8sIC9cXF1cXF0+LywgdHJ1ZV0sXG4gIFtuZXcgUmVnRXhwKCdePC8/KCcgKyBibG9ja19uYW1lcy5qb2luKCd8JykgKyAnKSg/PShcXFxcc3wvPz58JCkpJywgJ2knKSwgL14kLywgdHJ1ZV0sXG4gIFtuZXcgUmVnRXhwKEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUuc291cmNlICsgJ1xcXFxzKiQnKSwgIC9eJC8sIGZhbHNlXVxuXVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBodG1sX2Jsb2NrIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMuaHRtbCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBsaW5lVGV4dCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcblxuICBsZXQgaSA9IDBcbiAgZm9yICg7IGkgPCBIVE1MX1NFUVVFTkNFUy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChIVE1MX1NFUVVFTkNFU1tpXVswXS50ZXN0KGxpbmVUZXh0KSkgeyBicmVhayB9XG4gIH1cbiAgaWYgKGkgPT09IEhUTUxfU0VRVUVOQ0VTLmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHtcbiAgICAvLyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgY2FuIGJlIGEgdGVybWluYXRvciwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgcmV0dXJuIEhUTUxfU0VRVUVOQ0VTW2ldWzJdXG4gIH1cblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgLy8gSWYgd2UgYXJlIGhlcmUgLSB3ZSBkZXRlY3RlZCBIVE1MIGJsb2NrLlxuICAvLyBMZXQncyByb2xsIGRvd24gdGlsbCBibG9jayBlbmQuXG4gIGlmICghSFRNTF9TRVFVRU5DRVNbaV1bMV0udGVzdChsaW5lVGV4dCkpIHtcbiAgICBmb3IgKDsgbmV4dExpbmUgPCBlbmRMaW5lOyBuZXh0TGluZSsrKSB7XG4gICAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG4gICAgICBsaW5lVGV4dCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcblxuICAgICAgaWYgKEhUTUxfU0VRVUVOQ0VTW2ldWzFdLnRlc3QobGluZVRleHQpKSB7XG4gICAgICAgIGlmIChsaW5lVGV4dC5sZW5ndGggIT09IDApIHsgbmV4dExpbmUrKyB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG5cbiAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ2h0bWxfYmxvY2snLCAnJywgMClcbiAgdG9rZW4ubWFwICAgICA9IFtzdGFydExpbmUsIG5leHRMaW5lXVxuICB0b2tlbi5jb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBuZXh0TGluZSwgc3RhdGUuYmxrSW5kZW50LCB0cnVlKVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBsaGVhZGluZyAoLS0tLCA9PT0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxoZWFkaW5nIChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLyosIHNpbGVudCAqLykge1xuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygncGFyYWdyYXBoJylcblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAncGFyYWdyYXBoJyAvLyB1c2UgcGFyYWdyYXBoIHRvIG1hdGNoIHRlcm1pbmF0b3JSdWxlc1xuXG4gIC8vIGp1bXAgbGluZS1ieS1saW5lIHVudGlsIGVtcHR5IG9uZSBvciBFT0ZcbiAgbGV0IGxldmVsID0gMFxuICBsZXQgbWFya2VyXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICBmb3IgKDsgbmV4dExpbmUgPCBlbmRMaW5lICYmICFzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKTsgbmV4dExpbmUrKykge1xuICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgLy8gaXQncyBjb25zaWRlcmVkIGEgbGF6eSBjb250aW51YXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0J3MgdGhlcmVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgY29udGludWUgfVxuXG4gICAgLy9cbiAgICAvLyBDaGVjayBmb3IgdW5kZXJsaW5lIGluIHNldGV4dCBoZWFkZXJcbiAgICAvL1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdID49IHN0YXRlLmJsa0luZGVudCkge1xuICAgICAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG5cbiAgICAgIGlmIChwb3MgPCBtYXgpIHtcbiAgICAgICAgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgICAgIGlmIChtYXJrZXIgPT09IDB4MkQvKiAtICovIHx8IG1hcmtlciA9PT0gMHgzRC8qID0gKi8pIHtcbiAgICAgICAgICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpXG4gICAgICAgICAgcG9zID0gc3RhdGUuc2tpcFNwYWNlcyhwb3MpXG5cbiAgICAgICAgICBpZiAocG9zID49IG1heCkge1xuICAgICAgICAgICAgbGV2ZWwgPSAobWFya2VyID09PSAweDNELyogPSAqLyA/IDEgOiAyKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBxdWlyayBmb3IgYmxvY2txdW90ZXMsIHRoaXMgbGluZSBzaG91bGQgYWxyZWFkeSBiZSBjaGVja2VkIGJ5IHRoYXQgcnVsZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgMCkgeyBjb250aW51ZSB9XG5cbiAgICAvLyBTb21lIHRhZ3MgY2FuIHRlcm1pbmF0ZSBwYXJhZ3JhcGggd2l0aG91dCBlbXB0eSBsaW5lLlxuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG4gIH1cblxuICBpZiAoIWxldmVsKSB7XG4gICAgLy8gRGlkbid0IGZpbmQgdmFsaWQgdW5kZXJsaW5lXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBuZXh0TGluZSwgc3RhdGUuYmxrSW5kZW50LCBmYWxzZSkudHJpbSgpXG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lICsgMVxuXG4gIGNvbnN0IHRva2VuX28gICAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX29wZW4nLCAnaCcgKyBTdHJpbmcobGV2ZWwpLCAxKVxuICB0b2tlbl9vLm1hcmt1cCAgID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpXG4gIHRva2VuX28ubWFwICAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuXG4gIGNvbnN0IHRva2VuX2kgICAgPSBzdGF0ZS5wdXNoKCdpbmxpbmUnLCAnJywgMClcbiAgdG9rZW5faS5jb250ZW50ICA9IGNvbnRlbnRcbiAgdG9rZW5faS5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmUgLSAxXVxuICB0b2tlbl9pLmNoaWxkcmVuID0gW11cblxuICBjb25zdCB0b2tlbl9jICAgID0gc3RhdGUucHVzaCgnaGVhZGluZ19jbG9zZScsICdoJyArIFN0cmluZyhsZXZlbCksIC0xKVxuICB0b2tlbl9jLm1hcmt1cCAgID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpXG5cbiAgc3RhdGUucGFyZW50VHlwZSA9IG9sZFBhcmVudFR5cGVcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gTGlzdHNcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbi8vIFNlYXJjaCBgWy0rKl1bXFxuIF1gLCByZXR1cm5zIG5leHQgcG9zIGFmdGVyIG1hcmtlciBvbiBzdWNjZXNzXG4vLyBvciAtMSBvbiBmYWlsLlxuZnVuY3Rpb24gc2tpcEJ1bGxldExpc3RNYXJrZXIgKHN0YXRlLCBzdGFydExpbmUpIHtcbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cblxuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgLy8gQ2hlY2sgYnVsbGV0XG4gIGlmIChtYXJrZXIgIT09IDB4MkEvKiAqICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkQvKiAtICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkIvKiArICovKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBpZiAocG9zIDwgbWF4KSB7XG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoIWlzU3BhY2UoY2gpKSB7XG4gICAgICAvLyBcIiAtdGVzdCBcIiAtIGlzIG5vdCBhIGxpc3QgaXRlbVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBTZWFyY2ggYFxcZCtbLildW1xcbiBdYCwgcmV0dXJucyBuZXh0IHBvcyBhZnRlciBtYXJrZXIgb24gc3VjY2Vzc1xuLy8gb3IgLTEgb24gZmFpbC5cbmZ1bmN0aW9uIHNraXBPcmRlcmVkTGlzdE1hcmtlciAoc3RhdGUsIHN0YXJ0TGluZSkge1xuICBjb25zdCBzdGFydCA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgbGV0IHBvcyA9IHN0YXJ0XG5cbiAgLy8gTGlzdCBtYXJrZXIgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMiBjaGFycyAoZGlnaXQgKyBkb3QpXG4gIGlmIChwb3MgKyAxID49IG1heCkgeyByZXR1cm4gLTEgfVxuXG4gIGxldCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuXG4gIGlmIChjaCA8IDB4MzAvKiAwICovIHx8IGNoID4gMHgzOS8qIDkgKi8pIHsgcmV0dXJuIC0xIH1cblxuICBmb3IgKDs7KSB7XG4gICAgLy8gRU9MIC0+IGZhaWxcbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gLTEgfVxuXG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcblxuICAgIGlmIChjaCA+PSAweDMwLyogMCAqLyAmJiBjaCA8PSAweDM5LyogOSAqLykge1xuICAgICAgLy8gTGlzdCBtYXJrZXIgc2hvdWxkIGhhdmUgbm8gbW9yZSB0aGFuIDkgZGlnaXRzXG4gICAgICAvLyAocHJldmVudHMgaW50ZWdlciBvdmVyZmxvdyBpbiBicm93c2VycylcbiAgICAgIGlmIChwb3MgLSBzdGFydCA+PSAxMCkgeyByZXR1cm4gLTEgfVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGZvdW5kIHZhbGlkIG1hcmtlclxuICAgIGlmIChjaCA9PT0gMHgyOS8qICkgKi8gfHwgY2ggPT09IDB4MmUvKiAuICovKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiAtMVxuICB9XG5cbiAgaWYgKHBvcyA8IG1heCkge1xuICAgIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKCFpc1NwYWNlKGNoKSkge1xuICAgICAgLy8gXCIgMS50ZXN0IFwiIC0gaXMgbm90IGEgbGlzdCBpdGVtXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG5mdW5jdGlvbiBtYXJrVGlnaHRQYXJhZ3JhcGhzIChzdGF0ZSwgaWR4KSB7XG4gIGNvbnN0IGxldmVsID0gc3RhdGUubGV2ZWwgKyAyXG5cbiAgZm9yIChsZXQgaSA9IGlkeCArIDIsIGwgPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMjsgaSA8IGw7IGkrKykge1xuICAgIGlmIChzdGF0ZS50b2tlbnNbaV0ubGV2ZWwgPT09IGxldmVsICYmIHN0YXRlLnRva2Vuc1tpXS50eXBlID09PSAncGFyYWdyYXBoX29wZW4nKSB7XG4gICAgICBzdGF0ZS50b2tlbnNbaSArIDJdLmhpZGRlbiA9IHRydWVcbiAgICAgIHN0YXRlLnRva2Vuc1tpXS5oaWRkZW4gPSB0cnVlXG4gICAgICBpICs9IDJcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlzdCAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBtYXgsIHBvcywgc3RhcnQsIHRva2VuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZVxuICBsZXQgdGlnaHQgPSB0cnVlXG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIFNwZWNpYWwgY2FzZTpcbiAgLy8gIC0gaXRlbSAxXG4gIC8vICAgLSBpdGVtIDJcbiAgLy8gICAgLSBpdGVtIDNcbiAgLy8gICAgIC0gaXRlbSA0XG4gIC8vICAgICAgLSB0aGlzIG9uZSBpcyBhIHBhcmFncmFwaCBjb250aW51YXRpb25cbiAgaWYgKHN0YXRlLmxpc3RJbmRlbnQgPj0gMCAmJlxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmxpc3RJbmRlbnQgPj0gNCAmJlxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgbGV0IGlzVGVybWluYXRpbmdQYXJhZ3JhcGggPSBmYWxzZVxuXG4gIC8vIGxpbWl0IGNvbmRpdGlvbnMgd2hlbiBsaXN0IGNhbiBpbnRlcnJ1cHRcbiAgLy8gYSBwYXJhZ3JhcGggKHZhbGlkYXRpb24gbW9kZSBvbmx5KVxuICBpZiAoc2lsZW50ICYmIHN0YXRlLnBhcmVudFR5cGUgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgLy8gTmV4dCBsaXN0IGl0ZW0gc2hvdWxkIHN0aWxsIHRlcm1pbmF0ZSBwcmV2aW91cyBsaXN0IGl0ZW07XG4gICAgLy9cbiAgICAvLyBUaGlzIGNvZGUgY2FuIGZhaWwgaWYgcGx1Z2lucyB1c2UgYmxrSW5kZW50IGFzIHdlbGwgYXMgbGlzdHMsXG4gICAgLy8gYnV0IEkgaG9wZSB0aGUgc3BlYyBnZXRzIGZpeGVkIGxvbmcgYmVmb3JlIHRoYXQgaGFwcGVucy5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdID49IHN0YXRlLmJsa0luZGVudCkge1xuICAgICAgaXNUZXJtaW5hdGluZ1BhcmFncmFwaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICAvLyBEZXRlY3QgbGlzdCB0eXBlIGFuZCBwb3NpdGlvbiBhZnRlciBtYXJrZXJcbiAgbGV0IGlzT3JkZXJlZFxuICBsZXQgbWFya2VyVmFsdWVcbiAgbGV0IHBvc0FmdGVyTWFya2VyXG4gIGlmICgocG9zQWZ0ZXJNYXJrZXIgPSBza2lwT3JkZXJlZExpc3RNYXJrZXIoc3RhdGUsIG5leHRMaW5lKSkgPj0gMCkge1xuICAgIGlzT3JkZXJlZCA9IHRydWVcbiAgICBzdGFydCA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWFya2VyVmFsdWUgPSBOdW1iZXIoc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3NBZnRlck1hcmtlciAtIDEpKVxuXG4gICAgLy8gSWYgd2UncmUgc3RhcnRpbmcgYSBuZXcgb3JkZXJlZCBsaXN0IHJpZ2h0IGFmdGVyXG4gICAgLy8gYSBwYXJhZ3JhcGgsIGl0IHNob3VsZCBzdGFydCB3aXRoIDEuXG4gICAgaWYgKGlzVGVybWluYXRpbmdQYXJhZ3JhcGggJiYgbWFya2VyVmFsdWUgIT09IDEpIHJldHVybiBmYWxzZVxuICB9IGVsc2UgaWYgKChwb3NBZnRlck1hcmtlciA9IHNraXBCdWxsZXRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSkpID49IDApIHtcbiAgICBpc09yZGVyZWQgPSBmYWxzZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gSWYgd2UncmUgc3RhcnRpbmcgYSBuZXcgdW5vcmRlcmVkIGxpc3QgcmlnaHQgYWZ0ZXJcbiAgLy8gYSBwYXJhZ3JhcGgsIGZpcnN0IGxpbmUgc2hvdWxkIG5vdCBiZSBlbXB0eS5cbiAgaWYgKGlzVGVybWluYXRpbmdQYXJhZ3JhcGgpIHtcbiAgICBpZiAoc3RhdGUuc2tpcFNwYWNlcyhwb3NBZnRlck1hcmtlcikgPj0gc3RhdGUuZU1hcmtzW25leHRMaW5lXSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGb3IgdmFsaWRhdGlvbiBtb2RlIHdlIGNhbiB0ZXJtaW5hdGUgaW1tZWRpYXRlbHlcbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gV2Ugc2hvdWxkIHRlcm1pbmF0ZSBsaXN0IG9uIHN0eWxlIGNoYW5nZS4gUmVtZW1iZXIgZmlyc3Qgb25lIHRvIGNvbXBhcmUuXG4gIGNvbnN0IG1hcmtlckNoYXJDb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zQWZ0ZXJNYXJrZXIgLSAxKVxuXG4gIC8vIFN0YXJ0IGxpc3RcbiAgY29uc3QgbGlzdFRva0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGhcblxuICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgdG9rZW4gICAgICAgPSBzdGF0ZS5wdXNoKCdvcmRlcmVkX2xpc3Rfb3BlbicsICdvbCcsIDEpXG4gICAgaWYgKG1hcmtlclZhbHVlICE9PSAxKSB7XG4gICAgICB0b2tlbi5hdHRycyA9IFtbJ3N0YXJ0JywgbWFya2VyVmFsdWVdXVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b2tlbiAgICAgICA9IHN0YXRlLnB1c2goJ2J1bGxldF9saXN0X29wZW4nLCAndWwnLCAxKVxuICB9XG5cbiAgY29uc3QgbGlzdExpbmVzID0gW25leHRMaW5lLCAwXVxuICB0b2tlbi5tYXAgICAgPSBsaXN0TGluZXNcbiAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcblxuICAvL1xuICAvLyBJdGVyYXRlIGxpc3QgaXRlbXNcbiAgLy9cblxuICBsZXQgcHJldkVtcHR5RW5kID0gZmFsc2VcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2xpc3QnKVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAnbGlzdCdcblxuICB3aGlsZSAobmV4dExpbmUgPCBlbmRMaW5lKSB7XG4gICAgcG9zID0gcG9zQWZ0ZXJNYXJrZXJcbiAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG5cbiAgICBjb25zdCBpbml0aWFsID0gc3RhdGUuc0NvdW50W25leHRMaW5lXSArIHBvc0FmdGVyTWFya2VyIC0gKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgIGxldCBvZmZzZXQgPSBpbml0aWFsXG5cbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgICAgaWYgKGNoID09PSAweDA5KSB7XG4gICAgICAgIG9mZnNldCArPSA0IC0gKG9mZnNldCArIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKSAlIDRcbiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjApIHtcbiAgICAgICAgb2Zmc2V0KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudFN0YXJ0ID0gcG9zXG4gICAgbGV0IGluZGVudEFmdGVyTWFya2VyXG5cbiAgICBpZiAoY29udGVudFN0YXJ0ID49IG1heCkge1xuICAgICAgLy8gdHJpbW1pbmcgc3BhY2UgaW4gXCItICAgIFxcbiAgM1wiIGNhc2UsIGluZGVudCBpcyAxIGhlcmVcbiAgICAgIGluZGVudEFmdGVyTWFya2VyID0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRlbnRBZnRlck1hcmtlciA9IG9mZnNldCAtIGluaXRpYWxcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgdGhhbiA0IHNwYWNlcywgdGhlIGluZGVudCBpcyAxXG4gICAgLy8gKHRoZSByZXN0IGlzIGp1c3QgaW5kZW50ZWQgY29kZSBibG9jaylcbiAgICBpZiAoaW5kZW50QWZ0ZXJNYXJrZXIgPiA0KSB7IGluZGVudEFmdGVyTWFya2VyID0gMSB9XG5cbiAgICAvLyBcIiAgLSAgdGVzdFwiXG4gICAgLy8gIF5eXl5eIC0gY2FsY3VsYXRpbmcgdG90YWwgbGVuZ3RoIG9mIHRoaXMgdGhpbmdcbiAgICBjb25zdCBpbmRlbnQgPSBpbml0aWFsICsgaW5kZW50QWZ0ZXJNYXJrZXJcblxuICAgIC8vIFJ1biBzdWJwYXJzZXIgJiB3cml0ZSB0b2tlbnNcbiAgICB0b2tlbiAgICAgICAgPSBzdGF0ZS5wdXNoKCdsaXN0X2l0ZW1fb3BlbicsICdsaScsIDEpXG4gICAgdG9rZW4ubWFya3VwID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXJDaGFyQ29kZSlcbiAgICBjb25zdCBpdGVtTGluZXMgPSBbbmV4dExpbmUsIDBdXG4gICAgdG9rZW4ubWFwICAgID0gaXRlbUxpbmVzXG4gICAgaWYgKGlzT3JkZXJlZCkge1xuICAgICAgdG9rZW4uaW5mbyA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zQWZ0ZXJNYXJrZXIgLSAxKVxuICAgIH1cblxuICAgIC8vIGNoYW5nZSBjdXJyZW50IHN0YXRlLCB0aGVuIHJlc3RvcmUgaXQgYWZ0ZXIgcGFyc2VyIHN1YmNhbGxcbiAgICBjb25zdCBvbGRUaWdodCA9IHN0YXRlLnRpZ2h0XG4gICAgY29uc3Qgb2xkVFNoaWZ0ID0gc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIGNvbnN0IG9sZFNDb3VudCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV1cblxuICAgIC8vICAtIGV4YW1wbGUgbGlzdFxuICAgIC8vIF4gbGlzdEluZGVudCBwb3NpdGlvbiB3aWxsIGJlIGhlcmVcbiAgICAvLyAgIF4gYmxrSW5kZW50IHBvc2l0aW9uIHdpbGwgYmUgaGVyZVxuICAgIC8vXG4gICAgY29uc3Qgb2xkTGlzdEluZGVudCA9IHN0YXRlLmxpc3RJbmRlbnRcbiAgICBzdGF0ZS5saXN0SW5kZW50ID0gc3RhdGUuYmxrSW5kZW50XG4gICAgc3RhdGUuYmxrSW5kZW50ID0gaW5kZW50XG5cbiAgICBzdGF0ZS50aWdodCA9IHRydWVcbiAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gY29udGVudFN0YXJ0IC0gc3RhdGUuYk1hcmtzW25leHRMaW5lXVxuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvZmZzZXRcblxuICAgIGlmIChjb250ZW50U3RhcnQgPj0gbWF4ICYmIHN0YXRlLmlzRW1wdHkobmV4dExpbmUgKyAxKSkge1xuICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgdGhpcyBjYXNlXG4gICAgICAvLyAobGlzdCBpdGVtIGlzIGVtcHR5LCBsaXN0IHRlcm1pbmF0ZXMgYmVmb3JlIFwiZm9vXCIpOlxuICAgICAgLy8gfn5+fn5+fn5cbiAgICAgIC8vICAgLVxuICAgICAgLy9cbiAgICAgIC8vICAgICBmb29cbiAgICAgIC8vIH5+fn5+fn5+XG4gICAgICBzdGF0ZS5saW5lID0gTWF0aC5taW4oc3RhdGUubGluZSArIDIsIGVuZExpbmUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLm1kLmJsb2NrLnRva2VuaXplKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSlcbiAgICB9XG5cbiAgICAvLyBJZiBhbnkgb2YgbGlzdCBpdGVtIGlzIHRpZ2h0LCBtYXJrIGxpc3QgYXMgdGlnaHRcbiAgICBpZiAoIXN0YXRlLnRpZ2h0IHx8IHByZXZFbXB0eUVuZCkge1xuICAgICAgdGlnaHQgPSBmYWxzZVxuICAgIH1cbiAgICAvLyBJdGVtIGJlY29tZSBsb29zZSBpZiBmaW5pc2ggd2l0aCBlbXB0eSBsaW5lLFxuICAgIC8vIGJ1dCB3ZSBzaG91bGQgZmlsdGVyIGxhc3QgZWxlbWVudCwgYmVjYXVzZSBpdCBtZWFucyBsaXN0IGZpbmlzaFxuICAgIHByZXZFbXB0eUVuZCA9IChzdGF0ZS5saW5lIC0gbmV4dExpbmUpID4gMSAmJiBzdGF0ZS5pc0VtcHR5KHN0YXRlLmxpbmUgLSAxKVxuXG4gICAgc3RhdGUuYmxrSW5kZW50ID0gc3RhdGUubGlzdEluZGVudFxuICAgIHN0YXRlLmxpc3RJbmRlbnQgPSBvbGRMaXN0SW5kZW50XG4gICAgc3RhdGUudFNoaWZ0W25leHRMaW5lXSA9IG9sZFRTaGlmdFxuICAgIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPSBvbGRTQ291bnRcbiAgICBzdGF0ZS50aWdodCA9IG9sZFRpZ2h0XG5cbiAgICB0b2tlbiAgICAgICAgPSBzdGF0ZS5wdXNoKCdsaXN0X2l0ZW1fY2xvc2UnLCAnbGknLCAtMSlcbiAgICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuXG4gICAgbmV4dExpbmUgPSBzdGF0ZS5saW5lXG4gICAgaXRlbUxpbmVzWzFdID0gbmV4dExpbmVcblxuICAgIGlmIChuZXh0TGluZSA+PSBlbmRMaW5lKSB7IGJyZWFrIH1cblxuICAgIC8vXG4gICAgLy8gVHJ5IHRvIGNoZWNrIGlmIGxpc3QgaXMgdGVybWluYXRlZCBvciBjb250aW51ZWQuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgYnJlYWsgfVxuXG4gICAgLy8gZmFpbCBpZiB0ZXJtaW5hdGluZyBibG9jayBmb3VuZFxuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG5cbiAgICAvLyBmYWlsIGlmIGxpc3QgaGFzIGFub3RoZXIgdHlwZVxuICAgIGlmIChpc09yZGVyZWQpIHtcbiAgICAgIHBvc0FmdGVyTWFya2VyID0gc2tpcE9yZGVyZWRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSlcbiAgICAgIGlmIChwb3NBZnRlck1hcmtlciA8IDApIHsgYnJlYWsgfVxuICAgICAgc3RhcnQgPSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdICsgc3RhdGUudFNoaWZ0W25leHRMaW5lXVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3NBZnRlck1hcmtlciA9IHNraXBCdWxsZXRMaXN0TWFya2VyKHN0YXRlLCBuZXh0TGluZSlcbiAgICAgIGlmIChwb3NBZnRlck1hcmtlciA8IDApIHsgYnJlYWsgfVxuICAgIH1cblxuICAgIGlmIChtYXJrZXJDaGFyQ29kZSAhPT0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zQWZ0ZXJNYXJrZXIgLSAxKSkgeyBicmVhayB9XG4gIH1cblxuICAvLyBGaW5hbGl6ZSBsaXN0XG4gIGlmIChpc09yZGVyZWQpIHtcbiAgICB0b2tlbiA9IHN0YXRlLnB1c2goJ29yZGVyZWRfbGlzdF9jbG9zZScsICdvbCcsIC0xKVxuICB9IGVsc2Uge1xuICAgIHRva2VuID0gc3RhdGUucHVzaCgnYnVsbGV0X2xpc3RfY2xvc2UnLCAndWwnLCAtMSlcbiAgfVxuICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuXG4gIGxpc3RMaW5lc1sxXSA9IG5leHRMaW5lXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG5cbiAgLy8gbWFyayBwYXJhZ3JhcGhzIHRpZ2h0IGlmIG5lZWRlZFxuICBpZiAodGlnaHQpIHtcbiAgICBtYXJrVGlnaHRQYXJhZ3JhcGhzKHN0YXRlLCBsaXN0VG9rSWR4KVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFBhcmFncmFwaFxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwYXJhZ3JhcGggKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUpIHtcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ3BhcmFncmFwaCcpXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdwYXJhZ3JhcGgnXG5cbiAgLy8ganVtcCBsaW5lLWJ5LWxpbmUgdW50aWwgZW1wdHkgb25lIG9yIEVPRlxuICBmb3IgKDsgbmV4dExpbmUgPCBlbmRMaW5lICYmICFzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKTsgbmV4dExpbmUrKykge1xuICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgLy8gaXQncyBjb25zaWRlcmVkIGEgbGF6eSBjb250aW51YXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0J3MgdGhlcmVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgY29udGludWUgfVxuXG4gICAgLy8gcXVpcmsgZm9yIGJsb2NrcXVvdGVzLCB0aGlzIGxpbmUgc2hvdWxkIGFscmVhZHkgYmUgY2hlY2tlZCBieSB0aGF0IHJ1bGVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IDApIHsgY29udGludWUgfVxuXG4gICAgLy8gU29tZSB0YWdzIGNhbiB0ZXJtaW5hdGUgcGFyYWdyYXBoIHdpdGhvdXQgZW1wdHkgbGluZS5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWsgfVxuICB9XG5cbiAgY29uc3QgY29udGVudCA9IHN0YXRlLmdldExpbmVzKHN0YXJ0TGluZSwgbmV4dExpbmUsIHN0YXRlLmJsa0luZGVudCwgZmFsc2UpLnRyaW0oKVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuXG4gIGNvbnN0IHRva2VuX28gICAgPSBzdGF0ZS5wdXNoKCdwYXJhZ3JhcGhfb3BlbicsICdwJywgMSlcbiAgdG9rZW5fby5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gY29udGVudFxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cbiAgdG9rZW5faS5jaGlsZHJlbiA9IFtdXG5cbiAgc3RhdGUucHVzaCgncGFyYWdyYXBoX2Nsb3NlJywgJ3AnLCAtMSlcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCJpbXBvcnQgeyBpc1NwYWNlLCBub3JtYWxpemVSZWZlcmVuY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWZlcmVuY2UgKHN0YXRlLCBzdGFydExpbmUsIF9lbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgbGV0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRMaW5lIChuZXh0TGluZSkge1xuICAgIGNvbnN0IGVuZExpbmUgPSBzdGF0ZS5saW5lTWF4XG5cbiAgICBpZiAobmV4dExpbmUgPj0gZW5kTGluZSB8fCBzdGF0ZS5pc0VtcHR5KG5leHRMaW5lKSkge1xuICAgICAgLy8gZW1wdHkgbGluZSBvciBlbmQgb2YgaW5wdXRcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGlzQ29udGludWF0aW9uID0gZmFsc2VcblxuICAgIC8vIHRoaXMgd291bGQgYmUgYSBjb2RlIGJsb2NrIG5vcm1hbGx5LCBidXQgYWZ0ZXIgcGFyYWdyYXBoXG4gICAgLy8gaXQncyBjb25zaWRlcmVkIGEgbGF6eSBjb250aW51YXRpb24gcmVnYXJkbGVzcyBvZiB3aGF0J3MgdGhlcmVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+IDMpIHsgaXNDb250aW51YXRpb24gPSB0cnVlIH1cblxuICAgIC8vIHF1aXJrIGZvciBibG9ja3F1b3RlcywgdGhpcyBsaW5lIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgYnkgdGhhdCBydWxlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCAwKSB7IGlzQ29udGludWF0aW9uID0gdHJ1ZSB9XG5cbiAgICBpZiAoIWlzQ29udGludWF0aW9uKSB7XG4gICAgICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygncmVmZXJlbmNlJylcbiAgICAgIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gICAgICBzdGF0ZS5wYXJlbnRUeXBlID0gJ3JlZmVyZW5jZSdcblxuICAgICAgLy8gU29tZSB0YWdzIGNhbiB0ZXJtaW5hdGUgcGFyYWdyYXBoIHdpdGhvdXQgZW1wdHkgbGluZS5cbiAgICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgYW5vdGhlciBibG9ja1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgLy8gbWF4ICsgMSBleHBsaWNpdGx5IGluY2x1ZGVzIHRoZSBuZXdsaW5lXG4gICAgcmV0dXJuIHN0YXRlLnNyYy5zbGljZShwb3MsIG1heCArIDEpXG4gIH1cblxuICBsZXQgc3RyID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4ICsgMSlcblxuICBtYXggPSBzdHIubGVuZ3RoXG4gIGxldCBsYWJlbEVuZCA9IC0xXG5cbiAgZm9yIChwb3MgPSAxOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKGNoID09PSAweDVCIC8qIFsgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUQgLyogXSAqLykge1xuICAgICAgbGFiZWxFbmQgPSBwb3NcbiAgICAgIGJyZWFrXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHgwQSAvKiBcXG4gKi8pIHtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgICBpZiAobGluZUNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICAgICAgbmV4dExpbmUrK1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUMgLyogXFwgKi8pIHtcbiAgICAgIHBvcysrXG4gICAgICBpZiAocG9zIDwgbWF4ICYmIHN0ci5jaGFyQ29kZUF0KHBvcykgPT09IDB4MEEpIHtcbiAgICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICAgIG5leHRMaW5lKytcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChsYWJlbEVuZCA8IDAgfHwgc3RyLmNoYXJDb2RlQXQobGFiZWxFbmQgKyAxKSAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgIF5eXiBza2lwIG9wdGlvbmFsIHdoaXRlc3BhY2UgaGVyZVxuICBmb3IgKHBvcyA9IGxhYmVsRW5kICsgMjsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjaCA9PT0gMHgwQSkge1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgIGlmIChsaW5lQ29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICBuZXh0TGluZSsrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgLyogZXNsaW50IG5vLWVtcHR5OjAgKi9cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBbbGFiZWxdOiAgIGRlc3RpbmF0aW9uICAgJ3RpdGxlJ1xuICAvLyAgICAgICAgICAgIF5eXl5eXl5eXl5eIHBhcnNlIHRoaXNcbiAgY29uc3QgZGVzdFJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rRGVzdGluYXRpb24oc3RyLCBwb3MsIG1heClcbiAgaWYgKCFkZXN0UmVzLm9rKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgaHJlZiA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsoZGVzdFJlcy5zdHIpXG4gIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGhyZWYpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgcG9zID0gZGVzdFJlcy5wb3NcblxuICAvLyBzYXZlIGN1cnNvciBzdGF0ZSwgd2UgY291bGQgcmVxdWlyZSB0byByb2xsYmFjayBsYXRlclxuICBjb25zdCBkZXN0RW5kUG9zID0gcG9zXG4gIGNvbnN0IGRlc3RFbmRMaW5lTm8gPSBuZXh0TGluZVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBeXl4gc2tpcHBpbmcgdGhvc2Ugc3BhY2VzXG4gIGNvbnN0IHN0YXJ0ID0gcG9zXG4gIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKGNoID09PSAweDBBKSB7XG4gICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgICAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgICAgIG5leHRMaW5lKytcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3BhY2UoY2gpKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tZW1wdHk6MCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eIHBhcnNlIHRoaXNcbiAgbGV0IHRpdGxlUmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdHIsIHBvcywgbWF4KVxuICB3aGlsZSAodGl0bGVSZXMuY2FuX2NvbnRpbnVlKSB7XG4gICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICBpZiAobGluZUNvbnRlbnQgPT09IG51bGwpIGJyZWFrXG4gICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgcG9zID0gbWF4XG4gICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgIG5leHRMaW5lKytcbiAgICB0aXRsZVJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rVGl0bGUoc3RyLCBwb3MsIG1heCwgdGl0bGVSZXMpXG4gIH1cbiAgbGV0IHRpdGxlXG5cbiAgaWYgKHBvcyA8IG1heCAmJiBzdGFydCAhPT0gcG9zICYmIHRpdGxlUmVzLm9rKSB7XG4gICAgdGl0bGUgPSB0aXRsZVJlcy5zdHJcbiAgICBwb3MgPSB0aXRsZVJlcy5wb3NcbiAgfSBlbHNlIHtcbiAgICB0aXRsZSA9ICcnXG4gICAgcG9zID0gZGVzdEVuZFBvc1xuICAgIG5leHRMaW5lID0gZGVzdEVuZExpbmVOb1xuICB9XG5cbiAgLy8gc2tpcCB0cmFpbGluZyBzcGFjZXMgdW50aWwgdGhlIHJlc3Qgb2YgdGhlIGxpbmVcbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmICghaXNTcGFjZShjaCkpIHsgYnJlYWsgfVxuICAgIHBvcysrXG4gIH1cblxuICBpZiAocG9zIDwgbWF4ICYmIHN0ci5jaGFyQ29kZUF0KHBvcykgIT09IDB4MEEpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIC8vIGdhcmJhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhZnRlciB0aXRsZSxcbiAgICAgIC8vIGJ1dCBpdCBjb3VsZCBzdGlsbCBiZSBhIHZhbGlkIHJlZmVyZW5jZSBpZiB3ZSByb2xsIGJhY2tcbiAgICAgIHRpdGxlID0gJydcbiAgICAgIHBvcyA9IGRlc3RFbmRQb3NcbiAgICAgIG5leHRMaW5lID0gZGVzdEVuZExpbmVOb1xuICAgICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgaWYgKCFpc1NwYWNlKGNoKSkgeyBicmVhayB9XG4gICAgICAgIHBvcysrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHBvcyA8IG1heCAmJiBzdHIuY2hhckNvZGVBdChwb3MpICE9PSAweDBBKSB7XG4gICAgLy8gZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBsYWJlbCA9IG5vcm1hbGl6ZVJlZmVyZW5jZShzdHIuc2xpY2UoMSwgbGFiZWxFbmQpKVxuICBpZiAoIWxhYmVsKSB7XG4gICAgLy8gQ29tbW9uTWFyayAwLjIwIGRpc2FsbG93cyBlbXB0eSBsYWJlbHNcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFJlZmVyZW5jZSBjYW4gbm90IHRlcm1pbmF0ZSBhbnl0aGluZy4gVGhpcyBjaGVjayBpcyBmb3Igc2FmZXR5IG9ubHkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXRlLmVudi5yZWZlcmVuY2VzID0ge31cbiAgfVxuICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzW2xhYmVsXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0ZS5lbnYucmVmZXJlbmNlc1tsYWJlbF0gPSB7IHRpdGxlLCBocmVmIH1cbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBuZXh0TGluZVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUGFyc2VyIHN0YXRlIGNsYXNzXG5cbmltcG9ydCBUb2tlbiBmcm9tICcuLi90b2tlbi5tanMnXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZnVuY3Rpb24gU3RhdGVCbG9jayAoc3JjLCBtZCwgZW52LCB0b2tlbnMpIHtcbiAgdGhpcy5zcmMgPSBzcmNcblxuICAvLyBsaW5rIHRvIHBhcnNlciBpbnN0YW5jZVxuICB0aGlzLm1kICAgICA9IG1kXG5cbiAgdGhpcy5lbnYgPSBlbnZcblxuICAvL1xuICAvLyBJbnRlcm5hbCBzdGF0ZSB2YXJ0aWFibGVzXG4gIC8vXG5cbiAgdGhpcy50b2tlbnMgPSB0b2tlbnNcblxuICB0aGlzLmJNYXJrcyA9IFtdICAvLyBsaW5lIGJlZ2luIG9mZnNldHMgZm9yIGZhc3QganVtcHNcbiAgdGhpcy5lTWFya3MgPSBbXSAgLy8gbGluZSBlbmQgb2Zmc2V0cyBmb3IgZmFzdCBqdW1wc1xuICB0aGlzLnRTaGlmdCA9IFtdICAvLyBvZmZzZXRzIG9mIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVycyAodGFicyBub3QgZXhwYW5kZWQpXG4gIHRoaXMuc0NvdW50ID0gW10gIC8vIGluZGVudHMgZm9yIGVhY2ggbGluZSAodGFicyBleHBhbmRlZClcblxuICAvLyBBbiBhbW91bnQgb2YgdmlydHVhbCBzcGFjZXMgKHRhYnMgZXhwYW5kZWQpIGJldHdlZW4gYmVnaW5uaW5nXG4gIC8vIG9mIGVhY2ggbGluZSAoYk1hcmtzKSBhbmQgcmVhbCBiZWdpbm5pbmcgb2YgdGhhdCBsaW5lLlxuICAvL1xuICAvLyBJdCBleGlzdHMgb25seSBhcyBhIGhhY2sgYmVjYXVzZSBibG9ja3F1b3RlcyBvdmVycmlkZSBiTWFya3NcbiAgLy8gbG9zaW5nIGluZm9ybWF0aW9uIGluIHRoZSBwcm9jZXNzLlxuICAvL1xuICAvLyBJdCdzIHVzZWQgb25seSB3aGVuIGV4cGFuZGluZyB0YWJzLCB5b3UgY2FuIHRoaW5rIGFib3V0IGl0IGFzXG4gIC8vIGFuIGluaXRpYWwgdGFiIGxlbmd0aCwgZS5nLiBic0NvdW50PTIxIGFwcGxpZWQgdG8gc3RyaW5nIGBcXHQxMjNgXG4gIC8vIG1lYW5zIGZpcnN0IHRhYiBzaG91bGQgYmUgZXhwYW5kZWQgdG8gNC0yMSU0ID09PSAzIHNwYWNlcy5cbiAgLy9cbiAgdGhpcy5ic0NvdW50ID0gW11cblxuICAvLyBibG9jayBwYXJzZXIgdmFyaWFibGVzXG5cbiAgLy8gcmVxdWlyZWQgYmxvY2sgY29udGVudCBpbmRlbnQgKGZvciBleGFtcGxlLCBpZiB3ZSBhcmVcbiAgLy8gaW5zaWRlIGEgbGlzdCwgaXQgd291bGQgYmUgcG9zaXRpb25lZCBhZnRlciBsaXN0IG1hcmtlcilcbiAgdGhpcy5ibGtJbmRlbnQgID0gMFxuICB0aGlzLmxpbmUgICAgICAgPSAwIC8vIGxpbmUgaW5kZXggaW4gc3JjXG4gIHRoaXMubGluZU1heCAgICA9IDAgLy8gbGluZXMgY291bnRcbiAgdGhpcy50aWdodCAgICAgID0gZmFsc2UgIC8vIGxvb3NlL3RpZ2h0IG1vZGUgZm9yIGxpc3RzXG4gIHRoaXMuZGRJbmRlbnQgICA9IC0xIC8vIGluZGVudCBvZiB0aGUgY3VycmVudCBkZCBibG9jayAoLTEgaWYgdGhlcmUgaXNuJ3QgYW55KVxuICB0aGlzLmxpc3RJbmRlbnQgPSAtMSAvLyBpbmRlbnQgb2YgdGhlIGN1cnJlbnQgbGlzdCBibG9jayAoLTEgaWYgdGhlcmUgaXNuJ3QgYW55KVxuXG4gIC8vIGNhbiBiZSAnYmxvY2txdW90ZScsICdsaXN0JywgJ3Jvb3QnLCAncGFyYWdyYXBoJyBvciAncmVmZXJlbmNlJ1xuICAvLyB1c2VkIGluIGxpc3RzIHRvIGRldGVybWluZSBpZiB0aGV5IGludGVycnVwdCBhIHBhcmFncmFwaFxuICB0aGlzLnBhcmVudFR5cGUgPSAncm9vdCdcblxuICB0aGlzLmxldmVsID0gMFxuXG4gIC8vIENyZWF0ZSBjYWNoZXNcbiAgLy8gR2VuZXJhdGUgbWFya2Vycy5cbiAgY29uc3QgcyA9IHRoaXMuc3JjXG5cbiAgZm9yIChsZXQgc3RhcnQgPSAwLCBwb3MgPSAwLCBpbmRlbnQgPSAwLCBvZmZzZXQgPSAwLCBsZW4gPSBzLmxlbmd0aCwgaW5kZW50X2ZvdW5kID0gZmFsc2U7IHBvcyA8IGxlbjsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoIWluZGVudF9mb3VuZCkge1xuICAgICAgaWYgKGlzU3BhY2UoY2gpKSB7XG4gICAgICAgIGluZGVudCsrXG5cbiAgICAgICAgaWYgKGNoID09PSAweDA5KSB7XG4gICAgICAgICAgb2Zmc2V0ICs9IDQgLSBvZmZzZXQgJSA0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0KytcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50X2ZvdW5kID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaCA9PT0gMHgwQSB8fCBwb3MgPT09IGxlbiAtIDEpIHtcbiAgICAgIGlmIChjaCAhPT0gMHgwQSkgeyBwb3MrKyB9XG4gICAgICB0aGlzLmJNYXJrcy5wdXNoKHN0YXJ0KVxuICAgICAgdGhpcy5lTWFya3MucHVzaChwb3MpXG4gICAgICB0aGlzLnRTaGlmdC5wdXNoKGluZGVudClcbiAgICAgIHRoaXMuc0NvdW50LnB1c2gob2Zmc2V0KVxuICAgICAgdGhpcy5ic0NvdW50LnB1c2goMClcblxuICAgICAgaW5kZW50X2ZvdW5kID0gZmFsc2VcbiAgICAgIGluZGVudCA9IDBcbiAgICAgIG9mZnNldCA9IDBcbiAgICAgIHN0YXJ0ID0gcG9zICsgMVxuICAgIH1cbiAgfVxuXG4gIC8vIFB1c2ggZmFrZSBlbnRyeSB0byBzaW1wbGlmeSBjYWNoZSBib3VuZHMgY2hlY2tzXG4gIHRoaXMuYk1hcmtzLnB1c2gocy5sZW5ndGgpXG4gIHRoaXMuZU1hcmtzLnB1c2gocy5sZW5ndGgpXG4gIHRoaXMudFNoaWZ0LnB1c2goMClcbiAgdGhpcy5zQ291bnQucHVzaCgwKVxuICB0aGlzLmJzQ291bnQucHVzaCgwKVxuXG4gIHRoaXMubGluZU1heCA9IHRoaXMuYk1hcmtzLmxlbmd0aCAtIDEgLy8gZG9uJ3QgY291bnQgbGFzdCBmYWtlIGxpbmVcbn1cblxuLy8gUHVzaCBuZXcgdG9rZW4gdG8gXCJzdHJlYW1cIi5cbi8vXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHR5cGUsIHRhZywgbmVzdGluZykge1xuICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbih0eXBlLCB0YWcsIG5lc3RpbmcpXG4gIHRva2VuLmJsb2NrID0gdHJ1ZVxuXG4gIGlmIChuZXN0aW5nIDwgMCkgdGhpcy5sZXZlbC0tIC8vIGNsb3NpbmcgdGFnXG4gIHRva2VuLmxldmVsID0gdGhpcy5sZXZlbFxuICBpZiAobmVzdGluZyA+IDApIHRoaXMubGV2ZWwrKyAvLyBvcGVuaW5nIHRhZ1xuXG4gIHRoaXMudG9rZW5zLnB1c2godG9rZW4pXG4gIHJldHVybiB0b2tlblxufVxuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gaXNFbXB0eSAobGluZSkge1xuICByZXR1cm4gdGhpcy5iTWFya3NbbGluZV0gKyB0aGlzLnRTaGlmdFtsaW5lXSA+PSB0aGlzLmVNYXJrc1tsaW5lXVxufVxuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwRW1wdHlMaW5lcyA9IGZ1bmN0aW9uIHNraXBFbXB0eUxpbmVzIChmcm9tKSB7XG4gIGZvciAobGV0IG1heCA9IHRoaXMubGluZU1heDsgZnJvbSA8IG1heDsgZnJvbSsrKSB7XG4gICAgaWYgKHRoaXMuYk1hcmtzW2Zyb21dICsgdGhpcy50U2hpZnRbZnJvbV0gPCB0aGlzLmVNYXJrc1tmcm9tXSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZyb21cbn1cblxuLy8gU2tpcCBzcGFjZXMgZnJvbSBnaXZlbiBwb3NpdGlvbi5cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBTcGFjZXMgPSBmdW5jdGlvbiBza2lwU3BhY2VzIChwb3MpIHtcbiAgZm9yIChsZXQgbWF4ID0gdGhpcy5zcmMubGVuZ3RoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSB0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoIWlzU3BhY2UoY2gpKSB7IGJyZWFrIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIFNraXAgc3BhY2VzIGZyb20gZ2l2ZW4gcG9zaXRpb24gaW4gcmV2ZXJzZS5cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBTcGFjZXNCYWNrID0gZnVuY3Rpb24gc2tpcFNwYWNlc0JhY2sgKHBvcywgbWluKSB7XG4gIGlmIChwb3MgPD0gbWluKSB7IHJldHVybiBwb3MgfVxuXG4gIHdoaWxlIChwb3MgPiBtaW4pIHtcbiAgICBpZiAoIWlzU3BhY2UodGhpcy5zcmMuY2hhckNvZGVBdCgtLXBvcykpKSB7IHJldHVybiBwb3MgKyAxIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIFNraXAgY2hhciBjb2RlcyBmcm9tIGdpdmVuIHBvc2l0aW9uXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwQ2hhcnMgPSBmdW5jdGlvbiBza2lwQ2hhcnMgKHBvcywgY29kZSkge1xuICBmb3IgKGxldCBtYXggPSB0aGlzLnNyYy5sZW5ndGg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBpZiAodGhpcy5zcmMuY2hhckNvZGVBdChwb3MpICE9PSBjb2RlKSB7IGJyZWFrIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIFNraXAgY2hhciBjb2RlcyByZXZlcnNlIGZyb20gZ2l2ZW4gcG9zaXRpb24gLSAxXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5za2lwQ2hhcnNCYWNrID0gZnVuY3Rpb24gc2tpcENoYXJzQmFjayAocG9zLCBjb2RlLCBtaW4pIHtcbiAgaWYgKHBvcyA8PSBtaW4pIHsgcmV0dXJuIHBvcyB9XG5cbiAgd2hpbGUgKHBvcyA+IG1pbikge1xuICAgIGlmIChjb2RlICE9PSB0aGlzLnNyYy5jaGFyQ29kZUF0KC0tcG9zKSkgeyByZXR1cm4gcG9zICsgMSB9XG4gIH1cbiAgcmV0dXJuIHBvc1xufVxuXG4vLyBjdXQgbGluZXMgcmFuZ2UgZnJvbSBzb3VyY2UuXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5nZXRMaW5lcyA9IGZ1bmN0aW9uIGdldExpbmVzIChiZWdpbiwgZW5kLCBpbmRlbnQsIGtlZXBMYXN0TEYpIHtcbiAgaWYgKGJlZ2luID49IGVuZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3QgcXVldWUgPSBuZXcgQXJyYXkoZW5kIC0gYmVnaW4pXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxpbmUgPSBiZWdpbjsgbGluZSA8IGVuZDsgbGluZSsrLCBpKyspIHtcbiAgICBsZXQgbGluZUluZGVudCA9IDBcbiAgICBjb25zdCBsaW5lU3RhcnQgPSB0aGlzLmJNYXJrc1tsaW5lXVxuICAgIGxldCBmaXJzdCA9IGxpbmVTdGFydFxuICAgIGxldCBsYXN0XG5cbiAgICBpZiAobGluZSArIDEgPCBlbmQgfHwga2VlcExhc3RMRikge1xuICAgICAgLy8gTm8gbmVlZCBmb3IgYm91bmRzIGNoZWNrIGJlY2F1c2Ugd2UgaGF2ZSBmYWtlIGVudHJ5IG9uIHRhaWwuXG4gICAgICBsYXN0ID0gdGhpcy5lTWFya3NbbGluZV0gKyAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3QgPSB0aGlzLmVNYXJrc1tsaW5lXVxuICAgIH1cblxuICAgIHdoaWxlIChmaXJzdCA8IGxhc3QgJiYgbGluZUluZGVudCA8IGluZGVudCkge1xuICAgICAgY29uc3QgY2ggPSB0aGlzLnNyYy5jaGFyQ29kZUF0KGZpcnN0KVxuXG4gICAgICBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgICAgaWYgKGNoID09PSAweDA5KSB7XG4gICAgICAgICAgbGluZUluZGVudCArPSA0IC0gKGxpbmVJbmRlbnQgKyB0aGlzLmJzQ291bnRbbGluZV0pICUgNFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpbmVJbmRlbnQrK1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0IC0gbGluZVN0YXJ0IDwgdGhpcy50U2hpZnRbbGluZV0pIHtcbiAgICAgICAgLy8gcGF0Y2hlZCB0U2hpZnQgbWFza2VkIGNoYXJhY3RlcnMgdG8gbG9vayBsaWtlIHNwYWNlcyAoYmxvY2txdW90ZXMsIGxpc3QgbWFya2VycylcbiAgICAgICAgbGluZUluZGVudCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBmaXJzdCsrXG4gICAgfVxuXG4gICAgaWYgKGxpbmVJbmRlbnQgPiBpbmRlbnQpIHtcbiAgICAgIC8vIHBhcnRpYWxseSBleHBhbmRpbmcgdGFicyBpbiBjb2RlIGJsb2NrcywgZS5nICdcXHRcXHRmb29iYXInXG4gICAgICAvLyB3aXRoIGluZGVudD0yIGJlY29tZXMgJyAgXFx0Zm9vYmFyJ1xuICAgICAgcXVldWVbaV0gPSBuZXcgQXJyYXkobGluZUluZGVudCAtIGluZGVudCArIDEpLmpvaW4oJyAnKSArIHRoaXMuc3JjLnNsaWNlKGZpcnN0LCBsYXN0KVxuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZVtpXSA9IHRoaXMuc3JjLnNsaWNlKGZpcnN0LCBsYXN0KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBxdWV1ZS5qb2luKCcnKVxufVxuXG4vLyByZS1leHBvcnQgVG9rZW4gY2xhc3MgdG8gdXNlIGluIGJsb2NrIHJ1bGVzXG5TdGF0ZUJsb2NrLnByb3RvdHlwZS5Ub2tlbiA9IFRva2VuXG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRlQmxvY2tcbiIsIi8vIEdGTSB0YWJsZSwgaHR0cHM6Ly9naXRodWIuZ2l0aHViLmNvbS9nZm0vI3RhYmxlcy1leHRlbnNpb24tXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG4vLyBMaW1pdCB0aGUgYW1vdW50IG9mIGVtcHR5IGF1dG9jb21wbGV0ZWQgY2VsbHMgaW4gYSB0YWJsZSxcbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvaXNzdWVzLzEwMDAsXG4vL1xuLy8gQm90aCBwdWxsZG93bi1jbWFyayBhbmQgY29tbW9ubWFyay1ocyBsaW1pdCB0aGUgbnVtYmVyIG9mIGNlbGxzIHRoaXMgd2F5IHRvIH4yMDBrLlxuLy8gV2Ugc2V0IGl0IHRvIDY1aywgd2hpY2ggY2FuIGV4cGFuZCB1c2VyIGlucHV0IGJ5IGEgZmFjdG9yIG9mIHgzNzBcbi8vICgyNTZ4MjU2IHNxdWFyZSBpcyAxLjhrQiBleHBhbmRlZCBpbnRvIDY1MGtCKS5cbmNvbnN0IE1BWF9BVVRPQ09NUExFVEVEX0NFTExTID0gMHgxMDAwMFxuXG5mdW5jdGlvbiBnZXRMaW5lIChzdGF0ZSwgbGluZSkge1xuICBjb25zdCBwb3MgPSBzdGF0ZS5iTWFya3NbbGluZV0gKyBzdGF0ZS50U2hpZnRbbGluZV1cbiAgY29uc3QgbWF4ID0gc3RhdGUuZU1hcmtzW2xpbmVdXG5cbiAgcmV0dXJuIHN0YXRlLnNyYy5zbGljZShwb3MsIG1heClcbn1cblxuZnVuY3Rpb24gZXNjYXBlZFNwbGl0IChzdHIpIHtcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgY29uc3QgbWF4ID0gc3RyLmxlbmd0aFxuXG4gIGxldCBwb3MgPSAwXG4gIGxldCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgbGV0IGlzRXNjYXBlZCA9IGZhbHNlXG4gIGxldCBsYXN0UG9zID0gMFxuICBsZXQgY3VycmVudCA9ICcnXG5cbiAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgIGlmIChjaCA9PT0gMHg3Yy8qIHwgKi8pIHtcbiAgICAgIGlmICghaXNFc2NhcGVkKSB7XG4gICAgICAgIC8vIHBpcGUgc2VwYXJhdGluZyBjZWxscywgJ3wnXG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQgKyBzdHIuc3Vic3RyaW5nKGxhc3RQb3MsIHBvcykpXG4gICAgICAgIGN1cnJlbnQgPSAnJ1xuICAgICAgICBsYXN0UG9zID0gcG9zICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNjYXBlZCBwaXBlLCAnXFx8J1xuICAgICAgICBjdXJyZW50ICs9IHN0ci5zdWJzdHJpbmcobGFzdFBvcywgcG9zIC0gMSlcbiAgICAgICAgbGFzdFBvcyA9IHBvc1xuICAgICAgfVxuICAgIH1cblxuICAgIGlzRXNjYXBlZCA9IChjaCA9PT0gMHg1Yy8qIFxcICovKVxuICAgIHBvcysrXG5cbiAgICBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgfVxuXG4gIHJlc3VsdC5wdXNoKGN1cnJlbnQgKyBzdHIuc3Vic3RyaW5nKGxhc3RQb3MpKVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGFibGUgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICAvLyBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0d28gbGluZXNcbiAgaWYgKHN0YXJ0TGluZSArIDIgPiBlbmRMaW5lKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2Vjb25kIGxpbmUgc2hvdWxkIGJlICd8JywgJy0nLCAnOicsXG4gIC8vIGFuZCBubyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkIGJ1dCBzcGFjZXM7XG4gIC8vIGJhc2ljYWxseSwgdGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiAvXlstOnxdWy06fFxcc10qJC8gcmVnZXhwXG5cbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gIGlmIChwb3MgPj0gc3RhdGUuZU1hcmtzW25leHRMaW5lXSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IGZpcnN0Q2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgaWYgKGZpcnN0Q2ggIT09IDB4N0MvKiB8ICovICYmIGZpcnN0Q2ggIT09IDB4MkQvKiAtICovICYmIGZpcnN0Q2ggIT09IDB4M0EvKiA6ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHBvcyA+PSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc2Vjb25kQ2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgaWYgKHNlY29uZENoICE9PSAweDdDLyogfCAqLyAmJiBzZWNvbmRDaCAhPT0gMHgyRC8qIC0gKi8gJiYgc2Vjb25kQ2ggIT09IDB4M0EvKiA6ICovICYmICFpc1NwYWNlKHNlY29uZENoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gaWYgZmlyc3QgY2hhcmFjdGVyIGlzICctJywgdGhlbiBzZWNvbmQgY2hhcmFjdGVyIG11c3Qgbm90IGJlIGEgc3BhY2VcbiAgLy8gKGR1ZSB0byBwYXJzaW5nIGFtYmlndWl0eSB3aXRoIGxpc3QpXG4gIGlmIChmaXJzdENoID09PSAweDJELyogLSAqLyAmJiBpc1NwYWNlKHNlY29uZENoKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHdoaWxlIChwb3MgPCBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSB7XG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoY2ggIT09IDB4N0MvKiB8ICovICYmIGNoICE9PSAweDJELyogLSAqLyAmJiBjaCAhPT0gMHgzQS8qIDogKi8gJiYgIWlzU3BhY2UoY2gpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgbGV0IGxpbmVUZXh0ID0gZ2V0TGluZShzdGF0ZSwgc3RhcnRMaW5lICsgMSlcbiAgbGV0IGNvbHVtbnMgPSBsaW5lVGV4dC5zcGxpdCgnfCcpXG4gIGNvbnN0IGFsaWducyA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHQgPSBjb2x1bW5zW2ldLnRyaW0oKVxuICAgIGlmICghdCkge1xuICAgICAgLy8gYWxsb3cgZW1wdHkgY29sdW1ucyBiZWZvcmUgYW5kIGFmdGVyIHRhYmxlLCBidXQgbm90IGluIGJldHdlZW4gY29sdW1ucztcbiAgICAgIC8vIGUuZy4gYWxsb3cgYCB8LS0tfCBgLCBkaXNhbGxvdyBgIC0tLXx8LS0tIGBcbiAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IGNvbHVtbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEvXjo/LSs6PyQvLnRlc3QodCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAodC5jaGFyQ29kZUF0KHQubGVuZ3RoIC0gMSkgPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBhbGlnbnMucHVzaCh0LmNoYXJDb2RlQXQoMCkgPT09IDB4M0EvKiA6ICovID8gJ2NlbnRlcicgOiAncmlnaHQnKVxuICAgIH0gZWxzZSBpZiAodC5jaGFyQ29kZUF0KDApID09PSAweDNBLyogOiAqLykge1xuICAgICAgYWxpZ25zLnB1c2goJ2xlZnQnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhbGlnbnMucHVzaCgnJylcbiAgICB9XG4gIH1cblxuICBsaW5lVGV4dCA9IGdldExpbmUoc3RhdGUsIHN0YXJ0TGluZSkudHJpbSgpXG4gIGlmIChsaW5lVGV4dC5pbmRleE9mKCd8JykgPT09IC0xKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG4gIGNvbHVtbnMgPSBlc2NhcGVkU3BsaXQobGluZVRleHQpXG4gIGlmIChjb2x1bW5zLmxlbmd0aCAmJiBjb2x1bW5zWzBdID09PSAnJykgY29sdW1ucy5zaGlmdCgpXG4gIGlmIChjb2x1bW5zLmxlbmd0aCAmJiBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0gPT09ICcnKSBjb2x1bW5zLnBvcCgpXG5cbiAgLy8gaGVhZGVyIHJvdyB3aWxsIGRlZmluZSBhbiBhbW91bnQgb2YgY29sdW1ucyBpbiB0aGUgZW50aXJlIHRhYmxlLFxuICAvLyBhbmQgYWxpZ24gcm93IHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lICh0aGUgcmVzdCBvZiB0aGUgcm93cyBjYW4gZGlmZmVyKVxuICBjb25zdCBjb2x1bW5Db3VudCA9IGNvbHVtbnMubGVuZ3RoXG4gIGlmIChjb2x1bW5Db3VudCA9PT0gMCB8fCBjb2x1bW5Db3VudCAhPT0gYWxpZ25zLmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIGNvbnN0IG9sZFBhcmVudFR5cGUgPSBzdGF0ZS5wYXJlbnRUeXBlXG4gIHN0YXRlLnBhcmVudFR5cGUgPSAndGFibGUnXG5cbiAgLy8gdXNlICdibG9ja3F1b3RlJyBsaXN0cyBmb3IgdGVybWluYXRpb24gYmVjYXVzZSBpdCdzXG4gIC8vIHRoZSBtb3N0IHNpbWlsYXIgdG8gdGFibGVzXG4gIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdibG9ja3F1b3RlJylcblxuICBjb25zdCB0b2tlbl90byA9IHN0YXRlLnB1c2goJ3RhYmxlX29wZW4nLCAndGFibGUnLCAxKVxuICBjb25zdCB0YWJsZUxpbmVzID0gW3N0YXJ0TGluZSwgMF1cbiAgdG9rZW5fdG8ubWFwID0gdGFibGVMaW5lc1xuXG4gIGNvbnN0IHRva2VuX3RobyA9IHN0YXRlLnB1c2goJ3RoZWFkX29wZW4nLCAndGhlYWQnLCAxKVxuICB0b2tlbl90aG8ubWFwID0gW3N0YXJ0TGluZSwgc3RhcnRMaW5lICsgMV1cblxuICBjb25zdCB0b2tlbl9odHJvID0gc3RhdGUucHVzaCgndHJfb3BlbicsICd0cicsIDEpXG4gIHRva2VuX2h0cm8ubWFwID0gW3N0YXJ0TGluZSwgc3RhcnRMaW5lICsgMV1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbl9obyA9IHN0YXRlLnB1c2goJ3RoX29wZW4nLCAndGgnLCAxKVxuICAgIGlmIChhbGlnbnNbaV0pIHtcbiAgICAgIHRva2VuX2hvLmF0dHJzICA9IFtbJ3N0eWxlJywgJ3RleHQtYWxpZ246JyArIGFsaWduc1tpXV1dXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5faWwgPSBzdGF0ZS5wdXNoKCdpbmxpbmUnLCAnJywgMClcbiAgICB0b2tlbl9pbC5jb250ZW50ICA9IGNvbHVtbnNbaV0udHJpbSgpXG4gICAgdG9rZW5faWwuY2hpbGRyZW4gPSBbXVxuXG4gICAgc3RhdGUucHVzaCgndGhfY2xvc2UnLCAndGgnLCAtMSlcbiAgfVxuXG4gIHN0YXRlLnB1c2goJ3RyX2Nsb3NlJywgJ3RyJywgLTEpXG4gIHN0YXRlLnB1c2goJ3RoZWFkX2Nsb3NlJywgJ3RoZWFkJywgLTEpXG5cbiAgbGV0IHRib2R5TGluZXNcbiAgbGV0IGF1dG9jb21wbGV0ZWRDZWxscyA9IDBcblxuICBmb3IgKG5leHRMaW5lID0gc3RhcnRMaW5lICsgMjsgbmV4dExpbmUgPCBlbmRMaW5lOyBuZXh0TGluZSsrKSB7XG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgYnJlYWsgfVxuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXJtaW5hdGUpIHsgYnJlYWsgfVxuICAgIGxpbmVUZXh0ID0gZ2V0TGluZShzdGF0ZSwgbmV4dExpbmUpLnRyaW0oKVxuICAgIGlmICghbGluZVRleHQpIHsgYnJlYWsgfVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgYnJlYWsgfVxuICAgIGNvbHVtbnMgPSBlc2NhcGVkU3BsaXQobGluZVRleHQpXG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbMF0gPT09ICcnKSBjb2x1bW5zLnNoaWZ0KClcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggJiYgY29sdW1uc1tjb2x1bW5zLmxlbmd0aCAtIDFdID09PSAnJykgY29sdW1ucy5wb3AoKVxuXG4gICAgLy8gbm90ZTogYXV0b2NvbXBsZXRlIGNvdW50IGNhbiBiZSBuZWdhdGl2ZSBpZiB1c2VyIHNwZWNpZmllcyBtb3JlIGNvbHVtbnMgdGhhbiBoZWFkZXIsXG4gICAgLy8gYnV0IHRoYXQgZG9lcyBub3QgYWZmZWN0IGludGVuZGVkIHVzZSAod2hpY2ggaXMgbGltaXRpbmcgZXhwYW5zaW9uKVxuICAgIGF1dG9jb21wbGV0ZWRDZWxscyArPSBjb2x1bW5Db3VudCAtIGNvbHVtbnMubGVuZ3RoXG4gICAgaWYgKGF1dG9jb21wbGV0ZWRDZWxscyA+IE1BWF9BVVRPQ09NUExFVEVEX0NFTExTKSB7IGJyZWFrIH1cblxuICAgIGlmIChuZXh0TGluZSA9PT0gc3RhcnRMaW5lICsgMikge1xuICAgICAgY29uc3QgdG9rZW5fdGJvID0gc3RhdGUucHVzaCgndGJvZHlfb3BlbicsICd0Ym9keScsIDEpXG4gICAgICB0b2tlbl90Ym8ubWFwID0gdGJvZHlMaW5lcyA9IFtzdGFydExpbmUgKyAyLCAwXVxuICAgIH1cblxuICAgIGNvbnN0IHRva2VuX3RybyA9IHN0YXRlLnB1c2goJ3RyX29wZW4nLCAndHInLCAxKVxuICAgIHRva2VuX3Ryby5tYXAgPSBbbmV4dExpbmUsIG5leHRMaW5lICsgMV1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdG9rZW5fdGRvID0gc3RhdGUucHVzaCgndGRfb3BlbicsICd0ZCcsIDEpXG4gICAgICBpZiAoYWxpZ25zW2ldKSB7XG4gICAgICAgIHRva2VuX3Rkby5hdHRycyAgPSBbWydzdHlsZScsICd0ZXh0LWFsaWduOicgKyBhbGlnbnNbaV1dXVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbl9pbCA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICAgICAgdG9rZW5faWwuY29udGVudCAgPSBjb2x1bW5zW2ldID8gY29sdW1uc1tpXS50cmltKCkgOiAnJ1xuICAgICAgdG9rZW5faWwuY2hpbGRyZW4gPSBbXVxuXG4gICAgICBzdGF0ZS5wdXNoKCd0ZF9jbG9zZScsICd0ZCcsIC0xKVxuICAgIH1cbiAgICBzdGF0ZS5wdXNoKCd0cl9jbG9zZScsICd0cicsIC0xKVxuICB9XG5cbiAgaWYgKHRib2R5TGluZXMpIHtcbiAgICBzdGF0ZS5wdXNoKCd0Ym9keV9jbG9zZScsICd0Ym9keScsIC0xKVxuICAgIHRib2R5TGluZXNbMV0gPSBuZXh0TGluZVxuICB9XG5cbiAgc3RhdGUucHVzaCgndGFibGVfY2xvc2UnLCAndGFibGUnLCAtMSlcbiAgdGFibGVMaW5lc1sxXSA9IG5leHRMaW5lXG5cbiAgc3RhdGUucGFyZW50VHlwZSA9IG9sZFBhcmVudFR5cGVcbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG4gIHJldHVybiB0cnVlXG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBibG9jayAoc3RhdGUpIHtcbiAgbGV0IHRva2VuXG5cbiAgaWYgKHN0YXRlLmlubGluZU1vZGUpIHtcbiAgICB0b2tlbiAgICAgICAgICA9IG5ldyBzdGF0ZS5Ub2tlbignaW5saW5lJywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCAgPSBzdGF0ZS5zcmNcbiAgICB0b2tlbi5tYXAgICAgICA9IFswLCAxXVxuICAgIHRva2VuLmNoaWxkcmVuID0gW11cbiAgICBzdGF0ZS50b2tlbnMucHVzaCh0b2tlbilcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5tZC5ibG9jay5wYXJzZShzdGF0ZS5zcmMsIHN0YXRlLm1kLCBzdGF0ZS5lbnYsIHN0YXRlLnRva2VucylcbiAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5saW5lIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnMgPSBzdGF0ZS50b2tlbnNcblxuICAvLyBQYXJzZSBpbmxpbmVzXG4gIGZvciAobGV0IGkgPSAwLCBsID0gdG9rZW5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IHRvayA9IHRva2Vuc1tpXVxuICAgIGlmICh0b2sudHlwZSA9PT0gJ2lubGluZScpIHtcbiAgICAgIHN0YXRlLm1kLmlubGluZS5wYXJzZSh0b2suY29udGVudCwgc3RhdGUubWQsIHN0YXRlLmVudiwgdG9rLmNoaWxkcmVuKVxuICAgIH1cbiAgfVxufVxuIiwiLy8gUmVwbGFjZSBsaW5rLWxpa2UgdGV4dHMgd2l0aCBsaW5rIG5vZGVzLlxuLy9cbi8vIEN1cnJlbnRseSByZXN0cmljdGVkIGJ5IGBtZC52YWxpZGF0ZUxpbmsoKWAgdG8gaHR0cC9odHRwcy9mdHBcbi8vXG5cbmltcG9ydCB7IGFycmF5UmVwbGFjZUF0IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZnVuY3Rpb24gaXNMaW5rT3BlbiAoc3RyKSB7XG4gIHJldHVybiAvXjxhWz5cXHNdL2kudGVzdChzdHIpXG59XG5mdW5jdGlvbiBpc0xpbmtDbG9zZSAoc3RyKSB7XG4gIHJldHVybiAvXjxcXC9hXFxzKj4vaS50ZXN0KHN0cilcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlua2lmeSAoc3RhdGUpIHtcbiAgY29uc3QgYmxvY2tUb2tlbnMgPSBzdGF0ZS50b2tlbnNcblxuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMubGlua2lmeSkgeyByZXR1cm4gfVxuXG4gIGZvciAobGV0IGogPSAwLCBsID0gYmxvY2tUb2tlbnMubGVuZ3RoOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnIHx8XG4gICAgICAgICFzdGF0ZS5tZC5saW5raWZ5LnByZXRlc3QoYmxvY2tUb2tlbnNbal0uY29udGVudCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgbGV0IHRva2VucyA9IGJsb2NrVG9rZW5zW2pdLmNoaWxkcmVuXG5cbiAgICBsZXQgaHRtbExpbmtMZXZlbCA9IDBcblxuICAgIC8vIFdlIHNjYW4gZnJvbSB0aGUgZW5kLCB0byBrZWVwIHBvc2l0aW9uIHdoZW4gbmV3IHRhZ3MgYWRkZWQuXG4gICAgLy8gVXNlIHJldmVyc2VkIGxvZ2ljIGluIGxpbmtzIHN0YXJ0L2VuZCBtYXRjaFxuICAgIGZvciAobGV0IGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgICAvLyBTa2lwIGNvbnRlbnQgb2YgbWFya2Rvd24gbGlua3NcbiAgICAgIGlmIChjdXJyZW50VG9rZW4udHlwZSA9PT0gJ2xpbmtfY2xvc2UnKSB7XG4gICAgICAgIGktLVxuICAgICAgICB3aGlsZSAodG9rZW5zW2ldLmxldmVsICE9PSBjdXJyZW50VG9rZW4ubGV2ZWwgJiYgdG9rZW5zW2ldLnR5cGUgIT09ICdsaW5rX29wZW4nKSB7XG4gICAgICAgICAgaS0tXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2tpcCBjb250ZW50IG9mIGh0bWwgdGFnIGxpbmtzXG4gICAgICBpZiAoY3VycmVudFRva2VuLnR5cGUgPT09ICdodG1sX2lubGluZScpIHtcbiAgICAgICAgaWYgKGlzTGlua09wZW4oY3VycmVudFRva2VuLmNvbnRlbnQpICYmIGh0bWxMaW5rTGV2ZWwgPiAwKSB7XG4gICAgICAgICAgaHRtbExpbmtMZXZlbC0tXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTGlua0Nsb3NlKGN1cnJlbnRUb2tlbi5jb250ZW50KSkge1xuICAgICAgICAgIGh0bWxMaW5rTGV2ZWwrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaHRtbExpbmtMZXZlbCA+IDApIHsgY29udGludWUgfVxuXG4gICAgICBpZiAoY3VycmVudFRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiBzdGF0ZS5tZC5saW5raWZ5LnRlc3QoY3VycmVudFRva2VuLmNvbnRlbnQpKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBjdXJyZW50VG9rZW4uY29udGVudFxuICAgICAgICBsZXQgbGlua3MgPSBzdGF0ZS5tZC5saW5raWZ5Lm1hdGNoKHRleHQpXG5cbiAgICAgICAgLy8gTm93IHNwbGl0IHN0cmluZyB0byBub2Rlc1xuICAgICAgICBjb25zdCBub2RlcyA9IFtdXG4gICAgICAgIGxldCBsZXZlbCA9IGN1cnJlbnRUb2tlbi5sZXZlbFxuICAgICAgICBsZXQgbGFzdFBvcyA9IDBcblxuICAgICAgICAvLyBmb3JiaWQgZXNjYXBlIHNlcXVlbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLFxuICAgICAgICAvLyB0aGlzIGF2b2lkcyBodHRwXFw6Ly9leGFtcGxlLmNvbS8gZnJvbSBiZWluZyBsaW5raWZpZWQgYXNcbiAgICAgICAgLy8gaHR0cDo8YSBocmVmPVwiLy9leGFtcGxlLmNvbS9cIj4vL2V4YW1wbGUuY29tLzwvYT5cbiAgICAgICAgaWYgKGxpbmtzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIGxpbmtzWzBdLmluZGV4ID09PSAwICYmXG4gICAgICAgICAgICBpID4gMCAmJlxuICAgICAgICAgICAgdG9rZW5zW2kgLSAxXS50eXBlID09PSAndGV4dF9zcGVjaWFsJykge1xuICAgICAgICAgIGxpbmtzID0gbGlua3Muc2xpY2UoMSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCBsaW5rcy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBsaW5rc1tsbl0udXJsXG4gICAgICAgICAgY29uc3QgZnVsbFVybCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsodXJsKVxuICAgICAgICAgIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSB7IGNvbnRpbnVlIH1cblxuICAgICAgICAgIGxldCB1cmxUZXh0ID0gbGlua3NbbG5dLnRleHRcblxuICAgICAgICAgIC8vIExpbmtpZmllciBtaWdodCBzZW5kIHJhdyBob3N0bmFtZXMgbGlrZSBcImV4YW1wbGUuY29tXCIsIHdoZXJlIHVybFxuICAgICAgICAgIC8vIHN0YXJ0cyB3aXRoIGRvbWFpbiBuYW1lLiBTbyB3ZSBwcmVwZW5kIGh0dHA6Ly8gaW4gdGhvc2UgY2FzZXMsXG4gICAgICAgICAgLy8gYW5kIHJlbW92ZSBpdCBhZnRlcndhcmRzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKCFsaW5rc1tsbl0uc2NoZW1hKSB7XG4gICAgICAgICAgICB1cmxUZXh0ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQoJ2h0dHA6Ly8nICsgdXJsVGV4dCkucmVwbGFjZSgvXmh0dHA6XFwvXFwvLywgJycpXG4gICAgICAgICAgfSBlbHNlIGlmIChsaW5rc1tsbl0uc2NoZW1hID09PSAnbWFpbHRvOicgJiYgIS9ebWFpbHRvOi9pLnRlc3QodXJsVGV4dCkpIHtcbiAgICAgICAgICAgIHVybFRleHQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCgnbWFpbHRvOicgKyB1cmxUZXh0KS5yZXBsYWNlKC9ebWFpbHRvOi8sICcnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmxUZXh0ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsVGV4dClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBwb3MgPSBsaW5rc1tsbl0uaW5kZXhcblxuICAgICAgICAgIGlmIChwb3MgPiBsYXN0UG9zKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiAgID0gbmV3IHN0YXRlLlRva2VuKCd0ZXh0JywgJycsIDApXG4gICAgICAgICAgICB0b2tlbi5jb250ZW50ID0gdGV4dC5zbGljZShsYXN0UG9zLCBwb3MpXG4gICAgICAgICAgICB0b2tlbi5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICAgIG5vZGVzLnB1c2godG9rZW4pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdG9rZW5fbyAgID0gbmV3IHN0YXRlLlRva2VuKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICAgICAgdG9rZW5fby5hdHRycyAgID0gW1snaHJlZicsIGZ1bGxVcmxdXVxuICAgICAgICAgIHRva2VuX28ubGV2ZWwgICA9IGxldmVsKytcbiAgICAgICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnbGlua2lmeSdcbiAgICAgICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX28pXG5cbiAgICAgICAgICBjb25zdCB0b2tlbl90ICAgPSBuZXcgc3RhdGUuVG9rZW4oJ3RleHQnLCAnJywgMClcbiAgICAgICAgICB0b2tlbl90LmNvbnRlbnQgPSB1cmxUZXh0XG4gICAgICAgICAgdG9rZW5fdC5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX3QpXG5cbiAgICAgICAgICBjb25zdCB0b2tlbl9jICAgPSBuZXcgc3RhdGUuVG9rZW4oJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICAgICAgICAgIHRva2VuX2MubGV2ZWwgICA9IC0tbGV2ZWxcbiAgICAgICAgICB0b2tlbl9jLm1hcmt1cCAgPSAnbGlua2lmeSdcbiAgICAgICAgICB0b2tlbl9jLmluZm8gICAgPSAnYXV0bydcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuX2MpXG5cbiAgICAgICAgICBsYXN0UG9zID0gbGlua3NbbG5dLmxhc3RJbmRleFxuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0UG9zIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiAgID0gbmV3IHN0YXRlLlRva2VuKCd0ZXh0JywgJycsIDApXG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRleHQuc2xpY2UobGFzdFBvcylcbiAgICAgICAgICB0b2tlbi5sZXZlbCAgID0gbGV2ZWxcbiAgICAgICAgICBub2Rlcy5wdXNoKHRva2VuKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVwbGFjZSBjdXJyZW50IG5vZGVcbiAgICAgICAgYmxvY2tUb2tlbnNbal0uY2hpbGRyZW4gPSB0b2tlbnMgPSBhcnJheVJlcGxhY2VBdCh0b2tlbnMsIGksIG5vZGVzKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gTm9ybWFsaXplIGlucHV0IHN0cmluZ1xuXG4vLyBodHRwczovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4yOS8jbGluZS1lbmRpbmdcbmNvbnN0IE5FV0xJTkVTX1JFICA9IC9cXHJcXG4/fFxcbi9nXG5jb25zdCBOVUxMX1JFICAgICAgPSAvXFwwL2dcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbm9ybWFsaXplIChzdGF0ZSkge1xuICBsZXQgc3RyXG5cbiAgLy8gTm9ybWFsaXplIG5ld2xpbmVzXG4gIHN0ciA9IHN0YXRlLnNyYy5yZXBsYWNlKE5FV0xJTkVTX1JFLCAnXFxuJylcblxuICAvLyBSZXBsYWNlIE5VTEwgY2hhcmFjdGVyc1xuICBzdHIgPSBzdHIucmVwbGFjZShOVUxMX1JFLCAnXFx1RkZGRCcpXG5cbiAgc3RhdGUuc3JjID0gc3RyXG59XG4iLCIvLyBTaW1wbGUgdHlwb2dyYXBoaWMgcmVwbGFjZW1lbnRzXG4vL1xuLy8gKGMpIChDKSDihpIgwqlcbi8vICh0bSkgKFRNKSDihpIg4oSiXG4vLyAocikgKFIpIOKGkiDCrlxuLy8gKy0g4oaSIMKxXG4vLyAuLi4g4oaSIOKApiAoYWxzbyA/Li4uLiDihpIgPy4uLCAhLi4uLiDihpIgIS4uKVxuLy8gPz8/Pz8/Pz8g4oaSID8/PywgISEhISEg4oaSICEhISwgYCwsYCDihpIgYCxgXG4vLyAtLSDihpIgJm5kYXNoOywgLS0tIOKGkiAmbWRhc2g7XG4vL1xuXG4vLyBUT0RPOlxuLy8gLSBmcmFjdGlvbmFscyAxLzIsIDEvNCwgMy80IC0+IMK9LCDCvCwgwr5cbi8vIC0gbXVsdGlwbGljYXRpb25zIDIgeCA0IC0+IDIgw5cgNFxuXG5jb25zdCBSQVJFX1JFID0gL1xcKy18XFwuXFwufFxcP1xcP1xcP1xcP3whISEhfCwsfC0tL1xuXG4vLyBXb3JrYXJvdW5kIGZvciBwaGFudG9tanMgLSBuZWVkIHJlZ2V4IHdpdGhvdXQgL2cgZmxhZyxcbi8vIG9yIHJvb3QgY2hlY2sgd2lsbCBmYWlsIGV2ZXJ5IHNlY29uZCB0aW1lXG5jb25zdCBTQ09QRURfQUJCUl9URVNUX1JFID0gL1xcKChjfHRtfHIpXFwpL2lcblxuY29uc3QgU0NPUEVEX0FCQlJfUkUgPSAvXFwoKGN8dG18cilcXCkvaWdcbmNvbnN0IFNDT1BFRF9BQkJSID0ge1xuICBjOiAnwqknLFxuICByOiAnwq4nLFxuICB0bTogJ+KEoidcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUZuIChtYXRjaCwgbmFtZSkge1xuICByZXR1cm4gU0NPUEVEX0FCQlJbbmFtZS50b0xvd2VyQ2FzZSgpXVxufVxuXG5mdW5jdGlvbiByZXBsYWNlX3Njb3BlZCAoaW5saW5lVG9rZW5zKSB7XG4gIGxldCBpbnNpZGVfYXV0b2xpbmsgPSAwXG5cbiAgZm9yIChsZXQgaSA9IGlubGluZVRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHRva2VuID0gaW5saW5lVG9rZW5zW2ldXG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnICYmICFpbnNpZGVfYXV0b2xpbmspIHtcbiAgICAgIHRva2VuLmNvbnRlbnQgPSB0b2tlbi5jb250ZW50LnJlcGxhY2UoU0NPUEVEX0FCQlJfUkUsIHJlcGxhY2VGbilcbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpbmtfb3BlbicgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmstLVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19jbG9zZScgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmsrK1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlX3JhcmUgKGlubGluZVRva2Vucykge1xuICBsZXQgaW5zaWRlX2F1dG9saW5rID0gMFxuXG4gIGZvciAobGV0IGkgPSBpbmxpbmVUb2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0b2tlbiA9IGlubGluZVRva2Vuc1tpXVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICd0ZXh0JyAmJiAhaW5zaWRlX2F1dG9saW5rKSB7XG4gICAgICBpZiAoUkFSRV9SRS50ZXN0KHRva2VuLmNvbnRlbnQpKSB7XG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSB0b2tlbi5jb250ZW50XG4gICAgICAgICAgLnJlcGxhY2UoL1xcKy0vZywgJ8KxJylcbiAgICAgICAgICAvLyAuLiwgLi4uLCAuLi4uLi4uIC0+IOKAplxuICAgICAgICAgIC8vIGJ1dCA/Li4uLi4gJiAhLi4uLi4gLT4gPy4uICYgIS4uXG4gICAgICAgICAgLnJlcGxhY2UoL1xcLnsyLH0vZywgJ+KApicpLnJlcGxhY2UoLyhbPyFdKeKApi9nLCAnJDEuLicpXG4gICAgICAgICAgLnJlcGxhY2UoLyhbPyFdKXs0LH0vZywgJyQxJDEkMScpLnJlcGxhY2UoLyx7Mix9L2csICcsJylcbiAgICAgICAgICAvLyBlbS1kYXNoXG4gICAgICAgICAgLnJlcGxhY2UoLyhefFteLV0pLS0tKD89W14tXXwkKS9tZywgJyQxXFx1MjAxNCcpXG4gICAgICAgICAgLy8gZW4tZGFzaFxuICAgICAgICAgIC5yZXBsYWNlKC8oXnxcXHMpLS0oPz1cXHN8JCkvbWcsICckMVxcdTIwMTMnKVxuICAgICAgICAgIC5yZXBsYWNlKC8oXnxbXi1cXHNdKS0tKD89W14tXFxzXXwkKS9tZywgJyQxXFx1MjAxMycpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX29wZW4nICYmIHRva2VuLmluZm8gPT09ICdhdXRvJykge1xuICAgICAgaW5zaWRlX2F1dG9saW5rLS1cbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpbmtfY2xvc2UnICYmIHRva2VuLmluZm8gPT09ICdhdXRvJykge1xuICAgICAgaW5zaWRlX2F1dG9saW5rKytcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVwbGFjZSAoc3RhdGUpIHtcbiAgbGV0IGJsa0lkeFxuXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy50eXBvZ3JhcGhlcikgeyByZXR1cm4gfVxuXG4gIGZvciAoYmxrSWR4ID0gc3RhdGUudG9rZW5zLmxlbmd0aCAtIDE7IGJsa0lkeCA+PSAwOyBibGtJZHgtLSkge1xuICAgIGlmIChzdGF0ZS50b2tlbnNbYmxrSWR4XS50eXBlICE9PSAnaW5saW5lJykgeyBjb250aW51ZSB9XG5cbiAgICBpZiAoU0NPUEVEX0FCQlJfVEVTVF9SRS50ZXN0KHN0YXRlLnRva2Vuc1tibGtJZHhdLmNvbnRlbnQpKSB7XG4gICAgICByZXBsYWNlX3Njb3BlZChzdGF0ZS50b2tlbnNbYmxrSWR4XS5jaGlsZHJlbilcbiAgICB9XG5cbiAgICBpZiAoUkFSRV9SRS50ZXN0KHN0YXRlLnRva2Vuc1tibGtJZHhdLmNvbnRlbnQpKSB7XG4gICAgICByZXBsYWNlX3JhcmUoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY2hpbGRyZW4pXG4gICAgfVxuICB9XG59XG4iLCIvLyBDb252ZXJ0IHN0cmFpZ2h0IHF1b3RhdGlvbiBtYXJrcyB0byB0eXBvZ3JhcGhpYyBvbmVzXG4vL1xuXG5pbXBvcnQgeyBpc1doaXRlU3BhY2UsIGlzUHVuY3RDaGFyLCBpc01kQXNjaWlQdW5jdCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmNvbnN0IFFVT1RFX1RFU1RfUkUgPSAvWydcIl0vXG5jb25zdCBRVU9URV9SRSA9IC9bJ1wiXS9nXG5jb25zdCBBUE9TVFJPUEhFID0gJ1xcdTIwMTknIC8qIOKAmSAqL1xuXG5mdW5jdGlvbiByZXBsYWNlQXQgKHN0ciwgaW5kZXgsIGNoKSB7XG4gIHJldHVybiBzdHIuc2xpY2UoMCwgaW5kZXgpICsgY2ggKyBzdHIuc2xpY2UoaW5kZXggKyAxKVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzX2lubGluZXMgKHRva2Vucywgc3RhdGUpIHtcbiAgbGV0IGpcblxuICBjb25zdCBzdGFjayA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXVxuXG4gICAgY29uc3QgdGhpc0xldmVsID0gdG9rZW5zW2ldLmxldmVsXG5cbiAgICBmb3IgKGogPSBzdGFjay5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgaWYgKHN0YWNrW2pdLmxldmVsIDw9IHRoaXNMZXZlbCkgeyBicmVhayB9XG4gICAgfVxuICAgIHN0YWNrLmxlbmd0aCA9IGogKyAxXG5cbiAgICBpZiAodG9rZW4udHlwZSAhPT0gJ3RleHQnKSB7IGNvbnRpbnVlIH1cblxuICAgIGxldCB0ZXh0ID0gdG9rZW4uY29udGVudFxuICAgIGxldCBwb3MgPSAwXG4gICAgbGV0IG1heCA9IHRleHQubGVuZ3RoXG5cbiAgICAvKiBlc2xpbnQgbm8tbGFiZWxzOjAsYmxvY2stc2NvcGVkLXZhcjowICovXG4gICAgT1VURVI6XG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgUVVPVEVfUkUubGFzdEluZGV4ID0gcG9zXG4gICAgICBjb25zdCB0ID0gUVVPVEVfUkUuZXhlYyh0ZXh0KVxuICAgICAgaWYgKCF0KSB7IGJyZWFrIH1cblxuICAgICAgbGV0IGNhbk9wZW4gPSB0cnVlXG4gICAgICBsZXQgY2FuQ2xvc2UgPSB0cnVlXG4gICAgICBwb3MgPSB0LmluZGV4ICsgMVxuICAgICAgY29uc3QgaXNTaW5nbGUgPSAodFswXSA9PT0gXCInXCIpXG5cbiAgICAgIC8vIEZpbmQgcHJldmlvdXMgY2hhcmFjdGVyLFxuICAgICAgLy8gZGVmYXVsdCB0byBzcGFjZSBpZiBpdCdzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgIC8vXG4gICAgICBsZXQgbGFzdENoYXIgPSAweDIwXG5cbiAgICAgIGlmICh0LmluZGV4IC0gMSA+PSAwKSB7XG4gICAgICAgIGxhc3RDaGFyID0gdGV4dC5jaGFyQ29kZUF0KHQuaW5kZXggLSAxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgaWYgKHRva2Vuc1tqXS50eXBlID09PSAnc29mdGJyZWFrJyB8fCB0b2tlbnNbal0udHlwZSA9PT0gJ2hhcmRicmVhaycpIGJyZWFrIC8vIGxhc3RDaGFyIGRlZmF1bHRzIHRvIDB4MjBcbiAgICAgICAgICBpZiAoIXRva2Vuc1tqXS5jb250ZW50KSBjb250aW51ZSAvLyBzaG91bGQgc2tpcCBhbGwgdG9rZW5zIGV4Y2VwdCAndGV4dCcsICdodG1sX2lubGluZScgb3IgJ2NvZGVfaW5saW5lJ1xuXG4gICAgICAgICAgbGFzdENoYXIgPSB0b2tlbnNbal0uY29udGVudC5jaGFyQ29kZUF0KHRva2Vuc1tqXS5jb250ZW50Lmxlbmd0aCAtIDEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIG5leHQgY2hhcmFjdGVyLFxuICAgICAgLy8gZGVmYXVsdCB0byBzcGFjZSBpZiBpdCdzIHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgIC8vXG4gICAgICBsZXQgbmV4dENoYXIgPSAweDIwXG5cbiAgICAgIGlmIChwb3MgPCBtYXgpIHtcbiAgICAgICAgbmV4dENoYXIgPSB0ZXh0LmNoYXJDb2RlQXQocG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCB0b2tlbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBpZiAodG9rZW5zW2pdLnR5cGUgPT09ICdzb2Z0YnJlYWsnIHx8IHRva2Vuc1tqXS50eXBlID09PSAnaGFyZGJyZWFrJykgYnJlYWsgLy8gbmV4dENoYXIgZGVmYXVsdHMgdG8gMHgyMFxuICAgICAgICAgIGlmICghdG9rZW5zW2pdLmNvbnRlbnQpIGNvbnRpbnVlIC8vIHNob3VsZCBza2lwIGFsbCB0b2tlbnMgZXhjZXB0ICd0ZXh0JywgJ2h0bWxfaW5saW5lJyBvciAnY29kZV9pbmxpbmUnXG5cbiAgICAgICAgICBuZXh0Q2hhciA9IHRva2Vuc1tqXS5jb250ZW50LmNoYXJDb2RlQXQoMClcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTGFzdFB1bmN0Q2hhciA9IGlzTWRBc2NpaVB1bmN0KGxhc3RDaGFyKSB8fCBpc1B1bmN0Q2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKGxhc3RDaGFyKSlcbiAgICAgIGNvbnN0IGlzTmV4dFB1bmN0Q2hhciA9IGlzTWRBc2NpaVB1bmN0KG5leHRDaGFyKSB8fCBpc1B1bmN0Q2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyKSlcblxuICAgICAgY29uc3QgaXNMYXN0V2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZShsYXN0Q2hhcilcbiAgICAgIGNvbnN0IGlzTmV4dFdoaXRlU3BhY2UgPSBpc1doaXRlU3BhY2UobmV4dENoYXIpXG5cbiAgICAgIGlmIChpc05leHRXaGl0ZVNwYWNlKSB7XG4gICAgICAgIGNhbk9wZW4gPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChpc05leHRQdW5jdENoYXIpIHtcbiAgICAgICAgaWYgKCEoaXNMYXN0V2hpdGVTcGFjZSB8fCBpc0xhc3RQdW5jdENoYXIpKSB7XG4gICAgICAgICAgY2FuT3BlbiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGFzdFdoaXRlU3BhY2UpIHtcbiAgICAgICAgY2FuQ2xvc2UgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChpc0xhc3RQdW5jdENoYXIpIHtcbiAgICAgICAgaWYgKCEoaXNOZXh0V2hpdGVTcGFjZSB8fCBpc05leHRQdW5jdENoYXIpKSB7XG4gICAgICAgICAgY2FuQ2xvc2UgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0Q2hhciA9PT0gMHgyMiAvKiBcIiAqLyAmJiB0WzBdID09PSAnXCInKSB7XG4gICAgICAgIGlmIChsYXN0Q2hhciA+PSAweDMwIC8qIDAgKi8gJiYgbGFzdENoYXIgPD0gMHgzOSAvKiA5ICovKSB7XG4gICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiAxXCJcIiAtIGNvdW50IGZpcnN0IHF1b3RlIGFzIGFuIGluY2hcbiAgICAgICAgICBjYW5DbG9zZSA9IGNhbk9wZW4gPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5PcGVuICYmIGNhbkNsb3NlKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgcXVvdGVzIGluIHRoZSBtaWRkbGUgb2YgcHVuY3R1YXRpb24gc2VxdWVuY2UsIGJ1dCBub3RcbiAgICAgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiB0aGUgd29yZHMsIGkuZS46XG4gICAgICAgIC8vXG4gICAgICAgIC8vIDEuIGZvbyBcIiBiYXIgXCIgYmF6IC0gbm90IHJlcGxhY2VkXG4gICAgICAgIC8vIDIuIGZvby1cIi1iYXItXCItYmF6IC0gcmVwbGFjZWRcbiAgICAgICAgLy8gMy4gZm9vXCJiYXJcImJheiAgICAgLSBub3QgcmVwbGFjZWRcbiAgICAgICAgLy9cbiAgICAgICAgY2FuT3BlbiA9IGlzTGFzdFB1bmN0Q2hhclxuICAgICAgICBjYW5DbG9zZSA9IGlzTmV4dFB1bmN0Q2hhclxuICAgICAgfVxuXG4gICAgICBpZiAoIWNhbk9wZW4gJiYgIWNhbkNsb3NlKSB7XG4gICAgICAgIC8vIG1pZGRsZSBvZiB3b3JkXG4gICAgICAgIGlmIChpc1NpbmdsZSkge1xuICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgQVBPU1RST1BIRSlcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FuQ2xvc2UpIHtcbiAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhIGNsb3NpbmcgcXVvdGUsIHJld2luZCB0aGUgc3RhY2sgdG8gZ2V0IGEgbWF0Y2hcbiAgICAgICAgZm9yIChqID0gc3RhY2subGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBsZXQgaXRlbSA9IHN0YWNrW2pdXG4gICAgICAgICAgaWYgKHN0YWNrW2pdLmxldmVsIDwgdGhpc0xldmVsKSB7IGJyZWFrIH1cbiAgICAgICAgICBpZiAoaXRlbS5zaW5nbGUgPT09IGlzU2luZ2xlICYmIHN0YWNrW2pdLmxldmVsID09PSB0aGlzTGV2ZWwpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBzdGFja1tqXVxuXG4gICAgICAgICAgICBsZXQgb3BlblF1b3RlXG4gICAgICAgICAgICBsZXQgY2xvc2VRdW90ZVxuICAgICAgICAgICAgaWYgKGlzU2luZ2xlKSB7XG4gICAgICAgICAgICAgIG9wZW5RdW90ZSA9IHN0YXRlLm1kLm9wdGlvbnMucXVvdGVzWzJdXG4gICAgICAgICAgICAgIGNsb3NlUXVvdGUgPSBzdGF0ZS5tZC5vcHRpb25zLnF1b3Rlc1szXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb3BlblF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbMF1cbiAgICAgICAgICAgICAgY2xvc2VRdW90ZSA9IHN0YXRlLm1kLm9wdGlvbnMucXVvdGVzWzFdXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlcGxhY2UgdG9rZW4uY29udGVudCAqYmVmb3JlKiB0b2tlbnNbaXRlbS50b2tlbl0uY29udGVudCxcbiAgICAgICAgICAgIC8vIGJlY2F1c2UsIGlmIHRoZXkgYXJlIHBvaW50aW5nIGF0IHRoZSBzYW1lIHRva2VuLCByZXBsYWNlQXRcbiAgICAgICAgICAgIC8vIGNvdWxkIG1lc3MgdXAgaW5kaWNlcyB3aGVuIHF1b3RlIGxlbmd0aCAhPSAxXG4gICAgICAgICAgICB0b2tlbi5jb250ZW50ID0gcmVwbGFjZUF0KHRva2VuLmNvbnRlbnQsIHQuaW5kZXgsIGNsb3NlUXVvdGUpXG4gICAgICAgICAgICB0b2tlbnNbaXRlbS50b2tlbl0uY29udGVudCA9IHJlcGxhY2VBdChcbiAgICAgICAgICAgICAgdG9rZW5zW2l0ZW0udG9rZW5dLmNvbnRlbnQsIGl0ZW0ucG9zLCBvcGVuUXVvdGUpXG5cbiAgICAgICAgICAgIHBvcyArPSBjbG9zZVF1b3RlLmxlbmd0aCAtIDFcbiAgICAgICAgICAgIGlmIChpdGVtLnRva2VuID09PSBpKSB7IHBvcyArPSBvcGVuUXVvdGUubGVuZ3RoIC0gMSB9XG5cbiAgICAgICAgICAgIHRleHQgPSB0b2tlbi5jb250ZW50XG4gICAgICAgICAgICBtYXggPSB0ZXh0Lmxlbmd0aFxuXG4gICAgICAgICAgICBzdGFjay5sZW5ndGggPSBqXG4gICAgICAgICAgICBjb250aW51ZSBPVVRFUlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FuT3Blbikge1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICB0b2tlbjogaSxcbiAgICAgICAgICBwb3M6IHQuaW5kZXgsXG4gICAgICAgICAgc2luZ2xlOiBpc1NpbmdsZSxcbiAgICAgICAgICBsZXZlbDogdGhpc0xldmVsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGNhbkNsb3NlICYmIGlzU2luZ2xlKSB7XG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgQVBPU1RST1BIRSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc21hcnRxdW90ZXMgKHN0YXRlKSB7XG4gIC8qIGVzbGludCBtYXgtZGVwdGg6MCAqL1xuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMudHlwb2dyYXBoZXIpIHsgcmV0dXJuIH1cblxuICBmb3IgKGxldCBibGtJZHggPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMTsgYmxrSWR4ID49IDA7IGJsa0lkeC0tKSB7XG4gICAgaWYgKHN0YXRlLnRva2Vuc1tibGtJZHhdLnR5cGUgIT09ICdpbmxpbmUnIHx8XG4gICAgICAgICFRVU9URV9URVNUX1JFLnRlc3Qoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY29udGVudCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcHJvY2Vzc19pbmxpbmVzKHN0YXRlLnRva2Vuc1tibGtJZHhdLmNoaWxkcmVuLCBzdGF0ZSlcbiAgfVxufVxuIiwiLy8gQ29yZSBzdGF0ZSBvYmplY3Rcbi8vXG5cbmltcG9ydCBUb2tlbiBmcm9tICcuLi90b2tlbi5tanMnXG5cbmZ1bmN0aW9uIFN0YXRlQ29yZSAoc3JjLCBtZCwgZW52KSB7XG4gIHRoaXMuc3JjID0gc3JjXG4gIHRoaXMuZW52ID0gZW52XG4gIHRoaXMudG9rZW5zID0gW11cbiAgdGhpcy5pbmxpbmVNb2RlID0gZmFsc2VcbiAgdGhpcy5tZCA9IG1kIC8vIGxpbmsgdG8gcGFyc2VyIGluc3RhbmNlXG59XG5cbi8vIHJlLWV4cG9ydCBUb2tlbiBjbGFzcyB0byB1c2UgaW4gY29yZSBydWxlc1xuU3RhdGVDb3JlLnByb3RvdHlwZS5Ub2tlbiA9IFRva2VuXG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRlQ29yZVxuIiwiLy8gSm9pbiByYXcgdGV4dCB0b2tlbnMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGV4dFxuLy9cbi8vIFRoaXMgaXMgc2V0IGFzIGEgc2VwYXJhdGUgcnVsZSB0byBwcm92aWRlIGFuIG9wcG9ydHVuaXR5IGZvciBwbHVnaW5zXG4vLyB0byBydW4gdGV4dCByZXBsYWNlbWVudHMgYWZ0ZXIgdGV4dCBqb2luLCBidXQgYmVmb3JlIGVzY2FwZSBqb2luLlxuLy9cbi8vIEZvciBleGFtcGxlLCBgXFw6KWAgc2hvdWxkbid0IGJlIHJlcGxhY2VkIHdpdGggYW4gZW1vamkuXG4vL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0ZXh0X2pvaW4gKHN0YXRlKSB7XG4gIGxldCBjdXJyLCBsYXN0XG4gIGNvbnN0IGJsb2NrVG9rZW5zID0gc3RhdGUudG9rZW5zXG4gIGNvbnN0IGwgPSBibG9ja1Rva2Vucy5sZW5ndGhcblxuICBmb3IgKGxldCBqID0gMDsgaiA8IGw7IGorKykge1xuICAgIGlmIChibG9ja1Rva2Vuc1tqXS50eXBlICE9PSAnaW5saW5lJykgY29udGludWVcblxuICAgIGNvbnN0IHRva2VucyA9IGJsb2NrVG9rZW5zW2pdLmNoaWxkcmVuXG4gICAgY29uc3QgbWF4ID0gdG9rZW5zLmxlbmd0aFxuXG4gICAgZm9yIChjdXJyID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgICBpZiAodG9rZW5zW2N1cnJdLnR5cGUgPT09ICd0ZXh0X3NwZWNpYWwnKSB7XG4gICAgICAgIHRva2Vuc1tjdXJyXS50eXBlID0gJ3RleHQnXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjdXJyID0gbGFzdCA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgICAgaWYgKHRva2Vuc1tjdXJyXS50eXBlID09PSAndGV4dCcgJiZcbiAgICAgICAgICBjdXJyICsgMSA8IG1heCAmJlxuICAgICAgICAgIHRva2Vuc1tjdXJyICsgMV0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIC8vIGNvbGxhcHNlIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIHRva2Vuc1tjdXJyICsgMV0uY29udGVudCA9IHRva2Vuc1tjdXJyXS5jb250ZW50ICsgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY3VyciAhPT0gbGFzdCkgeyB0b2tlbnNbbGFzdF0gPSB0b2tlbnNbY3Vycl0gfVxuXG4gICAgICAgIGxhc3QrK1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXJyICE9PSBsYXN0KSB7XG4gICAgICB0b2tlbnMubGVuZ3RoID0gbGFzdFxuICAgIH1cbiAgfVxufVxuIiwiLy8gUHJvY2VzcyBhdXRvbGlua3MgJzxwcm90b2NvbDouLi4+J1xuXG4vKiBlc2xpbnQgbWF4LWxlbjowICovXG5jb25zdCBFTUFJTF9SRSAgICA9IC9eKFthLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rQFthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlxcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqKSQvXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAqL1xuY29uc3QgQVVUT0xJTktfUkUgPSAvXihbYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9KTooW148PlxceDAwLVxceDIwXSopJC9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXV0b2xpbmsgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHN0YXJ0ID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGZvciAoOzspIHtcbiAgICBpZiAoKytwb3MgPj0gbWF4KSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgaWYgKGNoID09PSAweDNDIC8qIDwgKi8pIHJldHVybiBmYWxzZVxuICAgIGlmIChjaCA9PT0gMHgzRSAvKiA+ICovKSBicmVha1xuICB9XG5cbiAgY29uc3QgdXJsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0ICsgMSwgcG9zKVxuXG4gIGlmIChBVVRPTElOS19SRS50ZXN0KHVybCkpIHtcbiAgICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluayh1cmwpXG4gICAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBjb25zdCB0b2tlbl9vICAgPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICB0b2tlbl9vLmF0dHJzICAgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcblxuICAgICAgY29uc3QgdG9rZW5fdCAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgICAgdG9rZW5fdC5jb250ZW50ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsKVxuXG4gICAgICBjb25zdCB0b2tlbl9jICAgPSBzdGF0ZS5wdXNoKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICAgIHRva2VuX2MubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX2MuaW5mbyAgICA9ICdhdXRvJ1xuICAgIH1cblxuICAgIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoICsgMlxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoRU1BSUxfUkUudGVzdCh1cmwpKSB7XG4gICAgY29uc3QgZnVsbFVybCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsoJ21haWx0bzonICsgdXJsKVxuICAgIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgY29uc3QgdG9rZW5fbyAgID0gc3RhdGUucHVzaCgnbGlua19vcGVuJywgJ2EnLCAxKVxuICAgICAgdG9rZW5fby5hdHRycyAgID0gW1snaHJlZicsIGZ1bGxVcmxdXVxuICAgICAgdG9rZW5fby5tYXJrdXAgID0gJ2F1dG9saW5rJ1xuICAgICAgdG9rZW5fby5pbmZvICAgID0gJ2F1dG8nXG5cbiAgICAgIGNvbnN0IHRva2VuX3QgICA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICAgIHRva2VuX3QuY29udGVudCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KHVybClcblxuICAgICAgY29uc3QgdG9rZW5fYyAgID0gc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gICAgICB0b2tlbl9jLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9jLmluZm8gICAgPSAnYXV0bydcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgKz0gdXJsLmxlbmd0aCArIDJcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvLyBQYXJzZSBiYWNrdGlja3NcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmFja3RpY2sgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAoY2ggIT09IDB4NjAvKiBgICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc3RhcnQgPSBwb3NcbiAgcG9zKytcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgLy8gc2NhbiBtYXJrZXIgbGVuZ3RoXG4gIHdoaWxlIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg2MC8qIGAgKi8pIHsgcG9zKysgfVxuXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKVxuICBjb25zdCBvcGVuZXJMZW5ndGggPSBtYXJrZXIubGVuZ3RoXG5cbiAgaWYgKHN0YXRlLmJhY2t0aWNrc1NjYW5uZWQgJiYgKHN0YXRlLmJhY2t0aWNrc1tvcGVuZXJMZW5ndGhdIHx8IDApIDw9IHN0YXJ0KSB7XG4gICAgaWYgKCFzaWxlbnQpIHN0YXRlLnBlbmRpbmcgKz0gbWFya2VyXG4gICAgc3RhdGUucG9zICs9IG9wZW5lckxlbmd0aFxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBsZXQgbWF0Y2hFbmQgPSBwb3NcbiAgbGV0IG1hdGNoU3RhcnRcblxuICAvLyBOb3RoaW5nIGZvdW5kIGluIHRoZSBjYWNoZSwgc2NhbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIChvciB1bnRpbCBtYXJrZXIgaXMgZm91bmQpXG4gIHdoaWxlICgobWF0Y2hTdGFydCA9IHN0YXRlLnNyYy5pbmRleE9mKCdgJywgbWF0Y2hFbmQpKSAhPT0gLTEpIHtcbiAgICBtYXRjaEVuZCA9IG1hdGNoU3RhcnQgKyAxXG5cbiAgICAvLyBzY2FuIG1hcmtlciBsZW5ndGhcbiAgICB3aGlsZSAobWF0Y2hFbmQgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQobWF0Y2hFbmQpID09PSAweDYwLyogYCAqLykgeyBtYXRjaEVuZCsrIH1cblxuICAgIGNvbnN0IGNsb3Nlckxlbmd0aCA9IG1hdGNoRW5kIC0gbWF0Y2hTdGFydFxuXG4gICAgaWYgKGNsb3Nlckxlbmd0aCA9PT0gb3BlbmVyTGVuZ3RoKSB7XG4gICAgICAvLyBGb3VuZCBtYXRjaGluZyBjbG9zZXIgbGVuZ3RoLlxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCdjb2RlX2lubGluZScsICdjb2RlJywgMClcbiAgICAgICAgdG9rZW4ubWFya3VwID0gbWFya2VyXG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXRjaFN0YXJ0KVxuICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgICAgICAgIC5yZXBsYWNlKC9eICguKykgJC8sICckMScpXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgPSBtYXRjaEVuZFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBTb21lIGRpZmZlcmVudCBsZW5ndGggZm91bmQsIHB1dCBpdCBpbiBjYWNoZSBhcyB1cHBlciBsaW1pdCBvZiB3aGVyZSBjbG9zZXIgY2FuIGJlIGZvdW5kXG4gICAgc3RhdGUuYmFja3RpY2tzW2Nsb3Nlckxlbmd0aF0gPSBtYXRjaFN0YXJ0XG4gIH1cblxuICAvLyBTY2FubmVkIHRocm91Z2ggdGhlIGVuZCwgZGlkbid0IGZpbmQgYW55dGhpbmdcbiAgc3RhdGUuYmFja3RpY2tzU2Nhbm5lZCA9IHRydWVcblxuICBpZiAoIXNpbGVudCkgc3RhdGUucGVuZGluZyArPSBtYXJrZXJcbiAgc3RhdGUucG9zICs9IG9wZW5lckxlbmd0aFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gRm9yIGVhY2ggb3BlbmluZyBlbXBoYXNpcy1saWtlIG1hcmtlciBmaW5kIGEgbWF0Y2hpbmcgY2xvc2luZyBvbmVcbi8vXG5cbmZ1bmN0aW9uIHByb2Nlc3NEZWxpbWl0ZXJzIChkZWxpbWl0ZXJzKSB7XG4gIGNvbnN0IG9wZW5lcnNCb3R0b20gPSB7fVxuICBjb25zdCBtYXggPSBkZWxpbWl0ZXJzLmxlbmd0aFxuXG4gIGlmICghbWF4KSByZXR1cm5cblxuICAvLyBoZWFkZXJJZHggaXMgdGhlIGZpcnN0IGRlbGltaXRlciBvZiB0aGUgY3VycmVudCAod2hlcmUgY2xvc2VyIGlzKSBkZWxpbWl0ZXIgcnVuXG4gIGxldCBoZWFkZXJJZHggPSAwXG4gIGxldCBsYXN0VG9rZW5JZHggPSAtMiAvLyBuZWVkcyBhbnkgdmFsdWUgbG93ZXIgdGhhbiAtMVxuICBjb25zdCBqdW1wcyA9IFtdXG5cbiAgZm9yIChsZXQgY2xvc2VySWR4ID0gMDsgY2xvc2VySWR4IDwgbWF4OyBjbG9zZXJJZHgrKykge1xuICAgIGNvbnN0IGNsb3NlciA9IGRlbGltaXRlcnNbY2xvc2VySWR4XVxuXG4gICAganVtcHMucHVzaCgwKVxuXG4gICAgLy8gbWFya2VycyBiZWxvbmcgdG8gc2FtZSBkZWxpbWl0ZXIgcnVuIGlmOlxuICAgIC8vICAtIHRoZXkgaGF2ZSBhZGphY2VudCB0b2tlbnNcbiAgICAvLyAgLSBBTkQgbWFya2VycyBhcmUgdGhlIHNhbWVcbiAgICAvL1xuICAgIGlmIChkZWxpbWl0ZXJzW2hlYWRlcklkeF0ubWFya2VyICE9PSBjbG9zZXIubWFya2VyIHx8IGxhc3RUb2tlbklkeCAhPT0gY2xvc2VyLnRva2VuIC0gMSkge1xuICAgICAgaGVhZGVySWR4ID0gY2xvc2VySWR4XG4gICAgfVxuXG4gICAgbGFzdFRva2VuSWR4ID0gY2xvc2VyLnRva2VuXG5cbiAgICAvLyBMZW5ndGggaXMgb25seSB1c2VkIGZvciBlbXBoYXNpcy1zcGVjaWZpYyBcInJ1bGUgb2YgM1wiLFxuICAgIC8vIGlmIGl0J3Mgbm90IGRlZmluZWQgKGluIHN0cmlrZXRocm91Z2ggb3IgM3JkIHBhcnR5IHBsdWdpbnMpLFxuICAgIC8vIHdlIGNhbiBkZWZhdWx0IGl0IHRvIDAgdG8gZGlzYWJsZSB0aG9zZSBjaGVja3MuXG4gICAgLy9cbiAgICBjbG9zZXIubGVuZ3RoID0gY2xvc2VyLmxlbmd0aCB8fCAwXG5cbiAgICBpZiAoIWNsb3Nlci5jbG9zZSkgY29udGludWVcblxuICAgIC8vIFByZXZpb3VzbHkgY2FsY3VsYXRlZCBsb3dlciBib3VuZHMgKHByZXZpb3VzIGZhaWxzKVxuICAgIC8vIGZvciBlYWNoIG1hcmtlciwgZWFjaCBkZWxpbWl0ZXIgbGVuZ3RoIG1vZHVsbyAzLFxuICAgIC8vIGFuZCBmb3Igd2hldGhlciB0aGlzIGNsb3NlciBjYW4gYmUgYW4gb3BlbmVyO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21tb25tYXJrL2NtYXJrL2NvbW1pdC8zNDI1MGUxMmNjZWJkYzYzNzJiOGI0OWM0NGZhYjU3YzcyNDQzNDYwXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xuICAgIGlmICghb3BlbmVyc0JvdHRvbS5oYXNPd25Qcm9wZXJ0eShjbG9zZXIubWFya2VyKSkge1xuICAgICAgb3BlbmVyc0JvdHRvbVtjbG9zZXIubWFya2VyXSA9IFstMSwgLTEsIC0xLCAtMSwgLTEsIC0xXVxuICAgIH1cblxuICAgIGNvbnN0IG1pbk9wZW5lcklkeCA9IG9wZW5lcnNCb3R0b21bY2xvc2VyLm1hcmtlcl1bKGNsb3Nlci5vcGVuID8gMyA6IDApICsgKGNsb3Nlci5sZW5ndGggJSAzKV1cblxuICAgIGxldCBvcGVuZXJJZHggPSBoZWFkZXJJZHggLSBqdW1wc1toZWFkZXJJZHhdIC0gMVxuXG4gICAgbGV0IG5ld01pbk9wZW5lcklkeCA9IG9wZW5lcklkeFxuXG4gICAgZm9yICg7IG9wZW5lcklkeCA+IG1pbk9wZW5lcklkeDsgb3BlbmVySWR4IC09IGp1bXBzW29wZW5lcklkeF0gKyAxKSB7XG4gICAgICBjb25zdCBvcGVuZXIgPSBkZWxpbWl0ZXJzW29wZW5lcklkeF1cblxuICAgICAgaWYgKG9wZW5lci5tYXJrZXIgIT09IGNsb3Nlci5tYXJrZXIpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChvcGVuZXIub3BlbiAmJiBvcGVuZXIuZW5kIDwgMCkge1xuICAgICAgICBsZXQgaXNPZGRNYXRjaCA9IGZhbHNlXG5cbiAgICAgICAgLy8gZnJvbSBzcGVjOlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiBvbmUgb2YgdGhlIGRlbGltaXRlcnMgY2FuIGJvdGggb3BlbiBhbmQgY2xvc2UgZW1waGFzaXMsIHRoZW4gdGhlXG4gICAgICAgIC8vIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUgZGVsaW1pdGVyIHJ1bnMgY29udGFpbmluZyB0aGUgb3BlbmluZyBhbmRcbiAgICAgICAgLy8gY2xvc2luZyBkZWxpbWl0ZXJzIG11c3Qgbm90IGJlIGEgbXVsdGlwbGUgb2YgMyB1bmxlc3MgYm90aCBsZW5ndGhzXG4gICAgICAgIC8vIGFyZSBtdWx0aXBsZXMgb2YgMy5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG9wZW5lci5jbG9zZSB8fCBjbG9zZXIub3Blbikge1xuICAgICAgICAgIGlmICgob3BlbmVyLmxlbmd0aCArIGNsb3Nlci5sZW5ndGgpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKG9wZW5lci5sZW5ndGggJSAzICE9PSAwIHx8IGNsb3Nlci5sZW5ndGggJSAzICE9PSAwKSB7XG4gICAgICAgICAgICAgIGlzT2RkTWF0Y2ggPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc09kZE1hdGNoKSB7XG4gICAgICAgICAgLy8gSWYgcHJldmlvdXMgZGVsaW1pdGVyIGNhbm5vdCBiZSBhbiBvcGVuZXIsIHdlIGNhbiBzYWZlbHkgc2tpcFxuICAgICAgICAgIC8vIHRoZSBlbnRpcmUgc2VxdWVuY2UgaW4gZnV0dXJlIGNoZWNrcy4gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlXG4gICAgICAgICAgLy8gc3VyZSBhbGdvcml0aG0gaGFzIGxpbmVhciBjb21wbGV4aXR5IChzZWUgKl8qXypfKl8qXy4uLiBjYXNlKS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGxhc3RKdW1wID0gb3BlbmVySWR4ID4gMCAmJiAhZGVsaW1pdGVyc1tvcGVuZXJJZHggLSAxXS5vcGVuXG4gICAgICAgICAgICA/IGp1bXBzW29wZW5lcklkeCAtIDFdICsgMVxuICAgICAgICAgICAgOiAwXG5cbiAgICAgICAgICBqdW1wc1tjbG9zZXJJZHhdID0gY2xvc2VySWR4IC0gb3BlbmVySWR4ICsgbGFzdEp1bXBcbiAgICAgICAgICBqdW1wc1tvcGVuZXJJZHhdID0gbGFzdEp1bXBcblxuICAgICAgICAgIGNsb3Nlci5vcGVuICA9IGZhbHNlXG4gICAgICAgICAgb3BlbmVyLmVuZCAgID0gY2xvc2VySWR4XG4gICAgICAgICAgb3BlbmVyLmNsb3NlID0gZmFsc2VcbiAgICAgICAgICBuZXdNaW5PcGVuZXJJZHggPSAtMVxuICAgICAgICAgIC8vIHRyZWF0IG5leHQgdG9rZW4gYXMgc3RhcnQgb2YgcnVuLFxuICAgICAgICAgIC8vIGl0IG9wdGltaXplcyBza2lwcyBpbiAqKjwuLi4+KiphKio8Li4uPioqIHBhdGhvbG9naWNhbCBjYXNlXG4gICAgICAgICAgbGFzdFRva2VuSWR4ID0gLTJcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld01pbk9wZW5lcklkeCAhPT0gLTEpIHtcbiAgICAgIC8vIElmIG1hdGNoIGZvciB0aGlzIGRlbGltaXRlciBydW4gZmFpbGVkLCB3ZSB3YW50IHRvIHNldCBsb3dlciBib3VuZCBmb3JcbiAgICAgIC8vIGZ1dHVyZSBsb29rdXBzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2Ugc3VyZSBhbGdvcml0aG0gaGFzIGxpbmVhclxuICAgICAgLy8gY29tcGxleGl0eS5cbiAgICAgIC8vXG4gICAgICAvLyBTZWUgZGV0YWlscyBoZXJlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvbW1vbm1hcmsvY21hcmsvaXNzdWVzLzE3OCNpc3N1ZWNvbW1lbnQtMjcwNDE3NDQyXG4gICAgICAvL1xuICAgICAgb3BlbmVyc0JvdHRvbVtjbG9zZXIubWFya2VyXVsoY2xvc2VyLm9wZW4gPyAzIDogMCkgKyAoKGNsb3Nlci5sZW5ndGggfHwgMCkgJSAzKV0gPSBuZXdNaW5PcGVuZXJJZHhcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlua19wYWlycyAoc3RhdGUpIHtcbiAgY29uc3QgdG9rZW5zX21ldGEgPSBzdGF0ZS50b2tlbnNfbWV0YVxuICBjb25zdCBtYXggPSBzdGF0ZS50b2tlbnNfbWV0YS5sZW5ndGhcblxuICBwcm9jZXNzRGVsaW1pdGVycyhzdGF0ZS5kZWxpbWl0ZXJzKVxuXG4gIGZvciAobGV0IGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICBpZiAodG9rZW5zX21ldGFbY3Vycl0gJiYgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycykge1xuICAgICAgcHJvY2Vzc0RlbGltaXRlcnModG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycylcbiAgICB9XG4gIH1cbn1cbiIsIi8vIFByb2Nlc3MgKnRoaXMqIGFuZCBfdGhhdF9cbi8vXG5cbi8vIEluc2VydCBlYWNoIG1hcmtlciBhcyBhIHNlcGFyYXRlIHRleHQgdG9rZW4sIGFuZCBhZGQgaXQgdG8gZGVsaW1pdGVyIGxpc3Rcbi8vXG5mdW5jdGlvbiBlbXBoYXNpc190b2tlbml6ZSAoc3RhdGUsIHNpbGVudCkge1xuICBjb25zdCBzdGFydCA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGFydClcblxuICBpZiAoc2lsZW50KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKG1hcmtlciAhPT0gMHg1RiAvKiBfICovICYmIG1hcmtlciAhPT0gMHgyQSAvKiAqICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc2Nhbm5lZCA9IHN0YXRlLnNjYW5EZWxpbXMoc3RhdGUucG9zLCBtYXJrZXIgPT09IDB4MkEpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FubmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKVxuXG4gICAgc3RhdGUuZGVsaW1pdGVycy5wdXNoKHtcbiAgICAgIC8vIENoYXIgY29kZSBvZiB0aGUgc3RhcnRpbmcgbWFya2VyIChudW1iZXIpLlxuICAgICAgLy9cbiAgICAgIG1hcmtlcixcblxuICAgICAgLy8gVG90YWwgbGVuZ3RoIG9mIHRoZXNlIHNlcmllcyBvZiBkZWxpbWl0ZXJzLlxuICAgICAgLy9cbiAgICAgIGxlbmd0aDogc2Nhbm5lZC5sZW5ndGgsXG5cbiAgICAgIC8vIEEgcG9zaXRpb24gb2YgdGhlIHRva2VuIHRoaXMgZGVsaW1pdGVyIGNvcnJlc3BvbmRzIHRvLlxuICAgICAgLy9cbiAgICAgIHRva2VuOiBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMSxcblxuICAgICAgLy8gSWYgdGhpcyBkZWxpbWl0ZXIgaXMgbWF0Y2hlZCBhcyBhIHZhbGlkIG9wZW5lciwgYGVuZGAgd2lsbCBiZVxuICAgICAgLy8gZXF1YWwgdG8gaXRzIHBvc2l0aW9uLCBvdGhlcndpc2UgaXQncyBgLTFgLlxuICAgICAgLy9cbiAgICAgIGVuZDogLTEsXG5cbiAgICAgIC8vIEJvb2xlYW4gZmxhZ3MgdGhhdCBkZXRlcm1pbmUgaWYgdGhpcyBkZWxpbWl0ZXIgY291bGQgb3BlbiBvciBjbG9zZVxuICAgICAgLy8gYW4gZW1waGFzaXMuXG4gICAgICAvL1xuICAgICAgb3Blbjogc2Nhbm5lZC5jYW5fb3BlbixcbiAgICAgIGNsb3NlOiBzY2FubmVkLmNhbl9jbG9zZVxuICAgIH0pXG4gIH1cblxuICBzdGF0ZS5wb3MgKz0gc2Nhbm5lZC5sZW5ndGhcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBwb3N0UHJvY2VzcyAoc3RhdGUsIGRlbGltaXRlcnMpIHtcbiAgY29uc3QgbWF4ID0gZGVsaW1pdGVycy5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gbWF4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBzdGFydERlbGltID0gZGVsaW1pdGVyc1tpXVxuXG4gICAgaWYgKHN0YXJ0RGVsaW0ubWFya2VyICE9PSAweDVGLyogXyAqLyAmJiBzdGFydERlbGltLm1hcmtlciAhPT0gMHgyQS8qICogKi8pIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBvbmx5IG9wZW5pbmcgbWFya2Vyc1xuICAgIGlmIChzdGFydERlbGltLmVuZCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgZW5kRGVsaW0gPSBkZWxpbWl0ZXJzW3N0YXJ0RGVsaW0uZW5kXVxuXG4gICAgLy8gSWYgdGhlIHByZXZpb3VzIGRlbGltaXRlciBoYXMgdGhlIHNhbWUgbWFya2VyIGFuZCBpcyBhZGphY2VudCB0byB0aGlzIG9uZSxcbiAgICAvLyBtZXJnZSB0aG9zZSBpbnRvIG9uZSBzdHJvbmcgZGVsaW1pdGVyLlxuICAgIC8vXG4gICAgLy8gYDxlbT48ZW0+d2hhdGV2ZXI8L2VtPjwvZW0+YCAtPiBgPHN0cm9uZz53aGF0ZXZlcjwvc3Ryb25nPmBcbiAgICAvL1xuICAgIGNvbnN0IGlzU3Ryb25nID0gaSA+IDAgJiZcbiAgICAgICAgICAgICAgIGRlbGltaXRlcnNbaSAtIDFdLmVuZCA9PT0gc3RhcnREZWxpbS5lbmQgKyAxICYmXG4gICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGZpcnN0IHR3byBtYXJrZXJzIG1hdGNoIGFuZCBhZGphY2VudFxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tpIC0gMV0ubWFya2VyID09PSBzdGFydERlbGltLm1hcmtlciAmJlxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tpIC0gMV0udG9rZW4gPT09IHN0YXJ0RGVsaW0udG9rZW4gLSAxICYmXG4gICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGxhc3QgdHdvIG1hcmtlcnMgYXJlIGFkamFjZW50ICh3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGV5IG1hdGNoKVxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZCArIDFdLnRva2VuID09PSBlbmREZWxpbS50b2tlbiArIDFcblxuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShzdGFydERlbGltLm1hcmtlcilcblxuICAgIGNvbnN0IHRva2VuX28gICA9IHN0YXRlLnRva2Vuc1tzdGFydERlbGltLnRva2VuXVxuICAgIHRva2VuX28udHlwZSAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZ19vcGVuJyA6ICdlbV9vcGVuJ1xuICAgIHRva2VuX28udGFnICAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZycgOiAnZW0nXG4gICAgdG9rZW5fby5uZXN0aW5nID0gMVxuICAgIHRva2VuX28ubWFya3VwICA9IGlzU3Ryb25nID8gY2ggKyBjaCA6IGNoXG4gICAgdG9rZW5fby5jb250ZW50ID0gJydcblxuICAgIGNvbnN0IHRva2VuX2MgICA9IHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbl1cbiAgICB0b2tlbl9jLnR5cGUgICAgPSBpc1N0cm9uZyA/ICdzdHJvbmdfY2xvc2UnIDogJ2VtX2Nsb3NlJ1xuICAgIHRva2VuX2MudGFnICAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZycgOiAnZW0nXG4gICAgdG9rZW5fYy5uZXN0aW5nID0gLTFcbiAgICB0b2tlbl9jLm1hcmt1cCAgPSBpc1N0cm9uZyA/IGNoICsgY2ggOiBjaFxuICAgIHRva2VuX2MuY29udGVudCA9ICcnXG5cbiAgICBpZiAoaXNTdHJvbmcpIHtcbiAgICAgIHN0YXRlLnRva2Vuc1tkZWxpbWl0ZXJzW2kgLSAxXS50b2tlbl0uY29udGVudCA9ICcnXG4gICAgICBzdGF0ZS50b2tlbnNbZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZCArIDFdLnRva2VuXS5jb250ZW50ID0gJydcbiAgICAgIGktLVxuICAgIH1cbiAgfVxufVxuXG4vLyBXYWxrIHRocm91Z2ggZGVsaW1pdGVyIGxpc3QgYW5kIHJlcGxhY2UgdGV4dCB0b2tlbnMgd2l0aCB0YWdzXG4vL1xuZnVuY3Rpb24gZW1waGFzaXNfcG9zdF9wcm9jZXNzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHBvc3RQcm9jZXNzKHN0YXRlLCBzdGF0ZS5kZWxpbWl0ZXJzKVxuXG4gIGZvciAobGV0IGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICBpZiAodG9rZW5zX21ldGFbY3Vycl0gJiYgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycykge1xuICAgICAgcG9zdFByb2Nlc3Moc3RhdGUsIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdG9rZW5pemU6IGVtcGhhc2lzX3Rva2VuaXplLFxuICBwb3N0UHJvY2VzczogZW1waGFzaXNfcG9zdF9wcm9jZXNzXG59XG4iLCIvLyBQcm9jZXNzIGh0bWwgZW50aXR5IC0gJiMxMjM7LCAmI3hBRjssICZxdW90OywgLi4uXG5cbmltcG9ydCB7IGRlY29kZUhUTUwgfSBmcm9tICdlbnRpdGllcydcbmltcG9ydCB7IGlzVmFsaWRFbnRpdHlDb2RlLCBmcm9tQ29kZVBvaW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgRElHSVRBTF9SRSA9IC9eJiMoKD86eFthLWYwLTldezEsNn18WzAtOV17MSw3fSkpOy9pXG5jb25zdCBOQU1FRF9SRSAgID0gL14mKFthLXpdW2EtejAtOV17MSwzMX0pOy9pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVudGl0eSAoc3RhdGUsIHNpbGVudCkge1xuICBjb25zdCBwb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4MjYvKiAmICovKSByZXR1cm4gZmFsc2VcblxuICBpZiAocG9zICsgMSA+PSBtYXgpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMSlcblxuICBpZiAoY2ggPT09IDB4MjMgLyogIyAqLykge1xuICAgIGNvbnN0IG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goRElHSVRBTF9SRSlcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBtYXRjaFsxXVswXS50b0xvd2VyQ2FzZSgpID09PSAneCcgPyBwYXJzZUludChtYXRjaFsxXS5zbGljZSgxKSwgMTYpIDogcGFyc2VJbnQobWF0Y2hbMV0sIDEwKVxuXG4gICAgICAgIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcbiAgICAgICAgdG9rZW4uY29udGVudCA9IGlzVmFsaWRFbnRpdHlDb2RlKGNvZGUpID8gZnJvbUNvZGVQb2ludChjb2RlKSA6IGZyb21Db2RlUG9pbnQoMHhGRkZEKVxuICAgICAgICB0b2tlbi5tYXJrdXAgID0gbWF0Y2hbMF1cbiAgICAgICAgdG9rZW4uaW5mbyAgICA9ICdlbnRpdHknXG4gICAgICB9XG4gICAgICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtYXRjaCA9IHN0YXRlLnNyYy5zbGljZShwb3MpLm1hdGNoKE5BTUVEX1JFKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUhUTUwobWF0Y2hbMF0pXG4gICAgICBpZiAoZGVjb2RlZCAhPT0gbWF0Y2hbMF0pIHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgndGV4dF9zcGVjaWFsJywgJycsIDApXG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IGRlY29kZWRcbiAgICAgICAgICB0b2tlbi5tYXJrdXAgID0gbWF0Y2hbMF1cbiAgICAgICAgICB0b2tlbi5pbmZvICAgID0gJ2VudGl0eSdcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvLyBQcm9jZXNzIGVzY2FwZWQgY2hhcnMgYW5kIGhhcmRicmVha3NcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmNvbnN0IEVTQ0FQRUQgPSBbXVxuXG5mb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7IEVTQ0FQRUQucHVzaCgwKSB9XG5cbidcXFxcIVwiIyQlJlxcJygpKissLi86Ozw9Pj9AW11eX2B7fH1+LSdcbiAgLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaCkgeyBFU0NBUEVEW2NoLmNoYXJDb2RlQXQoMCldID0gMSB9KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBlc2NhcGUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHg1Qy8qIFxcICovKSByZXR1cm4gZmFsc2VcbiAgcG9zKytcblxuICAvLyAnXFwnIGF0IHRoZSBlbmQgb2YgdGhlIGlubGluZSBibG9ja1xuICBpZiAocG9zID49IG1heCkgcmV0dXJuIGZhbHNlXG5cbiAgbGV0IGNoMSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICBpZiAoY2gxID09PSAweDBBKSB7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHN0YXRlLnB1c2goJ2hhcmRicmVhaycsICdicicsIDApXG4gICAgfVxuXG4gICAgcG9zKytcbiAgICAvLyBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZXMgZnJvbSBuZXh0IGxpbmVcbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBjaDEgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY2gxKSkgYnJlYWtcbiAgICAgIHBvcysrXG4gICAgfVxuXG4gICAgc3RhdGUucG9zID0gcG9zXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBlc2NhcGVkU3RyID0gc3RhdGUuc3JjW3Bvc11cblxuICBpZiAoY2gxID49IDB4RDgwMCAmJiBjaDEgPD0gMHhEQkZGICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICBjb25zdCBjaDIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuXG4gICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikge1xuICAgICAgZXNjYXBlZFN0ciArPSBzdGF0ZS5zcmNbcG9zICsgMV1cbiAgICAgIHBvcysrXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZ1N0ciA9ICdcXFxcJyArIGVzY2FwZWRTdHJcblxuICBpZiAoIXNpbGVudCkge1xuICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgndGV4dF9zcGVjaWFsJywgJycsIDApXG5cbiAgICBpZiAoY2gxIDwgMjU2ICYmIEVTQ0FQRURbY2gxXSAhPT0gMCkge1xuICAgICAgdG9rZW4uY29udGVudCA9IGVzY2FwZWRTdHJcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4uY29udGVudCA9IG9yaWdTdHJcbiAgICB9XG5cbiAgICB0b2tlbi5tYXJrdXAgPSBvcmlnU3RyXG4gICAgdG9rZW4uaW5mbyAgID0gJ2VzY2FwZSdcbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHBvcyArIDFcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIENsZWFuIHVwIHRva2VucyBhZnRlciBlbXBoYXNpcyBhbmQgc3RyaWtldGhyb3VnaCBwb3N0cHJvY2Vzc2luZzpcbi8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXMgaW50byBvbmUgYW5kIHJlLWNhbGN1bGF0ZSBhbGwgdG9rZW4gbGV2ZWxzXG4vL1xuLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBpbml0aWFsbHkgZW1waGFzaXMgZGVsaW1pdGVyIG1hcmtlcnMgKCosIF8sIH4pXG4vLyBhcmUgdHJlYXRlZCBhcyB0aGVpciBvd24gc2VwYXJhdGUgdGV4dCB0b2tlbnMuIFRoZW4gZW1waGFzaXMgcnVsZSBlaXRoZXJcbi8vIGxlYXZlcyB0aGVtIGFzIHRleHQgKG5lZWRlZCB0byBtZXJnZSB3aXRoIGFkamFjZW50IHRleHQpIG9yIHR1cm5zIHRoZW1cbi8vIGludG8gb3BlbmluZy9jbG9zaW5nIHRhZ3MgKHdoaWNoIG1lc3NlcyB1cCBsZXZlbHMgaW5zaWRlKS5cbi8vXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZyYWdtZW50c19qb2luIChzdGF0ZSkge1xuICBsZXQgY3VyciwgbGFzdFxuICBsZXQgbGV2ZWwgPSAwXG4gIGNvbnN0IHRva2VucyA9IHN0YXRlLnRva2Vuc1xuICBjb25zdCBtYXggPSBzdGF0ZS50b2tlbnMubGVuZ3RoXG5cbiAgZm9yIChjdXJyID0gbGFzdCA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgIC8vIHJlLWNhbGN1bGF0ZSBsZXZlbHMgYWZ0ZXIgZW1waGFzaXMvc3RyaWtldGhyb3VnaCB0dXJucyBzb21lIHRleHQgbm9kZXNcbiAgICAvLyBpbnRvIG9wZW5pbmcvY2xvc2luZyB0YWdzXG4gICAgaWYgKHRva2Vuc1tjdXJyXS5uZXN0aW5nIDwgMCkgbGV2ZWwtLSAvLyBjbG9zaW5nIHRhZ1xuICAgIHRva2Vuc1tjdXJyXS5sZXZlbCA9IGxldmVsXG4gICAgaWYgKHRva2Vuc1tjdXJyXS5uZXN0aW5nID4gMCkgbGV2ZWwrKyAvLyBvcGVuaW5nIHRhZ1xuXG4gICAgaWYgKHRva2Vuc1tjdXJyXS50eXBlID09PSAndGV4dCcgJiZcbiAgICAgICAgY3VyciArIDEgPCBtYXggJiZcbiAgICAgICAgdG9rZW5zW2N1cnIgKyAxXS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIC8vIGNvbGxhcHNlIHR3byBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICB0b2tlbnNbY3VyciArIDFdLmNvbnRlbnQgPSB0b2tlbnNbY3Vycl0uY29udGVudCArIHRva2Vuc1tjdXJyICsgMV0uY29udGVudFxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VyciAhPT0gbGFzdCkgeyB0b2tlbnNbbGFzdF0gPSB0b2tlbnNbY3Vycl0gfVxuXG4gICAgICBsYXN0KytcbiAgICB9XG4gIH1cblxuICBpZiAoY3VyciAhPT0gbGFzdCkge1xuICAgIHRva2Vucy5sZW5ndGggPSBsYXN0XG4gIH1cbn1cbiIsIi8vIFByb2Nlc3MgaHRtbCB0YWdzXG5cbmltcG9ydCB7IEhUTUxfVEFHX1JFIH0gZnJvbSAnLi4vY29tbW9uL2h0bWxfcmUubWpzJ1xuXG5mdW5jdGlvbiBpc0xpbmtPcGVuIChzdHIpIHtcbiAgcmV0dXJuIC9ePGFbPlxcc10vaS50ZXN0KHN0cilcbn1cbmZ1bmN0aW9uIGlzTGlua0Nsb3NlIChzdHIpIHtcbiAgcmV0dXJuIC9ePFxcL2FcXHMqPi9pLnRlc3Qoc3RyKVxufVxuXG5mdW5jdGlvbiBpc0xldHRlciAoY2gpIHtcbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6MCAqL1xuICBjb25zdCBsYyA9IGNoIHwgMHgyMCAvLyB0byBsb3dlciBjYXNlXG4gIHJldHVybiAobGMgPj0gMHg2MS8qIGEgKi8pICYmIChsYyA8PSAweDdhLyogeiAqLylcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaHRtbF9pbmxpbmUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLmh0bWwpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBDaGVjayBzdGFydFxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3QgcG9zID0gc3RhdGUucG9zXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNDLyogPCAqLyB8fFxuICAgICAgcG9zICsgMiA+PSBtYXgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFF1aWNrIGZhaWwgb24gc2Vjb25kIGNoYXJcbiAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovICYmXG4gICAgICBjaCAhPT0gMHgzRi8qID8gKi8gJiZcbiAgICAgIGNoICE9PSAweDJGLyogLyAqLyAmJlxuICAgICAgIWlzTGV0dGVyKGNoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5tYXRjaChIVE1MX1RBR19SRSlcbiAgaWYgKCFtYXRjaCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCdodG1sX2lubGluZScsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgPSBtYXRjaFswXVxuXG4gICAgaWYgKGlzTGlua09wZW4odG9rZW4uY29udGVudCkpICBzdGF0ZS5saW5rTGV2ZWwrK1xuICAgIGlmIChpc0xpbmtDbG9zZSh0b2tlbi5jb250ZW50KSkgc3RhdGUubGlua0xldmVsLS1cbiAgfVxuICBzdGF0ZS5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZXNzICFbaW1hZ2VdKDxzcmM+IFwidGl0bGVcIilcblxuaW1wb3J0IHsgbm9ybWFsaXplUmVmZXJlbmNlLCBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW1hZ2UgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IGNvZGUsIGNvbnRlbnQsIGxhYmVsLCBwb3MsIHJlZiwgcmVzLCB0aXRsZSwgc3RhcnRcbiAgbGV0IGhyZWYgPSAnJ1xuICBjb25zdCBvbGRQb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcykgIT09IDB4MjEvKiAhICovKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MgKyAxKSAhPT0gMHg1Qi8qIFsgKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBsYWJlbFN0YXJ0ID0gc3RhdGUucG9zICsgMlxuICBjb25zdCBsYWJlbEVuZCA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHN0YXRlLnBvcyArIDEsIGZhbHNlKVxuXG4gIC8vIHBhcnNlciBmYWlsZWQgdG8gZmluZCAnXScsIHNvIGl0J3Mgbm90IGEgdmFsaWQgbGlua1xuICBpZiAobGFiZWxFbmQgPCAwKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgcG9zID0gbGFiZWxFbmQgKyAxXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyOC8qICggKi8pIHtcbiAgICAvL1xuICAgIC8vIElubGluZSBsaW5rXG4gICAgLy9cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgIHBvcysrXG4gICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgfVxuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgIF5eXl5eXiBwYXJzaW5nIGxpbmsgZGVzdGluYXRpb25cbiAgICBzdGFydCA9IHBvc1xuICAgIHJlcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rRGVzdGluYXRpb24oc3RhdGUuc3JjLCBwb3MsIHN0YXRlLnBvc01heClcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBocmVmID0gc3RhdGUubWQubm9ybWFsaXplTGluayhyZXMuc3RyKVxuICAgICAgaWYgKHN0YXRlLm1kLnZhbGlkYXRlTGluayhocmVmKSkge1xuICAgICAgICBwb3MgPSByZXMucG9zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBocmVmID0gJydcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgIHN0YXJ0ID0gcG9zXG4gICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICAgICAgICAgIF5eXl5eXl4gcGFyc2luZyBsaW5rIHRpdGxlXG4gICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhcnQgIT09IHBvcyAmJiByZXMub2spIHtcbiAgICAgIHRpdGxlID0gcmVzLnN0clxuICAgICAgcG9zID0gcmVzLnBvc1xuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlID0gJydcbiAgICB9XG5cbiAgICBpZiAocG9zID49IG1heCB8fCBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDI5LyogKSAqLykge1xuICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcG9zKytcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vIExpbmsgcmVmZXJlbmNlXG4gICAgLy9cbiAgICBpZiAodHlwZW9mIHN0YXRlLmVudi5yZWZlcmVuY2VzID09PSAndW5kZWZpbmVkJykgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDVCLyogWyAqLykge1xuICAgICAgc3RhcnQgPSBwb3MgKyAxXG4gICAgICBwb3MgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0xhYmVsKHN0YXRlLCBwb3MpXG4gICAgICBpZiAocG9zID49IDApIHtcbiAgICAgICAgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvcysrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcG9zID0gbGFiZWxFbmQgKyAxXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcyA9IGxhYmVsRW5kICsgMVxuICAgIH1cblxuICAgIC8vIGNvdmVycyBsYWJlbCA9PT0gJycgYW5kIGxhYmVsID09PSB1bmRlZmluZWRcbiAgICAvLyAoY29sbGFwc2VkIHJlZmVyZW5jZSBsaW5rIGFuZCBzaG9ydGN1dCByZWZlcmVuY2UgbGluayByZXNwZWN0aXZlbHkpXG4gICAgaWYgKCFsYWJlbCkgeyBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShsYWJlbFN0YXJ0LCBsYWJlbEVuZCkgfVxuXG4gICAgcmVmID0gc3RhdGUuZW52LnJlZmVyZW5jZXNbbm9ybWFsaXplUmVmZXJlbmNlKGxhYmVsKV1cbiAgICBpZiAoIXJlZikge1xuICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaHJlZiA9IHJlZi5ocmVmXG4gICAgdGl0bGUgPSByZWYudGl0bGVcbiAgfVxuXG4gIC8vXG4gIC8vIFdlIGZvdW5kIHRoZSBlbmQgb2YgdGhlIGxpbmssIGFuZCBrbm93IGZvciBhIGZhY3QgaXQncyBhIHZhbGlkIGxpbms7XG4gIC8vIHNvIGFsbCB0aGF0J3MgbGVmdCB0byBkbyBpcyB0byBjYWxsIHRva2VuaXplci5cbiAgLy9cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBjb250ZW50ID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKVxuXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBzdGF0ZS5tZC5pbmxpbmUucGFyc2UoXG4gICAgICBjb250ZW50LFxuICAgICAgc3RhdGUubWQsXG4gICAgICBzdGF0ZS5lbnYsXG4gICAgICB0b2tlbnNcbiAgICApXG5cbiAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ2ltYWdlJywgJ2ltZycsIDApXG4gICAgY29uc3QgYXR0cnMgPSBbWydzcmMnLCBocmVmXSwgWydhbHQnLCAnJ11dXG4gICAgdG9rZW4uYXR0cnMgPSBhdHRyc1xuICAgIHRva2VuLmNoaWxkcmVuID0gdG9rZW5zXG4gICAgdG9rZW4uY29udGVudCA9IGNvbnRlbnRcblxuICAgIGlmICh0aXRsZSkge1xuICAgICAgYXR0cnMucHVzaChbJ3RpdGxlJywgdGl0bGVdKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRlLnBvcyA9IHBvc1xuICBzdGF0ZS5wb3NNYXggPSBtYXhcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFByb2Nlc3MgW2xpbmtdKDx0bz4gXCJzdHVmZlwiKVxuXG5pbXBvcnQgeyBub3JtYWxpemVSZWZlcmVuY2UsIGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5rIChzdGF0ZSwgc2lsZW50KSB7XG4gIGxldCBjb2RlLCBsYWJlbCwgcmVzLCByZWZcbiAgbGV0IGhyZWYgPSAnJ1xuICBsZXQgdGl0bGUgPSAnJ1xuICBsZXQgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgbGV0IHBhcnNlUmVmZXJlbmNlID0gdHJ1ZVxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IG9sZFBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3QgbGFiZWxTdGFydCA9IHN0YXRlLnBvcyArIDFcbiAgY29uc3QgbGFiZWxFbmQgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0xhYmVsKHN0YXRlLCBzdGF0ZS5wb3MsIHRydWUpXG5cbiAgLy8gcGFyc2VyIGZhaWxlZCB0byBmaW5kICddJywgc28gaXQncyBub3QgYSB2YWxpZCBsaW5rXG4gIGlmIChsYWJlbEVuZCA8IDApIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgcG9zID0gbGFiZWxFbmQgKyAxXG4gIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgyOC8qICggKi8pIHtcbiAgICAvL1xuICAgIC8vIElubGluZSBsaW5rXG4gICAgLy9cblxuICAgIC8vIG1pZ2h0IGhhdmUgZm91bmQgYSB2YWxpZCBzaG9ydGN1dCBsaW5rLCBkaXNhYmxlIHJlZmVyZW5jZSBwYXJzaW5nXG4gICAgcGFyc2VSZWZlcmVuY2UgPSBmYWxzZVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgcG9zKytcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjb2RlKSAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrIH1cbiAgICB9XG4gICAgaWYgKHBvcyA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgICAgXl5eXl5eIHBhcnNpbmcgbGluayBkZXN0aW5hdGlvblxuICAgIHN0YXJ0ID0gcG9zXG4gICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtEZXN0aW5hdGlvbihzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGhyZWYgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHJlcy5zdHIpXG4gICAgICBpZiAoc3RhdGUubWQudmFsaWRhdGVMaW5rKGhyZWYpKSB7XG4gICAgICAgIHBvcyA9IHJlcy5wb3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhyZWYgPSAnJ1xuICAgICAgfVxuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICBzdGFydCA9IHBvc1xuICAgICAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgICAgfVxuXG4gICAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgICAgLy8gICAgICAgICAgICAgICAgICBeXl5eXl5eIHBhcnNpbmcgbGluayB0aXRsZVxuICAgICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgICAgaWYgKHBvcyA8IG1heCAmJiBzdGFydCAhPT0gcG9zICYmIHJlcy5vaykge1xuICAgICAgICB0aXRsZSA9IHJlcy5zdHJcbiAgICAgICAgcG9zID0gcmVzLnBvc1xuXG4gICAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIF5eIHNraXBwaW5nIHRoZXNlIHNwYWNlc1xuICAgICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSBtYXggfHwgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyOS8qICkgKi8pIHtcbiAgICAgIC8vIHBhcnNpbmcgYSB2YWxpZCBzaG9ydGN1dCBsaW5rIGZhaWxlZCwgZmFsbGJhY2sgdG8gcmVmZXJlbmNlXG4gICAgICBwYXJzZVJlZmVyZW5jZSA9IHRydWVcbiAgICB9XG4gICAgcG9zKytcbiAgfVxuXG4gIGlmIChwYXJzZVJlZmVyZW5jZSkge1xuICAgIC8vXG4gICAgLy8gTGluayByZWZlcmVuY2VcbiAgICAvL1xuICAgIGlmICh0eXBlb2Ygc3RhdGUuZW52LnJlZmVyZW5jZXMgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4NUIvKiBbICovKSB7XG4gICAgICBzdGFydCA9IHBvcyArIDFcbiAgICAgIHBvcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHBvcylcbiAgICAgIGlmIChwb3MgPj0gMCkge1xuICAgICAgICBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKyspXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zID0gbGFiZWxFbmQgKyAxXG4gICAgfVxuXG4gICAgLy8gY292ZXJzIGxhYmVsID09PSAnJyBhbmQgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgIC8vIChjb2xsYXBzZWQgcmVmZXJlbmNlIGxpbmsgYW5kIHNob3J0Y3V0IHJlZmVyZW5jZSBsaW5rIHJlc3BlY3RpdmVseSlcbiAgICBpZiAoIWxhYmVsKSB7IGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKSB9XG5cbiAgICByZWYgPSBzdGF0ZS5lbnYucmVmZXJlbmNlc1tub3JtYWxpemVSZWZlcmVuY2UobGFiZWwpXVxuICAgIGlmICghcmVmKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBvbGRQb3NcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBocmVmID0gcmVmLmhyZWZcbiAgICB0aXRsZSA9IHJlZi50aXRsZVxuICB9XG5cbiAgLy9cbiAgLy8gV2UgZm91bmQgdGhlIGVuZCBvZiB0aGUgbGluaywgYW5kIGtub3cgZm9yIGEgZmFjdCBpdCdzIGEgdmFsaWQgbGluaztcbiAgLy8gc28gYWxsIHRoYXQncyBsZWZ0IHRvIGRvIGlzIHRvIGNhbGwgdG9rZW5pemVyLlxuICAvL1xuICBpZiAoIXNpbGVudCkge1xuICAgIHN0YXRlLnBvcyA9IGxhYmVsU3RhcnRcbiAgICBzdGF0ZS5wb3NNYXggPSBsYWJlbEVuZFxuXG4gICAgY29uc3QgdG9rZW5fbyA9IHN0YXRlLnB1c2goJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICBjb25zdCBhdHRycyA9IFtbJ2hyZWYnLCBocmVmXV1cbiAgICB0b2tlbl9vLmF0dHJzICA9IGF0dHJzXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBhdHRycy5wdXNoKFsndGl0bGUnLCB0aXRsZV0pXG4gICAgfVxuXG4gICAgc3RhdGUubGlua0xldmVsKytcbiAgICBzdGF0ZS5tZC5pbmxpbmUudG9rZW5pemUoc3RhdGUpXG4gICAgc3RhdGUubGlua0xldmVsLS1cblxuICAgIHN0YXRlLnB1c2goJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICB9XG5cbiAgc3RhdGUucG9zID0gcG9zXG4gIHN0YXRlLnBvc01heCA9IG1heFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUHJvY2VzcyBsaW5rcyBsaWtlIGh0dHBzOi8vZXhhbXBsZS5vcmcvXG5cbi8vIFJGQzM5ODY6IHNjaGVtZSA9IEFMUEhBICooIEFMUEhBIC8gRElHSVQgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgKVxuY29uc3QgU0NIRU1FX1JFID0gLyg/Ol58W15hLXowLTkuKy1dKShbYS16XVthLXowLTkuKy1dKikkL2lcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlua2lmeSAoc3RhdGUsIHNpbGVudCkge1xuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMubGlua2lmeSkgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5saW5rTGV2ZWwgPiAwKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgaWYgKHBvcyArIDMgPiBtYXgpIHJldHVybiBmYWxzZVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgzQS8qIDogKi8pIHJldHVybiBmYWxzZVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMSkgIT09IDB4MkYvKiAvICovKSByZXR1cm4gZmFsc2VcbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDIpICE9PSAweDJGLyogLyAqLykgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgbWF0Y2ggPSBzdGF0ZS5wZW5kaW5nLm1hdGNoKFNDSEVNRV9SRSlcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJvdG8gPSBtYXRjaFsxXVxuXG4gIGNvbnN0IGxpbmsgPSBzdGF0ZS5tZC5saW5raWZ5Lm1hdGNoQXRTdGFydChzdGF0ZS5zcmMuc2xpY2UocG9zIC0gcHJvdG8ubGVuZ3RoKSlcbiAgaWYgKCFsaW5rKSByZXR1cm4gZmFsc2VcblxuICBsZXQgdXJsID0gbGluay51cmxcblxuICAvLyBpbnZhbGlkIGxpbmssIGJ1dCBzdGlsbCBkZXRlY3RlZCBieSBsaW5raWZ5IHNvbWVob3c7XG4gIC8vIG5lZWQgdG8gY2hlY2sgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wIGJlbG93XG4gIGlmICh1cmwubGVuZ3RoIDw9IHByb3RvLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG5cbiAgLy8gZGlzYWxsb3cgJyonIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmsgKGNvbmZsaWN0cyB3aXRoIGVtcGhhc2lzKVxuICB1cmwgPSB1cmwucmVwbGFjZSgvXFwqKyQvLCAnJylcblxuICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluayh1cmwpXG4gIGlmICghc3RhdGUubWQudmFsaWRhdGVMaW5rKGZ1bGxVcmwpKSByZXR1cm4gZmFsc2VcblxuICBpZiAoIXNpbGVudCkge1xuICAgIHN0YXRlLnBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nLnNsaWNlKDAsIC1wcm90by5sZW5ndGgpXG5cbiAgICBjb25zdCB0b2tlbl9vID0gc3RhdGUucHVzaCgnbGlua19vcGVuJywgJ2EnLCAxKVxuICAgIHRva2VuX28uYXR0cnMgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgdG9rZW5fby5tYXJrdXAgPSAnbGlua2lmeSdcbiAgICB0b2tlbl9vLmluZm8gPSAnYXV0bydcblxuICAgIGNvbnN0IHRva2VuX3QgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW5fdC5jb250ZW50ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsKVxuXG4gICAgY29uc3QgdG9rZW5fYyA9IHN0YXRlLnB1c2goJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICAgIHRva2VuX2MubWFya3VwID0gJ2xpbmtpZnknXG4gICAgdG9rZW5fYy5pbmZvID0gJ2F1dG8nXG4gIH1cblxuICBzdGF0ZS5wb3MgKz0gdXJsLmxlbmd0aCAtIHByb3RvLmxlbmd0aFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUHJvY2Vlc3MgJ1xcbidcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5ld2xpbmUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDBBLyogXFxuICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgcG1heCA9IHN0YXRlLnBlbmRpbmcubGVuZ3RoIC0gMVxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICAvLyAnICBcXG4nIC0+IGhhcmRicmVha1xuICAvLyBMb29rdXAgaW4gcGVuZGluZyBjaGFycyBpcyBiYWQgcHJhY3RpY2UhIERvbid0IGNvcHkgdG8gb3RoZXIgcnVsZXMhXG4gIC8vIFBlbmRpbmcgc3RyaW5nIGlzIHN0b3JlZCBpbiBjb25jYXQgbW9kZSwgaW5kZXhlZCBsb29rdXBzIHdpbGwgY2F1c2VcbiAgLy8gY29udmVydGlvbiB0byBmbGF0IG1vZGUuXG4gIGlmICghc2lsZW50KSB7XG4gICAgaWYgKHBtYXggPj0gMCAmJiBzdGF0ZS5wZW5kaW5nLmNoYXJDb2RlQXQocG1heCkgPT09IDB4MjApIHtcbiAgICAgIGlmIChwbWF4ID49IDEgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHBtYXggLSAxKSA9PT0gMHgyMCkge1xuICAgICAgICAvLyBGaW5kIHdoaXRlc3BhY2VzIHRhaWwgb2YgcGVuZGluZyBjaGFycy5cbiAgICAgICAgbGV0IHdzID0gcG1heCAtIDFcbiAgICAgICAgd2hpbGUgKHdzID49IDEgJiYgc3RhdGUucGVuZGluZy5jaGFyQ29kZUF0KHdzIC0gMSkgPT09IDB4MjApIHdzLS1cblxuICAgICAgICBzdGF0ZS5wZW5kaW5nID0gc3RhdGUucGVuZGluZy5zbGljZSgwLCB3cylcbiAgICAgICAgc3RhdGUucHVzaCgnaGFyZGJyZWFrJywgJ2JyJywgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nLnNsaWNlKDAsIC0xKVxuICAgICAgICBzdGF0ZS5wdXNoKCdzb2Z0YnJlYWsnLCAnYnInLCAwKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wdXNoKCdzb2Z0YnJlYWsnLCAnYnInLCAwKVxuICAgIH1cbiAgfVxuXG4gIHBvcysrXG5cbiAgLy8gc2tpcCBoZWFkaW5nIHNwYWNlcyBmb3IgbmV4dCBsaW5lXG4gIHdoaWxlIChwb3MgPCBtYXggJiYgaXNTcGFjZShzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpKSkgeyBwb3MrKyB9XG5cbiAgc3RhdGUucG9zID0gcG9zXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBJbmxpbmUgcGFyc2VyIHN0YXRlXG5cbmltcG9ydCBUb2tlbiBmcm9tICcuLi90b2tlbi5tanMnXG5pbXBvcnQgeyBpc1doaXRlU3BhY2UsIGlzUHVuY3RDaGFyLCBpc01kQXNjaWlQdW5jdCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmZ1bmN0aW9uIFN0YXRlSW5saW5lIChzcmMsIG1kLCBlbnYsIG91dFRva2Vucykge1xuICB0aGlzLnNyYyA9IHNyY1xuICB0aGlzLmVudiA9IGVudlxuICB0aGlzLm1kID0gbWRcbiAgdGhpcy50b2tlbnMgPSBvdXRUb2tlbnNcbiAgdGhpcy50b2tlbnNfbWV0YSA9IEFycmF5KG91dFRva2Vucy5sZW5ndGgpXG5cbiAgdGhpcy5wb3MgPSAwXG4gIHRoaXMucG9zTWF4ID0gdGhpcy5zcmMubGVuZ3RoXG4gIHRoaXMubGV2ZWwgPSAwXG4gIHRoaXMucGVuZGluZyA9ICcnXG4gIHRoaXMucGVuZGluZ0xldmVsID0gMFxuXG4gIC8vIFN0b3JlcyB7IHN0YXJ0OiBlbmQgfSBwYWlycy4gVXNlZnVsIGZvciBiYWNrdHJhY2tcbiAgLy8gb3B0aW1pemF0aW9uIG9mIHBhaXJzIHBhcnNlIChlbXBoYXNpcywgc3RyaWtlcykuXG4gIHRoaXMuY2FjaGUgPSB7fVxuXG4gIC8vIExpc3Qgb2YgZW1waGFzaXMtbGlrZSBkZWxpbWl0ZXJzIGZvciBjdXJyZW50IHRhZ1xuICB0aGlzLmRlbGltaXRlcnMgPSBbXVxuXG4gIC8vIFN0YWNrIG9mIGRlbGltaXRlciBsaXN0cyBmb3IgdXBwZXIgbGV2ZWwgdGFnc1xuICB0aGlzLl9wcmV2X2RlbGltaXRlcnMgPSBbXVxuXG4gIC8vIGJhY2t0aWNrIGxlbmd0aCA9PiBsYXN0IHNlZW4gcG9zaXRpb25cbiAgdGhpcy5iYWNrdGlja3MgPSB7fVxuICB0aGlzLmJhY2t0aWNrc1NjYW5uZWQgPSBmYWxzZVxuXG4gIC8vIENvdW50ZXIgdXNlZCB0byBkaXNhYmxlIGlubGluZSBsaW5raWZ5LWl0IGV4ZWN1dGlvblxuICAvLyBpbnNpZGUgPGE+IGFuZCBtYXJrZG93biBsaW5rc1xuICB0aGlzLmxpbmtMZXZlbCA9IDBcbn1cblxuLy8gRmx1c2ggcGVuZGluZyB0ZXh0XG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLnB1c2hQZW5kaW5nID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbigndGV4dCcsICcnLCAwKVxuICB0b2tlbi5jb250ZW50ID0gdGhpcy5wZW5kaW5nXG4gIHRva2VuLmxldmVsID0gdGhpcy5wZW5kaW5nTGV2ZWxcbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgdGhpcy5wZW5kaW5nID0gJydcbiAgcmV0dXJuIHRva2VuXG59XG5cbi8vIFB1c2ggbmV3IHRva2VuIHRvIFwic3RyZWFtXCIuXG4vLyBJZiBwZW5kaW5nIHRleHQgZXhpc3RzIC0gZmx1c2ggaXQgYXMgdGV4dCB0b2tlblxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHR5cGUsIHRhZywgbmVzdGluZykge1xuICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgdGhpcy5wdXNoUGVuZGluZygpXG4gIH1cblxuICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbih0eXBlLCB0YWcsIG5lc3RpbmcpXG4gIGxldCB0b2tlbl9tZXRhID0gbnVsbFxuXG4gIGlmIChuZXN0aW5nIDwgMCkge1xuICAgIC8vIGNsb3NpbmcgdGFnXG4gICAgdGhpcy5sZXZlbC0tXG4gICAgdGhpcy5kZWxpbWl0ZXJzID0gdGhpcy5fcHJldl9kZWxpbWl0ZXJzLnBvcCgpXG4gIH1cblxuICB0b2tlbi5sZXZlbCA9IHRoaXMubGV2ZWxcblxuICBpZiAobmVzdGluZyA+IDApIHtcbiAgICAvLyBvcGVuaW5nIHRhZ1xuICAgIHRoaXMubGV2ZWwrK1xuICAgIHRoaXMuX3ByZXZfZGVsaW1pdGVycy5wdXNoKHRoaXMuZGVsaW1pdGVycylcbiAgICB0aGlzLmRlbGltaXRlcnMgPSBbXVxuICAgIHRva2VuX21ldGEgPSB7IGRlbGltaXRlcnM6IHRoaXMuZGVsaW1pdGVycyB9XG4gIH1cblxuICB0aGlzLnBlbmRpbmdMZXZlbCA9IHRoaXMubGV2ZWxcbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgdGhpcy50b2tlbnNfbWV0YS5wdXNoKHRva2VuX21ldGEpXG4gIHJldHVybiB0b2tlblxufVxuXG4vLyBTY2FuIGEgc2VxdWVuY2Ugb2YgZW1waGFzaXMtbGlrZSBtYXJrZXJzLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXJcbi8vIGl0IGNhbiBzdGFydCBhbiBlbXBoYXNpcyBzZXF1ZW5jZSBvciBlbmQgYW4gZW1waGFzaXMgc2VxdWVuY2UuXG4vL1xuLy8gIC0gc3RhcnQgLSBwb3NpdGlvbiB0byBzY2FuIGZyb20gKGl0IHNob3VsZCBwb2ludCBhdCBhIHZhbGlkIG1hcmtlcik7XG4vLyAgLSBjYW5TcGxpdFdvcmQgLSBkZXRlcm1pbmUgaWYgdGhlc2UgbWFya2VycyBjYW4gYmUgZm91bmQgaW5zaWRlIGEgd29yZFxuLy9cblN0YXRlSW5saW5lLnByb3RvdHlwZS5zY2FuRGVsaW1zID0gZnVuY3Rpb24gKHN0YXJ0LCBjYW5TcGxpdFdvcmQpIHtcbiAgY29uc3QgbWF4ID0gdGhpcy5wb3NNYXhcbiAgY29uc3QgbWFya2VyID0gdGhpcy5zcmMuY2hhckNvZGVBdChzdGFydClcblxuICAvLyB0cmVhdCBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYXMgYSB3aGl0ZXNwYWNlXG4gIGNvbnN0IGxhc3RDaGFyID0gc3RhcnQgPiAwID8gdGhpcy5zcmMuY2hhckNvZGVBdChzdGFydCAtIDEpIDogMHgyMFxuXG4gIGxldCBwb3MgPSBzdGFydFxuICB3aGlsZSAocG9zIDwgbWF4ICYmIHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gbWFya2VyKSB7IHBvcysrIH1cblxuICBjb25zdCBjb3VudCA9IHBvcyAtIHN0YXJ0XG5cbiAgLy8gdHJlYXQgZW5kIG9mIHRoZSBsaW5lIGFzIGEgd2hpdGVzcGFjZVxuICBjb25zdCBuZXh0Q2hhciA9IHBvcyA8IG1heCA/IHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKSA6IDB4MjBcblxuICBjb25zdCBpc0xhc3RQdW5jdENoYXIgPSBpc01kQXNjaWlQdW5jdChsYXN0Q2hhcikgfHwgaXNQdW5jdENoYXIoU3RyaW5nLmZyb21DaGFyQ29kZShsYXN0Q2hhcikpXG4gIGNvbnN0IGlzTmV4dFB1bmN0Q2hhciA9IGlzTWRBc2NpaVB1bmN0KG5leHRDaGFyKSB8fCBpc1B1bmN0Q2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRDaGFyKSlcblxuICBjb25zdCBpc0xhc3RXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKGxhc3RDaGFyKVxuICBjb25zdCBpc05leHRXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKG5leHRDaGFyKVxuXG4gIGNvbnN0IGxlZnRfZmxhbmtpbmcgPVxuICAgICFpc05leHRXaGl0ZVNwYWNlICYmICghaXNOZXh0UHVuY3RDaGFyIHx8IGlzTGFzdFdoaXRlU3BhY2UgfHwgaXNMYXN0UHVuY3RDaGFyKVxuICBjb25zdCByaWdodF9mbGFua2luZyA9XG4gICAgIWlzTGFzdFdoaXRlU3BhY2UgJiYgKCFpc0xhc3RQdW5jdENoYXIgfHwgaXNOZXh0V2hpdGVTcGFjZSB8fCBpc05leHRQdW5jdENoYXIpXG5cbiAgY29uc3QgY2FuX29wZW4gID0gbGVmdF9mbGFua2luZyAgJiYgKGNhblNwbGl0V29yZCB8fCAhcmlnaHRfZmxhbmtpbmcgfHwgaXNMYXN0UHVuY3RDaGFyKVxuICBjb25zdCBjYW5fY2xvc2UgPSByaWdodF9mbGFua2luZyAmJiAoY2FuU3BsaXRXb3JkIHx8ICFsZWZ0X2ZsYW5raW5nICB8fCBpc05leHRQdW5jdENoYXIpXG5cbiAgcmV0dXJuIHsgY2FuX29wZW4sIGNhbl9jbG9zZSwgbGVuZ3RoOiBjb3VudCB9XG59XG5cbi8vIHJlLWV4cG9ydCBUb2tlbiBjbGFzcyB0byB1c2UgaW4gYmxvY2sgcnVsZXNcblN0YXRlSW5saW5lLnByb3RvdHlwZS5Ub2tlbiA9IFRva2VuXG5cbmV4cG9ydCBkZWZhdWx0IFN0YXRlSW5saW5lXG4iLCIvLyB+fnN0cmlrZSB0aHJvdWdofn5cbi8vXG5cbi8vIEluc2VydCBlYWNoIG1hcmtlciBhcyBhIHNlcGFyYXRlIHRleHQgdG9rZW4sIGFuZCBhZGQgaXQgdG8gZGVsaW1pdGVyIGxpc3Rcbi8vXG5mdW5jdGlvbiBzdHJpa2V0aHJvdWdoX3Rva2VuaXplIChzdGF0ZSwgc2lsZW50KSB7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhdGUucG9zXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAobWFya2VyICE9PSAweDdFLyogfiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IHNjYW5uZWQgPSBzdGF0ZS5zY2FuRGVsaW1zKHN0YXRlLnBvcywgdHJ1ZSlcbiAgbGV0IGxlbiA9IHNjYW5uZWQubGVuZ3RoXG4gIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpXG5cbiAgaWYgKGxlbiA8IDIpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgdG9rZW5cblxuICBpZiAobGVuICUgMikge1xuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IGNoXG4gICAgbGVuLS1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICB0b2tlbiAgICAgICAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgIHRva2VuLmNvbnRlbnQgPSBjaCArIGNoXG5cbiAgICBzdGF0ZS5kZWxpbWl0ZXJzLnB1c2goe1xuICAgICAgbWFya2VyLFxuICAgICAgbGVuZ3RoOiAwLCAgICAgLy8gZGlzYWJsZSBcInJ1bGUgb2YgM1wiIGxlbmd0aCBjaGVja3MgbWVhbnQgZm9yIGVtcGhhc2lzXG4gICAgICB0b2tlbjogc3RhdGUudG9rZW5zLmxlbmd0aCAtIDEsXG4gICAgICBlbmQ6IC0xLFxuICAgICAgb3Blbjogc2Nhbm5lZC5jYW5fb3BlbixcbiAgICAgIGNsb3NlOiBzY2FubmVkLmNhbl9jbG9zZVxuICAgIH0pXG4gIH1cblxuICBzdGF0ZS5wb3MgKz0gc2Nhbm5lZC5sZW5ndGhcblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBwb3N0UHJvY2VzcyAoc3RhdGUsIGRlbGltaXRlcnMpIHtcbiAgbGV0IHRva2VuXG4gIGNvbnN0IGxvbmVNYXJrZXJzID0gW11cbiAgY29uc3QgbWF4ID0gZGVsaW1pdGVycy5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1heDsgaSsrKSB7XG4gICAgY29uc3Qgc3RhcnREZWxpbSA9IGRlbGltaXRlcnNbaV1cblxuICAgIGlmIChzdGFydERlbGltLm1hcmtlciAhPT0gMHg3RS8qIH4gKi8pIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RGVsaW0uZW5kID09PSAtMSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBlbmREZWxpbSA9IGRlbGltaXRlcnNbc3RhcnREZWxpbS5lbmRdXG5cbiAgICB0b2tlbiAgICAgICAgID0gc3RhdGUudG9rZW5zW3N0YXJ0RGVsaW0udG9rZW5dXG4gICAgdG9rZW4udHlwZSAgICA9ICdzX29wZW4nXG4gICAgdG9rZW4udGFnICAgICA9ICdzJ1xuICAgIHRva2VuLm5lc3RpbmcgPSAxXG4gICAgdG9rZW4ubWFya3VwICA9ICd+fidcbiAgICB0b2tlbi5jb250ZW50ID0gJydcblxuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS50b2tlbnNbZW5kRGVsaW0udG9rZW5dXG4gICAgdG9rZW4udHlwZSAgICA9ICdzX2Nsb3NlJ1xuICAgIHRva2VuLnRhZyAgICAgPSAncydcbiAgICB0b2tlbi5uZXN0aW5nID0gLTFcbiAgICB0b2tlbi5tYXJrdXAgID0gJ35+J1xuICAgIHRva2VuLmNvbnRlbnQgPSAnJ1xuXG4gICAgaWYgKHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbiAtIDFdLnR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgICBzdGF0ZS50b2tlbnNbZW5kRGVsaW0udG9rZW4gLSAxXS5jb250ZW50ID09PSAnficpIHtcbiAgICAgIGxvbmVNYXJrZXJzLnB1c2goZW5kRGVsaW0udG9rZW4gLSAxKVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIGEgbWFya2VyIHNlcXVlbmNlIGhhcyBhbiBvZGQgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGl0J3Mgc3BsaXR0ZWRcbiAgLy8gbGlrZSB0aGlzOiBgfn5+fn5gIC0+IGB+YCArIGB+fmAgKyBgfn5gLCBsZWF2aW5nIG9uZSBtYXJrZXIgYXQgdGhlXG4gIC8vIHN0YXJ0IG9mIHRoZSBzZXF1ZW5jZS5cbiAgLy9cbiAgLy8gU28sIHdlIGhhdmUgdG8gbW92ZSBhbGwgdGhvc2UgbWFya2VycyBhZnRlciBzdWJzZXF1ZW50IHNfY2xvc2UgdGFncy5cbiAgLy9cbiAgd2hpbGUgKGxvbmVNYXJrZXJzLmxlbmd0aCkge1xuICAgIGNvbnN0IGkgPSBsb25lTWFya2Vycy5wb3AoKVxuICAgIGxldCBqID0gaSArIDFcblxuICAgIHdoaWxlIChqIDwgc3RhdGUudG9rZW5zLmxlbmd0aCAmJiBzdGF0ZS50b2tlbnNbal0udHlwZSA9PT0gJ3NfY2xvc2UnKSB7XG4gICAgICBqKytcbiAgICB9XG5cbiAgICBqLS1cblxuICAgIGlmIChpICE9PSBqKSB7XG4gICAgICB0b2tlbiA9IHN0YXRlLnRva2Vuc1tqXVxuICAgICAgc3RhdGUudG9rZW5zW2pdID0gc3RhdGUudG9rZW5zW2ldXG4gICAgICBzdGF0ZS50b2tlbnNbaV0gPSB0b2tlblxuICAgIH1cbiAgfVxufVxuXG4vLyBXYWxrIHRocm91Z2ggZGVsaW1pdGVyIGxpc3QgYW5kIHJlcGxhY2UgdGV4dCB0b2tlbnMgd2l0aCB0YWdzXG4vL1xuZnVuY3Rpb24gc3RyaWtldGhyb3VnaF9wb3N0UHJvY2VzcyAoc3RhdGUpIHtcbiAgY29uc3QgdG9rZW5zX21ldGEgPSBzdGF0ZS50b2tlbnNfbWV0YVxuICBjb25zdCBtYXggPSBzdGF0ZS50b2tlbnNfbWV0YS5sZW5ndGhcblxuICBwb3N0UHJvY2VzcyhzdGF0ZSwgc3RhdGUuZGVsaW1pdGVycylcblxuICBmb3IgKGxldCBjdXJyID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgaWYgKHRva2Vuc19tZXRhW2N1cnJdICYmIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpIHtcbiAgICAgIHBvc3RQcm9jZXNzKHN0YXRlLCB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHRva2VuaXplOiBzdHJpa2V0aHJvdWdoX3Rva2VuaXplLFxuICBwb3N0UHJvY2Vzczogc3RyaWtldGhyb3VnaF9wb3N0UHJvY2Vzc1xufVxuIiwiLy8gU2tpcCB0ZXh0IGNoYXJhY3RlcnMgZm9yIHRleHQgdG9rZW4sIHBsYWNlIHRob3NlIHRvIHBlbmRpbmcgYnVmZmVyXG4vLyBhbmQgaW5jcmVtZW50IGN1cnJlbnQgcG9zXG5cbi8vIFJ1bGUgdG8gc2tpcCBwdXJlIHRleHRcbi8vICd7fSQlQH4rPTonIHJlc2VydmVkIGZvciBleHRlbnRpb25zXG5cbi8vICEsIFwiLCAjLCAkLCAlLCAmLCAnLCAoLCApLCAqLCArLCAsLCAtLCAuLCAvLCA6LCA7LCA8LCA9LCA+LCA/LCBALCBbLCBcXCwgXSwgXiwgXywgYCwgeywgfCwgfSwgb3IgflxuXG4vLyAhISEhIERvbid0IGNvbmZ1c2Ugd2l0aCBcIk1hcmtkb3duIEFTQ0lJIFB1bmN0dWF0aW9uXCIgY2hhcnNcbi8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTUvI2FzY2lpLXB1bmN0dWF0aW9uLWNoYXJhY3RlclxuZnVuY3Rpb24gaXNUZXJtaW5hdG9yQ2hhciAoY2gpIHtcbiAgc3dpdGNoIChjaCkge1xuICAgIGNhc2UgMHgwQS8qIFxcbiAqLzpcbiAgICBjYXNlIDB4MjEvKiAhICovOlxuICAgIGNhc2UgMHgyMy8qICMgKi86XG4gICAgY2FzZSAweDI0LyogJCAqLzpcbiAgICBjYXNlIDB4MjUvKiAlICovOlxuICAgIGNhc2UgMHgyNi8qICYgKi86XG4gICAgY2FzZSAweDJBLyogKiAqLzpcbiAgICBjYXNlIDB4MkIvKiArICovOlxuICAgIGNhc2UgMHgyRC8qIC0gKi86XG4gICAgY2FzZSAweDNBLyogOiAqLzpcbiAgICBjYXNlIDB4M0MvKiA8ICovOlxuICAgIGNhc2UgMHgzRC8qID0gKi86XG4gICAgY2FzZSAweDNFLyogPiAqLzpcbiAgICBjYXNlIDB4NDAvKiBAICovOlxuICAgIGNhc2UgMHg1Qi8qIFsgKi86XG4gICAgY2FzZSAweDVDLyogXFwgKi86XG4gICAgY2FzZSAweDVELyogXSAqLzpcbiAgICBjYXNlIDB4NUUvKiBeICovOlxuICAgIGNhc2UgMHg1Ri8qIF8gKi86XG4gICAgY2FzZSAweDYwLyogYCAqLzpcbiAgICBjYXNlIDB4N0IvKiB7ICovOlxuICAgIGNhc2UgMHg3RC8qIH0gKi86XG4gICAgY2FzZSAweDdFLyogfiAqLzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRleHQgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IHBvcyA9IHN0YXRlLnBvc1xuXG4gIHdoaWxlIChwb3MgPCBzdGF0ZS5wb3NNYXggJiYgIWlzVGVybWluYXRvckNoYXIoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSkpIHtcbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHBvcyA9PT0gc3RhdGUucG9zKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhdGUucG9zLCBwb3MpIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyBBbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgZm9yIG1lbW9yeS5cbi8vXG4vLyBJdCBjb3N0cyAxMCUgb2YgcGVyZm9ybWFuY2UsIGJ1dCBhbGxvd3MgZXh0ZW5kIHRlcm1pbmF0b3JzIGxpc3QsIGlmIHBsYWNlIGl0XG4vLyB0byBgUGFyc2VySW5saW5lYCBwcm9wZXJ0eS4gUHJvYmFibHksIHdpbGwgc3dpdGNoIHRvIGl0IHNvbWV0aW1lLCBzdWNoXG4vLyBmbGV4aWJpbGl0eSByZXF1aXJlZC5cblxuLypcbnZhciBURVJNSU5BVE9SX1JFID0gL1tcXG4hIyQlJiorXFwtOjw9PkBbXFxcXFxcXV5fYHt9fl0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRleHQoc3RhdGUsIHNpbGVudCkge1xuICB2YXIgcG9zID0gc3RhdGUucG9zLFxuICAgICAgaWR4ID0gc3RhdGUuc3JjLnNsaWNlKHBvcykuc2VhcmNoKFRFUk1JTkFUT1JfUkUpO1xuXG4gIC8vIGZpcnN0IGNoYXIgaXMgdGVybWluYXRvciAtPiBlbXB0eSB0ZXh0XG4gIGlmIChpZHggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLy8gbm8gdGVybWluYXRvciAtPiB0ZXh0IHRpbGwgZW5kIG9mIHN0cmluZ1xuICBpZiAoaWR4IDwgMCkge1xuICAgIGlmICghc2lsZW50KSB7IHN0YXRlLnBlbmRpbmcgKz0gc3RhdGUuc3JjLnNsaWNlKHBvcyk7IH1cbiAgICBzdGF0ZS5wb3MgPSBzdGF0ZS5zcmMubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBwb3MgKyBpZHgpOyB9XG5cbiAgc3RhdGUucG9zICs9IGlkeDtcblxuICByZXR1cm4gdHJ1ZTtcbn07ICovXG4iLCIvLyBUb2tlbiBjbGFzc1xuXG4vKipcbiAqIGNsYXNzIFRva2VuXG4gKiovXG5cbi8qKlxuICogbmV3IFRva2VuKHR5cGUsIHRhZywgbmVzdGluZylcbiAqXG4gKiBDcmVhdGUgbmV3IHRva2VuIGFuZCBmaWxsIHBhc3NlZCBwcm9wZXJ0aWVzLlxuICoqL1xuZnVuY3Rpb24gVG9rZW4gKHR5cGUsIHRhZywgbmVzdGluZykge1xuICAvKipcbiAgICogVG9rZW4jdHlwZSAtPiBTdHJpbmdcbiAgICpcbiAgICogVHlwZSBvZiB0aGUgdG9rZW4gKHN0cmluZywgZS5nLiBcInBhcmFncmFwaF9vcGVuXCIpXG4gICAqKi9cbiAgdGhpcy50eXBlICAgICA9IHR5cGVcblxuICAvKipcbiAgICogVG9rZW4jdGFnIC0+IFN0cmluZ1xuICAgKlxuICAgKiBodG1sIHRhZyBuYW1lLCBlLmcuIFwicFwiXG4gICAqKi9cbiAgdGhpcy50YWcgICAgICA9IHRhZ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNhdHRycyAtPiBBcnJheVxuICAgKlxuICAgKiBIdG1sIGF0dHJpYnV0ZXMuIEZvcm1hdDogYFsgWyBuYW1lMSwgdmFsdWUxIF0sIFsgbmFtZTIsIHZhbHVlMiBdIF1gXG4gICAqKi9cbiAgdGhpcy5hdHRycyAgICA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jbWFwIC0+IEFycmF5XG4gICAqXG4gICAqIFNvdXJjZSBtYXAgaW5mby4gRm9ybWF0OiBgWyBsaW5lX2JlZ2luLCBsaW5lX2VuZCBdYFxuICAgKiovXG4gIHRoaXMubWFwICAgICAgPSBudWxsXG5cbiAgLyoqXG4gICAqIFRva2VuI25lc3RpbmcgLT4gTnVtYmVyXG4gICAqXG4gICAqIExldmVsIGNoYW5nZSAobnVtYmVyIGluIHstMSwgMCwgMX0gc2V0KSwgd2hlcmU6XG4gICAqXG4gICAqIC0gIGAxYCBtZWFucyB0aGUgdGFnIGlzIG9wZW5pbmdcbiAgICogLSAgYDBgIG1lYW5zIHRoZSB0YWcgaXMgc2VsZi1jbG9zaW5nXG4gICAqIC0gYC0xYCBtZWFucyB0aGUgdGFnIGlzIGNsb3NpbmdcbiAgICoqL1xuICB0aGlzLm5lc3RpbmcgID0gbmVzdGluZ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNsZXZlbCAtPiBOdW1iZXJcbiAgICpcbiAgICogbmVzdGluZyBsZXZlbCwgdGhlIHNhbWUgYXMgYHN0YXRlLmxldmVsYFxuICAgKiovXG4gIHRoaXMubGV2ZWwgICAgPSAwXG5cbiAgLyoqXG4gICAqIFRva2VuI2NoaWxkcmVuIC0+IEFycmF5XG4gICAqXG4gICAqIEFuIGFycmF5IG9mIGNoaWxkIG5vZGVzIChpbmxpbmUgYW5kIGltZyB0b2tlbnMpXG4gICAqKi9cbiAgdGhpcy5jaGlsZHJlbiA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jY29udGVudCAtPiBTdHJpbmdcbiAgICpcbiAgICogSW4gYSBjYXNlIG9mIHNlbGYtY2xvc2luZyB0YWcgKGNvZGUsIGh0bWwsIGZlbmNlLCBldGMuKSxcbiAgICogaXQgaGFzIGNvbnRlbnRzIG9mIHRoaXMgdGFnLlxuICAgKiovXG4gIHRoaXMuY29udGVudCAgPSAnJ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNtYXJrdXAgLT4gU3RyaW5nXG4gICAqXG4gICAqICcqJyBvciAnXycgZm9yIGVtcGhhc2lzLCBmZW5jZSBzdHJpbmcgZm9yIGZlbmNlLCBldGMuXG4gICAqKi9cbiAgdGhpcy5tYXJrdXAgICA9ICcnXG5cbiAgLyoqXG4gICAqIFRva2VuI2luZm8gLT4gU3RyaW5nXG4gICAqXG4gICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb246XG4gICAqXG4gICAqIC0gSW5mbyBzdHJpbmcgZm9yIFwiZmVuY2VcIiB0b2tlbnNcbiAgICogLSBUaGUgdmFsdWUgXCJhdXRvXCIgZm9yIGF1dG9saW5rIFwibGlua19vcGVuXCIgYW5kIFwibGlua19jbG9zZVwiIHRva2Vuc1xuICAgKiAtIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGl0ZW0gbWFya2VyIGZvciBvcmRlcmVkLWxpc3QgXCJsaXN0X2l0ZW1fb3BlblwiIHRva2Vuc1xuICAgKiovXG4gIHRoaXMuaW5mbyAgICAgPSAnJ1xuXG4gIC8qKlxuICAgKiBUb2tlbiNtZXRhIC0+IE9iamVjdFxuICAgKlxuICAgKiBBIHBsYWNlIGZvciBwbHVnaW5zIHRvIHN0b3JlIGFuIGFyYml0cmFyeSBkYXRhXG4gICAqKi9cbiAgdGhpcy5tZXRhICAgICA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jYmxvY2sgLT4gQm9vbGVhblxuICAgKlxuICAgKiBUcnVlIGZvciBibG9jay1sZXZlbCB0b2tlbnMsIGZhbHNlIGZvciBpbmxpbmUgdG9rZW5zLlxuICAgKiBVc2VkIGluIHJlbmRlcmVyIHRvIGNhbGN1bGF0ZSBsaW5lIGJyZWFrc1xuICAgKiovXG4gIHRoaXMuYmxvY2sgICAgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBUb2tlbiNoaWRkZW4gLT4gQm9vbGVhblxuICAgKlxuICAgKiBJZiBpdCdzIHRydWUsIGlnbm9yZSB0aGlzIGVsZW1lbnQgd2hlbiByZW5kZXJpbmcuIFVzZWQgZm9yIHRpZ2h0IGxpc3RzXG4gICAqIHRvIGhpZGUgcGFyYWdyYXBocy5cbiAgICoqL1xuICB0aGlzLmhpZGRlbiAgID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRySW5kZXgobmFtZSkgLT4gTnVtYmVyXG4gKlxuICogU2VhcmNoIGF0dHJpYnV0ZSBpbmRleCBieSBuYW1lLlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJJbmRleCA9IGZ1bmN0aW9uIGF0dHJJbmRleCAobmFtZSkge1xuICBpZiAoIXRoaXMuYXR0cnMpIHsgcmV0dXJuIC0xIH1cblxuICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cnNcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXR0cnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoYXR0cnNbaV1bMF0gPT09IG5hbWUpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJQdXNoKGF0dHJEYXRhKVxuICpcbiAqIEFkZCBgWyBuYW1lLCB2YWx1ZSBdYCBhdHRyaWJ1dGUgdG8gbGlzdC4gSW5pdCBhdHRycyBpZiBuZWNlc3NhcnlcbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRyUHVzaCA9IGZ1bmN0aW9uIGF0dHJQdXNoIChhdHRyRGF0YSkge1xuICBpZiAodGhpcy5hdHRycykge1xuICAgIHRoaXMuYXR0cnMucHVzaChhdHRyRGF0YSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmF0dHJzID0gW2F0dHJEYXRhXVxuICB9XG59XG5cbi8qKlxuICogVG9rZW4uYXR0clNldChuYW1lLCB2YWx1ZSlcbiAqXG4gKiBTZXQgYG5hbWVgIGF0dHJpYnV0ZSB0byBgdmFsdWVgLiBPdmVycmlkZSBvbGQgdmFsdWUgaWYgZXhpc3RzLlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJTZXQgPSBmdW5jdGlvbiBhdHRyU2V0IChuYW1lLCB2YWx1ZSkge1xuICBjb25zdCBpZHggPSB0aGlzLmF0dHJJbmRleChuYW1lKVxuICBjb25zdCBhdHRyRGF0YSA9IFtuYW1lLCB2YWx1ZV1cblxuICBpZiAoaWR4IDwgMCkge1xuICAgIHRoaXMuYXR0clB1c2goYXR0ckRhdGEpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hdHRyc1tpZHhdID0gYXR0ckRhdGFcbiAgfVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJHZXQobmFtZSlcbiAqXG4gKiBHZXQgdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZSBgbmFtZWAsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0ckdldCA9IGZ1bmN0aW9uIGF0dHJHZXQgKG5hbWUpIHtcbiAgY29uc3QgaWR4ID0gdGhpcy5hdHRySW5kZXgobmFtZSlcbiAgbGV0IHZhbHVlID0gbnVsbFxuICBpZiAoaWR4ID49IDApIHtcbiAgICB2YWx1ZSA9IHRoaXMuYXR0cnNbaWR4XVsxXVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJKb2luKG5hbWUsIHZhbHVlKVxuICpcbiAqIEpvaW4gdmFsdWUgdG8gZXhpc3RpbmcgYXR0cmlidXRlIHZpYSBzcGFjZS4gT3IgY3JlYXRlIG5ldyBhdHRyaWJ1dGUgaWYgbm90XG4gKiBleGlzdHMuIFVzZWZ1bCB0byBvcGVyYXRlIHdpdGggdG9rZW4gY2xhc3Nlcy5cbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRySm9pbiA9IGZ1bmN0aW9uIGF0dHJKb2luIChuYW1lLCB2YWx1ZSkge1xuICBjb25zdCBpZHggPSB0aGlzLmF0dHJJbmRleChuYW1lKVxuXG4gIGlmIChpZHggPCAwKSB7XG4gICAgdGhpcy5hdHRyUHVzaChbbmFtZSwgdmFsdWVdKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuYXR0cnNbaWR4XVsxXSA9IHRoaXMuYXR0cnNbaWR4XVsxXSArICcgJyArIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVG9rZW5cbiIsImltcG9ydCBkZWNvZGUgZnJvbSAnLi9saWIvZGVjb2RlLm1qcydcbmltcG9ydCBlbmNvZGUgZnJvbSAnLi9saWIvZW5jb2RlLm1qcydcbmltcG9ydCBmb3JtYXQgZnJvbSAnLi9saWIvZm9ybWF0Lm1qcydcbmltcG9ydCBwYXJzZSBmcm9tICcuL2xpYi9wYXJzZS5tanMnXG5cbmV4cG9ydCB7XG4gIGRlY29kZSxcbiAgZW5jb2RlLFxuICBmb3JtYXQsXG4gIHBhcnNlXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cbmNvbnN0IGRlY29kZUNhY2hlID0ge31cblxuZnVuY3Rpb24gZ2V0RGVjb2RlQ2FjaGUgKGV4Y2x1ZGUpIHtcbiAgbGV0IGNhY2hlID0gZGVjb2RlQ2FjaGVbZXhjbHVkZV1cbiAgaWYgKGNhY2hlKSB7IHJldHVybiBjYWNoZSB9XG5cbiAgY2FjaGUgPSBkZWNvZGVDYWNoZVtleGNsdWRlXSA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxuICAgIGNhY2hlLnB1c2goY2gpXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaCA9IGV4Y2x1ZGUuY2hhckNvZGVBdChpKVxuICAgIGNhY2hlW2NoXSA9ICclJyArICgnMCcgKyBjaC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSkuc2xpY2UoLTIpXG4gIH1cblxuICByZXR1cm4gY2FjaGVcbn1cblxuLy8gRGVjb2RlIHBlcmNlbnQtZW5jb2RlZCBzdHJpbmcuXG4vL1xuZnVuY3Rpb24gZGVjb2RlIChzdHJpbmcsIGV4Y2x1ZGUpIHtcbiAgaWYgKHR5cGVvZiBleGNsdWRlICE9PSAnc3RyaW5nJykge1xuICAgIGV4Y2x1ZGUgPSBkZWNvZGUuZGVmYXVsdENoYXJzXG4gIH1cblxuICBjb25zdCBjYWNoZSA9IGdldERlY29kZUNhY2hlKGV4Y2x1ZGUpXG5cbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8oJVthLWYwLTldezJ9KSsvZ2ksIGZ1bmN0aW9uIChzZXEpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2VxLmxlbmd0aDsgaSA8IGw7IGkgKz0gMykge1xuICAgICAgY29uc3QgYjEgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDEsIGkgKyAzKSwgMTYpXG5cbiAgICAgIGlmIChiMSA8IDB4ODApIHtcbiAgICAgICAgcmVzdWx0ICs9IGNhY2hlW2IxXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhFMCkgPT09IDB4QzAgJiYgKGkgKyAzIDwgbCkpIHtcbiAgICAgICAgLy8gMTEweHh4eHggMTB4eHh4eHhcbiAgICAgICAgY29uc3QgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpXG5cbiAgICAgICAgaWYgKChiMiAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgY29uc3QgY2hyID0gKChiMSA8PCA2KSAmIDB4N0MwKSB8IChiMiAmIDB4M0YpXG5cbiAgICAgICAgICBpZiAoY2hyIDwgMHg4MCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gM1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKChiMSAmIDB4RjApID09PSAweEUwICYmIChpICsgNiA8IGwpKSB7XG4gICAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICAgIGNvbnN0IGIyID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA0LCBpICsgNiksIDE2KVxuICAgICAgICBjb25zdCBiMyA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNywgaSArIDkpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBjb25zdCBjaHIgPSAoKGIxIDw8IDEyKSAmIDB4RjAwMCkgfCAoKGIyIDw8IDYpICYgMHhGQzApIHwgKGIzICYgMHgzRilcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwMCB8fCAoY2hyID49IDB4RDgwMCAmJiBjaHIgPD0gMHhERkZGKSkge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZFxcdWZmZmQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNocilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpICs9IDZcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgoYjEgJiAweEY4KSA9PT0gMHhGMCAmJiAoaSArIDkgPCBsKSkge1xuICAgICAgICAvLyAxMTExMTB4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgICBjb25zdCBiMiA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNCwgaSArIDYpLCAxNilcbiAgICAgICAgY29uc3QgYjMgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDcsIGkgKyA5KSwgMTYpXG4gICAgICAgIGNvbnN0IGI0ID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyAxMCwgaSArIDEyKSwgMTYpXG5cbiAgICAgICAgaWYgKChiMiAmIDB4QzApID09PSAweDgwICYmIChiMyAmIDB4QzApID09PSAweDgwICYmIChiNCAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgbGV0IGNociA9ICgoYjEgPDwgMTgpICYgMHgxQzAwMDApIHwgKChiMiA8PCAxMikgJiAweDNGMDAwKSB8ICgoYjMgPDwgNikgJiAweEZDMCkgfCAoYjQgJiAweDNGKVxuXG4gICAgICAgICAgaWYgKGNociA8IDB4MTAwMDAgfHwgY2hyID4gMHgxMEZGRkYpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnXFx1ZmZmZFxcdWZmZmRcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hyIC09IDB4MTAwMDBcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCArIChjaHIgPj4gMTApLCAweERDMDAgKyAoY2hyICYgMHgzRkYpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gOVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJ1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfSlcbn1cblxuZGVjb2RlLmRlZmF1bHRDaGFycyA9ICc7Lz86QCY9KyQsIydcbmRlY29kZS5jb21wb25lbnRDaGFycyA9ICcnXG5cbmV4cG9ydCBkZWZhdWx0IGRlY29kZVxuIiwiY29uc3QgZW5jb2RlQ2FjaGUgPSB7fVxuXG4vLyBDcmVhdGUgYSBsb29rdXAgYXJyYXkgd2hlcmUgYW55dGhpbmcgYnV0IGNoYXJhY3RlcnMgaW4gYGNoYXJzYCBzdHJpbmdcbi8vIGFuZCBhbHBoYW51bWVyaWMgY2hhcnMgaXMgcGVyY2VudC1lbmNvZGVkLlxuLy9cbmZ1bmN0aW9uIGdldEVuY29kZUNhY2hlIChleGNsdWRlKSB7XG4gIGxldCBjYWNoZSA9IGVuY29kZUNhY2hlW2V4Y2x1ZGVdXG4gIGlmIChjYWNoZSkgeyByZXR1cm4gY2FjaGUgfVxuXG4gIGNhY2hlID0gZW5jb2RlQ2FjaGVbZXhjbHVkZV0gPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcbiAgICBjb25zdCBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSlcblxuICAgIGlmICgvXlswLTlhLXpdJC9pLnRlc3QoY2gpKSB7XG4gICAgICAvLyBhbHdheXMgYWxsb3cgdW5lbmNvZGVkIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICBjYWNoZS5wdXNoKGNoKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZS5wdXNoKCclJyArICgnMCcgKyBpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMikpXG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNsdWRlLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FjaGVbZXhjbHVkZS5jaGFyQ29kZUF0KGkpXSA9IGV4Y2x1ZGVbaV1cbiAgfVxuXG4gIHJldHVybiBjYWNoZVxufVxuXG4vLyBFbmNvZGUgdW5zYWZlIGNoYXJhY3RlcnMgd2l0aCBwZXJjZW50LWVuY29kaW5nLCBza2lwcGluZyBhbHJlYWR5XG4vLyBlbmNvZGVkIHNlcXVlbmNlcy5cbi8vXG4vLyAgLSBzdHJpbmcgICAgICAgLSBzdHJpbmcgdG8gZW5jb2RlXG4vLyAgLSBleGNsdWRlICAgICAgLSBsaXN0IG9mIGNoYXJhY3RlcnMgdG8gaWdub3JlIChpbiBhZGRpdGlvbiB0byBhLXpBLVowLTkpXG4vLyAgLSBrZWVwRXNjYXBlZCAgLSBkb24ndCBlbmNvZGUgJyUnIGluIGEgY29ycmVjdCBlc2NhcGUgc2VxdWVuY2UgKGRlZmF1bHQ6IHRydWUpXG4vL1xuZnVuY3Rpb24gZW5jb2RlIChzdHJpbmcsIGV4Y2x1ZGUsIGtlZXBFc2NhcGVkKSB7XG4gIGlmICh0eXBlb2YgZXhjbHVkZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBlbmNvZGUoc3RyaW5nLCBrZWVwRXNjYXBlZClcbiAgICBrZWVwRXNjYXBlZCA9IGV4Y2x1ZGVcbiAgICBleGNsdWRlID0gZW5jb2RlLmRlZmF1bHRDaGFyc1xuICB9XG5cbiAgaWYgKHR5cGVvZiBrZWVwRXNjYXBlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBrZWVwRXNjYXBlZCA9IHRydWVcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RW5jb2RlQ2FjaGUoZXhjbHVkZSlcbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBzdHJpbmcubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICBpZiAoa2VlcEVzY2FwZWQgJiYgY29kZSA9PT0gMHgyNSAvKiAlICovICYmIGkgKyAyIDwgbCkge1xuICAgICAgaWYgKC9eWzAtOWEtZl17Mn0kL2kudGVzdChzdHJpbmcuc2xpY2UoaSArIDEsIGkgKyAzKSkpIHtcbiAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5zbGljZShpLCBpICsgMylcbiAgICAgICAgaSArPSAyXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPCAxMjgpIHtcbiAgICAgIHJlc3VsdCArPSBjYWNoZVtjb2RlXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSAweEQ4MDAgJiYgY29kZSA8PSAweERGRkYpIHtcbiAgICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REJGRiAmJiBpICsgMSA8IGwpIHtcbiAgICAgICAgY29uc3QgbmV4dENvZGUgPSBzdHJpbmcuY2hhckNvZGVBdChpICsgMSlcbiAgICAgICAgaWYgKG5leHRDb2RlID49IDB4REMwMCAmJiBuZXh0Q29kZSA8PSAweERGRkYpIHtcbiAgICAgICAgICByZXN1bHQgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ1tpXSArIHN0cmluZ1tpICsgMV0pXG4gICAgICAgICAgaSsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0ICs9ICclRUYlQkYlQkQnXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nW2ldKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5lbmNvZGUuZGVmYXVsdENoYXJzID0gXCI7Lz86QCY9KyQsLV8uIX4qJygpI1wiXG5lbmNvZGUuY29tcG9uZW50Q2hhcnMgPSBcIi1fLiF+KicoKVwiXG5cbmV4cG9ydCBkZWZhdWx0IGVuY29kZVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0ICh1cmwpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgcmVzdWx0ICs9IHVybC5wcm90b2NvbCB8fCAnJ1xuICByZXN1bHQgKz0gdXJsLnNsYXNoZXMgPyAnLy8nIDogJydcbiAgcmVzdWx0ICs9IHVybC5hdXRoID8gdXJsLmF1dGggKyAnQCcgOiAnJ1xuXG4gIGlmICh1cmwuaG9zdG5hbWUgJiYgdXJsLmhvc3RuYW1lLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICAvLyBpcHY2IGFkZHJlc3NcbiAgICByZXN1bHQgKz0gJ1snICsgdXJsLmhvc3RuYW1lICsgJ10nXG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ICs9IHVybC5ob3N0bmFtZSB8fCAnJ1xuICB9XG5cbiAgcmVzdWx0ICs9IHVybC5wb3J0ID8gJzonICsgdXJsLnBvcnQgOiAnJ1xuICByZXN1bHQgKz0gdXJsLnBhdGhuYW1lIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuc2VhcmNoIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuaGFzaCB8fCAnJ1xuXG4gIHJldHVybiByZXN1bHRcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy9cbi8vIENoYW5nZXMgZnJvbSBqb3llbnQvbm9kZTpcbi8vXG4vLyAxLiBObyBsZWFkaW5nIHNsYXNoIGluIHBhdGhzLFxuLy8gICAgZS5nLiBpbiBgdXJsLnBhcnNlKCdodHRwOi8vZm9vP2JhcicpYCBwYXRobmFtZSBpcyBgYCwgbm90IGAvYFxuLy9cbi8vIDIuIEJhY2tzbGFzaGVzIGFyZSBub3QgcmVwbGFjZWQgd2l0aCBzbGFzaGVzLFxuLy8gICAgc28gYGh0dHA6XFxcXGV4YW1wbGUub3JnXFxgIGlzIHRyZWF0ZWQgbGlrZSBhIHJlbGF0aXZlIHBhdGhcbi8vXG4vLyAzLiBUcmFpbGluZyBjb2xvbiBpcyB0cmVhdGVkIGxpa2UgYSBwYXJ0IG9mIHRoZSBwYXRoLFxuLy8gICAgaS5lLiBpbiBgaHR0cDovL2V4YW1wbGUub3JnOmZvb2AgcGF0aG5hbWUgaXMgYDpmb29gXG4vL1xuLy8gNC4gTm90aGluZyBpcyBVUkwtZW5jb2RlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdCxcbi8vICAgIChpbiBqb3llbnQvbm9kZSBzb21lIGNoYXJzIGluIGF1dGggYW5kIHBhdGhzIGFyZSBlbmNvZGVkKVxuLy9cbi8vIDUuIGB1cmwucGFyc2UoKWAgZG9lcyBub3QgaGF2ZSBgcGFyc2VRdWVyeVN0cmluZ2AgYXJndW1lbnRcbi8vXG4vLyA2LiBSZW1vdmVkIGV4dHJhbmVvdXMgcmVzdWx0IHByb3BlcnRpZXM6IGBob3N0YCwgYHBhdGhgLCBgcXVlcnlgLCBldGMuLFxuLy8gICAgd2hpY2ggY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIG90aGVyIHBhcnRzIG9mIHRoZSB1cmwuXG4vL1xuXG5mdW5jdGlvbiBVcmwgKCkge1xuICB0aGlzLnByb3RvY29sID0gbnVsbFxuICB0aGlzLnNsYXNoZXMgPSBudWxsXG4gIHRoaXMuYXV0aCA9IG51bGxcbiAgdGhpcy5wb3J0ID0gbnVsbFxuICB0aGlzLmhvc3RuYW1lID0gbnVsbFxuICB0aGlzLmhhc2ggPSBudWxsXG4gIHRoaXMuc2VhcmNoID0gbnVsbFxuICB0aGlzLnBhdGhuYW1lID0gbnVsbFxufVxuXG4vLyBSZWZlcmVuY2U6IFJGQyAzOTg2LCBSRkMgMTgwOCwgUkZDIDIzOTZcblxuLy8gZGVmaW5lIHRoZXNlIGhlcmUgc28gYXQgbGVhc3QgdGhleSBvbmx5IGhhdmUgdG8gYmVcbi8vIGNvbXBpbGVkIG9uY2Ugb24gdGhlIGZpcnN0IG1vZHVsZSBsb2FkLlxuY29uc3QgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaVxuY29uc3QgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvXG5cbi8vIFNwZWNpYWwgY2FzZSBmb3IgYSBzaW1wbGUgcGF0aCBVUkxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuY29uc3Qgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvXG5cbi8vIFJGQyAyMzk2OiBjaGFyYWN0ZXJzIHJlc2VydmVkIGZvciBkZWxpbWl0aW5nIFVSTHMuXG4vLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuY29uc3QgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J11cblxuLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbmNvbnN0IHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKVxuXG4vLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG5jb25zdCBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKVxuLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbi8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2Vcbi8vIGFyZSB0aGUgb25lcyB0aGF0IGFyZSAqZXhwZWN0ZWQqIHRvIGJlIHNlZW4sIHNvIHdlIGZhc3QtcGF0aFxuLy8gdGhlbS5cbmNvbnN0IG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpXG5jb25zdCBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ11cbmNvbnN0IGhvc3RuYW1lTWF4TGVuID0gMjU1XG5jb25zdCBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvXG5jb25zdCBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkL1xuLy8gcHJvdG9jb2xzIHRoYXQgY2FuIGFsbG93IFwidW5zYWZlXCIgYW5kIFwidW53aXNlXCIgY2hhcnMuXG4vLyBwcm90b2NvbHMgdGhhdCBuZXZlciBoYXZlIGEgaG9zdG5hbWUuXG5jb25zdCBob3N0bGVzc1Byb3RvY29sID0ge1xuICBqYXZhc2NyaXB0OiB0cnVlLFxuICAnamF2YXNjcmlwdDonOiB0cnVlXG59XG4vLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbmNvbnN0IHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgaHR0cDogdHJ1ZSxcbiAgaHR0cHM6IHRydWUsXG4gIGZ0cDogdHJ1ZSxcbiAgZ29waGVyOiB0cnVlLFxuICBmaWxlOiB0cnVlLFxuICAnaHR0cDonOiB0cnVlLFxuICAnaHR0cHM6JzogdHJ1ZSxcbiAgJ2Z0cDonOiB0cnVlLFxuICAnZ29waGVyOic6IHRydWUsXG4gICdmaWxlOic6IHRydWVcbn1cblxuZnVuY3Rpb24gdXJsUGFyc2UgKHVybCwgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmxcblxuICBjb25zdCB1ID0gbmV3IFVybCgpXG4gIHUucGFyc2UodXJsLCBzbGFzaGVzRGVub3RlSG9zdClcbiAgcmV0dXJuIHVcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh1cmwsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGxldCBsb3dlclByb3RvLCBoZWMsIHNsYXNoZXNcbiAgbGV0IHJlc3QgPSB1cmxcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKVxuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICBjb25zdCBzaW1wbGVQYXRoID0gc2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KVxuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGhuYW1lID0gc2ltcGxlUGF0aFsxXVxuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm90byA9IHByb3RvY29sUGF0dGVybi5leGVjKHJlc3QpXG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF1cbiAgICBsb3dlclByb3RvID0gcHJvdG8udG9Mb3dlckNhc2UoKVxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b1xuICAgIHJlc3QgPSByZXN0LnN1YnN0cihwcm90by5sZW5ndGgpXG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuICBpZiAoc2xhc2hlc0Rlbm90ZUhvc3QgfHwgcHJvdG8gfHwgcmVzdC5tYXRjaCgvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLykpIHtcbiAgICBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLydcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc3Vic3RyKDIpXG4gICAgICB0aGlzLnNsYXNoZXMgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcbiAgICAvLyB0aGVyZSdzIGEgaG9zdG5hbWUuXG4gICAgLy8gdGhlIGZpcnN0IGluc3RhbmNlIG9mIC8sID8sIDssIG9yICMgZW5kcyB0aGUgaG9zdC5cbiAgICAvL1xuICAgIC8vIElmIHRoZXJlIGlzIGFuIEAgaW4gdGhlIGhvc3RuYW1lLCB0aGVuIG5vbi1ob3N0IGNoYXJzICphcmUqIGFsbG93ZWRcbiAgICAvLyB0byB0aGUgbGVmdCBvZiB0aGUgbGFzdCBAIHNpZ24sIHVubGVzcyBzb21lIGhvc3QtZW5kaW5nIGNoYXJhY3RlclxuICAgIC8vIGNvbWVzICpiZWZvcmUqIHRoZSBALXNpZ24uXG4gICAgLy8gVVJMcyBhcmUgb2Jub3hpb3VzLlxuICAgIC8vXG4gICAgLy8gZXg6XG4gICAgLy8gaHR0cDovL2FAYkBjLyA9PiB1c2VyOmFAYiBob3N0OmNcbiAgICAvLyBodHRwOi8vYUBiP0BjID0+IHVzZXI6YSBob3N0OmMgcGF0aDovP0BjXG5cbiAgICAvLyB2MC4xMiBUT0RPKGlzYWFjcyk6IFRoaXMgaXMgbm90IHF1aXRlIGhvdyBDaHJvbWUgZG9lcyB0aGluZ3MuXG4gICAgLy8gUmV2aWV3IG91ciB0ZXN0IGNhc2UgYWdhaW5zdCBicm93c2VycyBtb3JlIGNvbXByZWhlbnNpdmVseS5cblxuICAgIC8vIGZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0RW5kaW5nQ2hhcnNcbiAgICBsZXQgaG9zdEVuZCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYyA9IHJlc3QuaW5kZXhPZihob3N0RW5kaW5nQ2hhcnNbaV0pXG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHtcbiAgICAgICAgaG9zdEVuZCA9IGhlY1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgIGxldCBhdXRoLCBhdFNpZ25cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIGF0U2lnbiBjYW4gYmUgYW55d2hlcmUuXG4gICAgICBhdFNpZ24gPSByZXN0Lmxhc3RJbmRleE9mKCdAJylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKVxuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgIC8vIFB1bGwgdGhhdCBvZmYuXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbilcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKGF0U2lnbiArIDEpXG4gICAgICB0aGlzLmF1dGggPSBhdXRoXG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoZWMgPSByZXN0LmluZGV4T2Yobm9uSG9zdENoYXJzW2ldKVxuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKSB7XG4gICAgICAgIGhvc3RFbmQgPSBoZWNcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgd2Ugc3RpbGwgaGF2ZSBub3QgaGl0IGl0LCB0aGVuIHRoZSBlbnRpcmUgdGhpbmcgaXMgYSBob3N0LlxuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoXG4gICAgfVxuXG4gICAgaWYgKHJlc3RbaG9zdEVuZCAtIDFdID09PSAnOicpIHsgaG9zdEVuZC0tIH1cbiAgICBjb25zdCBob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpXG5cbiAgICAvLyBwdWxsIG91dCBwb3J0LlxuICAgIHRoaXMucGFyc2VIb3N0KGhvc3QpXG5cbiAgICAvLyB3ZSd2ZSBpbmRpY2F0ZWQgdGhhdCB0aGVyZSBpcyBhIGhvc3RuYW1lLFxuICAgIC8vIHNvIGV2ZW4gaWYgaXQncyBlbXB0eSwgaXQgaGFzIHRvIGJlIHByZXNlbnQuXG4gICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUgfHwgJydcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgY29uc3QgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmXG4gICAgICAgIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nXG5cbiAgICAvLyB2YWxpZGF0ZSBhIGxpdHRsZS5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgY29uc3QgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLylcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBwYXJ0ID0gaG9zdHBhcnRzW2ldXG4gICAgICAgIGlmICghcGFydCkgeyBjb250aW51ZSB9XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIGxldCBuZXdwYXJ0ID0gJydcbiAgICAgICAgICBmb3IgKGxldCBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8vIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgIC8vIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgbmV3cGFydCArPSAneCdcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gcGFydFtqXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFBhcnRzID0gaG9zdHBhcnRzLnNsaWNlKDAsIGkpXG4gICAgICAgICAgICBjb25zdCBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKVxuICAgICAgICAgICAgY29uc3QgYml0ID0gcGFydC5tYXRjaChob3N0bmFtZVBhcnRTdGFydClcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSlcbiAgICAgICAgICAgICAgbm90SG9zdC51bnNoaWZ0KGJpdFsyXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3RIb3N0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXN0ID0gbm90SG9zdC5qb2luKCcuJykgKyByZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaG9zdG5hbWUubGVuZ3RoID4gaG9zdG5hbWVNYXhMZW4pIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSAnJ1xuICAgIH1cblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpXG4gICAgfVxuICB9XG5cbiAgLy8gY2hvcCBvZmYgZnJvbSB0aGUgdGFpbCBmaXJzdC5cbiAgY29uc3QgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpXG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIGhhc2gpXG4gIH1cbiAgY29uc3QgcW0gPSByZXN0LmluZGV4T2YoJz8nKVxuICBpZiAocW0gIT09IC0xKSB7XG4gICAgdGhpcy5zZWFyY2ggPSByZXN0LnN1YnN0cihxbSlcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSlcbiAgfVxuICBpZiAocmVzdCkgeyB0aGlzLnBhdGhuYW1lID0gcmVzdCB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJydcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cblVybC5wcm90b3R5cGUucGFyc2VIb3N0ID0gZnVuY3Rpb24gKGhvc3QpIHtcbiAgbGV0IHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpXG4gIGlmIChwb3J0KSB7XG4gICAgcG9ydCA9IHBvcnRbMF1cbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKVxuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aClcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdCB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVybFBhcnNlXG4iLCIvLyA6Oi0gUGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYW4gb3JkZXJlZCBtYXBwaW5nIGZyb21cbi8vIHN0cmluZ3MgdG8gdmFsdWVzLCB3aXRoIHNvbWUgY29udmVuaWVudCB1cGRhdGUgbWV0aG9kcy5cbmZ1bmN0aW9uIE9yZGVyZWRNYXAoY29udGVudCkge1xuICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xufVxuXG5PcmRlcmVkTWFwLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IE9yZGVyZWRNYXAsXG5cbiAgZmluZDogZnVuY3Rpb24oa2V5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICBpZiAodGhpcy5jb250ZW50W2ldID09PSBrZXkpIHJldHVybiBpXG4gICAgcmV0dXJuIC0xXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZykg4oaSID9hbnlcbiAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIHN0b3JlZCB1bmRlciBga2V5YCwgb3IgcmV0dXJuIHVuZGVmaW5lZCB3aGVuXG4gIC8vIG5vIHN1Y2gga2V5IGV4aXN0cy5cbiAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICByZXR1cm4gZm91bmQgPT0gLTEgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnRbZm91bmQgKyAxXVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSwgP3N0cmluZykg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQ3JlYXRlIGEgbmV3IG1hcCBieSByZXBsYWNpbmcgdGhlIHZhbHVlIG9mIGBrZXlgIHdpdGggYSBuZXdcbiAgLy8gdmFsdWUsIG9yIGFkZGluZyBhIGJpbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgbWFwLiBJZiBgbmV3S2V5YCBpc1xuICAvLyBnaXZlbiwgdGhlIGtleSBvZiB0aGUgYmluZGluZyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhhdCBrZXkuXG4gIHVwZGF0ZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSwgbmV3S2V5KSB7XG4gICAgdmFyIHNlbGYgPSBuZXdLZXkgJiYgbmV3S2V5ICE9IGtleSA/IHRoaXMucmVtb3ZlKG5ld0tleSkgOiB0aGlzO1xuICAgIHZhciBmb3VuZCA9IHNlbGYuZmluZChrZXkpLCBjb250ZW50ID0gc2VsZi5jb250ZW50LnNsaWNlKCk7XG4gICAgaWYgKGZvdW5kID09IC0xKSB7XG4gICAgICBjb250ZW50LnB1c2gobmV3S2V5IHx8IGtleSwgdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50W2ZvdW5kICsgMV0gPSB2YWx1ZTtcbiAgICAgIGlmIChuZXdLZXkpIGNvbnRlbnRbZm91bmRdID0gbmV3S2V5O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nKSDihpIgT3JkZXJlZE1hcFxuICAvLyBSZXR1cm4gYSBtYXAgd2l0aCB0aGUgZ2l2ZW4ga2V5IHJlbW92ZWQsIGlmIGl0IGV4aXN0ZWQuXG4gIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKGtleSk7XG4gICAgaWYgKGZvdW5kID09IC0xKSByZXR1cm4gdGhpc1xuICAgIHZhciBjb250ZW50ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgY29udGVudC5zcGxpY2UoZm91bmQsIDIpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIGFueSkg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQWRkIGEgbmV3IGtleSB0byB0aGUgc3RhcnQgb2YgdGhlIG1hcC5cbiAgYWRkVG9TdGFydDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChba2V5LCB2YWx1ZV0uY29uY2F0KHRoaXMucmVtb3ZlKGtleSkuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55KSDihpIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBuZXcga2V5IHRvIHRoZSBlbmQgb2YgdGhlIG1hcC5cbiAgYWRkVG9FbmQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICB2YXIgY29udGVudCA9IHRoaXMucmVtb3ZlKGtleSkuY29udGVudC5zbGljZSgpO1xuICAgIGNvbnRlbnQucHVzaChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBzdHJpbmcsIGFueSkg4oaSIE9yZGVyZWRNYXBcbiAgLy8gQWRkIGEga2V5IGFmdGVyIHRoZSBnaXZlbiBrZXkuIElmIGBwbGFjZWAgaXMgbm90IGZvdW5kLCB0aGUgbmV3XG4gIC8vIGtleSBpcyBhZGRlZCB0byB0aGUgZW5kLlxuICBhZGRCZWZvcmU6IGZ1bmN0aW9uKHBsYWNlLCBrZXksIHZhbHVlKSB7XG4gICAgdmFyIHdpdGhvdXQgPSB0aGlzLnJlbW92ZShrZXkpLCBjb250ZW50ID0gd2l0aG91dC5jb250ZW50LnNsaWNlKCk7XG4gICAgdmFyIGZvdW5kID0gd2l0aG91dC5maW5kKHBsYWNlKTtcbiAgICBjb250ZW50LnNwbGljZShmb3VuZCA9PSAtMSA/IGNvbnRlbnQubGVuZ3RoIDogZm91bmQsIDAsIGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpKVxuICAvLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBrZXkvdmFsdWUgcGFpciBpbiB0aGUgbWFwLCBpblxuICAvLyBvcmRlci5cbiAgZm9yRWFjaDogZnVuY3Rpb24oZikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSArPSAyKVxuICAgICAgZih0aGlzLmNvbnRlbnRbaV0sIHRoaXMuY29udGVudFtpICsgMV0pO1xuICB9LFxuXG4gIC8vIDo6ICh1bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSDihpIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IHByZXBlbmRpbmcgdGhlIGtleXMgaW4gdGhpcyBtYXAgdGhhdCBkb24ndFxuICAvLyBhcHBlYXIgaW4gYG1hcGAgYmVmb3JlIHRoZSBrZXlzIGluIGBtYXBgLlxuICBwcmVwZW5kOiBmdW5jdGlvbihtYXApIHtcbiAgICBtYXAgPSBPcmRlcmVkTWFwLmZyb20obWFwKTtcbiAgICBpZiAoIW1hcC5zaXplKSByZXR1cm4gdGhpc1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChtYXAuY29udGVudC5jb25jYXQodGhpcy5zdWJ0cmFjdChtYXApLmNvbnRlbnQpKVxuICB9LFxuXG4gIC8vIDo6ICh1bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSDihpIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IGFwcGVuZGluZyB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYCBhZnRlciB0aGUga2V5cyBpbiBgbWFwYC5cbiAgYXBwZW5kOiBmdW5jdGlvbihtYXApIHtcbiAgICBtYXAgPSBPcmRlcmVkTWFwLmZyb20obWFwKTtcbiAgICBpZiAoIW1hcC5zaXplKSByZXR1cm4gdGhpc1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcCh0aGlzLnN1YnRyYWN0KG1hcCkuY29udGVudC5jb25jYXQobWFwLmNvbnRlbnQpKVxuICB9LFxuXG4gIC8vIDo6ICh1bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSDihpIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBtYXAgY29udGFpbmluZyBhbGwgdGhlIGtleXMgaW4gdGhpcyBtYXAgdGhhdCBkb24ndFxuICAvLyBhcHBlYXIgaW4gYG1hcGAuXG4gIHN1YnRyYWN0OiBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICBtYXAgPSBPcmRlcmVkTWFwLmZyb20obWFwKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5jb250ZW50Lmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlbW92ZShtYXAuY29udGVudFtpXSk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LFxuXG4gIC8vIDo6ICgpIOKGkiBPYmplY3RcbiAgLy8gVHVybiBvcmRlcmVkIG1hcCBpbnRvIGEgcGxhaW4gb2JqZWN0LlxuICB0b09iamVjdDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7IHJlc3VsdFtrZXldID0gdmFsdWU7IH0pO1xuICAgIHJldHVybiByZXN1bHRcbiAgfSxcblxuICAvLyA6OiBudW1iZXJcbiAgLy8gVGhlIGFtb3VudCBvZiBrZXlzIGluIHRoaXMgbWFwLlxuICBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA+PiAxXG4gIH1cbn07XG5cbi8vIDo6ICg/dW5pb248T2JqZWN0LCBPcmRlcmVkTWFwPikg4oaSIE9yZGVyZWRNYXBcbi8vIFJldHVybiBhIG1hcCB3aXRoIHRoZSBnaXZlbiBjb250ZW50LiBJZiBudWxsLCBjcmVhdGUgYW4gZW1wdHlcbi8vIG1hcC4gSWYgZ2l2ZW4gYW4gb3JkZXJlZCBtYXAsIHJldHVybiB0aGF0IG1hcCBpdHNlbGYuIElmIGdpdmVuIGFuXG4vLyBvYmplY3QsIGNyZWF0ZSBhIG1hcCBmcm9tIHRoZSBvYmplY3QncyBwcm9wZXJ0aWVzLlxuT3JkZXJlZE1hcC5mcm9tID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT3JkZXJlZE1hcCkgcmV0dXJuIHZhbHVlXG4gIHZhciBjb250ZW50ID0gW107XG4gIGlmICh2YWx1ZSkgZm9yICh2YXIgcHJvcCBpbiB2YWx1ZSkgY29udGVudC5wdXNoKHByb3AsIHZhbHVlW3Byb3BdKTtcbiAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG59O1xuXG5leHBvcnQgZGVmYXVsdCBPcmRlcmVkTWFwO1xuIiwiaW1wb3J0IHsgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAsIFJlcGxhY2VTdGVwLCBjYW5Kb2luLCBqb2luUG9pbnQsIGNhblNwbGl0LCBSZXBsYWNlQXJvdW5kU3RlcCwgZmluZFdyYXBwaW5nIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IFNsaWNlLCBGcmFnbWVudCB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IE5vZGVTZWxlY3Rpb24sIFNlbGVjdGlvbiwgVGV4dFNlbGVjdGlvbiwgQWxsU2VsZWN0aW9uLCBTZWxlY3Rpb25SYW5nZSB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuLyoqXG5EZWxldGUgdGhlIHNlbGVjdGlvbiwgaWYgdGhlcmUgaXMgb25lLlxuKi9cbmNvbnN0IGRlbGV0ZVNlbGVjdGlvbiA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBpZiAoc3RhdGUuc2VsZWN0aW9uLmVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5kZWxldGVTZWxlY3Rpb24oKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpIHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJiYWNrd2FyZFwiLCBzdGF0ZSlcbiAgICAgICAgOiAkY3Vyc29yLnBhcmVudE9mZnNldCA+IDApKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gJGN1cnNvcjtcbn1cbi8qKlxuSWYgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLCB0cnkgdG9cbnJlZHVjZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGF0IGJsb2NrIGFuZCB0aGUgb25lIGJlZm9yZSBpdOKAlGlmXG50aGVyZSdzIGEgYmxvY2sgZGlyZWN0bHkgYmVmb3JlIGl0IHRoYXQgY2FuIGJlIGpvaW5lZCwgam9pbiB0aGVtLlxuSWYgbm90LCB0cnkgdG8gbW92ZSB0aGUgc2VsZWN0ZWQgYmxvY2sgY2xvc2VyIHRvIHRoZSBuZXh0IG9uZSBpblxudGhlIGRvY3VtZW50IHN0cnVjdHVyZSBieSBsaWZ0aW5nIGl0IG91dCBvZiBpdHMgcGFyZW50IG9yIG1vdmluZyBpdFxuaW50byBhIHBhcmVudCBvZiB0aGUgcHJldmlvdXMgYmxvY2suIFdpbGwgdXNlIHRoZSB2aWV3IGZvciBhY2N1cmF0ZVxuKGJpZGktYXdhcmUpIHN0YXJ0LW9mLXRleHRibG9jayBkZXRlY3Rpb24gaWYgZ2l2ZW4uXG4qL1xuY29uc3Qgam9pbkJhY2t3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCAkY3Vyc29yID0gYXRCbG9ja1N0YXJ0KHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGN1cnNvcik7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUgdGhpcywgdHJ5IHRvIGxpZnRcbiAgICBpZiAoISRjdXQpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gJGN1cnNvci5ibG9ja1JhbmdlKCksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlO1xuICAgIC8vIEFwcGx5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIGlmIChkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCwgLTEpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBJZiB0aGUgbm9kZSBiZWxvdyBoYXMgbm8gY29udGVudCBhbmQgdGhlIG5vZGUgYWJvdmUgaXNcbiAgICAvLyBzZWxlY3RhYmxlLCBkZWxldGUgdGhlIG5vZGUgYmVsb3cgYW5kIHNlbGVjdCB0aGUgb25lIGFib3ZlLlxuICAgIGlmICgkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUgPT0gMCAmJlxuICAgICAgICAodGV4dGJsb2NrQXQoYmVmb3JlLCBcImVuZFwiKSB8fCBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShiZWZvcmUpKSkge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9ICRjdXJzb3IuZGVwdGg7OyBkZXB0aC0tKSB7XG4gICAgICAgICAgICBsZXQgZGVsU3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgJGN1cnNvci5iZWZvcmUoZGVwdGgpLCAkY3Vyc29yLmFmdGVyKGRlcHRoKSwgU2xpY2UuZW1wdHkpO1xuICAgICAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKGRlbFN0ZXApO1xuICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYmVmb3JlLCBcImVuZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBTZWxlY3Rpb24uZmluZEZyb20odHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoJGN1dC5wb3MsIC0xKSksIC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsICRjdXQucG9zIC0gYmVmb3JlLm5vZGVTaXplKSk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZXB0aCA9PSAxIHx8ICRjdXJzb3Iubm9kZShkZXB0aCAtIDEpLmNoaWxkQ291bnQgPiAxKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBub2RlIGJlZm9yZSBpcyBhbiBhdG9tLCBkZWxldGUgaXRcbiAgICBpZiAoYmVmb3JlLmlzQXRvbSAmJiAkY3V0LmRlcHRoID09ICRjdXJzb3IuZGVwdGggLSAxKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZSgkY3V0LnBvcyAtIGJlZm9yZS5ub2RlU2l6ZSwgJGN1dC5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuQSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBbYGpvaW5CYWNrd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luQmFja3dhcmQpXG50aGF0IG9ubHkgdHJpZXMgdG8gam9pbiB0aGUgY3VycmVudCB0ZXh0YmxvY2sgdG8gdGhlIG9uZSBiZWZvcmVcbml0LCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jay5cbiovXG5jb25zdCBqb2luVGV4dGJsb2NrQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEJlZm9yZSgkY3Vyc29yKTtcbiAgICByZXR1cm4gJGN1dCA/IGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkgOiBmYWxzZTtcbn07XG4vKipcbkEgbW9yZSBsaW1pdGVkIGZvcm0gb2YgW2Bqb2luRm9yd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luRm9yd2FyZClcbnRoYXQgb25seSB0cmllcyB0byBqb2luIHRoZSBjdXJyZW50IHRleHRibG9jayB0byB0aGUgb25lIGFmdGVyXG5pdCwgaWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kIG9mIGEgdGV4dGJsb2NrLlxuKi9cbmNvbnN0IGpvaW5UZXh0YmxvY2tGb3J3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCAkY3Vyc29yID0gYXRCbG9ja0VuZChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QWZ0ZXIoJGN1cnNvcik7XG4gICAgcmV0dXJuICRjdXQgPyBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIDogZmFsc2U7XG59O1xuZnVuY3Rpb24gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZSwgYmVmb3JlVGV4dCA9IGJlZm9yZSwgYmVmb3JlUG9zID0gJGN1dC5wb3MgLSAxO1xuICAgIGZvciAoOyAhYmVmb3JlVGV4dC5pc1RleHRibG9jazsgYmVmb3JlUG9zLS0pIHtcbiAgICAgICAgaWYgKGJlZm9yZVRleHQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gYmVmb3JlVGV4dC5sYXN0Q2hpbGQ7XG4gICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGJlZm9yZVRleHQgPSBjaGlsZDtcbiAgICB9XG4gICAgbGV0IGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXIsIGFmdGVyVGV4dCA9IGFmdGVyLCBhZnRlclBvcyA9ICRjdXQucG9zICsgMTtcbiAgICBmb3IgKDsgIWFmdGVyVGV4dC5pc1RleHRibG9jazsgYWZ0ZXJQb3MrKykge1xuICAgICAgICBpZiAoYWZ0ZXJUZXh0LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBjaGlsZCA9IGFmdGVyVGV4dC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoIWNoaWxkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBhZnRlclRleHQgPSBjaGlsZDtcbiAgICB9XG4gICAgbGV0IHN0ZXAgPSByZXBsYWNlU3RlcChzdGF0ZS5kb2MsIGJlZm9yZVBvcywgYWZ0ZXJQb3MsIFNsaWNlLmVtcHR5KTtcbiAgICBpZiAoIXN0ZXAgfHwgc3RlcC5mcm9tICE9IGJlZm9yZVBvcyB8fFxuICAgICAgICBzdGVwIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXAgJiYgc3RlcC5zbGljZS5zaXplID49IGFmdGVyUG9zIC0gYmVmb3JlUG9zKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAoc3RlcCk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIGJlZm9yZVBvcykpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0ZXh0YmxvY2tBdChub2RlLCBzaWRlLCBvbmx5ID0gZmFsc2UpIHtcbiAgICBmb3IgKGxldCBzY2FuID0gbm9kZTsgc2Nhbjsgc2NhbiA9IChzaWRlID09IFwic3RhcnRcIiA/IHNjYW4uZmlyc3RDaGlsZCA6IHNjYW4ubGFzdENoaWxkKSkge1xuICAgICAgICBpZiAoc2Nhbi5pc1RleHRibG9jaylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob25seSAmJiBzY2FuLmNoaWxkQ291bnQgIT0gMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG5XaGVuIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jaywgc2VsZWN0XG50aGUgbm9kZSBiZWZvcmUgdGhhdCB0ZXh0YmxvY2ssIGlmIHBvc3NpYmxlLiBUaGlzIGlzIGludGVuZGVkIHRvIGJlXG5ib3VuZCB0byBrZXlzIGxpa2UgYmFja3NwYWNlLCBhZnRlclxuW2Bqb2luQmFja3dhcmRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuam9pbkJhY2t3YXJkKSBvciBvdGhlciBkZWxldGluZ1xuY29tbWFuZHMsIGFzIGEgZmFsbC1iYWNrIGJlaGF2aW9yIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0IGFsbG93XG5kZWxldGlvbiBhdCB0aGUgc2VsZWN0ZWQgcG9pbnQuXG4qL1xuY29uc3Qgc2VsZWN0Tm9kZUJhY2t3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCB7ICRoZWFkLCBlbXB0eSB9ID0gc3RhdGUuc2VsZWN0aW9uLCAkY3V0ID0gJGhlYWQ7XG4gICAgaWYgKCFlbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICgkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgaWYgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImJhY2t3YXJkXCIsIHN0YXRlKSA6ICRoZWFkLnBhcmVudE9mZnNldCA+IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRoZWFkKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSAkY3V0ICYmICRjdXQubm9kZUJlZm9yZTtcbiAgICBpZiAoIW5vZGUgfHwgIU5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCAkY3V0LnBvcyAtIG5vZGUubm9kZVNpemUpKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBmaW5kQ3V0QmVmb3JlKCRwb3MpIHtcbiAgICBpZiAoISRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICgkcG9zLmluZGV4KGkpID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5kb2MucmVzb2x2ZSgkcG9zLmJlZm9yZShpICsgMSkpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShpKS50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KSB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiZm9yd2FyZFwiLCBzdGF0ZSlcbiAgICAgICAgOiAkY3Vyc29yLnBhcmVudE9mZnNldCA8ICRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAkY3Vyc29yO1xufVxuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgYVxudGV4dGJsb2NrLCB0cnkgdG8gcmVkdWNlIG9yIHJlbW92ZSB0aGUgYm91bmRhcnkgYmV0d2VlbiB0aGF0IGJsb2NrXG5hbmQgdGhlIG9uZSBhZnRlciBpdCwgZWl0aGVyIGJ5IGpvaW5pbmcgdGhlbSBvciBieSBtb3ZpbmcgdGhlIG90aGVyXG5ibG9jayBjbG9zZXIgdG8gdGhpcyBvbmUgaW4gdGhlIHRyZWUgc3RydWN0dXJlLiBXaWxsIHVzZSB0aGUgdmlld1xuZm9yIGFjY3VyYXRlIHN0YXJ0LW9mLXRleHRibG9jayBkZXRlY3Rpb24gaWYgZ2l2ZW4uXG4qL1xuY29uc3Qgam9pbkZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRBZnRlcigkY3Vyc29yKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBub2RlIGFmdGVyIHRoaXMsIHRoZXJlJ3Mgbm90aGluZyB0byBkb1xuICAgIGlmICghJGN1dClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBhZnRlciA9ICRjdXQubm9kZUFmdGVyO1xuICAgIC8vIFRyeSB0aGUgam9pbmluZyBhbGdvcml0aG1cbiAgICBpZiAoZGVsZXRlQmFycmllcihzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gsIDEpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBJZiB0aGUgbm9kZSBhYm92ZSBoYXMgbm8gY29udGVudCBhbmQgdGhlIG5vZGUgYmVsb3cgaXNcbiAgICAvLyBzZWxlY3RhYmxlLCBkZWxldGUgdGhlIG5vZGUgYWJvdmUgYW5kIHNlbGVjdCB0aGUgb25lIGJlbG93LlxuICAgIGlmICgkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUgPT0gMCAmJlxuICAgICAgICAodGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIikgfHwgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUoYWZ0ZXIpKSkge1xuICAgICAgICBsZXQgZGVsU3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgJGN1cnNvci5iZWZvcmUoKSwgJGN1cnNvci5hZnRlcigpLCBTbGljZS5lbXB0eSk7XG4gICAgICAgIGlmIChkZWxTdGVwICYmIGRlbFN0ZXAuc2xpY2Uuc2l6ZSA8IGRlbFN0ZXAudG8gLSBkZWxTdGVwLmZyb20pIHtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAoZGVsU3RlcCk7XG4gICAgICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIpID8gU2VsZWN0aW9uLmZpbmRGcm9tKHRyLmRvYy5yZXNvbHZlKHRyLm1hcHBpbmcubWFwKCRjdXQucG9zKSksIDEpXG4gICAgICAgICAgICAgICAgICAgIDogTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCB0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcykpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBuZXh0IG5vZGUgaXMgYW4gYXRvbSwgZGVsZXRlIGl0XG4gICAgaWYgKGFmdGVyLmlzQXRvbSAmJiAkY3V0LmRlcHRoID09ICRjdXJzb3IuZGVwdGggLSAxKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZSgkY3V0LnBvcywgJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5XaGVuIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2ssIHNlbGVjdFxudGhlIG5vZGUgY29taW5nIGFmdGVyIHRoYXQgdGV4dGJsb2NrLCBpZiBwb3NzaWJsZS4gVGhpcyBpcyBpbnRlbmRlZFxudG8gYmUgYm91bmQgdG8ga2V5cyBsaWtlIGRlbGV0ZSwgYWZ0ZXJcbltgam9pbkZvcndhcmRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuam9pbkZvcndhcmQpIGFuZCBzaW1pbGFyIGRlbGV0aW5nXG5jb21tYW5kcywgdG8gcHJvdmlkZSBhIGZhbGwtYmFjayBiZWhhdmlvciB3aGVuIHRoZSBzY2hlbWEgZG9lc24ndFxuYWxsb3cgZGVsZXRpb24gYXQgdGhlIHNlbGVjdGVkIHBvaW50LlxuKi9cbmNvbnN0IHNlbGVjdE5vZGVGb3J3YXJkID0gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4ge1xuICAgIGxldCB7ICRoZWFkLCBlbXB0eSB9ID0gc3RhdGUuc2VsZWN0aW9uLCAkY3V0ID0gJGhlYWQ7XG4gICAgaWYgKCFlbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICgkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgaWYgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImZvcndhcmRcIiwgc3RhdGUpIDogJGhlYWQucGFyZW50T2Zmc2V0IDwgJGhlYWQucGFyZW50LmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgJGN1dCA9IGZpbmRDdXRBZnRlcigkaGVhZCk7XG4gICAgfVxuICAgIGxldCBub2RlID0gJGN1dCAmJiAkY3V0Lm5vZGVBZnRlcjtcbiAgICBpZiAoIW5vZGUgfHwgIU5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCAkY3V0LnBvcykpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGZpbmRDdXRBZnRlcigkcG9zKSB7XG4gICAgaWYgKCEkcG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICBmb3IgKGxldCBpID0gJHBvcy5kZXB0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJHBvcy5ub2RlKGkpO1xuICAgICAgICAgICAgaWYgKCRwb3MuaW5kZXgoaSkgKyAxIDwgcGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3MuZG9jLnJlc29sdmUoJHBvcy5hZnRlcihpICsgMSkpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbkpvaW4gdGhlIHNlbGVjdGVkIGJsb2NrIG9yLCBpZiB0aGVyZSBpcyBhIHRleHQgc2VsZWN0aW9uLCB0aGVcbmNsb3Nlc3QgYW5jZXN0b3IgYmxvY2sgb2YgdGhlIHNlbGVjdGlvbiB0aGF0IGNhbiBiZSBqb2luZWQsIHdpdGhcbnRoZSBzaWJsaW5nIGFib3ZlIGl0LlxuKi9cbmNvbnN0IGpvaW5VcCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uLCBub2RlU2VsID0gc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiwgcG9pbnQ7XG4gICAgaWYgKG5vZGVTZWwpIHtcbiAgICAgICAgaWYgKHNlbC5ub2RlLmlzVGV4dGJsb2NrIHx8ICFjYW5Kb2luKHN0YXRlLmRvYywgc2VsLmZyb20pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwb2ludCA9IHNlbC5mcm9tO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzZWwuZnJvbSwgLTEpO1xuICAgICAgICBpZiAocG9pbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLmpvaW4ocG9pbnQpO1xuICAgICAgICBpZiAobm9kZVNlbClcbiAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHBvaW50IC0gc3RhdGUuZG9jLnJlc29sdmUocG9pbnQpLm5vZGVCZWZvcmUubm9kZVNpemUpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSm9pbiB0aGUgc2VsZWN0ZWQgYmxvY2ssIG9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIG9mIHRoZSBzZWxlY3Rpb25cbnRoYXQgY2FuIGJlIGpvaW5lZCwgd2l0aCB0aGUgc2libGluZyBhZnRlciBpdC5cbiovXG5jb25zdCBqb2luRG93biA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uLCBwb2ludDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbikge1xuICAgICAgICBpZiAoc2VsLm5vZGUuaXNUZXh0YmxvY2sgfHwgIWNhbkpvaW4oc3RhdGUuZG9jLCBzZWwudG8pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwb2ludCA9IHNlbC50bztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBvaW50ID0gam9pblBvaW50KHN0YXRlLmRvYywgc2VsLnRvLCAxKTtcbiAgICAgICAgaWYgKHBvaW50ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuam9pbihwb2ludCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5MaWZ0IHRoZSBzZWxlY3RlZCBibG9jaywgb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgYmxvY2sgb2YgdGhlXG5zZWxlY3Rpb24gdGhhdCBjYW4gYmUgbGlmdGVkLCBvdXQgb2YgaXRzIHBhcmVudCBub2RlLlxuKi9cbmNvbnN0IGxpZnQgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgdGhlIHNlbGVjdGlvbiBpcyBpbiBhIG5vZGUgd2hvc2UgdHlwZSBoYXMgYSB0cnV0aHlcbltgY29kZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5jb2RlKSBwcm9wZXJ0eSBpbiBpdHMgc3BlYywgcmVwbGFjZSB0aGVcbnNlbGVjdGlvbiB3aXRoIGEgbmV3bGluZSBjaGFyYWN0ZXIuXG4qL1xuY29uc3QgbmV3bGluZUluQ29kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkaGVhZCwgJGFuY2hvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQucGFyZW50LnR5cGUuc3BlYy5jb2RlIHx8ICEkaGVhZC5zYW1lUGFyZW50KCRhbmNob3IpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5pbnNlcnRUZXh0KFwiXFxuXCIpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGRlZmF1bHRCbG9ja0F0KG1hdGNoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5lZGdlQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgeyB0eXBlIH0gPSBtYXRjaC5lZGdlKGkpO1xuICAgICAgICBpZiAodHlwZS5pc1RleHRibG9jayAmJiAhdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpXG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBpbiBhIG5vZGUgd2l0aCBhIHRydXRoeVxuW2Bjb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvZGUpIHByb3BlcnR5IGluIGl0cyBzcGVjLCBjcmVhdGUgYVxuZGVmYXVsdCBibG9jayBhZnRlciB0aGUgY29kZSBibG9jaywgYW5kIG1vdmUgdGhlIGN1cnNvciB0aGVyZS5cbiovXG5jb25zdCBleGl0Q29kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkaGVhZCwgJGFuY2hvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQucGFyZW50LnR5cGUuc3BlYy5jb2RlIHx8ICEkaGVhZC5zYW1lUGFyZW50KCRhbmNob3IpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFib3ZlID0gJGhlYWQubm9kZSgtMSksIGFmdGVyID0gJGhlYWQuaW5kZXhBZnRlcigtMSksIHR5cGUgPSBkZWZhdWx0QmxvY2tBdChhYm92ZS5jb250ZW50TWF0Y2hBdChhZnRlcikpO1xuICAgIGlmICghdHlwZSB8fCAhYWJvdmUuY2FuUmVwbGFjZVdpdGgoYWZ0ZXIsIGFmdGVyLCB0eXBlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgcG9zID0gJGhlYWQuYWZ0ZXIoKSwgdHIgPSBzdGF0ZS50ci5yZXBsYWNlV2l0aChwb3MsIHBvcywgdHlwZS5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUocG9zKSwgMSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiBhIGJsb2NrIG5vZGUgaXMgc2VsZWN0ZWQsIGNyZWF0ZSBhbiBlbXB0eSBwYXJhZ3JhcGggYmVmb3JlIChpZlxuaXQgaXMgaXRzIHBhcmVudCdzIGZpcnN0IGNoaWxkKSBvciBhZnRlciBpdC5cbiovXG5jb25zdCBjcmVhdGVQYXJhZ3JhcGhOZWFyID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIHsgJGZyb20sICR0byB9ID0gc2VsO1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb24gfHwgJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQgfHwgJHRvLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHR5cGUgPSBkZWZhdWx0QmxvY2tBdCgkdG8ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCR0by5pbmRleEFmdGVyKCkpKTtcbiAgICBpZiAoIXR5cGUgfHwgIXR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHNpZGUgPSAoISRmcm9tLnBhcmVudE9mZnNldCAmJiAkdG8uaW5kZXgoKSA8ICR0by5wYXJlbnQuY2hpbGRDb3VudCA/ICRmcm9tIDogJHRvKS5wb3M7XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLmluc2VydChzaWRlLCB0eXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHNpZGUgKyAxKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIHRoZSBjdXJzb3IgaXMgaW4gYW4gZW1wdHkgdGV4dGJsb2NrIHRoYXQgY2FuIGJlIGxpZnRlZCwgbGlmdCB0aGVcbmJsb2NrLlxuKi9cbmNvbnN0IGxpZnRFbXB0eUJsb2NrID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRjdXJzb3IuZGVwdGggPiAxICYmICRjdXJzb3IuYWZ0ZXIoKSAhPSAkY3Vyc29yLmVuZCgtMSkpIHtcbiAgICAgICAgbGV0IGJlZm9yZSA9ICRjdXJzb3IuYmVmb3JlKCk7XG4gICAgICAgIGlmIChjYW5TcGxpdChzdGF0ZS5kb2MsIGJlZm9yZSkpIHtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zcGxpdChiZWZvcmUpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhbmdlID0gJGN1cnNvci5ibG9ja1JhbmdlKCksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkNyZWF0ZSBhIHZhcmlhbnQgb2YgW2BzcGxpdEJsb2NrYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnNwbGl0QmxvY2spIHRoYXQgdXNlc1xuYSBjdXN0b20gZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBuZXdseSBzcGxpdCBvZmYgYmxvY2suXG4qL1xuZnVuY3Rpb24gc3BsaXRCbG9ja0FzKHNwbGl0Tm9kZSkge1xuICAgIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgc3RhdGUuc2VsZWN0aW9uLm5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgaWYgKCEkZnJvbS5wYXJlbnRPZmZzZXQgfHwgIWNhblNwbGl0KHN0YXRlLmRvYywgJGZyb20ucG9zKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc3BsaXQoJGZyb20ucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJGZyb20uZGVwdGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCB0eXBlcyA9IFtdO1xuICAgICAgICBsZXQgc3BsaXREZXB0aCwgZGVmbHQsIGF0RW5kID0gZmFsc2UsIGF0U3RhcnQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgZCA9ICRmcm9tLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9ICRmcm9tLm5vZGUoZCk7XG4gICAgICAgICAgICBpZiAobm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgYXRFbmQgPSAkZnJvbS5lbmQoZCkgPT0gJGZyb20ucG9zICsgKCRmcm9tLmRlcHRoIC0gZCk7XG4gICAgICAgICAgICAgICAgYXRTdGFydCA9ICRmcm9tLnN0YXJ0KGQpID09ICRmcm9tLnBvcyAtICgkZnJvbS5kZXB0aCAtIGQpO1xuICAgICAgICAgICAgICAgIGRlZmx0ID0gZGVmYXVsdEJsb2NrQXQoJGZyb20ubm9kZShkIC0gMSkuY29udGVudE1hdGNoQXQoJGZyb20uaW5kZXhBZnRlcihkIC0gMSkpKTtcbiAgICAgICAgICAgICAgICBsZXQgc3BsaXRUeXBlID0gc3BsaXROb2RlICYmIHNwbGl0Tm9kZSgkdG8ucGFyZW50LCBhdEVuZCwgJGZyb20pO1xuICAgICAgICAgICAgICAgIHR5cGVzLnVuc2hpZnQoc3BsaXRUeXBlIHx8IChhdEVuZCAmJiBkZWZsdCA/IHsgdHlwZTogZGVmbHQgfSA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICBzcGxpdERlcHRoID0gZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkID09IDEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0eXBlcy51bnNoaWZ0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiB8fCBzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb24pXG4gICAgICAgICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNwbGl0UG9zID0gdHIubWFwcGluZy5tYXAoJGZyb20ucG9zKTtcbiAgICAgICAgbGV0IGNhbiA9IGNhblNwbGl0KHRyLmRvYywgc3BsaXRQb3MsIHR5cGVzLmxlbmd0aCwgdHlwZXMpO1xuICAgICAgICBpZiAoIWNhbikge1xuICAgICAgICAgICAgdHlwZXNbMF0gPSBkZWZsdCA/IHsgdHlwZTogZGVmbHQgfSA6IG51bGw7XG4gICAgICAgICAgICBjYW4gPSBjYW5TcGxpdCh0ci5kb2MsIHNwbGl0UG9zLCB0eXBlcy5sZW5ndGgsIHR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdHIuc3BsaXQoc3BsaXRQb3MsIHR5cGVzLmxlbmd0aCwgdHlwZXMpO1xuICAgICAgICBpZiAoIWF0RW5kICYmIGF0U3RhcnQgJiYgJGZyb20ubm9kZShzcGxpdERlcHRoKS50eXBlICE9IGRlZmx0KSB7XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0ci5tYXBwaW5nLm1hcCgkZnJvbS5iZWZvcmUoc3BsaXREZXB0aCkpLCAkZmlyc3QgPSB0ci5kb2MucmVzb2x2ZShmaXJzdCk7XG4gICAgICAgICAgICBpZiAoZGVmbHQgJiYgJGZyb20ubm9kZShzcGxpdERlcHRoIC0gMSkuY2FuUmVwbGFjZVdpdGgoJGZpcnN0LmluZGV4KCksICRmaXJzdC5pbmRleCgpICsgMSwgZGVmbHQpKVxuICAgICAgICAgICAgICAgIHRyLnNldE5vZGVNYXJrdXAodHIubWFwcGluZy5tYXAoJGZyb20uYmVmb3JlKHNwbGl0RGVwdGgpKSwgZGVmbHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5TcGxpdCB0aGUgcGFyZW50IGJsb2NrIG9mIHRoZSBzZWxlY3Rpb24uIElmIHRoZSBzZWxlY3Rpb24gaXMgYSB0ZXh0XG5zZWxlY3Rpb24sIGFsc28gZGVsZXRlIGl0cyBjb250ZW50LlxuKi9cbmNvbnN0IHNwbGl0QmxvY2sgPSBzcGxpdEJsb2NrQXMoKTtcbi8qKlxuQWN0cyBsaWtlIFtgc3BsaXRCbG9ja2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5zcGxpdEJsb2NrKSwgYnV0IHdpdGhvdXRcbnJlc2V0dGluZyB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcyBhdCB0aGUgY3Vyc29yLlxuKi9cbmNvbnN0IHNwbGl0QmxvY2tLZWVwTWFya3MgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgcmV0dXJuIHNwbGl0QmxvY2soc3RhdGUsIGRpc3BhdGNoICYmICh0ciA9PiB7XG4gICAgICAgIGxldCBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzIHx8IChzdGF0ZS5zZWxlY3Rpb24uJHRvLnBhcmVudE9mZnNldCAmJiBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ubWFya3MoKSk7XG4gICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgIHRyLmVuc3VyZU1hcmtzKG1hcmtzKTtcbiAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgIH0pKTtcbn07XG4vKipcbk1vdmUgdGhlIHNlbGVjdGlvbiB0byB0aGUgbm9kZSB3cmFwcGluZyB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGlmXG5hbnkuIChXaWxsIG5vdCBzZWxlY3QgdGhlIGRvY3VtZW50IG5vZGUuKVxuKi9cbmNvbnN0IHNlbGVjdFBhcmVudE5vZGUgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGZyb20sIHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb24sIHBvcztcbiAgICBsZXQgc2FtZSA9ICRmcm9tLnNoYXJlZERlcHRoKHRvKTtcbiAgICBpZiAoc2FtZSA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcG9zID0gJGZyb20uYmVmb3JlKHNhbWUpO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHN0YXRlLmRvYywgcG9zKSkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuU2VsZWN0IHRoZSB3aG9sZSBkb2N1bWVudC5cbiovXG5jb25zdCBzZWxlY3RBbGwgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3IEFsbFNlbGVjdGlvbihzdGF0ZS5kb2MpKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gam9pbk1heWJlQ2xlYXIoc3RhdGUsICRwb3MsIGRpc3BhdGNoKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkcG9zLm5vZGVBZnRlciwgaW5kZXggPSAkcG9zLmluZGV4KCk7XG4gICAgaWYgKCFiZWZvcmUgfHwgIWFmdGVyIHx8ICFiZWZvcmUudHlwZS5jb21wYXRpYmxlQ29udGVudChhZnRlci50eXBlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghYmVmb3JlLmNvbnRlbnQuc2l6ZSAmJiAkcG9zLnBhcmVudC5jYW5SZXBsYWNlKGluZGV4IC0gMSwgaW5kZXgpKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZSgkcG9zLnBvcyAtIGJlZm9yZS5ub2RlU2l6ZSwgJHBvcy5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCEkcG9zLnBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCArIDEpIHx8ICEoYWZ0ZXIuaXNUZXh0YmxvY2sgfHwgY2FuSm9pbihzdGF0ZS5kb2MsICRwb3MucG9zKSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmpvaW4oJHBvcy5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGVsZXRlQmFycmllcihzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gsIGRpcikge1xuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmUsIGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXIsIGNvbm4sIG1hdGNoO1xuICAgIGxldCBpc29sYXRlZCA9IGJlZm9yZS50eXBlLnNwZWMuaXNvbGF0aW5nIHx8IGFmdGVyLnR5cGUuc3BlYy5pc29sYXRpbmc7XG4gICAgaWYgKCFpc29sYXRlZCAmJiBqb2luTWF5YmVDbGVhcihzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgY2FuRGVsQWZ0ZXIgPSAhaXNvbGF0ZWQgJiYgJGN1dC5wYXJlbnQuY2FuUmVwbGFjZSgkY3V0LmluZGV4KCksICRjdXQuaW5kZXgoKSArIDEpO1xuICAgIGlmIChjYW5EZWxBZnRlciAmJlxuICAgICAgICAoY29ubiA9IChtYXRjaCA9IGJlZm9yZS5jb250ZW50TWF0Y2hBdChiZWZvcmUuY2hpbGRDb3VudCkpLmZpbmRXcmFwcGluZyhhZnRlci50eXBlKSkgJiZcbiAgICAgICAgbWF0Y2gubWF0Y2hUeXBlKGNvbm5bMF0gfHwgYWZ0ZXIudHlwZSkudmFsaWRFbmQpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSwgd3JhcCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbm4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oY29ubltpXS5jcmVhdGUobnVsbCwgd3JhcCkpO1xuICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oYmVmb3JlLmNvcHkod3JhcCkpO1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoJGN1dC5wb3MgLSAxLCBlbmQsICRjdXQucG9zLCBlbmQsIG5ldyBTbGljZSh3cmFwLCAxLCAwKSwgY29ubi5sZW5ndGgsIHRydWUpKTtcbiAgICAgICAgICAgIGxldCAkam9pbkF0ID0gdHIuZG9jLnJlc29sdmUoZW5kICsgMiAqIGNvbm4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICgkam9pbkF0Lm5vZGVBZnRlciAmJiAkam9pbkF0Lm5vZGVBZnRlci50eXBlID09IGJlZm9yZS50eXBlICYmXG4gICAgICAgICAgICAgICAgY2FuSm9pbih0ci5kb2MsICRqb2luQXQucG9zKSlcbiAgICAgICAgICAgICAgICB0ci5qb2luKCRqb2luQXQucG9zKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgc2VsQWZ0ZXIgPSBhZnRlci50eXBlLnNwZWMuaXNvbGF0aW5nIHx8IChkaXIgPiAwICYmIGlzb2xhdGVkKSA/IG51bGwgOiBTZWxlY3Rpb24uZmluZEZyb20oJGN1dCwgMSk7XG4gICAgbGV0IHJhbmdlID0gc2VsQWZ0ZXIgJiYgc2VsQWZ0ZXIuJGZyb20uYmxvY2tSYW5nZShzZWxBZnRlci4kdG8pLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0ID49ICRjdXQuZGVwdGgpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjYW5EZWxBZnRlciAmJiB0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiLCB0cnVlKSAmJiB0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpKSB7XG4gICAgICAgIGxldCBhdCA9IGJlZm9yZSwgd3JhcCA9IFtdO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICB3cmFwLnB1c2goYXQpO1xuICAgICAgICAgICAgaWYgKGF0LmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgYXQgPSBhdC5sYXN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFmdGVyVGV4dCA9IGFmdGVyLCBhZnRlckRlcHRoID0gMTtcbiAgICAgICAgZm9yICg7ICFhZnRlclRleHQuaXNUZXh0YmxvY2s7IGFmdGVyVGV4dCA9IGFmdGVyVGV4dC5maXJzdENoaWxkKVxuICAgICAgICAgICAgYWZ0ZXJEZXB0aCsrO1xuICAgICAgICBpZiAoYXQuY2FuUmVwbGFjZShhdC5jaGlsZENvdW50LCBhdC5jaGlsZENvdW50LCBhZnRlclRleHQuY29udGVudCkpIHtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gd3JhcC5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gRnJhZ21lbnQuZnJvbSh3cmFwW2ldLmNvcHkoZW5kKSk7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoJGN1dC5wb3MgLSB3cmFwLmxlbmd0aCwgJGN1dC5wb3MgKyBhZnRlci5ub2RlU2l6ZSwgJGN1dC5wb3MgKyBhZnRlckRlcHRoLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplIC0gYWZ0ZXJEZXB0aCwgbmV3IFNsaWNlKGVuZCwgd3JhcC5sZW5ndGgsIDApLCAwLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzZWxlY3RUZXh0YmxvY2tTaWRlKHNpZGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uLCAkcG9zID0gc2lkZSA8IDAgPyBzZWwuJGZyb20gOiBzZWwuJHRvO1xuICAgICAgICBsZXQgZGVwdGggPSAkcG9zLmRlcHRoO1xuICAgICAgICB3aGlsZSAoJHBvcy5ub2RlKGRlcHRoKS5pc0lubGluZSkge1xuICAgICAgICAgICAgaWYgKCFkZXB0aClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJHBvcy5ub2RlKGRlcHRoKS5pc1RleHRibG9jaylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHN0YXRlLmRvYywgc2lkZSA8IDAgPyAkcG9zLnN0YXJ0KGRlcHRoKSA6ICRwb3MuZW5kKGRlcHRoKSkpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgY3VycmVudCB0ZXh0IGJsb2NrLlxuKi9cbmNvbnN0IHNlbGVjdFRleHRibG9ja1N0YXJ0ID0gc2VsZWN0VGV4dGJsb2NrU2lkZSgtMSk7XG4vKipcbk1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiBjdXJyZW50IHRleHQgYmxvY2suXG4qL1xuY29uc3Qgc2VsZWN0VGV4dGJsb2NrRW5kID0gc2VsZWN0VGV4dGJsb2NrU2lkZSgxKTtcbi8vIFBhcmFtZXRlcml6ZWQgY29tbWFuZHNcbi8qKlxuV3JhcCB0aGUgc2VsZWN0aW9uIGluIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBnaXZlblxuYXR0cmlidXRlcy5cbiovXG5mdW5jdGlvbiB3cmFwSW4obm9kZVR5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pLCB3cmFwcGluZyA9IHJhbmdlICYmIGZpbmRXcmFwcGluZyhyYW5nZSwgbm9kZVR5cGUsIGF0dHJzKTtcbiAgICAgICAgaWYgKCF3cmFwcGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIud3JhcChyYW5nZSwgd3JhcHBpbmcpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5SZXR1cm5zIGEgY29tbWFuZCB0aGF0IHRyaWVzIHRvIHNldCB0aGUgc2VsZWN0ZWQgdGV4dGJsb2NrcyB0byB0aGVcbmdpdmVuIG5vZGUgdHlwZSB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLlxuKi9cbmZ1bmN0aW9uIHNldEJsb2NrVHlwZShub2RlVHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IGFwcGxpY2FibGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aCAmJiAhYXBwbGljYWJsZTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbTogeyBwb3M6IGZyb20gfSwgJHRvOiB7IHBvczogdG8gfSB9ID0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1tpXTtcbiAgICAgICAgICAgIHN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGljYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZS5pc1RleHRibG9jayB8fCBub2RlLmhhc01hcmt1cChub2RlVHlwZSwgYXR0cnMpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSBub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCAkcG9zID0gc3RhdGUuZG9jLnJlc29sdmUocG9zKSwgaW5kZXggPSAkcG9zLmluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSAkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXggKyAxLCBub2RlVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcHBsaWNhYmxlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgJGZyb206IHsgcG9zOiBmcm9tIH0sICR0bzogeyBwb3M6IHRvIH0gfSA9IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXNbaV07XG4gICAgICAgICAgICAgICAgdHIuc2V0QmxvY2tUeXBlKGZyb20sIHRvLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1hcmtBcHBsaWVzKGRvYywgcmFuZ2VzLCB0eXBlLCBlbnRlckF0b21zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICBsZXQgY2FuID0gJGZyb20uZGVwdGggPT0gMCA/IGRvYy5pbmxpbmVDb250ZW50ICYmIGRvYy50eXBlLmFsbG93c01hcmtUeXBlKHR5cGUpIDogZmFsc2U7XG4gICAgICAgIGRvYy5ub2Rlc0JldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FuIHx8ICFlbnRlckF0b21zICYmIG5vZGUuaXNBdG9tICYmIG5vZGUuaXNJbmxpbmUgJiYgcG9zID49ICRmcm9tLnBvcyAmJiBwb3MgKyBub2RlLm5vZGVTaXplIDw9ICR0by5wb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FuID0gbm9kZS5pbmxpbmVDb250ZW50ICYmIG5vZGUudHlwZS5hbGxvd3NNYXJrVHlwZSh0eXBlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjYW4pXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcmVtb3ZlSW5saW5lQXRvbXMocmFuZ2VzKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXTtcbiAgICAgICAgJGZyb20uZG9jLm5vZGVzQmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzQXRvbSAmJiBub2RlLmNvbnRlbnQuc2l6ZSAmJiBub2RlLmlzSW5saW5lICYmIHBvcyA+PSAkZnJvbS5wb3MgJiYgcG9zICsgbm9kZS5ub2RlU2l6ZSA8PSAkdG8ucG9zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvcyArIDEgPiAkZnJvbS5wb3MpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTZWxlY3Rpb25SYW5nZSgkZnJvbSwgJGZyb20uZG9jLnJlc29sdmUocG9zICsgMSkpKTtcbiAgICAgICAgICAgICAgICAkZnJvbSA9ICRmcm9tLmRvYy5yZXNvbHZlKHBvcyArIDEgKyBub2RlLmNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCRmcm9tLnBvcyA8ICR0by5wb3MpXG4gICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU2VsZWN0aW9uUmFuZ2UoJGZyb20sICR0bykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG5DcmVhdGUgYSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgdG9nZ2xlcyB0aGUgZ2l2ZW4gbWFyayB3aXRoIHRoZVxuZ2l2ZW4gYXR0cmlidXRlcy4gV2lsbCByZXR1cm4gYGZhbHNlYCB3aGVuIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuZG9lc24ndCBzdXBwb3J0IHRoYXQgbWFyay4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgbWFyayBpZiBhbnkgbWFya3Ncbm9mIHRoYXQgdHlwZSBleGlzdCBpbiB0aGUgc2VsZWN0aW9uLCBvciBhZGQgaXQgb3RoZXJ3aXNlLiBJZiB0aGVcbnNlbGVjdGlvbiBpcyBlbXB0eSwgdGhpcyBhcHBsaWVzIHRvIHRoZSBbc3RvcmVkXG5tYXJrc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnN0b3JlZE1hcmtzKSBpbnN0ZWFkIG9mIGEgcmFuZ2Ugb2YgdGhlXG5kb2N1bWVudC5cbiovXG5mdW5jdGlvbiB0b2dnbGVNYXJrKG1hcmtUeXBlLCBhdHRycyA9IG51bGwsIG9wdGlvbnMpIHtcbiAgICBsZXQgcmVtb3ZlV2hlblByZXNlbnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLnJlbW92ZVdoZW5QcmVzZW50KSAhPT0gZmFsc2U7XG4gICAgbGV0IGVudGVyQXRvbXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLmVudGVySW5saW5lQXRvbXMpICE9PSBmYWxzZTtcbiAgICBsZXQgZHJvcFNwYWNlID0gIShvcHRpb25zICYmIG9wdGlvbnMuaW5jbHVkZVdoaXRlc3BhY2UpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7IGVtcHR5LCAkY3Vyc29yLCByYW5nZXMgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKChlbXB0eSAmJiAhJGN1cnNvcikgfHwgIW1hcmtBcHBsaWVzKHN0YXRlLmRvYywgcmFuZ2VzLCBtYXJrVHlwZSwgZW50ZXJBdG9tcykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgaWYgKCRjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAobWFya1R5cGUuaXNJblNldChzdGF0ZS5zdG9yZWRNYXJrcyB8fCAkY3Vyc29yLm1hcmtzKCkpKVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZW1vdmVTdG9yZWRNYXJrKG1hcmtUeXBlKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5hZGRTdG9yZWRNYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBhZGQsIHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnRlckF0b21zKVxuICAgICAgICAgICAgICAgICAgICByYW5nZXMgPSByZW1vdmVJbmxpbmVBdG9tcyhyYW5nZXMpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVXaGVuUHJlc2VudCkge1xuICAgICAgICAgICAgICAgICAgICBhZGQgPSAhcmFuZ2VzLnNvbWUociA9PiBzdGF0ZS5kb2MucmFuZ2VIYXNNYXJrKHIuJGZyb20ucG9zLCByLiR0by5wb3MsIG1hcmtUeXBlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGQgPSAhcmFuZ2VzLmV2ZXJ5KHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1pc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oci4kZnJvbS5wb3MsIHIuJHRvLnBvcywgKG5vZGUsIHBvcywgcGFyZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nID0gIW1hcmtUeXBlLmlzSW5TZXQobm9kZS5tYXJrcykgJiYgISFwYXJlbnQgJiYgcGFyZW50LnR5cGUuYWxsb3dzTWFya1R5cGUobWFya1R5cGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEobm9kZS5pc1RleHQgJiYgL15cXHMqJC8udGVzdChub2RlLnRleHRCZXR3ZWVuKE1hdGgubWF4KDAsIHIuJGZyb20ucG9zIC0gcG9zKSwgTWF0aC5taW4obm9kZS5ub2RlU2l6ZSwgci4kdG8ucG9zIC0gcG9zKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtaXNzaW5nO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHIucmVtb3ZlTWFyaygkZnJvbS5wb3MsICR0by5wb3MsIG1hcmtUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tID0gJGZyb20ucG9zLCB0byA9ICR0by5wb3MsIHN0YXJ0ID0gJGZyb20ubm9kZUFmdGVyLCBlbmQgPSAkdG8ubm9kZUJlZm9yZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzcGFjZVN0YXJ0ID0gZHJvcFNwYWNlICYmIHN0YXJ0ICYmIHN0YXJ0LmlzVGV4dCA/IC9eXFxzKi8uZXhlYyhzdGFydC50ZXh0KVswXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlRW5kID0gZHJvcFNwYWNlICYmIGVuZCAmJiBlbmQuaXNUZXh0ID8gL1xccyokLy5leGVjKGVuZC50ZXh0KVswXS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gKyBzcGFjZVN0YXJ0IDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHNwYWNlU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gLT0gc3BhY2VFbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5hZGRNYXJrKGZyb20sIHRvLCBtYXJrVHlwZS5jcmVhdGUoYXR0cnMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gd3JhcERpc3BhdGNoRm9ySm9pbihkaXNwYXRjaCwgaXNKb2luYWJsZSkge1xuICAgIHJldHVybiAodHIpID0+IHtcbiAgICAgICAgaWYgKCF0ci5pc0dlbmVyaWMpXG4gICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2godHIpO1xuICAgICAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHIubWFwcGluZy5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdHIubWFwcGluZy5tYXBzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByYW5nZXMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgcmFuZ2VzW2pdID0gbWFwLm1hcChyYW5nZXNbal0pO1xuICAgICAgICAgICAgbWFwLmZvckVhY2goKF9zLCBfZSwgZnJvbSwgdG8pID0+IHJhbmdlcy5wdXNoKGZyb20sIHRvKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBqb2luYWJsZSBwb2ludHMgZXhpc3QgaW5zaWRlIHRob3NlIHJhbmdlcyxcbiAgICAgICAgLy8gYnkgY2hlY2tpbmcgYWxsIG5vZGUgYm91bmRhcmllcyBpbiB0aGVpciBwYXJlbnQgbm9kZXMuXG4gICAgICAgIGxldCBqb2luYWJsZSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGZyb20gPSByYW5nZXNbaV0sIHRvID0gcmFuZ2VzW2kgKyAxXTtcbiAgICAgICAgICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCBkZXB0aCA9ICRmcm9tLnNoYXJlZERlcHRoKHRvKSwgcGFyZW50ID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9ICRmcm9tLmluZGV4QWZ0ZXIoZGVwdGgpLCBwb3MgPSAkZnJvbS5hZnRlcihkZXB0aCArIDEpOyBwb3MgPD0gdG87ICsraW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWZ0ZXIgPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKCFhZnRlcilcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICYmIGpvaW5hYmxlLmluZGV4T2YocG9zKSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gcGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUudHlwZSA9PSBhZnRlci50eXBlICYmIGlzSm9pbmFibGUoYmVmb3JlLCBhZnRlcikpXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luYWJsZS5wdXNoKHBvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyArPSBhZnRlci5ub2RlU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKb2luIHRoZSBqb2luYWJsZSBwb2ludHNcbiAgICAgICAgam9pbmFibGUuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBmb3IgKGxldCBpID0gam9pbmFibGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChjYW5Kb2luKHRyLmRvYywgam9pbmFibGVbaV0pKVxuICAgICAgICAgICAgICAgIHRyLmpvaW4oam9pbmFibGVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICB9O1xufVxuLyoqXG5XcmFwIGEgY29tbWFuZCBzbyB0aGF0LCB3aGVuIGl0IHByb2R1Y2VzIGEgdHJhbnNmb3JtIHRoYXQgY2F1c2VzXG50d28gam9pbmFibGUgbm9kZXMgdG8gZW5kIHVwIG5leHQgdG8gZWFjaCBvdGhlciwgdGhvc2UgYXJlIGpvaW5lZC5cbk5vZGVzIGFyZSBjb25zaWRlcmVkIGpvaW5hYmxlIHdoZW4gdGhleSBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmRcbndoZW4gdGhlIGBpc0pvaW5hYmxlYCBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciB0aGVtIG9yLCBpZiBhblxuYXJyYXkgb2Ygc3RyaW5ncyB3YXMgcGFzc2VkLCBpZiB0aGVpciBub2RlIHR5cGUgbmFtZSBpcyBpbiB0aGF0XG5hcnJheS5cbiovXG5mdW5jdGlvbiBhdXRvSm9pbihjb21tYW5kLCBpc0pvaW5hYmxlKSB7XG4gICAgbGV0IGNhbkpvaW4gPSBBcnJheS5pc0FycmF5KGlzSm9pbmFibGUpID8gKG5vZGUpID0+IGlzSm9pbmFibGUuaW5kZXhPZihub2RlLnR5cGUubmFtZSkgPiAtMVxuICAgICAgICA6IGlzSm9pbmFibGU7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IGNvbW1hbmQoc3RhdGUsIGRpc3BhdGNoICYmIHdyYXBEaXNwYXRjaEZvckpvaW4oZGlzcGF0Y2gsIGNhbkpvaW4pLCB2aWV3KTtcbn1cbi8qKlxuQ29tYmluZSBhIG51bWJlciBvZiBjb21tYW5kIGZ1bmN0aW9ucyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uICh3aGljaFxuY2FsbHMgdGhlbSBvbmUgYnkgb25lIHVudGlsIG9uZSByZXR1cm5zIHRydWUpLlxuKi9cbmZ1bmN0aW9uIGNoYWluQ29tbWFuZHMoLi4uY29tbWFuZHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGNvbW1hbmRzW2ldKHN0YXRlLCBkaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxubGV0IGJhY2tzcGFjZSA9IGNoYWluQ29tbWFuZHMoZGVsZXRlU2VsZWN0aW9uLCBqb2luQmFja3dhcmQsIHNlbGVjdE5vZGVCYWNrd2FyZCk7XG5sZXQgZGVsID0gY2hhaW5Db21tYW5kcyhkZWxldGVTZWxlY3Rpb24sIGpvaW5Gb3J3YXJkLCBzZWxlY3ROb2RlRm9yd2FyZCk7XG4vKipcbkEgYmFzaWMga2V5bWFwIGNvbnRhaW5pbmcgYmluZGluZ3Mgbm90IHNwZWNpZmljIHRvIGFueSBzY2hlbWEuXG5CaW5kcyB0aGUgZm9sbG93aW5nIGtleXMgKHdoZW4gbXVsdGlwbGUgY29tbWFuZHMgYXJlIGxpc3RlZCwgdGhleVxuYXJlIGNoYWluZWQgd2l0aCBbYGNoYWluQ29tbWFuZHNgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuY2hhaW5Db21tYW5kcykpOlxuXG4qICoqRW50ZXIqKiB0byBgbmV3bGluZUluQ29kZWAsIGBjcmVhdGVQYXJhZ3JhcGhOZWFyYCwgYGxpZnRFbXB0eUJsb2NrYCwgYHNwbGl0QmxvY2tgXG4qICoqTW9kLUVudGVyKiogdG8gYGV4aXRDb2RlYFxuKiAqKkJhY2tzcGFjZSoqIGFuZCAqKk1vZC1CYWNrc3BhY2UqKiB0byBgZGVsZXRlU2VsZWN0aW9uYCwgYGpvaW5CYWNrd2FyZGAsIGBzZWxlY3ROb2RlQmFja3dhcmRgXG4qICoqRGVsZXRlKiogYW5kICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLURlbGV0ZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkZvcndhcmRgLCBgc2VsZWN0Tm9kZUZvcndhcmRgXG4qICoqTW9kLWEqKiB0byBgc2VsZWN0QWxsYFxuKi9cbmNvbnN0IHBjQmFzZUtleW1hcCA9IHtcbiAgICBcIkVudGVyXCI6IGNoYWluQ29tbWFuZHMobmV3bGluZUluQ29kZSwgY3JlYXRlUGFyYWdyYXBoTmVhciwgbGlmdEVtcHR5QmxvY2ssIHNwbGl0QmxvY2spLFxuICAgIFwiTW9kLUVudGVyXCI6IGV4aXRDb2RlLFxuICAgIFwiQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIk1vZC1CYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiU2hpZnQtQmFja3NwYWNlXCI6IGJhY2tzcGFjZSxcbiAgICBcIkRlbGV0ZVwiOiBkZWwsXG4gICAgXCJNb2QtRGVsZXRlXCI6IGRlbCxcbiAgICBcIk1vZC1hXCI6IHNlbGVjdEFsbFxufTtcbi8qKlxuQSBjb3B5IG9mIGBwY0Jhc2VLZXltYXBgIHRoYXQgYWxzbyBiaW5kcyAqKkN0cmwtaCoqIGxpa2UgQmFja3NwYWNlLFxuKipDdHJsLWQqKiBsaWtlIERlbGV0ZSwgKipBbHQtQmFja3NwYWNlKiogbGlrZSBDdHJsLUJhY2tzcGFjZSwgYW5kXG4qKkN0cmwtQWx0LUJhY2tzcGFjZSoqLCAqKkFsdC1EZWxldGUqKiwgYW5kICoqQWx0LWQqKiBsaWtlXG5DdHJsLURlbGV0ZS5cbiovXG5jb25zdCBtYWNCYXNlS2V5bWFwID0ge1xuICAgIFwiQ3RybC1oXCI6IHBjQmFzZUtleW1hcFtcIkJhY2tzcGFjZVwiXSxcbiAgICBcIkFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLUJhY2tzcGFjZVwiXSxcbiAgICBcIkN0cmwtZFwiOiBwY0Jhc2VLZXltYXBbXCJEZWxldGVcIl0sXG4gICAgXCJDdHJsLUFsdC1CYWNrc3BhY2VcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1EZWxldGVcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkFsdC1kXCI6IHBjQmFzZUtleW1hcFtcIk1vZC1EZWxldGVcIl0sXG4gICAgXCJDdHJsLWFcIjogc2VsZWN0VGV4dGJsb2NrU3RhcnQsXG4gICAgXCJDdHJsLWVcIjogc2VsZWN0VGV4dGJsb2NrRW5kXG59O1xuZm9yIChsZXQga2V5IGluIHBjQmFzZUtleW1hcClcbiAgICBtYWNCYXNlS2V5bWFwW2tleV0gPSBwY0Jhc2VLZXltYXBba2V5XTtcbmNvbnN0IG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiA/IC9NYWN8aVAoaG9uZXxbb2FdZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICA6IHR5cGVvZiBvcyAhPSBcInVuZGVmaW5lZFwiICYmIG9zLnBsYXRmb3JtID8gb3MucGxhdGZvcm0oKSA9PSBcImRhcndpblwiIDogZmFsc2U7XG4vKipcbkRlcGVuZGluZyBvbiB0aGUgZGV0ZWN0ZWQgcGxhdGZvcm0sIHRoaXMgd2lsbCBob2xkXG5bYHBjQmFzZWtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5wY0Jhc2VLZXltYXApIG9yXG5bYG1hY0Jhc2VLZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMubWFjQmFzZUtleW1hcCkuXG4qL1xuY29uc3QgYmFzZUtleW1hcCA9IG1hYyA/IG1hY0Jhc2VLZXltYXAgOiBwY0Jhc2VLZXltYXA7XG5cbmV4cG9ydCB7IGF1dG9Kb2luLCBiYXNlS2V5bWFwLCBjaGFpbkNvbW1hbmRzLCBjcmVhdGVQYXJhZ3JhcGhOZWFyLCBkZWxldGVTZWxlY3Rpb24sIGV4aXRDb2RlLCBqb2luQmFja3dhcmQsIGpvaW5Eb3duLCBqb2luRm9yd2FyZCwgam9pblRleHRibG9ja0JhY2t3YXJkLCBqb2luVGV4dGJsb2NrRm9yd2FyZCwgam9pblVwLCBsaWZ0LCBsaWZ0RW1wdHlCbG9jaywgbWFjQmFzZUtleW1hcCwgbmV3bGluZUluQ29kZSwgcGNCYXNlS2V5bWFwLCBzZWxlY3RBbGwsIHNlbGVjdE5vZGVCYWNrd2FyZCwgc2VsZWN0Tm9kZUZvcndhcmQsIHNlbGVjdFBhcmVudE5vZGUsIHNlbGVjdFRleHRibG9ja0VuZCwgc2VsZWN0VGV4dGJsb2NrU3RhcnQsIHNldEJsb2NrVHlwZSwgc3BsaXRCbG9jaywgc3BsaXRCbG9ja0FzLCBzcGxpdEJsb2NrS2VlcE1hcmtzLCB0b2dnbGVNYXJrLCB3cmFwSW4gfTtcbiIsImltcG9ydCBSb3BlU2VxdWVuY2UgZnJvbSAncm9wZS1zZXF1ZW5jZSc7XG5pbXBvcnQgeyBNYXBwaW5nIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcbmltcG9ydCB7IFBsdWdpbktleSwgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vLyBQcm9zZU1pcnJvcidzIGhpc3RvcnkgaXNuJ3Qgc2ltcGx5IGEgd2F5IHRvIHJvbGwgYmFjayB0byBhIHByZXZpb3VzXG4vLyBzdGF0ZSwgYmVjYXVzZSBQcm9zZU1pcnJvciBzdXBwb3J0cyBhcHBseWluZyBjaGFuZ2VzIHdpdGhvdXQgYWRkaW5nXG4vLyB0aGVtIHRvIHRoZSBoaXN0b3J5IChmb3IgZXhhbXBsZSBkdXJpbmcgY29sbGFib3JhdGlvbikuXG4vL1xuLy8gVG8gdGhpcyBlbmQsIGVhY2ggJ0JyYW5jaCcgKG9uZSBmb3IgdGhlIHVuZG8gaGlzdG9yeSBhbmQgb25lIGZvclxuLy8gdGhlIHJlZG8gaGlzdG9yeSkga2VlcHMgYW4gYXJyYXkgb2YgJ0l0ZW1zJywgd2hpY2ggY2FuIG9wdGlvbmFsbHlcbi8vIGhvbGQgYSBzdGVwIChhbiBhY3R1YWwgdW5kb2FibGUgY2hhbmdlKSwgYW5kIGFsd2F5cyBob2xkIGEgcG9zaXRpb25cbi8vIG1hcCAod2hpY2ggaXMgbmVlZGVkIHRvIG1vdmUgY2hhbmdlcyBiZWxvdyB0aGVtIHRvIGFwcGx5IHRvIHRoZVxuLy8gY3VycmVudCBkb2N1bWVudCkuXG4vL1xuLy8gQW4gaXRlbSB0aGF0IGhhcyBib3RoIGEgc3RlcCBhbmQgYSBzZWxlY3Rpb24gYm9va21hcmsgaXMgdGhlIHN0YXJ0XG4vLyBvZiBhbiAnZXZlbnQnIOKAlCBhIGdyb3VwIG9mIGNoYW5nZXMgdGhhdCB3aWxsIGJlIHVuZG9uZSBvciByZWRvbmUgYXRcbi8vIG9uY2UuIChJdCBzdG9yZXMgb25seSB0aGUgYm9va21hcmssIHNpbmNlIHRoYXQgd2F5IHdlIGRvbid0IGhhdmUgdG9cbi8vIHByb3ZpZGUgYSBkb2N1bWVudCB1bnRpbCB0aGUgc2VsZWN0aW9uIGlzIGFjdHVhbGx5IGFwcGxpZWQsIHdoaWNoXG4vLyBpcyB1c2VmdWwgd2hlbiBjb21wcmVzc2luZy4pXG4vLyBVc2VkIHRvIHNjaGVkdWxlIGhpc3RvcnkgY29tcHJlc3Npb25cbmNvbnN0IG1heF9lbXB0eV9pdGVtcyA9IDUwMDtcbmNsYXNzIEJyYW5jaCB7XG4gICAgY29uc3RydWN0b3IoaXRlbXMsIGV2ZW50Q291bnQpIHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmV2ZW50Q291bnQgPSBldmVudENvdW50O1xuICAgIH1cbiAgICAvLyBQb3AgdGhlIGxhdGVzdCBldmVudCBvZmYgdGhlIGJyYW5jaCdzIGhpc3RvcnkgYW5kIGFwcGx5IGl0XG4gICAgLy8gdG8gYSBkb2N1bWVudCB0cmFuc2Zvcm0uXG4gICAgcG9wRXZlbnQoc3RhdGUsIHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBlbmQgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICAgICAgZm9yICg7OyBlbmQtLSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLml0ZW1zLmdldChlbmQgLSAxKTtcbiAgICAgICAgICAgIGlmIChuZXh0LnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC0tZW5kO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZW1hcCwgbWFwRnJvbTtcbiAgICAgICAgaWYgKHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgICAgIHJlbWFwID0gdGhpcy5yZW1hcHBpbmcoZW5kLCB0aGlzLml0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYW5zZm9ybSA9IHN0YXRlLnRyO1xuICAgICAgICBsZXQgc2VsZWN0aW9uLCByZW1haW5pbmc7XG4gICAgICAgIGxldCBhZGRBZnRlciA9IFtdLCBhZGRCZWZvcmUgPSBbXTtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGlmICghcmVtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAgPSB0aGlzLnJlbWFwcGluZyhlbmQsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgYWRkQmVmb3JlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbWFwKSB7XG4gICAgICAgICAgICAgICAgYWRkQmVmb3JlLnB1c2gobmV3IEl0ZW0oaXRlbS5tYXApKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IGl0ZW0uc3RlcC5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpLCBtYXA7XG4gICAgICAgICAgICAgICAgaWYgKHN0ZXAgJiYgdHJhbnNmb3JtLm1heWJlU3RlcChzdGVwKS5kb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwID0gdHJhbnNmb3JtLm1hcHBpbmcubWFwc1t0cmFuc2Zvcm0ubWFwcGluZy5tYXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBhZGRBZnRlci5wdXNoKG5ldyBJdGVtKG1hcCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFkZEFmdGVyLmxlbmd0aCArIGFkZEJlZm9yZS5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgICAgIGlmIChtYXApXG4gICAgICAgICAgICAgICAgICAgIHJlbWFwLmFwcGVuZE1hcChtYXAsIG1hcEZyb20pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLm1heWJlU3RlcChpdGVtLnN0ZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gcmVtYXAgPyBpdGVtLnNlbGVjdGlvbi5tYXAocmVtYXAuc2xpY2UobWFwRnJvbSkpIDogaXRlbS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbmV3IEJyYW5jaCh0aGlzLml0ZW1zLnNsaWNlKDAsIGVuZCkuYXBwZW5kKGFkZEJlZm9yZS5yZXZlcnNlKCkuY29uY2F0KGFkZEFmdGVyKSksIHRoaXMuZXZlbnRDb3VudCAtIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pdGVtcy5sZW5ndGgsIDApO1xuICAgICAgICByZXR1cm4geyByZW1haW5pbmc6IHJlbWFpbmluZywgdHJhbnNmb3JtLCBzZWxlY3Rpb246IHNlbGVjdGlvbiB9O1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBuZXcgYnJhbmNoIHdpdGggdGhlIGdpdmVuIHRyYW5zZm9ybSBhZGRlZC5cbiAgICBhZGRUcmFuc2Zvcm0odHJhbnNmb3JtLCBzZWxlY3Rpb24sIGhpc3RPcHRpb25zLCBwcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgIGxldCBuZXdJdGVtcyA9IFtdLCBldmVudENvdW50ID0gdGhpcy5ldmVudENvdW50O1xuICAgICAgICBsZXQgb2xkSXRlbXMgPSB0aGlzLml0ZW1zLCBsYXN0SXRlbSA9ICFwcmVzZXJ2ZUl0ZW1zICYmIG9sZEl0ZW1zLmxlbmd0aCA/IG9sZEl0ZW1zLmdldChvbGRJdGVtcy5sZW5ndGggLSAxKSA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNmb3JtLnN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RlcCA9IHRyYW5zZm9ybS5zdGVwc1tpXS5pbnZlcnQodHJhbnNmb3JtLmRvY3NbaV0pO1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSBuZXcgSXRlbSh0cmFuc2Zvcm0ubWFwcGluZy5tYXBzW2ldLCBzdGVwLCBzZWxlY3Rpb24pLCBtZXJnZWQ7XG4gICAgICAgICAgICBpZiAobWVyZ2VkID0gbGFzdEl0ZW0gJiYgbGFzdEl0ZW0ubWVyZ2UoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpdGVtID0gbWVyZ2VkO1xuICAgICAgICAgICAgICAgIGlmIChpKVxuICAgICAgICAgICAgICAgICAgICBuZXdJdGVtcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG9sZEl0ZW1zID0gb2xkSXRlbXMuc2xpY2UoMCwgb2xkSXRlbXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGV2ZW50Q291bnQrKztcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlSXRlbXMpXG4gICAgICAgICAgICAgICAgbGFzdEl0ZW0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdmVyZmxvdyA9IGV2ZW50Q291bnQgLSBoaXN0T3B0aW9ucy5kZXB0aDtcbiAgICAgICAgaWYgKG92ZXJmbG93ID4gREVQVEhfT1ZFUkZMT1cpIHtcbiAgICAgICAgICAgIG9sZEl0ZW1zID0gY3V0T2ZmRXZlbnRzKG9sZEl0ZW1zLCBvdmVyZmxvdyk7XG4gICAgICAgICAgICBldmVudENvdW50IC09IG92ZXJmbG93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKG9sZEl0ZW1zLmFwcGVuZChuZXdJdGVtcyksIGV2ZW50Q291bnQpO1xuICAgIH1cbiAgICByZW1hcHBpbmcoZnJvbSwgdG8pIHtcbiAgICAgICAgbGV0IG1hcHMgPSBuZXcgTWFwcGluZztcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgbWlycm9yUG9zID0gaXRlbS5taXJyb3JPZmZzZXQgIT0gbnVsbCAmJiBpIC0gaXRlbS5taXJyb3JPZmZzZXQgPj0gZnJvbVxuICAgICAgICAgICAgICAgID8gbWFwcy5tYXBzLmxlbmd0aCAtIGl0ZW0ubWlycm9yT2Zmc2V0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgbWFwcy5hcHBlbmRNYXAoaXRlbS5tYXAsIG1pcnJvclBvcyk7XG4gICAgICAgIH0sIGZyb20sIHRvKTtcbiAgICAgICAgcmV0dXJuIG1hcHM7XG4gICAgfVxuICAgIGFkZE1hcHMoYXJyYXkpIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKHRoaXMuaXRlbXMuYXBwZW5kKGFycmF5Lm1hcChtYXAgPT4gbmV3IEl0ZW0obWFwKSkpLCB0aGlzLmV2ZW50Q291bnQpO1xuICAgIH1cbiAgICAvLyBXaGVuIHRoZSBjb2xsYWIgbW9kdWxlIHJlY2VpdmVzIHJlbW90ZSBjaGFuZ2VzLCB0aGUgaGlzdG9yeSBoYXNcbiAgICAvLyB0byBrbm93IGFib3V0IHRob3NlLCBzbyB0aGF0IGl0IGNhbiBhZGp1c3QgdGhlIHN0ZXBzIHRoYXQgd2VyZVxuICAgIC8vIHJlYmFzZWQgb24gdG9wIG9mIHRoZSByZW1vdGUgY2hhbmdlcywgYW5kIGluY2x1ZGUgdGhlIHBvc2l0aW9uXG4gICAgLy8gbWFwcyBmb3IgdGhlIHJlbW90ZSBjaGFuZ2VzIGluIGl0cyBhcnJheSBvZiBpdGVtcy5cbiAgICByZWJhc2VkKHJlYmFzZWRUcmFuc2Zvcm0sIHJlYmFzZWRDb3VudCkge1xuICAgICAgICBpZiAoIXRoaXMuZXZlbnRDb3VudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmViYXNlZEl0ZW1zID0gW10sIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGhpcy5pdGVtcy5sZW5ndGggLSByZWJhc2VkQ291bnQpO1xuICAgICAgICBsZXQgbWFwcGluZyA9IHJlYmFzZWRUcmFuc2Zvcm0ubWFwcGluZztcbiAgICAgICAgbGV0IG5ld1VudGlsID0gcmViYXNlZFRyYW5zZm9ybS5zdGVwcy5sZW5ndGg7XG4gICAgICAgIGxldCBldmVudENvdW50ID0gdGhpcy5ldmVudENvdW50O1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7IGlmIChpdGVtLnNlbGVjdGlvbilcbiAgICAgICAgICAgIGV2ZW50Q291bnQtLTsgfSwgc3RhcnQpO1xuICAgICAgICBsZXQgaVJlYmFzZWQgPSByZWJhc2VkQ291bnQ7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLmdldE1pcnJvcigtLWlSZWJhc2VkKTtcbiAgICAgICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBuZXdVbnRpbCA9IE1hdGgubWluKG5ld1VudGlsLCBwb3MpO1xuICAgICAgICAgICAgbGV0IG1hcCA9IG1hcHBpbmcubWFwc1twb3NdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gcmViYXNlZFRyYW5zZm9ybS5zdGVwc1twb3NdLmludmVydChyZWJhc2VkVHJhbnNmb3JtLmRvY3NbcG9zXSk7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGl0ZW0uc2VsZWN0aW9uICYmIGl0ZW0uc2VsZWN0aW9uLm1hcChtYXBwaW5nLnNsaWNlKGlSZWJhc2VkICsgMSwgcG9zKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgIHJlYmFzZWRJdGVtcy5wdXNoKG5ldyBJdGVtKG1hcCwgc3RlcCwgc2VsZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWJhc2VkSXRlbXMucHVzaChuZXcgSXRlbShtYXApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgc3RhcnQpO1xuICAgICAgICBsZXQgbmV3TWFwcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gcmViYXNlZENvdW50OyBpIDwgbmV3VW50aWw7IGkrKylcbiAgICAgICAgICAgIG5ld01hcHMucHVzaChuZXcgSXRlbShtYXBwaW5nLm1hcHNbaV0pKTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZSgwLCBzdGFydCkuYXBwZW5kKG5ld01hcHMpLmFwcGVuZChyZWJhc2VkSXRlbXMpO1xuICAgICAgICBsZXQgYnJhbmNoID0gbmV3IEJyYW5jaChpdGVtcywgZXZlbnRDb3VudCk7XG4gICAgICAgIGlmIChicmFuY2guZW1wdHlJdGVtQ291bnQoKSA+IG1heF9lbXB0eV9pdGVtcylcbiAgICAgICAgICAgIGJyYW5jaCA9IGJyYW5jaC5jb21wcmVzcyh0aGlzLml0ZW1zLmxlbmd0aCAtIHJlYmFzZWRJdGVtcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYnJhbmNoO1xuICAgIH1cbiAgICBlbXB0eUl0ZW1Db3VudCgpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4geyBpZiAoIWl0ZW0uc3RlcClcbiAgICAgICAgICAgIGNvdW50Kys7IH0pO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuICAgIC8vIENvbXByZXNzaW5nIGEgYnJhbmNoIG1lYW5zIHJld3JpdGluZyBpdCB0byBwdXNoIHRoZSBhaXIgKG1hcC1vbmx5XG4gICAgLy8gaXRlbXMpIG91dC4gRHVyaW5nIGNvbGxhYm9yYXRpb24sIHRoZXNlIG5hdHVyYWxseSBhY2N1bXVsYXRlXG4gICAgLy8gYmVjYXVzZSBlYWNoIHJlbW90ZSBjaGFuZ2UgYWRkcyBvbmUuIFRoZSBgdXB0b2AgYXJndW1lbnQgaXMgdXNlZFxuICAgIC8vIHRvIGVuc3VyZSB0aGF0IG9ubHkgdGhlIGl0ZW1zIGJlbG93IGEgZ2l2ZW4gbGV2ZWwgYXJlIGNvbXByZXNzZWQsXG4gICAgLy8gYmVjYXVzZSBgcmViYXNlZGAgcmVsaWVzIG9uIGEgY2xlYW4sIHVudG91Y2hlZCBzZXQgb2YgaXRlbXMgaW5cbiAgICAvLyBvcmRlciB0byBhc3NvY2lhdGUgb2xkIGl0ZW1zIHdpdGggcmViYXNlZCBzdGVwcy5cbiAgICBjb21wcmVzcyh1cHRvID0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHJlbWFwID0gdGhpcy5yZW1hcHBpbmcoMCwgdXB0byksIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgbGV0IGl0ZW1zID0gW10sIGV2ZW50cyA9IDA7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPj0gdXB0bykge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBldmVudHMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uc3RlcCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gaXRlbS5zdGVwLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSksIG1hcCA9IHN0ZXAgJiYgc3RlcC5nZXRNYXAoKTtcbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgaWYgKG1hcClcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAuYXBwZW5kTWFwKG1hcCwgbWFwRnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0ZXApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGlvbiA9IGl0ZW0uc2VsZWN0aW9uICYmIGl0ZW0uc2VsZWN0aW9uLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0l0ZW0gPSBuZXcgSXRlbShtYXAuaW52ZXJ0KCksIHN0ZXAsIHNlbGVjdGlvbiksIG1lcmdlZCwgbGFzdCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWQgPSBpdGVtcy5sZW5ndGggJiYgaXRlbXNbbGFzdF0ubWVyZ2UobmV3SXRlbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1tsYXN0XSA9IG1lcmdlZDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChuZXdJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtLm1hcCkge1xuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5pdGVtcy5sZW5ndGgsIDApO1xuICAgICAgICByZXR1cm4gbmV3IEJyYW5jaChSb3BlU2VxdWVuY2UuZnJvbShpdGVtcy5yZXZlcnNlKCkpLCBldmVudHMpO1xuICAgIH1cbn1cbkJyYW5jaC5lbXB0eSA9IG5ldyBCcmFuY2goUm9wZVNlcXVlbmNlLmVtcHR5LCAwKTtcbmZ1bmN0aW9uIGN1dE9mZkV2ZW50cyhpdGVtcywgbikge1xuICAgIGxldCBjdXRQb2ludDtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnNlbGVjdGlvbiAmJiAobi0tID09IDApKSB7XG4gICAgICAgICAgICBjdXRQb2ludCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaXRlbXMuc2xpY2UoY3V0UG9pbnQpO1xufVxuY2xhc3MgSXRlbSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIChmb3J3YXJkKSBzdGVwIG1hcCBmb3IgdGhpcyBpdGVtLlxuICAgIG1hcCwgXG4gICAgLy8gVGhlIGludmVydGVkIHN0ZXBcbiAgICBzdGVwLCBcbiAgICAvLyBJZiB0aGlzIGlzIG5vbi1udWxsLCB0aGlzIGl0ZW0gaXMgdGhlIHN0YXJ0IG9mIGEgZ3JvdXAsIGFuZFxuICAgIC8vIHRoaXMgc2VsZWN0aW9uIGlzIHRoZSBzdGFydGluZyBzZWxlY3Rpb24gZm9yIHRoZSBncm91cCAodGhlIG9uZVxuICAgIC8vIHRoYXQgd2FzIGFjdGl2ZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgd2FzIGFwcGxpZWQpXG4gICAgc2VsZWN0aW9uLCBcbiAgICAvLyBJZiB0aGlzIGl0ZW0gaXMgdGhlIGludmVyc2Ugb2YgYSBwcmV2aW91cyBtYXBwaW5nIG9uIHRoZSBzdGFjayxcbiAgICAvLyB0aGlzIHBvaW50cyBhdCB0aGUgaW52ZXJzZSdzIG9mZnNldFxuICAgIG1pcnJvck9mZnNldCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5zdGVwID0gc3RlcDtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMubWlycm9yT2Zmc2V0ID0gbWlycm9yT2Zmc2V0O1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5zdGVwICYmIG90aGVyLnN0ZXAgJiYgIW90aGVyLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgbGV0IHN0ZXAgPSBvdGhlci5zdGVwLm1lcmdlKHRoaXMuc3RlcCk7XG4gICAgICAgICAgICBpZiAoc3RlcClcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZW0oc3RlcC5nZXRNYXAoKS5pbnZlcnQoKSwgc3RlcCwgdGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gVGhlIHZhbHVlIG9mIHRoZSBzdGF0ZSBmaWVsZCB0aGF0IHRyYWNrcyB1bmRvL3JlZG8gaGlzdG9yeSBmb3IgdGhhdFxuLy8gc3RhdGUuIFdpbGwgYmUgc3RvcmVkIGluIHRoZSBwbHVnaW4gc3RhdGUgd2hlbiB0aGUgaGlzdG9yeSBwbHVnaW5cbi8vIGlzIGFjdGl2ZS5cbmNsYXNzIEhpc3RvcnlTdGF0ZSB7XG4gICAgY29uc3RydWN0b3IoZG9uZSwgdW5kb25lLCBwcmV2UmFuZ2VzLCBwcmV2VGltZSwgcHJldkNvbXBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMuZG9uZSA9IGRvbmU7XG4gICAgICAgIHRoaXMudW5kb25lID0gdW5kb25lO1xuICAgICAgICB0aGlzLnByZXZSYW5nZXMgPSBwcmV2UmFuZ2VzO1xuICAgICAgICB0aGlzLnByZXZUaW1lID0gcHJldlRpbWU7XG4gICAgICAgIHRoaXMucHJldkNvbXBvc2l0aW9uID0gcHJldkNvbXBvc2l0aW9uO1xuICAgIH1cbn1cbmNvbnN0IERFUFRIX09WRVJGTE9XID0gMjA7XG4vLyBSZWNvcmQgYSB0cmFuc2Zvcm1hdGlvbiBpbiB1bmRvIGhpc3RvcnkuXG5mdW5jdGlvbiBhcHBseVRyYW5zYWN0aW9uKGhpc3RvcnksIHN0YXRlLCB0ciwgb3B0aW9ucykge1xuICAgIGxldCBoaXN0b3J5VHIgPSB0ci5nZXRNZXRhKGhpc3RvcnlLZXkpLCByZWJhc2VkO1xuICAgIGlmIChoaXN0b3J5VHIpXG4gICAgICAgIHJldHVybiBoaXN0b3J5VHIuaGlzdG9yeVN0YXRlO1xuICAgIGlmICh0ci5nZXRNZXRhKGNsb3NlSGlzdG9yeUtleSkpXG4gICAgICAgIGhpc3RvcnkgPSBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZSwgaGlzdG9yeS51bmRvbmUsIG51bGwsIDAsIC0xKTtcbiAgICBsZXQgYXBwZW5kZWQgPSB0ci5nZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiKTtcbiAgICBpZiAodHIuc3RlcHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuIGhpc3Rvcnk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFwcGVuZGVkICYmIGFwcGVuZGVkLmdldE1ldGEoaGlzdG9yeUtleSkpIHtcbiAgICAgICAgaWYgKGFwcGVuZGVkLmdldE1ldGEoaGlzdG9yeUtleSkucmVkbylcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgaGlzdG9yeS51bmRvbmUsIHJhbmdlc0Zvcih0ci5tYXBwaW5nLm1hcHMpLCBoaXN0b3J5LnByZXZUaW1lLCBoaXN0b3J5LnByZXZDb21wb3NpdGlvbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZSwgaGlzdG9yeS51bmRvbmUuYWRkVHJhbnNmb3JtKHRyLCB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIG51bGwsIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHIuZ2V0TWV0YShcImFkZFRvSGlzdG9yeVwiKSAhPT0gZmFsc2UgJiYgIShhcHBlbmRlZCAmJiBhcHBlbmRlZC5nZXRNZXRhKFwiYWRkVG9IaXN0b3J5XCIpID09PSBmYWxzZSkpIHtcbiAgICAgICAgLy8gR3JvdXAgdHJhbnNmb3JtcyB0aGF0IG9jY3VyIGluIHF1aWNrIHN1Y2Nlc3Npb24gaW50byBvbmUgZXZlbnQuXG4gICAgICAgIGxldCBjb21wb3NpdGlvbiA9IHRyLmdldE1ldGEoXCJjb21wb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0dyb3VwID0gaGlzdG9yeS5wcmV2VGltZSA9PSAwIHx8XG4gICAgICAgICAgICAoIWFwcGVuZGVkICYmIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uICE9IGNvbXBvc2l0aW9uICYmXG4gICAgICAgICAgICAgICAgKGhpc3RvcnkucHJldlRpbWUgPCAodHIudGltZSB8fCAwKSAtIG9wdGlvbnMubmV3R3JvdXBEZWxheSB8fCAhaXNBZGphY2VudFRvKHRyLCBoaXN0b3J5LnByZXZSYW5nZXMpKSk7XG4gICAgICAgIGxldCBwcmV2UmFuZ2VzID0gYXBwZW5kZWQgPyBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSA6IHJhbmdlc0Zvcih0ci5tYXBwaW5nLm1hcHMpO1xuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUuYWRkVHJhbnNmb3JtKHRyLCBuZXdHcm91cCA/IHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpIDogdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBCcmFuY2guZW1wdHksIHByZXZSYW5nZXMsIHRyLnRpbWUsIGNvbXBvc2l0aW9uID09IG51bGwgPyBoaXN0b3J5LnByZXZDb21wb3NpdGlvbiA6IGNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmViYXNlZCA9IHRyLmdldE1ldGEoXCJyZWJhc2VkXCIpKSB7XG4gICAgICAgIC8vIFVzZWQgYnkgdGhlIGNvbGxhYiBtb2R1bGUgdG8gdGVsbCB0aGUgaGlzdG9yeSB0aGF0IHNvbWUgb2YgaXRzXG4gICAgICAgIC8vIGNvbnRlbnQgaGFzIGJlZW4gcmViYXNlZC5cbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLnJlYmFzZWQodHIsIHJlYmFzZWQpLCBoaXN0b3J5LnVuZG9uZS5yZWJhc2VkKHRyLCByZWJhc2VkKSwgbWFwUmFuZ2VzKGhpc3RvcnkucHJldlJhbmdlcywgdHIubWFwcGluZyksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRNYXBzKHRyLm1hcHBpbmcubWFwcyksIGhpc3RvcnkudW5kb25lLmFkZE1hcHModHIubWFwcGluZy5tYXBzKSwgbWFwUmFuZ2VzKGhpc3RvcnkucHJldlJhbmdlcywgdHIubWFwcGluZyksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0FkamFjZW50VG8odHJhbnNmb3JtLCBwcmV2UmFuZ2VzKSB7XG4gICAgaWYgKCFwcmV2UmFuZ2VzKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0cmFuc2Zvcm0uZG9jQ2hhbmdlZClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IGFkamFjZW50ID0gZmFsc2U7XG4gICAgdHJhbnNmb3JtLm1hcHBpbmcubWFwc1swXS5mb3JFYWNoKChzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldlJhbmdlcy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgICAgIGlmIChzdGFydCA8PSBwcmV2UmFuZ2VzW2kgKyAxXSAmJiBlbmQgPj0gcHJldlJhbmdlc1tpXSlcbiAgICAgICAgICAgICAgICBhZGphY2VudCA9IHRydWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkamFjZW50O1xufVxuZnVuY3Rpb24gcmFuZ2VzRm9yKG1hcHMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IG1hcHMubGVuZ3RoIC0gMTsgaSA+PSAwICYmIHJlc3VsdC5sZW5ndGggPT0gMDsgaS0tKVxuICAgICAgICBtYXBzW2ldLmZvckVhY2goKF9mcm9tLCBfdG8sIGZyb20sIHRvKSA9PiByZXN1bHQucHVzaChmcm9tLCB0bykpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBtYXBSYW5nZXMocmFuZ2VzLCBtYXBwaW5nKSB7XG4gICAgaWYgKCFyYW5nZXMpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHJhbmdlc1tpXSwgMSksIHRvID0gbWFwcGluZy5tYXAocmFuZ2VzW2kgKyAxXSwgLTEpO1xuICAgICAgICBpZiAoZnJvbSA8PSB0bylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyb20sIHRvKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEFwcGx5IHRoZSBsYXRlc3QgZXZlbnQgZnJvbSBvbmUgYnJhbmNoIHRvIHRoZSBkb2N1bWVudCBhbmQgc2hpZnQgdGhlIGV2ZW50XG4vLyBvbnRvIHRoZSBvdGhlciBicmFuY2guXG5mdW5jdGlvbiBoaXN0VHJhbnNhY3Rpb24oaGlzdG9yeSwgc3RhdGUsIHJlZG8pIHtcbiAgICBsZXQgcHJlc2VydmVJdGVtcyA9IG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKTtcbiAgICBsZXQgaGlzdE9wdGlvbnMgPSBoaXN0b3J5S2V5LmdldChzdGF0ZSkuc3BlYy5jb25maWc7XG4gICAgbGV0IHBvcCA9IChyZWRvID8gaGlzdG9yeS51bmRvbmUgOiBoaXN0b3J5LmRvbmUpLnBvcEV2ZW50KHN0YXRlLCBwcmVzZXJ2ZUl0ZW1zKTtcbiAgICBpZiAoIXBvcClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHNlbGVjdGlvbiA9IHBvcC5zZWxlY3Rpb24ucmVzb2x2ZShwb3AudHJhbnNmb3JtLmRvYyk7XG4gICAgbGV0IGFkZGVkID0gKHJlZG8gPyBoaXN0b3J5LmRvbmUgOiBoaXN0b3J5LnVuZG9uZSkuYWRkVHJhbnNmb3JtKHBvcC50cmFuc2Zvcm0sIHN0YXRlLnNlbGVjdGlvbi5nZXRCb29rbWFyaygpLCBoaXN0T3B0aW9ucywgcHJlc2VydmVJdGVtcyk7XG4gICAgbGV0IG5ld0hpc3QgPSBuZXcgSGlzdG9yeVN0YXRlKHJlZG8gPyBhZGRlZCA6IHBvcC5yZW1haW5pbmcsIHJlZG8gPyBwb3AucmVtYWluaW5nIDogYWRkZWQsIG51bGwsIDAsIC0xKTtcbiAgICByZXR1cm4gcG9wLnRyYW5zZm9ybS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKS5zZXRNZXRhKGhpc3RvcnlLZXksIHsgcmVkbywgaGlzdG9yeVN0YXRlOiBuZXdIaXN0IH0pO1xufVxubGV0IGNhY2hlZFByZXNlcnZlSXRlbXMgPSBmYWxzZSwgY2FjaGVkUHJlc2VydmVJdGVtc1BsdWdpbnMgPSBudWxsO1xuLy8gQ2hlY2sgd2hldGhlciBhbnkgcGx1Z2luIGluIHRoZSBnaXZlbiBzdGF0ZSBoYXMgYVxuLy8gYGhpc3RvcnlQcmVzZXJ2ZUl0ZW1zYCBwcm9wZXJ0eSBpbiBpdHMgc3BlYywgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0XG4vLyBwcmVzZXJ2ZSBzdGVwcyBleGFjdGx5IGFzIHRoZXkgY2FtZSBpbiwgc28gdGhhdCB0aGV5IGNhbiBiZVxuLy8gcmViYXNlZC5cbmZ1bmN0aW9uIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSB7XG4gICAgbGV0IHBsdWdpbnMgPSBzdGF0ZS5wbHVnaW5zO1xuICAgIGlmIChjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyAhPSBwbHVnaW5zKSB7XG4gICAgICAgIGNhY2hlZFByZXNlcnZlSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtc1BsdWdpbnMgPSBwbHVnaW5zO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocGx1Z2luc1tpXS5zcGVjLmhpc3RvcnlQcmVzZXJ2ZUl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRQcmVzZXJ2ZUl0ZW1zO1xufVxuLyoqXG5TZXQgYSBmbGFnIG9uIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0aGF0IHdpbGwgcHJldmVudCBmdXJ0aGVyIHN0ZXBzXG5mcm9tIGJlaW5nIGFwcGVuZGVkIHRvIGFuIGV4aXN0aW5nIGhpc3RvcnkgZXZlbnQgKHNvIHRoYXQgdGhleVxucmVxdWlyZSBhIHNlcGFyYXRlIHVuZG8gY29tbWFuZCB0byB1bmRvKS5cbiovXG5mdW5jdGlvbiBjbG9zZUhpc3RvcnkodHIpIHtcbiAgICByZXR1cm4gdHIuc2V0TWV0YShjbG9zZUhpc3RvcnlLZXksIHRydWUpO1xufVxuY29uc3QgaGlzdG9yeUtleSA9IG5ldyBQbHVnaW5LZXkoXCJoaXN0b3J5XCIpO1xuY29uc3QgY2xvc2VIaXN0b3J5S2V5ID0gbmV3IFBsdWdpbktleShcImNsb3NlSGlzdG9yeVwiKTtcbi8qKlxuUmV0dXJucyBhIHBsdWdpbiB0aGF0IGVuYWJsZXMgdGhlIHVuZG8gaGlzdG9yeSBmb3IgYW4gZWRpdG9yLiBUaGVcbnBsdWdpbiB3aWxsIHRyYWNrIHVuZG8gYW5kIHJlZG8gc3RhY2tzLCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIHRoZVxuW2B1bmRvYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2hpc3RvcnkudW5kbykgYW5kIFtgcmVkb2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNoaXN0b3J5LnJlZG8pIGNvbW1hbmRzLlxuXG5Zb3UgY2FuIHNldCBhbiBgXCJhZGRUb0hpc3RvcnlcImAgW21ldGFkYXRhXG5wcm9wZXJ0eV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uLnNldE1ldGEpIG9mIGBmYWxzZWAgb24gYSB0cmFuc2FjdGlvblxudG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJvbGxlZCBiYWNrIGJ5IHVuZG8uXG4qL1xuZnVuY3Rpb24gaGlzdG9yeShjb25maWcgPSB7fSkge1xuICAgIGNvbmZpZyA9IHsgZGVwdGg6IGNvbmZpZy5kZXB0aCB8fCAxMDAsXG4gICAgICAgIG5ld0dyb3VwRGVsYXk6IGNvbmZpZy5uZXdHcm91cERlbGF5IHx8IDUwMCB9O1xuICAgIHJldHVybiBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBoaXN0b3J5S2V5LFxuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShCcmFuY2guZW1wdHksIEJyYW5jaC5lbXB0eSwgbnVsbCwgMCwgLTEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5KHRyLCBoaXN0LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseVRyYW5zYWN0aW9uKGhpc3QsIHN0YXRlLCB0ciwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgYmVmb3JlaW5wdXQodmlldywgZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRUeXBlID0gZS5pbnB1dFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21tYW5kID0gaW5wdXRUeXBlID09IFwiaGlzdG9yeVVuZG9cIiA/IHVuZG8gOiBpbnB1dFR5cGUgPT0gXCJoaXN0b3J5UmVkb1wiID8gcmVkbyA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tbWFuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZCh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZChyZWRvLCBzY3JvbGwpIHtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgICAgICBpZiAoIWhpc3QgfHwgKHJlZG8gPyBoaXN0LnVuZG9uZSA6IGhpc3QuZG9uZSkuZXZlbnRDb3VudCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCB0ciA9IGhpc3RUcmFuc2FjdGlvbihoaXN0LCBzdGF0ZSwgcmVkbyk7XG4gICAgICAgICAgICBpZiAodHIpXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goc2Nyb2xsID8gdHIuc2Nyb2xsSW50b1ZpZXcoKSA6IHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB1bmRvZXMgdGhlIGxhc3QgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgdW5kbyA9IGJ1aWxkQ29tbWFuZChmYWxzZSwgdHJ1ZSk7XG4vKipcbkEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHJlZG9lcyB0aGUgbGFzdCB1bmRvbmUgY2hhbmdlLCBpZiBhbnkuXG4qL1xuY29uc3QgcmVkbyA9IGJ1aWxkQ29tbWFuZCh0cnVlLCB0cnVlKTtcbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgdW5kb2VzIHRoZSBsYXN0IGNoYW5nZS4gRG9uJ3Qgc2Nyb2xsIHRoZVxuc2VsZWN0aW9uIGludG8gdmlldy5cbiovXG5jb25zdCB1bmRvTm9TY3JvbGwgPSBidWlsZENvbW1hbmQoZmFsc2UsIGZhbHNlKTtcbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgcmVkb2VzIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UuIERvbid0XG5zY3JvbGwgdGhlIHNlbGVjdGlvbiBpbnRvIHZpZXcuXG4qL1xuY29uc3QgcmVkb05vU2Nyb2xsID0gYnVpbGRDb21tYW5kKHRydWUsIGZhbHNlKTtcbi8qKlxuVGhlIGFtb3VudCBvZiB1bmRvYWJsZSBldmVudHMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gc3RhdGUuXG4qL1xuZnVuY3Rpb24gdW5kb0RlcHRoKHN0YXRlKSB7XG4gICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICByZXR1cm4gaGlzdCA/IGhpc3QuZG9uZS5ldmVudENvdW50IDogMDtcbn1cbi8qKlxuVGhlIGFtb3VudCBvZiByZWRvYWJsZSBldmVudHMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gZWRpdG9yIHN0YXRlLlxuKi9cbmZ1bmN0aW9uIHJlZG9EZXB0aChzdGF0ZSkge1xuICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgcmV0dXJuIGhpc3QgPyBoaXN0LnVuZG9uZS5ldmVudENvdW50IDogMDtcbn1cblxuZXhwb3J0IHsgY2xvc2VIaXN0b3J5LCBoaXN0b3J5LCByZWRvLCByZWRvRGVwdGgsIHJlZG9Ob1Njcm9sbCwgdW5kbywgdW5kb0RlcHRoLCB1bmRvTm9TY3JvbGwgfTtcbiIsImltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IGZpbmRXcmFwcGluZywgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbi8qKlxuSW5wdXQgcnVsZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVzY3JpYmluZyBhIHBpZWNlIG9mIHRleHRcbnRoYXQsIHdoZW4gdHlwZWQsIGNhdXNlcyBzb21ldGhpbmcgdG8gaGFwcGVuLiBUaGlzIG1pZ2h0IGJlXG5jaGFuZ2luZyB0d28gZGFzaGVzIGludG8gYW4gZW1kYXNoLCB3cmFwcGluZyBhIHBhcmFncmFwaCBzdGFydGluZ1xud2l0aCBgXCI+IFwiYCBpbnRvIGEgYmxvY2txdW90ZSwgb3Igc29tZXRoaW5nIGVudGlyZWx5IGRpZmZlcmVudC5cbiovXG5jbGFzcyBJbnB1dFJ1bGUge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnB1dCBydWxlLiBUaGUgcnVsZSBhcHBsaWVzIHdoZW4gdGhlIHVzZXIgdHlwZWRcbiAgICBzb21ldGhpbmcgYW5kIHRoZSB0ZXh0IGRpcmVjdGx5IGluIGZyb250IG9mIHRoZSBjdXJzb3IgbWF0Y2hlc1xuICAgIGBtYXRjaGAsIHdoaWNoIHNob3VsZCBlbmQgd2l0aCBgJGAuXG4gICAgXG4gICAgVGhlIGBoYW5kbGVyYCBjYW4gYmUgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoZWQgdGV4dCwgb3JcbiAgICB0aGUgZmlyc3QgbWF0Y2hlZCBncm91cCBpbiB0aGUgcmVnZXhwLCBpcyByZXBsYWNlZCBieSB0aGF0XG4gICAgc3RyaW5nLlxuICAgIFxuICAgIE9yIGEgaXQgY2FuIGJlIGEgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG1hdGNoXG4gICAgYXJyYXkgcHJvZHVjZWQgYnlcbiAgICBbYFJlZ0V4cC5leGVjYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUmVnRXhwL2V4ZWMpLFxuICAgIGFzIHdlbGwgYXMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG1hdGNoZWQgcmFuZ2UsIGFuZCB3aGljaCBjYW5cbiAgICByZXR1cm4gYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgdGhhdCBkZXNjcmliZXMgdGhlXG4gICAgcnVsZSdzIGVmZmVjdCwgb3IgbnVsbCB0byBpbmRpY2F0ZSB0aGUgaW5wdXQgd2FzIG5vdCBoYW5kbGVkLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaCwgaGFuZGxlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMubWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSB0eXBlb2YgaGFuZGxlciA9PSBcInN0cmluZ1wiID8gc3RyaW5nSGFuZGxlcihoYW5kbGVyKSA6IGhhbmRsZXI7XG4gICAgICAgIHRoaXMudW5kb2FibGUgPSBvcHRpb25zLnVuZG9hYmxlICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbkNvZGUgPSBvcHRpb25zLmluQ29kZSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5pbkNvZGVNYXJrID0gb3B0aW9ucy5pbkNvZGVNYXJrICE9PSBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdIYW5kbGVyKHN0cmluZykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIGxldCBpbnNlcnQgPSBzdHJpbmc7XG4gICAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IG1hdGNoWzBdLmxhc3RJbmRleE9mKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIGluc2VydCArPSBtYXRjaFswXS5zbGljZShvZmZzZXQgKyBtYXRjaFsxXS5sZW5ndGgpO1xuICAgICAgICAgICAgc3RhcnQgKz0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IGN1dE9mZiA9IHN0YXJ0IC0gZW5kO1xuICAgICAgICAgICAgaWYgKGN1dE9mZiA+IDApIHtcbiAgICAgICAgICAgICAgICBpbnNlcnQgPSBtYXRjaFswXS5zbGljZShvZmZzZXQgLSBjdXRPZmYsIG9mZnNldCkgKyBpbnNlcnQ7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLnRyLmluc2VydFRleHQoaW5zZXJ0LCBzdGFydCwgZW5kKTtcbiAgICB9O1xufVxuY29uc3QgTUFYX01BVENIID0gNTAwO1xuLyoqXG5DcmVhdGUgYW4gaW5wdXQgcnVsZXMgcGx1Z2luLiBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgY2F1c2UgdGV4dFxuaW5wdXQgdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgZ2l2ZW4gcnVsZXMgdG8gdHJpZ2dlciB0aGUgcnVsZSdzXG5hY3Rpb24uXG4qL1xuZnVuY3Rpb24gaW5wdXRSdWxlcyh7IHJ1bGVzIH0pIHtcbiAgICBsZXQgcGx1Z2luID0gbmV3IFBsdWdpbih7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBpbml0KCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0b3JlZCA9IHRyLmdldE1ldGEodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHIuc2VsZWN0aW9uU2V0IHx8IHRyLmRvY0NoYW5nZWQgPyBudWxsIDogcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGhhbmRsZVRleHRJbnB1dCh2aWV3LCBmcm9tLCB0bywgdGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBydW4odmlldywgZnJvbSwgdG8sIHRleHQsIHJ1bGVzLCBwbHVnaW4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0aW9uZW5kOiAodmlldykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuKHZpZXcsICRjdXJzb3IucG9zLCAkY3Vyc29yLnBvcywgXCJcIiwgcnVsZXMsIHBsdWdpbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaXNJbnB1dFJ1bGVzOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHBsdWdpbjtcbn1cbmZ1bmN0aW9uIHJ1bih2aWV3LCBmcm9tLCB0bywgdGV4dCwgcnVsZXMsIHBsdWdpbikge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzdGF0ZSA9IHZpZXcuc3RhdGUsICRmcm9tID0gc3RhdGUuZG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHRleHRCZWZvcmUgPSAkZnJvbS5wYXJlbnQudGV4dEJldHdlZW4oTWF0aC5tYXgoMCwgJGZyb20ucGFyZW50T2Zmc2V0IC0gTUFYX01BVENIKSwgJGZyb20ucGFyZW50T2Zmc2V0LCBudWxsLCBcIlxcdWZmZmNcIikgKyB0ZXh0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHJ1bGUgPSBydWxlc1tpXTtcbiAgICAgICAgaWYgKCFydWxlLmluQ29kZU1hcmsgJiYgJGZyb20ubWFya3MoKS5zb21lKG0gPT4gbS50eXBlLnNwZWMuY29kZSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudC50eXBlLnNwZWMuY29kZSkge1xuICAgICAgICAgICAgaWYgKCFydWxlLmluQ29kZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChydWxlLmluQ29kZSA9PT0gXCJvbmx5XCIpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaCA9IHJ1bGUubWF0Y2guZXhlYyh0ZXh0QmVmb3JlKTtcbiAgICAgICAgbGV0IHRyID0gbWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID49IHRleHQubGVuZ3RoICYmXG4gICAgICAgICAgICBydWxlLmhhbmRsZXIoc3RhdGUsIG1hdGNoLCBmcm9tIC0gKG1hdGNoWzBdLmxlbmd0aCAtIHRleHQubGVuZ3RoKSwgdG8pO1xuICAgICAgICBpZiAoIXRyKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChydWxlLnVuZG9hYmxlKVxuICAgICAgICAgICAgdHIuc2V0TWV0YShwbHVnaW4sIHsgdHJhbnNmb3JtOiB0ciwgZnJvbSwgdG8sIHRleHQgfSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG5UaGlzIGlzIGEgY29tbWFuZCB0aGF0IHdpbGwgdW5kbyBhbiBpbnB1dCBydWxlLCBpZiBhcHBseWluZyBzdWNoIGFcbnJ1bGUgd2FzIHRoZSBsYXN0IHRoaW5nIHRoYXQgdGhlIHVzZXIgZGlkLlxuKi9cbmNvbnN0IHVuZG9JbnB1dFJ1bGUgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHBsdWdpbnMgPSBzdGF0ZS5wbHVnaW5zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcGx1Z2luID0gcGx1Z2luc1tpXSwgdW5kb2FibGU7XG4gICAgICAgIGlmIChwbHVnaW4uc3BlYy5pc0lucHV0UnVsZXMgJiYgKHVuZG9hYmxlID0gcGx1Z2luLmdldFN0YXRlKHN0YXRlKSkpIHtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLCB0b1VuZG8gPSB1bmRvYWJsZS50cmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IHRvVW5kby5zdGVwcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSlcbiAgICAgICAgICAgICAgICAgICAgdHIuc3RlcCh0b1VuZG8uc3RlcHNbal0uaW52ZXJ0KHRvVW5kby5kb2NzW2pdKSk7XG4gICAgICAgICAgICAgICAgaWYgKHVuZG9hYmxlLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtzID0gdHIuZG9jLnJlc29sdmUodW5kb2FibGUuZnJvbSkubWFya3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdHIucmVwbGFjZVdpdGgodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8sIHN0YXRlLnNjaGVtYS50ZXh0KHVuZG9hYmxlLnRleHQsIG1hcmtzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ci5kZWxldGUodW5kb2FibGUuZnJvbSwgdW5kb2FibGUudG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbkNvbnZlcnRzIGRvdWJsZSBkYXNoZXMgdG8gYW4gZW1kYXNoLlxuKi9cbmNvbnN0IGVtRGFzaCA9IG5ldyBJbnB1dFJ1bGUoLy0tJC8sIFwi4oCUXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbkNvbnZlcnRzIHRocmVlIGRvdHMgdG8gYW4gZWxsaXBzaXMgY2hhcmFjdGVyLlxuKi9cbmNvbnN0IGVsbGlwc2lzID0gbmV3IElucHV0UnVsZSgvXFwuXFwuXFwuJC8sIFwi4oCmXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIG9wZW5pbmcgZG91YmxlIHF1b3Rlcy5cbiovXG5jb25zdCBvcGVuRG91YmxlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC8oPzpefFtcXHNcXHtcXFtcXChcXDwnXCJcXHUyMDE4XFx1MjAxQ10pKFwiKSQvLCBcIuKAnFwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG7igJxTbWFydOKAnSBjbG9zaW5nIGRvdWJsZSBxdW90ZXMuXG4qL1xuY29uc3QgY2xvc2VEb3VibGVRdW90ZSA9IG5ldyBJbnB1dFJ1bGUoL1wiJC8sIFwi4oCdXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIG9wZW5pbmcgc2luZ2xlIHF1b3Rlcy5cbiovXG5jb25zdCBvcGVuU2luZ2xlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC8oPzpefFtcXHNcXHtcXFtcXChcXDwnXCJcXHUyMDE4XFx1MjAxQ10pKCcpJC8sIFwi4oCYXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIGNsb3Npbmcgc2luZ2xlIHF1b3Rlcy5cbiovXG5jb25zdCBjbG9zZVNpbmdsZVF1b3RlID0gbmV3IElucHV0UnVsZSgvJyQvLCBcIuKAmVwiLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pO1xuLyoqXG5TbWFydC1xdW90ZSByZWxhdGVkIGlucHV0IHJ1bGVzLlxuKi9cbmNvbnN0IHNtYXJ0UXVvdGVzID0gW29wZW5Eb3VibGVRdW90ZSwgY2xvc2VEb3VibGVRdW90ZSwgb3BlblNpbmdsZVF1b3RlLCBjbG9zZVNpbmdsZVF1b3RlXTtcblxuLyoqXG5CdWlsZCBhbiBpbnB1dCBydWxlIGZvciBhdXRvbWF0aWNhbGx5IHdyYXBwaW5nIGEgdGV4dGJsb2NrIHdoZW4gYVxuZ2l2ZW4gc3RyaW5nIGlzIHR5cGVkLiBUaGUgYHJlZ2V4cGAgYXJndW1lbnQgaXNcbmRpcmVjdGx5IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgSW5wdXRSdWxlYCBjb25zdHJ1Y3Rvci4gWW91J2xsXG5wcm9iYWJseSB3YW50IHRoZSByZWdleHAgdG8gc3RhcnQgd2l0aCBgXmAsIHNvIHRoYXQgdGhlIHBhdHRlcm4gY2FuXG5vbmx5IG9jY3VyIGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jay5cblxuYG5vZGVUeXBlYCBpcyB0aGUgdHlwZSBvZiBub2RlIHRvIHdyYXAgaW4uIElmIGl0IG5lZWRzIGF0dHJpYnV0ZXMsXG55b3UgY2FuIGVpdGhlciBwYXNzIHRoZW0gZGlyZWN0bHksIG9yIHBhc3MgYSBmdW5jdGlvbiB0aGF0IHdpbGxcbmNvbXB1dGUgdGhlbSBmcm9tIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2guXG5cbkJ5IGRlZmF1bHQsIGlmIHRoZXJlJ3MgYSBub2RlIHdpdGggdGhlIHNhbWUgdHlwZSBhYm92ZSB0aGUgbmV3bHlcbndyYXBwZWQgbm9kZSwgdGhlIHJ1bGUgd2lsbCB0cnkgdG8gW2pvaW5dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uVHJhbnNmb3JtLmpvaW4pIHRob3NlXG50d28gbm9kZXMuIFlvdSBjYW4gcGFzcyBhIGpvaW4gcHJlZGljYXRlLCB3aGljaCB0YWtlcyBhIHJlZ3VsYXJcbmV4cHJlc3Npb24gbWF0Y2ggYW5kIHRoZSBub2RlIGJlZm9yZSB0aGUgd3JhcHBlZCBub2RlLCBhbmQgY2FuXG5yZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgYSBqb2luIHNob3VsZCBoYXBwZW4uXG4qL1xuZnVuY3Rpb24gd3JhcHBpbmdJbnB1dFJ1bGUocmVnZXhwLCBub2RlVHlwZSwgZ2V0QXR0cnMgPSBudWxsLCBqb2luUHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUocmVnZXhwLCAoc3RhdGUsIG1hdGNoLCBzdGFydCwgZW5kKSA9PiB7XG4gICAgICAgIGxldCBhdHRycyA9IGdldEF0dHJzIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBnZXRBdHRycyhtYXRjaCkgOiBnZXRBdHRycztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuZGVsZXRlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUoc3RhcnQpLCByYW5nZSA9ICRzdGFydC5ibG9ja1JhbmdlKCksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyLndyYXAocmFuZ2UsIHdyYXBwaW5nKTtcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRyLmRvYy5yZXNvbHZlKHN0YXJ0IC0gMSkubm9kZUJlZm9yZTtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUudHlwZSA9PSBub2RlVHlwZSAmJiBjYW5Kb2luKHRyLmRvYywgc3RhcnQgLSAxKSAmJlxuICAgICAgICAgICAgKCFqb2luUHJlZGljYXRlIHx8IGpvaW5QcmVkaWNhdGUobWF0Y2gsIGJlZm9yZSkpKVxuICAgICAgICAgICAgdHIuam9pbihzdGFydCAtIDEpO1xuICAgICAgICByZXR1cm4gdHI7XG4gICAgfSk7XG59XG4vKipcbkJ1aWxkIGFuIGlucHV0IHJ1bGUgdGhhdCBjaGFuZ2VzIHRoZSB0eXBlIG9mIGEgdGV4dGJsb2NrIHdoZW4gdGhlXG5tYXRjaGVkIHRleHQgaXMgdHlwZWQgaW50byBpdC4gWW91J2xsIHVzdWFsbHkgd2FudCB0byBzdGFydCB5b3VyXG5yZWdleHAgd2l0aCBgXmAgdG8gdGhhdCBpdCBpcyBvbmx5IG1hdGNoZWQgYXQgdGhlIHN0YXJ0IG9mIGFcbnRleHRibG9jay4gVGhlIG9wdGlvbmFsIGBnZXRBdHRyc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGVcbnRoZSBuZXcgbm9kZSdzIGF0dHJpYnV0ZXMsIGFuZCB3b3JrcyB0aGUgc2FtZSBhcyBpbiB0aGVcbmB3cmFwcGluZ0lucHV0UnVsZWAgZnVuY3Rpb24uXG4qL1xuZnVuY3Rpb24gdGV4dGJsb2NrVHlwZUlucHV0UnVsZShyZWdleHAsIG5vZGVUeXBlLCBnZXRBdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gbmV3IElucHV0UnVsZShyZWdleHAsIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgbGV0ICRzdGFydCA9IHN0YXRlLmRvYy5yZXNvbHZlKHN0YXJ0KTtcbiAgICAgICAgbGV0IGF0dHJzID0gZ2V0QXR0cnMgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGdldEF0dHJzKG1hdGNoKSA6IGdldEF0dHJzO1xuICAgICAgICBpZiAoISRzdGFydC5ub2RlKC0xKS5jYW5SZXBsYWNlV2l0aCgkc3RhcnQuaW5kZXgoLTEpLCAkc3RhcnQuaW5kZXhBZnRlcigtMSksIG5vZGVUeXBlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gc3RhdGUudHJcbiAgICAgICAgICAgIC5kZWxldGUoc3RhcnQsIGVuZClcbiAgICAgICAgICAgIC5zZXRCbG9ja1R5cGUoc3RhcnQsIHN0YXJ0LCBub2RlVHlwZSwgYXR0cnMpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgeyBJbnB1dFJ1bGUsIGNsb3NlRG91YmxlUXVvdGUsIGNsb3NlU2luZ2xlUXVvdGUsIGVsbGlwc2lzLCBlbURhc2gsIGlucHV0UnVsZXMsIG9wZW5Eb3VibGVRdW90ZSwgb3BlblNpbmdsZVF1b3RlLCBzbWFydFF1b3RlcywgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSwgdW5kb0lucHV0UnVsZSwgd3JhcHBpbmdJbnB1dFJ1bGUgfTtcbiIsImltcG9ydCB7IGtleU5hbWUsIGJhc2UgfSBmcm9tICd3M2Mta2V5bmFtZSc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbmNvbnN0IG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjfGlQKGhvbmV8W29hXWQpLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk7XG5jb25zdCB3aW5kb3dzID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9XaW4vLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleU5hbWUobmFtZSkge1xuICAgIGxldCBwYXJ0cyA9IG5hbWUuc3BsaXQoLy0oPyEkKS8pLCByZXN1bHQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICBpZiAocmVzdWx0ID09IFwiU3BhY2VcIilcbiAgICAgICAgcmVzdWx0ID0gXCIgXCI7XG4gICAgbGV0IGFsdCwgY3RybCwgc2hpZnQsIG1ldGE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IG1vZCA9IHBhcnRzW2ldO1xuICAgICAgICBpZiAoL14oY21kfG1ldGF8bSkkL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgbWV0YSA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGFsdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBzaGlmdCA9IHRydWU7XG4gICAgICAgIGVsc2UgaWYgKC9ebW9kJC9pLnRlc3QobW9kKSkge1xuICAgICAgICAgICAgaWYgKG1hYylcbiAgICAgICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHJsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbml6ZWQgbW9kaWZpZXIgbmFtZTogXCIgKyBtb2QpO1xuICAgIH1cbiAgICBpZiAoYWx0KVxuICAgICAgICByZXN1bHQgPSBcIkFsdC1cIiArIHJlc3VsdDtcbiAgICBpZiAoY3RybClcbiAgICAgICAgcmVzdWx0ID0gXCJDdHJsLVwiICsgcmVzdWx0O1xuICAgIGlmIChtZXRhKVxuICAgICAgICByZXN1bHQgPSBcIk1ldGEtXCIgKyByZXN1bHQ7XG4gICAgaWYgKHNoaWZ0KVxuICAgICAgICByZXN1bHQgPSBcIlNoaWZ0LVwiICsgcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemUobWFwKSB7XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IHByb3AgaW4gbWFwKVxuICAgICAgICBjb3B5W25vcm1hbGl6ZUtleU5hbWUocHJvcCldID0gbWFwW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuZnVuY3Rpb24gbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBzaGlmdCA9IHRydWUpIHtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICBuYW1lID0gXCJBbHQtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICBuYW1lID0gXCJDdHJsLVwiICsgbmFtZTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSlcbiAgICAgICAgbmFtZSA9IFwiTWV0YS1cIiArIG5hbWU7XG4gICAgaWYgKHNoaWZ0ICYmIGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICBuYW1lID0gXCJTaGlmdC1cIiArIG5hbWU7XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vKipcbkNyZWF0ZSBhIGtleW1hcCBwbHVnaW4gZm9yIHRoZSBnaXZlbiBzZXQgb2YgYmluZGluZ3MuXG5cbkJpbmRpbmdzIHNob3VsZCBtYXAga2V5IG5hbWVzIHRvIFtjb21tYW5kXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMpLXN0eWxlXG5mdW5jdGlvbnMsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdpdGggYChFZGl0b3JTdGF0ZSwgZGlzcGF0Y2gsXG5FZGl0b3JWaWV3KWAgYXJndW1lbnRzLCBhbmQgc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhleSd2ZSBoYW5kbGVkXG50aGUga2V5LiBOb3RlIHRoYXQgdGhlIHZpZXcgYXJndW1lbnQgaXNuJ3QgcGFydCBvZiB0aGUgY29tbWFuZFxucHJvdG9jb2wsIGJ1dCBjYW4gYmUgdXNlZCBhcyBhbiBlc2NhcGUgaGF0Y2ggaWYgYSBiaW5kaW5nIG5lZWRzIHRvXG5kaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBVSS5cblxuS2V5IG5hbWVzIG1heSBiZSBzdHJpbmdzIGxpa2UgYFwiU2hpZnQtQ3RybC1FbnRlclwiYOKAlGEga2V5XG5pZGVudGlmaWVyIHByZWZpeGVkIHdpdGggemVybyBvciBtb3JlIG1vZGlmaWVycy4gS2V5IGlkZW50aWZpZXJzXG5hcmUgYmFzZWQgb24gdGhlIHN0cmluZ3MgdGhhdCBjYW4gYXBwZWFyIGluXG5bYEtleUV2ZW50LmtleWBdKGh0dHBzOmRldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXkpLlxuVXNlIGxvd2VyY2FzZSBsZXR0ZXJzIHRvIHJlZmVyIHRvIGxldHRlciBrZXlzIChvciB1cHBlcmNhc2UgbGV0dGVyc1xuaWYgeW91IHdhbnQgc2hpZnQgdG8gYmUgaGVsZCkuIFlvdSBtYXkgdXNlIGBcIlNwYWNlXCJgIGFzIGFuIGFsaWFzXG5mb3IgdGhlIGBcIiBcImAgbmFtZS5cblxuTW9kaWZpZXJzIGNhbiBiZSBnaXZlbiBpbiBhbnkgb3JkZXIuIGBTaGlmdC1gIChvciBgcy1gKSwgYEFsdC1gIChvclxuYGEtYCksIGBDdHJsLWAgKG9yIGBjLWAgb3IgYENvbnRyb2wtYCkgYW5kIGBDbWQtYCAob3IgYG0tYCBvclxuYE1ldGEtYCkgYXJlIHJlY29nbml6ZWQuIEZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgaG9sZGluZ1xuc2hpZnQsIHRoZSBgU2hpZnQtYCBwcmVmaXggaXMgaW1wbGllZCwgYW5kIHNob3VsZCBub3QgYmUgYWRkZWRcbmV4cGxpY2l0bHkuXG5cbllvdSBjYW4gdXNlIGBNb2QtYCBhcyBhIHNob3J0aGFuZCBmb3IgYENtZC1gIG9uIE1hYyBhbmQgYEN0cmwtYCBvblxub3RoZXIgcGxhdGZvcm1zLlxuXG5Zb3UgY2FuIGFkZCBtdWx0aXBsZSBrZXltYXAgcGx1Z2lucyB0byBhbiBlZGl0b3IuIFRoZSBvcmRlciBpblxud2hpY2ggdGhleSBhcHBlYXIgZGV0ZXJtaW5lcyB0aGVpciBwcmVjZWRlbmNlICh0aGUgb25lcyBlYXJseSBpblxudGhlIGFycmF5IGdldCB0byBkaXNwYXRjaCBmaXJzdCkuXG4qL1xuZnVuY3Rpb24ga2V5bWFwKGJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oeyBwcm9wczogeyBoYW5kbGVLZXlEb3duOiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykgfSB9KTtcbn1cbi8qKlxuR2l2ZW4gYSBzZXQgb2YgYmluZGluZ3MgKHVzaW5nIHRoZSBzYW1lIGZvcm1hdCBhc1xuW2BrZXltYXBgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8ja2V5bWFwLmtleW1hcCkpLCByZXR1cm4gYSBba2V5ZG93blxuaGFuZGxlcl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlS2V5RG93bikgdGhhdCBoYW5kbGVzIHRoZW0uXG4qL1xuZnVuY3Rpb24ga2V5ZG93bkhhbmRsZXIoYmluZGluZ3MpIHtcbiAgICBsZXQgbWFwID0gbm9ybWFsaXplKGJpbmRpbmdzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZpZXcsIGV2ZW50KSB7XG4gICAgICAgIGxldCBuYW1lID0ga2V5TmFtZShldmVudCksIGJhc2VOYW1lLCBkaXJlY3QgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50KV07XG4gICAgICAgIGlmIChkaXJlY3QgJiYgZGlyZWN0KHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gsIHZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIEEgY2hhcmFjdGVyIGtleVxuICAgICAgICBpZiAobmFtZS5sZW5ndGggPT0gMSAmJiBuYW1lICE9IFwiIFwiKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBuYW1lIHdhcyBhbHJlYWR5IG1vZGlmaWVkIGJ5IHNoaWZ0LCB0cnkgbG9va2luZ1xuICAgICAgICAgICAgICAgIC8vIGl0IHVwIHdpdGhvdXQgaXRzIHNoaWZ0IG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgbGV0IG5vU2hpZnQgPSBtYXBbbW9kaWZpZXJzKG5hbWUsIGV2ZW50LCBmYWxzZSldO1xuICAgICAgICAgICAgICAgIGlmIChub1NoaWZ0ICYmIG5vU2hpZnQodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5KSAmJlxuICAgICAgICAgICAgICAgIC8vIEN0cmwtQWx0IG1heSBiZSB1c2VkIGZvciBBbHRHciBvbiBXaW5kb3dzXG4gICAgICAgICAgICAgICAgISh3aW5kb3dzICYmIGV2ZW50LmN0cmxLZXkgJiYgZXZlbnQuYWx0S2V5KSAmJlxuICAgICAgICAgICAgICAgIChiYXNlTmFtZSA9IGJhc2VbZXZlbnQua2V5Q29kZV0pICYmIGJhc2VOYW1lICE9IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgZmFsbGluZyBiYWNrIHRvIHRoZSBrZXlDb2RlIHdoZW4gdGhlcmUncyBhIG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgLy8gYWN0aXZlIG9yIHRoZSBjaGFyYWN0ZXIgcHJvZHVjZWQgaXNuJ3QgQVNDSUksIGFuZCBvdXIgdGFibGVcbiAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcyBhIGRpZmZlcmVudCBuYW1lIGZyb20gdGhlIHRoZSBrZXlDb2RlLiBTZWUgIzY2OCxcbiAgICAgICAgICAgICAgICAvLyAjMTA2MCwgIzE1MjkuXG4gICAgICAgICAgICAgICAgbGV0IGZyb21Db2RlID0gbWFwW21vZGlmaWVycyhiYXNlTmFtZSwgZXZlbnQpXTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbUNvZGUgJiYgZnJvbUNvZGUodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBrZXlkb3duSGFuZGxlciwga2V5bWFwIH07XG4iLCJpbXBvcnQgeyBTY2hlbWEsIE1hcmsgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgTWFya2Rvd25JdCBmcm9tICdtYXJrZG93bi1pdCc7XG5cbi8qKlxuRG9jdW1lbnQgc2NoZW1hIGZvciB0aGUgZGF0YSBtb2RlbCB1c2VkIGJ5IENvbW1vbk1hcmsuXG4qL1xuY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYSh7XG4gICAgbm9kZXM6IHtcbiAgICAgICAgZG9jOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiXG4gICAgICAgIH0sXG4gICAgICAgIHBhcmFncmFwaDoge1xuICAgICAgICAgICAgY29udGVudDogXCJpbmxpbmUqXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJwXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcInBcIiwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgYmxvY2txdW90ZToge1xuICAgICAgICAgICAgY29udGVudDogXCJibG9jaytcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImJsb2NrcXVvdGVcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiYmxvY2txdW90ZVwiLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBob3Jpem9udGFsX3J1bGU6IHtcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImhyXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImRpdlwiLCBbXCJoclwiXV07IH1cbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGluZzoge1xuICAgICAgICAgICAgYXR0cnM6IHsgbGV2ZWw6IHsgZGVmYXVsdDogMSB9IH0sXG4gICAgICAgICAgICBjb250ZW50OiBcIih0ZXh0IHwgaW1hZ2UpKlwiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoMVwiLCBhdHRyczogeyBsZXZlbDogMSB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDJcIiwgYXR0cnM6IHsgbGV2ZWw6IDIgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImgzXCIsIGF0dHJzOiB7IGxldmVsOiAzIH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoNFwiLCBhdHRyczogeyBsZXZlbDogNCB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDVcIiwgYXR0cnM6IHsgbGV2ZWw6IDUgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImg2XCIsIGF0dHJzOiB7IGxldmVsOiA2IH0gfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBjb2RlX2Jsb2NrOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcInRleHQqXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICAgICAgbWFya3M6IFwiXCIsXG4gICAgICAgICAgICBhdHRyczogeyBwYXJhbXM6IHsgZGVmYXVsdDogXCJcIiB9IH0sXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInByZVwiLCBwcmVzZXJ2ZVdoaXRlc3BhY2U6IFwiZnVsbFwiLCBnZXRBdHRyczogbm9kZSA9PiAoeyBwYXJhbXM6IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYXJhbXNcIikgfHwgXCJcIiB9KSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcInByZVwiLCBub2RlLmF0dHJzLnBhcmFtcyA/IHsgXCJkYXRhLXBhcmFtc1wiOiBub2RlLmF0dHJzLnBhcmFtcyB9IDoge30sIFtcImNvZGVcIiwgMF1dOyB9XG4gICAgICAgIH0sXG4gICAgICAgIG9yZGVyZWRfbGlzdDoge1xuICAgICAgICAgICAgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgYXR0cnM6IHsgb3JkZXI6IHsgZGVmYXVsdDogMSB9LCB0aWdodDogeyBkZWZhdWx0OiBmYWxzZSB9IH0sXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcIm9sXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JkZXI6IGRvbS5oYXNBdHRyaWJ1dGUoXCJzdGFydFwiKSA/ICtkb20uZ2V0QXR0cmlidXRlKFwic3RhcnRcIikgOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZ2h0OiBkb20uaGFzQXR0cmlidXRlKFwiZGF0YS10aWdodFwiKSB9O1xuICAgICAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyID09IDEgPyBudWxsIDogbm9kZS5hdHRycy5vcmRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS10aWdodFwiOiBub2RlLmF0dHJzLnRpZ2h0ID8gXCJ0cnVlXCIgOiBudWxsIH0sIDBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBidWxsZXRfbGlzdDoge1xuICAgICAgICAgICAgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgYXR0cnM6IHsgdGlnaHQ6IHsgZGVmYXVsdDogZmFsc2UgfSB9LFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJ1bFwiLCBnZXRBdHRyczogZG9tID0+ICh7IHRpZ2h0OiBkb20uaGFzQXR0cmlidXRlKFwiZGF0YS10aWdodFwiKSB9KSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcInVsXCIsIHsgXCJkYXRhLXRpZ2h0XCI6IG5vZGUuYXR0cnMudGlnaHQgPyBcInRydWVcIiA6IG51bGwgfSwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgbGlzdF9pdGVtOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiLFxuICAgICAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImxpXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImxpXCIsIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIHRleHQ6IHtcbiAgICAgICAgICAgIGdyb3VwOiBcImlubGluZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIHNyYzoge30sXG4gICAgICAgICAgICAgICAgYWx0OiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICAgICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaW1nW3NyY11cIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogZG9tLmdldEF0dHJpYnV0ZShcInNyY1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogZG9tLmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcImltZ1wiLCBub2RlLmF0dHJzXTsgfVxuICAgICAgICB9LFxuICAgICAgICBoYXJkX2JyZWFrOiB7XG4gICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJiclwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJiclwiXTsgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtYXJrczoge1xuICAgICAgICBlbToge1xuICAgICAgICAgICAgcGFyc2VET006IFtcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJpXCIgfSwgeyB0YWc6IFwiZW1cIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1pdGFsaWNcIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1ub3JtYWxcIiwgY2xlYXJNYXJrOiBtID0+IG0udHlwZS5uYW1lID09IFwiZW1cIiB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJlbVwiXTsgfVxuICAgICAgICB9LFxuICAgICAgICBzdHJvbmc6IHtcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwic3Ryb25nXCIgfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJiXCIsIGdldEF0dHJzOiBub2RlID0+IG5vZGUuc3R5bGUuZm9udFdlaWdodCAhPSBcIm5vcm1hbFwiICYmIG51bGwgfSxcbiAgICAgICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtd2VpZ2h0PTQwMFwiLCBjbGVhck1hcms6IG0gPT4gbS50eXBlLm5hbWUgPT0gXCJzdHJvbmdcIiB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHRcIiwgZ2V0QXR0cnM6IHZhbHVlID0+IC9eKGJvbGQoZXIpP3xbNS05XVxcZHsyLH0pJC8udGVzdCh2YWx1ZSkgJiYgbnVsbCB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJzdHJvbmdcIl07IH1cbiAgICAgICAgfSxcbiAgICAgICAgbGluazoge1xuICAgICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgICAgICBocmVmOiB7fSxcbiAgICAgICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJhW2hyZWZdXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaHJlZjogZG9tLmdldEF0dHJpYnV0ZShcImhyZWZcIiksIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgfTtcbiAgICAgICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcImFcIiwgbm9kZS5hdHRyc107IH1cbiAgICAgICAgfSxcbiAgICAgICAgY29kZToge1xuICAgICAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiY29kZVwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJjb2RlXCJdOyB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLy8gQHRzLWlnbm9yZVxuZnVuY3Rpb24gbWF5YmVNZXJnZShhLCBiKSB7XG4gICAgaWYgKGEuaXNUZXh0ICYmIGIuaXNUZXh0ICYmIE1hcmsuc2FtZVNldChhLm1hcmtzLCBiLm1hcmtzKSlcbiAgICAgICAgcmV0dXJuIGEud2l0aFRleHQoYS50ZXh0ICsgYi50ZXh0KTtcbn1cbi8vIE9iamVjdCB1c2VkIHRvIHRyYWNrIHRoZSBjb250ZXh0IG9mIGEgcnVubmluZyBwYXJzZS5cbmNsYXNzIE1hcmtkb3duUGFyc2VTdGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCB0b2tlbkhhbmRsZXJzKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnRva2VuSGFuZGxlcnMgPSB0b2tlbkhhbmRsZXJzO1xuICAgICAgICB0aGlzLnN0YWNrID0gW3sgdHlwZTogc2NoZW1hLnRvcE5vZGVUeXBlLCBhdHRyczogbnVsbCwgY29udGVudDogW10sIG1hcmtzOiBNYXJrLm5vbmUgfV07XG4gICAgfVxuICAgIHRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcHVzaChlbHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy50b3AoKS5jb250ZW50LnB1c2goZWx0KTtcbiAgICB9XG4gICAgLy8gQWRkcyB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQsXG4gICAgLy8gdXNpbmcgdGhlIGN1cnJlbnQgbWFya3MgYXMgc3R5bGluZy5cbiAgICBhZGRUZXh0KHRleHQpIHtcbiAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKSwgbm9kZXMgPSB0b3AuY29udGVudCwgbGFzdCA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuc2NoZW1hLnRleHQodGV4dCwgdG9wLm1hcmtzKSwgbWVyZ2VkO1xuICAgICAgICBpZiAobGFzdCAmJiAobWVyZ2VkID0gbWF5YmVNZXJnZShsYXN0LCBub2RlKSkpXG4gICAgICAgICAgICBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSA9IG1lcmdlZDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgLy8gQWRkcyB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcy5cbiAgICBvcGVuTWFyayhtYXJrKSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCgpO1xuICAgICAgICB0b3AubWFya3MgPSBtYXJrLmFkZFRvU2V0KHRvcC5tYXJrcyk7XG4gICAgfVxuICAgIC8vIFJlbW92ZXMgdGhlIGdpdmVuIG1hcmsgZnJvbSB0aGUgc2V0IG9mIGFjdGl2ZSBtYXJrcy5cbiAgICBjbG9zZU1hcmsobWFyaykge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKTtcbiAgICAgICAgdG9wLm1hcmtzID0gbWFyay5yZW1vdmVGcm9tU2V0KHRvcC5tYXJrcyk7XG4gICAgfVxuICAgIHBhcnNlVG9rZW5zKHRva3MpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdG9rID0gdG9rc1tpXTtcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gdGhpcy50b2tlbkhhbmRsZXJzW3Rvay50eXBlXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiB0eXBlIGBcIiArIHRvay50eXBlICsgXCJgIG5vdCBzdXBwb3J0ZWQgYnkgTWFya2Rvd24gcGFyc2VyXCIpO1xuICAgICAgICAgICAgaGFuZGxlcih0aGlzLCB0b2ssIHRva3MsIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBhIG5vZGUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgYWRkTm9kZSh0eXBlLCBhdHRycywgY29udGVudCkge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AoKTtcbiAgICAgICAgbGV0IG5vZGUgPSB0eXBlLmNyZWF0ZUFuZEZpbGwoYXR0cnMsIGNvbnRlbnQsIHRvcCA/IHRvcC5tYXJrcyA6IFtdKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMucHVzaChub2RlKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIC8vIFdyYXAgc3Vic2VxdWVudCBjb250ZW50IGluIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAgICBvcGVuTm9kZSh0eXBlLCBhdHRycykge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyB0eXBlOiB0eXBlLCBhdHRyczogYXR0cnMsIGNvbnRlbnQ6IFtdLCBtYXJrczogTWFyay5ub25lIH0pO1xuICAgIH1cbiAgICAvLyBDbG9zZSBhbmQgcmV0dXJuIHRoZSBub2RlIHRoYXQgaXMgY3VycmVudGx5IG9uIHRvcCBvZiB0aGUgc3RhY2suXG4gICAgY2xvc2VOb2RlKCkge1xuICAgICAgICBsZXQgaW5mbyA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZE5vZGUoaW5mby50eXBlLCBpbmZvLmF0dHJzLCBpbmZvLmNvbnRlbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGF0dHJzKHNwZWMsIHRva2VuLCB0b2tlbnMsIGkpIHtcbiAgICBpZiAoc3BlYy5nZXRBdHRycylcbiAgICAgICAgcmV0dXJuIHNwZWMuZ2V0QXR0cnModG9rZW4sIHRva2VucywgaSk7XG4gICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdoZW4gYGF0dHJzYCBpcyBhIEZ1bmN0aW9uXG4gICAgZWxzZSBpZiAoc3BlYy5hdHRycyBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXR1cm4gc3BlYy5hdHRycyh0b2tlbik7XG4gICAgZWxzZVxuICAgICAgICByZXR1cm4gc3BlYy5hdHRycztcbn1cbi8vIENvZGUgY29udGVudCBpcyByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSB0b2tlbiB3aXRoIGEgYGNvbnRlbnRgXG4vLyBwcm9wZXJ0eSBpbiBNYXJrZG93bi1pdC5cbmZ1bmN0aW9uIG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSB7XG4gICAgcmV0dXJuIHNwZWMubm9DbG9zZVRva2VuIHx8IHR5cGUgPT0gXCJjb2RlX2lubGluZVwiIHx8IHR5cGUgPT0gXCJjb2RlX2Jsb2NrXCIgfHwgdHlwZSA9PSBcImZlbmNlXCI7XG59XG5mdW5jdGlvbiB3aXRob3V0VHJhaWxpbmdOZXdsaW5lKHN0cikge1xuICAgIHJldHVybiBzdHJbc3RyLmxlbmd0aCAtIDFdID09IFwiXFxuXCIgPyBzdHIuc2xpY2UoMCwgc3RyLmxlbmd0aCAtIDEpIDogc3RyO1xufVxuZnVuY3Rpb24gbm9PcCgpIHsgfVxuZnVuY3Rpb24gdG9rZW5IYW5kbGVycyhzY2hlbWEsIHRva2Vucykge1xuICAgIGxldCBoYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgdHlwZSBpbiB0b2tlbnMpIHtcbiAgICAgICAgbGV0IHNwZWMgPSB0b2tlbnNbdHlwZV07XG4gICAgICAgIGlmIChzcGVjLmJsb2NrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZVR5cGUgPSBzY2hlbWEubm9kZVR5cGUoc3BlYy5ibG9jayk7XG4gICAgICAgICAgICBpZiAobm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLm9wZW5Ob2RlKG5vZGVUeXBlLCBhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5hZGRUZXh0KHdpdGhvdXRUcmFpbGluZ05ld2xpbmUodG9rLmNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2xvc2VOb2RlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9vcGVuXCJdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4gc3RhdGUub3Blbk5vZGUobm9kZVR5cGUsIGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX2Nsb3NlXCJdID0gc3RhdGUgPT4gc3RhdGUuY2xvc2VOb2RlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BlYy5ub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZVR5cGUgPSBzY2hlbWEubm9kZVR5cGUoc3BlYy5ub2RlKTtcbiAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4gc3RhdGUuYWRkTm9kZShub2RlVHlwZSwgYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGVjLm1hcmspIHtcbiAgICAgICAgICAgIGxldCBtYXJrVHlwZSA9IHNjaGVtYS5tYXJrc1tzcGVjLm1hcmtdO1xuICAgICAgICAgICAgaWYgKG5vQ2xvc2VUb2tlbihzcGVjLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGVdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5vcGVuTWFyayhtYXJrVHlwZS5jcmVhdGUoYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmFkZFRleHQod2l0aG91dFRyYWlsaW5nTmV3bGluZSh0b2suY29udGVudCkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jbG9zZU1hcmsobWFya1R5cGUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfb3BlblwiXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHN0YXRlLm9wZW5NYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfY2xvc2VcIl0gPSBzdGF0ZSA9PiBzdGF0ZS5jbG9zZU1hcmsobWFya1R5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwZWMuaWdub3JlKSB7XG4gICAgICAgICAgICBpZiAobm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSBub09wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX29wZW5cIl0gPSBub09wO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9jbG9zZVwiXSA9IG5vT3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlVucmVjb2duaXplZCBwYXJzaW5nIHNwZWMgXCIgKyBKU09OLnN0cmluZ2lmeShzcGVjKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlcnMudGV4dCA9IChzdGF0ZSwgdG9rKSA9PiBzdGF0ZS5hZGRUZXh0KHRvay5jb250ZW50KTtcbiAgICBoYW5kbGVycy5pbmxpbmUgPSAoc3RhdGUsIHRvaykgPT4gc3RhdGUucGFyc2VUb2tlbnModG9rLmNoaWxkcmVuKTtcbiAgICBoYW5kbGVycy5zb2Z0YnJlYWsgPSBoYW5kbGVycy5zb2Z0YnJlYWsgfHwgKHN0YXRlID0+IHN0YXRlLmFkZFRleHQoXCIgXCIpKTtcbiAgICByZXR1cm4gaGFuZGxlcnM7XG59XG4vKipcbkEgY29uZmlndXJhdGlvbiBvZiBhIE1hcmtkb3duIHBhcnNlci4gU3VjaCBhIHBhcnNlciB1c2VzXG5bbWFya2Rvd24taXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdCkgdG9cbnRva2VuaXplIGEgZmlsZSwgYW5kIHRoZW4gcnVucyB0aGUgY3VzdG9tIHJ1bGVzIGl0IGlzIGdpdmVuIG92ZXJcbnRoZSB0b2tlbnMgdG8gY3JlYXRlIGEgUHJvc2VNaXJyb3IgZG9jdW1lbnQgdHJlZS5cbiovXG5jbGFzcyBNYXJrZG93blBhcnNlciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGFyc2VyIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY29uZmlndXJlXG4gICAgdGhlIG1hcmtkb3duLWl0IHBhcnNlciB0byBwYXJzZSB0aGUgZGlhbGVjdCB5b3Ugd2FudCwgYW5kIHByb3ZpZGVcbiAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBQcm9zZU1pcnJvciBlbnRpdGllcyB0aG9zZSB0b2tlbnMgbWFwIHRvIGluXG4gICAgdGhlIGB0b2tlbnNgIG9iamVjdCwgd2hpY2ggbWFwcyB0b2tlbiBuYW1lcyB0byBkZXNjcmlwdGlvbnMgb2ZcbiAgICB3aGF0IHRvIGRvIHdpdGggdGhlbS4gU3VjaCBhIGRlc2NyaXB0aW9uIGlzIGFuIG9iamVjdCwgYW5kIG1heVxuICAgIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBhcnNlcidzIGRvY3VtZW50IHNjaGVtYS5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhpcyBwYXJzZXIncyBtYXJrZG93bi1pdCB0b2tlbml6ZXIuXG4gICAgKi9cbiAgICB0b2tlbml6ZXIsIFxuICAgIC8qKlxuICAgIFRoZSB2YWx1ZSBvZiB0aGUgYHRva2Vuc2Agb2JqZWN0IHVzZWQgdG8gY29uc3RydWN0IHRoaXNcbiAgICBwYXJzZXIuIENhbiBiZSB1c2VmdWwgdG8gY29weSBhbmQgbW9kaWZ5IHRvIGJhc2Ugb3RoZXIgcGFyc2Vyc1xuICAgIG9uLlxuICAgICovXG4gICAgdG9rZW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnRva2VuaXplciA9IHRva2VuaXplcjtcbiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgIHRoaXMudG9rZW5IYW5kbGVycyA9IHRva2VuSGFuZGxlcnMoc2NoZW1hLCB0b2tlbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZSBhIHN0cmluZyBhcyBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykgbWFya3VwLFxuICAgIGFuZCBjcmVhdGUgYSBQcm9zZU1pcnJvciBkb2N1bWVudCBhcyBwcmVzY3JpYmVkIGJ5IHRoaXMgcGFyc2VyJ3NcbiAgICBydWxlcy5cbiAgICBcbiAgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCB3aGVuIGdpdmVuLCBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGVcbiAgICBbTWFya2Rvd25cbiAgICBwYXJzZXJdKGh0dHBzOi8vbWFya2Rvd24taXQuZ2l0aHViLmlvL21hcmtkb3duLWl0LyNNYXJrZG93bkl0LnBhcnNlKS5cbiAgICAqL1xuICAgIHBhcnNlKHRleHQsIG1hcmtkb3duRW52ID0ge30pIHtcbiAgICAgICAgbGV0IHN0YXRlID0gbmV3IE1hcmtkb3duUGFyc2VTdGF0ZSh0aGlzLnNjaGVtYSwgdGhpcy50b2tlbkhhbmRsZXJzKSwgZG9jO1xuICAgICAgICBzdGF0ZS5wYXJzZVRva2Vucyh0aGlzLnRva2VuaXplci5wYXJzZSh0ZXh0LCBtYXJrZG93bkVudikpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBkb2MgPSBzdGF0ZS5jbG9zZU5vZGUoKTtcbiAgICAgICAgfSB3aGlsZSAoc3RhdGUuc3RhY2subGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGRvYyB8fCB0aGlzLnNjaGVtYS50b3BOb2RlVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdElzVGlnaHQodG9rZW5zLCBpKSB7XG4gICAgd2hpbGUgKCsraSA8IHRva2Vucy5sZW5ndGgpXG4gICAgICAgIGlmICh0b2tlbnNbaV0udHlwZSAhPSBcImxpc3RfaXRlbV9vcGVuXCIpXG4gICAgICAgICAgICByZXR1cm4gdG9rZW5zW2ldLmhpZGRlbjtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbkEgcGFyc2VyIHBhcnNpbmcgdW5leHRlbmRlZCBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLyksXG53aXRob3V0IGlubGluZSBIVE1MLCBhbmQgcHJvZHVjaW5nIGEgZG9jdW1lbnQgaW4gdGhlIGJhc2ljIHNjaGVtYS5cbiovXG5jb25zdCBkZWZhdWx0TWFya2Rvd25QYXJzZXIgPSBuZXcgTWFya2Rvd25QYXJzZXIoc2NoZW1hLCBNYXJrZG93bkl0KFwiY29tbW9ubWFya1wiLCB7IGh0bWw6IGZhbHNlIH0pLCB7XG4gICAgYmxvY2txdW90ZTogeyBibG9jazogXCJibG9ja3F1b3RlXCIgfSxcbiAgICBwYXJhZ3JhcGg6IHsgYmxvY2s6IFwicGFyYWdyYXBoXCIgfSxcbiAgICBsaXN0X2l0ZW06IHsgYmxvY2s6IFwibGlzdF9pdGVtXCIgfSxcbiAgICBidWxsZXRfbGlzdDogeyBibG9jazogXCJidWxsZXRfbGlzdFwiLCBnZXRBdHRyczogKF8sIHRva2VucywgaSkgPT4gKHsgdGlnaHQ6IGxpc3RJc1RpZ2h0KHRva2VucywgaSkgfSkgfSxcbiAgICBvcmRlcmVkX2xpc3Q6IHsgYmxvY2s6IFwib3JkZXJlZF9saXN0XCIsIGdldEF0dHJzOiAodG9rLCB0b2tlbnMsIGkpID0+ICh7XG4gICAgICAgICAgICBvcmRlcjogK3Rvay5hdHRyR2V0KFwic3RhcnRcIikgfHwgMSxcbiAgICAgICAgICAgIHRpZ2h0OiBsaXN0SXNUaWdodCh0b2tlbnMsIGkpXG4gICAgICAgIH0pIH0sXG4gICAgaGVhZGluZzogeyBibG9jazogXCJoZWFkaW5nXCIsIGdldEF0dHJzOiB0b2sgPT4gKHsgbGV2ZWw6ICt0b2sudGFnLnNsaWNlKDEpIH0pIH0sXG4gICAgY29kZV9ibG9jazogeyBibG9jazogXCJjb2RlX2Jsb2NrXCIsIG5vQ2xvc2VUb2tlbjogdHJ1ZSB9LFxuICAgIGZlbmNlOiB7IGJsb2NrOiBcImNvZGVfYmxvY2tcIiwgZ2V0QXR0cnM6IHRvayA9PiAoeyBwYXJhbXM6IHRvay5pbmZvIHx8IFwiXCIgfSksIG5vQ2xvc2VUb2tlbjogdHJ1ZSB9LFxuICAgIGhyOiB7IG5vZGU6IFwiaG9yaXpvbnRhbF9ydWxlXCIgfSxcbiAgICBpbWFnZTogeyBub2RlOiBcImltYWdlXCIsIGdldEF0dHJzOiB0b2sgPT4gKHtcbiAgICAgICAgICAgIHNyYzogdG9rLmF0dHJHZXQoXCJzcmNcIiksXG4gICAgICAgICAgICB0aXRsZTogdG9rLmF0dHJHZXQoXCJ0aXRsZVwiKSB8fCBudWxsLFxuICAgICAgICAgICAgYWx0OiB0b2suY2hpbGRyZW5bMF0gJiYgdG9rLmNoaWxkcmVuWzBdLmNvbnRlbnQgfHwgbnVsbFxuICAgICAgICB9KSB9LFxuICAgIGhhcmRicmVhazogeyBub2RlOiBcImhhcmRfYnJlYWtcIiB9LFxuICAgIGVtOiB7IG1hcms6IFwiZW1cIiB9LFxuICAgIHN0cm9uZzogeyBtYXJrOiBcInN0cm9uZ1wiIH0sXG4gICAgbGluazogeyBtYXJrOiBcImxpbmtcIiwgZ2V0QXR0cnM6IHRvayA9PiAoe1xuICAgICAgICAgICAgaHJlZjogdG9rLmF0dHJHZXQoXCJocmVmXCIpLFxuICAgICAgICAgICAgdGl0bGU6IHRvay5hdHRyR2V0KFwidGl0bGVcIikgfHwgbnVsbFxuICAgICAgICB9KSB9LFxuICAgIGNvZGVfaW5saW5lOiB7IG1hcms6IFwiY29kZVwiLCBub0Nsb3NlVG9rZW46IHRydWUgfVxufSk7XG5cbmNvbnN0IGJsYW5rTWFyayA9IHsgb3BlbjogXCJcIiwgY2xvc2U6IFwiXCIsIG1peGFibGU6IHRydWUgfTtcbi8qKlxuQSBzcGVjaWZpY2F0aW9uIGZvciBzZXJpYWxpemluZyBhIFByb3NlTWlycm9yIGRvY3VtZW50IGFzXG5NYXJrZG93bi9Db21tb25NYXJrIHRleHQuXG4qL1xuY2xhc3MgTWFya2Rvd25TZXJpYWxpemVyIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBzZXJpYWxpemVyIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIFRoZSBgbm9kZXNgXG4gICAgb2JqZWN0IHNob3VsZCBtYXAgbm9kZSBuYW1lcyBpbiBhIGdpdmVuIHNjaGVtYSB0byBmdW5jdGlvbiB0aGF0XG4gICAgdGFrZSBhIHNlcmlhbGl6ZXIgc3RhdGUgYW5kIHN1Y2ggYSBub2RlLCBhbmQgc2VyaWFsaXplIHRoZSBub2RlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2VyaWFsaXplciBmdW5jdGlvbnMgZm9yIHRoaXMgc2VyaWFsaXplci5cbiAgICAqL1xuICAgIG5vZGVzLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayBzZXJpYWxpemVyIGluZm8uXG4gICAgKi9cbiAgICBtYXJrcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgdG9cbiAgICBbQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLykuXG4gICAgKi9cbiAgICBzZXJpYWxpemUoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgc3RhdGUgPSBuZXcgTWFya2Rvd25TZXJpYWxpemVyU3RhdGUodGhpcy5ub2RlcywgdGhpcy5tYXJrcywgb3B0aW9ucyk7XG4gICAgICAgIHN0YXRlLnJlbmRlckNvbnRlbnQoY29udGVudCk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5vdXQ7XG4gICAgfVxufVxuLyoqXG5BIHNlcmlhbGl6ZXIgZm9yIHRoZSBbYmFzaWMgc2NoZW1hXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hKS5cbiovXG5jb25zdCBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyID0gbmV3IE1hcmtkb3duU2VyaWFsaXplcih7XG4gICAgYmxvY2txdW90ZShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cmFwQmxvY2soXCI+IFwiLCBudWxsLCBub2RlLCAoKSA9PiBzdGF0ZS5yZW5kZXJDb250ZW50KG5vZGUpKTtcbiAgICB9LFxuICAgIGNvZGVfYmxvY2soc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmcm9udCBtYXR0ZXIgZmVuY2VzIGFyZSBsb25nZXIgdGhhbiBhbnkgZGFzaCBzZXF1ZW5jZSB3aXRoaW4gaXRcbiAgICAgICAgY29uc3QgYmFja3RpY2tzID0gbm9kZS50ZXh0Q29udGVudC5tYXRjaCgvYHszLH0vZ20pO1xuICAgICAgICBjb25zdCBmZW5jZSA9IGJhY2t0aWNrcyA/IChiYWNrdGlja3Muc29ydCgpLnNsaWNlKC0xKVswXSArIFwiYFwiKSA6IFwiYGBgXCI7XG4gICAgICAgIHN0YXRlLndyaXRlKGZlbmNlICsgKG5vZGUuYXR0cnMucGFyYW1zIHx8IFwiXCIpICsgXCJcXG5cIik7XG4gICAgICAgIHN0YXRlLnRleHQobm9kZS50ZXh0Q29udGVudCwgZmFsc2UpO1xuICAgICAgICAvLyBBZGQgYSBuZXdsaW5lIHRvIHRoZSBjdXJyZW50IGNvbnRlbnQgYmVmb3JlIGFkZGluZyBjbG9zaW5nIG1hcmtlclxuICAgICAgICBzdGF0ZS53cml0ZShcIlxcblwiKTtcbiAgICAgICAgc3RhdGUud3JpdGUoZmVuY2UpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZyhzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS53cml0ZShzdGF0ZS5yZXBlYXQoXCIjXCIsIG5vZGUuYXR0cnMubGV2ZWwpICsgXCIgXCIpO1xuICAgICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSwgZmFsc2UpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaG9yaXpvbnRhbF9ydWxlKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKG5vZGUuYXR0cnMubWFya3VwIHx8IFwiLS0tXCIpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgYnVsbGV0X2xpc3Qoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUucmVuZGVyTGlzdChub2RlLCBcIiAgXCIsICgpID0+IChub2RlLmF0dHJzLmJ1bGxldCB8fCBcIipcIikgKyBcIiBcIik7XG4gICAgfSxcbiAgICBvcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZS5hdHRycy5vcmRlciB8fCAxO1xuICAgICAgICBsZXQgbWF4VyA9IFN0cmluZyhzdGFydCArIG5vZGUuY2hpbGRDb3VudCAtIDEpLmxlbmd0aDtcbiAgICAgICAgbGV0IHNwYWNlID0gc3RhdGUucmVwZWF0KFwiIFwiLCBtYXhXICsgMik7XG4gICAgICAgIHN0YXRlLnJlbmRlckxpc3Qobm9kZSwgc3BhY2UsIGkgPT4ge1xuICAgICAgICAgICAgbGV0IG5TdHIgPSBTdHJpbmcoc3RhcnQgKyBpKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5yZXBlYXQoXCIgXCIsIG1heFcgLSBuU3RyLmxlbmd0aCkgKyBuU3RyICsgXCIuIFwiO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGxpc3RfaXRlbShzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS5yZW5kZXJDb250ZW50KG5vZGUpO1xuICAgIH0sXG4gICAgcGFyYWdyYXBoKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGltYWdlKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKFwiIVtcIiArIHN0YXRlLmVzYyhub2RlLmF0dHJzLmFsdCB8fCBcIlwiKSArIFwiXShcIiArIG5vZGUuYXR0cnMuc3JjLnJlcGxhY2UoL1tcXChcXCldL2csIFwiXFxcXCQmXCIpICtcbiAgICAgICAgICAgIChub2RlLmF0dHJzLnRpdGxlID8gJyBcIicgKyBub2RlLmF0dHJzLnRpdGxlLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKSArICdcIicgOiBcIlwiKSArIFwiKVwiKTtcbiAgICB9LFxuICAgIGhhcmRfYnJlYWsoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4ICsgMTsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkKGkpLnR5cGUgIT0gbm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUud3JpdGUoXCJcXFxcXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICB9LFxuICAgIHRleHQoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUudGV4dChub2RlLnRleHQsICFzdGF0ZS5pbkF1dG9saW5rKTtcbiAgICB9XG59LCB7XG4gICAgZW06IHsgb3BlbjogXCIqXCIsIGNsb3NlOiBcIipcIiwgbWl4YWJsZTogdHJ1ZSwgZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlOiB0cnVlIH0sXG4gICAgc3Ryb25nOiB7IG9wZW46IFwiKipcIiwgY2xvc2U6IFwiKipcIiwgbWl4YWJsZTogdHJ1ZSwgZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlOiB0cnVlIH0sXG4gICAgbGluazoge1xuICAgICAgICBvcGVuKHN0YXRlLCBtYXJrLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgICAgICBzdGF0ZS5pbkF1dG9saW5rID0gaXNQbGFpblVSTChtYXJrLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbkF1dG9saW5rID8gXCI8XCIgOiBcIltcIjtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2Uoc3RhdGUsIG1hcmssIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGxldCB7IGluQXV0b2xpbmsgfSA9IHN0YXRlO1xuICAgICAgICAgICAgc3RhdGUuaW5BdXRvbGluayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBpbkF1dG9saW5rID8gXCI+XCJcbiAgICAgICAgICAgICAgICA6IFwiXShcIiArIG1hcmsuYXR0cnMuaHJlZi5yZXBsYWNlKC9bXFwoXFwpXCJdL2csIFwiXFxcXCQmXCIpICsgKG1hcmsuYXR0cnMudGl0bGUgPyBgIFwiJHttYXJrLmF0dHJzLnRpdGxlLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cImAgOiBcIlwiKSArIFwiKVwiO1xuICAgICAgICB9LFxuICAgICAgICBtaXhhYmxlOiB0cnVlXG4gICAgfSxcbiAgICBjb2RlOiB7IG9wZW4oX3N0YXRlLCBfbWFyaywgcGFyZW50LCBpbmRleCkgeyByZXR1cm4gYmFja3RpY2tzRm9yKHBhcmVudC5jaGlsZChpbmRleCksIC0xKTsgfSxcbiAgICAgICAgY2xvc2UoX3N0YXRlLCBfbWFyaywgcGFyZW50LCBpbmRleCkgeyByZXR1cm4gYmFja3RpY2tzRm9yKHBhcmVudC5jaGlsZChpbmRleCAtIDEpLCAxKTsgfSxcbiAgICAgICAgZXNjYXBlOiBmYWxzZSB9XG59KTtcbmZ1bmN0aW9uIGJhY2t0aWNrc0Zvcihub2RlLCBzaWRlKSB7XG4gICAgbGV0IHRpY2tzID0gL2ArL2csIG0sIGxlbiA9IDA7XG4gICAgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICB3aGlsZSAobSA9IHRpY2tzLmV4ZWMobm9kZS50ZXh0KSlcbiAgICAgICAgICAgIGxlbiA9IE1hdGgubWF4KGxlbiwgbVswXS5sZW5ndGgpO1xuICAgIGxldCByZXN1bHQgPSBsZW4gPiAwICYmIHNpZGUgPiAwID8gXCIgYFwiIDogXCJgXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgICAgcmVzdWx0ICs9IFwiYFwiO1xuICAgIGlmIChsZW4gPiAwICYmIHNpZGUgPCAwKVxuICAgICAgICByZXN1bHQgKz0gXCIgXCI7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzUGxhaW5VUkwobGluaywgcGFyZW50LCBpbmRleCkge1xuICAgIGlmIChsaW5rLmF0dHJzLnRpdGxlIHx8ICEvXlxcdys6Ly50ZXN0KGxpbmsuYXR0cnMuaHJlZikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgY29udGVudCA9IHBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgaWYgKCFjb250ZW50LmlzVGV4dCB8fCBjb250ZW50LnRleHQgIT0gbGluay5hdHRycy5ocmVmIHx8IGNvbnRlbnQubWFya3NbY29udGVudC5tYXJrcy5sZW5ndGggLSAxXSAhPSBsaW5rKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50IC0gMSB8fCAhbGluay5pc0luU2V0KHBhcmVudC5jaGlsZChpbmRleCArIDEpLm1hcmtzKTtcbn1cbi8qKlxuVGhpcyBpcyBhbiBvYmplY3QgdXNlZCB0byB0cmFjayBzdGF0ZSBhbmQgZXhwb3NlXG5tZXRob2RzIHJlbGF0ZWQgdG8gbWFya2Rvd24gc2VyaWFsaXphdGlvbi4gSW5zdGFuY2VzIGFyZSBwYXNzZWQgdG9cbm5vZGUgYW5kIG1hcmsgc2VyaWFsaXphdGlvbiBtZXRob2RzIChzZWUgYHRvTWFya2Rvd25gKS5cbiovXG5jbGFzcyBNYXJrZG93blNlcmlhbGl6ZXJTdGF0ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5vZGVzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcmtzLCBcbiAgICAvKipcbiAgICBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNlcmlhbGl6ZXIuXG4gICAgKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZGVsaW0gPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMub3V0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmNsb3NlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbkF1dG9saW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pblRpZ2h0TGlzdCA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy50aWdodExpc3RzID09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGlnaHRMaXN0cyA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5oYXJkQnJlYWtOb2RlTmFtZSA9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhhcmRCcmVha05vZGVOYW1lID0gXCJoYXJkX2JyZWFrXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmx1c2hDbG9zZShzaXplID0gMikge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdEJsYW5rKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgICAgIGlmIChzaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGxldCBkZWxpbU1pbiA9IHRoaXMuZGVsaW07XG4gICAgICAgICAgICAgICAgbGV0IHRyaW0gPSAvXFxzKyQvLmV4ZWMoZGVsaW1NaW4pO1xuICAgICAgICAgICAgICAgIGlmICh0cmltKVxuICAgICAgICAgICAgICAgICAgICBkZWxpbU1pbiA9IGRlbGltTWluLnNsaWNlKDAsIGRlbGltTWluLmxlbmd0aCAtIHRyaW1bMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNpemU7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXQgKz0gZGVsaW1NaW4gKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0TWFyayhuYW1lKSB7XG4gICAgICAgIGxldCBpbmZvID0gdGhpcy5tYXJrc1tuYW1lXTtcbiAgICAgICAgaWYgKCFpbmZvKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmljdCAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXJrIHR5cGUgXFxgJHtuYW1lfVxcYCBub3Qgc3VwcG9ydGVkIGJ5IE1hcmtkb3duIHJlbmRlcmVyYCk7XG4gICAgICAgICAgICBpbmZvID0gYmxhbmtNYXJrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYSBibG9jaywgcHJlZml4aW5nIGVhY2ggbGluZSB3aXRoIGBkZWxpbWAsIGFuZCB0aGUgZmlyc3RcbiAgICBsaW5lIGluIGBmaXJzdERlbGltYC4gYG5vZGVgIHNob3VsZCBiZSB0aGUgbm9kZSB0aGF0IGlzIGNsb3NlZCBhdFxuICAgIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBhbmQgYGZgIGlzIGEgZnVuY3Rpb24gdGhhdCByZW5kZXJzIHRoZVxuICAgIGNvbnRlbnQgb2YgdGhlIGJsb2NrLlxuICAgICovXG4gICAgd3JhcEJsb2NrKGRlbGltLCBmaXJzdERlbGltLCBub2RlLCBmKSB7XG4gICAgICAgIGxldCBvbGQgPSB0aGlzLmRlbGltO1xuICAgICAgICB0aGlzLndyaXRlKGZpcnN0RGVsaW0gIT0gbnVsbCA/IGZpcnN0RGVsaW0gOiBkZWxpbSk7XG4gICAgICAgIHRoaXMuZGVsaW0gKz0gZGVsaW07XG4gICAgICAgIGYoKTtcbiAgICAgICAgdGhpcy5kZWxpbSA9IG9sZDtcbiAgICAgICAgdGhpcy5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGF0QmxhbmsoKSB7XG4gICAgICAgIHJldHVybiAvKF58XFxuKSQvLnRlc3QodGhpcy5vdXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBFbnN1cmUgdGhlIGN1cnJlbnQgY29udGVudCBlbmRzIHdpdGggYSBuZXdsaW5lLlxuICAgICovXG4gICAgZW5zdXJlTmV3TGluZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF0QmxhbmsoKSlcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IFwiXFxuXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIFByZXBhcmUgdGhlIHN0YXRlIGZvciB3cml0aW5nIG91dHB1dCAoY2xvc2luZyBjbG9zZWQgcGFyYWdyYXBocyxcbiAgICBhZGRpbmcgZGVsaW1pdGVycywgYW5kIHNvIG9uKSwgYW5kIHRoZW4gb3B0aW9uYWxseSBhZGQgY29udGVudFxuICAgICh1bmVzY2FwZWQpIHRvIHRoZSBvdXRwdXQuXG4gICAgKi9cbiAgICB3cml0ZShjb250ZW50KSB7XG4gICAgICAgIHRoaXMuZmx1c2hDbG9zZSgpO1xuICAgICAgICBpZiAodGhpcy5kZWxpbSAmJiB0aGlzLmF0QmxhbmsoKSlcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IHRoaXMuZGVsaW07XG4gICAgICAgIGlmIChjb250ZW50KVxuICAgICAgICAgICAgdGhpcy5vdXQgKz0gY29udGVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2xvc2UgdGhlIGJsb2NrIGZvciB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAqL1xuICAgIGNsb3NlQmxvY2sobm9kZSkge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgZG9jdW1lbnQuIFdoZW4gZXNjYXBlIGlzIG5vdCBgZmFsc2VgLFxuICAgIGl0IHdpbGwgYmUgZXNjYXBlZC5cbiAgICAqL1xuICAgIHRleHQodGV4dCwgZXNjYXBlID0gdHJ1ZSkge1xuICAgICAgICBsZXQgbGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlKCk7XG4gICAgICAgICAgICAvLyBFc2NhcGUgZXhjbGFtYXRpb24gbWFya3MgaW4gZnJvbnQgb2YgbGlua3NcbiAgICAgICAgICAgIGlmICghZXNjYXBlICYmIGxpbmVzW2ldWzBdID09IFwiW1wiICYmIC8oXnxbXlxcXFxdKVxcISQvLnRlc3QodGhpcy5vdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMub3V0ID0gdGhpcy5vdXQuc2xpY2UoMCwgdGhpcy5vdXQubGVuZ3RoIC0gMSkgKyBcIlxcXFwhXCI7XG4gICAgICAgICAgICB0aGlzLm91dCArPSBlc2NhcGUgPyB0aGlzLmVzYyhsaW5lc1tpXSwgdGhpcy5hdEJsb2NrU3RhcnQpIDogbGluZXNbaV07XG4gICAgICAgICAgICBpZiAoaSAhPSBsaW5lcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIHRoaXMub3V0ICs9IFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVuZGVyIHRoZSBnaXZlbiBub2RlIGFzIGEgYmxvY2suXG4gICAgKi9cbiAgICByZW5kZXIobm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5ub2Rlc1tub2RlLnR5cGUubmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKHRoaXMsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9rZW4gdHlwZSBgXCIgKyBub2RlLnR5cGUubmFtZSArIFwiYCBub3Qgc3VwcG9ydGVkIGJ5IE1hcmtkb3duIHJlbmRlcmVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIW5vZGUudHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJDb250ZW50KG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2spXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VCbG9jayhub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgdGhlIGNvbnRlbnRzIG9mIGBwYXJlbnRgIGFzIGJsb2NrIG5vZGVzLlxuICAgICovXG4gICAgcmVuZGVyQ29udGVudChwYXJlbnQpIHtcbiAgICAgICAgcGFyZW50LmZvckVhY2goKG5vZGUsIF8sIGkpID0+IHRoaXMucmVuZGVyKG5vZGUsIHBhcmVudCwgaSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgdGhlIGNvbnRlbnRzIG9mIGBwYXJlbnRgIGFzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgcmVuZGVySW5saW5lKHBhcmVudCwgZnJvbUJsb2NrU3RhcnQgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZnJvbUJsb2NrU3RhcnQ7XG4gICAgICAgIGxldCBhY3RpdmUgPSBbXSwgdHJhaWxpbmcgPSBcIlwiO1xuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSAobm9kZSwgb2Zmc2V0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gbm9kZSA/IG5vZGUubWFya3MgOiBbXTtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBtYXJrcyBmcm9tIGBoYXJkX2JyZWFrYCB0aGF0IGFyZSB0aGUgbGFzdCBub2RlIGluc2lkZVxuICAgICAgICAgICAgLy8gdGhhdCBtYXJrIHRvIHByZXZlbnQgcGFyc2VyIGVkZ2UgY2FzZXMgd2l0aCBuZXcgbGluZXMganVzdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGNsb3NpbmcgbWFya3MuXG4gICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUubmFtZSA9PT0gdGhpcy5vcHRpb25zLmhhcmRCcmVha05vZGVOYW1lKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID09IHBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHBhcmVudC5jaGlsZChpbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pc0luU2V0KG5leHQubWFya3MpICYmICghbmV4dC5pc1RleHQgfHwgL1xcUy8udGVzdChuZXh0LnRleHQpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBsZWFkaW5nID0gdHJhaWxpbmc7XG4gICAgICAgICAgICB0cmFpbGluZyA9IFwiXCI7XG4gICAgICAgICAgICAvLyBJZiB3aGl0ZXNwYWNlIGhhcyB0byBiZSBleHBlbGxlZCBmcm9tIHRoZSBub2RlLCBhZGp1c3RcbiAgICAgICAgICAgIC8vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pc1RleHQgJiYgbWFya3Muc29tZShtYXJrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZm8gJiYgaW5mby5leHBlbEVuY2xvc2luZ1doaXRlc3BhY2UgJiYgIW1hcmsuaXNJblNldChhY3RpdmUpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW18sIGxlYWQsIHJlc3RdID0gL14oXFxzKikoLiopJC9tLmV4ZWMobm9kZS50ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBsZWFkaW5nICs9IGxlYWQ7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSByZXN0ID8gbm9kZS53aXRoVGV4dChyZXN0KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gYWN0aXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUuaXNUZXh0ICYmIG1hcmtzLnNvbWUobWFyayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSB0aGlzLmdldE1hcmsobWFyay50eXBlLm5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvICYmIGluZm8uZXhwZWxFbmNsb3NpbmdXaGl0ZXNwYWNlICYmXG4gICAgICAgICAgICAgICAgICAgIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudCAtIDEgfHwgIW1hcmsuaXNJblNldChwYXJlbnQuY2hpbGQoaW5kZXggKyAxKS5tYXJrcykpO1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgW18sIHJlc3QsIHRyYWlsXSA9IC9eKC4qPykoXFxzKikkL20uZXhlYyhub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmICh0cmFpbCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyA9IHRyYWlsO1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gcmVzdCA/IG5vZGUud2l0aFRleHQocmVzdCkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IGFjdGl2ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBtYXJrcy5sZW5ndGggPyBtYXJrc1ttYXJrcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgICAgICBsZXQgbm9Fc2MgPSBpbm5lciAmJiB0aGlzLmdldE1hcmsoaW5uZXIudHlwZS5uYW1lKS5lc2NhcGUgPT09IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG1hcmtzLmxlbmd0aCAtIChub0VzYyA/IDEgOiAwKTtcbiAgICAgICAgICAgIC8vIFRyeSB0byByZW9yZGVyICdtaXhhYmxlJyBtYXJrcywgc3VjaCBhcyBlbSBhbmQgc3Ryb25nLCB3aGljaFxuICAgICAgICAgICAgLy8gaW4gTWFya2Rvd24gbWF5IGJlIG9wZW5lZCBhbmQgY2xvc2VkIGluIGRpZmZlcmVudCBvcmRlciwgc29cbiAgICAgICAgICAgIC8vIHRoYXQgb3JkZXIgb2YgdGhlIG1hcmtzIGZvciB0aGUgdG9rZW4gbWF0Y2hlcyB0aGUgb3JkZXIgaW5cbiAgICAgICAgICAgIC8vIGFjdGl2ZS5cbiAgICAgICAgICAgIG91dGVyOiBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSkubWl4YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhY3RpdmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG90aGVyID0gYWN0aXZlW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0TWFyayhvdGhlci50eXBlLm5hbWUpLm1peGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmsuZXEob3RoZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5zbGljZSgwLCBqKS5jb25jYXQobWFyaykuY29uY2F0KG1hcmtzLnNsaWNlKGosIGkpKS5jb25jYXQobWFya3Muc2xpY2UoaSArIDEsIGxlbikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaiA+IGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5zbGljZSgwLCBpKS5jb25jYXQobWFya3Muc2xpY2UoaSArIDEsIGopKS5jb25jYXQobWFyaykuY29uY2F0KG1hcmtzLnNsaWNlKGosIGxlbikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBwcmVmaXggb2YgdGhlIG1hcmsgc2V0IHRoYXQgZGlkbid0IGNoYW5nZVxuICAgICAgICAgICAgbGV0IGtlZXAgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBNYXRoLm1pbihhY3RpdmUubGVuZ3RoLCBsZW4pICYmIG1hcmtzW2tlZXBdLmVxKGFjdGl2ZVtrZWVwXSkpXG4gICAgICAgICAgICAgICAgKytrZWVwO1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1hcmtzIHRoYXQgbmVlZCB0byBiZSBjbG9zZWRcbiAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQodGhpcy5tYXJrU3RyaW5nKGFjdGl2ZS5wb3AoKSwgZmFsc2UsIHBhcmVudCwgaW5kZXgpLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBPdXRwdXQgYW55IHByZXZpb3VzbHkgZXhwZWxsZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvdXRzaWRlIHRoZSBtYXJrc1xuICAgICAgICAgICAgaWYgKGxlYWRpbmcpXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0KGxlYWRpbmcpO1xuICAgICAgICAgICAgLy8gT3BlbiB0aGUgbWFya3MgdGhhdCBuZWVkIHRvIGJlIG9wZW5lZFxuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoYWN0aXZlLmxlbmd0aCA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0gbWFya3NbYWN0aXZlLmxlbmd0aF07XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGFkZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCh0aGlzLm1hcmtTdHJpbmcoYWRkLCB0cnVlLCBwYXJlbnQsIGluZGV4KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgdGhlIG5vZGUuIFNwZWNpYWwgY2FzZSBjb2RlIG1hcmtzLCBzaW5jZSB0aGVpciBjb250ZW50XG4gICAgICAgICAgICAgICAgLy8gbWF5IG5vdCBiZSBlc2NhcGVkLlxuICAgICAgICAgICAgICAgIGlmIChub0VzYyAmJiBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0KHRoaXMubWFya1N0cmluZyhpbm5lciwgdHJ1ZSwgcGFyZW50LCBpbmRleCkgKyBub2RlLnRleHQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrU3RyaW5nKGlubmVyLCBmYWxzZSwgcGFyZW50LCBpbmRleCArIDEpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcihub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IG5vbi1lbXB0eSB0ZXh0IG5vZGUgaXMgcmVuZGVyZWQsIHRoZSBlbmQgb2Ygb3V0cHV0XG4gICAgICAgICAgICAvLyBpcyBubyBsb25nZXIgYXQgYmxvY2sgc3RhcnQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRklYTUU6IElmIGEgbm9uLXRleHQgbm9kZSB3cml0ZXMgc29tZXRoaW5nIHRvIHRoZSBvdXRwdXQgZm9yIHRoaXNcbiAgICAgICAgICAgIC8vIGJsb2NrLCB0aGUgZW5kIG9mIG91dHB1dCBpcyBhbHNvIG5vIGxvbmdlciBhdCBibG9jayBzdGFydC4gQnV0IGhvd1xuICAgICAgICAgICAgLy8gY2FuIHdlIGRldGVjdCB0aGF0P1xuICAgICAgICAgICAgaWYgKChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGUuaXNUZXh0KSAmJiBub2RlLm5vZGVTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHBhcmVudC5mb3JFYWNoKHByb2dyZXNzKTtcbiAgICAgICAgcHJvZ3Jlc3MobnVsbCwgMCwgcGFyZW50LmNoaWxkQ291bnQpO1xuICAgICAgICB0aGlzLmF0QmxvY2tTdGFydCA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgYSBub2RlJ3MgY29udGVudCBhcyBhIGxpc3QuIGBkZWxpbWAgc2hvdWxkIGJlIHRoZSBleHRyYVxuICAgIGluZGVudGF0aW9uIGFkZGVkIHRvIGFsbCBsaW5lcyBleGNlcHQgdGhlIGZpcnN0IGluIGFuIGl0ZW0sXG4gICAgYGZpcnN0RGVsaW1gIGlzIGEgZnVuY3Rpb24gZ29pbmcgZnJvbSBhbiBpdGVtIGluZGV4IHRvIGFcbiAgICBkZWxpbWl0ZXIgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBpdGVtLlxuICAgICovXG4gICAgcmVuZGVyTGlzdChub2RlLCBkZWxpbSwgZmlyc3REZWxpbSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQgJiYgdGhpcy5jbG9zZWQudHlwZSA9PSBub2RlLnR5cGUpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoMyk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaW5UaWdodExpc3QpXG4gICAgICAgICAgICB0aGlzLmZsdXNoQ2xvc2UoMSk7XG4gICAgICAgIGxldCBpc1RpZ2h0ID0gdHlwZW9mIG5vZGUuYXR0cnMudGlnaHQgIT0gXCJ1bmRlZmluZWRcIiA/IG5vZGUuYXR0cnMudGlnaHQgOiB0aGlzLm9wdGlvbnMudGlnaHRMaXN0cztcbiAgICAgICAgbGV0IHByZXZUaWdodCA9IHRoaXMuaW5UaWdodExpc3Q7XG4gICAgICAgIHRoaXMuaW5UaWdodExpc3QgPSBpc1RpZ2h0O1xuICAgICAgICBub2RlLmZvckVhY2goKGNoaWxkLCBfLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSAmJiBpc1RpZ2h0KVxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hDbG9zZSgxKTtcbiAgICAgICAgICAgIHRoaXMud3JhcEJsb2NrKGRlbGltLCBmaXJzdERlbGltKGkpLCBub2RlLCAoKSA9PiB0aGlzLnJlbmRlcihjaGlsZCwgbm9kZSwgaSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pblRpZ2h0TGlzdCA9IHByZXZUaWdodDtcbiAgICB9XG4gICAgLyoqXG4gICAgRXNjYXBlIHRoZSBnaXZlbiBzdHJpbmcgc28gdGhhdCBpdCBjYW4gc2FmZWx5IGFwcGVhciBpbiBNYXJrZG93blxuICAgIGNvbnRlbnQuIElmIGBzdGFydE9mTGluZWAgaXMgdHJ1ZSwgYWxzbyBlc2NhcGUgY2hhcmFjdGVycyB0aGF0XG4gICAgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgb25seSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuXG4gICAgKi9cbiAgICBlc2Moc3RyLCBzdGFydE9mTGluZSA9IGZhbHNlKSB7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bYCpcXFxcflxcW1xcXV9dL2csIChtLCBpKSA9PiBtID09IFwiX1wiICYmIGkgPiAwICYmIGkgKyAxIDwgc3RyLmxlbmd0aCAmJiBzdHJbaSAtIDFdLm1hdGNoKC9cXHcvKSAmJiBzdHJbaSArIDFdLm1hdGNoKC9cXHcvKSA/IG0gOiBcIlxcXFxcIiArIG0pO1xuICAgICAgICBpZiAoc3RhcnRPZkxpbmUpXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXihcXCtbIF18W1xcLSo+XSkvLCBcIlxcXFwkJlwiKS5yZXBsYWNlKC9eKFxccyopKCN7MSw2fSkoXFxzfCQpLywgJyQxXFxcXCQyJDMnKS5yZXBsYWNlKC9eKFxccypcXGQrKVxcLlxccy8sIFwiJDFcXFxcLiBcIik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXNjYXBlRXh0cmFDaGFyYWN0ZXJzKVxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UodGhpcy5vcHRpb25zLmVzY2FwZUV4dHJhQ2hhcmFjdGVycywgXCJcXFxcJCZcIik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcXVvdGUoc3RyKSB7XG4gICAgICAgIGxldCB3cmFwID0gc3RyLmluZGV4T2YoJ1wiJykgPT0gLTEgPyAnXCJcIicgOiBzdHIuaW5kZXhPZihcIidcIikgPT0gLTEgPyBcIicnXCIgOiBcIigpXCI7XG4gICAgICAgIHJldHVybiB3cmFwWzBdICsgc3RyICsgd3JhcFsxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwZWF0IHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLlxuICAgICovXG4gICAgcmVwZWF0KHN0ciwgbikge1xuICAgICAgICBsZXQgb3V0ID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspXG4gICAgICAgICAgICBvdXQgKz0gc3RyO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtkb3duIHN0cmluZyBmb3IgYSBnaXZlbiBvcGVuaW5nIG9yIGNsb3NpbmcgbWFyay5cbiAgICAqL1xuICAgIG1hcmtTdHJpbmcobWFyaywgb3BlbiwgcGFyZW50LCBpbmRleCkge1xuICAgICAgICBsZXQgaW5mbyA9IHRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSk7XG4gICAgICAgIGxldCB2YWx1ZSA9IG9wZW4gPyBpbmZvLm9wZW4gOiBpbmZvLmNsb3NlO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlKHRoaXMsIG1hcmssIHBhcmVudCwgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGEgc3RyaW5nLiBWYWx1ZXMgb2ZcbiAgICBsZWFkaW5nIG9yIHRyYWlsaW5nIHByb3BlcnR5IG9mIHRoZSByZXR1cm4gb2JqZWN0IHdpbGwgYmUgdW5kZWZpbmVkXG4gICAgaWYgdGhlcmUgaXMgbm8gbWF0Y2guXG4gICAgKi9cbiAgICBnZXRFbmNsb3NpbmdXaGl0ZXNwYWNlKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlYWRpbmc6ICh0ZXh0Lm1hdGNoKC9eKFxccyspLykgfHwgW3VuZGVmaW5lZF0pWzBdLFxuICAgICAgICAgICAgdHJhaWxpbmc6ICh0ZXh0Lm1hdGNoKC8oXFxzKykkLykgfHwgW3VuZGVmaW5lZF0pWzBdXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBNYXJrZG93blBhcnNlciwgTWFya2Rvd25TZXJpYWxpemVyLCBNYXJrZG93blNlcmlhbGl6ZXJTdGF0ZSwgZGVmYXVsdE1hcmtkb3duUGFyc2VyLCBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLCBzY2hlbWEgfTtcbiIsImltcG9ydCBPcmRlcmVkTWFwIGZyb20gJ29yZGVyZWRtYXAnO1xuXG5mdW5jdGlvbiBmaW5kRGlmZlN0YXJ0KGEsIGIsIHBvcykge1xuICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgIGlmIChpID09IGEuY2hpbGRDb3VudCB8fCBpID09IGIuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBhLmNoaWxkQ291bnQgPT0gYi5jaGlsZENvdW50ID8gbnVsbCA6IHBvcztcbiAgICAgICAgbGV0IGNoaWxkQSA9IGEuY2hpbGQoaSksIGNoaWxkQiA9IGIuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGlsZEEuc2FtZU1hcmt1cChjaGlsZEIpKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBjaGlsZEEudGV4dFtqXSA9PSBjaGlsZEIudGV4dFtqXTsgaisrKVxuICAgICAgICAgICAgICAgIHBvcysrO1xuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRBLmNvbnRlbnQuc2l6ZSB8fCBjaGlsZEIuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBmaW5kRGlmZlN0YXJ0KGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcG9zICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaW5kRGlmZkVuZChhLCBiLCBwb3NBLCBwb3NCKSB7XG4gICAgZm9yIChsZXQgaUEgPSBhLmNoaWxkQ291bnQsIGlCID0gYi5jaGlsZENvdW50OzspIHtcbiAgICAgICAgaWYgKGlBID09IDAgfHwgaUIgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBpQSA9PSBpQiA/IG51bGwgOiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgbGV0IGNoaWxkQSA9IGEuY2hpbGQoLS1pQSksIGNoaWxkQiA9IGIuY2hpbGQoLS1pQiksIHNpemUgPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZEEgPT0gY2hpbGRCKSB7XG4gICAgICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgICAgICBwb3NCIC09IHNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIGlmIChjaGlsZEEuaXNUZXh0ICYmIGNoaWxkQS50ZXh0ICE9IGNoaWxkQi50ZXh0KSB7XG4gICAgICAgICAgICBsZXQgc2FtZSA9IDAsIG1pblNpemUgPSBNYXRoLm1pbihjaGlsZEEudGV4dC5sZW5ndGgsIGNoaWxkQi50ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB3aGlsZSAoc2FtZSA8IG1pblNpemUgJiYgY2hpbGRBLnRleHRbY2hpbGRBLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdID09IGNoaWxkQi50ZXh0W2NoaWxkQi50ZXh0Lmxlbmd0aCAtIHNhbWUgLSAxXSkge1xuICAgICAgICAgICAgICAgIHNhbWUrKztcbiAgICAgICAgICAgICAgICBwb3NBLS07XG4gICAgICAgICAgICAgICAgcG9zQi0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmRW5kKGNoaWxkQS5jb250ZW50LCBjaGlsZEIuY29udGVudCwgcG9zQSAtIDEsIHBvc0IgLSAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIH1cbiAgICAgICAgcG9zQSAtPSBzaXplO1xuICAgICAgICBwb3NCIC09IHNpemU7XG4gICAgfVxufVxuXG4vKipcbkEgZnJhZ21lbnQgcmVwcmVzZW50cyBhIG5vZGUncyBjb2xsZWN0aW9uIG9mIGNoaWxkIG5vZGVzLlxuXG5MaWtlIG5vZGVzLCBmcmFnbWVudHMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLCBhbmQgeW91XG5zaG91bGQgbm90IG11dGF0ZSB0aGVtIG9yIHRoZWlyIGNvbnRlbnQuIFJhdGhlciwgeW91IGNyZWF0ZSBuZXdcbmluc3RhbmNlcyB3aGVuZXZlciBuZWVkZWQuIFRoZSBBUEkgdHJpZXMgdG8gbWFrZSB0aGlzIGVhc3kuXG4qL1xuY2xhc3MgRnJhZ21lbnQge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGNoaWxkIG5vZGVzIGluIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjb250ZW50LCBzaXplKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemUgfHwgMDtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLnNpemUgKz0gY29udGVudFtpXS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW52b2tlIGEgY2FsbGJhY2sgZm9yIGFsbCBkZXNjZW5kYW50IG5vZGVzIGJldHdlZW4gdGhlIGdpdmVuIHR3b1xuICAgIHBvc2l0aW9ucyAocmVsYXRpdmUgdG8gc3RhcnQgb2YgdGhpcyBmcmFnbWVudCkuIERvZXNuJ3QgZGVzY2VuZFxuICAgIGludG8gYSBub2RlIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgYGZhbHNlYC5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgbm9kZVN0YXJ0ID0gMCwgcGFyZW50KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBwb3MgPCB0bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20gJiYgZihjaGlsZCwgbm9kZVN0YXJ0ICsgcG9zLCBwYXJlbnQgfHwgbnVsbCwgaSkgIT09IGZhbHNlICYmIGNoaWxkLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHBvcyArIDE7XG4gICAgICAgICAgICAgICAgY2hpbGQubm9kZXNCZXR3ZWVuKE1hdGgubWF4KDAsIGZyb20gLSBzdGFydCksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBzdGFydCksIGYsIG5vZGVTdGFydCArIHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDYWxsIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgZXZlcnkgZGVzY2VuZGFudCBub2RlLiBgcG9zYCB3aWxsIGJlXG4gICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudC4gVGhlIGNhbGxiYWNrIG1heSByZXR1cm5cbiAgICBgZmFsc2VgIHRvIHByZXZlbnQgdHJhdmVyc2FsIG9mIGEgZ2l2ZW4gbm9kZSdzIGNoaWxkcmVuLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLnNpemUsIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBFeHRyYWN0IHRoZSB0ZXh0IGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBTZWUgdGhlIHNhbWUgbWV0aG9kIG9uXG4gICAgW2BOb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUudGV4dEJldHdlZW4pLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCIsIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGxldCBub2RlVGV4dCA9IG5vZGUuaXNUZXh0ID8gbm9kZS50ZXh0LnNsaWNlKE1hdGgubWF4KGZyb20sIHBvcykgLSBwb3MsIHRvIC0gcG9zKVxuICAgICAgICAgICAgICAgIDogIW5vZGUuaXNMZWFmID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICA6IGxlYWZUZXh0ID8gKHR5cGVvZiBsZWFmVGV4dCA9PT0gXCJmdW5jdGlvblwiID8gbGVhZlRleHQobm9kZSkgOiBsZWFmVGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbm9kZS50eXBlLnNwZWMubGVhZlRleHQgPyBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dChub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2sgJiYgKG5vZGUuaXNMZWFmICYmIG5vZGVUZXh0IHx8IG5vZGUuaXNUZXh0YmxvY2spICYmIGJsb2NrU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBibG9ja1NlcGFyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gbm9kZVRleHQ7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGNvbWJpbmVkIGNvbnRlbnQgb2YgdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgb3RoZXIuXG4gICAgKi9cbiAgICBhcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKCFvdGhlci5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICghdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMubGFzdENoaWxkLCBmaXJzdCA9IG90aGVyLmZpcnN0Q2hpbGQsIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKSwgaSA9IDA7XG4gICAgICAgIGlmIChsYXN0LmlzVGV4dCAmJiBsYXN0LnNhbWVNYXJrdXAoZmlyc3QpKSB7XG4gICAgICAgICAgICBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV0gPSBsYXN0LndpdGhUZXh0KGxhc3QudGV4dCArIGZpcnN0LnRleHQpO1xuICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBvdGhlci5jb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgY29udGVudC5wdXNoKG90aGVyLmNvbnRlbnRbaV0pO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQsIHRoaXMuc2l6ZSArIG90aGVyLnNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBzdWItZnJhZ21lbnQgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW10sIHNpemUgPSAwO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV0sIGVuZCA9IHBvcyArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBmcm9tIHx8IGVuZCA+IHRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MpLCBNYXRoLm1pbihjaGlsZC50ZXh0Lmxlbmd0aCwgdG8gLSBwb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dChNYXRoLm1heCgwLCBmcm9tIC0gcG9zIC0gMSksIE1hdGgubWluKGNoaWxkLmNvbnRlbnQuc2l6ZSwgdG8gLSBwb3MgLSAxKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBzaXplICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb3MgPSBlbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQocmVzdWx0LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjdXRCeUluZGV4KGZyb20sIHRvKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh0aGlzLmNvbnRlbnQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGluIHdoaWNoIHRoZSBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCBpc1xuICAgIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBub2RlLlxuICAgICovXG4gICAgcmVwbGFjZUNoaWxkKGluZGV4LCBub2RlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5jb250ZW50W2luZGV4XTtcbiAgICAgICAgaWYgKGN1cnJlbnQgPT0gbm9kZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY29udGVudC5zbGljZSgpO1xuICAgICAgICBsZXQgc2l6ZSA9IHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUgLSBjdXJyZW50Lm5vZGVTaXplO1xuICAgICAgICBjb3B5W2luZGV4XSA9IG5vZGU7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29weSwgc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBwcmVwZW5kaW5nIHRoZSBnaXZlbiBub2RlIHRvIHRoaXNcbiAgICBmcmFnbWVudC5cbiAgICAqL1xuICAgIGFkZFRvU3RhcnQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KFtub2RlXS5jb25jYXQodGhpcy5jb250ZW50KSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBmcmFnbWVudCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9FbmQobm9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5jb25jYXQobm9kZSksIHRoaXMuc2l6ZSArIG5vZGUubm9kZVNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb21wYXJlIHRoaXMgZnJhZ21lbnQgdG8gYW5vdGhlciBvbmUuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCAhPSBvdGhlci5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudFtpXS5lcShvdGhlci5jb250ZW50W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnRbMF0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIGxhc3QgY2hpbGQgb2YgdGhlIGZyYWdtZW50LCBvciBgbnVsbGAgaWYgaXQgaXMgZW1wdHkuXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gOiBudWxsOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBpbiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleC4gUmFpc2UgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgb3V0IG9mIHJhbmdlIGZvciBcIiArIHRoaXMpO1xuICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFtpbmRleF0gfHwgbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHAgPSAwOyBpIDwgdGhpcy5jb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNvbnRlbnRbaV07XG4gICAgICAgICAgICBmKGNoaWxkLCBwLCBpKTtcbiAgICAgICAgICAgIHAgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhpcyBmcmFnbWVudCBhbmQgYW5vdGhlclxuICAgIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICovXG4gICAgZmluZERpZmZTdGFydChvdGhlciwgcG9zID0gMCkge1xuICAgICAgICByZXR1cm4gZmluZERpZmZTdGFydCh0aGlzLCBvdGhlciwgcG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZmlyc3QgcG9zaXRpb24sIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQsIGF0IHdoaWNoIHRoaXNcbiAgICBmcmFnbWVudCBhbmQgdGhlIGdpdmVuIGZyYWdtZW50IGRpZmZlciwgb3IgYG51bGxgIGlmIHRoZXkgYXJlXG4gICAgdGhlIHNhbWUuIFNpbmNlIHRoaXMgcG9zaXRpb24gd2lsbCBub3QgYmUgdGhlIHNhbWUgaW4gYm90aFxuICAgIG5vZGVzLCBhbiBvYmplY3Qgd2l0aCB0d28gc2VwYXJhdGUgcG9zaXRpb25zIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZmluZERpZmZFbmQob3RoZXIsIHBvcyA9IHRoaXMuc2l6ZSwgb3RoZXJQb3MgPSBvdGhlci5zaXplKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZkVuZCh0aGlzLCBvdGhlciwgcG9zLCBvdGhlclBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGluZGV4IGFuZCBpbm5lciBvZmZzZXQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHJlbGF0aXZlXG4gICAgcG9zaXRpb24gaW4gdGhpcyBmcmFnbWVudC4gVGhlIHJlc3VsdCBvYmplY3Qgd2lsbCBiZSByZXVzZWRcbiAgICAob3ZlcndyaXR0ZW4pIHRoZSBuZXh0IHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gQGludGVybmFsXG4gICAgKi9cbiAgICBmaW5kSW5kZXgocG9zLCByb3VuZCA9IC0xKSB7XG4gICAgICAgIGlmIChwb3MgPT0gMClcbiAgICAgICAgICAgIHJldHVybiByZXRJbmRleCgwLCBwb3MpO1xuICAgICAgICBpZiAocG9zID09IHRoaXMuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiByZXRJbmRleCh0aGlzLmNvbnRlbnQubGVuZ3RoLCBwb3MpO1xuICAgICAgICBpZiAocG9zID4gdGhpcy5zaXplIHx8IHBvcyA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUG9zaXRpb24gJHtwb3N9IG91dHNpZGUgb2YgZnJhZ21lbnQgKCR7dGhpc30pYCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjdXJQb3MgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gdGhpcy5jaGlsZChpKSwgZW5kID0gY3VyUG9zICsgY3VyLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+PSBwb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5kID09IHBvcyB8fCByb3VuZCA+IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRJbmRleChpICsgMSwgZW5kKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0SW5kZXgoaSwgY3VyUG9zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1clBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSBkZWJ1Z2dpbmcgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIFwiPFwiICsgdGhpcy50b1N0cmluZ0lubmVyKCkgKyBcIj5cIjsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmdJbm5lcigpIHsgcmV0dXJuIHRoaXMuY29udGVudC5qb2luKFwiLCBcIik7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBKU09OLXNlcmlhbGl6ZWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGggPyB0aGlzLmNvbnRlbnQubWFwKG4gPT4gbi50b0pTT04oKSkgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIGZyYWdtZW50IGZyb20gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBGcmFnbWVudC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudCh2YWx1ZS5tYXAoc2NoZW1hLm5vZGVGcm9tSlNPTikpO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIGZyYWdtZW50IGZyb20gYW4gYXJyYXkgb2Ygbm9kZXMuIEVuc3VyZXMgdGhhdCBhZGphY2VudFxuICAgIHRleHQgbm9kZXMgd2l0aCB0aGUgc2FtZSBtYXJrcyBhcmUgam9pbmVkIHRvZ2V0aGVyLlxuICAgICovXG4gICAgc3RhdGljIGZyb21BcnJheShhcnJheSkge1xuICAgICAgICBpZiAoIWFycmF5Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgbGV0IGpvaW5lZCwgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gYXJyYXlbaV07XG4gICAgICAgICAgICBzaXplICs9IG5vZGUubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaSAmJiBub2RlLmlzVGV4dCAmJiBhcnJheVtpIC0gMV0uc2FtZU1hcmt1cChub2RlKSkge1xuICAgICAgICAgICAgICAgIGlmICgham9pbmVkKVxuICAgICAgICAgICAgICAgICAgICBqb2luZWQgPSBhcnJheS5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICBqb2luZWRbam9pbmVkLmxlbmd0aCAtIDFdID0gbm9kZVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRleHQoam9pbmVkW2pvaW5lZC5sZW5ndGggLSAxXS50ZXh0ICsgbm9kZS50ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGpvaW5lZCkge1xuICAgICAgICAgICAgICAgIGpvaW5lZC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoam9pbmVkIHx8IGFycmF5LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgZnJhZ21lbnQgZnJvbSBzb21ldGhpbmcgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYVxuICAgIHNldCBvZiBub2Rlcy4gRm9yIGBudWxsYCwgaXQgcmV0dXJucyB0aGUgZW1wdHkgZnJhZ21lbnQuIEZvciBhXG4gICAgZnJhZ21lbnQsIHRoZSBmcmFnbWVudCBpdHNlbGYuIEZvciBhIG5vZGUgb3IgYXJyYXkgb2Ygbm9kZXMsIGFcbiAgICBmcmFnbWVudCBjb250YWluaW5nIHRob3NlIG5vZGVzLlxuICAgICovXG4gICAgc3RhdGljIGZyb20obm9kZXMpIHtcbiAgICAgICAgaWYgKCFub2RlcylcbiAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgaWYgKG5vZGVzIGluc3RhbmNlb2YgRnJhZ21lbnQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyb21BcnJheShub2Rlcyk7XG4gICAgICAgIGlmIChub2Rlcy5hdHRycylcbiAgICAgICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoW25vZGVzXSwgbm9kZXMubm9kZVNpemUpO1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbiBub3QgY29udmVydCBcIiArIG5vZGVzICsgXCIgdG8gYSBGcmFnbWVudFwiICtcbiAgICAgICAgICAgIChub2Rlcy5ub2Rlc0JldHdlZW4gPyBcIiAobG9va3MgbGlrZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBwcm9zZW1pcnJvci1tb2RlbCB3ZXJlIGxvYWRlZClcIiA6IFwiXCIpKTtcbiAgICB9XG59XG4vKipcbkFuIGVtcHR5IGZyYWdtZW50LiBJbnRlbmRlZCB0byBiZSByZXVzZWQgd2hlbmV2ZXIgYSBub2RlIGRvZXNuJ3RcbmNvbnRhaW4gYW55dGhpbmcgKHJhdGhlciB0aGFuIGFsbG9jYXRpbmcgYSBuZXcgZW1wdHkgZnJhZ21lbnQgZm9yXG5lYWNoIGxlYWYgbm9kZSkuXG4qL1xuRnJhZ21lbnQuZW1wdHkgPSBuZXcgRnJhZ21lbnQoW10sIDApO1xuY29uc3QgZm91bmQgPSB7IGluZGV4OiAwLCBvZmZzZXQ6IDAgfTtcbmZ1bmN0aW9uIHJldEluZGV4KGluZGV4LCBvZmZzZXQpIHtcbiAgICBmb3VuZC5pbmRleCA9IGluZGV4O1xuICAgIGZvdW5kLm9mZnNldCA9IG9mZnNldDtcbiAgICByZXR1cm4gZm91bmQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVEZWVwKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEoYSAmJiB0eXBlb2YgYSA9PSBcIm9iamVjdFwiKSB8fFxuICAgICAgICAhKGIgJiYgdHlwZW9mIGIgPT0gXCJvYmplY3RcIikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXJyYXkgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGIpICE9IGFycmF5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFjb21wYXJlRGVlcChhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBwIGluIGEpXG4gICAgICAgICAgICBpZiAoIShwIGluIGIpIHx8ICFjb21wYXJlRGVlcChhW3BdLCBiW3BdKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHAgaW4gYilcbiAgICAgICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG5BIG1hcmsgaXMgYSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBhIG5vZGUsXG5zdWNoIGFzIGl0IGJlaW5nIGVtcGhhc2l6ZWQsIGluIGNvZGUgZm9udCwgb3IgYSBsaW5rLiBJdCBoYXMgYVxudHlwZSBhbmQgb3B0aW9uYWxseSBhIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBmdXJ0aGVyXG5pbmZvcm1hdGlvbiAoc3VjaCBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBsaW5rKS4gTWFya3MgYXJlIGNyZWF0ZWRcbnRocm91Z2ggYSBgU2NoZW1hYCwgd2hpY2ggY29udHJvbHMgd2hpY2ggdHlwZXMgZXhpc3QgYW5kIHdoaWNoXG5hdHRyaWJ1dGVzIHRoZXkgaGF2ZS5cbiovXG5jbGFzcyBNYXJrIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0eXBlIG9mIHRoaXMgbWFyay5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmsuXG4gICAgKi9cbiAgICBhdHRycykge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEdpdmVuIGEgc2V0IG9mIG1hcmtzLCBjcmVhdGUgYSBuZXcgc2V0IHdoaWNoIGNvbnRhaW5zIHRoaXMgb25lIGFzXG4gICAgd2VsbCwgaW4gdGhlIHJpZ2h0IHBvc2l0aW9uLiBJZiB0aGlzIG1hcmsgaXMgYWxyZWFkeSBpbiB0aGUgc2V0LFxuICAgIHRoZSBzZXQgaXRzZWxmIGlzIHJldHVybmVkLiBJZiBhbnkgbWFya3MgdGhhdCBhcmUgc2V0IHRvIGJlXG4gICAgW2V4Y2x1c2l2ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjLmV4Y2x1ZGVzKSB3aXRoIHRoaXMgbWFyayBhcmUgcHJlc2VudCxcbiAgICB0aG9zZSBhcmUgcmVwbGFjZWQgYnkgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhZGRUb1NldChzZXQpIHtcbiAgICAgICAgbGV0IGNvcHksIHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG90aGVyID0gc2V0W2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuZXEob3RoZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlLmV4Y2x1ZGVzKG90aGVyLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3RoZXIudHlwZS5leGNsdWRlcyh0aGlzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcGxhY2VkICYmIG90aGVyLnR5cGUucmFuayA+IHRoaXMudHlwZS5yYW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29weSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvcHkpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkucHVzaChvdGhlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgpO1xuICAgICAgICBpZiAoIXBsYWNlZClcbiAgICAgICAgICAgIGNvcHkucHVzaCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZSB0aGlzIG1hcmsgZnJvbSB0aGUgZ2l2ZW4gc2V0LCByZXR1cm5pbmcgYSBuZXcgc2V0LiBJZiB0aGlzXG4gICAgbWFyayBpcyBub3QgaW4gdGhlIHNldCwgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICByZW1vdmVGcm9tU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLmVxKHNldFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldC5zbGljZSgwLCBpKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaXMgaW4gdGhlIGdpdmVuIHNldCBvZiBtYXJrcy5cbiAgICAqL1xuICAgIGlzSW5TZXQoc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMuZXEoc2V0W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdGhpcyBtYXJrIGhhcyB0aGUgc2FtZSB0eXBlIGFuZCBhdHRyaWJ1dGVzIGFzXG4gICAgYW5vdGhlciBtYXJrLlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgICh0aGlzLnR5cGUgPT0gb3RoZXIudHlwZSAmJiBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBvdGhlci5hdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IHRoaXMgbWFyayB0byBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgdHlwZTogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICBvYmouYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBtYXJrIGZyb20gSlNPTi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBNYXJrLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgdHlwZSA9IHNjaGVtYS5tYXJrc1tqc29uLnR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlcmUgaXMgbm8gbWFyayB0eXBlICR7anNvbi50eXBlfSBpbiB0aGlzIHNjaGVtYWApO1xuICAgICAgICBsZXQgbWFyayA9IHR5cGUuY3JlYXRlKGpzb24uYXR0cnMpO1xuICAgICAgICB0eXBlLmNoZWNrQXR0cnMobWFyay5hdHRycyk7XG4gICAgICAgIHJldHVybiBtYXJrO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIHNldHMgb2YgbWFya3MgYXJlIGlkZW50aWNhbC5cbiAgICAqL1xuICAgIHN0YXRpYyBzYW1lU2V0KGEsIGIpIHtcbiAgICAgICAgaWYgKGEgPT0gYilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYVtpXS5lcShiW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBwcm9wZXJseSBzb3J0ZWQgbWFyayBzZXQgZnJvbSBudWxsLCBhIHNpbmdsZSBtYXJrLCBvciBhblxuICAgIHVuc29ydGVkIGFycmF5IG9mIG1hcmtzLlxuICAgICovXG4gICAgc3RhdGljIHNldEZyb20obWFya3MpIHtcbiAgICAgICAgaWYgKCFtYXJrcyB8fCBBcnJheS5pc0FycmF5KG1hcmtzKSAmJiBtYXJrcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIGlmIChtYXJrcyBpbnN0YW5jZW9mIE1hcmspXG4gICAgICAgICAgICByZXR1cm4gW21hcmtzXTtcbiAgICAgICAgbGV0IGNvcHkgPSBtYXJrcy5zbGljZSgpO1xuICAgICAgICBjb3B5LnNvcnQoKGEsIGIpID0+IGEudHlwZS5yYW5rIC0gYi50eXBlLnJhbmspO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgbWFya3MuXG4qL1xuTWFyay5ub25lID0gW107XG5cbi8qKlxuRXJyb3IgdHlwZSByYWlzZWQgYnkgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aGVuXG5naXZlbiBhbiBpbnZhbGlkIHJlcGxhY2VtZW50LlxuKi9cbmNsYXNzIFJlcGxhY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbn1cbi8qXG5SZXBsYWNlRXJyb3IgPSBmdW5jdGlvbih0aGlzOiBhbnksIG1lc3NhZ2U6IHN0cmluZykge1xuICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKVxuICA7KGVyciBhcyBhbnkpLl9fcHJvdG9fXyA9IFJlcGxhY2VFcnJvci5wcm90b3R5cGVcbiAgcmV0dXJuIGVyclxufSBhcyBhbnlcblxuUmVwbGFjZUVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKVxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlcGxhY2VFcnJvclxuUmVwbGFjZUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJSZXBsYWNlRXJyb3JcIlxuKi9cbi8qKlxuQSBzbGljZSByZXByZXNlbnRzIGEgcGllY2UgY3V0IG91dCBvZiBhIGxhcmdlciBkb2N1bWVudC4gSXRcbnN0b3JlcyBub3Qgb25seSBhIGZyYWdtZW50LCBidXQgYWxzbyB0aGUgZGVwdGggdXAgdG8gd2hpY2ggbm9kZXMgb25cbmJvdGggc2lkZSBhcmUg4oCYb3BlbuKAmSAoY3V0IHRocm91Z2gpLlxuKi9cbmNsYXNzIFNsaWNlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzbGljZS4gV2hlbiBzcGVjaWZ5aW5nIGEgbm9uLXplcm8gb3BlbiBkZXB0aCwgeW91IG11c3RcbiAgICBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm9kZXMgb2YgYXQgbGVhc3QgdGhhdCBkZXB0aCBhdCB0aGVcbiAgICBhcHByb3ByaWF0ZSBzaWRlIG9mIHRoZSBmcmFnbWVudOKAlGkuZS4gaWYgdGhlIGZyYWdtZW50IGlzIGFuXG4gICAgZW1wdHkgcGFyYWdyYXBoIG5vZGUsIGBvcGVuU3RhcnRgIGFuZCBgb3BlbkVuZGAgY2FuJ3QgYmUgZ3JlYXRlclxuICAgIHRoYW4gMS5cbiAgICBcbiAgICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgY29udGVudCBvZiBvcGVuIG5vZGVzIHRvIGNvbmZvcm0gdG9cbiAgICB0aGUgc2NoZW1hJ3MgY29udGVudCBjb25zdHJhaW50cywgdGhvdWdoIGl0IHNob3VsZCBiZSBhIHZhbGlkXG4gICAgc3RhcnQvZW5kL21pZGRsZSBmb3Igc3VjaCBhIG5vZGUsIGRlcGVuZGluZyBvbiB3aGljaCBzaWRlcyBhcmVcbiAgICBvcGVuLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlJ3MgY29udGVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBzdGFydCBvZiB0aGUgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBvcGVuU3RhcnQsIFxuICAgIC8qKlxuICAgIFRoZSBvcGVuIGRlcHRoIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBvcGVuRW5kKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMub3BlblN0YXJ0ID0gb3BlblN0YXJ0O1xuICAgICAgICB0aGlzLm9wZW5FbmQgPSBvcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2l6ZSB0aGlzIHNsaWNlIHdvdWxkIGFkZCB3aGVuIGluc2VydGVkIGludG8gYSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnNpemUgLSB0aGlzLm9wZW5TdGFydCAtIHRoaXMub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnNlcnRBdChwb3MsIGZyYWdtZW50KSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gaW5zZXJ0SW50byh0aGlzLmNvbnRlbnQsIHBvcyArIHRoaXMub3BlblN0YXJ0LCBmcmFnbWVudCk7XG4gICAgICAgIHJldHVybiBjb250ZW50ICYmIG5ldyBTbGljZShjb250ZW50LCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZW1vdmVCZXR3ZWVuKGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UocmVtb3ZlUmFuZ2UodGhpcy5jb250ZW50LCBmcm9tICsgdGhpcy5vcGVuU3RhcnQsIHRvICsgdGhpcy5vcGVuU3RhcnQpLCB0aGlzLm9wZW5TdGFydCwgdGhpcy5vcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGlzIHNsaWNlIGlzIGVxdWFsIHRvIGFub3RoZXIgc2xpY2UuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpICYmIHRoaXMub3BlblN0YXJ0ID09IG90aGVyLm9wZW5TdGFydCAmJiB0aGlzLm9wZW5FbmQgPT0gb3RoZXIub3BlbkVuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudCArIFwiKFwiICsgdGhpcy5vcGVuU3RhcnQgKyBcIixcIiArIHRoaXMub3BlbkVuZCArIFwiKVwiO1xuICAgIH1cbiAgICAvKipcbiAgICBDb252ZXJ0IGEgc2xpY2UgdG8gYSBKU09OLXNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQganNvbiA9IHsgY29udGVudDogdGhpcy5jb250ZW50LnRvSlNPTigpIH07XG4gICAgICAgIGlmICh0aGlzLm9wZW5TdGFydCA+IDApXG4gICAgICAgICAgICBqc29uLm9wZW5TdGFydCA9IHRoaXMub3BlblN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5vcGVuRW5kID4gMClcbiAgICAgICAgICAgIGpzb24ub3BlbkVuZCA9IHRoaXMub3BlbkVuZDtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgc2xpY2UgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0ganNvbi5vcGVuU3RhcnQgfHwgMCwgb3BlbkVuZCA9IGpzb24ub3BlbkVuZCB8fCAwO1xuICAgICAgICBpZiAodHlwZW9mIG9wZW5TdGFydCAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBvcGVuRW5kICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFNsaWNlLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2xpY2UgZnJvbSBhIGZyYWdtZW50IGJ5IHRha2luZyB0aGUgbWF4aW11bSBwb3NzaWJsZVxuICAgIG9wZW4gdmFsdWUgb24gYm90aCBzaWRlIG9mIHRoZSBmcmFnbWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBtYXhPcGVuKGZyYWdtZW50LCBvcGVuSXNvbGF0aW5nID0gdHJ1ZSkge1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgIGZvciAobGV0IG4gPSBmcmFnbWVudC5maXJzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4uZmlyc3RDaGlsZClcbiAgICAgICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBmb3IgKGxldCBuID0gZnJhZ21lbnQubGFzdENoaWxkOyBuICYmICFuLmlzTGVhZiAmJiAob3Blbklzb2xhdGluZyB8fCAhbi50eXBlLnNwZWMuaXNvbGF0aW5nKTsgbiA9IG4ubGFzdENoaWxkKVxuICAgICAgICAgICAgb3BlbkVuZCsrO1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKGZyYWdtZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNsaWNlLlxuKi9cblNsaWNlLmVtcHR5ID0gbmV3IFNsaWNlKEZyYWdtZW50LmVtcHR5LCAwLCAwKTtcbmZ1bmN0aW9uIHJlbW92ZVJhbmdlKGNvbnRlbnQsIGZyb20sIHRvKSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZnJvbSksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBsZXQgeyBpbmRleDogaW5kZXhUbywgb2Zmc2V0OiBvZmZzZXRUbyB9ID0gY29udGVudC5maW5kSW5kZXgodG8pO1xuICAgIGlmIChvZmZzZXQgPT0gZnJvbSB8fCBjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgaWYgKG9mZnNldFRvICE9IHRvICYmICFjb250ZW50LmNoaWxkKGluZGV4VG8pLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgICAgIHJldHVybiBjb250ZW50LmN1dCgwLCBmcm9tKS5hcHBlbmQoY29udGVudC5jdXQodG8pKTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9IGluZGV4VG8pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVtb3Zpbmcgbm9uLWZsYXQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBjaGlsZC5jb3B5KHJlbW92ZVJhbmdlKGNoaWxkLmNvbnRlbnQsIGZyb20gLSBvZmZzZXQgLSAxLCB0byAtIG9mZnNldCAtIDEpKSk7XG59XG5mdW5jdGlvbiBpbnNlcnRJbnRvKGNvbnRlbnQsIGRpc3QsIGluc2VydCwgcGFyZW50KSB7XG4gICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gY29udGVudC5maW5kSW5kZXgoZGlzdCksIGNoaWxkID0gY29udGVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICBpZiAob2Zmc2V0ID09IGRpc3QgfHwgY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCwgaW5zZXJ0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gY29udGVudC5jdXQoMCwgZGlzdCkuYXBwZW5kKGluc2VydCkuYXBwZW5kKGNvbnRlbnQuY3V0KGRpc3QpKTtcbiAgICB9XG4gICAgbGV0IGlubmVyID0gaW5zZXJ0SW50byhjaGlsZC5jb250ZW50LCBkaXN0IC0gb2Zmc2V0IC0gMSwgaW5zZXJ0KTtcbiAgICByZXR1cm4gaW5uZXIgJiYgY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGNoaWxkLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2UoJGZyb20sICR0bywgc2xpY2UpIHtcbiAgICBpZiAoc2xpY2Uub3BlblN0YXJ0ID4gJGZyb20uZGVwdGgpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJJbnNlcnRlZCBjb250ZW50IGRlZXBlciB0aGFuIGluc2VydGlvbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQgIT0gJHRvLmRlcHRoIC0gc2xpY2Uub3BlbkVuZClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluY29uc2lzdGVudCBvcGVuIGRlcHRoc1wiKTtcbiAgICByZXR1cm4gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCAwKTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGgpIHtcbiAgICBsZXQgaW5kZXggPSAkZnJvbS5pbmRleChkZXB0aCksIG5vZGUgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gJHRvLmluZGV4KGRlcHRoKSAmJiBkZXB0aCA8ICRmcm9tLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgIGxldCBpbm5lciA9IHJlcGxhY2VPdXRlcigkZnJvbSwgJHRvLCBzbGljZSwgZGVwdGggKyAxKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY29weShub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKGluZGV4LCBpbm5lcikpO1xuICAgIH1cbiAgICBlbHNlIGlmICghc2xpY2UuY29udGVudC5zaXplKSB7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uZGVwdGggPT0gZGVwdGggJiYgJHRvLmRlcHRoID09IGRlcHRoKSB7IC8vIFNpbXBsZSwgZmxhdCBjYXNlXG4gICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5wYXJlbnQsIGNvbnRlbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNsb3NlKHBhcmVudCwgY29udGVudC5jdXQoMCwgJGZyb20ucGFyZW50T2Zmc2V0KS5hcHBlbmQoc2xpY2UuY29udGVudCkuYXBwZW5kKGNvbnRlbnQuY3V0KCR0by5wYXJlbnRPZmZzZXQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBwcmVwYXJlU2xpY2VGb3JSZXBsYWNlKHNsaWNlLCAkZnJvbSk7XG4gICAgICAgIHJldHVybiBjbG9zZShub2RlLCByZXBsYWNlVGhyZWVXYXkoJGZyb20sIHN0YXJ0LCBlbmQsICR0bywgZGVwdGgpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0pvaW4obWFpbiwgc3ViKSB7XG4gICAgaWYgKCFzdWIudHlwZS5jb21wYXRpYmxlQ29udGVudChtYWluLnR5cGUpKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiQ2Fubm90IGpvaW4gXCIgKyBzdWIudHlwZS5uYW1lICsgXCIgb250byBcIiArIG1haW4udHlwZS5uYW1lKTtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKCRiZWZvcmUsICRhZnRlciwgZGVwdGgpIHtcbiAgICBsZXQgbm9kZSA9ICRiZWZvcmUubm9kZShkZXB0aCk7XG4gICAgY2hlY2tKb2luKG5vZGUsICRhZnRlci5ub2RlKGRlcHRoKSk7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBhZGROb2RlKGNoaWxkLCB0YXJnZXQpIHtcbiAgICBsZXQgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxO1xuICAgIGlmIChsYXN0ID49IDAgJiYgY2hpbGQuaXNUZXh0ICYmIGNoaWxkLnNhbWVNYXJrdXAodGFyZ2V0W2xhc3RdKSlcbiAgICAgICAgdGFyZ2V0W2xhc3RdID0gY2hpbGQud2l0aFRleHQodGFyZ2V0W2xhc3RdLnRleHQgKyBjaGlsZC50ZXh0KTtcbiAgICBlbHNlXG4gICAgICAgIHRhcmdldC5wdXNoKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIHRhcmdldCkge1xuICAgIGxldCBub2RlID0gKCRlbmQgfHwgJHN0YXJ0KS5ub2RlKGRlcHRoKTtcbiAgICBsZXQgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4ID0gJGVuZCA/ICRlbmQuaW5kZXgoZGVwdGgpIDogbm9kZS5jaGlsZENvdW50O1xuICAgIGlmICgkc3RhcnQpIHtcbiAgICAgICAgc3RhcnRJbmRleCA9ICRzdGFydC5pbmRleChkZXB0aCk7XG4gICAgICAgIGlmICgkc3RhcnQuZGVwdGggPiBkZXB0aCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRzdGFydC50ZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICBhZGROb2RlKCRzdGFydC5ub2RlQWZ0ZXIsIHRhcmdldCk7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKVxuICAgICAgICBhZGROb2RlKG5vZGUuY2hpbGQoaSksIHRhcmdldCk7XG4gICAgaWYgKCRlbmQgJiYgJGVuZC5kZXB0aCA9PSBkZXB0aCAmJiAkZW5kLnRleHRPZmZzZXQpXG4gICAgICAgIGFkZE5vZGUoJGVuZC5ub2RlQmVmb3JlLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gY2xvc2Uobm9kZSwgY29udGVudCkge1xuICAgIG5vZGUudHlwZS5jaGVja0NvbnRlbnQoY29udGVudCk7XG4gICAgcmV0dXJuIG5vZGUuY29weShjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IG9wZW5TdGFydCA9ICRmcm9tLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKTtcbiAgICBsZXQgb3BlbkVuZCA9ICR0by5kZXB0aCA+IGRlcHRoICYmIGpvaW5hYmxlKCRlbmQsICR0bywgZGVwdGggKyAxKTtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmICRzdGFydC5pbmRleChkZXB0aCkgPT0gJGVuZC5pbmRleChkZXB0aCkpIHtcbiAgICAgICAgY2hlY2tKb2luKG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlblN0YXJ0LCByZXBsYWNlVGhyZWVXYXkoJGZyb20sICRzdGFydCwgJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAob3BlblN0YXJ0KVxuICAgICAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUd29XYXkoJGZyb20sICRzdGFydCwgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgICAgICBhZGRSYW5nZSgkc3RhcnQsICRlbmQsIGRlcHRoLCBjb250ZW50KTtcbiAgICAgICAgaWYgKG9wZW5FbmQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5FbmQsIHJlcGxhY2VUd29XYXkoJGVuZCwgJHRvLCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgfVxuICAgIGFkZFJhbmdlKCR0bywgbnVsbCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCk7XG59XG5mdW5jdGlvbiByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBbXTtcbiAgICBhZGRSYW5nZShudWxsLCAkZnJvbSwgZGVwdGgsIGNvbnRlbnQpO1xuICAgIGlmICgkZnJvbS5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgIGxldCB0eXBlID0gam9pbmFibGUoJGZyb20sICR0bywgZGVwdGggKyAxKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZSh0eXBlLCByZXBsYWNlVHdvV2F5KCRmcm9tLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRhbG9uZykge1xuICAgIGxldCBleHRyYSA9ICRhbG9uZy5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCwgcGFyZW50ID0gJGFsb25nLm5vZGUoZXh0cmEpO1xuICAgIGxldCBub2RlID0gcGFyZW50LmNvcHkoc2xpY2UuY29udGVudCk7XG4gICAgZm9yIChsZXQgaSA9IGV4dHJhIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIG5vZGUgPSAkYWxvbmcubm9kZShpKS5jb3B5KEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiB7IHN0YXJ0OiBub2RlLnJlc29sdmVOb0NhY2hlKHNsaWNlLm9wZW5TdGFydCArIGV4dHJhKSxcbiAgICAgICAgZW5kOiBub2RlLnJlc29sdmVOb0NhY2hlKG5vZGUuY29udGVudC5zaXplIC0gc2xpY2Uub3BlbkVuZCAtIGV4dHJhKSB9O1xufVxuXG4vKipcbllvdSBjYW4gW19yZXNvbHZlX10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGUucmVzb2x2ZSkgYSBwb3NpdGlvbiB0byBnZXQgbW9yZVxuaW5mb3JtYXRpb24gYWJvdXQgaXQuIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgc3VjaCBhXG5yZXNvbHZlZCBwb3NpdGlvbiwgcHJvdmlkaW5nIHZhcmlvdXMgcGllY2VzIG9mIGNvbnRleHRcbmluZm9ybWF0aW9uLCBhbmQgc29tZSBoZWxwZXIgbWV0aG9kcy5cblxuVGhyb3VnaG91dCB0aGlzIGludGVyZmFjZSwgbWV0aG9kcyB0aGF0IHRha2UgYW4gb3B0aW9uYWwgYGRlcHRoYFxucGFyYW1ldGVyIHdpbGwgaW50ZXJwcmV0IHVuZGVmaW5lZCBhcyBgdGhpcy5kZXB0aGAgYW5kIG5lZ2F0aXZlXG5udW1iZXJzIGFzIGB0aGlzLmRlcHRoICsgdmFsdWVgLlxuKi9cbmNsYXNzIFJlc29sdmVkUG9zIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiB0aGF0IHdhcyByZXNvbHZlZC5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBwYXRoLCBcbiAgICAvKipcbiAgICBUaGUgb2Zmc2V0IHRoaXMgcG9zaXRpb24gaGFzIGludG8gaXRzIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgcGFyZW50T2Zmc2V0KSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnBhcmVudE9mZnNldCA9IHBhcmVudE9mZnNldDtcbiAgICAgICAgdGhpcy5kZXB0aCA9IHBhdGgubGVuZ3RoIC8gMyAtIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZURlcHRoKHZhbCkge1xuICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aDtcbiAgICAgICAgaWYgKHZhbCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXB0aCArIHZhbDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHBvc2l0aW9uIHBvaW50cyBpbnRvLiBOb3RlIHRoYXQgZXZlbiBpZlxuICAgIGEgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIHRoYXQgbm9kZSBpcyBub3QgY29uc2lkZXJlZFxuICAgIHRoZSBwYXJlbnTigJR0ZXh0IG5vZGVzIGFyZSDigJhmbGF04oCZIGluIHRoaXMgbW9kZWwsIGFuZCBoYXZlIG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgcGFyZW50KCkgeyByZXR1cm4gdGhpcy5ub2RlKHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIHJvb3Qgbm9kZSBpbiB3aGljaCB0aGUgcG9zaXRpb24gd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgZ2V0IGRvYygpIHsgcmV0dXJuIHRoaXMubm9kZSgwKTsgfVxuICAgIC8qKlxuICAgIFRoZSBhbmNlc3RvciBub2RlIGF0IHRoZSBnaXZlbiBsZXZlbC4gYHAubm9kZShwLmRlcHRoKWAgaXMgdGhlXG4gICAgc2FtZSBhcyBgcC5wYXJlbnRgLlxuICAgICovXG4gICAgbm9kZShkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDNdOyB9XG4gICAgLyoqXG4gICAgVGhlIGluZGV4IGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZSBnaXZlbiBsZXZlbC4gSWYgdGhpcyBwb2ludHNcbiAgICBhdCB0aGUgM3JkIG5vZGUgaW4gdGhlIDJuZCBwYXJhZ3JhcGggb24gdGhlIHRvcCBsZXZlbCwgZm9yXG4gICAgZXhhbXBsZSwgYHAuaW5kZXgoMClgIGlzIDEgYW5kIGBwLmluZGV4KDEpYCBpcyAyLlxuICAgICovXG4gICAgaW5kZXgoZGVwdGgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnJlc29sdmVEZXB0aChkZXB0aCkgKiAzICsgMV07IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggcG9pbnRpbmcgYWZ0ZXIgdGhpcyBwb3NpdGlvbiBpbnRvIHRoZSBhbmNlc3RvciBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbC5cbiAgICAqL1xuICAgIGluZGV4QWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4KGRlcHRoKSArIChkZXB0aCA9PSB0aGlzLmRlcHRoICYmICF0aGlzLnRleHRPZmZzZXQgPyAwIDogMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW5cbiAgICBsZXZlbC5cbiAgICAqL1xuICAgIHN0YXJ0KGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gMCA/IDAgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyAxO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgZW5kKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFydChkZXB0aCkgKyB0aGlzLm5vZGUoZGVwdGgpLmNvbnRlbnQuc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYmVmb3JlIHRoZSB3cmFwcGluZyBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLCBvciwgd2hlbiBgZGVwdGhgIGlzIGB0aGlzLmRlcHRoICsgMWAsIHRoZSBvcmlnaW5hbFxuICAgIHBvc2l0aW9uLlxuICAgICovXG4gICAgYmVmb3JlKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBiZWZvcmUgdGhlIHRvcC1sZXZlbCBub2RlXCIpO1xuICAgICAgICByZXR1cm4gZGVwdGggPT0gdGhpcy5kZXB0aCArIDEgPyB0aGlzLnBvcyA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gZGlyZWN0bHkgYWZ0ZXIgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYC5cbiAgICAqL1xuICAgIGFmdGVyKGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGVyZSBpcyBubyBwb3NpdGlvbiBhZnRlciB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgdGhpcy5wYXRoW2RlcHRoICogM10ubm9kZVNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZW4gdGhpcyBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhpcyByZXR1cm5zIHRoZVxuICAgIGRpc3RhbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgbm9kZS5cbiAgICBXaWxsIGJlIHplcm8gZm9yIHBvc2l0aW9ucyB0aGF0IHBvaW50IGJldHdlZW4gbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgdGV4dE9mZnNldCgpIHsgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBhZnRlciB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlIHBvc2l0aW9uXG4gICAgcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlIGFmdGVyIHRoZVxuICAgIHBvc2l0aW9uIGlzIHJldHVybmVkLlxuICAgICovXG4gICAgZ2V0IG5vZGVBZnRlcigpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50LCBpbmRleCA9IHRoaXMuaW5kZXgodGhpcy5kZXB0aCk7XG4gICAgICAgIGlmIChpbmRleCA9PSBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXSwgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgICAgICByZXR1cm4gZE9mZiA/IHBhcmVudC5jaGlsZChpbmRleCkuY3V0KGRPZmYpIDogY2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbm9kZSBkaXJlY3RseSBiZWZvcmUgdGhlIHBvc2l0aW9uLCBpZiBhbnkuIElmIHRoZVxuICAgIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCBvbmx5IHRoZSBwYXJ0IG9mIHRoYXQgbm9kZVxuICAgIGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUJlZm9yZSgpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgbGV0IGRPZmYgPSB0aGlzLnBvcyAtIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChkT2ZmKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkKGluZGV4KS5jdXQoMCwgZE9mZik7XG4gICAgICAgIHJldHVybiBpbmRleCA9PSAwID8gbnVsbCA6IHRoaXMucGFyZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgcG9zaXRpb24gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBwYXJlbnQgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBkZXB0aCAod2hpY2ggZGVmYXVsdHMgdG8gYHRoaXMuZGVwdGhgKS5cbiAgICAqL1xuICAgIHBvc0F0SW5kZXgoaW5kZXgsIGRlcHRoKSB7XG4gICAgICAgIGRlcHRoID0gdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpO1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMucGF0aFtkZXB0aCAqIDNdLCBwb3MgPSBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKylcbiAgICAgICAgICAgIHBvcyArPSBub2RlLmNoaWxkKGkpLm5vZGVTaXplO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGF0IHRoaXMgcG9zaXRpb24sIGZhY3RvcmluZyBpbiB0aGUgc3Vycm91bmRpbmdcbiAgICBtYXJrcycgW2BpbmNsdXNpdmVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuaW5jbHVzaXZlKSBwcm9wZXJ0eS4gSWYgdGhlXG4gICAgcG9zaXRpb24gaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbm9uLWVtcHR5IG5vZGUsIHRoZSBtYXJrcyBvZiB0aGVcbiAgICBub2RlIGFmdGVyIGl0IChpZiBhbnkpIGFyZSByZXR1cm5lZC5cbiAgICAqL1xuICAgIG1hcmtzKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgICAvLyBJbiBhbiBlbXB0eSBwYXJlbnQsIHJldHVybiB0aGUgZW1wdHkgYXJyYXlcbiAgICAgICAgaWYgKHBhcmVudC5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBNYXJrLm5vbmU7XG4gICAgICAgIC8vIFdoZW4gaW5zaWRlIGEgdGV4dCBub2RlLCBqdXN0IHJldHVybiB0aGUgdGV4dCBub2RlJ3MgbWFya3NcbiAgICAgICAgaWYgKHRoaXMudGV4dE9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQuY2hpbGQoaW5kZXgpLm1hcmtzO1xuICAgICAgICBsZXQgbWFpbiA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4IC0gMSksIG90aGVyID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAvLyBJZiB0aGUgYGFmdGVyYCBmbGFnIGlzIHRydWUgb2YgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUsIG1ha2VcbiAgICAgICAgLy8gdGhlIG5vZGUgYWZ0ZXIgdGhpcyBwb3NpdGlvbiB0aGUgbWFpbiByZWZlcmVuY2UuXG4gICAgICAgIGlmICghbWFpbikge1xuICAgICAgICAgICAgbGV0IHRtcCA9IG1haW47XG4gICAgICAgICAgICBtYWluID0gb3RoZXI7XG4gICAgICAgICAgICBvdGhlciA9IHRtcDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgYWxsIG1hcmtzIGluIHRoZSBtYWluIG5vZGUsIGV4Y2VwdCB0aG9zZSB0aGF0IGhhdmVcbiAgICAgICAgLy8gYGluY2x1c2l2ZWAgc2V0IHRvIGZhbHNlIGFuZCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG90aGVyIG5vZGUuXG4gICAgICAgIGxldCBtYXJrcyA9IG1haW4ubWFya3M7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFvdGhlciB8fCAhbWFya3NbaV0uaXNJblNldChvdGhlci5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIG1hcmtzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpZiBhbnksIGV4Y2VwdCB0aG9zZVxuICAgIHRoYXQgYXJlIG5vbi1pbmNsdXNpdmUgYW5kIG5vdCBwcmVzZW50IGF0IHBvc2l0aW9uIGAkZW5kYC4gVGhpc1xuICAgIGlzIG1vc3RseSB1c2VmdWwgZm9yIGdldHRpbmcgdGhlIHNldCBvZiBtYXJrcyB0byBwcmVzZXJ2ZSBhZnRlciBhXG4gICAgZGVsZXRpb24uIFdpbGwgcmV0dXJuIGBudWxsYCBpZiB0aGlzIHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2ZcbiAgICBpdHMgcGFyZW50IG5vZGUgb3IgaXRzIHBhcmVudCBub2RlIGlzbid0IGEgdGV4dGJsb2NrIChpbiB3aGljaFxuICAgIGNhc2Ugbm8gbWFya3Mgc2hvdWxkIGJlIHByZXNlcnZlZCkuXG4gICAgKi9cbiAgICBtYXJrc0Fjcm9zcygkZW5kKSB7XG4gICAgICAgIGxldCBhZnRlciA9IHRoaXMucGFyZW50Lm1heWJlQ2hpbGQodGhpcy5pbmRleCgpKTtcbiAgICAgICAgaWYgKCFhZnRlciB8fCAhYWZ0ZXIuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IG1hcmtzID0gYWZ0ZXIubWFya3MsIG5leHQgPSAkZW5kLnBhcmVudC5tYXliZUNoaWxkKCRlbmQuaW5kZXgoKSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAobWFya3NbaV0udHlwZS5zcGVjLmluY2x1c2l2ZSA9PT0gZmFsc2UgJiYgKCFuZXh0IHx8ICFtYXJrc1tpXS5pc0luU2V0KG5leHQubWFya3MpKSlcbiAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzW2ktLV0ucmVtb3ZlRnJvbVNldChtYXJrcyk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIHVwIHRvIHdoaWNoIHRoaXMgcG9zaXRpb24gYW5kIHRoZSBnaXZlbiAobm9uLXJlc29sdmVkKVxuICAgIHBvc2l0aW9uIHNoYXJlIHRoZSBzYW1lIHBhcmVudCBub2Rlcy5cbiAgICAqL1xuICAgIHNoYXJlZERlcHRoKHBvcykge1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMuZGVwdGg7IGRlcHRoID4gMDsgZGVwdGgtLSlcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0KGRlcHRoKSA8PSBwb3MgJiYgdGhpcy5lbmQoZGVwdGgpID49IHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIGEgcmFuZ2UgYmFzZWQgb24gdGhlIHBsYWNlIHdoZXJlIHRoaXMgcG9zaXRpb24gYW5kIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9uIGRpdmVyZ2UgYXJvdW5kIGJsb2NrIGNvbnRlbnQuIElmIGJvdGggcG9pbnQgaW50b1xuICAgIHRoZSBzYW1lIHRleHRibG9jaywgZm9yIGV4YW1wbGUsIGEgcmFuZ2UgYXJvdW5kIHRoYXQgdGV4dGJsb2NrXG4gICAgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhleSBwb2ludCBpbnRvIGRpZmZlcmVudCBibG9ja3MsIHRoZSByYW5nZVxuICAgIGFyb3VuZCB0aG9zZSBibG9ja3MgaW4gdGhlaXIgc2hhcmVkIGFuY2VzdG9yIGlzIHJldHVybmVkLiBZb3UgY2FuXG4gICAgcGFzcyBpbiBhbiBvcHRpb25hbCBwcmVkaWNhdGUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcGFyZW50XG4gICAgbm9kZSB0byBzZWUgaWYgYSByYW5nZSBpbnRvIHRoYXQgcGFyZW50IGlzIGFjY2VwdGFibGUuXG4gICAgKi9cbiAgICBibG9ja1JhbmdlKG90aGVyID0gdGhpcywgcHJlZCkge1xuICAgICAgICBpZiAob3RoZXIucG9zIDwgdGhpcy5wb3MpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXIuYmxvY2tSYW5nZSh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZCA9IHRoaXMuZGVwdGggLSAodGhpcy5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB0aGlzLnBvcyA9PSBvdGhlci5wb3MgPyAxIDogMCk7IGQgPj0gMDsgZC0tKVxuICAgICAgICAgICAgaWYgKG90aGVyLnBvcyA8PSB0aGlzLmVuZChkKSAmJiAoIXByZWQgfHwgcHJlZCh0aGlzLm5vZGUoZCkpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVSYW5nZSh0aGlzLCBvdGhlciwgZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyeSB3aGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiBzaGFyZXMgdGhlIHNhbWUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBzYW1lUGFyZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvcyAtIHRoaXMucGFyZW50T2Zmc2V0ID09IG90aGVyLnBvcyAtIG90aGVyLnBhcmVudE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBncmVhdGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1heChvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zID4gdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiB0aGUgc21hbGxlciBvZiB0aGlzIGFuZCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBtaW4ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyLnBvcyA8IHRoaXMucG9zID8gb3RoZXIgOiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBsZXQgc3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy5kZXB0aDsgaSsrKVxuICAgICAgICAgICAgc3RyICs9IChzdHIgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy5ub2RlKGkpLnR5cGUubmFtZSArIFwiX1wiICsgdGhpcy5pbmRleChpIC0gMSk7XG4gICAgICAgIHJldHVybiBzdHIgKyBcIjpcIiArIHRoaXMucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlKGRvYywgcG9zKSB7XG4gICAgICAgIGlmICghKHBvcyA+PSAwICYmIHBvcyA8PSBkb2MuY29udGVudC5zaXplKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUG9zaXRpb24gXCIgKyBwb3MgKyBcIiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICAgIGxldCBwYXRoID0gW107XG4gICAgICAgIGxldCBzdGFydCA9IDAsIHBhcmVudE9mZnNldCA9IHBvcztcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IGRvYzs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBhcmVudE9mZnNldCk7XG4gICAgICAgICAgICBsZXQgcmVtID0gcGFyZW50T2Zmc2V0IC0gb2Zmc2V0O1xuICAgICAgICAgICAgcGF0aC5wdXNoKG5vZGUsIGluZGV4LCBzdGFydCArIG9mZnNldCk7XG4gICAgICAgICAgICBpZiAoIXJlbSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHBhcmVudE9mZnNldCA9IHJlbSAtIDE7XG4gICAgICAgICAgICBzdGFydCArPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQb3MocG9zLCBwYXRoLCBwYXJlbnRPZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyByZXNvbHZlQ2FjaGVkKGRvYywgcG9zKSB7XG4gICAgICAgIGxldCBjYWNoZSA9IHJlc29sdmVDYWNoZS5nZXQoZG9jKTtcbiAgICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLmVsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZWx0ID0gY2FjaGUuZWx0c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZWx0LnBvcyA9PSBwb3MpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlQ2FjaGUuc2V0KGRvYywgY2FjaGUgPSBuZXcgUmVzb2x2ZUNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gY2FjaGUuZWx0c1tjYWNoZS5pXSA9IFJlc29sdmVkUG9zLnJlc29sdmUoZG9jLCBwb3MpO1xuICAgICAgICBjYWNoZS5pID0gKGNhY2hlLmkgKyAxKSAlIHJlc29sdmVDYWNoZVNpemU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuY2xhc3MgUmVzb2x2ZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbHRzID0gW107XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgfVxufVxuY29uc3QgcmVzb2x2ZUNhY2hlU2l6ZSA9IDEyLCByZXNvbHZlQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG5SZXByZXNlbnRzIGEgZmxhdCByYW5nZSBvZiBjb250ZW50LCBpLmUuIG9uZSB0aGF0IHN0YXJ0cyBhbmRcbmVuZHMgaW4gdGhlIHNhbWUgbm9kZS5cbiovXG5jbGFzcyBOb2RlUmFuZ2Uge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIG5vZGUgcmFuZ2UuIGAkZnJvbWAgYW5kIGAkdG9gIHNob3VsZCBwb2ludCBpbnRvIHRoZVxuICAgIHNhbWUgbm9kZSB1bnRpbCBhdCBsZWFzdCB0aGUgZ2l2ZW4gYGRlcHRoYCwgc2luY2UgYSBub2RlIHJhbmdlXG4gICAgZGVub3RlcyBhbiBhZGphY2VudCBzZXQgb2Ygbm9kZXMgaW4gYSBzaW5nbGUgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBBIHJlc29sdmVkIHBvc2l0aW9uIGFsb25nIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gTWF5IGhhdmUgYVxuICAgIGBkZXB0aGAgZ3JlYXRlciB0aGFuIHRoaXMgb2JqZWN0J3MgYGRlcHRoYCBwcm9wZXJ0eSwgc2luY2VcbiAgICB0aGVzZSBhcmUgdGhlIHBvc2l0aW9ucyB0aGF0IHdlcmUgdXNlZCB0byBjb21wdXRlIHRoZSByYW5nZSxcbiAgICBub3QgcmUtcmVzb2x2ZWQgcG9zaXRpb25zIGRpcmVjdGx5IGF0IGl0cyBib3VuZGFyaWVzLlxuICAgICovXG4gICAgJGZyb20sIFxuICAgIC8qKlxuICAgIEEgcG9zaXRpb24gYWxvbmcgdGhlIGVuZCBvZiB0aGUgY29udGVudC4gU2VlXG4gICAgY2F2ZWF0IGZvciBbYCRmcm9tYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZS4kZnJvbSkuXG4gICAgKi9cbiAgICAkdG8sIFxuICAgIC8qKlxuICAgIFRoZSBkZXB0aCBvZiB0aGUgbm9kZSB0aGF0IHRoaXMgcmFuZ2UgcG9pbnRzIGludG8uXG4gICAgKi9cbiAgICBkZXB0aCkge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgICAgICB0aGlzLmRlcHRoID0gZGVwdGg7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0KCkgeyByZXR1cm4gdGhpcy4kZnJvbS5iZWZvcmUodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IGVuZCgpIHsgcmV0dXJuIHRoaXMuJHRvLmFmdGVyKHRoaXMuZGVwdGggKyAxKTsgfVxuICAgIC8qKlxuICAgIFRoZSBwYXJlbnQgbm9kZSB0aGF0IHRoZSByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLm5vZGUodGhpcy5kZXB0aCk7IH1cbiAgICAvKipcbiAgICBUaGUgc3RhcnQgaW5kZXggb2YgdGhlIHJhbmdlIGluIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBzdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy4kZnJvbS5pbmRleCh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBlbmQgaW5kZXggb2YgdGhlIHJhbmdlIGluIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBlbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuJHRvLmluZGV4QWZ0ZXIodGhpcy5kZXB0aCk7IH1cbn1cblxuY29uc3QgZW1wdHlBdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcblRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5vZGUgaW4gdGhlIHRyZWUgdGhhdCBtYWtlcyB1cCBhXG5Qcm9zZU1pcnJvciBkb2N1bWVudC4gU28gYSBkb2N1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAsIHdpdGhcbmNoaWxkcmVuIHRoYXQgYXJlIGFsc28gaW5zdGFuY2VzIG9mIGBOb2RlYC5cblxuTm9kZXMgYXJlIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVzLiBJbnN0ZWFkIG9mIGNoYW5naW5nIHRoZW0sIHlvdVxuY3JlYXRlIG5ldyBvbmVzIHdpdGggdGhlIGNvbnRlbnQgeW91IHdhbnQuIE9sZCBvbmVzIGtlZXAgcG9pbnRpbmdcbmF0IHRoZSBvbGQgZG9jdW1lbnQgc2hhcGUuIFRoaXMgaXMgbWFkZSBjaGVhcGVyIGJ5IHNoYXJpbmdcbnN0cnVjdHVyZSBiZXR3ZWVuIHRoZSBvbGQgYW5kIG5ldyBkYXRhIGFzIG11Y2ggYXMgcG9zc2libGUsIHdoaWNoIGFcbnRyZWUgc2hhcGUgbGlrZSB0aGlzICh3aXRob3V0IGJhY2sgcG9pbnRlcnMpIG1ha2VzIGVhc3kuXG5cbioqRG8gbm90KiogZGlyZWN0bHkgbXV0YXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGEgYE5vZGVgIG9iamVjdC4gU2VlXG5bdGhlIGd1aWRlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyNkb2MpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuKi9cbmNsYXNzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2Ygbm9kZSB0aGF0IHRoaXMgaXMuXG4gICAgKi9cbiAgICB0eXBlLCBcbiAgICAvKipcbiAgICBBbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzLiBUaGUga2luZCBvZlxuICAgIGF0dHJpYnV0ZXMgYWxsb3dlZCBhbmQgcmVxdWlyZWQgYXJlXG4gICAgW2RldGVybWluZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5hdHRycykgYnkgdGhlIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGF0dHJzLCBcbiAgICAvLyBBIGZyYWdtZW50IGhvbGRpbmcgdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICBjb250ZW50LCBcbiAgICAvKipcbiAgICBUaGUgbWFya3MgKHRoaW5ncyBsaWtlIHdoZXRoZXIgaXQgaXMgZW1waGFzaXplZCBvciBwYXJ0IG9mIGFcbiAgICBsaW5rKSBhcHBsaWVkIHRvIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIG1hcmtzID0gTWFyay5ub25lKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50IHx8IEZyYWdtZW50LmVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgYXJyYXkgb2YgdGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgKi9cbiAgICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudDsgfVxuICAgIC8qKlxuICAgIFRoZSBzaXplIG9mIHRoaXMgbm9kZSwgYXMgZGVmaW5lZCBieSB0aGUgaW50ZWdlci1iYXNlZCBbaW5kZXhpbmdcbiAgICBzY2hlbWVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI2RvYy5pbmRleGluZykuIEZvciB0ZXh0IG5vZGVzLCB0aGlzIGlzIHRoZVxuICAgIGFtb3VudCBvZiBjaGFyYWN0ZXJzLiBGb3Igb3RoZXIgbGVhZiBub2RlcywgaXQgaXMgb25lLiBGb3JcbiAgICBub24tbGVhZiBub2RlcywgaXQgaXMgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcGx1cyB0d28gKHRoZVxuICAgIHN0YXJ0IGFuZCBlbmQgdG9rZW4pLlxuICAgICovXG4gICAgZ2V0IG5vZGVTaXplKCkgeyByZXR1cm4gdGhpcy5pc0xlYWYgPyAxIDogMiArIHRoaXMuY29udGVudC5zaXplOyB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IHRoZSBub2RlIGhhcy5cbiAgICAqL1xuICAgIGdldCBjaGlsZENvdW50KCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkQ291bnQ7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LiBSYWlzZXMgYW4gZXJyb3Igd2hlbiB0aGVcbiAgICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgKi9cbiAgICBjaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmNoaWxkKGluZGV4KTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGl0IGV4aXN0cy5cbiAgICAqL1xuICAgIG1heWJlQ2hpbGQoaW5kZXgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5tYXliZUNoaWxkKGluZGV4KTsgfVxuICAgIC8qKlxuICAgIENhbGwgYGZgIGZvciBldmVyeSBjaGlsZCBub2RlLCBwYXNzaW5nIHRoZSBub2RlLCBpdHMgb2Zmc2V0XG4gICAgaW50byB0aGlzIHBhcmVudCBub2RlLCBhbmQgaXRzIGluZGV4LlxuICAgICovXG4gICAgZm9yRWFjaChmKSB7IHRoaXMuY29udGVudC5mb3JFYWNoKGYpOyB9XG4gICAgLyoqXG4gICAgSW52b2tlIGEgY2FsbGJhY2sgZm9yIGFsbCBkZXNjZW5kYW50IG5vZGVzIHJlY3Vyc2l2ZWx5IGJldHdlZW5cbiAgICB0aGUgZ2l2ZW4gdHdvIHBvc2l0aW9ucyB0aGF0IGFyZSByZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzXG4gICAgbm9kZSdzIGNvbnRlbnQuIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdpdGggdGhlIG5vZGUsIGl0c1xuICAgIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBub2RlIChtZXRob2QgcmVjZWl2ZXIpLFxuICAgIGl0cyBwYXJlbnQgbm9kZSwgYW5kIGl0cyBjaGlsZCBpbmRleC4gV2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJuc1xuICAgIGZhbHNlIGZvciBhIGdpdmVuIG5vZGUsIHRoYXQgbm9kZSdzIGNoaWxkcmVuIHdpbGwgbm90IGJlXG4gICAgcmVjdXJzZWQgb3Zlci4gVGhlIGxhc3QgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYVxuICAgIHN0YXJ0aW5nIHBvc2l0aW9uIHRvIGNvdW50IGZyb20uXG4gICAgKi9cbiAgICBub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zID0gMCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBzdGFydFBvcywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIERvZXNuJ3RcbiAgICBkZXNjZW5kIGludG8gYSBub2RlIHdoZW4gdGhlIGNhbGxiYWNrIHJldHVybnMgYGZhbHNlYC5cbiAgICAqL1xuICAgIGRlc2NlbmRhbnRzKGYpIHtcbiAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIGYpO1xuICAgIH1cbiAgICAvKipcbiAgICBDb25jYXRlbmF0ZXMgYWxsIHRoZSB0ZXh0IG5vZGVzIGZvdW5kIGluIHRoaXMgZnJhZ21lbnQgYW5kIGl0c1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IHRleHRDb250ZW50KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaXNMZWFmICYmIHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KVxuICAgICAgICAgICAgPyB0aGlzLnR5cGUuc3BlYy5sZWFmVGV4dCh0aGlzKVxuICAgICAgICAgICAgOiB0aGlzLnRleHRCZXR3ZWVuKDAsIHRoaXMuY29udGVudC5zaXplLCBcIlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGFsbCB0ZXh0IGJldHdlZW4gcG9zaXRpb25zIGBmcm9tYCBhbmQgYHRvYC4gV2hlblxuICAgIGBibG9ja1NlcGFyYXRvcmAgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgaW5zZXJ0ZWQgdG8gc2VwYXJhdGUgdGV4dFxuICAgIGZyb20gZGlmZmVyZW50IGJsb2NrIG5vZGVzLiBJZiBgbGVhZlRleHRgIGlzIGdpdmVuLCBpdCdsbCBiZVxuICAgIGluc2VydGVkIGZvciBldmVyeSBub24tdGV4dCBsZWFmIG5vZGUgZW5jb3VudGVyZWQsIG90aGVyd2lzZVxuICAgIFtgbGVhZlRleHRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWNebGVhZlRleHQpIHdpbGwgYmUgdXNlZC5cbiAgICAqL1xuICAgIHRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBmaXJzdCBjaGlsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IGZpcnN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdGhpcyBub2RlJ3MgbGFzdCBjaGlsZCwgb3IgYG51bGxgIGlmIHRoZXJlIGFyZSBub1xuICAgIGNoaWxkcmVuLlxuICAgICovXG4gICAgZ2V0IGxhc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sYXN0Q2hpbGQ7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgdHdvIG5vZGVzIHJlcHJlc2VudCB0aGUgc2FtZSBwaWVjZSBvZiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8ICh0aGlzLnNhbWVNYXJrdXAob3RoZXIpICYmIHRoaXMuY29udGVudC5lcShvdGhlci5jb250ZW50KSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhlIG1hcmt1cCAodHlwZSwgYXR0cmlidXRlcywgYW5kIG1hcmtzKSBvZiB0aGlzIG5vZGUgdG9cbiAgICB0aG9zZSBvZiBhbm90aGVyLiBSZXR1cm5zIGB0cnVlYCBpZiBib3RoIGhhdmUgdGhlIHNhbWUgbWFya3VwLlxuICAgICovXG4gICAgc2FtZU1hcmt1cChvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNNYXJrdXAob3RoZXIudHlwZSwgb3RoZXIuYXR0cnMsIG90aGVyLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIG5vZGUncyBtYXJrdXAgY29ycmVzcG9uZCB0byB0aGUgZ2l2ZW4gdHlwZSxcbiAgICBhdHRyaWJ1dGVzLCBhbmQgbWFya3MuXG4gICAgKi9cbiAgICBoYXNNYXJrdXAodHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gdHlwZSAmJlxuICAgICAgICAgICAgY29tcGFyZURlZXAodGhpcy5hdHRycywgYXR0cnMgfHwgdHlwZS5kZWZhdWx0QXR0cnMgfHwgZW1wdHlBdHRycykgJiZcbiAgICAgICAgICAgIE1hcmsuc2FtZVNldCh0aGlzLm1hcmtzLCBtYXJrcyB8fCBNYXJrLm5vbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgbm9kZSB3aXRoIHRoZSBzYW1lIG1hcmt1cCBhcyB0aGlzIG5vZGUsIGNvbnRhaW5pbmdcbiAgICB0aGUgZ2l2ZW4gY29udGVudCAob3IgZW1wdHksIGlmIG5vIGNvbnRlbnQgaXMgZ2l2ZW4pLlxuICAgICovXG4gICAgY29weShjb250ZW50ID0gbnVsbCkge1xuICAgICAgICBpZiAoY29udGVudCA9PSB0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgY29udGVudCwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlLCB3aXRoIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgaW5zdGVhZFxuICAgIG9mIHRoZSBub2RlJ3Mgb3duIG1hcmtzLlxuICAgICovXG4gICAgbWFyayhtYXJrcykge1xuICAgICAgICByZXR1cm4gbWFya3MgPT0gdGhpcy5tYXJrcyA/IHRoaXMgOiBuZXcgTm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMuY29udGVudCwgbWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBjb3B5IG9mIHRoaXMgbm9kZSB3aXRoIG9ubHkgdGhlIGNvbnRlbnQgYmV0d2VlbiB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbnMuIElmIGB0b2AgaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mXG4gICAgdGhlIG5vZGUuXG4gICAgKi9cbiAgICBjdXQoZnJvbSwgdG8gPSB0aGlzLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmNvcHkodGhpcy5jb250ZW50LmN1dChmcm9tLCB0bykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDdXQgb3V0IHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMsIGFuZFxuICAgIHJldHVybiBpdCBhcyBhIGBTbGljZWAgb2JqZWN0LlxuICAgICovXG4gICAgc2xpY2UoZnJvbSwgdG8gPSB0aGlzLmNvbnRlbnQuc2l6ZSwgaW5jbHVkZVBhcmVudHMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZnJvbSA9PSB0bylcbiAgICAgICAgICAgIHJldHVybiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0aGlzLnJlc29sdmUodG8pO1xuICAgICAgICBsZXQgZGVwdGggPSBpbmNsdWRlUGFyZW50cyA/IDAgOiAkZnJvbS5zaGFyZWREZXB0aCh0byk7XG4gICAgICAgIGxldCBzdGFydCA9ICRmcm9tLnN0YXJ0KGRlcHRoKSwgbm9kZSA9ICRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgICBsZXQgY29udGVudCA9IG5vZGUuY29udGVudC5jdXQoJGZyb20ucG9zIC0gc3RhcnQsICR0by5wb3MgLSBzdGFydCk7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UoY29udGVudCwgJGZyb20uZGVwdGggLSBkZXB0aCwgJHRvLmRlcHRoIC0gZGVwdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMgd2l0aFxuICAgIHRoZSBnaXZlbiBzbGljZS4gVGhlIHNsaWNlIG11c3QgJ2ZpdCcsIG1lYW5pbmcgaXRzIG9wZW4gc2lkZXNcbiAgICBtdXN0IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGUgc3Vycm91bmRpbmcgY29udGVudCwgYW5kIGl0c1xuICAgIGNvbnRlbnQgbm9kZXMgbXVzdCBiZSB2YWxpZCBjaGlsZHJlbiBmb3IgdGhlIG5vZGUgdGhleSBhcmUgcGxhY2VkXG4gICAgaW50by4gSWYgYW55IG9mIHRoaXMgaXMgdmlvbGF0ZWQsIGFuIGVycm9yIG9mIHR5cGVcbiAgICBbYFJlcGxhY2VFcnJvcmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5SZXBsYWNlRXJyb3IpIGlzIHRocm93bi5cbiAgICAqL1xuICAgIHJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlKHRoaXMucmVzb2x2ZShmcm9tKSwgdGhpcy5yZXNvbHZlKHRvKSwgc2xpY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBub2RlIGRpcmVjdGx5IGFmdGVyIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG5vZGVBdChwb3MpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRoaXM7Oykge1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IHBvcyB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIHBvcyAtPSBvZmZzZXQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIChkaXJlY3QpIGNoaWxkIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQWZ0ZXIocG9zKSB7XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpLCBpbmRleCwgb2Zmc2V0IH07XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIChkaXJlY3QpIGNoaWxkIG5vZGUgYmVmb3JlIHRoZSBnaXZlbiBvZmZzZXQsIGlmIGFueSxcbiAgICBhbmQgcmV0dXJuIGl0IGFsb25nIHdpdGggaXRzIGluZGV4IGFuZCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhpc1xuICAgIG5vZGUuXG4gICAgKi9cbiAgICBjaGlsZEJlZm9yZShwb3MpIHtcbiAgICAgICAgaWYgKHBvcyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogbnVsbCwgaW5kZXg6IDAsIG9mZnNldDogMCB9O1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSB0aGlzLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgIGlmIChvZmZzZXQgPCBwb3MpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpLCBpbmRleCwgb2Zmc2V0IH07XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5jb250ZW50LmNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgIHJldHVybiB7IG5vZGUsIGluZGV4OiBpbmRleCAtIDEsIG9mZnNldDogb2Zmc2V0IC0gbm9kZS5ub2RlU2l6ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBSZXNvbHZlIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQsIHJldHVybmluZyBhblxuICAgIFtvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5SZXNvbHZlZFBvcykgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY29udGV4dC5cbiAgICAqL1xuICAgIHJlc29sdmUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlQ2FjaGVkKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlc29sdmVOb0NhY2hlKHBvcykgeyByZXR1cm4gUmVzb2x2ZWRQb3MucmVzb2x2ZSh0aGlzLCBwb3MpOyB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIGEgZ2l2ZW4gbWFyayBvciBtYXJrIHR5cGUgb2NjdXJzIGluIHRoaXMgZG9jdW1lbnRcbiAgICBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgICovXG4gICAgcmFuZ2VIYXNNYXJrKGZyb20sIHRvLCB0eXBlKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodG8gPiBmcm9tKVxuICAgICAgICAgICAgdGhpcy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWZvdW5kO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBibG9jayAobm9uLWlubGluZSBub2RlKVxuICAgICovXG4gICAgZ2V0IGlzQmxvY2soKSB7IHJldHVybiB0aGlzLnR5cGUuaXNCbG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgdGV4dGJsb2NrIG5vZGUsIGEgYmxvY2sgbm9kZSB3aXRoIGlubGluZVxuICAgIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0YmxvY2soKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0YmxvY2s7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGFsbG93cyBpbmxpbmUgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpbmxpbmVDb250ZW50KCkgeyByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhbiBpbmxpbmUgbm9kZSAoYSB0ZXh0IG5vZGUgb3IgYSBub2RlIHRoYXQgY2FuXG4gICAgYXBwZWFyIGFtb25nIHRleHQpLlxuICAgICovXG4gICAgZ2V0IGlzSW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzSW5saW5lOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0IG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0KCkgeyByZXR1cm4gdGhpcy50eXBlLmlzVGV4dDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgZ2V0IGlzTGVhZigpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0xlYWY7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhbiBhdG9tLCBpLmUuIHdoZW4gaXQgZG9lcyBub3QgaGF2ZSBkaXJlY3RseVxuICAgIGVkaXRhYmxlIGNvbnRlbnQuIFRoaXMgaXMgdXN1YWxseSB0aGUgc2FtZSBhcyBgaXNMZWFmYCwgYnV0IGNhblxuICAgIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgW2BhdG9tYCBwcm9wZXJ0eV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmF0b20pXG4gICAgb24gYSBub2RlJ3Mgc3BlYyAodHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBpcyBkaXNwbGF5ZWQgYXNcbiAgICBhbiB1bmVkaXRhYmxlIFtub2RlIHZpZXddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3Lk5vZGVWaWV3KSkuXG4gICAgKi9cbiAgICBnZXQgaXNBdG9tKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzQXRvbTsgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUgZm9yIGRlYnVnZ2luZ1xuICAgIHB1cnBvc2VzLlxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcodGhpcyk7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy50eXBlLm5hbWU7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG5hbWUgKz0gXCIoXCIgKyB0aGlzLmNvbnRlbnQudG9TdHJpbmdJbm5lcigpICsgXCIpXCI7XG4gICAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgbmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY29udGVudCBtYXRjaCBpbiB0aGlzIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgICovXG4gICAgY29udGVudE1hdGNoQXQoaW5kZXgpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gdGhpcy50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgMCwgaW5kZXgpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FsbGVkIGNvbnRlbnRNYXRjaEF0IG9uIGEgbm9kZSB3aXRoIGludmFsaWQgY29udGVudFwiKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgcmVwbGFjaW5nIHRoZSByYW5nZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCAoYnlcbiAgICBjaGlsZCBpbmRleCkgd2l0aCB0aGUgZ2l2ZW4gcmVwbGFjZW1lbnQgZnJhZ21lbnQgKHdoaWNoIGRlZmF1bHRzXG4gICAgdG8gdGhlIGVtcHR5IGZyYWdtZW50KSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuIFlvdVxuICAgIGNhbiBvcHRpb25hbGx5IHBhc3MgYHN0YXJ0YCBhbmQgYGVuZGAgaW5kaWNlcyBpbnRvIHRoZVxuICAgIHJlcGxhY2VtZW50IGZyYWdtZW50LlxuICAgICovXG4gICAgY2FuUmVwbGFjZShmcm9tLCB0bywgcmVwbGFjZW1lbnQgPSBGcmFnbWVudC5lbXB0eSwgc3RhcnQgPSAwLCBlbmQgPSByZXBsYWNlbWVudC5jaGlsZENvdW50KSB7XG4gICAgICAgIGxldCBvbmUgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoRnJhZ21lbnQocmVwbGFjZW1lbnQsIHN0YXJ0LCBlbmQpO1xuICAgICAgICBsZXQgdHdvID0gb25lICYmIG9uZS5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgdG8pO1xuICAgICAgICBpZiAoIXR3byB8fCAhdHdvLnZhbGlkRW5kKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy50eXBlLmFsbG93c01hcmtzKHJlcGxhY2VtZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgcmVwbGFjaW5nIHRoZSByYW5nZSBgZnJvbWAgdG8gYHRvYCAoYnkgaW5kZXgpIHdpdGhcbiAgICBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgd291bGQgbGVhdmUgdGhlIG5vZGUncyBjb250ZW50IHZhbGlkLlxuICAgICovXG4gICAgY2FuUmVwbGFjZVdpdGgoZnJvbSwgdG8sIHR5cGUsIG1hcmtzKSB7XG4gICAgICAgIGlmIChtYXJrcyAmJiAhdGhpcy50eXBlLmFsbG93c01hcmtzKG1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5jb250ZW50TWF0Y2hBdChmcm9tKS5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIGxldCBlbmQgPSBzdGFydCAmJiBzdGFydC5tYXRjaEZyYWdtZW50KHRoaXMuY29udGVudCwgdG8pO1xuICAgICAgICByZXR1cm4gZW5kID8gZW5kLnZhbGlkRW5kIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSdzIGNvbnRlbnQgY291bGQgYmUgYXBwZW5kZWQgdG8gdGhpc1xuICAgIG5vZGUuIElmIHRoYXQgbm9kZSBpcyBlbXB0eSwgdGhpcyB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlcmVcbiAgICBpcyBhdCBsZWFzdCBvbmUgbm9kZSB0eXBlIHRoYXQgY2FuIGFwcGVhciBpbiBib3RoIG5vZGVzICh0byBhdm9pZFxuICAgIG1lcmdpbmcgY29tcGxldGVseSBpbmNvbXBhdGlibGUgbm9kZXMpLlxuICAgICovXG4gICAgY2FuQXBwZW5kKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlci5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYW5SZXBsYWNlKHRoaXMuY2hpbGRDb3VudCwgdGhpcy5jaGlsZENvdW50LCBvdGhlci5jb250ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5jb21wYXRpYmxlQ29udGVudChvdGhlci50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2hlY2sgd2hldGhlciB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyBjb25mb3JtIHRvIHRoZVxuICAgIHNjaGVtYSwgYW5kIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZXkgZG8gbm90LlxuICAgICovXG4gICAgY2hlY2soKSB7XG4gICAgICAgIHRoaXMudHlwZS5jaGVja0NvbnRlbnQodGhpcy5jb250ZW50KTtcbiAgICAgICAgdGhpcy50eXBlLmNoZWNrQXR0cnModGhpcy5hdHRycyk7XG4gICAgICAgIGxldCBjb3B5ID0gTWFyay5ub25lO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXJrID0gdGhpcy5tYXJrc1tpXTtcbiAgICAgICAgICAgIG1hcmsudHlwZS5jaGVja0F0dHJzKG1hcmsuYXR0cnMpO1xuICAgICAgICAgICAgY29weSA9IG1hcmsuYWRkVG9TZXQoY29weSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQoY29weSwgdGhpcy5tYXJrcykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb2xsZWN0aW9uIG9mIG1hcmtzIGZvciBub2RlICR7dGhpcy50eXBlLm5hbWV9OiAke3RoaXMubWFya3MubWFwKG0gPT4gbS50eXBlLm5hbWUpfWApO1xuICAgICAgICB0aGlzLmNvbnRlbnQuZm9yRWFjaChub2RlID0+IG5vZGUuY2hlY2soKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBvYmogPSB7IHR5cGU6IHRoaXMudHlwZS5uYW1lIH07XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5hdHRycykge1xuICAgICAgICAgICAgb2JqLmF0dHJzID0gdGhpcy5hdHRycztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIG9iai5jb250ZW50ID0gdGhpcy5jb250ZW50LnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5tYXJrcy5sZW5ndGgpXG4gICAgICAgICAgICBvYmoubWFya3MgPSB0aGlzLm1hcmtzLm1hcChuID0+IG4udG9KU09OKCkpO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgbWFya3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChqc29uLm1hcmtzKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbi5tYXJrcykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIG1hcmsgZGF0YSBmb3IgTm9kZS5mcm9tSlNPTlwiKTtcbiAgICAgICAgICAgIG1hcmtzID0ganNvbi5tYXJrcy5tYXAoc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzb24udHlwZSA9PSBcInRleHRcIikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uLnRleHQgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGV4dCBub2RlIGluIEpTT05cIik7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLnRleHQoanNvbi50ZXh0LCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tSlNPTihzY2hlbWEsIGpzb24uY29udGVudCk7XG4gICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVUeXBlKGpzb24udHlwZSkuY3JlYXRlKGpzb24uYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICAgICAgbm9kZS50eXBlLmNoZWNrQXR0cnMobm9kZS5hdHRycyk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbk5vZGUucHJvdG90eXBlLnRleHQgPSB1bmRlZmluZWQ7XG5jbGFzcyBUZXh0Tm9kZSBleHRlbmRzIE5vZGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgYXR0cnMsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIGF0dHJzLCBudWxsLCBtYXJrcyk7XG4gICAgICAgIGlmICghY29udGVudClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRW1wdHkgdGV4dCBub2RlcyBhcmUgbm90IGFsbG93ZWRcIik7XG4gICAgICAgIHRoaXMudGV4dCA9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKHRoaXMpO1xuICAgICAgICByZXR1cm4gd3JhcE1hcmtzKHRoaXMubWFya3MsIEpTT04uc3RyaW5naWZ5KHRoaXMudGV4dCkpO1xuICAgIH1cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7IHJldHVybiB0aGlzLnRleHQ7IH1cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bykgeyByZXR1cm4gdGhpcy50ZXh0LnNsaWNlKGZyb20sIHRvKTsgfVxuICAgIGdldCBub2RlU2l6ZSgpIHsgcmV0dXJuIHRoaXMudGV4dC5sZW5ndGg7IH1cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBUZXh0Tm9kZSh0aGlzLnR5cGUsIHRoaXMuYXR0cnMsIHRoaXMudGV4dCwgbWFya3MpO1xuICAgIH1cbiAgICB3aXRoVGV4dCh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ID09IHRoaXMudGV4dClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGV4dCwgdGhpcy5tYXJrcyk7XG4gICAgfVxuICAgIGN1dChmcm9tID0gMCwgdG8gPSB0aGlzLnRleHQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy50ZXh0Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy53aXRoVGV4dCh0aGlzLnRleHQuc2xpY2UoZnJvbSwgdG8pKTtcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy50ZXh0ID09IG90aGVyLnRleHQ7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGJhc2UgPSBzdXBlci50b0pTT04oKTtcbiAgICAgICAgYmFzZS50ZXh0ID0gdGhpcy50ZXh0O1xuICAgICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwTWFya3MobWFya3MsIHN0cikge1xuICAgIGZvciAobGV0IGkgPSBtYXJrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgc3RyID0gbWFya3NbaV0udHlwZS5uYW1lICsgXCIoXCIgKyBzdHIgKyBcIilcIjtcbiAgICByZXR1cm4gc3RyO1xufVxuXG4vKipcbkluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIG1hdGNoIHN0YXRlIG9mIGEgbm9kZSB0eXBlJ3Ncbltjb250ZW50IGV4cHJlc3Npb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5jb250ZW50KSwgYW5kIGNhbiBiZSB1c2VkIHRvXG5maW5kIG91dCB3aGV0aGVyIGZ1cnRoZXIgY29udGVudCBtYXRjaGVzIGhlcmUsIGFuZCB3aGV0aGVyIGEgZ2l2ZW5cbnBvc2l0aW9uIGlzIGEgdmFsaWQgZW5kIG9mIHRoZSBub2RlLlxuKi9cbmNsYXNzIENvbnRlbnRNYXRjaCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBtYXRjaCBzdGF0ZSByZXByZXNlbnRzIGEgdmFsaWQgZW5kIG9mIHRoZSBub2RlLlxuICAgICovXG4gICAgdmFsaWRFbmQpIHtcbiAgICAgICAgdGhpcy52YWxpZEVuZCA9IHZhbGlkRW5kO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubmV4dCA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMud3JhcENhY2hlID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHBhcnNlKHN0cmluZywgbm9kZVR5cGVzKSB7XG4gICAgICAgIGxldCBzdHJlYW0gPSBuZXcgVG9rZW5TdHJlYW0oc3RyaW5nLCBub2RlVHlwZXMpO1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBDb250ZW50TWF0Y2guZW1wdHk7XG4gICAgICAgIGxldCBleHByID0gcGFyc2VFeHByKHN0cmVhbSk7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dClcbiAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJVbmV4cGVjdGVkIHRyYWlsaW5nIHRleHRcIik7XG4gICAgICAgIGxldCBtYXRjaCA9IGRmYShuZmEoZXhwcikpO1xuICAgICAgICBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hdGNoIGEgbm9kZSB0eXBlLCByZXR1cm5pbmcgYSBtYXRjaCBhZnRlciB0aGF0IG5vZGUgaWZcbiAgICBzdWNjZXNzZnVsLlxuICAgICovXG4gICAgbWF0Y2hUeXBlKHR5cGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0W2ldLnR5cGUgPT0gdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0W2ldLm5leHQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gbWF0Y2ggYSBmcmFnbWVudC4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIG1hdGNoIHdoZW5cbiAgICBzdWNjZXNzZnVsLlxuICAgICovXG4gICAgbWF0Y2hGcmFnbWVudChmcmFnLCBzdGFydCA9IDAsIGVuZCA9IGZyYWcuY2hpbGRDb3VudCkge1xuICAgICAgICBsZXQgY3VyID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBjdXIgJiYgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgY3VyID0gY3VyLm1hdGNoVHlwZShmcmFnLmNoaWxkKGkpLnR5cGUpO1xuICAgICAgICByZXR1cm4gY3VyO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCBpbmxpbmVDb250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Lmxlbmd0aCAhPSAwICYmIHRoaXMubmV4dFswXS50eXBlLmlzSW5saW5lO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGZpcnN0IG1hdGNoaW5nIG5vZGUgdHlwZSBhdCB0aGlzIG1hdGNoIHBvc2l0aW9uIHRoYXQgY2FuXG4gICAgYmUgZ2VuZXJhdGVkLlxuICAgICovXG4gICAgZ2V0IGRlZmF1bHRUeXBlKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSB9ID0gdGhpcy5uZXh0W2ldO1xuICAgICAgICAgICAgaWYgKCEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXBhdGlibGUob3RoZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG90aGVyLm5leHQubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmV4dFtpXS50eXBlID09IG90aGVyLm5leHRbal0udHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1hdGNoIHRoZSBnaXZlbiBmcmFnbWVudCwgYW5kIGlmIHRoYXQgZmFpbHMsIHNlZSBpZiBpdCBjYW5cbiAgICBiZSBtYWRlIHRvIG1hdGNoIGJ5IGluc2VydGluZyBub2RlcyBpbiBmcm9udCBvZiBpdC4gV2hlblxuICAgIHN1Y2Nlc3NmdWwsIHJldHVybiBhIGZyYWdtZW50IG9mIGluc2VydGVkIG5vZGVzICh3aGljaCBtYXkgYmVcbiAgICBlbXB0eSBpZiBub3RoaW5nIGhhZCB0byBiZSBpbnNlcnRlZCkuIFdoZW4gYHRvRW5kYCBpcyB0cnVlLCBvbmx5XG4gICAgcmV0dXJuIGEgZnJhZ21lbnQgaWYgdGhlIHJlc3VsdGluZyBtYXRjaCBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlXG4gICAgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZmlsbEJlZm9yZShhZnRlciwgdG9FbmQgPSBmYWxzZSwgc3RhcnRJbmRleCA9IDApIHtcbiAgICAgICAgbGV0IHNlZW4gPSBbdGhpc107XG4gICAgICAgIGZ1bmN0aW9uIHNlYXJjaChtYXRjaCwgdHlwZXMpIHtcbiAgICAgICAgICAgIGxldCBmaW5pc2hlZCA9IG1hdGNoLm1hdGNoRnJhZ21lbnQoYWZ0ZXIsIHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkICYmICghdG9FbmQgfHwgZmluaXNoZWQudmFsaWRFbmQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBGcmFnbWVudC5mcm9tKHR5cGVzLm1hcCh0cCA9PiB0cC5jcmVhdGVBbmRGaWxsKCkpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2gubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLm5leHRbaV07XG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpICYmIHNlZW4uaW5kZXhPZihuZXh0KSA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuLnB1c2gobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IHNlYXJjaChuZXh0LCB0eXBlcy5jb25jYXQodHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlYXJjaCh0aGlzLCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYSBzZXQgb2Ygd3JhcHBpbmcgbm9kZSB0eXBlcyB0aGF0IHdvdWxkIGFsbG93IGEgbm9kZSBvZiB0aGVcbiAgICBnaXZlbiB0eXBlIHRvIGFwcGVhciBhdCB0aGlzIHBvc2l0aW9uLiBUaGUgcmVzdWx0IG1heSBiZSBlbXB0eVxuICAgICh3aGVuIGl0IGZpdHMgZGlyZWN0bHkpIGFuZCB3aWxsIGJlIG51bGwgd2hlbiBubyBzdWNoIHdyYXBwaW5nXG4gICAgZXhpc3RzLlxuICAgICovXG4gICAgZmluZFdyYXBwaW5nKHRhcmdldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud3JhcENhY2hlLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKHRoaXMud3JhcENhY2hlW2ldID09IHRhcmdldClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwQ2FjaGVbaSArIDFdO1xuICAgICAgICBsZXQgY29tcHV0ZWQgPSB0aGlzLmNvbXB1dGVXcmFwcGluZyh0YXJnZXQpO1xuICAgICAgICB0aGlzLndyYXBDYWNoZS5wdXNoKHRhcmdldCwgY29tcHV0ZWQpO1xuICAgICAgICByZXR1cm4gY29tcHV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcHV0ZVdyYXBwaW5nKHRhcmdldCkge1xuICAgICAgICBsZXQgc2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCksIGFjdGl2ZSA9IFt7IG1hdGNoOiB0aGlzLCB0eXBlOiBudWxsLCB2aWE6IG51bGwgfV07XG4gICAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGFjdGl2ZS5zaGlmdCgpLCBtYXRjaCA9IGN1cnJlbnQubWF0Y2g7XG4gICAgICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2JqID0gY3VycmVudDsgb2JqLnR5cGU7IG9iaiA9IG9iai52aWEpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9iai50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2gubmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLm5leHRbaV07XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzTGVhZiAmJiAhdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkgJiYgISh0eXBlLm5hbWUgaW4gc2VlbikgJiYgKCFjdXJyZW50LnR5cGUgfHwgbmV4dC52YWxpZEVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlLnB1c2goeyBtYXRjaDogdHlwZS5jb250ZW50TWF0Y2gsIHR5cGUsIHZpYTogY3VycmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2Vlblt0eXBlLm5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBudW1iZXIgb2Ygb3V0Z29pbmcgZWRnZXMgdGhpcyBub2RlIGhhcyBpbiB0aGUgZmluaXRlXG4gICAgYXV0b21hdG9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBnZXQgZWRnZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0Lmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBfbl/igIt0aCBvdXRnb2luZyBlZGdlIGZyb20gdGhpcyBub2RlIGluIHRoZSBmaW5pdGVcbiAgICBhdXRvbWF0b24gdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGVkZ2Uobikge1xuICAgICAgICBpZiAobiA+PSB0aGlzLm5leHQubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZXJlJ3Mgbm8gJHtufXRoIGVkZ2UgaW4gdGhpcyBjb250ZW50IG1hdGNoYCk7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRbbl07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBzZWVuID0gW107XG4gICAgICAgIGZ1bmN0aW9uIHNjYW4obSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKG0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtLm5leHQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihtLm5leHRbaV0ubmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHNjYW4obS5uZXh0W2ldLm5leHQpO1xuICAgICAgICB9XG4gICAgICAgIHNjYW4odGhpcyk7XG4gICAgICAgIHJldHVybiBzZWVuLm1hcCgobSwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IG91dCA9IGkgKyAobS52YWxpZEVuZCA/IFwiKlwiIDogXCIgXCIpICsgXCIgXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBvdXQgKz0gKGkgPyBcIiwgXCIgOiBcIlwiKSArIG0ubmV4dFtpXS50eXBlLm5hbWUgKyBcIi0+XCIgKyBzZWVuLmluZGV4T2YobS5uZXh0W2ldLm5leHQpO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSkuam9pbihcIlxcblwiKTtcbiAgICB9XG59XG4vKipcbkBpbnRlcm5hbFxuKi9cbkNvbnRlbnRNYXRjaC5lbXB0eSA9IG5ldyBDb250ZW50TWF0Y2godHJ1ZSk7XG5jbGFzcyBUb2tlblN0cmVhbSB7XG4gICAgY29uc3RydWN0b3Ioc3RyaW5nLCBub2RlVHlwZXMpIHtcbiAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgICAgIHRoaXMubm9kZVR5cGVzID0gbm9kZVR5cGVzO1xuICAgICAgICB0aGlzLmlubGluZSA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy50b2tlbnMgPSBzdHJpbmcuc3BsaXQoL1xccyooPz1cXGJ8XFxXfCQpLyk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vuc1t0aGlzLnRva2Vucy5sZW5ndGggLSAxXSA9PSBcIlwiKVxuICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG4gICAgICAgIGlmICh0aGlzLnRva2Vuc1swXSA9PSBcIlwiKVxuICAgICAgICAgICAgdGhpcy50b2tlbnMuc2hpZnQoKTtcbiAgICB9XG4gICAgZ2V0IG5leHQoKSB7IHJldHVybiB0aGlzLnRva2Vuc1t0aGlzLnBvc107IH1cbiAgICBlYXQodG9rKSB7IHJldHVybiB0aGlzLm5leHQgPT0gdG9rICYmICh0aGlzLnBvcysrIHx8IHRydWUpOyB9XG4gICAgZXJyKHN0cikgeyB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3RyICsgXCIgKGluIGNvbnRlbnQgZXhwcmVzc2lvbiAnXCIgKyB0aGlzLnN0cmluZyArIFwiJylcIik7IH1cbn1cbmZ1bmN0aW9uIHBhcnNlRXhwcihzdHJlYW0pIHtcbiAgICBsZXQgZXhwcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICAgIGV4cHJzLnB1c2gocGFyc2VFeHByU2VxKHN0cmVhbSkpO1xuICAgIH0gd2hpbGUgKHN0cmVhbS5lYXQoXCJ8XCIpKTtcbiAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJjaG9pY2VcIiwgZXhwcnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclNlcShzdHJlYW0pIHtcbiAgICBsZXQgZXhwcnMgPSBbXTtcbiAgICBkbyB7XG4gICAgICAgIGV4cHJzLnB1c2gocGFyc2VFeHByU3Vic2NyaXB0KHN0cmVhbSkpO1xuICAgIH0gd2hpbGUgKHN0cmVhbS5uZXh0ICYmIHN0cmVhbS5uZXh0ICE9IFwiKVwiICYmIHN0cmVhbS5uZXh0ICE9IFwifFwiKTtcbiAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJzZXFcIiwgZXhwcnMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlRXhwclN1YnNjcmlwdChzdHJlYW0pIHtcbiAgICBsZXQgZXhwciA9IHBhcnNlRXhwckF0b20oc3RyZWFtKTtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChzdHJlYW0uZWF0KFwiK1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwicGx1c1wiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCIqXCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJzdGFyXCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIj9cIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcIm9wdFwiLCBleHByIH07XG4gICAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoXCJ7XCIpKVxuICAgICAgICAgICAgZXhwciA9IHBhcnNlRXhwclJhbmdlKHN0cmVhbSwgZXhwcik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbn1cbmZ1bmN0aW9uIHBhcnNlTnVtKHN0cmVhbSkge1xuICAgIGlmICgvXFxELy50ZXN0KHN0cmVhbS5uZXh0KSlcbiAgICAgICAgc3RyZWFtLmVycihcIkV4cGVjdGVkIG51bWJlciwgZ290ICdcIiArIHN0cmVhbS5uZXh0ICsgXCInXCIpO1xuICAgIGxldCByZXN1bHQgPSBOdW1iZXIoc3RyZWFtLm5leHQpO1xuICAgIHN0cmVhbS5wb3MrKztcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByUmFuZ2Uoc3RyZWFtLCBleHByKSB7XG4gICAgbGV0IG1pbiA9IHBhcnNlTnVtKHN0cmVhbSksIG1heCA9IG1pbjtcbiAgICBpZiAoc3RyZWFtLmVhdChcIixcIikpIHtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0ICE9IFwifVwiKVxuICAgICAgICAgICAgbWF4ID0gcGFyc2VOdW0oc3RyZWFtKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF4ID0gLTE7XG4gICAgfVxuICAgIGlmICghc3RyZWFtLmVhdChcIn1cIikpXG4gICAgICAgIHN0cmVhbS5lcnIoXCJVbmNsb3NlZCBicmFjZWQgcmFuZ2VcIik7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyYW5nZVwiLCBtaW4sIG1heCwgZXhwciB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZU5hbWUoc3RyZWFtLCBuYW1lKSB7XG4gICAgbGV0IHR5cGVzID0gc3RyZWFtLm5vZGVUeXBlcywgdHlwZSA9IHR5cGVzW25hbWVdO1xuICAgIGlmICh0eXBlKVxuICAgICAgICByZXR1cm4gW3R5cGVdO1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCB0eXBlTmFtZSBpbiB0eXBlcykge1xuICAgICAgICBsZXQgdHlwZSA9IHR5cGVzW3R5cGVOYW1lXTtcbiAgICAgICAgaWYgKHR5cGUuaXNJbkdyb3VwKG5hbWUpKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApXG4gICAgICAgIHN0cmVhbS5lcnIoXCJObyBub2RlIHR5cGUgb3IgZ3JvdXAgJ1wiICsgbmFtZSArIFwiJyBmb3VuZFwiKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByQXRvbShzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtLmVhdChcIihcIikpIHtcbiAgICAgICAgbGV0IGV4cHIgPSBwYXJzZUV4cHIoc3RyZWFtKTtcbiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KFwiKVwiKSlcbiAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXNzaW5nIGNsb3NpbmcgcGFyZW5cIik7XG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cbiAgICBlbHNlIGlmICghL1xcVy8udGVzdChzdHJlYW0ubmV4dCkpIHtcbiAgICAgICAgbGV0IGV4cHJzID0gcmVzb2x2ZU5hbWUoc3RyZWFtLCBzdHJlYW0ubmV4dCkubWFwKHR5cGUgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmVhbS5pbmxpbmUgPT0gbnVsbClcbiAgICAgICAgICAgICAgICBzdHJlYW0uaW5saW5lID0gdHlwZS5pc0lubGluZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5pbmxpbmUgIT0gdHlwZS5pc0lubGluZSlcbiAgICAgICAgICAgICAgICBzdHJlYW0uZXJyKFwiTWl4aW5nIGlubGluZSBhbmQgYmxvY2sgY29udGVudFwiKTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IFwibmFtZVwiLCB2YWx1ZTogdHlwZSB9O1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLnBvcysrO1xuICAgICAgICByZXR1cm4gZXhwcnMubGVuZ3RoID09IDEgPyBleHByc1swXSA6IHsgdHlwZTogXCJjaG9pY2VcIiwgZXhwcnMgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHN0cmVhbS5lcnIoXCJVbmV4cGVjdGVkIHRva2VuICdcIiArIHN0cmVhbS5uZXh0ICsgXCInXCIpO1xuICAgIH1cbn1cbi8vIENvbnN0cnVjdCBhbiBORkEgZnJvbSBhbiBleHByZXNzaW9uIGFzIHJldHVybmVkIGJ5IHRoZSBwYXJzZXIuIFRoZVxuLy8gTkZBIGlzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHN0YXRlcywgd2hpY2ggYXJlIHRoZW1zZWx2ZXNcbi8vIGFycmF5cyBvZiBlZGdlcywgd2hpY2ggYXJlIGB7dGVybSwgdG99YCBvYmplY3RzLiBUaGUgZmlyc3Qgc3RhdGUgaXNcbi8vIHRoZSBlbnRyeSBzdGF0ZSBhbmQgdGhlIGxhc3Qgbm9kZSBpcyB0aGUgc3VjY2VzcyBzdGF0ZS5cbi8vXG4vLyBOb3RlIHRoYXQgdW5saWtlIHR5cGljYWwgTkZBcywgdGhlIGVkZ2Ugb3JkZXJpbmcgaW4gdGhpcyBvbmUgaXNcbi8vIHNpZ25pZmljYW50LCBpbiB0aGF0IGl0IGlzIHVzZWQgdG8gY29udHJ1Y3QgZmlsbGVyIGNvbnRlbnQgd2hlblxuLy8gbmVjZXNzYXJ5LlxuZnVuY3Rpb24gbmZhKGV4cHIpIHtcbiAgICBsZXQgbmZhID0gW1tdXTtcbiAgICBjb25uZWN0KGNvbXBpbGUoZXhwciwgMCksIG5vZGUoKSk7XG4gICAgcmV0dXJuIG5mYTtcbiAgICBmdW5jdGlvbiBub2RlKCkgeyByZXR1cm4gbmZhLnB1c2goW10pIC0gMTsgfVxuICAgIGZ1bmN0aW9uIGVkZ2UoZnJvbSwgdG8sIHRlcm0pIHtcbiAgICAgICAgbGV0IGVkZ2UgPSB7IHRlcm0sIHRvIH07XG4gICAgICAgIG5mYVtmcm9tXS5wdXNoKGVkZ2UpO1xuICAgICAgICByZXR1cm4gZWRnZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29ubmVjdChlZGdlcywgdG8pIHtcbiAgICAgICAgZWRnZXMuZm9yRWFjaChlZGdlID0+IGVkZ2UudG8gPSB0byk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBpbGUoZXhwciwgZnJvbSkge1xuICAgICAgICBpZiAoZXhwci50eXBlID09IFwiY2hvaWNlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBleHByLmV4cHJzLnJlZHVjZSgob3V0LCBleHByKSA9PiBvdXQuY29uY2F0KGNvbXBpbGUoZXhwciwgZnJvbSkpLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwic2VxXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjb21waWxlKGV4cHIuZXhwcnNbaV0sIGZyb20pO1xuICAgICAgICAgICAgICAgIGlmIChpID09IGV4cHIuZXhwcnMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICAgICAgY29ubmVjdChuZXh0LCBmcm9tID0gbm9kZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzdGFyXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgZWRnZShmcm9tLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicGx1c1wiKSB7XG4gICAgICAgICAgICBsZXQgbG9vcCA9IG5vZGUoKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGZyb20pLCBsb29wKTtcbiAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGxvb3ApLCBsb29wKTtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShsb29wKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwib3B0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWRnZShmcm9tKV0uY29uY2F0KGNvbXBpbGUoZXhwci5leHByLCBmcm9tKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwicmFuZ2VcIikge1xuICAgICAgICAgICAgbGV0IGN1ciA9IGZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cHIubWluOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICBjdXIgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIubWF4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBleHByLm1pbjsgaSA8IGV4cHIubWF4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlKCk7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2UoY3VyLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgY3VyKSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGN1cildO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcIm5hbWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20sIHVuZGVmaW5lZCwgZXhwci52YWx1ZSldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBleHByIHR5cGVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYiAtIGE7IH1cbi8vIEdldCB0aGUgc2V0IG9mIG5vZGVzIHJlYWNoYWJsZSBieSBudWxsIGVkZ2VzIGZyb20gYG5vZGVgLiBPbWl0XG4vLyBub2RlcyB3aXRoIG9ubHkgYSBzaW5nbGUgbnVsbC1vdXQtZWRnZSwgc2luY2UgdGhleSBtYXkgbGVhZCB0b1xuLy8gbmVlZGxlc3MgZHVwbGljYXRlZCBub2Rlcy5cbmZ1bmN0aW9uIG51bGxGcm9tKG5mYSwgbm9kZSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBzY2FuKG5vZGUpO1xuICAgIHJldHVybiByZXN1bHQuc29ydChjbXApO1xuICAgIGZ1bmN0aW9uIHNjYW4obm9kZSkge1xuICAgICAgICBsZXQgZWRnZXMgPSBuZmFbbm9kZV07XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGggPT0gMSAmJiAhZWRnZXNbMF0udGVybSlcbiAgICAgICAgICAgIHJldHVybiBzY2FuKGVkZ2VzWzBdLnRvKTtcbiAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7IHRlcm0sIHRvIH0gPSBlZGdlc1tpXTtcbiAgICAgICAgICAgIGlmICghdGVybSAmJiByZXN1bHQuaW5kZXhPZih0bykgPT0gLTEpXG4gICAgICAgICAgICAgICAgc2Nhbih0byk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBDb21waWxlcyBhbiBORkEgYXMgcHJvZHVjZWQgYnkgYG5mYWAgaW50byBhIERGQSwgbW9kZWxlZCBhcyBhIHNldFxuLy8gb2Ygc3RhdGUgb2JqZWN0cyAoYENvbnRlbnRNYXRjaGAgaW5zdGFuY2VzKSB3aXRoIHRyYW5zaXRpb25zXG4vLyBiZXR3ZWVuIHRoZW0uXG5mdW5jdGlvbiBkZmEobmZhKSB7XG4gICAgbGV0IGxhYmVsZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHJldHVybiBleHBsb3JlKG51bGxGcm9tKG5mYSwgMCkpO1xuICAgIGZ1bmN0aW9uIGV4cGxvcmUoc3RhdGVzKSB7XG4gICAgICAgIGxldCBvdXQgPSBbXTtcbiAgICAgICAgc3RhdGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBuZmFbbm9kZV0uZm9yRWFjaCgoeyB0ZXJtLCB0byB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXJtKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbGV0IHNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKG91dFtpXVswXSA9PSB0ZXJtKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gb3V0W2ldWzFdO1xuICAgICAgICAgICAgICAgIG51bGxGcm9tKG5mYSwgdG8pLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goW3Rlcm0sIHNldCA9IFtdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXQuaW5kZXhPZihub2RlKSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgc3RhdGUgPSBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gPSBuZXcgQ29udGVudE1hdGNoKHN0YXRlcy5pbmRleE9mKG5mYS5sZW5ndGggLSAxKSA+IC0xKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZXMgPSBvdXRbaV1bMV0uc29ydChjbXApO1xuICAgICAgICAgICAgc3RhdGUubmV4dC5wdXNoKHsgdHlwZTogb3V0W2ldWzBdLCBuZXh0OiBsYWJlbGVkW3N0YXRlcy5qb2luKFwiLFwiKV0gfHwgZXhwbG9yZShzdGF0ZXMpIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0ZvckRlYWRFbmRzKG1hdGNoLCBzdHJlYW0pIHtcbiAgICBmb3IgKGxldCBpID0gMCwgd29yayA9IFttYXRjaF07IGkgPCB3b3JrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHdvcmtbaV0sIGRlYWQgPSAhc3RhdGUudmFsaWRFbmQsIG5vZGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RhdGUubmV4dC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gc3RhdGUubmV4dFtqXTtcbiAgICAgICAgICAgIG5vZGVzLnB1c2godHlwZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChkZWFkICYmICEodHlwZS5pc1RleHQgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpKVxuICAgICAgICAgICAgICAgIGRlYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh3b3JrLmluZGV4T2YobmV4dCkgPT0gLTEpXG4gICAgICAgICAgICAgICAgd29yay5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWFkKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk9ubHkgbm9uLWdlbmVyYXRhYmxlIG5vZGVzIChcIiArIG5vZGVzLmpvaW4oXCIsIFwiKSArIFwiKSBpbiBhIHJlcXVpcmVkIHBvc2l0aW9uIChzZWUgaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZ2VuZXJhdGFibGUpXCIpO1xuICAgIH1cbn1cblxuLy8gRm9yIG5vZGUgdHlwZXMgd2hlcmUgYWxsIGF0dHJzIGhhdmUgYSBkZWZhdWx0IHZhbHVlIChvciB3aGljaCBkb24ndFxuLy8gaGF2ZSBhbnkgYXR0cmlidXRlcyksIGJ1aWxkIHVwIGEgc2luZ2xlIHJldXNhYmxlIGRlZmF1bHQgYXR0cmlidXRlXG4vLyBvYmplY3QsIGFuZCB1c2UgaXQgZm9yIGFsbCBub2RlcyB0aGF0IGRvbid0IHNwZWNpZnkgc3BlY2lmaWNcbi8vIGF0dHJpYnV0ZXMuXG5mdW5jdGlvbiBkZWZhdWx0QXR0cnMoYXR0cnMpIHtcbiAgICBsZXQgZGVmYXVsdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGF0dHJOYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbYXR0ck5hbWVdO1xuICAgICAgICBpZiAoIWF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0c1thdHRyTmFtZV0gPSBhdHRyLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0cztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVBdHRycyhhdHRycywgdmFsdWUpIHtcbiAgICBsZXQgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGdpdmVuID0gdmFsdWUgJiYgdmFsdWVbbmFtZV07XG4gICAgICAgIGlmIChnaXZlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHIuaGFzRGVmYXVsdClcbiAgICAgICAgICAgICAgICBnaXZlbiA9IGF0dHIuZGVmYXVsdDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIHZhbHVlIHN1cHBsaWVkIGZvciBhdHRyaWJ1dGUgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBidWlsdFtuYW1lXSA9IGdpdmVuO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbHQ7XG59XG5mdW5jdGlvbiBjaGVja0F0dHJzKGF0dHJzLCB2YWx1ZXMsIHR5cGUsIG5hbWUpIHtcbiAgICBmb3IgKGxldCBuYW1lIGluIHZhbHVlcylcbiAgICAgICAgaWYgKCEobmFtZSBpbiBhdHRycykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVW5zdXBwb3J0ZWQgYXR0cmlidXRlICR7bmFtZX0gZm9yICR7dHlwZX0gb2YgdHlwZSAke25hbWV9YCk7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICBsZXQgYXR0ciA9IGF0dHJzW25hbWVdO1xuICAgICAgICBpZiAoYXR0ci52YWxpZGF0ZSlcbiAgICAgICAgICAgIGF0dHIudmFsaWRhdGUodmFsdWVzW25hbWVdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbml0QXR0cnModHlwZU5hbWUsIGF0dHJzKSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGF0dHJzKVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gbmV3IEF0dHJpYnV0ZSh0eXBlTmFtZSwgbmFtZSwgYXR0cnNbbmFtZV0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbk5vZGUgdHlwZXMgYXJlIG9iamVjdHMgYWxsb2NhdGVkIG9uY2UgcGVyIGBTY2hlbWFgIGFuZCB1c2VkIHRvXG5bdGFnXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50eXBlKSBgTm9kZWAgaW5zdGFuY2VzLiBUaGV5IGNvbnRhaW4gaW5mb3JtYXRpb25cbmFib3V0IHRoZSBub2RlIHR5cGUsIHN1Y2ggYXMgaXRzIG5hbWUgYW5kIHdoYXQga2luZCBvZiBub2RlIGl0XG5yZXByZXNlbnRzLlxuKi9cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBuYW1lIHRoZSBub2RlIHR5cGUgaGFzIGluIHRoaXMgc2NoZW1hLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQSBsaW5rIGJhY2sgdG8gdGhlIGBTY2hlbWFgIHRoZSBub2RlIHR5cGUgYmVsb25ncyB0by5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNwZWMgdGhhdCB0aGlzIHR5cGUgaXMgYmFzZWQgb25cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc2V0IG9mIG1hcmtzIGFsbG93ZWQgaW4gdGhpcyBub2RlLiBgbnVsbGAgbWVhbnMgYWxsIG1hcmtzXG4gICAgICAgIGFyZSBhbGxvd2VkLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcmtTZXQgPSBudWxsO1xuICAgICAgICB0aGlzLmdyb3VwcyA9IHNwZWMuZ3JvdXAgPyBzcGVjLmdyb3VwLnNwbGl0KFwiIFwiKSA6IFtdO1xuICAgICAgICB0aGlzLmF0dHJzID0gaW5pdEF0dHJzKG5hbWUsIHNwZWMuYXR0cnMpO1xuICAgICAgICB0aGlzLmRlZmF1bHRBdHRycyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5jb250ZW50TWF0Y2ggPSBudWxsO1xuICAgICAgICB0aGlzLmlubGluZUNvbnRlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQmxvY2sgPSAhKHNwZWMuaW5saW5lIHx8IG5hbWUgPT0gXCJ0ZXh0XCIpO1xuICAgICAgICB0aGlzLmlzVGV4dCA9IG5hbWUgPT0gXCJ0ZXh0XCI7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgdGhpcyBpcyBhbiBpbmxpbmUgdHlwZS5cbiAgICAqL1xuICAgIGdldCBpc0lubGluZSgpIHsgcmV0dXJuICF0aGlzLmlzQmxvY2s7IH1cbiAgICAvKipcbiAgICBUcnVlIGlmIHRoaXMgaXMgYSB0ZXh0YmxvY2sgdHlwZSwgYSBibG9jayB0aGF0IGNvbnRhaW5zIGlubGluZVxuICAgIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNUZXh0YmxvY2soKSB7IHJldHVybiB0aGlzLmlzQmxvY2sgJiYgdGhpcy5pbmxpbmVDb250ZW50OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSBmb3Igbm9kZSB0eXBlcyB0aGF0IGFsbG93IG5vIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy5jb250ZW50TWF0Y2ggPT0gQ29udGVudE1hdGNoLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBhbiBhdG9tLCBpLmUuIHdoZW4gaXQgZG9lcyBub3QgaGF2ZVxuICAgIGRpcmVjdGx5IGVkaXRhYmxlIGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgaXNBdG9tKCkgeyByZXR1cm4gdGhpcy5pc0xlYWYgfHwgISF0aGlzLnNwZWMuYXRvbTsgfVxuICAgIC8qKlxuICAgIFJldHVybiB0cnVlIHdoZW4gdGhpcyBub2RlIHR5cGUgaXMgcGFydCBvZiB0aGUgZ2l2ZW5cbiAgICBbZ3JvdXBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5ncm91cCkuXG4gICAgKi9cbiAgICBpc0luR3JvdXAoZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBzLmluZGV4T2YoZ3JvdXApID4gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBub2RlIHR5cGUncyBbd2hpdGVzcGFjZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLndoaXRlc3BhY2UpIG9wdGlvbi5cbiAgICAqL1xuICAgIGdldCB3aGl0ZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLndoaXRlc3BhY2UgfHwgKHRoaXMuc3BlYy5jb2RlID8gXCJwcmVcIiA6IFwibm9ybWFsXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGlzIG5vZGUgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBoYXNSZXF1aXJlZEF0dHJzKCkge1xuICAgICAgICBmb3IgKGxldCBuIGluIHRoaXMuYXR0cnMpXG4gICAgICAgICAgICBpZiAodGhpcy5hdHRyc1tuXS5pc1JlcXVpcmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbm9kZSBhbGxvd3Mgc29tZSBvZiB0aGUgc2FtZSBjb250ZW50IGFzXG4gICAgdGhlIGdpdmVuIG5vZGUgdHlwZS5cbiAgICAqL1xuICAgIGNvbXBhdGlibGVDb250ZW50KG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8IHRoaXMuY29udGVudE1hdGNoLmNvbXBhdGlibGUob3RoZXIuY29udGVudE1hdGNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wdXRlQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgaWYgKCFhdHRycyAmJiB0aGlzLmRlZmF1bHRBdHRycylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRBdHRycztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGBOb2RlYCBvZiB0aGlzIHR5cGUuIFRoZSBnaXZlbiBhdHRyaWJ1dGVzIGFyZVxuICAgIGNoZWNrZWQgYW5kIGRlZmF1bHRlZCAoeW91IGNhbiBwYXNzIGBudWxsYCB0byB1c2UgdGhlIHR5cGUnc1xuICAgIGRlZmF1bHRzIGVudGlyZWx5LCBpZiBubyByZXF1aXJlZCBhdHRyaWJ1dGVzIGV4aXN0KS4gYGNvbnRlbnRgXG4gICAgbWF5IGJlIGEgYEZyYWdtZW50YCwgYSBub2RlLCBhbiBhcnJheSBvZiBub2Rlcywgb3JcbiAgICBgbnVsbGAuIFNpbWlsYXJseSBgbWFya3NgIG1heSBiZSBgbnVsbGAgdG8gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICBzZXQgb2YgbWFya3MuXG4gICAgKi9cbiAgICBjcmVhdGUoYXR0cnMgPSBudWxsLCBjb250ZW50LCBtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5pc1RleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlVHlwZS5jcmVhdGUgY2FuJ3QgY29uc3RydWN0IHRleHQgbm9kZXNcIik7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyksIEZyYWdtZW50LmZyb20oY29udGVudCksIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBMaWtlIFtgY3JlYXRlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlLmNyZWF0ZSksIGJ1dCBjaGVjayB0aGUgZ2l2ZW4gY29udGVudFxuICAgIGFnYWluc3QgdGhlIG5vZGUgdHlwZSdzIGNvbnRlbnQgcmVzdHJpY3Rpb25zLCBhbmQgdGhyb3cgYW4gZXJyb3JcbiAgICBpZiBpdCBkb2Vzbid0IG1hdGNoLlxuICAgICovXG4gICAgY3JlYXRlQ2hlY2tlZChhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKGNvbnRlbnQpO1xuICAgICAgICB0aGlzLmNoZWNrQ29udGVudChjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKSwgY29udGVudCwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2BjcmVhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUuY3JlYXRlKSwgYnV0IHNlZSBpZiBpdCBpc1xuICAgIG5lY2Vzc2FyeSB0byBhZGQgbm9kZXMgdG8gdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgZ2l2ZW4gZnJhZ21lbnRcbiAgICB0byBtYWtlIGl0IGZpdCB0aGUgbm9kZS4gSWYgbm8gZml0dGluZyB3cmFwcGluZyBjYW4gYmUgZm91bmQsXG4gICAgcmV0dXJuIG51bGwuIE5vdGUgdGhhdCwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmVxdWlyZWQgbm9kZXMgY2FuXG4gICAgYWx3YXlzIGJlIGNyZWF0ZWQsIHRoaXMgd2lsbCBhbHdheXMgc3VjY2VlZCBpZiB5b3UgcGFzcyBudWxsIG9yXG4gICAgYEZyYWdtZW50LmVtcHR5YCBhcyBjb250ZW50LlxuICAgICovXG4gICAgY3JlYXRlQW5kRmlsbChhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGF0dHJzID0gdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpO1xuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbShjb250ZW50KTtcbiAgICAgICAgaWYgKGNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHRoaXMuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoY29udGVudCk7XG4gICAgICAgICAgICBpZiAoIWJlZm9yZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBiZWZvcmUuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXRjaGVkID0gdGhpcy5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgbGV0IGFmdGVyID0gbWF0Y2hlZCAmJiBtYXRjaGVkLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCBhdHRycywgY29udGVudC5hcHBlbmQoYWZ0ZXIpLCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyB2YWxpZCBjb250ZW50IGZvciB0aGlzIG5vZGVcbiAgICB0eXBlLlxuICAgICovXG4gICAgdmFsaWRDb250ZW50KGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoY29udGVudCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya3MoY29udGVudC5jaGlsZChpKS5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhyb3dzIGEgUmFuZ2VFcnJvciBpZiB0aGUgZ2l2ZW4gZnJhZ21lbnQgaXMgbm90IHZhbGlkIGNvbnRlbnQgZm9yIHRoaXNcbiAgICBub2RlIHR5cGUuXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0NvbnRlbnQoY29udGVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRDb250ZW50KGNvbnRlbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFsaWQgY29udGVudCBmb3Igbm9kZSAke3RoaXMubmFtZX06ICR7Y29udGVudC50b1N0cmluZygpLnNsaWNlKDAsIDUwKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0F0dHJzKGF0dHJzKSB7XG4gICAgICAgIGNoZWNrQXR0cnModGhpcy5hdHRycywgYXR0cnMsIFwibm9kZVwiLCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBtYXJrIHR5cGUgaXMgYWxsb3dlZCBpbiB0aGlzIG5vZGUuXG4gICAgKi9cbiAgICBhbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXJrU2V0ID09IG51bGwgfHwgdGhpcy5tYXJrU2V0LmluZGV4T2YobWFya1R5cGUpID4gLTE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtzIGFyZSBhbGxvd2VkIGluIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIGFsbG93c01hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcmtTZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93c01hcmtUeXBlKG1hcmtzW2ldLnR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZXMgdGhlIG1hcmtzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgbm9kZSBmcm9tIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBhbGxvd2VkTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya1NldCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgICAgICBsZXQgY29weTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93c01hcmtUeXBlKG1hcmtzW2ldLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgICAgICBjb3B5ID0gbWFya3Muc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb3B5KSB7XG4gICAgICAgICAgICAgICAgY29weS5wdXNoKG1hcmtzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWNvcHkgPyBtYXJrcyA6IGNvcHkubGVuZ3RoID8gY29weSA6IE1hcmsubm9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgY29tcGlsZShub2Rlcywgc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBub2Rlcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTm9kZVR5cGUobmFtZSwgc2NoZW1hLCBzcGVjKSk7XG4gICAgICAgIGxldCB0b3BUeXBlID0gc2NoZW1hLnNwZWMudG9wTm9kZSB8fCBcImRvY1wiO1xuICAgICAgICBpZiAoIXJlc3VsdFt0b3BUeXBlXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2NoZW1hIGlzIG1pc3NpbmcgaXRzIHRvcCBub2RlIHR5cGUgKCdcIiArIHRvcFR5cGUgKyBcIicpXCIpO1xuICAgICAgICBpZiAoIXJlc3VsdC50ZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFdmVyeSBzY2hlbWEgbmVlZHMgYSAndGV4dCcgdHlwZVwiKTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiByZXN1bHQudGV4dC5hdHRycylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHRleHQgbm9kZSB0eXBlIHNob3VsZCBub3QgaGF2ZSBhdHRyaWJ1dGVzXCIpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZSh0eXBlTmFtZSwgYXR0ck5hbWUsIHR5cGUpIHtcbiAgICBsZXQgdHlwZXMgPSB0eXBlLnNwbGl0KFwifFwiKTtcbiAgICByZXR1cm4gKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBuYW1lID0gdmFsdWUgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVzLmluZGV4T2YobmFtZSkgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEV4cGVjdGVkIHZhbHVlIG9mIHR5cGUgJHt0eXBlc30gZm9yIGF0dHJpYnV0ZSAke2F0dHJOYW1lfSBvbiB0eXBlICR7dHlwZU5hbWV9LCBnb3QgJHtuYW1lfWApO1xuICAgIH07XG59XG4vLyBBdHRyaWJ1dGUgZGVzY3JpcHRvcnNcbmNsYXNzIEF0dHJpYnV0ZSB7XG4gICAgY29uc3RydWN0b3IodHlwZU5hbWUsIGF0dHJOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaGFzRGVmYXVsdCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBcImRlZmF1bHRcIik7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09IFwic3RyaW5nXCIgPyB2YWxpZGF0ZVR5cGUodHlwZU5hbWUsIGF0dHJOYW1lLCBvcHRpb25zLnZhbGlkYXRlKSA6IG9wdGlvbnMudmFsaWRhdGU7XG4gICAgfVxuICAgIGdldCBpc1JlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzRGVmYXVsdDtcbiAgICB9XG59XG4vLyBNYXJrc1xuLyoqXG5MaWtlIG5vZGVzLCBtYXJrcyAod2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlcyB0byBzaWduaWZ5XG50aGluZ3MgbGlrZSBlbXBoYXNpcyBvciBiZWluZyBwYXJ0IG9mIGEgbGluaykgYXJlXG5bdGFnZ2VkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFyay50eXBlKSB3aXRoIHR5cGUgb2JqZWN0cywgd2hpY2ggYXJlXG5pbnN0YW50aWF0ZWQgb25jZSBwZXIgYFNjaGVtYWAuXG4qL1xuY2xhc3MgTWFya1R5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgb2YgdGhlIG1hcmsgdHlwZS5cbiAgICAqL1xuICAgIG5hbWUsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuaywgXG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSB0aGF0IHRoaXMgbWFyayB0eXBlIGluc3RhbmNlIGlzIHBhcnQgb2YuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzcGVjIG9uIHdoaWNoIHRoZSB0eXBlIGlzIGJhc2VkLlxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnJhbmsgPSByYW5rO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgdGhpcy5hdHRycyA9IGluaXRBdHRycyhuYW1lLCBzcGVjLmF0dHJzKTtcbiAgICAgICAgdGhpcy5leGNsdWRlZCA9IG51bGw7XG4gICAgICAgIGxldCBkZWZhdWx0cyA9IGRlZmF1bHRBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGRlZmF1bHRzID8gbmV3IE1hcmsodGhpcywgZGVmYXVsdHMpIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBvZiB0aGlzIHR5cGUuIGBhdHRyc2AgbWF5IGJlIGBudWxsYCBvciBhbiBvYmplY3RcbiAgICBjb250YWluaW5nIG9ubHkgc29tZSBvZiB0aGUgbWFyaydzIGF0dHJpYnV0ZXMuIFRoZSBvdGhlcnMsIGlmXG4gICAgdGhleSBoYXZlIGRlZmF1bHRzLCB3aWxsIGJlIGFkZGVkLlxuICAgICovXG4gICAgY3JlYXRlKGF0dHJzID0gbnVsbCkge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuaW5zdGFuY2UpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrKHRoaXMsIGNvbXB1dGVBdHRycyh0aGlzLmF0dHJzLCBhdHRycykpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG1hcmtzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCksIHJhbmsgPSAwO1xuICAgICAgICBtYXJrcy5mb3JFYWNoKChuYW1lLCBzcGVjKSA9PiByZXN1bHRbbmFtZV0gPSBuZXcgTWFya1R5cGUobmFtZSwgcmFuaysrLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQsIGEgbmV3IHNldFxuICAgIHdpdGhvdXQgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGlucHV0IHNldCBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBzZXQgPSBzZXQuc2xpY2UoMCwgaSkuY29uY2F0KHNldC5zbGljZShpICsgMSkpO1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdHMgd2hldGhlciB0aGVyZSBpcyBhIG1hcmsgb2YgdGhpcyB0eXBlIGluIHRoZSBnaXZlbiBzZXQuXG4gICAgKi9cbiAgICBpc0luU2V0KHNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChzZXRbaV0udHlwZSA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRbaV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY2hlY2tBdHRycyhhdHRycykge1xuICAgICAgICBjaGVja0F0dHJzKHRoaXMuYXR0cnMsIGF0dHJzLCBcIm1hcmtcIiwgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcmllcyB3aGV0aGVyIGEgZ2l2ZW4gbWFyayB0eXBlIGlzXG4gICAgW2V4Y2x1ZGVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuZXhjbHVkZXMpIGJ5IHRoaXMgb25lLlxuICAgICovXG4gICAgZXhjbHVkZXMob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhjbHVkZWQuaW5kZXhPZihvdGhlcikgPiAtMTtcbiAgICB9XG59XG4vKipcbkEgZG9jdW1lbnQgc2NoZW1hLiBIb2xkcyBbbm9kZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVUeXBlKSBhbmQgW21hcmtcbnR5cGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrVHlwZSkgb2JqZWN0cyBmb3IgdGhlIG5vZGVzIGFuZCBtYXJrcyB0aGF0IG1heVxub2NjdXIgaW4gY29uZm9ybWluZyBkb2N1bWVudHMsIGFuZCBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvclxuY3JlYXRpbmcgYW5kIGRlc2VyaWFsaXppbmcgc3VjaCBkb2N1bWVudHMuXG5cbldoZW4gZ2l2ZW4sIHRoZSB0eXBlIHBhcmFtZXRlcnMgcHJvdmlkZSB0aGUgbmFtZXMgb2YgdGhlIG5vZGVzIGFuZFxubWFya3MgaW4gdGhpcyBzY2hlbWEuXG4qL1xuY2xhc3MgU2NoZW1hIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSBzY2hlbWEgZnJvbSBhIHNjaGVtYSBbc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlNjaGVtYVNwZWMpLlxuICAgICovXG4gICAgY29uc3RydWN0b3Ioc3BlYykge1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIFtsaW5lYnJlYWtcbiAgICAgICAgcmVwbGFjZW1lbnRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5saW5lYnJlYWtSZXBsYWNlbWVudCkgbm9kZSBkZWZpbmVkXG4gICAgICAgIGluIHRoaXMgc2NoZW1hLCBpZiBhbnkuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQW4gb2JqZWN0IGZvciBzdG9yaW5nIHdoYXRldmVyIHZhbHVlcyBtb2R1bGVzIG1heSB3YW50IHRvXG4gICAgICAgIGNvbXB1dGUgYW5kIGNhY2hlIHBlciBzY2hlbWEuIChJZiB5b3Ugd2FudCB0byBzdG9yZSBzb21ldGhpbmdcbiAgICAgICAgaW4gaXQsIHRyeSB0byB1c2UgcHJvcGVydHkgbmFtZXMgdW5saWtlbHkgdG8gY2xhc2guKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGxldCBpbnN0YW5jZVNwZWMgPSB0aGlzLnNwZWMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzcGVjKVxuICAgICAgICAgICAgaW5zdGFuY2VTcGVjW3Byb3BdID0gc3BlY1twcm9wXTtcbiAgICAgICAgaW5zdGFuY2VTcGVjLm5vZGVzID0gT3JkZXJlZE1hcC5mcm9tKHNwZWMubm9kZXMpLFxuICAgICAgICAgICAgaW5zdGFuY2VTcGVjLm1hcmtzID0gT3JkZXJlZE1hcC5mcm9tKHNwZWMubWFya3MgfHwge30pLFxuICAgICAgICAgICAgdGhpcy5ub2RlcyA9IE5vZGVUeXBlLmNvbXBpbGUodGhpcy5zcGVjLm5vZGVzLCB0aGlzKTtcbiAgICAgICAgdGhpcy5tYXJrcyA9IE1hcmtUeXBlLmNvbXBpbGUodGhpcy5zcGVjLm1hcmtzLCB0aGlzKTtcbiAgICAgICAgbGV0IGNvbnRlbnRFeHByQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRoaXMubm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChwcm9wIGluIHRoaXMubWFya3MpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IocHJvcCArIFwiIGNhbiBub3QgYmUgYm90aCBhIG5vZGUgYW5kIGEgbWFya1wiKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5ub2Rlc1twcm9wXSwgY29udGVudEV4cHIgPSB0eXBlLnNwZWMuY29udGVudCB8fCBcIlwiLCBtYXJrRXhwciA9IHR5cGUuc3BlYy5tYXJrcztcbiAgICAgICAgICAgIHR5cGUuY29udGVudE1hdGNoID0gY29udGVudEV4cHJDYWNoZVtjb250ZW50RXhwcl0gfHxcbiAgICAgICAgICAgICAgICAoY29udGVudEV4cHJDYWNoZVtjb250ZW50RXhwcl0gPSBDb250ZW50TWF0Y2gucGFyc2UoY29udGVudEV4cHIsIHRoaXMubm9kZXMpKTtcbiAgICAgICAgICAgIHR5cGUuaW5saW5lQ29udGVudCA9IHR5cGUuY29udGVudE1hdGNoLmlubGluZUNvbnRlbnQ7XG4gICAgICAgICAgICBpZiAodHlwZS5zcGVjLmxpbmVicmVha1JlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVsdGlwbGUgbGluZWJyZWFrIG5vZGVzIGRlZmluZWRcIik7XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzSW5saW5lIHx8ICF0eXBlLmlzTGVhZilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJMaW5lYnJlYWsgcmVwbGFjZW1lbnQgbm9kZXMgbXVzdCBiZSBpbmxpbmUgbGVhZiBub2Rlc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVicmVha1JlcGxhY2VtZW50ID0gdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGUubWFya1NldCA9IG1hcmtFeHByID09IFwiX1wiID8gbnVsbCA6XG4gICAgICAgICAgICAgICAgbWFya0V4cHIgPyBnYXRoZXJNYXJrcyh0aGlzLCBtYXJrRXhwci5zcGxpdChcIiBcIikpIDpcbiAgICAgICAgICAgICAgICAgICAgbWFya0V4cHIgPT0gXCJcIiB8fCAhdHlwZS5pbmxpbmVDb250ZW50ID8gW10gOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gdGhpcy5tYXJrcykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm1hcmtzW3Byb3BdLCBleGNsID0gdHlwZS5zcGVjLmV4Y2x1ZGVzO1xuICAgICAgICAgICAgdHlwZS5leGNsdWRlZCA9IGV4Y2wgPT0gbnVsbCA/IFt0eXBlXSA6IGV4Y2wgPT0gXCJcIiA/IFtdIDogZ2F0aGVyTWFya3ModGhpcywgZXhjbC5zcGxpdChcIiBcIikpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZUZyb21KU09OID0gdGhpcy5ub2RlRnJvbUpTT04uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5tYXJrRnJvbUpTT04gPSB0aGlzLm1hcmtGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRvcE5vZGVUeXBlID0gdGhpcy5ub2Rlc1t0aGlzLnNwZWMudG9wTm9kZSB8fCBcImRvY1wiXTtcbiAgICAgICAgdGhpcy5jYWNoZWQud3JhcHBpbmdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBpbiB0aGlzIHNjaGVtYS4gVGhlIGB0eXBlYCBtYXkgYmUgYSBzdHJpbmcgb3IgYVxuICAgIGBOb2RlVHlwZWAgaW5zdGFuY2UuIEF0dHJpYnV0ZXMgd2lsbCBiZSBleHRlbmRlZCB3aXRoIGRlZmF1bHRzLFxuICAgIGBjb250ZW50YCBtYXkgYmUgYSBgRnJhZ21lbnRgLCBgbnVsbGAsIGEgYE5vZGVgLCBvciBhbiBhcnJheSBvZlxuICAgIG5vZGVzLlxuICAgICovXG4gICAgbm9kZSh0eXBlLCBhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubm9kZVR5cGUodHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKCEodHlwZSBpbnN0YW5jZW9mIE5vZGVUeXBlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBub2RlIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUuc2NoZW1hICE9IHRoaXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vZGUgdHlwZSBmcm9tIGRpZmZlcmVudCBzY2hlbWEgdXNlZCAoXCIgKyB0eXBlLm5hbWUgKyBcIilcIik7XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZUNoZWNrZWQoYXR0cnMsIGNvbnRlbnQsIG1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBub2RlIGluIHRoZSBzY2hlbWEuIEVtcHR5IHRleHQgbm9kZXMgYXJlIG5vdFxuICAgIGFsbG93ZWQuXG4gICAgKi9cbiAgICB0ZXh0KHRleHQsIG1hcmtzKSB7XG4gICAgICAgIGxldCB0eXBlID0gdGhpcy5ub2Rlcy50ZXh0O1xuICAgICAgICByZXR1cm4gbmV3IFRleHROb2RlKHR5cGUsIHR5cGUuZGVmYXVsdEF0dHJzLCB0ZXh0LCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBhdHRyaWJ1dGVzLlxuICAgICovXG4gICAgbWFyayh0eXBlLCBhdHRycykge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHR5cGUgPSB0aGlzLm1hcmtzW3R5cGVdO1xuICAgICAgICByZXR1cm4gdHlwZS5jcmVhdGUoYXR0cnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG5vZGUgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICBib3VuZC5cbiAgICAqL1xuICAgIG5vZGVGcm9tSlNPTihqc29uKSB7XG4gICAgICAgIHJldHVybiBOb2RlLmZyb21KU09OKHRoaXMsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG1hcmsgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVGhpcyBtZXRob2QgaXNcbiAgICBib3VuZC5cbiAgICAqL1xuICAgIG1hcmtGcm9tSlNPTihqc29uKSB7XG4gICAgICAgIHJldHVybiBNYXJrLmZyb21KU09OKHRoaXMsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG5vZGVUeXBlKG5hbWUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGhpcy5ub2Rlc1tuYW1lXTtcbiAgICAgICAgaWYgKCFmb3VuZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVW5rbm93biBub2RlIHR5cGU6IFwiICsgbmFtZSk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG59XG5mdW5jdGlvbiBnYXRoZXJNYXJrcyhzY2hlbWEsIG1hcmtzKSB7XG4gICAgbGV0IGZvdW5kID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmFtZSA9IG1hcmtzW2ldLCBtYXJrID0gc2NoZW1hLm1hcmtzW25hbWVdLCBvayA9IG1hcms7XG4gICAgICAgIGlmIChtYXJrKSB7XG4gICAgICAgICAgICBmb3VuZC5wdXNoKG1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IHNjaGVtYS5tYXJrc1twcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBcIl9cIiB8fCAobWFyay5zcGVjLmdyb3VwICYmIG1hcmsuc3BlYy5ncm91cC5zcGxpdChcIiBcIikuaW5kZXhPZihuYW1lKSA+IC0xKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQucHVzaChvayA9IG1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghb2spXG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJVbmtub3duIG1hcmsgdHlwZTogJ1wiICsgbWFya3NbaV0gKyBcIidcIik7XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gaXNUYWdSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUudGFnICE9IG51bGw7IH1cbmZ1bmN0aW9uIGlzU3R5bGVSdWxlKHJ1bGUpIHsgcmV0dXJuIHJ1bGUuc3R5bGUgIT0gbnVsbDsgfVxuLyoqXG5BIERPTSBwYXJzZXIgcmVwcmVzZW50cyBhIHN0cmF0ZWd5IGZvciBwYXJzaW5nIERPTSBjb250ZW50IGludG8gYVxuUHJvc2VNaXJyb3IgZG9jdW1lbnQgY29uZm9ybWluZyB0byBhIGdpdmVuIHNjaGVtYS4gSXRzIGJlaGF2aW9yIGlzXG5kZWZpbmVkIGJ5IGFuIGFycmF5IG9mIFtydWxlc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlBhcnNlUnVsZSkuXG4qL1xuY2xhc3MgRE9NUGFyc2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwYXJzZXIgdGhhdCB0YXJnZXRzIHRoZSBnaXZlbiBzY2hlbWEsIHVzaW5nIHRoZSBnaXZlblxuICAgIHBhcnNpbmcgcnVsZXMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIGludG8gd2hpY2ggdGhlIHBhcnNlciBwYXJzZXMuXG4gICAgKi9cbiAgICBzY2hlbWEsIFxuICAgIC8qKlxuICAgIFRoZSBzZXQgb2YgW3BhcnNlIHJ1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKSB0aGF0IHRoZSBwYXJzZXJcbiAgICB1c2VzLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlLlxuICAgICovXG4gICAgcnVsZXMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMucnVsZXMgPSBydWxlcztcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0eWxlcyA9IFtdO1xuICAgICAgICBsZXQgbWF0Y2hlZFN0eWxlcyA9IHRoaXMubWF0Y2hlZFN0eWxlcyA9IFtdO1xuICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVGFnUnVsZShydWxlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFncy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTdHlsZVJ1bGUocnVsZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcCA9IC9bXj1dKi8uZXhlYyhydWxlLnN0eWxlKVswXTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFN0eWxlcy5pbmRleE9mKHByb3ApIDwgMClcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFN0eWxlcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbmx5IG5vcm1hbGl6ZSBsaXN0IGVsZW1lbnRzIHdoZW4gbGlzdHMgaW4gdGhlIHNjaGVtYSBjYW4ndCBkaXJlY3RseSBjb250YWluIHRoZW1zZWx2ZXNcbiAgICAgICAgdGhpcy5ub3JtYWxpemVMaXN0cyA9ICF0aGlzLnRhZ3Muc29tZShyID0+IHtcbiAgICAgICAgICAgIGlmICghL14odWx8b2wpXFxiLy50ZXN0KHIudGFnKSB8fCAhci5ub2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBub2RlID0gc2NoZW1hLm5vZGVzW3Iubm9kZV07XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKG5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2UgYSBkb2N1bWVudCBmcm9tIHRoZSBjb250ZW50IG9mIGEgRE9NIG5vZGUuXG4gICAgKi9cbiAgICBwYXJzZShkb20sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQodGhpcywgb3B0aW9ucywgZmFsc2UpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIE1hcmsubm9uZSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFBhcnNlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIG5vZGUsIGxpa2VcbiAgICBbYHBhcnNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVBhcnNlci5wYXJzZSksIGFuZCB0YWtlcyB0aGUgc2FtZSBzZXQgb2ZcbiAgICBvcHRpb25zLiBCdXQgdW5saWtlIHRoYXQgbWV0aG9kLCB3aGljaCBwcm9kdWNlcyBhIHdob2xlIG5vZGUsXG4gICAgdGhpcyBvbmUgcmV0dXJucyBhIHNsaWNlIHRoYXQgaXMgb3BlbiBhdCB0aGUgc2lkZXMsIG1lYW5pbmcgdGhhdFxuICAgIHRoZSBzY2hlbWEgY29uc3RyYWludHMgYXJlbid0IGFwcGxpZWQgdG8gdGhlIHN0YXJ0IG9mIG5vZGVzIHRvXG4gICAgdGhlIGxlZnQgb2YgdGhlIGlucHV0IGFuZCB0aGUgZW5kIG9mIG5vZGVzIGF0IHRoZSBlbmQuXG4gICAgKi9cbiAgICBwYXJzZVNsaWNlKGRvbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gbmV3IFBhcnNlQ29udGV4dCh0aGlzLCBvcHRpb25zLCB0cnVlKTtcbiAgICAgICAgY29udGV4dC5hZGRBbGwoZG9tLCBNYXJrLm5vbmUsIG9wdGlvbnMuZnJvbSwgb3B0aW9ucy50byk7XG4gICAgICAgIHJldHVybiBTbGljZS5tYXhPcGVuKGNvbnRleHQuZmluaXNoKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoVGFnKGRvbSwgY29udGV4dCwgYWZ0ZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFmdGVyID8gdGhpcy50YWdzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnRhZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy50YWdzW2ldO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMoZG9tLCBydWxlLnRhZykgJiZcbiAgICAgICAgICAgICAgICAocnVsZS5uYW1lc3BhY2UgPT09IHVuZGVmaW5lZCB8fCBkb20ubmFtZXNwYWNlVVJJID09IHJ1bGUubmFtZXNwYWNlKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZS5jb250ZXh0IHx8IGNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5nZXRBdHRycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyhkb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXRjaFN0eWxlKHByb3AsIHZhbHVlLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnN0eWxlcy5pbmRleE9mKGFmdGVyKSArIDEgOiAwOyBpIDwgdGhpcy5zdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy5zdHlsZXNbaV0sIHN0eWxlID0gcnVsZS5zdHlsZTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5pbmRleE9mKHByb3ApICE9IDAgfHxcbiAgICAgICAgICAgICAgICBydWxlLmNvbnRleHQgJiYgIWNvbnRleHQubWF0Y2hlc0NvbnRleHQocnVsZS5jb250ZXh0KSB8fFxuICAgICAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgc3R5bGUgc3RyaW5nIGVpdGhlciBwcmVjaXNlbHkgbWF0Y2hlcyB0aGUgcHJvcCxcbiAgICAgICAgICAgICAgICAvLyBvciBoYXMgYW4gJz0nIHNpZ24gYWZ0ZXIgdGhlIHByb3AsIGZvbGxvd2VkIGJ5IHRoZSBnaXZlblxuICAgICAgICAgICAgICAgIC8vIHZhbHVlLlxuICAgICAgICAgICAgICAgIHN0eWxlLmxlbmd0aCA+IHByb3AubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChzdHlsZS5jaGFyQ29kZUF0KHByb3AubGVuZ3RoKSAhPSA2MSB8fCBzdHlsZS5zbGljZShwcm9wLmxlbmd0aCArIDEpICE9IHZhbHVlKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJ1bGUuZ2V0QXR0cnModmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBydWxlLmF0dHJzID0gcmVzdWx0IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBydWxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHNjaGVtYVJ1bGVzKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGluc2VydChydWxlKSB7XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBydWxlLnByaW9yaXR5ID09IG51bGwgPyA1MCA6IHJ1bGUucHJpb3JpdHksIGkgPSAwO1xuICAgICAgICAgICAgZm9yICg7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHJlc3VsdFtpXSwgbmV4dFByaW9yaXR5ID0gbmV4dC5wcmlvcml0eSA9PSBudWxsID8gNTAgOiBuZXh0LnByaW9yaXR5O1xuICAgICAgICAgICAgICAgIGlmIChuZXh0UHJpb3JpdHkgPCBwcmlvcml0eSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKGksIDAsIHJ1bGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubWFya3NbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm1hcmsgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5jbGVhck1hcmspKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5tYXJrID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2NoZW1hLm5vZGVzW25hbWVdLnNwZWMucGFyc2VET007XG4gICAgICAgICAgICBpZiAocnVsZXMpXG4gICAgICAgICAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0KHJ1bGUgPSBjb3B5KHJ1bGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocnVsZS5ub2RlIHx8IHJ1bGUuaWdub3JlIHx8IHJ1bGUubWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm5vZGUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIERPTSBwYXJzZXIgdXNpbmcgdGhlIHBhcnNpbmcgcnVsZXMgbGlzdGVkIGluIGFcbiAgICBzY2hlbWEncyBbbm9kZSBzcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnBhcnNlRE9NKSwgcmVvcmRlcmVkIGJ5XG4gICAgW3ByaW9yaXR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlLnByaW9yaXR5KS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC5kb21QYXJzZXIgfHxcbiAgICAgICAgICAgIChzY2hlbWEuY2FjaGVkLmRvbVBhcnNlciA9IG5ldyBET01QYXJzZXIoc2NoZW1hLCBET01QYXJzZXIuc2NoZW1hUnVsZXMoc2NoZW1hKSkpO1xuICAgIH1cbn1cbmNvbnN0IGJsb2NrVGFncyA9IHtcbiAgICBhZGRyZXNzOiB0cnVlLCBhcnRpY2xlOiB0cnVlLCBhc2lkZTogdHJ1ZSwgYmxvY2txdW90ZTogdHJ1ZSwgY2FudmFzOiB0cnVlLFxuICAgIGRkOiB0cnVlLCBkaXY6IHRydWUsIGRsOiB0cnVlLCBmaWVsZHNldDogdHJ1ZSwgZmlnY2FwdGlvbjogdHJ1ZSwgZmlndXJlOiB0cnVlLFxuICAgIGZvb3RlcjogdHJ1ZSwgZm9ybTogdHJ1ZSwgaDE6IHRydWUsIGgyOiB0cnVlLCBoMzogdHJ1ZSwgaDQ6IHRydWUsIGg1OiB0cnVlLFxuICAgIGg2OiB0cnVlLCBoZWFkZXI6IHRydWUsIGhncm91cDogdHJ1ZSwgaHI6IHRydWUsIGxpOiB0cnVlLCBub3NjcmlwdDogdHJ1ZSwgb2w6IHRydWUsXG4gICAgb3V0cHV0OiB0cnVlLCBwOiB0cnVlLCBwcmU6IHRydWUsIHNlY3Rpb246IHRydWUsIHRhYmxlOiB0cnVlLCB0Zm9vdDogdHJ1ZSwgdWw6IHRydWVcbn07XG5jb25zdCBpZ25vcmVUYWdzID0ge1xuICAgIGhlYWQ6IHRydWUsIG5vc2NyaXB0OiB0cnVlLCBvYmplY3Q6IHRydWUsIHNjcmlwdDogdHJ1ZSwgc3R5bGU6IHRydWUsIHRpdGxlOiB0cnVlXG59O1xuY29uc3QgbGlzdFRhZ3MgPSB7IG9sOiB0cnVlLCB1bDogdHJ1ZSB9O1xuLy8gVXNpbmcgYSBiaXRmaWVsZCBmb3Igbm9kZSBjb250ZXh0IG9wdGlvbnNcbmNvbnN0IE9QVF9QUkVTRVJWRV9XUyA9IDEsIE9QVF9QUkVTRVJWRV9XU19GVUxMID0gMiwgT1BUX09QRU5fTEVGVCA9IDQ7XG5mdW5jdGlvbiB3c09wdGlvbnNGb3IodHlwZSwgcHJlc2VydmVXaGl0ZXNwYWNlLCBiYXNlKSB7XG4gICAgaWYgKHByZXNlcnZlV2hpdGVzcGFjZSAhPSBudWxsKVxuICAgICAgICByZXR1cm4gKHByZXNlcnZlV2hpdGVzcGFjZSA/IE9QVF9QUkVTRVJWRV9XUyA6IDApIHxcbiAgICAgICAgICAgIChwcmVzZXJ2ZVdoaXRlc3BhY2UgPT09IFwiZnVsbFwiID8gT1BUX1BSRVNFUlZFX1dTX0ZVTEwgOiAwKTtcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiA/IE9QVF9QUkVTRVJWRV9XUyB8IE9QVF9QUkVTRVJWRV9XU19GVUxMIDogYmFzZSAmIH5PUFRfT1BFTl9MRUZUO1xufVxuY2xhc3MgTm9kZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGF0dHJzLCBtYXJrcywgc29saWQsIG1hdGNoLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnNvbGlkID0gc29saWQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuY29udGVudCA9IFtdO1xuICAgICAgICAvLyBNYXJrcyBhcHBsaWVkIHRvIHRoZSBub2RlJ3MgY2hpbGRyZW5cbiAgICAgICAgdGhpcy5hY3RpdmVNYXJrcyA9IE1hcmsubm9uZTtcbiAgICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoIHx8IChvcHRpb25zICYgT1BUX09QRU5fTEVGVCA/IG51bGwgOiB0eXBlLmNvbnRlbnRNYXRjaCk7XG4gICAgfVxuICAgIGZpbmRXcmFwcGluZyhub2RlKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXRjaCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgbGV0IGZpbGwgPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZnJvbShub2RlKSk7XG4gICAgICAgICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQoZmlsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLCB3cmFwO1xuICAgICAgICAgICAgICAgIGlmICh3cmFwID0gc3RhcnQuZmluZFdyYXBwaW5nKG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaC5maW5kV3JhcHBpbmcobm9kZS50eXBlKTtcbiAgICB9XG4gICAgZmluaXNoKG9wZW5FbmQpIHtcbiAgICAgICAgaWYgKCEodGhpcy5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSkgeyAvLyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0sIG07XG4gICAgICAgICAgICBpZiAobGFzdCAmJiBsYXN0LmlzVGV4dCAmJiAobSA9IC9bIFxcdFxcclxcblxcdTAwMGNdKyQvLmV4ZWMobGFzdC50ZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QudGV4dC5sZW5ndGggPT0gbVswXS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFt0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMV0gPSB0ZXh0LndpdGhUZXh0KHRleHQudGV4dC5zbGljZSgwLCB0ZXh0LnRleHQubGVuZ3RoIC0gbVswXS5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmZyb20odGhpcy5jb250ZW50KTtcbiAgICAgICAgaWYgKCFvcGVuRW5kICYmIHRoaXMubWF0Y2gpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5hcHBlbmQodGhpcy5tYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPyB0aGlzLnR5cGUuY3JlYXRlKHRoaXMuYXR0cnMsIGNvbnRlbnQsIHRoaXMubWFya3MpIDogY29udGVudDtcbiAgICB9XG4gICAgaW5saW5lQ29udGV4dChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlubGluZUNvbnRlbnQ7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFswXS5pc0lubGluZTtcbiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZSAmJiAhYmxvY2tUYWdzLmhhc093blByb3BlcnR5KG5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG59XG5jbGFzcyBQYXJzZUNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoZSBwYXJzZXIgd2UgYXJlIHVzaW5nLlxuICAgIHBhcnNlciwgXG4gICAgLy8gVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoaXMgcGFyc2UuXG4gICAgb3B0aW9ucywgaXNPcGVuKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gcGFyc2VyO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgdGhpcy5sb2NhbFByZXNlcnZlV1MgPSBmYWxzZTtcbiAgICAgICAgbGV0IHRvcE5vZGUgPSBvcHRpb25zLnRvcE5vZGUsIHRvcENvbnRleHQ7XG4gICAgICAgIGxldCB0b3BPcHRpb25zID0gd3NPcHRpb25zRm9yKG51bGwsIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlLCAwKSB8IChpc09wZW4gPyBPUFRfT1BFTl9MRUZUIDogMCk7XG4gICAgICAgIGlmICh0b3BOb2RlKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dCh0b3BOb2RlLnR5cGUsIHRvcE5vZGUuYXR0cnMsIE1hcmsubm9uZSwgdHJ1ZSwgb3B0aW9ucy50b3BNYXRjaCB8fCB0b3BOb2RlLnR5cGUuY29udGVudE1hdGNoLCB0b3BPcHRpb25zKTtcbiAgICAgICAgZWxzZSBpZiAoaXNPcGVuKVxuICAgICAgICAgICAgdG9wQ29udGV4dCA9IG5ldyBOb2RlQ29udGV4dChudWxsLCBudWxsLCBNYXJrLm5vbmUsIHRydWUsIG51bGwsIHRvcE9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KHBhcnNlci5zY2hlbWEudG9wTm9kZVR5cGUsIG51bGwsIE1hcmsubm9uZSwgdHJ1ZSwgbnVsbCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIHRoaXMubm9kZXMgPSBbdG9wQ29udGV4dF07XG4gICAgICAgIHRoaXMuZmluZCA9IG9wdGlvbnMuZmluZFBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gZmFsc2U7XG4gICAgfVxuICAgIGdldCB0b3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVzW3RoaXMub3Blbl07XG4gICAgfVxuICAgIC8vIEFkZCBhIERPTSBub2RlIHRvIHRoZSBjb250ZW50LiBUZXh0IGlzIGluc2VydGVkIGFzIHRleHQgbm9kZSxcbiAgICAvLyBvdGhlcndpc2UsIHRoZSBub2RlIGlzIHBhc3NlZCB0byBgYWRkRWxlbWVudGAgb3IsIGlmIGl0IGhhcyBhXG4gICAgLy8gYHN0eWxlYCBhdHRyaWJ1dGUsIGBhZGRFbGVtZW50V2l0aFN0eWxlc2AuXG4gICAgYWRkRE9NKGRvbSwgbWFya3MpIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgdGhpcy5hZGRUZXh0Tm9kZShkb20sIG1hcmtzKTtcbiAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnQoZG9tLCBtYXJrcyk7XG4gICAgfVxuICAgIGFkZFRleHROb2RlKGRvbSwgbWFya3MpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZG9tLm5vZGVWYWx1ZTtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wLCBwcmVzZXJ2ZVdTID0gKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTX0ZVTEwpID8gXCJmdWxsXCJcbiAgICAgICAgICAgIDogdGhpcy5sb2NhbFByZXNlcnZlV1MgfHwgKHRvcC5vcHRpb25zICYgT1BUX1BSRVNFUlZFX1dTKSA+IDA7XG4gICAgICAgIGlmIChwcmVzZXJ2ZVdTID09PSBcImZ1bGxcIiB8fFxuICAgICAgICAgICAgdG9wLmlubGluZUNvbnRleHQoZG9tKSB8fFxuICAgICAgICAgICAgL1teIFxcdFxcclxcblxcdTAwMGNdLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZVdTKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bIFxcdFxcclxcblxcdTAwMGNdKy9nLCBcIiBcIik7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdGFydHMgd2l0aCB3aGl0ZXNwYWNlLCBhbmQgdGhlcmUgaXMgbm8gbm9kZSBiZWZvcmUgaXQsIG9yXG4gICAgICAgICAgICAgICAgLy8gYSBoYXJkIGJyZWFrLCBvciBhIHRleHQgbm9kZSB0aGF0IGVuZHMgd2l0aCB3aGl0ZXNwYWNlLCBzdHJpcCB0aGVcbiAgICAgICAgICAgICAgICAvLyBsZWFkaW5nIHNwYWNlLlxuICAgICAgICAgICAgICAgIGlmICgvXlsgXFx0XFxyXFxuXFx1MDAwY10vLnRlc3QodmFsdWUpICYmIHRoaXMub3BlbiA9PSB0aGlzLm5vZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVCZWZvcmUgPSB0b3AuY29udGVudFt0b3AuY29udGVudC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvbU5vZGVCZWZvcmUgPSBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGVCZWZvcmUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkb21Ob2RlQmVmb3JlICYmIGRvbU5vZGVCZWZvcmUubm9kZU5hbWUgPT0gJ0JSJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChub2RlQmVmb3JlLmlzVGV4dCAmJiAvWyBcXHRcXHJcXG5cXHUwMDBjXSQvLnRlc3Qobm9kZUJlZm9yZS50ZXh0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByZXNlcnZlV1MgIT09IFwiZnVsbFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIiBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnROb2RlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KHZhbHVlKSwgbWFya3MsICEvXFxTLy50ZXN0KHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLmZpbmRJblRleHQoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIHRhZyBhbmQgdXNlIHRoYXQgdG8gcGFyc2UuIElmXG4gICAgLy8gbm9uZSBpcyBmb3VuZCwgdGhlIGVsZW1lbnQncyBjb250ZW50IG5vZGVzIGFyZSBhZGRlZCBkaXJlY3RseS5cbiAgICBhZGRFbGVtZW50KGRvbSwgbWFya3MsIG1hdGNoQWZ0ZXIpIHtcbiAgICAgICAgbGV0IG91dGVyV1MgPSB0aGlzLmxvY2FsUHJlc2VydmVXUywgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIGlmIChkb20udGFnTmFtZSA9PSBcIlBSRVwiIHx8IC9wcmUvLnRlc3QoZG9tLnN0eWxlICYmIGRvbS5zdHlsZS53aGl0ZVNwYWNlKSlcbiAgICAgICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5hbWUgPSBkb20ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcnVsZUlEO1xuICAgICAgICBpZiAobGlzdFRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgdGhpcy5wYXJzZXIubm9ybWFsaXplTGlzdHMpXG4gICAgICAgICAgICBub3JtYWxpemVMaXN0KGRvbSk7XG4gICAgICAgIGxldCBydWxlID0gKHRoaXMub3B0aW9ucy5ydWxlRnJvbU5vZGUgJiYgdGhpcy5vcHRpb25zLnJ1bGVGcm9tTm9kZShkb20pKSB8fFxuICAgICAgICAgICAgKHJ1bGVJRCA9IHRoaXMucGFyc2VyLm1hdGNoVGFnKGRvbSwgdGhpcywgbWF0Y2hBZnRlcikpO1xuICAgICAgICBvdXQ6IGlmIChydWxlID8gcnVsZS5pZ25vcmUgOiBpZ25vcmVUYWdzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXJ1bGUgfHwgcnVsZS5za2lwIHx8IHJ1bGUuY2xvc2VQYXJlbnQpIHtcbiAgICAgICAgICAgIGlmIChydWxlICYmIHJ1bGUuY2xvc2VQYXJlbnQpXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuID0gTWF0aC5tYXgoMCwgdGhpcy5vcGVuIC0gMSk7XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlICYmIHJ1bGUuc2tpcC5ub2RlVHlwZSlcbiAgICAgICAgICAgICAgICBkb20gPSBydWxlLnNraXA7XG4gICAgICAgICAgICBsZXQgc3luYywgb2xkTmVlZHNCbG9jayA9IHRoaXMubmVlZHNCbG9jaztcbiAgICAgICAgICAgIGlmIChibG9ja1RhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wLmNvbnRlbnQubGVuZ3RoICYmIHRvcC5jb250ZW50WzBdLmlzSW5saW5lICYmIHRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4tLTtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGhpcy50b3A7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdG9wLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZGYWxsYmFjayhkb20sIG1hcmtzKTtcbiAgICAgICAgICAgICAgICBicmVhayBvdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHJ1bGUgJiYgcnVsZS5za2lwID8gbWFya3MgOiB0aGlzLnJlYWRTdHlsZXMoZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICBpZiAoaW5uZXJNYXJrcylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFsbChkb20sIGlubmVyTWFya3MpO1xuICAgICAgICAgICAgaWYgKHN5bmMpXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jKHRvcCk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQmxvY2sgPSBvbGROZWVkc0Jsb2NrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlubmVyTWFya3MgPSB0aGlzLnJlYWRTdHlsZXMoZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICBpZiAoaW5uZXJNYXJrcylcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRCeVJ1bGUoZG9tLCBydWxlLCBpbm5lck1hcmtzLCBydWxlLmNvbnN1bWluZyA9PT0gZmFsc2UgPyBydWxlSUQgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9jYWxQcmVzZXJ2ZVdTID0gb3V0ZXJXUztcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGZvciBsZWFmIERPTSBub2RlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBpZ25vcmVkXG4gICAgbGVhZkZhbGxiYWNrKGRvbSwgbWFya3MpIHtcbiAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgdGhpcy50b3AudHlwZSAmJiB0aGlzLnRvcC50eXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXFxuXCIpLCBtYXJrcyk7XG4gICAgfVxuICAgIC8vIENhbGxlZCBmb3IgaWdub3JlZCBub2Rlc1xuICAgIGlnbm9yZUZhbGxiYWNrKGRvbSwgbWFya3MpIHtcbiAgICAgICAgLy8gSWdub3JlZCBCUiBub2RlcyBzaG91bGQgYXQgbGVhc3QgY3JlYXRlIGFuIGlubGluZSBjb250ZXh0XG4gICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmICghdGhpcy50b3AudHlwZSB8fCAhdGhpcy50b3AudHlwZS5pbmxpbmVDb250ZW50KSlcbiAgICAgICAgICAgIHRoaXMuZmluZFBsYWNlKHRoaXMucGFyc2VyLnNjaGVtYS50ZXh0KFwiLVwiKSwgbWFya3MsIHRydWUpO1xuICAgIH1cbiAgICAvLyBSdW4gYW55IHN0eWxlIHBhcnNlciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUncyBzdHlsZXMuIEVpdGhlclxuICAgIC8vIHJldHVybiBhbiB1cGRhdGVkIGFycmF5IG9mIG1hcmtzLCBvciBudWxsIHRvIGluZGljYXRlIHNvbWUgb2YgdGhlXG4gICAgLy8gc3R5bGVzIGhhZCBhIHJ1bGUgd2l0aCBgaWdub3JlYCBzZXQuXG4gICAgcmVhZFN0eWxlcyhkb20sIG1hcmtzKSB7XG4gICAgICAgIGxldCBzdHlsZXMgPSBkb20uc3R5bGU7XG4gICAgICAgIC8vIEJlY2F1c2UgbWFueSBwcm9wZXJ0aWVzIHdpbGwgb25seSBzaG93IHVwIGluICdub3JtYWxpemVkJyBmb3JtXG4gICAgICAgIC8vIGluIGBzdHlsZS5pdGVtYCAoaS5lLiB0ZXh0LWRlY29yYXRpb24gYmVjb21lc1xuICAgICAgICAvLyB0ZXh0LWRlY29yYXRpb24tbGluZSwgdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCBldGMpLCB3ZSBkaXJlY3RseVxuICAgICAgICAvLyBxdWVyeSB0aGUgc3R5bGVzIG1lbnRpb25lZCBpbiBvdXIgcnVsZXMgaW5zdGVhZCBvZiBpdGVyYXRpbmdcbiAgICAgICAgLy8gb3ZlciB0aGUgaXRlbXMuXG4gICAgICAgIGlmIChzdHlsZXMgJiYgc3R5bGVzLmxlbmd0aClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJzZXIubWF0Y2hlZFN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYXJzZXIubWF0Y2hlZFN0eWxlc1tpXSwgdmFsdWUgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFmdGVyID0gdW5kZWZpbmVkOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gdGhpcy5wYXJzZXIubWF0Y2hTdHlsZShuYW1lLCB2YWx1ZSwgdGhpcywgYWZ0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFydWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuaWdub3JlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY2xlYXJNYXJrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4gIXJ1bGUuY2xlYXJNYXJrKG0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLmNvbmNhdCh0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXS5jcmVhdGUocnVsZS5hdHRycykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuY29uc3VtaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IHJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBMb29rIHVwIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIG5vZGUuIElmIG5vbmUgYXJlIGZvdW5kLCByZXR1cm5cbiAgICAvLyBmYWxzZS4gT3RoZXJ3aXNlLCBhcHBseSBpdCwgdXNlIGl0cyByZXR1cm4gdmFsdWUgdG8gZHJpdmUgdGhlIHdheVxuICAgIC8vIHRoZSBub2RlJ3MgY29udGVudCBpcyB3cmFwcGVkLCBhbmQgcmV0dXJuIHRydWUuXG4gICAgYWRkRWxlbWVudEJ5UnVsZShkb20sIHJ1bGUsIG1hcmtzLCBjb250aW51ZUFmdGVyKSB7XG4gICAgICAgIGxldCBzeW5jLCBub2RlVHlwZTtcbiAgICAgICAgaWYgKHJ1bGUubm9kZSkge1xuICAgICAgICAgICAgbm9kZVR5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXNbcnVsZS5ub2RlXTtcbiAgICAgICAgICAgIGlmICghbm9kZVR5cGUuaXNMZWFmKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlubmVyID0gdGhpcy5lbnRlcihub2RlVHlwZSwgcnVsZS5hdHRycyB8fCBudWxsLCBtYXJrcywgcnVsZS5wcmVzZXJ2ZVdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lcikge1xuICAgICAgICAgICAgICAgICAgICBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBpbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5pbnNlcnROb2RlKG5vZGVUeXBlLmNyZWF0ZShydWxlLmF0dHJzKSwgbWFya3MsIGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWFmRmFsbGJhY2soZG9tLCBtYXJrcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFya1R5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubWFya3NbcnVsZS5tYXJrXTtcbiAgICAgICAgICAgIG1hcmtzID0gbWFya3MuY29uY2F0KG1hcmtUeXBlLmNyZWF0ZShydWxlLmF0dHJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXJ0SW4gPSB0aGlzLnRvcDtcbiAgICAgICAgaWYgKG5vZGVUeXBlICYmIG5vZGVUeXBlLmlzTGVhZikge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGludWVBZnRlcikge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGVtZW50KGRvbSwgbWFya3MsIGNvbnRpbnVlQWZ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUuZ2V0Q29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgICAgICBydWxlLmdldENvbnRlbnQoZG9tLCB0aGlzLnBhcnNlci5zY2hlbWEpLmZvckVhY2gobm9kZSA9PiB0aGlzLmluc2VydE5vZGUobm9kZSwgbWFya3MsIGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29udGVudERPTSA9IGRvbTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZS5jb250ZW50RWxlbWVudCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBkb20ucXVlcnlTZWxlY3RvcihydWxlLmNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBydWxlLmNvbnRlbnRFbGVtZW50ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gcnVsZS5jb250ZW50RWxlbWVudChkb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocnVsZS5jb250ZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gcnVsZS5jb250ZW50RWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuZmluZEFyb3VuZChkb20sIGNvbnRlbnRET00sIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRBbGwoY29udGVudERPTSwgbWFya3MpO1xuICAgICAgICAgICAgdGhpcy5maW5kQXJvdW5kKGRvbSwgY29udGVudERPTSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW5jICYmIHRoaXMuc3luYyhzdGFydEluKSlcbiAgICAgICAgICAgIHRoaXMub3Blbi0tO1xuICAgIH1cbiAgICAvLyBBZGQgYWxsIGNoaWxkIG5vZGVzIGJldHdlZW4gYHN0YXJ0SW5kZXhgIGFuZCBgZW5kSW5kZXhgIChvciB0aGVcbiAgICAvLyB3aG9sZSBub2RlLCBpZiBub3QgZ2l2ZW4pLiBJZiBgc3luY2AgaXMgcGFzc2VkLCB1c2UgaXQgdG9cbiAgICAvLyBzeW5jaHJvbml6ZSBhZnRlciBldmVyeSBibG9jayBlbGVtZW50LlxuICAgIGFkZEFsbChwYXJlbnQsIG1hcmtzLCBzdGFydEluZGV4LCBlbmRJbmRleCkge1xuICAgICAgICBsZXQgaW5kZXggPSBzdGFydEluZGV4IHx8IDA7XG4gICAgICAgIGZvciAobGV0IGRvbSA9IHN0YXJ0SW5kZXggPyBwYXJlbnQuY2hpbGROb2Rlc1tzdGFydEluZGV4XSA6IHBhcmVudC5maXJzdENoaWxkLCBlbmQgPSBlbmRJbmRleCA9PSBudWxsID8gbnVsbCA6IHBhcmVudC5jaGlsZE5vZGVzW2VuZEluZGV4XTsgZG9tICE9IGVuZDsgZG9tID0gZG9tLm5leHRTaWJsaW5nLCArK2luZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRBdFBvaW50KHBhcmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5hZGRET00oZG9tLCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5kQXRQb2ludChwYXJlbnQsIGluZGV4KTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpbmQgYSB3YXkgdG8gZml0IHRoZSBnaXZlbiBub2RlIHR5cGUgaW50byB0aGUgY3VycmVudFxuICAgIC8vIGNvbnRleHQuIE1heSBhZGQgaW50ZXJtZWRpYXRlIHdyYXBwZXJzIGFuZC9vciBsZWF2ZSBub24tc29saWRcbiAgICAvLyBub2RlcyB0aGF0IHdlJ3JlIGluLlxuICAgIGZpbmRQbGFjZShub2RlLCBtYXJrcywgY2F1dGlvdXMpIHtcbiAgICAgICAgbGV0IHJvdXRlLCBzeW5jO1xuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IHRoaXMub3BlbiwgcGVuYWx0eSA9IDA7IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBjeCA9IHRoaXMubm9kZXNbZGVwdGhdO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY3guZmluZFdyYXBwaW5nKG5vZGUpO1xuICAgICAgICAgICAgaWYgKGZvdW5kICYmICghcm91dGUgfHwgcm91dGUubGVuZ3RoID4gZm91bmQubGVuZ3RoICsgcGVuYWx0eSkpIHtcbiAgICAgICAgICAgICAgICByb3V0ZSA9IGZvdW5kO1xuICAgICAgICAgICAgICAgIHN5bmMgPSBjeDtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3guc29saWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F1dGlvdXMpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIHBlbmFsdHkgKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdXRlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuc3luYyhzeW5jKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG1hcmtzID0gdGhpcy5lbnRlcklubmVyKHJvdXRlW2ldLCBudWxsLCBtYXJrcywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8vIFRyeSB0byBpbnNlcnQgdGhlIGdpdmVuIG5vZGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuIG5lZWRlZC5cbiAgICBpbnNlcnROb2RlKG5vZGUsIG1hcmtzLCBjYXV0aW91cykge1xuICAgICAgICBpZiAobm9kZS5pc0lubGluZSAmJiB0aGlzLm5lZWRzQmxvY2sgJiYgIXRoaXMudG9wLnR5cGUpIHtcbiAgICAgICAgICAgIGxldCBibG9jayA9IHRoaXMudGV4dGJsb2NrRnJvbUNvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChibG9jaylcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRoaXMuZW50ZXJJbm5lcihibG9jaywgbnVsbCwgbWFya3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbm5lck1hcmtzID0gdGhpcy5maW5kUGxhY2Uobm9kZSwgbWFya3MsIGNhdXRpb3VzKTtcbiAgICAgICAgaWYgKGlubmVyTWFya3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wO1xuICAgICAgICAgICAgaWYgKHRvcC5tYXRjaClcbiAgICAgICAgICAgICAgICB0b3AubWF0Y2ggPSB0b3AubWF0Y2gubWF0Y2hUeXBlKG5vZGUudHlwZSk7XG4gICAgICAgICAgICBsZXQgbm9kZU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICAgICAgZm9yIChsZXQgbSBvZiBpbm5lck1hcmtzLmNvbmNhdChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICBpZiAodG9wLnR5cGUgPyB0b3AudHlwZS5hbGxvd3NNYXJrVHlwZShtLnR5cGUpIDogbWFya01heUFwcGx5KG0udHlwZSwgbm9kZS50eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgbm9kZU1hcmtzID0gbS5hZGRUb1NldChub2RlTWFya3MpO1xuICAgICAgICAgICAgdG9wLmNvbnRlbnQucHVzaChub2RlLm1hcmsobm9kZU1hcmtzKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRyeSB0byBzdGFydCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUsIGFkanVzdGluZyB0aGUgY29udGV4dCB3aGVuXG4gICAgLy8gbmVjZXNzYXJ5LlxuICAgIGVudGVyKHR5cGUsIGF0dHJzLCBtYXJrcywgcHJlc2VydmVXUykge1xuICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHRoaXMuZmluZFBsYWNlKHR5cGUuY3JlYXRlKGF0dHJzKSwgbWFya3MsIGZhbHNlKTtcbiAgICAgICAgaWYgKGlubmVyTWFya3MpXG4gICAgICAgICAgICBpbm5lck1hcmtzID0gdGhpcy5lbnRlcklubmVyKHR5cGUsIGF0dHJzLCBtYXJrcywgdHJ1ZSwgcHJlc2VydmVXUyk7XG4gICAgICAgIHJldHVybiBpbm5lck1hcmtzO1xuICAgIH1cbiAgICAvLyBPcGVuIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZVxuICAgIGVudGVySW5uZXIodHlwZSwgYXR0cnMsIG1hcmtzLCBzb2xpZCA9IGZhbHNlLCBwcmVzZXJ2ZVdTKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3A7XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaCAmJiB0b3AubWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdTLCB0b3Aub3B0aW9ucyk7XG4gICAgICAgIGlmICgodG9wLm9wdGlvbnMgJiBPUFRfT1BFTl9MRUZUKSAmJiB0b3AuY29udGVudC5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIG9wdGlvbnMgfD0gT1BUX09QRU5fTEVGVDtcbiAgICAgICAgbGV0IGFwcGx5TWFya3MgPSBNYXJrLm5vbmU7XG4gICAgICAgIG1hcmtzID0gbWFya3MuZmlsdGVyKG0gPT4ge1xuICAgICAgICAgICAgaWYgKHRvcC50eXBlID8gdG9wLnR5cGUuYWxsb3dzTWFya1R5cGUobS50eXBlKSA6IG1hcmtNYXlBcHBseShtLnR5cGUsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlNYXJrcyA9IG0uYWRkVG9TZXQoYXBwbHlNYXJrcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobmV3IE5vZGVDb250ZXh0KHR5cGUsIGF0dHJzLCBhcHBseU1hcmtzLCBzb2xpZCwgbnVsbCwgb3B0aW9ucykpO1xuICAgICAgICB0aGlzLm9wZW4rKztcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvLyBNYWtlIHN1cmUgYWxsIG5vZGVzIGFib3ZlIHRoaXMub3BlbiBhcmUgZmluaXNoZWQgYW5kIGFkZGVkIHRvXG4gICAgLy8gdGhlaXIgcGFyZW50c1xuICAgIGNsb3NlRXh0cmEob3BlbkVuZCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoaSA+IHRoaXMub3Blbikge1xuICAgICAgICAgICAgZm9yICg7IGkgPiB0aGlzLm9wZW47IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzW2kgLSAxXS5jb250ZW50LnB1c2godGhpcy5ub2Rlc1tpXS5maW5pc2gob3BlbkVuZCkpO1xuICAgICAgICAgICAgdGhpcy5ub2Rlcy5sZW5ndGggPSB0aGlzLm9wZW4gKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5vcGVuID0gMDtcbiAgICAgICAgdGhpcy5jbG9zZUV4dHJhKHRoaXMuaXNPcGVuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbMF0uZmluaXNoKCEhKHRoaXMuaXNPcGVuIHx8IHRoaXMub3B0aW9ucy50b3BPcGVuKSk7XG4gICAgfVxuICAgIHN5bmModG8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5vZGVzW2ldID09IHRvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuID0gaTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9jYWxQcmVzZXJ2ZVdTKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2Rlc1tpXS5vcHRpb25zIHw9IE9QVF9QUkVTRVJWRV9XUztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBjdXJyZW50UG9zKCkge1xuICAgICAgICB0aGlzLmNsb3NlRXh0cmEoKTtcbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm9wZW47IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMubm9kZXNbaV0uY29udGVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBjb250ZW50Lmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKVxuICAgICAgICAgICAgICAgIHBvcyArPSBjb250ZW50W2pdLm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgZmluZEF0UG9pbnQocGFyZW50LCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5ub2RlID09IHBhcmVudCAmJiB0aGlzLmZpbmRbaV0ub2Zmc2V0ID09IG9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEluc2lkZShwYXJlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5wb3MgPT0gbnVsbCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMSAmJiBwYXJlbnQuY29udGFpbnModGhpcy5maW5kW2ldLm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kQXJvdW5kKHBhcmVudCwgY29udGVudCwgYmVmb3JlKSB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gY29udGVudCAmJiB0aGlzLmZpbmQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmluZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRbaV0ucG9zID09IG51bGwgJiYgcGFyZW50Lm5vZGVUeXBlID09IDEgJiYgcGFyZW50LmNvbnRhaW5zKHRoaXMuZmluZFtpXS5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLmZpbmRbaV0ubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgJiAoYmVmb3JlID8gMiA6IDQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kW2ldLnBvcyA9IHRoaXMuY3VycmVudFBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRJblRleHQodGV4dE5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5ub2RlID09IHRleHROb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zIC0gKHRleHROb2RlLm5vZGVWYWx1ZS5sZW5ndGggLSB0aGlzLmZpbmRbaV0ub2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZXh0IHN0cmluZyBtYXRjaGVzIHRoaXMgY29udGV4dC5cbiAgICBtYXRjaGVzQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0LmluZGV4T2YoXCJ8XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5zcGxpdCgvXFxzKlxcfFxccyovKS5zb21lKHRoaXMubWF0Y2hlc0NvbnRleHQsIHRoaXMpO1xuICAgICAgICBsZXQgcGFydHMgPSBjb250ZXh0LnNwbGl0KFwiL1wiKTtcbiAgICAgICAgbGV0IG9wdGlvbiA9IHRoaXMub3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBsZXQgdXNlUm9vdCA9ICF0aGlzLmlzT3BlbiAmJiAoIW9wdGlvbiB8fCBvcHRpb24ucGFyZW50LnR5cGUgPT0gdGhpcy5ub2Rlc1swXS50eXBlKTtcbiAgICAgICAgbGV0IG1pbkRlcHRoID0gLShvcHRpb24gPyBvcHRpb24uZGVwdGggKyAxIDogMCkgKyAodXNlUm9vdCA/IDAgOiAxKTtcbiAgICAgICAgbGV0IG1hdGNoID0gKGksIGRlcHRoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gcGFydHMubGVuZ3RoIC0gMSB8fCBpID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGRlcHRoID49IG1pbkRlcHRoOyBkZXB0aC0tKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKGkgLSAxLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gZGVwdGggPiAwIHx8IChkZXB0aCA9PSAwICYmIHVzZVJvb3QpID8gdGhpcy5ub2Rlc1tkZXB0aF0udHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb24gJiYgZGVwdGggPj0gbWluRGVwdGggPyBvcHRpb24ubm9kZShkZXB0aCAtIG1pbkRlcHRoKS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgKG5leHQubmFtZSAhPSBwYXJ0ICYmICFuZXh0LmlzSW5Hcm91cChwYXJ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBtYXRjaChwYXJ0cy5sZW5ndGggLSAxLCB0aGlzLm9wZW4pO1xuICAgIH1cbiAgICB0ZXh0YmxvY2tGcm9tQ29udGV4dCgpIHtcbiAgICAgICAgbGV0ICRjb250ZXh0ID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmICgkY29udGV4dClcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVmbHQgPSAkY29udGV4dC5ub2RlKGQpLmNvbnRlbnRNYXRjaEF0KCRjb250ZXh0LmluZGV4QWZ0ZXIoZCkpLmRlZmF1bHRUeXBlO1xuICAgICAgICAgICAgICAgIGlmIChkZWZsdCAmJiBkZWZsdC5pc1RleHRibG9jayAmJiBkZWZsdC5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXMpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5wYXJzZXIuc2NoZW1hLm5vZGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGUuaXNUZXh0YmxvY2sgJiYgdHlwZS5kZWZhdWx0QXR0cnMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgZGlyZWN0bHkgbmVzdGVkIGxpc3Qgbm9kZXMgcHJvZHVjZWQgYnkgc29tZVxuLy8gdG9vbHMgYW5kIGFsbG93ZWQgYnkgYnJvd3NlcnMgdG8gbWVhbiB0aGF0IHRoZSBuZXN0ZWQgbGlzdCBpc1xuLy8gYWN0dWFsbHkgcGFydCBvZiB0aGUgbGlzdCBpdGVtIGFib3ZlIGl0LlxuZnVuY3Rpb24gbm9ybWFsaXplTGlzdChkb20pIHtcbiAgICBmb3IgKGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkLCBwcmV2SXRlbSA9IG51bGw7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBuYW1lID0gY2hpbGQubm9kZVR5cGUgPT0gMSA/IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICBpZiAobmFtZSAmJiBsaXN0VGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBwcmV2SXRlbSkge1xuICAgICAgICAgICAgcHJldkl0ZW0uYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgY2hpbGQgPSBwcmV2SXRlbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09IFwibGlcIikge1xuICAgICAgICAgICAgcHJldkl0ZW0gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBwcmV2SXRlbSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBBcHBseSBhIENTUyBzZWxlY3Rvci5cbmZ1bmN0aW9uIG1hdGNoZXMoZG9tLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiAoZG9tLm1hdGNoZXMgfHwgZG9tLm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGRvbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZG9tLm1vek1hdGNoZXNTZWxlY3RvcikuY2FsbChkb20sIHNlbGVjdG9yKTtcbn1cbmZ1bmN0aW9uIGNvcHkob2JqKSB7XG4gICAgbGV0IGNvcHkgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iailcbiAgICAgICAgY29weVtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICByZXR1cm4gY29weTtcbn1cbi8vIFVzZWQgd2hlbiBmaW5kaW5nIGEgbWFyayBhdCB0aGUgdG9wIGxldmVsIG9mIGEgZnJhZ21lbnQgcGFyc2UuXG4vLyBDaGVja3Mgd2hldGhlciBpdCB3b3VsZCBiZSByZWFzb25hYmxlIHRvIGFwcGx5IGEgZ2l2ZW4gbWFyayB0eXBlIHRvXG4vLyBhIGdpdmVuIG5vZGUsIGJ5IGxvb2tpbmcgYXQgdGhlIHdheSB0aGUgbWFyayBvY2N1cnMgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG1hcmtNYXlBcHBseShtYXJrVHlwZSwgbm9kZVR5cGUpIHtcbiAgICBsZXQgbm9kZXMgPSBub2RlVHlwZS5zY2hlbWEubm9kZXM7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBub2Rlcykge1xuICAgICAgICBsZXQgcGFyZW50ID0gbm9kZXNbbmFtZV07XG4gICAgICAgIGlmICghcGFyZW50LmFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc2VlbiA9IFtdLCBzY2FuID0gKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBzZWVuLnB1c2gobWF0Y2gpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5lZGdlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB7IHR5cGUsIG5leHQgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbm9kZVR5cGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmluZGV4T2YobmV4dCkgPCAwICYmIHNjYW4obmV4dCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2NhbihwYXJlbnQuY29udGVudE1hdGNoKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuLyoqXG5BIERPTSBzZXJpYWxpemVyIGtub3dzIGhvdyB0byBjb252ZXJ0IFByb3NlTWlycm9yIG5vZGVzIGFuZFxubWFya3Mgb2YgdmFyaW91cyB0eXBlcyB0byBET00gbm9kZXMuXG4qL1xuY2xhc3MgRE9NU2VyaWFsaXplciB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2VyaWFsaXplci4gYG5vZGVzYCBzaG91bGQgbWFwIG5vZGUgbmFtZXMgdG8gZnVuY3Rpb25zXG4gICAgdGhhdCB0YWtlIGEgbm9kZSBhbmQgcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICBET00uIGBtYXJrc2AgZG9lcyB0aGUgc2FtZSBmb3IgbWFyayBuYW1lcywgYnV0IGFsc28gZ2V0cyBhblxuICAgIGFyZ3VtZW50IHRoYXQgdGVsbHMgaXQgd2hldGhlciB0aGUgbWFyaydzIGNvbnRlbnQgaXMgYmxvY2sgb3JcbiAgICBpbmxpbmUgY29udGVudCAoZm9yIHR5cGljYWwgdXNlLCBpdCdsbCBhbHdheXMgYmUgaW5saW5lKS4gQSBtYXJrXG4gICAgc2VyaWFsaXplciBtYXkgYmUgYG51bGxgIHRvIGluZGljYXRlIHRoYXQgbWFya3Mgb2YgdGhhdCB0eXBlXG4gICAgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5vZGUgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMuXG4gICAgKi9cbiAgICBub2RlcywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMuXG4gICAgKi9cbiAgICBtYXJrcykge1xuICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgICAgIHRoaXMubWFya3MgPSBtYXJrcztcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhZ21lbnQgdG8gYSBET00gZnJhZ21lbnQuIFdoZW5cbiAgICBub3QgaW4gdGhlIGJyb3dzZXIsIHRoZSBgZG9jdW1lbnRgIG9wdGlvbiwgY29udGFpbmluZyBhIERPTVxuICAgIGRvY3VtZW50LCBzaG91bGQgYmUgcGFzc2VkIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZXIgY2FuIGNyZWF0ZVxuICAgIG5vZGVzLlxuICAgICovXG4gICAgc2VyaWFsaXplRnJhZ21lbnQoZnJhZ21lbnQsIG9wdGlvbnMgPSB7fSwgdGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0KVxuICAgICAgICAgICAgdGFyZ2V0ID0gZG9jKG9wdGlvbnMpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgbGV0IHRvcCA9IHRhcmdldCwgYWN0aXZlID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlLmxlbmd0aCB8fCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBrZWVwID0gMCwgcmVuZGVyZWQgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aCAmJiByZW5kZXJlZCA8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5tYXJrc1tyZW5kZXJlZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXJrc1tuZXh0LnR5cGUubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQuZXEoYWN0aXZlW2tlZXBdWzBdKSB8fCBuZXh0LnR5cGUuc3BlYy5zcGFubmluZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAga2VlcCsrO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcCA8IGFjdGl2ZS5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IGFjdGl2ZS5wb3AoKVsxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVuZGVyZWQgPCBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkID0gbm9kZS5tYXJrc1tyZW5kZXJlZCsrXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtET00gPSB0aGlzLnNlcmlhbGl6ZU1hcmsoYWRkLCBub2RlLmlzSW5saW5lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5wdXNoKFthZGQsIHRvcF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmFwcGVuZENoaWxkKG1hcmtET00uZG9tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IG1hcmtET00uY29udGVudERPTSB8fCBtYXJrRE9NLmRvbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvcC5hcHBlbmRDaGlsZCh0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB7IGRvbSwgY29udGVudERPTSB9ID0gcmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRoaXMubm9kZXNbbm9kZS50eXBlLm5hbWVdKG5vZGUpLCBudWxsLCBub2RlLmF0dHJzKTtcbiAgICAgICAgaWYgKGNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBub3QgYWxsb3dlZCBpbiBhIGxlYWYgbm9kZSBzcGVjXCIpO1xuICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVGcmFnbWVudChub2RlLmNvbnRlbnQsIG9wdGlvbnMsIGNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGlzIG5vZGUgdG8gYSBET00gbm9kZS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91XG4gICAgbmVlZCB0byBzZXJpYWxpemUgYSBwYXJ0IG9mIGEgZG9jdW1lbnQsIGFzIG9wcG9zZWQgdG8gdGhlIHdob2xlXG4gICAgZG9jdW1lbnQuIFRvIHNlcmlhbGl6ZSBhIHdob2xlIGRvY3VtZW50LCB1c2VcbiAgICBbYHNlcmlhbGl6ZUZyYWdtZW50YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkRPTVNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQpIG9uXG4gICAgaXRzIFtjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5jb250ZW50KS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZU5vZGUobm9kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBkb20gPSB0aGlzLnNlcmlhbGl6ZU5vZGVJbm5lcihub2RlLCBvcHRpb25zKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUubWFya3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwID0gdGhpcy5zZXJpYWxpemVNYXJrKG5vZGUubWFya3NbaV0sIG5vZGUuaXNJbmxpbmUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHdyYXApIHtcbiAgICAgICAgICAgICAgICAod3JhcC5jb250ZW50RE9NIHx8IHdyYXAuZG9tKS5hcHBlbmRDaGlsZChkb20pO1xuICAgICAgICAgICAgICAgIGRvbSA9IHdyYXAuZG9tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb207XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2VyaWFsaXplTWFyayhtYXJrLCBpbmxpbmUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgdG9ET00gPSB0aGlzLm1hcmtzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgcmV0dXJuIHRvRE9NICYmIHJlbmRlclNwZWMoZG9jKG9wdGlvbnMpLCB0b0RPTShtYXJrLCBpbmxpbmUpLCBudWxsLCBtYXJrLmF0dHJzKTtcbiAgICB9XG4gICAgc3RhdGljIHJlbmRlclNwZWMoZG9jLCBzdHJ1Y3R1cmUsIHhtbE5TID0gbnVsbCwgYmxvY2tBcnJheXNJbikge1xuICAgICAgICByZXR1cm4gcmVuZGVyU3BlYyhkb2MsIHN0cnVjdHVyZSwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBCdWlsZCBhIHNlcmlhbGl6ZXIgdXNpbmcgdGhlIFtgdG9ET01gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMudG9ET00pXG4gICAgcHJvcGVydGllcyBpbiBhIHNjaGVtYSdzIG5vZGUgYW5kIG1hcmsgc3BlY3MuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tU2VyaWFsaXplciA9IG5ldyBET01TZXJpYWxpemVyKHRoaXMubm9kZXNGcm9tU2NoZW1hKHNjaGVtYSksIHRoaXMubWFya3NGcm9tU2NoZW1hKHNjaGVtYSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2F0aGVyIHRoZSBzZXJpYWxpemVycyBpbiBhIHNjaGVtYSdzIG5vZGUgc3BlY3MgaW50byBhbiBvYmplY3QuXG4gICAgVGhpcyBjYW4gYmUgdXNlZnVsIGFzIGEgYmFzZSB0byBidWlsZCBhIGN1c3RvbSBzZXJpYWxpemVyIGZyb20uXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZXNGcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZ2F0aGVyVG9ET00oc2NoZW1hLm5vZGVzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQudGV4dClcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ID0gbm9kZSA9PiBub2RlLnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdhdGhlciB0aGUgc2VyaWFsaXplcnMgaW4gYSBzY2hlbWEncyBtYXJrIHNwZWNzIGludG8gYW4gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIG1hcmtzRnJvbVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIGdhdGhlclRvRE9NKHNjaGVtYS5tYXJrcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2F0aGVyVG9ET00ob2JqKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2JqKSB7XG4gICAgICAgIGxldCB0b0RPTSA9IG9ialtuYW1lXS5zcGVjLnRvRE9NO1xuICAgICAgICBpZiAodG9ET00pXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB0b0RPTTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGRvYyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50O1xufVxuY29uc3Qgc3VzcGljaW91c0F0dHJpYnV0ZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHN1c3BpY2lvdXNBdHRyaWJ1dGVzKGF0dHJzKSB7XG4gICAgbGV0IHZhbHVlID0gc3VzcGljaW91c0F0dHJpYnV0ZUNhY2hlLmdldChhdHRycyk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHN1c3BpY2lvdXNBdHRyaWJ1dGVDYWNoZS5zZXQoYXR0cnMsIHZhbHVlID0gc3VzcGljaW91c0F0dHJpYnV0ZXNJbm5lcihhdHRycykpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHN1c3BpY2lvdXNBdHRyaWJ1dGVzSW5uZXIoYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmdW5jdGlvbiBzY2FuKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVswXSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FuKHZhbHVlW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBzY2FuKHZhbHVlW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuKGF0dHJzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcmVuZGVyU3BlYyhkb2MsIHN0cnVjdHVyZSwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pIHtcbiAgICBpZiAodHlwZW9mIHN0cnVjdHVyZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICByZXR1cm4geyBkb206IGRvYy5jcmVhdGVUZXh0Tm9kZShzdHJ1Y3R1cmUpIH07XG4gICAgaWYgKHN0cnVjdHVyZS5ub2RlVHlwZSAhPSBudWxsKVxuICAgICAgICByZXR1cm4geyBkb206IHN0cnVjdHVyZSB9O1xuICAgIGlmIChzdHJ1Y3R1cmUuZG9tICYmIHN0cnVjdHVyZS5kb20ubm9kZVR5cGUgIT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcbiAgICBsZXQgdGFnTmFtZSA9IHN0cnVjdHVyZVswXSwgc3VzcGljaW91cztcbiAgICBpZiAodHlwZW9mIHRhZ05hbWUgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFycmF5IHBhc3NlZCB0byByZW5kZXJTcGVjXCIpO1xuICAgIGlmIChibG9ja0FycmF5c0luICYmIChzdXNwaWNpb3VzID0gc3VzcGljaW91c0F0dHJpYnV0ZXMoYmxvY2tBcnJheXNJbikpICYmXG4gICAgICAgIHN1c3BpY2lvdXMuaW5kZXhPZihzdHJ1Y3R1cmUpID4gLTEpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVXNpbmcgYW4gYXJyYXkgZnJvbSBhbiBhdHRyaWJ1dGUgb2JqZWN0IGFzIGEgRE9NIHNwZWMuIFRoaXMgbWF5IGJlIGFuIGF0dGVtcHRlZCBjcm9zcyBzaXRlIHNjcmlwdGluZyBhdHRhY2suXCIpO1xuICAgIGxldCBzcGFjZSA9IHRhZ05hbWUuaW5kZXhPZihcIiBcIik7XG4gICAgaWYgKHNwYWNlID4gMCkge1xuICAgICAgICB4bWxOUyA9IHRhZ05hbWUuc2xpY2UoMCwgc3BhY2UpO1xuICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS5zbGljZShzcGFjZSArIDEpO1xuICAgIH1cbiAgICBsZXQgY29udGVudERPTTtcbiAgICBsZXQgZG9tID0gKHhtbE5TID8gZG9jLmNyZWF0ZUVsZW1lbnROUyh4bWxOUywgdGFnTmFtZSkgOiBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7XG4gICAgbGV0IGF0dHJzID0gc3RydWN0dXJlWzFdLCBzdGFydCA9IDE7XG4gICAgaWYgKGF0dHJzICYmIHR5cGVvZiBhdHRycyA9PSBcIm9iamVjdFwiICYmIGF0dHJzLm5vZGVUeXBlID09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoYXR0cnMpKSB7XG4gICAgICAgIHN0YXJ0ID0gMjtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycylcbiAgICAgICAgICAgIGlmIChhdHRyc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwYWNlID0gbmFtZS5pbmRleE9mKFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoc3BhY2UgPiAwKVxuICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlTlMobmFtZS5zbGljZSgwLCBzcGFjZSksIG5hbWUuc2xpY2Uoc3BhY2UgKyAxKSwgYXR0cnNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBzdHJ1Y3R1cmVbaV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGkgPCBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSB8fCBpID4gc3RhcnQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDb250ZW50IGhvbGUgbXVzdCBiZSB0aGUgb25seSBjaGlsZCBvZiBpdHMgcGFyZW50IG5vZGVcIik7XG4gICAgICAgICAgICByZXR1cm4geyBkb20sIGNvbnRlbnRET006IGRvbSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHsgZG9tOiBpbm5lciwgY29udGVudERPTTogaW5uZXJDb250ZW50IH0gPSByZW5kZXJTcGVjKGRvYywgY2hpbGQsIHhtbE5TLCBibG9ja0FycmF5c0luKTtcbiAgICAgICAgICAgIGRvbS5hcHBlbmRDaGlsZChpbm5lcik7XG4gICAgICAgICAgICBpZiAoaW5uZXJDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVsdGlwbGUgY29udGVudCBob2xlc1wiKTtcbiAgICAgICAgICAgICAgICBjb250ZW50RE9NID0gaW5uZXJDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTSB9O1xufVxuXG5leHBvcnQgeyBDb250ZW50TWF0Y2gsIERPTVBhcnNlciwgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIE1hcmtUeXBlLCBOb2RlLCBOb2RlUmFuZ2UsIE5vZGVUeXBlLCBSZXBsYWNlRXJyb3IsIFJlc29sdmVkUG9zLCBTY2hlbWEsIFNsaWNlIH07XG4iLCJpbXBvcnQgeyBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbmNvbnN0IHBET00gPSBbXCJwXCIsIDBdLCBibG9ja3F1b3RlRE9NID0gW1wiYmxvY2txdW90ZVwiLCAwXSwgaHJET00gPSBbXCJoclwiXSwgcHJlRE9NID0gW1wicHJlXCIsIFtcImNvZGVcIiwgMF1dLCBickRPTSA9IFtcImJyXCJdO1xuLyoqXG5bU3BlY3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykgZm9yIHRoZSBub2RlcyBkZWZpbmVkIGluIHRoaXMgc2NoZW1hLlxuKi9cbmNvbnN0IG5vZGVzID0ge1xuICAgIC8qKlxuICAgIE5vZGVTcGVjIFRoZSB0b3AgbGV2ZWwgZG9jdW1lbnQgbm9kZS5cbiAgICAqL1xuICAgIGRvYzoge1xuICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiXG4gICAgfSxcbiAgICAvKipcbiAgICBBIHBsYWluIHBhcmFncmFwaCB0ZXh0YmxvY2suIFJlcHJlc2VudGVkIGluIHRoZSBET01cbiAgICBhcyBhIGA8cD5gIGVsZW1lbnQuXG4gICAgKi9cbiAgICBwYXJhZ3JhcGg6IHtcbiAgICAgICAgY29udGVudDogXCJpbmxpbmUqXCIsXG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicFwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHBET007IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgYmxvY2txdW90ZSAoYDxibG9ja3F1b3RlPmApIHdyYXBwaW5nIG9uZSBvciBtb3JlIGJsb2Nrcy5cbiAgICAqL1xuICAgIGJsb2NrcXVvdGU6IHtcbiAgICAgICAgY29udGVudDogXCJibG9jaytcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYmxvY2txdW90ZVwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGJsb2NrcXVvdGVET007IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgaG9yaXpvbnRhbCBydWxlIChgPGhyPmApLlxuICAgICovXG4gICAgaG9yaXpvbnRhbF9ydWxlOiB7XG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaHJcIiB9XSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBockRPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBoZWFkaW5nIHRleHRibG9jaywgd2l0aCBhIGBsZXZlbGAgYXR0cmlidXRlIHRoYXRcbiAgICBzaG91bGQgaG9sZCB0aGUgbnVtYmVyIDEgdG8gNi4gUGFyc2VkIGFuZCBzZXJpYWxpemVkIGFzIGA8aDE+YCB0b1xuICAgIGA8aDY+YCBlbGVtZW50cy5cbiAgICAqL1xuICAgIGhlYWRpbmc6IHtcbiAgICAgICAgYXR0cnM6IHsgbGV2ZWw6IHsgZGVmYXVsdDogMSwgdmFsaWRhdGU6IFwibnVtYmVyXCIgfSB9LFxuICAgICAgICBjb250ZW50OiBcImlubGluZSpcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaDFcIiwgYXR0cnM6IHsgbGV2ZWw6IDEgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDJcIiwgYXR0cnM6IHsgbGV2ZWw6IDIgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDNcIiwgYXR0cnM6IHsgbGV2ZWw6IDMgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDRcIiwgYXR0cnM6IHsgbGV2ZWw6IDQgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDVcIiwgYXR0cnM6IHsgbGV2ZWw6IDUgfSB9LFxuICAgICAgICAgICAgeyB0YWc6IFwiaDZcIiwgYXR0cnM6IHsgbGV2ZWw6IDYgfSB9XSxcbiAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wiaFwiICsgbm9kZS5hdHRycy5sZXZlbCwgMF07IH1cbiAgICB9LFxuICAgIC8qKlxuICAgIEEgY29kZSBsaXN0aW5nLiBEaXNhbGxvd3MgbWFya3Mgb3Igbm9uLXRleHQgaW5saW5lXG4gICAgbm9kZXMgYnkgZGVmYXVsdC4gUmVwcmVzZW50ZWQgYXMgYSBgPHByZT5gIGVsZW1lbnQgd2l0aCBhXG4gICAgYDxjb2RlPmAgZWxlbWVudCBpbnNpZGUgb2YgaXQuXG4gICAgKi9cbiAgICBjb2RlX2Jsb2NrOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwidGV4dCpcIixcbiAgICAgICAgbWFya3M6IFwiXCIsXG4gICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGRlZmluaW5nOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInByZVwiLCBwcmVzZXJ2ZVdoaXRlc3BhY2U6IFwiZnVsbFwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHByZURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgVGhlIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIHRleHQ6IHtcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCJcbiAgICB9LFxuICAgIC8qKlxuICAgIEFuIGlubGluZSBpbWFnZSAoYDxpbWc+YCkgbm9kZS4gU3VwcG9ydHMgYHNyY2AsXG4gICAgYGFsdGAsIGFuZCBgaHJlZmAgYXR0cmlidXRlcy4gVGhlIGxhdHRlciB0d28gZGVmYXVsdCB0byB0aGUgZW1wdHlcbiAgICBzdHJpbmcuXG4gICAgKi9cbiAgICBpbWFnZToge1xuICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBzcmM6IHsgdmFsaWRhdGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIGFsdDogeyBkZWZhdWx0OiBudWxsLCB2YWxpZGF0ZTogXCJzdHJpbmd8bnVsbFwiIH0sXG4gICAgICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsLCB2YWxpZGF0ZTogXCJzdHJpbmd8bnVsbFwiIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJpbWdbc3JjXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogZG9tLmdldEF0dHJpYnV0ZShcInNyY1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ6IGRvbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IGxldCB7IHNyYywgYWx0LCB0aXRsZSB9ID0gbm9kZS5hdHRyczsgcmV0dXJuIFtcImltZ1wiLCB7IHNyYywgYWx0LCB0aXRsZSB9XTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBoYXJkIGxpbmUgYnJlYWssIHJlcHJlc2VudGVkIGluIHRoZSBET00gYXMgYDxicj5gLlxuICAgICovXG4gICAgaGFyZF9icmVhazoge1xuICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgIGdyb3VwOiBcImlubGluZVwiLFxuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJiclwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGJyRE9NOyB9XG4gICAgfVxufTtcbmNvbnN0IGVtRE9NID0gW1wiZW1cIiwgMF0sIHN0cm9uZ0RPTSA9IFtcInN0cm9uZ1wiLCAwXSwgY29kZURPTSA9IFtcImNvZGVcIiwgMF07XG4vKipcbltTcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtTcGVjKSBmb3IgdGhlIG1hcmtzIGluIHRoZSBzY2hlbWEuXG4qL1xuY29uc3QgbWFya3MgPSB7XG4gICAgLyoqXG4gICAgQSBsaW5rLiBIYXMgYGhyZWZgIGFuZCBgdGl0bGVgIGF0dHJpYnV0ZXMuIGB0aXRsZWBcbiAgICBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLiBSZW5kZXJlZCBhbmQgcGFyc2VkIGFzIGFuIGA8YT5gXG4gICAgZWxlbWVudC5cbiAgICAqL1xuICAgIGxpbms6IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGhyZWY6IHsgdmFsaWRhdGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfVxuICAgICAgICB9LFxuICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImFbaHJlZl1cIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGhyZWY6IGRvbS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLCB0aXRsZTogZG9tLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIH07XG4gICAgICAgICAgICAgICAgfSB9XSxcbiAgICAgICAgdG9ET00obm9kZSkgeyBsZXQgeyBocmVmLCB0aXRsZSB9ID0gbm9kZS5hdHRyczsgcmV0dXJuIFtcImFcIiwgeyBocmVmLCB0aXRsZSB9LCAwXTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQW4gZW1waGFzaXMgbWFyay4gUmVuZGVyZWQgYXMgYW4gYDxlbT5gIGVsZW1lbnQuIEhhcyBwYXJzZSBydWxlc1xuICAgIHRoYXQgYWxzbyBtYXRjaCBgPGk+YCBhbmQgYGZvbnQtc3R5bGU6IGl0YWxpY2AuXG4gICAgKi9cbiAgICBlbToge1xuICAgICAgICBwYXJzZURPTTogW1xuICAgICAgICAgICAgeyB0YWc6IFwiaVwiIH0sIHsgdGFnOiBcImVtXCIgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC1zdHlsZT1pdGFsaWNcIiB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPW5vcm1hbFwiLCBjbGVhck1hcms6IG0gPT4gbS50eXBlLm5hbWUgPT0gXCJlbVwiIH1cbiAgICAgICAgXSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBlbURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBzdHJvbmcgbWFyay4gUmVuZGVyZWQgYXMgYDxzdHJvbmc+YCwgcGFyc2UgcnVsZXMgYWxzbyBtYXRjaFxuICAgIGA8Yj5gIGFuZCBgZm9udC13ZWlnaHQ6IGJvbGRgLlxuICAgICovXG4gICAgc3Ryb25nOiB7XG4gICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICB7IHRhZzogXCJzdHJvbmdcIiB9LFxuICAgICAgICAgICAgLy8gVGhpcyB3b3JrcyBhcm91bmQgYSBHb29nbGUgRG9jcyBtaXNiZWhhdmlvciB3aGVyZVxuICAgICAgICAgICAgLy8gcGFzdGVkIGNvbnRlbnQgd2lsbCBiZSBpbmV4cGxpY2FibHkgd3JhcHBlZCBpbiBgPGI+YFxuICAgICAgICAgICAgLy8gdGFncyB3aXRoIGEgZm9udC13ZWlnaHQgbm9ybWFsLlxuICAgICAgICAgICAgeyB0YWc6IFwiYlwiLCBnZXRBdHRyczogKG5vZGUpID0+IG5vZGUuc3R5bGUuZm9udFdlaWdodCAhPSBcIm5vcm1hbFwiICYmIG51bGwgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHQ9NDAwXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtd2VpZ2h0XCIsIGdldEF0dHJzOiAodmFsdWUpID0+IC9eKGJvbGQoZXIpP3xbNS05XVxcZHsyLH0pJC8udGVzdCh2YWx1ZSkgJiYgbnVsbCB9LFxuICAgICAgICBdLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIHN0cm9uZ0RPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQ29kZSBmb250IG1hcmsuIFJlcHJlc2VudGVkIGFzIGEgYDxjb2RlPmAgZWxlbWVudC5cbiAgICAqL1xuICAgIGNvZGU6IHtcbiAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJjb2RlXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gY29kZURPTTsgfVxuICAgIH1cbn07XG4vKipcblRoaXMgc2NoZW1hIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gdGhlIGRvY3VtZW50IHNjaGVtYSB1c2VkIGJ5XG5bQ29tbW9uTWFya10oaHR0cDovL2NvbW1vbm1hcmsub3JnLyksIG1pbnVzIHRoZSBsaXN0IGVsZW1lbnRzLFxud2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIFtgcHJvc2VtaXJyb3Itc2NoZW1hLWxpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3QpXG5tb2R1bGUuXG5cblRvIHJldXNlIGVsZW1lbnRzIGZyb20gdGhpcyBzY2hlbWEsIGV4dGVuZCBvciByZWFkIGZyb20gaXRzXG5gc3BlYy5ub2Rlc2AgYW5kIGBzcGVjLm1hcmtzYCBbcHJvcGVydGllc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlNjaGVtYS5zcGVjKS5cbiovXG5jb25zdCBzY2hlbWEgPSBuZXcgU2NoZW1hKHsgbm9kZXMsIG1hcmtzIH0pO1xuXG5leHBvcnQgeyBtYXJrcywgbm9kZXMsIHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgZmluZFdyYXBwaW5nLCBSZXBsYWNlQXJvdW5kU3RlcCwgY2FuU3BsaXQsIGxpZnRUYXJnZXQsIGNhbkpvaW4gfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgTm9kZVJhbmdlLCBGcmFnbWVudCwgU2xpY2UgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbmNvbnN0IG9sRE9NID0gW1wib2xcIiwgMF0sIHVsRE9NID0gW1widWxcIiwgMF0sIGxpRE9NID0gW1wibGlcIiwgMF07XG4vKipcbkFuIG9yZGVyZWQgbGlzdCBbbm9kZSBzcGVjXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMpLiBIYXMgYSBzaW5nbGVcbmF0dHJpYnV0ZSwgYG9yZGVyYCwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIGF0IHdoaWNoIHRoZSBsaXN0XG5zdGFydHMgY291bnRpbmcsIGFuZCBkZWZhdWx0cyB0byAxLiBSZXByZXNlbnRlZCBhcyBhbiBgPG9sPmBcbmVsZW1lbnQuXG4qL1xuY29uc3Qgb3JkZXJlZExpc3QgPSB7XG4gICAgYXR0cnM6IHsgb3JkZXI6IHsgZGVmYXVsdDogMSwgdmFsaWRhdGU6IFwibnVtYmVyXCIgfSB9LFxuICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwib2xcIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JkZXI6IGRvbS5oYXNBdHRyaWJ1dGUoXCJzdGFydFwiKSA/ICtkb20uZ2V0QXR0cmlidXRlKFwic3RhcnRcIikgOiAxIH07XG4gICAgICAgICAgICB9IH1dLFxuICAgIHRvRE9NKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuYXR0cnMub3JkZXIgPT0gMSA/IG9sRE9NIDogW1wib2xcIiwgeyBzdGFydDogbm9kZS5hdHRycy5vcmRlciB9LCAwXTtcbiAgICB9XG59O1xuLyoqXG5BIGJ1bGxldCBsaXN0IG5vZGUgc3BlYywgcmVwcmVzZW50ZWQgaW4gdGhlIERPTSBhcyBgPHVsPmAuXG4qL1xuY29uc3QgYnVsbGV0TGlzdCA9IHtcbiAgICBwYXJzZURPTTogW3sgdGFnOiBcInVsXCIgfV0sXG4gICAgdG9ET00oKSB7IHJldHVybiB1bERPTTsgfVxufTtcbi8qKlxuQSBsaXN0IGl0ZW0gKGA8bGk+YCkgc3BlYy5cbiovXG5jb25zdCBsaXN0SXRlbSA9IHtcbiAgICBwYXJzZURPTTogW3sgdGFnOiBcImxpXCIgfV0sXG4gICAgdG9ET00oKSB7IHJldHVybiBsaURPTTsgfSxcbiAgICBkZWZpbmluZzogdHJ1ZVxufTtcbmZ1bmN0aW9uIGFkZChvYmosIHByb3BzKSB7XG4gICAgbGV0IGNvcHkgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iailcbiAgICAgICAgY29weVtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKVxuICAgICAgICBjb3B5W3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG4vKipcbkNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBhZGRpbmcgbGlzdC1yZWxhdGVkIG5vZGUgdHlwZXMgdG8gYSBtYXBcbnNwZWNpZnlpbmcgdGhlIG5vZGVzIGZvciBhIHNjaGVtYS4gQWRkc1xuW2BvcmRlcmVkTGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5vcmRlcmVkTGlzdCkgYXMgYFwib3JkZXJlZF9saXN0XCJgLFxuW2BidWxsZXRMaXN0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0LmJ1bGxldExpc3QpIGFzIGBcImJ1bGxldF9saXN0XCJgLCBhbmRcbltgbGlzdEl0ZW1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3QubGlzdEl0ZW0pIGFzIGBcImxpc3RfaXRlbVwiYC5cblxuYGl0ZW1Db250ZW50YCBkZXRlcm1pbmVzIHRoZSBjb250ZW50IGV4cHJlc3Npb24gZm9yIHRoZSBsaXN0IGl0ZW1zLlxuSWYgeW91IHdhbnQgdGhlIGNvbW1hbmRzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgdG8gYXBwbHkgdG8geW91clxubGlzdCBzdHJ1Y3R1cmUsIGl0IHNob3VsZCBoYXZlIGEgc2hhcGUgbGlrZSBgXCJwYXJhZ3JhcGggYmxvY2sqXCJgIG9yXG5gXCJwYXJhZ3JhcGggKG9yZGVyZWRfbGlzdCB8IGJ1bGxldF9saXN0KSpcImAuIGBsaXN0R3JvdXBgIGNhbiBiZVxuZ2l2ZW4gdG8gYXNzaWduIGEgZ3JvdXAgbmFtZSB0byB0aGUgbGlzdCBub2RlIHR5cGVzLCBmb3IgZXhhbXBsZVxuYFwiYmxvY2tcImAuXG4qL1xuZnVuY3Rpb24gYWRkTGlzdE5vZGVzKG5vZGVzLCBpdGVtQ29udGVudCwgbGlzdEdyb3VwKSB7XG4gICAgcmV0dXJuIG5vZGVzLmFwcGVuZCh7XG4gICAgICAgIG9yZGVyZWRfbGlzdDogYWRkKG9yZGVyZWRMaXN0LCB7IGNvbnRlbnQ6IFwibGlzdF9pdGVtK1wiLCBncm91cDogbGlzdEdyb3VwIH0pLFxuICAgICAgICBidWxsZXRfbGlzdDogYWRkKGJ1bGxldExpc3QsIHsgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsIGdyb3VwOiBsaXN0R3JvdXAgfSksXG4gICAgICAgIGxpc3RfaXRlbTogYWRkKGxpc3RJdGVtLCB7IGNvbnRlbnQ6IGl0ZW1Db250ZW50IH0pXG4gICAgfSk7XG59XG4vKipcblJldHVybnMgYSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHNlbGVjdGlvbiBpbiBhIGxpc3Qgd2l0aFxudGhlIGdpdmVuIHR5cGUgYW4gYXR0cmlidXRlcy4gSWYgYGRpc3BhdGNoYCBpcyBudWxsLCBvbmx5IHJldHVybiBhXG52YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgaXMgcG9zc2libGUsIGJ1dCBkb24ndCBhY3R1YWxseVxucGVyZm9ybSB0aGUgY2hhbmdlLlxuKi9cbmZ1bmN0aW9uIHdyYXBJbkxpc3QobGlzdFR5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgdHIgPSBkaXNwYXRjaCA/IHN0YXRlLnRyIDogbnVsbDtcbiAgICAgICAgaWYgKCF3cmFwUmFuZ2VJbkxpc3QodHIsIHJhbmdlLCBsaXN0VHlwZSwgYXR0cnMpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbn1cbi8qKlxuVHJ5IHRvIHdyYXAgdGhlIGdpdmVuIG5vZGUgcmFuZ2UgaW4gYSBsaXN0IG9mIHRoZSBnaXZlbiB0eXBlLlxuUmV0dXJuIGB0cnVlYCB3aGVuIHRoaXMgaXMgcG9zc2libGUsIGBmYWxzZWAgb3RoZXJ3aXNlLiBXaGVuIGB0cmBcbmlzIG5vbi1udWxsLCB0aGUgd3JhcHBpbmcgaXMgYWRkZWQgdG8gdGhhdCB0cmFuc2FjdGlvbi4gV2hlbiBpdCBpc1xuYG51bGxgLCB0aGUgZnVuY3Rpb24gb25seSBxdWVyaWVzIHdoZXRoZXIgdGhlIHdyYXBwaW5nIGlzXG5wb3NzaWJsZS5cbiovXG5mdW5jdGlvbiB3cmFwUmFuZ2VJbkxpc3QodHIsIHJhbmdlLCBsaXN0VHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgbGV0IGRvSm9pbiA9IGZhbHNlLCBvdXRlclJhbmdlID0gcmFuZ2UsIGRvYyA9IHJhbmdlLiRmcm9tLmRvYztcbiAgICAvLyBUaGlzIGlzIGF0IHRoZSB0b3Agb2YgYW4gZXhpc3RpbmcgbGlzdCBpdGVtXG4gICAgaWYgKHJhbmdlLmRlcHRoID49IDIgJiYgcmFuZ2UuJGZyb20ubm9kZShyYW5nZS5kZXB0aCAtIDEpLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQobGlzdFR5cGUpICYmIHJhbmdlLnN0YXJ0SW5kZXggPT0gMCkge1xuICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGlzIHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgICAgICAgaWYgKHJhbmdlLiRmcm9tLmluZGV4KHJhbmdlLmRlcHRoIC0gMSkgPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0ICRpbnNlcnQgPSBkb2MucmVzb2x2ZShyYW5nZS5zdGFydCAtIDIpO1xuICAgICAgICBvdXRlclJhbmdlID0gbmV3IE5vZGVSYW5nZSgkaW5zZXJ0LCAkaW5zZXJ0LCByYW5nZS5kZXB0aCk7XG4gICAgICAgIGlmIChyYW5nZS5lbmRJbmRleCA8IHJhbmdlLnBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmFuZ2UgPSBuZXcgTm9kZVJhbmdlKHJhbmdlLiRmcm9tLCBkb2MucmVzb2x2ZShyYW5nZS4kdG8uZW5kKHJhbmdlLmRlcHRoKSksIHJhbmdlLmRlcHRoKTtcbiAgICAgICAgZG9Kb2luID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHdyYXAgPSBmaW5kV3JhcHBpbmcob3V0ZXJSYW5nZSwgbGlzdFR5cGUsIGF0dHJzLCByYW5nZSk7XG4gICAgaWYgKCF3cmFwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRyKVxuICAgICAgICBkb1dyYXBJbkxpc3QodHIsIHJhbmdlLCB3cmFwLCBkb0pvaW4sIGxpc3RUeXBlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRvV3JhcEluTGlzdCh0ciwgcmFuZ2UsIHdyYXBwZXJzLCBqb2luQmVmb3JlLCBsaXN0VHlwZSkge1xuICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgZm9yIChsZXQgaSA9IHdyYXBwZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbSh3cmFwcGVyc1tpXS50eXBlLmNyZWF0ZSh3cmFwcGVyc1tpXS5hdHRycywgY29udGVudCkpO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHJhbmdlLnN0YXJ0IC0gKGpvaW5CZWZvcmUgPyAyIDogMCksIHJhbmdlLmVuZCwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgbmV3IFNsaWNlKGNvbnRlbnQsIDAsIDApLCB3cmFwcGVycy5sZW5ndGgsIHRydWUpKTtcbiAgICBsZXQgZm91bmQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcHBlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICh3cmFwcGVyc1tpXS50eXBlID09IGxpc3RUeXBlKVxuICAgICAgICAgICAgZm91bmQgPSBpICsgMTtcbiAgICBsZXQgc3BsaXREZXB0aCA9IHdyYXBwZXJzLmxlbmd0aCAtIGZvdW5kO1xuICAgIGxldCBzcGxpdFBvcyA9IHJhbmdlLnN0YXJ0ICsgd3JhcHBlcnMubGVuZ3RoIC0gKGpvaW5CZWZvcmUgPyAyIDogMCksIHBhcmVudCA9IHJhbmdlLnBhcmVudDtcbiAgICBmb3IgKGxldCBpID0gcmFuZ2Uuc3RhcnRJbmRleCwgZSA9IHJhbmdlLmVuZEluZGV4LCBmaXJzdCA9IHRydWU7IGkgPCBlOyBpKyssIGZpcnN0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCFmaXJzdCAmJiBjYW5TcGxpdCh0ci5kb2MsIHNwbGl0UG9zLCBzcGxpdERlcHRoKSkge1xuICAgICAgICAgICAgdHIuc3BsaXQoc3BsaXRQb3MsIHNwbGl0RGVwdGgpO1xuICAgICAgICAgICAgc3BsaXRQb3MgKz0gMiAqIHNwbGl0RGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgc3BsaXRQb3MgKz0gcGFyZW50LmNoaWxkKGkpLm5vZGVTaXplO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG4vKipcbkJ1aWxkIGEgY29tbWFuZCB0aGF0IHNwbGl0cyBhIG5vbi1lbXB0eSB0ZXh0YmxvY2sgYXQgdGhlIHRvcCBsZXZlbFxub2YgYSBsaXN0IGl0ZW0gYnkgYWxzbyBzcGxpdHRpbmcgdGhhdCBsaXN0IGl0ZW0uXG4qL1xuZnVuY3Rpb24gc3BsaXRMaXN0SXRlbShpdGVtVHlwZSwgaXRlbUF0dHJzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0bywgbm9kZSB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoKG5vZGUgJiYgbm9kZS5pc0Jsb2NrKSB8fCAkZnJvbS5kZXB0aCA8IDIgfHwgISRmcm9tLnNhbWVQYXJlbnQoJHRvKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGdyYW5kUGFyZW50ID0gJGZyb20ubm9kZSgtMSk7XG4gICAgICAgIGlmIChncmFuZFBhcmVudC50eXBlICE9IGl0ZW1UeXBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoJGZyb20ucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmICRmcm9tLm5vZGUoLTEpLmNoaWxkQ291bnQgPT0gJGZyb20uaW5kZXhBZnRlcigtMSkpIHtcbiAgICAgICAgICAgIC8vIEluIGFuIGVtcHR5IGJsb2NrLiBJZiB0aGlzIGlzIGEgbmVzdGVkIGxpc3QsIHRoZSB3cmFwcGluZ1xuICAgICAgICAgICAgLy8gbGlzdCBpdGVtIHNob3VsZCBiZSBzcGxpdC4gT3RoZXJ3aXNlLCBiYWlsIG91dCBhbmQgbGV0IG5leHRcbiAgICAgICAgICAgIC8vIGNvbW1hbmQgaGFuZGxlIGxpZnRpbmcuXG4gICAgICAgICAgICBpZiAoJGZyb20uZGVwdGggPT0gMyB8fCAkZnJvbS5ub2RlKC0zKS50eXBlICE9IGl0ZW1UeXBlIHx8XG4gICAgICAgICAgICAgICAgJGZyb20uaW5kZXgoLTIpICE9ICRmcm9tLm5vZGUoLTIpLmNoaWxkQ291bnQgLSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoQmVmb3JlID0gJGZyb20uaW5kZXgoLTEpID8gMSA6ICRmcm9tLmluZGV4KC0yKSA/IDIgOiAzO1xuICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgZnJhZ21lbnQgY29udGFpbmluZyBlbXB0eSB2ZXJzaW9ucyBvZiB0aGUgc3RydWN0dXJlXG4gICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgb3V0ZXIgbGlzdCBpdGVtIHRvIHRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZCA9ICRmcm9tLmRlcHRoIC0gZGVwdGhCZWZvcmU7IGQgPj0gJGZyb20uZGVwdGggLSAzOyBkLS0pXG4gICAgICAgICAgICAgICAgICAgIHdyYXAgPSBGcmFnbWVudC5mcm9tKCRmcm9tLm5vZGUoZCkuY29weSh3cmFwKSk7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHRoQWZ0ZXIgPSAkZnJvbS5pbmRleEFmdGVyKC0xKSA8ICRmcm9tLm5vZGUoLTIpLmNoaWxkQ291bnQgPyAxXG4gICAgICAgICAgICAgICAgICAgIDogJGZyb20uaW5kZXhBZnRlcigtMikgPCAkZnJvbS5ub2RlKC0zKS5jaGlsZENvdW50ID8gMiA6IDM7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGEgc2Vjb25kIGxpc3QgaXRlbSB3aXRoIGFuIGVtcHR5IGRlZmF1bHQgc3RhcnQgbm9kZVxuICAgICAgICAgICAgICAgIHdyYXAgPSB3cmFwLmFwcGVuZChGcmFnbWVudC5mcm9tKGl0ZW1UeXBlLmNyZWF0ZUFuZEZpbGwoKSkpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9ICRmcm9tLmJlZm9yZSgkZnJvbS5kZXB0aCAtIChkZXB0aEJlZm9yZSAtIDEpKTtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5yZXBsYWNlKHN0YXJ0LCAkZnJvbS5hZnRlcigtZGVwdGhBZnRlciksIG5ldyBTbGljZSh3cmFwLCA0IC0gZGVwdGhCZWZvcmUsIDApKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gLTE7XG4gICAgICAgICAgICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihzdGFydCwgdHIuZG9jLmNvbnRlbnQuc2l6ZSwgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsID4gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmlzVGV4dGJsb2NrICYmIG5vZGUuY29udGVudC5zaXplID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBwb3MgKyAxO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzZWwgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHNlbCkpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0VHlwZSA9ICR0by5wb3MgPT0gJGZyb20uZW5kKCkgPyBncmFuZFBhcmVudC5jb250ZW50TWF0Y2hBdCgwKS5kZWZhdWx0VHlwZSA6IG51bGw7XG4gICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLmRlbGV0ZSgkZnJvbS5wb3MsICR0by5wb3MpO1xuICAgICAgICBsZXQgdHlwZXMgPSBuZXh0VHlwZSA/IFtpdGVtQXR0cnMgPyB7IHR5cGU6IGl0ZW1UeXBlLCBhdHRyczogaXRlbUF0dHJzIH0gOiBudWxsLCB7IHR5cGU6IG5leHRUeXBlIH1dIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNhblNwbGl0KHRyLmRvYywgJGZyb20ucG9zLCAyLCB0eXBlcykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNwbGl0KCRmcm9tLnBvcywgMiwgdHlwZXMpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5BY3RzIGxpa2UgW2BzcGxpdExpc3RJdGVtYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0LnNwbGl0TGlzdEl0ZW0pLCBidXRcbndpdGhvdXQgcmVzZXR0aW5nIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzIGF0IHRoZSBjdXJzb3IuXG4qL1xuZnVuY3Rpb24gc3BsaXRMaXN0SXRlbUtlZXBNYXJrcyhpdGVtVHlwZSwgaXRlbUF0dHJzKSB7XG4gICAgbGV0IHNwbGl0ID0gc3BsaXRMaXN0SXRlbShpdGVtVHlwZSwgaXRlbUF0dHJzKTtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICByZXR1cm4gc3BsaXQoc3RhdGUsIGRpc3BhdGNoICYmICh0ciA9PiB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSBzdGF0ZS5zdG9yZWRNYXJrcyB8fCAoc3RhdGUuc2VsZWN0aW9uLiR0by5wYXJlbnRPZmZzZXQgJiYgc3RhdGUuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpO1xuICAgICAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgICAgIHRyLmVuc3VyZU1hcmtzKG1hcmtzKTtcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICAgICAgfSkpO1xuICAgIH07XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgdG8gbGlmdCB0aGUgbGlzdCBpdGVtIGFyb3VuZCB0aGUgc2VsZWN0aW9uIHVwIGludG9cbmEgd3JhcHBpbmcgbGlzdC5cbiovXG5mdW5jdGlvbiBsaWZ0TGlzdEl0ZW0oaXRlbVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCBub2RlID0+IG5vZGUuY2hpbGRDb3VudCA+IDAgJiYgbm9kZS5maXJzdENoaWxkLnR5cGUgPT0gaXRlbVR5cGUpO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWRpc3BhdGNoKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICgkZnJvbS5ub2RlKHJhbmdlLmRlcHRoIC0gMSkudHlwZSA9PSBpdGVtVHlwZSkgLy8gSW5zaWRlIGEgcGFyZW50IGxpc3RcbiAgICAgICAgICAgIHJldHVybiBsaWZ0VG9PdXRlckxpc3Qoc3RhdGUsIGRpc3BhdGNoLCBpdGVtVHlwZSwgcmFuZ2UpO1xuICAgICAgICBlbHNlIC8vIE91dGVyIGxpc3Qgbm9kZVxuICAgICAgICAgICAgcmV0dXJuIGxpZnRPdXRPZkxpc3Qoc3RhdGUsIGRpc3BhdGNoLCByYW5nZSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGxpZnRUb091dGVyTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIGl0ZW1UeXBlLCByYW5nZSkge1xuICAgIGxldCB0ciA9IHN0YXRlLnRyLCBlbmQgPSByYW5nZS5lbmQsIGVuZE9mTGlzdCA9IHJhbmdlLiR0by5lbmQocmFuZ2UuZGVwdGgpO1xuICAgIGlmIChlbmQgPCBlbmRPZkxpc3QpIHtcbiAgICAgICAgLy8gVGhlcmUgYXJlIHNpYmxpbmdzIGFmdGVyIHRoZSBsaWZ0ZWQgaXRlbXMsIHdoaWNoIG11c3QgYmVjb21lXG4gICAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSBsYXN0IGl0ZW1cbiAgICAgICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoZW5kIC0gMSwgZW5kT2ZMaXN0LCBlbmQsIGVuZE9mTGlzdCwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlKG51bGwsIHJhbmdlLnBhcmVudC5jb3B5KCkpKSwgMSwgMCksIDEsIHRydWUpKTtcbiAgICAgICAgcmFuZ2UgPSBuZXcgTm9kZVJhbmdlKHRyLmRvYy5yZXNvbHZlKHJhbmdlLiRmcm9tLnBvcyksIHRyLmRvYy5yZXNvbHZlKGVuZE9mTGlzdCksIHJhbmdlLmRlcHRoKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHIubGlmdChyYW5nZSwgdGFyZ2V0KTtcbiAgICBsZXQgJGFmdGVyID0gdHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoZW5kLCAtMSkgLSAxKTtcbiAgICBpZiAoY2FuSm9pbih0ci5kb2MsICRhZnRlci5wb3MpICYmICRhZnRlci5ub2RlQmVmb3JlLnR5cGUgPT0gJGFmdGVyLm5vZGVBZnRlci50eXBlKVxuICAgICAgICB0ci5qb2luKCRhZnRlci5wb3MpO1xuICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbGlmdE91dE9mTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIHJhbmdlKSB7XG4gICAgbGV0IHRyID0gc3RhdGUudHIsIGxpc3QgPSByYW5nZS5wYXJlbnQ7XG4gICAgLy8gTWVyZ2UgdGhlIGxpc3QgaXRlbXMgaW50byBhIHNpbmdsZSBiaWcgaXRlbVxuICAgIGZvciAobGV0IHBvcyA9IHJhbmdlLmVuZCwgaSA9IHJhbmdlLmVuZEluZGV4IC0gMSwgZSA9IHJhbmdlLnN0YXJ0SW5kZXg7IGkgPiBlOyBpLS0pIHtcbiAgICAgICAgcG9zIC09IGxpc3QuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgICAgIHRyLmRlbGV0ZShwb3MgLSAxLCBwb3MgKyAxKTtcbiAgICB9XG4gICAgbGV0ICRzdGFydCA9IHRyLmRvYy5yZXNvbHZlKHJhbmdlLnN0YXJ0KSwgaXRlbSA9ICRzdGFydC5ub2RlQWZ0ZXI7XG4gICAgaWYgKHRyLm1hcHBpbmcubWFwKHJhbmdlLmVuZCkgIT0gcmFuZ2Uuc3RhcnQgKyAkc3RhcnQubm9kZUFmdGVyLm5vZGVTaXplKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGF0U3RhcnQgPSByYW5nZS5zdGFydEluZGV4ID09IDAsIGF0RW5kID0gcmFuZ2UuZW5kSW5kZXggPT0gbGlzdC5jaGlsZENvdW50O1xuICAgIGxldCBwYXJlbnQgPSAkc3RhcnQubm9kZSgtMSksIGluZGV4QmVmb3JlID0gJHN0YXJ0LmluZGV4KC0xKTtcbiAgICBpZiAoIXBhcmVudC5jYW5SZXBsYWNlKGluZGV4QmVmb3JlICsgKGF0U3RhcnQgPyAwIDogMSksIGluZGV4QmVmb3JlICsgMSwgaXRlbS5jb250ZW50LmFwcGVuZChhdEVuZCA/IEZyYWdtZW50LmVtcHR5IDogRnJhZ21lbnQuZnJvbShsaXN0KSkpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHN0YXJ0ID0gJHN0YXJ0LnBvcywgZW5kID0gc3RhcnQgKyBpdGVtLm5vZGVTaXplO1xuICAgIC8vIFN0cmlwIG9mZiB0aGUgc3Vycm91bmRpbmcgbGlzdC4gQXQgdGhlIHNpZGVzIHdoZXJlIHdlJ3JlIG5vdCBhdFxuICAgIC8vIHRoZSBlbmQgb2YgdGhlIGxpc3QsIHRoZSBleGlzdGluZyBsaXN0IGlzIGNsb3NlZC4gQXQgc2lkZXMgd2hlcmVcbiAgICAvLyB0aGlzIGlzIHRoZSBlbmQsIGl0IGlzIG92ZXJ3cml0dGVuIHRvIGl0cyBlbmQuXG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnQgLSAoYXRTdGFydCA/IDEgOiAwKSwgZW5kICsgKGF0RW5kID8gMSA6IDApLCBzdGFydCArIDEsIGVuZCAtIDEsIG5ldyBTbGljZSgoYXRTdGFydCA/IEZyYWdtZW50LmVtcHR5IDogRnJhZ21lbnQuZnJvbShsaXN0LmNvcHkoRnJhZ21lbnQuZW1wdHkpKSlcbiAgICAgICAgLmFwcGVuZChhdEVuZCA/IEZyYWdtZW50LmVtcHR5IDogRnJhZ21lbnQuZnJvbShsaXN0LmNvcHkoRnJhZ21lbnQuZW1wdHkpKSksIGF0U3RhcnQgPyAwIDogMSwgYXRFbmQgPyAwIDogMSksIGF0U3RhcnQgPyAwIDogMSkpO1xuICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG5DcmVhdGUgYSBjb21tYW5kIHRvIHNpbmsgdGhlIGxpc3QgaXRlbSBhcm91bmQgdGhlIHNlbGVjdGlvbiBkb3duXG5pbnRvIGFuIGlubmVyIGxpc3QuXG4qL1xuZnVuY3Rpb24gc2lua0xpc3RJdGVtKGl0ZW1UeXBlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0bywgbm9kZSA9PiBub2RlLmNoaWxkQ291bnQgPiAwICYmIG5vZGUuZmlyc3RDaGlsZC50eXBlID09IGl0ZW1UeXBlKTtcbiAgICAgICAgaWYgKCFyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSByYW5nZS5zdGFydEluZGV4O1xuICAgICAgICBpZiAoc3RhcnRJbmRleCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcGFyZW50ID0gcmFuZ2UucGFyZW50LCBub2RlQmVmb3JlID0gcGFyZW50LmNoaWxkKHN0YXJ0SW5kZXggLSAxKTtcbiAgICAgICAgaWYgKG5vZGVCZWZvcmUudHlwZSAhPSBpdGVtVHlwZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBsZXQgbmVzdGVkQmVmb3JlID0gbm9kZUJlZm9yZS5sYXN0Q2hpbGQgJiYgbm9kZUJlZm9yZS5sYXN0Q2hpbGQudHlwZSA9PSBwYXJlbnQudHlwZTtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IEZyYWdtZW50LmZyb20obmVzdGVkQmVmb3JlID8gaXRlbVR5cGUuY3JlYXRlKCkgOiBudWxsKTtcbiAgICAgICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGl0ZW1UeXBlLmNyZWF0ZShudWxsLCBGcmFnbWVudC5mcm9tKHBhcmVudC50eXBlLmNyZWF0ZShudWxsLCBpbm5lcikpKSksIG5lc3RlZEJlZm9yZSA/IDMgOiAxLCAwKTtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSByYW5nZS5zdGFydCwgYWZ0ZXIgPSByYW5nZS5lbmQ7XG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChiZWZvcmUgLSAobmVzdGVkQmVmb3JlID8gMyA6IDEpLCBhZnRlciwgYmVmb3JlLCBhZnRlciwgc2xpY2UsIDEsIHRydWUpKVxuICAgICAgICAgICAgICAgIC5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuXG5leHBvcnQgeyBhZGRMaXN0Tm9kZXMsIGJ1bGxldExpc3QsIGxpZnRMaXN0SXRlbSwgbGlzdEl0ZW0sIG9yZGVyZWRMaXN0LCBzaW5rTGlzdEl0ZW0sIHNwbGl0TGlzdEl0ZW0sIHNwbGl0TGlzdEl0ZW1LZWVwTWFya3MsIHdyYXBJbkxpc3QsIHdyYXBSYW5nZUluTGlzdCB9O1xuIiwiaW1wb3J0IHsgU2xpY2UsIEZyYWdtZW50LCBNYXJrLCBOb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgUmVwbGFjZVN0ZXAsIFJlcGxhY2VBcm91bmRTdGVwLCBUcmFuc2Zvcm0gfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuXG5jb25zdCBjbGFzc2VzQnlJZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcblN1cGVyY2xhc3MgZm9yIGVkaXRvciBzZWxlY3Rpb25zLiBFdmVyeSBzZWxlY3Rpb24gdHlwZSBzaG91bGRcbmV4dGVuZCB0aGlzLiBTaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS5cbiovXG5jbGFzcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIEluaXRpYWxpemUgYSBzZWxlY3Rpb24gd2l0aCB0aGUgaGVhZCBhbmQgYW5jaG9yIGFuZCByYW5nZXMuIElmIG5vXG4gICAgcmFuZ2VzIGFyZSBnaXZlbiwgY29uc3RydWN0cyBhIHNpbmdsZSByYW5nZSBhY3Jvc3MgYCRhbmNob3JgIGFuZFxuICAgIGAkaGVhZGAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgYW5jaG9yIG9mIHRoZSBzZWxlY3Rpb24gKHRoZSBzaWRlIHRoYXQgc3RheXMgaW5cbiAgICBwbGFjZSB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgbW9kaWZpZWQpLlxuICAgICovXG4gICAgJGFuY2hvciwgXG4gICAgLyoqXG4gICAgVGhlIHJlc29sdmVkIGhlYWQgb2YgdGhlIHNlbGVjdGlvbiAodGhlIHNpZGUgdGhhdCBtb3ZlcyB3aGVuXG4gICAgdGhlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCkuXG4gICAgKi9cbiAgICAkaGVhZCwgcmFuZ2VzKSB7XG4gICAgICAgIHRoaXMuJGFuY2hvciA9ICRhbmNob3I7XG4gICAgICAgIHRoaXMuJGhlYWQgPSAkaGVhZDtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXMgfHwgW25ldyBTZWxlY3Rpb25SYW5nZSgkYW5jaG9yLm1pbigkaGVhZCksICRhbmNob3IubWF4KCRoZWFkKSldO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2VsZWN0aW9uJ3MgYW5jaG9yLCBhcyBhbiB1bnJlc29sdmVkIHBvc2l0aW9uLlxuICAgICovXG4gICAgZ2V0IGFuY2hvcigpIHsgcmV0dXJuIHRoaXMuJGFuY2hvci5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgc2VsZWN0aW9uJ3MgaGVhZC5cbiAgICAqL1xuICAgIGdldCBoZWFkKCkgeyByZXR1cm4gdGhpcy4kaGVhZC5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgbG93ZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZnJvbSgpIHsgcmV0dXJuIHRoaXMuJGZyb20ucG9zOyB9XG4gICAgLyoqXG4gICAgVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0IHRvKCkgeyByZXR1cm4gdGhpcy4kdG8ucG9zOyB9XG4gICAgLyoqXG4gICAgVGhlIHJlc29sdmVkIGxvd2VyICBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCAkZnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VzWzBdLiRmcm9tO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgdXBwZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgJHRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbMF0uJHRvO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGNvbnRhaW5zIGFueSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGVtcHR5KCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHJhbmdlc1tpXS4kZnJvbS5wb3MgIT0gcmFuZ2VzW2ldLiR0by5wb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZW50IG9mIHRoaXMgc2VsZWN0aW9uIGFzIGEgc2xpY2UuXG4gICAgKi9cbiAgICBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4kZnJvbS5kb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggYSBzbGljZSBvciwgaWYgbm8gc2xpY2UgaXMgZ2l2ZW4sXG4gICAgZGVsZXRlIHRoZSBzZWxlY3Rpb24uIFdpbGwgYXBwZW5kIHRvIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHJlcGxhY2UodHIsIGNvbnRlbnQgPSBTbGljZS5lbXB0eSkge1xuICAgICAgICAvLyBQdXQgdGhlIG5ldyBzZWxlY3Rpb24gYXQgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSBpbnNlcnRlZFxuICAgICAgICAvLyBjb250ZW50LiBXaGVuIHRoYXQgZW5kZWQgaW4gYW4gaW5saW5lIG5vZGUsIHNlYXJjaCBiYWNrd2FyZHMsXG4gICAgICAgIC8vIHRvIGdldCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhhdCBub2RlLiBJZiBub3QsIHNlYXJjaCBmb3J3YXJkLlxuICAgICAgICBsZXQgbGFzdE5vZGUgPSBjb250ZW50LmNvbnRlbnQubGFzdENoaWxkLCBsYXN0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lm9wZW5FbmQ7IGkrKykge1xuICAgICAgICAgICAgbGFzdFBhcmVudCA9IGxhc3ROb2RlO1xuICAgICAgICAgICAgbGFzdE5vZGUgPSBsYXN0Tm9kZS5sYXN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGgsIHJhbmdlcyA9IHRoaXMucmFuZ2VzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldLCBtYXBwaW5nID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKTtcbiAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZShtYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCBtYXBwaW5nLm1hcCgkdG8ucG9zKSwgaSA/IFNsaWNlLmVtcHR5IDogY29udGVudCk7XG4gICAgICAgICAgICBpZiAoaSA9PSAwKVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBtYXBGcm9tLCAobGFzdE5vZGUgPyBsYXN0Tm9kZS5pc0lubGluZSA6IGxhc3RQYXJlbnQgJiYgbGFzdFBhcmVudC5pc1RleHRibG9jaykgPyAtMSA6IDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiBub2RlLCBhcHBlbmRpbmcgdGhlIGNoYW5nZXNcbiAgICB0byB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICByZXBsYWNlV2l0aCh0ciwgbm9kZSkge1xuICAgICAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV0sIG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcCgkZnJvbS5wb3MpLCB0byA9IG1hcHBpbmcubWFwKCR0by5wb3MpO1xuICAgICAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgICAgICB0ci5kZWxldGVSYW5nZShmcm9tLCB0byk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ci5yZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBub2RlKTtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0luc2VydGlvbkVuZCh0ciwgbWFwRnJvbSwgbm9kZS5pc0lubGluZSA/IC0xIDogMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhIHZhbGlkIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIHN0YXJ0aW5nIGF0IHRoZSBnaXZlblxuICAgIHBvc2l0aW9uIGFuZCBzZWFyY2hpbmcgYmFjayBpZiBgZGlyYCBpcyBuZWdhdGl2ZSwgYW5kIGZvcndhcmQgaWZcbiAgICBwb3NpdGl2ZS4gV2hlbiBgdGV4dE9ubHlgIGlzIHRydWUsIG9ubHkgY29uc2lkZXIgY3Vyc29yXG4gICAgc2VsZWN0aW9ucy4gV2lsbCByZXR1cm4gbnVsbCB3aGVuIG5vIHZhbGlkIHNlbGVjdGlvbiBwb3NpdGlvbiBpc1xuICAgIGZvdW5kLlxuICAgICovXG4gICAgc3RhdGljIGZpbmRGcm9tKCRwb3MsIGRpciwgdGV4dE9ubHkgPSBmYWxzZSkge1xuICAgICAgICBsZXQgaW5uZXIgPSAkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50ID8gbmV3IFRleHRTZWxlY3Rpb24oJHBvcylcbiAgICAgICAgICAgIDogZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5wYXJlbnQsICRwb3MucG9zLCAkcG9zLmluZGV4KCksIGRpciwgdGV4dE9ubHkpO1xuICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gJHBvcy5kZXB0aCAtIDE7IGRlcHRoID49IDA7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGRpciA8IDBcbiAgICAgICAgICAgICAgICA/IGZpbmRTZWxlY3Rpb25JbigkcG9zLm5vZGUoMCksICRwb3Mubm9kZShkZXB0aCksICRwb3MuYmVmb3JlKGRlcHRoICsgMSksICRwb3MuaW5kZXgoZGVwdGgpLCBkaXIsIHRleHRPbmx5KVxuICAgICAgICAgICAgICAgIDogZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5ub2RlKGRlcHRoKSwgJHBvcy5hZnRlcihkZXB0aCArIDEpLCAkcG9zLmluZGV4KGRlcHRoKSArIDEsIGRpciwgdGV4dE9ubHkpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhIHZhbGlkIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIG5lYXIgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24uIFNlYXJjaGVzIGZvcndhcmQgZmlyc3QgYnkgZGVmYXVsdCwgYnV0IGlmIGBiaWFzYCBpc1xuICAgIG5lZ2F0aXZlLCBpdCB3aWxsIHNlYXJjaCBiYWNrd2FyZHMgZmlyc3QuXG4gICAgKi9cbiAgICBzdGF0aWMgbmVhcigkcG9zLCBiaWFzID0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kRnJvbSgkcG9zLCBiaWFzKSB8fCB0aGlzLmZpbmRGcm9tKCRwb3MsIC1iaWFzKSB8fCBuZXcgQWxsU2VsZWN0aW9uKCRwb3Mubm9kZSgwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIGNsb3Nlc3QgdG8gdGhlIHN0YXJ0IG9mXG4gICAgdGhlIGdpdmVuIGRvY3VtZW50LiBXaWxsIHJldHVybiBhblxuICAgIFtgQWxsU2VsZWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkFsbFNlbGVjdGlvbikgaWYgbm8gdmFsaWQgcG9zaXRpb25cbiAgICBleGlzdHMuXG4gICAgKi9cbiAgICBzdGF0aWMgYXRTdGFydChkb2MpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25Jbihkb2MsIGRvYywgMCwgMCwgMSkgfHwgbmV3IEFsbFNlbGVjdGlvbihkb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBjdXJzb3Igb3IgbGVhZiBub2RlIHNlbGVjdGlvbiBjbG9zZXN0IHRvIHRoZSBlbmQgb2YgdGhlXG4gICAgZ2l2ZW4gZG9jdW1lbnQuXG4gICAgKi9cbiAgICBzdGF0aWMgYXRFbmQoZG9jKSB7XG4gICAgICAgIHJldHVybiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBkb2MsIGRvYy5jb250ZW50LnNpemUsIGRvYy5jaGlsZENvdW50LCAtMSkgfHwgbmV3IEFsbFNlbGVjdGlvbihkb2MpO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHNlbGVjdGlvbi4gTXVzdCBiZVxuICAgIGltcGxlbWVudGVkIGZvciBjdXN0b20gY2xhc3NlcyAoYXMgYSBzdGF0aWMgY2xhc3MgbWV0aG9kKS5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKCFqc29uIHx8ICFqc29uLnR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFNlbGVjdGlvbi5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IGNscyA9IGNsYXNzZXNCeUlkW2pzb24udHlwZV07XG4gICAgICAgIGlmICghY2xzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5vIHNlbGVjdGlvbiB0eXBlICR7anNvbi50eXBlfSBkZWZpbmVkYCk7XG4gICAgICAgIHJldHVybiBjbHMuZnJvbUpTT04oZG9jLCBqc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVG8gYmUgYWJsZSB0byBkZXNlcmlhbGl6ZSBzZWxlY3Rpb25zIGZyb20gSlNPTiwgY3VzdG9tIHNlbGVjdGlvblxuICAgIGNsYXNzZXMgbXVzdCByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggYW4gSUQgc3RyaW5nLCBzbyB0aGF0IHRoZXlcbiAgICBjYW4gYmUgZGlzYW1iaWd1YXRlZC4gVHJ5IHRvIHBpY2sgc29tZXRoaW5nIHRoYXQncyB1bmxpa2VseSB0b1xuICAgIGNsYXNoIHdpdGggY2xhc3NlcyBmcm9tIG90aGVyIG1vZHVsZXMuXG4gICAgKi9cbiAgICBzdGF0aWMganNvbklEKGlkLCBzZWxlY3Rpb25DbGFzcykge1xuICAgICAgICBpZiAoaWQgaW4gY2xhc3Nlc0J5SWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkR1cGxpY2F0ZSB1c2Ugb2Ygc2VsZWN0aW9uIEpTT04gSUQgXCIgKyBpZCk7XG4gICAgICAgIGNsYXNzZXNCeUlkW2lkXSA9IHNlbGVjdGlvbkNsYXNzO1xuICAgICAgICBzZWxlY3Rpb25DbGFzcy5wcm90b3R5cGUuanNvbklEID0gaWQ7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb25DbGFzcztcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IGEgW2Jvb2ttYXJrXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuU2VsZWN0aW9uQm9va21hcmspIGZvciB0aGlzIHNlbGVjdGlvbixcbiAgICB3aGljaCBpcyBhIHZhbHVlIHRoYXQgY2FuIGJlIG1hcHBlZCB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gYVxuICAgIGN1cnJlbnQgZG9jdW1lbnQsIGFuZCBsYXRlciByZXNvbHZlZCB0byBhIHJlYWwgc2VsZWN0aW9uIGZvciBhXG4gICAgZ2l2ZW4gZG9jdW1lbnQgYWdhaW4uIChUaGlzIGlzIHVzZWQgbW9zdGx5IGJ5IHRoZSBoaXN0b3J5IHRvXG4gICAgdHJhY2sgYW5kIHJlc3RvcmUgb2xkIHNlbGVjdGlvbnMuKSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZlxuICAgIHRoaXMgbWV0aG9kIGp1c3QgY29udmVydHMgdGhlIHNlbGVjdGlvbiB0byBhIHRleHQgc2VsZWN0aW9uIGFuZFxuICAgIHJldHVybnMgdGhlIGJvb2ttYXJrIGZvciB0aGF0LlxuICAgICovXG4gICAgZ2V0Qm9va21hcmsoKSB7XG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmJldHdlZW4odGhpcy4kYW5jaG9yLCB0aGlzLiRoZWFkKS5nZXRCb29rbWFyaygpO1xuICAgIH1cbn1cblNlbGVjdGlvbi5wcm90b3R5cGUudmlzaWJsZSA9IHRydWU7XG4vKipcblJlcHJlc2VudHMgYSBzZWxlY3RlZCByYW5nZSBpbiBhIGRvY3VtZW50LlxuKi9cbmNsYXNzIFNlbGVjdGlvblJhbmdlIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSByYW5nZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICAkZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgICR0bykge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgIH1cbn1cbmxldCB3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gPSBmYWxzZTtcbmZ1bmN0aW9uIGNoZWNrVGV4dFNlbGVjdGlvbigkcG9zKSB7XG4gICAgaWYgKCF3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gJiYgISRwb3MucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgd2FybmVkQWJvdXRUZXh0U2VsZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZVtcIndhcm5cIl0oXCJUZXh0U2VsZWN0aW9uIGVuZHBvaW50IG5vdCBwb2ludGluZyBpbnRvIGEgbm9kZSB3aXRoIGlubGluZSBjb250ZW50IChcIiArICRwb3MucGFyZW50LnR5cGUubmFtZSArIFwiKVwiKTtcbiAgICB9XG59XG4vKipcbkEgdGV4dCBzZWxlY3Rpb24gcmVwcmVzZW50cyBhIGNsYXNzaWNhbCBlZGl0b3Igc2VsZWN0aW9uLCB3aXRoIGFcbmhlYWQgKHRoZSBtb3Zpbmcgc2lkZSkgYW5kIGFuY2hvciAoaW1tb2JpbGUgc2lkZSksIGJvdGggb2Ygd2hpY2hcbnBvaW50IGludG8gdGV4dGJsb2NrIG5vZGVzLiBJdCBjYW4gYmUgZW1wdHkgKGEgcmVndWxhciBjdXJzb3JcbnBvc2l0aW9uKS5cbiovXG5jbGFzcyBUZXh0U2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYSB0ZXh0IHNlbGVjdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludHMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkYW5jaG9yLCAkaGVhZCA9ICRhbmNob3IpIHtcbiAgICAgICAgY2hlY2tUZXh0U2VsZWN0aW9uKCRhbmNob3IpO1xuICAgICAgICBjaGVja1RleHRTZWxlY3Rpb24oJGhlYWQpO1xuICAgICAgICBzdXBlcigkYW5jaG9yLCAkaGVhZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSByZXNvbHZlZCBwb3NpdGlvbiBpZiB0aGlzIGlzIGEgY3Vyc29yIHNlbGVjdGlvbiAoYW5cbiAgICBlbXB0eSB0ZXh0IHNlbGVjdGlvbiksIGFuZCBudWxsIG90aGVyd2lzZS5cbiAgICAqL1xuICAgIGdldCAkY3Vyc29yKCkgeyByZXR1cm4gdGhpcy4kYW5jaG9yLnBvcyA9PSB0aGlzLiRoZWFkLnBvcyA/IHRoaXMuJGhlYWQgOiBudWxsOyB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgJGhlYWQgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgICAgICAgaWYgKCEkaGVhZC5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkaGVhZCk7XG4gICAgICAgIGxldCAkYW5jaG9yID0gZG9jLnJlc29sdmUobWFwcGluZy5tYXAodGhpcy5hbmNob3IpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKCRhbmNob3IucGFyZW50LmlubGluZUNvbnRlbnQgPyAkYW5jaG9yIDogJGhlYWQsICRoZWFkKTtcbiAgICB9XG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIHN1cGVyLnJlcGxhY2UodHIsIGNvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGVudCA9PSBTbGljZS5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gdGhpcy4kZnJvbS5tYXJrc0Fjcm9zcyh0aGlzLiR0byk7XG4gICAgICAgICAgICBpZiAobWFya3MpXG4gICAgICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgb3RoZXIuYW5jaG9yID09IHRoaXMuYW5jaG9yICYmIG90aGVyLmhlYWQgPT0gdGhpcy5oZWFkO1xuICAgIH1cbiAgICBnZXRCb29rbWFyaygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Qm9va21hcmsodGhpcy5hbmNob3IsIHRoaXMuaGVhZCk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0ZXh0XCIsIGFuY2hvcjogdGhpcy5hbmNob3IsIGhlYWQ6IHRoaXMuaGVhZCB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmhlYWQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgVGV4dFNlbGVjdGlvbi5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0U2VsZWN0aW9uKGRvYy5yZXNvbHZlKGpzb24uYW5jaG9yKSwgZG9jLnJlc29sdmUoanNvbi5oZWFkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHRleHQgc2VsZWN0aW9uIGZyb20gbm9uLXJlc29sdmVkIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBhbmNob3IsIGhlYWQgPSBhbmNob3IpIHtcbiAgICAgICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShhbmNob3IpO1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoJGFuY2hvciwgaGVhZCA9PSBhbmNob3IgPyAkYW5jaG9yIDogZG9jLnJlc29sdmUoaGVhZCkpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gYSB0ZXh0IHNlbGVjdGlvbiB0aGF0IHNwYW5zIHRoZSBnaXZlbiBwb3NpdGlvbnMgb3IsIGlmXG4gICAgdGhleSBhcmVuJ3QgdGV4dCBwb3NpdGlvbnMsIGZpbmQgYSB0ZXh0IHNlbGVjdGlvbiBuZWFyIHRoZW0uXG4gICAgYGJpYXNgIGRldGVybWluZXMgd2hldGhlciB0aGUgbWV0aG9kIHNlYXJjaGVzIGZvcndhcmQgKGRlZmF1bHQpXG4gICAgb3IgYmFja3dhcmRzIChuZWdhdGl2ZSBudW1iZXIpIGZpcnN0LiBXaWxsIGZhbGwgYmFjayB0byBjYWxsaW5nXG4gICAgW2BTZWxlY3Rpb24ubmVhcmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25ebmVhcikgd2hlbiB0aGUgZG9jdW1lbnRcbiAgICBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCB0ZXh0IHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGJldHdlZW4oJGFuY2hvciwgJGhlYWQsIGJpYXMpIHtcbiAgICAgICAgbGV0IGRQb3MgPSAkYW5jaG9yLnBvcyAtICRoZWFkLnBvcztcbiAgICAgICAgaWYgKCFiaWFzIHx8IGRQb3MpXG4gICAgICAgICAgICBiaWFzID0gZFBvcyA+PSAwID8gMSA6IC0xO1xuICAgICAgICBpZiAoISRoZWFkLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBTZWxlY3Rpb24uZmluZEZyb20oJGhlYWQsIGJpYXMsIHRydWUpIHx8IFNlbGVjdGlvbi5maW5kRnJvbSgkaGVhZCwgLWJpYXMsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKVxuICAgICAgICAgICAgICAgICRoZWFkID0gZm91bmQuJGhlYWQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRoZWFkLCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISRhbmNob3IucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGlmIChkUG9zID09IDApIHtcbiAgICAgICAgICAgICAgICAkYW5jaG9yID0gJGhlYWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAkYW5jaG9yID0gKFNlbGVjdGlvbi5maW5kRnJvbSgkYW5jaG9yLCAtYmlhcywgdHJ1ZSkgfHwgU2VsZWN0aW9uLmZpbmRGcm9tKCRhbmNob3IsIGJpYXMsIHRydWUpKS4kYW5jaG9yO1xuICAgICAgICAgICAgICAgIGlmICgoJGFuY2hvci5wb3MgPCAkaGVhZC5wb3MpICE9IChkUG9zIDwgMCkpXG4gICAgICAgICAgICAgICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oJGFuY2hvciwgJGhlYWQpO1xuICAgIH1cbn1cblNlbGVjdGlvbi5qc29uSUQoXCJ0ZXh0XCIsIFRleHRTZWxlY3Rpb24pO1xuY2xhc3MgVGV4dEJvb2ttYXJrIHtcbiAgICBjb25zdHJ1Y3RvcihhbmNob3IsIGhlYWQpIHtcbiAgICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7XG4gICAgICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEJvb2ttYXJrKG1hcHBpbmcubWFwKHRoaXMuYW5jaG9yKSwgbWFwcGluZy5tYXAodGhpcy5oZWFkKSk7XG4gICAgfVxuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmJldHdlZW4oZG9jLnJlc29sdmUodGhpcy5hbmNob3IpLCBkb2MucmVzb2x2ZSh0aGlzLmhlYWQpKTtcbiAgICB9XG59XG4vKipcbkEgbm9kZSBzZWxlY3Rpb24gaXMgYSBzZWxlY3Rpb24gdGhhdCBwb2ludHMgYXQgYSBzaW5nbGUgbm9kZS4gQWxsXG5ub2RlcyBtYXJrZWQgW3NlbGVjdGFibGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5zZWxlY3RhYmxlKSBjYW4gYmUgdGhlXG50YXJnZXQgb2YgYSBub2RlIHNlbGVjdGlvbi4gSW4gc3VjaCBhIHNlbGVjdGlvbiwgYGZyb21gIGFuZCBgdG9gXG5wb2ludCBkaXJlY3RseSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzZWxlY3RlZCBub2RlLCBgYW5jaG9yYCBlcXVhbHNcbmBmcm9tYCwgYW5kIGBoZWFkYCBlcXVhbHMgYHRvYC4uXG4qL1xuY2xhc3MgTm9kZVNlbGVjdGlvbiBleHRlbmRzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24uIERvZXMgbm90IHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgaXRzXG4gICAgYXJndW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcigkcG9zKSB7XG4gICAgICAgIGxldCBub2RlID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIGxldCAkZW5kID0gJHBvcy5ub2RlKDApLnJlc29sdmUoJHBvcy5wb3MgKyBub2RlLm5vZGVTaXplKTtcbiAgICAgICAgc3VwZXIoJHBvcywgJGVuZCk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIG1hcChkb2MsIG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHsgZGVsZXRlZCwgcG9zIH0gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmFuY2hvcik7XG4gICAgICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKTtcbiAgICAgICAgaWYgKGRlbGV0ZWQpXG4gICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJHBvcyk7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbigkcG9zKTtcbiAgICB9XG4gICAgY29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHRoaXMubm9kZSksIDAsIDApO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIG90aGVyLmFuY2hvciA9PSB0aGlzLmFuY2hvcjtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcIm5vZGVcIiwgYW5jaG9yOiB0aGlzLmFuY2hvciB9O1xuICAgIH1cbiAgICBnZXRCb29rbWFyaygpIHsgcmV0dXJuIG5ldyBOb2RlQm9va21hcmsodGhpcy5hbmNob3IpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hbmNob3IgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgTm9kZVNlbGVjdGlvbi5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGpzb24uYW5jaG9yKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5vZGUgc2VsZWN0aW9uIGZyb20gbm9uLXJlc29sdmVkIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBmcm9tKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZVNlbGVjdGlvbihkb2MucmVzb2x2ZShmcm9tKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbm9kZSBtYXkgYmUgc2VsZWN0ZWQgYXMgYSBub2RlXG4gICAgc2VsZWN0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGlzU2VsZWN0YWJsZShub2RlKSB7XG4gICAgICAgIHJldHVybiAhbm9kZS5pc1RleHQgJiYgbm9kZS50eXBlLnNwZWMuc2VsZWN0YWJsZSAhPT0gZmFsc2U7XG4gICAgfVxufVxuTm9kZVNlbGVjdGlvbi5wcm90b3R5cGUudmlzaWJsZSA9IGZhbHNlO1xuU2VsZWN0aW9uLmpzb25JRChcIm5vZGVcIiwgTm9kZVNlbGVjdGlvbik7XG5jbGFzcyBOb2RlQm9va21hcmsge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvcikge1xuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHsgZGVsZXRlZCwgcG9zIH0gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmFuY2hvcik7XG4gICAgICAgIHJldHVybiBkZWxldGVkID8gbmV3IFRleHRCb29rbWFyayhwb3MsIHBvcykgOiBuZXcgTm9kZUJvb2ttYXJrKHBvcyk7XG4gICAgfVxuICAgIHJlc29sdmUoZG9jKSB7XG4gICAgICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUodGhpcy5hbmNob3IpLCBub2RlID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIGlmIChub2RlICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpO1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJHBvcyk7XG4gICAgfVxufVxuLyoqXG5BIHNlbGVjdGlvbiB0eXBlIHRoYXQgcmVwcmVzZW50cyBzZWxlY3RpbmcgdGhlIHdob2xlIGRvY3VtZW50XG4od2hpY2ggY2FuIG5vdCBuZWNlc3NhcmlseSBiZSBleHByZXNzZWQgd2l0aCBhIHRleHQgc2VsZWN0aW9uLCB3aGVuXG50aGVyZSBhcmUgZm9yIGV4YW1wbGUgbGVhZiBibG9jayBub2RlcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZVxuZG9jdW1lbnQpLlxuKi9cbmNsYXNzIEFsbFNlbGVjdGlvbiBleHRlbmRzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGFsbC1zZWxlY3Rpb24gb3ZlciB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihkb2MpIHtcbiAgICAgICAgc3VwZXIoZG9jLnJlc29sdmUoMCksIGRvYy5yZXNvbHZlKGRvYy5jb250ZW50LnNpemUpKTtcbiAgICB9XG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIGlmIChjb250ZW50ID09IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgICAgICB0ci5kZWxldGUoMCwgdHIuZG9jLmNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICBsZXQgc2VsID0gU2VsZWN0aW9uLmF0U3RhcnQodHIuZG9jKTtcbiAgICAgICAgICAgIGlmICghc2VsLmVxKHRyLnNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdXBlci5yZXBsYWNlKHRyLCBjb250ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7IHJldHVybiB7IHR5cGU6IFwiYWxsXCIgfTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYykgeyByZXR1cm4gbmV3IEFsbFNlbGVjdGlvbihkb2MpOyB9XG4gICAgbWFwKGRvYykgeyByZXR1cm4gbmV3IEFsbFNlbGVjdGlvbihkb2MpOyB9XG4gICAgZXEob3RoZXIpIHsgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgQWxsU2VsZWN0aW9uOyB9XG4gICAgZ2V0Qm9va21hcmsoKSB7IHJldHVybiBBbGxCb29rbWFyazsgfVxufVxuU2VsZWN0aW9uLmpzb25JRChcImFsbFwiLCBBbGxTZWxlY3Rpb24pO1xuY29uc3QgQWxsQm9va21hcmsgPSB7XG4gICAgbWFwKCkgeyByZXR1cm4gdGhpczsgfSxcbiAgICByZXNvbHZlKGRvYykgeyByZXR1cm4gbmV3IEFsbFNlbGVjdGlvbihkb2MpOyB9XG59O1xuLy8gRklYTUUgd2UnbGwgbmVlZCBzb21lIGF3YXJlbmVzcyBvZiB0ZXh0IGRpcmVjdGlvbiB3aGVuIHNjYW5uaW5nIGZvciBzZWxlY3Rpb25zXG4vLyBUcnkgdG8gZmluZCBhIHNlbGVjdGlvbiBpbnNpZGUgdGhlIGdpdmVuIG5vZGUuIGBwb3NgIHBvaW50cyBhdCB0aGVcbi8vIHBvc2l0aW9uIHdoZXJlIHRoZSBzZWFyY2ggc3RhcnRzLiBXaGVuIGB0ZXh0YCBpcyB0cnVlLCBvbmx5IHJldHVyblxuLy8gdGV4dCBzZWxlY3Rpb25zLlxuZnVuY3Rpb24gZmluZFNlbGVjdGlvbkluKGRvYywgbm9kZSwgcG9zLCBpbmRleCwgZGlyLCB0ZXh0ID0gZmFsc2UpIHtcbiAgICBpZiAobm9kZS5pbmxpbmVDb250ZW50KVxuICAgICAgICByZXR1cm4gVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBwb3MpO1xuICAgIGZvciAobGV0IGkgPSBpbmRleCAtIChkaXIgPiAwID8gMCA6IDEpOyBkaXIgPiAwID8gaSA8IG5vZGUuY2hpbGRDb3VudCA6IGkgPj0gMDsgaSArPSBkaXIpIHtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZS5jaGlsZChpKTtcbiAgICAgICAgaWYgKCFjaGlsZC5pc0F0b20pIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmRTZWxlY3Rpb25Jbihkb2MsIGNoaWxkLCBwb3MgKyBkaXIsIGRpciA8IDAgPyBjaGlsZC5jaGlsZENvdW50IDogMCwgZGlyLCB0ZXh0KTtcbiAgICAgICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5uZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRleHQgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUoY2hpbGQpKSB7XG4gICAgICAgICAgICByZXR1cm4gTm9kZVNlbGVjdGlvbi5jcmVhdGUoZG9jLCBwb3MgLSAoZGlyIDwgMCA/IGNoaWxkLm5vZGVTaXplIDogMCkpO1xuICAgICAgICB9XG4gICAgICAgIHBvcyArPSBjaGlsZC5ub2RlU2l6ZSAqIGRpcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Ub0luc2VydGlvbkVuZCh0ciwgc3RhcnRMZW4sIGJpYXMpIHtcbiAgICBsZXQgbGFzdCA9IHRyLnN0ZXBzLmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPCBzdGFydExlbilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBzdGVwID0gdHIuc3RlcHNbbGFzdF07XG4gICAgaWYgKCEoc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VTdGVwIHx8IHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlQXJvdW5kU3RlcCkpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbWFwID0gdHIubWFwcGluZy5tYXBzW2xhc3RdLCBlbmQ7XG4gICAgbWFwLmZvckVhY2goKF9mcm9tLCBfdG8sIF9uZXdGcm9tLCBuZXdUbykgPT4geyBpZiAoZW5kID09IG51bGwpXG4gICAgICAgIGVuZCA9IG5ld1RvOyB9KTtcbiAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoZW5kKSwgYmlhcykpO1xufVxuXG5jb25zdCBVUERBVEVEX1NFTCA9IDEsIFVQREFURURfTUFSS1MgPSAyLCBVUERBVEVEX1NDUk9MTCA9IDQ7XG4vKipcbkFuIGVkaXRvciBzdGF0ZSB0cmFuc2FjdGlvbiwgd2hpY2ggY2FuIGJlIGFwcGxpZWQgdG8gYSBzdGF0ZSB0b1xuY3JlYXRlIGFuIHVwZGF0ZWQgc3RhdGUuIFVzZVxuW2BFZGl0b3JTdGF0ZS50cmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS50cikgdG8gY3JlYXRlIGFuIGluc3RhbmNlLlxuXG5UcmFuc2FjdGlvbnMgdHJhY2sgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgKHRoZXkgYXJlIGEgc3ViY2xhc3Mgb2ZcbltgVHJhbnNmb3JtYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0pKSwgYnV0IGFsc28gb3RoZXIgc3RhdGUgY2hhbmdlcyxcbmxpa2Ugc2VsZWN0aW9uIHVwZGF0ZXMgYW5kIGFkanVzdG1lbnRzIG9mIHRoZSBzZXQgb2YgW3N0b3JlZFxubWFya3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZS5zdG9yZWRNYXJrcykuIEluIGFkZGl0aW9uLCB5b3UgY2FuIHN0b3JlXG5tZXRhZGF0YSBwcm9wZXJ0aWVzIGluIGEgdHJhbnNhY3Rpb24sIHdoaWNoIGFyZSBleHRyYSBwaWVjZXMgb2ZcbmluZm9ybWF0aW9uIHRoYXQgY2xpZW50IGNvZGUgb3IgcGx1Z2lucyBjYW4gdXNlIHRvIGRlc2NyaWJlIHdoYXQgYVxudHJhbnNhY3Rpb24gcmVwcmVzZW50cywgc28gdGhhdCB0aGV5IGNhbiB1cGRhdGUgdGhlaXIgW293blxuc3RhdGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkKSBhY2NvcmRpbmdseS5cblxuVGhlIFtlZGl0b3Igdmlld10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yVmlldykgdXNlcyBhIGZldyBtZXRhZGF0YVxucHJvcGVydGllczogaXQgd2lsbCBhdHRhY2ggYSBwcm9wZXJ0eSBgXCJwb2ludGVyXCJgIHdpdGggdGhlIHZhbHVlXG5gdHJ1ZWAgdG8gc2VsZWN0aW9uIHRyYW5zYWN0aW9ucyBkaXJlY3RseSBjYXVzZWQgYnkgbW91c2Ugb3IgdG91Y2hcbmlucHV0LCBhIGBcImNvbXBvc2l0aW9uXCJgIHByb3BlcnR5IGhvbGRpbmcgYW4gSUQgaWRlbnRpZnlpbmcgdGhlXG5jb21wb3NpdGlvbiB0aGF0IGNhdXNlZCBpdCB0byB0cmFuc2FjdGlvbnMgY2F1c2VkIGJ5IGNvbXBvc2VkIERPTVxuaW5wdXQsIGFuZCBhIGBcInVpRXZlbnRcImAgcHJvcGVydHkgb2YgdGhhdCBtYXkgYmUgYFwicGFzdGVcImAsXG5gXCJjdXRcImAsIG9yIGBcImRyb3BcImAuXG4qL1xuY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgc3VwZXIoc3RhdGUuZG9jKTtcbiAgICAgICAgLy8gVGhlIHN0ZXAgY291bnQgZm9yIHdoaWNoIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyB2YWxpZC5cbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb25Gb3IgPSAwO1xuICAgICAgICAvLyBCaXRmaWVsZCB0byB0cmFjayB3aGljaCBhc3BlY3RzIG9mIHRoZSBzdGF0ZSB3ZXJlIHVwZGF0ZWQgYnlcbiAgICAgICAgLy8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVkID0gMDtcbiAgICAgICAgLy8gT2JqZWN0IHVzZWQgdG8gc3RvcmUgbWV0YWRhdGEgcHJvcGVydGllcyBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICB0aGlzLm1ldGEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgdHJhbnNhY3Rpb24ncyBjdXJyZW50IHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0cyB0byB0aGUgZWRpdG9yXG4gICAgc2VsZWN0aW9uIFttYXBwZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb24ubWFwKSB0aHJvdWdoIHRoZSBzdGVwcyBpbiB0aGVcbiAgICB0cmFuc2FjdGlvbiwgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiB3aXRoXG4gICAgW2BzZXRTZWxlY3Rpb25gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2V0U2VsZWN0aW9uKS5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmN1clNlbGVjdGlvbkZvciA8IHRoaXMuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmN1clNlbGVjdGlvbiA9IHRoaXMuY3VyU2VsZWN0aW9uLm1hcCh0aGlzLmRvYywgdGhpcy5tYXBwaW5nLnNsaWNlKHRoaXMuY3VyU2VsZWN0aW9uRm9yKSk7XG4gICAgICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IHRoaXMuc3RlcHMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmN1clNlbGVjdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB0cmFuc2FjdGlvbidzIGN1cnJlbnQgc2VsZWN0aW9uLiBXaWxsIGRldGVybWluZSB0aGVcbiAgICBzZWxlY3Rpb24gdGhhdCB0aGUgZWRpdG9yIGdldHMgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYXBwbGllZC5cbiAgICAqL1xuICAgIHNldFNlbGVjdGlvbihzZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHNlbGVjdGlvbi4kZnJvbS5kb2MgIT0gdGhpcy5kb2MpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlNlbGVjdGlvbiBwYXNzZWQgdG8gc2V0U2VsZWN0aW9uIG11c3QgcG9pbnQgYXQgdGhlIGN1cnJlbnQgZG9jdW1lbnRcIik7XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IHRoaXMuc3RlcHMubGVuZ3RoO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgPSAodGhpcy51cGRhdGVkIHwgVVBEQVRFRF9TRUwpICYgflVQREFURURfTUFSS1M7XG4gICAgICAgIHRoaXMuc3RvcmVkTWFya3MgPSBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgV2hldGhlciB0aGUgc2VsZWN0aW9uIHdhcyBleHBsaWNpdGx5IHVwZGF0ZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGdldCBzZWxlY3Rpb25TZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9TRUwpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IHRoZSBjdXJyZW50IHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIHNldFN0b3JlZE1hcmtzKG1hcmtzKSB7XG4gICAgICAgIHRoaXMuc3RvcmVkTWFya3MgPSBtYXJrcztcbiAgICAgICAgdGhpcy51cGRhdGVkIHw9IFVQREFURURfTUFSS1M7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBNYWtlIHN1cmUgdGhlIGN1cnJlbnQgc3RvcmVkIG1hcmtzIG9yLCBpZiB0aGF0IGlzIG51bGwsIHRoZSBtYXJrc1xuICAgIGF0IHRoZSBzZWxlY3Rpb24sIG1hdGNoIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MuIERvZXMgbm90aGluZyBpZlxuICAgIHRoaXMgaXMgYWxyZWFkeSB0aGUgY2FzZS5cbiAgICAqL1xuICAgIGVuc3VyZU1hcmtzKG1hcmtzKSB7XG4gICAgICAgIGlmICghTWFyay5zYW1lU2V0KHRoaXMuc3RvcmVkTWFya3MgfHwgdGhpcy5zZWxlY3Rpb24uJGZyb20ubWFya3MoKSwgbWFya3MpKVxuICAgICAgICAgICAgdGhpcy5zZXRTdG9yZWRNYXJrcyhtYXJrcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBtYXJrIHRvIHRoZSBzZXQgb2Ygc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgYWRkU3RvcmVkTWFyayhtYXJrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZU1hcmtzKG1hcmsuYWRkVG9TZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kaGVhZC5tYXJrcygpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZSBhIG1hcmsgb3IgbWFyayB0eXBlIGZyb20gdGhlIHNldCBvZiBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICByZW1vdmVTdG9yZWRNYXJrKG1hcmspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlTWFya3MobWFyay5yZW1vdmVGcm9tU2V0KHRoaXMuc3RvcmVkTWFya3MgfHwgdGhpcy5zZWxlY3Rpb24uJGhlYWQubWFya3MoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzdG9yZWQgbWFya3Mgd2VyZSBleHBsaWNpdGx5IHNldCBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIGdldCBzdG9yZWRNYXJrc1NldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX01BUktTKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkU3RlcChzdGVwLCBkb2MpIHtcbiAgICAgICAgc3VwZXIuYWRkU3RlcChzdGVwLCBkb2MpO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgPSB0aGlzLnVwZGF0ZWQgJiB+VVBEQVRFRF9NQVJLUztcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBzZXRUaW1lKHRpbWUpIHtcbiAgICAgICAgdGhpcy50aW1lID0gdGltZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIHNsaWNlLlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbihzbGljZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKHRoaXMsIHNsaWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHNlbGVjdGlvbiB3aXRoIHRoZSBnaXZlbiBub2RlLiBXaGVuIGBpbmhlcml0TWFya3NgIGlzXG4gICAgdHJ1ZSBhbmQgdGhlIGNvbnRlbnQgaXMgaW5saW5lLCBpdCBpbmhlcml0cyB0aGUgbWFya3MgZnJvbSB0aGVcbiAgICBwbGFjZSB3aGVyZSBpdCBpcyBpbnNlcnRlZC5cbiAgICAqL1xuICAgIHJlcGxhY2VTZWxlY3Rpb25XaXRoKG5vZGUsIGluaGVyaXRNYXJrcyA9IHRydWUpIHtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoaW5oZXJpdE1hcmtzKVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUubWFyayh0aGlzLnN0b3JlZE1hcmtzIHx8IChzZWxlY3Rpb24uZW1wdHkgPyBzZWxlY3Rpb24uJGZyb20ubWFya3MoKSA6IChzZWxlY3Rpb24uJGZyb20ubWFya3NBY3Jvc3Moc2VsZWN0aW9uLiR0bykgfHwgTWFyay5ub25lKSkpO1xuICAgICAgICBzZWxlY3Rpb24ucmVwbGFjZVdpdGgodGhpcywgbm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWxldGUgdGhlIHNlbGVjdGlvbi5cbiAgICAqL1xuICAgIGRlbGV0ZVNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVwbGFjZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIGdpdmVuIHJhbmdlLCBvciB0aGUgc2VsZWN0aW9uIGlmIG5vIHJhbmdlIGlzIGdpdmVuLFxuICAgIHdpdGggYSB0ZXh0IG5vZGUgY29udGFpbmluZyB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgICovXG4gICAgaW5zZXJ0VGV4dCh0ZXh0LCBmcm9tLCB0bykge1xuICAgICAgICBsZXQgc2NoZW1hID0gdGhpcy5kb2MudHlwZS5zY2hlbWE7XG4gICAgICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3Rpb25XaXRoKHNjaGVtYS50ZXh0KHRleHQpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0byA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRvID0gZnJvbTtcbiAgICAgICAgICAgIHRvID0gdG8gPT0gbnVsbCA/IGZyb20gOiB0bztcbiAgICAgICAgICAgIGlmICghdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVSYW5nZShmcm9tLCB0byk7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0aGlzLnN0b3JlZE1hcmtzO1xuICAgICAgICAgICAgaWYgKCFtYXJrcykge1xuICAgICAgICAgICAgICAgIGxldCAkZnJvbSA9IHRoaXMuZG9jLnJlc29sdmUoZnJvbSk7XG4gICAgICAgICAgICAgICAgbWFya3MgPSB0byA9PSBmcm9tID8gJGZyb20ubWFya3MoKSA6ICRmcm9tLm1hcmtzQWNyb3NzKHRoaXMuZG9jLnJlc29sdmUodG8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVJhbmdlV2l0aChmcm9tLCB0bywgc2NoZW1hLnRleHQodGV4dCwgbWFya3MpKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uZW1wdHkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodGhpcy5zZWxlY3Rpb24uJHRvKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBTdG9yZSBhIG1ldGFkYXRhIHByb3BlcnR5IGluIHRoaXMgdHJhbnNhY3Rpb24sIGtleWVkIGVpdGhlciBieVxuICAgIG5hbWUgb3IgYnkgcGx1Z2luLlxuICAgICovXG4gICAgc2V0TWV0YShrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMubWV0YVt0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkua2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0cmlldmUgYSBtZXRhZGF0YSBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBuYW1lIG9yIHBsdWdpbi5cbiAgICAqL1xuICAgIGdldE1ldGEoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGFbdHlwZW9mIGtleSA9PSBcInN0cmluZ1wiID8ga2V5IDoga2V5LmtleV07XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyYW5zYWN0aW9uIGRvZXNuJ3QgY29udGFpbiBhbnkgbWV0YWRhdGEsXG4gICAgYW5kIGNhbiB0aHVzIHNhZmVseSBiZSBleHRlbmRlZC5cbiAgICAqL1xuICAgIGdldCBpc0dlbmVyaWMoKSB7XG4gICAgICAgIGZvciAobGV0IF8gaW4gdGhpcy5tZXRhKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGUgdGhhdCB0aGUgZWRpdG9yIHNob3VsZCBzY3JvbGwgdGhlIHNlbGVjdGlvbiBpbnRvIHZpZXdcbiAgICB3aGVuIHVwZGF0ZWQgdG8gdGhlIHN0YXRlIHByb2R1Y2VkIGJ5IHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgKi9cbiAgICBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgICAgdGhpcy51cGRhdGVkIHw9IFVQREFURURfU0NST0xMO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGhhZCBgc2Nyb2xsSW50b1ZpZXdgIGNhbGxlZCBvbiBpdC5cbiAgICAqL1xuICAgIGdldCBzY3JvbGxlZEludG9WaWV3KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfU0NST0xMKSA+IDA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kKGYsIHNlbGYpIHtcbiAgICByZXR1cm4gIXNlbGYgfHwgIWYgPyBmIDogZi5iaW5kKHNlbGYpO1xufVxuY2xhc3MgRmllbGREZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBkZXNjLCBzZWxmKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuaW5pdCA9IGJpbmQoZGVzYy5pbml0LCBzZWxmKTtcbiAgICAgICAgdGhpcy5hcHBseSA9IGJpbmQoZGVzYy5hcHBseSwgc2VsZik7XG4gICAgfVxufVxuY29uc3QgYmFzZUZpZWxkcyA9IFtcbiAgICBuZXcgRmllbGREZXNjKFwiZG9jXCIsIHtcbiAgICAgICAgaW5pdChjb25maWcpIHsgcmV0dXJuIGNvbmZpZy5kb2MgfHwgY29uZmlnLnNjaGVtYS50b3BOb2RlVHlwZS5jcmVhdGVBbmRGaWxsKCk7IH0sXG4gICAgICAgIGFwcGx5KHRyKSB7IHJldHVybiB0ci5kb2M7IH1cbiAgICB9KSxcbiAgICBuZXcgRmllbGREZXNjKFwic2VsZWN0aW9uXCIsIHtcbiAgICAgICAgaW5pdChjb25maWcsIGluc3RhbmNlKSB7IHJldHVybiBjb25maWcuc2VsZWN0aW9uIHx8IFNlbGVjdGlvbi5hdFN0YXJ0KGluc3RhbmNlLmRvYyk7IH0sXG4gICAgICAgIGFwcGx5KHRyKSB7IHJldHVybiB0ci5zZWxlY3Rpb247IH1cbiAgICB9KSxcbiAgICBuZXcgRmllbGREZXNjKFwic3RvcmVkTWFya3NcIiwge1xuICAgICAgICBpbml0KGNvbmZpZykgeyByZXR1cm4gY29uZmlnLnN0b3JlZE1hcmtzIHx8IG51bGw7IH0sXG4gICAgICAgIGFwcGx5KHRyLCBfbWFya3MsIF9vbGQsIHN0YXRlKSB7IHJldHVybiBzdGF0ZS5zZWxlY3Rpb24uJGN1cnNvciA/IHRyLnN0b3JlZE1hcmtzIDogbnVsbDsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzY3JvbGxUb1NlbGVjdGlvblwiLCB7XG4gICAgICAgIGluaXQoKSB7IHJldHVybiAwOyB9LFxuICAgICAgICBhcHBseSh0ciwgcHJldikgeyByZXR1cm4gdHIuc2Nyb2xsZWRJbnRvVmlldyA/IHByZXYgKyAxIDogcHJldjsgfVxuICAgIH0pXG5dO1xuLy8gT2JqZWN0IHdyYXBwaW5nIHRoZSBwYXJ0IG9mIGEgc3RhdGUgb2JqZWN0IHRoYXQgc3RheXMgdGhlIHNhbWVcbi8vIGFjcm9zcyB0cmFuc2FjdGlvbnMuIFN0b3JlZCBpbiB0aGUgc3RhdGUncyBgY29uZmlnYCBwcm9wZXJ0eS5cbmNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSwgcGx1Z2lucykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luc0J5S2V5ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5maWVsZHMgPSBiYXNlRmllbGRzLnNsaWNlKCk7XG4gICAgICAgIGlmIChwbHVnaW5zKVxuICAgICAgICAgICAgcGx1Z2lucy5mb3JFYWNoKHBsdWdpbiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luc0J5S2V5W3BsdWdpbi5rZXldKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFkZGluZyBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIGEga2V5ZWQgcGx1Z2luIChcIiArIHBsdWdpbi5rZXkgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNCeUtleVtwbHVnaW4ua2V5XSA9IHBsdWdpbjtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMuc3RhdGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzLnB1c2gobmV3IEZpZWxkRGVzYyhwbHVnaW4ua2V5LCBwbHVnaW4uc3BlYy5zdGF0ZSwgcGx1Z2luKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcblRoZSBzdGF0ZSBvZiBhIFByb3NlTWlycm9yIGVkaXRvciBpcyByZXByZXNlbnRlZCBieSBhbiBvYmplY3Qgb2ZcbnRoaXMgdHlwZS4gQSBzdGF0ZSBpcyBhIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmXigJRpdCBpc24ndFxudXBkYXRlZCwgYnV0IHJhdGhlciBhIG5ldyBzdGF0ZSB2YWx1ZSBpcyBjb21wdXRlZCBmcm9tIGFuIG9sZCBvbmVcbnVzaW5nIHRoZSBbYGFwcGx5YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmFwcGx5KSBtZXRob2QuXG5cbkEgc3RhdGUgaG9sZHMgYSBudW1iZXIgb2YgYnVpbHQtaW4gZmllbGRzLCBhbmQgcGx1Z2lucyBjYW5cbltkZWZpbmVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLnN0YXRlKSBhZGRpdGlvbmFsIGZpZWxkcy5cbiovXG5jbGFzcyBFZGl0b3JTdGF0ZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNjaGVtYSBvZiB0aGUgc3RhdGUncyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5zY2hlbWE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBwbHVnaW5zIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGlzIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IHBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wbHVnaW5zO1xuICAgIH1cbiAgICAvKipcbiAgICBBcHBseSB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gdG8gcHJvZHVjZSBhIG5ldyBzdGF0ZS5cbiAgICAqL1xuICAgIGFwcGx5KHRyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5VHJhbnNhY3Rpb24odHIpLnN0YXRlO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbHRlclRyYW5zYWN0aW9uKHRyLCBpZ25vcmUgPSAtMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLnBsdWdpbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoaSAhPSBpZ25vcmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5jb25maWcucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24gJiYgIXBsdWdpbi5zcGVjLmZpbHRlclRyYW5zYWN0aW9uLmNhbGwocGx1Z2luLCB0ciwgdGhpcykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFZlcmJvc2UgdmFyaWFudCBvZiBbYGFwcGx5YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLmFwcGx5KSB0aGF0XG4gICAgcmV0dXJucyB0aGUgcHJlY2lzZSB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIGFwcGxpZWQgKHdoaWNoIG1pZ2h0XG4gICAgYmUgaW5mbHVlbmNlZCBieSB0aGUgW3RyYW5zYWN0aW9uXG4gICAgaG9va3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLmZpbHRlclRyYW5zYWN0aW9uKSBvZlxuICAgIHBsdWdpbnMpIGFsb25nIHdpdGggdGhlIG5ldyBzdGF0ZS5cbiAgICAqL1xuICAgIGFwcGx5VHJhbnNhY3Rpb24ocm9vdFRyKSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJUcmFuc2FjdGlvbihyb290VHIpKVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IHRoaXMsIHRyYW5zYWN0aW9uczogW10gfTtcbiAgICAgICAgbGV0IHRycyA9IFtyb290VHJdLCBuZXdTdGF0ZSA9IHRoaXMuYXBwbHlJbm5lcihyb290VHIpLCBzZWVuID0gbnVsbDtcbiAgICAgICAgLy8gVGhpcyBsb29wIHJlcGVhdGVkbHkgZ2l2ZXMgcGx1Z2lucyBhIGNoYW5jZSB0byByZXNwb25kIHRvXG4gICAgICAgIC8vIHRyYW5zYWN0aW9ucyBhcyBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhZGRlZCwgbWFraW5nIHN1cmUgdG8gb25seVxuICAgICAgICAvLyBwYXNzIHRoZSB0cmFuc2FjdGlvbnMgdGhlIHBsdWdpbiBkaWQgbm90IHNlZSBiZWZvcmUuXG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBoYXZlTmV3ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29uZmlnLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5jb25maWcucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMuYXBwZW5kVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSBzZWVuID8gc2VlbltpXS5uIDogMCwgb2xkU3RhdGUgPSBzZWVuID8gc2VlbltpXS5zdGF0ZSA6IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ciA9IG4gPCB0cnMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbi5jYWxsKHBsdWdpbiwgbiA/IHRycy5zbGljZShuKSA6IHRycywgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyICYmIG5ld1N0YXRlLmZpbHRlclRyYW5zYWN0aW9uKHRyLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcImFwcGVuZGVkVHJhbnNhY3Rpb25cIiwgcm9vdFRyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Vlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuY29uZmlnLnBsdWdpbnMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4ucHVzaChqIDwgaSA/IHsgc3RhdGU6IG5ld1N0YXRlLCBuOiB0cnMubGVuZ3RoIH0gOiB7IHN0YXRlOiB0aGlzLCBuOiAwIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJzLnB1c2godHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBuZXdTdGF0ZS5hcHBseUlubmVyKHRyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVOZXcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWVuKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VlbltpXSA9IHsgc3RhdGU6IG5ld1N0YXRlLCBuOiB0cnMubGVuZ3RoIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXZlTmV3KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBuZXdTdGF0ZSwgdHJhbnNhY3Rpb25zOiB0cnMgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFwcGx5SW5uZXIodHIpIHtcbiAgICAgICAgaWYgKCF0ci5iZWZvcmUuZXEodGhpcy5kb2MpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBcHBseWluZyBhIG1pc21hdGNoZWQgdHJhbnNhY3Rpb25cIik7XG4gICAgICAgIGxldCBuZXdJbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSh0aGlzLmNvbmZpZyksIGZpZWxkcyA9IHRoaXMuY29uZmlnLmZpZWxkcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgIG5ld0luc3RhbmNlW2ZpZWxkLm5hbWVdID0gZmllbGQuYXBwbHkodHIsIHRoaXNbZmllbGQubmFtZV0sIHRoaXMsIG5ld0luc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFN0YXJ0IGEgW3RyYW5zYWN0aW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24pIGZyb20gdGhpcyBzdGF0ZS5cbiAgICAqL1xuICAgIGdldCB0cigpIHsgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih0aGlzKTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZS5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoY29uZmlnKSB7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oY29uZmlnLmRvYyA/IGNvbmZpZy5kb2MudHlwZS5zY2hlbWEgOiBjb25maWcuc2NoZW1hLCBjb25maWcucGx1Z2lucyk7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkY29uZmlnLmZpZWxkcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGluc3RhbmNlWyRjb25maWcuZmllbGRzW2ldLm5hbWVdID0gJGNvbmZpZy5maWVsZHNbaV0uaW5pdChjb25maWcsIGluc3RhbmNlKTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgc3RhdGUgYmFzZWQgb24gdGhpcyBvbmUsIGJ1dCB3aXRoIGFuIGFkanVzdGVkIHNldFxuICAgIG9mIGFjdGl2ZSBwbHVnaW5zLiBTdGF0ZSBmaWVsZHMgdGhhdCBleGlzdCBpbiBib3RoIHNldHMgb2ZcbiAgICBwbHVnaW5zIGFyZSBrZXB0IHVuY2hhbmdlZC4gVGhvc2UgdGhhdCBubyBsb25nZXIgZXhpc3QgYXJlXG4gICAgZHJvcHBlZCwgYW5kIHRob3NlIHRoYXQgYXJlIG5ldyBhcmUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlaXJcbiAgICBbYGluaXRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuU3RhdGVGaWVsZC5pbml0KSBtZXRob2QsIHBhc3NpbmcgaW4gdGhlIG5ld1xuICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0Li5cbiAgICAqL1xuICAgIHJlY29uZmlndXJlKGNvbmZpZykge1xuICAgICAgICBsZXQgJGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKHRoaXMuc2NoZW1hLCBjb25maWcucGx1Z2lucyk7XG4gICAgICAgIGxldCBmaWVsZHMgPSAkY29uZmlnLmZpZWxkcywgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkc1tpXS5uYW1lO1xuICAgICAgICAgICAgaW5zdGFuY2VbbmFtZV0gPSB0aGlzLmhhc093blByb3BlcnR5KG5hbWUpID8gdGhpc1tuYW1lXSA6IGZpZWxkc1tpXS5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgc3RhdGUgdG8gSlNPTi4gSWYgeW91IHdhbnQgdG8gc2VyaWFsaXplIHRoZSBzdGF0ZVxuICAgIG9mIHBsdWdpbnMsIHBhc3MgYW4gb2JqZWN0IG1hcHBpbmcgcHJvcGVydHkgbmFtZXMgdG8gdXNlIGluIHRoZVxuICAgIHJlc3VsdGluZyBKU09OIG9iamVjdCB0byBwbHVnaW4gb2JqZWN0cy4gVGhlIGFyZ3VtZW50IG1heSBhbHNvIGJlXG4gICAgYSBzdHJpbmcgb3IgbnVtYmVyLCBpbiB3aGljaCBjYXNlIGl0IGlzIGlnbm9yZWQsIHRvIHN1cHBvcnQgdGhlXG4gICAgd2F5IGBKU09OLnN0cmluZ2lmeWAgY2FsbHMgYHRvU3RyaW5nYCBtZXRob2RzLlxuICAgICovXG4gICAgdG9KU09OKHBsdWdpbkZpZWxkcykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkb2M6IHRoaXMuZG9jLnRvSlNPTigpLCBzZWxlY3Rpb246IHRoaXMuc2VsZWN0aW9uLnRvSlNPTigpIH07XG4gICAgICAgIGlmICh0aGlzLnN0b3JlZE1hcmtzKVxuICAgICAgICAgICAgcmVzdWx0LnN0b3JlZE1hcmtzID0gdGhpcy5zdG9yZWRNYXJrcy5tYXAobSA9PiBtLnRvSlNPTigpKTtcbiAgICAgICAgaWYgKHBsdWdpbkZpZWxkcyAmJiB0eXBlb2YgcGx1Z2luRmllbGRzID09ICdvYmplY3QnKVxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwbHVnaW5GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSBcImRvY1wiIHx8IHByb3AgPT0gXCJzZWxlY3Rpb25cIilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSlNPTiBmaWVsZHMgYGRvY2AgYW5kIGBzZWxlY3Rpb25gIGFyZSByZXNlcnZlZFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gcGx1Z2luRmllbGRzW3Byb3BdLCBzdGF0ZSA9IHBsdWdpbi5zcGVjLnN0YXRlO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS50b0pTT04pXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IHN0YXRlLnRvSlNPTi5jYWxsKHBsdWdpbiwgdGhpc1twbHVnaW4ua2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhIHN0YXRlLiBgY29uZmlnYCBzaG91bGRcbiAgICBoYXZlIGF0IGxlYXN0IGEgYHNjaGVtYWAgZmllbGQsIGFuZCBzaG91bGQgY29udGFpbiBhcnJheSBvZlxuICAgIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgd2l0aC4gYHBsdWdpbkZpZWxkc2AgY2FuIGJlIHVzZWRcbiAgICB0byBkZXNlcmlhbGl6ZSB0aGUgc3RhdGUgb2YgcGx1Z2lucywgYnkgYXNzb2NpYXRpbmcgcGx1Z2luXG4gICAgaW5zdGFuY2VzIHdpdGggdGhlIHByb3BlcnR5IG5hbWVzIHRoZXkgdXNlIGluIHRoZSBKU09OIG9iamVjdC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihjb25maWcsIGpzb24sIHBsdWdpbkZpZWxkcykge1xuICAgICAgICBpZiAoIWpzb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEVkaXRvclN0YXRlLmZyb21KU09OXCIpO1xuICAgICAgICBpZiAoIWNvbmZpZy5zY2hlbWEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlJlcXVpcmVkIGNvbmZpZyBmaWVsZCAnc2NoZW1hJyBtaXNzaW5nXCIpO1xuICAgICAgICBsZXQgJGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKGNvbmZpZy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICAkY29uZmlnLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5uYW1lID09IFwiZG9jXCIpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5kb2MgPSBOb2RlLmZyb21KU09OKGNvbmZpZy5zY2hlbWEsIGpzb24uZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLm5hbWUgPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLnNlbGVjdGlvbiA9IFNlbGVjdGlvbi5mcm9tSlNPTihpbnN0YW5jZS5kb2MsIGpzb24uc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLm5hbWUgPT0gXCJzdG9yZWRNYXJrc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb24uc3RvcmVkTWFya3MpXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnN0b3JlZE1hcmtzID0ganNvbi5zdG9yZWRNYXJrcy5tYXAoY29uZmlnLnNjaGVtYS5tYXJrRnJvbUpTT04pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbkZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwbHVnaW5GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5GaWVsZHNbcHJvcF0sIHN0YXRlID0gcGx1Z2luLnNwZWMuc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLmtleSA9PSBmaWVsZC5uYW1lICYmIHN0YXRlICYmIHN0YXRlLmZyb21KU09OICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGpzb24sIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VbZmllbGQubmFtZV0gPSBzdGF0ZS5mcm9tSlNPTi5jYWxsKHBsdWdpbiwgY29uZmlnLCBqc29uW3Byb3BdLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VbZmllbGQubmFtZV0gPSBmaWVsZC5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYmluZFByb3BzKG9iaiwgc2VsZiwgdGFyZ2V0KSB7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBvYmopIHtcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwcm9wXTtcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICAgICAgdmFsID0gdmFsLmJpbmQoc2VsZik7XG4gICAgICAgIGVsc2UgaWYgKHByb3AgPT0gXCJoYW5kbGVET01FdmVudHNcIilcbiAgICAgICAgICAgIHZhbCA9IGJpbmRQcm9wcyh2YWwsIHNlbGYsIHt9KTtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuLyoqXG5QbHVnaW5zIGJ1bmRsZSBmdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGFuIGVkaXRvci5cblRoZXkgYXJlIHBhcnQgb2YgdGhlIFtlZGl0b3Igc3RhdGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5FZGl0b3JTdGF0ZSkgYW5kXG5tYXkgaW5mbHVlbmNlIHRoYXQgc3RhdGUgYW5kIHRoZSB2aWV3IHRoYXQgY29udGFpbnMgaXQuXG4qL1xuY2xhc3MgUGx1Z2luIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwbHVnaW4uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcGx1Z2luJ3MgW3NwZWMgb2JqZWN0XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuUGx1Z2luU3BlYykuXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgW3Byb3BzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcykgZXhwb3J0ZWQgYnkgdGhpcyBwbHVnaW4uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICAgICAgaWYgKHNwZWMucHJvcHMpXG4gICAgICAgICAgICBiaW5kUHJvcHMoc3BlYy5wcm9wcywgdGhpcywgdGhpcy5wcm9wcyk7XG4gICAgICAgIHRoaXMua2V5ID0gc3BlYy5rZXkgPyBzcGVjLmtleS5rZXkgOiBjcmVhdGVLZXkoXCJwbHVnaW5cIik7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dHJhY3QgdGhlIHBsdWdpbidzIHN0YXRlIGZpZWxkIGZyb20gYW4gZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgZ2V0U3RhdGUoc3RhdGUpIHsgcmV0dXJuIHN0YXRlW3RoaXMua2V5XTsgfVxufVxuY29uc3Qga2V5cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5mdW5jdGlvbiBjcmVhdGVLZXkobmFtZSkge1xuICAgIGlmIChuYW1lIGluIGtleXMpXG4gICAgICAgIHJldHVybiBuYW1lICsgXCIkXCIgKyArK2tleXNbbmFtZV07XG4gICAga2V5c1tuYW1lXSA9IDA7XG4gICAgcmV0dXJuIG5hbWUgKyBcIiRcIjtcbn1cbi8qKlxuQSBrZXkgaXMgdXNlZCB0byBbdGFnXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuUGx1Z2luU3BlYy5rZXkpIHBsdWdpbnMgaW4gYSB3YXlcbnRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZmluZCB0aGVtLCBnaXZlbiBhbiBlZGl0b3Igc3RhdGUuXG5Bc3NpZ25pbmcgYSBrZXkgZG9lcyBtZWFuIG9ubHkgb25lIHBsdWdpbiBvZiB0aGF0IHR5cGUgY2FuIGJlXG5hY3RpdmUgaW4gYSBzdGF0ZS5cbiovXG5jbGFzcyBQbHVnaW5LZXkge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbiBrZXkuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lID0gXCJrZXlcIikgeyB0aGlzLmtleSA9IGNyZWF0ZUtleShuYW1lKTsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgYWN0aXZlIHBsdWdpbiB3aXRoIHRoaXMga2V5LCBpZiBhbnksIGZyb20gYW4gZWRpdG9yXG4gICAgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQoc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmNvbmZpZy5wbHVnaW5zQnlLZXlbdGhpcy5rZXldOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwbHVnaW4ncyBzdGF0ZSBmcm9tIGFuIGVkaXRvciBzdGF0ZS5cbiAgICAqL1xuICAgIGdldFN0YXRlKHN0YXRlKSB7IHJldHVybiBzdGF0ZVt0aGlzLmtleV07IH1cbn1cblxuZXhwb3J0IHsgQWxsU2VsZWN0aW9uLCBFZGl0b3JTdGF0ZSwgTm9kZVNlbGVjdGlvbiwgUGx1Z2luLCBQbHVnaW5LZXksIFNlbGVjdGlvbiwgU2VsZWN0aW9uUmFuZ2UsIFRleHRTZWxlY3Rpb24sIFRyYW5zYWN0aW9uIH07XG4iLCJpbXBvcnQgeyBSZXBsYWNlRXJyb3IsIFNsaWNlLCBGcmFnbWVudCwgTWFya1R5cGUsIE1hcmsgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbi8vIFJlY292ZXJ5IHZhbHVlcyBlbmNvZGUgYSByYW5nZSBpbmRleCBhbmQgYW4gb2Zmc2V0LiBUaGV5IGFyZVxuLy8gcmVwcmVzZW50ZWQgYXMgbnVtYmVycywgYmVjYXVzZSB0b25zIG9mIHRoZW0gd2lsbCBiZSBjcmVhdGVkIHdoZW5cbi8vIG1hcHBpbmcsIGZvciBleGFtcGxlLCBhIGxhcmdlIG51bWJlciBvZiBkZWNvcmF0aW9ucy4gVGhlIG51bWJlcidzXG4vLyBsb3dlciAxNiBiaXRzIHByb3ZpZGUgdGhlIGluZGV4LCB0aGUgcmVtYWluaW5nIGJpdHMgdGhlIG9mZnNldC5cbi8vXG4vLyBOb3RlOiBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBiaXQgc2hpZnQgb3BlcmF0b3JzIHRvIGVuLSBhbmRcbi8vIGRlY29kZSB0aGVzZSwgc2luY2UgdGhvc2UgY2xpcCB0byAzMiBiaXRzLCB3aGljaCB3ZSBtaWdodCBpbiByYXJlXG4vLyBjYXNlcyB3YW50IHRvIG92ZXJmbG93LiBBIDY0LWJpdCBmbG9hdCBjYW4gcmVwcmVzZW50IDQ4LWJpdFxuLy8gaW50ZWdlcnMgcHJlY2lzZWx5LlxuY29uc3QgbG93ZXIxNiA9IDB4ZmZmZjtcbmNvbnN0IGZhY3RvcjE2ID0gTWF0aC5wb3coMiwgMTYpO1xuZnVuY3Rpb24gbWFrZVJlY292ZXIoaW5kZXgsIG9mZnNldCkgeyByZXR1cm4gaW5kZXggKyBvZmZzZXQgKiBmYWN0b3IxNjsgfVxuZnVuY3Rpb24gcmVjb3ZlckluZGV4KHZhbHVlKSB7IHJldHVybiB2YWx1ZSAmIGxvd2VyMTY7IH1cbmZ1bmN0aW9uIHJlY292ZXJPZmZzZXQodmFsdWUpIHsgcmV0dXJuICh2YWx1ZSAtICh2YWx1ZSAmIGxvd2VyMTYpKSAvIGZhY3RvcjE2OyB9XG5jb25zdCBERUxfQkVGT1JFID0gMSwgREVMX0FGVEVSID0gMiwgREVMX0FDUk9TUyA9IDQsIERFTF9TSURFID0gODtcbi8qKlxuQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIG1hcHBlZCBwb3NpdGlvbiB3aXRoIGV4dHJhXG5pbmZvcm1hdGlvbi5cbiovXG5jbGFzcyBNYXBSZXN1bHQge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG1hcHBlZCB2ZXJzaW9uIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkZWxJbmZvLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlY292ZXIpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZGVsSW5mbyA9IGRlbEluZm87XG4gICAgICAgIHRoaXMucmVjb3ZlciA9IHJlY292ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSBwb3NpdGlvbiB3YXMgZGVsZXRlZCwgdGhhdCBpcywgd2hldGhlciB0aGVcbiAgICBzdGVwIHJlbW92ZWQgdGhlIHRva2VuIG9uIHRoZSBzaWRlIHF1ZXJpZWQgKHZpYSB0aGUgYGFzc29jYClcbiAgICBhcmd1bWVudCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBkZWxldGVkKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIERFTF9TSURFKSA+IDA7IH1cbiAgICAvKipcbiAgICBUZWxscyB5b3Ugd2hldGhlciB0aGUgdG9rZW4gYmVmb3JlIHRoZSBtYXBwZWQgcG9zaXRpb24gd2FzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEJlZm9yZSgpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiAoREVMX0JFRk9SRSB8IERFTF9BQ1JPU1MpKSA+IDA7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIHRva2VuIGFmdGVyIHRoZSBtYXBwZWQgcG9zaXRpb24gd2FzIGRlbGV0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEFmdGVyKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIChERUxfQUZURVIgfCBERUxfQUNST1NTKSkgPiAwOyB9XG4gICAgLyoqXG4gICAgVGVsbHMgd2hldGhlciBhbnkgb2YgdGhlIHN0ZXBzIG1hcHBlZCB0aHJvdWdoIGRlbGV0ZXMgYWNyb3NzIHRoZVxuICAgIHBvc2l0aW9uIChpbmNsdWRpbmcgYm90aCB0aGUgdG9rZW4gYmVmb3JlIGFuZCBhZnRlciB0aGVcbiAgICBwb3NpdGlvbikuXG4gICAgKi9cbiAgICBnZXQgZGVsZXRlZEFjcm9zcygpIHsgcmV0dXJuICh0aGlzLmRlbEluZm8gJiBERUxfQUNST1NTKSA+IDA7IH1cbn1cbi8qKlxuQSBtYXAgZGVzY3JpYmluZyB0aGUgZGVsZXRpb25zIGFuZCBpbnNlcnRpb25zIG1hZGUgYnkgYSBzdGVwLCB3aGljaFxuY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBwb3NpdGlvbnMgaW4gdGhlXG5wcmUtc3RlcCB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQgYW5kIHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZVxucG9zdC1zdGVwIHZlcnNpb24uXG4qL1xuY2xhc3MgU3RlcE1hcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcG9zaXRpb24gbWFwLiBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgZG9jdW1lbnQgYXJlXG4gICAgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgbnVtYmVycywgaW4gd2hpY2ggZWFjaCBncm91cCBvZiB0aHJlZVxuICAgIHJlcHJlc2VudHMgYSBtb2RpZmllZCBjaHVuayBhcyBgW3N0YXJ0LCBvbGRTaXplLCBuZXdTaXplXWAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJhbmdlcywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBpbnZlcnRlZCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzO1xuICAgICAgICB0aGlzLmludmVydGVkID0gaW52ZXJ0ZWQ7XG4gICAgICAgIGlmICghcmFuZ2VzLmxlbmd0aCAmJiBTdGVwTWFwLmVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBNYXAuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVjb3Zlcih2YWx1ZSkge1xuICAgICAgICBsZXQgZGlmZiA9IDAsIGluZGV4ID0gcmVjb3ZlckluZGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKCF0aGlzLmludmVydGVkKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgICAgICAgICAgICAgIGRpZmYgKz0gdGhpcy5yYW5nZXNbaSAqIDMgKyAyXSAtIHRoaXMucmFuZ2VzW2kgKiAzICsgMV07XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1tpbmRleCAqIDNdICsgZGlmZiArIHJlY292ZXJPZmZzZXQodmFsdWUpO1xuICAgIH1cbiAgICBtYXBSZXN1bHQocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCBmYWxzZSk7IH1cbiAgICBtYXAocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCB0cnVlKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgX21hcChwb3MsIGFzc29jLCBzaW1wbGUpIHtcbiAgICAgICAgbGV0IGRpZmYgPSAwLCBvbGRJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAyIDogMSwgbmV3SW5kZXggPSB0aGlzLmludmVydGVkID8gMSA6IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldIC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPiBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgb2xkU2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBvbGRJbmRleF0sIG5ld1NpemUgPSB0aGlzLnJhbmdlc1tpICsgbmV3SW5kZXhdLCBlbmQgPSBzdGFydCArIG9sZFNpemU7XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzaWRlID0gIW9sZFNpemUgPyBhc3NvYyA6IHBvcyA9PSBzdGFydCA/IC0xIDogcG9zID09IGVuZCA/IDEgOiBhc3NvYztcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gc3RhcnQgKyBkaWZmICsgKHNpZGUgPCAwID8gMCA6IG5ld1NpemUpO1xuICAgICAgICAgICAgICAgIGlmIChzaW1wbGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgbGV0IHJlY292ZXIgPSBwb3MgPT0gKGFzc29jIDwgMCA/IHN0YXJ0IDogZW5kKSA/IG51bGwgOiBtYWtlUmVjb3ZlcihpIC8gMywgcG9zIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgIGxldCBkZWwgPSBwb3MgPT0gc3RhcnQgPyBERUxfQUZURVIgOiBwb3MgPT0gZW5kID8gREVMX0JFRk9SRSA6IERFTF9BQ1JPU1M7XG4gICAgICAgICAgICAgICAgaWYgKGFzc29jIDwgMCA/IHBvcyAhPSBzdGFydCA6IHBvcyAhPSBlbmQpXG4gICAgICAgICAgICAgICAgICAgIGRlbCB8PSBERUxfU0lERTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcFJlc3VsdChyZXN1bHQsIGRlbCwgcmVjb3Zlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaWZmICs9IG5ld1NpemUgLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW1wbGUgPyBwb3MgKyBkaWZmIDogbmV3IE1hcFJlc3VsdChwb3MgKyBkaWZmLCAwLCBudWxsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b3VjaGVzKHBvcywgcmVjb3Zlcikge1xuICAgICAgICBsZXQgZGlmZiA9IDAsIGluZGV4ID0gcmVjb3ZlckluZGV4KHJlY292ZXIpO1xuICAgICAgICBsZXQgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApO1xuICAgICAgICAgICAgaWYgKHN0YXJ0ID4gcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBlbmQgPSBzdGFydCArIG9sZFNpemU7XG4gICAgICAgICAgICBpZiAocG9zIDw9IGVuZCAmJiBpID09IGluZGV4ICogMylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRpZmYgKz0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XSAtIG9sZFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gZWFjaCBvZiB0aGUgY2hhbmdlZCByYW5nZXMgaW5jbHVkZWQgaW5cbiAgICB0aGlzIG1hcC5cbiAgICAqL1xuICAgIGZvckVhY2goZikge1xuICAgICAgICBsZXQgb2xkSW5kZXggPSB0aGlzLmludmVydGVkID8gMiA6IDEsIG5ld0luZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDEgOiAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgZGlmZiA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0sIG9sZFN0YXJ0ID0gc3RhcnQgLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKSwgbmV3U3RhcnQgPSBzdGFydCArICh0aGlzLmludmVydGVkID8gMCA6IGRpZmYpO1xuICAgICAgICAgICAgbGV0IG9sZFNpemUgPSB0aGlzLnJhbmdlc1tpICsgb2xkSW5kZXhdLCBuZXdTaXplID0gdGhpcy5yYW5nZXNbaSArIG5ld0luZGV4XTtcbiAgICAgICAgICAgIGYob2xkU3RhcnQsIG9sZFN0YXJ0ICsgb2xkU2l6ZSwgbmV3U3RhcnQsIG5ld1N0YXJ0ICsgbmV3U2l6ZSk7XG4gICAgICAgICAgICBkaWZmICs9IG5ld1NpemUgLSBvbGRTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhbiBpbnZlcnRlZCB2ZXJzaW9uIG9mIHRoaXMgbWFwLiBUaGUgcmVzdWx0IGNhbiBiZSB1c2VkIHRvXG4gICAgbWFwIHBvc2l0aW9ucyBpbiB0aGUgcG9zdC1zdGVwIGRvY3VtZW50IHRvIHRoZSBwcmUtc3RlcCBkb2N1bWVudC5cbiAgICAqL1xuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKHRoaXMucmFuZ2VzLCAhdGhpcy5pbnZlcnRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pbnZlcnRlZCA/IFwiLVwiIDogXCJcIikgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnJhbmdlcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcCB0aGF0IG1vdmVzIGFsbCBwb3NpdGlvbnMgYnkgb2Zmc2V0IGBuYCAod2hpY2ggbWF5IGJlXG4gICAgbmVnYXRpdmUpLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBhcHBseWluZyBzdGVwcyBtZWFudCBmb3IgYVxuICAgIHN1Yi1kb2N1bWVudCB0byBhIGxhcmdlciBkb2N1bWVudCwgb3IgdmljZS12ZXJzYS5cbiAgICAqL1xuICAgIHN0YXRpYyBvZmZzZXQobikge1xuICAgICAgICByZXR1cm4gbiA9PSAwID8gU3RlcE1hcC5lbXB0eSA6IG5ldyBTdGVwTWFwKG4gPCAwID8gWzAsIC1uLCAwXSA6IFswLCAwLCBuXSk7XG4gICAgfVxufVxuLyoqXG5BIFN0ZXBNYXAgdGhhdCBjb250YWlucyBubyBjaGFuZ2VkIHJhbmdlcy5cbiovXG5TdGVwTWFwLmVtcHR5ID0gbmV3IFN0ZXBNYXAoW10pO1xuLyoqXG5BIG1hcHBpbmcgcmVwcmVzZW50cyBhIHBpcGVsaW5lIG9mIHplcm8gb3IgbW9yZSBbc3RlcFxubWFwc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwTWFwKS4gSXQgaGFzIHNwZWNpYWwgcHJvdmlzaW9ucyBmb3IgbG9zc2xlc3NseVxuaGFuZGxpbmcgbWFwcGluZyBwb3NpdGlvbnMgdGhyb3VnaCBhIHNlcmllcyBvZiBzdGVwcyBpbiB3aGljaCBzb21lXG5zdGVwcyBhcmUgaW52ZXJ0ZWQgdmVyc2lvbnMgb2YgZWFybGllciBzdGVwcy4gKFRoaXMgY29tZXMgdXAgd2hlblxu4oCYW3JlYmFzaW5nXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyN0cmFuc2Zvcm0ucmViYXNpbmcp4oCZIHN0ZXBzIGZvclxuY29sbGFib3JhdGlvbiBvciBoaXN0b3J5IG1hbmFnZW1lbnQuKVxuKi9cbmNsYXNzIE1hcHBpbmcge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBtYXBwaW5nIHdpdGggdGhlIGdpdmVuIHBvc2l0aW9uIG1hcHMuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXBzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1pcnJvciwgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXksIHVzZWQgd2hlbiBgbWFwYCBvclxuICAgIGBtYXBSZXN1bHRgIGlzIGNhbGxlZC5cbiAgICAqL1xuICAgIGZyb20gPSAwLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uIGluIHRoZSBgbWFwc2AgYXJyYXkuXG4gICAgKi9cbiAgICB0byA9IG1hcHMgPyBtYXBzLmxlbmd0aCA6IDApIHtcbiAgICAgICAgdGhpcy5taXJyb3IgPSBtaXJyb3I7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5fbWFwcyA9IG1hcHMgfHwgW107XG4gICAgICAgIHRoaXMub3duRGF0YSA9ICEobWFwcyB8fCBtaXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3RlcCBtYXBzIGluIHRoaXMgbWFwcGluZy5cbiAgICAqL1xuICAgIGdldCBtYXBzKCkgeyByZXR1cm4gdGhpcy5fbWFwczsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcHBpbmcgdGhhdCBtYXBzIG9ubHkgdGhyb3VnaCBhIHBhcnQgb2YgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBzbGljZShmcm9tID0gMCwgdG8gPSB0aGlzLm1hcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWFwcGluZyh0aGlzLl9tYXBzLCB0aGlzLm1pcnJvciwgZnJvbSwgdG8pO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBzdGVwIG1hcCB0byB0aGUgZW5kIG9mIHRoaXMgbWFwcGluZy4gSWYgYG1pcnJvcnNgIGlzXG4gICAgZ2l2ZW4sIGl0IHNob3VsZCBiZSB0aGUgaW5kZXggb2YgdGhlIHN0ZXAgbWFwIHRoYXQgaXMgdGhlIG1pcnJvclxuICAgIGltYWdlIG9mIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kTWFwKG1hcCwgbWlycm9ycykge1xuICAgICAgICBpZiAoIXRoaXMub3duRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwcyA9IHRoaXMuX21hcHMuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gdGhpcy5taXJyb3IgJiYgdGhpcy5taXJyb3Iuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMub3duRGF0YSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50byA9IHRoaXMuX21hcHMucHVzaChtYXApO1xuICAgICAgICBpZiAobWlycm9ycyAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZXRNaXJyb3IodGhpcy5fbWFwcy5sZW5ndGggLSAxLCBtaXJyb3JzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIGFsbCB0aGUgc3RlcCBtYXBzIGluIGEgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZSAocHJlc2VydmluZ1xuICAgIG1pcnJvcmluZyBpbmZvcm1hdGlvbikuXG4gICAgKi9cbiAgICBhcHBlbmRNYXBwaW5nKG1hcHBpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHN0YXJ0U2l6ZSA9IHRoaXMuX21hcHMubGVuZ3RoOyBpIDwgbWFwcGluZy5fbWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1pcnIgPSBtYXBwaW5nLmdldE1pcnJvcihpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kTWFwKG1hcHBpbmcuX21hcHNbaV0sIG1pcnIgIT0gbnVsbCAmJiBtaXJyIDwgaSA/IHN0YXJ0U2l6ZSArIG1pcnIgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmRzIHRoZSBvZmZzZXQgb2YgdGhlIHN0ZXAgbWFwIHRoYXQgbWlycm9ycyB0aGUgbWFwIGF0IHRoZVxuICAgIGdpdmVuIG9mZnNldCwgaW4gdGhpcyBtYXBwaW5nIChhcyBwZXIgdGhlIHNlY29uZCBhcmd1bWVudCB0b1xuICAgIGBhcHBlbmRNYXBgKS5cbiAgICAqL1xuICAgIGdldE1pcnJvcihuKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5taXJyb3IubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yW2ldID09IG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1pcnJvcltpICsgKGkgJSAyID8gLTEgOiAxKV07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2V0TWlycm9yKG4sIG0pIHtcbiAgICAgICAgaWYgKCF0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHRoaXMubWlycm9yID0gW107XG4gICAgICAgIHRoaXMubWlycm9yLnB1c2gobiwgbSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGVuZCB0aGUgaW52ZXJzZSBvZiB0aGUgZ2l2ZW4gbWFwcGluZyB0byB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcHBpbmdJbnZlcnRlZChtYXBwaW5nKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXBwaW5nLm1hcHMubGVuZ3RoIC0gMSwgdG90YWxTaXplID0gdGhpcy5fbWFwcy5sZW5ndGggKyBtYXBwaW5nLl9tYXBzLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBtaXJyID0gbWFwcGluZy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZE1hcChtYXBwaW5nLl9tYXBzW2ldLmludmVydCgpLCBtaXJyICE9IG51bGwgJiYgbWlyciA+IGkgPyB0b3RhbFNpemUgLSBtaXJyIC0gMSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGludmVydGVkIHZlcnNpb24gb2YgdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgaW52ZXJ0KCkge1xuICAgICAgICBsZXQgaW52ZXJzZSA9IG5ldyBNYXBwaW5nO1xuICAgICAgICBpbnZlcnNlLmFwcGVuZE1hcHBpbmdJbnZlcnRlZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGludmVyc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCBhIHBvc2l0aW9uIHRocm91Z2ggdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgbWFwKHBvcywgYXNzb2MgPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvcilcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXAocG9zLCBhc3NvYywgdHJ1ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmZyb207IGkgPCB0aGlzLnRvOyBpKyspXG4gICAgICAgICAgICBwb3MgPSB0aGlzLl9tYXBzW2ldLm1hcChwb3MsIGFzc29jKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdGhyb3VnaCB0aGlzIG1hcHBpbmcsIHJldHVybmluZyBhIG1hcHBpbmdcbiAgICByZXN1bHQuXG4gICAgKi9cbiAgICBtYXBSZXN1bHQocG9zLCBhc3NvYyA9IDEpIHsgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCBmYWxzZSk7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIF9tYXAocG9zLCBhc3NvYywgc2ltcGxlKSB7XG4gICAgICAgIGxldCBkZWxJbmZvID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZnJvbTsgaSA8IHRoaXMudG87IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuX21hcHNbaV0sIHJlc3VsdCA9IG1hcC5tYXBSZXN1bHQocG9zLCBhc3NvYyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlY292ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3JyID0gdGhpcy5nZXRNaXJyb3IoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcnIgIT0gbnVsbCAmJiBjb3JyID4gaSAmJiBjb3JyIDwgdGhpcy50bykge1xuICAgICAgICAgICAgICAgICAgICBpID0gY29ycjtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gdGhpcy5fbWFwc1tjb3JyXS5yZWNvdmVyKHJlc3VsdC5yZWNvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsSW5mbyB8PSByZXN1bHQuZGVsSW5mbztcbiAgICAgICAgICAgIHBvcyA9IHJlc3VsdC5wb3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZSA/IHBvcyA6IG5ldyBNYXBSZXN1bHQocG9zLCBkZWxJbmZvLCBudWxsKTtcbiAgICB9XG59XG5cbmNvbnN0IHN0ZXBzQnlJRCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4vKipcbkEgc3RlcCBvYmplY3QgcmVwcmVzZW50cyBhbiBhdG9taWMgY2hhbmdlLiBJdCBnZW5lcmFsbHkgYXBwbGllc1xub25seSB0byB0aGUgZG9jdW1lbnQgaXQgd2FzIGNyZWF0ZWQgZm9yLCBzaW5jZSB0aGUgcG9zaXRpb25zXG5zdG9yZWQgaW4gaXQgd2lsbCBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHRoYXQgZG9jdW1lbnQuXG5cbk5ldyBzdGVwcyBhcmUgZGVmaW5lZCBieSBjcmVhdGluZyBjbGFzc2VzIHRoYXQgZXh0ZW5kIGBTdGVwYCxcbm92ZXJyaWRpbmcgdGhlIGBhcHBseWAsIGBpbnZlcnRgLCBgbWFwYCwgYGdldE1hcGAgYW5kIGBmcm9tSlNPTmBcbm1ldGhvZHMsIGFuZCByZWdpc3RlcmluZyB5b3VyIGNsYXNzIHdpdGggYSB1bmlxdWVcbkpTT04tc2VyaWFsaXphdGlvbiBpZGVudGlmaWVyIHVzaW5nXG5bYFN0ZXAuanNvbklEYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwXmpzb25JRCkuXG4qL1xuY2xhc3MgU3RlcCB7XG4gICAgLyoqXG4gICAgR2V0IHRoZSBzdGVwIG1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgbWFkZSBieSB0aGlzIHN0ZXAsXG4gICAgYW5kIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHBvc2l0aW9ucyBpbiB0aGUgb2xkXG4gICAgYW5kIHRoZSBuZXcgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBnZXRNYXAoKSB7IHJldHVybiBTdGVwTWFwLmVtcHR5OyB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIG1lcmdlIHRoaXMgc3RlcCB3aXRoIGFub3RoZXIgb25lLCB0byBiZSBhcHBsaWVkIGRpcmVjdGx5XG4gICAgYWZ0ZXIgaXQuIFJldHVybnMgdGhlIG1lcmdlZCBzdGVwIHdoZW4gcG9zc2libGUsIG51bGwgaWYgdGhlXG4gICAgc3RlcHMgY2FuJ3QgYmUgbWVyZ2VkLlxuICAgICovXG4gICAgbWVyZ2Uob3RoZXIpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIHN0ZXAgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gV2lsbCBjYWxsXG4gICAgdGhyb3VnaCB0byB0aGUgc3RlcCBjbGFzcycgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24uc3RlcFR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCB0eXBlID0gc3RlcHNCeUlEW2pzb24uc3RlcFR5cGVdO1xuICAgICAgICBpZiAoIXR5cGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc3RlcCB0eXBlICR7anNvbi5zdGVwVHlwZX0gZGVmaW5lZGApO1xuICAgICAgICByZXR1cm4gdHlwZS5mcm9tSlNPTihzY2hlbWEsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIHNlcmlhbGl6ZSBzdGVwcyB0byBKU09OLCBlYWNoIHN0ZXAgbmVlZHMgYSBzdHJpbmdcbiAgICBJRCB0byBhdHRhY2ggdG8gaXRzIEpTT04gcmVwcmVzZW50YXRpb24uIFVzZSB0aGlzIG1ldGhvZCB0b1xuICAgIHJlZ2lzdGVyIGFuIElEIGZvciB5b3VyIHN0ZXAgY2xhc3Nlcy4gVHJ5IHRvIHBpY2sgc29tZXRoaW5nXG4gICAgdGhhdCdzIHVubGlrZWx5IHRvIGNsYXNoIHdpdGggc3RlcHMgZnJvbSBvdGhlciBtb2R1bGVzLlxuICAgICovXG4gICAgc3RhdGljIGpzb25JRChpZCwgc3RlcENsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBzdGVwc0J5SUQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkR1cGxpY2F0ZSB1c2Ugb2Ygc3RlcCBKU09OIElEIFwiICsgaWQpO1xuICAgICAgICBzdGVwc0J5SURbaWRdID0gc3RlcENsYXNzO1xuICAgICAgICBzdGVwQ2xhc3MucHJvdG90eXBlLmpzb25JRCA9IGlkO1xuICAgICAgICByZXR1cm4gc3RlcENsYXNzO1xuICAgIH1cbn1cbi8qKlxuVGhlIHJlc3VsdCBvZiBbYXBwbHlpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcC5hcHBseSkgYSBzdGVwLiBDb250YWlucyBlaXRoZXIgYVxubmV3IGRvY3VtZW50IG9yIGEgZmFpbHVyZSB2YWx1ZS5cbiovXG5jbGFzcyBTdGVwUmVzdWx0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2Zvcm1lZCBkb2N1bWVudCwgaWYgc3VjY2Vzc2Z1bC5cbiAgICAqL1xuICAgIGRvYywgXG4gICAgLyoqXG4gICAgVGhlIGZhaWx1cmUgbWVzc2FnZSwgaWYgdW5zdWNjZXNzZnVsLlxuICAgICovXG4gICAgZmFpbGVkKSB7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgICAgICB0aGlzLmZhaWxlZCA9IGZhaWxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc3VjY2Vzc2Z1bCBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIHN0YXRpYyBvayhkb2MpIHsgcmV0dXJuIG5ldyBTdGVwUmVzdWx0KGRvYywgbnVsbCk7IH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmYWlsZWQgc3RlcCByZXN1bHQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmFpbChtZXNzYWdlKSB7IHJldHVybiBuZXcgU3RlcFJlc3VsdChudWxsLCBtZXNzYWdlKTsgfVxuICAgIC8qKlxuICAgIENhbGwgW2BOb2RlLnJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXBsYWNlKSB3aXRoIHRoZSBnaXZlblxuICAgIGFyZ3VtZW50cy4gQ3JlYXRlIGEgc3VjY2Vzc2Z1bCByZXN1bHQgaWYgaXQgc3VjY2VlZHMsIGFuZCBhXG4gICAgZmFpbGVkIG9uZSBpZiBpdCB0aHJvd3MgYSBgUmVwbGFjZUVycm9yYC5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tUmVwbGFjZShkb2MsIGZyb20sIHRvLCBzbGljZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQub2soZG9jLnJlcGxhY2UoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVwbGFjZUVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcEZyYWdtZW50KGZyYWdtZW50LCBmLCBwYXJlbnQpIHtcbiAgICBsZXQgbWFwcGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFnbWVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZ21lbnQuY2hpbGQoaSk7XG4gICAgICAgIGlmIChjaGlsZC5jb250ZW50LnNpemUpXG4gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmNvcHkobWFwRnJhZ21lbnQoY2hpbGQuY29udGVudCwgZiwgY2hpbGQpKTtcbiAgICAgICAgaWYgKGNoaWxkLmlzSW5saW5lKVxuICAgICAgICAgICAgY2hpbGQgPSBmKGNoaWxkLCBwYXJlbnQsIGkpO1xuICAgICAgICBtYXBwZWQucHVzaChjaGlsZCk7XG4gICAgfVxuICAgIHJldHVybiBGcmFnbWVudC5mcm9tQXJyYXkobWFwcGVkKTtcbn1cbi8qKlxuQWRkIGEgbWFyayB0byBhbGwgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLlxuKi9cbmNsYXNzIEFkZE1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFyayBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSBtYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gYWRkLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKSwgJGZyb20gPSBkb2MucmVzb2x2ZSh0aGlzLmZyb20pO1xuICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSgkZnJvbS5zaGFyZWREZXB0aCh0aGlzLnRvKSk7XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShtYXBGcmFnbWVudChvbGRTbGljZS5jb250ZW50LCAobm9kZSwgcGFyZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNBdG9tIHx8ICFwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZSh0aGlzLm1hcmsudHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIHBhcmVudCksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBBZGRNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGRNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhZGRNYXJrXCIsIEFkZE1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGFsbCBpbmxpbmUgY29udGVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgUmVtb3ZlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIHVubWFya2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBvZiB0aGUgdW5tYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIG1hcmsgdG8gcmVtb3ZlLlxuICAgICovXG4gICAgbWFyaykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgb2xkU2xpY2UgPSBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKG1hcEZyYWdtZW50KG9sZFNsaWNlLmNvbnRlbnQsIG5vZGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUubWFyayh0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIH0sIGRvYyksIG9sZFNsaWNlLm9wZW5TdGFydCwgb2xkU2xpY2Uub3BlbkVuZCk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBzbGljZSk7XG4gICAgfVxuICAgIGludmVydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRNYXJrU3RlcCh0aGlzLmZyb20sIHRoaXMudG8sIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGlmIChmcm9tLmRlbGV0ZWQgJiYgdG8uZGVsZXRlZCB8fCBmcm9tLnBvcyA+PSB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChmcm9tLnBvcywgdG8ucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtZXJnZShvdGhlcikge1xuICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBSZW1vdmVNYXJrU3RlcCAmJlxuICAgICAgICAgICAgb3RoZXIubWFyay5lcSh0aGlzLm1hcmspICYmXG4gICAgICAgICAgICB0aGlzLmZyb20gPD0gb3RoZXIudG8gJiYgdGhpcy50byA+PSBvdGhlci5mcm9tKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChNYXRoLm1pbih0aGlzLmZyb20sIG90aGVyLmZyb20pLCBNYXRoLm1heCh0aGlzLnRvLCBvdGhlci50byksIHRoaXMubWFyayk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcInJlbW92ZU1hcmtcIiwgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZW1vdmVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVNYXJrU3RlcChqc29uLmZyb20sIGpzb24udG8sIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVNYXJrXCIsIFJlbW92ZU1hcmtTdGVwKTtcbi8qKlxuQWRkIGEgbWFyayB0byBhIHNwZWNpZmljIG5vZGUuXG4qL1xuY2xhc3MgQWRkTm9kZU1hcmtTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBtYXJrIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byBhZGQuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSB0aGlzLm1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcyk7XG4gICAgICAgICAgICBpZiAobmV3U2V0Lmxlbmd0aCA9PSBub2RlLm1hcmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5tYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLm1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCBub2RlLm1hcmtzW2ldKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZE5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU5vZGVNYXJrU3RlcCh0aGlzLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IEFkZE5vZGVNYXJrU3RlcChwb3MucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImFkZE5vZGVNYXJrXCIsIHBvczogdGhpcy5wb3MsIG1hcms6IHRoaXMubWFyay50b0pTT04oKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBBZGROb2RlTWFya1N0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKGpzb24ucG9zLCBzY2hlbWEubWFya0Zyb21KU09OKGpzb24ubWFyaykpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYWRkTm9kZU1hcmtcIiwgQWRkTm9kZU1hcmtTdGVwKTtcbi8qKlxuUmVtb3ZlIGEgbWFyayBmcm9tIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBSZW1vdmVOb2RlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrLXJlbW92aW5nIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBub2RlLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byByZW1vdmUuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgbWFyayBzdGVwJ3MgcG9zaXRpb25cIik7XG4gICAgICAgIGxldCB1cGRhdGVkID0gbm9kZS50eXBlLmNyZWF0ZShub2RlLmF0dHJzLCBudWxsLCB0aGlzLm1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMubWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwicmVtb3ZlTm9kZU1hcmtcIiwgcG9zOiB0aGlzLnBvcywgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlbW92ZU5vZGVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAoanNvbi5wb3MsIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZW1vdmVOb2RlTWFya1wiLCBSZW1vdmVOb2RlTWFya1N0ZXApO1xuXG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgbmV3IGNvbnRlbnQuXG4qL1xuY2xhc3MgUmVwbGFjZVN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBUaGUgZ2l2ZW4gYHNsaWNlYCBzaG91bGQgZml0IHRoZSAnZ2FwJyBiZXR3ZWVuIGBmcm9tYCBhbmRcbiAgICBgdG9g4oCUdGhlIGRlcHRocyBtdXN0IGxpbmUgdXAsIGFuZCB0aGUgc3Vycm91bmRpbmcgbm9kZXMgbXVzdCBiZVxuICAgIGFibGUgdG8gYmUgam9pbmVkIHdpdGggdGhlIG9wZW4gc2lkZXMgb2YgdGhlIHNsaWNlLiBXaGVuXG4gICAgYHN0cnVjdHVyZWAgaXMgdHJ1ZSwgdGhlIHN0ZXAgd2lsbCBmYWlsIGlmIHRoZSBjb250ZW50IGJldHdlZW5cbiAgICBmcm9tIGFuZCB0byBpcyBub3QganVzdCBhIHNlcXVlbmNlIG9mIGNsb3NpbmcgYW5kIHRoZW4gb3BlbmluZ1xuICAgIHRva2VucyAodGhpcyBpcyB0byBndWFyZCBhZ2FpbnN0IHJlYmFzZWQgcmVwbGFjZSBzdGVwc1xuICAgIG92ZXJ3cml0aW5nIHNvbWV0aGluZyB0aGV5IHdlcmVuJ3Qgc3VwcG9zZWQgdG8pLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMudG8pKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSByZXBsYWNlIHdvdWxkIG92ZXJ3cml0ZSBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5zbGljZSk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMudG8gLSB0aGlzLmZyb20sIHRoaXMuc2xpY2Uuc2l6ZV0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZEFjcm9zcyAmJiB0by5kZWxldGVkQWNyb3NzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbS5wb3MsIE1hdGgubWF4KGZyb20ucG9zLCB0by5wb3MpLCB0aGlzLnNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXApIHx8IG90aGVyLnN0cnVjdHVyZSB8fCB0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplID09IG90aGVyLmZyb20gJiYgIXRoaXMuc2xpY2Uub3BlbkVuZCAmJiAhb3RoZXIuc2xpY2Uub3BlblN0YXJ0KSB7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnNsaWNlLnNpemUgKyBvdGhlci5zbGljZS5zaXplID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKHRoaXMuc2xpY2UuY29udGVudC5hcHBlbmQob3RoZXIuc2xpY2UuY29udGVudCksIHRoaXMuc2xpY2Uub3BlblN0YXJ0LCBvdGhlci5zbGljZS5vcGVuRW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAodGhpcy5mcm9tLCB0aGlzLnRvICsgKG90aGVyLnRvIC0gb3RoZXIuZnJvbSksIHNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3RoZXIudG8gPT0gdGhpcy5mcm9tICYmICF0aGlzLnNsaWNlLm9wZW5TdGFydCAmJiAhb3RoZXIuc2xpY2Uub3BlbkVuZCkge1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gdGhpcy5zbGljZS5zaXplICsgb3RoZXIuc2xpY2Uuc2l6ZSA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZShvdGhlci5zbGljZS5jb250ZW50LmFwcGVuZCh0aGlzLnNsaWNlLmNvbnRlbnQpLCBvdGhlci5zbGljZS5vcGVuU3RhcnQsIHRoaXMuc2xpY2Uub3BlbkVuZCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKG90aGVyLmZyb20sIHRoaXMudG8sIHNsaWNlLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBqc29uID0geyBzdGVwVHlwZTogXCJyZXBsYWNlXCIsIGZyb206IHRoaXMuZnJvbSwgdG86IHRoaXMudG8gfTtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2Uuc2l6ZSlcbiAgICAgICAgICAgIGpzb24uc2xpY2UgPSB0aGlzLnNsaWNlLnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAgICAgICBqc29uLnN0cnVjdHVyZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZXBsYWNlU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcChqc29uLmZyb20sIGpzb24udG8sIFNsaWNlLmZyb21KU09OKHNjaGVtYSwganNvbi5zbGljZSksICEhanNvbi5zdHJ1Y3R1cmUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwicmVwbGFjZVwiLCBSZXBsYWNlU3RlcCk7XG4vKipcblJlcGxhY2UgYSBwYXJ0IG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgc2xpY2Ugb2YgY29udGVudCwgYnV0XG5wcmVzZXJ2ZSBhIHJhbmdlIG9mIHRoZSByZXBsYWNlZCBjb250ZW50IGJ5IG1vdmluZyBpdCBpbnRvIHRoZVxuc2xpY2UuXG4qL1xuY2xhc3MgUmVwbGFjZUFyb3VuZFN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSByZXBsYWNlLWFyb3VuZCBzdGVwIHdpdGggdGhlIGdpdmVuIHJhbmdlIGFuZCBnYXAuXG4gICAgYGluc2VydGAgc2hvdWxkIGJlIHRoZSBwb2ludCBpbiB0aGUgc2xpY2UgaW50byB3aGljaCB0aGUgY29udGVudFxuICAgIG9mIHRoZSBnYXAgc2hvdWxkIGJlIG1vdmVkLiBgc3RydWN0dXJlYCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhc1xuICAgIGl0IGhhcyBpbiB0aGUgW2BSZXBsYWNlU3RlcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uUmVwbGFjZVN0ZXApIGNsYXNzLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXBsYWNlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiBwcmVzZXJ2ZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBnYXBGcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHByZXNlcnZlZCByYW5nZS5cbiAgICAqL1xuICAgIGdhcFRvLCBcbiAgICAvKipcbiAgICBUaGUgc2xpY2UgdG8gaW5zZXJ0LlxuICAgICovXG4gICAgc2xpY2UsIFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBpbiB0aGUgc2xpY2Ugd2hlcmUgdGhlIHByZXNlcnZlZCByYW5nZSBzaG91bGQgYmVcbiAgICBpbnNlcnRlZC5cbiAgICAqL1xuICAgIGluc2VydCwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdHJ1Y3R1cmUgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMuZ2FwRnJvbSA9IGdhcEZyb207XG4gICAgICAgIHRoaXMuZ2FwVG8gPSBnYXBUbztcbiAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlO1xuICAgICAgICB0aGlzLmluc2VydCA9IGluc2VydDtcbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmUgPSBzdHJ1Y3R1cmU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUgJiYgKGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5mcm9tLCB0aGlzLmdhcEZyb20pIHx8XG4gICAgICAgICAgICBjb250ZW50QmV0d2Vlbihkb2MsIHRoaXMuZ2FwVG8sIHRoaXMudG8pKSlcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJTdHJ1Y3R1cmUgZ2FwLXJlcGxhY2Ugd291bGQgb3ZlcndyaXRlIGNvbnRlbnRcIik7XG4gICAgICAgIGxldCBnYXAgPSBkb2Muc2xpY2UodGhpcy5nYXBGcm9tLCB0aGlzLmdhcFRvKTtcbiAgICAgICAgaWYgKGdhcC5vcGVuU3RhcnQgfHwgZ2FwLm9wZW5FbmQpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiR2FwIGlzIG5vdCBhIGZsYXQgcmFuZ2VcIik7XG4gICAgICAgIGxldCBpbnNlcnRlZCA9IHRoaXMuc2xpY2UuaW5zZXJ0QXQodGhpcy5pbnNlcnQsIGdhcC5jb250ZW50KTtcbiAgICAgICAgaWYgKCFpbnNlcnRlZClcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJDb250ZW50IGRvZXMgbm90IGZpdCBpbiBnYXBcIik7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCBpbnNlcnRlZCk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwTWFwKFt0aGlzLmZyb20sIHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5pbnNlcnQsXG4gICAgICAgICAgICB0aGlzLmdhcFRvLCB0aGlzLnRvIC0gdGhpcy5nYXBUbywgdGhpcy5zbGljZS5zaXplIC0gdGhpcy5pbnNlcnRdKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgZ2FwID0gdGhpcy5nYXBUbyAtIHRoaXMuZ2FwRnJvbTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcCh0aGlzLmZyb20sIHRoaXMuZnJvbSArIHRoaXMuc2xpY2Uuc2l6ZSArIGdhcCwgdGhpcy5mcm9tICsgdGhpcy5pbnNlcnQsIHRoaXMuZnJvbSArIHRoaXMuaW5zZXJ0ICsgZ2FwLCBkb2Muc2xpY2UodGhpcy5mcm9tLCB0aGlzLnRvKS5yZW1vdmVCZXR3ZWVuKHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5nYXBUbyAtIHRoaXMuZnJvbSksIHRoaXMuZ2FwRnJvbSAtIHRoaXMuZnJvbSwgdGhpcy5zdHJ1Y3R1cmUpO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy50bywgLTEpO1xuICAgICAgICBsZXQgZ2FwRnJvbSA9IHRoaXMuZnJvbSA9PSB0aGlzLmdhcEZyb20gPyBmcm9tLnBvcyA6IG1hcHBpbmcubWFwKHRoaXMuZ2FwRnJvbSwgLTEpO1xuICAgICAgICBsZXQgZ2FwVG8gPSB0aGlzLnRvID09IHRoaXMuZ2FwVG8gPyB0by5wb3MgOiBtYXBwaW5nLm1hcCh0aGlzLmdhcFRvLCAxKTtcbiAgICAgICAgaWYgKChmcm9tLmRlbGV0ZWRBY3Jvc3MgJiYgdG8uZGVsZXRlZEFjcm9zcykgfHwgZ2FwRnJvbSA8IGZyb20ucG9zIHx8IGdhcFRvID4gdG8ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoZnJvbS5wb3MsIHRvLnBvcywgZ2FwRnJvbSwgZ2FwVG8sIHRoaXMuc2xpY2UsIHRoaXMuaW5zZXJ0LCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSB7IHN0ZXBUeXBlOiBcInJlcGxhY2VBcm91bmRcIiwgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byxcbiAgICAgICAgICAgIGdhcEZyb206IHRoaXMuZ2FwRnJvbSwgZ2FwVG86IHRoaXMuZ2FwVG8sIGluc2VydDogdGhpcy5pbnNlcnQgfTtcbiAgICAgICAgaWYgKHRoaXMuc2xpY2Uuc2l6ZSlcbiAgICAgICAgICAgIGpzb24uc2xpY2UgPSB0aGlzLnNsaWNlLnRvSlNPTigpO1xuICAgICAgICBpZiAodGhpcy5zdHJ1Y3R1cmUpXG4gICAgICAgICAgICBqc29uLnN0cnVjdHVyZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi50byAhPSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICB0eXBlb2YganNvbi5nYXBGcm9tICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uZ2FwVG8gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5pbnNlcnQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgUmVwbGFjZUFyb3VuZFN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoanNvbi5mcm9tLCBqc29uLnRvLCBqc29uLmdhcEZyb20sIGpzb24uZ2FwVG8sIFNsaWNlLmZyb21KU09OKHNjaGVtYSwganNvbi5zbGljZSksIGpzb24uaW5zZXJ0LCAhIWpzb24uc3RydWN0dXJlKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcInJlcGxhY2VBcm91bmRcIiwgUmVwbGFjZUFyb3VuZFN0ZXApO1xuZnVuY3Rpb24gY29udGVudEJldHdlZW4oZG9jLCBmcm9tLCB0bykge1xuICAgIGxldCAkZnJvbSA9IGRvYy5yZXNvbHZlKGZyb20pLCBkaXN0ID0gdG8gLSBmcm9tLCBkZXB0aCA9ICRmcm9tLmRlcHRoO1xuICAgIHdoaWxlIChkaXN0ID4gMCAmJiBkZXB0aCA+IDAgJiYgJGZyb20uaW5kZXhBZnRlcihkZXB0aCkgPT0gJGZyb20ubm9kZShkZXB0aCkuY2hpbGRDb3VudCkge1xuICAgICAgICBkZXB0aC0tO1xuICAgICAgICBkaXN0LS07XG4gICAgfVxuICAgIGlmIChkaXN0ID4gMCkge1xuICAgICAgICBsZXQgbmV4dCA9ICRmcm9tLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJGZyb20uaW5kZXhBZnRlcihkZXB0aCkpO1xuICAgICAgICB3aGlsZSAoZGlzdCA+IDApIHtcbiAgICAgICAgICAgIGlmICghbmV4dCB8fCBuZXh0LmlzTGVhZilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBkaXN0LS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhZGRNYXJrKHRyLCBmcm9tLCB0bywgbWFyaykge1xuICAgIGxldCByZW1vdmVkID0gW10sIGFkZGVkID0gW107XG4gICAgbGV0IHJlbW92aW5nLCBhZGRpbmc7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcywgcGFyZW50KSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5pc0lubGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG1hcmtzID0gbm9kZS5tYXJrcztcbiAgICAgICAgaWYgKCFtYXJrLmlzSW5TZXQobWFya3MpICYmIHBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKG1hcmsudHlwZSkpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHBvcywgZnJvbSksIGVuZCA9IE1hdGgubWluKHBvcyArIG5vZGUubm9kZVNpemUsIHRvKTtcbiAgICAgICAgICAgIGxldCBuZXdTZXQgPSBtYXJrLmFkZFRvU2V0KG1hcmtzKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIW1hcmtzW2ldLmlzSW5TZXQobmV3U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZpbmcgJiYgcmVtb3ZpbmcudG8gPT0gc3RhcnQgJiYgcmVtb3ZpbmcubWFyay5lcShtYXJrc1tpXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmluZy50byA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKHJlbW92aW5nID0gbmV3IFJlbW92ZU1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmtzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkZGluZyAmJiBhZGRpbmcudG8gPT0gc3RhcnQpXG4gICAgICAgICAgICAgICAgYWRkaW5nLnRvID0gZW5kO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFkZGVkLnB1c2goYWRkaW5nID0gbmV3IEFkZE1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmspKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJlbW92ZWQuZm9yRWFjaChzID0+IHRyLnN0ZXAocykpO1xuICAgIGFkZGVkLmZvckVhY2gocyA9PiB0ci5zdGVwKHMpKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU1hcmsodHIsIGZyb20sIHRvLCBtYXJrKSB7XG4gICAgbGV0IG1hdGNoZWQgPSBbXSwgc3RlcCA9IDA7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBpZiAoIW5vZGUuaXNJbmxpbmUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN0ZXArKztcbiAgICAgICAgbGV0IHRvUmVtb3ZlID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcmsgaW5zdGFuY2VvZiBNYXJrVHlwZSkge1xuICAgICAgICAgICAgbGV0IHNldCA9IG5vZGUubWFya3MsIGZvdW5kO1xuICAgICAgICAgICAgd2hpbGUgKGZvdW5kID0gbWFyay5pc0luU2V0KHNldCkpIHtcbiAgICAgICAgICAgICAgICAodG9SZW1vdmUgfHwgKHRvUmVtb3ZlID0gW10pKS5wdXNoKGZvdW5kKTtcbiAgICAgICAgICAgICAgICBzZXQgPSBmb3VuZC5yZW1vdmVGcm9tU2V0KHNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFyaykge1xuICAgICAgICAgICAgaWYgKG1hcmsuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICB0b1JlbW92ZSA9IFttYXJrXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvUmVtb3ZlID0gbm9kZS5tYXJrcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9SZW1vdmUgJiYgdG9SZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4ocG9zICsgbm9kZS5ub2RlU2l6ZSwgdG8pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IHRvUmVtb3ZlW2ldLCBmb3VuZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdGNoZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBtYXRjaGVkW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobS5zdGVwID09IHN0ZXAgLSAxICYmIHN0eWxlLmVxKG1hdGNoZWRbal0uc3R5bGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQudG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kLnN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5wdXNoKHsgc3R5bGUsIGZyb206IE1hdGgubWF4KHBvcywgZnJvbSksIHRvOiBlbmQsIHN0ZXAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgbWF0Y2hlZC5mb3JFYWNoKG0gPT4gdHIuc3RlcChuZXcgUmVtb3ZlTWFya1N0ZXAobS5mcm9tLCBtLnRvLCBtLnN0eWxlKSkpO1xufVxuZnVuY3Rpb24gY2xlYXJJbmNvbXBhdGlibGUodHIsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2ggPSBwYXJlbnRUeXBlLmNvbnRlbnRNYXRjaCwgY2xlYXJOZXdsaW5lcyA9IHRydWUpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBsZXQgcmVwbFN0ZXBzID0gW10sIGN1ciA9IHBvcyArIDE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpLCBlbmQgPSBjdXIgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgbGV0IGFsbG93ZWQgPSBtYXRjaC5tYXRjaFR5cGUoY2hpbGQudHlwZSk7XG4gICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgcmVwbFN0ZXBzLnB1c2gobmV3IFJlcGxhY2VTdGVwKGN1ciwgZW5kLCBTbGljZS5lbXB0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWF0Y2ggPSBhbGxvd2VkO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZC5tYXJrcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuYWxsb3dzTWFya1R5cGUoY2hpbGQubWFya3Nbal0udHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKGN1ciwgZW5kLCBjaGlsZC5tYXJrc1tqXSkpO1xuICAgICAgICAgICAgaWYgKGNsZWFyTmV3bGluZXMgJiYgY2hpbGQuaXNUZXh0ICYmIHBhcmVudFR5cGUud2hpdGVzcGFjZSAhPSBcInByZVwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IG0sIG5ld2xpbmUgPSAvXFxyP1xcbnxcXHIvZywgc2xpY2U7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG0gPSBuZXdsaW5lLmV4ZWMoY2hpbGQudGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzbGljZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20ocGFyZW50VHlwZS5zY2hlbWEudGV4dChcIiBcIiwgcGFyZW50VHlwZS5hbGxvd2VkTWFya3MoY2hpbGQubWFya3MpKSksIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICByZXBsU3RlcHMucHVzaChuZXcgUmVwbGFjZVN0ZXAoY3VyICsgbS5pbmRleCwgY3VyICsgbS5pbmRleCArIG1bMF0ubGVuZ3RoLCBzbGljZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXIgPSBlbmQ7XG4gICAgfVxuICAgIGlmICghbWF0Y2gudmFsaWRFbmQpIHtcbiAgICAgICAgbGV0IGZpbGwgPSBtYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgdHIucmVwbGFjZShjdXIsIGN1ciwgbmV3IFNsaWNlKGZpbGwsIDAsIDApKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHJlcGxTdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgdHIuc3RlcChyZXBsU3RlcHNbaV0pO1xufVxuXG5mdW5jdGlvbiBjYW5DdXQobm9kZSwgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoc3RhcnQgPT0gMCB8fCBub2RlLmNhblJlcGxhY2Uoc3RhcnQsIG5vZGUuY2hpbGRDb3VudCkpICYmXG4gICAgICAgIChlbmQgPT0gbm9kZS5jaGlsZENvdW50IHx8IG5vZGUuY2FuUmVwbGFjZSgwLCBlbmQpKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSB0YXJnZXQgZGVwdGggdG8gd2hpY2ggdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlXG5jYW4gYmUgbGlmdGVkLiBXaWxsIG5vdCBnbyBhY3Jvc3Ncbltpc29sYXRpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5pc29sYXRpbmcpIHBhcmVudCBub2Rlcy5cbiovXG5mdW5jdGlvbiBsaWZ0VGFyZ2V0KHJhbmdlKSB7XG4gICAgbGV0IHBhcmVudCA9IHJhbmdlLnBhcmVudDtcbiAgICBsZXQgY29udGVudCA9IHBhcmVudC5jb250ZW50LmN1dEJ5SW5kZXgocmFuZ2Uuc3RhcnRJbmRleCwgcmFuZ2UuZW5kSW5kZXgpO1xuICAgIGZvciAobGV0IGRlcHRoID0gcmFuZ2UuZGVwdGg7OyAtLWRlcHRoKSB7XG4gICAgICAgIGxldCBub2RlID0gcmFuZ2UuJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBpbmRleCA9IHJhbmdlLiRmcm9tLmluZGV4KGRlcHRoKSwgZW5kSW5kZXggPSByYW5nZS4kdG8uaW5kZXhBZnRlcihkZXB0aCk7XG4gICAgICAgIGlmIChkZXB0aCA8IHJhbmdlLmRlcHRoICYmIG5vZGUuY2FuUmVwbGFjZShpbmRleCwgZW5kSW5kZXgsIGNvbnRlbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGRlcHRoO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCB8fCBub2RlLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgIWNhbkN1dChub2RlLCBpbmRleCwgZW5kSW5kZXgpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gbGlmdCh0ciwgcmFuZ2UsIHRhcmdldCkge1xuICAgIGxldCB7ICRmcm9tLCAkdG8sIGRlcHRoIH0gPSByYW5nZTtcbiAgICBsZXQgZ2FwU3RhcnQgPSAkZnJvbS5iZWZvcmUoZGVwdGggKyAxKSwgZ2FwRW5kID0gJHRvLmFmdGVyKGRlcHRoICsgMSk7XG4gICAgbGV0IHN0YXJ0ID0gZ2FwU3RhcnQsIGVuZCA9IGdhcEVuZDtcbiAgICBsZXQgYmVmb3JlID0gRnJhZ21lbnQuZW1wdHksIG9wZW5TdGFydCA9IDA7XG4gICAgZm9yIChsZXQgZCA9IGRlcHRoLCBzcGxpdHRpbmcgPSBmYWxzZTsgZCA+IHRhcmdldDsgZC0tKVxuICAgICAgICBpZiAoc3BsaXR0aW5nIHx8ICRmcm9tLmluZGV4KGQpID4gMCkge1xuICAgICAgICAgICAgc3BsaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGJlZm9yZSA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KGJlZm9yZSkpO1xuICAgICAgICAgICAgb3BlblN0YXJ0Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydC0tO1xuICAgICAgICB9XG4gICAgbGV0IGFmdGVyID0gRnJhZ21lbnQuZW1wdHksIG9wZW5FbmQgPSAwO1xuICAgIGZvciAobGV0IGQgPSBkZXB0aCwgc3BsaXR0aW5nID0gZmFsc2U7IGQgPiB0YXJnZXQ7IGQtLSlcbiAgICAgICAgaWYgKHNwbGl0dGluZyB8fCAkdG8uYWZ0ZXIoZCArIDEpIDwgJHRvLmVuZChkKSkge1xuICAgICAgICAgICAgc3BsaXR0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGFmdGVyID0gRnJhZ21lbnQuZnJvbSgkdG8ubm9kZShkKS5jb3B5KGFmdGVyKSk7XG4gICAgICAgICAgICBvcGVuRW5kKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0LCBlbmQsIGdhcFN0YXJ0LCBnYXBFbmQsIG5ldyBTbGljZShiZWZvcmUuYXBwZW5kKGFmdGVyKSwgb3BlblN0YXJ0LCBvcGVuRW5kKSwgYmVmb3JlLnNpemUgLSBvcGVuU3RhcnQsIHRydWUpKTtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSB2YWxpZCB3YXkgdG8gd3JhcCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaW4gYVxubm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gTWF5IGludHJvZHVjZSBleHRyYSBub2RlcyBhcm91bmQgYW5kIGluc2lkZVxudGhlIHdyYXBwZXIgbm9kZSwgaWYgbmVjZXNzYXJ5LiBSZXR1cm5zIG51bGwgaWYgbm8gdmFsaWQgd3JhcHBpbmdcbmNvdWxkIGJlIGZvdW5kLiBXaGVuIGBpbm5lclJhbmdlYCBpcyBnaXZlbiwgdGhhdCByYW5nZSdzIGNvbnRlbnQgaXNcbnVzZWQgYXMgdGhlIGNvbnRlbnQgdG8gZml0IGludG8gdGhlIHdyYXBwaW5nLCBpbnN0ZWFkIG9mIHRoZVxuY29udGVudCBvZiBgcmFuZ2VgLlxuKi9cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZyhyYW5nZSwgbm9kZVR5cGUsIGF0dHJzID0gbnVsbCwgaW5uZXJSYW5nZSA9IHJhbmdlKSB7XG4gICAgbGV0IGFyb3VuZCA9IGZpbmRXcmFwcGluZ091dHNpZGUocmFuZ2UsIG5vZGVUeXBlKTtcbiAgICBsZXQgaW5uZXIgPSBhcm91bmQgJiYgZmluZFdyYXBwaW5nSW5zaWRlKGlubmVyUmFuZ2UsIG5vZGVUeXBlKTtcbiAgICBpZiAoIWlubmVyKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJvdW5kLm1hcCh3aXRoQXR0cnMpXG4gICAgICAgIC5jb25jYXQoeyB0eXBlOiBub2RlVHlwZSwgYXR0cnMgfSkuY29uY2F0KGlubmVyLm1hcCh3aXRoQXR0cnMpKTtcbn1cbmZ1bmN0aW9uIHdpdGhBdHRycyh0eXBlKSB7IHJldHVybiB7IHR5cGUsIGF0dHJzOiBudWxsIH07IH1cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ091dHNpZGUocmFuZ2UsIHR5cGUpIHtcbiAgICBsZXQgeyBwYXJlbnQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSByYW5nZTtcbiAgICBsZXQgYXJvdW5kID0gcGFyZW50LmNvbnRlbnRNYXRjaEF0KHN0YXJ0SW5kZXgpLmZpbmRXcmFwcGluZyh0eXBlKTtcbiAgICBpZiAoIWFyb3VuZClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG91dGVyID0gYXJvdW5kLmxlbmd0aCA/IGFyb3VuZFswXSA6IHR5cGU7XG4gICAgcmV0dXJuIHBhcmVudC5jYW5SZXBsYWNlV2l0aChzdGFydEluZGV4LCBlbmRJbmRleCwgb3V0ZXIpID8gYXJvdW5kIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRXcmFwcGluZ0luc2lkZShyYW5nZSwgdHlwZSkge1xuICAgIGxldCB7IHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHJhbmdlO1xuICAgIGxldCBpbm5lciA9IHBhcmVudC5jaGlsZChzdGFydEluZGV4KTtcbiAgICBsZXQgaW5zaWRlID0gdHlwZS5jb250ZW50TWF0Y2guZmluZFdyYXBwaW5nKGlubmVyLnR5cGUpO1xuICAgIGlmICghaW5zaWRlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgbGFzdFR5cGUgPSBpbnNpZGUubGVuZ3RoID8gaW5zaWRlW2luc2lkZS5sZW5ndGggLSAxXSA6IHR5cGU7XG4gICAgbGV0IGlubmVyTWF0Y2ggPSBsYXN0VHlwZS5jb250ZW50TWF0Y2g7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGlubmVyTWF0Y2ggJiYgaSA8IGVuZEluZGV4OyBpKyspXG4gICAgICAgIGlubmVyTWF0Y2ggPSBpbm5lck1hdGNoLm1hdGNoVHlwZShwYXJlbnQuY2hpbGQoaSkudHlwZSk7XG4gICAgaWYgKCFpbm5lck1hdGNoIHx8ICFpbm5lck1hdGNoLnZhbGlkRW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gaW5zaWRlO1xufVxuZnVuY3Rpb24gd3JhcCh0ciwgcmFuZ2UsIHdyYXBwZXJzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBpID0gd3JhcHBlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IG1hdGNoID0gd3JhcHBlcnNbaV0udHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLnZhbGlkRW5kKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiV3JhcHBlciB0eXBlIGdpdmVuIHRvIFRyYW5zZm9ybS53cmFwIGRvZXMgbm90IGZvcm0gdmFsaWQgY29udGVudCBvZiBpdHMgcGFyZW50IHdyYXBwZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20od3JhcHBlcnNbaV0udHlwZS5jcmVhdGUod3JhcHBlcnNbaV0uYXR0cnMsIGNvbnRlbnQpKTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0ID0gcmFuZ2Uuc3RhcnQsIGVuZCA9IHJhbmdlLmVuZDtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCwgZW5kLCBzdGFydCwgZW5kLCBuZXcgU2xpY2UoY29udGVudCwgMCwgMCksIHdyYXBwZXJzLmxlbmd0aCwgdHJ1ZSkpO1xufVxuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKHRyLCBmcm9tLCB0bywgdHlwZSwgYXR0cnMpIHtcbiAgICBpZiAoIXR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHlwZSBnaXZlbiB0byBzZXRCbG9ja1R5cGUgc2hvdWxkIGJlIGEgdGV4dGJsb2NrXCIpO1xuICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgbGV0IGF0dHJzSGVyZSA9IHR5cGVvZiBhdHRycyA9PSBcImZ1bmN0aW9uXCIgPyBhdHRycyhub2RlKSA6IGF0dHJzO1xuICAgICAgICBpZiAobm9kZS5pc1RleHRibG9jayAmJiAhbm9kZS5oYXNNYXJrdXAodHlwZSwgYXR0cnNIZXJlKSAmJlxuICAgICAgICAgICAgY2FuQ2hhbmdlVHlwZSh0ci5kb2MsIHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyksIHR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgY29udmVydE5ld2xpbmVzID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmUgPSB0eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiwgc3VwcG9ydExpbmVicmVhayA9ICEhdHlwZS5jb250ZW50TWF0Y2gubWF0Y2hUeXBlKHR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocHJlICYmICFzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TmV3bGluZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghcHJlICYmIHN1cHBvcnRMaW5lYnJlYWspXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgYWxsIG1hcmt1cCB0aGF0IGlzbid0IGFsbG93ZWQgaW4gdGhlIG5ldyBub2RlIHR5cGUgaXMgY2xlYXJlZFxuICAgICAgICAgICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgcmVwbGFjZUxpbmVicmVha3ModHIsIG5vZGUsIHBvcywgbWFwRnJvbSk7XG4gICAgICAgICAgICBjbGVhckluY29tcGF0aWJsZSh0ciwgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zLCAxKSwgdHlwZSwgdW5kZWZpbmVkLCBjb252ZXJ0TmV3bGluZXMgPT09IG51bGwpO1xuICAgICAgICAgICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgbGV0IHN0YXJ0TSA9IG1hcHBpbmcubWFwKHBvcywgMSksIGVuZE0gPSBtYXBwaW5nLm1hcChwb3MgKyBub2RlLm5vZGVTaXplLCAxKTtcbiAgICAgICAgICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0TSwgZW5kTSwgc3RhcnRNICsgMSwgZW5kTSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzSGVyZSwgbnVsbCwgbm9kZS5tYXJrcykpLCAwLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICAgICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXBsYWNlTmV3bGluZXModHIsIG5vZGUsIHBvcywgbWFwRnJvbSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VOZXdsaW5lcyh0ciwgbm9kZSwgcG9zLCBtYXBGcm9tKSB7XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgb2Zmc2V0KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBtLCBuZXdsaW5lID0gL1xccj9cXG58XFxyL2c7XG4gICAgICAgICAgICB3aGlsZSAobSA9IG5ld2xpbmUuZXhlYyhjaGlsZC50ZXh0KSkge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSkubWFwKHBvcyArIDEgKyBvZmZzZXQgKyBtLmluZGV4KTtcbiAgICAgICAgICAgICAgICB0ci5yZXBsYWNlV2l0aChzdGFydCwgc3RhcnQgKyAxLCBub2RlLnR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50LmNyZWF0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZUxpbmVicmVha3ModHIsIG5vZGUsIHBvcywgbWFwRnJvbSkge1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIG9mZnNldCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PSBjaGlsZC50eXBlLnNjaGVtYS5saW5lYnJlYWtSZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zICsgMSArIG9mZnNldCk7XG4gICAgICAgICAgICB0ci5yZXBsYWNlV2l0aChzdGFydCwgc3RhcnQgKyAxLCBub2RlLnR5cGUuc2NoZW1hLnRleHQoXCJcXG5cIikpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjYW5DaGFuZ2VUeXBlKGRvYywgcG9zLCB0eXBlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICByZXR1cm4gJHBvcy5wYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4ICsgMSwgdHlwZSk7XG59XG4vKipcbkNoYW5nZSB0aGUgdHlwZSwgYXR0cmlidXRlcywgYW5kL29yIG1hcmtzIG9mIHRoZSBub2RlIGF0IGBwb3NgLlxuV2hlbiBgdHlwZWAgaXNuJ3QgZ2l2ZW4sIHRoZSBleGlzdGluZyBub2RlIHR5cGUgaXMgcHJlc2VydmVkLFxuKi9cbmZ1bmN0aW9uIHNldE5vZGVNYXJrdXAodHIsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKSB7XG4gICAgbGV0IG5vZGUgPSB0ci5kb2Mubm9kZUF0KHBvcyk7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIG5vZGUgYXQgZ2l2ZW4gcG9zaXRpb25cIik7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICB0eXBlID0gbm9kZS50eXBlO1xuICAgIGxldCBuZXdOb2RlID0gdHlwZS5jcmVhdGUoYXR0cnMsIG51bGwsIG1hcmtzIHx8IG5vZGUubWFya3MpO1xuICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgcmV0dXJuIHRyLnJlcGxhY2VXaXRoKHBvcywgcG9zICsgbm9kZS5ub2RlU2l6ZSwgbmV3Tm9kZSk7XG4gICAgaWYgKCF0eXBlLnZhbGlkQ29udGVudChub2RlLmNvbnRlbnQpKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgY29udGVudCBmb3Igbm9kZSB0eXBlIFwiICsgdHlwZS5uYW1lKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChwb3MsIHBvcyArIG5vZGUubm9kZVNpemUsIHBvcyArIDEsIHBvcyArIG5vZGUubm9kZVNpemUgLSAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShuZXdOb2RlKSwgMCwgMCksIDEsIHRydWUpKTtcbn1cbi8qKlxuQ2hlY2sgd2hldGhlciBzcGxpdHRpbmcgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGlzIGFsbG93ZWQuXG4qL1xuZnVuY3Rpb24gY2FuU3BsaXQoZG9jLCBwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKSwgYmFzZSA9ICRwb3MuZGVwdGggLSBkZXB0aDtcbiAgICBsZXQgaW5uZXJUeXBlID0gKHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlclt0eXBlc0FmdGVyLmxlbmd0aCAtIDFdKSB8fCAkcG9zLnBhcmVudDtcbiAgICBpZiAoYmFzZSA8IDAgfHwgJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZyB8fFxuICAgICAgICAhJHBvcy5wYXJlbnQuY2FuUmVwbGFjZSgkcG9zLmluZGV4KCksICRwb3MucGFyZW50LmNoaWxkQ291bnQpIHx8XG4gICAgICAgICFpbm5lclR5cGUudHlwZS52YWxpZENvbnRlbnQoJHBvcy5wYXJlbnQuY29udGVudC5jdXRCeUluZGV4KCRwb3MuaW5kZXgoKSwgJHBvcy5wYXJlbnQuY2hpbGRDb3VudCkpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxLCBpID0gZGVwdGggLSAyOyBkID4gYmFzZTsgZC0tLCBpLS0pIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGUoZCksIGluZGV4ID0gJHBvcy5pbmRleChkKTtcbiAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHJlc3QgPSBub2RlLmNvbnRlbnQuY3V0QnlJbmRleChpbmRleCwgbm9kZS5jaGlsZENvdW50KTtcbiAgICAgICAgbGV0IG92ZXJyaWRlQ2hpbGQgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaSArIDFdO1xuICAgICAgICBpZiAob3ZlcnJpZGVDaGlsZClcbiAgICAgICAgICAgIHJlc3QgPSByZXN0LnJlcGxhY2VDaGlsZCgwLCBvdmVycmlkZUNoaWxkLnR5cGUuY3JlYXRlKG92ZXJyaWRlQ2hpbGQuYXR0cnMpKTtcbiAgICAgICAgbGV0IGFmdGVyID0gKHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpXSkgfHwgbm9kZTtcbiAgICAgICAgaWYgKCFub2RlLmNhblJlcGxhY2UoaW5kZXggKyAxLCBub2RlLmNoaWxkQ291bnQpIHx8ICFhZnRlci50eXBlLnZhbGlkQ29udGVudChyZXN0KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleEFmdGVyKGJhc2UpO1xuICAgIGxldCBiYXNlVHlwZSA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlclswXTtcbiAgICByZXR1cm4gJHBvcy5ub2RlKGJhc2UpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgYmFzZVR5cGUgPyBiYXNlVHlwZS50eXBlIDogJHBvcy5ub2RlKGJhc2UgKyAxKS50eXBlKTtcbn1cbmZ1bmN0aW9uIHNwbGl0KHRyLCBwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKSwgYmVmb3JlID0gRnJhZ21lbnQuZW1wdHksIGFmdGVyID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGgsIGUgPSAkcG9zLmRlcHRoIC0gZGVwdGgsIGkgPSBkZXB0aCAtIDE7IGQgPiBlOyBkLS0sIGktLSkge1xuICAgICAgICBiZWZvcmUgPSBGcmFnbWVudC5mcm9tKCRwb3Mubm9kZShkKS5jb3B5KGJlZm9yZSkpO1xuICAgICAgICBsZXQgdHlwZUFmdGVyID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2ldO1xuICAgICAgICBhZnRlciA9IEZyYWdtZW50LmZyb20odHlwZUFmdGVyID8gdHlwZUFmdGVyLnR5cGUuY3JlYXRlKHR5cGVBZnRlci5hdHRycywgYWZ0ZXIpIDogJHBvcy5ub2RlKGQpLmNvcHkoYWZ0ZXIpKTtcbiAgICB9XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAocG9zLCBwb3MsIG5ldyBTbGljZShiZWZvcmUuYXBwZW5kKGFmdGVyKSwgZGVwdGgsIGRlcHRoKSwgdHJ1ZSkpO1xufVxuLyoqXG5UZXN0IHdoZXRoZXIgdGhlIGJsb2NrcyBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gY2FuIGJlXG5qb2luZWQuXG4qL1xuZnVuY3Rpb24gY2FuSm9pbihkb2MsIHBvcykge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKSwgaW5kZXggPSAkcG9zLmluZGV4KCk7XG4gICAgcmV0dXJuIGpvaW5hYmxlKCRwb3Mubm9kZUJlZm9yZSwgJHBvcy5ub2RlQWZ0ZXIpICYmXG4gICAgICAgICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSk7XG59XG5mdW5jdGlvbiBjYW5BcHBlbmRXaXRoU3Vic3RpdHV0ZWRMaW5lYnJlYWtzKGEsIGIpIHtcbiAgICBpZiAoIWIuY29udGVudC5zaXplKVxuICAgICAgICBhLnR5cGUuY29tcGF0aWJsZUNvbnRlbnQoYi50eXBlKTtcbiAgICBsZXQgbWF0Y2ggPSBhLmNvbnRlbnRNYXRjaEF0KGEuY2hpbGRDb3VudCk7XG4gICAgbGV0IHsgbGluZWJyZWFrUmVwbGFjZW1lbnQgfSA9IGEudHlwZS5zY2hlbWE7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBiLmNoaWxkKGkpO1xuICAgICAgICBsZXQgdHlwZSA9IGNoaWxkLnR5cGUgPT0gbGluZWJyZWFrUmVwbGFjZW1lbnQgPyBhLnR5cGUuc2NoZW1hLm5vZGVzLnRleHQgOiBjaGlsZC50eXBlO1xuICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhLnR5cGUuYWxsb3dzTWFya3MoY2hpbGQubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2gudmFsaWRFbmQ7XG59XG5mdW5jdGlvbiBqb2luYWJsZShhLCBiKSB7XG4gICAgcmV0dXJuICEhKGEgJiYgYiAmJiAhYS5pc0xlYWYgJiYgY2FuQXBwZW5kV2l0aFN1YnN0aXR1dGVkTGluZWJyZWFrcyhhLCBiKSk7XG59XG4vKipcbkZpbmQgYW4gYW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBvc2l0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCB0byB0aGVcbmJsb2NrIGJlZm9yZSAob3IgYWZ0ZXIgaWYgYGRpcmAgaXMgcG9zaXRpdmUpLiBSZXR1cm5zIHRoZSBqb2luYWJsZVxucG9pbnQsIGlmIGFueS5cbiovXG5mdW5jdGlvbiBqb2luUG9pbnQoZG9jLCBwb3MsIGRpciA9IC0xKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoOzsgZC0tKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgIGlmIChkID09ICRwb3MuZGVwdGgpIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZUJlZm9yZTtcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlyID4gMCkge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlKGQgKyAxKTtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJlZm9yZSA9ICRwb3Mubm9kZShkKS5tYXliZUNoaWxkKGluZGV4IC0gMSk7XG4gICAgICAgICAgICBhZnRlciA9ICRwb3Mubm9kZShkICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZSAmJiAhYmVmb3JlLmlzVGV4dGJsb2NrICYmIGpvaW5hYmxlKGJlZm9yZSwgYWZ0ZXIpICYmXG4gICAgICAgICAgICAkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKSlcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgIGlmIChkID09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcG9zID0gZGlyIDwgMCA/ICRwb3MuYmVmb3JlKGQpIDogJHBvcy5hZnRlcihkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBqb2luKHRyLCBwb3MsIGRlcHRoKSB7XG4gICAgbGV0IGNvbnZlcnROZXdsaW5lcyA9IG51bGw7XG4gICAgbGV0IHsgbGluZWJyZWFrUmVwbGFjZW1lbnQgfSA9IHRyLmRvYy50eXBlLnNjaGVtYTtcbiAgICBsZXQgJGJlZm9yZSA9IHRyLmRvYy5yZXNvbHZlKHBvcyAtIGRlcHRoKSwgYmVmb3JlVHlwZSA9ICRiZWZvcmUubm9kZSgpLnR5cGU7XG4gICAgaWYgKGxpbmVicmVha1JlcGxhY2VtZW50ICYmIGJlZm9yZVR5cGUuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgcHJlID0gYmVmb3JlVHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCI7XG4gICAgICAgIGxldCBzdXBwb3J0TGluZWJyZWFrID0gISFiZWZvcmVUeXBlLmNvbnRlbnRNYXRjaC5tYXRjaFR5cGUobGluZWJyZWFrUmVwbGFjZW1lbnQpO1xuICAgICAgICBpZiAocHJlICYmICFzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgY29udmVydE5ld2xpbmVzID0gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKCFwcmUgJiYgc3VwcG9ydExpbmVicmVhaylcbiAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IHRydWU7XG4gICAgfVxuICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIGlmIChjb252ZXJ0TmV3bGluZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIGxldCAkYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZShwb3MgKyBkZXB0aCk7XG4gICAgICAgIHJlcGxhY2VMaW5lYnJlYWtzKHRyLCAkYWZ0ZXIubm9kZSgpLCAkYWZ0ZXIuYmVmb3JlKCksIG1hcEZyb20pO1xuICAgIH1cbiAgICBpZiAoYmVmb3JlVHlwZS5pbmxpbmVDb250ZW50KVxuICAgICAgICBjbGVhckluY29tcGF0aWJsZSh0ciwgcG9zICsgZGVwdGggLSAxLCBiZWZvcmVUeXBlLCAkYmVmb3JlLm5vZGUoKS5jb250ZW50TWF0Y2hBdCgkYmVmb3JlLmluZGV4KCkpLCBjb252ZXJ0TmV3bGluZXMgPT0gbnVsbCk7XG4gICAgbGV0IG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLCBzdGFydCA9IG1hcHBpbmcubWFwKHBvcyAtIGRlcHRoKTtcbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChzdGFydCwgbWFwcGluZy5tYXAocG9zICsgZGVwdGgsIC0xKSwgU2xpY2UuZW1wdHksIHRydWUpKTtcbiAgICBpZiAoY29udmVydE5ld2xpbmVzID09PSB0cnVlKSB7XG4gICAgICAgIGxldCAkZnVsbCA9IHRyLmRvYy5yZXNvbHZlKHN0YXJ0KTtcbiAgICAgICAgcmVwbGFjZU5ld2xpbmVzKHRyLCAkZnVsbC5ub2RlKCksICRmdWxsLmJlZm9yZSgpLCB0ci5zdGVwcy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdHI7XG59XG4vKipcblRyeSB0byBmaW5kIGEgcG9pbnQgd2hlcmUgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIGNhbiBiZSBpbnNlcnRlZFxubmVhciBgcG9zYCwgYnkgc2VhcmNoaW5nIHVwIHRoZSBub2RlIGhpZXJhcmNoeSB3aGVuIGBwb3NgIGl0c2VsZlxuaXNuJ3QgYSB2YWxpZCBwbGFjZSBidXQgaXMgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIG5vZGUuIFJldHVyblxubnVsbCBpZiBubyBwb3NpdGlvbiB3YXMgZm91bmQuXG4qL1xuZnVuY3Rpb24gaW5zZXJ0UG9pbnQoZG9jLCBwb3MsIG5vZGVUeXBlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICgkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aCgkcG9zLmluZGV4KCksICRwb3MuaW5kZXgoKSwgbm9kZVR5cGUpKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIGlmICgkcG9zLnBhcmVudE9mZnNldCA9PSAwKVxuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShkKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIG5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5iZWZvcmUoZCArIDEpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIGlmICgkcG9zLnBhcmVudE9mZnNldCA9PSAkcG9zLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXhBZnRlcihkKTtcbiAgICAgICAgICAgIGlmICgkcG9zLm5vZGUoZCkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBub2RlVHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuICRwb3MuYWZ0ZXIoZCArIDEpO1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgJHBvcy5ub2RlKGQpLmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuRmluZHMgYSBwb3NpdGlvbiBhdCBvciBhcm91bmQgdGhlIGdpdmVuIHBvc2l0aW9uIHdoZXJlIHRoZSBnaXZlblxuc2xpY2UgY2FuIGJlIGluc2VydGVkLiBXaWxsIGxvb2sgYXQgcGFyZW50IG5vZGVzJyBuZWFyZXN0IGJvdW5kYXJ5XG5hbmQgdHJ5IHRoZXJlLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiB3YXNuJ3QgZGlyZWN0bHkgYXQgdGhlXG5zdGFydCBvciBlbmQgb2YgdGhhdCBub2RlLiBSZXR1cm5zIG51bGwgd2hlbiBubyBwb3NpdGlvbiB3YXMgZm91bmQuXG4qL1xuZnVuY3Rpb24gZHJvcFBvaW50KGRvYywgcG9zLCBzbGljZSkge1xuICAgIGxldCAkcG9zID0gZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIXNsaWNlLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICBsZXQgY29udGVudCA9IHNsaWNlLmNvbnRlbnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGljZS5vcGVuU3RhcnQ7IGkrKylcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgIGZvciAobGV0IHBhc3MgPSAxOyBwYXNzIDw9IChzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5zaXplID8gMiA6IDEpOyBwYXNzKyspIHtcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgICAgICBsZXQgYmlhcyA9IGQgPT0gJHBvcy5kZXB0aCA/IDAgOiAkcG9zLnBvcyA8PSAoJHBvcy5zdGFydChkICsgMSkgKyAkcG9zLmVuZChkICsgMSkpIC8gMiA/IC0xIDogMTtcbiAgICAgICAgICAgIGxldCBpbnNlcnRQb3MgPSAkcG9zLmluZGV4KGQpICsgKGJpYXMgPiAwID8gMSA6IDApO1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9ICRwb3Mubm9kZShkKSwgZml0cyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSkge1xuICAgICAgICAgICAgICAgIGZpdHMgPSBwYXJlbnQuY2FuUmVwbGFjZShpbnNlcnRQb3MsIGluc2VydFBvcywgY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBpbmcgPSBwYXJlbnQuY29udGVudE1hdGNoQXQoaW5zZXJ0UG9zKS5maW5kV3JhcHBpbmcoY29udGVudC5maXJzdENoaWxkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGZpdHMgPSB3cmFwcGluZyAmJiBwYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5zZXJ0UG9zLCBpbnNlcnRQb3MsIHdyYXBwaW5nWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXRzKVxuICAgICAgICAgICAgICAgIHJldHVybiBiaWFzID09IDAgPyAkcG9zLnBvcyA6IGJpYXMgPCAwID8gJHBvcy5iZWZvcmUoZCArIDEpIDogJHBvcy5hZnRlcihkICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxu4oCYRml04oCZIGEgc2xpY2UgaW50byBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcHJvZHVjaW5nIGFcbltzdGVwXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXApIHRoYXQgaW5zZXJ0cyBpdC4gV2lsbCByZXR1cm4gbnVsbCBpZlxudGhlcmUncyBubyBtZWFuaW5nZnVsIHdheSB0byBpbnNlcnQgdGhlIHNsaWNlIGhlcmUsIG9yIGluc2VydGluZyBpdFxud291bGQgYmUgYSBuby1vcCAoYW4gZW1wdHkgc2xpY2Ugb3ZlciBhbiBlbXB0eSByYW5nZSkuXG4qL1xuZnVuY3Rpb24gcmVwbGFjZVN0ZXAoZG9jLCBmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICBpZiAoZnJvbSA9PSB0byAmJiAhc2xpY2Uuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0ICRmcm9tID0gZG9jLnJlc29sdmUoZnJvbSksICR0byA9IGRvYy5yZXNvbHZlKHRvKTtcbiAgICAvLyBPcHRpbWl6YXRpb24gLS0gYXZvaWQgd29yayBpZiBpdCdzIG9idmlvdXMgdGhhdCBpdCdzIG5vdCBuZWVkZWQuXG4gICAgaWYgKGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpKVxuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGZyb20sIHRvLCBzbGljZSk7XG4gICAgcmV0dXJuIG5ldyBGaXR0ZXIoJGZyb20sICR0bywgc2xpY2UpLmZpdCgpO1xufVxuZnVuY3Rpb24gZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkge1xuICAgIHJldHVybiAhc2xpY2Uub3BlblN0YXJ0ICYmICFzbGljZS5vcGVuRW5kICYmICRmcm9tLnN0YXJ0KCkgPT0gJHRvLnN0YXJ0KCkgJiZcbiAgICAgICAgJGZyb20ucGFyZW50LmNhblJlcGxhY2UoJGZyb20uaW5kZXgoKSwgJHRvLmluZGV4KCksIHNsaWNlLmNvbnRlbnQpO1xufVxuLy8gQWxnb3JpdGhtIGZvciAncGxhY2luZycgdGhlIGVsZW1lbnRzIG9mIGEgc2xpY2UgaW50byBhIGdhcDpcbi8vXG4vLyBXZSBjb25zaWRlciB0aGUgY29udGVudCBvZiBlYWNoIG5vZGUgdGhhdCBpcyBvcGVuIHRvIHRoZSBsZWZ0IHRvIGJlXG4vLyBpbmRlcGVuZGVudGx5IHBsYWNlYWJsZS4gSS5lLiBpbiA8cChcImZvb1wiKSwgcChcImJhclwiKT4sIHdoZW4gdGhlXG4vLyBwYXJhZ3JhcGggb24gdGhlIGxlZnQgaXMgb3BlbiwgXCJmb29cIiBjYW4gYmUgcGxhY2VkIChzb21ld2hlcmUgb25cbi8vIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJlcGxhY2VtZW50IGdhcCkgaW5kZXBlbmRlbnRseSBmcm9tIHAoXCJiYXJcIikuXG4vL1xuLy8gVGhpcyBjbGFzcyB0cmFja3MgdGhlIHN0YXRlIG9mIHRoZSBwbGFjZW1lbnQgcHJvZ3Jlc3MgaW4gdGhlXG4vLyBmb2xsb3dpbmcgcHJvcGVydGllczpcbi8vXG4vLyAgLSBgZnJvbnRpZXJgIGhvbGRzIGEgc3RhY2sgb2YgYHt0eXBlLCBtYXRjaH1gIG9iamVjdHMgdGhhdFxuLy8gICAgcmVwcmVzZW50IHRoZSBvcGVuIHNpZGUgb2YgdGhlIHJlcGxhY2VtZW50LiBJdCBzdGFydHMgYXRcbi8vICAgIGAkZnJvbWAsIHRoZW4gbW92ZXMgZm9yd2FyZCBhcyBjb250ZW50IGlzIHBsYWNlZCwgYW5kIGlzIGZpbmFsbHlcbi8vICAgIHJlY29uY2lsZWQgd2l0aCBgJHRvYC5cbi8vXG4vLyAgLSBgdW5wbGFjZWRgIGlzIGEgc2xpY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50IHRoYXQgaGFzbid0XG4vLyAgICBiZWVuIHBsYWNlZCB5ZXQuXG4vL1xuLy8gIC0gYHBsYWNlZGAgaXMgYSBmcmFnbWVudCBvZiBwbGFjZWQgY29udGVudC4gSXRzIG9wZW4tc3RhcnQgdmFsdWVcbi8vICAgIGlzIGltcGxpY2l0IGluIGAkZnJvbWAsIGFuZCBpdHMgb3Blbi1lbmQgdmFsdWUgaW4gYGZyb250aWVyYC5cbmNsYXNzIEZpdHRlciB7XG4gICAgY29uc3RydWN0b3IoJGZyb20sICR0bywgdW5wbGFjZWQpIHtcbiAgICAgICAgdGhpcy4kZnJvbSA9ICRmcm9tO1xuICAgICAgICB0aGlzLiR0byA9ICR0bztcbiAgICAgICAgdGhpcy51bnBsYWNlZCA9IHVucGxhY2VkO1xuICAgICAgICB0aGlzLmZyb250aWVyID0gW107XG4gICAgICAgIHRoaXMucGxhY2VkID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9ICRmcm9tLmRlcHRoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gJGZyb20ubm9kZShpKTtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRpZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIG1hdGNoOiBub2RlLmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4QWZ0ZXIoaSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gJGZyb20uZGVwdGg7IGkgPiAwOyBpLS0pXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShpKS5jb3B5KHRoaXMucGxhY2VkKSk7XG4gICAgfVxuICAgIGdldCBkZXB0aCgpIHsgcmV0dXJuIHRoaXMuZnJvbnRpZXIubGVuZ3RoIC0gMTsgfVxuICAgIGZpdCgpIHtcbiAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGVyZSdzIHVucGxhY2VkIGNvbnRlbnQsIHRyeSB0byBwbGFjZSBzb21lIG9mIGl0LlxuICAgICAgICAvLyBJZiB0aGF0IGZhaWxzLCBlaXRoZXIgaW5jcmVhc2UgdGhlIG9wZW4gc2NvcmUgb2YgdGhlIHVucGxhY2VkXG4gICAgICAgIC8vIHNsaWNlLCBvciBkcm9wIG5vZGVzIGZyb20gaXQsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICAgICAgd2hpbGUgKHRoaXMudW5wbGFjZWQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGZpdCA9IHRoaXMuZmluZEZpdHRhYmxlKCk7XG4gICAgICAgICAgICBpZiAoZml0KVxuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VOb2RlcyhmaXQpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMub3Blbk1vcmUoKSB8fCB0aGlzLmRyb3BOb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiB0aGVyZSdzIGlubGluZSBjb250ZW50IGRpcmVjdGx5IGFmdGVyIHRoZSBmcm9udGllciBfYW5kX1xuICAgICAgICAvLyBkaXJlY3RseSBhZnRlciBgdGhpcy4kdG9gLCB3ZSBtdXN0IGdlbmVyYXRlIGEgYFJlcGxhY2VBcm91bmRgXG4gICAgICAgIC8vIHN0ZXAgdGhhdCBwdWxscyB0aGF0IGNvbnRlbnQgaW50byB0aGUgbm9kZSBhZnRlciB0aGUgZnJvbnRpZXIuXG4gICAgICAgIC8vIFRoYXQgbWVhbnMgdGhlIGZpdHRpbmcgbXVzdCBiZSBkb25lIHRvIHRoZSBlbmQgb2YgdGhlIHRleHRibG9ja1xuICAgICAgICAvLyBub2RlIGFmdGVyIGB0aGlzLiR0b2AsIG5vdCBgdGhpcy4kdG9gIGl0c2VsZi5cbiAgICAgICAgbGV0IG1vdmVJbmxpbmUgPSB0aGlzLm11c3RNb3ZlSW5saW5lKCksIHBsYWNlZFNpemUgPSB0aGlzLnBsYWNlZC5zaXplIC0gdGhpcy5kZXB0aCAtIHRoaXMuJGZyb20uZGVwdGg7XG4gICAgICAgIGxldCAkZnJvbSA9IHRoaXMuJGZyb20sICR0byA9IHRoaXMuY2xvc2UobW92ZUlubGluZSA8IDAgPyB0aGlzLiR0byA6ICRmcm9tLmRvYy5yZXNvbHZlKG1vdmVJbmxpbmUpKTtcbiAgICAgICAgaWYgKCEkdG8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSWYgY2xvc2luZyB0byBgJHRvYCBzdWNjZWVkZWQsIGNyZWF0ZSBhIHN0ZXBcbiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnBsYWNlZCwgb3BlblN0YXJ0ID0gJGZyb20uZGVwdGgsIG9wZW5FbmQgPSAkdG8uZGVwdGg7XG4gICAgICAgIHdoaWxlIChvcGVuU3RhcnQgJiYgb3BlbkVuZCAmJiBjb250ZW50LmNoaWxkQ291bnQgPT0gMSkgeyAvLyBOb3JtYWxpemUgYnkgZHJvcHBpbmcgb3BlbiBwYXJlbnQgbm9kZXNcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmZpcnN0Q2hpbGQuY29udGVudDtcbiAgICAgICAgICAgIG9wZW5TdGFydC0tO1xuICAgICAgICAgICAgb3BlbkVuZC0tO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzbGljZSA9IG5ldyBTbGljZShjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgICAgICBpZiAobW92ZUlubGluZSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkZnJvbS5wb3MsIG1vdmVJbmxpbmUsIHRoaXMuJHRvLnBvcywgdGhpcy4kdG8uZW5kKCksIHNsaWNlLCBwbGFjZWRTaXplKTtcbiAgICAgICAgaWYgKHNsaWNlLnNpemUgfHwgJGZyb20ucG9zICE9IHRoaXMuJHRvLnBvcykgLy8gRG9uJ3QgZ2VuZXJhdGUgbm8tb3Agc3RlcHNcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoJGZyb20ucG9zLCAkdG8ucG9zLCBzbGljZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBGaW5kIGEgcG9zaXRpb24gb24gdGhlIHN0YXJ0IHNwaW5lIG9mIGB0aGlzLnVucGxhY2VkYCB0aGF0IGhhc1xuICAgIC8vIGNvbnRlbnQgdGhhdCBjYW4gYmUgbW92ZWQgc29tZXdoZXJlIG9uIHRoZSBmcm9udGllci4gUmV0dXJucyB0d29cbiAgICAvLyBkZXB0aHMsIG9uZSBmb3IgdGhlIHNsaWNlIGFuZCBvbmUgZm9yIHRoZSBmcm9udGllci5cbiAgICBmaW5kRml0dGFibGUoKSB7XG4gICAgICAgIGxldCBzdGFydERlcHRoID0gdGhpcy51bnBsYWNlZC5vcGVuU3RhcnQ7XG4gICAgICAgIGZvciAobGV0IGN1ciA9IHRoaXMudW5wbGFjZWQuY29udGVudCwgZCA9IDAsIG9wZW5FbmQgPSB0aGlzLnVucGxhY2VkLm9wZW5FbmQ7IGQgPCBzdGFydERlcHRoOyBkKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gY3VyLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoY3VyLmNoaWxkQ291bnQgPiAxKVxuICAgICAgICAgICAgICAgIG9wZW5FbmQgPSAwO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZyAmJiBvcGVuRW5kIDw9IGQpIHtcbiAgICAgICAgICAgICAgICBzdGFydERlcHRoID0gZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1ciA9IG5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHRyeSB3cmFwcGluZyBub2RlcyAocGFzcyAyKSBhZnRlciBmaW5kaW5nIGEgcGxhY2Ugd2l0aG91dFxuICAgICAgICAvLyB3cmFwcGluZyBmYWlsZWQuXG4gICAgICAgIGZvciAobGV0IHBhc3MgPSAxOyBwYXNzIDw9IDI7IHBhc3MrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgc2xpY2VEZXB0aCA9IHBhc3MgPT0gMSA/IHN0YXJ0RGVwdGggOiB0aGlzLnVucGxhY2VkLm9wZW5TdGFydDsgc2xpY2VEZXB0aCA+PSAwOyBzbGljZURlcHRoLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJhZ21lbnQsIHBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlRGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gY29udGVudEF0KHRoaXMudW5wbGFjZWQuY29udGVudCwgc2xpY2VEZXB0aCAtIDEpLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gcGFyZW50LmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMudW5wbGFjZWQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmcm9udGllckRlcHRoID0gdGhpcy5kZXB0aDsgZnJvbnRpZXJEZXB0aCA+PSAwOyBmcm9udGllckRlcHRoLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbWF0Y2ggfSA9IHRoaXMuZnJvbnRpZXJbZnJvbnRpZXJEZXB0aF0sIHdyYXAsIGluamVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHBhc3MgMSwgaWYgdGhlIG5leHQgbm9kZSBtYXRjaGVzLCBvciB0aGVyZSBpcyBubyBuZXh0XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgYnV0IHRoZSBwYXJlbnRzIGxvb2sgY29tcGF0aWJsZSwgd2UndmUgZm91bmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSAmJiAoZmlyc3QgPyBtYXRjaC5tYXRjaFR5cGUoZmlyc3QudHlwZSkgfHwgKGluamVjdCA9IG1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZnJvbShmaXJzdCksIGZhbHNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyZW50ICYmIHR5cGUuY29tcGF0aWJsZUNvbnRlbnQocGFyZW50LnR5cGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgaW5qZWN0IH07XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHBhc3MgMiwgbG9vayBmb3IgYSBzZXQgb2Ygd3JhcHBpbmcgbm9kZXMgdGhhdCBtYWtlXG4gICAgICAgICAgICAgICAgICAgIC8vIGBmaXJzdGAgZml0IGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhc3MgPT0gMiAmJiBmaXJzdCAmJiAod3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhmaXJzdC50eXBlKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzbGljZURlcHRoLCBmcm9udGllckRlcHRoLCBwYXJlbnQsIHdyYXAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29udGludWUgbG9va2luZyBmdXJ0aGVyIHVwIGlmIHRoZSBwYXJlbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBmaXQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBtYXRjaC5tYXRjaFR5cGUocGFyZW50LnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG9wZW5Nb3JlKCkge1xuICAgICAgICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHRoaXMudW5wbGFjZWQ7XG4gICAgICAgIGxldCBpbm5lciA9IGNvbnRlbnRBdChjb250ZW50LCBvcGVuU3RhcnQpO1xuICAgICAgICBpZiAoIWlubmVyLmNoaWxkQ291bnQgfHwgaW5uZXIuZmlyc3RDaGlsZC5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSBuZXcgU2xpY2UoY29udGVudCwgb3BlblN0YXJ0ICsgMSwgTWF0aC5tYXgob3BlbkVuZCwgaW5uZXIuc2l6ZSArIG9wZW5TdGFydCA+PSBjb250ZW50LnNpemUgLSBvcGVuRW5kID8gb3BlblN0YXJ0ICsgMSA6IDApKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRyb3BOb2RlKCkge1xuICAgICAgICBsZXQgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHRoaXMudW5wbGFjZWQ7XG4gICAgICAgIGxldCBpbm5lciA9IGNvbnRlbnRBdChjb250ZW50LCBvcGVuU3RhcnQpO1xuICAgICAgICBpZiAoaW5uZXIuY2hpbGRDb3VudCA8PSAxICYmIG9wZW5TdGFydCA+IDApIHtcbiAgICAgICAgICAgIGxldCBvcGVuQXRFbmQgPSBjb250ZW50LnNpemUgLSBvcGVuU3RhcnQgPD0gb3BlblN0YXJ0ICsgaW5uZXIuc2l6ZTtcbiAgICAgICAgICAgIHRoaXMudW5wbGFjZWQgPSBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChjb250ZW50LCBvcGVuU3RhcnQgLSAxLCAxKSwgb3BlblN0YXJ0IC0gMSwgb3BlbkF0RW5kID8gb3BlblN0YXJ0IC0gMSA6IG9wZW5FbmQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KGNvbnRlbnQsIG9wZW5TdGFydCwgMSksIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTW92ZSBjb250ZW50IGZyb20gdGhlIHVucGxhY2VkIHNsaWNlIGF0IGBzbGljZURlcHRoYCB0byB0aGVcbiAgICAvLyBmcm9udGllciBub2RlIGF0IGBmcm9udGllckRlcHRoYC4gQ2xvc2UgdGhhdCBmcm9udGllciBub2RlIHdoZW5cbiAgICAvLyBhcHBsaWNhYmxlLlxuICAgIHBsYWNlTm9kZXMoeyBzbGljZURlcHRoLCBmcm9udGllckRlcHRoLCBwYXJlbnQsIGluamVjdCwgd3JhcCB9KSB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRlcHRoID4gZnJvbnRpZXJEZXB0aClcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgaWYgKHdyYXApXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRnJvbnRpZXJOb2RlKHdyYXBbaV0pO1xuICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnVucGxhY2VkLCBmcmFnbWVudCA9IHBhcmVudCA/IHBhcmVudC5jb250ZW50IDogc2xpY2UuY29udGVudDtcbiAgICAgICAgbGV0IG9wZW5TdGFydCA9IHNsaWNlLm9wZW5TdGFydCAtIHNsaWNlRGVwdGg7XG4gICAgICAgIGxldCB0YWtlbiA9IDAsIGFkZCA9IFtdO1xuICAgICAgICBsZXQgeyBtYXRjaCwgdHlwZSB9ID0gdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXTtcbiAgICAgICAgaWYgKGluamVjdCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3QuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICAgICAgICAgIGFkZC5wdXNoKGluamVjdC5jaGlsZChpKSk7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoRnJhZ21lbnQoaW5qZWN0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wdXRlcyB0aGUgYW1vdW50IG9mIChlbmQpIG9wZW4gbm9kZXMgYXQgdGhlIGVuZCBvZiB0aGVcbiAgICAgICAgLy8gZnJhZ21lbnQuIFdoZW4gMCwgdGhlIHBhcmVudCBpcyBvcGVuLCBidXQgbm8gbW9yZS4gV2hlblxuICAgICAgICAvLyBuZWdhdGl2ZSwgbm90aGluZyBpcyBvcGVuLlxuICAgICAgICBsZXQgb3BlbkVuZENvdW50ID0gKGZyYWdtZW50LnNpemUgKyBzbGljZURlcHRoKSAtIChzbGljZS5jb250ZW50LnNpemUgLSBzbGljZS5vcGVuRW5kKTtcbiAgICAgICAgLy8gU2NhbiBvdmVyIHRoZSBmcmFnbWVudCwgZml0dGluZyBhcyBtYW55IGNoaWxkIG5vZGVzIGFzXG4gICAgICAgIC8vIHBvc3NpYmxlLlxuICAgICAgICB3aGlsZSAodGFrZW4gPCBmcmFnbWVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZyYWdtZW50LmNoaWxkKHRha2VuKSwgbWF0Y2hlcyA9IG1hdGNoLm1hdGNoVHlwZShuZXh0LnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdGFrZW4rKztcbiAgICAgICAgICAgIGlmICh0YWtlbiA+IDEgfHwgb3BlblN0YXJ0ID09IDAgfHwgbmV4dC5jb250ZW50LnNpemUpIHsgLy8gRHJvcCBlbXB0eSBvcGVuIG5vZGVzXG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGVzO1xuICAgICAgICAgICAgICAgIGFkZC5wdXNoKGNsb3NlTm9kZVN0YXJ0KG5leHQubWFyayh0eXBlLmFsbG93ZWRNYXJrcyhuZXh0Lm1hcmtzKSksIHRha2VuID09IDEgPyBvcGVuU3RhcnQgOiAwLCB0YWtlbiA9PSBmcmFnbWVudC5jaGlsZENvdW50ID8gb3BlbkVuZENvdW50IDogLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdG9FbmQgPSB0YWtlbiA9PSBmcmFnbWVudC5jaGlsZENvdW50O1xuICAgICAgICBpZiAoIXRvRW5kKVxuICAgICAgICAgICAgb3BlbkVuZENvdW50ID0gLTE7XG4gICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgZnJvbnRpZXJEZXB0aCwgRnJhZ21lbnQuZnJvbShhZGQpKTtcbiAgICAgICAgdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXS5tYXRjaCA9IG1hdGNoO1xuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IHR5cGVzIG1hdGNoLCBhbmQgdGhlIGVudGlyZSBub2RlIHdhcyBtb3ZlZCwgYW5kXG4gICAgICAgIC8vIGl0J3Mgbm90IG9wZW4sIGNsb3NlIHRoaXMgZnJvbnRpZXIgbm9kZSByaWdodCBhd2F5LlxuICAgICAgICBpZiAodG9FbmQgJiYgb3BlbkVuZENvdW50IDwgMCAmJiBwYXJlbnQgJiYgcGFyZW50LnR5cGUgPT0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXS50eXBlICYmIHRoaXMuZnJvbnRpZXIubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgLy8gQWRkIG5ldyBmcm9udGllciBub2RlcyBmb3IgYW55IG9wZW4gbm9kZXMgYXQgdGhlIGVuZC5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGN1ciA9IGZyYWdtZW50OyBpIDwgb3BlbkVuZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gY3VyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRpZXIucHVzaCh7IHR5cGU6IG5vZGUudHlwZSwgbWF0Y2g6IG5vZGUuY29udGVudE1hdGNoQXQobm9kZS5jaGlsZENvdW50KSB9KTtcbiAgICAgICAgICAgIGN1ciA9IG5vZGUuY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgYHRoaXMudW5wbGFjZWRgLiBEcm9wIHRoZSBlbnRpcmUgbm9kZSBmcm9tIHdoaWNoIHdlXG4gICAgICAgIC8vIHBsYWNlZCBpdCB3ZSBnb3QgdG8gaXRzIGVuZCwgb3RoZXJ3aXNlIGp1c3QgZHJvcCB0aGUgcGxhY2VkXG4gICAgICAgIC8vIG5vZGVzLlxuICAgICAgICB0aGlzLnVucGxhY2VkID0gIXRvRW5kID8gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoc2xpY2UuY29udGVudCwgc2xpY2VEZXB0aCwgdGFrZW4pLCBzbGljZS5vcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpXG4gICAgICAgICAgICA6IHNsaWNlRGVwdGggPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChzbGljZS5jb250ZW50LCBzbGljZURlcHRoIC0gMSwgMSksIHNsaWNlRGVwdGggLSAxLCBvcGVuRW5kQ291bnQgPCAwID8gc2xpY2Uub3BlbkVuZCA6IHNsaWNlRGVwdGggLSAxKTtcbiAgICB9XG4gICAgbXVzdE1vdmVJbmxpbmUoKSB7XG4gICAgICAgIGlmICghdGhpcy4kdG8ucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXSwgbGV2ZWw7XG4gICAgICAgIGlmICghdG9wLnR5cGUuaXNUZXh0YmxvY2sgfHwgIWNvbnRlbnRBZnRlckZpdHModGhpcy4kdG8sIHRoaXMuJHRvLmRlcHRoLCB0b3AudHlwZSwgdG9wLm1hdGNoLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICh0aGlzLiR0by5kZXB0aCA9PSB0aGlzLmRlcHRoICYmIChsZXZlbCA9IHRoaXMuZmluZENsb3NlTGV2ZWwodGhpcy4kdG8pKSAmJiBsZXZlbC5kZXB0aCA9PSB0aGlzLmRlcHRoKSlcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgbGV0IHsgZGVwdGggfSA9IHRoaXMuJHRvLCBhZnRlciA9IHRoaXMuJHRvLmFmdGVyKGRlcHRoKTtcbiAgICAgICAgd2hpbGUgKGRlcHRoID4gMSAmJiBhZnRlciA9PSB0aGlzLiR0by5lbmQoLS1kZXB0aCkpXG4gICAgICAgICAgICArK2FmdGVyO1xuICAgICAgICByZXR1cm4gYWZ0ZXI7XG4gICAgfVxuICAgIGZpbmRDbG9zZUxldmVsKCR0bykge1xuICAgICAgICBzY2FuOiBmb3IgKGxldCBpID0gTWF0aC5taW4odGhpcy5kZXB0aCwgJHRvLmRlcHRoKTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2ldO1xuICAgICAgICAgICAgbGV0IGRyb3BJbm5lciA9IGkgPCAkdG8uZGVwdGggJiYgJHRvLmVuZChpICsgMSkgPT0gJHRvLnBvcyArICgkdG8uZGVwdGggLSAoaSArIDEpKTtcbiAgICAgICAgICAgIGxldCBmaXQgPSBjb250ZW50QWZ0ZXJGaXRzKCR0bywgaSwgdHlwZSwgbWF0Y2gsIGRyb3BJbm5lcik7XG4gICAgICAgICAgICBpZiAoIWZpdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGQgPSBpIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBtYXRjaCwgdHlwZSB9ID0gdGhpcy5mcm9udGllcltkXTtcbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IGNvbnRlbnRBZnRlckZpdHMoJHRvLCBkLCB0eXBlLCBtYXRjaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXMuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgc2NhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRlcHRoOiBpLCBmaXQsIG1vdmU6IGRyb3BJbm5lciA/ICR0by5kb2MucmVzb2x2ZSgkdG8uYWZ0ZXIoaSArIDEpKSA6ICR0byB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsb3NlKCR0bykge1xuICAgICAgICBsZXQgY2xvc2UgPSB0aGlzLmZpbmRDbG9zZUxldmVsKCR0byk7XG4gICAgICAgIGlmICghY2xvc2UpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVwdGggPiBjbG9zZS5kZXB0aClcbiAgICAgICAgICAgIHRoaXMuY2xvc2VGcm9udGllck5vZGUoKTtcbiAgICAgICAgaWYgKGNsb3NlLmZpdC5jaGlsZENvdW50KVxuICAgICAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCBjbG9zZS5kZXB0aCwgY2xvc2UuZml0KTtcbiAgICAgICAgJHRvID0gY2xvc2UubW92ZTtcbiAgICAgICAgZm9yIChsZXQgZCA9IGNsb3NlLmRlcHRoICsgMTsgZCA8PSAkdG8uZGVwdGg7IGQrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkdG8ubm9kZShkKSwgYWRkID0gbm9kZS50eXBlLmNvbnRlbnRNYXRjaC5maWxsQmVmb3JlKG5vZGUuY29udGVudCwgdHJ1ZSwgJHRvLmluZGV4KGQpKTtcbiAgICAgICAgICAgIHRoaXMub3BlbkZyb250aWVyTm9kZShub2RlLnR5cGUsIG5vZGUuYXR0cnMsIGFkZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICR0bztcbiAgICB9XG4gICAgb3BlbkZyb250aWVyTm9kZSh0eXBlLCBhdHRycyA9IG51bGwsIGNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMuZnJvbnRpZXJbdGhpcy5kZXB0aF07XG4gICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaC5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIHRoaXMucGxhY2VkID0gYWRkVG9GcmFnbWVudCh0aGlzLnBsYWNlZCwgdGhpcy5kZXB0aCwgRnJhZ21lbnQuZnJvbSh0eXBlLmNyZWF0ZShhdHRycywgY29udGVudCkpKTtcbiAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHsgdHlwZSwgbWF0Y2g6IHR5cGUuY29udGVudE1hdGNoIH0pO1xuICAgIH1cbiAgICBjbG9zZUZyb250aWVyTm9kZSgpIHtcbiAgICAgICAgbGV0IG9wZW4gPSB0aGlzLmZyb250aWVyLnBvcCgpO1xuICAgICAgICBsZXQgYWRkID0gb3Blbi5tYXRjaC5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKTtcbiAgICAgICAgaWYgKGFkZC5jaGlsZENvdW50KVxuICAgICAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCB0aGlzLmZyb250aWVyLmxlbmd0aCwgYWRkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkcm9wRnJvbUZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgY291bnQpIHtcbiAgICBpZiAoZGVwdGggPT0gMClcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LmN1dEJ5SW5kZXgoY291bnQsIGZyYWdtZW50LmNoaWxkQ291bnQpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoMCwgZnJhZ21lbnQuZmlyc3RDaGlsZC5jb3B5KGRyb3BGcm9tRnJhZ21lbnQoZnJhZ21lbnQuZmlyc3RDaGlsZC5jb250ZW50LCBkZXB0aCAtIDEsIGNvdW50KSkpO1xufVxuZnVuY3Rpb24gYWRkVG9GcmFnbWVudChmcmFnbWVudCwgZGVwdGgsIGNvbnRlbnQpIHtcbiAgICBpZiAoZGVwdGggPT0gMClcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50LmFwcGVuZChjb250ZW50KTtcbiAgICByZXR1cm4gZnJhZ21lbnQucmVwbGFjZUNoaWxkKGZyYWdtZW50LmNoaWxkQ291bnQgLSAxLCBmcmFnbWVudC5sYXN0Q2hpbGQuY29weShhZGRUb0ZyYWdtZW50KGZyYWdtZW50Lmxhc3RDaGlsZC5jb250ZW50LCBkZXB0aCAtIDEsIGNvbnRlbnQpKSk7XG59XG5mdW5jdGlvbiBjb250ZW50QXQoZnJhZ21lbnQsIGRlcHRoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQuY29udGVudDtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiBjbG9zZU5vZGVTdGFydChub2RlLCBvcGVuU3RhcnQsIG9wZW5FbmQpIHtcbiAgICBpZiAob3BlblN0YXJ0IDw9IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChvcGVuU3RhcnQgPiAxKVxuICAgICAgICBmcmFnID0gZnJhZy5yZXBsYWNlQ2hpbGQoMCwgY2xvc2VOb2RlU3RhcnQoZnJhZy5maXJzdENoaWxkLCBvcGVuU3RhcnQgLSAxLCBmcmFnLmNoaWxkQ291bnQgPT0gMSA/IG9wZW5FbmQgLSAxIDogMCkpO1xuICAgIGlmIChvcGVuU3RhcnQgPiAwKSB7XG4gICAgICAgIGZyYWcgPSBub2RlLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUoZnJhZykuYXBwZW5kKGZyYWcpO1xuICAgICAgICBpZiAob3BlbkVuZCA8PSAwKVxuICAgICAgICAgICAgZnJhZyA9IGZyYWcuYXBwZW5kKG5vZGUudHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChmcmFnKS5maWxsQmVmb3JlKEZyYWdtZW50LmVtcHR5LCB0cnVlKSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlLmNvcHkoZnJhZyk7XG59XG5mdW5jdGlvbiBjb250ZW50QWZ0ZXJGaXRzKCR0bywgZGVwdGgsIHR5cGUsIG1hdGNoLCBvcGVuKSB7XG4gICAgbGV0IG5vZGUgPSAkdG8ubm9kZShkZXB0aCksIGluZGV4ID0gb3BlbiA/ICR0by5pbmRleEFmdGVyKGRlcHRoKSA6ICR0by5pbmRleChkZXB0aCk7XG4gICAgaWYgKGluZGV4ID09IG5vZGUuY2hpbGRDb3VudCAmJiAhdHlwZS5jb21wYXRpYmxlQ29udGVudChub2RlLnR5cGUpKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZml0ID0gbWF0Y2guZmlsbEJlZm9yZShub2RlLmNvbnRlbnQsIHRydWUsIGluZGV4KTtcbiAgICByZXR1cm4gZml0ICYmICFpbnZhbGlkTWFya3ModHlwZSwgbm9kZS5jb250ZW50LCBpbmRleCkgPyBmaXQgOiBudWxsO1xufVxuZnVuY3Rpb24gaW52YWxpZE1hcmtzKHR5cGUsIGZyYWdtZW50LCBzdGFydCkge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGZyYWdtZW50LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgaWYgKCF0eXBlLmFsbG93c01hcmtzKGZyYWdtZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGRlZmluZXNDb250ZW50KHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZS5zcGVjLmRlZmluaW5nIHx8IHR5cGUuc3BlYy5kZWZpbmluZ0ZvckNvbnRlbnQ7XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2UodHIsIGZyb20sIHRvLCBzbGljZSkge1xuICAgIGlmICghc2xpY2Uuc2l6ZSlcbiAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gdHIuZG9jLnJlc29sdmUodG8pO1xuICAgIGlmIChmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSlcbiAgICAgICAgcmV0dXJuIHRyLnN0ZXAobmV3IFJlcGxhY2VTdGVwKGZyb20sIHRvLCBzbGljZSkpO1xuICAgIGxldCB0YXJnZXREZXB0aHMgPSBjb3ZlcmVkRGVwdGhzKCRmcm9tLCB0ci5kb2MucmVzb2x2ZSh0bykpO1xuICAgIC8vIENhbid0IHJlcGxhY2UgdGhlIHdob2xlIGRvY3VtZW50LCBzbyByZW1vdmUgMCBpZiBpdCdzIHByZXNlbnRcbiAgICBpZiAodGFyZ2V0RGVwdGhzW3RhcmdldERlcHRocy5sZW5ndGggLSAxXSA9PSAwKVxuICAgICAgICB0YXJnZXREZXB0aHMucG9wKCk7XG4gICAgLy8gTmVnYXRpdmUgbnVtYmVycyByZXByZXNlbnQgbm90IGV4cGFuc2lvbiBvdmVyIHRoZSB3aG9sZSBub2RlIGF0XG4gICAgLy8gdGhhdCBkZXB0aCwgYnV0IHJlcGxhY2luZyBmcm9tICRmcm9tLmJlZm9yZSgtRCkgdG8gJHRvLnBvcy5cbiAgICBsZXQgcHJlZmVycmVkVGFyZ2V0ID0gLSgkZnJvbS5kZXB0aCArIDEpO1xuICAgIHRhcmdldERlcHRocy51bnNoaWZ0KHByZWZlcnJlZFRhcmdldCk7XG4gICAgLy8gVGhpcyBsb29wIHBpY2tzIGEgcHJlZmVycmVkIHRhcmdldCBkZXB0aCwgaWYgb25lIG9mIHRoZSBjb3ZlcmluZ1xuICAgIC8vIGRlcHRocyBpcyBub3Qgb3V0c2lkZSBvZiBhIGRlZmluaW5nIG5vZGUsIGFuZCBhZGRzIG5lZ2F0aXZlXG4gICAgLy8gZGVwdGhzIGZvciBhbnkgZGVwdGggdGhhdCBoYXMgJGZyb20gYXQgaXRzIHN0YXJ0IGFuZCBkb2VzIG5vdFxuICAgIC8vIGNyb3NzIGEgZGVmaW5pbmcgbm9kZS5cbiAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGgsIHBvcyA9ICRmcm9tLnBvcyAtIDE7IGQgPiAwOyBkLS0sIHBvcy0tKSB7XG4gICAgICAgIGxldCBzcGVjID0gJGZyb20ubm9kZShkKS50eXBlLnNwZWM7XG4gICAgICAgIGlmIChzcGVjLmRlZmluaW5nIHx8IHNwZWMuZGVmaW5pbmdBc0NvbnRleHQgfHwgc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHRhcmdldERlcHRocy5pbmRleE9mKGQpID4gLTEpXG4gICAgICAgICAgICBwcmVmZXJyZWRUYXJnZXQgPSBkO1xuICAgICAgICBlbHNlIGlmICgkZnJvbS5iZWZvcmUoZCkgPT0gcG9zKVxuICAgICAgICAgICAgdGFyZ2V0RGVwdGhzLnNwbGljZSgxLCAwLCAtZCk7XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaXQgZWFjaCBwb3NzaWJsZSBkZXB0aCBvZiB0aGUgc2xpY2UgaW50byBlYWNoIHBvc3NpYmxlXG4gICAgLy8gdGFyZ2V0IGRlcHRoLCBzdGFydGluZyB3aXRoIHRoZSBwcmVmZXJyZWQgZGVwdGhzLlxuICAgIGxldCBwcmVmZXJyZWRUYXJnZXRJbmRleCA9IHRhcmdldERlcHRocy5pbmRleE9mKHByZWZlcnJlZFRhcmdldCk7XG4gICAgbGV0IGxlZnROb2RlcyA9IFtdLCBwcmVmZXJyZWREZXB0aCA9IHNsaWNlLm9wZW5TdGFydDtcbiAgICBmb3IgKGxldCBjb250ZW50ID0gc2xpY2UuY29udGVudCwgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGxlZnROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoaSA9PSBzbGljZS5vcGVuU3RhcnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY29udGVudCA9IG5vZGUuY29udGVudDtcbiAgICB9XG4gICAgLy8gQmFjayB1cCBwcmVmZXJyZWREZXB0aCB0byBjb3ZlciBkZWZpbmluZyB0ZXh0YmxvY2tzIGRpcmVjdGx5XG4gICAgLy8gYWJvdmUgaXQsIHBvc3NpYmx5IHNraXBwaW5nIGEgbm9uLWRlZmluaW5nIHRleHRibG9jay5cbiAgICBmb3IgKGxldCBkID0gcHJlZmVycmVkRGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgbGVmdE5vZGUgPSBsZWZ0Tm9kZXNbZF0sIGRlZiA9IGRlZmluZXNDb250ZW50KGxlZnROb2RlLnR5cGUpO1xuICAgICAgICBpZiAoZGVmICYmICFsZWZ0Tm9kZS5zYW1lTWFya3VwKCRmcm9tLm5vZGUoTWF0aC5hYnMocHJlZmVycmVkVGFyZ2V0KSAtIDEpKSlcbiAgICAgICAgICAgIHByZWZlcnJlZERlcHRoID0gZDtcbiAgICAgICAgZWxzZSBpZiAoZGVmIHx8ICFsZWZ0Tm9kZS50eXBlLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZvciAobGV0IGogPSBzbGljZS5vcGVuU3RhcnQ7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGxldCBvcGVuRGVwdGggPSAoaiArIHByZWZlcnJlZERlcHRoICsgMSkgJSAoc2xpY2Uub3BlblN0YXJ0ICsgMSk7XG4gICAgICAgIGxldCBpbnNlcnQgPSBsZWZ0Tm9kZXNbb3BlbkRlcHRoXTtcbiAgICAgICAgaWYgKCFpbnNlcnQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXREZXB0aHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBwb3NzaWJsZSBleHBhbnNpb24gbGV2ZWxzLCBzdGFydGluZyB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gcHJlZmVycmVkIG9uZVxuICAgICAgICAgICAgbGV0IHRhcmdldERlcHRoID0gdGFyZ2V0RGVwdGhzWyhpICsgcHJlZmVycmVkVGFyZ2V0SW5kZXgpICUgdGFyZ2V0RGVwdGhzLmxlbmd0aF0sIGV4cGFuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGFyZ2V0RGVwdGggPCAwKSB7XG4gICAgICAgICAgICAgICAgZXhwYW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RGVwdGggPSAtdGFyZ2V0RGVwdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJGZyb20ubm9kZSh0YXJnZXREZXB0aCAtIDEpLCBpbmRleCA9ICRmcm9tLmluZGV4KHRhcmdldERlcHRoIC0gMSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgaW5zZXJ0LnR5cGUsIGluc2VydC5tYXJrcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyLnJlcGxhY2UoJGZyb20uYmVmb3JlKHRhcmdldERlcHRoKSwgZXhwYW5kID8gJHRvLmFmdGVyKHRhcmdldERlcHRoKSA6IHRvLCBuZXcgU2xpY2UoY2xvc2VGcmFnbWVudChzbGljZS5jb250ZW50LCAwLCBzbGljZS5vcGVuU3RhcnQsIG9wZW5EZXB0aCksIG9wZW5EZXB0aCwgc2xpY2Uub3BlbkVuZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdGFydFN0ZXBzID0gdHIuc3RlcHMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSB0YXJnZXREZXB0aHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdHIucmVwbGFjZShmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICBpZiAodHIuc3RlcHMubGVuZ3RoID4gc3RhcnRTdGVwcylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgZGVwdGggPSB0YXJnZXREZXB0aHNbaV07XG4gICAgICAgIGlmIChkZXB0aCA8IDApXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZnJvbSA9ICRmcm9tLmJlZm9yZShkZXB0aCk7XG4gICAgICAgIHRvID0gJHRvLmFmdGVyKGRlcHRoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZUZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgb2xkT3BlbiwgbmV3T3BlbiwgcGFyZW50KSB7XG4gICAgaWYgKGRlcHRoIDwgb2xkT3Blbikge1xuICAgICAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnJlcGxhY2VDaGlsZCgwLCBmaXJzdC5jb3B5KGNsb3NlRnJhZ21lbnQoZmlyc3QuY29udGVudCwgZGVwdGggKyAxLCBvbGRPcGVuLCBuZXdPcGVuLCBmaXJzdCkpKTtcbiAgICB9XG4gICAgaWYgKGRlcHRoID4gbmV3T3Blbikge1xuICAgICAgICBsZXQgbWF0Y2ggPSBwYXJlbnQuY29udGVudE1hdGNoQXQoMCk7XG4gICAgICAgIGxldCBzdGFydCA9IG1hdGNoLmZpbGxCZWZvcmUoZnJhZ21lbnQpLmFwcGVuZChmcmFnbWVudCk7XG4gICAgICAgIGZyYWdtZW50ID0gc3RhcnQuYXBwZW5kKG1hdGNoLm1hdGNoRnJhZ21lbnQoc3RhcnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gcmVwbGFjZVJhbmdlV2l0aCh0ciwgZnJvbSwgdG8sIG5vZGUpIHtcbiAgICBpZiAoIW5vZGUuaXNJbmxpbmUgJiYgZnJvbSA9PSB0byAmJiB0ci5kb2MucmVzb2x2ZShmcm9tKS5wYXJlbnQuY29udGVudC5zaXplKSB7XG4gICAgICAgIGxldCBwb2ludCA9IGluc2VydFBvaW50KHRyLmRvYywgZnJvbSwgbm9kZS50eXBlKTtcbiAgICAgICAgaWYgKHBvaW50ICE9IG51bGwpXG4gICAgICAgICAgICBmcm9tID0gdG8gPSBwb2ludDtcbiAgICB9XG4gICAgdHIucmVwbGFjZVJhbmdlKGZyb20sIHRvLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShub2RlKSwgMCwgMCkpO1xufVxuZnVuY3Rpb24gZGVsZXRlUmFuZ2UodHIsIGZyb20sIHRvKSB7XG4gICAgbGV0ICRmcm9tID0gdHIuZG9jLnJlc29sdmUoZnJvbSksICR0byA9IHRyLmRvYy5yZXNvbHZlKHRvKTtcbiAgICBsZXQgY292ZXJlZCA9IGNvdmVyZWREZXB0aHMoJGZyb20sICR0byk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3ZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkZXB0aCA9IGNvdmVyZWRbaV0sIGxhc3QgPSBpID09IGNvdmVyZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKChsYXN0ICYmIGRlcHRoID09IDApIHx8ICRmcm9tLm5vZGUoZGVwdGgpLnR5cGUuY29udGVudE1hdGNoLnZhbGlkRW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRyLmRlbGV0ZSgkZnJvbS5zdGFydChkZXB0aCksICR0by5lbmQoZGVwdGgpKTtcbiAgICAgICAgaWYgKGRlcHRoID4gMCAmJiAobGFzdCB8fCAkZnJvbS5ub2RlKGRlcHRoIC0gMSkuY2FuUmVwbGFjZSgkZnJvbS5pbmRleChkZXB0aCAtIDEpLCAkdG8uaW5kZXhBZnRlcihkZXB0aCAtIDEpKSkpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkZXB0aCksICR0by5hZnRlcihkZXB0aCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBkID0gMTsgZCA8PSAkZnJvbS5kZXB0aCAmJiBkIDw9ICR0by5kZXB0aDsgZCsrKSB7XG4gICAgICAgIGlmIChmcm9tIC0gJGZyb20uc3RhcnQoZCkgPT0gJGZyb20uZGVwdGggLSBkICYmIHRvID4gJGZyb20uZW5kKGQpICYmICR0by5lbmQoZCkgLSB0byAhPSAkdG8uZGVwdGggLSBkICYmXG4gICAgICAgICAgICAkZnJvbS5zdGFydChkIC0gMSkgPT0gJHRvLnN0YXJ0KGQgLSAxKSAmJiAkZnJvbS5ub2RlKGQgLSAxKS5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KGQgLSAxKSwgJHRvLmluZGV4KGQgLSAxKSkpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLmJlZm9yZShkKSwgdG8pO1xuICAgIH1cbiAgICB0ci5kZWxldGUoZnJvbSwgdG8pO1xufVxuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgZGVwdGhzIGZvciB3aGljaCAkZnJvbSAtICR0byBzcGFucyB0aGVcbi8vIHdob2xlIGNvbnRlbnQgb2YgdGhlIG5vZGVzIGF0IHRoYXQgZGVwdGguXG5mdW5jdGlvbiBjb3ZlcmVkRGVwdGhzKCRmcm9tLCAkdG8pIHtcbiAgICBsZXQgcmVzdWx0ID0gW10sIG1pbkRlcHRoID0gTWF0aC5taW4oJGZyb20uZGVwdGgsICR0by5kZXB0aCk7XG4gICAgZm9yIChsZXQgZCA9IG1pbkRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICBsZXQgc3RhcnQgPSAkZnJvbS5zdGFydChkKTtcbiAgICAgICAgaWYgKHN0YXJ0IDwgJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCkgfHxcbiAgICAgICAgICAgICR0by5lbmQoZCkgPiAkdG8ucG9zICsgKCR0by5kZXB0aCAtIGQpIHx8XG4gICAgICAgICAgICAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcgfHxcbiAgICAgICAgICAgICR0by5ub2RlKGQpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHN0YXJ0ID09ICR0by5zdGFydChkKSB8fFxuICAgICAgICAgICAgKGQgPT0gJGZyb20uZGVwdGggJiYgZCA9PSAkdG8uZGVwdGggJiYgJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQgJiYgJHRvLnBhcmVudC5pbmxpbmVDb250ZW50ICYmXG4gICAgICAgICAgICAgICAgZCAmJiAkdG8uc3RhcnQoZCAtIDEpID09IHN0YXJ0IC0gMSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaChkKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG5VcGRhdGUgYW4gYXR0cmlidXRlIGluIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBBdHRyU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBhdHRyaWJ1dGUgdG8gc2V0LlxuICAgICovXG4gICAgYXR0ciwgXG4gICAgLy8gVGhlIGF0dHJpYnV0ZSdzIG5ldyB2YWx1ZS5cbiAgICB2YWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBkb2Mubm9kZUF0KHRoaXMucG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIk5vIG5vZGUgYXQgYXR0cmlidXRlIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBub2RlLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBub2RlLmF0dHJzW25hbWVdO1xuICAgICAgICBhdHRyc1t0aGlzLmF0dHJdID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKGF0dHJzLCBudWxsLCBub2RlLm1hcmtzKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXR0clN0ZXAodGhpcy5wb3MsIHRoaXMuYXR0ciwgZG9jLm5vZGVBdCh0aGlzLnBvcykuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBBdHRyU3RlcChwb3MucG9zLCB0aGlzLmF0dHIsIHRoaXMudmFsdWUpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImF0dHJcIiwgcG9zOiB0aGlzLnBvcywgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEF0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJTdGVwKGpzb24ucG9zLCBqc29uLmF0dHIsIGpzb24udmFsdWUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwiYXR0clwiLCBBdHRyU3RlcCk7XG4vKipcblVwZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gdGhlIGRvYyBub2RlLlxuKi9cbmNsYXNzIERvY0F0dHJTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZSB0byBzZXQuXG4gICAgKi9cbiAgICBhdHRyLCBcbiAgICAvLyBUaGUgYXR0cmlidXRlJ3MgbmV3IHZhbHVlLlxuICAgIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXR0ciA9IGF0dHI7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBhdHRycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gZG9jLmF0dHJzKVxuICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSBkb2MuYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW3RoaXMuYXR0cl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGRvYy50eXBlLmNyZWF0ZShhdHRycywgZG9jLmNvbnRlbnQsIGRvYy5tYXJrcyk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0Lm9rKHVwZGF0ZWQpO1xuICAgIH1cbiAgICBnZXRNYXAoKSB7XG4gICAgICAgIHJldHVybiBTdGVwTWFwLmVtcHR5O1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRG9jQXR0clN0ZXAodGhpcy5hdHRyLCBkb2MuYXR0cnNbdGhpcy5hdHRyXSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHN0ZXBUeXBlOiBcImRvY0F0dHJcIiwgYXR0cjogdGhpcy5hdHRyLCB2YWx1ZTogdGhpcy52YWx1ZSB9O1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5hdHRyICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIERvY0F0dHJTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IERvY0F0dHJTdGVwKGpzb24uYXR0ciwganNvbi52YWx1ZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJkb2NBdHRyXCIsIERvY0F0dHJTdGVwKTtcblxuLyoqXG5AaW50ZXJuYWxcbiovXG5sZXQgVHJhbnNmb3JtRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbn07XG5UcmFuc2Zvcm1FcnJvciA9IGZ1bmN0aW9uIFRyYW5zZm9ybUVycm9yKG1lc3NhZ2UpIHtcbiAgICBsZXQgZXJyID0gRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcbiAgICBlcnIuX19wcm90b19fID0gVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlO1xuICAgIHJldHVybiBlcnI7XG59O1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuVHJhbnNmb3JtRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHJhbnNmb3JtRXJyb3I7XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiVHJhbnNmb3JtRXJyb3JcIjtcbi8qKlxuQWJzdHJhY3Rpb24gdG8gYnVpbGQgdXAgYW5kIHRyYWNrIGFuIGFycmF5IG9mXG5bc3RlcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgcmVwcmVzZW50aW5nIGEgZG9jdW1lbnQgdHJhbnNmb3JtYXRpb24uXG5cbk1vc3QgdHJhbnNmb3JtaW5nIG1ldGhvZHMgcmV0dXJuIHRoZSBgVHJhbnNmb3JtYCBvYmplY3QgaXRzZWxmLCBzb1xudGhhdCB0aGV5IGNhbiBiZSBjaGFpbmVkLlxuKi9cbmNsYXNzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdHJhbnNmb3JtIHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGN1cnJlbnQgZG9jdW1lbnQgKHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zZm9ybSkuXG4gICAgKi9cbiAgICBkb2MpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgc3RlcHMgaW4gdGhpcyB0cmFuc2Zvcm0uXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBkb2N1bWVudHMgYmVmb3JlIGVhY2ggb2YgdGhlIHN0ZXBzLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRvY3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEEgbWFwcGluZyB3aXRoIHRoZSBtYXBzIGZvciBlYWNoIG9mIHRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydGluZyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldCBiZWZvcmUoKSB7IHJldHVybiB0aGlzLmRvY3MubGVuZ3RoID8gdGhpcy5kb2NzWzBdIDogdGhpcy5kb2M7IH1cbiAgICAvKipcbiAgICBBcHBseSBhIG5ldyBzdGVwIGluIHRoaXMgdHJhbnNmb3JtLCBzYXZpbmcgdGhlIHJlc3VsdC4gVGhyb3dzIGFuXG4gICAgZXJyb3Igd2hlbiB0aGUgc3RlcCBmYWlscy5cbiAgICAqL1xuICAgIHN0ZXAoc3RlcCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tYXliZVN0ZXAoc3RlcCk7XG4gICAgICAgIGlmIChyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybUVycm9yKHJlc3VsdC5mYWlsZWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ5IHRvIGFwcGx5IGEgc3RlcCBpbiB0aGlzIHRyYW5zZm9ybWF0aW9uLCBpZ25vcmluZyBpdCBpZiBpdFxuICAgIGZhaWxzLiBSZXR1cm5zIHRoZSBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIG1heWJlU3RlcChzdGVwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBzdGVwLmFwcGx5KHRoaXMuZG9jKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuZmFpbGVkKVxuICAgICAgICAgICAgdGhpcy5hZGRTdGVwKHN0ZXAsIHJlc3VsdC5kb2MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhlIGRvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQgKHdoZW4gdGhlcmUgYXJlIGFueVxuICAgIHN0ZXBzKS5cbiAgICAqL1xuICAgIGdldCBkb2NDaGFuZ2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGVwcy5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGFkZFN0ZXAoc3RlcCwgZG9jKSB7XG4gICAgICAgIHRoaXMuZG9jcy5wdXNoKHRoaXMuZG9jKTtcbiAgICAgICAgdGhpcy5zdGVwcy5wdXNoKHN0ZXApO1xuICAgICAgICB0aGlzLm1hcHBpbmcuYXBwZW5kTWFwKHN0ZXAuZ2V0TWFwKCkpO1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2Agd2l0aCB0aGVcbiAgICBnaXZlbiBgc2xpY2VgLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0byA9IGZyb20sIHNsaWNlID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgbGV0IHN0ZXAgPSByZXBsYWNlU3RlcCh0aGlzLmRvYywgZnJvbSwgdG8sIHNsaWNlKTtcbiAgICAgICAgaWYgKHN0ZXApXG4gICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LCB3aGljaCBtYXkgYmUgYVxuICAgIGZyYWdtZW50LCBub2RlLCBvciBhcnJheSBvZiBub2Rlcy5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKGZyb20sIHRvLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKGNvbnRlbnQpLCAwLCAwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICBkZWxldGUoZnJvbSwgdG8pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShmcm9tLCB0bywgU2xpY2UuZW1wdHkpO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnNlcnQgdGhlIGdpdmVuIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgaW5zZXJ0KHBvcywgY29udGVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlV2l0aChwb3MsIHBvcywgY29udGVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgYSByYW5nZSBvZiB0aGUgZG9jdW1lbnQgd2l0aCBhIGdpdmVuIHNsaWNlLCB1c2luZ1xuICAgIGBmcm9tYCwgYHRvYCwgYW5kIHRoZSBzbGljZSdzXG4gICAgW2BvcGVuU3RhcnRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2xpY2Uub3BlblN0YXJ0KSBwcm9wZXJ0eSBhcyBoaW50cywgcmF0aGVyXG4gICAgdGhhbiBmaXhlZCBzdGFydCBhbmQgZW5kIHBvaW50cy4gVGhpcyBtZXRob2QgbWF5IGdyb3cgdGhlXG4gICAgcmVwbGFjZWQgYXJlYSBvciBjbG9zZSBvcGVuIG5vZGVzIGluIHRoZSBzbGljZSBpbiBvcmRlciB0byBnZXQgYVxuICAgIGZpdCB0aGF0IGlzIG1vcmUgaW4gbGluZSB3aXRoIFdZU0lXWUcgZXhwZWN0YXRpb25zLCBieSBkcm9wcGluZ1xuICAgIGZ1bGx5IGNvdmVyZWQgcGFyZW50IG5vZGVzIG9mIHRoZSByZXBsYWNlZCByZWdpb24gd2hlbiB0aGV5IGFyZVxuICAgIG1hcmtlZCBbbm9uLWRlZmluaW5nIGFzXG4gICAgY29udGV4dF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmRlZmluaW5nQXNDb250ZXh0KSwgb3IgaW5jbHVkaW5nIGFuXG4gICAgb3BlbiBwYXJlbnQgbm9kZSBmcm9tIHRoZSBzbGljZSB0aGF0IF9pc18gbWFya2VkIGFzIFtkZWZpbmluZ1xuICAgIGl0cyBjb250ZW50XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZGVmaW5pbmdGb3JDb250ZW50KS5cbiAgICBcbiAgICBUaGlzIGlzIHRoZSBtZXRob2QsIGZvciBleGFtcGxlLCB0byBoYW5kbGUgcGFzdGUuIFRoZSBzaW1pbGFyXG4gICAgW2ByZXBsYWNlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0ucmVwbGFjZSkgbWV0aG9kIGlzIGEgbW9yZVxuICAgIHByaW1pdGl2ZSB0b29sIHdoaWNoIHdpbGwgX25vdF8gbW92ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiBpdHMgZ2l2ZW5cbiAgICByYW5nZSwgYW5kIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIG1vcmUgcHJlY2lzZVxuICAgIGNvbnRyb2wgb3ZlciB3aGF0IGhhcHBlbnMuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aCBhIG5vZGUsIGJ1dCB1c2UgYGZyb21gIGFuZCBgdG9gIGFzXG4gICAgaGludHMsIHJhdGhlciB0aGFuIHByZWNpc2UgcG9zaXRpb25zLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgc2FtZVxuICAgIGFuZCBhcmUgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHBhcmVudCBub2RlIGluIHdoaWNoIHRoZSBnaXZlblxuICAgIG5vZGUgZG9lc24ndCBmaXQsIHRoaXMgbWV0aG9kIG1heSBfbW92ZV8gdGhlbSBvdXQgdG93YXJkcyBhIHBhcmVudFxuICAgIHRoYXQgZG9lcyBhbGxvdyB0aGUgZ2l2ZW4gbm9kZSB0byBiZSBwbGFjZWQuIFdoZW4gdGhlIGdpdmVuIHJhbmdlXG4gICAgY29tcGxldGVseSBjb3ZlcnMgYSBwYXJlbnQgbm9kZSwgdGhpcyBtZXRob2QgbWF5IGNvbXBsZXRlbHkgcmVwbGFjZVxuICAgIHRoYXQgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBub2RlKSB7XG4gICAgICAgIHJlcGxhY2VSYW5nZVdpdGgodGhpcywgZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBnaXZlbiByYW5nZSwgZXhwYW5kaW5nIGl0IHRvIGNvdmVyIGZ1bGx5IGNvdmVyZWRcbiAgICBwYXJlbnQgbm9kZXMgdW50aWwgYSB2YWxpZCByZXBsYWNlIGlzIGZvdW5kLlxuICAgICovXG4gICAgZGVsZXRlUmFuZ2UoZnJvbSwgdG8pIHtcbiAgICAgICAgZGVsZXRlUmFuZ2UodGhpcywgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU3BsaXQgdGhlIGNvbnRlbnQgaW4gdGhlIGdpdmVuIHJhbmdlIG9mZiBmcm9tIGl0cyBwYXJlbnQsIGlmIHRoZXJlXG4gICAgaXMgc2libGluZyBjb250ZW50IGJlZm9yZSBvciBhZnRlciBpdCwgYW5kIG1vdmUgaXQgdXAgdGhlIHRyZWUgdG9cbiAgICB0aGUgZGVwdGggc3BlY2lmaWVkIGJ5IGB0YXJnZXRgLiBZb3UnbGwgcHJvYmFibHkgd2FudCB0byB1c2VcbiAgICBbYGxpZnRUYXJnZXRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmxpZnRUYXJnZXQpIHRvIGNvbXB1dGUgYHRhcmdldGAsIHRvIG1ha2VcbiAgICBzdXJlIHRoZSBsaWZ0IGlzIHZhbGlkLlxuICAgICovXG4gICAgbGlmdChyYW5nZSwgdGFyZ2V0KSB7XG4gICAgICAgIGxpZnQodGhpcywgcmFuZ2UsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBKb2luIHRoZSBibG9ja3MgYXJvdW5kIHRoZSBnaXZlbiBwb3NpdGlvbi4gSWYgZGVwdGggaXMgMiwgdGhlaXJcbiAgICBsYXN0IGFuZCBmaXJzdCBzaWJsaW5ncyBhcmUgYWxzbyBqb2luZWQsIGFuZCBzbyBvbi5cbiAgICAqL1xuICAgIGpvaW4ocG9zLCBkZXB0aCA9IDEpIHtcbiAgICAgICAgam9pbih0aGlzLCBwb3MsIGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFdyYXAgdGhlIGdpdmVuIFtyYW5nZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVSYW5nZSkgaW4gdGhlIGdpdmVuIHNldCBvZiB3cmFwcGVycy5cbiAgICBUaGUgd3JhcHBlcnMgYXJlIGFzc3VtZWQgdG8gYmUgdmFsaWQgaW4gdGhpcyBwb3NpdGlvbiwgYW5kIHNob3VsZFxuICAgIHByb2JhYmx5IGJlIGNvbXB1dGVkIHdpdGggW2BmaW5kV3JhcHBpbmdgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLmZpbmRXcmFwcGluZykuXG4gICAgKi9cbiAgICB3cmFwKHJhbmdlLCB3cmFwcGVycykge1xuICAgICAgICB3cmFwKHRoaXMsIHJhbmdlLCB3cmFwcGVycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIHR5cGUgb2YgYWxsIHRleHRibG9ja3MgKHBhcnRseSkgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AgdG9cbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzZXRCbG9ja1R5cGUoZnJvbSwgdG8gPSBmcm9tLCB0eXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHRoaXMsIGZyb20sIHRvLCB0eXBlLCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGFuZ2UgdGhlIHR5cGUsIGF0dHJpYnV0ZXMsIGFuZC9vciBtYXJrcyBvZiB0aGUgbm9kZSBhdCBgcG9zYC5cbiAgICBXaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4gICAgKi9cbiAgICBzZXROb2RlTWFya3VwKHBvcywgdHlwZSwgYXR0cnMgPSBudWxsLCBtYXJrcykge1xuICAgICAgICBzZXROb2RlTWFya3VwKHRoaXMsIHBvcywgdHlwZSwgYXR0cnMsIG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCBhIHNpbmdsZSBhdHRyaWJ1dGUgb24gYSBnaXZlbiBub2RlIHRvIGEgbmV3IHZhbHVlLlxuICAgIFRoZSBgcG9zYCBhZGRyZXNzZXMgdGhlIGRvY3VtZW50IGNvbnRlbnQuIFVzZSBgc2V0RG9jQXR0cmlidXRlYFxuICAgIHRvIHNldCBhdHRyaWJ1dGVzIG9uIHRoZSBkb2N1bWVudCBpdHNlbGYuXG4gICAgKi9cbiAgICBzZXROb2RlQXR0cmlidXRlKHBvcywgYXR0ciwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBBdHRyU3RlcChwb3MsIGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgYSBzaW5nbGUgYXR0cmlidXRlIG9uIHRoZSBkb2N1bWVudCB0byBhIG5ldyB2YWx1ZS5cbiAgICAqL1xuICAgIHNldERvY0F0dHJpYnV0ZShhdHRyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IERvY0F0dHJTdGVwKGF0dHIsIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYSBtYXJrIHRvIHRoZSBub2RlIGF0IHBvc2l0aW9uIGBwb3NgLlxuICAgICovXG4gICAgYWRkTm9kZU1hcmsocG9zLCBtYXJrKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgQWRkTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayAob3IgYWxsIG1hcmtzIG9mIHRoZSBnaXZlbiB0eXBlKSBmcm9tIHRoZSBub2RlIGF0XG4gICAgcG9zaXRpb24gYHBvc2AuXG4gICAgKi9cbiAgICByZW1vdmVOb2RlTWFyayhwb3MsIG1hcmspIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmRvYy5ub2RlQXQocG9zKTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBub2RlIGF0IHBvc2l0aW9uIFwiICsgcG9zKTtcbiAgICAgICAgaWYgKG1hcmsgaW5zdGFuY2VvZiBNYXJrKSB7XG4gICAgICAgICAgICBpZiAobWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RlcChuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHBvcywgbWFyaykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNldCA9IG5vZGUubWFya3MsIGZvdW5kLCBzdGVwcyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGZvdW5kID0gbWFyay5pc0luU2V0KHNldCkpIHtcbiAgICAgICAgICAgICAgICBzdGVwcy5wdXNoKG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAocG9zLCBmb3VuZCkpO1xuICAgICAgICAgICAgICAgIHNldCA9IGZvdW5kLnJlbW92ZUZyb21TZXQoc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGVwcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0ZXAoc3RlcHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTcGxpdCB0aGUgbm9kZSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24sIGFuZCBvcHRpb25hbGx5LCBpZiBgZGVwdGhgIGlzXG4gICAgZ3JlYXRlciB0aGFuIG9uZSwgYW55IG51bWJlciBvZiBub2RlcyBhYm92ZSB0aGF0LiBCeSBkZWZhdWx0LCB0aGVcbiAgICBwYXJ0cyBzcGxpdCBvZmYgd2lsbCBpbmhlcml0IHRoZSBub2RlIHR5cGUgb2YgdGhlIG9yaWdpbmFsIG5vZGUuXG4gICAgVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBwYXNzaW5nIGFuIGFycmF5IG9mIHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHRvXG4gICAgdXNlIGFmdGVyIHRoZSBzcGxpdCAod2l0aCB0aGUgb3V0ZXJtb3N0IG5vZGVzIGNvbWluZyBmaXJzdCkuXG4gICAgKi9cbiAgICBzcGxpdChwb3MsIGRlcHRoID0gMSwgdHlwZXNBZnRlcikge1xuICAgICAgICBzcGxpdCh0aGlzLCBwb3MsIGRlcHRoLCB0eXBlc0FmdGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gbWFyayB0byB0aGUgaW5saW5lIGNvbnRlbnQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBhZGRNYXJrKGZyb20sIHRvLCBtYXJrKSB7XG4gICAgICAgIGFkZE1hcmsodGhpcywgZnJvbSwgdG8sIG1hcmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIG1hcmtzIGZyb20gaW5saW5lIG5vZGVzIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYG1hcmtgIGlzIGEgc2luZ2xlIG1hcmssIHJlbW92ZSBwcmVjaXNlbHkgdGhhdCBtYXJrLiBXaGVuIGl0IGlzXG4gICAgYSBtYXJrIHR5cGUsIHJlbW92ZSBhbGwgbWFya3Mgb2YgdGhhdCB0eXBlLiBXaGVuIGl0IGlzIG51bGwsXG4gICAgcmVtb3ZlIGFsbCBtYXJrcyBvZiBhbnkgdHlwZS5cbiAgICAqL1xuICAgIHJlbW92ZU1hcmsoZnJvbSwgdG8sIG1hcmspIHtcbiAgICAgICAgcmVtb3ZlTWFyayh0aGlzLCBmcm9tLCB0bywgbWFyayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIGFsbCBtYXJrcyBhbmQgbm9kZXMgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSBhdFxuICAgIGBwb3NgIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGdpdmVuIG5ldyBwYXJlbnQgbm9kZSB0eXBlLiBBY2NlcHRzXG4gICAgYW4gb3B0aW9uYWwgc3RhcnRpbmcgW2NvbnRlbnQgbWF0Y2hdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Db250ZW50TWF0Y2gpIGFzXG4gICAgdGhpcmQgYXJndW1lbnQuXG4gICAgKi9cbiAgICBjbGVhckluY29tcGF0aWJsZShwb3MsIHBhcmVudFR5cGUsIG1hdGNoKSB7XG4gICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRoaXMsIHBvcywgcGFyZW50VHlwZSwgbWF0Y2gpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCB7IEFkZE1hcmtTdGVwLCBBZGROb2RlTWFya1N0ZXAsIEF0dHJTdGVwLCBEb2NBdHRyU3RlcCwgTWFwUmVzdWx0LCBNYXBwaW5nLCBSZW1vdmVNYXJrU3RlcCwgUmVtb3ZlTm9kZU1hcmtTdGVwLCBSZXBsYWNlQXJvdW5kU3RlcCwgUmVwbGFjZVN0ZXAsIFN0ZXAsIFN0ZXBNYXAsIFN0ZXBSZXN1bHQsIFRyYW5zZm9ybSwgVHJhbnNmb3JtRXJyb3IsIGNhbkpvaW4sIGNhblNwbGl0LCBkcm9wUG9pbnQsIGZpbmRXcmFwcGluZywgaW5zZXJ0UG9pbnQsIGpvaW5Qb2ludCwgbGlmdFRhcmdldCwgcmVwbGFjZVN0ZXAgfTtcbiIsImltcG9ydCB7IFRleHRTZWxlY3Rpb24sIE5vZGVTZWxlY3Rpb24sIEFsbFNlbGVjdGlvbiwgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRE9NU2VyaWFsaXplciwgRnJhZ21lbnQsIE1hcmssIFNsaWNlLCBET01QYXJzZXIgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBkcm9wUG9pbnQgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuXG5jb25zdCBkb21JbmRleCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOzsgaW5kZXgrKykge1xuICAgICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59O1xuY29uc3QgcGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbGV0IHBhcmVudCA9IG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZTtcbiAgICByZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxMSA/IHBhcmVudC5ob3N0IDogcGFyZW50O1xufTtcbmxldCByZXVzZWRSYW5nZSA9IG51bGw7XG4vLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgcmFuZ2UsIGJlY2F1c2UgRE9NIHJhbmdlXG4vLyBvYmplY3RzIGFyZSBldmVyeSBleHBlbnNpdmUsIGFuZCBrZWVwIHNsb3dpbmcgZG93biBzdWJzZXF1ZW50IERPTVxuLy8gdXBkYXRlcywgZm9yIHNvbWUgcmVhc29uLlxuY29uc3QgdGV4dFJhbmdlID0gZnVuY3Rpb24gKG5vZGUsIGZyb20sIHRvKSB7XG4gICAgbGV0IHJhbmdlID0gcmV1c2VkUmFuZ2UgfHwgKHJldXNlZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSk7XG4gICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIHRvID09IG51bGwgPyBub2RlLm5vZGVWYWx1ZS5sZW5ndGggOiB0byk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgZnJvbSB8fCAwKTtcbiAgICByZXR1cm4gcmFuZ2U7XG59O1xuY29uc3QgY2xlYXJSZXVzZWRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXVzZWRSYW5nZSA9IG51bGw7XG59O1xuLy8gU2NhbnMgZm9yd2FyZCBhbmQgYmFja3dhcmQgdGhyb3VnaCBET00gcG9zaXRpb25zIGVxdWl2YWxlbnQgdG8gdGhlXG4vLyBnaXZlbiBvbmUgdG8gc2VlIGlmIHRoZSB0d28gYXJlIGluIHRoZSBzYW1lIHBsYWNlIChpLmUuIGFmdGVyIGFcbi8vIHRleHQgbm9kZSB2cyBhdCB0aGUgZW5kIG9mIHRoYXQgdGV4dCBub2RlKVxuY29uc3QgaXNFcXVpdmFsZW50UG9zaXRpb24gPSBmdW5jdGlvbiAobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYpIHtcbiAgICByZXR1cm4gdGFyZ2V0Tm9kZSAmJiAoc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgLTEpIHx8XG4gICAgICAgIHNjYW5Gb3Iobm9kZSwgb2ZmLCB0YXJnZXROb2RlLCB0YXJnZXRPZmYsIDEpKTtcbn07XG5jb25zdCBhdG9tRWxlbWVudHMgPSAvXihpbWd8YnJ8aW5wdXR8dGV4dGFyZWF8aHIpJC9pO1xuZnVuY3Rpb24gc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgZGlyKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZSA9PSB0YXJnZXROb2RlICYmIG9mZiA9PSB0YXJnZXRPZmYpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG9mZiA9PSAoZGlyIDwgMCA/IDAgOiBub2RlU2l6ZShub2RlKSkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudCB8fCBwYXJlbnQubm9kZVR5cGUgIT0gMSB8fCBoYXNCbG9ja0Rlc2Mobm9kZSkgfHwgYXRvbUVsZW1lbnRzLnRlc3Qobm9kZS5ub2RlTmFtZSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZG9tSW5kZXgobm9kZSkgKyAoZGlyIDwgMCA/IDAgOiAxKTtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZiArIChkaXIgPCAwID8gLTEgOiAwKV07XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIG9mZiA9IGRpciA8IDAgPyBub2RlU2l6ZShub2RlKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBub2RlU2l6ZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZSQxKG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIG9mZnNldCA9IG5vZGVTaXplKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiAhaGFzQmxvY2tEZXNjKG5vZGUpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIkMShub2RlLCBvZmZzZXQpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMgJiYgb2Zmc2V0IDwgbm9kZS5ub2RlVmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpICsgMTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzT25FZGdlKG5vZGUsIG9mZnNldCwgcGFyZW50KSB7XG4gICAgZm9yIChsZXQgYXRTdGFydCA9IG9mZnNldCA9PSAwLCBhdEVuZCA9IG9mZnNldCA9PSBub2RlU2l6ZShub2RlKTsgYXRTdGFydCB8fCBhdEVuZDspIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBpbmRleCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGF0U3RhcnQgPSBhdFN0YXJ0ICYmIGluZGV4ID09IDA7XG4gICAgICAgIGF0RW5kID0gYXRFbmQgJiYgaW5kZXggPT0gbm9kZVNpemUobm9kZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFzQmxvY2tEZXNjKGRvbSkge1xuICAgIGxldCBkZXNjO1xuICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKGRlc2MgPSBjdXIucG1WaWV3RGVzYylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jayAmJiAoZGVzYy5kb20gPT0gZG9tIHx8IGRlc2MuY29udGVudERPTSA9PSBkb20pO1xufVxuLy8gV29yayBhcm91bmQgQ2hyb21lIGlzc3VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzUyM1xuLy8gKGlzQ29sbGFwc2VkIGluYXBwcm9wcmlhdGVseSByZXR1cm5zIHRydWUgaW4gc2hhZG93IGRvbSlcbmNvbnN0IHNlbGVjdGlvbkNvbGxhcHNlZCA9IGZ1bmN0aW9uIChkb21TZWwpIHtcbiAgICByZXR1cm4gZG9tU2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn07XG5mdW5jdGlvbiBrZXlFdmVudChrZXlDb2RlLCBrZXkpIHtcbiAgICBsZXQgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGV2ZW50LmluaXRFdmVudChcImtleWRvd25cIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgZXZlbnQua2V5Q29kZSA9IGtleUNvZGU7XG4gICAgZXZlbnQua2V5ID0gZXZlbnQuY29kZSA9IGtleTtcbiAgICByZXR1cm4gZXZlbnQ7XG59XG5mdW5jdGlvbiBkZWVwQWN0aXZlRWxlbWVudChkb2MpIHtcbiAgICBsZXQgZWx0ID0gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gICAgd2hpbGUgKGVsdCAmJiBlbHQuc2hhZG93Um9vdClcbiAgICAgICAgZWx0ID0gZWx0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudDtcbiAgICByZXR1cm4gZWx0O1xufVxuZnVuY3Rpb24gY2FyZXRGcm9tUG9pbnQoZG9jLCB4LCB5KSB7XG4gICAgaWYgKGRvYy5jYXJldFBvc2l0aW9uRnJvbVBvaW50KSB7XG4gICAgICAgIHRyeSB7IC8vIEZpcmVmb3ggdGhyb3dzIGZvciB0aGlzIGNhbGwgaW4gaGFyZC10by1wcmVkaWN0IGNpcmN1bXN0YW5jZXMgKCM5OTQpXG4gICAgICAgICAgICBsZXQgcG9zID0gZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgICAgICAvLyBDbGlwIHRoZSBvZmZzZXQsIGJlY2F1c2UgQ2hyb21lIHdpbGwgcmV0dXJuIGEgdGV4dCBvZmZzZXRcbiAgICAgICAgICAgIC8vIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2ggY2FuJ3QgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgRE9NXG4gICAgICAgICAgICAvLyBvZmZzZXRcbiAgICAgICAgICAgIGlmIChwb3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogcG9zLm9mZnNldE5vZGUsIG9mZnNldDogTWF0aC5taW4obm9kZVNpemUocG9zLm9mZnNldE5vZGUpLCBwb3Mub2Zmc2V0KSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICB9XG4gICAgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiByYW5nZS5zdGFydENvbnRhaW5lciwgb2Zmc2V0OiBNYXRoLm1pbihub2RlU2l6ZShyYW5nZS5zdGFydENvbnRhaW5lciksIHJhbmdlLnN0YXJ0T2Zmc2V0KSB9O1xuICAgIH1cbn1cblxuY29uc3QgbmF2ID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gbmF2aWdhdG9yIDogbnVsbDtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBcInVuZGVmaW5lZFwiID8gZG9jdW1lbnQgOiBudWxsO1xuY29uc3QgYWdlbnQgPSAobmF2ICYmIG5hdi51c2VyQWdlbnQpIHx8IFwiXCI7XG5jb25zdCBpZV9lZGdlID0gL0VkZ2VcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfdXB0bzEwID0gL01TSUUgXFxkLy5leGVjKGFnZW50KTtcbmNvbnN0IGllXzExdXAgPSAvVHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWUgPSAhIShpZV91cHRvMTAgfHwgaWVfMTF1cCB8fCBpZV9lZGdlKTtcbmNvbnN0IGllX3ZlcnNpb24gPSBpZV91cHRvMTAgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBpZV8xMXVwID8gK2llXzExdXBbMV0gOiBpZV9lZGdlID8gK2llX2VkZ2VbMV0gOiAwO1xuY29uc3QgZ2Vja28gPSAhaWUgJiYgL2dlY2tvXFwvKFxcZCspL2kudGVzdChhZ2VudCk7XG5nZWNrbyAmJiArKC9GaXJlZm94XFwvKFxcZCspLy5leGVjKGFnZW50KSB8fCBbMCwgMF0pWzFdO1xuY29uc3QgX2Nocm9tZSA9ICFpZSAmJiAvQ2hyb21lXFwvKFxcZCspLy5leGVjKGFnZW50KTtcbmNvbnN0IGNocm9tZSA9ICEhX2Nocm9tZTtcbmNvbnN0IGNocm9tZV92ZXJzaW9uID0gX2Nocm9tZSA/ICtfY2hyb21lWzFdIDogMDtcbmNvbnN0IHNhZmFyaSA9ICFpZSAmJiAhIW5hdiAmJiAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2LnZlbmRvcik7XG4vLyBJcyB0cnVlIGZvciBib3RoIGlPUyBhbmQgaVBhZE9TIGZvciBjb252ZW5pZW5jZVxuY29uc3QgaW9zID0gc2FmYXJpICYmICgvTW9iaWxlXFwvXFx3Ky8udGVzdChhZ2VudCkgfHwgISFuYXYgJiYgbmF2Lm1heFRvdWNoUG9pbnRzID4gMik7XG5jb25zdCBtYWMgPSBpb3MgfHwgKG5hdiA/IC9NYWMvLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlKTtcbmNvbnN0IHdpbmRvd3MgPSBuYXYgPyAvV2luLy50ZXN0KG5hdi5wbGF0Zm9ybSkgOiBmYWxzZTtcbmNvbnN0IGFuZHJvaWQgPSAvQW5kcm9pZCBcXGQvLnRlc3QoYWdlbnQpO1xuY29uc3Qgd2Via2l0ID0gISFkb2MgJiYgXCJ3ZWJraXRGb250U21vb3RoaW5nXCIgaW4gZG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHdlYmtpdF92ZXJzaW9uID0gd2Via2l0ID8gKygvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgWzAsIDBdKVsxXSA6IDA7XG5cbmZ1bmN0aW9uIHdpbmRvd1JlY3QoZG9jKSB7XG4gICAgbGV0IHZwID0gZG9jLmRlZmF1bHRWaWV3ICYmIGRvYy5kZWZhdWx0Vmlldy52aXN1YWxWaWV3cG9ydDtcbiAgICBpZiAodnApXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiAwLCByaWdodDogdnAud2lkdGgsXG4gICAgICAgICAgICB0b3A6IDAsIGJvdHRvbTogdnAuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgcmV0dXJuIHsgbGVmdDogMCwgcmlnaHQ6IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIHRvcDogMCwgYm90dG9tOiBkb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB9O1xufVxuZnVuY3Rpb24gZ2V0U2lkZSh2YWx1ZSwgc2lkZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJudW1iZXJcIiA/IHZhbHVlIDogdmFsdWVbc2lkZV07XG59XG5mdW5jdGlvbiBjbGllbnRSZWN0KG5vZGUpIHtcbiAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gQWRqdXN0IGZvciBlbGVtZW50cyB3aXRoIHN0eWxlIFwidHJhbnNmb3JtOiBzY2FsZSgpXCJcbiAgICBsZXQgc2NhbGVYID0gKHJlY3Qud2lkdGggLyBub2RlLm9mZnNldFdpZHRoKSB8fCAxO1xuICAgIGxldCBzY2FsZVkgPSAocmVjdC5oZWlnaHQgLyBub2RlLm9mZnNldEhlaWdodCkgfHwgMTtcbiAgICAvLyBNYWtlIHN1cmUgc2Nyb2xsYmFyIHdpZHRoIGlzbid0IGluY2x1ZGVkIGluIHRoZSByZWN0YW5nbGVcbiAgICByZXR1cm4geyBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LmxlZnQgKyBub2RlLmNsaWVudFdpZHRoICogc2NhbGVYLFxuICAgICAgICB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QudG9wICsgbm9kZS5jbGllbnRIZWlnaHQgKiBzY2FsZVkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFJlY3RJbnRvVmlldyh2aWV3LCByZWN0LCBzdGFydERPTSkge1xuICAgIGxldCBzY3JvbGxUaHJlc2hvbGQgPSB2aWV3LnNvbWVQcm9wKFwic2Nyb2xsVGhyZXNob2xkXCIpIHx8IDAsIHNjcm9sbE1hcmdpbiA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxNYXJnaW5cIikgfHwgNTtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBwYXJlbnQgPSBzdGFydERPTSB8fCB2aWV3LmRvbTs7KSB7XG4gICAgICAgIGlmICghcGFyZW50KVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChwYXJlbnQubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVsdCA9IHBhcmVudDtcbiAgICAgICAgbGV0IGF0VG9wID0gZWx0ID09IGRvYy5ib2R5O1xuICAgICAgICBsZXQgYm91bmRpbmcgPSBhdFRvcCA/IHdpbmRvd1JlY3QoZG9jKSA6IGNsaWVudFJlY3QoZWx0KTtcbiAgICAgICAgbGV0IG1vdmVYID0gMCwgbW92ZVkgPSAwO1xuICAgICAgICBpZiAocmVjdC50b3AgPCBib3VuZGluZy50b3AgKyBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJ0b3BcIikpXG4gICAgICAgICAgICBtb3ZlWSA9IC0oYm91bmRpbmcudG9wIC0gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LmJvdHRvbSA+IGJvdW5kaW5nLmJvdHRvbSAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImJvdHRvbVwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IGJvdW5kaW5nLmJvdHRvbSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgID8gcmVjdC50b3AgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJ0b3BcIikgLSBib3VuZGluZy50b3BcbiAgICAgICAgICAgICAgICA6IHJlY3QuYm90dG9tIC0gYm91bmRpbmcuYm90dG9tICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwiYm90dG9tXCIpO1xuICAgICAgICBpZiAocmVjdC5sZWZ0IDwgYm91bmRpbmcubGVmdCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcImxlZnRcIikpXG4gICAgICAgICAgICBtb3ZlWCA9IC0oYm91bmRpbmcubGVmdCAtIHJlY3QubGVmdCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcImxlZnRcIikpO1xuICAgICAgICBlbHNlIGlmIChyZWN0LnJpZ2h0ID4gYm91bmRpbmcucmlnaHQgLSBnZXRTaWRlKHNjcm9sbFRocmVzaG9sZCwgXCJyaWdodFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gcmVjdC5yaWdodCAtIGJvdW5kaW5nLnJpZ2h0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwicmlnaHRcIik7XG4gICAgICAgIGlmIChtb3ZlWCB8fCBtb3ZlWSkge1xuICAgICAgICAgICAgaWYgKGF0VG9wKSB7XG4gICAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LnNjcm9sbEJ5KG1vdmVYLCBtb3ZlWSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRYID0gZWx0LnNjcm9sbExlZnQsIHN0YXJ0WSA9IGVsdC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVZKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsVG9wICs9IG1vdmVZO1xuICAgICAgICAgICAgICAgIGlmIChtb3ZlWClcbiAgICAgICAgICAgICAgICAgICAgZWx0LnNjcm9sbExlZnQgKz0gbW92ZVg7XG4gICAgICAgICAgICAgICAgbGV0IGRYID0gZWx0LnNjcm9sbExlZnQgLSBzdGFydFgsIGRZID0gZWx0LnNjcm9sbFRvcCAtIHN0YXJ0WTtcbiAgICAgICAgICAgICAgICByZWN0ID0geyBsZWZ0OiByZWN0LmxlZnQgLSBkWCwgdG9wOiByZWN0LnRvcCAtIGRZLCByaWdodDogcmVjdC5yaWdodCAtIGRYLCBib3R0b206IHJlY3QuYm90dG9tIC0gZFkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zID0gYXRUb3AgPyBcImZpeGVkXCIgOiBnZXRDb21wdXRlZFN0eWxlKHBhcmVudCkucG9zaXRpb247XG4gICAgICAgIGlmICgvXihmaXhlZHxzdGlja3kpJC8udGVzdChwb3MpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHBvcyA9PSBcImFic29sdXRlXCIgPyBwYXJlbnQub2Zmc2V0UGFyZW50IDogcGFyZW50Tm9kZShwYXJlbnQpO1xuICAgIH1cbn1cbi8vIFN0b3JlIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIGVkaXRvcidzIHBhcmVudCBub2RlcywgYWxvbmcgd2l0aFxuLy8gdGhlIHRvcCBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IG5lYXIgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLCB3aGljaFxuLy8gd2lsbCBiZSB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgdmlzaWJsZSB2aWV3cG9ydCByZW1haW5zIHN0YWJsZSBldmVuXG4vLyB3aGVuIHRoZSBzaXplIG9mIHRoZSBjb250ZW50IGFib3ZlIGNoYW5nZXMuXG5mdW5jdGlvbiBzdG9yZVNjcm9sbFBvcyh2aWV3KSB7XG4gICAgbGV0IHJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRZID0gTWF0aC5tYXgoMCwgcmVjdC50b3ApO1xuICAgIGxldCByZWZET00sIHJlZlRvcDtcbiAgICBmb3IgKGxldCB4ID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiwgeSA9IHN0YXJ0WSArIDE7IHkgPCBNYXRoLm1pbihpbm5lckhlaWdodCwgcmVjdC5ib3R0b20pOyB5ICs9IDUpIHtcbiAgICAgICAgbGV0IGRvbSA9IHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoIWRvbSB8fCBkb20gPT0gdmlldy5kb20gfHwgIXZpZXcuZG9tLmNvbnRhaW5zKGRvbSkpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvY2FsUmVjdCA9IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGxvY2FsUmVjdC50b3AgPj0gc3RhcnRZIC0gMjApIHtcbiAgICAgICAgICAgIHJlZkRPTSA9IGRvbTtcbiAgICAgICAgICAgIHJlZlRvcCA9IGxvY2FsUmVjdC50b3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZWZET006IHJlZkRPTSwgcmVmVG9wOiByZWZUb3AsIHN0YWNrOiBzY3JvbGxTdGFjayh2aWV3LmRvbSkgfTtcbn1cbmZ1bmN0aW9uIHNjcm9sbFN0YWNrKGRvbSkge1xuICAgIGxldCBzdGFjayA9IFtdLCBkb2MgPSBkb20ub3duZXJEb2N1bWVudDtcbiAgICBmb3IgKGxldCBjdXIgPSBkb207IGN1cjsgY3VyID0gcGFyZW50Tm9kZShjdXIpKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyBkb206IGN1ciwgdG9wOiBjdXIuc2Nyb2xsVG9wLCBsZWZ0OiBjdXIuc2Nyb2xsTGVmdCB9KTtcbiAgICAgICAgaWYgKGRvbSA9PSBkb2MpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHN0YWNrO1xufVxuLy8gUmVzZXQgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzIHRvIHRoYXQgd2hhdFxuLy8gaXQgd2FzIGJlZm9yZSwgd2hlbiBzdG9yZVNjcm9sbFBvcyB3YXMgY2FsbGVkLlxuZnVuY3Rpb24gcmVzZXRTY3JvbGxQb3MoeyByZWZET00sIHJlZlRvcCwgc3RhY2sgfSkge1xuICAgIGxldCBuZXdSZWZUb3AgPSByZWZET00gPyByZWZET00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogMDtcbiAgICByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIG5ld1JlZlRvcCA9PSAwID8gMCA6IG5ld1JlZlRvcCAtIHJlZlRvcCk7XG59XG5mdW5jdGlvbiByZXN0b3JlU2Nyb2xsU3RhY2soc3RhY2ssIGRUb3ApIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB7IGRvbSwgdG9wLCBsZWZ0IH0gPSBzdGFja1tpXTtcbiAgICAgICAgaWYgKGRvbS5zY3JvbGxUb3AgIT0gdG9wICsgZFRvcClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxUb3AgPSB0b3AgKyBkVG9wO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbExlZnQgIT0gbGVmdClcbiAgICAgICAgICAgIGRvbS5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG59XG5sZXQgcHJldmVudFNjcm9sbFN1cHBvcnRlZCA9IG51bGw7XG4vLyBGZWF0dXJlLWRldGVjdHMgc3VwcG9ydCBmb3IgLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiB0cnVlfSksIGFuZCB1c2VzXG4vLyBhIGZhbGxiYWNrIGtsdWRnZSB3aGVuIG5vdCBzdXBwb3J0ZWQuXG5mdW5jdGlvbiBmb2N1c1ByZXZlbnRTY3JvbGwoZG9tKSB7XG4gICAgaWYgKGRvbS5zZXRBY3RpdmUpXG4gICAgICAgIHJldHVybiBkb20uc2V0QWN0aXZlKCk7IC8vIGluIElFXG4gICAgaWYgKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQpXG4gICAgICAgIHJldHVybiBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCk7XG4gICAgbGV0IHN0b3JlZCA9IHNjcm9sbFN0YWNrKGRvbSk7XG4gICAgZG9tLmZvY3VzKHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPT0gbnVsbCA/IHtcbiAgICAgICAgZ2V0IHByZXZlbnRTY3JvbGwoKSB7XG4gICAgICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0geyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0gOiB1bmRlZmluZWQpO1xuICAgIGlmICghcHJldmVudFNjcm9sbFN1cHBvcnRlZCkge1xuICAgICAgICBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdG9yZWQsIDApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJbk5vZGUobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGNsb3Nlc3QsIGR4Q2xvc2VzdCA9IDJlOCwgY29vcmRzQ2xvc2VzdCwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgcm93Qm90ID0gY29vcmRzLnRvcCwgcm93VG9wID0gY29vcmRzLnRvcDtcbiAgICBsZXQgZmlyc3RCZWxvdywgY29vcmRzQmVsb3c7XG4gICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQsIGNoaWxkSW5kZXggPSAwOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZywgY2hpbGRJbmRleCsrKSB7XG4gICAgICAgIGxldCByZWN0cztcbiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZWN0cyA9IHRleHRSYW5nZShjaGlsZCkuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gcmVjdHNbaV07XG4gICAgICAgICAgICBpZiAocmVjdC50b3AgPD0gcm93Qm90ICYmIHJlY3QuYm90dG9tID49IHJvd1RvcCkge1xuICAgICAgICAgICAgICAgIHJvd0JvdCA9IE1hdGgubWF4KHJlY3QuYm90dG9tLCByb3dCb3QpO1xuICAgICAgICAgICAgICAgIHJvd1RvcCA9IE1hdGgubWluKHJlY3QudG9wLCByb3dUb3ApO1xuICAgICAgICAgICAgICAgIGxldCBkeCA9IHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gcmVjdC5sZWZ0IC0gY29vcmRzLmxlZnRcbiAgICAgICAgICAgICAgICAgICAgOiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyBjb29yZHMubGVmdCAtIHJlY3QucmlnaHQgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChkeCA8IGR4Q2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGR4Q2xvc2VzdCA9IGR4O1xuICAgICAgICAgICAgICAgICAgICBjb29yZHNDbG9zZXN0ID0gZHggJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0ID8gcmVjdC5yaWdodCA6IHJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogY29vcmRzLnRvcFxuICAgICAgICAgICAgICAgICAgICB9IDogY29vcmRzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSAmJiBkeClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVjdC50b3AgPiBjb29yZHMudG9wICYmICFmaXJzdEJlbG93ICYmIHJlY3QubGVmdCA8PSBjb29yZHMubGVmdCAmJiByZWN0LnJpZ2h0ID49IGNvb3Jkcy5sZWZ0KSB7XG4gICAgICAgICAgICAgICAgZmlyc3RCZWxvdyA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGNvb3Jkc0JlbG93ID0geyBsZWZ0OiBNYXRoLm1heChyZWN0LmxlZnQsIE1hdGgubWluKHJlY3QucmlnaHQsIGNvb3Jkcy5sZWZ0KSksIHRvcDogcmVjdC50b3AgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xvc2VzdCAmJiAoY29vcmRzLmxlZnQgPj0gcmVjdC5yaWdodCAmJiBjb29yZHMudG9wID49IHJlY3QudG9wIHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC5ib3R0b20pKVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IGNoaWxkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY2xvc2VzdCAmJiBmaXJzdEJlbG93KSB7XG4gICAgICAgIGNsb3Nlc3QgPSBmaXJzdEJlbG93O1xuICAgICAgICBjb29yZHNDbG9zZXN0ID0gY29vcmRzQmVsb3c7XG4gICAgICAgIGR4Q2xvc2VzdCA9IDA7XG4gICAgfVxuICAgIGlmIChjbG9zZXN0ICYmIGNsb3Nlc3Qubm9kZVR5cGUgPT0gMylcbiAgICAgICAgcmV0dXJuIGZpbmRPZmZzZXRJblRleHQoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG4gICAgaWYgKCFjbG9zZXN0IHx8IChkeENsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAxKSlcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0IH07XG4gICAgcmV0dXJuIGZpbmRPZmZzZXRJbk5vZGUoY2xvc2VzdCwgY29vcmRzQ2xvc2VzdCk7XG59XG5mdW5jdGlvbiBmaW5kT2Zmc2V0SW5UZXh0KG5vZGUsIGNvb3Jkcykge1xuICAgIGxldCBsZW4gPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBpICsgMSk7XG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KG5vZGUsIGkpO1xuICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QocmFuZ2UsIDEpO1xuICAgICAgICBpZiAocmVjdC50b3AgPT0gcmVjdC5ib3R0b20pXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiBpICsgKGNvb3Jkcy5sZWZ0ID49IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogMCkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZSwgb2Zmc2V0OiAwIH07XG59XG5mdW5jdGlvbiBpblJlY3QoY29vcmRzLCByZWN0KSB7XG4gICAgcmV0dXJuIGNvb3Jkcy5sZWZ0ID49IHJlY3QubGVmdCAtIDEgJiYgY29vcmRzLmxlZnQgPD0gcmVjdC5yaWdodCArIDEgJiZcbiAgICAgICAgY29vcmRzLnRvcCA+PSByZWN0LnRvcCAtIDEgJiYgY29vcmRzLnRvcCA8PSByZWN0LmJvdHRvbSArIDE7XG59XG5mdW5jdGlvbiB0YXJnZXRLbHVkZ2UoZG9tLCBjb29yZHMpIHtcbiAgICBsZXQgcGFyZW50ID0gZG9tLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCAmJiAvXmxpJC9pLnRlc3QocGFyZW50Lm5vZGVOYW1lKSAmJiBjb29yZHMubGVmdCA8IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KVxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIHJldHVybiBkb207XG59XG5mdW5jdGlvbiBwb3NGcm9tRWxlbWVudCh2aWV3LCBlbHQsIGNvb3Jkcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gZmluZE9mZnNldEluTm9kZShlbHQsIGNvb3JkcyksIGJpYXMgPSAtMTtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmICFub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbGV0IHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBiaWFzID0gcmVjdC5sZWZ0ICE9IHJlY3QucmlnaHQgJiYgY29vcmRzLmxlZnQgPiAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgICByZXR1cm4gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcykge1xuICAgIC8vIEJyb3dzZXIgKGluIGNhcmV0UG9zaXRpb24vUmFuZ2VGcm9tUG9pbnQpIHdpbGwgYWdyZXNzaXZlbHlcbiAgICAvLyBub3JtYWxpemUgdG93YXJkcyBuZWFyYnkgaW5saW5lIG5vZGVzLiBTaW5jZSB3ZSBhcmUgaW50ZXJlc3RlZCBpblxuICAgIC8vIHBvc2l0aW9ucyBiZXR3ZWVuIGJsb2NrIG5vZGVzIHRvbywgd2UgZmlyc3Qgd2FsayB1cCB0aGUgaGllcmFyY2h5XG4gICAgLy8gb2Ygbm9kZXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBibG9jayBub2RlcyB0aGF0IHRoZSBjb29yZGluYXRlc1xuICAgIC8vIGZhbGwgb3V0c2lkZSBvZi4gSWYgc28sIHdlIHRha2UgdGhlIHBvc2l0aW9uIGJlZm9yZS9hZnRlciB0aGF0XG4gICAgLy8gYmxvY2suIElmIG5vdCwgd2UgY2FsbCBgcG9zRnJvbURPTWAgb24gdGhlIHJhdyBub2RlL29mZnNldC5cbiAgICBsZXQgb3V0c2lkZUJsb2NrID0gLTE7XG4gICAgZm9yIChsZXQgY3VyID0gbm9kZSwgc2F3QmxvY2sgPSBmYWxzZTs7KSB7XG4gICAgICAgIGlmIChjdXIgPT0gdmlldy5kb20pXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY3VyLCB0cnVlKSwgcmVjdDtcbiAgICAgICAgaWYgKCFkZXNjKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChkZXNjLmRvbS5ub2RlVHlwZSA9PSAxICYmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCB8fCAhZGVzYy5jb250ZW50RE9NKSAmJlxuICAgICAgICAgICAgLy8gSWdub3JlIGVsZW1lbnRzIHdpdGggemVyby1zaXplIGJvdW5kaW5nIHJlY3RhbmdsZXNcbiAgICAgICAgICAgICgocmVjdCA9IGRlc2MuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS53aWR0aCB8fCByZWN0LmhlaWdodCkpIHtcbiAgICAgICAgICAgIGlmIChkZXNjLm5vZGUuaXNCbG9jayAmJiBkZXNjLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbHkgdGhlIGhvcml6b250YWwgdGVzdCB0byB0aGUgaW5uZXJtb3N0IGJsb2NrLiBWZXJ0aWNhbCBmb3IgYW55IHBhcmVudC5cbiAgICAgICAgICAgICAgICBpZiAoIXNhd0Jsb2NrICYmIHJlY3QubGVmdCA+IGNvb3Jkcy5sZWZ0IHx8IHJlY3QudG9wID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZUJsb2NrID0gZGVzYy5wb3NCZWZvcmU7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXNhd0Jsb2NrICYmIHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCB8fCByZWN0LmJvdHRvbSA8IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG91dHNpZGVCbG9jayA9IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICAgICAgc2F3QmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkZXNjLmNvbnRlbnRET00gJiYgb3V0c2lkZUJsb2NrIDwgMCAmJiAhZGVzYy5ub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbnNpZGUgYSBsZWFmLCByZXR1cm4gdGhlIHNpZGUgb2YgdGhlIGxlYWYgY2xvc2VyIHRvIHRoZSBjb29yZHNcbiAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gZGVzYy5ub2RlLmlzQmxvY2sgPyBjb29yZHMudG9wIDwgKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMlxuICAgICAgICAgICAgICAgICAgICA6IGNvb3Jkcy5sZWZ0IDwgKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlID8gZGVzYy5wb3NCZWZvcmUgOiBkZXNjLnBvc0FmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGRlc2MuZG9tLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBvdXRzaWRlQmxvY2sgPiAtMSA/IG91dHNpZGVCbG9jayA6IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgLTEpO1xufVxuZnVuY3Rpb24gZWxlbWVudEZyb21Qb2ludChlbGVtZW50LCBjb29yZHMsIGJveCkge1xuICAgIGxldCBsZW4gPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgIGlmIChsZW4gJiYgYm94LnRvcCA8IGJveC5ib3R0b20pIHtcbiAgICAgICAgZm9yIChsZXQgc3RhcnRJID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obGVuIC0gMSwgTWF0aC5mbG9vcihsZW4gKiAoY29vcmRzLnRvcCAtIGJveC50b3ApIC8gKGJveC5ib3R0b20gLSBib3gudG9wKSkgLSAyKSksIGkgPSBzdGFydEk7Oykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdHMgPSBjaGlsZC5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVjdHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluUmVjdChjb29yZHMsIHJlY3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRGcm9tUG9pbnQoY2hpbGQsIGNvb3JkcywgcmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChpID0gKGkgKyAxKSAlIGxlbikgPT0gc3RhcnRJKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xufVxuLy8gR2l2ZW4gYW4geCx5IHBvc2l0aW9uIG9uIHRoZSBlZGl0b3IsIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LlxuZnVuY3Rpb24gcG9zQXRDb29yZHModmlldywgY29vcmRzKSB7XG4gICAgbGV0IGRvYyA9IHZpZXcuZG9tLm93bmVyRG9jdW1lbnQsIG5vZGUsIG9mZnNldCA9IDA7XG4gICAgbGV0IGNhcmV0ID0gY2FyZXRGcm9tUG9pbnQoZG9jLCBjb29yZHMubGVmdCwgY29vcmRzLnRvcCk7XG4gICAgaWYgKGNhcmV0KVxuICAgICAgICAoeyBub2RlLCBvZmZzZXQgfSA9IGNhcmV0KTtcbiAgICBsZXQgZWx0ID0gKHZpZXcucm9vdC5lbGVtZW50RnJvbVBvaW50ID8gdmlldy5yb290IDogZG9jKVxuICAgICAgICAuZWxlbWVudEZyb21Qb2ludChjb29yZHMubGVmdCwgY29vcmRzLnRvcCk7XG4gICAgbGV0IHBvcztcbiAgICBpZiAoIWVsdCB8fCAhdmlldy5kb20uY29udGFpbnMoZWx0Lm5vZGVUeXBlICE9IDEgPyBlbHQucGFyZW50Tm9kZSA6IGVsdCkpIHtcbiAgICAgICAgbGV0IGJveCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoIWluUmVjdChjb29yZHMsIGJveCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgZWx0ID0gZWxlbWVudEZyb21Qb2ludCh2aWV3LmRvbSwgY29vcmRzLCBib3gpO1xuICAgICAgICBpZiAoIWVsdClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBTYWZhcmkncyBjYXJldFJhbmdlRnJvbVBvaW50IHJldHVybnMgbm9uc2Vuc2Ugd2hlbiBvbiBhIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgaWYgKHNhZmFyaSkge1xuICAgICAgICBmb3IgKGxldCBwID0gZWx0OyBub2RlICYmIHA7IHAgPSBwYXJlbnROb2RlKHApKVxuICAgICAgICAgICAgaWYgKHAuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIG5vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsdCA9IHRhcmdldEtsdWRnZShlbHQsIGNvb3Jkcyk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgICAgaWYgKGdlY2tvICYmIG5vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgLy8gRmlyZWZveCB3aWxsIHNvbWV0aW1lcyByZXR1cm4gb2Zmc2V0cyBpbnRvIDxpbnB1dD4gbm9kZXMsIHdoaWNoXG4gICAgICAgICAgICAvLyBoYXZlIG5vIGFjdHVhbCBjaGlsZHJlbiwgZnJvbSBjYXJldFBvc2l0aW9uRnJvbVBvaW50ICgjOTUzKVxuICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5taW4ob2Zmc2V0LCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIEl0J2xsIGFsc28gbW92ZSB0aGUgcmV0dXJuZWQgcG9zaXRpb24gYmVmb3JlIGltYWdlIG5vZGVzLFxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aG9zZSBhcmUgYmVoaW5kIGl0LlxuICAgICAgICAgICAgaWYgKG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdLCBib3g7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiAoYm94ID0gbmV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkucmlnaHQgPD0gY29vcmRzLmxlZnQgJiZcbiAgICAgICAgICAgICAgICAgICAgYm94LmJvdHRvbSA+IGNvb3Jkcy50b3ApXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwcmV2O1xuICAgICAgICAvLyBXaGVuIGNsaWNraW5nIGFib3ZlIHRoZSByaWdodCBzaWRlIG9mIGFuIHVuZWRpdGFibGUgbm9kZSwgQ2hyb21lIHdpbGwgcmVwb3J0IGEgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHRoYXQgbm9kZS5cbiAgICAgICAgaWYgKHdlYmtpdCAmJiBvZmZzZXQgJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIChwcmV2ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdKS5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIgJiYgcHJldi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPj0gY29vcmRzLnRvcClcbiAgICAgICAgICAgIG9mZnNldC0tO1xuICAgICAgICAvLyBTdXNwaWNpb3VzbHkgc3BlY2lmaWMga2x1ZGdlIHRvIHdvcmsgYXJvdW5kIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyBuZXZlciByZXR1cm5pbmcgYSBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICBpZiAobm9kZSA9PSB2aWV3LmRvbSAmJiBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDEgJiYgbm9kZS5sYXN0Q2hpbGQubm9kZVR5cGUgPT0gMSAmJlxuICAgICAgICAgICAgY29vcmRzLnRvcCA+IG5vZGUubGFzdENoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSlcbiAgICAgICAgICAgIHBvcyA9IHZpZXcuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZTtcbiAgICAgICAgLy8gSWdub3JlIHBvc2l0aW9ucyBkaXJlY3RseSBhZnRlciBhIEJSLCBzaW5jZSBjYXJldCpGcm9tUG9pbnRcbiAgICAgICAgLy8gJ3JvdW5kIHVwJyBwb3NpdGlvbnMgdGhhdCB3b3VsZCBiZSBtb3JlIGFjY3VyYXRlbHkgcGxhY2VkXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgQlIgbm9kZS5cbiAgICAgICAgZWxzZSBpZiAob2Zmc2V0ID09IDAgfHwgbm9kZS5ub2RlVHlwZSAhPSAxIHx8IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXS5ub2RlTmFtZSAhPSBcIkJSXCIpXG4gICAgICAgICAgICBwb3MgPSBwb3NGcm9tQ2FyZXQodmlldywgbm9kZSwgb2Zmc2V0LCBjb29yZHMpO1xuICAgIH1cbiAgICBpZiAocG9zID09IG51bGwpXG4gICAgICAgIHBvcyA9IHBvc0Zyb21FbGVtZW50KHZpZXcsIGVsdCwgY29vcmRzKTtcbiAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhlbHQsIHRydWUpO1xuICAgIHJldHVybiB7IHBvcywgaW5zaWRlOiBkZXNjID8gZGVzYy5wb3NBdFN0YXJ0IC0gZGVzYy5ib3JkZXIgOiAtMSB9O1xufVxuZnVuY3Rpb24gbm9uWmVybyhyZWN0KSB7XG4gICAgcmV0dXJuIHJlY3QudG9wIDwgcmVjdC5ib3R0b20gfHwgcmVjdC5sZWZ0IDwgcmVjdC5yaWdodDtcbn1cbmZ1bmN0aW9uIHNpbmdsZVJlY3QodGFyZ2V0LCBiaWFzKSB7XG4gICAgbGV0IHJlY3RzID0gdGFyZ2V0LmdldENsaWVudFJlY3RzKCk7XG4gICAgaWYgKHJlY3RzLmxlbmd0aCkge1xuICAgICAgICBsZXQgZmlyc3QgPSByZWN0c1tiaWFzIDwgMCA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKG5vblplcm8oZmlyc3QpKVxuICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbmQuY2FsbChyZWN0cywgbm9uWmVybykgfHwgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufVxuY29uc3QgQklESSA9IC9bXFx1MDU5MC1cXHUwNWY0XFx1MDYwMC1cXHUwNmZmXFx1MDcwMC1cXHUwOGFjXS87XG4vLyBHaXZlbiBhIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCBtb2RlbCwgZ2V0IGEgYm91bmRpbmcgYm94IG9mIHRoZVxuLy8gY2hhcmFjdGVyIGF0IHRoYXQgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cuXG5mdW5jdGlvbiBjb29yZHNBdFBvcyh2aWV3LCBwb3MsIHNpZGUpIHtcbiAgICBsZXQgeyBub2RlLCBvZmZzZXQsIGF0b20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgIGxldCBzdXBwb3J0RW1wdHlSYW5nZSA9IHdlYmtpdCB8fCBnZWNrbztcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgIC8vIFRoZXNlIGJyb3dzZXJzIHN1cHBvcnQgcXVlcnlpbmcgZW1wdHkgdGV4dCByYW5nZXMuIFByZWZlciB0aGF0IGluXG4gICAgICAgIC8vIGJpZGkgY29udGV4dCBvciB3aGVuIGF0IHRoZSBlbmQgb2YgYSBub2RlLlxuICAgICAgICBpZiAoc3VwcG9ydEVtcHR5UmFuZ2UgJiYgKEJJREkudGVzdChub2RlLm5vZGVWYWx1ZSkgfHwgKHNpZGUgPCAwID8gIW9mZnNldCA6IG9mZnNldCA9PSBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpKSkge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBvZmZzZXQsIG9mZnNldCksIHNpZGUpO1xuICAgICAgICAgICAgLy8gRmlyZWZveCByZXR1cm5zIGJhZCByZXN1bHRzICh0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSBzcGFjZSlcbiAgICAgICAgICAgIC8vIHdoZW4gcXVlcnlpbmcgYSBwb3NpdGlvbiBkaXJlY3RseSBhZnRlciBsaW5lLWJyb2tlblxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZS4gRGV0ZWN0IHRoaXMgc2l0dWF0aW9uIGFuZCBhbmQga2x1ZGdlIGFyb3VuZCBpdFxuICAgICAgICAgICAgaWYgKGdlY2tvICYmIG9mZnNldCAmJiAvXFxzLy50ZXN0KG5vZGUubm9kZVZhbHVlW29mZnNldCAtIDFdKSAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVjdEJlZm9yZSA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCAtIDEsIG9mZnNldCAtIDEpLCAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY3RCZWZvcmUudG9wID09IHJlY3QudG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWN0QWZ0ZXIgPSBzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBvZmZzZXQsIG9mZnNldCArIDEpLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0QWZ0ZXIudG9wICE9IHJlY3QudG9wKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYXR0ZW5WKHJlY3RBZnRlciwgcmVjdEFmdGVyLmxlZnQgPCByZWN0QmVmb3JlLmxlZnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBvZmZzZXQsIHRvID0gb2Zmc2V0LCB0YWtlU2lkZSA9IHNpZGUgPCAwID8gMSA6IC0xO1xuICAgICAgICAgICAgaWYgKHNpZGUgPCAwICYmICFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0bysrO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaWRlID49IDAgJiYgb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgICAgICB0YWtlU2lkZSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzaWRlIDwgMCkge1xuICAgICAgICAgICAgICAgIGZyb20tLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgZnJvbSwgdG8pLCB0YWtlU2lkZSksIHRha2VTaWRlIDwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0ICRkb20gPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcyAtIChhdG9tIHx8IDApKTtcbiAgICAvLyBSZXR1cm4gYSBob3Jpem9udGFsIGxpbmUgaW4gYmxvY2sgY29udGV4dFxuICAgIGlmICghJGRvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCAmJiAoc2lkZSA8IDAgfHwgb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlbkgoYmVmb3JlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBpZiAoYWZ0ZXIubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlbkgoYWZ0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0dGVuSChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBzaWRlID49IDApO1xuICAgIH1cbiAgICAvLyBJbmxpbmUsIG5vdCBpbiB0ZXh0IG5vZGUgKHRoaXMgaXMgbm90IEJpZGktc2FmZSlcbiAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCAmJiAoc2lkZSA8IDAgfHwgb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gYmVmb3JlLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYmVmb3JlLCBub2RlU2l6ZShiZWZvcmUpIC0gKHN1cHBvcnRFbXB0eVJhbmdlID8gMCA6IDEpKVxuICAgICAgICAgICAgLy8gQlIgbm9kZXMgdGVuZCB0byBvbmx5IHJldHVybiB0aGUgcmVjdGFuZ2xlIGJlZm9yZSB0aGVtLlxuICAgICAgICAgICAgLy8gT25seSB1c2UgdGhlbSBpZiB0aGV5IGFyZSB0aGUgbGFzdCBlbGVtZW50IGluIHRoZWlyIHBhcmVudFxuICAgICAgICAgICAgOiBiZWZvcmUubm9kZVR5cGUgPT0gMSAmJiAoYmVmb3JlLm5vZGVOYW1lICE9IFwiQlJcIiB8fCAhYmVmb3JlLm5leHRTaWJsaW5nKSA/IGJlZm9yZSA6IG51bGw7XG4gICAgICAgIGlmICh0YXJnZXQpXG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0YXJnZXQsIDEpLCBmYWxzZSk7XG4gICAgfVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0IDwgbm9kZVNpemUobm9kZSkpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIHdoaWxlIChhZnRlci5wbVZpZXdEZXNjICYmIGFmdGVyLnBtVmlld0Rlc2MuaWdub3JlRm9yQ29vcmRzKVxuICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5uZXh0U2libGluZztcbiAgICAgICAgbGV0IHRhcmdldCA9ICFhZnRlciA/IG51bGwgOiBhZnRlci5ub2RlVHlwZSA9PSAzID8gdGV4dFJhbmdlKGFmdGVyLCAwLCAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICA6IGFmdGVyLm5vZGVUeXBlID09IDEgPyBhZnRlciA6IG51bGw7XG4gICAgICAgIGlmICh0YXJnZXQpXG4gICAgICAgICAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdCh0YXJnZXQsIC0xKSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIEFsbCBlbHNlIGZhaWxlZCwganVzdCB0cnkgdG8gZ2V0IGEgcmVjdGFuZ2xlIGZvciB0aGUgdGFyZ2V0IG5vZGVcbiAgICByZXR1cm4gZmxhdHRlblYoc2luZ2xlUmVjdChub2RlLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2Uobm9kZSkgOiBub2RlLCAtc2lkZSksIHNpZGUgPj0gMCk7XG59XG5mdW5jdGlvbiBmbGF0dGVuVihyZWN0LCBsZWZ0KSB7XG4gICAgaWYgKHJlY3Qud2lkdGggPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHggPSBsZWZ0ID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodDtcbiAgICByZXR1cm4geyB0b3A6IHJlY3QudG9wLCBib3R0b206IHJlY3QuYm90dG9tLCBsZWZ0OiB4LCByaWdodDogeCB9O1xufVxuZnVuY3Rpb24gZmxhdHRlbkgocmVjdCwgdG9wKSB7XG4gICAgaWYgKHJlY3QuaGVpZ2h0ID09IDApXG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIGxldCB5ID0gdG9wID8gcmVjdC50b3AgOiByZWN0LmJvdHRvbTtcbiAgICByZXR1cm4geyB0b3A6IHksIGJvdHRvbTogeSwgbGVmdDogcmVjdC5sZWZ0LCByaWdodDogcmVjdC5yaWdodCB9O1xufVxuZnVuY3Rpb24gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgZikge1xuICAgIGxldCB2aWV3U3RhdGUgPSB2aWV3LnN0YXRlLCBhY3RpdmUgPSB2aWV3LnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICBpZiAodmlld1N0YXRlICE9IHN0YXRlKVxuICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcbiAgICBpZiAoYWN0aXZlICE9IHZpZXcuZG9tKVxuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGYoKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXdTdGF0ZSk7XG4gICAgICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20gJiYgYWN0aXZlKVxuICAgICAgICAgICAgYWN0aXZlLmZvY3VzKCk7XG4gICAgfVxufVxuLy8gV2hldGhlciB2ZXJ0aWNhbCBwb3NpdGlvbiBtb3Rpb24gaW4gYSBnaXZlbiBkaXJlY3Rpb25cbi8vIGZyb20gYSBwb3NpdGlvbiB3b3VsZCBsZWF2ZSBhIHRleHQgYmxvY2suXG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja1ZlcnRpY2FsKHZpZXcsIHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgc2VsID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkcG9zID0gZGlyID09IFwidXBcIiA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgcmV0dXJuIHdpdGhGbHVzaGVkU3RhdGUodmlldywgc3RhdGUsICgpID0+IHtcbiAgICAgICAgbGV0IHsgbm9kZTogZG9tIH0gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcygkcG9zLnBvcywgZGlyID09IFwidXBcIiA/IC0xIDogMSk7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBuZWFyZXN0ID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGRvbSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIW5lYXJlc3QpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBpZiAobmVhcmVzdC5ub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICBkb20gPSBuZWFyZXN0LmNvbnRlbnRET00gfHwgbmVhcmVzdC5kb207XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20gPSBuZWFyZXN0LmRvbS5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb29yZHMgPSBjb29yZHNBdFBvcyh2aWV3LCAkcG9zLnBvcywgMSk7XG4gICAgICAgIGZvciAobGV0IGNoaWxkID0gZG9tLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBsZXQgYm94ZXM7XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgICAgICBib3hlcyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgIGJveGVzID0gdGV4dFJhbmdlKGNoaWxkLCAwLCBjaGlsZC5ub2RlVmFsdWUubGVuZ3RoKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBib3ggPSBib3hlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoYm94LmJvdHRvbSA+IGJveC50b3AgKyAxICYmXG4gICAgICAgICAgICAgICAgICAgIChkaXIgPT0gXCJ1cFwiID8gY29vcmRzLnRvcCAtIGJveC50b3AgPiAoYm94LmJvdHRvbSAtIGNvb3Jkcy50b3ApICogMlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBib3guYm90dG9tIC0gY29vcmRzLmJvdHRvbSA+IChjb29yZHMuYm90dG9tIC0gYm94LnRvcCkgKiAyKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xufVxuY29uc3QgbWF5YmVSVEwgPSAvW1xcdTA1OTAtXFx1MDhhY10vO1xuZnVuY3Rpb24gZW5kT2ZUZXh0YmxvY2tIb3Jpem9udGFsKHZpZXcsIHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9ICRoZWFkLnBhcmVudE9mZnNldCwgYXRTdGFydCA9ICFvZmZzZXQsIGF0RW5kID0gb2Zmc2V0ID09ICRoZWFkLnBhcmVudC5jb250ZW50LnNpemU7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uKCk7XG4gICAgaWYgKCFzZWwpXG4gICAgICAgIHJldHVybiAkaGVhZC5wb3MgPT0gJGhlYWQuc3RhcnQoKSB8fCAkaGVhZC5wb3MgPT0gJGhlYWQuZW5kKCk7XG4gICAgLy8gSWYgdGhlIHRleHRibG9jayBpcyBhbGwgTFRSLCBvciB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnRcbiAgICAvLyBTZWxlY3Rpb24ubW9kaWZ5IChFZGdlKSwgZmFsbCBiYWNrIHRvIGEgcHJpbWl0aXZlIGFwcHJvYWNoXG4gICAgaWYgKCFtYXliZVJUTC50ZXN0KCRoZWFkLnBhcmVudC50ZXh0Q29udGVudCkgfHwgIXNlbC5tb2RpZnkpXG4gICAgICAgIHJldHVybiBkaXIgPT0gXCJsZWZ0XCIgfHwgZGlyID09IFwiYmFja3dhcmRcIiA/IGF0U3RhcnQgOiBhdEVuZDtcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICAvLyBUaGlzIGlzIGEgaHVnZSBoYWNrLCBidXQgYXBwZWFycyB0byBiZSB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gY3VycmVudGx5IGRvOiB1c2UgYFNlbGVjdGlvbi5tb2RpZnlgIHRvIG1vdmUgdGhlIHNlbGVjdGlvbiBieVxuICAgICAgICAvLyBvbmUgY2hhcmFjdGVyLCBhbmQgc2VlIGlmIHRoYXQgbW92ZXMgdGhlIGN1cnNvciBvdXQgb2YgdGhlXG4gICAgICAgIC8vIHRleHRibG9jayAob3IgZG9lc24ndCBtb3ZlIGl0IGF0IGFsbCwgd2hlbiBhdCB0aGUgc3RhcnQvZW5kIG9mXG4gICAgICAgIC8vIHRoZSBkb2N1bWVudCkuXG4gICAgICAgIGxldCB7IGZvY3VzTm9kZTogb2xkTm9kZSwgZm9jdXNPZmZzZXQ6IG9sZE9mZiwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0IH0gPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBvbGRCaWRpTGV2ZWwgPSBzZWwuY2FyZXRCaWRpTGV2ZWwgLy8gT25seSBmb3IgRmlyZWZveFxuICAgICAgICA7XG4gICAgICAgIHNlbC5tb2RpZnkoXCJtb3ZlXCIsIGRpciwgXCJjaGFyYWN0ZXJcIik7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSAkaGVhZC5kZXB0aCA/IHZpZXcuZG9jVmlldy5kb21BZnRlclBvcygkaGVhZC5iZWZvcmUoKSkgOiB2aWV3LmRvbTtcbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBuZXdOb2RlLCBmb2N1c09mZnNldDogbmV3T2ZmIH0gPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXdOb2RlICYmICFwYXJlbnRET00uY29udGFpbnMobmV3Tm9kZS5ub2RlVHlwZSA9PSAxID8gbmV3Tm9kZSA6IG5ld05vZGUucGFyZW50Tm9kZSkgfHxcbiAgICAgICAgICAgIChvbGROb2RlID09IG5ld05vZGUgJiYgb2xkT2ZmID09IG5ld09mZik7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHNlbGVjdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gICAgICAgICAgICBpZiAob2xkTm9kZSAmJiAob2xkTm9kZSAhPSBhbmNob3JOb2RlIHx8IG9sZE9mZiAhPSBhbmNob3JPZmZzZXQpICYmIHNlbC5leHRlbmQpXG4gICAgICAgICAgICAgICAgc2VsLmV4dGVuZChvbGROb2RlLCBvbGRPZmYpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgaWYgKG9sZEJpZGlMZXZlbCAhPSBudWxsKVxuICAgICAgICAgICAgc2VsLmNhcmV0QmlkaUxldmVsID0gb2xkQmlkaUxldmVsO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xufVxubGV0IGNhY2hlZFN0YXRlID0gbnVsbDtcbmxldCBjYWNoZWREaXIgPSBudWxsO1xubGV0IGNhY2hlZFJlc3VsdCA9IGZhbHNlO1xuZnVuY3Rpb24gZW5kT2ZUZXh0YmxvY2sodmlldywgc3RhdGUsIGRpcikge1xuICAgIGlmIChjYWNoZWRTdGF0ZSA9PSBzdGF0ZSAmJiBjYWNoZWREaXIgPT0gZGlyKVxuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIGNhY2hlZFN0YXRlID0gc3RhdGU7XG4gICAgY2FjaGVkRGlyID0gZGlyO1xuICAgIHJldHVybiBjYWNoZWRSZXN1bHQgPSBkaXIgPT0gXCJ1cFwiIHx8IGRpciA9PSBcImRvd25cIlxuICAgICAgICA/IGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcilcbiAgICAgICAgOiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcik7XG59XG5cbi8vIFZpZXcgZGVzY3JpcHRpb25zIGFyZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBkZXNjcmliZSB0aGUgRE9NIHRoYXQgaXNcbi8vIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBlZGl0b3IncyBjb250ZW50LiBUaGV5IGFyZSB1c2VkIGZvcjpcbi8vXG4vLyAtIEluY3JlbWVudGFsIHJlZHJhd2luZyB3aGVuIHRoZSBkb2N1bWVudCBjaGFuZ2VzXG4vL1xuLy8gLSBGaWd1cmluZyBvdXQgd2hhdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCBhIGdpdmVuIERPTSBwb3NpdGlvblxuLy8gICBjb3JyZXNwb25kcyB0b1xuLy9cbi8vIC0gV2lyaW5nIGluIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGVkaXRpbmcgaW50ZXJmYWNlIGZvciBhXG4vLyAgIGdpdmVuIG5vZGVcbi8vXG4vLyBUaGV5IGZvcm0gYSBkb3VibHktbGlua2VkIG11dGFibGUgdHJlZSwgc3RhcnRpbmcgYXQgYHZpZXcuZG9jVmlld2AuXG5jb25zdCBOT1RfRElSVFkgPSAwLCBDSElMRF9ESVJUWSA9IDEsIENPTlRFTlRfRElSVFkgPSAyLCBOT0RFX0RJUlRZID0gMztcbi8vIFN1cGVyY2xhc3MgZm9yIHRoZSB2YXJpb3VzIGtpbmRzIG9mIGRlc2NyaXB0aW9ucy4gRGVmaW5lcyB0aGVpclxuLy8gYmFzaWMgc3RydWN0dXJlIGFuZCBzaGFyZWQgbWV0aG9kcy5cbmNsYXNzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIGNoaWxkcmVuLCBkb20sIFxuICAgIC8vIFRoaXMgaXMgdGhlIG5vZGUgdGhhdCBob2xkcyB0aGUgY2hpbGQgdmlld3MuIEl0IG1heSBiZSBudWxsIGZvclxuICAgIC8vIGRlc2NzIHRoYXQgZG9uJ3QgaGF2ZSBjaGlsZHJlbi5cbiAgICBjb250ZW50RE9NKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuZG9tID0gZG9tO1xuICAgICAgICB0aGlzLmNvbnRlbnRET00gPSBjb250ZW50RE9NO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICAvLyBBbiBleHBhbmRvIHByb3BlcnR5IG9uIHRoZSBET00gbm9kZSBwcm92aWRlcyBhIGxpbmsgYmFjayB0byBpdHNcbiAgICAgICAgLy8gZGVzY3JpcHRpb24uXG4gICAgICAgIGRvbS5wbVZpZXdEZXNjID0gdGhpcztcbiAgICB9XG4gICAgLy8gVXNlZCB0byBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gZGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYVxuICAgIC8vIHdpZGdldC9tYXJrL25vZGUuXG4gICAgbWF0Y2hlc1dpZGdldCh3aWRnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbWF0Y2hlc01hcmsobWFyaykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzSGFjayhub2RlTmFtZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAvLyBXaGVuIHBhcnNpbmcgaW4tZWRpdG9yIGNvbnRlbnQgKGluIGRvbWNoYW5nZS5qcyksIHdlIGFsbG93XG4gICAgLy8gZGVzY3JpcHRpb25zIHRvIGRldGVybWluZSB0aGUgcGFyc2UgcnVsZXMgdGhhdCBzaG91bGQgYmUgdXNlZCB0b1xuICAgIC8vIHBhcnNlIHRoZW0uXG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8vIFVzZWQgYnkgdGhlIGVkaXRvcidzIGV2ZW50IGhhbmRsZXIgdG8gaWdub3JlIGV2ZW50cyB0aGF0IGNvbWVcbiAgICAvLyBmcm9tIGNlcnRhaW4gZGVzY3MuXG4gICAgc3RvcEV2ZW50KGV2ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFRoZSBzaXplIG9mIHRoZSBjb250ZW50IHJlcHJlc2VudGVkIGJ5IHRoaXMgZGVzYy5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgbGV0IHNpemUgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBzaXplICs9IHRoaXMuY2hpbGRyZW5baV0uc2l6ZTtcbiAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgfVxuICAgIC8vIEZvciBibG9jayBub2RlcywgdGhpcyByZXByZXNlbnRzIHRoZSBzcGFjZSB0YWtlbiB1cCBieSB0aGVpclxuICAgIC8vIHN0YXJ0L2VuZCB0b2tlbnMuXG4gICAgZ2V0IGJvcmRlcigpIHsgcmV0dXJuIDA7IH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuZG9tLnBtVmlld0Rlc2MgPT0gdGhpcylcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baV0uZGVzdHJveSgpO1xuICAgIH1cbiAgICBwb3NCZWZvcmVDaGlsZChjaGlsZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gdGhpcy5wb3NBdFN0YXJ0OzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjdXIgPT0gY2hpbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIHBvcyArPSBjdXIuc2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgcG9zQmVmb3JlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQucG9zQmVmb3JlQ2hpbGQodGhpcyk7XG4gICAgfVxuICAgIGdldCBwb3NBdFN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKSArIHRoaXMuYm9yZGVyIDogMDtcbiAgICB9XG4gICAgZ2V0IHBvc0FmdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NCZWZvcmUgKyB0aGlzLnNpemU7XG4gICAgfVxuICAgIGdldCBwb3NBdEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIHRoaXMuc2l6ZSAtIDIgKiB0aGlzLmJvcmRlcjtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIC8vIElmIHRoZSBET00gcG9zaXRpb24gaXMgaW4gdGhlIGNvbnRlbnQsIHVzZSB0aGUgY2hpbGQgZGVzYyBhZnRlclxuICAgICAgICAvLyBpdCB0byBmaWd1cmUgb3V0IGEgcG9zaXRpb24uXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NLmNvbnRhaW5zKGRvbS5ub2RlVHlwZSA9PSAxID8gZG9tIDogZG9tLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoYmlhcyA8IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9tQmVmb3JlLCBkZXNjO1xuICAgICAgICAgICAgICAgIGlmIChkb20gPT0gdGhpcy5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBkb21CZWZvcmUgPSBkb20ucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQmVmb3JlICYmICEoKGRlc2MgPSBkb21CZWZvcmUucG1WaWV3RGVzYykgJiYgZGVzYy5wYXJlbnQgPT0gdGhpcykpXG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbUJlZm9yZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbUJlZm9yZSA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgKyBkZXNjLnNpemUgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZG9tQWZ0ZXIsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQWZ0ZXIgPSBkb20uY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKGRvbUFmdGVyICYmICEoKGRlc2MgPSBkb21BZnRlci5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQWZ0ZXIgPSBkb21BZnRlci5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQWZ0ZXIgPyB0aGlzLnBvc0JlZm9yZUNoaWxkKGRlc2MpIDogdGhpcy5wb3NBdEVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSB2YXJpb3VzIGhldXJpc3RpY3MsIGZhbGxpbmcgYmFjayBvbiB0aGUgYmlhc1xuICAgICAgICAvLyBwYXJhbWV0ZXIsIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHJldHVybiB0aGUgcG9zaXRpb24gYXQgdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9yIGF0IHRoZSBlbmQgb2YgdGhpcyB2aWV3IGRlc2MuXG4gICAgICAgIGxldCBhdEVuZDtcbiAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmRvbSAmJiB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIGF0RW5kID0gb2Zmc2V0ID4gZG9tSW5kZXgodGhpcy5jb250ZW50RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NICE9IHRoaXMuZG9tICYmIHRoaXMuZG9tLmNvbnRhaW5zKHRoaXMuY29udGVudERPTSkpIHtcbiAgICAgICAgICAgIGF0RW5kID0gZG9tLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuY29udGVudERPTSkgJiAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9tLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMClcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2ggPSBkb207OyBzZWFyY2ggPSBzZWFyY2gucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoID09IHRoaXMuZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdEVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXRFbmQgPT0gbnVsbCAmJiBvZmZzZXQgPT0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2gubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhdEVuZCA9PSBudWxsID8gYmlhcyA+IDAgOiBhdEVuZCkgPyB0aGlzLnBvc0F0RW5kIDogdGhpcy5wb3NBdFN0YXJ0O1xuICAgIH1cbiAgICBuZWFyZXN0RGVzYyhkb20sIG9ubHlOb2RlcyA9IGZhbHNlKSB7XG4gICAgICAgIGZvciAobGV0IGZpcnN0ID0gdHJ1ZSwgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBsZXQgZGVzYyA9IHRoaXMuZ2V0RGVzYyhjdXIpLCBub2RlRE9NO1xuICAgICAgICAgICAgaWYgKGRlc2MgJiYgKCFvbmx5Tm9kZXMgfHwgZGVzYy5ub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGRvbSBpcyBvdXRzaWRlIG9mIHRoaXMgZGVzYydzIG5vZGVET00sIGRvbid0IGNvdW50IGl0LlxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCAmJiAobm9kZURPTSA9IGRlc2Mubm9kZURPTSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIShub2RlRE9NLm5vZGVUeXBlID09IDEgPyBub2RlRE9NLmNvbnRhaW5zKGRvbS5ub2RlVHlwZSA9PSAxID8gZG9tIDogZG9tLnBhcmVudE5vZGUpIDogbm9kZURPTSA9PSBkb20pKVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RGVzYyhkb20pIHtcbiAgICAgICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICAgICAgZm9yIChsZXQgY3VyID0gZGVzYzsgY3VyOyBjdXIgPSBjdXIucGFyZW50KVxuICAgICAgICAgICAgaWYgKGN1ciA9PSB0aGlzKVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjO1xuICAgIH1cbiAgICBwb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBkb207IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKHNjYW4pO1xuICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MubG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIGRlc2MgZm9yIHRoZSBub2RlIGFmdGVyIHRoZSBnaXZlbiBwb3MsIGlmIGFueS4gKFdoZW4gYVxuICAgIC8vIHBhcmVudCBub2RlIG92ZXJyb2RlIHJlbmRlcmluZywgdGhlcmUgbWlnaHQgbm90IGJlIG9uZS4pXG4gICAgZGVzY0F0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IHBvcyAmJiBlbmQgIT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFjaGlsZC5ib3JkZXIgJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbm5lciA9IGNoaWxkLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGlubmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgPCBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmRlc2NBdChwb3MgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zLCBzaWRlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5kb20sIG9mZnNldDogMCwgYXRvbTogcG9zICsgMSB9O1xuICAgICAgICAvLyBGaXJzdCBmaW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgY2hpbGQgYXJyYXlcbiAgICAgICAgbGV0IGkgPSAwLCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBjdXJQb3MgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gY3VyUG9zICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChlbmQgPiBwb3MgfHwgY2hpbGQgaW5zdGFuY2VvZiBUcmFpbGluZ0hhY2tWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IHBvcyAtIGN1clBvcztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1clBvcyA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIHBvaW50cyBpbnRvIHRoZSBtaWRkbGUgb2YgYSBjaGlsZCwgY2FsbCB0aHJvdWdoXG4gICAgICAgIGlmIChvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbltpXS5kb21Gcm9tUG9zKG9mZnNldCAtIHRoaXMuY2hpbGRyZW5baV0uYm9yZGVyLCBzaWRlKTtcbiAgICAgICAgLy8gR28gYmFjayBpZiB0aGVyZSB3ZXJlIGFueSB6ZXJvLWxlbmd0aCB3aWRnZXRzIHdpdGggc2lkZSA+PSAwIGJlZm9yZSB0aGlzIHBvaW50XG4gICAgICAgIGZvciAobGV0IHByZXY7IGkgJiYgIShwcmV2ID0gdGhpcy5jaGlsZHJlbltpIC0gMV0pLnNpemUgJiYgcHJldiBpbnN0YW5jZW9mIFdpZGdldFZpZXdEZXNjICYmIHByZXYuc2lkZSA+PSAwOyBpLS0pIHsgfVxuICAgICAgICAvLyBTY2FuIHRvd2FyZHMgdGhlIGZpcnN0IHVzZWFibGUgbm9kZVxuICAgICAgICBpZiAoc2lkZSA8PSAwKSB7XG4gICAgICAgICAgICBsZXQgcHJldiwgZW50ZXIgPSB0cnVlO1xuICAgICAgICAgICAgZm9yICg7OyBpLS0sIGVudGVyID0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gaSA/IHRoaXMuY2hpbGRyZW5baSAtIDFdIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXYgfHwgcHJldi5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXYgJiYgc2lkZSAmJiBlbnRlciAmJiAhcHJldi5ib3JkZXIgJiYgIXByZXYuZG9tQXRvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldi5kb21Gcm9tUG9zKHByZXYuc2l6ZSwgc2lkZSk7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIG9mZnNldDogcHJldiA/IGRvbUluZGV4KHByZXYuZG9tKSArIDEgOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbmV4dCwgZW50ZXIgPSB0cnVlO1xuICAgICAgICAgICAgZm9yICg7OyBpKyssIGVudGVyID0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID8gdGhpcy5jaGlsZHJlbltpXSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0ICYmIGVudGVyICYmICFuZXh0LmJvcmRlciAmJiAhbmV4dC5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbUZyb21Qb3MoMCwgc2lkZSk7XG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIG9mZnNldDogbmV4dCA/IGRvbUluZGV4KG5leHQuZG9tKSA6IHRoaXMuY29udGVudERPTS5jaGlsZE5vZGVzLmxlbmd0aCB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFVzZWQgdG8gZmluZCBhIERPTSByYW5nZSBpbiBhIHNpbmdsZSBwYXJlbnQgZm9yIGEgZ2l2ZW4gY2hhbmdlZFxuICAgIC8vIHJhbmdlLlxuICAgIHBhcnNlUmFuZ2UoZnJvbSwgdG8sIGJhc2UgPSAwKSB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldDogMCwgdG9PZmZzZXQ6IHRoaXMuY29udGVudERPTS5jaGlsZE5vZGVzLmxlbmd0aCB9O1xuICAgICAgICBsZXQgZnJvbU9mZnNldCA9IC0xLCB0b09mZnNldCA9IC0xO1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSBiYXNlLCBpID0gMDs7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID09IC0xICYmIGZyb20gPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkQmFzZSA9IG9mZnNldCArIGNoaWxkLmJvcmRlcjtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRSBtYXliZSBkZXNjZW5kIG1hcmsgdmlld3MgdG8gcGFyc2UgYSBuYXJyb3dlciByYW5nZT9cbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBjaGlsZEJhc2UgJiYgdG8gPD0gZW5kIC0gY2hpbGQuYm9yZGVyICYmIGNoaWxkLm5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoY2hpbGQuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5wYXJzZVJhbmdlKGZyb20sIHRvLCBjaGlsZEJhc2UpO1xuICAgICAgICAgICAgICAgIGZyb20gPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPiAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXYgPSB0aGlzLmNoaWxkcmVuW2ogLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYuc2l6ZSAmJiBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSAmJiAhcHJldi5lbXB0eUNoaWxkQXQoMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSBkb21JbmRleChwcmV2LmRvbSkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJvbSAtPSBwcmV2LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID09IC0xKVxuICAgICAgICAgICAgICAgICAgICBmcm9tT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9tT2Zmc2V0ID4gLTEgJiYgKGVuZCA+IHRvIHx8IGkgPT0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxKSkge1xuICAgICAgICAgICAgICAgIHRvID0gZW5kO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoaWxkcmVuW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5zaXplICYmIG5leHQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFuZXh0LmVtcHR5Q2hpbGRBdCgtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvT2Zmc2V0ID0gZG9tSW5kZXgobmV4dC5kb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdG8gKz0gbmV4dC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodG9PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHRvT2Zmc2V0ID0gdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgZnJvbSwgdG8sIGZyb21PZmZzZXQsIHRvT2Zmc2V0IH07XG4gICAgfVxuICAgIGVtcHR5Q2hpbGRBdChzaWRlKSB7XG4gICAgICAgIGlmICh0aGlzLmJvcmRlciB8fCAhdGhpcy5jb250ZW50RE9NIHx8ICF0aGlzLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltzaWRlIDwgMCA/IDAgOiB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gY2hpbGQuc2l6ZSA9PSAwIHx8IGNoaWxkLmVtcHR5Q2hpbGRBdChzaWRlKTtcbiAgICB9XG4gICAgZG9tQWZ0ZXJQb3MocG9zKSB7XG4gICAgICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gdGhpcy5kb21Gcm9tUG9zKHBvcywgMCk7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEgfHwgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIG5vZGUgYWZ0ZXIgcG9zIFwiICsgcG9zKTtcbiAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgIH1cbiAgICAvLyBWaWV3IGRlc2NzIGFyZSByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBhbnkgc2VsZWN0aW9uIHRoYXQgZmFsbHNcbiAgICAvLyBlbnRpcmVseSBpbnNpZGUgb2YgdGhlbSwgc28gdGhhdCBjdXN0b20gaW1wbGVtZW50YXRpb25zIGNhbiBkb1xuICAgIC8vIGN1c3RvbSB0aGluZ3Mgd2l0aCB0aGUgc2VsZWN0aW9uLiBOb3RlIHRoYXQgdGhpcyBmYWxscyBhcGFydCB3aGVuXG4gICAgLy8gYSBzZWxlY3Rpb24gc3RhcnRzIGluIHN1Y2ggYSBub2RlIGFuZCBlbmRzIGluIGFub3RoZXIsIGluIHdoaWNoXG4gICAgLy8gY2FzZSB3ZSBqdXN0IHVzZSB3aGF0ZXZlciBkb21Gcm9tUG9zIHByb2R1Y2VzIGFzIGEgYmVzdCBlZmZvcnQuXG4gICAgc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UgPSBmYWxzZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGZhbGxzIGVudGlyZWx5IGluIGEgY2hpbGQsIGdpdmUgaXQgdG8gdGhhdCBjaGlsZFxuICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWluKGFuY2hvciwgaGVhZCksIHRvID0gTWF0aC5tYXgoYW5jaG9yLCBoZWFkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIG9mZnNldCA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb20gPiBvZmZzZXQgJiYgdG8gPCBlbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNldFNlbGVjdGlvbihhbmNob3IgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIsIGhlYWQgLSBvZmZzZXQgLSBjaGlsZC5ib3JkZXIsIHZpZXcsIGZvcmNlKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5jaG9yRE9NID0gdGhpcy5kb21Gcm9tUG9zKGFuY2hvciwgYW5jaG9yID8gLTEgOiAxKTtcbiAgICAgICAgbGV0IGhlYWRET00gPSBoZWFkID09IGFuY2hvciA/IGFuY2hvckRPTSA6IHRoaXMuZG9tRnJvbVBvcyhoZWFkLCBoZWFkID8gLTEgOiAxKTtcbiAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcucm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgbGV0IHNlbFJhbmdlID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICBsZXQgYnJLbHVkZ2UgPSBmYWxzZTtcbiAgICAgICAgLy8gT24gRmlyZWZveCwgdXNpbmcgU2VsZWN0aW9uLmNvbGxhcHNlIHRvIHB1dCB0aGUgY3Vyc29yIGFmdGVyIGFcbiAgICAgICAgLy8gQlIgbm9kZSBmb3Igc29tZSByZWFzb24gZG9lc24ndCBhbHdheXMgd29yayAoIzEwNzMpLiBPbiBTYWZhcmksXG4gICAgICAgIC8vIHRoZSBjdXJzb3Igc29tZXRpbWVzIGluZXhwbGljYWJsZSB2aXN1YWxseSBsYWdzIGJlaGluZCBpdHNcbiAgICAgICAgLy8gcmVwb3J0ZWQgcG9zaXRpb24gaW4gc3VjaCBzaXR1YXRpb25zICgjMTA5MikuXG4gICAgICAgIGlmICgoZ2Vja28gfHwgc2FmYXJpKSAmJiBhbmNob3IgPT0gaGVhZCkge1xuICAgICAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSBhbmNob3JET007XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgYnJLbHVkZ2UgPSAhIShvZmZzZXQgJiYgbm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0gPT0gXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgLy8gSXNzdWUgIzExMjhcbiAgICAgICAgICAgICAgICBpZiAoYnJLbHVkZ2UgJiYgb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzY2FuID0gbm9kZSwgYWZ0ZXI7IHNjYW47IHNjYW4gPSBzY2FuLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9IHNjYW4ubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXIubm9kZU5hbWUgPT0gXCJCUlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JET00gPSBoZWFkRE9NID0geyBub2RlOiBhZnRlci5wYXJlbnROb2RlLCBvZmZzZXQ6IGRvbUluZGV4KGFmdGVyKSArIDEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXNjID0gc2Nhbi5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgYnJLbHVkZ2UgPSBwcmV2ICYmIChwcmV2Lm5vZGVOYW1lID09IFwiQlJcIiB8fCBwcmV2LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpcmVmb3ggY2FuIGFjdCBzdHJhbmdlbHkgd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGZyb250IG9mIGFuXG4gICAgICAgIC8vIHVuZWRpdGFibGUgbm9kZS4gU2VlICMxMTYzIGFuZCBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzA5NTM2XG4gICAgICAgIGlmIChnZWNrbyAmJiBzZWxSYW5nZS5mb2N1c05vZGUgJiYgc2VsUmFuZ2UuZm9jdXNOb2RlICE9IGhlYWRET00ubm9kZSAmJiBzZWxSYW5nZS5mb2N1c05vZGUubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gc2VsUmFuZ2UuZm9jdXNOb2RlLmNoaWxkTm9kZXNbc2VsUmFuZ2UuZm9jdXNPZmZzZXRdO1xuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZvcmNlIHx8IGJyS2x1ZGdlICYmIHNhZmFyaSkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBzZWxSYW5nZS5hbmNob3JOb2RlLCBzZWxSYW5nZS5hbmNob3JPZmZzZXQpICYmXG4gICAgICAgICAgICBpc0VxdWl2YWxlbnRQb3NpdGlvbihoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0LCBzZWxSYW5nZS5mb2N1c05vZGUsIHNlbFJhbmdlLmZvY3VzT2Zmc2V0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gU2VsZWN0aW9uLmV4dGVuZCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gJ2ludmVydGVkJyBzZWxlY3Rpb25cbiAgICAgICAgLy8gKG9uZSB3aGVyZSB0aGUgZm9jdXMgaXMgYmVmb3JlIHRoZSBhbmNob3IpLCBidXQgbm90IGFsbFxuICAgICAgICAvLyBicm93c2VycyBzdXBwb3J0IGl0IHlldC5cbiAgICAgICAgbGV0IGRvbVNlbEV4dGVuZGVkID0gZmFsc2U7XG4gICAgICAgIGlmICgoZG9tU2VsLmV4dGVuZCB8fCBhbmNob3IgPT0gaGVhZCkgJiYgIWJyS2x1ZGdlKSB7XG4gICAgICAgICAgICBkb21TZWwuY29sbGFwc2UoYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yICE9IGhlYWQpXG4gICAgICAgICAgICAgICAgICAgIGRvbVNlbC5leHRlbmQoaGVhZERPTS5ub2RlLCBoZWFkRE9NLm9mZnNldCk7XG4gICAgICAgICAgICAgICAgZG9tU2VsRXh0ZW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBzb21lIGNhc2VzIHdpdGggQ2hyb21lIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYWZ0ZXIgY2FsbGluZ1xuICAgICAgICAgICAgICAgIC8vIGNvbGxhcHNlLCBldmVuIHdoZW4gaXQgc2hvdWxkIGJlIHZhbGlkLiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBidWcsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIGl0IGlzIGRpZmZpY3VsdCB0byBpc29sYXRlLiBJZiB0aGlzIGhhcHBlbnMgZmFsbGJhY2sgdG8gdGhlIG9sZCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gd2l0aG91dCB1c2luZyBleHRlbmQuXG4gICAgICAgICAgICAgICAgLy8gU2ltaWxhcmx5LCB0aGlzIGNvdWxkIGNyYXNoIG9uIFNhZmFyaSBpZiB0aGUgZWRpdG9yIGlzIGhpZGRlbiwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgd2FzIG5vIHNlbGVjdGlvbi5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbVNlbEV4dGVuZGVkKSB7XG4gICAgICAgICAgICBpZiAoYW5jaG9yID4gaGVhZCkge1xuICAgICAgICAgICAgICAgIGxldCB0bXAgPSBhbmNob3JET007XG4gICAgICAgICAgICAgICAgYW5jaG9yRE9NID0gaGVhZERPTTtcbiAgICAgICAgICAgICAgICBoZWFkRE9NID0gdG1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlLnNldEVuZChoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0KTtcbiAgICAgICAgICAgIGRvbVNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIGRvbVNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbnRlbnRET00gJiYgbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiO1xuICAgIH1cbiAgICBnZXQgY29udGVudExvc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRET00gJiYgdGhpcy5jb250ZW50RE9NICE9IHRoaXMuZG9tICYmICF0aGlzLmRvbS5jb250YWlucyh0aGlzLmNvbnRlbnRET00pO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgYSBzdWJ0cmVlIG9mIHRoZSBlbGVtZW50IHRyZWUgdGhhdCBoYXMgYmVlbiB0b3VjaGVkXG4gICAgLy8gYnkgYSBET00gY2hhbmdlLCBzbyB0aGF0IHRoZSBuZXh0IHVwZGF0ZSB3aWxsIHJlZHJhdyBpdC5cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMCwgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSBlbmQgPyBmcm9tIDw9IGVuZCAmJiB0byA+PSBvZmZzZXQgOiBmcm9tIDwgZW5kICYmIHRvID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5zaWRlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyLCBlbmRJbnNpZGUgPSBlbmQgLSBjaGlsZC5ib3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPj0gc3RhcnRJbnNpZGUgJiYgdG8gPD0gZW5kSW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmcm9tID09IG9mZnNldCB8fCB0byA9PSBlbmQgPyBDT05URU5UX0RJUlRZIDogQ0hJTERfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tID09IHN0YXJ0SW5zaWRlICYmIHRvID09IGVuZEluc2lkZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoaWxkLmNvbnRlbnRMb3N0IHx8IGNoaWxkLmRvbS5wYXJlbnROb2RlICE9IHRoaXMuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IE5PREVfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm1hcmtEaXJ0eShmcm9tIC0gc3RhcnRJbnNpZGUsIHRvIC0gc3RhcnRJbnNpZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NICYmIGNoaWxkLmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSAmJiAhY2hpbGQuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IENPTlRFTlRfRElSVFkgOiBOT0RFX0RJUlRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5ID0gQ09OVEVOVF9ESVJUWTtcbiAgICB9XG4gICAgbWFya1BhcmVudHNEaXJ0eSgpIHtcbiAgICAgICAgbGV0IGxldmVsID0gMTtcbiAgICAgICAgZm9yIChsZXQgbm9kZSA9IHRoaXMucGFyZW50OyBub2RlOyBub2RlID0gbm9kZS5wYXJlbnQsIGxldmVsKyspIHtcbiAgICAgICAgICAgIGxldCBkaXJ0eSA9IGxldmVsID09IDEgPyBDT05URU5UX0RJUlRZIDogQ0hJTERfRElSVFk7XG4gICAgICAgICAgICBpZiAobm9kZS5kaXJ0eSA8IGRpcnR5KVxuICAgICAgICAgICAgICAgIG5vZGUuZGlydHkgPSBkaXJ0eTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgZ2V0IGlnbm9yZUZvckNvb3JkcygpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaXNUZXh0KHRleHQpIHsgcmV0dXJuIGZhbHNlOyB9XG59XG4vLyBBIHdpZGdldCBkZXNjIHJlcHJlc2VudHMgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggaXMgYSBET00gbm9kZVxuLy8gZHJhd24gYmV0d2VlbiB0aGUgZG9jdW1lbnQgbm9kZXMuXG5jbGFzcyBXaWRnZXRWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBzZWxmLCBkb20gPSB3aWRnZXQudHlwZS50b0RPTTtcbiAgICAgICAgaWYgKHR5cGVvZiBkb20gPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgZG9tID0gZG9tKHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYucGFyZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQucG9zQmVmb3JlQ2hpbGQoc2VsZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF3aWRnZXQudHlwZS5zcGVjLnJhdykge1xuICAgICAgICAgICAgaWYgKGRvbS5ub2RlVHlwZSAhPSAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgICAgICAgICAgICAgZG9tID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXdpZGdldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7XG4gICAgICAgIHNlbGYgPSB0aGlzO1xuICAgIH1cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgd2lkZ2V0LnR5cGUuZXEodGhpcy53aWRnZXQudHlwZSk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHsgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07IH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgbGV0IHN0b3AgPSB0aGlzLndpZGdldC5zcGVjLnN0b3BFdmVudDtcbiAgICAgICAgcmV0dXJuIHN0b3AgPyBzdG9wKGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiIHx8IHRoaXMud2lkZ2V0LnNwZWMuaWdub3JlU2VsZWN0aW9uO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLndpZGdldC50eXBlLmRlc3Ryb3kodGhpcy5kb20pO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBzaWRlKCkgeyByZXR1cm4gdGhpcy53aWRnZXQudHlwZS5zaWRlOyB9XG59XG5jbGFzcyBDb21wb3NpdGlvblZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgZG9tLCB0ZXh0RE9NLCB0ZXh0KSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgIHRoaXMudGV4dERPTSA9IHRleHRET007XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIGdldCBzaXplKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIGxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCkge1xuICAgICAgICBpZiAoZG9tICE9IHRoaXMudGV4dERPTSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyAob2Zmc2V0ID8gdGhpcy5zaXplIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0F0U3RhcnQgKyBvZmZzZXQ7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMudGV4dERPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0KSB7XG4gICAgICAgIHJldHVybiBtdXQudHlwZSA9PT0gJ2NoYXJhY3RlckRhdGEnICYmIG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZTtcbiAgICB9XG59XG4vLyBBIG1hcmsgZGVzYyByZXByZXNlbnRzIGEgbWFyay4gTWF5IGhhdmUgbXVsdGlwbGUgY2hpbGRyZW4sXG4vLyBkZXBlbmRpbmcgb24gaG93IHRoZSBtYXJrIGlzIHNwbGl0LiBOb3RlIHRoYXQgbWFya3MgYXJlIGRyYXduIHVzaW5nXG4vLyBhIGZpeGVkIG5lc3Rpbmcgb3JkZXIsIGZvciBzaW1wbGljaXR5IGFuZCBwcmVkaWN0YWJpbGl0eSwgc28gaW5cbi8vIHNvbWUgY2FzZXMgdGhleSB3aWxsIGJlIHNwbGl0IG1vcmUgb2Z0ZW4gdGhhbiB3b3VsZCBhcHBlYXJcbi8vIG5lY2Vzc2FyeS5cbmNsYXNzIE1hcmtWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG1hcmssIGRvbSwgY29udGVudERPTSwgc3BlYykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIGNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLm1hcmsgPSBtYXJrO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKHBhcmVudCwgbWFyaywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB2aWV3Lm5vZGVWaWV3c1ttYXJrLnR5cGUubmFtZV07XG4gICAgICAgIGxldCBzcGVjID0gY3VzdG9tICYmIGN1c3RvbShtYXJrLCB2aWV3LCBpbmxpbmUpO1xuICAgICAgICBpZiAoIXNwZWMgfHwgIXNwZWMuZG9tKVxuICAgICAgICAgICAgc3BlYyA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2N1bWVudCwgbWFyay50eXBlLnNwZWMudG9ET00obWFyaywgaW5saW5lKSwgbnVsbCwgbWFyay5hdHRycyk7XG4gICAgICAgIHJldHVybiBuZXcgTWFya1ZpZXdEZXNjKHBhcmVudCwgbWFyaywgc3BlYy5kb20sIHNwZWMuY29udGVudERPTSB8fCBzcGVjLmRvbSwgc3BlYyk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHtcbiAgICAgICAgaWYgKCh0aGlzLmRpcnR5ICYgTk9ERV9ESVJUWSkgfHwgdGhpcy5tYXJrLnR5cGUuc3BlYy5yZXBhcnNlSW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB7IG1hcms6IHRoaXMubWFyay50eXBlLm5hbWUsIGF0dHJzOiB0aGlzLm1hcmsuYXR0cnMsIGNvbnRlbnRFbGVtZW50OiB0aGlzLmNvbnRlbnRET00gfTtcbiAgICB9XG4gICAgbWF0Y2hlc01hcmsobWFyaykgeyByZXR1cm4gdGhpcy5kaXJ0eSAhPSBOT0RFX0RJUlRZICYmIHRoaXMubWFyay5lcShtYXJrKTsgfVxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBzdXBlci5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICAvLyBNb3ZlIGRpcnR5IGluZm8gdG8gbmVhcmVzdCBub2RlIHZpZXdcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAoIXBhcmVudC5ub2RlKVxuICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgICAgICBpZiAocGFyZW50LmRpcnR5IDwgdGhpcy5kaXJ0eSlcbiAgICAgICAgICAgICAgICBwYXJlbnQuZGlydHkgPSB0aGlzLmRpcnR5O1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzbGljZShmcm9tLCB0bywgdmlldykge1xuICAgICAgICBsZXQgY29weSA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy5wYXJlbnQsIHRoaXMubWFyaywgdHJ1ZSwgdmlldyk7XG4gICAgICAgIGxldCBub2RlcyA9IHRoaXMuY2hpbGRyZW4sIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGlmICh0byA8IHNpemUpXG4gICAgICAgICAgICBub2RlcyA9IHJlcGxhY2VOb2Rlcyhub2RlcywgdG8sIHNpemUsIHZpZXcpO1xuICAgICAgICBpZiAoZnJvbSA+IDApXG4gICAgICAgICAgICBub2RlcyA9IHJlcGxhY2VOb2Rlcyhub2RlcywgMCwgZnJvbSwgdmlldyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBub2Rlc1tpXS5wYXJlbnQgPSBjb3B5O1xuICAgICAgICBjb3B5LmNoaWxkcmVuID0gbm9kZXM7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbi8vIE5vZGUgdmlldyBkZXNjcyBhcmUgdGhlIG1haW4sIG1vc3QgY29tbW9uIHR5cGUgb2YgdmlldyBkZXNjLCBhbmRcbi8vIGNvcnJlc3BvbmQgdG8gYW4gYWN0dWFsIG5vZGUgaW4gdGhlIGRvY3VtZW50LiBVbmxpa2UgbWFyayBkZXNjcyxcbi8vIHRoZXkgcG9wdWxhdGUgdGhlaXIgY2hpbGQgYXJyYXkgdGhlbXNlbHZlcy5cbmNsYXNzIE5vZGVWaWV3RGVzYyBleHRlbmRzIFZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHZpZXcsIHBvcykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIFtdLCBkb20sIGNvbnRlbnRET00pO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLm91dGVyRGVjbyA9IG91dGVyRGVjbztcbiAgICAgICAgdGhpcy5pbm5lckRlY28gPSBpbm5lckRlY287XG4gICAgICAgIHRoaXMubm9kZURPTSA9IG5vZGVET007XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQsIGEgbm9kZSBpcyByZW5kZXJlZCB1c2luZyB0aGUgYHRvRE9NYCBtZXRob2QgZnJvbSB0aGVcbiAgICAvLyBub2RlIHR5cGUgc3BlYy4gQnV0IGNsaWVudCBjb2RlIGNhbiB1c2UgdGhlIGBub2RlVmlld3NgIHNwZWMgdG9cbiAgICAvLyBzdXBwbHkgYSBjdXN0b20gbm9kZSB2aWV3LCB3aGljaCBjYW4gaW5mbHVlbmNlIHZhcmlvdXMgYXNwZWN0cyBvZlxuICAgIC8vIHRoZSB3YXkgdGhlIG5vZGUgd29ya3MuXG4gICAgLy9cbiAgICAvLyAoVXNpbmcgc3ViY2xhc3NpbmcgZm9yIHRoaXMgd2FzIGludGVudGlvbmFsbHkgZGVjaWRlZCBhZ2FpbnN0LFxuICAgIC8vIHNpbmNlIGl0J2QgcmVxdWlyZSBleHBvc2luZyBhIHdob2xlIHNsZXcgb2YgZmluaWNreVxuICAgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdG8gdGhlIHVzZXIgY29kZSB0aGF0IHRoZXkgcHJvYmFibHkgd2lsbFxuICAgIC8vIG5ldmVyIG5lZWQuKVxuICAgIHN0YXRpYyBjcmVhdGUocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBjdXN0b20gPSB2aWV3Lm5vZGVWaWV3c1tub2RlLnR5cGUubmFtZV0sIGRlc2NPYmo7XG4gICAgICAgIGxldCBzcGVjID0gY3VzdG9tICYmIGN1c3RvbShub2RlLCB2aWV3LCAoKSA9PiB7XG4gICAgICAgICAgICAvLyAoVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjdXN0b20gdmlldyB0byBmaW5kIGl0c1xuICAgICAgICAgICAgLy8gb3duIHBvc2l0aW9uKVxuICAgICAgICAgICAgaWYgKCFkZXNjT2JqKVxuICAgICAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgICBpZiAoZGVzY09iai5wYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NPYmoucGFyZW50LnBvc0JlZm9yZUNoaWxkKGRlc2NPYmopO1xuICAgICAgICB9LCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgIGxldCBkb20gPSBzcGVjICYmIHNwZWMuZG9tLCBjb250ZW50RE9NID0gc3BlYyAmJiBzcGVjLmNvbnRlbnRET007XG4gICAgICAgIGlmIChub2RlLmlzVGV4dCkge1xuICAgICAgICAgICAgaWYgKCFkb20pXG4gICAgICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvbS5ub2RlVHlwZSAhPSAzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGV4dCBtdXN0IGJlIHJlbmRlcmVkIGFzIGEgRE9NIHRleHQgbm9kZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZG9tKSB7XG4gICAgICAgICAgICBsZXQgc3BlYyA9IERPTVNlcmlhbGl6ZXIucmVuZGVyU3BlYyhkb2N1bWVudCwgbm9kZS50eXBlLnNwZWMudG9ET00obm9kZSksIG51bGwsIG5vZGUuYXR0cnMpO1xuICAgICAgICAgICAgKHsgZG9tLCBjb250ZW50RE9NIH0gPSBzcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbnRlbnRET00gJiYgIW5vZGUuaXNUZXh0ICYmIGRvbS5ub2RlTmFtZSAhPSBcIkJSXCIpIHsgLy8gQ2hyb21lIGdldHMgY29uZnVzZWQgYnkgPGJyIGNvbnRlbnRlZGl0YWJsZT1mYWxzZT5cbiAgICAgICAgICAgIGlmICghZG9tLmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSlcbiAgICAgICAgICAgICAgICBkb20uY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSlcbiAgICAgICAgICAgICAgICBkb20uZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZURPTSA9IGRvbTtcbiAgICAgICAgZG9tID0gYXBwbHlPdXRlckRlY28oZG9tLCBvdXRlckRlY28sIG5vZGUpO1xuICAgICAgICBpZiAoc3BlYylcbiAgICAgICAgICAgIHJldHVybiBkZXNjT2JqID0gbmV3IEN1c3RvbU5vZGVWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00gfHwgbnVsbCwgbm9kZURPTSwgc3BlYywgdmlldywgcG9zICsgMSk7XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBub2RlRE9NLCB2aWV3KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlVmlld0Rlc2MocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBjb250ZW50RE9NIHx8IG51bGwsIG5vZGVET00sIHZpZXcsIHBvcyArIDEpO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIC8vIEV4cGVyaW1lbnRhbCBrbHVkZ2UgdG8gYWxsb3cgb3B0LWluIHJlLXBhcnNpbmcgb2Ygbm9kZXNcbiAgICAgICAgaWYgKHRoaXMubm9kZS50eXBlLnNwZWMucmVwYXJzZUluVmlldylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBGSVhNRSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgY2FuIGFsd2F5cyByZXR1cm4gdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gYXR0cnMgbWVhbnMgdGhhdCBpZiB0aGUgdXNlciBzb21laG93IG1hbmFnZXMgdG8gY2hhbmdlIHRoZVxuICAgICAgICAvLyBhdHRycyBpbiB0aGUgZG9tLCB0aGF0IHdvbid0IGJlIHBpY2tlZCB1cC4gTm90IGVudGlyZWx5IHN1cmVcbiAgICAgICAgLy8gd2hldGhlciB0aGlzIGlzIGEgcHJvYmxlbVxuICAgICAgICBsZXQgcnVsZSA9IHsgbm9kZTogdGhpcy5ub2RlLnR5cGUubmFtZSwgYXR0cnM6IHRoaXMubm9kZS5hdHRycyB9O1xuICAgICAgICBpZiAodGhpcy5ub2RlLnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiKVxuICAgICAgICAgICAgcnVsZS5wcmVzZXJ2ZVdoaXRlc3BhY2UgPSBcImZ1bGxcIjtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgIHJ1bGUuZ2V0Q29udGVudCA9ICgpID0+IHRoaXMubm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRMb3N0KSB7XG4gICAgICAgICAgICBydWxlLmNvbnRlbnRFbGVtZW50ID0gdGhpcy5jb250ZW50RE9NO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hyb21lIGxpa2VzIHRvIHJhbmRvbWx5IHJlY3JlYXRlIHBhcmVudCBub2RlcyB3aGVuXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyB0aGluZ3MuIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGlzIHRyaWVzIHRvIGZpbmQgdGhlXG4gICAgICAgICAgICAvLyBuZXcgcGFyZW50LlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbS5jb250YWlucyhjaGlsZC5kb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZS5jb250ZW50RWxlbWVudCA9IGNoaWxkLmRvbS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJ1bGUuY29udGVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50ID0gKCkgPT4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiBub2RlLmVxKHRoaXMubm9kZSkgJiZcbiAgICAgICAgICAgIHNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm91dGVyRGVjbykgJiYgaW5uZXJEZWNvLmVxKHRoaXMuaW5uZXJEZWNvKTtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLm5vZGUubm9kZVNpemU7IH1cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gdGhpcy5ub2RlLmlzTGVhZiA/IDAgOiAxOyB9XG4gICAgLy8gU3luY3MgYHRoaXMuY2hpbGRyZW5gIHRvIG1hdGNoIGB0aGlzLm5vZGUuY29udGVudGAgYW5kIHRoZSBsb2NhbFxuICAgIC8vIGRlY29yYXRpb25zLCBwb3NzaWJseSBpbnRyb2R1Y2luZyBuZXN0aW5nIGZvciBtYXJrcy4gVGhlbiwgaW4gYVxuICAgIC8vIHNlcGFyYXRlIHN0ZXAsIHN5bmNzIHRoZSBET00gaW5zaWRlIGB0aGlzLmNvbnRlbnRET01gIHRvXG4gICAgLy8gYHRoaXMuY2hpbGRyZW5gLlxuICAgIHVwZGF0ZUNoaWxkcmVuKHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgaW5saW5lID0gdGhpcy5ub2RlLmlubGluZUNvbnRlbnQsIG9mZiA9IHBvcztcbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gdmlldy5jb21wb3NpbmcgPyB0aGlzLmxvY2FsQ29tcG9zaXRpb25JbmZvKHZpZXcsIHBvcykgOiBudWxsO1xuICAgICAgICBsZXQgbG9jYWxDb21wb3NpdGlvbiA9IGNvbXBvc2l0aW9uICYmIGNvbXBvc2l0aW9uLnBvcyA+IC0xID8gY29tcG9zaXRpb24gOiBudWxsO1xuICAgICAgICBsZXQgY29tcG9zaXRpb25JbkNoaWxkID0gY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucG9zIDwgMDtcbiAgICAgICAgbGV0IHVwZGF0ZXIgPSBuZXcgVmlld1RyZWVVcGRhdGVyKHRoaXMsIGxvY2FsQ29tcG9zaXRpb24gJiYgbG9jYWxDb21wb3NpdGlvbi5ub2RlLCB2aWV3KTtcbiAgICAgICAgaXRlckRlY28odGhpcy5ub2RlLCB0aGlzLmlubmVyRGVjbywgKHdpZGdldCwgaSwgaW5zaWRlTm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHdpZGdldC5zcGVjLm1hcmtzKVxuICAgICAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3Mod2lkZ2V0LnNwZWMubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICBlbHNlIGlmICh3aWRnZXQudHlwZS5zaWRlID49IDAgJiYgIWluc2lkZU5vZGUpXG4gICAgICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhpID09IHRoaXMubm9kZS5jaGlsZENvdW50ID8gTWFyay5ub25lIDogdGhpcy5ub2RlLmNoaWxkKGkpLm1hcmtzLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhIGRlc2MgbWF0Y2hpbmcgdGhpcyB3aWRnZXQsIHJldXNlIGl0LFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGluc2VydCB0aGUgd2lkZ2V0IGFzIGEgbmV3IHZpZXcgZGVzYy5cbiAgICAgICAgICAgIHVwZGF0ZXIucGxhY2VXaWRnZXQod2lkZ2V0LCB2aWV3LCBvZmYpO1xuICAgICAgICB9LCAoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpKSA9PiB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHdyYXBwaW5nIG1hcmsgZGVzY3MgbWF0Y2ggdGhlIG5vZGUncyBtYXJrcy5cbiAgICAgICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoY2hpbGQubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCBzdHJhdGVnaWVzIGZvciBkcmF3aW5nIHRoaXMgbm9kZVxuICAgICAgICAgICAgbGV0IGNvbXBJbmRleDtcbiAgICAgICAgICAgIGlmICh1cGRhdGVyLmZpbmROb2RlTWF0Y2goY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpKSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9zaXRpb25JbkNoaWxkICYmIHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gPiBvZmYgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byA8IG9mZiArIGNoaWxkLm5vZGVTaXplICYmXG4gICAgICAgICAgICAgICAgKGNvbXBJbmRleCA9IHVwZGF0ZXIuZmluZEluZGV4V2l0aENoaWxkKGNvbXBvc2l0aW9uLm5vZGUpKSA+IC0xICYmXG4gICAgICAgICAgICAgICAgdXBkYXRlci51cGRhdGVOb2RlQXQoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBjb21wSW5kZXgsIHZpZXcpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICh1cGRhdGVyLnVwZGF0ZU5leHROb2RlKGNoaWxkLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaSwgb2ZmKSkgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGl0IGFzIGEgbmV3IHZpZXdcbiAgICAgICAgICAgICAgICB1cGRhdGVyLmFkZE5vZGUoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBvZmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2ZmICs9IGNoaWxkLm5vZGVTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gRHJvcCBhbGwgcmVtYWluaW5nIGRlc2NzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKFtdLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICBpZiAodGhpcy5ub2RlLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgdXBkYXRlci5hZGRUZXh0YmxvY2tIYWNrcygpO1xuICAgICAgICB1cGRhdGVyLmRlc3Ryb3lSZXN0KCk7XG4gICAgICAgIC8vIFN5bmMgdGhlIERPTSBpZiBhbnl0aGluZyBjaGFuZ2VkXG4gICAgICAgIGlmICh1cGRhdGVyLmNoYW5nZWQgfHwgdGhpcy5kaXJ0eSA9PSBDT05URU5UX0RJUlRZKSB7XG4gICAgICAgICAgICAvLyBNYXkgaGF2ZSB0byBwcm90ZWN0IGZvY3VzZWQgRE9NIGZyb20gYmVpbmcgY2hhbmdlZCBpZiBhIGNvbXBvc2l0aW9uIGlzIGFjdGl2ZVxuICAgICAgICAgICAgaWYgKGxvY2FsQ29tcG9zaXRpb24pXG4gICAgICAgICAgICAgICAgdGhpcy5wcm90ZWN0TG9jYWxDb21wb3NpdGlvbih2aWV3LCBsb2NhbENvbXBvc2l0aW9uKTtcbiAgICAgICAgICAgIHJlbmRlckRlc2NzKHRoaXMuY29udGVudERPTSwgdGhpcy5jaGlsZHJlbiwgdmlldyk7XG4gICAgICAgICAgICBpZiAoaW9zKVxuICAgICAgICAgICAgICAgIGlvc0hhY2tzKHRoaXMuZG9tKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsb2NhbENvbXBvc2l0aW9uSW5mbyh2aWV3LCBwb3MpIHtcbiAgICAgICAgLy8gT25seSBkbyBzb21ldGhpbmcgaWYgYm90aCB0aGUgc2VsZWN0aW9uIGFuZCBhIGZvY3VzZWQgdGV4dCBub2RlXG4gICAgICAgIC8vIGFyZSBpbnNpZGUgb2YgdGhpcyBub2RlXG4gICAgICAgIGxldCB7IGZyb20sIHRvIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB8fCBmcm9tIDwgcG9zIHx8IHRvID4gcG9zICsgdGhpcy5ub2RlLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdGV4dE5vZGUgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZTtcbiAgICAgICAgaWYgKCF0ZXh0Tm9kZSB8fCAhdGhpcy5kb20uY29udGFpbnModGV4dE5vZGUucGFyZW50Tm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSB0ZXh0IGluIHRoZSBmb2N1c2VkIG5vZGUgaW4gdGhlIG5vZGUsIHN0b3AgaWYgaXQncyBub3RcbiAgICAgICAgICAgIC8vIHRoZXJlIChtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIHRocm91Z2ggb3RoZXIgbWVhbnMsIGluIHdoaWNoXG4gICAgICAgICAgICAvLyBjYXNlIGl0IHNob3VsZCBvdmVyd3JpdHRlbilcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGV4dE5vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgbGV0IHRleHRQb3MgPSBmaW5kVGV4dEluRnJhZ21lbnQodGhpcy5ub2RlLmNvbnRlbnQsIHRleHQsIGZyb20gLSBwb3MsIHRvIC0gcG9zKTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0UG9zIDwgMCA/IG51bGwgOiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IHRleHRQb3MsIHRleHQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRleHROb2RlLCBwb3M6IC0xLCB0ZXh0OiBcIlwiIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvdGVjdExvY2FsQ29tcG9zaXRpb24odmlldywgeyBub2RlLCBwb3MsIHRleHQgfSkge1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBhbHJlYWR5IHBhcnQgb2YgYSBsb2NhbCB2aWV3IGRlc2MsIGxlYXZlIGl0IHRoZXJlXG4gICAgICAgIGlmICh0aGlzLmdldERlc2Mobm9kZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0aW9uIHZpZXcgZm9yIHRoZSBvcnBoYW5lZCBub2Rlc1xuICAgICAgICBsZXQgdG9wTm9kZSA9IG5vZGU7XG4gICAgICAgIGZvciAoOzsgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB3aGlsZSAodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUucHJldmlvdXNTaWJsaW5nKTtcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICAgIHRvcE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b3BOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGlmICh0b3BOb2RlLnBtVmlld0Rlc2MpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gbmV3IENvbXBvc2l0aW9uVmlld0Rlc2ModGhpcywgdG9wTm9kZSwgbm9kZSwgdGV4dCk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5wdXNoKGRlc2MpO1xuICAgICAgICAvLyBQYXRjaCB1cCB0aGlzLmNoaWxkcmVuIHRvIGNvbnRhaW4gdGhlIGNvbXBvc2l0aW9uIHZpZXdcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHJlcGxhY2VOb2Rlcyh0aGlzLmNoaWxkcmVuLCBwb3MsIHBvcyArIHRleHQubGVuZ3RoLCB2aWV3LCBkZXNjKTtcbiAgICB9XG4gICAgLy8gSWYgdGhpcyBkZXNjIG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgZ2l2ZW4gbm9kZSBkZWNvcmF0aW9uLFxuICAgIC8vIGRvIHNvIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fFxuICAgICAgICAgICAgIW5vZGUuc2FtZU1hcmt1cCh0aGlzLm5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHVwZGF0ZUlubmVyKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuaW5uZXJEZWNvID0gaW5uZXJEZWNvO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih2aWV3LCB0aGlzLnBvc0F0U3RhcnQpO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgIH1cbiAgICB1cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKSB7XG4gICAgICAgIGlmIChzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgdGhpcy5vdXRlckRlY28pKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbmVlZHNXcmFwID0gdGhpcy5ub2RlRE9NLm5vZGVUeXBlICE9IDE7XG4gICAgICAgIGxldCBvbGRET00gPSB0aGlzLmRvbTtcbiAgICAgICAgdGhpcy5kb20gPSBwYXRjaE91dGVyRGVjbyh0aGlzLmRvbSwgdGhpcy5ub2RlRE9NLCBjb21wdXRlT3V0ZXJEZWNvKHRoaXMub3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCksIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm5vZGUsIG5lZWRzV3JhcCkpO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gb2xkRE9NKSB7XG4gICAgICAgICAgICBvbGRET00ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgIH1cbiAgICAvLyBNYXJrIHRoaXMgbm9kZSBhcyBiZWluZyB0aGUgc2VsZWN0ZWQgbm9kZS5cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICB0aGlzLmRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgbm9kZSBtYXJraW5nIGZyb20gdGhpcyBub2RlLlxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZURPTS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVET00uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLXNlbGVjdGVkbm9kZVwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZG9tLnJlbW92ZUF0dHJpYnV0ZShcImRyYWdnYWJsZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRoaXMubm9kZS5pc0F0b207IH1cbn1cbi8vIENyZWF0ZSBhIHZpZXcgZGVzYyBmb3IgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBub2RlLCB0byBiZSBleHBvcnRlZFxuLy8gYW5kIHVzZWQgYnkgdGhlIHZpZXcgY2xhc3MuXG5mdW5jdGlvbiBkb2NWaWV3RGVzYyhkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIHZpZXcpIHtcbiAgICBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgZG9jKTtcbiAgICBsZXQgZG9jVmlldyA9IG5ldyBOb2RlVmlld0Rlc2ModW5kZWZpbmVkLCBkb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGRvbSwgZG9tLCB2aWV3LCAwKTtcbiAgICBpZiAoZG9jVmlldy5jb250ZW50RE9NKVxuICAgICAgICBkb2NWaWV3LnVwZGF0ZUNoaWxkcmVuKHZpZXcsIDApO1xuICAgIHJldHVybiBkb2NWaWV3O1xufVxuY2xhc3MgVGV4dFZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgZG9tLCBudWxsLCBub2RlRE9NLCB2aWV3LCAwKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBsZXQgc2tpcCA9IHRoaXMubm9kZURPTS5wYXJlbnROb2RlO1xuICAgICAgICB3aGlsZSAoc2tpcCAmJiBza2lwICE9IHRoaXMuZG9tICYmICFza2lwLnBtSXNEZWNvKVxuICAgICAgICAgICAgc2tpcCA9IHNraXAucGFyZW50Tm9kZTtcbiAgICAgICAgcmV0dXJuIHsgc2tpcDogKHNraXAgfHwgdHJ1ZSkgfTtcbiAgICB9XG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkgfHwgKHRoaXMuZGlydHkgIT0gTk9UX0RJUlRZICYmICF0aGlzLmluUGFyZW50KCkpIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0ZXJEZWNvKG91dGVyRGVjbyk7XG4gICAgICAgIGlmICgodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgfHwgbm9kZS50ZXh0ICE9IHRoaXMubm9kZS50ZXh0KSAmJiBub2RlLnRleHQgIT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZSA9IG5vZGUudGV4dDtcbiAgICAgICAgICAgIGlmICh2aWV3LnRyYWNrV3JpdGVzID09IHRoaXMubm9kZURPTSlcbiAgICAgICAgICAgICAgICB2aWV3LnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW5QYXJlbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnRET00gPSB0aGlzLnBhcmVudC5jb250ZW50RE9NO1xuICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5ub2RlRE9NOyBuOyBuID0gbi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgaWYgKG4gPT0gcGFyZW50RE9NKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRvbUZyb21Qb3MocG9zKSB7XG4gICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMubm9kZURPTSwgb2Zmc2V0OiBwb3MgfTtcbiAgICB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKSB7XG4gICAgICAgIGlmIChkb20gPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIE1hdGgubWluKG9mZnNldCwgdGhpcy5ub2RlLnRleHQubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmxvY2FsUG9zRnJvbURPTShkb20sIG9mZnNldCwgYmlhcyk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwiY2hhcmFjdGVyRGF0YVwiICYmIG11dGF0aW9uLnR5cGUgIT0gXCJzZWxlY3Rpb25cIjtcbiAgICB9XG4gICAgc2xpY2UoZnJvbSwgdG8sIHZpZXcpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLm5vZGUuY3V0KGZyb20sIHRvKSwgZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS50ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Vmlld0Rlc2ModGhpcy5wYXJlbnQsIG5vZGUsIHRoaXMub3V0ZXJEZWNvLCB0aGlzLmlubmVyRGVjbywgZG9tLCBkb20sIHZpZXcpO1xuICAgIH1cbiAgICBtYXJrRGlydHkoZnJvbSwgdG8pIHtcbiAgICAgICAgc3VwZXIubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgaWYgKHRoaXMuZG9tICE9IHRoaXMubm9kZURPTSAmJiAoZnJvbSA9PSAwIHx8IHRvID09IHRoaXMubm9kZURPTS5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBOT0RFX0RJUlRZO1xuICAgIH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgaXNUZXh0KHRleHQpIHsgcmV0dXJuIHRoaXMubm9kZS50ZXh0ID09IHRleHQ7IH1cbn1cbi8vIEEgZHVtbXkgZGVzYyB1c2VkIHRvIHRhZyB0cmFpbGluZyBCUiBvciBJTUcgbm9kZXMgY3JlYXRlZCB0byB3b3JrXG4vLyBhcm91bmQgY29udGVudEVkaXRhYmxlIHRlcnJpYmxlbmVzcy5cbmNsYXNzIFRyYWlsaW5nSGFja1ZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIHBhcnNlUnVsZSgpIHsgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07IH1cbiAgICBtYXRjaGVzSGFjayhub2RlTmFtZSkgeyByZXR1cm4gdGhpcy5kaXJ0eSA9PSBOT1RfRElSVFkgJiYgdGhpcy5kb20ubm9kZU5hbWUgPT0gbm9kZU5hbWU7IH1cbiAgICBnZXQgZG9tQXRvbSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBnZXQgaWdub3JlRm9yQ29vcmRzKCkgeyByZXR1cm4gdGhpcy5kb20ubm9kZU5hbWUgPT0gXCJJTUdcIjsgfVxufVxuLy8gQSBzZXBhcmF0ZSBzdWJjbGFzcyBpcyB1c2VkIGZvciBjdXN0b21pemVkIG5vZGUgdmlld3MsIHNvIHRoYXQgdGhlXG4vLyBleHRyYSBjaGVja3Mgb25seSBoYXZlIHRvIGJlIG1hZGUgZm9yIG5vZGVzIHRoYXQgYXJlIGFjdHVhbGx5XG4vLyBjdXN0b21pemVkLlxuY2xhc3MgQ3VzdG9tTm9kZVZpZXdEZXNjIGV4dGVuZHMgTm9kZVZpZXdEZXNjIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHNwZWMsIHZpZXcsIHBvcykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00sIG5vZGVET00sIHZpZXcsIHBvcyk7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIC8vIEEgY3VzdG9tIGB1cGRhdGVgIG1ldGhvZCBnZXRzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB1cGRhdGUgZ29lc1xuICAgIC8vIHRocm91Z2guIElmIGl0IGRvZXMsIGFuZCB0aGVyZSdzIGEgYGNvbnRlbnRET01gIG5vZGUsIG91ciBsb2dpY1xuICAgIC8vIHVwZGF0ZXMgdGhlIGNoaWxkcmVuLlxuICAgIHVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSA9PSBOT0RFX0RJUlRZKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zcGVjLnVwZGF0ZSAmJiAodGhpcy5ub2RlLnR5cGUgPT0gbm9kZS50eXBlIHx8IHRoaXMuc3BlYy5tdWx0aVR5cGUpKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5zcGVjLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZW50RE9NICYmICFub2RlLmlzTGVhZikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLnNlbGVjdE5vZGUgPyB0aGlzLnNwZWMuc2VsZWN0Tm9kZSgpIDogc3VwZXIuc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBkZXNlbGVjdE5vZGUoKSB7XG4gICAgICAgIHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUgPyB0aGlzLnNwZWMuZGVzZWxlY3ROb2RlKCkgOiBzdXBlci5kZXNlbGVjdE5vZGUoKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpIHtcbiAgICAgICAgdGhpcy5zcGVjLnNldFNlbGVjdGlvbiA/IHRoaXMuc3BlYy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LnJvb3QpXG4gICAgICAgICAgICA6IHN1cGVyLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHZpZXcsIGZvcmNlKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3BlYy5kZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5zcGVjLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BlYy5zdG9wRXZlbnQgPyB0aGlzLnNwZWMuc3RvcEV2ZW50KGV2ZW50KSA6IGZhbHNlO1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uID8gdGhpcy5zcGVjLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSA6IHN1cGVyLmlnbm9yZU11dGF0aW9uKG11dGF0aW9uKTtcbiAgICB9XG59XG4vLyBTeW5jIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gbm9kZSB3aXRoIHRoZSBub2RlcyBhc3NvY2lhdGVkXG4vLyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZiB2aWV3IGRlc2NzLCByZWN1cnNpbmcgaW50byBtYXJrIGRlc2NzXG4vLyBiZWNhdXNlIHRoaXMgc2hvdWxkIHN5bmMgdGhlIHN1YnRyZWUgZm9yIGEgd2hvbGUgbm9kZSBhdCBhIHRpbWUuXG5mdW5jdGlvbiByZW5kZXJEZXNjcyhwYXJlbnRET00sIGRlc2NzLCB2aWV3KSB7XG4gICAgbGV0IGRvbSA9IHBhcmVudERPTS5maXJzdENoaWxkLCB3cml0dGVuID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVzYyA9IGRlc2NzW2ldLCBjaGlsZERPTSA9IGRlc2MuZG9tO1xuICAgICAgICBpZiAoY2hpbGRET00ucGFyZW50Tm9kZSA9PSBwYXJlbnRET00pIHtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZERPTSAhPSBkb20pIHtcbiAgICAgICAgICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICBwYXJlbnRET00uaW5zZXJ0QmVmb3JlKGNoaWxkRE9NLCBkb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gZG9tID8gZG9tLnByZXZpb3VzU2libGluZyA6IHBhcmVudERPTS5sYXN0Q2hpbGQ7XG4gICAgICAgICAgICByZW5kZXJEZXNjcyhkZXNjLmNvbnRlbnRET00sIGRlc2MuY2hpbGRyZW4sIHZpZXcpO1xuICAgICAgICAgICAgZG9tID0gcG9zID8gcG9zLm5leHRTaWJsaW5nIDogcGFyZW50RE9NLmZpcnN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKGRvbSkge1xuICAgICAgICBkb20gPSBybShkb20pO1xuICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHdyaXR0ZW4gJiYgdmlldy50cmFja1dyaXRlcyA9PSBwYXJlbnRET00pXG4gICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xufVxuY29uc3QgT3V0ZXJEZWNvTGV2ZWwgPSBmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgICBpZiAobm9kZU5hbWUpXG4gICAgICAgIHRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTtcbn07XG5PdXRlckRlY29MZXZlbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuY29uc3Qgbm9EZWNvID0gW25ldyBPdXRlckRlY29MZXZlbF07XG5mdW5jdGlvbiBjb21wdXRlT3V0ZXJEZWNvKG91dGVyRGVjbywgbm9kZSwgbmVlZHNXcmFwKSB7XG4gICAgaWYgKG91dGVyRGVjby5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG5vRGVjbztcbiAgICBsZXQgdG9wID0gbmVlZHNXcmFwID8gbm9EZWNvWzBdIDogbmV3IE91dGVyRGVjb0xldmVsLCByZXN1bHQgPSBbdG9wXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyRGVjby5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgYXR0cnMgPSBvdXRlckRlY29baV0udHlwZS5hdHRycztcbiAgICAgICAgaWYgKCFhdHRycylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoYXR0cnMubm9kZU5hbWUpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwoYXR0cnMubm9kZU5hbWUpKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICAgICAgbGV0IHZhbCA9IGF0dHJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG5lZWRzV3JhcCAmJiByZXN1bHQubGVuZ3RoID09IDEpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godG9wID0gbmV3IE91dGVyRGVjb0xldmVsKG5vZGUuaXNJbmxpbmUgPyBcInNwYW5cIiA6IFwiZGl2XCIpKTtcbiAgICAgICAgICAgIGlmIChuYW1lID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICB0b3AuY2xhc3MgPSAodG9wLmNsYXNzID8gdG9wLmNsYXNzICsgXCIgXCIgOiBcIlwiKSArIHZhbDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHRvcC5zdHlsZSA9ICh0b3Auc3R5bGUgPyB0b3Auc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSAhPSBcIm5vZGVOYW1lXCIpXG4gICAgICAgICAgICAgICAgdG9wW25hbWVdID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXRjaE91dGVyRGVjbyhvdXRlckRPTSwgbm9kZURPTSwgcHJldkNvbXB1dGVkLCBjdXJDb21wdXRlZCkge1xuICAgIC8vIFNob3J0Y3V0IGZvciB0cml2aWFsIGNhc2VcbiAgICBpZiAocHJldkNvbXB1dGVkID09IG5vRGVjbyAmJiBjdXJDb21wdXRlZCA9PSBub0RlY28pXG4gICAgICAgIHJldHVybiBub2RlRE9NO1xuICAgIGxldCBjdXJET00gPSBub2RlRE9NO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyQ29tcHV0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlY28gPSBjdXJDb21wdXRlZFtpXSwgcHJldiA9IHByZXZDb21wdXRlZFtpXTtcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQ7XG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2Lm5vZGVOYW1lID09IGRlY28ubm9kZU5hbWUgJiYgY3VyRE9NICE9IG91dGVyRE9NICYmXG4gICAgICAgICAgICAgICAgKHBhcmVudCA9IGN1ckRPTS5wYXJlbnROb2RlKSAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBkZWNvLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkZWNvLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXJlbnQucG1Jc0RlY28gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjdXJET00pO1xuICAgICAgICAgICAgICAgIHByZXYgPSBub0RlY29bMF07XG4gICAgICAgICAgICAgICAgY3VyRE9NID0gcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHBhdGNoQXR0cmlidXRlcyhjdXJET00sIHByZXYgfHwgbm9EZWNvWzBdLCBkZWNvKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1ckRPTTtcbn1cbmZ1bmN0aW9uIHBhdGNoQXR0cmlidXRlcyhkb20sIHByZXYsIGN1cikge1xuICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmICEobmFtZSBpbiBjdXIpKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGN1cilcbiAgICAgICAgaWYgKG5hbWUgIT0gXCJjbGFzc1wiICYmIG5hbWUgIT0gXCJzdHlsZVwiICYmIG5hbWUgIT0gXCJub2RlTmFtZVwiICYmIGN1cltuYW1lXSAhPSBwcmV2W25hbWVdKVxuICAgICAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShuYW1lLCBjdXJbbmFtZV0pO1xuICAgIGlmIChwcmV2LmNsYXNzICE9IGN1ci5jbGFzcykge1xuICAgICAgICBsZXQgcHJldkxpc3QgPSBwcmV2LmNsYXNzID8gcHJldi5jbGFzcy5zcGxpdChcIiBcIikuZmlsdGVyKEJvb2xlYW4pIDogW107XG4gICAgICAgIGxldCBjdXJMaXN0ID0gY3VyLmNsYXNzID8gY3VyLmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TGlzdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChjdXJMaXN0LmluZGV4T2YocHJldkxpc3RbaV0pID09IC0xKVxuICAgICAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QucmVtb3ZlKHByZXZMaXN0W2ldKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHByZXZMaXN0LmluZGV4T2YoY3VyTGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5hZGQoY3VyTGlzdFtpXSk7XG4gICAgICAgIGlmIChkb20uY2xhc3NMaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgZG9tLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIH1cbiAgICBpZiAocHJldi5zdHlsZSAhPSBjdXIuc3R5bGUpIHtcbiAgICAgICAgaWYgKHByZXYuc3R5bGUpIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gL1xccyooW1xcd1xcLVxceGExLVxcdWZmZmZdKylcXHMqOig/OlwiKD86XFxcXC58W15cIl0pKlwifCcoPzpcXFxcLnxbXiddKSonfFxcKC4qP1xcKXxbXjtdKSovZywgbTtcbiAgICAgICAgICAgIHdoaWxlIChtID0gcHJvcC5leGVjKHByZXYuc3R5bGUpKVxuICAgICAgICAgICAgICAgIGRvbS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShtWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyLnN0eWxlKVxuICAgICAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgKz0gY3VyLnN0eWxlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5T3V0ZXJEZWNvKGRvbSwgZGVjbywgbm9kZSkge1xuICAgIHJldHVybiBwYXRjaE91dGVyRGVjbyhkb20sIGRvbSwgbm9EZWNvLCBjb21wdXRlT3V0ZXJEZWNvKGRlY28sIG5vZGUsIGRvbS5ub2RlVHlwZSAhPSAxKSk7XG59XG5mdW5jdGlvbiBzYW1lT3V0ZXJEZWNvKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghYVtpXS50eXBlLmVxKGJbaV0udHlwZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBSZW1vdmUgYSBET00gbm9kZSBhbmQgcmV0dXJuIGl0cyBuZXh0IHNpYmxpbmcuXG5mdW5jdGlvbiBybShkb20pIHtcbiAgICBsZXQgbmV4dCA9IGRvbS5uZXh0U2libGluZztcbiAgICBkb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20pO1xuICAgIHJldHVybiBuZXh0O1xufVxuLy8gSGVscGVyIGNsYXNzIGZvciBpbmNyZW1lbnRhbGx5IHVwZGF0aW5nIGEgdHJlZSBvZiBtYXJrIGRlc2NzIGFuZFxuLy8gdGhlIHdpZGdldCBhbmQgbm9kZSBkZXNjcyBpbnNpZGUgb2YgdGhlbS5cbmNsYXNzIFZpZXdUcmVlVXBkYXRlciB7XG4gICAgY29uc3RydWN0b3IodG9wLCBsb2NrLCB2aWV3KSB7XG4gICAgICAgIHRoaXMubG9jayA9IGxvY2s7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIC8vIEluZGV4IGludG8gYHRoaXMudG9wYCdzIGNoaWxkIGFycmF5LCByZXByZXNlbnRzIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgIC8vIFdoZW4gZW50ZXJpbmcgYSBtYXJrLCB0aGUgY3VycmVudCB0b3AgYW5kIGluZGV4IGFyZSBwdXNoZWRcbiAgICAgICAgLy8gb250byB0aGlzLlxuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8vIFRyYWNrcyB3aGV0aGVyIGFueXRoaW5nIHdhcyBjaGFuZ2VkXG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5wcmVNYXRjaCA9IHByZU1hdGNoKHRvcC5ub2RlLmNvbnRlbnQsIHRvcCk7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYW5kIHJlbW92ZSB0aGUgY2hpbGRyZW4gYmV0d2VlbiB0aGUgZ2l2ZW4gaW5kaWNlcyBpblxuICAgIC8vIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveUJldHdlZW4oc3RhcnQsIGVuZCkge1xuICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKylcbiAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW2ldLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIC8vIERlc3Ryb3kgYWxsIHJlbWFpbmluZyBjaGlsZHJlbiBpbiBgdGhpcy50b3BgLlxuICAgIGRlc3Ryb3lSZXN0KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIFN5bmMgdGhlIGN1cnJlbnQgc3RhY2sgb2YgbWFyayBkZXNjcyB3aXRoIHRoZSBnaXZlbiBhcnJheSBvZlxuICAgIC8vIG1hcmtzLCByZXVzaW5nIGV4aXN0aW5nIG1hcmsgZGVzY3Mgd2hlbiBwb3NzaWJsZS5cbiAgICBzeW5jVG9NYXJrcyhtYXJrcywgaW5saW5lLCB2aWV3KSB7XG4gICAgICAgIGxldCBrZWVwID0gMCwgZGVwdGggPSB0aGlzLnN0YWNrLmxlbmd0aCA+PiAxO1xuICAgICAgICBsZXQgbWF4S2VlcCA9IE1hdGgubWluKGRlcHRoLCBtYXJrcy5sZW5ndGgpO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IG1heEtlZXAgJiZcbiAgICAgICAgICAgIChrZWVwID09IGRlcHRoIC0gMSA/IHRoaXMudG9wIDogdGhpcy5zdGFja1soa2VlcCArIDEpIDw8IDFdKVxuICAgICAgICAgICAgICAgIC5tYXRjaGVzTWFyayhtYXJrc1trZWVwXSkgJiYgbWFya3Nba2VlcF0udHlwZS5zcGVjLnNwYW5uaW5nICE9PSBmYWxzZSlcbiAgICAgICAgICAgIGtlZXArKztcbiAgICAgICAgd2hpbGUgKGtlZXAgPCBkZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVzdCgpO1xuICAgICAgICAgICAgdGhpcy50b3AuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMudG9wID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGRlcHRoIDwgbWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2godGhpcy50b3AsIHRoaXMuaW5kZXggKyAxKTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCBNYXRoLm1pbih0aGlzLmluZGV4ICsgMywgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5tYXRjaGVzTWFyayhtYXJrc1tkZXB0aF0pICYmICF0aGlzLmlzTG9ja2VkKG5leHQuZG9tKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3VuZCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gdGhpcy5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrRGVzYyA9IE1hcmtWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG1hcmtzW2RlcHRoXSwgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCwgMCwgbWFya0Rlc2MpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wID0gbWFya0Rlc2M7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIG5vZGUgZGVzYyBtYXRjaGluZyB0aGUgZ2l2ZW4gZGF0YS4gU2tpcCBvdmVyIGl0IGFuZFxuICAgIC8vIHJldHVybiB0cnVlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICBmaW5kTm9kZU1hdGNoKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCkge1xuICAgICAgICBsZXQgZm91bmQgPSAtMSwgdGFyZ2V0RGVzYztcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMucHJlTWF0Y2guaW5kZXggJiZcbiAgICAgICAgICAgICh0YXJnZXREZXNjID0gdGhpcy5wcmVNYXRjaC5tYXRjaGVzW2luZGV4IC0gdGhpcy5wcmVNYXRjaC5pbmRleF0pLnBhcmVudCA9PSB0aGlzLnRvcCAmJlxuICAgICAgICAgICAgdGFyZ2V0RGVzYy5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykpIHtcbiAgICAgICAgICAgIGZvdW5kID0gdGhpcy50b3AuY2hpbGRyZW4uaW5kZXhPZih0YXJnZXREZXNjLCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4LCBlID0gTWF0aC5taW4odGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoLCBpICsgNSk7IGkgPCBlOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pICYmICF0aGlzLnByZU1hdGNoLm1hdGNoZWQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGZvdW5kKTtcbiAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlTm9kZUF0KG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBpbmRleCwgdmlldykge1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgIGlmIChjaGlsZC5kaXJ0eSA9PSBOT0RFX0RJUlRZICYmIGNoaWxkLmRvbSA9PSBjaGlsZC5jb250ZW50RE9NKVxuICAgICAgICAgICAgY2hpbGQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICBpZiAoIWNoaWxkLnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmaW5kSW5kZXhXaXRoQ2hpbGQoZG9tTm9kZSkge1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gZG9tTm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcC5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkb21Ob2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2MpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvcC5jaGlsZHJlbltpXSA9PSBkZXNjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tTm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUcnkgdG8gdXBkYXRlIHRoZSBuZXh0IG5vZGUsIGlmIGFueSwgdG8gdGhlIGdpdmVuIGRhdGEuIENoZWNrc1xuICAgIC8vIHByZS1tYXRjaGVzIHRvIGF2b2lkIG92ZXJ3cml0aW5nIG5vZGVzIHRoYXQgY291bGQgc3RpbGwgYmUgdXNlZC5cbiAgICB1cGRhdGVOZXh0Tm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgaW5kZXgsIHBvcykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBOb2RlVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlTWF0Y2ggPSB0aGlzLnByZU1hdGNoLm1hdGNoZWQuZ2V0KG5leHQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmVNYXRjaCAhPSBudWxsICYmIHByZU1hdGNoICE9IGluZGV4KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRET00gPSBuZXh0LmRvbSwgdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAvLyBDYW4ndCB1cGRhdGUgaWYgbmV4dERPTSBpcyBvciBjb250YWlucyB0aGlzLmxvY2ssIGV4Y2VwdCBpZlxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSB0ZXh0IG5vZGUgd2hvc2UgY29udGVudCBhbHJlYWR5IG1hdGNoZXMgdGhlIG5ldyB0ZXh0XG4gICAgICAgICAgICAgICAgLy8gYW5kIHdob3NlIGRlY29yYXRpb25zIG1hdGNoIHRoZSBuZXcgb25lcy5cbiAgICAgICAgICAgICAgICBsZXQgbG9ja2VkID0gdGhpcy5pc0xvY2tlZChuZXh0RE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGUuaXNUZXh0ICYmIG5leHQubm9kZSAmJiBuZXh0Lm5vZGUuaXNUZXh0ICYmIG5leHQubm9kZURPTS5ub2RlVmFsdWUgPT0gbm9kZS50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmRpcnR5ICE9IE5PREVfRElSVFkgJiYgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2NrZWQgJiYgbmV4dC51cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmRvbSAhPSBuZXh0RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWxvY2tlZCAmJiAodXBkYXRlZCA9IHRoaXMucmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lCZXR3ZWVuKHRoaXMuaW5kZXgsIGkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA9IHVwZGF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBXaGVuIGEgbm9kZSB3aXRoIGNvbnRlbnQgaXMgcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgbm9kZSB3aXRoXG4gICAgLy8gaWRlbnRpY2FsIGNvbnRlbnQsIG1vdmUgb3ZlciBpdHMgY2hpbGRyZW4uXG4gICAgcmVjcmVhdGVXcmFwcGVyKG5leHQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgaWYgKG5leHQuZGlydHkgfHwgbm9kZS5pc0F0b20gfHwgIW5leHQuY2hpbGRyZW4ubGVuZ3RoIHx8XG4gICAgICAgICAgICAhbmV4dC5ub2RlLmNvbnRlbnQuZXEobm9kZS5jb250ZW50KSB8fFxuICAgICAgICAgICAgIXNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCBuZXh0Lm91dGVyRGVjbykgfHwgIWlubmVyRGVjby5lcShuZXh0LmlubmVyRGVjbykpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdyYXBwZXIgPSBOb2RlVmlld0Rlc2MuY3JlYXRlKHRoaXMudG9wLCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKTtcbiAgICAgICAgaWYgKHdyYXBwZXIuY29udGVudERPTSkge1xuICAgICAgICAgICAgd3JhcHBlci5jaGlsZHJlbiA9IG5leHQuY2hpbGRyZW47XG4gICAgICAgICAgICBuZXh0LmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjaCBvZiB3cmFwcGVyLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoLnBhcmVudCA9IHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dC5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cbiAgICAvLyBJbnNlcnQgdGhlIG5vZGUgYXMgYSBuZXdseSBjcmVhdGVkIG5vZGUgZGVzYy5cbiAgICBhZGROb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGRlc2MgPSBOb2RlVmlld0Rlc2MuY3JlYXRlKHRoaXMudG9wLCBub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldywgcG9zKTtcbiAgICAgICAgaWYgKGRlc2MuY29udGVudERPTSlcbiAgICAgICAgICAgIGRlc2MudXBkYXRlQ2hpbGRyZW4odmlldywgcG9zICsgMSk7XG4gICAgICAgIHRoaXMudG9wLmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4KyssIDAsIGRlc2MpO1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBwbGFjZVdpZGdldCh3aWRnZXQsIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMuaW5kZXggPCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4XSA6IG51bGw7XG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQubWF0Y2hlc1dpZGdldCh3aWRnZXQpICYmXG4gICAgICAgICAgICAod2lkZ2V0ID09IG5leHQud2lkZ2V0IHx8ICFuZXh0LndpZGdldC50eXBlLnRvRE9NLnBhcmVudE5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGVzYyA9IG5ldyBXaWRnZXRWaWV3RGVzYyh0aGlzLnRvcCwgd2lkZ2V0LCB2aWV3LCBwb3MpO1xuICAgICAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSBhIHRleHRibG9jayBsb29rcyBhbmQgYmVoYXZlcyBjb3JyZWN0bHkgaW5cbiAgICAvLyBjb250ZW50RWRpdGFibGUuXG4gICAgYWRkVGV4dGJsb2NrSGFja3MoKSB7XG4gICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnRvcC5jaGlsZHJlblt0aGlzLmluZGV4IC0gMV0sIHBhcmVudCA9IHRoaXMudG9wO1xuICAgICAgICB3aGlsZSAobGFzdENoaWxkIGluc3RhbmNlb2YgTWFya1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBsYXN0Q2hpbGQ7XG4gICAgICAgICAgICBsYXN0Q2hpbGQgPSBwYXJlbnQuY2hpbGRyZW5bcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdENoaWxkIHx8IC8vIEVtcHR5IHRleHRibG9ja1xuICAgICAgICAgICAgIShsYXN0Q2hpbGQgaW5zdGFuY2VvZiBUZXh0Vmlld0Rlc2MpIHx8XG4gICAgICAgICAgICAvXFxuJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSB8fFxuICAgICAgICAgICAgKHRoaXMudmlldy5yZXF1aXJlc0dlY2tvSGFja05vZGUgJiYgL1xccyQvLnRlc3QobGFzdENoaWxkLm5vZGUudGV4dCkpKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBidWdzIGluIFNhZmFyaSdzIGN1cnNvciBkcmF3aW5nICgjMTE2NSkgYW5kIENocm9tZSdzIG1vdXNlIHNlbGVjdGlvbiAoIzExNTIpXG4gICAgICAgICAgICBpZiAoKHNhZmFyaSB8fCBjaHJvbWUpICYmIGxhc3RDaGlsZCAmJiBsYXN0Q2hpbGQuZG9tLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRIYWNrTm9kZShcIklNR1wiLCBwYXJlbnQpO1xuICAgICAgICAgICAgdGhpcy5hZGRIYWNrTm9kZShcIkJSXCIsIHRoaXMudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRIYWNrTm9kZShub2RlTmFtZSwgcGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQgPT0gdGhpcy50b3AgJiYgdGhpcy5pbmRleCA8IHBhcmVudC5jaGlsZHJlbi5sZW5ndGggJiYgcGFyZW50LmNoaWxkcmVuW3RoaXMuaW5kZXhdLm1hdGNoZXNIYWNrKG5vZGVOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpO1xuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1zZXBhcmF0b3JcIjtcbiAgICAgICAgICAgICAgICBkb20uYWx0ID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIkJSXCIpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3ItdHJhaWxpbmdCcmVha1wiO1xuICAgICAgICAgICAgbGV0IGhhY2sgPSBuZXcgVHJhaWxpbmdIYWNrVmlld0Rlc2ModGhpcy50b3AsIFtdLCBkb20sIG51bGwpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPSB0aGlzLnRvcClcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaChoYWNrKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgaGFjayk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzTG9ja2VkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jayAmJiAobm9kZSA9PSB0aGlzLmxvY2sgfHwgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY29udGFpbnModGhpcy5sb2NrLnBhcmVudE5vZGUpKTtcbiAgICB9XG59XG4vLyBJdGVyYXRlIGZyb20gdGhlIGVuZCBvZiB0aGUgZnJhZ21lbnQgYW5kIGFycmF5IG9mIGRlc2NzIHRvIGZpbmRcbi8vIGRpcmVjdGx5IG1hdGNoaW5nIG9uZXMsIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJlYWdlcmx5IHJldXNpbmcgdGhvc2Vcbi8vIGZvciBvdGhlciBub2Rlcy4gUmV0dXJucyB0aGUgZnJhZ21lbnQgaW5kZXggb2YgdGhlIGZpcnN0IG5vZGUgdGhhdFxuLy8gaXMgcGFydCBvZiB0aGUgc2VxdWVuY2Ugb2YgbWF0Y2hlZCBub2RlcyBhdCB0aGUgZW5kIG9mIHRoZVxuLy8gZnJhZ21lbnQuXG5mdW5jdGlvbiBwcmVNYXRjaChmcmFnLCBwYXJlbnREZXNjKSB7XG4gICAgbGV0IGN1ckRlc2MgPSBwYXJlbnREZXNjLCBkZXNjSSA9IGN1ckRlc2MuY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGxldCBmSSA9IGZyYWcuY2hpbGRDb3VudCwgbWF0Y2hlZCA9IG5ldyBNYXAsIG1hdGNoZXMgPSBbXTtcbiAgICBvdXRlcjogd2hpbGUgKGZJID4gMCkge1xuICAgICAgICBsZXQgZGVzYztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGRlc2NJKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSBjdXJEZXNjLmNoaWxkcmVuW2Rlc2NJIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyRGVzYyA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NJID0gbmV4dC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0ktLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VyRGVzYyA9PSBwYXJlbnREZXNjKSB7XG4gICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGSVhNRVxuICAgICAgICAgICAgICAgIGRlc2NJID0gY3VyRGVzYy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihjdXJEZXNjKTtcbiAgICAgICAgICAgICAgICBjdXJEZXNjID0gY3VyRGVzYy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5vZGUgPSBkZXNjLm5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm9kZSAhPSBmcmFnLmNoaWxkKGZJIC0gMSkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLS1mSTtcbiAgICAgICAgbWF0Y2hlZC5zZXQoZGVzYywgZkkpO1xuICAgICAgICBtYXRjaGVzLnB1c2goZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiB7IGluZGV4OiBmSSwgbWF0Y2hlZCwgbWF0Y2hlczogbWF0Y2hlcy5yZXZlcnNlKCkgfTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVTaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYS50eXBlLnNpZGUgLSBiLnR5cGUuc2lkZTtcbn1cbi8vIFRoaXMgZnVuY3Rpb24gYWJzdHJhY3RzIGl0ZXJhdGluZyBvdmVyIHRoZSBub2RlcyBhbmQgZGVjb3JhdGlvbnMgaW5cbi8vIGEgZnJhZ21lbnQuIENhbGxzIGBvbk5vZGVgIGZvciBlYWNoIG5vZGUsIHdpdGggaXRzIGxvY2FsIGFuZCBjaGlsZFxuLy8gZGVjb3JhdGlvbnMuIFNwbGl0cyB0ZXh0IG5vZGVzIHdoZW4gdGhlcmUgaXMgYSBkZWNvcmF0aW9uIHN0YXJ0aW5nXG4vLyBvciBlbmRpbmcgaW5zaWRlIG9mIHRoZW0uIENhbGxzIGBvbldpZGdldGAgZm9yIGVhY2ggd2lkZ2V0LlxuZnVuY3Rpb24gaXRlckRlY28ocGFyZW50LCBkZWNvLCBvbldpZGdldCwgb25Ob2RlKSB7XG4gICAgbGV0IGxvY2FscyA9IGRlY28ubG9jYWxzKHBhcmVudCksIG9mZnNldCA9IDA7XG4gICAgLy8gU2ltcGxlLCBjaGVhcCB2YXJpYW50IGZvciB3aGVuIHRoZXJlIGFyZSBubyBsb2NhbCBkZWNvcmF0aW9uc1xuICAgIGlmIChsb2NhbHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnQuY2hpbGRDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBwYXJlbnQuY2hpbGQoaSk7XG4gICAgICAgICAgICBvbk5vZGUoY2hpbGQsIGxvY2FscywgZGVjby5mb3JDaGlsZChvZmZzZXQsIGNoaWxkKSwgaSk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGVjb0luZGV4ID0gMCwgYWN0aXZlID0gW10sIHJlc3ROb2RlID0gbnVsbDtcbiAgICBmb3IgKGxldCBwYXJlbnRJbmRleCA9IDA7Oykge1xuICAgICAgICBsZXQgd2lkZ2V0LCB3aWRnZXRzO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA9PSBvZmZzZXQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbG9jYWxzW2RlY29JbmRleCsrXTtcbiAgICAgICAgICAgIGlmIChuZXh0LndpZGdldCkge1xuICAgICAgICAgICAgICAgIGlmICghd2lkZ2V0KVxuICAgICAgICAgICAgICAgICAgICB3aWRnZXQgPSBuZXh0O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHdpZGdldHMgfHwgKHdpZGdldHMgPSBbd2lkZ2V0XSkpLnB1c2gobmV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpZGdldCkge1xuICAgICAgICAgICAgaWYgKHdpZGdldHMpIHtcbiAgICAgICAgICAgICAgICB3aWRnZXRzLnNvcnQoY29tcGFyZVNpZGUpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgb25XaWRnZXQod2lkZ2V0c1tpXSwgcGFyZW50SW5kZXgsICEhcmVzdE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb25XaWRnZXQod2lkZ2V0LCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNoaWxkLCBpbmRleDtcbiAgICAgICAgaWYgKHJlc3ROb2RlKSB7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY2hpbGQgPSByZXN0Tm9kZTtcbiAgICAgICAgICAgIHJlc3ROb2RlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJlbnRJbmRleCA8IHBhcmVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgICAgICAgICAgY2hpbGQgPSBwYXJlbnQuY2hpbGQocGFyZW50SW5kZXgrKyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChhY3RpdmVbaV0udG8gPD0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIGFjdGl2ZS5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgd2hpbGUgKGRlY29JbmRleCA8IGxvY2Fscy5sZW5ndGggJiYgbG9jYWxzW2RlY29JbmRleF0uZnJvbSA8PSBvZmZzZXQgJiYgbG9jYWxzW2RlY29JbmRleF0udG8gPiBvZmZzZXQpXG4gICAgICAgICAgICBhY3RpdmUucHVzaChsb2NhbHNbZGVjb0luZGV4KytdKTtcbiAgICAgICAgbGV0IGVuZCA9IG9mZnNldCArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgICAgICBsZXQgY3V0QXQgPSBlbmQ7XG4gICAgICAgICAgICBpZiAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgY3V0QXQgPSBsb2NhbHNbZGVjb0luZGV4XS5mcm9tO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY3RpdmUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8IGN1dEF0KVxuICAgICAgICAgICAgICAgICAgICBjdXRBdCA9IGFjdGl2ZVtpXS50bztcbiAgICAgICAgICAgIGlmIChjdXRBdCA8IGVuZCkge1xuICAgICAgICAgICAgICAgIHJlc3ROb2RlID0gY2hpbGQuY3V0KGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmN1dCgwLCBjdXRBdCAtIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgZW5kID0gY3V0QXQ7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvIDwgZW5kKVxuICAgICAgICAgICAgICAgIGRlY29JbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRlckRlY28gPSBjaGlsZC5pc0lubGluZSAmJiAhY2hpbGQuaXNMZWFmID8gYWN0aXZlLmZpbHRlcihkID0+ICFkLmlubGluZSkgOiBhY3RpdmUuc2xpY2UoKTtcbiAgICAgICAgb25Ob2RlKGNoaWxkLCBvdXRlckRlY28sIGRlY28uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCksIGluZGV4KTtcbiAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgIH1cbn1cbi8vIExpc3QgbWFya2VycyBpbiBNb2JpbGUgU2FmYXJpIHdpbGwgbXlzdGVyaW91c2x5IGRpc2FwcGVhclxuLy8gc29tZXRpbWVzLiBUaGlzIHdvcmtzIGFyb3VuZCB0aGF0LlxuZnVuY3Rpb24gaW9zSGFja3MoZG9tKSB7XG4gICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIlVMXCIgfHwgZG9tLm5vZGVOYW1lID09IFwiT0xcIikge1xuICAgICAgICBsZXQgb2xkQ1NTID0gZG9tLnN0eWxlLmNzc1RleHQ7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTICsgXCI7IGxpc3Qtc3R5bGU6IHNxdWFyZSAhaW1wb3J0YW50XCI7XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvbSkubGlzdFN0eWxlO1xuICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcbiAgICB9XG59XG4vLyBGaW5kIGEgcGllY2Ugb2YgdGV4dCBpbiBhbiBpbmxpbmUgZnJhZ21lbnQsIG92ZXJsYXBwaW5nIGZyb20tdG9cbmZ1bmN0aW9uIGZpbmRUZXh0SW5GcmFnbWVudChmcmFnLCB0ZXh0LCBmcm9tLCB0bykge1xuICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSAwOyBpIDwgZnJhZy5jaGlsZENvdW50ICYmIHBvcyA8PSB0bzspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gZnJhZy5jaGlsZChpKyspLCBjaGlsZFN0YXJ0ID0gcG9zO1xuICAgICAgICBwb3MgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmICghY2hpbGQuaXNUZXh0KVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBzdHIgPSBjaGlsZC50ZXh0O1xuICAgICAgICB3aGlsZSAoaSA8IGZyYWcuY2hpbGRDb3VudCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBmcmFnLmNoaWxkKGkrKyk7XG4gICAgICAgICAgICBwb3MgKz0gbmV4dC5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmICghbmV4dC5pc1RleHQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBzdHIgKz0gbmV4dC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPj0gZnJvbSkge1xuICAgICAgICAgICAgaWYgKHBvcyA+PSB0byAmJiBzdHIuc2xpY2UodG8gLSB0ZXh0Lmxlbmd0aCAtIGNoaWxkU3RhcnQsIHRvIC0gY2hpbGRTdGFydCkgPT0gdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdG8gLSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGNoaWxkU3RhcnQgPCB0byA/IHN0ci5sYXN0SW5kZXhPZih0ZXh0LCB0byAtIGNoaWxkU3RhcnQgLSAxKSA6IC0xO1xuICAgICAgICAgICAgaWYgKGZvdW5kID49IDAgJiYgZm91bmQgKyB0ZXh0Lmxlbmd0aCArIGNoaWxkU3RhcnQgPj0gZnJvbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRTdGFydCArIGZvdW5kO1xuICAgICAgICAgICAgaWYgKGZyb20gPT0gdG8gJiYgc3RyLmxlbmd0aCA+PSAodG8gKyB0ZXh0Lmxlbmd0aCkgLSBjaGlsZFN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgc3RyLnNsaWNlKHRvIC0gY2hpbGRTdGFydCwgdG8gLSBjaGlsZFN0YXJ0ICsgdGV4dC5sZW5ndGgpID09IHRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8vIFJlcGxhY2UgcmFuZ2UgZnJvbS10byBpbiBhbiBhcnJheSBvZiB2aWV3IGRlc2NzIHdpdGggcmVwbGFjZW1lbnRcbi8vIChtYXkgYmUgbnVsbCB0byBqdXN0IGRlbGV0ZSkuIFRoaXMgZ29lcyB2ZXJ5IG11Y2ggYWdhaW5zdCB0aGUgZ3JhaW5cbi8vIG9mIHRoZSByZXN0IG9mIHRoaXMgY29kZSwgd2hpY2ggdGVuZHMgdG8gY3JlYXRlIG5vZGVzIHdpdGggdGhlXG4vLyByaWdodCBzaGFwZSBpbiBvbmUgZ28sIHJhdGhlciB0aGFuIG1lc3Npbmcgd2l0aCB0aGVtIGFmdGVyXG4vLyBjcmVhdGlvbiwgYnV0IGlzIG5lY2Vzc2FyeSBpbiB0aGUgY29tcG9zaXRpb24gaGFjay5cbmZ1bmN0aW9uIHJlcGxhY2VOb2Rlcyhub2RlcywgZnJvbSwgdG8sIHZpZXcsIHJlcGxhY2VtZW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBvZmYgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkID0gbm9kZXNbaV0sIHN0YXJ0ID0gb2ZmLCBlbmQgPSBvZmYgKz0gY2hpbGQuc2l6ZTtcbiAgICAgICAgaWYgKHN0YXJ0ID49IHRvIHx8IGVuZCA8PSBmcm9tKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPCBmcm9tKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkLnNsaWNlKDAsIGZyb20gLSBzdGFydCwgdmlldykpO1xuICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVuZCA+IHRvKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkLnNsaWNlKHRvIC0gc3RhcnQsIGNoaWxkLnNpemUsIHZpZXcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcsIG9yaWdpbiA9IG51bGwpIHtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICBpZiAoIWRvbVNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBuZWFyZXN0RGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhkb21TZWwuZm9jdXNOb2RlKSwgaW5XaWRnZXQgPSBuZWFyZXN0RGVzYyAmJiBuZWFyZXN0RGVzYy5zaXplID09IDA7XG4gICAgbGV0IGhlYWQgPSB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIDEpO1xuICAgIGlmIChoZWFkIDwgMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0ICRoZWFkID0gZG9jLnJlc29sdmUoaGVhZCksIGFuY2hvciwgc2VsZWN0aW9uO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSkge1xuICAgICAgICBhbmNob3IgPSBoZWFkO1xuICAgICAgICB3aGlsZSAobmVhcmVzdERlc2MgJiYgIW5lYXJlc3REZXNjLm5vZGUpXG4gICAgICAgICAgICBuZWFyZXN0RGVzYyA9IG5lYXJlc3REZXNjLnBhcmVudDtcbiAgICAgICAgbGV0IG5lYXJlc3REZXNjTm9kZSA9IG5lYXJlc3REZXNjLm5vZGU7XG4gICAgICAgIGlmIChuZWFyZXN0RGVzYyAmJiBuZWFyZXN0RGVzY05vZGUuaXNBdG9tICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5lYXJlc3REZXNjTm9kZSkgJiYgbmVhcmVzdERlc2MucGFyZW50XG4gICAgICAgICAgICAmJiAhKG5lYXJlc3REZXNjTm9kZS5pc0lubGluZSAmJiBpc09uRWRnZShkb21TZWwuZm9jdXNOb2RlLCBkb21TZWwuZm9jdXNPZmZzZXQsIG5lYXJlc3REZXNjLmRvbSkpKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gbmVhcmVzdERlc2MucG9zQmVmb3JlO1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gbmV3IE5vZGVTZWxlY3Rpb24oaGVhZCA9PSBwb3MgPyAkaGVhZCA6IGRvYy5yZXNvbHZlKHBvcykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZG9tU2VsIGluc3RhbmNlb2Ygdmlldy5kb20ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5TZWxlY3Rpb24gJiYgZG9tU2VsLnJhbmdlQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBsZXQgbWluID0gaGVhZCwgbWF4ID0gaGVhZDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tU2VsLnJhbmdlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByYW5nZSA9IGRvbVNlbC5nZXRSYW5nZUF0KGkpO1xuICAgICAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmlldy5kb2NWaWV3LnBvc0Zyb21ET00ocmFuZ2Uuc3RhcnRDb250YWluZXIsIHJhbmdlLnN0YXJ0T2Zmc2V0LCAxKSk7XG4gICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCwgLTEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaW4gPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgW2FuY2hvciwgaGVhZF0gPSBtYXggPT0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yID8gW21heCwgbWluXSA6IFttaW4sIG1heF07XG4gICAgICAgICAgICAkaGVhZCA9IGRvYy5yZXNvbHZlKGhlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yID0gdmlldy5kb2NWaWV3LnBvc0Zyb21ET00oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbmNob3IgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCAkYW5jaG9yID0gZG9jLnJlc29sdmUoYW5jaG9yKTtcbiAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgICBsZXQgYmlhcyA9IG9yaWdpbiA9PSBcInBvaW50ZXJcIiB8fCAodmlldy5zdGF0ZS5zZWxlY3Rpb24uaGVhZCA8ICRoZWFkLnBvcyAmJiAhaW5XaWRnZXQpID8gMSA6IC0xO1xuICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbn1cbmZ1bmN0aW9uIGVkaXRvck93bnNTZWxlY3Rpb24odmlldykge1xuICAgIHJldHVybiB2aWV3LmVkaXRhYmxlID8gdmlldy5oYXNGb2N1cygpIDpcbiAgICAgICAgaGFzU2VsZWN0aW9uKHZpZXcpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jb250YWlucyh2aWV3LmRvbSk7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Ub0RPTSh2aWV3LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCk7XG4gICAgaWYgKCFlZGl0b3JPd25zU2VsZWN0aW9uKHZpZXcpKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gVGhlIGRlbGF5ZWQgZHJhZyBzZWxlY3Rpb24gY2F1c2VzIGlzc3VlcyB3aXRoIENlbGwgU2VsZWN0aW9uc1xuICAgIC8vIGluIFNhZmFyaS4gQW5kIHRoZSBkcmFnIHNlbGVjdGlvbiBkZWxheSBpcyB0byB3b3JrYXJvbmQgaXNzdWVzXG4gICAgLy8gd2hpY2ggb25seSBwcmVzZW50IGluIENocm9tZS5cbiAgICBpZiAoIWZvcmNlICYmIHZpZXcuaW5wdXQubW91c2VEb3duICYmIHZpZXcuaW5wdXQubW91c2VEb3duLmFsbG93RGVmYXVsdCAmJiBjaHJvbWUpIHtcbiAgICAgICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSwgY3VyU2VsID0gdmlldy5kb21PYnNlcnZlci5jdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICBpZiAoZG9tU2VsLmFuY2hvck5vZGUgJiYgY3VyU2VsLmFuY2hvck5vZGUgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0LCBjdXJTZWwuYW5jaG9yTm9kZSwgY3VyU2VsLmFuY2hvck9mZnNldCkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duLmRlbGF5ZWRTZWxlY3Rpb25TeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5kaXNjb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHZpZXcuY3Vyc29yV3JhcHBlcikge1xuICAgICAgICBzZWxlY3RDdXJzb3JXcmFwcGVyKHZpZXcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHsgYW5jaG9yLCBoZWFkIH0gPSBzZWwsIHJlc2V0RWRpdGFibGVGcm9tLCByZXNldEVkaXRhYmxlVG87XG4gICAgICAgIGlmIChicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSAmJiAhKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAoIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlRnJvbSA9IHRlbXBvcmFyaWx5RWRpdGFibGVOZWFyKHZpZXcsIHNlbC5mcm9tKTtcbiAgICAgICAgICAgIGlmICghc2VsLmVtcHR5ICYmICFzZWwuJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZVRvID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLnRvKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LmRvY1ZpZXcuc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpO1xuICAgICAgICBpZiAoYnJva2VuU2VsZWN0QmV0d2VlblVuZWRpdGFibGUpIHtcbiAgICAgICAgICAgIGlmIChyZXNldEVkaXRhYmxlRnJvbSlcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlKHJlc2V0RWRpdGFibGVGcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXNldEVkaXRhYmxlVG8pXG4gICAgICAgICAgICAgICAgcmVzZXRFZGl0YWJsZShyZXNldEVkaXRhYmxlVG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWwudmlzaWJsZSkge1xuICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgICAgIGlmIChcIm9uc2VsZWN0aW9uY2hhbmdlXCIgaW4gZG9jdW1lbnQpXG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NPblNlbGVjdGlvbkNoYW5nZSh2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY29ubmVjdFNlbGVjdGlvbigpO1xufVxuLy8gS2x1ZGdlIHRvIHdvcmsgYXJvdW5kIFdlYmtpdCBub3QgYWxsb3dpbmcgYSBzZWxlY3Rpb24gdG8gc3RhcnQvZW5kXG4vLyBiZXR3ZWVuIG5vbi1lZGl0YWJsZSBibG9jayBub2Rlcy4gV2UgYnJpZWZseSBtYWtlIHNvbWV0aGluZ1xuLy8gZWRpdGFibGUsIHNldCB0aGUgc2VsZWN0aW9uLCB0aGVuIHNldCBpdCB1bmVkaXRhYmxlIGFnYWluLlxuY29uc3QgYnJva2VuU2VsZWN0QmV0d2VlblVuZWRpdGFibGUgPSBzYWZhcmkgfHwgY2hyb21lICYmIGNocm9tZV92ZXJzaW9uIDwgNjM7XG5mdW5jdGlvbiB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBwb3MpIHtcbiAgICBsZXQgeyBub2RlLCBvZmZzZXQgfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgMCk7XG4gICAgbGV0IGFmdGVyID0gb2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA/IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdIDogbnVsbDtcbiAgICBsZXQgYmVmb3JlID0gb2Zmc2V0ID8gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdIDogbnVsbDtcbiAgICBpZiAoc2FmYXJpICYmIGFmdGVyICYmIGFmdGVyLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShhZnRlcik7XG4gICAgaWYgKCghYWZ0ZXIgfHwgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikgJiZcbiAgICAgICAgKCFiZWZvcmUgfHwgYmVmb3JlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpKSB7XG4gICAgICAgIGlmIChhZnRlcilcbiAgICAgICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShhZnRlcik7XG4gICAgICAgIGVsc2UgaWYgKGJlZm9yZSlcbiAgICAgICAgICAgIHJldHVybiBzZXRFZGl0YWJsZShiZWZvcmUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldEVkaXRhYmxlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGlmIChzYWZhcmkgJiYgZWxlbWVudC5kcmFnZ2FibGUpIHtcbiAgICAgICAgZWxlbWVudC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgZWxlbWVudC53YXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbn1cbmZ1bmN0aW9uIHJlc2V0RWRpdGFibGUoZWxlbWVudCkge1xuICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgIGlmIChlbGVtZW50Lndhc0RyYWdnYWJsZSkge1xuICAgICAgICBlbGVtZW50LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgIGVsZW1lbnQud2FzRHJhZ2dhYmxlID0gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVDbGFzc09uU2VsZWN0aW9uQ2hhbmdlKHZpZXcpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudDtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IGRvbVNlbC5hbmNob3JOb2RlLCBvZmZzZXQgPSBkb21TZWwuYW5jaG9yT2Zmc2V0O1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9tU2VsLmFuY2hvck5vZGUgIT0gbm9kZSB8fCBkb21TZWwuYW5jaG9yT2Zmc2V0ICE9IG9mZnNldCkge1xuICAgICAgICAgICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlZGl0b3JPd25zU2VsZWN0aW9uKHZpZXcpIHx8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUpXG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5yZW1vdmUoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgfSwgMjApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBzZWxlY3RDdXJzb3JXcmFwcGVyKHZpZXcpIHtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb24oKSwgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGlmICghZG9tU2VsKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IG5vZGUgPSB2aWV3LmN1cnNvcldyYXBwZXIuZG9tLCBpbWcgPSBub2RlLm5vZGVOYW1lID09IFwiSU1HXCI7XG4gICAgaWYgKGltZylcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZS5wYXJlbnROb2RlLCBkb21JbmRleChub2RlKSArIDEpO1xuICAgIGVsc2VcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgMCk7XG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgZG9tU2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIGRvbVNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgLy8gS2x1ZGdlIHRvIGtpbGwgJ2NvbnRyb2wgc2VsZWN0aW9uJyBpbiBJRTExIHdoZW4gc2VsZWN0aW5nIGFuXG4gICAgLy8gaW52aXNpYmxlIGN1cnNvciB3cmFwcGVyLCBzaW5jZSB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0aG9zZSB3ZWlyZFxuICAgIC8vIHJlc2l6ZSBoYW5kbGVzIGFuZCBhIHNlbGVjdGlvbiB0aGF0IGNvbnNpZGVycyB0aGUgYWJzb2x1dGVseVxuICAgIC8vIHBvc2l0aW9uZWQgd3JhcHBlciwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgZWRpdGFibGUgbm9kZSwgdGhlXG4gICAgLy8gZm9jdXNlZCBlbGVtZW50LlxuICAgIGlmICghaW1nICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi52aXNpYmxlICYmIGllICYmIGllX3ZlcnNpb24gPD0gMTEpIHtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIG5vZGUuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBzeW5jTm9kZVNlbGVjdGlvbih2aWV3LCBzZWwpIHtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbikge1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5kZXNjQXQoc2VsLmZyb20pO1xuICAgICAgICBpZiAoZGVzYyAhPSB2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjKSB7XG4gICAgICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odmlldyk7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICBkZXNjLnNlbGVjdE5vZGUoKTtcbiAgICAgICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSBkZXNjO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjbGVhck5vZGVTZWxlY3Rpb24odmlldyk7XG4gICAgfVxufVxuLy8gQ2xlYXIgYWxsIERPTSBzdGF0ZWZ1bG5lc3Mgb2YgdGhlIGxhc3Qgbm9kZSBzZWxlY3Rpb24uXG5mdW5jdGlvbiBjbGVhck5vZGVTZWxlY3Rpb24odmlldykge1xuICAgIGlmICh2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjKSB7XG4gICAgICAgIGlmICh2aWV3Lmxhc3RTZWxlY3RlZFZpZXdEZXNjLnBhcmVudClcbiAgICAgICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MuZGVzZWxlY3ROb2RlKCk7XG4gICAgICAgIHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VsZWN0aW9uQmV0d2Vlbih2aWV3LCAkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgIHJldHVybiB2aWV3LnNvbWVQcm9wKFwiY3JlYXRlU2VsZWN0aW9uQmV0d2VlblwiLCBmID0+IGYodmlldywgJGFuY2hvciwgJGhlYWQpKVxuICAgICAgICB8fCBUZXh0U2VsZWN0aW9uLmJldHdlZW4oJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xufVxuZnVuY3Rpb24gaGFzRm9jdXNBbmRTZWxlY3Rpb24odmlldykge1xuICAgIGlmICh2aWV3LmVkaXRhYmxlICYmICF2aWV3Lmhhc0ZvY3VzKCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaGFzU2VsZWN0aW9uKHZpZXcpO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGlmICghc2VsLmFuY2hvck5vZGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICAvLyBGaXJlZm94IHdpbGwgcmFpc2UgJ3Blcm1pc3Npb24gZGVuaWVkJyBlcnJvcnMgd2hlbiBhY2Nlc3NpbmdcbiAgICAgICAgLy8gcHJvcGVydGllcyBvZiBgc2VsLmFuY2hvck5vZGVgIHdoZW4gaXQncyBpbiBhIGdlbmVyYXRlZCBDU1NcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgcmV0dXJuIHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5hbmNob3JOb2RlLm5vZGVUeXBlID09IDMgPyBzZWwuYW5jaG9yTm9kZS5wYXJlbnROb2RlIDogc2VsLmFuY2hvck5vZGUpICYmXG4gICAgICAgICAgICAodmlldy5lZGl0YWJsZSB8fCB2aWV3LmRvbS5jb250YWlucyhzZWwuZm9jdXNOb2RlLm5vZGVUeXBlID09IDMgPyBzZWwuZm9jdXNOb2RlLnBhcmVudE5vZGUgOiBzZWwuZm9jdXNOb2RlKSk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBhbmNob3JJblJpZ2h0UGxhY2Uodmlldykge1xuICAgIGxldCBhbmNob3JET00gPSB2aWV3LmRvY1ZpZXcuZG9tRnJvbVBvcyh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IsIDApO1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgcmV0dXJuIGlzRXF1aXZhbGVudFBvc2l0aW9uKGFuY2hvckRPTS5ub2RlLCBhbmNob3JET00ub2Zmc2V0LCBkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVTZWxlY3Rpb25CbG9jayhzdGF0ZSwgZGlyKSB7XG4gICAgbGV0IHsgJGFuY2hvciwgJGhlYWQgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgJHNpZGUgPSBkaXIgPiAwID8gJGFuY2hvci5tYXgoJGhlYWQpIDogJGFuY2hvci5taW4oJGhlYWQpO1xuICAgIGxldCAkc3RhcnQgPSAhJHNpZGUucGFyZW50LmlubGluZUNvbnRlbnQgPyAkc2lkZSA6ICRzaWRlLmRlcHRoID8gc3RhdGUuZG9jLnJlc29sdmUoZGlyID4gMCA/ICRzaWRlLmFmdGVyKCkgOiAkc2lkZS5iZWZvcmUoKSkgOiBudWxsO1xuICAgIHJldHVybiAkc3RhcnQgJiYgU2VsZWN0aW9uLmZpbmRGcm9tKCRzdGFydCwgZGlyKTtcbn1cbmZ1bmN0aW9uIGFwcGx5KHZpZXcsIHNlbCkge1xuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKG1vZHMuaW5kZXhPZihcInNcIikgPiAtMSkge1xuICAgICAgICAgICAgbGV0IHsgJGhlYWQgfSA9IHNlbCwgbm9kZSA9ICRoZWFkLnRleHRPZmZzZXQgPyBudWxsIDogZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXI7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5pc1RleHQgfHwgIW5vZGUuaXNMZWFmKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCAkbmV3SGVhZCA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zICsgbm9kZS5ub2RlU2l6ZSAqIChkaXIgPCAwID8gLTEgOiAxKSk7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IFRleHRTZWxlY3Rpb24oc2VsLiRhbmNob3IsICRuZXdIZWFkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXNlbC5lbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyID4gMCA/IFwiZm9yd2FyZFwiIDogXCJiYWNrd2FyZFwiKSkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgICAgIGlmIChuZXh0ICYmIChuZXh0IGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEobWFjICYmIG1vZHMuaW5kZXhPZihcIm1cIikgPiAtMSkpIHtcbiAgICAgICAgICAgIGxldCAkaGVhZCA9IHNlbC4kaGVhZCwgbm9kZSA9ICRoZWFkLnRleHRPZmZzZXQgPyBudWxsIDogZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIsIGRlc2M7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5pc1RleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IG5vZGVQb3MgPSBkaXIgPCAwID8gJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSA6ICRoZWFkLnBvcztcbiAgICAgICAgICAgIGlmICghKG5vZGUuaXNBdG9tIHx8IChkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChub2RlUG9zKSkgJiYgIWRlc2MuY29udGVudERPTSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBOb2RlU2VsZWN0aW9uKGRpciA8IDAgPyB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKCRoZWFkLnBvcyAtIG5vZGUubm9kZVNpemUpIDogJGhlYWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdlYmtpdCkge1xuICAgICAgICAgICAgICAgIC8vIENocm9tZSBhbmQgU2FmYXJpIHdpbGwgaW50cm9kdWNlIGV4dHJhIHBvaW50bGVzcyBjdXJzb3JcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbnMgYXJvdW5kIGlubGluZSB1bmVkaXRhYmxlIG5vZGVzLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgICAgICAgICAgLy8gdGFrZSBvdmVyIGFuZCBtb3ZlIHRoZSBjdXJzb3IgcGFzdCB0aGVtICgjOTM3KVxuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGRpciA8IDAgPyBub2RlUG9zIDogbm9kZVBvcyArIG5vZGUubm9kZVNpemUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzZWwubm9kZS5pc0lubGluZSkge1xuICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IFRleHRTZWxlY3Rpb24oZGlyID4gMCA/IHNlbC4kdG8gOiBzZWwuJGZyb20pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBuZXh0ID0gbW92ZVNlbGVjdGlvbkJsb2NrKHZpZXcuc3RhdGUsIGRpcik7XG4gICAgICAgIGlmIChuZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9kZUxlbihub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT0gMyA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBpc0lnbm9yYWJsZShkb20sIGRpcikge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5zaXplID09IDAgJiYgKGRpciA8IDAgfHwgZG9tLm5leHRTaWJsaW5nIHx8IGRvbS5ub2RlTmFtZSAhPSBcIkJSXCIpO1xufVxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlcyh2aWV3LCBkaXIpIHtcbiAgICByZXR1cm4gZGlyIDwgMCA/IHNraXBJZ25vcmVkTm9kZXNCZWZvcmUodmlldykgOiBza2lwSWdub3JlZE5vZGVzQWZ0ZXIodmlldyk7XG59XG4vLyBNYWtlIHN1cmUgdGhlIGN1cnNvciBpc24ndCBkaXJlY3RseSBhZnRlciBvbmUgb3IgbW9yZSBpZ25vcmVkXG4vLyBub2Rlcywgd2hpY2ggd2lsbCBjb25mdXNlIHRoZSBicm93c2VyJ3MgY3Vyc29yIG1vdGlvbiBsb2dpYy5cbmZ1bmN0aW9uIHNraXBJZ25vcmVkTm9kZXNCZWZvcmUodmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgbGV0IG5vZGUgPSBzZWwuZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7XG4gICAgaWYgKCFub2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IG1vdmVOb2RlLCBtb3ZlT2Zmc2V0LCBmb3JjZSA9IGZhbHNlO1xuICAgIC8vIEdlY2tvIHdpbGwgZG8gb2RkIHRoaW5ncyB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgZGlyZWN0bHkgaW4gZnJvbnRcbiAgICAvLyBvZiBhIG5vbi1lZGl0YWJsZSBub2RlLCBzbyBpbiB0aGF0IGNhc2UsIG1vdmUgaXQgaW50byB0aGUgbmV4dFxuICAgIC8vIG5vZGUgaWYgcG9zc2libGUuIElzc3VlIHByb3NlbWlycm9yL3Byb3NlbWlycm9yIzgzMi5cbiAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA8IG5vZGVMZW4obm9kZSkgJiYgaXNJZ25vcmFibGUobm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIC0xKSlcbiAgICAgICAgZm9yY2UgPSB0cnVlO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGlzSWdub3JhYmxlKGJlZm9yZSwgLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IC0tb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChiZWZvcmUubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlLm5vZGVWYWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNCbG9ja05vZGUobm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHByZXYgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChwcmV2ICYmIGlzSWdub3JhYmxlKHByZXYsIC0xKSkge1xuICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSBkb21JbmRleChwcmV2KTtcbiAgICAgICAgICAgICAgICBwcmV2ID0gcHJldi5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXByZXYpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHByZXY7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZUxlbihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9yY2UpXG4gICAgICAgIHNldFNlbEZvY3VzKHZpZXcsIG5vZGUsIG9mZnNldCk7XG4gICAgZWxzZSBpZiAobW92ZU5vZGUpXG4gICAgICAgIHNldFNlbEZvY3VzKHZpZXcsIG1vdmVOb2RlLCBtb3ZlT2Zmc2V0KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGJlZm9yZSBvbmUgb3IgbW9yZSBpZ25vcmVkXG4vLyBub2Rlcy5cbmZ1bmN0aW9uIHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbGVuID0gbm9kZUxlbihub2RlKTtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQ7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYWZ0ZXIsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSArK29mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAobmV4dCAmJiBpc0lnbm9yYWJsZShuZXh0LCAxKSkge1xuICAgICAgICAgICAgICAgIG1vdmVOb2RlID0gbmV4dC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIG1vdmVPZmZzZXQgPSBkb21JbmRleChuZXh0KSArIDE7XG4gICAgICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuZnVuY3Rpb24gaXNCbG9ja05vZGUoZG9tKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLm5vZGUgJiYgZGVzYy5ub2RlLmlzQmxvY2s7XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkge1xuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMSAmJiBuZXh0LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgIW9mZnNldCAmJiAhaGFzQmxvY2tEZXNjKG5vZGUpKSB7XG4gICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB3aGlsZSAobm9kZSAmJiBvZmZzZXQpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMSAmJiBuZXh0LmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgIG9mZnNldCA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMykge1xuICAgICAgICBsZXQgYmVmb3JlLCBhZnRlcjtcbiAgICAgICAgaWYgKGFmdGVyID0gdGV4dE5vZGVBZnRlcihub2RlLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICBub2RlID0gYWZ0ZXI7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJlZm9yZSA9IHRleHROb2RlQmVmb3JlKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICBvZmZzZXQgPSBiZWZvcmUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSkge1xuICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICByYW5nZS5zZXRFbmQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgb2Zmc2V0KTtcbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWwuZXh0ZW5kKSB7XG4gICAgICAgIHNlbC5leHRlbmQobm9kZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICBsZXQgeyBzdGF0ZSB9ID0gdmlldztcbiAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgZW5kcyB1cCBoYXBwZW5pbmcsIHJlc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3LnN0YXRlID09IHN0YXRlKVxuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZmluZERpcmVjdGlvbih2aWV3LCBwb3MpIHtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoIShjaHJvbWUgfHwgd2luZG93cykgJiYgJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgY29vcmRzID0gdmlldy5jb29yZHNBdFBvcyhwb3MpO1xuICAgICAgICBpZiAocG9zID4gJHBvcy5zdGFydCgpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdmlldy5jb29yZHNBdFBvcyhwb3MgLSAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYmVmb3JlLnRvcCArIGJlZm9yZS5ib3R0b20pIC8gMjtcbiAgICAgICAgICAgIGlmIChtaWQgPiBjb29yZHMudG9wICYmIG1pZCA8IGNvb3Jkcy5ib3R0b20gJiYgTWF0aC5hYnMoYmVmb3JlLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUubGVmdCA8IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA8ICRwb3MuZW5kKCkpIHtcbiAgICAgICAgICAgIGxldCBhZnRlciA9IHZpZXcuY29vcmRzQXRQb3MocG9zICsgMSk7XG4gICAgICAgICAgICBsZXQgbWlkID0gKGFmdGVyLnRvcCArIGFmdGVyLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhhZnRlci5sZWZ0IC0gY29vcmRzLmxlZnQpID4gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYWZ0ZXIubGVmdCA+IGNvb3Jkcy5sZWZ0ID8gXCJsdHJcIiA6IFwicnRsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbXB1dGVkID0gZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkuZGlyZWN0aW9uO1xuICAgIHJldHVybiBjb21wdXRlZCA9PSBcInJ0bFwiID8gXCJydGxcIiA6IFwibHRyXCI7XG59XG4vLyBDaGVjayB3aGV0aGVyIHZlcnRpY2FsIHNlbGVjdGlvbiBtb3Rpb24gd291bGQgaW52b2x2ZSBub2RlXG4vLyBzZWxlY3Rpb25zLiBJZiBzbywgYXBwbHkgaXQgKGlmIG5vdCwgdGhlIHJlc3VsdCBpcyBsZWZ0IHRvIHRoZVxuLy8gYnJvd3NlcilcbmZ1bmN0aW9uIHNlbGVjdFZlcnRpY2FsbHkodmlldywgZGlyLCBtb2RzKSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgfHwgbW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1hYyAmJiBtb2RzLmluZGV4T2YoXCJtXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCB2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA8IDAgPyBcInVwXCIgOiBcImRvd25cIikpIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXh0KTtcbiAgICB9XG4gICAgaWYgKCEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICBsZXQgc2lkZSA9IGRpciA8IDAgPyAkZnJvbSA6ICR0bztcbiAgICAgICAgbGV0IGJleW9uZCA9IHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiA/IFNlbGVjdGlvbi5uZWFyKHNpZGUsIGRpcikgOiBTZWxlY3Rpb24uZmluZEZyb20oc2lkZSwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGJleW9uZCA/IGFwcGx5KHZpZXcsIGJleW9uZCkgOiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgZGlyKSB7XG4gICAgaWYgKCEodmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgbGV0IHsgJGhlYWQsICRhbmNob3IsIGVtcHR5IH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgbmV4dE5vZGUgPSAhJGhlYWQudGV4dE9mZnNldCAmJiAoZGlyIDwgMCA/ICRoZWFkLm5vZGVCZWZvcmUgOiAkaGVhZC5ub2RlQWZ0ZXIpO1xuICAgIGlmIChuZXh0Tm9kZSAmJiAhbmV4dE5vZGUuaXNUZXh0KSB7XG4gICAgICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgIGlmIChkaXIgPCAwKVxuICAgICAgICAgICAgdHIuZGVsZXRlKCRoZWFkLnBvcyAtIG5leHROb2RlLm5vZGVTaXplLCAkaGVhZC5wb3MpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zLCAkaGVhZC5wb3MgKyBuZXh0Tm9kZS5ub2RlU2l6ZSk7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc3dpdGNoRWRpdGFibGUodmlldywgbm9kZSwgc3RhdGUpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBub2RlLmNvbnRlbnRFZGl0YWJsZSA9IHN0YXRlO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbn1cbi8vIElzc3VlICM4NjcgLyAjMTA5MCAvIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTkwMzgyMVxuLy8gSW4gd2hpY2ggU2FmYXJpIChhbmQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdCwgQ2hyb21lKSBkb2VzIHJlYWxseVxuLy8gd3JvbmcgdGhpbmdzIHdoZW4gdGhlIGRvd24gYXJyb3cgaXMgcHJlc3NlZCB3aGVuIHRoZSBjdXJzb3IgaXNcbi8vIGRpcmVjdGx5IGF0IHRoZSBzdGFydCBvZiBhIHRleHRibG9jayBhbmQgaGFzIGFuIHVuZWRpdGFibGUgbm9kZVxuLy8gYWZ0ZXIgaXRcbmZ1bmN0aW9uIHNhZmFyaURvd25BcnJvd0J1Zyh2aWV3KSB7XG4gICAgaWYgKCFzYWZhcmkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7IGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoZm9jdXNOb2RlICYmIGZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxICYmIGZvY3VzT2Zmc2V0ID09IDAgJiZcbiAgICAgICAgZm9jdXNOb2RlLmZpcnN0Q2hpbGQgJiYgZm9jdXNOb2RlLmZpcnN0Q2hpbGQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikge1xuICAgICAgICBsZXQgY2hpbGQgPSBmb2N1c05vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgc3dpdGNoRWRpdGFibGUodmlldywgY2hpbGQsIFwidHJ1ZVwiKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJmYWxzZVwiKSwgMjApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBBIGJhY2tkcm9wIGtleSBtYXBwaW5nIHVzZWQgdG8gbWFrZSBzdXJlIHdlIGFsd2F5cyBzdXBwcmVzcyBrZXlzXG4vLyB0aGF0IGhhdmUgYSBkYW5nZXJvdXMgZGVmYXVsdCBlZmZlY3QsIGV2ZW4gaWYgdGhlIGNvbW1hbmRzIHRoZXkgYXJlXG4vLyBib3VuZCB0byByZXR1cm4gZmFsc2UsIGFuZCB0byBtYWtlIHN1cmUgdGhhdCBjdXJzb3ItbW90aW9uIGtleXNcbi8vIGZpbmQgYSBjdXJzb3IgKGFzIG9wcG9zZWQgdG8gYSBub2RlIHNlbGVjdGlvbikgd2hlbiBwcmVzc2VkLiBGb3Jcbi8vIGN1cnNvci1tb3Rpb24ga2V5cywgdGhlIGNvZGUgaW4gdGhlIGhhbmRsZXJzIGFsc28gdGFrZXMgY2FyZSBvZlxuLy8gYmxvY2sgc2VsZWN0aW9ucy5cbmZ1bmN0aW9uIGdldE1vZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBpZiAoZXZlbnQuY3RybEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiY1wiO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJtXCI7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwiYVwiO1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgICAgcmVzdWx0ICs9IFwic1wiO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkge1xuICAgIGxldCBjb2RlID0gZXZlbnQua2V5Q29kZSwgbW9kcyA9IGdldE1vZHMoZXZlbnQpO1xuICAgIGlmIChjb2RlID09IDggfHwgKG1hYyAmJiBjb2RlID09IDcyICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIEJhY2tzcGFjZSwgQ3RybC1oIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgLTEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmICgoY29kZSA9PSA0NiAmJiAhZXZlbnQuc2hpZnRLZXkpIHx8IChtYWMgJiYgY29kZSA9PSA2OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEZWxldGUsIEN0cmwtZCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHN0b3BOYXRpdmVIb3Jpem9udGFsRGVsZXRlKHZpZXcsIDEpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMTMgfHwgY29kZSA9PSAyNykgeyAvLyBFbnRlciwgRXNjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM3IHx8IChtYWMgJiYgY29kZSA9PSA2NiAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBMZWZ0IGFycm93LCBDdHJsLWIgb24gTWFjXG4gICAgICAgIGxldCBkaXIgPSBjb2RlID09IDM3ID8gKGZpbmREaXJlY3Rpb24odmlldywgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSkgPT0gXCJsdHJcIiA/IC0xIDogMSkgOiAtMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOSB8fCAobWFjICYmIGNvZGUgPT0gNzAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gUmlnaHQgYXJyb3csIEN0cmwtZiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzkgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gMSA6IC0xKSA6IDE7XG4gICAgICAgIHJldHVybiBzZWxlY3RIb3Jpem9udGFsbHkodmlldywgZGlyLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzggfHwgKG1hYyAmJiBjb2RlID09IDgwICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIFVwIGFycm93LCBDdHJsLXAgb24gTWFjXG4gICAgICAgIHJldHVybiBzZWxlY3RWZXJ0aWNhbGx5KHZpZXcsIC0xLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIC0xKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSA0MCB8fCAobWFjICYmIGNvZGUgPT0gNzggJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gRG93biBhcnJvdywgQ3RybC1uIG9uIE1hY1xuICAgICAgICByZXR1cm4gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHx8IHNlbGVjdFZlcnRpY2FsbHkodmlldywgMSwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kcyA9PSAobWFjID8gXCJtXCIgOiBcImNcIikgJiZcbiAgICAgICAgKGNvZGUgPT0gNjYgfHwgY29kZSA9PSA3MyB8fCBjb2RlID09IDg5IHx8IGNvZGUgPT0gOTApKSB7IC8vIE1vZC1bYml5el1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKSB7XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybUNvcGllZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgbGV0IGNvbnRleHQgPSBbXSwgeyBjb250ZW50LCBvcGVuU3RhcnQsIG9wZW5FbmQgfSA9IHNsaWNlO1xuICAgIHdoaWxlIChvcGVuU3RhcnQgPiAxICYmIG9wZW5FbmQgPiAxICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxICYmIGNvbnRlbnQuZmlyc3RDaGlsZC5jaGlsZENvdW50ID09IDEpIHtcbiAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgIG9wZW5FbmQtLTtcbiAgICAgICAgbGV0IG5vZGUgPSBjb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGNvbnRleHQucHVzaChub2RlLnR5cGUubmFtZSwgbm9kZS5hdHRycyAhPSBub2RlLnR5cGUuZGVmYXVsdEF0dHJzID8gbm9kZS5hdHRycyA6IG51bGwpO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICBsZXQgc2VyaWFsaXplciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRTZXJpYWxpemVyXCIpIHx8IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgbGV0IGRvYyA9IGRldGFjaGVkRG9jKCksIHdyYXAgPSBkb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQoY29udGVudCwgeyBkb2N1bWVudDogZG9jIH0pKTtcbiAgICBsZXQgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZCwgbmVlZHNXcmFwLCB3cmFwcGVycyA9IDA7XG4gICAgd2hpbGUgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmIChuZWVkc1dyYXAgPSB3cmFwTWFwW2ZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBuZWVkc1dyYXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCB3cmFwcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQobmVlZHNXcmFwW2ldKTtcbiAgICAgICAgICAgIHdoaWxlICh3cmFwLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh3cmFwLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgICAgIHdyYXBwZXJzKys7XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3RDaGlsZCA9IHdyYXAuZmlyc3RDaGlsZDtcbiAgICB9XG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICBmaXJzdENoaWxkLnNldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIiwgYCR7b3BlblN0YXJ0fSAke29wZW5FbmR9JHt3cmFwcGVycyA/IGAgLSR7d3JhcHBlcnN9YCA6IFwiXCJ9ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dCl9YCk7XG4gICAgbGV0IHRleHQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFNlcmlhbGl6ZXJcIiwgZiA9PiBmKHNsaWNlLCB2aWV3KSkgfHxcbiAgICAgICAgc2xpY2UuY29udGVudC50ZXh0QmV0d2VlbigwLCBzbGljZS5jb250ZW50LnNpemUsIFwiXFxuXFxuXCIpO1xuICAgIHJldHVybiB7IGRvbTogd3JhcCwgdGV4dCwgc2xpY2UgfTtcbn1cbi8vIFJlYWQgYSBzbGljZSBvZiBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZCAob3IgZHJvcCBkYXRhKS5cbmZ1bmN0aW9uIHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCB0ZXh0LCBodG1sLCBwbGFpblRleHQsICRjb250ZXh0KSB7XG4gICAgbGV0IGluQ29kZSA9ICRjb250ZXh0LnBhcmVudC50eXBlLnNwZWMuY29kZTtcbiAgICBsZXQgZG9tLCBzbGljZTtcbiAgICBpZiAoIWh0bWwgJiYgIXRleHQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBhc1RleHQgPSB0ZXh0ICYmIChwbGFpblRleHQgfHwgaW5Db2RlIHx8ICFodG1sKTtcbiAgICBpZiAoYXNUZXh0KSB7XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJ0cmFuc2Zvcm1QYXN0ZWRUZXh0XCIsIGYgPT4geyB0ZXh0ID0gZih0ZXh0LCBpbkNvZGUgfHwgcGxhaW5UZXh0LCB2aWV3KTsgfSk7XG4gICAgICAgIGlmIChpbkNvZGUpXG4gICAgICAgICAgICByZXR1cm4gdGV4dCA/IG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHZpZXcuc3RhdGUuc2NoZW1hLnRleHQodGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpKSksIDAsIDApIDogU2xpY2UuZW1wdHk7XG4gICAgICAgIGxldCBwYXJzZWQgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkVGV4dFBhcnNlclwiLCBmID0+IGYodGV4dCwgJGNvbnRleHQsIHBsYWluVGV4dCwgdmlldykpO1xuICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICBzbGljZSA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9ICRjb250ZXh0Lm1hcmtzKCk7XG4gICAgICAgICAgICBsZXQgeyBzY2hlbWEgfSA9IHZpZXcuc3RhdGUsIHNlcmlhbGl6ZXIgPSBET01TZXJpYWxpemVyLmZyb21TY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgICAgIGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICB0ZXh0LnNwbGl0KC8oPzpcXHJcXG4/fFxcbikrLykuZm9yRWFjaChibG9jayA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBkb20uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICAgICAgICAgIGlmIChibG9jaylcbiAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRDaGlsZChzZXJpYWxpemVyLnNlcmlhbGl6ZU5vZGUoc2NoZW1hLnRleHQoYmxvY2ssIG1hcmtzKSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJ0cmFuc2Zvcm1QYXN0ZWRIVE1MXCIsIGYgPT4geyBodG1sID0gZihodG1sLCB2aWV3KTsgfSk7XG4gICAgICAgIGRvbSA9IHJlYWRIVE1MKGh0bWwpO1xuICAgICAgICBpZiAod2Via2l0KVxuICAgICAgICAgICAgcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSk7XG4gICAgfVxuICAgIGxldCBjb250ZXh0Tm9kZSA9IGRvbSAmJiBkb20ucXVlcnlTZWxlY3RvcihcIltkYXRhLXBtLXNsaWNlXVwiKTtcbiAgICBsZXQgc2xpY2VEYXRhID0gY29udGV4dE5vZGUgJiYgL14oXFxkKykgKFxcZCspKD86IC0oXFxkKykpPyAoLiopLy5leGVjKGNvbnRleHROb2RlLmdldEF0dHJpYnV0ZShcImRhdGEtcG0tc2xpY2VcIikgfHwgXCJcIik7XG4gICAgaWYgKHNsaWNlRGF0YSAmJiBzbGljZURhdGFbM10pXG4gICAgICAgIGZvciAobGV0IGkgPSArc2xpY2VEYXRhWzNdOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC5ub2RlVHlwZSAhPSAxKVxuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZG9tID0gY2hpbGQ7XG4gICAgICAgIH1cbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICAgIGxldCBwYXJzZXIgPSB2aWV3LnNvbWVQcm9wKFwiY2xpcGJvYXJkUGFyc2VyXCIpIHx8IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgICAgICBzbGljZSA9IHBhcnNlci5wYXJzZVNsaWNlKGRvbSwge1xuICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiAhIShhc1RleHQgfHwgc2xpY2VEYXRhKSxcbiAgICAgICAgICAgIGNvbnRleHQ6ICRjb250ZXh0LFxuICAgICAgICAgICAgcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgICAgICAgICAgICAgIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmICFkb20ubmV4dFNpYmxpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgZG9tLnBhcmVudE5vZGUgJiYgIWlubGluZVBhcmVudHMudGVzdChkb20ucGFyZW50Tm9kZS5ub2RlTmFtZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGlnbm9yZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHNsaWNlRGF0YSkge1xuICAgICAgICBzbGljZSA9IGFkZENvbnRleHQoY2xvc2VTbGljZShzbGljZSwgK3NsaWNlRGF0YVsxXSwgK3NsaWNlRGF0YVsyXSksIHNsaWNlRGF0YVs0XSk7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBIVE1MIHdhc24ndCBjcmVhdGVkIGJ5IFByb3NlTWlycm9yLiBNYWtlIHN1cmUgdG9wLWxldmVsIHNpYmxpbmdzIGFyZSBjb2hlcmVudFxuICAgICAgICBzbGljZSA9IFNsaWNlLm1heE9wZW4obm9ybWFsaXplU2libGluZ3Moc2xpY2UuY29udGVudCwgJGNvbnRleHQpLCB0cnVlKTtcbiAgICAgICAgaWYgKHNsaWNlLm9wZW5TdGFydCB8fCBzbGljZS5vcGVuRW5kKSB7XG4gICAgICAgICAgICBsZXQgb3BlblN0YXJ0ID0gMCwgb3BlbkVuZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5maXJzdENoaWxkOyBvcGVuU3RhcnQgPCBzbGljZS5vcGVuU3RhcnQgJiYgIW5vZGUudHlwZS5zcGVjLmlzb2xhdGluZzsgb3BlblN0YXJ0KyssIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQpIHsgfVxuICAgICAgICAgICAgZm9yIChsZXQgbm9kZSA9IHNsaWNlLmNvbnRlbnQubGFzdENoaWxkOyBvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuRW5kKyssIG5vZGUgPSBub2RlLmxhc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBzbGljZSA9IGNsb3NlU2xpY2Uoc2xpY2UsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgaW5saW5lUGFyZW50cyA9IC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvaTtcbi8vIFRha2VzIGEgc2xpY2UgcGFyc2VkIHdpdGggcGFyc2VTbGljZSwgd2hpY2ggbWVhbnMgdGhlcmUgaGFzbid0IGJlZW5cbi8vIGFueSBjb250ZW50LWV4cHJlc3Npb24gY2hlY2tpbmcgZG9uZSBvbiB0aGUgdG9wIG5vZGVzLCB0cmllcyB0b1xuLy8gZmluZCBhIHBhcmVudCBub2RlIGluIHRoZSBjdXJyZW50IGNvbnRleHQgdGhhdCBtaWdodCBmaXQgdGhlIG5vZGVzLFxuLy8gYW5kIGlmIHN1Y2Nlc3NmdWwsIHJlYnVpbGRzIHRoZSBzbGljZSBzbyB0aGF0IGl0IGZpdHMgaW50byB0aGF0IHBhcmVudC5cbi8vXG4vLyBUaGlzIGFkZHJlc3NlcyB0aGUgcHJvYmxlbSB0aGF0IFRyYW5zZm9ybS5yZXBsYWNlIGV4cGVjdHMgYVxuLy8gY29oZXJlbnQgc2xpY2UsIGFuZCB3aWxsIGZhaWwgdG8gcGxhY2UgYSBzZXQgb2Ygc2libGluZ3MgdGhhdCBkb24ndFxuLy8gZml0IGFueXdoZXJlIGluIHRoZSBzY2hlbWEuXG5mdW5jdGlvbiBub3JtYWxpemVTaWJsaW5ncyhmcmFnbWVudCwgJGNvbnRleHQpIHtcbiAgICBpZiAoZnJhZ21lbnQuY2hpbGRDb3VudCA8IDIpXG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICBmb3IgKGxldCBkID0gJGNvbnRleHQuZGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSAkY29udGV4dC5ub2RlKGQpO1xuICAgICAgICBsZXQgbWF0Y2ggPSBwYXJlbnQuY29udGVudE1hdGNoQXQoJGNvbnRleHQuaW5kZXgoZCkpO1xuICAgICAgICBsZXQgbGFzdFdyYXAsIHJlc3VsdCA9IFtdO1xuICAgICAgICBmcmFnbWVudC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHdyYXAgPSBtYXRjaC5maW5kV3JhcHBpbmcobm9kZS50eXBlKSwgaW5MYXN0O1xuICAgICAgICAgICAgaWYgKCF3cmFwKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGluTGFzdCA9IHJlc3VsdC5sZW5ndGggJiYgbGFzdFdyYXAubGVuZ3RoICYmIGFkZFRvU2libGluZyh3cmFwLCBsYXN0V3JhcCwgbm9kZSwgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgMCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdID0gaW5MYXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBjbG9zZVJpZ2h0KHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0sIGxhc3RXcmFwLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXBwZWQgPSB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2god3JhcHBlZCk7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5tYXRjaFR5cGUod3JhcHBlZC50eXBlKTtcbiAgICAgICAgICAgICAgICBsYXN0V3JhcCA9IHdyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb20ocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xufVxuZnVuY3Rpb24gd2l0aFdyYXBwZXJzKG5vZGUsIHdyYXAsIGZyb20gPSAwKSB7XG4gICAgZm9yIChsZXQgaSA9IHdyYXAubGVuZ3RoIC0gMTsgaSA+PSBmcm9tOyBpLS0pXG4gICAgICAgIG5vZGUgPSB3cmFwW2ldLmNyZWF0ZShudWxsLCBGcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICByZXR1cm4gbm9kZTtcbn1cbi8vIFVzZWQgdG8gZ3JvdXAgYWRqYWNlbnQgbm9kZXMgd3JhcHBlZCBpbiBzaW1pbGFyIHBhcmVudHMgYnlcbi8vIG5vcm1hbGl6ZVNpYmxpbmdzIGludG8gdGhlIHNhbWUgcGFyZW50IG5vZGVcbmZ1bmN0aW9uIGFkZFRvU2libGluZyh3cmFwLCBsYXN0V3JhcCwgbm9kZSwgc2libGluZywgZGVwdGgpIHtcbiAgICBpZiAoZGVwdGggPCB3cmFwLmxlbmd0aCAmJiBkZXB0aCA8IGxhc3RXcmFwLmxlbmd0aCAmJiB3cmFwW2RlcHRoXSA9PSBsYXN0V3JhcFtkZXB0aF0pIHtcbiAgICAgICAgbGV0IGlubmVyID0gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLmxhc3RDaGlsZCwgZGVwdGggKyAxKTtcbiAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmcuY29weShzaWJsaW5nLmNvbnRlbnQucmVwbGFjZUNoaWxkKHNpYmxpbmcuY2hpbGRDb3VudCAtIDEsIGlubmVyKSk7XG4gICAgICAgIGxldCBtYXRjaCA9IHNpYmxpbmcuY29udGVudE1hdGNoQXQoc2libGluZy5jaGlsZENvdW50KTtcbiAgICAgICAgaWYgKG1hdGNoLm1hdGNoVHlwZShkZXB0aCA9PSB3cmFwLmxlbmd0aCAtIDEgPyBub2RlLnR5cGUgOiB3cmFwW2RlcHRoICsgMV0pKVxuICAgICAgICAgICAgcmV0dXJuIHNpYmxpbmcuY29weShzaWJsaW5nLmNvbnRlbnQuYXBwZW5kKEZyYWdtZW50LmZyb20od2l0aFdyYXBwZXJzKG5vZGUsIHdyYXAsIGRlcHRoICsgMSkpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2xvc2VSaWdodChub2RlLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICBsZXQgZnJhZ21lbnQgPSBub2RlLmNvbnRlbnQucmVwbGFjZUNoaWxkKG5vZGUuY2hpbGRDb3VudCAtIDEsIGNsb3NlUmlnaHQobm9kZS5sYXN0Q2hpbGQsIGRlcHRoIC0gMSkpO1xuICAgIGxldCBmaWxsID0gbm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgIHJldHVybiBub2RlLmNvcHkoZnJhZ21lbnQuYXBwZW5kKGZpbGwpKTtcbn1cbmZ1bmN0aW9uIGNsb3NlUmFuZ2UoZnJhZ21lbnQsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCwgb3BlbkVuZCkge1xuICAgIGxldCBub2RlID0gc2lkZSA8IDAgPyBmcmFnbWVudC5maXJzdENoaWxkIDogZnJhZ21lbnQubGFzdENoaWxkLCBpbm5lciA9IG5vZGUuY29udGVudDtcbiAgICBpZiAoZnJhZ21lbnQuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgIG9wZW5FbmQgPSAwO1xuICAgIGlmIChkZXB0aCA8IHRvIC0gMSlcbiAgICAgICAgaW5uZXIgPSBjbG9zZVJhbmdlKGlubmVyLCBzaWRlLCBmcm9tLCB0bywgZGVwdGggKyAxLCBvcGVuRW5kKTtcbiAgICBpZiAoZGVwdGggPj0gZnJvbSlcbiAgICAgICAgaW5uZXIgPSBzaWRlIDwgMCA/IG5vZGUuY29udGVudE1hdGNoQXQoMCkuZmlsbEJlZm9yZShpbm5lciwgb3BlbkVuZCA8PSBkZXB0aCkuYXBwZW5kKGlubmVyKVxuICAgICAgICAgICAgOiBpbm5lci5hcHBlbmQobm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICByZXR1cm4gZnJhZ21lbnQucmVwbGFjZUNoaWxkKHNpZGUgPCAwID8gMCA6IGZyYWdtZW50LmNoaWxkQ291bnQgLSAxLCBub2RlLmNvcHkoaW5uZXIpKTtcbn1cbmZ1bmN0aW9uIGNsb3NlU2xpY2Uoc2xpY2UsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGlmIChvcGVuU3RhcnQgPCBzbGljZS5vcGVuU3RhcnQpXG4gICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKGNsb3NlUmFuZ2Uoc2xpY2UuY29udGVudCwgLTEsIG9wZW5TdGFydCwgc2xpY2Uub3BlblN0YXJ0LCAwLCBzbGljZS5vcGVuRW5kKSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuRW5kKTtcbiAgICBpZiAob3BlbkVuZCA8IHNsaWNlLm9wZW5FbmQpXG4gICAgICAgIHNsaWNlID0gbmV3IFNsaWNlKGNsb3NlUmFuZ2Uoc2xpY2UuY29udGVudCwgMSwgb3BlbkVuZCwgc2xpY2Uub3BlbkVuZCwgMCwgMCksIHNsaWNlLm9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuLy8gVHJpY2sgZnJvbSBqUXVlcnkgLS0gc29tZSBlbGVtZW50cyBtdXN0IGJlIHdyYXBwZWQgaW4gb3RoZXJcbi8vIGVsZW1lbnRzIGZvciBpbm5lckhUTUwgdG8gd29yay4gSS5lLiBpZiB5b3UgZG8gYGRpdi5pbm5lckhUTUwgPVxuLy8gXCI8dGQ+Li48L3RkPlwiYCB0aGUgdGFibGUgY2VsbHMgYXJlIGlnbm9yZWQuXG5jb25zdCB3cmFwTWFwID0ge1xuICAgIHRoZWFkOiBbXCJ0YWJsZVwiXSxcbiAgICB0Ym9keTogW1widGFibGVcIl0sXG4gICAgdGZvb3Q6IFtcInRhYmxlXCJdLFxuICAgIGNhcHRpb246IFtcInRhYmxlXCJdLFxuICAgIGNvbGdyb3VwOiBbXCJ0YWJsZVwiXSxcbiAgICBjb2w6IFtcInRhYmxlXCIsIFwiY29sZ3JvdXBcIl0sXG4gICAgdHI6IFtcInRhYmxlXCIsIFwidGJvZHlcIl0sXG4gICAgdGQ6IFtcInRhYmxlXCIsIFwidGJvZHlcIiwgXCJ0clwiXSxcbiAgICB0aDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdXG59O1xubGV0IF9kZXRhY2hlZERvYyA9IG51bGw7XG5mdW5jdGlvbiBkZXRhY2hlZERvYygpIHtcbiAgICByZXR1cm4gX2RldGFjaGVkRG9jIHx8IChfZGV0YWNoZWREb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJ0aXRsZVwiKSk7XG59XG5sZXQgX3BvbGljeSA9IG51bGw7XG5mdW5jdGlvbiBtYXliZVdyYXBUcnVzdGVkKGh0bWwpIHtcbiAgICBsZXQgdHJ1c3RlZFR5cGVzID0gd2luZG93LnRydXN0ZWRUeXBlcztcbiAgICBpZiAoIXRydXN0ZWRUeXBlcylcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgLy8gV2l0aCB0aGUgcmVxdWlyZS10cnVzdGVkLXR5cGVzLWZvciBDU1AsIENocm9tZSB3aWxsIGJsb2NrXG4gICAgLy8gaW5uZXJIVE1MLCBldmVuIG9uIGEgZGV0YWNoZWQgZG9jdW1lbnQuIFRoaXMgd3JhcHMgdGhlIHN0cmluZyBpblxuICAgIC8vIGEgd2F5IHRoYXQgbWFrZXMgdGhlIGJyb3dzZXIgYWxsb3cgdXMgdG8gdXNlIGl0cyBwYXJzZXIgYWdhaW4uXG4gICAgaWYgKCFfcG9saWN5KVxuICAgICAgICBfcG9saWN5ID0gdHJ1c3RlZFR5cGVzLmRlZmF1bHRQb2xpY3kgfHwgdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeShcIlByb3NlTWlycm9yQ2xpcGJvYXJkXCIsIHsgY3JlYXRlSFRNTDogKHMpID0+IHMgfSk7XG4gICAgcmV0dXJuIF9wb2xpY3kuY3JlYXRlSFRNTChodG1sKTtcbn1cbmZ1bmN0aW9uIHJlYWRIVE1MKGh0bWwpIHtcbiAgICBsZXQgbWV0YXMgPSAvXihcXHMqPG1ldGEgW14+XSo+KSovLmV4ZWMoaHRtbCk7XG4gICAgaWYgKG1ldGFzKVxuICAgICAgICBodG1sID0gaHRtbC5zbGljZShtZXRhc1swXS5sZW5ndGgpO1xuICAgIGxldCBlbHQgPSBkZXRhY2hlZERvYygpLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbGV0IGZpcnN0VGFnID0gLzwoW2Etel1bXj5cXHNdKykvaS5leGVjKGh0bWwpLCB3cmFwO1xuICAgIGlmICh3cmFwID0gZmlyc3RUYWcgJiYgd3JhcE1hcFtmaXJzdFRhZ1sxXS50b0xvd2VyQ2FzZSgpXSlcbiAgICAgICAgaHRtbCA9IHdyYXAubWFwKG4gPT4gXCI8XCIgKyBuICsgXCI+XCIpLmpvaW4oXCJcIikgKyBodG1sICsgd3JhcC5tYXAobiA9PiBcIjwvXCIgKyBuICsgXCI+XCIpLnJldmVyc2UoKS5qb2luKFwiXCIpO1xuICAgIGVsdC5pbm5lckhUTUwgPSBtYXliZVdyYXBUcnVzdGVkKGh0bWwpO1xuICAgIGlmICh3cmFwKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdyYXAubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBlbHQgPSBlbHQucXVlcnlTZWxlY3Rvcih3cmFwW2ldKSB8fCBlbHQ7XG4gICAgcmV0dXJuIGVsdDtcbn1cbi8vIFdlYmtpdCBicm93c2VycyBkbyBzb21lIGhhcmQtdG8tcHJlZGljdCByZXBsYWNlbWVudCBvZiByZWd1bGFyXG4vLyBzcGFjZXMgd2l0aCBub24tYnJlYWtpbmcgc3BhY2VzIHdoZW4gcHV0dGluZyBjb250ZW50IG9uIHRoZVxuLy8gY2xpcGJvYXJkLiBUaGlzIHRyaWVzIHRvIGNvbnZlcnQgc3VjaCBub24tYnJlYWtpbmcgc3BhY2VzICh3aGljaFxuLy8gd2lsbCBiZSB3cmFwcGVkIGluIGEgcGxhaW4gc3BhbiBvbiBDaHJvbWUsIGEgc3BhbiB3aXRoIGNsYXNzXG4vLyBBcHBsZS1jb252ZXJ0ZWQtc3BhY2Ugb24gU2FmYXJpKSBiYWNrIHRvIHJlZ3VsYXIgc3BhY2VzLlxuZnVuY3Rpb24gcmVzdG9yZVJlcGxhY2VkU3BhY2VzKGRvbSkge1xuICAgIGxldCBub2RlcyA9IGRvbS5xdWVyeVNlbGVjdG9yQWxsKGNocm9tZSA/IFwic3Bhbjpub3QoW2NsYXNzXSk6bm90KFtzdHlsZV0pXCIgOiBcInNwYW4uQXBwbGUtY29udmVydGVkLXNwYWNlXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLnRleHRDb250ZW50ID09IFwiXFx1MDBhMFwiICYmIG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9tLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIgXCIpLCBub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRDb250ZXh0KHNsaWNlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgbGV0IHNjaGVtYSA9IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50eXBlLnNjaGVtYSwgYXJyYXk7XG4gICAgdHJ5IHtcbiAgICAgICAgYXJyYXkgPSBKU09OLnBhcnNlKGNvbnRleHQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgZm9yIChsZXQgaSA9IGFycmF5Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7XG4gICAgICAgIGxldCB0eXBlID0gc2NoZW1hLm5vZGVzW2FycmF5W2ldXTtcbiAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUuaGFzUmVxdWlyZWRBdHRycygpKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGFycmF5W2kgKyAxXSwgY29udGVudCkpO1xuICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgb3BlbkVuZCsrO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG59XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBET00gZXZlbnRzIHRoYXQgb2NjdXIgd2l0aGluIHRoZSBlZGl0b3IsIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbi8vIHRvIGludm9rZSB3aGVuIHRoZSBldmVudCBmaXJlcy5cbmNvbnN0IGhhbmRsZXJzID0ge307XG5jb25zdCBlZGl0SGFuZGxlcnMgPSB7fTtcbmNvbnN0IHBhc3NpdmVIYW5kbGVycyA9IHsgdG91Y2hzdGFydDogdHJ1ZSwgdG91Y2htb3ZlOiB0cnVlIH07XG5jbGFzcyBJbnB1dFN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zaGlmdEtleSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdXNlRG93biA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RLZXlDb2RlVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdENsaWNrID0geyB0aW1lOiAwLCB4OiAwLCB5OiAwLCB0eXBlOiBcIlwiLCBidXR0b246IDAgfTtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uT3JpZ2luID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0aW9uVGltZSA9IDA7XG4gICAgICAgIHRoaXMubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SU9TRW50ZXJGYWxsYmFja1RpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5sYXN0Rm9jdXMgPSAwO1xuICAgICAgICB0aGlzLmxhc3RUb3VjaCA9IDA7XG4gICAgICAgIHRoaXMubGFzdENocm9tZURlbGV0ZSA9IDA7XG4gICAgICAgIHRoaXMuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmdUaW1lb3V0ID0gLTE7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25JRCA9IDE7XG4gICAgICAgIC8vIFNldCB0byBhIGNvbXBvc2l0aW9uIElEIHdoZW4gdGhlcmUgYXJlIHBlbmRpbmcgY2hhbmdlcyBhdCBjb21wb3NpdGlvbmVuZFxuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgPSAwO1xuICAgICAgICB0aGlzLmRvbUNoYW5nZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5oaWRlU2VsZWN0aW9uR3VhcmQgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRJbnB1dCh2aWV3KSB7XG4gICAgZm9yIChsZXQgZXZlbnQgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudF07XG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1tldmVudF0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpICYmICFydW5DdXN0b21IYW5kbGVyKHZpZXcsIGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHZpZXcsIGV2ZW50KTtcbiAgICAgICAgfSwgcGFzc2l2ZUhhbmRsZXJzW2V2ZW50XSA/IHsgcGFzc2l2ZTogdHJ1ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgLy8gT24gU2FmYXJpLCBmb3IgcmVhc29ucyBiZXlvbmQgbXkgdW5kZXJzdGFuZGluZywgYWRkaW5nIGFuIGlucHV0XG4gICAgLy8gZXZlbnQgaGFuZGxlciBtYWtlcyBhbiBpc3N1ZSB3aGVyZSB0aGUgY29tcG9zaXRpb24gdmFuaXNoZXMgd2hlblxuICAgIC8vIHlvdSBwcmVzcyBlbnRlciBnbyBhd2F5LlxuICAgIGlmIChzYWZhcmkpXG4gICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiBudWxsKTtcbiAgICBlbnN1cmVMaXN0ZW5lcnModmlldyk7XG59XG5mdW5jdGlvbiBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgb3JpZ2luKSB7XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgIHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPSBEYXRlLm5vdygpO1xufVxuZnVuY3Rpb24gZGVzdHJveUlucHV0KHZpZXcpIHtcbiAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVycylcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCB2aWV3LmlucHV0LmV2ZW50SGFuZGxlcnNbdHlwZV0pO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCk7XG59XG5mdW5jdGlvbiBlbnN1cmVMaXN0ZW5lcnModmlldykge1xuICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVET01FdmVudHNcIiwgY3VycmVudEhhbmRsZXJzID0+IHtcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiBjdXJyZW50SGFuZGxlcnMpXG4gICAgICAgICAgICBpZiAoIXZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSlcbiAgICAgICAgICAgICAgICB2aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSA9IGV2ZW50ID0+IHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpIHtcbiAgICByZXR1cm4gdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBoYW5kbGVycyA9PiB7XG4gICAgICAgIGxldCBoYW5kbGVyID0gaGFuZGxlcnNbZXZlbnQudHlwZV07XG4gICAgICAgIHJldHVybiBoYW5kbGVyID8gaGFuZGxlcih2aWV3LCBldmVudCkgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IGZhbHNlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZXZlbnRCZWxvbmdzVG9WaWV3KHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5idWJibGVzKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGUgIT0gdmlldy5kb207IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpXG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlID09IDExIHx8XG4gICAgICAgICAgICAobm9kZS5wbVZpZXdEZXNjICYmIG5vZGUucG1WaWV3RGVzYy5zdG9wRXZlbnQoZXZlbnQpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmIGhhbmRsZXJzW2V2ZW50LnR5cGVdICYmXG4gICAgICAgICh2aWV3LmVkaXRhYmxlIHx8ICEoZXZlbnQudHlwZSBpbiBlZGl0SGFuZGxlcnMpKSlcbiAgICAgICAgaGFuZGxlcnNbZXZlbnQudHlwZV0odmlldywgZXZlbnQpO1xufVxuZWRpdEhhbmRsZXJzLmtleWRvd24gPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBldmVudC5rZXlDb2RlID09IDE2IHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBldmVudC5rZXlDb2RlO1xuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAvLyBTdXBwcmVzcyBlbnRlciBrZXkgZXZlbnRzIG9uIENocm9tZSBBbmRyb2lkLCBiZWNhdXNlIHRob3NlIHRlbmRcbiAgICAvLyB0byBiZSBwYXJ0IG9mIGEgY29uZnVzZWQgc2VxdWVuY2Ugb2YgY29tcG9zaXRpb24gZXZlbnRzIGZpcmVkLFxuICAgIC8vIGFuZCBoYW5kbGluZyB0aGVtIGVhZ2VybHkgdGVuZHMgdG8gY29ycnVwdCB0aGUgaW5wdXQuXG4gICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lICYmIGV2ZW50LmtleUNvZGUgPT0gMTMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPSAyMjkpXG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIC8vIE9uIGlPUywgaWYgd2UgcHJldmVudERlZmF1bHQgZW50ZXIga2V5IHByZXNzZXMsIHRoZSB2aXJ0dWFsXG4gICAgLy8ga2V5Ym9hcmQgZ2V0cyBjb25mdXNlZC4gU28gdGhlIGhhY2sgaGVyZSBpcyB0byBzZXQgYSBmbGFnIHRoYXRcbiAgICAvLyBtYWtlcyB0aGUgRE9NIGNoYW5nZSBjb2RlIHJlY29nbml6ZSB0aGF0IHdoYXQganVzdCBoYXBwZW5zIHNob3VsZFxuICAgIC8vIGJlIHJlcGxhY2VkIGJ5IHdoYXRldmVyIHRoZSBFbnRlciBrZXkgaGFuZGxlcnMgZG8uXG4gICAgaWYgKGlvcyAmJiBldmVudC5rZXlDb2RlID09IDEzICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gbm93O1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdElPU0VudGVyID09IG5vdykge1xuICAgICAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpO1xuICAgICAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkgfHwgY2FwdHVyZUtleURvd24odmlldywgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJrZXlcIik7XG4gICAgfVxufTtcbmVkaXRIYW5kbGVycy5rZXl1cCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09IDE2KVxuICAgICAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZmFsc2U7XG59O1xuZWRpdEhhbmRsZXJzLmtleXByZXNzID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAoaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkgfHwgIWV2ZW50LmNoYXJDb2RlIHx8XG4gICAgICAgIGV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fCBtYWMgJiYgZXZlbnQubWV0YUtleSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5UHJlc3NcIiwgZiA9PiBmKHZpZXcsIGV2ZW50KSkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikgfHwgIXNlbC4kZnJvbS5zYW1lUGFyZW50KHNlbC4kdG8pKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSk7XG4gICAgICAgIGlmICghL1tcXHJcXG5dLy50ZXN0KHRleHQpICYmICF2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBzZWwuJGZyb20ucG9zLCBzZWwuJHRvLnBvcywgdGV4dCkpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmluc2VydFRleHQodGV4dCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGV2ZW50Q29vcmRzKGV2ZW50KSB7IHJldHVybiB7IGxlZnQ6IGV2ZW50LmNsaWVudFgsIHRvcDogZXZlbnQuY2xpZW50WSB9OyB9XG5mdW5jdGlvbiBpc05lYXIoZXZlbnQsIGNsaWNrKSB7XG4gICAgbGV0IGR4ID0gY2xpY2sueCAtIGV2ZW50LmNsaWVudFgsIGR5ID0gY2xpY2sueSAtIGV2ZW50LmNsaWVudFk7XG4gICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5IDwgMTAwO1xufVxuZnVuY3Rpb24gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBwcm9wTmFtZSwgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBpZiAodmlldy5zb21lUHJvcChwcm9wTmFtZSwgZiA9PiBpID4gJHBvcy5kZXB0aCA/IGYodmlldywgcG9zLCAkcG9zLm5vZGVBZnRlciwgJHBvcy5iZWZvcmUoaSksIGV2ZW50LCB0cnVlKVxuICAgICAgICAgICAgOiBmKHZpZXcsIHBvcywgJHBvcy5ub2RlKGkpLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIGZhbHNlKSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKHZpZXcsIHNlbGVjdGlvbiwgb3JpZ2luKSB7XG4gICAgaWYgKCF2aWV3LmZvY3VzZWQpXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZXEoc2VsZWN0aW9uKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB0ciA9IHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7XG4gICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgdHIuc2V0TWV0YShcInBvaW50ZXJcIiwgdHJ1ZSk7XG4gICAgdmlldy5kaXNwYXRjaCh0cik7XG59XG5mdW5jdGlvbiBzZWxlY3RDbGlja2VkTGVhZih2aWV3LCBpbnNpZGUpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICBpZiAobm9kZSAmJiBub2RlLmlzQXRvbSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSkge1xuICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyksIFwicG9pbnRlclwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWROb2RlKHZpZXcsIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgPT0gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24sIHNlbGVjdGVkTm9kZSwgc2VsZWN0QXQ7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pXG4gICAgICAgIHNlbGVjdGVkTm9kZSA9IHNlbC5ub2RlO1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9IGkgPiAkcG9zLmRlcHRoID8gJHBvcy5ub2RlQWZ0ZXIgOiAkcG9zLm5vZGUoaSk7XG4gICAgICAgIGlmIChOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSAmJiBzZWwuJGZyb20uZGVwdGggPiAwICYmXG4gICAgICAgICAgICAgICAgaSA+PSBzZWwuJGZyb20uZGVwdGggJiYgJHBvcy5iZWZvcmUoc2VsLiRmcm9tLmRlcHRoICsgMSkgPT0gc2VsLiRmcm9tLnBvcylcbiAgICAgICAgICAgICAgICBzZWxlY3RBdCA9ICRwb3MuYmVmb3JlKHNlbC4kZnJvbS5kZXB0aCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VsZWN0QXQgPSAkcG9zLmJlZm9yZShpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxlY3RBdCAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgc2VsZWN0QXQpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNpbmdsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCwgc2VsZWN0Tm9kZSkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpIHx8XG4gICAgICAgIChzZWxlY3ROb2RlID8gc2VsZWN0Q2xpY2tlZE5vZGUodmlldywgaW5zaWRlKSA6IHNlbGVjdENsaWNrZWRMZWFmKHZpZXcsIGluc2lkZSkpO1xufVxuZnVuY3Rpb24gaGFuZGxlRG91YmxlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVEb3VibGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZURvdWJsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSk7XG59XG5mdW5jdGlvbiBoYW5kbGVUcmlwbGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZVRyaXBsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVHJpcGxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKSB8fFxuICAgICAgICBkZWZhdWx0VHJpcGxlQ2xpY2sodmlldywgaW5zaWRlLCBldmVudCk7XG59XG5mdW5jdGlvbiBkZWZhdWx0VHJpcGxlQ2xpY2sodmlldywgaW5zaWRlLCBldmVudCkge1xuICAgIGlmIChldmVudC5idXR0b24gIT0gMClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICBpZiAoaW5zaWRlID09IC0xKSB7XG4gICAgICAgIGlmIChkb2MuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgMCwgZG9jLmNvbnRlbnQuc2l6ZSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShpbnNpZGUpO1xuICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoICsgMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9IGkgPiAkcG9zLmRlcHRoID8gJHBvcy5ub2RlQWZ0ZXIgOiAkcG9zLm5vZGUoaSk7XG4gICAgICAgIGxldCBub2RlUG9zID0gJHBvcy5iZWZvcmUoaSk7XG4gICAgICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCBub2RlUG9zICsgMSwgbm9kZVBvcyArIDEgKyBub2RlLmNvbnRlbnQuc2l6ZSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgZWxzZSBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgTm9kZVNlbGVjdGlvbi5jcmVhdGUoZG9jLCBub2RlUG9zKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gZm9yY2VET01GbHVzaCh2aWV3KSB7XG4gICAgcmV0dXJuIGVuZENvbXBvc2l0aW9uKHZpZXcpO1xufVxuY29uc3Qgc2VsZWN0Tm9kZU1vZGlmaWVyID0gbWFjID8gXCJtZXRhS2V5XCIgOiBcImN0cmxLZXlcIjtcbmhhbmRsZXJzLm1vdXNlZG93biA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgdmlldy5pbnB1dC5zaGlmdEtleSA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgIGxldCBmbHVzaGVkID0gZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKSwgdHlwZSA9IFwic2luZ2xlQ2xpY2tcIjtcbiAgICBpZiAobm93IC0gdmlldy5pbnB1dC5sYXN0Q2xpY2sudGltZSA8IDUwMCAmJiBpc05lYXIoZXZlbnQsIHZpZXcuaW5wdXQubGFzdENsaWNrKSAmJiAhZXZlbnRbc2VsZWN0Tm9kZU1vZGlmaWVyXSAmJlxuICAgICAgICB2aWV3LmlucHV0Lmxhc3RDbGljay5idXR0b24gPT0gZXZlbnQuYnV0dG9uKSB7XG4gICAgICAgIGlmICh2aWV3LmlucHV0Lmxhc3RDbGljay50eXBlID09IFwic2luZ2xlQ2xpY2tcIilcbiAgICAgICAgICAgIHR5cGUgPSBcImRvdWJsZUNsaWNrXCI7XG4gICAgICAgIGVsc2UgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJkb3VibGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwidHJpcGxlQ2xpY2tcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0Q2xpY2sgPSB7IHRpbWU6IG5vdywgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSwgdHlwZSwgYnV0dG9uOiBldmVudC5idXR0b24gfTtcbiAgICBsZXQgcG9zID0gdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGlmICghcG9zKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKSB7XG4gICAgICAgIGlmICh2aWV3LmlucHV0Lm1vdXNlRG93bilcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubW91c2VEb3duLmRvbmUoKTtcbiAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24gPSBuZXcgTW91c2VEb3duKHZpZXcsIHBvcywgZXZlbnQsICEhZmx1c2hlZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCh0eXBlID09IFwiZG91YmxlQ2xpY2tcIiA/IGhhbmRsZURvdWJsZUNsaWNrIDogaGFuZGxlVHJpcGxlQ2xpY2spKHZpZXcsIHBvcy5wb3MsIHBvcy5pbnNpZGUsIGV2ZW50KSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbiAgICB9XG59O1xuY2xhc3MgTW91c2VEb3duIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBwb3MsIGV2ZW50LCBmbHVzaGVkKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHRoaXMuZmx1c2hlZCA9IGZsdXNoZWQ7XG4gICAgICAgIHRoaXMuZGVsYXllZFNlbGVjdGlvblN5bmMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5taWdodERyYWcgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSA9ICEhZXZlbnRbc2VsZWN0Tm9kZU1vZGlmaWVyXTtcbiAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgbGV0IHRhcmdldE5vZGUsIHRhcmdldFBvcztcbiAgICAgICAgaWYgKHBvcy5pbnNpZGUgPiAtMSkge1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IHZpZXcuc3RhdGUuZG9jLm5vZGVBdChwb3MuaW5zaWRlKTtcbiAgICAgICAgICAgIHRhcmdldFBvcyA9IHBvcy5pbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zLnBvcyk7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gJHBvcy5wYXJlbnQ7XG4gICAgICAgICAgICB0YXJnZXRQb3MgPSAkcG9zLmRlcHRoID8gJHBvcy5iZWZvcmUoKSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZmx1c2hlZCA/IG51bGwgOiBldmVudC50YXJnZXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldERlc2MgPSB0YXJnZXQgPyB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2ModGFyZ2V0LCB0cnVlKSA6IG51bGw7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0RGVzYyAmJiB0YXJnZXREZXNjLmRvbS5ub2RlVHlwZSA9PSAxID8gdGFyZ2V0RGVzYy5kb20gOiBudWxsO1xuICAgICAgICBsZXQgeyBzZWxlY3Rpb24gfSA9IHZpZXcuc3RhdGU7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlICYmIHRhcmdldE5vZGUudHlwZS5zcGVjLnNlbGVjdGFibGUgIT09IGZhbHNlIHx8XG4gICAgICAgICAgICBzZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbGVjdGlvbi5mcm9tIDw9IHRhcmdldFBvcyAmJiBzZWxlY3Rpb24udG8gPiB0YXJnZXRQb3MpXG4gICAgICAgICAgICB0aGlzLm1pZ2h0RHJhZyA9IHtcbiAgICAgICAgICAgICAgICBub2RlOiB0YXJnZXROb2RlLFxuICAgICAgICAgICAgICAgIHBvczogdGFyZ2V0UG9zLFxuICAgICAgICAgICAgICAgIGFkZEF0dHI6ICEhKHRoaXMudGFyZ2V0ICYmICF0aGlzLnRhcmdldC5kcmFnZ2FibGUpLFxuICAgICAgICAgICAgICAgIHNldFVuZWRpdGFibGU6ICEhKHRoaXMudGFyZ2V0ICYmIGdlY2tvICYmICF0aGlzLnRhcmdldC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIikpXG4gICAgICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy50YXJnZXQgJiYgdGhpcy5taWdodERyYWcgJiYgKHRoaXMubWlnaHREcmFnLmFkZEF0dHIgfHwgdGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLnNldFVuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuaW5wdXQubW91c2VEb3duID09IHRoaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIiwgXCJmYWxzZVwiKTtcbiAgICAgICAgICAgICAgICB9LCAyMCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3LnJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy51cCA9IHRoaXMudXAuYmluZCh0aGlzKSk7XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbiAgICB9XG4gICAgZG9uZSgpIHtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy51cCk7XG4gICAgICAgIHRoaXMudmlldy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlKTtcbiAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnICYmIHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLmFkZEF0dHIpXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMubWlnaHREcmFnLnNldFVuZWRpdGFibGUpXG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlQXR0cmlidXRlKFwiY29udGVudEVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsYXllZFNlbGVjdGlvblN5bmMpXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGVjdGlvblRvRE9NKHRoaXMudmlldykpO1xuICAgICAgICB0aGlzLnZpZXcuaW5wdXQubW91c2VEb3duID0gbnVsbDtcbiAgICB9XG4gICAgdXAoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kb25lKCk7XG4gICAgICAgIGlmICghdGhpcy52aWV3LmRvbS5jb250YWlucyhldmVudC50YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuZG9jICE9IHRoaXMuc3RhcnREb2MpXG4gICAgICAgICAgICBwb3MgPSB0aGlzLnZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICAgICAgdGhpcy51cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpO1xuICAgICAgICBpZiAodGhpcy5hbGxvd0RlZmF1bHQgfHwgIXBvcykge1xuICAgICAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHRoaXMudmlldywgXCJwb2ludGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhhbmRsZVNpbmdsZUNsaWNrKHRoaXMudmlldywgcG9zLnBvcywgcG9zLmluc2lkZSwgZXZlbnQsIHRoaXMuc2VsZWN0Tm9kZSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09IDAgJiZcbiAgICAgICAgICAgICh0aGlzLmZsdXNoZWQgfHxcbiAgICAgICAgICAgICAgICAvLyBTYWZhcmkgaWdub3JlcyBjbGlja3Mgb24gZHJhZ2dhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgKHNhZmFyaSAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAhdGhpcy5taWdodERyYWcubm9kZS5pc0F0b20pIHx8XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIHdpbGwgc29tZXRpbWVzIHRyZWF0IGEgbm9kZSBzZWxlY3Rpb24gYXMgYVxuICAgICAgICAgICAgICAgIC8vIGN1cnNvciwgYnV0IHN0aWxsIHJlcG9ydCB0aGF0IHRoZSBub2RlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgLy8gd2hlbiBhc2tlZCB0aHJvdWdoIGdldFNlbGVjdGlvbi4gWW91J2xsIHRoZW4gZ2V0IGFcbiAgICAgICAgICAgICAgICAvLyBzaXR1YXRpb24gd2hlcmUgY2xpY2tpbmcgYXQgdGhlIHBvaW50IHdoZXJlIHRoYXRcbiAgICAgICAgICAgICAgICAvLyAoaGlkZGVuKSBjdXJzb3IgaXMgZG9lc24ndCBjaGFuZ2UgdGhlIHNlbGVjdGlvbiwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGh1cyBkb2Vzbid0IGdldCBhIHJlYWN0aW9uIGZyb20gUHJvc2VNaXJyb3IuIFRoaXNcbiAgICAgICAgICAgICAgICAvLyB3b3JrcyBhcm91bmQgdGhhdC5cbiAgICAgICAgICAgICAgICAoY2hyb21lICYmICF0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiZcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSksIE1hdGguYWJzKHBvcy5wb3MgLSB0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvKSkgPD0gMikpKSB7XG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odGhpcy52aWV3LCBTZWxlY3Rpb24ubmVhcih0aGlzLnZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zLnBvcykpLCBcInBvaW50ZXJcIik7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0U2VsZWN0aW9uT3JpZ2luKHRoaXMudmlldywgXCJwb2ludGVyXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmUoZXZlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIGlmIChldmVudC5idXR0b25zID09IDApXG4gICAgICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICB9XG4gICAgdXBkYXRlQWxsb3dEZWZhdWx0KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0RlZmF1bHQgJiYgKE1hdGguYWJzKHRoaXMuZXZlbnQueCAtIGV2ZW50LmNsaWVudFgpID4gNCB8fFxuICAgICAgICAgICAgTWF0aC5hYnModGhpcy5ldmVudC55IC0gZXZlbnQuY2xpZW50WSkgPiA0KSlcbiAgICAgICAgICAgIHRoaXMuYWxsb3dEZWZhdWx0ID0gdHJ1ZTtcbiAgICB9XG59XG5oYW5kbGVycy50b3VjaHN0YXJ0ID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0VG91Y2ggPSBEYXRlLm5vdygpO1xuICAgIGZvcmNlRE9NRmx1c2godmlldyk7XG4gICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy50b3VjaG1vdmUgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgc2V0U2VsZWN0aW9uT3JpZ2luKHZpZXcsIFwicG9pbnRlclwiKTtcbn07XG5oYW5kbGVycy5jb250ZXh0bWVudSA9IHZpZXcgPT4gZm9yY2VET01GbHVzaCh2aWV3KTtcbmZ1bmN0aW9uIGluT3JOZWFyQ29tcG9zaXRpb24odmlldywgZXZlbnQpIHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFNlZSBodHRwczovL3d3dy5zdHVtLmRlLzIwMTYvMDYvMjQvaGFuZGxpbmctaW1lLWV2ZW50cy1pbi1qYXZhc2NyaXB0Ly5cbiAgICAvLyBPbiBKYXBhbmVzZSBpbnB1dCBtZXRob2QgZWRpdG9ycyAoSU1FcyksIHRoZSBFbnRlciBrZXkgaXMgdXNlZCB0byBjb25maXJtIGNoYXJhY3RlclxuICAgIC8vIHNlbGVjdGlvbi4gT24gU2FmYXJpLCB3aGVuIEVudGVyIGlzIHByZXNzZWQsIGNvbXBvc2l0aW9uZW5kIGFuZCBrZXlkb3duIGV2ZW50cyBhcmVcbiAgICAvLyBlbWl0dGVkLiBUaGUga2V5ZG93biBldmVudCB0cmlnZ2VycyBuZXdsaW5lIGluc2VydGlvbiwgd2hpY2ggd2UgZG9uJ3Qgd2FudC5cbiAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGtleWRvd24gZXZlbnQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgLy8gV2Ugb25seSBpZ25vcmUgaXQgb25jZSwgYXMgcHJlc3NpbmcgRW50ZXIgYSBzZWNvbmQgdGltZSAqc2hvdWxkKiBpbnNlcnQgYSBuZXdsaW5lLlxuICAgIC8vIEZ1cnRoZXJtb3JlLCB0aGUga2V5ZG93biBldmVudCB0aW1lc3RhbXAgbXVzdCBiZSBjbG9zZSB0byB0aGUgY29tcG9zaXRpb25FbmRlZEF0IHRpbWVzdGFtcC5cbiAgICAvLyBUaGlzIGd1YXJkcyBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIGNvbXBvc2l0aW9uZW5kIGlzIHRyaWdnZXJlZCB3aXRob3V0IHRoZSBrZXlib2FyZFxuICAgIC8vIChlLmcuIGNoYXJhY3RlciBjb25maXJtYXRpb24gbWF5IGJlIGRvbmUgd2l0aCB0aGUgbW91c2UpLCBhbmQga2V5ZG93biBpcyB0cmlnZ2VyZWRcbiAgICAvLyBhZnRlcndhcmRzLSB3ZSB3b3VsZG4ndCB3YW50IHRvIGlnbm9yZSB0aGUga2V5ZG93biBldmVudCBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKHNhZmFyaSAmJiBNYXRoLmFicyhldmVudC50aW1lU3RhbXAgLSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCkgPCA1MDApIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSAtMmU4O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gRHJvcCBhY3RpdmUgY29tcG9zaXRpb24gYWZ0ZXIgNSBzZWNvbmRzIG9mIGluYWN0aXZpdHkgb24gQW5kcm9pZFxuY29uc3QgdGltZW91dENvbXBvc2l0aW9uID0gYW5kcm9pZCA/IDUwMDAgOiAtMTtcbmVkaXRIYW5kbGVycy5jb21wb3NpdGlvbnN0YXJ0ID0gZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9udXBkYXRlID0gdmlldyA9PiB7XG4gICAgaWYgKCF2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoKCk7XG4gICAgICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3LCAkcG9zID0gc3RhdGUuc2VsZWN0aW9uLiR0bztcbiAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiZcbiAgICAgICAgICAgIChzdGF0ZS5zdG9yZWRNYXJrcyB8fFxuICAgICAgICAgICAgICAgICghJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3MucGFyZW50T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5zb21lKG0gPT4gbS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSkpKSkge1xuICAgICAgICAgICAgLy8gTmVlZCB0byB3cmFwIHRoZSBjdXJzb3IgaW4gbWFyayBub2RlcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lcyBpbiB0aGUgRE9NIGNvbnRleHRcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IHZpZXcuc3RhdGUuc3RvcmVkTWFya3MgfHwgJHBvcy5tYXJrcygpO1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3Lm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29tcG9zaXRpb24odmlldywgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSk7XG4gICAgICAgICAgICAvLyBJbiBmaXJlZm94LCBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIGJ1dCBvdXRzaWRlIGEgbWFya2VkIG5vZGUsXG4gICAgICAgICAgICAvLyB0aGUgaW5zZXJ0ZWQgdGV4dCB3b24ndCBpbmhlcml0IHRoZSBtYXJrcy4gU28gdGhpcyBtb3ZlcyBpdFxuICAgICAgICAgICAgLy8gaW5zaWRlIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgICAgIGlmIChnZWNrbyAmJiBzdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgISRwb3MudGV4dE9mZnNldCAmJiAkcG9zLm5vZGVCZWZvcmUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0OyBub2RlICYmIG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgIT0gMDspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG9mZnNldCA8IDAgPyBub2RlLmxhc3RDaGlsZCA6IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLmNvbGxhcHNlKGJlZm9yZSwgYmVmb3JlLm5vZGVWYWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gYmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgdGltZW91dENvbXBvc2l0aW9uKTtcbn07XG5lZGl0SGFuZGxlcnMuY29tcG9zaXRpb25lbmQgPSAodmlldywgZXZlbnQpID0+IHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSBldmVudC50aW1lU3RhbXA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IHZpZXcuZG9tT2JzZXJ2ZXIucGVuZGluZ1JlY29yZHMoKS5sZW5ndGggPyB2aWV3LmlucHV0LmNvbXBvc2l0aW9uSUQgOiAwO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZSA9IG51bGw7XG4gICAgICAgIGlmICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMpXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKSk7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCsrO1xuICAgICAgICBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgMjApO1xuICAgIH1cbn07XG5mdW5jdGlvbiBzY2hlZHVsZUNvbXBvc2VFbmQodmlldywgZGVsYXkpIHtcbiAgICBjbGVhclRpbWVvdXQodmlldy5pbnB1dC5jb21wb3NpbmdUaW1lb3V0KTtcbiAgICBpZiAoZGVsYXkgPiAtMSlcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBlbmRDb21wb3NpdGlvbih2aWV3KSwgZGVsYXkpO1xufVxuZnVuY3Rpb24gY2xlYXJDb21wb3NpdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0ID0gdGltZXN0YW1wRnJvbUN1c3RvbUV2ZW50KCk7XG4gICAgfVxuICAgIHdoaWxlICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZXMubGVuZ3RoID4gMClcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLnBvcCgpLm1hcmtQYXJlbnRzRGlydHkoKTtcbn1cbmZ1bmN0aW9uIGZpbmRDb21wb3NpdGlvbk5vZGUodmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgdGV4dEJlZm9yZSA9IHRleHROb2RlQmVmb3JlJDEoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBsZXQgdGV4dEFmdGVyID0gdGV4dE5vZGVBZnRlciQxKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCk7XG4gICAgaWYgKHRleHRCZWZvcmUgJiYgdGV4dEFmdGVyICYmIHRleHRCZWZvcmUgIT0gdGV4dEFmdGVyKSB7XG4gICAgICAgIGxldCBkZXNjQWZ0ZXIgPSB0ZXh0QWZ0ZXIucG1WaWV3RGVzYywgbGFzdENoYW5nZWQgPSB2aWV3LmRvbU9ic2VydmVyLmxhc3RDaGFuZ2VkVGV4dE5vZGU7XG4gICAgICAgIGlmICh0ZXh0QmVmb3JlID09IGxhc3RDaGFuZ2VkIHx8IHRleHRBZnRlciA9PSBsYXN0Q2hhbmdlZClcbiAgICAgICAgICAgIHJldHVybiBsYXN0Q2hhbmdlZDtcbiAgICAgICAgaWYgKCFkZXNjQWZ0ZXIgfHwgIWRlc2NBZnRlci5pc1RleHQodGV4dEFmdGVyLm5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGUgPT0gdGV4dEFmdGVyKSB7XG4gICAgICAgICAgICBsZXQgZGVzY0JlZm9yZSA9IHRleHRCZWZvcmUucG1WaWV3RGVzYztcbiAgICAgICAgICAgIGlmICghKCFkZXNjQmVmb3JlIHx8ICFkZXNjQmVmb3JlLmlzVGV4dCh0ZXh0QmVmb3JlLm5vZGVWYWx1ZSkpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0QWZ0ZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHRCZWZvcmUgfHwgdGV4dEFmdGVyO1xufVxuZnVuY3Rpb24gdGltZXN0YW1wRnJvbUN1c3RvbUV2ZW50KCkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwiZXZlbnRcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcDtcbn1cbi8qKlxuQGludGVybmFsXG4qL1xuZnVuY3Rpb24gZW5kQ29tcG9zaXRpb24odmlldywgcmVzdGFydGluZyA9IGZhbHNlKSB7XG4gICAgaWYgKGFuZHJvaWQgJiYgdmlldy5kb21PYnNlcnZlci5mbHVzaGluZ1Nvb24gPj0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZm9yY2VGbHVzaCgpO1xuICAgIGNsZWFyQ29tcG9zaXRpb24odmlldyk7XG4gICAgaWYgKHJlc3RhcnRpbmcgfHwgdmlldy5kb2NWaWV3ICYmIHZpZXcuZG9jVmlldy5kaXJ0eSkge1xuICAgICAgICBsZXQgc2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3KSwgY3VyID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcShjdXIpKVxuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpKTtcbiAgICAgICAgZWxzZSBpZiAoKHZpZXcubWFya0N1cnNvciB8fCByZXN0YXJ0aW5nKSAmJiAhY3VyLiRmcm9tLm5vZGUoY3VyLiRmcm9tLnNoYXJlZERlcHRoKGN1ci50bykpLmlubGluZUNvbnRlbnQpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlU2VsZWN0aW9uKCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2FwdHVyZUNvcHkodmlldywgZG9tKSB7XG4gICAgLy8gVGhlIGV4dHJhIHdyYXBwZXIgaXMgc29tZWhvdyBuZWNlc3Nhcnkgb24gSUUvRWRnZSB0byBwcmV2ZW50IHRoZVxuICAgIC8vIGNvbnRlbnQgZnJvbSBiZWluZyBtYW5nbGVkIHdoZW4gaXQgaXMgcHV0IG9udG8gdGhlIGNsaXBib2FyZFxuICAgIGlmICghdmlldy5kb20ucGFyZW50Tm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCB3cmFwID0gdmlldy5kb20ucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgICB3cmFwLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgd3JhcC5zdHlsZS5jc3NUZXh0ID0gXCJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IC0xMDAwMHB4OyB0b3A6IDEwcHhcIjtcbiAgICBsZXQgc2VsID0gZ2V0U2VsZWN0aW9uKCksIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZG9tKTtcbiAgICAvLyBEb25lIGJlY2F1c2UgSUUgd2lsbCBmaXJlIGEgc2VsZWN0aW9uY2hhbmdlIG1vdmluZyB0aGUgc2VsZWN0aW9uXG4gICAgLy8gdG8gaXRzIHN0YXJ0IHdoZW4gcmVtb3ZlQWxsUmFuZ2VzIGlzIGNhbGxlZCBhbmQgdGhlIGVkaXRvciBzdGlsbFxuICAgIC8vIGhhcyBmb2N1cyAod2hpY2ggd2lsbCBtZXNzIHVwIHRoZSBlZGl0b3IncyBzZWxlY3Rpb24gc3RhdGUpLlxuICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHdyYXAucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHdyYXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwKTtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIH0sIDUwKTtcbn1cbi8vIFRoaXMgaXMgdmVyeSBjcnVkZSwgYnV0IHVuZm9ydHVuYXRlbHkgYm90aCB0aGVzZSBicm93c2VycyBfcHJldGVuZF9cbi8vIHRoYXQgdGhleSBoYXZlIGEgY2xpcGJvYXJkIEFQSeKAlGFsbCB0aGUgb2JqZWN0cyBhbmQgbWV0aG9kcyBhcmVcbi8vIHRoZXJlLCB0aGV5IGp1c3QgZG9uJ3Qgd29yaywgYW5kIHRoZXkgYXJlIGhhcmQgdG8gdGVzdC5cbmNvbnN0IGJyb2tlbkNsaXBib2FyZEFQSSA9IChpZSAmJiBpZV92ZXJzaW9uIDwgMTUpIHx8XG4gICAgKGlvcyAmJiB3ZWJraXRfdmVyc2lvbiA8IDYwNCk7XG5oYW5kbGVycy5jb3B5ID0gZWRpdEhhbmRsZXJzLmN1dCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLCBjdXQgPSBldmVudC50eXBlID09IFwiY3V0XCI7XG4gICAgaWYgKHNlbC5lbXB0eSlcbiAgICAgICAgcmV0dXJuO1xuICAgIC8vIElFIGFuZCBFZGdlJ3MgY2xpcGJvYXJkIGludGVyZmFjZSBpcyBjb21wbGV0ZWx5IGJyb2tlblxuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHNsaWNlID0gc2VsLmNvbnRlbnQoKSwgeyBkb20sIHRleHQgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBzbGljZSk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZGF0YS5jbGVhckRhdGEoKTtcbiAgICAgICAgZGF0YS5zZXREYXRhKFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2FwdHVyZUNvcHkodmlldywgZG9tKTtcbiAgICB9XG4gICAgaWYgKGN1dClcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJjdXRcIikpO1xufTtcbmZ1bmN0aW9uIHNsaWNlU2luZ2xlTm9kZShzbGljZSkge1xuICAgIHJldHVybiBzbGljZS5vcGVuU3RhcnQgPT0gMCAmJiBzbGljZS5vcGVuRW5kID09IDAgJiYgc2xpY2UuY29udGVudC5jaGlsZENvdW50ID09IDEgPyBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQgOiBudWxsO1xufVxuZnVuY3Rpb24gY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KSB7XG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHBsYWluVGV4dCA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24uJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCB0YXJnZXQgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGxhaW5UZXh0ID8gXCJ0ZXh0YXJlYVwiIDogXCJkaXZcIikpO1xuICAgIGlmICghcGxhaW5UZXh0KVxuICAgICAgICB0YXJnZXQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGFyZ2V0LnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIHRhcmdldC5mb2N1cygpO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUpXG4gICAgICAgICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpO1xuICAgICAgICBpZiAocGxhaW5UZXh0KVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudmFsdWUsIG51bGwsIHBsYWluLCBldmVudCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRvUGFzdGUodmlldywgdGFyZ2V0LnRleHRDb250ZW50LCB0YXJnZXQuaW5uZXJIVE1MLCBwbGFpbiwgZXZlbnQpO1xuICAgIH0sIDUwKTtcbn1cbmZ1bmN0aW9uIGRvUGFzdGUodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIGV2ZW50KSB7XG4gICAgbGV0IHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHByZWZlclBsYWluLCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVQYXN0ZVwiLCBmID0+IGYodmlldywgZXZlbnQsIHNsaWNlIHx8IFNsaWNlLmVtcHR5KSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2luZ2xlTm9kZSA9IHNsaWNlU2luZ2xlTm9kZShzbGljZSk7XG4gICAgbGV0IHRyID0gc2luZ2xlTm9kZVxuICAgICAgICA/IHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoc2luZ2xlTm9kZSwgcHJlZmVyUGxhaW4pXG4gICAgICAgIDogdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uKHNsaWNlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkuc2V0TWV0YShcInBhc3RlXCIsIHRydWUpLnNldE1ldGEoXCJ1aUV2ZW50XCIsIFwicGFzdGVcIikpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0VGV4dChjbGlwYm9hcmREYXRhKSB7XG4gICAgbGV0IHRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpIHx8IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcIlRleHRcIik7XG4gICAgaWYgKHRleHQpXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGxldCB1cmlzID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC91cmktbGlzdFwiKTtcbiAgICByZXR1cm4gdXJpcyA/IHVyaXMucmVwbGFjZSgvXFxyP1xcbi9nLCBcIiBcIikgOiBcIlwiO1xufVxuZWRpdEhhbmRsZXJzLnBhc3RlID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBIYW5kbGluZyBwYXN0ZSBmcm9tIEphdmFTY3JpcHQgZHVyaW5nIGNvbXBvc2l0aW9uIGlzIHZlcnkgcG9vcmx5XG4gICAgLy8gaGFuZGxlZCBieSBicm93c2Vycywgc28gYXMgYSBkb2RneSBidXQgcHJlZmVyYWJsZSBrbHVkZ2UsIHdlIGp1c3RcbiAgICAvLyBsZXQgdGhlIGJyb3dzZXIgZG8gaXRzIG5hdGl2ZSB0aGluZyB0aGVyZSwgZXhjZXB0IG9uIEFuZHJvaWQsXG4gICAgLy8gd2hlcmUgdGhlIGVkaXRvciBpcyBhbG1vc3QgYWx3YXlzIGNvbXBvc2luZy5cbiAgICBpZiAodmlldy5jb21wb3NpbmcgJiYgIWFuZHJvaWQpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgZGF0YSA9IGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5jbGlwYm9hcmREYXRhO1xuICAgIGxldCBwbGFpbiA9IHZpZXcuaW5wdXQuc2hpZnRLZXkgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSAhPSA0NTtcbiAgICBpZiAoZGF0YSAmJiBkb1Bhc3RlKHZpZXcsIGdldFRleHQoZGF0YSksIGRhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgcGxhaW4sIGV2ZW50KSlcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBlbHNlXG4gICAgICAgIGNhcHR1cmVQYXN0ZSh2aWV3LCBldmVudCk7XG59O1xuY2xhc3MgRHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKHNsaWNlLCBtb3ZlLCBub2RlKSB7XG4gICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTtcbiAgICAgICAgdGhpcy5tb3ZlID0gbW92ZTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5jb25zdCBkcmFnQ29weU1vZGlmaWVyID0gbWFjID8gXCJhbHRLZXlcIiA6IFwiY3RybEtleVwiO1xuZnVuY3Rpb24gZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IG1vdmVzID0gdmlldy5zb21lUHJvcChcImRyYWdDb3BpZXNcIiwgdGVzdCA9PiAhdGVzdChldmVudCkpO1xuICAgIHJldHVybiBtb3ZlcyAhPSBudWxsID8gbW92ZXMgOiAhZXZlbnRbZHJhZ0NvcHlNb2RpZmllcl07XG59XG5oYW5kbGVycy5kcmFnc3RhcnQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIGxldCBtb3VzZURvd24gPSB2aWV3LmlucHV0Lm1vdXNlRG93bjtcbiAgICBpZiAobW91c2VEb3duKVxuICAgICAgICBtb3VzZURvd24uZG9uZSgpO1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwb3MgPSBzZWwuZW1wdHkgPyBudWxsIDogdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGxldCBub2RlO1xuICAgIGlmIChwb3MgJiYgcG9zLnBvcyA+PSBzZWwuZnJvbSAmJiBwb3MucG9zIDw9IChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uID8gc2VsLnRvIC0gMSA6IHNlbC50bykpIDtcbiAgICBlbHNlIGlmIChtb3VzZURvd24gJiYgbW91c2VEb3duLm1pZ2h0RHJhZykge1xuICAgICAgICBub2RlID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIG1vdXNlRG93bi5taWdodERyYWcucG9zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGV2ZW50LnRhcmdldCwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlICYmIGRlc2MgIT0gdmlldy5kb2NWaWV3KVxuICAgICAgICAgICAgbm9kZSA9IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBkZXNjLnBvc0JlZm9yZSk7XG4gICAgfVxuICAgIGxldCBkcmFnZ2VkU2xpY2UgPSAobm9kZSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbikuY29udGVudCgpO1xuICAgIGxldCB7IGRvbSwgdGV4dCwgc2xpY2UgfSA9IHNlcmlhbGl6ZUZvckNsaXBib2FyZCh2aWV3LCBkcmFnZ2VkU2xpY2UpO1xuICAgIC8vIFByZS0xMjAgQ2hyb21lIHZlcnNpb25zIGNsZWFyIGZpbGVzIHdoZW4gY2FsbGluZyBgY2xlYXJEYXRhYCAoIzE0NzIpXG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoIHx8ICFjaHJvbWUgfHwgY2hyb21lX3ZlcnNpb24gPiAxMjApXG4gICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5jbGVhckRhdGEoKTtcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShicm9rZW5DbGlwYm9hcmRBUEkgPyBcIlRleHRcIiA6IFwidGV4dC9odG1sXCIsIGRvbS5pbm5lckhUTUwpO1xuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzExNTZcbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwiY29weU1vdmVcIjtcbiAgICBpZiAoIWJyb2tlbkNsaXBib2FyZEFQSSlcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L3BsYWluXCIsIHRleHQpO1xuICAgIHZpZXcuZHJhZ2dpbmcgPSBuZXcgRHJhZ2dpbmcoc2xpY2UsIGRyYWdNb3Zlcyh2aWV3LCBldmVudCksIG5vZGUpO1xufTtcbmhhbmRsZXJzLmRyYWdlbmQgPSB2aWV3ID0+IHtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuZHJhZ2dpbmcgPT0gZHJhZ2dpbmcpXG4gICAgICAgICAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICB9LCA1MCk7XG59O1xuZWRpdEhhbmRsZXJzLmRyYWdvdmVyID0gZWRpdEhhbmRsZXJzLmRyYWdlbnRlciA9IChfLCBlKSA9PiBlLnByZXZlbnREZWZhdWx0KCk7XG5lZGl0SGFuZGxlcnMuZHJvcCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IGRyYWdnaW5nID0gdmlldy5kcmFnZ2luZztcbiAgICB2aWV3LmRyYWdnaW5nID0gbnVsbDtcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcilcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBldmVudFBvcyA9IHZpZXcucG9zQXRDb29yZHMoZXZlbnRDb29yZHMoZXZlbnQpKTtcbiAgICBpZiAoIWV2ZW50UG9zKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0ICRtb3VzZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZXZlbnRQb3MucG9zKTtcbiAgICBsZXQgc2xpY2UgPSBkcmFnZ2luZyAmJiBkcmFnZ2luZy5zbGljZTtcbiAgICBpZiAoc2xpY2UpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFwiLCBmID0+IHsgc2xpY2UgPSBmKHNsaWNlLCB2aWV3KTsgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzbGljZSA9IHBhcnNlRnJvbUNsaXBib2FyZCh2aWV3LCBnZXRUZXh0KGV2ZW50LmRhdGFUcmFuc2ZlciksIGJyb2tlbkNsaXBib2FyZEFQSSA/IG51bGwgOiBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHQvaHRtbFwiKSwgZmFsc2UsICRtb3VzZSk7XG4gICAgfVxuICAgIGxldCBtb3ZlID0gISEoZHJhZ2dpbmcgJiYgZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSk7XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVEcm9wXCIsIGYgPT4gZih2aWV3LCBldmVudCwgc2xpY2UgfHwgU2xpY2UuZW1wdHksIG1vdmUpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghc2xpY2UpXG4gICAgICAgIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBpbnNlcnRQb3MgPSBzbGljZSA/IGRyb3BQb2ludCh2aWV3LnN0YXRlLmRvYywgJG1vdXNlLnBvcywgc2xpY2UpIDogJG1vdXNlLnBvcztcbiAgICBpZiAoaW5zZXJ0UG9zID09IG51bGwpXG4gICAgICAgIGluc2VydFBvcyA9ICRtb3VzZS5wb3M7XG4gICAgbGV0IHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICBpZiAobW92ZSkge1xuICAgICAgICBsZXQgeyBub2RlIH0gPSBkcmFnZ2luZztcbiAgICAgICAgaWYgKG5vZGUpXG4gICAgICAgICAgICBub2RlLnJlcGxhY2UodHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgbGV0IHBvcyA9IHRyLm1hcHBpbmcubWFwKGluc2VydFBvcyk7XG4gICAgbGV0IGlzTm9kZSA9IHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLm9wZW5FbmQgPT0gMCAmJiBzbGljZS5jb250ZW50LmNoaWxkQ291bnQgPT0gMTtcbiAgICBsZXQgYmVmb3JlSW5zZXJ0ID0gdHIuZG9jO1xuICAgIGlmIChpc05vZGUpXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgocG9zLCBwb3MsIHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgZWxzZVxuICAgICAgICB0ci5yZXBsYWNlUmFuZ2UocG9zLCBwb3MsIHNsaWNlKTtcbiAgICBpZiAodHIuZG9jLmVxKGJlZm9yZUluc2VydCkpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgJHBvcyA9IHRyLmRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKGlzTm9kZSAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpICYmXG4gICAgICAgICRwb3Mubm9kZUFmdGVyICYmICRwb3Mubm9kZUFmdGVyLnNhbWVNYXJrdXAoc2xpY2UuY29udGVudC5maXJzdENoaWxkKSkge1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24obmV3IE5vZGVTZWxlY3Rpb24oJHBvcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGVuZCA9IHRyLm1hcHBpbmcubWFwKGluc2VydFBvcyk7XG4gICAgICAgIHRyLm1hcHBpbmcubWFwc1t0ci5tYXBwaW5nLm1hcHMubGVuZ3RoIC0gMV0uZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiBlbmQgPSBuZXdUbyk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRwb3MsIHRyLmRvYy5yZXNvbHZlKGVuZCkpKTtcbiAgICB9XG4gICAgdmlldy5mb2N1cygpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJkcm9wXCIpKTtcbn07XG5oYW5kbGVycy5mb2N1cyA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoIXZpZXcuZm9jdXNlZCkge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LmFkZChcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgdmlldy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5kb2NWaWV3ICYmIHZpZXcuaGFzRm9jdXMoKSAmJiAhdmlldy5kb21PYnNlcnZlci5jdXJyZW50U2VsZWN0aW9uLmVxKHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSkpXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgICAgIH0sIDIwKTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmx1ciA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgaWYgKHZpZXcuZm9jdXNlZCkge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWZvY3VzZWRcIik7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgdmlldy5kb20uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpXG4gICAgICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgdmlldy5mb2N1c2VkID0gZmFsc2U7XG4gICAgfVxufTtcbmhhbmRsZXJzLmJlZm9yZWlucHV0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICAvLyBXZSBzaG91bGQgcHJvYmFibHkgZG8gbW9yZSB3aXRoIGJlZm9yZWlucHV0IGV2ZW50cywgYnV0IHN1cHBvcnRcbiAgICAvLyBpcyBzbyBzcG90dHkgdGhhdCBJJ20gc3RpbGwgd2FpdGluZyB0byBzZWUgd2hlcmUgdGhleSBhcmUgZ29pbmcuXG4gICAgLy8gVmVyeSBzcGVjaWZpYyBoYWNrIHRvIGRlYWwgd2l0aCBiYWNrc3BhY2Ugc29tZXRpbWVzIGZhaWxpbmcgb25cbiAgICAvLyBDaHJvbWUgQW5kcm9pZCB3aGVuIGFmdGVyIGFuIHVuZWRpdGFibGUgbm9kZS5cbiAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiYgZXZlbnQuaW5wdXRUeXBlID09IFwiZGVsZXRlQ29udGVudEJhY2t3YXJkXCIpIHtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5mbHVzaFNvb24oKTtcbiAgICAgICAgbGV0IHsgZG9tQ2hhbmdlQ291bnQgfSA9IHZpZXcuaW5wdXQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpZXcuaW5wdXQuZG9tQ2hhbmdlQ291bnQgIT0gZG9tQ2hhbmdlQ291bnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBFdmVudCBhbHJlYWR5IGhhZCBzb21lIGVmZmVjdFxuICAgICAgICAgICAgLy8gVGhpcyBidWcgdGVuZHMgdG8gY2xvc2UgdGhlIHZpcnR1YWwga2V5Ym9hcmQsIHNvIHdlIHJlZm9jdXNcbiAgICAgICAgICAgIHZpZXcuZG9tLmJsdXIoKTtcbiAgICAgICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoOCwgXCJCYWNrc3BhY2VcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgeyAkY3Vyc29yIH0gPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgICAgIC8vIENydWRlIGFwcHJveGltYXRpb24gb2YgYmFja3NwYWNlIGJlaGF2aW9yIHdoZW4gbm8gY29tbWFuZCBoYW5kbGVkIGl0XG4gICAgICAgICAgICBpZiAoJGN1cnNvciAmJiAkY3Vyc29yLnBvcyA+IDApXG4gICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLmRlbGV0ZSgkY3Vyc29yLnBvcyAtIDEsICRjdXJzb3IucG9zKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfSwgNTApO1xuICAgIH1cbn07XG4vLyBNYWtlIHN1cmUgYWxsIGhhbmRsZXJzIGdldCByZWdpc3RlcmVkXG5mb3IgKGxldCBwcm9wIGluIGVkaXRIYW5kbGVycylcbiAgICBoYW5kbGVyc1twcm9wXSA9IGVkaXRIYW5kbGVyc1twcm9wXTtcblxuZnVuY3Rpb24gY29tcGFyZU9ianMoYSwgYikge1xuICAgIGlmIChhID09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGZvciAobGV0IHAgaW4gYSlcbiAgICAgICAgaWYgKGFbcF0gIT09IGJbcF0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgcCBpbiBiKVxuICAgICAgICBpZiAoIShwIGluIGEpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuY2xhc3MgV2lkZ2V0VHlwZSB7XG4gICAgY29uc3RydWN0b3IodG9ET00sIHNwZWMpIHtcbiAgICAgICAgdGhpcy50b0RPTSA9IHRvRE9NO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjIHx8IG5vU3BlYztcbiAgICAgICAgdGhpcy5zaWRlID0gdGhpcy5zcGVjLnNpZGUgfHwgMDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcsIHNwYW4sIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGxldCB7IHBvcywgZGVsZXRlZCB9ID0gbWFwcGluZy5tYXBSZXN1bHQoc3Bhbi5mcm9tICsgb2xkT2Zmc2V0LCB0aGlzLnNpZGUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBudWxsIDogbmV3IERlY29yYXRpb24ocG9zIC0gb2Zmc2V0LCBwb3MgLSBvZmZzZXQsIHRoaXMpO1xuICAgIH1cbiAgICB2YWxpZCgpIHsgcmV0dXJuIHRydWU7IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgV2lkZ2V0VHlwZSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLnNwZWMua2V5ICYmIHRoaXMuc3BlYy5rZXkgPT0gb3RoZXIuc3BlYy5rZXkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0RPTSA9PSBvdGhlci50b0RPTSAmJiBjb21wYXJlT2Jqcyh0aGlzLnNwZWMsIG90aGVyLnNwZWMpKSk7XG4gICAgfVxuICAgIGRlc3Ryb3kobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveShub2RlKTtcbiAgICB9XG59XG5jbGFzcyBJbmxpbmVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc3BlYy5pbmNsdXNpdmVTdGFydCA/IC0xIDogMSkgLSBvZmZzZXQ7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwKHNwYW4udG8gKyBvbGRPZmZzZXQsIHRoaXMuc3BlYy5pbmNsdXNpdmVFbmQgPyAxIDogLTEpIC0gb2Zmc2V0O1xuICAgICAgICByZXR1cm4gZnJvbSA+PSB0byA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKF8sIHNwYW4pIHsgcmV0dXJuIHNwYW4uZnJvbSA8IHNwYW4udG87IH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgSW5saW5lVHlwZSAmJiBjb21wYXJlT2Jqcyh0aGlzLmF0dHJzLCBvdGhlci5hdHRycykgJiZcbiAgICAgICAgICAgICAgICBjb21wYXJlT2Jqcyh0aGlzLnNwZWMsIG90aGVyLnNwZWMpKTtcbiAgICB9XG4gICAgc3RhdGljIGlzKHNwYW4pIHsgcmV0dXJuIHNwYW4udHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGU7IH1cbiAgICBkZXN0cm95KCkgeyB9XG59XG5jbGFzcyBOb2RlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoYXR0cnMsIHNwZWMpIHtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjIHx8IG5vU3BlYztcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcsIHNwYW4sIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQoc3Bhbi5mcm9tICsgb2xkT2Zmc2V0LCAxKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLnRvICsgb2xkT2Zmc2V0LCAtMSk7XG4gICAgICAgIGlmICh0by5kZWxldGVkIHx8IHRvLnBvcyA8PSBmcm9tLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbS5wb3MgLSBvZmZzZXQsIHRvLnBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKG5vZGUsIHNwYW4pIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gbm9kZS5jb250ZW50LmZpbmRJbmRleChzcGFuLmZyb20pLCBjaGlsZDtcbiAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBzcGFuLmZyb20gJiYgIShjaGlsZCA9IG5vZGUuY2hpbGQoaW5kZXgpKS5pc1RleHQgJiYgb2Zmc2V0ICsgY2hpbGQubm9kZVNpemUgPT0gc3Bhbi50bztcbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHxcbiAgICAgICAgICAgIChvdGhlciBpbnN0YW5jZW9mIE5vZGVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBkZXN0cm95KCkgeyB9XG59XG4vKipcbkRlY29yYXRpb24gb2JqZWN0cyBjYW4gYmUgcHJvdmlkZWQgdG8gdGhlIHZpZXcgdGhyb3VnaCB0aGVcbltgZGVjb3JhdGlvbnNgIHByb3BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmRlY29yYXRpb25zKS4gVGhleSBjb21lIGluXG5zZXZlcmFsIHZhcmlhbnRz4oCUc2VlIHRoZSBzdGF0aWMgbWVtYmVycyBvZiB0aGlzIGNsYXNzIGZvciBkZXRhaWxzLlxuKi9cbmNsYXNzIERlY29yYXRpb24ge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvcmF0aW9uLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbi4gV2lsbCBiZSB0aGUgc2FtZSBhcyBgZnJvbWAgZm9yIFt3aWRnZXRcbiAgICBkZWNvcmF0aW9uc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGVjb3JhdGlvbl53aWRnZXQpLlxuICAgICovXG4gICAgdG8sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdHlwZSkge1xuICAgICAgICB0aGlzLmZyb20gPSBmcm9tO1xuICAgICAgICB0aGlzLnRvID0gdG87XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29weShmcm9tLCB0bykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIHRoaXMudHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZXEob3RoZXIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5lcShvdGhlci50eXBlKSAmJiB0aGlzLmZyb20gKyBvZmZzZXQgPT0gb3RoZXIuZnJvbSAmJiB0aGlzLnRvICsgb2Zmc2V0ID09IG90aGVyLnRvO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLm1hcChtYXBwaW5nLCB0aGlzLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZXMgYSB3aWRnZXQgZGVjb3JhdGlvbiwgd2hpY2ggaXMgYSBET00gbm9kZSB0aGF0J3Mgc2hvd24gaW5cbiAgICB0aGUgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdVxuICAgIGRlbGF5IHJlbmRlcmluZyB0aGUgd2lkZ2V0IGJ5IHBhc3NpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmVcbiAgICBjYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGFjdHVhbGx5IGRyYXduIGluIGEgdmlldywgYnV0IHlvdSBjYW5cbiAgICBhbHNvIGRpcmVjdGx5IHBhc3MgYSBET00gbm9kZS4gYGdldFBvc2AgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGVcbiAgICB3aWRnZXQncyBjdXJyZW50IGRvY3VtZW50IHBvc2l0aW9uLlxuICAgICovXG4gICAgc3RhdGljIHdpZGdldChwb3MsIHRvRE9NLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihwb3MsIHBvcywgbmV3IFdpZGdldFR5cGUodG9ET00sIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhbiBpbmxpbmUgZGVjb3JhdGlvbiwgd2hpY2ggYWRkcyB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0b1xuICAgIGVhY2ggaW5saW5lIG5vZGUgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuXG4gICAgKi9cbiAgICBzdGF0aWMgaW5saW5lKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBJbmxpbmVUeXBlKGF0dHJzLCBzcGVjKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZXMgYSBub2RlIGRlY29yYXRpb24uIGBmcm9tYCBhbmQgYHRvYCBzaG91bGQgcG9pbnQgcHJlY2lzZWx5XG4gICAgYmVmb3JlIGFuZCBhZnRlciBhIG5vZGUgaW4gdGhlIGRvY3VtZW50LiBUaGF0IG5vZGUsIGFuZCBvbmx5IHRoYXRcbiAgICBub2RlLCB3aWxsIHJlY2VpdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgbm9kZShmcm9tLCB0bywgYXR0cnMsIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCBuZXcgTm9kZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHNwZWMgcHJvdmlkZWQgd2hlbiBjcmVhdGluZyB0aGlzIGRlY29yYXRpb24uIENhbiBiZSB1c2VmdWxcbiAgICBpZiB5b3UndmUgc3RvcmVkIGV4dHJhIGluZm9ybWF0aW9uIGluIHRoYXQgb2JqZWN0LlxuICAgICovXG4gICAgZ2V0IHNwZWMoKSB7IHJldHVybiB0aGlzLnR5cGUuc3BlYzsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlubGluZSgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGU7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGdldCB3aWRnZXQoKSB7IHJldHVybiB0aGlzLnR5cGUgaW5zdGFuY2VvZiBXaWRnZXRUeXBlOyB9XG59XG5jb25zdCBub25lID0gW10sIG5vU3BlYyA9IHt9O1xuLyoqXG5BIGNvbGxlY3Rpb24gb2YgW2RlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uKSwgb3JnYW5pemVkIGluIHN1Y2hcbmEgd2F5IHRoYXQgdGhlIGRyYXdpbmcgYWxnb3JpdGhtIGNhbiBlZmZpY2llbnRseSB1c2UgYW5kIGNvbXBhcmVcbnRoZW0uIFRoaXMgaXMgYSBwZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJl4oCUaXQgaXMgbm90IG1vZGlmaWVkLFxudXBkYXRlcyBjcmVhdGUgYSBuZXcgdmFsdWUuXG4qL1xuY2xhc3MgRGVjb3JhdGlvblNldCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihsb2NhbCwgY2hpbGRyZW4pIHtcbiAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsLmxlbmd0aCA/IGxvY2FsIDogbm9uZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuIDogbm9uZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgc2V0IG9mIGRlY29yYXRpb25zLCB1c2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBnaXZlblxuICAgIGRvY3VtZW50LiBUaGlzIHdpbGwgY29uc3VtZSAobW9kaWZ5KSB0aGUgYGRlY29yYXRpb25zYCBhcnJheSwgc29cbiAgICB5b3UgbXVzdCBtYWtlIGEgY29weSBpZiB5b3Ugd2FudCBuZWVkIHRvIHByZXNlcnZlIHRoYXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRpb25zLmxlbmd0aCA/IGJ1aWxkVHJlZShkZWNvcmF0aW9ucywgZG9jLCAwLCBub1NwZWMpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgYWxsIGRlY29yYXRpb25zIGluIHRoaXMgc2V0IHdoaWNoIHRvdWNoIHRoZSBnaXZlbiByYW5nZVxuICAgIChpbmNsdWRpbmcgZGVjb3JhdGlvbnMgdGhhdCBzdGFydCBvciBlbmQgZGlyZWN0bHkgYXQgdGhlXG4gICAgYm91bmRhcmllcykgYW5kIG1hdGNoIHRoZSBnaXZlbiBwcmVkaWNhdGUgb24gdGhlaXIgc3BlYy4gV2hlblxuICAgIGBzdGFydGAgYW5kIGBlbmRgIGFyZSBvbWl0dGVkLCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhlIHNldCBhcmVcbiAgICBjb25zaWRlcmVkLiBXaGVuIGBwcmVkaWNhdGVgIGlzbid0IGdpdmVuLCBhbGwgZGVjb3JhdGlvbnMgYXJlXG4gICAgYXNzdW1lZCB0byBtYXRjaC5cbiAgICAqL1xuICAgIGZpbmQoc3RhcnQsIGVuZCwgcHJlZGljYXRlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5maW5kSW5uZXIoc3RhcnQgPT0gbnVsbCA/IDAgOiBzdGFydCwgZW5kID09IG51bGwgPyAxZTkgOiBlbmQsIHJlc3VsdCwgMCwgcHJlZGljYXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZmluZElubmVyKHN0YXJ0LCBlbmQsIHJlc3VsdCwgb2Zmc2V0LCBwcmVkaWNhdGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BhbiA9IHRoaXMubG9jYWxbaV07XG4gICAgICAgICAgICBpZiAoc3Bhbi5mcm9tIDw9IGVuZCAmJiBzcGFuLnRvID49IHN0YXJ0ICYmICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZShzcGFuLnNwZWMpKSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFuLmNvcHkoc3Bhbi5mcm9tICsgb2Zmc2V0LCBzcGFuLnRvICsgb2Zmc2V0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA8IGVuZCAmJiB0aGlzLmNoaWxkcmVuW2kgKyAxXSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkT2ZmID0gdGhpcy5jaGlsZHJlbltpXSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpICsgMl0uZmluZElubmVyKHN0YXJ0IC0gY2hpbGRPZmYsIGVuZCAtIGNoaWxkT2ZmLCByZXN1bHQsIG9mZnNldCArIGNoaWxkT2ZmLCBwcmVkaWNhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIE1hcCB0aGUgc2V0IG9mIGRlY29yYXRpb25zIGluIHJlc3BvbnNlIHRvIGEgY2hhbmdlIGluIHRoZVxuICAgIGRvY3VtZW50LlxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIGRvYywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSB8fCBtYXBwaW5nLm1hcHMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwSW5uZXIobWFwcGluZywgZG9jLCAwLCAwLCBvcHRpb25zIHx8IG5vU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwSW5uZXIobWFwcGluZywgbm9kZSwgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG5ld0xvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQgPSB0aGlzLmxvY2FsW2ldLm1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgICAgICAgICBpZiAobWFwcGVkICYmIG1hcHBlZC50eXBlLnZhbGlkKG5vZGUsIG1hcHBlZCkpXG4gICAgICAgICAgICAgICAgKG5ld0xvY2FsIHx8IChuZXdMb2NhbCA9IFtdKSkucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKHRoaXMubG9jYWxbaV0uc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIG1hcENoaWxkcmVuKHRoaXMuY2hpbGRyZW4sIG5ld0xvY2FsIHx8IFtdLCBtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBuZXdMb2NhbCA/IG5ldyBEZWNvcmF0aW9uU2V0KG5ld0xvY2FsLnNvcnQoYnlQb3MpLCBub25lKSA6IGVtcHR5O1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb25zIHRvIHRoZSBvbmVzIGluIHRoZSBzZXQsXG4gICAgcHJvZHVjaW5nIGEgbmV3IHNldC4gQ29uc3VtZXMgdGhlIGBkZWNvcmF0aW9uc2AgYXJyYXkuIE5lZWRzXG4gICAgYWNjZXNzIHRvIHRoZSBjdXJyZW50IGRvY3VtZW50IHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHJlZVxuICAgIHN0cnVjdHVyZS5cbiAgICAqL1xuICAgIGFkZChkb2MsIGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmICghZGVjb3JhdGlvbnMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIERlY29yYXRpb25TZXQuY3JlYXRlKGRvYywgZGVjb3JhdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgYWRkSW5uZXIoZG9jLCBkZWNvcmF0aW9ucywgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiwgY2hpbGRJbmRleCA9IDA7XG4gICAgICAgIGRvYy5mb3JFYWNoKChjaGlsZE5vZGUsIGNoaWxkT2Zmc2V0KSA9PiB7XG4gICAgICAgICAgICBsZXQgYmFzZU9mZnNldCA9IGNoaWxkT2Zmc2V0ICsgb2Zmc2V0LCBmb3VuZDtcbiAgICAgICAgICAgIGlmICghKGZvdW5kID0gdGFrZVNwYW5zRm9yTm9kZShkZWNvcmF0aW9ucywgY2hpbGROb2RlLCBiYXNlT2Zmc2V0KSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIHdoaWxlIChjaGlsZEluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2NoaWxkSW5kZXhdIDwgY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkSW5kZXhdID09IGNoaWxkT2Zmc2V0KVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2NoaWxkSW5kZXggKyAyXSA9IGNoaWxkcmVuW2NoaWxkSW5kZXggKyAyXS5hZGRJbm5lcihjaGlsZE5vZGUsIGZvdW5kLCBiYXNlT2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDAsIGNoaWxkT2Zmc2V0LCBjaGlsZE9mZnNldCArIGNoaWxkTm9kZS5ub2RlU2l6ZSwgYnVpbGRUcmVlKGZvdW5kLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQgKyAxLCBub1NwZWMpKTtcbiAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMztcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsb2NhbCA9IG1vdmVTcGFucyhjaGlsZEluZGV4ID8gd2l0aG91dE51bGxzKGRlY29yYXRpb25zKSA6IGRlY29yYXRpb25zLCAtb2Zmc2V0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghbG9jYWxbaV0udHlwZS52YWxpZChkb2MsIGxvY2FsW2ldKSlcbiAgICAgICAgICAgICAgICBsb2NhbC5zcGxpY2UoaS0tLCAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLmxlbmd0aCA/IHRoaXMubG9jYWwuY29uY2F0KGxvY2FsKS5zb3J0KGJ5UG9zKSA6IHRoaXMubG9jYWwsIGNoaWxkcmVuIHx8IHRoaXMuY2hpbGRyZW4pO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgc2V0IHRoYXQgY29udGFpbnMgdGhlIGRlY29yYXRpb25zIGluIHRoaXMgc2V0LCBtaW51c1xuICAgIHRoZSBvbmVzIGluIHRoZSBnaXZlbiBhcnJheS5cbiAgICAqL1xuICAgIHJlbW92ZShkZWNvcmF0aW9ucykge1xuICAgICAgICBpZiAoZGVjb3JhdGlvbnMubGVuZ3RoID09IDAgfHwgdGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJbm5lcihkZWNvcmF0aW9ucywgMCk7XG4gICAgfVxuICAgIHJlbW92ZUlubmVyKGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbiwgbG9jYWwgPSB0aGlzLmxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgZm91bmQ7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGNoaWxkcmVuW2ldICsgb2Zmc2V0LCB0byA9IGNoaWxkcmVuW2kgKyAxXSArIG9mZnNldDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBzcGFuOyBqIDwgZGVjb3JhdGlvbnMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgaWYgKHNwYW4gPSBkZWNvcmF0aW9uc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbi5mcm9tID4gZnJvbSAmJiBzcGFuLnRvIDwgdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRpb25zW2pdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIChmb3VuZCB8fCAoZm91bmQgPSBbXSkpLnB1c2goc3Bhbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLnNsaWNlKCk7XG4gICAgICAgICAgICBsZXQgcmVtb3ZlZCA9IGNoaWxkcmVuW2kgKyAyXS5yZW1vdmVJbm5lcihmb3VuZCwgZnJvbSArIDEpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWQgIT0gZW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMl0gPSByZW1vdmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDMpO1xuICAgICAgICAgICAgICAgIGkgLT0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWwubGVuZ3RoKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIHNwYW47IGkgPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWwubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxbal0uZXEoc3Bhbiwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbCA9PSB0aGlzLmxvY2FsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCA9IHRoaXMubG9jYWwuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5zcGxpY2Uoai0tLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbiA9PSB0aGlzLmNoaWxkcmVuICYmIGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIGxvY2FsLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPyBuZXcgRGVjb3JhdGlvblNldChsb2NhbCwgY2hpbGRyZW4pIDogZW1wdHk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgbm9kZSkge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAobm9kZS5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5lbXB0eTtcbiAgICAgICAgbGV0IGNoaWxkLCBsb2NhbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gPj0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0gPT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baSArIDJdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBvZmZzZXQgKyAxLCBlbmQgPSBzdGFydCArIG5vZGUuY29udGVudC5zaXplO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBkZWMgPSB0aGlzLmxvY2FsW2ldO1xuICAgICAgICAgICAgaWYgKGRlYy5mcm9tIDwgZW5kICYmIGRlYy50byA+IHN0YXJ0ICYmIChkZWMudHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyb20gPSBNYXRoLm1heChzdGFydCwgZGVjLmZyb20pIC0gc3RhcnQsIHRvID0gTWF0aC5taW4oZW5kLCBkZWMudG8pIC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZyb20gPCB0bylcbiAgICAgICAgICAgICAgICAgICAgKGxvY2FsIHx8IChsb2NhbCA9IFtdKSkucHVzaChkZWMuY29weShmcm9tLCB0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbCkge1xuICAgICAgICAgICAgbGV0IGxvY2FsU2V0ID0gbmV3IERlY29yYXRpb25TZXQobG9jYWwuc29ydChieVBvcyksIG5vbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkID8gbmV3IERlY29yYXRpb25Hcm91cChbbG9jYWxTZXQsIGNoaWxkXSkgOiBsb2NhbFNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGQgfHwgZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0KSB8fFxuICAgICAgICAgICAgdGhpcy5sb2NhbC5sZW5ndGggIT0gb3RoZXIubG9jYWwubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLmxlbmd0aCAhPSBvdGhlci5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2NhbFtpXS5lcShvdGhlci5sb2NhbFtpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSAhPSBvdGhlci5jaGlsZHJlbltpXSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5baSArIDFdICE9IG90aGVyLmNoaWxkcmVuW2kgKyAxXSB8fFxuICAgICAgICAgICAgICAgICF0aGlzLmNoaWxkcmVuW2kgKyAyXS5lcShvdGhlci5jaGlsZHJlbltpICsgMl0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9jYWxzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZU92ZXJsYXAodGhpcy5sb2NhbHNJbm5lcihub2RlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbG9jYWxzSW5uZXIobm9kZSkge1xuICAgICAgICBpZiAodGhpcyA9PSBlbXB0eSlcbiAgICAgICAgICAgIHJldHVybiBub25lO1xuICAgICAgICBpZiAobm9kZS5pbmxpbmVDb250ZW50IHx8ICF0aGlzLmxvY2FsLnNvbWUoSW5saW5lVHlwZS5pcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMubG9jYWxbaV0udHlwZSBpbnN0YW5jZW9mIElubGluZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubG9jYWxbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZvckVhY2hTZXQoZikgeyBmKHRoaXMpOyB9XG59XG4vKipcblRoZSBlbXB0eSBzZXQgb2YgZGVjb3JhdGlvbnMuXG4qL1xuRGVjb3JhdGlvblNldC5lbXB0eSA9IG5ldyBEZWNvcmF0aW9uU2V0KFtdLCBbXSk7XG4vKipcbkBpbnRlcm5hbFxuKi9cbkRlY29yYXRpb25TZXQucmVtb3ZlT3ZlcmxhcCA9IHJlbW92ZU92ZXJsYXA7XG5jb25zdCBlbXB0eSA9IERlY29yYXRpb25TZXQuZW1wdHk7XG4vLyBBbiBhYnN0cmFjdGlvbiB0aGF0IGFsbG93cyB0aGUgY29kZSBkZWFsaW5nIHdpdGggZGVjb3JhdGlvbnMgdG9cbi8vIHRyZWF0IG11bHRpcGxlIERlY29yYXRpb25TZXQgb2JqZWN0cyBhcyBpZiBpdCB3ZXJlIGEgc2luZ2xlIG9iamVjdFxuLy8gd2l0aCAoYSBzdWJzZXQgb2YpIHRoZSBzYW1lIGludGVyZmFjZS5cbmNsYXNzIERlY29yYXRpb25Hcm91cCB7XG4gICAgY29uc3RydWN0b3IobWVtYmVycykge1xuICAgICAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgZG9jKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZERlY29zID0gdGhpcy5tZW1iZXJzLm1hcChtZW1iZXIgPT4gbWVtYmVyLm1hcChtYXBwaW5nLCBkb2MsIG5vU3BlYykpO1xuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20obWFwcGVkRGVjb3MpO1xuICAgIH1cbiAgICBmb3JDaGlsZChvZmZzZXQsIGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZC5pc0xlYWYpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5lbXB0eTtcbiAgICAgICAgbGV0IGZvdW5kID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5tZW1iZXJzW2ldLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBlbXB0eSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBEZWNvcmF0aW9uR3JvdXApXG4gICAgICAgICAgICAgICAgZm91bmQgPSBmb3VuZC5jb25jYXQocmVzdWx0Lm1lbWJlcnMpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZvdW5kLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20oZm91bmQpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cCkgfHxcbiAgICAgICAgICAgIG90aGVyLm1lbWJlcnMubGVuZ3RoICE9IHRoaXMubWVtYmVycy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1lbWJlcnNbaV0uZXEob3RoZXIubWVtYmVyc1tpXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbG9jYWxzKG5vZGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCwgc29ydGVkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsb2NhbHMgPSB0aGlzLm1lbWJlcnNbaV0ubG9jYWxzSW5uZXIobm9kZSk7XG4gICAgICAgICAgICBpZiAoIWxvY2Fscy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxvY2FscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxvY2Fscy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobG9jYWxzW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0ID8gcmVtb3ZlT3ZlcmxhcChzb3J0ZWQgPyByZXN1bHQgOiByZXN1bHQuc29ydChieVBvcykpIDogbm9uZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgZ3JvdXAgZm9yIHRoZSBnaXZlbiBhcnJheSBvZiBkZWNvcmF0aW9uIHNldHMsIG9yIHJldHVyblxuICAgIC8vIGEgc2luZ2xlIHNldCB3aGVuIHBvc3NpYmxlLlxuICAgIHN0YXRpYyBmcm9tKG1lbWJlcnMpIHtcbiAgICAgICAgc3dpdGNoIChtZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBtZW1iZXJzWzBdO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG5ldyBEZWNvcmF0aW9uR3JvdXAobWVtYmVycy5ldmVyeShtID0+IG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0KSA/IG1lbWJlcnMgOlxuICAgICAgICAgICAgICAgIG1lbWJlcnMucmVkdWNlKChyLCBtKSA9PiByLmNvbmNhdChtIGluc3RhbmNlb2YgRGVjb3JhdGlvblNldCA/IG0gOiBtLm1lbWJlcnMpLCBbXSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvckVhY2hTZXQoZikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHRoaXMubWVtYmVyc1tpXS5mb3JFYWNoU2V0KGYpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKG9sZENoaWxkcmVuLCBuZXdMb2NhbCwgbWFwcGluZywgbm9kZSwgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICBsZXQgY2hpbGRyZW4gPSBvbGRDaGlsZHJlbi5zbGljZSgpO1xuICAgIC8vIE1hcmsgdGhlIGNoaWxkcmVuIHRoYXQgYXJlIGRpcmVjdGx5IHRvdWNoZWQgYnkgY2hhbmdlcywgYW5kXG4gICAgLy8gbW92ZSB0aG9zZSB0aGF0IGFyZSBhZnRlciB0aGUgY2hhbmdlcy5cbiAgICBmb3IgKGxldCBpID0gMCwgYmFzZU9mZnNldCA9IG9sZE9mZnNldDsgaSA8IG1hcHBpbmcubWFwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbW92ZWQgPSAwO1xuICAgICAgICBtYXBwaW5nLm1hcHNbaV0uZm9yRWFjaCgob2xkU3RhcnQsIG9sZEVuZCwgbmV3U3RhcnQsIG5ld0VuZCkgPT4ge1xuICAgICAgICAgICAgbGV0IGRTaXplID0gKG5ld0VuZCAtIG5ld1N0YXJ0KSAtIChvbGRFbmQgLSBvbGRTdGFydCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IGNoaWxkcmVuW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCB8fCBvbGRTdGFydCA+IGVuZCArIGJhc2VPZmZzZXQgLSBtb3ZlZClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gY2hpbGRyZW5baV0gKyBiYXNlT2Zmc2V0IC0gbW92ZWQ7XG4gICAgICAgICAgICAgICAgaWYgKG9sZEVuZCA+PSBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSBvbGRTdGFydCA8PSBzdGFydCA/IC0yIDogLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9sZFN0YXJ0ID49IGJhc2VPZmZzZXQgJiYgZFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gKz0gZFNpemU7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSArPSBkU2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb3ZlZCArPSBkU2l6ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJhc2VPZmZzZXQgPSBtYXBwaW5nLm1hcHNbaV0ubWFwKGJhc2VPZmZzZXQsIC0xKTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgY2hpbGQgbm9kZXMgdGhhdCBzdGlsbCBjb3JyZXNwb25kIHRvIGEgc2luZ2xlIG5vZGUsXG4gICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBtYXBJbm5lciBvbiB0aGVtIGFuZCB1cGRhdGUgdGhlaXIgcG9zaXRpb25zLlxuICAgIGxldCBtdXN0UmVidWlsZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPCAwKSB7IC8vIFRvdWNoZWQgbm9kZXNcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPT0gLTIpIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gLTE7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0KSwgZnJvbUxvY2FsID0gZnJvbSAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChmcm9tTG9jYWwgPCAwIHx8IGZyb21Mb2NhbCA+PSBub2RlLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE11c3QgcmVhZCBvbGRDaGlsZHJlbiBiZWNhdXNlIGNoaWxkcmVuIHdhcyB0YWdnZWQgd2l0aCAtMVxuICAgICAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAob2xkQ2hpbGRyZW5baSArIDFdICsgb2xkT2Zmc2V0LCAtMSksIHRvTG9jYWwgPSB0byAtIG9mZnNldDtcbiAgICAgICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQ6IGNoaWxkT2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KGZyb21Mb2NhbCk7XG4gICAgICAgICAgICBsZXQgY2hpbGROb2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGRPZmZzZXQgPT0gZnJvbUxvY2FsICYmIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplID09IHRvTG9jYWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFwcGVkID0gY2hpbGRyZW5baSArIDJdXG4gICAgICAgICAgICAgICAgICAgIC5tYXBJbm5lcihtYXBwaW5nLCBjaGlsZE5vZGUsIGZyb20gKyAxLCBvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWQgIT0gZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baV0gPSBmcm9tTG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IHRvTG9jYWw7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IG1hcHBlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IC0yO1xuICAgICAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgLy8gUmVtYWluaW5nIGNoaWxkcmVuIG11c3QgYmUgY29sbGVjdGVkIGFuZCByZWJ1aWx0IGludG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZVxuICAgIGlmIChtdXN0UmVidWlsZCkge1xuICAgICAgICBsZXQgZGVjb3JhdGlvbnMgPSBtYXBBbmRHYXRoZXJSZW1haW5pbmdEZWNvcmF0aW9ucyhjaGlsZHJlbiwgb2xkQ2hpbGRyZW4sIG5ld0xvY2FsLCBtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucyk7XG4gICAgICAgIGxldCBidWlsdCA9IGJ1aWxkVHJlZShkZWNvcmF0aW9ucywgbm9kZSwgMCwgb3B0aW9ucyk7XG4gICAgICAgIG5ld0xvY2FsID0gYnVpbHQubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5baSArIDFdIDwgMCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAzKTtcbiAgICAgICAgICAgICAgICBpIC09IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGJ1aWx0LmNoaWxkcmVuLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGJ1aWx0LmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bal0gPCBmcm9tKVxuICAgICAgICAgICAgICAgIGogKz0gMztcbiAgICAgICAgICAgIGNoaWxkcmVuLnNwbGljZShqLCAwLCBidWlsdC5jaGlsZHJlbltpXSwgYnVpbHQuY2hpbGRyZW5baSArIDFdLCBidWlsdC5jaGlsZHJlbltpICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGVjb3JhdGlvblNldChuZXdMb2NhbC5zb3J0KGJ5UG9zKSwgY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gbW92ZVNwYW5zKHNwYW5zLCBvZmZzZXQpIHtcbiAgICBpZiAoIW9mZnNldCB8fCAhc3BhbnMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gc3BhbnM7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IERlY29yYXRpb24oc3Bhbi5mcm9tICsgb2Zmc2V0LCBzcGFuLnRvICsgb2Zmc2V0LCBzcGFuLnR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1hcEFuZEdhdGhlclJlbWFpbmluZ0RlY29yYXRpb25zKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgZGVjb3JhdGlvbnMsIG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgLy8gR2F0aGVyIGFsbCBkZWNvcmF0aW9ucyBmcm9tIHRoZSByZW1haW5pbmcgbWFya2VkIGNoaWxkcmVuXG4gICAgZnVuY3Rpb24gZ2F0aGVyKHNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0LmxvY2FsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkID0gc2V0LmxvY2FsW2ldLm1hcChtYXBwaW5nLCBvZmZzZXQsIG9sZE9mZnNldCk7XG4gICAgICAgICAgICBpZiAobWFwcGVkKVxuICAgICAgICAgICAgICAgIGRlY29yYXRpb25zLnB1c2gobWFwcGVkKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMub25SZW1vdmUpXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlbW92ZShzZXQubG9jYWxbaV0uc3BlYyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBnYXRoZXIoc2V0LmNoaWxkcmVuW2kgKyAyXSwgc2V0LmNoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPT0gLTEpXG4gICAgICAgICAgICBnYXRoZXIoY2hpbGRyZW5baSArIDJdLCBvbGRDaGlsZHJlbltpXSArIG9sZE9mZnNldCArIDEpO1xuICAgIHJldHVybiBkZWNvcmF0aW9ucztcbn1cbmZ1bmN0aW9uIHRha2VTcGFuc0Zvck5vZGUoc3BhbnMsIG5vZGUsIG9mZnNldCkge1xuICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGVuZCA9IG9mZnNldCArIG5vZGUubm9kZVNpemUsIGZvdW5kID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgoc3BhbiA9IHNwYW5zW2ldKSAmJiBzcGFuLmZyb20gPiBvZmZzZXQgJiYgc3Bhbi50byA8IGVuZCkge1xuICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgIHNwYW5zW2ldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmQ7XG59XG5mdW5jdGlvbiB3aXRob3V0TnVsbHMoYXJyYXkpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IG51bGwpXG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8vIEJ1aWxkIHVwIGEgdHJlZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2V0IG9mIGRlY29yYXRpb25zLiBgb2Zmc2V0YFxuLy8gaXMgYSBiYXNlIG9mZnNldCB0aGF0IHNob3VsZCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhlIGBmcm9tYCBhbmQgYHRvYFxuLy8gcG9zaXRpb25zIGluIHRoZSBzcGFucyAoc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIG5ldyBzcGFuc1xuLy8gZm9yIHJlY3Vyc2l2ZSBjYWxscykuXG5mdW5jdGlvbiBidWlsZFRyZWUoc3BhbnMsIG5vZGUsIG9mZnNldCwgb3B0aW9ucykge1xuICAgIGxldCBjaGlsZHJlbiA9IFtdLCBoYXNOdWxscyA9IGZhbHNlO1xuICAgIG5vZGUuZm9yRWFjaCgoY2hpbGROb2RlLCBsb2NhbFN0YXJ0KSA9PiB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRha2VTcGFuc0Zvck5vZGUoc3BhbnMsIGNoaWxkTm9kZSwgbG9jYWxTdGFydCArIG9mZnNldCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgaGFzTnVsbHMgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHN1YnRyZWUgPSBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgb2Zmc2V0ICsgbG9jYWxTdGFydCArIDEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHN1YnRyZWUgIT0gZW1wdHkpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChsb2NhbFN0YXJ0LCBsb2NhbFN0YXJ0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBzdWJ0cmVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGxldCBsb2NhbHMgPSBtb3ZlU3BhbnMoaGFzTnVsbHMgPyB3aXRob3V0TnVsbHMoc3BhbnMpIDogc3BhbnMsIC1vZmZzZXQpLnNvcnQoYnlQb3MpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIWxvY2Fsc1tpXS50eXBlLnZhbGlkKG5vZGUsIGxvY2Fsc1tpXSkpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUobG9jYWxzW2ldLnNwZWMpO1xuICAgICAgICAgICAgbG9jYWxzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGxvY2Fscy5sZW5ndGggfHwgY2hpbGRyZW4ubGVuZ3RoID8gbmV3IERlY29yYXRpb25TZXQobG9jYWxzLCBjaGlsZHJlbikgOiBlbXB0eTtcbn1cbi8vIFVzZWQgdG8gc29ydCBkZWNvcmF0aW9ucyBzbyB0aGF0IG9uZXMgd2l0aCBhIGxvdyBzdGFydCBwb3NpdGlvblxuLy8gY29tZSBmaXJzdCwgYW5kIHdpdGhpbiBhIHNldCB3aXRoIHRoZSBzYW1lIHN0YXJ0IHBvc2l0aW9uLCB0aG9zZVxuLy8gd2l0aCBhbiBzbWFsbGVyIGVuZCBwb3NpdGlvbiBjb21lIGZpcnN0LlxuZnVuY3Rpb24gYnlQb3MoYSwgYikge1xuICAgIHJldHVybiBhLmZyb20gLSBiLmZyb20gfHwgYS50byAtIGIudG87XG59XG4vLyBTY2FuIGEgc29ydGVkIGFycmF5IG9mIGRlY29yYXRpb25zIGZvciBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgc3BhbnMsXG4vLyBhbmQgc3BsaXQgdGhvc2Ugc28gdGhhdCBvbmx5IGZ1bGx5IG92ZXJsYXBwaW5nIHNwYW5zIGFyZSBsZWZ0ICh0b1xuLy8gbWFrZSBzdWJzZXF1ZW50IHJlbmRlcmluZyBlYXNpZXIpLiBXaWxsIHJldHVybiB0aGUgaW5wdXQgYXJyYXkgaWZcbi8vIG5vIHBhcnRpYWxseSBvdmVybGFwcGluZyBzcGFucyBhcmUgZm91bmQgKHRoZSBjb21tb24gY2FzZSkuXG5mdW5jdGlvbiByZW1vdmVPdmVybGFwKHNwYW5zKSB7XG4gICAgbGV0IHdvcmtpbmcgPSBzcGFucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtpbmcubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGxldCBzcGFuID0gd29ya2luZ1tpXTtcbiAgICAgICAgaWYgKHNwYW4uZnJvbSAhPSBzcGFuLnRvKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgd29ya2luZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gd29ya2luZ1tqXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5mcm9tID09IHNwYW4uZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC50byAhPSBzcGFuLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZyA9PSBzcGFucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gc3BhbnMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2VkIGJ5IGEgcGFydGlhbGx5IG92ZXJsYXBwaW5nIGxhcmdlciBzcGFuLiBTcGxpdCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGFuLlxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ1tqXSA9IG5leHQuY29weShuZXh0LmZyb20sIHNwYW4udG8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWhlYWQod29ya2luZywgaiArIDEsIG5leHQuY29weShzcGFuLnRvLCBuZXh0LnRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5mcm9tIDwgc3Bhbi50bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gc3BhbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZyA9IHNwYW5zLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZW5kIG9mIHRoaXMgb25lIG92ZXJsYXBzIHdpdGggYSBzdWJzZXF1ZW50IHNwYW4uIFNwbGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdbaV0gPSBzcGFuLmNvcHkoc3Bhbi5mcm9tLCBuZXh0LmZyb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QWhlYWQod29ya2luZywgaiwgc3Bhbi5jb3B5KG5leHQuZnJvbSwgc3Bhbi50bykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdvcmtpbmc7XG59XG5mdW5jdGlvbiBpbnNlcnRBaGVhZChhcnJheSwgaSwgZGVjbykge1xuICAgIHdoaWxlIChpIDwgYXJyYXkubGVuZ3RoICYmIGJ5UG9zKGRlY28sIGFycmF5W2ldKSA+IDApXG4gICAgICAgIGkrKztcbiAgICBhcnJheS5zcGxpY2UoaSwgMCwgZGVjbyk7XG59XG4vLyBHZXQgdGhlIGRlY29yYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBwcm9wcyBvZiBhIHZpZXcuXG5mdW5jdGlvbiB2aWV3RGVjb3JhdGlvbnModmlldykge1xuICAgIGxldCBmb3VuZCA9IFtdO1xuICAgIHZpZXcuc29tZVByb3AoXCJkZWNvcmF0aW9uc1wiLCBmID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGYodmlldy5zdGF0ZSk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IGVtcHR5KVxuICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIGlmICh2aWV3LmN1cnNvcldyYXBwZXIpXG4gICAgICAgIGZvdW5kLnB1c2goRGVjb3JhdGlvblNldC5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIFt2aWV3LmN1cnNvcldyYXBwZXIuZGVjb10pKTtcbiAgICByZXR1cm4gRGVjb3JhdGlvbkdyb3VwLmZyb20oZm91bmQpO1xufVxuXG5jb25zdCBvYnNlcnZlT3B0aW9ucyA9IHtcbiAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6IHRydWUsXG4gICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSxcbiAgICBzdWJ0cmVlOiB0cnVlXG59O1xuLy8gSUUxMSBoYXMgdmVyeSBicm9rZW4gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB3ZSBhbHNvIGxpc3RlbiB0byBET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcbmNvbnN0IHVzZUNoYXJEYXRhID0gaWUgJiYgaWVfdmVyc2lvbiA8PSAxMTtcbmNsYXNzIFNlbGVjdGlvblN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbmNob3JPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLmZvY3VzTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9jdXNPZmZzZXQgPSAwO1xuICAgIH1cbiAgICBzZXQoc2VsKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IHNlbC5hbmNob3JOb2RlO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IHNlbC5hbmNob3JPZmZzZXQ7XG4gICAgICAgIHRoaXMuZm9jdXNOb2RlID0gc2VsLmZvY3VzTm9kZTtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yTm9kZSA9IHRoaXMuZm9jdXNOb2RlID0gbnVsbDtcbiAgICB9XG4gICAgZXEoc2VsKSB7XG4gICAgICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSA9PSB0aGlzLmFuY2hvck5vZGUgJiYgc2VsLmFuY2hvck9mZnNldCA9PSB0aGlzLmFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgc2VsLmZvY3VzTm9kZSA9PSB0aGlzLmZvY3VzTm9kZSAmJiBzZWwuZm9jdXNPZmZzZXQgPT0gdGhpcy5mb2N1c09mZnNldDtcbiAgICB9XG59XG5jbGFzcyBET01PYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IodmlldywgaGFuZGxlRE9NQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlID0gaGFuZGxlRE9NQ2hhbmdlO1xuICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gLTE7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uU3RhdGU7XG4gICAgICAgIHRoaXMub25DaGFyRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMubGFzdENoYW5nZWRUZXh0Tm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciAmJlxuICAgICAgICAgICAgbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaChtdXRhdGlvbnNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIElFMTEgd2lsbCBzb21ldGltZXMgKG9uIGJhY2tzcGFjaW5nIG91dCBhIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUgYWZ0ZXIgYSBCUiBub2RlKSBjYWxsIHRoZSBvYnNlcnZlciBjYWxsYmFja1xuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBhY3R1YWxseSB1cGRhdGluZyB0aGUgRE9NLCB3aGljaCB3aWxsIGNhdXNlXG4gICAgICAgICAgICAgICAgLy8gUHJvc2VNaXJyb3IgdG8gbWlzcyB0aGUgY2hhbmdlIChzZWUgIzkzMClcbiAgICAgICAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBtdXRhdGlvbnMuc29tZShtID0+IG0udHlwZSA9PSBcImNoaWxkTGlzdFwiICYmIG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICBtLnR5cGUgPT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbS5vbGRWYWx1ZS5sZW5ndGggPiBtLnRhcmdldC5ub2RlVmFsdWUubGVuZ3RoKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAodXNlQ2hhckRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFyRGF0YSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh7IHRhcmdldDogZS50YXJnZXQsIHR5cGU6IFwiY2hhcmFjdGVyRGF0YVwiLCBvbGRWYWx1ZTogZS5wcmV2VmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgZmx1c2hTb29uKCkge1xuICAgICAgICBpZiAodGhpcy5mbHVzaGluZ1Nvb24gPCAwKVxuICAgICAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuZmx1c2hpbmdTb29uID0gLTE7IHRoaXMuZmx1c2goKTsgfSwgMjApO1xuICAgIH1cbiAgICBmb3JjZUZsdXNoKCkge1xuICAgICAgICBpZiAodGhpcy5mbHVzaGluZ1Nvb24gPiAtMSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmZsdXNoaW5nU29vbik7XG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IC0xO1xuICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci50YWtlUmVjb3JkcygpO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMudmlldy5kb20sIG9ic2VydmVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbkNoYXJEYXRhKVxuICAgICAgICAgICAgdGhpcy52aWV3LmRvbS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsIHRoaXMub25DaGFyRGF0YSk7XG4gICAgICAgIHRoaXMuY29ubmVjdFNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgICAgICAgbGV0IHRha2UgPSB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICAgICAgICBpZiAodGFrZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRha2UubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVldWUucHVzaCh0YWtlW2ldKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLmZsdXNoKCksIDIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGNvbm5lY3RTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmlldy5kb20ub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0U2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnZpZXcuZG9tLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKTtcbiAgICB9XG4gICAgc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCkge1xuICAgICAgICB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IHRydWU7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSBmYWxzZSwgNTApO1xuICAgIH1cbiAgICBvblNlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgaWYgKCFoYXNGb2N1c0FuZFNlbGVjdGlvbih0aGlzLnZpZXcpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMpXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KTtcbiAgICAgICAgLy8gRGVsZXRpb25zIG9uIElFMTEgZmlyZSB0aGVpciBldmVudHMgaW4gdGhlIHdyb25nIG9yZGVyLCBnaXZpbmdcbiAgICAgICAgLy8gdXMgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IGJlZm9yZSB0aGUgRE9NIGNoYW5nZXMgYXJlXG4gICAgICAgIC8vIHJlcG9ydGVkLlxuICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiAhdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5lbXB0eSkge1xuICAgICAgICAgICAgbGV0IHNlbCA9IHRoaXMudmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICAgICAgLy8gU2VsZWN0aW9uLmlzQ29sbGFwc2VkIGlzbid0IHJlbGlhYmxlIG9uIElFXG4gICAgICAgICAgICBpZiAoc2VsLmZvY3VzTm9kZSAmJiBpc0VxdWl2YWxlbnRQb3NpdGlvbihzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQsIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbHVzaFNvb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICAgIHNldEN1clNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldCh0aGlzLnZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKSk7XG4gICAgfVxuICAgIGlnbm9yZVNlbGVjdGlvbkNoYW5nZShzZWwpIHtcbiAgICAgICAgaWYgKCFzZWwuZm9jdXNOb2RlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBhbmNlc3RvcnMgPSBuZXcgU2V0LCBjb250YWluZXI7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBzZWwuZm9jdXNOb2RlOyBzY2FuOyBzY2FuID0gcGFyZW50Tm9kZShzY2FuKSlcbiAgICAgICAgICAgIGFuY2VzdG9ycy5hZGQoc2Nhbik7XG4gICAgICAgIGZvciAobGV0IHNjYW4gPSBzZWwuYW5jaG9yTm9kZTsgc2Nhbjsgc2NhbiA9IHBhcmVudE5vZGUoc2NhbikpXG4gICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmhhcyhzY2FuKSkge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHNjYW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBkZXNjID0gY29udGFpbmVyICYmIHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGNvbnRhaW5lcik7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2MuaWdub3JlTXV0YXRpb24oe1xuICAgICAgICAgICAgdHlwZTogXCJzZWxlY3Rpb25cIixcbiAgICAgICAgICAgIHRhcmdldDogY29udGFpbmVyLm5vZGVUeXBlID09IDMgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lclxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBlbmRpbmdSZWNvcmRzKCkge1xuICAgICAgICBpZiAodGhpcy5vYnNlcnZlcilcbiAgICAgICAgICAgIGZvciAobGV0IG11dCBvZiB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlO1xuICAgIH1cbiAgICBmbHVzaCgpIHtcbiAgICAgICAgbGV0IHsgdmlldyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCF2aWV3LmRvY1ZpZXcgfHwgdGhpcy5mbHVzaGluZ1Nvb24gPiAtMSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IG11dGF0aW9ucyA9IHRoaXMucGVuZGluZ1JlY29yZHMoKTtcbiAgICAgICAgaWYgKG11dGF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBuZXdTZWwgPSAhdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgJiYgIXRoaXMuY3VycmVudFNlbGVjdGlvbi5lcShzZWwpICYmIGhhc0ZvY3VzQW5kU2VsZWN0aW9uKHZpZXcpICYmICF0aGlzLmlnbm9yZVNlbGVjdGlvbkNoYW5nZShzZWwpO1xuICAgICAgICBsZXQgZnJvbSA9IC0xLCB0byA9IC0xLCB0eXBlT3ZlciA9IGZhbHNlLCBhZGRlZCA9IFtdO1xuICAgICAgICBpZiAodmlldy5lZGl0YWJsZSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZWdpc3Rlck11dGF0aW9uKG11dGF0aW9uc1tpXSwgYWRkZWQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IGZyb20gPCAwID8gcmVzdWx0LmZyb20gOiBNYXRoLm1pbihyZXN1bHQuZnJvbSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIHRvID0gdG8gPCAwID8gcmVzdWx0LnRvIDogTWF0aC5tYXgocmVzdWx0LnRvLCB0byk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZU92ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChnZWNrbyAmJiBhZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBicnMgPSBhZGRlZC5maWx0ZXIobiA9PiBuLm5vZGVOYW1lID09IFwiQlJcIik7XG4gICAgICAgICAgICBpZiAoYnJzLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IFthLCBiXSA9IGJycztcbiAgICAgICAgICAgICAgICBpZiAoYS5wYXJlbnROb2RlICYmIGEucGFyZW50Tm9kZS5wYXJlbnROb2RlID09IGIucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgYi5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGEucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBmb2N1c05vZGUgfSA9IHRoaXMuY3VycmVudFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiciBvZiBicnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGJyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVOYW1lID09IFwiTElcIiAmJiAoIWZvY3VzTm9kZSB8fCBibG9ja1BhcmVudCh2aWV3LCBmb2N1c05vZGUpICE9IHBhcmVudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBici5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlYWRTZWwgPSBudWxsO1xuICAgICAgICAvLyBJZiBpdCBsb29rcyBsaWtlIHRoZSBicm93c2VyIGhhcyByZXNldCB0aGUgc2VsZWN0aW9uIHRvIHRoZVxuICAgICAgICAvLyBzdGFydCBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgZm9jdXMsIHJlc3RvcmUgdGhlIHNlbGVjdGlvbiBmcm9tXG4gICAgICAgIC8vIHRoZSBzdGF0ZVxuICAgICAgICBpZiAoZnJvbSA8IDAgJiYgbmV3U2VsICYmIHZpZXcuaW5wdXQubGFzdEZvY3VzID4gRGF0ZS5ub3coKSAtIDIwMCAmJlxuICAgICAgICAgICAgTWF0aC5tYXgodmlldy5pbnB1dC5sYXN0VG91Y2gsIHZpZXcuaW5wdXQubGFzdENsaWNrLnRpbWUpIDwgRGF0ZS5ub3coKSAtIDMwMCAmJlxuICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGFwc2VkKHNlbCkgJiYgKHJlYWRTZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpKSAmJlxuICAgICAgICAgICAgcmVhZFNlbC5lcShTZWxlY3Rpb24ubmVhcih2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKDApLCAxKSkpIHtcbiAgICAgICAgICAgIHZpZXcuaW5wdXQubGFzdEZvY3VzID0gMDtcbiAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICAgICAgdmlldy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZyb20gPiAtMSB8fCBuZXdTZWwpIHtcbiAgICAgICAgICAgIGlmIChmcm9tID4gLTEpIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvY1ZpZXcubWFya0RpcnR5KGZyb20sIHRvKTtcbiAgICAgICAgICAgICAgICBjaGVja0NTUyh2aWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRE9NQ2hhbmdlKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuZG9jVmlldyAmJiB2aWV3LmRvY1ZpZXcuZGlydHkpXG4gICAgICAgICAgICAgICAgdmlldy51cGRhdGVTdGF0ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmN1cnJlbnRTZWxlY3Rpb24uZXEoc2VsKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbi5zZXQoc2VsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3Rlck11dGF0aW9uKG11dCwgYWRkZWQpIHtcbiAgICAgICAgLy8gSWdub3JlIG11dGF0aW9ucyBpbnNpZGUgbm9kZXMgdGhhdCB3ZXJlIGFscmVhZHkgbm90ZWQgYXMgaW5zZXJ0ZWRcbiAgICAgICAgaWYgKGFkZGVkLmluZGV4T2YobXV0LnRhcmdldCkgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZGVzYyA9IHRoaXMudmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKG11dC50YXJnZXQpO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIgJiZcbiAgICAgICAgICAgIChkZXNjID09IHRoaXMudmlldy5kb2NWaWV3IHx8IG11dC5hdHRyaWJ1dGVOYW1lID09IFwiY29udGVudGVkaXRhYmxlXCIgfHxcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IHNvbWV0aW1lcyBmaXJlcyBzcHVyaW91cyBldmVudHMgZm9yIG51bGwvZW1wdHkgc3R5bGVzXG4gICAgICAgICAgICAgICAgKG11dC5hdHRyaWJ1dGVOYW1lID09IFwic3R5bGVcIiAmJiAhbXV0Lm9sZFZhbHVlICYmICFtdXQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFkZXNjIHx8IGRlc2MuaWdub3JlTXV0YXRpb24obXV0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAobXV0LnR5cGUgPT0gXCJjaGlsZExpc3RcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBub2RlID0gbXV0LmFkZGVkTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgYWRkZWQucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2VkVGV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlc2MuY29udGVudERPTSAmJiBkZXNjLmNvbnRlbnRET00gIT0gZGVzYy5kb20gJiYgIWRlc2MuY29udGVudERPTS5jb250YWlucyhtdXQudGFyZ2V0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4geyBmcm9tOiBkZXNjLnBvc0JlZm9yZSwgdG86IGRlc2MucG9zQWZ0ZXIgfTtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gbXV0LnByZXZpb3VzU2libGluZywgbmV4dCA9IG11dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmIG11dC5hZGRlZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIElFMTEgZ2l2ZXMgdXMgaW5jb3JyZWN0IG5leHQvcHJldiBzaWJsaW5ncyBmb3Igc29tZVxuICAgICAgICAgICAgICAgIC8vIGluc2VydGlvbnMsIHNvIGlmIHRoZXJlIGFyZSBhZGRlZCBub2RlcywgcmVjb21wdXRlIHRob3NlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYWRkZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBwcmV2aW91c1NpYmxpbmcsIG5leHRTaWJsaW5nIH0gPSBtdXQuYWRkZWROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmcgfHwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChtdXQuYWRkZWROb2RlcywgcHJldmlvdXNTaWJsaW5nKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gcHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHRTaWJsaW5nIHx8IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwobXV0LmFkZGVkTm9kZXMsIG5leHRTaWJsaW5nKSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGZyb21PZmZzZXQgPSBwcmV2ICYmIHByZXYucGFyZW50Tm9kZSA9PSBtdXQudGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBkb21JbmRleChwcmV2KSArIDEgOiAwO1xuICAgICAgICAgICAgbGV0IGZyb20gPSBkZXNjLmxvY2FsUG9zRnJvbURPTShtdXQudGFyZ2V0LCBmcm9tT2Zmc2V0LCAtMSk7XG4gICAgICAgICAgICBsZXQgdG9PZmZzZXQgPSBuZXh0ICYmIG5leHQucGFyZW50Tm9kZSA9PSBtdXQudGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBkb21JbmRleChuZXh0KSA6IG11dC50YXJnZXQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdG8gPSBkZXNjLmxvY2FsUG9zRnJvbURPTShtdXQudGFyZ2V0LCB0b09mZnNldCwgMSk7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tLCB0byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG11dC50eXBlID09IFwiYXR0cmlidXRlc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBmcm9tOiBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciwgdG86IGRlc2MucG9zQXRFbmQgKyBkZXNjLmJvcmRlciB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBcImNoYXJhY3RlckRhdGFcIlxuICAgICAgICAgICAgdGhpcy5sYXN0Q2hhbmdlZFRleHROb2RlID0gbXV0LnRhcmdldDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZnJvbTogZGVzYy5wb3NBdFN0YXJ0LFxuICAgICAgICAgICAgICAgIHRvOiBkZXNjLnBvc0F0RW5kLFxuICAgICAgICAgICAgICAgIC8vIEFuIGV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yIGEgdGV4dCBjaGFuZ2UgdGhhdCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICAgICAgLy8gYW55IHRleHQuIE1hcmsgdGhlIGRvbSBjaGFuZ2UgdG8gZmFsbCBiYWNrIHRvIGFzc3VtaW5nIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiB3YXMgdHlwZWQgb3ZlciB3aXRoIGFuIGlkZW50aWNhbCB2YWx1ZSBpZiBpdCBjYW4ndFxuICAgICAgICAgICAgICAgIC8vIGZpbmQgYW5vdGhlciBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdHlwZU92ZXI6IG11dC50YXJnZXQubm9kZVZhbHVlID09IG11dC5vbGRWYWx1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmxldCBjc3NDaGVja2VkID0gbmV3IFdlYWtNYXAoKTtcbmxldCBjc3NDaGVja1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tDU1Modmlldykge1xuICAgIGlmIChjc3NDaGVja2VkLmhhcyh2aWV3KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNzc0NoZWNrZWQuc2V0KHZpZXcsIG51bGwpO1xuICAgIGlmIChbJ25vcm1hbCcsICdub3dyYXAnLCAncHJlLWxpbmUnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodmlldy5kb20pLndoaXRlU3BhY2UpICE9PSAtMSkge1xuICAgICAgICB2aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGdlY2tvO1xuICAgICAgICBpZiAoY3NzQ2hlY2tXYXJuZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnNvbGVbXCJ3YXJuXCJdKFwiUHJvc2VNaXJyb3IgZXhwZWN0cyB0aGUgQ1NTIHdoaXRlLXNwYWNlIHByb3BlcnR5IHRvIGJlIHNldCwgcHJlZmVyYWJseSB0byAncHJlLXdyYXAnLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsb2FkIHN0eWxlL3Byb3NlbWlycm9yLmNzcyBmcm9tIHRoZSBwcm9zZW1pcnJvci12aWV3IHBhY2thZ2UuXCIpO1xuICAgICAgICBjc3NDaGVja1dhcm5lZCA9IHRydWU7XG4gICAgfVxufVxuZnVuY3Rpb24gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIHJhbmdlKSB7XG4gICAgbGV0IGFuY2hvck5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lciwgYW5jaG9yT2Zmc2V0ID0gcmFuZ2Uuc3RhcnRPZmZzZXQ7XG4gICAgbGV0IGZvY3VzTm9kZSA9IHJhbmdlLmVuZENvbnRhaW5lciwgZm9jdXNPZmZzZXQgPSByYW5nZS5lbmRPZmZzZXQ7XG4gICAgbGV0IGN1cnJlbnRBbmNob3IgPSB2aWV3LmRvbUF0UG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvcik7XG4gICAgLy8gU2luY2Ugc3VjaCBhIHJhbmdlIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbmNob3IgYW5kIGhlYWQsXG4gICAgLy8gdXNlIGEgaGV1cmlzdGljIHRoYXQgZmxpcHMgaXQgYXJvdW5kIGlmIGl0cyBlbmQgbWF0Y2hlcyB0aGVcbiAgICAvLyBjdXJyZW50IGFuY2hvci5cbiAgICBpZiAoaXNFcXVpdmFsZW50UG9zaXRpb24oY3VycmVudEFuY2hvci5ub2RlLCBjdXJyZW50QW5jaG9yLm9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkpXG4gICAgICAgIFthbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXRdID0gW2ZvY3VzTm9kZSwgZm9jdXNPZmZzZXQsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldF07XG4gICAgcmV0dXJuIHsgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0IH07XG59XG4vLyBVc2VkIHRvIHdvcmsgYXJvdW5kIGEgU2FmYXJpIFNlbGVjdGlvbi9zaGFkb3cgRE9NIGJ1Z1xuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvZGV2L2lzc3Vlcy80MTQgZml4XG5mdW5jdGlvbiBzYWZhcmlTaGFkb3dTZWxlY3Rpb25SYW5nZSh2aWV3LCBzZWxlY3Rpb24pIHtcbiAgICBpZiAoc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKSB7XG4gICAgICAgIGxldCByYW5nZSA9IHNlbGVjdGlvbi5nZXRDb21wb3NlZFJhbmdlcyh2aWV3LnJvb3QpWzBdO1xuICAgICAgICBpZiAocmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIHJhbmdlKTtcbiAgICB9XG4gICAgbGV0IGZvdW5kO1xuICAgIGZ1bmN0aW9uIHJlYWQoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGZvdW5kID0gZXZlbnQuZ2V0VGFyZ2V0UmFuZ2VzKClbMF07XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgU2FmYXJpIChhdCBsZWFzdCBpbiAyMDE4LTIwMjIpIGRvZXNuJ3QgcHJvdmlkZSByZWd1bGFyXG4gICAgLy8gYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gaW5zaWRlIGEgc2hhZG93Um9vdCwgd2UgaGF2ZSB0byBwZXJmb3JtIGFcbiAgICAvLyByaWRpY3Vsb3VzIGhhY2sgdG8gZ2V0IGF0IGl04oCUdXNpbmcgYGV4ZWNDb21tYW5kYCB0byB0cmlnZ2VyIGFcbiAgICAvLyBgYmVmb3JlSW5wdXRgIGV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHRhcmdldCByYW5nZSBmcm9tIHRoZVxuICAgIC8vIGV2ZW50LlxuICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluZGVudFwiKTtcbiAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JlaW5wdXRcIiwgcmVhZCwgdHJ1ZSk7XG4gICAgcmV0dXJuIGZvdW5kID8gcmFuZ2VUb1NlbGVjdGlvblJhbmdlKHZpZXcsIGZvdW5kKSA6IG51bGw7XG59XG5mdW5jdGlvbiBibG9ja1BhcmVudCh2aWV3LCBub2RlKSB7XG4gICAgZm9yIChsZXQgcCA9IG5vZGUucGFyZW50Tm9kZTsgcCAmJiBwICE9IHZpZXcuZG9tOyBwID0gcC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKHAsIHRydWUpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUuaXNCbG9jaylcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLy8gTm90ZSB0aGF0IGFsbCByZWZlcmVuY2luZyBhbmQgcGFyc2luZyBpcyBkb25lIHdpdGggdGhlXG4vLyBzdGFydC1vZi1vcGVyYXRpb24gc2VsZWN0aW9uIGFuZCBkb2N1bWVudCwgc2luY2UgdGhhdCdzIHRoZSBvbmVcbi8vIHRoYXQgdGhlIERPTSByZXByZXNlbnRzLiBJZiBhbnkgY2hhbmdlcyBjYW1lIGluIGluIHRoZSBtZWFudGltZSxcbi8vIHRoZSBtb2RpZmljYXRpb24gaXMgbWFwcGVkIG92ZXIgdGhvc2UgYmVmb3JlIGl0IGlzIGFwcGxpZWQsIGluXG4vLyByZWFkRE9NQ2hhbmdlLlxuZnVuY3Rpb24gcGFyc2VCZXR3ZWVuKHZpZXcsIGZyb21fLCB0b18pIHtcbiAgICBsZXQgeyBub2RlOiBwYXJlbnQsIGZyb21PZmZzZXQsIHRvT2Zmc2V0LCBmcm9tLCB0byB9ID0gdmlldy5kb2NWaWV3LnBhcnNlUmFuZ2UoZnJvbV8sIHRvXyk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgZmluZDtcbiAgICBsZXQgYW5jaG9yID0gZG9tU2VsLmFuY2hvck5vZGU7XG4gICAgaWYgKGFuY2hvciAmJiB2aWV3LmRvbS5jb250YWlucyhhbmNob3Iubm9kZVR5cGUgPT0gMSA/IGFuY2hvciA6IGFuY2hvci5wYXJlbnROb2RlKSkge1xuICAgICAgICBmaW5kID0gW3sgbm9kZTogYW5jaG9yLCBvZmZzZXQ6IGRvbVNlbC5hbmNob3JPZmZzZXQgfV07XG4gICAgICAgIGlmICghc2VsZWN0aW9uQ29sbGFwc2VkKGRvbVNlbCkpXG4gICAgICAgICAgICBmaW5kLnB1c2goeyBub2RlOiBkb21TZWwuZm9jdXNOb2RlLCBvZmZzZXQ6IGRvbVNlbC5mb2N1c09mZnNldCB9KTtcbiAgICB9XG4gICAgLy8gV29yayBhcm91bmQgaXNzdWUgaW4gQ2hyb21lIHdoZXJlIGJhY2tzcGFjaW5nIHNvbWV0aW1lcyByZXBsYWNlc1xuICAgIC8vIHRoZSBkZWxldGVkIGNvbnRlbnQgd2l0aCBhIHJhbmRvbSBCUiBub2RlIChpc3N1ZXMgIzc5OSwgIzgzMSlcbiAgICBpZiAoY2hyb21lICYmIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPT09IDgpIHtcbiAgICAgICAgZm9yIChsZXQgb2ZmID0gdG9PZmZzZXQ7IG9mZiA+IGZyb21PZmZzZXQ7IG9mZi0tKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW29mZiAtIDFdLCBkZXNjID0gbm9kZS5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gXCJCUlwiICYmICFkZXNjKSB7XG4gICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBvZmY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MgfHwgZGVzYy5zaXplKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzdGFydERvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGxldCBwYXJzZXIgPSB2aWV3LnNvbWVQcm9wKFwiZG9tUGFyc2VyXCIpIHx8IERPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKTtcbiAgICBsZXQgJGZyb20gPSBzdGFydERvYy5yZXNvbHZlKGZyb20pO1xuICAgIGxldCBzZWwgPSBudWxsLCBkb2MgPSBwYXJzZXIucGFyc2UocGFyZW50LCB7XG4gICAgICAgIHRvcE5vZGU6ICRmcm9tLnBhcmVudCxcbiAgICAgICAgdG9wTWF0Y2g6ICRmcm9tLnBhcmVudC5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleCgpKSxcbiAgICAgICAgdG9wT3BlbjogdHJ1ZSxcbiAgICAgICAgZnJvbTogZnJvbU9mZnNldCxcbiAgICAgICAgdG86IHRvT2Zmc2V0LFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICRmcm9tLnBhcmVudC50eXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIiA/IFwiZnVsbFwiIDogdHJ1ZSxcbiAgICAgICAgZmluZFBvc2l0aW9uczogZmluZCxcbiAgICAgICAgcnVsZUZyb21Ob2RlLFxuICAgICAgICBjb250ZXh0OiAkZnJvbVxuICAgIH0pO1xuICAgIGlmIChmaW5kICYmIGZpbmRbMF0ucG9zICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGFuY2hvciA9IGZpbmRbMF0ucG9zLCBoZWFkID0gZmluZFsxXSAmJiBmaW5kWzFdLnBvcztcbiAgICAgICAgaWYgKGhlYWQgPT0gbnVsbClcbiAgICAgICAgICAgIGhlYWQgPSBhbmNob3I7XG4gICAgICAgIHNlbCA9IHsgYW5jaG9yOiBhbmNob3IgKyBmcm9tLCBoZWFkOiBoZWFkICsgZnJvbSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBkb2MsIHNlbCwgZnJvbSwgdG8gfTtcbn1cbmZ1bmN0aW9uIHJ1bGVGcm9tTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIGlmIChkZXNjKSB7XG4gICAgICAgIHJldHVybiBkZXNjLnBhcnNlUnVsZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJCUlwiICYmIGRvbS5wYXJlbnROb2RlKSB7XG4gICAgICAgIC8vIFNhZmFyaSByZXBsYWNlcyB0aGUgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgd2l0aCBhIEJSXG4gICAgICAgIC8vIGRpcmVjdGx5IGluIHRoZSBsaXN0IG5vZGUgKD8hKSBpZiB5b3UgZGVsZXRlIHRoZSBsYXN0XG4gICAgICAgIC8vIGNoYXJhY3RlciBpbiBhIGxpc3QgaXRlbSBvciB0YWJsZSBjZWxsICgjNzA4LCAjODYyKVxuICAgICAgICBpZiAoc2FmYXJpICYmIC9eKHVsfG9sKSQvaS50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgbGV0IHNraXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgc2tpcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvbS5wYXJlbnROb2RlLmxhc3RDaGlsZCA9PSBkb20gfHwgc2FmYXJpICYmIC9eKHRyfHRhYmxlKSQvaS50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZG9tLm5vZGVOYW1lID09IFwiSU1HXCIgJiYgZG9tLmdldEF0dHJpYnV0ZShcIm1hcmstcGxhY2Vob2xkZXJcIikpIHtcbiAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuY29uc3QgaXNJbmxpbmUgPSAvXihhfGFiYnJ8YWNyb255bXxifGJkW2lvXXxiaWd8YnJ8YnV0dG9ufGNpdGV8Y29kZXxkYXRhKGxpc3QpP3xkZWx8ZGZufGVtfGl8aW5zfGtiZHxsYWJlbHxtYXB8bWFya3xtZXRlcnxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzbWFsbHxzcGFufHN0cm9uZ3xzdVticF18dGltZXx1fHR0fHZhcikkL2k7XG5mdW5jdGlvbiByZWFkRE9NQ2hhbmdlKHZpZXcsIGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWROb2Rlcykge1xuICAgIGxldCBjb21wb3NpdGlvbklEID0gdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzIHx8ICh2aWV3LmNvbXBvc2luZyA/IHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCA6IDApO1xuICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IDA7XG4gICAgaWYgKGZyb20gPCAwKSB7XG4gICAgICAgIGxldCBvcmlnaW4gPSB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25UaW1lID4gRGF0ZS5ub3coKSAtIDUwID8gdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uT3JpZ2luIDogbnVsbDtcbiAgICAgICAgbGV0IG5ld1NlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldywgb3JpZ2luKTtcbiAgICAgICAgaWYgKG5ld1NlbCAmJiAhdmlldy5zdGF0ZS5zZWxlY3Rpb24uZXEobmV3U2VsKSkge1xuICAgICAgICAgICAgaWYgKGNocm9tZSAmJiBhbmRyb2lkICYmXG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gMTMgJiYgRGF0ZS5ub3coKSAtIDEwMCA8IHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lICYmXG4gICAgICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24obmV3U2VsKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW4gPT0gXCJwb2ludGVyXCIpXG4gICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcInBvaW50ZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gPT0gXCJrZXlcIilcbiAgICAgICAgICAgICAgICB0ci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgICAgICAgICAgdHIuc2V0TWV0YShcImNvbXBvc2l0aW9uXCIsIGNvbXBvc2l0aW9uSUQpO1xuICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgJGJlZm9yZSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNoYXJlZCA9ICRiZWZvcmUuc2hhcmVkRGVwdGgodG8pO1xuICAgIGZyb20gPSAkYmVmb3JlLmJlZm9yZShzaGFyZWQgKyAxKTtcbiAgICB0byA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUodG8pLmFmdGVyKHNoYXJlZCArIDEpO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBsZXQgcGFyc2UgPSBwYXJzZUJldHdlZW4odmlldywgZnJvbSwgdG8pO1xuICAgIGxldCBkb2MgPSB2aWV3LnN0YXRlLmRvYywgY29tcGFyZSA9IGRvYy5zbGljZShwYXJzZS5mcm9tLCBwYXJzZS50byk7XG4gICAgbGV0IHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZTtcbiAgICAvLyBQcmVmZXIgYW5jaG9yaW5nIHRvIGVuZCB3aGVuIEJhY2tzcGFjZSBpcyBwcmVzc2VkXG4gICAgaWYgKHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPT09IDggJiYgRGF0ZS5ub3coKSAtIDEwMCA8IHZpZXcuaW5wdXQubGFzdEtleUNvZGVUaW1lKSB7XG4gICAgICAgIHByZWZlcnJlZFBvcyA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICBwcmVmZXJyZWRTaWRlID0gXCJlbmRcIjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHByZWZlcnJlZFBvcyA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcInN0YXJ0XCI7XG4gICAgfVxuICAgIHZpZXcuaW5wdXQubGFzdEtleUNvZGUgPSBudWxsO1xuICAgIGxldCBjaGFuZ2UgPSBmaW5kRGlmZihjb21wYXJlLmNvbnRlbnQsIHBhcnNlLmRvYy5jb250ZW50LCBwYXJzZS5mcm9tLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpO1xuICAgIGlmIChjaGFuZ2UpXG4gICAgICAgIHZpZXcuaW5wdXQuZG9tQ2hhbmdlQ291bnQrKztcbiAgICBpZiAoKGlvcyAmJiB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA+IERhdGUubm93KCkgLSAyMjUgfHwgYW5kcm9pZCkgJiZcbiAgICAgICAgYWRkZWROb2Rlcy5zb21lKG4gPT4gbi5ub2RlVHlwZSA9PSAxICYmICFpc0lubGluZS50ZXN0KG4ubm9kZU5hbWUpKSAmJlxuICAgICAgICAoIWNoYW5nZSB8fCBjaGFuZ2UuZW5kQSA+PSBjaGFuZ2UuZW5kQikgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpIHtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIGlmICh0eXBlT3ZlciAmJiBzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uICYmICFzZWwuZW1wdHkgJiYgc2VsLiRoZWFkLnNhbWVQYXJlbnQoc2VsLiRhbmNob3IpICYmXG4gICAgICAgICAgICAhdmlldy5jb21wb3NpbmcgJiYgIShwYXJzZS5zZWwgJiYgcGFyc2Uuc2VsLmFuY2hvciAhPSBwYXJzZS5zZWwuaGVhZCkpIHtcbiAgICAgICAgICAgIGNoYW5nZSA9IHsgc3RhcnQ6IHNlbC5mcm9tLCBlbmRBOiBzZWwudG8sIGVuZEI6IHNlbC50byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBhcnNlLnNlbCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWwgPSByZXNvbHZlU2VsZWN0aW9uKHZpZXcsIHZpZXcuc3RhdGUuZG9jLCBwYXJzZS5zZWwpO1xuICAgICAgICAgICAgICAgIGlmIChzZWwgJiYgIXNlbC5lcSh2aWV3LnN0YXRlLnNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb3ZlcndyaXRpbmcgYSBzZWxlY3Rpb24gYnkgdHlwaW5nIG1hdGNoZXNcbiAgICAvLyB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBzZWxlY3RlZCBjb250ZW50LCBjcmVhdGluZyBhIGNoYW5nZVxuICAgIC8vIHRoYXQncyBzbWFsbGVyIHRoYW4gd2hhdCB3YXMgYWN0dWFsbHkgb3ZlcndyaXR0ZW4uXG4gICAgaWYgKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJlxuICAgICAgICBjaGFuZ2Uuc3RhcnQgPT0gY2hhbmdlLmVuZEIgJiZcbiAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChjaGFuZ2Uuc3RhcnQgPiB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tICYmIGNoYW5nZS5zdGFydCA8PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tICsgMiAmJlxuICAgICAgICAgICAgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA+PSBwYXJzZS5mcm9tKSB7XG4gICAgICAgICAgICBjaGFuZ2Uuc3RhcnQgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoYW5nZS5lbmRBIDwgdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gJiYgY2hhbmdlLmVuZEEgPj0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byA8PSBwYXJzZS50bykge1xuICAgICAgICAgICAgY2hhbmdlLmVuZEIgKz0gKHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIC0gY2hhbmdlLmVuZEEpO1xuICAgICAgICAgICAgY2hhbmdlLmVuZEEgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50bztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJRTExIHdpbGwgaW5zZXJ0IGEgbm9uLWJyZWFraW5nIHNwYWNlIF9haGVhZF8gb2YgdGhlIHNwYWNlIGFmdGVyXG4gICAgLy8gdGhlIGN1cnNvciBzcGFjZSB3aGVuIGFkZGluZyBhIHNwYWNlIGJlZm9yZSBhbm90aGVyIHNwYWNlLiBXaGVuXG4gICAgLy8gdGhhdCBoYXBwZW5lZCwgYWRqdXN0IHRoZSBjaGFuZ2UgdG8gY292ZXIgdGhlIHNwYWNlIGluc3RlYWQuXG4gICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgY2hhbmdlLmVuZEIgPT0gY2hhbmdlLnN0YXJ0ICsgMSAmJlxuICAgICAgICBjaGFuZ2UuZW5kQSA9PSBjaGFuZ2Uuc3RhcnQgJiYgY2hhbmdlLnN0YXJ0ID4gcGFyc2UuZnJvbSAmJlxuICAgICAgICBwYXJzZS5kb2MudGV4dEJldHdlZW4oY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSAtIDEsIGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20gKyAxKSA9PSBcIiBcXHUwMGEwXCIpIHtcbiAgICAgICAgY2hhbmdlLnN0YXJ0LS07XG4gICAgICAgIGNoYW5nZS5lbmRBLS07XG4gICAgICAgIGNoYW5nZS5lbmRCLS07XG4gICAgfVxuICAgIGxldCAkZnJvbSA9IHBhcnNlLmRvYy5yZXNvbHZlTm9DYWNoZShjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJHRvID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSk7XG4gICAgbGV0ICRmcm9tQSA9IGRvYy5yZXNvbHZlKGNoYW5nZS5zdGFydCk7XG4gICAgbGV0IGlubGluZUNoYW5nZSA9ICRmcm9tLnNhbWVQYXJlbnQoJHRvKSAmJiAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCAmJiAkZnJvbUEuZW5kKCkgPj0gY2hhbmdlLmVuZEE7XG4gICAgbGV0IG5leHRTZWw7XG4gICAgLy8gSWYgdGhpcyBsb29rcyBsaWtlIHRoZSBlZmZlY3Qgb2YgcHJlc3NpbmcgRW50ZXIgKG9yIHdhcyByZWNvcmRlZFxuICAgIC8vIGFzIGJlaW5nIGFuIGlPUyBlbnRlciBwcmVzcyksIGp1c3QgZGlzcGF0Y2ggYW4gRW50ZXIga2V5IGluc3RlYWQuXG4gICAgaWYgKCgoaW9zICYmIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID4gRGF0ZS5ub3coKSAtIDIyNSAmJlxuICAgICAgICAoIWlubGluZUNoYW5nZSB8fCBhZGRlZE5vZGVzLnNvbWUobiA9PiBuLm5vZGVOYW1lID09IFwiRElWXCIgfHwgbi5ub2RlTmFtZSA9PSBcIlBcIikpKSB8fFxuICAgICAgICAoIWlubGluZUNoYW5nZSAmJiAkZnJvbS5wb3MgPCBwYXJzZS5kb2MuY29udGVudC5zaXplICYmXG4gICAgICAgICAgICAoISRmcm9tLnNhbWVQYXJlbnQoJHRvKSB8fCAhJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQpICYmXG4gICAgICAgICAgICAhL1xcUy8udGVzdChwYXJzZS5kb2MudGV4dEJldHdlZW4oJGZyb20ucG9zLCAkdG8ucG9zLCBcIlwiLCBcIlwiKSkgJiZcbiAgICAgICAgICAgIChuZXh0U2VsID0gU2VsZWN0aW9uLmZpbmRGcm9tKHBhcnNlLmRvYy5yZXNvbHZlKCRmcm9tLnBvcyArIDEpLCAxLCB0cnVlKSkgJiZcbiAgICAgICAgICAgIG5leHRTZWwuaGVhZCA+ICRmcm9tLnBvcykpICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCgxMywgXCJFbnRlclwiKSkpKSB7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID0gMDtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTYW1lIGZvciBiYWNrc3BhY2VcbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yID4gY2hhbmdlLnN0YXJ0ICYmXG4gICAgICAgIGxvb2tzTGlrZUJhY2tzcGFjZShkb2MsIGNoYW5nZS5zdGFydCwgY2hhbmdlLmVuZEEsICRmcm9tLCAkdG8pICYmXG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKSB7XG4gICAgICAgIGlmIChhbmRyb2lkICYmIGNocm9tZSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3VwcHJlc3NTZWxlY3Rpb25VcGRhdGVzKCk7IC8vICM4MjBcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDaHJvbWUgd2lsbCBvY2Nhc2lvbmFsbHksIGR1cmluZyBjb21wb3NpdGlvbiwgZGVsZXRlIHRoZVxuICAgIC8vIGVudGlyZSBjb21wb3NpdGlvbiBhbmQgdGhlbiBpbW1lZGlhdGVseSBpbnNlcnQgaXQgYWdhaW4uIFRoaXMgaXNcbiAgICAvLyB1c2VkIHRvIGRldGVjdCB0aGF0IHNpdHVhdGlvbi5cbiAgICBpZiAoY2hyb21lICYmIGNoYW5nZS5lbmRCID09IGNoYW5nZS5zdGFydClcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0Q2hyb21lRGVsZXRlID0gRGF0ZS5ub3coKTtcbiAgICAvLyBUaGlzIHRyaWVzIHRvIGRldGVjdCBBbmRyb2lkIHZpcnR1YWwga2V5Ym9hcmRcbiAgICAvLyBlbnRlci1hbmQtcGljay1zdWdnZXN0aW9uIGFjdGlvbi4gVGhhdCBzb21ldGltZXMgKHNlZSBpc3N1ZVxuICAgIC8vICMxMDU5KSBmaXJzdCBmaXJlcyBhIERPTSBtdXRhdGlvbiwgYmVmb3JlIG1vdmluZyB0aGUgc2VsZWN0aW9uIHRvXG4gICAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgYmxvY2suIEFuZCB0aGVuLCBiZWNhdXNlIFByb3NlTWlycm9yIGNsZWFucyB1cFxuICAgIC8vIHRoZSBET00gc2VsZWN0aW9uLCBpdCBnaXZlcyB1cCBtb3ZpbmcgdGhlIHNlbGVjdGlvbiBlbnRpcmVseSxcbiAgICAvLyBsZWF2aW5nIHRoZSBjdXJzb3IgaW4gdGhlIHdyb25nIHBsYWNlLiBXaGVuIHRoYXQgaGFwcGVucywgd2UgZHJvcFxuICAgIC8vIHRoZSBuZXcgcGFyYWdyYXBoIGZyb20gdGhlIGluaXRpYWwgY2hhbmdlLCBhbmQgZmlyZSBhIHNpbXVsYXRlZFxuICAgIC8vIGVudGVyIGtleSBhZnRlcndhcmRzLlxuICAgIGlmIChhbmRyb2lkICYmICFpbmxpbmVDaGFuZ2UgJiYgJGZyb20uc3RhcnQoKSAhPSAkdG8uc3RhcnQoKSAmJiAkdG8ucGFyZW50T2Zmc2V0ID09IDAgJiYgJGZyb20uZGVwdGggPT0gJHRvLmRlcHRoICYmXG4gICAgICAgIHBhcnNlLnNlbCAmJiBwYXJzZS5zZWwuYW5jaG9yID09IHBhcnNlLnNlbC5oZWFkICYmIHBhcnNlLnNlbC5oZWFkID09IGNoYW5nZS5lbmRBKSB7XG4gICAgICAgIGNoYW5nZS5lbmRCIC09IDI7XG4gICAgICAgICR0byA9IHBhcnNlLmRvYy5yZXNvbHZlTm9DYWNoZShjaGFuZ2UuZW5kQiAtIHBhcnNlLmZyb20pO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGZ1bmN0aW9uIChmKSB7IHJldHVybiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKTsgfSk7XG4gICAgICAgIH0sIDIwKTtcbiAgICB9XG4gICAgbGV0IGNoRnJvbSA9IGNoYW5nZS5zdGFydCwgY2hUbyA9IGNoYW5nZS5lbmRBO1xuICAgIGxldCB0ciwgc3RvcmVkTWFya3MsIG1hcmtDaGFuZ2U7XG4gICAgaWYgKGlubGluZUNoYW5nZSkge1xuICAgICAgICBpZiAoJGZyb20ucG9zID09ICR0by5wb3MpIHsgLy8gRGVsZXRpb25cbiAgICAgICAgICAgIC8vIElFMTEgc29tZXRpbWVzIHdlaXJkbHkgbW92ZXMgdGhlIERPTSBzZWxlY3Rpb24gYXJvdW5kIGFmdGVyXG4gICAgICAgICAgICAvLyBiYWNrc3BhY2luZyBvdXQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSB0ZXh0YmxvY2tcbiAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmICRmcm9tLnBhcmVudE9mZnNldCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGVjdGlvblRvRE9NKHZpZXcpLCAyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIuZGVsZXRlKGNoRnJvbSwgY2hUbyk7XG4gICAgICAgICAgICBzdG9yZWRNYXJrcyA9IGRvYy5yZXNvbHZlKGNoYW5nZS5zdGFydCkubWFya3NBY3Jvc3MoZG9jLnJlc29sdmUoY2hhbmdlLmVuZEEpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICggLy8gQWRkaW5nIG9yIHJlbW92aW5nIGEgbWFya1xuICAgICAgICBjaGFuZ2UuZW5kQSA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICAgICAgKG1hcmtDaGFuZ2UgPSBpc01hcmtDaGFuZ2UoJGZyb20ucGFyZW50LmNvbnRlbnQuY3V0KCRmcm9tLnBhcmVudE9mZnNldCwgJHRvLnBhcmVudE9mZnNldCksICRmcm9tQS5wYXJlbnQuY29udGVudC5jdXQoJGZyb21BLnBhcmVudE9mZnNldCwgY2hhbmdlLmVuZEEgLSAkZnJvbUEuc3RhcnQoKSkpKSkge1xuICAgICAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgICAgICAgICAgaWYgKG1hcmtDaGFuZ2UudHlwZSA9PSBcImFkZFwiKVxuICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoY2hGcm9tLCBjaFRvLCBtYXJrQ2hhbmdlLm1hcmspO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRyLnJlbW92ZU1hcmsoY2hGcm9tLCBjaFRvLCBtYXJrQ2hhbmdlLm1hcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCRmcm9tLnBhcmVudC5jaGlsZCgkZnJvbS5pbmRleCgpKS5pc1RleHQgJiYgJGZyb20uaW5kZXgoKSA9PSAkdG8uaW5kZXgoKSAtICgkdG8udGV4dE9mZnNldCA/IDAgOiAxKSkge1xuICAgICAgICAgICAgLy8gQm90aCBwb3NpdGlvbnMgaW4gdGhlIHNhbWUgdGV4dCBub2RlIC0tIHNpbXBseSBpbnNlcnQgdGV4dFxuICAgICAgICAgICAgbGV0IHRleHQgPSAkZnJvbS5wYXJlbnQudGV4dEJldHdlZW4oJGZyb20ucGFyZW50T2Zmc2V0LCAkdG8ucGFyZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlVGV4dElucHV0XCIsIGYgPT4gZih2aWV3LCBjaEZyb20sIGNoVG8sIHRleHQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHIuaW5zZXJ0VGV4dCh0ZXh0LCBjaEZyb20sIGNoVG8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghdHIpXG4gICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5yZXBsYWNlKGNoRnJvbSwgY2hUbywgcGFyc2UuZG9jLnNsaWNlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20sIGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSkpO1xuICAgIGlmIChwYXJzZS5zZWwpIHtcbiAgICAgICAgbGV0IHNlbCA9IHJlc29sdmVTZWxlY3Rpb24odmlldywgdHIuZG9jLCBwYXJzZS5zZWwpO1xuICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMsIGR1cmluZyBjb21wb3NpdGlvbiwgcmVwb3J0IHRoZVxuICAgICAgICAvLyBzZWxlY3Rpb24gaW4gdGhlIHdyb25nIHBsYWNlLiBJZiBpdCBsb29rcyBsaWtlIHRoYXQgaXNcbiAgICAgICAgLy8gaGFwcGVuaW5nLCBkb24ndCB1cGRhdGUgdGhlIHNlbGVjdGlvbi5cbiAgICAgICAgLy8gRWRnZSBqdXN0IGRvZXNuJ3QgbW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgd2hlbiB5b3Ugc3RhcnQgdHlwaW5nXG4gICAgICAgIC8vIGluIGFuIGVtcHR5IGJsb2NrIG9yIGJldHdlZW4gYnIgbm9kZXMuXG4gICAgICAgIGlmIChzZWwgJiYgIShjaHJvbWUgJiYgdmlldy5jb21wb3NpbmcgJiYgc2VsLmVtcHR5ICYmXG4gICAgICAgICAgICAoY2hhbmdlLnN0YXJ0ICE9IGNoYW5nZS5lbmRCIHx8IHZpZXcuaW5wdXQubGFzdENocm9tZURlbGV0ZSA8IERhdGUubm93KCkgLSAxMDApICYmXG4gICAgICAgICAgICAoc2VsLmhlYWQgPT0gY2hGcm9tIHx8IHNlbC5oZWFkID09IHRyLm1hcHBpbmcubWFwKGNoVG8pIC0gMSkgfHxcbiAgICAgICAgICAgIGllICYmIHNlbC5lbXB0eSAmJiBzZWwuaGVhZCA9PSBjaEZyb20pKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbCk7XG4gICAgfVxuICAgIGlmIChzdG9yZWRNYXJrcylcbiAgICAgICAgdHIuZW5zdXJlTWFya3Moc3RvcmVkTWFya3MpO1xuICAgIGlmIChjb21wb3NpdGlvbklEKVxuICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVTZWxlY3Rpb24odmlldywgZG9jLCBwYXJzZWRTZWwpIHtcbiAgICBpZiAoTWF0aC5tYXgocGFyc2VkU2VsLmFuY2hvciwgcGFyc2VkU2VsLmhlYWQpID4gZG9jLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHNlbGVjdGlvbkJldHdlZW4odmlldywgZG9jLnJlc29sdmUocGFyc2VkU2VsLmFuY2hvciksIGRvYy5yZXNvbHZlKHBhcnNlZFNlbC5oZWFkKSk7XG59XG4vLyBHaXZlbiB0d28gc2FtZS1sZW5ndGgsIG5vbi1lbXB0eSBmcmFnbWVudHMgb2YgaW5saW5lIGNvbnRlbnQsXG4vLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgZmlyc3QgY291bGQgYmUgY3JlYXRlZCBmcm9tIHRoZSBzZWNvbmQgYnlcbi8vIHJlbW92aW5nIG9yIGFkZGluZyBhIHNpbmdsZSBtYXJrIHR5cGUuXG5mdW5jdGlvbiBpc01hcmtDaGFuZ2UoY3VyLCBwcmV2KSB7XG4gICAgbGV0IGN1ck1hcmtzID0gY3VyLmZpcnN0Q2hpbGQubWFya3MsIHByZXZNYXJrcyA9IHByZXYuZmlyc3RDaGlsZC5tYXJrcztcbiAgICBsZXQgYWRkZWQgPSBjdXJNYXJrcywgcmVtb3ZlZCA9IHByZXZNYXJrcywgdHlwZSwgbWFyaywgdXBkYXRlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldk1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICBhZGRlZCA9IHByZXZNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KGFkZGVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ck1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICByZW1vdmVkID0gY3VyTWFya3NbaV0ucmVtb3ZlRnJvbVNldChyZW1vdmVkKTtcbiAgICBpZiAoYWRkZWQubGVuZ3RoID09IDEgJiYgcmVtb3ZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICBtYXJrID0gYWRkZWRbMF07XG4gICAgICAgIHR5cGUgPSBcImFkZFwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsuYWRkVG9TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhZGRlZC5sZW5ndGggPT0gMCAmJiByZW1vdmVkLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIG1hcmsgPSByZW1vdmVkWzBdO1xuICAgICAgICB0eXBlID0gXCJyZW1vdmVcIjtcbiAgICAgICAgdXBkYXRlID0gKG5vZGUpID0+IG5vZGUubWFyayhtYXJrLnJlbW92ZUZyb21TZXQobm9kZS5tYXJrcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB1cGRhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgdXBkYXRlZC5wdXNoKHVwZGF0ZShwcmV2LmNoaWxkKGkpKSk7XG4gICAgaWYgKEZyYWdtZW50LmZyb20odXBkYXRlZCkuZXEoY3VyKSlcbiAgICAgICAgcmV0dXJuIHsgbWFyaywgdHlwZSB9O1xufVxuZnVuY3Rpb24gbG9va3NMaWtlQmFja3NwYWNlKG9sZCwgc3RhcnQsIGVuZCwgJG5ld1N0YXJ0LCAkbmV3RW5kKSB7XG4gICAgaWYgKCAvLyBUaGUgY29udGVudCBtdXN0IGhhdmUgc2hydW5rXG4gICAgZW5kIC0gc3RhcnQgPD0gJG5ld0VuZC5wb3MgLSAkbmV3U3RhcnQucG9zIHx8XG4gICAgICAgIC8vIG5ld0VuZCBtdXN0IHBvaW50IGRpcmVjdGx5IGF0IG9yIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJsb2NrIHRoYXQgbmV3U3RhcnQgcG9pbnRzIGludG9cbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXdTdGFydCwgdHJ1ZSwgZmFsc2UpIDwgJG5ld0VuZC5wb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHN0YXJ0ID0gb2xkLnJlc29sdmUoc3RhcnQpO1xuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSwgcmF0aGVyIHRoYW4gam9pbmluZyBibG9ja3MsIHRoZSBjaGFuZ2UganVzdCByZW1vdmVkIGFuIGVudGlyZSBibG9ja1xuICAgIGlmICghJG5ld1N0YXJ0LnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBsZXQgYWZ0ZXIgPSAkc3RhcnQubm9kZUFmdGVyO1xuICAgICAgICByZXR1cm4gYWZ0ZXIgIT0gbnVsbCAmJiBlbmQgPT0gc3RhcnQgKyBhZnRlci5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLy8gU3RhcnQgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIGEgYmxvY2tcbiAgICBpZiAoJHN0YXJ0LnBhcmVudE9mZnNldCA8ICRzdGFydC5wYXJlbnQuY29udGVudC5zaXplIHx8ICEkc3RhcnQucGFyZW50LmlzVGV4dGJsb2NrKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRuZXh0ID0gb2xkLnJlc29sdmUoc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRzdGFydCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgIC8vIFRoZSBuZXh0IHRleHRibG9jayBtdXN0IHN0YXJ0IGJlZm9yZSBlbmQgYW5kIGVuZCBuZWFyIGl0XG4gICAgaWYgKCEkbmV4dC5wYXJlbnQuaXNUZXh0YmxvY2sgfHwgJG5leHQucG9zID4gZW5kIHx8XG4gICAgICAgIHNraXBDbG9zaW5nQW5kT3BlbmluZygkbmV4dCwgdHJ1ZSwgZmFsc2UpIDwgZW5kKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gVGhlIGZyYWdtZW50cyBhZnRlciB0aGUgam9pbiBwb2ludCBtdXN0IG1hdGNoXG4gICAgcmV0dXJuICRuZXdTdGFydC5wYXJlbnQuY29udGVudC5jdXQoJG5ld1N0YXJ0LnBhcmVudE9mZnNldCkuZXEoJG5leHQucGFyZW50LmNvbnRlbnQpO1xufVxuZnVuY3Rpb24gc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRwb3MsIGZyb21FbmQsIG1heU9wZW4pIHtcbiAgICBsZXQgZGVwdGggPSAkcG9zLmRlcHRoLCBlbmQgPSBmcm9tRW5kID8gJHBvcy5lbmQoKSA6ICRwb3MucG9zO1xuICAgIHdoaWxlIChkZXB0aCA+IDAgJiYgKGZyb21FbmQgfHwgJHBvcy5pbmRleEFmdGVyKGRlcHRoKSA9PSAkcG9zLm5vZGUoZGVwdGgpLmNoaWxkQ291bnQpKSB7XG4gICAgICAgIGRlcHRoLS07XG4gICAgICAgIGVuZCsrO1xuICAgICAgICBmcm9tRW5kID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXlPcGVuKSB7XG4gICAgICAgIGxldCBuZXh0ID0gJHBvcy5ub2RlKGRlcHRoKS5tYXliZUNoaWxkKCRwb3MuaW5kZXhBZnRlcihkZXB0aCkpO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAhbmV4dC5pc0xlYWYpIHtcbiAgICAgICAgICAgIG5leHQgPSBuZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBlbmQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5kO1xufVxuZnVuY3Rpb24gZmluZERpZmYoYSwgYiwgcG9zLCBwcmVmZXJyZWRQb3MsIHByZWZlcnJlZFNpZGUpIHtcbiAgICBsZXQgc3RhcnQgPSBhLmZpbmREaWZmU3RhcnQoYiwgcG9zKTtcbiAgICBpZiAoc3RhcnQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHsgYTogZW5kQSwgYjogZW5kQiB9ID0gYS5maW5kRGlmZkVuZChiLCBwb3MgKyBhLnNpemUsIHBvcyArIGIuc2l6ZSk7XG4gICAgaWYgKHByZWZlcnJlZFNpZGUgPT0gXCJlbmRcIikge1xuICAgICAgICBsZXQgYWRqdXN0ID0gTWF0aC5tYXgoMCwgc3RhcnQgLSBNYXRoLm1pbihlbmRBLCBlbmRCKSk7XG4gICAgICAgIHByZWZlcnJlZFBvcyAtPSBlbmRBICsgYWRqdXN0IC0gc3RhcnQ7XG4gICAgfVxuICAgIGlmIChlbmRBIDwgc3RhcnQgJiYgYS5zaXplIDwgYi5zaXplKSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IHN0YXJ0ICYmIHByZWZlcnJlZFBvcyA+PSBlbmRBID8gc3RhcnQgLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBzdGFydCAtPSBtb3ZlO1xuICAgICAgICBpZiAoc3RhcnQgJiYgc3RhcnQgPCBiLnNpemUgJiYgaXNTdXJyb2dhdGVQYWlyKGIudGV4dEJldHdlZW4oc3RhcnQgLSAxLCBzdGFydCArIDEpKSlcbiAgICAgICAgICAgIHN0YXJ0ICs9IG1vdmUgPyAxIDogLTE7XG4gICAgICAgIGVuZEIgPSBzdGFydCArIChlbmRCIC0gZW5kQSk7XG4gICAgICAgIGVuZEEgPSBzdGFydDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZW5kQiA8IHN0YXJ0KSB7XG4gICAgICAgIGxldCBtb3ZlID0gcHJlZmVycmVkUG9zIDw9IHN0YXJ0ICYmIHByZWZlcnJlZFBvcyA+PSBlbmRCID8gc3RhcnQgLSBwcmVmZXJyZWRQb3MgOiAwO1xuICAgICAgICBzdGFydCAtPSBtb3ZlO1xuICAgICAgICBpZiAoc3RhcnQgJiYgc3RhcnQgPCBhLnNpemUgJiYgaXNTdXJyb2dhdGVQYWlyKGEudGV4dEJldHdlZW4oc3RhcnQgLSAxLCBzdGFydCArIDEpKSlcbiAgICAgICAgICAgIHN0YXJ0ICs9IG1vdmUgPyAxIDogLTE7XG4gICAgICAgIGVuZEEgPSBzdGFydCArIChlbmRBIC0gZW5kQik7XG4gICAgICAgIGVuZEIgPSBzdGFydDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZEEsIGVuZEIgfTtcbn1cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihzdHIpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCAhPSAyKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGEgPSBzdHIuY2hhckNvZGVBdCgwKSwgYiA9IHN0ci5jaGFyQ29kZUF0KDEpO1xuICAgIHJldHVybiBhID49IDB4REMwMCAmJiBhIDw9IDB4REZGRiAmJiBiID49IDB4RDgwMCAmJiBiIDw9IDB4REJGRjtcbn1cblxuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX3BhcnNlRnJvbUNsaXBib2FyZCA9IHBhcnNlRnJvbUNsaXBib2FyZDtcbi8qKlxuQGludGVybmFsXG4qL1xuY29uc3QgX19lbmRDb21wb3NpdGlvbiA9IGVuZENvbXBvc2l0aW9uO1xuLyoqXG5BbiBlZGl0b3IgdmlldyBtYW5hZ2VzIHRoZSBET00gc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhblxuZWRpdGFibGUgZG9jdW1lbnQuIEl0cyBzdGF0ZSBhbmQgYmVoYXZpb3IgYXJlIGRldGVybWluZWQgYnkgaXRzXG5bcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzKS5cbiovXG5jbGFzcyBFZGl0b3JWaWV3IHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB2aWV3LiBgcGxhY2VgIG1heSBiZSBhIERPTSBub2RlIHRoYXQgdGhlIGVkaXRvciBzaG91bGRcbiAgICBiZSBhcHBlbmRlZCB0bywgYSBmdW5jdGlvbiB0aGF0IHdpbGwgcGxhY2UgaXQgaW50byB0aGUgZG9jdW1lbnQsXG4gICAgb3IgYW4gb2JqZWN0IHdob3NlIGBtb3VudGAgcHJvcGVydHkgaG9sZHMgdGhlIG5vZGUgdG8gdXNlIGFzIHRoZVxuICAgIGRvY3VtZW50IGNvbnRhaW5lci4gSWYgaXQgaXMgYG51bGxgLCB0aGUgZWRpdG9yIHdpbGwgbm90IGJlXG4gICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgY29uc3RydWN0b3IocGxhY2UsIHByb3BzKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgS2x1ZGdlIHVzZWQgdG8gd29yayBhcm91bmQgYSBDaHJvbWUgYnVnIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnRyYWNrV3JpdGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYXJrQ3Vyc29yID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmN1cnNvcldyYXBwZXIgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubGFzdFNlbGVjdGVkVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBJbnB1dFN0YXRlO1xuICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gW107XG4gICAgICAgIHRoaXMucGx1Z2luVmlld3MgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgIEhvbGRzIGB0cnVlYCB3aGVuIGEgaGFjayBub2RlIGlzIG5lZWRlZCBpbiBGaXJlZm94IHRvIHByZXZlbnQgdGhlXG4gICAgICAgIFtzcGFjZSBpcyBlYXRlbiBpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1Byb3NlTWlycm9yL3Byb3NlbWlycm9yL2lzc3Vlcy82NTEpXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlcXVpcmVzR2Vja29IYWNrTm9kZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgV2hlbiBlZGl0b3IgY29udGVudCBpcyBiZWluZyBkcmFnZ2VkLCB0aGlzIG9iamVjdCBjb250YWluc1xuICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ2dlZCBzbGljZSBhbmQgd2hldGhlciBpdCBpcyBiZWluZ1xuICAgICAgICBjb3BpZWQgb3IgbW92ZWQuIEF0IGFueSBvdGhlciB0aW1lLCBpdCBpcyBudWxsLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHByb3BzLnN0YXRlO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zIHx8IFtdO1xuICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kb20gPSAocGxhY2UgJiYgcGxhY2UubW91bnQpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGlmIChwbGFjZSkge1xuICAgICAgICAgICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKVxuICAgICAgICAgICAgICAgIHBsYWNlLmFwcGVuZENoaWxkKHRoaXMuZG9tKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwbGFjZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcGxhY2UodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAocGxhY2UubW91bnQpXG4gICAgICAgICAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIHRoaXMubm9kZVZpZXdzID0gYnVpbGROb2RlVmlld3ModGhpcyk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IGRvY1ZpZXdEZXNjKHRoaXMuc3RhdGUuZG9jLCBjb21wdXRlRG9jRGVjbyh0aGlzKSwgdmlld0RlY29yYXRpb25zKHRoaXMpLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIodGhpcywgKGZyb20sIHRvLCB0eXBlT3ZlciwgYWRkZWQpID0+IHJlYWRET01DaGFuZ2UodGhpcywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIGluaXRJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cygpO1xuICAgIH1cbiAgICAvKipcbiAgICBIb2xkcyBgdHJ1ZWAgd2hlbiBhXG4gICAgW2NvbXBvc2l0aW9uXShodHRwczovL3czYy5naXRodWIuaW8vdWlldmVudHMvI2V2ZW50cy1jb21wb3NpdGlvbmV2ZW50cylcbiAgICBpcyBhY3RpdmUuXG4gICAgKi9cbiAgICBnZXQgY29tcG9zaW5nKCkgeyByZXR1cm4gdGhpcy5pbnB1dC5jb21wb3Npbmc7IH1cbiAgICAvKipcbiAgICBUaGUgdmlldydzIGN1cnJlbnQgW3Byb3BzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcykuXG4gICAgKi9cbiAgICBnZXQgcHJvcHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcm9wcy5zdGF0ZSAhPSB0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuX3Byb3BzO1xuICAgICAgICAgICAgdGhpcy5fcHJvcHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJldilcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wc1tuYW1lXSA9IHByZXZbbmFtZV07XG4gICAgICAgICAgICB0aGlzLl9wcm9wcy5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BzO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcncyBwcm9wcy4gV2lsbCBpbW1lZGlhdGVseSBjYXVzZSBhbiB1cGRhdGUgdG9cbiAgICB0aGUgRE9NLlxuICAgICovXG4gICAgdXBkYXRlKHByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wcy5oYW5kbGVET01FdmVudHMgIT0gdGhpcy5fcHJvcHMuaGFuZGxlRE9NRXZlbnRzKVxuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBsZXQgcHJldlByb3BzID0gdGhpcy5fcHJvcHM7XG4gICAgICAgIHRoaXMuX3Byb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChwcm9wcy5wbHVnaW5zKSB7XG4gICAgICAgICAgICBwcm9wcy5wbHVnaW5zLmZvckVhY2goY2hlY2tTdGF0ZUNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdFBsdWdpbnMgPSBwcm9wcy5wbHVnaW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGVJbm5lcihwcm9wcy5zdGF0ZSwgcHJldlByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB2aWV3IGJ5IHVwZGF0aW5nIGV4aXN0aW5nIHByb3BzIG9iamVjdCB3aXRoIHRoZSBvYmplY3RcbiAgICBnaXZlbiBhcyBhcmd1bWVudC4gRXF1aXZhbGVudCB0byBgdmlldy51cGRhdGUoT2JqZWN0LmFzc2lnbih7fSxcbiAgICB2aWV3LnByb3BzLCBwcm9wcykpYC5cbiAgICAqL1xuICAgIHNldFByb3BzKHByb3BzKSB7XG4gICAgICAgIGxldCB1cGRhdGVkID0ge307XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gdGhpcy5fcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gdGhpcy5fcHJvcHNbbmFtZV07XG4gICAgICAgIHVwZGF0ZWQuc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKVxuICAgICAgICAgICAgdXBkYXRlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICB0aGlzLnVwZGF0ZSh1cGRhdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSBlZGl0b3IncyBgc3RhdGVgIHByb3AsIHdpdGhvdXQgdG91Y2hpbmcgYW55IG9mIHRoZVxuICAgIG90aGVyIHByb3BzLlxuICAgICovXG4gICAgdXBkYXRlU3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHN0YXRlLCB0aGlzLl9wcm9wcyk7XG4gICAgfVxuICAgIHVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHByZXZQcm9wcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5zdGF0ZSwgcmVkcmF3ID0gZmFsc2UsIHVwZGF0ZVNlbCA9IGZhbHNlO1xuICAgICAgICAvLyBXaGVuIHN0b3JlZCBtYXJrcyBhcmUgYWRkZWQsIHN0b3AgY29tcG9zaXRpb24sIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgLy8gYmUgZGlzcGxheWVkLlxuICAgICAgICBpZiAoc3RhdGUuc3RvcmVkTWFya3MgJiYgdGhpcy5jb21wb3NpbmcpIHtcbiAgICAgICAgICAgIGNsZWFyQ29tcG9zaXRpb24odGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgbGV0IHBsdWdpbnNDaGFuZ2VkID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucztcbiAgICAgICAgaWYgKHBsdWdpbnNDaGFuZ2VkIHx8IHRoaXMuX3Byb3BzLnBsdWdpbnMgIT0gcHJldlByb3BzLnBsdWdpbnMgfHwgdGhpcy5fcHJvcHMubm9kZVZpZXdzICE9IHByZXZQcm9wcy5ub2RlVmlld3MpIHtcbiAgICAgICAgICAgIGxldCBub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkTm9kZVZpZXdzKG5vZGVWaWV3cywgdGhpcy5ub2RlVmlld3MpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBub2RlVmlld3M7XG4gICAgICAgICAgICAgICAgcmVkcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgcHJldlByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpIHtcbiAgICAgICAgICAgIGVuc3VyZUxpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRhYmxlID0gZ2V0RWRpdGFibGUodGhpcyk7XG4gICAgICAgIHVwZGF0ZUN1cnNvcldyYXBwZXIodGhpcyk7XG4gICAgICAgIGxldCBpbm5lckRlY28gPSB2aWV3RGVjb3JhdGlvbnModGhpcyksIG91dGVyRGVjbyA9IGNvbXB1dGVEb2NEZWNvKHRoaXMpO1xuICAgICAgICBsZXQgc2Nyb2xsID0gcHJldi5wbHVnaW5zICE9IHN0YXRlLnBsdWdpbnMgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykgPyBcInJlc2V0XCJcbiAgICAgICAgICAgIDogc3RhdGUuc2Nyb2xsVG9TZWxlY3Rpb24gPiBwcmV2LnNjcm9sbFRvU2VsZWN0aW9uID8gXCJ0byBzZWxlY3Rpb25cIiA6IFwicHJlc2VydmVcIjtcbiAgICAgICAgbGV0IHVwZGF0ZURvYyA9IHJlZHJhdyB8fCAhdGhpcy5kb2NWaWV3Lm1hdGNoZXNOb2RlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28pO1xuICAgICAgICBpZiAodXBkYXRlRG9jIHx8ICFzdGF0ZS5zZWxlY3Rpb24uZXEocHJldi5zZWxlY3Rpb24pKVxuICAgICAgICAgICAgdXBkYXRlU2VsID0gdHJ1ZTtcbiAgICAgICAgbGV0IG9sZFNjcm9sbFBvcyA9IHNjcm9sbCA9PSBcInByZXNlcnZlXCIgJiYgdXBkYXRlU2VsICYmIHRoaXMuZG9tLnN0eWxlLm92ZXJmbG93QW5jaG9yID09IG51bGwgJiYgc3RvcmVTY3JvbGxQb3ModGhpcyk7XG4gICAgICAgIGlmICh1cGRhdGVTZWwpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYW4gaXNzdWUgaW4gQ2hyb21lLCBJRSwgYW5kIEVkZ2Ugd2hlcmUgY2hhbmdpbmdcbiAgICAgICAgICAgIC8vIHRoZSBET00gYXJvdW5kIGFuIGFjdGl2ZSBzZWxlY3Rpb24gcHV0cyBpdCBpbnRvIGEgYnJva2VuXG4gICAgICAgICAgICAvLyBzdGF0ZSB3aGVyZSB0aGUgdGhpbmcgdGhlIHVzZXIgc2VlcyBkaWZmZXJzIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24gcmVwb3J0ZWQgYnkgdGhlIFNlbGVjdGlvbiBvYmplY3QgKCM3MTAsICM5NzMsXG4gICAgICAgICAgICAvLyAjMTAxMSwgIzEwMTMsICMxMDM1KS5cbiAgICAgICAgICAgIGxldCBmb3JjZVNlbFVwZGF0ZSA9IHVwZGF0ZURvYyAmJiAoaWUgfHwgY2hyb21lKSAmJiAhdGhpcy5jb21wb3NpbmcgJiZcbiAgICAgICAgICAgICAgICAhcHJldi5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChwcmV2LnNlbGVjdGlvbiwgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVEb2MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSB0aGF0IHRoZSBzZWxlY3Rpb24gcG9pbnRzIGludG8gaXMgd3JpdHRlbiB0byxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgc29tZXRpbWVzIHN0YXJ0cyBtaXNyZXBvcnRpbmcgdGhlIHNlbGVjdGlvbiwgc28gdGhpc1xuICAgICAgICAgICAgICAgIC8vIHRyYWNrcyB0aGF0IGFuZCBmb3JjZXMgYSBzZWxlY3Rpb24gcmVzZXQgd2hlbiBvdXIgdXBkYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlkIHdyaXRlIHRvIHRoZSBub2RlLlxuICAgICAgICAgICAgICAgIGxldCBjaHJvbWVLbHVkZ2UgPSBjaHJvbWUgPyAodGhpcy50cmFja1dyaXRlcyA9IHRoaXMuZG9tU2VsZWN0aW9uUmFuZ2UoKS5mb2N1c05vZGUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wb3NpbmcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQuY29tcG9zaXRpb25Ob2RlID0gZmluZENvbXBvc2l0aW9uTm9kZSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcudXBkYXRlKHN0YXRlLmRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3ID0gZG9jVmlld0Rlc2Moc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbywgdGhpcy5kb20sIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hyb21lS2x1ZGdlICYmICF0aGlzLnRyYWNrV3JpdGVzKVxuICAgICAgICAgICAgICAgICAgICBmb3JjZVNlbFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBmb3IgYW4gaXNzdWUgd2hlcmUgYW4gdXBkYXRlIGFycml2aW5nIHJpZ2h0IGJldHdlZW5cbiAgICAgICAgICAgIC8vIGEgRE9NIHNlbGVjdGlvbiBjaGFuZ2UgYW5kIHRoZSBcInNlbGVjdGlvbmNoYW5nZVwiIGV2ZW50IGZvciBpdFxuICAgICAgICAgICAgLy8gY2FuIGNhdXNlIGEgc3B1cmlvdXMgRE9NIHNlbGVjdGlvbiB1cGRhdGUsIGRpc3J1cHRpbmcgbW91c2VcbiAgICAgICAgICAgIC8vIGRyYWcgc2VsZWN0aW9uLlxuICAgICAgICAgICAgaWYgKGZvcmNlU2VsVXBkYXRlIHx8XG4gICAgICAgICAgICAgICAgISh0aGlzLmlucHV0Lm1vdXNlRG93biAmJiB0aGlzLmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpKSAmJlxuICAgICAgICAgICAgICAgICAgICBhbmNob3JJblJpZ2h0UGxhY2UodGhpcykpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odGhpcywgZm9yY2VTZWxVcGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3luY05vZGVTZWxlY3Rpb24odGhpcywgc3RhdGUuc2VsZWN0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlUGx1Z2luVmlld3MocHJldik7XG4gICAgICAgIGlmICgoKF9hID0gdGhpcy5kcmFnZ2luZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICYmICFwcmV2LmRvYy5lcShzdGF0ZS5kb2MpKVxuICAgICAgICAgICAgdGhpcy51cGRhdGVEcmFnZ2VkTm9kZSh0aGlzLmRyYWdnaW5nLCBwcmV2KTtcbiAgICAgICAgaWYgKHNjcm9sbCA9PSBcInJlc2V0XCIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2Nyb2xsID09IFwidG8gc2VsZWN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvbGRTY3JvbGxQb3MpIHtcbiAgICAgICAgICAgIHJlc2V0U2Nyb2xsUG9zKG9sZFNjcm9sbFBvcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzY3JvbGxUb1NlbGVjdGlvbigpIHtcbiAgICAgICAgbGV0IHN0YXJ0RE9NID0gdGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpLmZvY3VzTm9kZTtcbiAgICAgICAgaWYgKCFzdGFydERPTSB8fCAhdGhpcy5kb20uY29udGFpbnMoc3RhcnRET00ubm9kZVR5cGUgPT0gMSA/IHN0YXJ0RE9NIDogc3RhcnRET00ucGFyZW50Tm9kZSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb21lUHJvcChcImhhbmRsZVNjcm9sbFRvU2VsZWN0aW9uXCIsIGYgPT4gZih0aGlzKSkpIDtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5kb2NWaWV3LmRvbUFmdGVyUG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmZyb20pO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbFJlY3RJbnRvVmlldyh0aGlzLCB0aGlzLmNvb3Jkc0F0UG9zKHRoaXMuc3RhdGUuc2VsZWN0aW9uLmhlYWQsIDEpLCBzdGFydERPTSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveVBsdWdpblZpZXdzKCkge1xuICAgICAgICBsZXQgdmlldztcbiAgICAgICAgd2hpbGUgKHZpZXcgPSB0aGlzLnBsdWdpblZpZXdzLnBvcCgpKVxuICAgICAgICAgICAgaWYgKHZpZXcuZGVzdHJveSlcbiAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdXBkYXRlUGx1Z2luVmlld3MocHJldlN0YXRlKSB7XG4gICAgICAgIGlmICghcHJldlN0YXRlIHx8IHByZXZTdGF0ZS5wbHVnaW5zICE9IHRoaXMuc3RhdGUucGx1Z2lucyB8fCB0aGlzLmRpcmVjdFBsdWdpbnMgIT0gdGhpcy5wcmV2RGlyZWN0UGx1Z2lucykge1xuICAgICAgICAgICAgdGhpcy5wcmV2RGlyZWN0UGx1Z2lucyA9IHRoaXMuZGlyZWN0UGx1Z2lucztcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGlyZWN0UGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmRpcmVjdFBsdWdpbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5zcGVjLnZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luVmlld3MucHVzaChwbHVnaW4uc3BlYy52aWV3KHRoaXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5wbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuc3RhdGUucGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBsdWdpblZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpblZpZXcgPSB0aGlzLnBsdWdpblZpZXdzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW5WaWV3LnVwZGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgcGx1Z2luVmlldy51cGRhdGUodGhpcywgcHJldlN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEcmFnZ2VkTm9kZShkcmFnZ2luZywgcHJldikge1xuICAgICAgICBsZXQgc2VsID0gZHJhZ2dpbmcubm9kZSwgZm91bmQgPSAtMTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZG9jLm5vZGVBdChzZWwuZnJvbSkgPT0gc2VsLm5vZGUpIHtcbiAgICAgICAgICAgIGZvdW5kID0gc2VsLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbW92ZWRQb3MgPSBzZWwuZnJvbSArICh0aGlzLnN0YXRlLmRvYy5jb250ZW50LnNpemUgLSBwcmV2LmRvYy5jb250ZW50LnNpemUpO1xuICAgICAgICAgICAgbGV0IG1vdmVkID0gbW92ZWRQb3MgPiAwICYmIHRoaXMuc3RhdGUuZG9jLm5vZGVBdChtb3ZlZFBvcyk7XG4gICAgICAgICAgICBpZiAobW92ZWQgPT0gc2VsLm5vZGUpXG4gICAgICAgICAgICAgICAgZm91bmQgPSBtb3ZlZFBvcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IERyYWdnaW5nKGRyYWdnaW5nLnNsaWNlLCBkcmFnZ2luZy5tb3ZlLCBmb3VuZCA8IDAgPyB1bmRlZmluZWQgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0aGlzLnN0YXRlLmRvYywgZm91bmQpKTtcbiAgICB9XG4gICAgc29tZVByb3AocHJvcE5hbWUsIGYpIHtcbiAgICAgICAgbGV0IHByb3AgPSB0aGlzLl9wcm9wcyAmJiB0aGlzLl9wcm9wc1twcm9wTmFtZV0sIHZhbHVlO1xuICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcHJvcCA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwbHVnaW5zID0gdGhpcy5zdGF0ZS5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2lucylcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wID0gcGx1Z2luc1tpXS5wcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCAmJiAodmFsdWUgPSBmID8gZihwcm9wKSA6IHByb3ApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIHZpZXcgaGFzIGZvY3VzLlxuICAgICovXG4gICAgaGFzRm9jdXMoKSB7XG4gICAgICAgIC8vIFdvcmsgYXJvdW5kIElFIG5vdCBoYW5kbGluZyBmb2N1cyBjb3JyZWN0bHkgaWYgcmVzaXplIGhhbmRsZXMgYXJlIHNob3duLlxuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhbiBlbGVtZW50IHdpdGggcmVzaXplIGhhbmRsZXMsIGFjdGl2ZUVsZW1lbnRcbiAgICAgICAgLy8gd2lsbCBiZSB0aGF0IGVsZW1lbnQgaW5zdGVhZCBvZiB0aGlzLmRvbS5cbiAgICAgICAgaWYgKGllKSB7XG4gICAgICAgICAgICAvLyBJZiBhY3RpdmVFbGVtZW50IGlzIHdpdGhpbiB0aGlzLmRvbSwgYW5kIHRoZXJlIGFyZSBubyBvdGhlciBlbGVtZW50c1xuICAgICAgICAgICAgLy8gc2V0dGluZyBgY29udGVudGVkaXRhYmxlYCB0byBmYWxzZSBpbiBiZXR3ZWVuLCB0cmVhdCBpdCBhcyBmb2N1c2VkLlxuICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLnJvb3QuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChub2RlID09IHRoaXMuZG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKCFub2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyhub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiB0aGlzLmRvbSAhPSBub2RlICYmIHRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudEVkaXRhYmxlID09ICdmYWxzZScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5hY3RpdmVFbGVtZW50ID09IHRoaXMuZG9tO1xuICAgIH1cbiAgICAvKipcbiAgICBGb2N1cyB0aGUgZWRpdG9yLlxuICAgICovXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSlcbiAgICAgICAgICAgIGZvY3VzUHJldmVudFNjcm9sbCh0aGlzLmRvbSk7XG4gICAgICAgIHNlbGVjdGlvblRvRE9NKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZG9jdW1lbnQgcm9vdCBpbiB3aGljaCB0aGUgZWRpdG9yIGV4aXN0cy4gVGhpcyB3aWxsXG4gICAgdXN1YWxseSBiZSB0aGUgdG9wLWxldmVsIGBkb2N1bWVudGAsIGJ1dCBtaWdodCBiZSBhIFtzaGFkb3dcbiAgICBET01dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1dlYl9Db21wb25lbnRzL1NoYWRvd19ET00pXG4gICAgcm9vdCBpZiB0aGUgZWRpdG9yIGlzIGluc2lkZSBvbmUuXG4gICAgKi9cbiAgICBnZXQgcm9vdCgpIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3Jvb3Q7XG4gICAgICAgIGlmIChjYWNoZWQgPT0gbnVsbClcbiAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IHRoaXMuZG9tLnBhcmVudE5vZGU7IHNlYXJjaDsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLm5vZGVUeXBlID09IDkgfHwgKHNlYXJjaC5ub2RlVHlwZSA9PSAxMSAmJiBzZWFyY2guaG9zdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2guZ2V0U2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNlYXJjaCkuZ2V0U2VsZWN0aW9uID0gKCkgPT4gc2VhcmNoLm93bmVyRG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290ID0gc2VhcmNoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZCB8fCBkb2N1bWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiBhbiBleGlzdGluZyBlZGl0b3IgdmlldyBpcyBtb3ZlZCB0byBhIG5ldyBkb2N1bWVudCBvclxuICAgIHNoYWRvdyB0cmVlLCBjYWxsIHRoaXMgdG8gbWFrZSBpdCByZWNvbXB1dGUgaXRzIHJvb3QuXG4gICAgKi9cbiAgICB1cGRhdGVSb290KCkge1xuICAgICAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2l2ZW4gYSBwYWlyIG9mIHZpZXdwb3J0IGNvb3JkaW5hdGVzLCByZXR1cm4gdGhlIGRvY3VtZW50XG4gICAgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGVtLiBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuXG4gICAgY29vcmRpbmF0ZXMgYXJlbid0IGluc2lkZSBvZiB0aGUgZWRpdG9yLiBXaGVuIGFuIG9iamVjdCBpc1xuICAgIHJldHVybmVkLCBpdHMgYHBvc2AgcHJvcGVydHkgaXMgdGhlIHBvc2l0aW9uIG5lYXJlc3QgdG8gdGhlXG4gICAgY29vcmRpbmF0ZXMsIGFuZCBpdHMgYGluc2lkZWAgcHJvcGVydHkgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZVxuICAgIGlubmVyIG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gZmFsbHMgaW5zaWRlIG9mLCBvciAtMSBpZiBpdCBpcyBhdFxuICAgIHRoZSB0b3AgbGV2ZWwsIG5vdCBpbiBhbnkgbm9kZS5cbiAgICAqL1xuICAgIHBvc0F0Q29vcmRzKGNvb3Jkcykge1xuICAgICAgICByZXR1cm4gcG9zQXRDb29yZHModGhpcywgY29vcmRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIGF0IGEgZ2l2ZW4gZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgYGxlZnRgIGFuZCBgcmlnaHRgIHdpbGwgYmUgdGhlIHNhbWUgbnVtYmVyLCBhcyB0aGlzIHJldHVybnMgYVxuICAgIGZsYXQgY3Vyc29yLWlzaCByZWN0YW5nbGUuIElmIHRoZSBwb3NpdGlvbiBpcyBiZXR3ZWVuIHR3byB0aGluZ3NcbiAgICB0aGF0IGFyZW4ndCBkaXJlY3RseSBhZGphY2VudCwgYHNpZGVgIGRldGVybWluZXMgd2hpY2ggZWxlbWVudFxuICAgIGlzIHVzZWQuIFdoZW4gPCAwLCB0aGUgZWxlbWVudCBiZWZvcmUgdGhlIHBvc2l0aW9uIGlzIHVzZWQsXG4gICAgb3RoZXJ3aXNlIHRoZSBlbGVtZW50IGFmdGVyLlxuICAgICovXG4gICAgY29vcmRzQXRQb3MocG9zLCBzaWRlID0gMSkge1xuICAgICAgICByZXR1cm4gY29vcmRzQXRQb3ModGhpcywgcG9zLCBzaWRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgRE9NIHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGRvY3VtZW50XG4gICAgcG9zaXRpb24uIFdoZW4gYHNpZGVgIGlzIG5lZ2F0aXZlLCBmaW5kIHRoZSBwb3NpdGlvbiBhcyBjbG9zZSBhc1xuICAgIHBvc3NpYmxlIHRvIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgcG9zaXRpb24uIFdoZW4gcG9zaXRpdmUsXG4gICAgcHJlZmVyIHBvc2l0aW9ucyBjbG9zZSB0byB0aGUgY29udGVudCBhZnRlciB0aGUgcG9zaXRpb24uIFdoZW5cbiAgICB6ZXJvLCBwcmVmZXIgYXMgc2hhbGxvdyBhIHBvc2l0aW9uIGFzIHBvc3NpYmxlLlxuICAgIFxuICAgIE5vdGUgdGhhdCB5b3Ugc2hvdWxkICoqbm90KiogbXV0YXRlIHRoZSBlZGl0b3IncyBpbnRlcm5hbCBET00sXG4gICAgb25seSBpbnNwZWN0IGl0IChhbmQgZXZlbiB0aGF0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSkuXG4gICAgKi9cbiAgICBkb21BdFBvcyhwb3MsIHNpZGUgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY1ZpZXcuZG9tRnJvbVBvcyhwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRvY3VtZW50IG5vZGUgYWZ0ZXIgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24uIE1heSByZXR1cm4gYG51bGxgIHdoZW4gdGhlIHBvc2l0aW9uIGRvZXNuJ3QgcG9pbnRcbiAgICBpbiBmcm9udCBvZiBhIG5vZGUgb3IgaWYgdGhlIG5vZGUgaXMgaW5zaWRlIGFuIG9wYXF1ZSBub2RlIHZpZXcuXG4gICAgXG4gICAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhYmxlIHRvIGNhbGwgdGhpbmdzIGxpa2VcbiAgICBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0YCBvbiB0aGF0IERPTSBub2RlLiBEbyAqKm5vdCoqIG11dGF0ZSB0aGVcbiAgICBlZGl0b3IgRE9NIGRpcmVjdGx5LCBvciBhZGQgc3R5bGluZyB0aGlzIHdheSwgc2luY2UgdGhhdCB3aWxsIGJlXG4gICAgaW1tZWRpYXRlbHkgb3ZlcnJpZGVuIGJ5IHRoZSBlZGl0b3IgYXMgaXQgcmVkcmF3cyB0aGUgbm9kZS5cbiAgICAqL1xuICAgIG5vZGVET00ocG9zKSB7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy5kb2NWaWV3LmRlc2NBdChwb3MpO1xuICAgICAgICByZXR1cm4gZGVzYyA/IGRlc2Mubm9kZURPTSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBET01cbiAgICBwb3NpdGlvbi4gKFdoZW5ldmVyIHBvc3NpYmxlLCBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3BlY3QgdGhlXG4gICAgZG9jdW1lbnQgc3RydWN0dXJlIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBwb2tpbmcgYXJvdW5kIGluIHRoZVxuICAgIERPTSwgYnV0IHNvbWV0aW1lc+KAlGZvciBleGFtcGxlIHdoZW4gaW50ZXJwcmV0aW5nIGFuIGV2ZW50XG4gICAgdGFyZ2V04oCUeW91IGRvbid0IGhhdmUgYSBjaG9pY2UuKVxuICAgIFxuICAgIFRoZSBgYmlhc2AgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGluZmx1ZW5jZSB3aGljaCBzaWRlIG9mIGEgRE9NXG4gICAgbm9kZSB0byB1c2Ugd2hlbiB0aGUgcG9zaXRpb24gaXMgaW5zaWRlIGEgbGVhZiBub2RlLlxuICAgICovXG4gICAgcG9zQXRET00obm9kZSwgb2Zmc2V0LCBiaWFzID0gLTEpIHtcbiAgICAgICAgbGV0IHBvcyA9IHRoaXMuZG9jVmlldy5wb3NGcm9tRE9NKG5vZGUsIG9mZnNldCwgYmlhcyk7XG4gICAgICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRE9NIHBvc2l0aW9uIG5vdCBpbnNpZGUgdGhlIGVkaXRvclwiKTtcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBvdXQgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2sgd2hlblxuICAgIG1vdmluZyBpbiBhIGdpdmVuIGRpcmVjdGlvbi4gV2hlbiwgZm9yIGV4YW1wbGUsIGdpdmVuIGBcImxlZnRcImAsXG4gICAgaXQgd2lsbCByZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgbGVmdCBmcm9tIHRoZSBjdXJyZW50IGN1cnNvclxuICAgIHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoYXQgcG9zaXRpb24ncyBwYXJlbnQgdGV4dGJsb2NrLiBXaWxsIGFwcGx5XG4gICAgdG8gdGhlIHZpZXcncyBjdXJyZW50IHN0YXRlIGJ5IGRlZmF1bHQsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0b1xuICAgIHBhc3MgYSBkaWZmZXJlbnQgc3RhdGUuXG4gICAgKi9cbiAgICBlbmRPZlRleHRibG9jayhkaXIsIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBlbmRPZlRleHRibG9jayh0aGlzLCBzdGF0ZSB8fCB0aGlzLnN0YXRlLCBkaXIpO1xuICAgIH1cbiAgICAvKipcbiAgICBSdW4gdGhlIGVkaXRvcidzIHBhc3RlIGxvZ2ljIHdpdGggdGhlIGdpdmVuIEhUTUwgc3RyaW5nLiBUaGVcbiAgICBgZXZlbnRgLCBpZiBnaXZlbiwgd2lsbCBiZSBwYXNzZWQgdG8gdGhlXG4gICAgW2BoYW5kbGVQYXN0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLmhhbmRsZVBhc3RlKSBob29rLlxuICAgICovXG4gICAgcGFzdGVIVE1MKGh0bWwsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIFwiXCIsIGh0bWwsIGZhbHNlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gcGxhaW4tdGV4dCBpbnB1dC5cbiAgICAqL1xuICAgIHBhc3RlVGV4dCh0ZXh0LCBldmVudCkge1xuICAgICAgICByZXR1cm4gZG9QYXN0ZSh0aGlzLCB0ZXh0LCBudWxsLCB0cnVlLCBldmVudCB8fCBuZXcgQ2xpcGJvYXJkRXZlbnQoXCJwYXN0ZVwiKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gc2xpY2UgYXMgaXQgd291bGQgYmUgaWYgaXQgd2FzIGNvcGllZCBmcm9tXG4gICAgdGhpcyBlZGl0b3IuIFJldHVybnMgYSBET00gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFcbiAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2xpY2UgYXMgaXRzIGNoaWxkcmVuLCBhIHRleHR1YWxcbiAgICByZXByZXNlbnRhdGlvbiwgYW5kIHRoZSB0cmFuc2Zvcm1lZCBzbGljZSAod2hpY2ggY2FuIGJlXG4gICAgZGlmZmVyZW50IGZyb20gdGhlIGdpdmVuIGlucHV0IGR1ZSB0byBob29rcyBsaWtlXG4gICAgW2B0cmFuc2Zvcm1Db3BpZWRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcy50cmFuc2Zvcm1Db3BpZWQpKS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZUZvckNsaXBib2FyZChzbGljZSkge1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHRoaXMsIHNsaWNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlcyB0aGUgZWRpdG9yIGZyb20gdGhlIERPTSBhbmQgZGVzdHJveXMgYWxsIFtub2RlXG4gICAgdmlld3NdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3Lk5vZGVWaWV3KS5cbiAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5kb2NWaWV3KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZXN0cm95SW5wdXQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzdHJveVBsdWdpblZpZXdzKCk7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jVmlldy51cGRhdGUodGhpcy5zdGF0ZS5kb2MsIFtdLCB2aWV3RGVjb3JhdGlvbnModGhpcyksIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9jVmlldy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZG9jVmlldyA9IG51bGw7XG4gICAgICAgIGNsZWFyUmV1c2VkUmFuZ2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhpcyBpcyB0cnVlIHdoZW4gdGhlIHZpZXcgaGFzIGJlZW5cbiAgICBbZGVzdHJveWVkXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LmRlc3Ryb3kpIChhbmQgdGh1cyBzaG91bGQgbm90IGJlXG4gICAgdXNlZCBhbnltb3JlKS5cbiAgICAqL1xuICAgIGdldCBpc0Rlc3Ryb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldyA9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBVc2VkIGZvciB0ZXN0aW5nLlxuICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgIERpc3BhdGNoIGEgdHJhbnNhY3Rpb24uIFdpbGwgY2FsbFxuICAgIFtgZGlzcGF0Y2hUcmFuc2FjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRpcmVjdEVkaXRvclByb3BzLmRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgd2hlbiBnaXZlbiwgYW5kIG90aGVyd2lzZSBkZWZhdWx0cyB0byBhcHBseWluZyB0aGUgdHJhbnNhY3Rpb24gdG9cbiAgICB0aGUgY3VycmVudCBzdGF0ZSBhbmQgY2FsbGluZ1xuICAgIFtgdXBkYXRlU3RhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3LnVwZGF0ZVN0YXRlKSB3aXRoIHRoZSByZXN1bHQuXG4gICAgVGhpcyBtZXRob2QgaXMgYm91bmQgdG8gdGhlIHZpZXcgaW5zdGFuY2UsIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgZWFzaWx5IHBhc3NlZCBhcm91bmQuXG4gICAgKi9cbiAgICBkaXNwYXRjaCh0cikge1xuICAgICAgICBsZXQgZGlzcGF0Y2hUcmFuc2FjdGlvbiA9IHRoaXMuX3Byb3BzLmRpc3BhdGNoVHJhbnNhY3Rpb247XG4gICAgICAgIGlmIChkaXNwYXRjaFRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbi5jYWxsKHRoaXMsIHRyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh0aGlzLnN0YXRlLmFwcGx5KHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tU2VsZWN0aW9uUmFuZ2UoKSB7XG4gICAgICAgIGxldCBzZWwgPSB0aGlzLmRvbVNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoIXNlbClcbiAgICAgICAgICAgIHJldHVybiB7IGZvY3VzTm9kZTogbnVsbCwgZm9jdXNPZmZzZXQ6IDAsIGFuY2hvck5vZGU6IG51bGwsIGFuY2hvck9mZnNldDogMCB9O1xuICAgICAgICByZXR1cm4gc2FmYXJpICYmIHRoaXMucm9vdC5ub2RlVHlwZSA9PT0gMTEgJiZcbiAgICAgICAgICAgIGRlZXBBY3RpdmVFbGVtZW50KHRoaXMuZG9tLm93bmVyRG9jdW1lbnQpID09IHRoaXMuZG9tICYmIHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHRoaXMsIHNlbCkgfHwgc2VsO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRvbVNlbGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5nZXRTZWxlY3Rpb24oKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlRG9jRGVjbyh2aWV3KSB7XG4gICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBhdHRycy5jbGFzcyA9IFwiUHJvc2VNaXJyb3JcIjtcbiAgICBhdHRycy5jb250ZW50ZWRpdGFibGUgPSBTdHJpbmcodmlldy5lZGl0YWJsZSk7XG4gICAgdmlldy5zb21lUHJvcChcImF0dHJpYnV0ZXNcIiwgdmFsdWUgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUodmlldy5zdGF0ZSk7XG4gICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgIGZvciAobGV0IGF0dHIgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBcImNsYXNzXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLmNsYXNzICs9IFwiIFwiICsgdmFsdWVbYXR0cl07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ciA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLnN0eWxlID0gKGF0dHJzLnN0eWxlID8gYXR0cnMuc3R5bGUgKyBcIjtcIiA6IFwiXCIpICsgdmFsdWVbYXR0cl07XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWF0dHJzW2F0dHJdICYmIGF0dHIgIT0gXCJjb250ZW50ZWRpdGFibGVcIiAmJiBhdHRyICE9IFwibm9kZU5hbWVcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0cl0gPSBTdHJpbmcodmFsdWVbYXR0cl0pO1xuICAgICAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghYXR0cnMudHJhbnNsYXRlKVxuICAgICAgICBhdHRycy50cmFuc2xhdGUgPSBcIm5vXCI7XG4gICAgcmV0dXJuIFtEZWNvcmF0aW9uLm5vZGUoMCwgdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplLCBhdHRycyldO1xufVxuZnVuY3Rpb24gdXBkYXRlQ3Vyc29yV3JhcHBlcih2aWV3KSB7XG4gICAgaWYgKHZpZXcubWFya0N1cnNvcikge1xuICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgICAgZG9tLmNsYXNzTmFtZSA9IFwiUHJvc2VNaXJyb3Itc2VwYXJhdG9yXCI7XG4gICAgICAgIGRvbS5zZXRBdHRyaWJ1dGUoXCJtYXJrLXBsYWNlaG9sZGVyXCIsIFwidHJ1ZVwiKTtcbiAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcImFsdFwiLCBcIlwiKTtcbiAgICAgICAgdmlldy5jdXJzb3JXcmFwcGVyID0geyBkb20sIGRlY286IERlY29yYXRpb24ud2lkZ2V0KHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20sIGRvbSwgeyByYXc6IHRydWUsIG1hcmtzOiB2aWV3Lm1hcmtDdXJzb3IgfSkgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXcuY3Vyc29yV3JhcHBlciA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0RWRpdGFibGUodmlldykge1xuICAgIHJldHVybiAhdmlldy5zb21lUHJvcChcImVkaXRhYmxlXCIsIHZhbHVlID0+IHZhbHVlKHZpZXcuc3RhdGUpID09PSBmYWxzZSk7XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25Db250ZXh0Q2hhbmdlZChzZWwxLCBzZWwyKSB7XG4gICAgbGV0IGRlcHRoID0gTWF0aC5taW4oc2VsMS4kYW5jaG9yLnNoYXJlZERlcHRoKHNlbDEuaGVhZCksIHNlbDIuJGFuY2hvci5zaGFyZWREZXB0aChzZWwyLmhlYWQpKTtcbiAgICByZXR1cm4gc2VsMS4kYW5jaG9yLnN0YXJ0KGRlcHRoKSAhPSBzZWwyLiRhbmNob3Iuc3RhcnQoZGVwdGgpO1xufVxuZnVuY3Rpb24gYnVpbGROb2RlVmlld3Modmlldykge1xuICAgIGxldCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIGFkZChvYmopIHtcbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBvYmopXG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHByb3ApKVxuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gICAgdmlldy5zb21lUHJvcChcIm5vZGVWaWV3c1wiLCBhZGQpO1xuICAgIHZpZXcuc29tZVByb3AoXCJtYXJrVmlld3NcIiwgYWRkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY2hhbmdlZE5vZGVWaWV3cyhhLCBiKSB7XG4gICAgbGV0IG5BID0gMCwgbkIgPSAwO1xuICAgIGZvciAobGV0IHByb3AgaW4gYSkge1xuICAgICAgICBpZiAoYVtwcm9wXSAhPSBiW3Byb3BdKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIG5BKys7XG4gICAgfVxuICAgIGZvciAobGV0IF8gaW4gYilcbiAgICAgICAgbkIrKztcbiAgICByZXR1cm4gbkEgIT0gbkI7XG59XG5mdW5jdGlvbiBjaGVja1N0YXRlQ29tcG9uZW50KHBsdWdpbikge1xuICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSB8fCBwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiB8fCBwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJQbHVnaW5zIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgdmlldyBtdXN0IG5vdCBoYXZlIGEgc3RhdGUgY29tcG9uZW50XCIpO1xufVxuXG5leHBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3LCBfX2VuZENvbXBvc2l0aW9uLCBfX3BhcnNlRnJvbUNsaXBib2FyZCB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiogSGlnaGVzdCBwb3NpdGl2ZSBzaWduZWQgMzItYml0IGZsb2F0IHZhbHVlICovXG5jb25zdCBtYXhJbnQgPSAyMTQ3NDgzNjQ3OyAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cbi8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cbmNvbnN0IGJhc2UgPSAzNjtcbmNvbnN0IHRNaW4gPSAxO1xuY29uc3QgdE1heCA9IDI2O1xuY29uc3Qgc2tldyA9IDM4O1xuY29uc3QgZGFtcCA9IDcwMDtcbmNvbnN0IGluaXRpYWxCaWFzID0gNzI7XG5jb25zdCBpbml0aWFsTiA9IDEyODsgLy8gMHg4MFxuY29uc3QgZGVsaW1pdGVyID0gJy0nOyAvLyAnXFx4MkQnXG5cbi8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5jb25zdCByZWdleFB1bnljb2RlID0gL154bi0tLztcbmNvbnN0IHJlZ2V4Tm9uQVNDSUkgPSAvW15cXDAtXFx4N0ZdLzsgLy8gTm90ZTogVSswMDdGIERFTCBpcyBleGNsdWRlZCB0b28uXG5jb25zdCByZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nOyAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cbi8qKiBFcnJvciBtZXNzYWdlcyAqL1xuY29uc3QgZXJyb3JzID0ge1xuXHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHQnaW52YWxpZC1pbnB1dCc6ICdJbnZhbGlkIGlucHV0J1xufTtcblxuLyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuY29uc3QgYmFzZU1pbnVzVE1pbiA9IGJhc2UgLSB0TWluO1xuY29uc3QgZmxvb3IgPSBNYXRoLmZsb29yO1xuY29uc3Qgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKlxuICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcbn1cblxuLyoqXG4gKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG4gKiBpdGVtLlxuICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXAoYXJyYXksIGNhbGxiYWNrKSB7XG5cdGNvbnN0IHJlc3VsdCA9IFtdO1xuXHRsZXQgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRyZXN1bHRbbGVuZ3RoXSA9IGNhbGxiYWNrKGFycmF5W2xlbmd0aF0pO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG4gKiBhZGRyZXNzZXMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuICogY2hhcmFjdGVyLlxuICogQHJldHVybnMge1N0cmluZ30gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKGRvbWFpbiwgY2FsbGJhY2spIHtcblx0Y29uc3QgcGFydHMgPSBkb21haW4uc3BsaXQoJ0AnKTtcblx0bGV0IHJlc3VsdCA9ICcnO1xuXHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdC8vIEluIGVtYWlsIGFkZHJlc3Nlcywgb25seSB0aGUgZG9tYWluIG5hbWUgc2hvdWxkIGJlIHB1bnljb2RlZC4gTGVhdmVcblx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdGRvbWFpbiA9IHBhcnRzWzFdO1xuXHR9XG5cdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0ZG9tYWluID0gZG9tYWluLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCAnXFx4MkUnKTtcblx0Y29uc3QgbGFiZWxzID0gZG9tYWluLnNwbGl0KCcuJyk7XG5cdGNvbnN0IGVuY29kZWQgPSBtYXAobGFiZWxzLCBjYWxsYmFjaykuam9pbignLicpO1xuXHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG4gKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG4gKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udmVydCBhIHBhaXIgb2Ygc3Vycm9nYXRlIGhhbHZlcyAoZWFjaCBvZiB3aGljaFxuICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG4gKiBtYXRjaGluZyBVVEYtMTYuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmVuY29kZWBcbiAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcbiAqIEBuYW1lIGRlY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGxldCBjb3VudGVyID0gMDtcblx0Y29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0Ly8gSXQncyBhIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3Rlci5cblx0XHRcdGNvbnN0IGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBMb3cgc3Vycm9nYXRlLlxuXHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSXQncyBhbiB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGVcblx0XHRcdFx0Ly8gbmV4dCBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuXG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0cmluZyBiYXNlZCBvbiBhbiBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZW5jb2RlXG4gKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuICovXG5jb25zdCB1Y3MyZW5jb2RlID0gY29kZVBvaW50cyA9PiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG4gKiBAc2VlIGBkaWdpdFRvQmFzaWMoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQgKGZvciB1c2UgaW5cbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcbiAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuICovXG5jb25zdCBiYXNpY1RvRGlnaXQgPSBmdW5jdGlvbihjb2RlUG9pbnQpIHtcblx0aWYgKGNvZGVQb2ludCA+PSAweDMwICYmIGNvZGVQb2ludCA8IDB4M0EpIHtcblx0XHRyZXR1cm4gMjYgKyAoY29kZVBvaW50IC0gMHgzMCk7XG5cdH1cblx0aWYgKGNvZGVQb2ludCA+PSAweDQxICYmIGNvZGVQb2ludCA8IDB4NUIpIHtcblx0XHRyZXR1cm4gY29kZVBvaW50IC0gMHg0MTtcblx0fVxuXHRpZiAoY29kZVBvaW50ID49IDB4NjEgJiYgY29kZVBvaW50IDwgMHg3Qikge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDYxO1xuXHR9XG5cdHJldHVybiBiYXNlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpZ2l0L2ludGVnZXIgaW50byBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gZGlnaXQgVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50LlxuICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3JcbiAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG4gKiBgMGAgdG8gYGJhc2UgLSAxYC4gSWYgYGZsYWdgIGlzIG5vbi16ZXJvLCB0aGUgdXBwZXJjYXNlIGZvcm0gaXNcbiAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG4gKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuICovXG5jb25zdCBkaWdpdFRvQmFzaWMgPSBmdW5jdGlvbihkaWdpdCwgZmxhZykge1xuXHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0cmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBhZGFwdCA9IGZ1bmN0aW9uKGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRsZXQgayA9IDA7XG5cdGRlbHRhID0gZmlyc3RUaW1lID8gZmxvb3IoZGVsdGEgLyBkYW1wKSA6IGRlbHRhID4+IDE7XG5cdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRkZWx0YSA9IGZsb29yKGRlbHRhIC8gYmFzZU1pbnVzVE1pbik7XG5cdH1cblx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scyB0byBhIHN0cmluZyBvZiBVbmljb2RlXG4gKiBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKi9cbmNvbnN0IGRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdC8vIERvbid0IHVzZSBVQ1MtMi5cblx0Y29uc3Qgb3V0cHV0ID0gW107XG5cdGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXHRsZXQgaSA9IDA7XG5cdGxldCBuID0gaW5pdGlhbE47XG5cdGxldCBiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG5cdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdGxldCBiYXNpYyA9IGlucHV0Lmxhc3RJbmRleE9mKGRlbGltaXRlcik7XG5cdGlmIChiYXNpYyA8IDApIHtcblx0XHRiYXNpYyA9IDA7XG5cdH1cblxuXHRmb3IgKGxldCBqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHQvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcblx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0fVxuXHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHR9XG5cblx0Ly8gTWFpbiBkZWNvZGluZyBsb29wOiBzdGFydCBqdXN0IGFmdGVyIHRoZSBsYXN0IGRlbGltaXRlciBpZiBhbnkgYmFzaWMgY29kZVxuXHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdGZvciAobGV0IGluZGV4ID0gYmFzaWMgPiAwID8gYmFzaWMgKyAxIDogMDsgaW5kZXggPCBpbnB1dExlbmd0aDsgLyogbm8gZmluYWwgZXhwcmVzc2lvbiAqLykge1xuXG5cdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHQvLyB3aGljaCBnZXRzIGFkZGVkIHRvIGBpYC4gVGhlIG92ZXJmbG93IGNoZWNraW5nIGlzIGVhc2llclxuXHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRjb25zdCBvbGRpID0gaTtcblx0XHRmb3IgKGxldCB3ID0gMSwgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cblx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UpIHtcblx0XHRcdFx0ZXJyb3IoJ2ludmFsaWQtaW5wdXQnKTtcblx0XHRcdH1cblx0XHRcdGlmIChkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPCB0KSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHR9XG5cblx0XHRjb25zdCBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcblx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0Ly8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcblx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHR9XG5cblx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdGkgJT0gb3V0O1xuXG5cdFx0Ly8gSW5zZXJ0IGBuYCBhdCBwb3NpdGlvbiBgaWAgb2YgdGhlIG91dHB1dC5cblx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0fVxuXG5cdHJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5vdXRwdXQpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMgKGUuZy4gYSBkb21haW4gbmFtZSBsYWJlbCkgdG8gYVxuICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICovXG5jb25zdCBlbmNvZGUgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblxuXHQvLyBDb252ZXJ0IHRoZSBpbnB1dCBpbiBVQ1MtMiB0byBhbiBhcnJheSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLlxuXHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdC8vIENhY2hlIHRoZSBsZW5ndGguXG5cdGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuXHRsZXQgbiA9IGluaXRpYWxOO1xuXHRsZXQgZGVsdGEgPSAwO1xuXHRsZXQgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHMuXG5cdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IDB4ODApIHtcblx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cdGxldCBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoO1xuXG5cdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0Ly8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cblx0aWYgKGJhc2ljTGVuZ3RoKSB7XG5cdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0fVxuXG5cdC8vIE1haW4gZW5jb2RpbmcgbG9vcDpcblx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHQvLyBsYXJnZXIgb25lOlxuXHRcdGxldCBtID0gbWF4SW50O1xuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHQvLyBidXQgZ3VhcmQgYWdhaW5zdCBvdmVyZmxvdy5cblx0XHRjb25zdCBoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0aWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcblx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdGRlbHRhICs9IChtIC0gbikgKiBoYW5kbGVkQ1BDb3VudFBsdXNPbmU7XG5cdFx0biA9IG07XG5cblx0XHRmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiBpbnB1dCkge1xuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA8IG4gJiYgKytkZWx0YSA+IG1heEludCkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT09IG4pIHtcblx0XHRcdFx0Ly8gUmVwcmVzZW50IGRlbHRhIGFzIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIuXG5cdFx0XHRcdGxldCBxID0gZGVsdGE7XG5cdFx0XHRcdGZvciAobGV0IGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdGNvbnN0IHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdGlmIChxIDwgdCkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHFNaW51c1QgPSBxIC0gdDtcblx0XHRcdFx0XHRjb25zdCBiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyBxTWludXNUICUgYmFzZU1pbnVzVCwgMCkpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT09IGJhc2ljTGVuZ3RoKTtcblx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdCsrZGVsdGE7XG5cdFx0KytuO1xuXG5cdH1cblx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG4gKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuICogY29udmVydCB0byBVbmljb2RlLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG4gKiBzdHJpbmcuXG4gKi9cbmNvbnN0IHRvVW5pY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0PyBkZWNvZGUoc3RyaW5nLnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVW5pY29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzcyB0b1xuICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG4gKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cbiAqIEFTQ0lJLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuICogVW5pY29kZSBzdHJpbmcuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG4gKiBlbWFpbCBhZGRyZXNzLlxuICovXG5jb25zdCB0b0FTQ0lJID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHQ/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpXG5cdFx0XHQ6IHN0cmluZztcblx0fSk7XG59O1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqIERlZmluZSB0aGUgcHVibGljIEFQSSAqL1xuY29uc3QgcHVueWNvZGUgPSB7XG5cdC8qKlxuXHQgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgUHVueWNvZGUuanMgdmVyc2lvbiBudW1iZXIuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBTdHJpbmdcblx0ICovXG5cdCd2ZXJzaW9uJzogJzIuMy4xJyxcblx0LyoqXG5cdCAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG5cdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHQndWNzMic6IHtcblx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHR9LFxuXHQnZGVjb2RlJzogZGVjb2RlLFxuXHQnZW5jb2RlJzogZW5jb2RlLFxuXHQndG9BU0NJSSc6IHRvQVNDSUksXG5cdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcbn07XG5cbmV4cG9ydCB7IHVjczJkZWNvZGUsIHVjczJlbmNvZGUsIGRlY29kZSwgZW5jb2RlLCB0b0FTQ0lJLCB0b1VuaWNvZGUgfTtcbmV4cG9ydCBkZWZhdWx0IHB1bnljb2RlO1xuIiwidmFyIEdPT0RfTEVBRl9TSVpFID0gMjAwO1xuXG4vLyA6OiBjbGFzczxUPiBBIHJvcGUgc2VxdWVuY2UgaXMgYSBwZXJzaXN0ZW50IHNlcXVlbmNlIGRhdGEgc3RydWN0dXJlXG4vLyB0aGF0IHN1cHBvcnRzIGFwcGVuZGluZywgcHJlcGVuZGluZywgYW5kIHNsaWNpbmcgd2l0aG91dCBkb2luZyBhXG4vLyBmdWxsIGNvcHkuIEl0IGlzIHJlcHJlc2VudGVkIGFzIGEgbW9zdGx5LWJhbGFuY2VkIHRyZWUuXG52YXIgUm9wZVNlcXVlbmNlID0gZnVuY3Rpb24gUm9wZVNlcXVlbmNlICgpIHt9O1xuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICBvdGhlciA9IFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKTtcblxuICByZXR1cm4gKCF0aGlzLmxlbmd0aCAmJiBvdGhlcikgfHxcbiAgICAob3RoZXIubGVuZ3RoIDwgR09PRF9MRUFGX1NJWkUgJiYgdGhpcy5sZWFmQXBwZW5kKG90aGVyKSkgfHxcbiAgICAodGhpcy5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiBvdGhlci5sZWFmUHJlcGVuZCh0aGlzKSkgfHxcbiAgICB0aGlzLmFwcGVuZElubmVyKG90aGVyKVxufTtcblxuLy8gOjogKHVuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+Pikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gUHJlcGVuZCBhbiBhcnJheSBvciBvdGhlciByb3BlIHRvIHRoaXMgb25lLCByZXR1cm5pbmcgYSBuZXcgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIHByZXBlbmQgKG90aGVyKSB7XG4gIGlmICghb3RoZXIubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgcmV0dXJuIFJvcGVTZXF1ZW5jZS5mcm9tKG90aGVyKS5hcHBlbmQodGhpcylcbn07XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kSW5uZXIgPSBmdW5jdGlvbiBhcHBlbmRJbm5lciAob3RoZXIpIHtcbiAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG59O1xuXG4vLyA6OiAoP251bWJlciwgP251bWJlcikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXBlc2VudGluZyBhIHN1Yi1zZXF1ZW5jZSBvZiB0aGlzIHJvcGUuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tID49IHRvKSB7IHJldHVybiBSb3BlU2VxdWVuY2UuZW1wdHkgfVxuICByZXR1cm4gdGhpcy5zbGljZUlubmVyKE1hdGgubWF4KDAsIGZyb20pLCBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdG8pKVxufTtcblxuLy8gOjogKG51bWJlcikg4oaSIFRcbi8vIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBmcm9tIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gIGlmIChpIDwgMCB8fCBpID49IHRoaXMubGVuZ3RoKSB7IHJldHVybiB1bmRlZmluZWQgfVxuICByZXR1cm4gdGhpcy5nZXRJbm5lcihpKVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSDihpIgP2Jvb2wsID9udW1iZXIsID9udW1iZXIpXG4vLyBDYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IGJldHdlZW4gdGhlIGdpdmVuXG4vLyBpbmRpY2VzLiBUaGlzIHRlbmRzIHRvIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gbG9vcGluZyBvdmVyIHRoZVxuLy8gaW5kaWNlcyBhbmQgY2FsbGluZyBgZ2V0YCwgYmVjYXVzZSBpdCBkb2Vzbid0IGhhdmUgdG8gZGVzY2VuZCB0aGVcbi8vIHRyZWUgZm9yIGV2ZXJ5IGVsZW1lbnQuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoIChmLCBmcm9tLCB0bykge1xuICAgIGlmICggZnJvbSA9PT0gdm9pZCAwICkgZnJvbSA9IDA7XG4gICAgaWYgKCB0byA9PT0gdm9pZCAwICkgdG8gPSB0aGlzLmxlbmd0aDtcblxuICBpZiAoZnJvbSA8PSB0bylcbiAgICB7IHRoaXMuZm9yRWFjaElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxuICBlbHNlXG4gICAgeyB0aGlzLmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20sIHRvLCAwKTsgfVxufTtcblxuLy8gOjogKChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyKSDihpIgVSwgP251bWJlciwgP251bWJlcikg4oaSIFtVXVxuLy8gTWFwIHRoZSBnaXZlbiBmdW5jdGlvbnMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHJvcGUsIHByb2R1Y2luZ1xuLy8gYSBmbGF0IGFycmF5LlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiBtYXAgKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbHQsIGkpIHsgcmV0dXJuIHJlc3VsdC5wdXNoKGYoZWx0LCBpKSk7IH0sIGZyb20sIHRvKTtcbiAgcmV0dXJuIHJlc3VsdFxufTtcblxuLy8gOjogKD91bmlvbjxbVF0sIFJvcGVTZXF1ZW5jZTxUPj4pIOKGkiBSb3BlU2VxdWVuY2U8VD5cbi8vIENyZWF0ZSBhIHJvcGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBhcnJheSwgb3IgcmV0dXJuIHRoZSByb3BlXG4vLyBpdHNlbGYgaWYgYSByb3BlIHdhcyBnaXZlbi5cblJvcGVTZXF1ZW5jZS5mcm9tID0gZnVuY3Rpb24gZnJvbSAodmFsdWVzKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSb3BlU2VxdWVuY2UpIHsgcmV0dXJuIHZhbHVlcyB9XG4gIHJldHVybiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA/IG5ldyBMZWFmKHZhbHVlcykgOiBSb3BlU2VxdWVuY2UuZW1wdHlcbn07XG5cbnZhciBMZWFmID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIExlYWYodmFsdWVzKSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIExlYWYuX19wcm90b19fID0gUm9wZVNlcXVlbmNlO1xuICBMZWFmLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIExlYWYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGVhZjtcblxuICB2YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBsZW5ndGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0sZGVwdGg6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuICBMZWFmLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgcmV0dXJuIG5ldyBMZWFmKHRoaXMudmFsdWVzLnNsaWNlKGZyb20sIHRvKSlcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5nZXRJbm5lciA9IGZ1bmN0aW9uIGdldElubmVyIChpKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2ldXG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaElubmVyID0gZnVuY3Rpb24gZm9yRWFjaElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbTsgaSA8IHRvOyBpKyspXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgZm9yICh2YXIgaSA9IGZyb20gLSAxOyBpID49IHRvOyBpLS0pXG4gICAgICB7IGlmIChmKHRoaXMudmFsdWVzW2ldLCBzdGFydCArIGkpID09PSBmYWxzZSkgeyByZXR1cm4gZmFsc2UgfSB9XG4gIH07XG5cbiAgTGVhZi5wcm90b3R5cGUubGVhZkFwcGVuZCA9IGZ1bmN0aW9uIGxlYWZBcHBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuY29uY2F0KG90aGVyLmZsYXR0ZW4oKSkpIH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlbmd0aCArIG90aGVyLmxlbmd0aCA8PSBHT09EX0xFQUZfU0laRSlcbiAgICAgIHsgcmV0dXJuIG5ldyBMZWFmKG90aGVyLmZsYXR0ZW4oKS5jb25jYXQodGhpcy52YWx1ZXMpKSB9XG4gIH07XG5cbiAgcHJvdG90eXBlQWNjZXNzb3JzLmxlbmd0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMuZGVwdGguZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMCB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMZWFmLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzICk7XG5cbiAgcmV0dXJuIExlYWY7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG4vLyA6OiBSb3BlU2VxdWVuY2Vcbi8vIFRoZSBlbXB0eSByb3BlIHNlcXVlbmNlLlxuUm9wZVNlcXVlbmNlLmVtcHR5ID0gbmV3IExlYWYoW10pO1xuXG52YXIgQXBwZW5kID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoUm9wZVNlcXVlbmNlKSB7XG4gIGZ1bmN0aW9uIEFwcGVuZChsZWZ0LCByaWdodCkge1xuICAgIFJvcGVTZXF1ZW5jZS5jYWxsKHRoaXMpO1xuICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgIHRoaXMubGVuZ3RoID0gbGVmdC5sZW5ndGggKyByaWdodC5sZW5ndGg7XG4gICAgdGhpcy5kZXB0aCA9IE1hdGgubWF4KGxlZnQuZGVwdGgsIHJpZ2h0LmRlcHRoKSArIDE7XG4gIH1cblxuICBpZiAoIFJvcGVTZXF1ZW5jZSApIEFwcGVuZC5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIEFwcGVuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBSb3BlU2VxdWVuY2UgJiYgUm9wZVNlcXVlbmNlLnByb3RvdHlwZSApO1xuICBBcHBlbmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXBwZW5kO1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uIGZsYXR0ZW4gKCkge1xuICAgIHJldHVybiB0aGlzLmxlZnQuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnJpZ2h0LmZsYXR0ZW4oKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gaSA8IHRoaXMubGVmdC5sZW5ndGggPyB0aGlzLmxlZnQuZ2V0KGkpIDogdGhpcy5yaWdodC5nZXQoaSAtIHRoaXMubGVmdC5sZW5ndGgpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA8IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5sZWZ0LmZvckVhY2hJbm5lcihmLCBmcm9tLCBNYXRoLm1pbih0bywgbGVmdExlbiksIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbm5lcihmLCBNYXRoLm1heChmcm9tIC0gbGVmdExlbiwgMCksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbnZlcnRlZElubmVyID0gZnVuY3Rpb24gZm9yRWFjaEludmVydGVkSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIHZhciBsZWZ0TGVuID0gdGhpcy5sZWZ0Lmxlbmd0aDtcbiAgICBpZiAoZnJvbSA+IGxlZnRMZW4gJiZcbiAgICAgICAgdGhpcy5yaWdodC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBmcm9tIC0gbGVmdExlbiwgTWF0aC5tYXgodG8sIGxlZnRMZW4pIC0gbGVmdExlbiwgc3RhcnQgKyBsZWZ0TGVuKSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gICAgaWYgKHRvIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgTWF0aC5taW4oZnJvbSwgbGVmdExlbiksIHRvLCBzdGFydCkgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuc2xpY2VJbm5lciA9IGZ1bmN0aW9uIHNsaWNlSW5uZXIgKGZyb20sIHRvKSB7XG4gICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmICh0byA8PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgdG8pIH1cbiAgICBpZiAoZnJvbSA+PSBsZWZ0TGVuKSB7IHJldHVybiB0aGlzLnJpZ2h0LnNsaWNlKGZyb20gLSBsZWZ0TGVuLCB0byAtIGxlZnRMZW4pIH1cbiAgICByZXR1cm4gdGhpcy5sZWZ0LnNsaWNlKGZyb20sIGxlZnRMZW4pLmFwcGVuZCh0aGlzLnJpZ2h0LnNsaWNlKDAsIHRvIC0gbGVmdExlbikpXG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICB2YXIgaW5uZXIgPSB0aGlzLnJpZ2h0LmxlYWZBcHBlbmQob3RoZXIpO1xuICAgIGlmIChpbm5lcikgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIGlubmVyKSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5sZWFmUHJlcGVuZCA9IGZ1bmN0aW9uIGxlYWZQcmVwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMubGVmdC5sZWFmUHJlcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKGlubmVyLCB0aGlzLnJpZ2h0KSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICAgIGlmICh0aGlzLmxlZnQuZGVwdGggPj0gTWF0aC5tYXgodGhpcy5yaWdodC5kZXB0aCwgb3RoZXIuZGVwdGgpICsgMSlcbiAgICAgIHsgcmV0dXJuIG5ldyBBcHBlbmQodGhpcy5sZWZ0LCBuZXcgQXBwZW5kKHRoaXMucmlnaHQsIG90aGVyKSkgfVxuICAgIHJldHVybiBuZXcgQXBwZW5kKHRoaXMsIG90aGVyKVxuICB9O1xuXG4gIHJldHVybiBBcHBlbmQ7XG59KFJvcGVTZXF1ZW5jZSkpO1xuXG5leHBvcnQgZGVmYXVsdCBSb3BlU2VxdWVuY2U7XG4iLCJleHBvcnQgZGVmYXVsdCAvW1xcMC1cXHgxRlxceDdGLVxceDlGXS8iLCJleHBvcnQgZGVmYXVsdCAvW1xceEFEXFx1MDYwMC1cXHUwNjA1XFx1MDYxQ1xcdTA2RERcXHUwNzBGXFx1MDg5MFxcdTA4OTFcXHUwOEUyXFx1MTgwRVxcdTIwMEItXFx1MjAwRlxcdTIwMkEtXFx1MjAyRVxcdTIwNjAtXFx1MjA2NFxcdTIwNjYtXFx1MjA2RlxcdUZFRkZcXHVGRkY5LVxcdUZGRkJdfFxcdUQ4MDRbXFx1RENCRFxcdURDQ0RdfFxcdUQ4MERbXFx1REMzMC1cXHVEQzNGXXxcXHVEODJGW1xcdURDQTAtXFx1RENBM118XFx1RDgzNFtcXHVERDczLVxcdUREN0FdfFxcdURCNDBbXFx1REMwMVxcdURDMjAtXFx1REM3Rl0vIiwiZXhwb3J0IGRlZmF1bHQgL1shLSMlLVxcKiwtXFwvOjtcXD9AXFxbLVxcXV9cXHtcXH1cXHhBMVxceEE3XFx4QUJcXHhCNlxceEI3XFx4QkJcXHhCRlxcdTAzN0VcXHUwMzg3XFx1MDU1QS1cXHUwNTVGXFx1MDU4OVxcdTA1OEFcXHUwNUJFXFx1MDVDMFxcdTA1QzNcXHUwNUM2XFx1MDVGM1xcdTA1RjRcXHUwNjA5XFx1MDYwQVxcdTA2MENcXHUwNjBEXFx1MDYxQlxcdTA2MUQtXFx1MDYxRlxcdTA2NkEtXFx1MDY2RFxcdTA2RDRcXHUwNzAwLVxcdTA3MERcXHUwN0Y3LVxcdTA3RjlcXHUwODMwLVxcdTA4M0VcXHUwODVFXFx1MDk2NFxcdTA5NjVcXHUwOTcwXFx1MDlGRFxcdTBBNzZcXHUwQUYwXFx1MEM3N1xcdTBDODRcXHUwREY0XFx1MEU0RlxcdTBFNUFcXHUwRTVCXFx1MEYwNC1cXHUwRjEyXFx1MEYxNFxcdTBGM0EtXFx1MEYzRFxcdTBGODVcXHUwRkQwLVxcdTBGRDRcXHUwRkQ5XFx1MEZEQVxcdTEwNEEtXFx1MTA0RlxcdTEwRkJcXHUxMzYwLVxcdTEzNjhcXHUxNDAwXFx1MTY2RVxcdTE2OUJcXHUxNjlDXFx1MTZFQi1cXHUxNkVEXFx1MTczNVxcdTE3MzZcXHUxN0Q0LVxcdTE3RDZcXHUxN0Q4LVxcdTE3REFcXHUxODAwLVxcdTE4MEFcXHUxOTQ0XFx1MTk0NVxcdTFBMUVcXHUxQTFGXFx1MUFBMC1cXHUxQUE2XFx1MUFBOC1cXHUxQUFEXFx1MUI1QS1cXHUxQjYwXFx1MUI3RFxcdTFCN0VcXHUxQkZDLVxcdTFCRkZcXHUxQzNCLVxcdTFDM0ZcXHUxQzdFXFx1MUM3RlxcdTFDQzAtXFx1MUNDN1xcdTFDRDNcXHUyMDEwLVxcdTIwMjdcXHUyMDMwLVxcdTIwNDNcXHUyMDQ1LVxcdTIwNTFcXHUyMDUzLVxcdTIwNUVcXHUyMDdEXFx1MjA3RVxcdTIwOERcXHUyMDhFXFx1MjMwOC1cXHUyMzBCXFx1MjMyOVxcdTIzMkFcXHUyNzY4LVxcdTI3NzVcXHUyN0M1XFx1MjdDNlxcdTI3RTYtXFx1MjdFRlxcdTI5ODMtXFx1Mjk5OFxcdTI5RDgtXFx1MjlEQlxcdTI5RkNcXHUyOUZEXFx1MkNGOS1cXHUyQ0ZDXFx1MkNGRVxcdTJDRkZcXHUyRDcwXFx1MkUwMC1cXHUyRTJFXFx1MkUzMC1cXHUyRTRGXFx1MkU1Mi1cXHUyRTVEXFx1MzAwMS1cXHUzMDAzXFx1MzAwOC1cXHUzMDExXFx1MzAxNC1cXHUzMDFGXFx1MzAzMFxcdTMwM0RcXHUzMEEwXFx1MzBGQlxcdUE0RkVcXHVBNEZGXFx1QTYwRC1cXHVBNjBGXFx1QTY3M1xcdUE2N0VcXHVBNkYyLVxcdUE2RjdcXHVBODc0LVxcdUE4NzdcXHVBOENFXFx1QThDRlxcdUE4RjgtXFx1QThGQVxcdUE4RkNcXHVBOTJFXFx1QTkyRlxcdUE5NUZcXHVBOUMxLVxcdUE5Q0RcXHVBOURFXFx1QTlERlxcdUFBNUMtXFx1QUE1RlxcdUFBREVcXHVBQURGXFx1QUFGMFxcdUFBRjFcXHVBQkVCXFx1RkQzRVxcdUZEM0ZcXHVGRTEwLVxcdUZFMTlcXHVGRTMwLVxcdUZFNTJcXHVGRTU0LVxcdUZFNjFcXHVGRTYzXFx1RkU2OFxcdUZFNkFcXHVGRTZCXFx1RkYwMS1cXHVGRjAzXFx1RkYwNS1cXHVGRjBBXFx1RkYwQy1cXHVGRjBGXFx1RkYxQVxcdUZGMUJcXHVGRjFGXFx1RkYyMFxcdUZGM0ItXFx1RkYzRFxcdUZGM0ZcXHVGRjVCXFx1RkY1RFxcdUZGNUYtXFx1RkY2NV18XFx1RDgwMFtcXHVERDAwLVxcdUREMDJcXHVERjlGXFx1REZEMF18XFx1RDgwMVxcdURENkZ8XFx1RDgwMltcXHVEQzU3XFx1REQxRlxcdUREM0ZcXHVERTUwLVxcdURFNThcXHVERTdGXFx1REVGMC1cXHVERUY2XFx1REYzOS1cXHVERjNGXFx1REY5OS1cXHVERjlDXXxcXHVEODAzW1xcdURFQURcXHVERjU1LVxcdURGNTlcXHVERjg2LVxcdURGODldfFxcdUQ4MDRbXFx1REM0Ny1cXHVEQzREXFx1RENCQlxcdURDQkNcXHVEQ0JFLVxcdURDQzFcXHVERDQwLVxcdURENDNcXHVERDc0XFx1REQ3NVxcdUREQzUtXFx1RERDOFxcdUREQ0RcXHVERERCXFx1RERERC1cXHVERERGXFx1REUzOC1cXHVERTNEXFx1REVBOV18XFx1RDgwNVtcXHVEQzRCLVxcdURDNEZcXHVEQzVBXFx1REM1QlxcdURDNURcXHVEQ0M2XFx1RERDMS1cXHVEREQ3XFx1REU0MS1cXHVERTQzXFx1REU2MC1cXHVERTZDXFx1REVCOVxcdURGM0MtXFx1REYzRV18XFx1RDgwNltcXHVEQzNCXFx1REQ0NC1cXHVERDQ2XFx1RERFMlxcdURFM0YtXFx1REU0NlxcdURFOUEtXFx1REU5Q1xcdURFOUUtXFx1REVBMlxcdURGMDAtXFx1REYwOV18XFx1RDgwN1tcXHVEQzQxLVxcdURDNDVcXHVEQzcwXFx1REM3MVxcdURFRjdcXHVERUY4XFx1REY0My1cXHVERjRGXFx1REZGRl18XFx1RDgwOVtcXHVEQzcwLVxcdURDNzRdfFxcdUQ4MEJbXFx1REZGMVxcdURGRjJdfFxcdUQ4MUFbXFx1REU2RVxcdURFNkZcXHVERUY1XFx1REYzNy1cXHVERjNCXFx1REY0NF18XFx1RDgxQltcXHVERTk3LVxcdURFOUFcXHVERkUyXXxcXHVEODJGXFx1REM5RnxcXHVEODM2W1xcdURFODctXFx1REU4Ql18XFx1RDgzQVtcXHVERDVFXFx1REQ1Rl0vIiwiZXhwb3J0IGRlZmF1bHQgL1tcXCRcXCs8LT5cXF5gXFx8flxceEEyLVxceEE2XFx4QThcXHhBOVxceEFDXFx4QUUtXFx4QjFcXHhCNFxceEI4XFx4RDdcXHhGN1xcdTAyQzItXFx1MDJDNVxcdTAyRDItXFx1MDJERlxcdTAyRTUtXFx1MDJFQlxcdTAyRURcXHUwMkVGLVxcdTAyRkZcXHUwMzc1XFx1MDM4NFxcdTAzODVcXHUwM0Y2XFx1MDQ4MlxcdTA1OEQtXFx1MDU4RlxcdTA2MDYtXFx1MDYwOFxcdTA2MEJcXHUwNjBFXFx1MDYwRlxcdTA2REVcXHUwNkU5XFx1MDZGRFxcdTA2RkVcXHUwN0Y2XFx1MDdGRVxcdTA3RkZcXHUwODg4XFx1MDlGMlxcdTA5RjNcXHUwOUZBXFx1MDlGQlxcdTBBRjFcXHUwQjcwXFx1MEJGMy1cXHUwQkZBXFx1MEM3RlxcdTBENEZcXHUwRDc5XFx1MEUzRlxcdTBGMDEtXFx1MEYwM1xcdTBGMTNcXHUwRjE1LVxcdTBGMTdcXHUwRjFBLVxcdTBGMUZcXHUwRjM0XFx1MEYzNlxcdTBGMzhcXHUwRkJFLVxcdTBGQzVcXHUwRkM3LVxcdTBGQ0NcXHUwRkNFXFx1MEZDRlxcdTBGRDUtXFx1MEZEOFxcdTEwOUVcXHUxMDlGXFx1MTM5MC1cXHUxMzk5XFx1MTY2RFxcdTE3REJcXHUxOTQwXFx1MTlERS1cXHUxOUZGXFx1MUI2MS1cXHUxQjZBXFx1MUI3NC1cXHUxQjdDXFx1MUZCRFxcdTFGQkYtXFx1MUZDMVxcdTFGQ0QtXFx1MUZDRlxcdTFGREQtXFx1MUZERlxcdTFGRUQtXFx1MUZFRlxcdTFGRkRcXHUxRkZFXFx1MjA0NFxcdTIwNTJcXHUyMDdBLVxcdTIwN0NcXHUyMDhBLVxcdTIwOENcXHUyMEEwLVxcdTIwQzBcXHUyMTAwXFx1MjEwMVxcdTIxMDMtXFx1MjEwNlxcdTIxMDhcXHUyMTA5XFx1MjExNFxcdTIxMTYtXFx1MjExOFxcdTIxMUUtXFx1MjEyM1xcdTIxMjVcXHUyMTI3XFx1MjEyOVxcdTIxMkVcXHUyMTNBXFx1MjEzQlxcdTIxNDAtXFx1MjE0NFxcdTIxNEEtXFx1MjE0RFxcdTIxNEZcXHUyMThBXFx1MjE4QlxcdTIxOTAtXFx1MjMwN1xcdTIzMEMtXFx1MjMyOFxcdTIzMkItXFx1MjQyNlxcdTI0NDAtXFx1MjQ0QVxcdTI0OUMtXFx1MjRFOVxcdTI1MDAtXFx1Mjc2N1xcdTI3OTQtXFx1MjdDNFxcdTI3QzctXFx1MjdFNVxcdTI3RjAtXFx1Mjk4MlxcdTI5OTktXFx1MjlEN1xcdTI5REMtXFx1MjlGQlxcdTI5RkUtXFx1MkI3M1xcdTJCNzYtXFx1MkI5NVxcdTJCOTctXFx1MkJGRlxcdTJDRTUtXFx1MkNFQVxcdTJFNTBcXHUyRTUxXFx1MkU4MC1cXHUyRTk5XFx1MkU5Qi1cXHUyRUYzXFx1MkYwMC1cXHUyRkQ1XFx1MkZGMC1cXHUyRkZGXFx1MzAwNFxcdTMwMTJcXHUzMDEzXFx1MzAyMFxcdTMwMzZcXHUzMDM3XFx1MzAzRVxcdTMwM0ZcXHUzMDlCXFx1MzA5Q1xcdTMxOTBcXHUzMTkxXFx1MzE5Ni1cXHUzMTlGXFx1MzFDMC1cXHUzMUUzXFx1MzFFRlxcdTMyMDAtXFx1MzIxRVxcdTMyMkEtXFx1MzI0N1xcdTMyNTBcXHUzMjYwLVxcdTMyN0ZcXHUzMjhBLVxcdTMyQjBcXHUzMkMwLVxcdTMzRkZcXHU0REMwLVxcdTRERkZcXHVBNDkwLVxcdUE0QzZcXHVBNzAwLVxcdUE3MTZcXHVBNzIwXFx1QTcyMVxcdUE3ODlcXHVBNzhBXFx1QTgyOC1cXHVBODJCXFx1QTgzNi1cXHVBODM5XFx1QUE3Ny1cXHVBQTc5XFx1QUI1QlxcdUFCNkFcXHVBQjZCXFx1RkIyOVxcdUZCQjItXFx1RkJDMlxcdUZENDAtXFx1RkQ0RlxcdUZEQ0ZcXHVGREZDLVxcdUZERkZcXHVGRTYyXFx1RkU2NC1cXHVGRTY2XFx1RkU2OVxcdUZGMDRcXHVGRjBCXFx1RkYxQy1cXHVGRjFFXFx1RkYzRVxcdUZGNDBcXHVGRjVDXFx1RkY1RVxcdUZGRTAtXFx1RkZFNlxcdUZGRTgtXFx1RkZFRVxcdUZGRkNcXHVGRkZEXXxcXHVEODAwW1xcdUREMzctXFx1REQzRlxcdURENzktXFx1REQ4OVxcdUREOEMtXFx1REQ4RVxcdUREOTAtXFx1REQ5Q1xcdUREQTBcXHVEREQwLVxcdURERkNdfFxcdUQ4MDJbXFx1REM3N1xcdURDNzhcXHVERUM4XXxcXHVEODA1XFx1REYzRnxcXHVEODA3W1xcdURGRDUtXFx1REZGMV18XFx1RDgxQVtcXHVERjNDLVxcdURGM0ZcXHVERjQ1XXxcXHVEODJGXFx1REM5Q3xcXHVEODMzW1xcdURGNTAtXFx1REZDM118XFx1RDgzNFtcXHVEQzAwLVxcdURDRjVcXHVERDAwLVxcdUREMjZcXHVERDI5LVxcdURENjRcXHVERDZBLVxcdURENkNcXHVERDgzXFx1REQ4NFxcdUREOEMtXFx1RERBOVxcdUREQUUtXFx1RERFQVxcdURFMDAtXFx1REU0MVxcdURFNDVcXHVERjAwLVxcdURGNTZdfFxcdUQ4MzVbXFx1REVDMVxcdURFREJcXHVERUZCXFx1REYxNVxcdURGMzVcXHVERjRGXFx1REY2RlxcdURGODlcXHVERkE5XFx1REZDM118XFx1RDgzNltcXHVEQzAwLVxcdURERkZcXHVERTM3LVxcdURFM0FcXHVERTZELVxcdURFNzRcXHVERTc2LVxcdURFODNcXHVERTg1XFx1REU4Nl18XFx1RDgzOFtcXHVERDRGXFx1REVGRl18XFx1RDgzQltcXHVEQ0FDXFx1RENCMFxcdUREMkVcXHVERUYwXFx1REVGMV18XFx1RDgzQ1tcXHVEQzAwLVxcdURDMkJcXHVEQzMwLVxcdURDOTNcXHVEQ0EwLVxcdURDQUVcXHVEQ0IxLVxcdURDQkZcXHVEQ0MxLVxcdURDQ0ZcXHVEQ0QxLVxcdURDRjVcXHVERDBELVxcdUREQURcXHVEREU2LVxcdURFMDJcXHVERTEwLVxcdURFM0JcXHVERTQwLVxcdURFNDhcXHVERTUwXFx1REU1MVxcdURFNjAtXFx1REU2NVxcdURGMDAtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURFRDdcXHVERURDLVxcdURFRUNcXHVERUYwLVxcdURFRkNcXHVERjAwLVxcdURGNzZcXHVERjdCLVxcdURGRDlcXHVERkUwLVxcdURGRUJcXHVERkYwXXxcXHVEODNFW1xcdURDMDAtXFx1REMwQlxcdURDMTAtXFx1REM0N1xcdURDNTAtXFx1REM1OVxcdURDNjAtXFx1REM4N1xcdURDOTAtXFx1RENBRFxcdURDQjBcXHVEQ0IxXFx1REQwMC1cXHVERTUzXFx1REU2MC1cXHVERTZEXFx1REU3MC1cXHVERTdDXFx1REU4MC1cXHVERTg4XFx1REU5MC1cXHVERUJEXFx1REVCRi1cXHVERUM1XFx1REVDRS1cXHVERURCXFx1REVFMC1cXHVERUU4XFx1REVGMC1cXHVERUY4XFx1REYwMC1cXHVERjkyXFx1REY5NC1cXHVERkNBXS8iLCJleHBvcnQgZGVmYXVsdCAvWyBcXHhBMFxcdTE2ODBcXHUyMDAwLVxcdTIwMEFcXHUyMDI4XFx1MjAyOVxcdTIwMkZcXHUyMDVGXFx1MzAwMF0vIiwiaW1wb3J0IEFueSBmcm9tICcuL3Byb3BlcnRpZXMvQW55L3JlZ2V4Lm1qcyc7XG5pbXBvcnQgQ2MgIGZyb20gJy4vY2F0ZWdvcmllcy9DYy9yZWdleC5tanMnO1xuaW1wb3J0IENmICBmcm9tICcuL2NhdGVnb3JpZXMvQ2YvcmVnZXgubWpzJztcbmltcG9ydCBQICAgZnJvbSAnLi9jYXRlZ29yaWVzL1AvcmVnZXgubWpzJztcbmltcG9ydCBTICAgZnJvbSAnLi9jYXRlZ29yaWVzL1MvcmVnZXgubWpzJztcbmltcG9ydCBaICAgZnJvbSAnLi9jYXRlZ29yaWVzL1ovcmVnZXgubWpzJztcblxuZXhwb3J0IHsgQW55LCBDYywgQ2YsIFAsIFMsIFogfTtcbiIsImV4cG9ydCBkZWZhdWx0IC9bXFwwLVxcdUQ3RkZcXHVFMDAwLVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oPyFbXFx1REMwMC1cXHVERkZGXSl8KD86W15cXHVEODAwLVxcdURCRkZdfF4pW1xcdURDMDAtXFx1REZGRl0vIiwiZXhwb3J0IHZhciBiYXNlID0ge1xuICA4OiBcIkJhY2tzcGFjZVwiLFxuICA5OiBcIlRhYlwiLFxuICAxMDogXCJFbnRlclwiLFxuICAxMjogXCJOdW1Mb2NrXCIsXG4gIDEzOiBcIkVudGVyXCIsXG4gIDE2OiBcIlNoaWZ0XCIsXG4gIDE3OiBcIkNvbnRyb2xcIixcbiAgMTg6IFwiQWx0XCIsXG4gIDIwOiBcIkNhcHNMb2NrXCIsXG4gIDI3OiBcIkVzY2FwZVwiLFxuICAzMjogXCIgXCIsXG4gIDMzOiBcIlBhZ2VVcFwiLFxuICAzNDogXCJQYWdlRG93blwiLFxuICAzNTogXCJFbmRcIixcbiAgMzY6IFwiSG9tZVwiLFxuICAzNzogXCJBcnJvd0xlZnRcIixcbiAgMzg6IFwiQXJyb3dVcFwiLFxuICAzOTogXCJBcnJvd1JpZ2h0XCIsXG4gIDQwOiBcIkFycm93RG93blwiLFxuICA0NDogXCJQcmludFNjcmVlblwiLFxuICA0NTogXCJJbnNlcnRcIixcbiAgNDY6IFwiRGVsZXRlXCIsXG4gIDU5OiBcIjtcIixcbiAgNjE6IFwiPVwiLFxuICA5MTogXCJNZXRhXCIsXG4gIDkyOiBcIk1ldGFcIixcbiAgMTA2OiBcIipcIixcbiAgMTA3OiBcIitcIixcbiAgMTA4OiBcIixcIixcbiAgMTA5OiBcIi1cIixcbiAgMTEwOiBcIi5cIixcbiAgMTExOiBcIi9cIixcbiAgMTQ0OiBcIk51bUxvY2tcIixcbiAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgMTYwOiBcIlNoaWZ0XCIsXG4gIDE2MTogXCJTaGlmdFwiLFxuICAxNjI6IFwiQ29udHJvbFwiLFxuICAxNjM6IFwiQ29udHJvbFwiLFxuICAxNjQ6IFwiQWx0XCIsXG4gIDE2NTogXCJBbHRcIixcbiAgMTczOiBcIi1cIixcbiAgMTg2OiBcIjtcIixcbiAgMTg3OiBcIj1cIixcbiAgMTg4OiBcIixcIixcbiAgMTg5OiBcIi1cIixcbiAgMTkwOiBcIi5cIixcbiAgMTkxOiBcIi9cIixcbiAgMTkyOiBcImBcIixcbiAgMjE5OiBcIltcIixcbiAgMjIwOiBcIlxcXFxcIixcbiAgMjIxOiBcIl1cIixcbiAgMjIyOiBcIidcIlxufVxuXG5leHBvcnQgdmFyIHNoaWZ0ID0ge1xuICA0ODogXCIpXCIsXG4gIDQ5OiBcIiFcIixcbiAgNTA6IFwiQFwiLFxuICA1MTogXCIjXCIsXG4gIDUyOiBcIiRcIixcbiAgNTM6IFwiJVwiLFxuICA1NDogXCJeXCIsXG4gIDU1OiBcIiZcIixcbiAgNTY6IFwiKlwiLFxuICA1NzogXCIoXCIsXG4gIDU5OiBcIjpcIixcbiAgNjE6IFwiK1wiLFxuICAxNzM6IFwiX1wiLFxuICAxODY6IFwiOlwiLFxuICAxODc6IFwiK1wiLFxuICAxODg6IFwiPFwiLFxuICAxODk6IFwiX1wiLFxuICAxOTA6IFwiPlwiLFxuICAxOTE6IFwiP1wiLFxuICAxOTI6IFwiflwiLFxuICAyMTk6IFwie1wiLFxuICAyMjA6IFwifFwiLFxuICAyMjE6IFwifVwiLFxuICAyMjI6IFwiXFxcIlwiXG59XG5cbnZhciBtYWMgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01hYy8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG52YXIgaWUgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgXFxkfFRyaWRlbnRcXC8oPzpbNy05XXxcXGR7Mix9KVxcLi4qcnY6KFxcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpXG5cbi8vIEZpbGwgaW4gdGhlIGRpZ2l0IGtleXNcbmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgYmFzZVs0OCArIGldID0gYmFzZVs5NiArIGldID0gU3RyaW5nKGkpXG5cbi8vIFRoZSBmdW5jdGlvbiBrZXlzXG5mb3IgKHZhciBpID0gMTsgaSA8PSAyNDsgaSsrKSBiYXNlW2kgKyAxMTFdID0gXCJGXCIgKyBpXG5cbi8vIEFuZCB0aGUgYWxwaGFiZXRpYyBrZXlzXG5mb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykge1xuICBiYXNlW2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpICsgMzIpXG4gIHNoaWZ0W2ldID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxufVxuXG4vLyBGb3IgZWFjaCBjb2RlIHRoYXQgZG9lc24ndCBoYXZlIGEgc2hpZnQtZXF1aXZhbGVudCwgY29weSB0aGUgYmFzZSBuYW1lXG5mb3IgKHZhciBjb2RlIGluIGJhc2UpIGlmICghc2hpZnQuaGFzT3duUHJvcGVydHkoY29kZSkpIHNoaWZ0W2NvZGVdID0gYmFzZVtjb2RlXVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5TmFtZShldmVudCkge1xuICAvLyBPbiBtYWNPUywga2V5cyBoZWxkIHdpdGggU2hpZnQgYW5kIENtZCBkb24ndCByZWZsZWN0IHRoZSBlZmZlY3Qgb2YgU2hpZnQgaW4gYC5rZXlgLlxuICAvLyBPbiBJRSwgc2hpZnQgZWZmZWN0IGlzIG5ldmVyIGluY2x1ZGVkIGluIGAua2V5YC5cbiAgdmFyIGlnbm9yZUtleSA9IG1hYyAmJiBldmVudC5tZXRhS2V5ICYmIGV2ZW50LnNoaWZ0S2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgfHxcbiAgICAgIGllICYmIGV2ZW50LnNoaWZ0S2V5ICYmIGV2ZW50LmtleSAmJiBldmVudC5rZXkubGVuZ3RoID09IDEgfHxcbiAgICAgIGV2ZW50LmtleSA9PSBcIlVuaWRlbnRpZmllZFwiXG4gIHZhciBuYW1lID0gKCFpZ25vcmVLZXkgJiYgZXZlbnQua2V5KSB8fFxuICAgIChldmVudC5zaGlmdEtleSA/IHNoaWZ0IDogYmFzZSlbZXZlbnQua2V5Q29kZV0gfHxcbiAgICBldmVudC5rZXkgfHwgXCJVbmlkZW50aWZpZWRcIlxuICAvLyBFZGdlIHNvbWV0aW1lcyBwcm9kdWNlcyB3cm9uZyBuYW1lcyAoSXNzdWUgIzMpXG4gIGlmIChuYW1lID09IFwiRXNjXCIpIG5hbWUgPSBcIkVzY2FwZVwiXG4gIGlmIChuYW1lID09IFwiRGVsXCIpIG5hbWUgPSBcIkRlbGV0ZVwiXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzg4NjA1NzEvXG4gIGlmIChuYW1lID09IFwiTGVmdFwiKSBuYW1lID0gXCJBcnJvd0xlZnRcIlxuICBpZiAobmFtZSA9PSBcIlVwXCIpIG5hbWUgPSBcIkFycm93VXBcIlxuICBpZiAobmFtZSA9PSBcIlJpZ2h0XCIpIG5hbWUgPSBcIkFycm93UmlnaHRcIlxuICBpZiAobmFtZSA9PSBcIkRvd25cIikgbmFtZSA9IFwiQXJyb3dEb3duXCJcbiAgcmV0dXJuIG5hbWVcbn1cbiIsImltcG9ydCB7IFBsdWdpbiwgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yRXh0ZW5kZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHZpZXc6IEVkaXRvclZpZXc7XG4gIHByaXZhdGUgZWw6IEhUTUxEaXZFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKGV4dGVuZGVyRWw6IEhUTUxEaXZFbGVtZW50KSB7XG4gICAgc3VwZXIoe1xuICAgICAgdmlldzogKHZpZXdJbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3SW5zdGFuY2U7XG4gICAgICAgIHRoaXMuZWwgPSBleHRlbmRlckVsO1xuXG4gICAgICAgIHRoaXMuZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXMudmlldztcbiAgICBjb25zdCB7IGRvYywgdHIgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGxhc3RQb3MgPSBkb2Mubm9kZVNpemUgLSAyO1xuICAgIGNvbnN0IGxhc3ROb2RlVHlwZSA9IHN0YXRlLmRvYy5sYXN0Q2hpbGQudHlwZTtcbiAgICBpZiAobGFzdE5vZGVUeXBlID09PSBzY2hlbWEubm9kZXMuY29kZV9ibG9jayB8fCBsYXN0Tm9kZVR5cGUuaXNMZWFmKSB7XG4gICAgICB0ci5pbnNlcnQobGFzdFBvcywgc2NoZW1hLm5vZGVzLnBhcmFncmFwaC5jcmVhdGVBbmRGaWxsKCkpO1xuICAgIH1cbiAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLmF0RW5kKHRyLmRvYykpO1xuICAgIHRoaXMudmlldy5kaXNwYXRjaCh0cik7XG4gICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4sIFRyYW5zYWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgQVVUT19MSU5LX0FUVFIsIHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCBMaW5raWZ5SXQgZnJvbSAnbGlua2lmeS1pdCc7XG5cbmNvbnN0IGxpbmtpZnkgPSBuZXcgTGlua2lmeUl0KCk7XG5cbmV4cG9ydCBjb25zdCBmaW5kQW5kSW5zZXJ0SW5saW5lTGlua3MgPSAoc3RhdGUpOiBUcmFuc2FjdGlvbiA9PiB7XG4gIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuXG4gIHRyLmRvYy5kZXNjZW5kYW50cygobm9kZSwgcG9zLCBwYXJlbnQpID0+IHtcbiAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgZmluZCBhbmQgdmFsaWRhdGUgYWxsIGV4aXN0aW5nIGF1dG9saW5rcy4gSWYgYW4gYXV0b2xpbmsgY29udGFpbnMgdGV4dCB0aGF0IGlzIG5vdCBhIHZhbGlkIFVSTCwgcmVtb3ZlIHRoZSBsaW5rLlxuICAgIGNvbnN0IHN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlID0gcG9zICsgMTtcbiAgICBjb25zdCBhdXRvTGlua01hcHM6IHsgc3RhcnRQb3M6IG51bWJlcjsgZW5kUG9zOiBudW1iZXIgfVtdID0gW107XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgb2Zmc2V0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGNoaWxkTGlua01hcmsgPSBjaGlsZC5tYXJrcy5maW5kKFxuICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICk7XG4gICAgICBpZiAoY2hpbGRMaW5rTWFyayAmJiBjaGlsZExpbmtNYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoYXV0b0xpbmtNYXBzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RNYXAgPSBhdXRvTGlua01hcHNbYXV0b0xpbmtNYXBzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0TWFwLmVuZFBvcyA9PT0gc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgKyBvZmZzZXQpIHtcbiAgICAgICAgICAgIGxhc3RNYXAuZW5kUG9zID0gcG9zICsgb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF1dG9MaW5rTWFwcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0UG9zOiBzdGFydGluZ1Bvc2l0aW9uSW5zaWRlTm9kZSArIG9mZnNldCxcbiAgICAgICAgICAgIGVuZFBvczogc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgKyBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBhdXRvTGlua01hcCBvZiBhdXRvTGlua01hcHMpIHtcbiAgICAgIGNvbnN0IGxpbmtUZXh0ID0gdHIuZG9jLnRleHRCZXR3ZWVuKFxuICAgICAgICBhdXRvTGlua01hcC5zdGFydFBvcyxcbiAgICAgICAgYXV0b0xpbmtNYXAuZW5kUG9zLFxuICAgICAgKTtcbiAgICAgIGlmICghbGlua2lmeS50ZXN0KGxpbmtUZXh0KSkge1xuICAgICAgICB0ci5yZW1vdmVNYXJrKFxuICAgICAgICAgIGF1dG9MaW5rTWFwLnN0YXJ0UG9zLFxuICAgICAgICAgIGF1dG9MaW5rTWFwLmVuZFBvcyxcbiAgICAgICAgICBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgZWxzZSBzdGF0ZW1lbnQgZW5zdXJlcyB0aGF0IGV4aXN0aW5nIGF1dG9saW5rcyB3aWxsIGNvbnRpbnVlIHRvIHVwZGF0ZSBldmVuIGlmIHRoZXkgYXJlXG4gICAgICAgIC8vIGFkamFjZW50IHRvIG90aGVyIHRleHQ7IHRoZSByZWdleCBVUkwgdGVzdCB3aWxsIHN0b3AgZmluZGluZyB0aGVtIGluIHRoaXMgY2FzZS5cbiAgICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgICBhdXRvTGlua01hcC5zdGFydFBvcyxcbiAgICAgICAgICBhdXRvTGlua01hcC5lbmRQb3MsXG4gICAgICAgICAgc2NoZW1hLm1hcmtzLmxpbmsuY3JlYXRlKHsgaHJlZjogbGlua1RleHQsIFtBVVRPX0xJTktfQVRUUl06IHRydWUgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlbiwgZmluZCBhbmQgaW5zZXJ0IG5ldyBhdXRvbGlua3MgYmFzZWQgb24gdGhlIHNhbWUgdGVzdC5cbiAgICBjb25zdCBtYXRjaGVzID0gbGlua2lmeS5tYXRjaChub2RlLnRleHRDb250ZW50KTtcbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcG9zICsgMSArIG1hdGNoLmluZGV4O1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBtYXRjaC50ZXh0Lmxlbmd0aDtcblxuICAgICAgaWYgKHRyLmRvYy5yYW5nZUhhc01hcmsoc3RhcnQsIGVuZCwgc2NoZW1hLm1hcmtzLmNvZGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHIuZG9jLnJhbmdlSGFzTWFyayhzdGFydCwgZW5kLCBzY2hlbWEubWFya3MubGluaykpIHtcbiAgICAgICAgbGV0IGxpbmtNYXJrcyA9IFtdO1xuICAgICAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKHN0YXJ0LCBlbmQsIChub2RlKSA9PiB7XG4gICAgICAgICAgaWYgKG5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rTWFyayA9IG5vZGUubWFya3MuZmluZChcbiAgICAgICAgICAgICAgKG1hcmspID0+IG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmssXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGxpbmtNYXJrICYmIGxpbmtNYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgbGlua01hcmtzLnB1c2gobGlua01hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChsaW5rTWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHIuYWRkTWFyayhcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGVuZCxcbiAgICAgICAgc2NoZW1hLm1hcmtzLmxpbmsuY3JlYXRlKHsgaHJlZjogbWF0Y2gudXJsLCBbQVVUT19MSU5LX0FUVFJdOiB0cnVlIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0cjtcbn07XG5cbmV4cG9ydCBjbGFzcyBJbmxpbmVMaW5rUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgYXBwZW5kVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25zLCBvbGRTdGF0ZSwgbmV3U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRBbmRJbnNlcnRJbmxpbmVMaW5rcyhuZXdTdGF0ZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQbHVnaW4sIEVkaXRvclN0YXRlLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHtcbiAgbGlmdExpc3RJdGVtLFxuICBzaW5rTGlzdEl0ZW0sXG4gIHdyYXBJbkxpc3QsXG59IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1saXN0JztcbmltcG9ydCB7IE1hcmtUeXBlLCBOb2RlVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFJlbW92ZU1hcmtTdGVwLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgdW5kbywgcmVkbyB9IGZyb20gJ3Byb3NlbWlycm9yLWhpc3RvcnknO1xuaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBzZWxlY3RQYXJlbnROb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgQ2hlY2tib3hTdGF0dXMgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IEFQUExZX0ZPUk1BVF9BVFRSID0gJ2RhdGEtZm9ybWF0JztcblxudHlwZSBDb21tYW5kID0gdHlwZW9mIHNlbGVjdFBhcmVudE5vZGU7XG5cbi8qKlxuICogU3dhcCB0ZXh0IGJsb2NrcyB0byBhIGdpdmVuIG5vZGUgdHlwZVxuICogVGhpcyBoYW5kbGVzIGxpZnRpbmcgbGlzdCBpdGVtcyBpZiBuZWVkZWQgYmVmb3JlIGNvbnZlcnRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN3YXBUZXh0QmxvY2sodmlldzogRWRpdG9yVmlldywgbm9kZVR5cGU6IE5vZGVUeXBlKTogdm9pZCB7XG4gIGxldCB7IGRpc3BhdGNoLCBzdGF0ZSB9ID0gdmlldztcbiAgbGV0IHsgdHIgfSA9IHN0YXRlO1xuXG4gIGlmIChcbiAgICBub2RlVHlwZSAhPT0gc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0ICYmXG4gICAgbm9kZVR5cGUgIT09IHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3RcbiAgKSB7XG4gICAgbGlmdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCk7XG4gIH1cblxuICAoeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXcpO1xuICAoeyB0ciB9ID0gc3RhdGUpO1xuICBjb25zdCB7XG4gICAgc2VsZWN0aW9uOiB7IGZyb20sIHRvIH0sXG4gIH0gPSBzdGF0ZTtcbiAgdHIuc2V0QmxvY2tUeXBlKGZyb20sIHRvLCBub2RlVHlwZSk7XG4gIGRpc3BhdGNoKHRyKTtcbn1cblxuZXhwb3J0IGNvbnN0IGluZGVudExpc3RJdGVtOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIHJldHVybiAoXG4gICAgc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCkgfHxcbiAgICB3cmFwSW5MaXN0KHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCkoc3RhdGUsIGRpc3BhdGNoKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IG91dGRlbnRMaXN0SXRlbTogQ29tbWFuZCA9IGZ1bmN0aW9uIChcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICBkaXNwYXRjaDogRWRpdG9yVmlld1snZGlzcGF0Y2gnXSB8IHVuZGVmaW5lZCxcbikge1xuICByZXR1cm4gbGlmdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgbGlzdCB0eXBlIG9mIHRoZSBzZWxlY3Rpb24uXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gb3ZlcmxhcHMgd2l0aCBsaXN0IG5vZGVzIGFuZCBub24tbGlzdCBub2Rlcywgb3IgaWYgaXRcbiAqICAgaW5jbHVkZXMgYW55IHBvcnRpb24gb2YgYSBuZXN0ZWQgbGlzdCwgZG8gbm90aGluZ1xuICogLSBJZiB0aGUgc2VsZWN0aW9uIGlzIG5vdCBhIGxpc3QsIGNoYW5nZSBpdCBpbnRvIG9uZVxuICogLSBJZiB0aGUgc2VsZWN0aW9uIGlzIGEgbGlzdCBidXQgbm90IHRoZSBkZXNpcmVkIGxpc3QgdHlwZSwgY2hhbmdlIGl0IGludG9cbiAqICAgdGhlIGRlc2lyZWQgbGlzdCB0eXBlXG4gKiAtIElmIHRoZSBzZWxlY3Rpb24gaXMgdGhlIHBhc3NlZCBpbiBsaXN0IHR5cGUsIGNoYW5nZSBpdCBpbnRvIGEgcGFyYWdyYXBoXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMaXN0ID0gZnVuY3Rpb24gKFxuICB2aWV3OiBFZGl0b3JWaWV3LFxuICBsaXN0VHlwZTogTm9kZVR5cGUsXG4gIGl0ZW1UeXBlOiBOb2RlVHlwZSxcbik6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHNlbGVjdGlvbjogeyAkZnJvbSwgJHRvIH0sXG4gICAgfSxcbiAgfSA9IHZpZXc7XG5cbiAgY29uc3QgbGlzdEJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKFxuICAgICR0byxcbiAgICAobm9kZSkgPT4gbm9kZS50eXBlID09PSBsaXN0VHlwZSxcbiAgKTtcbiAgaWYgKGxpc3RCbG9ja1JhbmdlKSB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyB3aXRoIGEgbGlzdCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBsaXN0LCBkb1xuICAgIC8vIG5vdGhpbmcuIERlcHRoIG9mIDIgYWNjb3VudHMgZm9yIHRoZSBsaXN0IG5vZGUgYW5kIHRoZSBsaXN0IGl0ZW0gbm9kZS5cbiAgICBpZiAobGlzdEJsb2NrUmFuZ2UuZGVwdGggPiAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXc7XG5cbiAgICBsZXQgY29udGFpbnNOZXN0ZWRMaXN0ID0gZmFsc2U7XG4gICAgY29uc3QgJHJhbmdlU3RhcnQgPSBzdGF0ZS5kb2MucmVzb2x2ZShsaXN0QmxvY2tSYW5nZS5zdGFydCk7XG4gICAgY29uc3QgJHJhbmdlRW5kID0gc3RhdGUuZG9jLnJlc29sdmUobGlzdEJsb2NrUmFuZ2UuZW5kKTtcbiAgICBsaXN0QmxvY2tSYW5nZS5wYXJlbnQubm9kZXNCZXR3ZWVuKFxuICAgICAgJHJhbmdlU3RhcnQucGFyZW50T2Zmc2V0LFxuICAgICAgJHJhbmdlRW5kLnBhcmVudE9mZnNldCxcbiAgICAgIChub2RlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdub2RlJywgbm9kZS50eXBlLm5hbWUsIG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGFpbnNOZXN0ZWRMaXN0IHx8IG5vZGUuaXNUZXh0YmxvY2spIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5vZGUudHlwZSA9PT0gc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0IHx8XG4gICAgICAgICAgbm9kZS50eXBlID09PSBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRhaW5zTmVzdGVkTGlzdCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgaWYgKGNvbnRhaW5zTmVzdGVkTGlzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW50aXJlbHkgd2l0aGluIGEgbGlzdCBsaWZ0IHRoZSBzZWxlY3RlZCBpdGVtcyBvdXRcbiAgICBsaWZ0TGlzdEl0ZW0oaXRlbVR5cGUpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG4gICAgZm9yIChcbiAgICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICAgIGluZGV4ICs9IDFcbiAgICApIHtcbiAgICAgIGlmIChibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCkudHlwZSA9PT0gbGlzdFR5cGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBwYXJ0aWFsbHkgaW5zaWRlIGEgbGlzdCwgZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZW50aXJlbHkgb3V0c2lkZSBhIGxpc3QsIGNvbnZlcnQgZXZlcnl0aGluZyB0byBhIHBhcmFncmFwaFxuICAgIC8vIHNvIGl0IGNhbiBzdWJzZXF1ZW50bHkgYmVjb21lIGEgbGlzdFxuICAgIHN3YXBUZXh0QmxvY2sodmlldywgc2NoZW1hLm5vZGVzLnBhcmFncmFwaCk7XG4gICAgY29uc3QgeyBkaXNwYXRjaCwgc3RhdGUgfSA9IHZpZXc7XG4gICAgd3JhcEluTGlzdChsaXN0VHlwZSkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgfVxufTtcblxuY29uc3QgdG9nZ2xlQ2hlY2tsaXN0SXRlbVN0YXRlOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuXG4gIGNvbnN0IGJsb2NrUmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG5cbiAgbGV0IGhhc0NoZWNrZWQgPSBmYWxzZTtcbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXgsIGNoaWxkID0gYmxvY2tSYW5nZS5wYXJlbnQuY2hpbGQoaW5kZXgpO1xuICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICBpbmRleCArPSAxXG4gICkge1xuICAgIGlmIChjaGlsZC50eXBlICE9PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSkge1xuICAgICAgaGFzQ2hlY2tlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXgsXG4gICAgICBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KSxcbiAgICAgIHBvcyA9IGJsb2NrUmFuZ2Uuc3RhcnQ7XG4gICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgIGluZGV4ICs9IDFcbiAgKSB7XG4gICAgdHIuc2V0Tm9kZU1hcmt1cChwb3MsIHVuZGVmaW5lZCwge1xuICAgICAgc3RhdHVzOiBoYXNDaGVja2VkID8gQ2hlY2tib3hTdGF0dXMuRU1QVFkgOiBDaGVja2JveFN0YXR1cy5ET05FLFxuICAgIH0pO1xuICAgIHBvcyArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgfVxuXG4gIGRpc3BhdGNoKHRyKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG50eXBlIG1vZGFsQ29uZmlybUhhbmRsZXIgPSAocGFyYW1zOiB7IHRleHQ6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSkgPT4gdm9pZDtcblxuY2xhc3MgTGlua01vZGFsIHtcbiAgcHJpdmF0ZSBlbDogRWxlbWVudDtcbiAgcHJpdmF0ZSBmcmFtZUVsOiBFbGVtZW50O1xuICBwcml2YXRlIHRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSB1cmw6IHN0cmluZztcbiAgcHJpdmF0ZSBvbkNvbmZpcm06IG1vZGFsQ29uZmlybUhhbmRsZXI7XG4gIHByaXZhdGUgb25DbGVhcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgc2hvd0NscyA9ICdhY3RpdmUnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsOiBFbGVtZW50LFxuICAgIHtcbiAgICAgIG9uQ29uZmlybSxcbiAgICAgIG9uQ2xlYXIsXG4gICAgICB0ZXh0LFxuICAgICAgdXJsLFxuICAgIH06IHtcbiAgICAgIG9uQ2xlYXI/OiAoKSA9PiB2b2lkO1xuICAgICAgb25Db25maXJtOiBtb2RhbENvbmZpcm1IYW5kbGVyO1xuICAgICAgdGV4dDogc3RyaW5nO1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy5lbCA9IGVsO1xuICAgIHRoaXMudGV4dElucHV0LnZhbHVlID0gdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLnVybElucHV0LnZhbHVlID0gdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5vbkNvbmZpcm0gPSBvbkNvbmZpcm07XG4gICAgdGhpcy5vbkNsZWFyID0gb25DbGVhcjtcbiAgICB0aGlzLmZyYW1lRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcjZnJhbWUnKTtcblxuICAgIGlmIChvbkNsZWFyKSB7XG4gICAgICB0aGlzLmNsZWFyQnRuLmNsYXNzTGlzdC5hZGQodGhpcy5zaG93Q2xzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckJ0bi5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2hvd0Nscyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKHRoaXMuc2hvd0Nscyk7XG4gICAgdGhpcy5jb25maXJtQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDb25maXJtKTtcbiAgICB0aGlzLmNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FuY2VsKTtcbiAgICB0aGlzLmNsZWFyQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGVhcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlR2xvYmFsS2V5ZG93bik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUdsb2JhbENsaWNrKTtcbiAgICB0aGlzLnVybElucHV0LmZvY3VzKCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSA9ICgpID0+IHtcbiAgICB0aGlzLmNvbmZpcm1CdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNvbmZpcm0pO1xuICAgIHRoaXMuY2FuY2VsQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDYW5jZWwpO1xuICAgIHRoaXMuY2xlYXJCdG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsZWFyKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVHbG9iYWxLZXlkb3duKTtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5zaG93Q2xzKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNvbmZpcm0gPSAoKSA9PiB7XG4gICAgdGhpcy5vbkNvbmZpcm0oe1xuICAgICAgdGV4dDogdGhpcy50ZXh0SW5wdXQudmFsdWUsXG4gICAgICB1cmw6IHRoaXMudXJsSW5wdXQudmFsdWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNsZWFyID0gKCkgPT4ge1xuICAgIHRoaXMub25DbGVhcigpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsS2V5ZG93biA9IChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNFbnRlciA9IGUua2V5ID09PSAnRW50ZXInO1xuICAgIGlmIChcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGV4dElucHV0IHx8XG4gICAgICAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy51cmxJbnB1dCAmJiBpc0VudGVyKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVDb25maXJtKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzRXNjID0gZS5rZXkgPT09ICdFc2NhcGUnO1xuICAgIGlmIChpc0VzYykge1xuICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVHbG9iYWxDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuZnJhbWVFbC5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG5cbiAgZ2V0IHRleHRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCN0ZXh0JykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgfVxuXG4gIGdldCB1cmxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCN1cmwnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgZ2V0IGNvbmZpcm1CdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignYnV0dG9uI2NvbmZpcm0nKTtcbiAgfVxuXG4gIGdldCBjYW5jZWxCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignYnV0dG9uI2NhbmNlbCcpO1xuICB9XG5cbiAgZ2V0IGNsZWFyQnRuKCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiNjbGVhcicpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUb29sYmFyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgcHJpdmF0ZSB2aWV3OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIG1vZGFsRWw6IEVsZW1lbnQ7XG4gIHByaXZhdGUgdG9vbGJhckVsOiBFbGVtZW50O1xuICBwcml2YXRlIG1vZGFsOiBMaW5rTW9kYWw7XG5cbiAgcHJpdmF0ZSBzd2FwVGV4dEJsb2NrID0gKG5vZGVUeXBlOiBOb2RlVHlwZSkgPT4ge1xuICAgIHN3YXBUZXh0QmxvY2sodGhpcy52aWV3LCBub2RlVHlwZSk7XG4gICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwcm9tb3RlSGVhZGluZyA9IChzdGF0ZTogRWRpdG9yU3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IHN0YXRlO1xuICAgIGlmICghc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgICRmcm9tOiB7XG4gICAgICAgIHBhcmVudDogeyB0eXBlIH0sXG4gICAgICB9LFxuICAgIH0gPSBzZWxlY3Rpb247XG4gICAgbGV0IG5leHRUeXBlOiBOb2RlVHlwZTtcbiAgICBpZiAodHlwZSA9PT0gc2NoZW1hLm5vZGVzLmhlYWRpbmcyKSB7XG4gICAgICBuZXh0VHlwZSA9IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMykge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMuaGVhZGluZzI7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBzY2hlbWEubm9kZXMuaGVhZGluZzEpIHtcbiAgICAgIG5leHRUeXBlID0gc2NoZW1hLm5vZGVzLnBhcmFncmFwaDtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMuaGVhZGluZzM7XG4gICAgfVxuICAgIHRoaXMuc3dhcFRleHRCbG9jayhuZXh0VHlwZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0b2dnbGVMaXN0ID0gKGxpc3RUeXBlOiBOb2RlVHlwZSwgaXRlbVR5cGU6IE5vZGVUeXBlKSA9PiB7XG4gICAgdG9nZ2xlTGlzdCh0aGlzLnZpZXcsIGxpc3RUeXBlLCBpdGVtVHlwZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0b2dnbGVDaGVja2xpc3RJdGVtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZGlzcGF0Y2gsIHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyBkb2MsIHRyIH0gPSBzdGF0ZTtcbiAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBjb25zdCBibG9ja1JhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pO1xuXG4gICAgZm9yIChcbiAgICAgIGxldCBpbmRleCA9IGJsb2NrUmFuZ2Uuc3RhcnRJbmRleDtcbiAgICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICAgIGluZGV4ICs9IDFcbiAgICApIHtcbiAgICAgIGlmIChibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCkudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtKSB7XG4gICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN3YXBUZXh0QmxvY2soc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtKTtcbiAgfTtcblxuICBwcml2YXRlIGFjdGl2YXRlTGlua01vZGFsOiBDb21tYW5kID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgZG9jLCBzZWxlY3Rpb24gfSA9IHN0YXRlO1xuICAgIGNvbnN0IHsgJGZyb20sICR0byB9ID0gc2VsZWN0aW9uO1xuICAgIGNvbnN0IGxpbmtNYXJrQXRTdGFydCA9ICRmcm9tXG4gICAgICAubWFya3MoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChtYXJrKSA9PlxuICAgICAgICAgIG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmsgJiYgIW1hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdLFxuICAgICAgKTtcbiAgICBjb25zdCBsaW5rTWFya0F0RW5kID0gJHRvXG4gICAgICAubWFya3MoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChtYXJrKSA9PlxuICAgICAgICAgIG1hcmsudHlwZSA9PT0gc2NoZW1hLm1hcmtzLmxpbmsgJiYgIW1hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdLFxuICAgICAgKTtcbiAgICBjb25zdCBzZWxlY3Rpb25Jc0luc2lkZUxpbmsgPSBsaW5rTWFya0F0U3RhcnQgJiYgbGlua01hcmtBdEVuZDtcblxuICAgIGlmIChzZWxlY3Rpb24uZW1wdHkgJiYgIXNlbGVjdGlvbklzSW5zaWRlTGluaykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGlua01hcmtBdFN0YXJ0ICE9PSBsaW5rTWFya0F0RW5kKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZGlzcGF0Y2gpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcmsgPSBsaW5rTWFya0F0U3RhcnQ7XG4gICAgbGV0IGVuZCwgc3RhcnQsIHRleHQsIHVybDtcbiAgICBpZiAobWFyaykge1xuICAgICAgY29uc3QgdGV4dE5vZGUgPSAkZnJvbS5wYXJlbnQubm9kZUF0KFxuICAgICAgICAkZnJvbS5wYXJlbnRPZmZzZXQgLSAkZnJvbS50ZXh0T2Zmc2V0LFxuICAgICAgKTtcbiAgICAgIHN0YXJ0ID0gJGZyb20ucG9zIC0gJGZyb20udGV4dE9mZnNldDtcbiAgICAgIGVuZCA9IHN0YXJ0ICsgdGV4dE5vZGUubm9kZVNpemU7XG4gICAgICB0ZXh0ID0gdGV4dE5vZGUudGV4dDtcbiAgICAgIHVybCA9IG1hcmsuYXR0cnMuaHJlZjtcbiAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKFxuICAgICAgICBkb2MucmVzb2x2ZShzdGFydCksXG4gICAgICAgIGRvYy5yZXNvbHZlKGVuZCksXG4gICAgICApO1xuICAgICAgZGlzcGF0Y2goc3RhdGUudHIuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSAkdG8ucG9zO1xuICAgICAgc3RhcnQgPSAkZnJvbS5wb3M7XG4gICAgICB0ZXh0ID0gc3RhdGUuZG9jLnRleHRCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcyk7XG4gICAgICB1cmwgPSAnJztcbiAgICB9XG5cbiAgICBjb25zdCBvbkNsZWFyID1cbiAgICAgIG1hcmsgJiZcbiAgICAgICgoKSA9PlxuICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2goXG4gICAgICAgICAgdGhpcy52aWV3LnN0YXRlLnRyLnN0ZXAobmV3IFJlbW92ZU1hcmtTdGVwKHN0YXJ0LCBlbmQsIG1hcmspKSxcbiAgICAgICAgKSk7XG5cbiAgICB0aGlzLm1vZGFsID0gbmV3IExpbmtNb2RhbCh0aGlzLm1vZGFsRWwsIHtcbiAgICAgIG9uQ2xlYXIsXG4gICAgICBvbkNvbmZpcm06ICh7IHRleHQsIHVybCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBzY2hlbWEubWFya3MubGluay5jcmVhdGUoeyBocmVmOiB1cmwgfSk7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gc2NoZW1hLnRleHQodGV4dCwgW21hcmtdKTtcbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKFxuICAgICAgICAgIHRoaXMudmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aCh0ZXh0Tm9kZSwgZmFsc2UpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHRleHQsXG4gICAgICB1cmwsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZU1hcmsgPSAobWFyazogTWFya1R5cGUpID0+IHtcbiAgICB0b2dnbGVNYXJrKG1hcmspKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcih0b29sYmFyRWw6IEVsZW1lbnQsIG1vZGFsRWw6IEVsZW1lbnQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2aWV3OiAodmlld0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXdJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5tb2RhbEVsID0gbW9kYWxFbDtcbiAgICAgICAgdGhpcy50b29sYmFyRWwgPSB0b29sYmFyRWw7XG5cbiAgICAgICAgdG9vbGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVUb29sYmFyQ2xpY2spO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgdG9vbGJhckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVUb29sYmFyQ2xpY2spO1xuICAgICAgICAgICAgdGhpcy51bmhpZ2hsaWdodFNlbGVjdGVkQXR0cnMoKTtcbiAgICAgICAgICAgIHRoaXMubW9kYWw/LmRlc3Ryb3koKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwZGF0ZTogKHZpZXcsIF9wcmV2aW91c1N0YXRlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2xiYXJGb3JTZWxlY3Rpb24odmlldy5zdGF0ZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBwcm9wczoge1xuICAgICAgICBoYW5kbGVLZXlEb3duOiAoX3ZpZXcsIGUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNDdHJsID0gZS5jdHJsS2V5O1xuICAgICAgICAgIGNvbnN0IGhhc01vZCA9IGUubWV0YUtleTtcbiAgICAgICAgICBjb25zdCBoYXNTaGlmdCA9IGUuc2hpZnRLZXk7XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ2wnKSB7XG4gICAgICAgICAgICBpbmRlbnRMaXN0SXRlbSh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICdoJykge1xuICAgICAgICAgICAgb3V0ZGVudExpc3RJdGVtKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZS5rZXkgPT09ICdUYWInICYmICFoYXNDdHJsICYmICFoYXNNb2QpIHtcbiAgICAgICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgICBvdXRkZW50TGlzdEl0ZW0odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaW5kZW50TGlzdEl0ZW0odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAndCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hlY2tsaXN0SXRlbSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc01vZCAmJiBlLmtleSA9PT0gJzcnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ3UnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ28nKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3Qoc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJz0nKSB7XG4gICAgICAgICAgICB0aGlzLnByb21vdGVIZWFkaW5nKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAnaicpIHtcbiAgICAgICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZShcbiAgICAgICAgICAgICAgdGhpcy52aWV3LnN0YXRlLFxuICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd6Jykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdpJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5lbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAnYicpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFyayhzY2hlbWEubWFya3Muc3Ryb25nKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSBcIidcIikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5jb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlVG9vbGJhckZvclNlbGVjdGlvbiA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICB0aGlzLnVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycygpO1xuICAgIGNvbnN0IHNlbGVjdGVkQXR0cnMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0QXR0cnMoc3RhdGUpO1xuICAgIGlmIChzZWxlY3RlZEF0dHJzKSB7XG4gICAgICBzZWxlY3RlZEF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgY29uc3QgYnRuID0gdGhpcy50b29sYmFyRWwucXVlcnlTZWxlY3RvcihgW2RhdGEtZm9ybWF0PSR7YXR0cn1dYCk7XG4gICAgICAgIGlmIChidG4pIHtcbiAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycyA9ICgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEJ0bnMgPSB0aGlzLnRvb2xiYXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBzZWxlY3RlZEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0U2VsZWN0ZWRGb3JtYXRBbmRNYXJrcyA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICBpZiAoIXN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoXG4gICAgICAkdG8sXG4gICAgICAobm9kZSkgPT4gbm9kZS50eXBlICE9PSBzY2hlbWEubm9kZXMubGlzdF9pdGVtLFxuICAgICk7XG5cbiAgICBsZXQgc2VsZWN0ZWQgPSBudWxsO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgICBpbmRleCArPSAxXG4gICAgKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUeXBlID1cbiAgICAgICAgY2hpbGQudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbVxuICAgICAgICAgID8gYmxvY2tSYW5nZS5wYXJlbnQudHlwZVxuICAgICAgICAgIDogY2hpbGQudHlwZTtcblxuICAgICAgaWYgKHNlbGVjdGVkID09PSBudWxsKSB7XG4gICAgICAgIHNlbGVjdGVkID0gY3VycmVudFR5cGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGVkICE9PSBjdXJyZW50VHlwZSkge1xuICAgICAgICBzZWxlY3RlZCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucHVzaChzZWxlY3RlZCk7XG5cbiAgICBsZXQgbWFya3MgPSAkZnJvbS5wb3MgPT09ICR0by5wb3MgPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3MoJHRvKTtcbiAgICBpZiAoc3RhdGUuc2VsZWN0aW9uLmVtcHR5ICYmIHN0YXRlLnN0b3JlZE1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzO1xuICAgIH1cblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ubWFya3MubWFwKChtYXJrKSA9PiBtYXJrLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGdldFNlbGVjdGVkRm9ybWF0QXR0cnMgPSAoc3RhdGU6IEVkaXRvclN0YXRlKSA9PiB7XG4gICAgY29uc3QgW25vZGVUeXBlLCAuLi5tYXJrVHlwZXNdID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEFuZE1hcmtzKHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLmhlYWRpbmcxOlxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuaGVhZGluZzI6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2hlYWRpbmcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGg6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ3BhcmFncmFwaCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0OiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCd1bm9yZGVyZWRfbGlzdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdDoge1xuICAgICAgICByZXN1bHQucHVzaCgnb3JkZXJlZF9saXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW06IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ2NoZWNrbGlzdF9pdGVtJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXN1bHQucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWFya1R5cGVzLmZvckVhY2goKG1hcmtUeXBlKSA9PiB7XG4gICAgICBzd2l0Y2ggKG1hcmtUeXBlKSB7XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmxpbms6IHtcbiAgICAgICAgICByZXN1bHQucHVzaCgnbGluaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmlubGluZV9saW5rOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2xpbmsnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5lbToge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdlbScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLnN0cm9uZzoge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdzdHJvbmcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIHNjaGVtYS5tYXJrcy5jb2RlOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2NvZGUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBoYW5kbGVUb29sYmFyQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KGBbJHtBUFBMWV9GT1JNQVRfQVRUUn1dYCk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXQoYnV0dG9uLmdldEF0dHJpYnV0ZShBUFBMWV9GT1JNQVRfQVRUUikpO1xuICAgIH1cbiAgfTtcblxuICBhcHBseUZvcm1hdCA9IChkYXRhRm9ybWF0U3RyOiBzdHJpbmcpID0+IHtcbiAgICBzd2l0Y2ggKGRhdGFGb3JtYXRTdHIpIHtcbiAgICAgIGNhc2UgJ3VuZG8nOiB7XG4gICAgICAgIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlZG8nOiB7XG4gICAgICAgIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvZGVfYmxvY2snOiB7XG4gICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMuY29kZV9ibG9jayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGluZyc6IHtcbiAgICAgICAgdGhpcy5wcm9tb3RlSGVhZGluZyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5vcmRlcmVkX2xpc3QnOiB7XG4gICAgICAgIHRoaXMudG9nZ2xlTGlzdChzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29yZGVyZWRfbGlzdCc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVMaXN0KHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QsIHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NoZWNrbGlzdF9pdGVtJzoge1xuICAgICAgICB0aGlzLnRvZ2dsZUNoZWNrbGlzdEl0ZW0oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJvbmcnOlxuICAgICAgY2FzZSAnZW0nOlxuICAgICAgY2FzZSAnY29kZSc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrc1tkYXRhRm9ybWF0U3RyXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGluayc6IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5kZW50Jzoge1xuICAgICAgICBpbmRlbnRMaXN0SXRlbSh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnb3V0ZGVudCc6IHtcbiAgICAgICAgb3V0ZGVudExpc3RJdGVtKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7XG4gIFBsdWdpbixcbiAgRWRpdG9yU3RhdGUsXG4gIFNlbGVjdGlvbixcbiAgVGV4dFNlbGVjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IFNIT1dfQ0xTID0gJ3Nob3cnO1xuXG5jb25zdCBIVFRQX0xJTksgPSBuZXcgUmVnRXhwKCdeaHR0cHM/Oi8vJyk7XG5cbmNvbnN0IE1BSUxUT19MSU5LID0gbmV3IFJlZ0V4cCgnXm1haWx0bzonKTtcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHRvb2x0aXBFbDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcblxuICBzdGF0aWMgbm9kZVRvQW5jaG9ySHJlZih1cmw6IHN0cmluZykge1xuICAgIGlmIChIVFRQX0xJTksudGVzdCh1cmwpIHx8IE1BSUxUT19MSU5LLnRlc3QodXJsKSkge1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcmV0dXJuIGBodHRwOi8vJHt1cmx9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZpZXc6ICh2aWV3SW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlld0luc3RhbmNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlOiAodmlldywgcHJldmlvdXNTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1NlbGVjdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy50b29sdGlwRWwgPSBlbDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgJGN1cnNvciB9ID0gc2VsZWN0aW9uO1xuXG4gICAgY29uc3Qgd2l0aGluTGluayA9IEJvb2xlYW4oXG4gICAgICAkY3Vyc29yICYmXG4gICAgICAgICRjdXJzb3Iubm9kZUJlZm9yZSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlciAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVCZWZvcmUubWFya3Muc29tZShcbiAgICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgKSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlci5tYXJrcy5zb21lKChtYXJrKSA9PiBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rKSxcbiAgICApO1xuXG4gICAgaWYgKHdpdGhpbkxpbmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXJrID0gJGN1cnNvci5ub2RlQmVmb3JlLm1hcmtzLmZpbmQoXG4gICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICApO1xuXG4gICAgdGhpcy5zaG93KCRjdXJzb3IsIG1hcmsuYXR0cnMuaHJlZiwgbWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGlkZSA9ICgpID0+IHtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QucmVtb3ZlKFNIT1dfQ0xTKTtcbiAgfTtcblxuICBwcml2YXRlIHNob3cgPSAoJHBvczogUmVzb2x2ZWRQb3MsIHVybDogc3RyaW5nLCBpc0F1dG9MaW5rOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5saW5rVGV4dEVsLmlubmVyVGV4dCA9IHVybDtcbiAgICB0aGlzLmFuY2hvckVsLmhyZWYgPSBUb29sdGlwUGx1Z2luLm5vZGVUb0FuY2hvckhyZWYodXJsKTtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QudG9nZ2xlKCd5ZXMtYXV0by1saW5rJywgaXNBdXRvTGluayk7XG4gICAgdGhpcy50b29sdGlwRWwuY2xhc3NMaXN0LmFkZChTSE9XX0NMUyk7XG5cbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gdGhpcy52aWV3LmNvb3Jkc0F0UG9zKCRwb3MucG9zKTtcbiAgICBjb25zdCBhY3R1YWxXaWR0aCA9IHRoaXMudG9vbHRpcEVsLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIC8vIHRvb2x0aXAgbWF4LXdpZHRoIGlzIDEwMCUgLSAxMCwgZm9yIDVweCBvZiBzcGFjZSBmcm9tIGVhY2ggd2luZG93IGVkZ2VcbiAgICBpZiAobGVmdCArIGFjdHVhbFdpZHRoID4gYXZhaWxhYmxlV2lkdGgpIHtcbiAgICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCg1LCBsZWZ0IC0gYWN0dWFsV2lkdGgpfXB4YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwRWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDUsIGxlZnQpfXB4YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZWQgPSAodGhpcy52aWV3LnJvb3QgYXMgRG9jdW1lbnQpLmJvZHk7XG4gICAgLy8gUHVsbCB0b3AgdXAgYnkgcHJlc3VtZWQgaGVpZ2h0IG9mIHRvb2x0aXAgcGx1cyBzb21lIG1hcmdpblxuICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLnRvcCA9IGAke3RvcCAtIDM2ICsgc2Nyb2xsZWQuc2Nyb2xsVG9wfXB4YDtcbiAgfTtcblxuICBnZXQgbGlua1RleHRFbCgpOiBIVE1MU3BhbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRvb2x0aXBFbC5xdWVyeVNlbGVjdG9yKCdkaXYudGV4dCcpO1xuICB9XG5cbiAgZ2V0IGFuY2hvckVsKCk6IEhUTUxBbmNob3JFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwRWwucXVlcnlTZWxlY3RvcignYS5saW5rLWFuY2hvcicpO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS05IDE0bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6XFxcIj48L3BhdGg+PC9zdmc+XCIiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjwvc3ZnPlwiIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGVja2JveCB9IGZyb20gJy4vY2hlY2tfYm94LTI0cHguc3ZnJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tib3hPdXRsaW5lIH0gZnJvbSAnLi9jaGVja19ib3hfb3V0bGluZV9ibGFuay0yNHB4LnN2Zyc7XG4iLCIvLyBJbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIFN0YW5kYXJkIE5vdGVzIGNsaWVudCBoYXMgbm8gZWZmZWN0LFxuLy8gdGhpcyBtb2R1bGUgd2lsbCBiZSBzd2FwcGVkIGluIGZvciBjbGllbnQudHMuXG5cbmltcG9ydCB7IERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCBkZW1vTWFya2Rvd24gZnJvbSAnLi9kZW1vRG9jcy5tZCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBtYXJrZG93blNlcmlhbGl6ZXIgfSBmcm9tICcuL21hcmtkb3duJztcblxuY2xhc3MgRGVtb0NsaWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgZ2V0IGxhdGVzdFRleHQoKSB7XG4gICAgcmV0dXJuIGRlbW9NYXJrZG93bjtcbiAgfVxuICByZWFkeSgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgb25VcGRhdGUoKSB7fVxuICBzYXZlTm90ZShqc29uRG9jOiB7fSwgbWREb2M6IHN0cmluZywgdGV4dFByZXZpZXc6IHN0cmluZykge1xuICAgICh3aW5kb3cgYXMgYW55KS5zYXZlTm90ZUFyZ3MgPSB7IGpzb25Eb2MsIG1kRG9jLCB0ZXh0UHJldmlldyB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjbGllbnQgPSBuZXcgRGVtb0NsaWVudCgpO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCIjIFNjcmF0Y2gsIGEgU3RhbmRhcmQgTm90ZXMgZWRpdG9yIGV4dGVuc2lvblxcblxcblNjcmF0Y2ggaXMgYW4gZWRpdG9yIGV4dGVuc2lvbiBmb3IgW1N0YW5kYXJkIE5vdGVzXShodHRwczovL3N0YW5kYXJkbm90ZXMub3JnLyksIGEgbm90ZS10YWtpbmcgYXBwIHRoYXQgZW1waGFzaXplcyBwcml2YWN5LCBzZWN1cml0eSwgYW5kIHN1c3RhaW5hYmlsaXR5LiBJZiB5b3UgZG9u4oCZdCBrbm93IHdoYXQgU3RhbmRhcmQgTm90ZXMgaXMsIHlvdSBhcmUgcHJvYmFibHkgaW4gdGhlIHdyb25nIHBsYWNlLlxcblxcblNjcmF0Y2ggaW5jbHVkZXMgbW9zdCBvZiB0aGUgdGV4dCBlZGl0aW5nIGZlYXR1cmVzIHlvdSB3b3VsZCBleHBlY3QgZm9yIHRha2luZyBub3RlcywgbGlrZSBsaXN0cywgY2hlY2tib3hlcywgYmFzaWMgdGV4dCBmb3JtYXR0aW5nLCBzbWFydCBjb3B5L3Bhc3RlLCBhbmQgaG90a2V5cy4gSXQgdXNlcyB0aGUgbGlicmFyeSBbUHJvc2VNaXJyb3JdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0LykgdG8gbWFrZSB0aG9zZSBmZWF0dXJlcyBwb3NzaWJsZS4gVGhpcyBwYWdlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBlZGl0b3IuIEdpdmUgaXQgYSB0cnkhXFxuXFxuIyMgSW5zdGFsbGF0aW9uXFxuXFxuVG8gdXNlIHRoZSBTY3JhdGNoIGVkaXRvciBpbiBTdGFuZGFyZCBOb3RlcywgY2xpY2sgRXh0ZW5zaW9ucyBpbiB0aGUgbG93ZXIgbGVmdCBoYW5kIGNvcm5lciBvZiB0aGUgZGVza3RvcCBhcHAuIENsaWNrIOKAnEltcG9ydCBFeHRlbnNpb27igJ0gYW5kIHBhc3RlIGluIHRoZSBmb2xsb3dpbmcgdXJsOiA8aHR0cHM6Ly9zY3JhdGNoLWVkaXRvci5jb20vZXh0Lmpzb24+LiBZb3Ugd2lsbCB0aGVuIGhhdmUgYWNjZXNzIHRvIHRoZSBlZGl0b3Igb24gYWxsIHRoZSBTdGFuZGFyZCBOb3RlcyBhcHBzIGFuZCB3aWxsIHJlY2VpdmUgdXBkYXRlcyB0byB0aGUgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkuXFxuXFxuIyMgRm9ybWF0dGluZyB5b3VyIG5vdGVzXFxuXFxuU2NyYXRjaCBpbmNsdWRlcyBhIG51bWJlciBvZiB3YXlzIHRvIGZvcm1hdCB5b3VyIG5vdGVzLiBJdCBoYXMgKipib2xkKiosIF9pdGFsaWNfLCBhbmQgYG1vbm9zcGFjZWAgdGV4dCwgYW5kIGl0IGxldHMgeW91IGFkZCBbbGlua3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9keWxhbm9uZWxzb24vc24tc2NyYXRjaC1lZGl0b3IpLiBJdCBpbmNsdWRlcyB0aHJlZSBsZXZlbHMgb2YgaGVhZHMsIHR3byB0eXBlcyBvZiBsaXN0cywgYW5kIHRvZG8gaXRlbXMgdGhhdCBoYXZlIGEgY2hlY2tib3guIFNjcmF0Y2ggdHJpZXMgdG8gYmUgc21hcnQgYWJvdXQgc3BhY2luZyBzbyB0aGF0IHlvdSBkb27igJl0IGhhdmUgdG8gaW5zZXJ0IGVtcHR5IGxpbmVzLlxcblxcbiMjIEhvdyB0byB1c2UgdGhpcyBlZGl0b3JcXG5cXG5bIF1bZG93bmxvYWQgdGhlIGRlc2t0b3AgY2xpZW50XShodHRwczovL3N0YW5kYXJkbm90ZXMub3JnLykgb3IgZ28gdG8gdGhlIFt3ZWIgYXBwXShodHRwczovL2FwcC5zdGFuZGFyZG5vdGVzLm9yZy8pXFxuXFxuWyBdIE9wZW4gdGhlIGV4dGVuc2lvbnMgbWVudSBpbiB0aGUgbG93ZXIgbGVmdC1oYW5kIGNvcm5lclxcblxcblsgXSBJbnN0YWxsIHRoZSBTY3JhdGNoIGV4dGVuc2lvbiBieSBjbGlja2luZyDigJxJbXBvcnQgRXh0ZW5zaW9u4oCdIGFuZCBwYXN0aW5nIHRoZSBkb3dubG9hZCBsaW5rOiBgaHR0cHM6Ly9zY3JhdGNoLWVkaXRvci5jb20vZXh0Lmpzb25gXFxuXFxuIyMgSG90a2V5c1xcblxcbllvdSBjYW4gYWxzbyBzZWUgYSBsZWdlbmQgZm9yIG1hbnkgb2YgdGhlc2UgaG90a2V5cyBpbiB0aGUgYWx0IHRleHQgb2YgdGhlIHRvb2xiYXIgYnV0dG9ucy5cXG5cXG4tIGBjdHJsICsgPWAgY3ljbGVzIHRocm91Z2ggdGhlIGxldmVscyBvZiBoZWFkaW5ncyAodGhlcmUgYXJlIHRocmVlKVxcblxcbi0gYGN0cmwgKyBqYCB0dXJucyB0aGUgY3VycmVudCB0ZXh0IGNodW5rIGludG8gYSBwbGFpbiBwYXJhZ3JhcGhcXG5cXG4tIGBjdHJsICsgdWAgd3JhcHMgdGhlIGN1cnJlbnQgdGV4dCBjaHVuayBpbiBhIGJ1bGxldGVkIGxpc3RcXG5cXG4tIGBjdHJsICsgb2Agd3JhcHMgdGhlIGN1cnJlbnQgdGV4dCBjaHVuayBpbiBhIG51bWJlcmVkIGxpc3RcXG5cXG4tIGBjdHJsICsgdGAgY3JlYXRlcyBhIGNoZWNrbGlzdCBpdGVtIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBjaHVua1xcblxcbi0gYGNtZCArIGJgIC8gYGN0cmwgKyBiYCB0b2dnbGVzIGJvbGQgZm9ybWF0dGluZyBvbiBhbmQgb2ZmXFxuXFxuLSBgY21kICsgaWAgLyBgY3RybCArIGlgIHRvZ2dsZXMgaXRhbGljIGZvcm1hdHRpbmcgb24gYW5kIG9mZlxcblxcbi0gYGNtZCArICdgIC8gYGN0cmwgKyAnYCB0b2dnbGVzIG1vbm9zcGFjZSBmb3JtYXR0aW5nIG9uIGFuZCBvZmZcXG5cXG4tIGBjbWQgKyBzcGFjZWAgLyBgY3RybCArIHNwYWNlYCBjaGVja3Mgb3IgdW5jaGVja3MgYSBjaGVja2JveCBpZiB5b3VyIGN1cnNvciBpcyBpbnNpZGUgaXRzIGF0dGFjaGVkIHRleHRcXG5cXG4tIGBjbWQgKyBrYCAvIGBjdHJsICsga2Agb3BlbnMgYSBsaW5rIGVkaXRpbmcgZGlhbG9nXFxuXFxuLSBgY21kICsgemAgLyBgY3RybCArIHpgIGlzIHVuZG9cXG5cXG4tIGBjbWQgKyB5YCAvIGBjdHJsICsgeWAgaXMgcmVkb1xcblxcbiMjIEZvcm1hdHRpbmcgbWFjcm9zXFxuXFxuLSBzbWFydCBjdXJseSBxdW90ZSBhbmQgYXBvc3Ryb3BoZSBzdWJzdGl0dXRpb25cXG5cXG4tIGluc2VydCBoZWFkaW5ncyBieSB0eXBpbmcgYCNgIG9yIGAjI2Agb3IgYCMjI2BcXG5cXG4tIGluc2VydCBidWxsZXRlZCBsaXN0cyBieSB0eXBpbmcgYC1gXFxuXFxuLSBpbnNlcnQgbnVtYmVyZWQgbGlzdHMgYnkgdHlwaW5nIGAxLmBcXG5cXG4tIGluc2VydCBib2xkIHRleHQgYnkgd3JhcHBpbmcgaXQgaW4gYCpgXFxuXFxuLSBpbnNlcnQgaXRhbGljIHRleHQgYnkgd3JhcHBpbmcgaXQgaW4gYF9gXFxuXFxuLSBpbnNlcnQgYSBjb2RlIGJsb2NrIGJ5IHR5cGluZyB0aHJlZSBiYWNrdGlja3MgYCBgYGAgYFxcblxcbiMjIE1hcmtkb3duIGludGVncmF0aW9uXFxuXFxuU2NyYXRjaCBzYXZlcyB5b3VyIG5vdGUgYXMgbWFya2Rvd24gdGV4dC4gVGhhdCBtZWFucyB0aGF0IGlmIHlvdSB3cml0ZSB5b3VyIG5vdGVzIGluIFNjcmF0Y2gsIHlvdSBjYW4gYWxzbyBlZGl0IHRoZW0gaW4gdGhlIG90aGVyIG1hcmtkb3duIGVkaXRvcnMgdGhhdCBjb21lIHdpdGggU3RhbmRhcmQgTm90ZXMuIEl0IGFsc28gbWVhbnMgdGhhdCBpZiB5b3Ugd2FudCB0byBzdG9wIHVzaW5nIFNjcmF0Y2gsIHlvdSBjYW4gc2ltcGx5IHVuaW5zdGFsbCBpdCBhbmQgZm9yZ2V0IHRoYXQgaXQgZXZlciBleGlzdGVkLiBZb3UgY2FuIHNlZSB3aGF0IHRoaXMgdGV4dCBsb29rcyBsaWtlIGluIG1hcmtkb3duIGJ5IHZpZXdpbmcgW3RoZSBzb3VyY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9keWxhbm9uZWxzb24vc24tc2NyYXRjaC1lZGl0b3IvYmxvYi9tYXN0ZXIvc3JjL2RlbW9Eb2NzLm1kKS5cXG5cXG5JZiB5b3UgZWRpdCBhIG5vdGUgaW4gYSBkaWZmZXJlbnQgZWRpdG9yLCBhbmQgdGhlbiBvcGVuIGl0IGluIFNjcmF0Y2gsIFNjcmF0Y2ggd2lsbCBwaWNrIHVwIHlvdXIgY2hhbmdlcyAoYXNzdW1pbmcgdGhvc2UgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbWFya2Rvd24gdGV4dCBvZiB0aGUgbm90ZSwgYW5kIG5vdCB1c2luZyBzb21lIG90aGVyIGN1c3RvbSBmb3JtYXQpLiBIb3dldmVyLCB0aGVyZSBhcmUgY2VydGFpbiBraW5kcyBvZiBmb3JtYXR0aW5nIHRoYXQgbWFya2Rvd24gc3VwcG9ydHMgdGhhdCBTY3JhdGNoIGRvZXMgbm90LCBhdCBsZWFzdCBub3QgeWV0LiBJZiB5b3UgYWRkIHNvbWUgdGV4dCBvZiB0aGlzIGtpbmQsIGxpa2UgZm9yIGV4YW1wbGUgYSBibG9jayBxdW90ZSwgU2NyYXRjaCB3aWxsIHJlbmRlciBpdCBhcyBhIHNwZWNpYWwgdHlwZSBvZiDigJxlc2NhcGVk4oCdIGNvZGUgYmxvY2suIFRoZXNlIGJsb2NrcyBhcmUgc2F2ZWQgYmFjayB0byB0aGUgdW5kZXJseWluZyBtYXJrZG93biBub3RlIGFzIHB1cmUgbWFya2Rvd24sIG5vdCBhcyBhIGNvZGUgYmxvY2suIElmIHlvdSB3aW5kIHVwIHdpdGggb25lIG9mIHRoZXNlIHNwZWNpYWwgY29kZSBibG9ja3MgaW4geW91ciBub3RlLCB5b3Ugd2lsbCBzZWUgYW4gYWxlcnQgdG8gdGhhdCBlZmZlY3QgaW4gdGhlIHVwcGVyIHJpZ2h0LWhhbmQgY29ybmVyIG9mIHRoZSBjb2RlIGJsb2NrLlxcblxcblNjcmF0Y2ggbWFya2Rvd24gaXMgW0NvbW1vbk1hcmtdKGh0dHBzOi8vY29tbW9ubWFyay5vcmcvKSBtYXJrZG93biwgd2l0aCBvbmUgZXhjZXB0aW9uLiBTY3JhdGNoIGFkZHMgY2hlY2tsaXN0IGl0ZW1zIGluIHRoZSBmb2xsb3dpbmcgZm9ybTpcXG5cXG5gYGBcXG5bIF0gQW4gdW5jaGVja2VkIGl0ZW1cXG5beF0gQSBjaGVja2VkIGl0ZW1cXG5bWF0gQW5vdGhlciBjaGVja2VkIGl0ZW1cXG5gYGBcXG5cXG5JZiB5b3UgY3JlYXRlLCBlZGl0LCBhbmQgdmlldyB5b3VyIGNoZWNrbGlzdHMgaW4gU2NyYXRjaCwgeW91IGRvbuKAmXQgaGF2ZSB0byB3b3JyeSBhYm91dCBob3cgdGhleSBsb29rIGluIG1hcmtkb3duLiBCdXQgaWYgeW914oCZZCBsaWtlIHRvIGVkaXQgeW91ciBub3RlcyBpbiBtYXJrZG93biBlZGl0b3JzLCB0b28sIHRoZW4ga25vdyB0aGF0IHRoaXMgaXMgd2hhdCBTY3JhdGNoIHRoaW5rcyBvZiBhcyBhIG1hcmtkb3duIGNoZWNrbGlzdC5cXG5cXG4jIyBDb21pbmcgc29vblxcblxcblNjcmF0Y2ggaXMgYSB3b3JrIGluIHByb2dyZXNzLiBJIGhhdmUgYSBydW5uaW5nIGxpc3Qgb2YgdGhpbmdzIEnigJlkIGxpa2UgdG8gYWRkLCBwcm92aWRlZCBJIGNhbiBmaW5kIHRoZSB0aW1lIGFuZCBtb3RpdmF0aW9uLiBZb3UgY2FuIHRoaW5rIG9mIHRoZSBmb2xsb3dpbmcgYXMgYSBsaXN0IG9mIHRoaW5ncyB0aGF0IFNjcmF0Y2ggX2RvZXNu4oCZdF8gaGF2ZSwgYXQgbGVhc3Qgbm90IHlldC5cXG5cXG4xLiB0YWJsZXMsIG9yIHNvbWV0aGluZyBsaWtlIHRoZW1cXG5cXG4xLiBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBvbmUtY2xpY2sgY29weS10by1jbGlwYm9hcmQgZm9yIGNvZGUgYmxvY2tzXFxuXFxuMS4gbmVzdGVkIGxpc3RzLCB3aXRoIGZ1bGwgc3VwcG9ydCBmb3IgbWFya2Rvd24gZm9ybWF0dGluZyB3aXRoaW4gbGlzdCBpdGVtc1xcblwiOyIsImltcG9ydCB7XG4gIGlucHV0UnVsZXMsXG4gIHNtYXJ0UXVvdGVzLFxuICBlbGxpcHNpcyxcbiAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSxcbiAgSW5wdXRSdWxlLFxufSBmcm9tICdwcm9zZW1pcnJvci1pbnB1dHJ1bGVzJztcbmltcG9ydCB7IFBsdWdpbiwgU2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgTWFya1R5cGUsIE5vZGVUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5mdW5jdGlvbiBtYXJrV3JhcHBpbmdSdWxlKFxuICBjOiBzdHJpbmcsXG4gIG1hcmtUeXBlOiBNYXJrVHlwZSxcbiAgaXNWYWxpZEluc2lkZUNvZGVNYXJrOiBib29sZWFuLFxuKSB7XG4gIHJldHVybiBuZXcgSW5wdXRSdWxlKFxuICAgIG5ldyBSZWdFeHAoYCR7Y30oXFxcXFMrKFxcXFxzK1xcXFxTKykqPykke2N9JGApLFxuICAgIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgIGNvbnN0IFtfLCB0ZXh0XSA9IG1hdGNoO1xuICAgICAgY29uc3QgeyB0ciB9ID0gc3RhdGU7XG4gICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGlzdGluZ01hcmtzID0gc3RhdGUuZG9jXG4gICAgICAgIC5yZXNvbHZlKHN0YXJ0KVxuICAgICAgICAubWFya3NBY3Jvc3Moc3RhdGUuZG9jLnJlc29sdmUoZW5kKSk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRyXG4gICAgICAgICAgLnJlcGxhY2VSYW5nZVdpdGgoXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIHNjaGVtYS50ZXh0KHRleHQsIFsuLi5leGlzdGluZ01hcmtzLCBtYXJrVHlwZS5jcmVhdGUoKV0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAvLyBBZGQgYSBzcGFjZSBhZnRlciB0aGUgdGV4dCBzbyB0aGUgaW5jbHVzaXZlIG1hcmsgcnVsZSBkb2Vzbid0IGFmZmVjdCB0aGUgZW5zdWluZyBpbnB1dFxuICAgICAgICAgIC5pbnNlcnQodHIuc2VsZWN0aW9uLmZyb20sIHNjaGVtYS50ZXh0KCcgJywgWy4uLmV4aXN0aW5nTWFya3NdKSlcbiAgICAgICAgICAuc2V0TWV0YSgnaGFzLWZvcmNlZC1zcGFjZS1mcm9tLWlucHV0LXJ1bGUnLCB7XG4gICAgICAgICAgICBlbmRQb3M6IHRyLnNlbGVjdGlvbi5mcm9tLFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH0sXG4gICAge1xuICAgICAgaW5Db2RlTWFyazogaXNWYWxpZEluc2lkZUNvZGVNYXJrLFxuICAgIH0sXG4gICk7XG59XG5cbmZ1bmN0aW9uIGxpc3RUeXBlUnVsZShwcmVmaXg6IHN0cmluZywgbGlzdFR5cGU6IE5vZGVUeXBlKTogSW5wdXRSdWxlIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoXG4gICAgbmV3IFJlZ0V4cChgXiR7cHJlZml4fSRgKSxcbiAgICAoc3RhdGUsIG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5LCBzdGFydCwgZW5kKSA9PiB7XG4gICAgICBjb25zdCAkZW5kID0gc3RhdGUuZG9jLnJlc29sdmUoZW5kKTtcbiAgICAgIGlmICgkZW5kLmRlcHRoID4gMSkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHJlYWR5IGluIGEgbGlzdDsgYWxsIG90aGVyIHBvc2l0aW9ucyBzaG91bGQgYmVcbiAgICAgICAgLy8gZGVwdGggMS5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU3VidHJhY3QgMiBoZXJlLCBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG5vZGUuXG4gICAgICBjb25zdCByYW5nZUFmdGVyUHJlZml4OiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgICBlbmQsXG4gICAgICAgIHN0YXJ0ICsgJGVuZC5wYXJlbnQubm9kZVNpemUgLSAyLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHNsaWNlQWZ0ZXJQcmVmaXggPSBzdGF0ZS5kb2Muc2xpY2UoLi4ucmFuZ2VBZnRlclByZWZpeCk7XG4gICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgIHRyLmRlbGV0ZVJhbmdlKC4uLnJhbmdlQWZ0ZXJQcmVmaXgpO1xuICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChzdGFydCwgZW5kLCBsaXN0VHlwZS5jcmVhdGVBbmRGaWxsKCkpO1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHN0YXJ0KSkpO1xuICAgICAgdHIuaW5zZXJ0KHRyLnNlbGVjdGlvbi5mcm9tLCBzbGljZUFmdGVyUHJlZml4LmNvbnRlbnQpO1xuICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKHN0YXJ0KSkpO1xuICAgICAgcmV0dXJuIHRyO1xuICAgIH0sXG4gICk7XG59XG5cbmNvbnN0IGFycm93Q2hhcnMgPSBbXG4gIG5ldyBJbnB1dFJ1bGUobmV3IFJlZ0V4cCgnPFxcXFwtPiQnKSwgJ+KGlCcsIHsgaW5Db2RlTWFyazogZmFsc2UgfSksXG4gIG5ldyBJbnB1dFJ1bGUobmV3IFJlZ0V4cCgnXFxcXC0+JCcpLCAn4oaSJywgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KSxcbl07XG5cbmV4cG9ydCBjb25zdCBpbnB1dFJ1bGVzUGx1Z2luID0gaW5wdXRSdWxlcyh7XG4gIHJ1bGVzOiBbXG4gICAgLi4uc21hcnRRdW90ZXMsXG4gICAgZWxsaXBzaXMsXG4gICAgLi4uYXJyb3dDaGFycyxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmcxKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyMgJC8sIHNjaGVtYS5ub2Rlcy5oZWFkaW5nMiksXG4gICAgdGV4dGJsb2NrVHlwZUlucHV0UnVsZSgvXiMjIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmczKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eYGBgJC8sIHNjaGVtYS5ub2Rlcy5jb2RlX2Jsb2NrKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdgJywgc2NoZW1hLm1hcmtzLmNvZGUsIGZhbHNlKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdcXFxcKicsIHNjaGVtYS5tYXJrcy5zdHJvbmcsIGZhbHNlKSxcbiAgICBtYXJrV3JhcHBpbmdSdWxlKCdfJywgc2NoZW1hLm1hcmtzLmVtLCBmYWxzZSksXG4gICAgbGlzdFR5cGVSdWxlKCcxLiAnLCBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0KSxcbiAgICBsaXN0VHlwZVJ1bGUoJy0gJywgc2NoZW1hLm5vZGVzLnVub3JkZXJlZF9saXN0KSxcbiAgXSxcbn0pO1xuXG5jb25zdCBSRVNFVF9IQVNfRk9SQ0VEX1NQQUNFX01FVEEgPSAncmVzZXQtaGFzLWZvcmNlZC1zcGFjZS1tZXRhJztcblxuLy8gQ3JlYXRlIGEgcGx1Z2luIHRoYXQgc3dhbGxvd3MgYSBzcGFjZSB0eXBlZCBieSB0aGUgdXNlciB3aGVuIHRoZXkndmUganVzdFxuLy8gaW52b2tlZCBhbiBpbnB1dCBydWxlIHRoYXQgaW5zZXJ0ZWQgYSBzcGFjZSBmb3IgdGhlbSwgdG8gYXZvaWQgdW5pbnRlbnRpb25hbFxuLy8gZG91YmxlIHNwYWNlcy5cbmV4cG9ydCBjb25zdCBpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4gPSBuZXcgUGx1Z2luPFxuICB7IGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSB9IHwgeyBoYXNGb3JjZWRTcGFjZTogdHJ1ZTsgZm9yY2VkU3BhY2VQb3M6IG51bWJlciB9XG4+KHtcbiAgc3RhdGU6IHtcbiAgICBpbml0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzRm9yY2VkU3BhY2U6IGZhbHNlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGFwcGx5KHRyLCBwcmV2aW91cykge1xuICAgICAgaWYgKHRyLmdldE1ldGEoUkVTRVRfSEFTX0ZPUkNFRF9TUEFDRV9NRVRBKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2aW91cy5oYXNGb3JjZWRTcGFjZSkge1xuICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHNjZW5hcmlvLCB0aGlzIGxvZ2ljIGNvdWxkIGJlIGluc3VmZmljaWVudCwgYnV0IGl0XG4gICAgICAgIC8vIHNob3VsZCB3b3JrIGZpbmUgZm9yIGFsbCBjdXJyZW50IHVzZSBjYXNlcy4gV2Ugd2FudCB0byBndWFyYW50ZWUgdGhhdFxuICAgICAgICAvLyBfb25seV8gd2hlbiB0aGUgdXNlciB0eXBlcyBhIHNwYWNlIGltbWVkaWF0ZWx5IGFmdGVyIHR5cGluZyB0aGVcbiAgICAgICAgLy8gY2xvc2luZyB3cmFwcGluZyBtYXJrIGNoYXJhY3RlciBkbyB3ZSBzdXBwcmVzcyB0aGF0IHNwYWNlIGNoYXJhY3Rlci5cbiAgICAgICAgLy8gU28gaWYgdGhleSBkbyBhbnl0aGluZyBlbHNlLCBsaWtlIGdvIHNvbWV3aGVyZSBlbHNlIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAvLyBvciB0eXBlIGEgZGlmZmVyZW50IGNoYXJhY3Rlciwgd2Ugc2hvdWxkIGNsZWFyIHRoZSBwbHVnaW4gc3RhdGUuIFRoaXNcbiAgICAgICAgLy8gY291bGQgZmFpbCBpbiBhIGNvbGxhYm9yYXRpdmUgc2NlbmFyaW8sIHdoZXJlIG90aGVycyBjb3VsZCBjaGFuZ2UgdGhlXG4gICAgICAgIC8vIGRvY3VtZW50LCBvciB3aXRoIHBsdWdpbnMgdGhhdCBtb2RpZnkgdGhlIGRvY3VtZW50IHdpdGhvdXQgZGlyZWN0XG4gICAgICAgIC8vIGlucHV0IGZyb20gdGhlIHVzZXIuXG4gICAgICAgIGlmICh0ci5zZWxlY3Rpb25TZXQgfHwgdHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoYXNGb3JjZWRTcGFjZTogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVnaW5NZXRhID0gdHIuZ2V0TWV0YSgnaGFzLWZvcmNlZC1zcGFjZS1mcm9tLWlucHV0LXJ1bGUnKTtcbiAgICAgIGlmIChwbHVnaW5NZXRhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzRm9yY2VkU3BhY2U6IHRydWUsXG4gICAgICAgICAgZm9yY2VkU3BhY2VQb3M6IHBsdWdpbk1ldGEuZW5kUG9zLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfSxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBoYW5kbGVUZXh0SW5wdXQodmlldywgX2Zyb20sIF90bywgdGV4dCkge1xuICAgICAgaWYgKHRoaXMuZ2V0U3RhdGUodmlldy5zdGF0ZSkuaGFzRm9yY2VkU3BhY2UgJiYgdGV4dCA9PT0gJyAnKSB7XG4gICAgICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRNZXRhKFJFU0VUX0hBU19GT1JDRURfU1BBQ0VfTUVUQSwgdHJ1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufSk7XG4iLCJpbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgUGx1Z2luLFxuICBTZWxlY3Rpb24sXG4gIFRleHRTZWxlY3Rpb24sXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IGJhc2VLZXltYXAsIHNldEJsb2NrVHlwZSB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IGtleW1hcCB9IGZyb20gJ3Byb3NlbWlycm9yLWtleW1hcCc7XG5pbXBvcnQgeyBzcGxpdExpc3RJdGVtIH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWxpc3QnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5mdW5jdGlvbiByZWN1cnNpdmVEZWxldGVFbXB0eSh0cjogVHJhbnNhY3Rpb24sICRwb3M6IFJlc29sdmVkUG9zKTogVHJhbnNhY3Rpb24ge1xuICBjb25zdCBwYXJlbnROb2RlID0gJHBvcy5wYXJlbnQ7XG4gIGlmIChwYXJlbnROb2RlLm5vZGVTaXplID09PSAyKSB7XG4gICAgY29uc3QgeyBwb3MgfSA9ICRwb3M7XG4gICAgcmV0dXJuIHJlY3Vyc2l2ZURlbGV0ZUVtcHR5KFxuICAgICAgdHIuZGVsZXRlUmFuZ2UocG9zIC0gMSwgcG9zICsgMSksXG4gICAgICB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcChwb3MpKSxcbiAgICApO1xuICB9XG4gIHJldHVybiB0cjtcbn1cblxuZnVuY3Rpb24gZW5zdXJlVGV4dFNlbGVjdGlvbkluRW1wdHlOb2RlKHN0YXRlOiBFZGl0b3JTdGF0ZSk6IGJvb2xlYW4ge1xuICBjb25zdCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uO1xuICByZXR1cm4gQm9vbGVhbigkY3Vyc29yICYmICRjdXJzb3IucGFyZW50Lm5vZGVTaXplID09PSAyKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlQ2hlY2tsaXN0SXRlbVRleHRTZWxlY3Rpb24oc3RhdGU6IEVkaXRvclN0YXRlKSB7XG4gIGNvbnN0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb247XG4gIHJldHVybiBCb29sZWFuKFxuICAgICRjdXJzb3IgJiYgJGN1cnNvci5wYXJlbnQudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtLFxuICApO1xufVxuXG5leHBvcnQgY29uc3Qga2V5bWFwUGx1Z2luczogUGx1Z2luW10gPSBbXG4gIC8vIGNoZWNrbGlzdCBpdGVtIGhhbmRsZXJzXG4gIGtleW1hcCh7XG4gICAgQmFja3NwYWNlKHN0YXRlLCBkaXNwYXRjaCwgdmlldykge1xuICAgICAgaWYgKGVuc3VyZUNoZWNrbGlzdEl0ZW1UZXh0U2VsZWN0aW9uKHN0YXRlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXcuZW5kT2ZUZXh0YmxvY2soJ2xlZnQnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHN0YXRlLnNlbGVjdGlvbiBhcyBUZXh0U2VsZWN0aW9uKS4kY3Vyc29yLmluZGV4KDApID09PSAwKSB7XG4gICAgICAgIHNldEJsb2NrVHlwZShzY2hlbWEubm9kZXMucGFyYWdyYXBoKShzdGF0ZSwgZGlzcGF0Y2gpO1xuICAgICAgfVxuICAgIH0sXG4gICAgRW50ZXIoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICBjb25zdCB7IHNlbGVjdGlvbiwgdHIgfSA9IHN0YXRlO1xuICAgICAgY29uc3QgeyAkZnJvbSwgZnJvbSB9ID0gc2VsZWN0aW9uO1xuICAgICAgaWYgKCRmcm9tLnBhcmVudC50eXBlICE9PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdHIuZGVsZXRlU2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBuZXh0JEZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgIGlmIChuZXh0JEZyb20ucGFyZW50Lm5vZGVTaXplID09PSAyKSB7XG4gICAgICAgIGNvbnN0IG5leHRGcm9tID0gbmV4dCRGcm9tLnBvcztcbiAgICAgICAgLy8gVGhlIG5vZGUgaXMgZW1wdHlcbiAgICAgICAgdHIucmVwbGFjZVdpdGgoXG4gICAgICAgICAgbmV4dEZyb20gLSAxLFxuICAgICAgICAgIG5leHRGcm9tICsgMSxcbiAgICAgICAgICBzY2hlbWEubm9kZXMucGFyYWdyYXBoLmNyZWF0ZUFuZEZpbGwoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFNlbGVjdGlvbi5uZWFyKHRyLmRvYy5yZXNvbHZlKG5leHRGcm9tIC0gMSkpKTtcbiAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRyLnNwbGl0KGZyb20sIHVuZGVmaW5lZCwgW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KSxcbiAgLy8gbGlzdCBpdGVtIGhhbmRsZXJzXG4gIGtleW1hcCh7XG4gICAgQmFja3NwYWNlKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgaWYgKGVuc3VyZVRleHRTZWxlY3Rpb25JbkVtcHR5Tm9kZShzdGF0ZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgeyAkY3Vyc29yIH0gPSBzZWxlY3Rpb247XG4gICAgICBjb25zdCBwb3NzaWJsZVNlbGVjdGlvbiA9IFNlbGVjdGlvbi5maW5kRnJvbShcbiAgICAgICAgc3RhdGUuZG9jLnJlc29sdmUoJGN1cnNvci5iZWZvcmUoKSksXG4gICAgICAgIC0xLFxuICAgICAgICB0cnVlLFxuICAgICAgICAvLyBXZSBjYW4gYXNzZXJ0IHRoaXMgaGVyZSBiYyBvZiB0aGUgdGV4dE9ubHkgYXJnIGFib3ZlXG4gICAgICApIGFzIFRleHRTZWxlY3Rpb247XG4gICAgICBpZiAoIXBvc3NpYmxlU2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChwb3NzaWJsZVNlbGVjdGlvbi4kY3Vyc29yLm5vZGUoLTEpLnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHRyID0gc3RhdGUudHIuc2V0U2VsZWN0aW9uKHBvc3NpYmxlU2VsZWN0aW9uKTtcbiAgICAgIHRyID0gcmVjdXJzaXZlRGVsZXRlRW1wdHkodHIsICRjdXJzb3IpO1xuICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBFbnRlcjogc3BsaXRMaXN0SXRlbShzY2hlbWEubm9kZXMubGlzdF9pdGVtKSxcbiAgfSksXG4gIGtleW1hcChiYXNlS2V5bWFwKSxcbl07XG4iLCJpbXBvcnQgbWFya2Rvd25pdCBmcm9tICdtYXJrZG93bi1pdCc7XG5pbXBvcnQge1xuICBNYXJrZG93blBhcnNlcixcbiAgTWFya2Rvd25TZXJpYWxpemVyLFxuICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLFxufSBmcm9tICdwcm9zZW1pcnJvci1tYXJrZG93bic7XG5pbXBvcnQge1xuICBBVVRPX0xJTktfQVRUUixcbiAgTUFSS0RPV05fRVNDQVBFRF9BVFRSLFxuICBDaGVja2JveFN0YXR1cyxcbiAgc2NoZW1hLFxufSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBjb25zdCBtYXJrZG93blNlcmlhbGl6ZXIgPSBuZXcgTWFya2Rvd25TZXJpYWxpemVyKFxuICB7XG4gICAgaGVhZGluZzEoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjICcpO1xuICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIGhlYWRpbmcyKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBzdGF0ZS53cml0ZSgnIyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZzMoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjIyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgY2hlY2tsaXN0X2l0ZW0oc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGJveFRleHQgPVxuICAgICAgICBub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSA/ICdbeF0gJyA6ICdbIF0gJztcbiAgICAgIHN0YXRlLndyaXRlKGJveFRleHQpO1xuICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICB9LFxuICAgIHBhcmFncmFwaChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgaWYgKG5vZGUubm9kZVNpemUgPT09IDIpIHtcbiAgICAgICAgLy8gV3JpdGUgYSBub24tYnJlYWtpbmcgZW1wdHkgc3BhY2Ugc28gbWFya2Rvd24gcmV0YWlucyB0aGUgbGluZSBhcyBhbiBlbXB0eSBwYXJhZ3JhcGhcbiAgICAgICAgc3RhdGUud3JpdGUoJ1xcdTAwQTAnKTtcbiAgICAgICAgc3RhdGUuY2xvc2VCbG9jayhub2RlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy5wYXJhZ3JhcGgoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgbGlzdF9pdGVtKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmxpc3RfaXRlbShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBvcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMub3JkZXJlZF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIHVub3JkZXJlZF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmJ1bGxldF9saXN0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIHRleHQoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMudGV4dChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBjb2RlX2Jsb2NrKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBpZiAobm9kZS5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICBzdGF0ZS5lbnN1cmVOZXdMaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLmNvZGVfYmxvY2soc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICAuLi5kZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm1hcmtzLFxuICAgIGlubGluZV9saW5rOiBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm1hcmtzLmxpbmssXG4gICAgY29kZToge1xuICAgICAgY2xvc2Uoc3RhdGUsIG1hcmspIHtcbiAgICAgICAgcmV0dXJuIG1hcmsuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSA/ICcnIDogJ2AnO1xuICAgICAgfSxcbiAgICAgIGVzY2FwZTogZmFsc2UsXG4gICAgICBvcGVuKHN0YXRlLCBtYXJrKSB7XG4gICAgICAgIHJldHVybiBtYXJrLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl0gPyAnJyA6ICdgJztcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbik7XG5cbmNvbnN0IG1hcmtkb3duSXRQYXJzZXIgPSBtYXJrZG93bml0KCk7XG5jb25zdCBUb2tlbiA9IG1hcmtkb3duSXRQYXJzZXIuY29yZS5TdGF0ZS5wcm90b3R5cGUuVG9rZW47XG4vLyBXZSBuZWVkIHRvIGFjY2VzcyB0aGUgZGVmYXVsdCBpbWFnZSBwYXJzZXIgcnVsZSBzbyB3ZSBjYW4gd3JhcCBpdCBpbiBjdXN0b21cbi8vIGxvZ2ljLiBUaGVzZSBtZXRob2RzIGFuZCBvYmplY3RzIGFyZSBtZWFudCB0byBiZSBpbnRlcm5hbCBidXQgdGhlcmUgc2VlbXMgdG9cbi8vIGJlIG5vIG90aGVyIHdheSB0byBnZXQgYXQgdGhlIGRlZmF1bHQgcnVsZXMuXG4vLyBAdHMtaWdub3JlXG5jb25zdCBpbWFnZVJ1bGVJbmRleCA9IG1hcmtkb3duSXRQYXJzZXIuaW5saW5lLnJ1bGVyLl9fZmluZF9fKCdpbWFnZScpO1xuY29uc3QgZGVmYXVsdEltYWdlUnVsZSA9XG4gIC8vIEB0cy1pZ25vcmVcbiAgbWFya2Rvd25JdFBhcnNlci5pbmxpbmUucnVsZXIuX19ydWxlc19fW2ltYWdlUnVsZUluZGV4XS5mbjtcblxuY29uc3QgQ0hFQ0tMSVNUX0lURU1fT1BFTl9NQVJLRVJTID0gWydbeF0nLCAnW1hdJywgJ1sgXSddO1xuXG5tYXJrZG93bkl0UGFyc2VyLnVzZSgobWQpID0+IHtcbiAgbWQuY29yZS5ydWxlci5hZnRlcignYmxvY2snLCAnY2hlY2tsaXN0X2l0ZW0nLCAoY29yZVN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc3JjTGluZXMgPSBjb3JlU3RhdGUuc3JjLnNwbGl0KCdcXG4nKTtcbiAgICBsZXQgaXNDaGVja2xpc3RPcGVuID0gZmFsc2U7XG4gICAgbGV0IGhhc0NoZWNrbGlzdCA9IGZhbHNlO1xuXG4gICAgY29yZVN0YXRlLnRva2VucyA9IGNvcmVTdGF0ZS50b2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgaWYgKGlzQ2hlY2tsaXN0T3BlbiAmJiB0b2tlbi50eXBlID09PSAnaW5saW5lJykge1xuICAgICAgICB0b2tlbi5jb250ZW50ID0gdG9rZW4uY29udGVudC5zbGljZSgzKS50cmltTGVmdCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGhfb3BlbicpIHtcbiAgICAgICAgY29uc3QgW3N0YXJ0TGluZSwgZW5kTGluZV0gPSB0b2tlbi5tYXA7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBzcmNMaW5lc1tzdGFydExpbmVdO1xuICAgICAgICBpZiAoQ0hFQ0tMSVNUX0lURU1fT1BFTl9NQVJLRVJTLmluY2x1ZGVzKGNvbnRlbnQuc2xpY2UoMCwgMykpKSB7XG4gICAgICAgICAgaGFzQ2hlY2tsaXN0ID0gdHJ1ZTtcbiAgICAgICAgICBpc0NoZWNrbGlzdE9wZW4gPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHsgVG9rZW4gfSA9IGNvcmVTdGF0ZTtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IG5ldyBUb2tlbignY2hlY2tsaXN0X2l0ZW1fb3BlbicsICdkaXYnLCAxKTtcbiAgICAgICAgICB0b2tlbi5hdHRyUHVzaChbXG4gICAgICAgICAgICAnc3RhdHVzJyxcbiAgICAgICAgICAgIGNvbnRlbnRbMV0udG9Mb3dlckNhc2UoKSA9PT0gJ3gnXG4gICAgICAgICAgICAgID8gQ2hlY2tib3hTdGF0dXMuRE9ORS50b1N0cmluZygpXG4gICAgICAgICAgICAgIDogQ2hlY2tib3hTdGF0dXMuRU1QVFkudG9TdHJpbmcoKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2xpc3RPcGVuICYmIHRva2VuLnR5cGUgPT09ICdwYXJhZ3JhcGhfY2xvc2UnKSB7XG4gICAgICAgIGlzQ2hlY2tsaXN0T3BlbiA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gbmV3IGNvcmVTdGF0ZS5Ub2tlbignY2hlY2tsaXN0X2l0ZW1fY2xvc2UnLCAnZGl2JywgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFzQ2hlY2tsaXN0O1xuICB9KTtcblxuICBtZC5pbmxpbmUucnVsZXIuYXQoJ2ltYWdlJywgKGlubGluZVN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBwb3M6IG9yaWdpbmFsUG9zIH0gPSBpbmxpbmVTdGF0ZTtcbiAgICBjb25zdCByZXN1bHQgPSBkZWZhdWx0SW1hZ2VSdWxlKGlubGluZVN0YXRlKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCBjb2RlVG9rZW4gPSBuZXcgaW5saW5lU3RhdGUuVG9rZW4oJ2NvZGVfaW5saW5lJywgJ2NvZGUnLCAwKTtcbiAgICAgIGNvZGVUb2tlbi5tYXJrdXAgPSAnYCc7XG4gICAgICBjb2RlVG9rZW4uY29udGVudCA9IGlubGluZVN0YXRlLnNyYy5zbGljZShvcmlnaW5hbFBvcywgaW5saW5lU3RhdGUucG9zKTtcbiAgICAgIGNvZGVUb2tlbi5hdHRyU2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUiwgJ3RydWUnKTtcbiAgICAgIGlubGluZVN0YXRlLnRva2Vuc1tpbmxpbmVTdGF0ZS50b2tlbnMubGVuZ3RoIC0gMV0gPSBjb2RlVG9rZW47XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG5cbmNsYXNzIFNjcmF0Y2hUb2tlblBhcnNlciB7XG4gIHByaXZhdGUgZnVsbFRva2VuTGlzdDogbWFya2Rvd25pdC5Ub2tlbltdO1xuICBwcml2YXRlIHRva2VuU3RhY2s6IG1hcmtkb3duaXQuVG9rZW5bXTtcbiAgcHJpdmF0ZSBwYXJzZWFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgc3JjOiBzdHJpbmc7XG5cbiAgc3RhdGljIERPQ1VNRU5UX01BUCA9IG5ldyBNYXAoW1xuICAgIFsnaGVhZGluZzEnLCBbJ2lubGluZSddXSxcbiAgICBbJ2hlYWRpbmcyJywgWydpbmxpbmUnXV0sXG4gICAgWydoZWFkaW5nMycsIFsnaW5saW5lJ11dLFxuICAgIFsncGFyYWdyYXBoJywgWydpbmxpbmUnXV0sXG4gICAgWydmZW5jZScsIFsnaW5saW5lJ11dLFxuICAgIFsnYnVsbGV0X2xpc3QnLCBbJ2xpc3RfaXRlbScsICdpbmxpbmUnXV0sXG4gICAgWydvcmRlcmVkX2xpc3QnLCBbJ2xpc3RfaXRlbScsICdpbmxpbmUnXV0sXG4gICAgWydsaXN0X2l0ZW0nLCBbJ3BhcmFncmFwaCcsICdvcmRlcmVkX2xpc3QnLCAnYnVsbGV0X2xpc3QnXV0sXG4gICAgWydjaGVja2xpc3RfaXRlbScsIFsnaW5saW5lJ11dLFxuICAgIFsnaW5saW5lJywgW11dLFxuICBdKTtcblxuICBzdGF0aWMgZ2V0VHlwZU5hbWUodG9rZW5UeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdG9rZW5UeXBlLnJlcGxhY2UoJ19vcGVuJywgJycpLnJlcGxhY2UoJ19jbG9zZScsICcnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNyYzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNldEludGVybmFsU3RhdGUoKTtcbiAgICB0aGlzLnNyYyA9IHNyYztcbiAgfVxuXG4gIHRha2UodG9rZW46IG1hcmtkb3duaXQuVG9rZW4pOiBudWxsIHwgbWFya2Rvd25pdC5Ub2tlbltdIHtcbiAgICBjb25zdCB7IG5lc3RpbmcgfSA9IHRva2VuO1xuICAgIGxldCB7IHR5cGUgfSA9IHRva2VuO1xuICAgIHR5cGUgPSBTY3JhdGNoVG9rZW5QYXJzZXIuZ2V0VHlwZU5hbWUodHlwZSk7XG5cbiAgICB0aGlzLmZ1bGxUb2tlbkxpc3QucHVzaCh0b2tlbik7XG5cbiAgICBpZiAoXG4gICAgICBTY3JhdGNoVG9rZW5QYXJzZXIuRE9DVU1FTlRfTUFQLmhhcyh0eXBlKSA9PT0gZmFsc2UgJiZcbiAgICAgIHR5cGUgIT09ICdpbmxpbmUnXG4gICAgKSB7XG4gICAgICB0aGlzLnBhcnNlYWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhcnNlYWJsZSAmJiB0aGlzLnRva2VuU3RhY2subGVuZ3RoICYmIG5lc3RpbmcgPj0gMCkge1xuICAgICAgY29uc3QgcGFyZW50VHlwZSA9IFNjcmF0Y2hUb2tlblBhcnNlci5nZXRUeXBlTmFtZShcbiAgICAgICAgdGhpcy50b2tlblN0YWNrW3RoaXMudG9rZW5TdGFjay5sZW5ndGggLSAxXS50eXBlLFxuICAgICAgKTtcblxuICAgICAgaWYgKFxuICAgICAgICBTY3JhdGNoVG9rZW5QYXJzZXIuRE9DVU1FTlRfTUFQLmdldChwYXJlbnRUeXBlKS5pbmNsdWRlcyh0eXBlKSA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICB0aGlzLnBhcnNlYWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXN0aW5nID4gMCkge1xuICAgICAgdGhpcy50b2tlblN0YWNrLnB1c2godG9rZW4pO1xuICAgIH1cblxuICAgIGlmIChuZXN0aW5nIDwgMCkge1xuICAgICAgdGhpcy50b2tlblN0YWNrLnBvcCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRva2VuU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBvdXQgPSB0aGlzLmdldFRva2VucygpO1xuICAgICAgdGhpcy5yZXNldEludGVybmFsU3RhdGUoKTtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldFRva2VucyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGZ1bGxUb2tlbkxpc3QsIHBhcnNlYWJsZSB9ID0gdGhpcztcblxuICAgIGlmIChwYXJzZWFibGUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcDogW2VuZExpbmUsIHN0YXJ0TGluZV0sXG4gICAgICB9ID0gZnVsbFRva2VuTGlzdFswXTtcbiAgICAgIGNvbnN0IGNvZGVUb2tlbiA9IG5ldyBUb2tlbignZmVuY2UnLCAnY29kZScsIDApO1xuICAgICAgY29kZVRva2VuLmNvbnRlbnQgPSB0aGlzLnNyY1xuICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgIC5zbGljZShlbmRMaW5lLCBzdGFydExpbmUpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgIGNvZGVUb2tlbi5hdHRyUHVzaChbTUFSS0RPV05fRVNDQVBFRF9BVFRSLCAndHJ1ZSddKTtcbiAgICAgIHJldHVybiBbY29kZVRva2VuXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVsbFRva2VuTGlzdDtcbiAgfTtcblxuICBwcml2YXRlIHJlc2V0SW50ZXJuYWxTdGF0ZSA9ICgpID0+IHtcbiAgICB0aGlzLmZ1bGxUb2tlbkxpc3QgPSBbXTtcbiAgICB0aGlzLnRva2VuU3RhY2sgPSBbXTtcbiAgICB0aGlzLnBhcnNlYWJsZSA9IHRydWU7XG4gIH07XG59XG5cbmNvbnN0IHBhcnNlclNoaW0gPSAoKSA9PiAoe1xuICBwYXJzZSguLi5hcmdzKSB7XG4gICAgKHdpbmRvdyBhcyBhbnkpLm1pcCA9IG1hcmtkb3duSXRQYXJzZXI7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGluaXRpYWwgPSBtYXJrZG93bkl0UGFyc2VyLnBhcnNlKC4uLmFyZ3MpO1xuICAgIGNvbnN0IG91dCA9IFtdO1xuICAgIGNvbnN0IHRva2VuUGFyc2VyID0gbmV3IFNjcmF0Y2hUb2tlblBhcnNlcihhcmdzWzBdKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGlhbC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSBpbml0aWFsW2ldO1xuICAgICAgY29uc3QgeyBuZXN0aW5nLCB0YWcsIHR5cGUgfSA9IHRva2VuO1xuXG4gICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCdoZWFkaW5nJykgJiYgdGFnID09PSAnaDEnKSB7XG4gICAgICAgIHRva2VuLnR5cGUgPSB0b2tlbi50eXBlLnJlcGxhY2UoJ2hlYWRpbmcnLCAnaGVhZGluZzEnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ2hlYWRpbmcnKSAmJiB0YWcgPT09ICdoMicpIHtcbiAgICAgICAgdG9rZW4udHlwZSA9IHR5cGUucmVwbGFjZSgnaGVhZGluZycsICdoZWFkaW5nMicpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgnaGVhZGluZycpICYmIHRhZyA9PT0gJ2gzJykge1xuICAgICAgICB0b2tlbi50eXBlID0gdHlwZS5yZXBsYWNlKCdoZWFkaW5nJywgJ2hlYWRpbmczJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gJ2xpbmsnICYmIHRva2VuLmF0dHJHZXQoJ2hyZWYnKSA9PT0gdG9rZW4uY29udGVudCkge1xuICAgICAgICB0b2tlbi5hdHRyU2V0KEFVVE9fTElOS19BVFRSLCAndHJ1ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXRwdXQgPSB0b2tlblBhcnNlci50YWtlKHRva2VuKTtcblxuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICBvdXQucHVzaCguLi5vdXRwdXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IG1hcmtkb3duUGFyc2VyID0gbmV3IE1hcmtkb3duUGFyc2VyKFxuICBzY2hlbWEsXG4gIC8vIEB0cy1pZ25vcmVcbiAgcGFyc2VyU2hpbSgpLFxuICB7XG4gICAgYmxvY2txdW90ZTogeyBibG9jazogJ2NvZGVfYmxvY2snIH0sXG4gICAgYnVsbGV0X2xpc3Q6IHsgYmxvY2s6ICd1bm9yZGVyZWRfbGlzdCcgfSxcbiAgICBmZW5jZToge1xuICAgICAgYmxvY2s6ICdjb2RlX2Jsb2NrJyxcbiAgICAgIGdldEF0dHJzKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5hdHRyR2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUikgPT09ICd0cnVlJ1xuICAgICAgICAgID8geyBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXTogdHJ1ZSB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBoZWFkaW5nMTogeyBibG9jazogJ2hlYWRpbmcxJyB9LFxuICAgIGhlYWRpbmcyOiB7IGJsb2NrOiAnaGVhZGluZzInIH0sXG4gICAgaGVhZGluZzM6IHsgYmxvY2s6ICdoZWFkaW5nMycgfSxcbiAgICBsaXN0X2l0ZW06IHsgYmxvY2s6ICdsaXN0X2l0ZW0nIH0sXG4gICAgb3JkZXJlZF9saXN0OiB7IGJsb2NrOiAnb3JkZXJlZF9saXN0JyB9LFxuICAgIHBhcmFncmFwaDogeyBibG9jazogJ3BhcmFncmFwaCcgfSxcbiAgICBjaGVja2xpc3RfaXRlbToge1xuICAgICAgYmxvY2s6ICdjaGVja2xpc3RfaXRlbScsXG4gICAgICBnZXRBdHRycyh0b2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6XG4gICAgICAgICAgICB0b2suYXR0ckdldCgnc3RhdHVzJykgPT09IENoZWNrYm94U3RhdHVzLkRPTkUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICA/IENoZWNrYm94U3RhdHVzLkRPTkVcbiAgICAgICAgICAgICAgOiBDaGVja2JveFN0YXR1cy5FTVBUWSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbTogeyBtYXJrOiAnZW0nIH0sXG4gICAgc3Ryb25nOiB7IG1hcms6ICdzdHJvbmcnIH0sXG4gICAgY29kZV9pbmxpbmU6IHtcbiAgICAgIGdldEF0dHJzKHRva2VuKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi5hdHRyR2V0KE1BUktET1dOX0VTQ0FQRURfQVRUUikgPT09ICd0cnVlJ1xuICAgICAgICAgID8geyBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXTogdHJ1ZSB9XG4gICAgICAgICAgOiB7fTtcbiAgICAgIH0sXG4gICAgICBtYXJrOiAnY29kZScsXG4gICAgICBub0Nsb3NlVG9rZW46IHRydWUsXG4gICAgfSxcbiAgICBsaW5rOiB7XG4gICAgICBtYXJrOiAnbGluaycsXG4gICAgICBnZXRBdHRycyh0b2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBocmVmOiB0b2suYXR0ckdldCgnaHJlZicpLFxuICAgICAgICAgIHRpdGxlOiB0b2suYXR0ckdldCgndGl0bGUnKSB8fCBudWxsLFxuICAgICAgICAgIC4uLih0b2suaW5mbyA9PT0gJ2F1dG8nICYmIHtcbiAgICAgICAgICAgIFtBVVRPX0xJTktfQVRUUl06IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4pO1xuIiwiaW1wb3J0IHsgQ2hlY2tib3hTdGF0dXMsIHNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IEVkaXRvclByb3BzIH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQgeyBDaGVja2JveE91dGxpbmUsIENoZWNrYm94IH0gZnJvbSAnLi9hc3NldHMnO1xuXG5jb25zdCBDSEVDS0JPWF9DSEVDS0VEX0NMQVNTTkFNRSA9ICdpcy1jaGVja2VkJztcbmNvbnN0IENMSUNLX1RBUkdFVF9DTEFTU05BTUUgPSAnY2xpY2stdGFyZ2V0JztcblxuZXhwb3J0IGNvbnN0IG5vZGVWaWV3czogRWRpdG9yUHJvcHM8dHlwZW9mIHNjaGVtYT5bJ25vZGVWaWV3cyddID0ge1xuICBjaGVja2xpc3RfaXRlbShub2RlLCB2aWV3LCBnZXRQb3MpIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuY2xhc3NMaXN0LmFkZCgnY2hlY2tsaXN0LWl0ZW0nKTtcblxuICAgIGNvbnN0IGlucHV0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaW5wdXREaXYuY2xhc3NMaXN0LmFkZCgnY2hlY2tib3gnKTtcbiAgICBpZiAobm9kZS5hdHRycy5zdGF0dXMgPT09IENoZWNrYm94U3RhdHVzLkRPTkUpIHtcbiAgICAgIGlucHV0RGl2LmNsYXNzTGlzdC5hZGQoQ0hFQ0tCT1hfQ0hFQ0tFRF9DTEFTU05BTUUpO1xuICAgICAgaW5wdXREaXYuaW5uZXJIVE1MID0gQ2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0RGl2LmlubmVySFRNTCA9IENoZWNrYm94T3V0bGluZTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGlja1RhcmdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNsaWNrVGFyZ2V0RGl2LmNsYXNzTGlzdC5hZGQoQ0xJQ0tfVEFSR0VUX0NMQVNTTkFNRSk7XG4gICAgY2xpY2tUYXJnZXREaXYuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJztcbiAgICBjbGlja1RhcmdldERpdi50YWJJbmRleCA9IDA7XG5cbiAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXG4gICAgY2xpY2tUYXJnZXREaXYuYXBwZW5kQ2hpbGQoaW5wdXREaXYpO1xuICAgIGRpdi5hcHBlbmRDaGlsZChjbGlja1RhcmdldERpdik7XG4gICAgZGl2LmFwcGVuZENoaWxkKHApO1xuXG4gICAgY29uc3QgZm9jdXNIYW5kbGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHJlbGF0ZWRUYXJnZXQsIHRhcmdldCB9ID0gZXZlbnQ7XG4gICAgICBpZiAoY2xpY2tUYXJnZXREaXYuY29udGFpbnMocmVsYXRlZFRhcmdldCBhcyBOb2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgLy8gSW5wdXQgaXMgdGFraW5nIGZvY3VzXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld0hhc0ZvY3VzID0gdGFyZ2V0ID09PSB2aWV3LmRvbTtcbiAgICAgIGlmICh2aWV3SGFzRm9jdXMpIHtcbiAgICAgICAgLy8gVGhlIHZpZXcgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBpbnB1dFxuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGNsaWNrVGFyZ2V0RGl2LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tlZCA9IGlucHV0RGl2LmNsYXNzTGlzdC5jb250YWlucyhDSEVDS0JPWF9DSEVDS0VEX0NMQVNTTkFNRSk7XG4gICAgICBjb25zdCB7IHRyIH0gPSB2aWV3LnN0YXRlO1xuICAgICAgY29uc3QgcG9zID0gKGdldFBvcyBhcyAoKSA9PiBudW1iZXIpKCk7XG4gICAgICB0ci5zZXROb2RlTWFya3VwKHBvcywgdW5kZWZpbmVkLCB7XG4gICAgICAgIHN0YXR1czogY2hlY2tlZCA/IENoZWNrYm94U3RhdHVzLkVNUFRZIDogQ2hlY2tib3hTdGF0dXMuRE9ORSxcbiAgICAgIH0pO1xuICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgfTtcblxuICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmb2N1c0hhbmRsZXIpO1xuICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkb206IGRpdixcbiAgICAgIGNvbnRlbnRET006IHAsXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgZm9jdXNIYW5kbGVyKTtcbiAgICAgICAgdmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuICAgICAgfSxcbiAgICB9O1xuICB9LFxufTtcbiIsImltcG9ydCB7IGJ1bGxldExpc3QsIGxpc3RJdGVtLCBvcmRlcmVkTGlzdCB9IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1saXN0JztcbmltcG9ydCB7IG1hcmtzLCBub2RlcyB9IGZyb20gJ3Byb3NlbWlycm9yLXNjaGVtYS1iYXNpYyc7XG5pbXBvcnQgeyBOb2RlU3BlYywgU2NoZW1hLCBTY2hlbWFTcGVjIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuXG5leHBvcnQgY29uc3QgTUFSS0RPV05fRVNDQVBFRF9BVFRSID0gJ21hcmtkb3duX2VzY2FwZWQnO1xuZXhwb3J0IGNvbnN0IEFVVE9fTElOS19BVFRSID0gJ2F1dG9fbGluayc7IC8vIExpbmtzIGF1dG8tZGV0ZWN0ZWQgZnJvbSB1c2VyIGlucHV0LCBhcyBvcHBvc2VkIHRvIGxpbmtzIGFkZGVkIGFzIG1ldGFkYXRhIGJ5IHRoZSB1c2VyXG5cbmNvbnN0IEVESVRPUl9DTFMgPSAnc24tZWRpdG9yJztcblxuY29uc3QgZG9jU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdibG9jaysnLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsnbWFpbicsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnbWFpbicsXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IGhlYWRpbmcxU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIGdyb3VwOiAnYmxvY2snLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsnaDEnLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIHRhZzogJ2gxJyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3QgaGVhZGluZzJTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydoMicsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdoMicgfV0sXG59O1xuXG5jb25zdCBoZWFkaW5nM1NwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGRlZmluaW5nOiB0cnVlLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ2gzJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFt7IHRhZzogJ2gzJyB9XSxcbn07XG5cbmNvbnN0IHBhcmFncmFwaFNwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGdyb3VwOiAnYmxvY2snLFxuICBtYXJrczogJ18nLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsncCcsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbeyB0YWc6ICdwJyB9XSxcbn07XG5cbmV4cG9ydCBlbnVtIENoZWNrYm94U3RhdHVzIHtcbiAgRE9ORSxcbiAgRU1QVFksXG59XG5cbmNvbnN0IGNoZWNrbGlzdEl0ZW1TcGVjOiBOb2RlU3BlYyA9IHtcbiAgYXR0cnM6IHtcbiAgICBzdGF0dXM6IHtcbiAgICAgIGRlZmF1bHQ6IENoZWNrYm94U3RhdHVzLkVNUFRZLFxuICAgIH0sXG4gIH0sXG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIGdyb3VwOiAnYmxvY2snLFxuICBtYXJrczogJ18nLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdkaXYnLFxuICAgICAgeyBjbGFzczogJ2NoZWNrbGlzdC1pdGVtJyB9LFxuICAgICAgW1xuICAgICAgICAnaW5wdXQnLFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAuLi4obm9kZS5hdHRycy5zdGF0dXMgPT09IENoZWNrYm94U3RhdHVzLkRPTkUgJiYgeyBjaGVja2VkOiAndHJ1ZScgfSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgWydwJywgMF0sXG4gICAgXTtcbiAgfSxcbiAgcGFyc2VET006IFtcbiAgICB7XG4gICAgICBjb250ZW50RWxlbWVudDogJ3AnLFxuICAgICAgdGFnOiAnZGl2LmNoZWNrbGlzdC1pdGVtJyxcbiAgICAgIGdldEF0dHJzKG5vZGUpIHtcbiAgICAgICAgLy8gV2lsbCBiZSB0eXBlIE5vZGUgd2hlbiBwYXJzZURPTSBzdXBwbGllcyBhICd0YWcnIHJ1bGVcbiAgICAgICAgY29uc3QgaW5wdXQgPSAobm9kZSBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXM6ICEhKGlucHV0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWRcbiAgICAgICAgICAgID8gQ2hlY2tib3hTdGF0dXMuRE9ORVxuICAgICAgICAgICAgOiBDaGVja2JveFN0YXR1cy5FTVBUWSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHRleHRTcGVjOiBOb2RlU3BlYyA9IHtcbiAgZ3JvdXA6ICdpbmxpbmUnLFxufTtcblxuY29uc3QgY29kZUJsb2NrU3BlYzogTm9kZVNwZWMgPSB7XG4gIC4uLm5vZGVzLmNvZGVfYmxvY2ssXG4gIGF0dHJzOiB7XG4gICAgLi4ubm9kZXMuY29kZV9ibG9jay5hdHRycyxcbiAgICBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXToge1xuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSxcbiAgfSxcbiAgdG9ET00obm9kZSkge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgW2BkYXRhLSR7TUFSS0RPV05fRVNDQVBFRF9BVFRSfWBdOiBub2RlLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl0sXG4gICAgfTtcbiAgICByZXR1cm4gbm9kZS5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdXG4gICAgICA/IFsncHJlJywgYXR0cnMsIFsnZGl2JywgeyBjbGFzczogJ2luZm8nIH0sICdpJ10sIFsnY29kZScsIDBdXVxuICAgICAgOiBbJ3ByZScsIGF0dHJzLCBbJ2NvZGUnLCAwXV07XG4gIH0sXG59O1xuXG5jb25zdCBzcGVjOiBTY2hlbWFTcGVjID0ge1xuICBub2Rlczoge1xuICAgIGRvYzogZG9jU3BlYyxcbiAgICAvLyBPcmRlciBtYXR0ZXJzIGhlcmUuIHBtIGFwcGFyZW50bHkgaW5zZXJ0cyB0aGUgZmlyc3QgdmFsaWQgbm9kZSBvbiBlbnRlci5cbiAgICBwYXJhZ3JhcGg6IHBhcmFncmFwaFNwZWMsXG4gICAgY2hlY2tsaXN0X2l0ZW06IGNoZWNrbGlzdEl0ZW1TcGVjLFxuICAgIHVub3JkZXJlZF9saXN0OiB7XG4gICAgICAuLi5idWxsZXRMaXN0LFxuICAgICAgY29udGVudDogJ2xpc3RfaXRlbSsnLFxuICAgICAgZ3JvdXA6ICdibG9jaycsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIG9yZGVyZWRfbGlzdDoge1xuICAgICAgLi4ub3JkZXJlZExpc3QsXG4gICAgICBjb250ZW50OiAnbGlzdF9pdGVtKycsXG4gICAgICBncm91cDogJ2Jsb2NrJyxcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgbGlzdF9pdGVtOiB7XG4gICAgICAuLi5saXN0SXRlbSxcbiAgICAgIGNvbnRlbnQ6ICdwYXJhZ3JhcGggKHBhcmFncmFwaCB8IG9yZGVyZWRfbGlzdCB8IHVub3JkZXJlZF9saXN0KSonLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICBoZWFkaW5nMTogaGVhZGluZzFTcGVjLFxuICAgIGhlYWRpbmcyOiBoZWFkaW5nMlNwZWMsXG4gICAgaGVhZGluZzM6IGhlYWRpbmczU3BlYyxcbiAgICB0ZXh0OiB0ZXh0U3BlYyxcbiAgICBjb2RlX2Jsb2NrOiBjb2RlQmxvY2tTcGVjLFxuICB9LFxuICBtYXJrczoge1xuICAgIGxpbms6IHtcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIGhyZWY6IHsgZGVmYXVsdDogJycgfSxcbiAgICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgICBbQVVUT19MSU5LX0FUVFJdOiB7IGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgICB9LFxuICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0YWc6ICdhW2hyZWZdJyxcbiAgICAgICAgICBnZXRBdHRycyhkb206IEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBocmVmOiBkb20uZ2V0QXR0cmlidXRlKCdocmVmJyksXG4gICAgICAgICAgICAgIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKCd0aXRsZScpLFxuICAgICAgICAgICAgICBbYGRhdGEtJHtBVVRPX0xJTktfQVRUUn1gXTogZG9tLmdldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICBgZGF0YS0ke0FVVE9fTElOS19BVFRSfWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdG9ET00obm9kZSkge1xuICAgICAgICBsZXQgeyBocmVmLCB0aXRsZSB9ID0gbm9kZS5hdHRycztcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAnYScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgW2BkYXRhLSR7QVVUT19MSU5LX0FUVFJ9YF06IG5vZGUuYXR0cnNbQVVUT19MSU5LX0FUVFJdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgMCxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbToge1xuICAgICAgLi4ubWFya3MuZW0sXG4gICAgfSxcbiAgICBzdHJvbmc6IHtcbiAgICAgIC4uLm1hcmtzLnN0cm9uZyxcbiAgICB9LFxuICAgIGNvZGU6IHtcbiAgICAgIC4uLm1hcmtzLmNvZGUsXG4gICAgICBhdHRyczoge1xuICAgICAgICAuLi5tYXJrcy5jb2RlLmF0dHJzLFxuICAgICAgICBbTUFSS0RPV05fRVNDQVBFRF9BVFRSXToge1xuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHNjaGVtYSA9IG5ldyBTY2hlbWEoc3BlYyk7XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICdAc3RhbmRhcmRub3Rlcy9jb21wb25lbnQtcmVsYXknO1xuaW1wb3J0IHsgYmFzZUtleW1hcCB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBoaXN0b3J5IH0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQgeyBpbnB1dFJ1bGVzRm9yY2VkU3BhY2VQbHVnaW4sIGlucHV0UnVsZXNQbHVnaW4gfSBmcm9tICcuL2lucHV0UnVsZXMnO1xuaW1wb3J0IHsgVG9vbGJhclBsdWdpbiB9IGZyb20gJy4vVG9vbGJhclBsdWdpbic7XG5pbXBvcnQgeyBUb29sdGlwUGx1Z2luIH0gZnJvbSAnLi9Ub29sdGlwUGx1Z2luJztcbmltcG9ydCB7IEVkaXRvckV4dGVuZGVyUGx1Z2luIH0gZnJvbSAnLi9FZGl0b3JFeHRlbmRlclBsdWdpbic7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBjbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBub2RlVmlld3MgfSBmcm9tICcuL25vZGVWaWV3cyc7XG5pbXBvcnQgeyBrZXltYXBQbHVnaW5zIH0gZnJvbSAnLi9rZXltYXBzJztcbmltcG9ydCB7IG1hcmtkb3duUGFyc2VyLCBtYXJrZG93blNlcmlhbGl6ZXIgfSBmcm9tICcuL21hcmtkb3duJztcbmltcG9ydCB7IElubGluZUxpbmtQbHVnaW4gfSBmcm9tICcuL0lubGluZUxpbmtQbHVnaW4nO1xuXG5pbnRlcmZhY2UgQXBwV2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgdmlldzogRWRpdG9yVmlldztcbn1cblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IEFwcFdpbmRvdztcblxuZnVuY3Rpb24gZ2V0RG9jRm9yTmV3RWRpdG9yU3RhdGUoKSB7XG4gIHJldHVybiBjbGllbnQubGF0ZXN0VGV4dFxuICAgID8gbWFya2Rvd25QYXJzZXIucGFyc2UoY2xpZW50LmxhdGVzdFRleHQpXG4gICAgOiBjbGllbnQubGF0ZXN0RG9jXG4gICAgICA/IHNjaGVtYS5ub2RlRnJvbUpTT04oY2xpZW50LmxhdGVzdERvYylcbiAgICAgIDogc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHtcbiAgYXdhaXQgY2xpZW50LnJlYWR5KCk7XG5cbiAgY29uc3QgdmlldyA9ICh3aW5kb3cudmlldyA9IG5ldyBFZGl0b3JWaWV3KFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlZGl0b3InKSxcbiAgICB7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jOiBnZXREb2NGb3JOZXdFZGl0b3JTdGF0ZSgpLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgLi4ua2V5bWFwUGx1Z2lucyxcbiAgICAgICAgICBuZXcgVG9vbGJhclBsdWdpbihcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b29sYmFyJyksXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGluay1tb2RhbCcpLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IFRvb2x0aXBQbHVnaW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpbmstdG9vbHRpcCcpKSxcbiAgICAgICAgICBuZXcgRWRpdG9yRXh0ZW5kZXJQbHVnaW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2V4dGVuZGVyJykpLFxuICAgICAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgbm9kZVZpZXdzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgSW5saW5lTGlua1BsdWdpbigpLFxuICAgICAgICAgIGlucHV0UnVsZXNQbHVnaW4sXG4gICAgICAgICAgaW5wdXRSdWxlc0ZvcmNlZFNwYWNlUGx1Z2luLFxuICAgICAgICAgIGhpc3RvcnkoKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbih0cikge1xuICAgICAgICBjb25zdCBuZXh0ID0gdmlldy5zdGF0ZS5hcHBseSh0cik7XG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUobmV4dCk7XG4gICAgICAgIGlmICh0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgY2xpZW50LnNhdmVOb3RlKFxuICAgICAgICAgICAgbmV4dC5kb2MudG9KU09OKCksXG4gICAgICAgICAgICBtYXJrZG93blNlcmlhbGl6ZXIuc2VyaWFsaXplKG5leHQuZG9jKSxcbiAgICAgICAgICAgIG5leHQuZG9jLnRleHRCZXR3ZWVuKDAsIG5leHQuZG9jLm5vZGVTaXplIC0gMiwgJyAnKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICkpO1xuXG4gIGNsaWVudC5vblVwZGF0ZSgoZG9jKSA9PiB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBvcGVucyBhIG5ldyBub3RlLCBrZWVwIGFsbCB0aGUgcGx1Z2luIGluc3RhbmNlcyBleGNlcHQgdGhlIHRvb2xiYXJcbiAgICBjb25zdCBwbHVnaW5zID0gdmlldy5zdGF0ZS5wbHVnaW5zLmZpbHRlcihcbiAgICAgIChwbHVnaW4pID0+IHBsdWdpbiBpbnN0YW5jZW9mIFRvb2xiYXJQbHVnaW4gPT09IGZhbHNlLFxuICAgICk7XG5cbiAgICB2aWV3LnNldFByb3BzKHtcbiAgICAgIHN0YXRlOiBFZGl0b3JTdGF0ZS5jcmVhdGUoe1xuICAgICAgICBkb2M6IGdldERvY0Zvck5ld0VkaXRvclN0YXRlKCksXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAuLi5wbHVnaW5zLFxuICAgICAgICAgIG5ldyBUb29sYmFyUGx1Z2luKFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Rvb2xiYXInKSxcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaW5rLW1vZGFsJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9KTtcbn1cblxuaW5pdCgpO1xuIiwiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luXG5leHBvcnQge307Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHlCQUF5QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsbUJBQW1CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHVCQUF1QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxxQkFBcUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHdCQUF3QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsNEJBQTRCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEdBQUcsQ0FBZ0IsZUFBZSxZQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsRUFBQyxJQUFJLEdBQUcsQ0FBZ0IsZUFBZSxZQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxNQUFNLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxlQUFlLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLG1CQUFtQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGVBQWUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGFBQWEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsc0JBQXNCLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsbUJBQW1CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx5QkFBeUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHlCQUF5QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsd0JBQXdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQywwQkFBMEIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMseUJBQXlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxhQUFhLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxlQUFlLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG9CQUFvQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsd0JBQXdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsc0JBQXNCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLEVBQUUsRUFBQyxxQkFBcUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsaUJBQWlCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxrQkFBa0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyx3QkFBd0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLDRCQUE0QixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxHQUFHLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsdUJBQXVCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGlCQUFpQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxvQkFBb0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHNCQUFzQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLG1CQUFtQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMscUJBQXFCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxpQkFBaUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGtCQUFrQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsb0JBQW9CLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsc0JBQXNCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLHFCQUFxQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZ0JBQWdCLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxXQUFXLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxRQUFRLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxZQUFZLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxtQkFBbUIsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxzQkFBc0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsdUJBQXVCLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsYUFBYSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxrQkFBa0IsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQywyQkFBMkIsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsUUFBUSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFVBQVUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxFQUFDLElBQUksR0FBRyxDQUFnQixlQUFlLFlBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsRUFBRSxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLElBQUksRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hCbDZ0QjtBQUNMO0FBTXhDO0FBRXJCLHdDQUF3QztBQUN4QyxJQUFZLFdBS1g7QUFMRCxXQUFZLFdBQVc7SUFDbkIsaUNBQWlDO0lBQ2pDLDJDQUFPO0lBQ1AsbUVBQW1FO0lBQ25FLDZDQUFRO0FBQ1osQ0FBQyxFQUxXLFdBQVcsS0FBWCxXQUFXLFFBS3RCO0FBRUQsSUFBWSxZQTJCWDtBQTNCRCxXQUFZLFlBQVk7SUFDcEI7OztPQUdHO0lBQ0gsK0NBQUk7SUFDSjs7OztPQUlHO0lBQ0gsaURBQUs7SUFDTDs7O09BR0c7SUFDSCx5REFBUztJQUNUOzs7T0FHRztJQUNILHlEQUFTO0lBQ1Q7OztPQUdHO0lBQ0gsK0NBQUk7QUFDUixDQUFDLEVBM0JXLFlBQVksS0FBWixZQUFZLFFBMkJ2QjtBQXNCRDs7Ozs7R0FLRztBQUNHLFNBQVUsTUFBTSxDQUNsQixJQUFZLEVBQ1osVUFBeUMsV0FBVyxDQUFDLEdBQUc7SUFFeEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFFcEUsSUFBSSxLQUFLLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTtRQUM1QixNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRSxPQUFPLHNEQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pDO0lBRUQsT0FBTyxxREFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDRyxTQUFVLFlBQVksQ0FDeEIsSUFBWSxFQUNaLFVBQXlDLFdBQVcsQ0FBQyxHQUFHOztJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDeEUsVUFBSSxDQUFDLElBQUksb0NBQVQsSUFBSSxDQUFDLElBQUksR0FBSyxvREFBWSxDQUFDLE1BQU0sRUFBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQWtCRDs7Ozs7R0FLRztBQUNHLFNBQVUsTUFBTSxDQUNsQixJQUFZLEVBQ1osVUFBeUMsV0FBVyxDQUFDLEdBQUc7SUFFeEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRXhFLHdDQUF3QztJQUN4QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUk7UUFBRSxPQUFPLHNEQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxTQUFTO1FBQUUsT0FBTywyREFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsSUFBSTtRQUFFLE9BQU8sc0RBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3RCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTtRQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLEtBQUssRUFBRTtZQUNsQyxPQUFPLDhEQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxzREFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO0lBRUQscUNBQXFDO0lBQ3JDLE9BQU8scURBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBUW9CO0FBUUE7QUFlQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqTGU7O0FBRXBDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCLDRCQUE0Qjs7QUFFNUIsMEJBQTBCLG9DQUFvQzs7QUFFOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pELGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1REFBUzs7QUFFaEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCOztBQUV4Qix1QkFBdUI7O0FBRXZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLFNBQVM7Ozs7Ozs7Ozs7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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLFNBQVM7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxRQUFROzs7Ozs7Ozs7Ozs7Ozs7O0FDalV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0Isa0RBQWtEOztBQUVsRDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCOztBQUU5Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThC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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxREFBcUQsT0FBTztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsS0FBSzs7QUFFdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQSw2Q0FBNkMsS0FBSztBQUNsRCw0Q0FBNEMsS0FBSztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsNEJBQTRCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsT0FBTztBQUNuRDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUEsaUVBQWUsUUFBUTs7Ozs7Ozs7Ozs7Ozs7OztBQ25UdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLHlCQUF5QjtBQUM3QztBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix3QkFBd0I7QUFDNUM7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msc0JBQXNCO0FBQzlEO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsVUFBVSxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hJa0g7QUFDeEY7QUFDc0Q7O0FBRTFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGlFQUFVO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLDREQUFhO0FBQ3BELHlDQUF5QztBQUN6QywwQkFBMEIsa0VBQVcseURBQXlELG9EQUFLO0FBQ25HO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHdEQUFTO0FBQ25DLDBCQUEwQiw0REFBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlCQUF5QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx3QkFBd0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtFQUFXLGlDQUFpQyxvREFBSztBQUNoRTtBQUNBLHdCQUF3Qiw4REFBVztBQUNuQztBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixNQUFNO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNERBQWE7QUFDL0I7QUFDQTtBQUNBLHVDQUF1Qyw0REFBYTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFVBQVU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDREQUFhO0FBQ3JELHNCQUFzQixrRUFBVywrQ0FBK0Msb0RBQUs7QUFDckY7QUFDQTtBQUNBO0FBQ0EsOERBQThELHdEQUFTO0FBQ3ZFLHNCQUFzQiw0REFBYTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDREQUFhO0FBQy9CO0FBQ0E7QUFDQSx1Q0FBdUMsNERBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELDREQUFhO0FBQ3JFO0FBQ0EscUNBQXFDLDhEQUFPO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdFQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw0REFBYTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qiw0REFBYTtBQUNwQyxxQ0FBcUMsOERBQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0VBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxhQUFhO0FBQ3ZCLHlEQUF5RCxpRUFBVTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixxQkFBcUI7QUFDekMsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGlCQUFpQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3REFBUztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsYUFBYTtBQUM5Qyx1QkFBdUIsMkRBQVk7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNERBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwrREFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGlFQUFVO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQix1Q0FBdUMsNERBQWE7QUFDcEQsd0NBQXdDLCtEQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsY0FBYztBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyw0REFBYSwrQkFBK0IsMkRBQVk7QUFDL0Y7QUFDQTtBQUNBLGtCQUFrQiwrREFBUTtBQUMxQjtBQUNBLGlDQUFpQyxjQUFjO0FBQy9DLGtCQUFrQiwrREFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsWUFBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLDREQUFhO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDJEQUFZO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsOERBQU87QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELHVEQUFRO0FBQ2hFLDBDQUEwQyxRQUFRO0FBQ2xELHVCQUF1Qix1REFBUTtBQUMvQixtQkFBbUIsdURBQVE7QUFDM0IsdUNBQXVDLG9FQUFpQix1Q0FBdUMsb0RBQUs7QUFDcEc7QUFDQTtBQUNBLGdCQUFnQiw4REFBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFLHdEQUFTO0FBQ3hGLHVGQUF1RixpRUFBVTtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHdCQUF3QjtBQUN2QztBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdURBQVE7QUFDbEMsOENBQThDLFFBQVE7QUFDdEQsMEJBQTBCLHVEQUFRO0FBQ2xDLDJDQUEyQyxvRUFBaUIsdUhBQXVILG9EQUFLO0FBQ3hMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDREQUFhO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQiwrREFBK0QsbUVBQVk7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrREFBa0Q7QUFDMUUsa0JBQWtCLFNBQVMsV0FBVyxTQUFTLFlBQVk7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbUNBQW1DO0FBQy9ELHNCQUFzQixTQUFTLFdBQVcsU0FBUyxZQUFZO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QyxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDZEQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDRCQUE0Qiw2REFBYztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyx5QkFBeUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRCwwQkFBMEIsYUFBYTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw0QkFBNEI7QUFDcEQ7QUFDQSw0QkFBNEIsbUJBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQTtBQUNBLG9GQUFvRixXQUFXO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQsZ0JBQWdCLDhEQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUUwYjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqMUJqWjtBQUNPO0FBQ007O0FBRXREO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDRCQUE0QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwREFBTztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxtQ0FBbUMsY0FBYztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMsc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCwwQkFBMEIscURBQVk7QUFDdEM7QUFDQTtBQUNBLDBCQUEwQixxREFBWTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLDhCQUE4QjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSw2QkFBNkI7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdEQUFTO0FBQ2hDLDRCQUE0Qix3REFBUztBQUNyQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixlQUFlO0FBQ2Y7QUFDQSxlQUFlLHFEQUFNO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFK0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN2JwRDtBQUNtQjs7QUFFOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPO0FBQzdCLHFCQUFxQixxREFBTTtBQUMzQjtBQUNBLHFCQUFxQixjQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFVBQVU7QUFDeEM7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQywrQkFBK0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsUUFBUTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLG1CQUFtQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsbUJBQW1CO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxvQ0FBb0MsbUJBQW1CO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxtQkFBbUI7QUFDdkU7QUFDQTtBQUNBO0FBQ0EsaURBQWlELG9DQUFvQyxtQkFBbUI7QUFDeEc7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELG1CQUFtQjtBQUN2RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGLG1FQUFZO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELDhEQUFPO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRWdNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbk9wSjtBQUNEOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHFEQUFNLEdBQUcsU0FBUywyQ0FBMkM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsNkNBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVrQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvSGU7QUFDWjs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFEQUFNO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsVUFBVTtBQUNuQyxzQkFBc0I7QUFDdEIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUMsc0JBQXNCO0FBQ3RCLFNBQVM7QUFDVDtBQUNBO0FBQ0EseUJBQXlCLFdBQVc7QUFDcEMsc0JBQXNCO0FBQ3RCLFNBQVM7QUFDVDtBQUNBLHFCQUFxQixTQUFTLGNBQWM7QUFDNUM7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG9CQUFvQixZQUFZO0FBQ3pELGtCQUFrQixvQkFBb0IsWUFBWTtBQUNsRCxrQkFBa0Isb0JBQW9CLFlBQVk7QUFDbEQsa0JBQWtCLG9CQUFvQixZQUFZO0FBQ2xELGtCQUFrQixvQkFBb0IsWUFBWTtBQUNsRCxrQkFBa0Isb0JBQW9CLFlBQVk7QUFDbEQsMEJBQTBCO0FBQzFCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsVUFBVSxlQUFlO0FBQzlDLHlCQUF5Qiw2REFBNkQsZ0RBQWdELEdBQUc7QUFDekksMEJBQTBCLHFDQUFxQyxtQ0FBbUMsSUFBSTtBQUN0RyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFNBQVMsWUFBWSxXQUFXLGtCQUFrQjtBQUN2RSx5QkFBeUI7QUFDekIsaUNBQWlDO0FBQ2pDO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0EsZ0NBQWdDO0FBQ2hDLHdFQUF3RTtBQUN4RTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsU0FBUyxrQkFBa0I7QUFDaEQseUJBQXlCLCtCQUErQix1Q0FBdUMsR0FBRztBQUNsRywwQkFBMEIsZ0JBQWdCLGdEQUFnRDtBQUMxRixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFdBQVc7QUFDcEMsc0JBQXNCO0FBQ3RCLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix1QkFBdUIsZUFBZTtBQUN0Qyx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QiwwQkFBMEI7QUFDMUIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFdBQVc7QUFDcEMsc0JBQXNCO0FBQ3RCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixVQUFVLElBQUksV0FBVztBQUMzQyxrQkFBa0IsNEJBQTRCO0FBQzlDLGtCQUFrQjtBQUNsQjtBQUNBLHNCQUFzQjtBQUN0QixTQUFTO0FBQ1Q7QUFDQTtBQUNBLGtCQUFrQixlQUFlO0FBQ2pDLGtCQUFrQix1RUFBdUU7QUFDekYsa0JBQWtCLG1FQUFtRTtBQUNyRixrQkFBa0IsOERBQThELEdBQUc7QUFDbkY7QUFDQSxzQkFBc0I7QUFDdEIsU0FBUztBQUNUO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEIseUJBQXlCO0FBQ3pCLGFBQWE7QUFDYjtBQUNBLHlCQUF5QjtBQUN6QixpQ0FBaUM7QUFDakMsdUJBQXVCO0FBQ3ZCLDBCQUEwQjtBQUMxQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsZ0NBQWdDLG1EQUFJO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDJEQUEyRCxtREFBSSxPQUFPO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDLG1EQUFJLE9BQU87QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLG9CQUFvQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFVBQVU7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMEJBQTBCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsVUFBVTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsS0FBSyx1QkFBdUIsS0FBSztBQUM5RSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxXQUFXO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixjQUFjO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBNkQ7QUFDdkc7QUFDQSx5Q0FBeUMsNkRBQTZEO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0JBQWdCO0FBQzFCLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxnQkFBZ0I7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFdBQVc7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnR0FBZ0csUUFBUTtBQUN4RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsVUFBVSxJQUFJLGdDQUFnQztBQUMzRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsT0FBTyxnQkFBZ0IsVUFBVSxVQUFVLFNBQVMsUUFBUSxLQUFLO0FBQzVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrREFBVTtBQUN2QyxpQ0FBaUMsa0RBQVUsc0JBQXNCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixrQkFBa0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxzQkFBc0I7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLHdCQUF3QjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixtQkFBbUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QSw0QkFBNEIscUJBQXFCO0FBQ2pELHNCQUFzQixhQUFhO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0JBQWtCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsb0RBQUs7QUFDL0I7QUFDQSx1QkFBdUIsb0RBQUs7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFLLENBQUMsdURBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxlQUFlO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLG9EQUFLO0FBQy9CLHVCQUF1QixvREFBSztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLGVBQWU7QUFDZixnQkFBZ0I7QUFDaEIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQixtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0Qyx3Q0FBd0M7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDhEQUFXLG9CQUFvQixvRUFBaUI7QUFDMUU7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRCxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw0REFBUztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtREFBSTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2SUFBNkksbURBQUk7QUFDako7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGlFQUFpRTtBQUN4RixvQkFBb0I7QUFDcEIsS0FBSztBQUNMO0FBQ0EsaUNBQWlDLDZEQUE2RDtBQUM5RixvQkFBb0I7QUFDcEIsS0FBSztBQUNMO0FBQ0EsdUJBQXVCLG9DQUFvQztBQUMzRCx5Q0FBeUM7QUFDekMsS0FBSztBQUNMO0FBQ0EsaUJBQWlCLFdBQVc7QUFDNUIsMEJBQTBCO0FBQzFCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnQ0FBZ0M7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSw0QkFBNEIsZ0NBQWdDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxnQ0FBZ0M7QUFDNUUsb0RBQW9ELGlDQUFpQyxJQUFJLG1CQUFtQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkJBQTJCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsbUJBQW1CO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLG1EQUFJO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFOEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzErQjVDOztBQUVsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDLCtCQUErQjtBQUMvQixnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHdCQUF3QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELDBCQUEwQjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHdCQUF3QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvR0FBb0csUUFBUTtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGFBQWE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELGVBQWU7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwyREFBWTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1REFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFLO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0RBQUs7QUFDN0I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsb0RBQUssQ0FBQyx1REFBUTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsdUJBQXVCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNq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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLG9EQUFLO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLG9EQUFLLENBQUMsdURBQVE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxvREFBSztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbURBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTBTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNtRWhOO0FBQ047QUFDbEM7O0FBRWxEO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UsaUJBQWlCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixLQUFLO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCx3Q0FBd0M7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLEtBQUs7QUFDN0IscUJBQXFCLG9EQUFvRDtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQix1QkFBdUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLGNBQWMsaUJBQWlCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLG9CQUFvQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxPQUFPO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGtCQUFrQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZUFBZTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZJQUE2STtBQUM3STtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msa0JBQWtCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLFdBQVc7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUscUJBQXFCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyx3REFBd0Q7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLE9BQU87QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyw4QkFBOEI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw4QkFBOEI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0EsaUNBQWlDLDREQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLHdEQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLG1CQUFtQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELDREQUFhO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwrQkFBK0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsK0JBQStCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw2QkFBNkI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRGQUE0Riw0REFBYTtBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtCQUErQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsb0JBQW9CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNsQiwyQ0FBTSxDQUFDLFFBQVEsQ0FDYixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUNqQix5REFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUNwRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FDRixDQUFDLENBQUM7UUFFSCwyQ0FBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RCLG1GQUFtRjtZQUNuRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3ZDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLFlBQVkseURBQWEsS0FBSyxLQUFLLENBQ3RELENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLEtBQUssRUFBRSwyREFBVyxDQUFDLE1BQU0sQ0FBQztvQkFDeEIsR0FBRyxFQUFFLHVCQUF1QixFQUFFO29CQUM5QixPQUFPLEVBQUU7d0JBQ1AsR0FBRyxPQUFPO3dCQUNWLElBQUkseURBQWEsQ0FDZixRQUFRLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUNsQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUN0QztxQkFDRjtpQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQUE7QUFFRCxJQUFJLEVBQUUsQ0FBQzs7Ozs7Ozs7Ozs7QUM3RlAiLCJzb3VyY2VzIjpbImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2RlY29kZS50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2RlY29kZV9jb2RlcG9pbnQudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9lbmNvZGUudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9lc2NhcGUudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZGVjb2RlLWRhdGEtaHRtbC50cyIsImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mYjU1L2VudGl0aWVzLzYxYWZkNDcwMWVhYTczNjk3OGIxM2M3MzUxY2QzZGU5YTk2YjA0YmMvc3JjL2dlbmVyYXRlZC9kZWNvZGUtZGF0YS14bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9nZW5lcmF0ZWQvZW5jb2RlLWh0bWwudHMiLCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZmI1NS9lbnRpdGllcy82MWFmZDQ3MDFlYWE3MzY5NzhiMTNjNzM1MWNkM2RlOWE5NmIwNGJjL3NyYy9pbmRleC50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9saW5raWZ5LWl0L2xpYi9yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9jb21tb24vaHRtbF9ibG9ja3MubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9jb21tb24vaHRtbF9yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2NvbW1vbi91dGlscy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL2hlbHBlcnMvaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfZGVzdGluYXRpb24ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfbGFiZWwubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9oZWxwZXJzL3BhcnNlX2xpbmtfdGl0bGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3BhcnNlcl9jb3JlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcGFyc2VyX2lubGluZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvY29tbW9ubWFyay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvZGVmYXVsdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3ByZXNldHMvemVyby5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3JlbmRlcmVyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXIubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19ibG9jay9ibG9ja3F1b3RlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2ZlbmNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaGVhZGluZy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2hyLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svaHRtbF9ibG9jay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL2xoZWFkaW5nLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svbGlzdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3BhcmFncmFwaC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3JlZmVyZW5jZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2Jsb2NrL3N0YXRlX2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfYmxvY2svdGFibGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL2Jsb2NrLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL2xpbmtpZnkubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19jb3JlL25vcm1hbGl6ZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvcmVwbGFjZW1lbnRzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfY29yZS9zbWFydHF1b3Rlcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvc3RhdGVfY29yZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2NvcmUvdGV4dF9qb2luLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2F1dG9saW5rLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2JhY2t0aWNrcy5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9iYWxhbmNlX3BhaXJzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VtcGhhc2lzLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL2VudGl0eS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9lc2NhcGUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvZnJhZ21lbnRzX2pvaW4ubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaHRtbF9pbmxpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvaW1hZ2UubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvbGluay5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3J1bGVzX2lubGluZS9saW5raWZ5Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL25ld2xpbmUubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvc3RhdGVfaW5saW5lLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tYXJrZG93bi1pdC9saWIvcnVsZXNfaW5saW5lL3N0cmlrZXRocm91Z2gubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL21hcmtkb3duLWl0L2xpYi9ydWxlc19pbmxpbmUvdGV4dC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWFya2Rvd24taXQvbGliL3Rva2VuLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9tZHVybC9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2RlY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2VuY29kZS5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL2Zvcm1hdC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvbWR1cmwvbGliL3BhcnNlLm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9vcmRlcmVkbWFwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItY29tbWFuZHMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1oaXN0b3J5L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItaW5wdXRydWxlcy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLWtleW1hcC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLW1hcmtkb3duL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItbW9kZWwvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtYmFzaWMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9wcm9zZW1pcnJvci1zY2hlbWEtbGlzdC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3Byb3NlbWlycm9yLXN0YXRlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3ItdHJhbnNmb3JtL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itdmlldy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3B1bnljb2RlLmpzL3B1bnljb2RlLmVzNi5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy9yb3BlLXNlcXVlbmNlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9DYy9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9DZi9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vY2F0ZWdvcmllcy9QL3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy91Yy5taWNyby9jYXRlZ29yaWVzL1MvcmVnZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL2NhdGVnb3JpZXMvWi9yZWdleC5tanMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvdWMubWljcm8vaW5kZXgubWpzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vbm9kZV9tb2R1bGVzL3VjLm1pY3JvL3Byb3BlcnRpZXMvQW55L3JlZ2V4Lm1qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL25vZGVfbW9kdWxlcy93M2Mta2V5bmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9FZGl0b3JFeHRlbmRlclBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9JbmxpbmVMaW5rUGx1Z2luLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL1Rvb2xiYXJQbHVnaW4udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvVG9vbHRpcFBsdWdpbi50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9hc3NldHMvY2hlY2tfYm94LTI0cHguc3ZnIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2Fzc2V0cy9jaGVja19ib3hfb3V0bGluZV9ibGFuay0yNHB4LnN2ZyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9hc3NldHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvZGVtb0NsaWVudC50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9kZW1vRG9jcy5tZCIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9pbnB1dFJ1bGVzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL2tleW1hcHMudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvbWFya2Rvd24udHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvbm9kZVZpZXdzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3NjaGVtYS50cyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci8uL3NyYy9zY2hlbWFIZWxwZXJzLnRzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9zbi1zY3JhdGNocGFkLWVkaXRvci93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvc3R5bGVzLmNzcz8xNTUzIl0sInNvdXJjZXNDb250ZW50IjpbbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJpbXBvcnQgcmVGYWN0b3J5IGZyb20gJy4vbGliL3JlLm1qcydcblxuLy9cbi8vIEhlbHBlcnNcbi8vXG5cbi8vIE1lcmdlIG9iamVjdHNcbi8vXG5mdW5jdGlvbiBhc3NpZ24gKG9iaiAvKiBmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4gKi8pIHtcbiAgY29uc3Qgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcblxuICBzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgIGlmICghc291cmNlKSB7IHJldHVybiB9XG5cbiAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIG9ialxufVxuXG5mdW5jdGlvbiBfY2xhc3MgKG9iaikgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgfVxuZnVuY3Rpb24gaXNTdHJpbmcgKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nIH1cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHsgcmV0dXJuIF9jbGFzcyhvYmopID09PSAnW29iamVjdCBPYmplY3RdJyB9XG5mdW5jdGlvbiBpc1JlZ0V4cCAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXScgfVxuZnVuY3Rpb24gaXNGdW5jdGlvbiAob2JqKSB7IHJldHVybiBfY2xhc3Mob2JqKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB9XG5cbmZ1bmN0aW9uIGVzY2FwZVJFIChzdHIpIHsgcmV0dXJuIHN0ci5yZXBsYWNlKC9bLj8qK14kW1xcXVxcXFwoKXt9fC1dL2csICdcXFxcJCYnKSB9XG5cbi8vXG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBmdXp6eUxpbms6IHRydWUsXG4gIGZ1enp5RW1haWw6IHRydWUsXG4gIGZ1enp5SVA6IGZhbHNlXG59XG5cbmZ1bmN0aW9uIGlzT3B0aW9uc09iaiAob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmogfHwge30pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucyAqL1xuICAgIHJldHVybiBhY2MgfHwgZGVmYXVsdE9wdGlvbnMuaGFzT3duUHJvcGVydHkoaylcbiAgfSwgZmFsc2UpXG59XG5cbmNvbnN0IGRlZmF1bHRTY2hlbWFzID0ge1xuICAnaHR0cDonOiB7XG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICh0ZXh0LCBwb3MsIHNlbGYpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgICAgaWYgKCFzZWxmLnJlLmh0dHApIHtcbiAgICAgICAgLy8gY29tcGlsZSBsYXppbHksIGJlY2F1c2UgXCJob3N0XCItY29udGFpbmluZyB2YXJpYWJsZXMgY2FuIGNoYW5nZSBvbiB0bGRzIHVwZGF0ZS5cbiAgICAgICAgc2VsZi5yZS5odHRwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAnXlxcXFwvXFxcXC8nICsgc2VsZi5yZS5zcmNfYXV0aCArIHNlbGYucmUuc3JjX2hvc3RfcG9ydF9zdHJpY3QgKyBzZWxmLnJlLnNyY19wYXRoLCAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHNlbGYucmUuaHR0cC50ZXN0KHRhaWwpKSB7XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUuaHR0cClbMF0ubGVuZ3RoXG4gICAgICB9XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfSxcbiAgJ2h0dHBzOic6ICdodHRwOicsXG4gICdmdHA6JzogJ2h0dHA6JyxcbiAgJy8vJzoge1xuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICBjb25zdCB0YWlsID0gdGV4dC5zbGljZShwb3MpXG5cbiAgICAgIGlmICghc2VsZi5yZS5ub19odHRwKSB7XG4gICAgICAvLyBjb21waWxlIGxhemlseSwgYmVjYXVzZSBcImhvc3RcIi1jb250YWluaW5nIHZhcmlhYmxlcyBjYW4gY2hhbmdlIG9uIHRsZHMgdXBkYXRlLlxuICAgICAgICBzZWxmLnJlLm5vX2h0dHAgPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICdeJyArXG4gICAgICAgICAgc2VsZi5yZS5zcmNfYXV0aCArXG4gICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgc2luZ2xlLWxldmVsIGRvbWFpbnMsIGJlY2F1c2Ugb2YgZmFsc2UgcG9zaXRpdmVzIGxpa2UgJy8vdGVzdCdcbiAgICAgICAgICAvLyB3aXRoIGNvZGUgY29tbWVudHNcbiAgICAgICAgICAnKD86bG9jYWxob3N0fCg/Oig/OicgKyBzZWxmLnJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsnICsgc2VsZi5yZS5zcmNfZG9tYWluX3Jvb3QgKyAnKScgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX3BvcnQgK1xuICAgICAgICAgIHNlbGYucmUuc3JjX2hvc3RfdGVybWluYXRvciArXG4gICAgICAgICAgc2VsZi5yZS5zcmNfcGF0aCxcblxuICAgICAgICAgICdpJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLnJlLm5vX2h0dHAudGVzdCh0YWlsKSkge1xuICAgICAgICAvLyBzaG91bGQgbm90IGJlIGA6Ly9gICYgYC8vL2AsIHRoYXQgcHJvdGVjdHMgZnJvbSBlcnJvcnMgaW4gcHJvdG9jb2wgbmFtZVxuICAgICAgICBpZiAocG9zID49IDMgJiYgdGV4dFtwb3MgLSAzXSA9PT0gJzonKSB7IHJldHVybiAwIH1cbiAgICAgICAgaWYgKHBvcyA+PSAzICYmIHRleHRbcG9zIC0gM10gPT09ICcvJykgeyByZXR1cm4gMCB9XG4gICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUubm9faHR0cClbMF0ubGVuZ3RoXG4gICAgICB9XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgfSxcbiAgJ21haWx0bzonOiB7XG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uICh0ZXh0LCBwb3MsIHNlbGYpIHtcbiAgICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgICAgaWYgKCFzZWxmLnJlLm1haWx0bykge1xuICAgICAgICBzZWxmLnJlLm1haWx0byA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgJ14nICsgc2VsZi5yZS5zcmNfZW1haWxfbmFtZSArICdAJyArIHNlbGYucmUuc3JjX2hvc3Rfc3RyaWN0LCAnaSdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHNlbGYucmUubWFpbHRvLnRlc3QodGFpbCkpIHtcbiAgICAgICAgcmV0dXJuIHRhaWwubWF0Y2goc2VsZi5yZS5tYWlsdG8pWzBdLmxlbmd0aFxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cbn1cblxuLy8gUkUgcGF0dGVybiBmb3IgMi1jaGFyYWN0ZXIgdGxkcyAoYXV0b2dlbmVyYXRlZCBieSAuL3N1cHBvcnQvdGxkc18yY2hhcl9nZW4uanMpXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlbiAqL1xuY29uc3QgdGxkc18yY2hfc3JjX3JlID0gJ2FbY2RlZmdpbG1ub3Fyc3R1d3h6XXxiW2FiZGVmZ2hpam1ub3JzdHZ3eXpdfGNbYWNkZmdoaWtsbW5vcnV2d3h5el18ZFtlamttb3pdfGVbY2VncnN0dV18Zltpamttb3JdfGdbYWJkZWZnaGlsbW5wcXJzdHV3eV18aFtrbW5ydHVdfGlbZGVsbW5vcXJzdF18altlbW9wXXxrW2VnaGltbnByd3l6XXxsW2FiY2lrcnN0dXZ5XXxtW2FjZGVnaGtsbW5vcHFyc3R1dnd4eXpdfG5bYWNlZmdpbG9wcnV6XXxvbXxwW2FlZmdoa2xtbnJzdHd5XXxxYXxyW2Vvc3V3XXxzW2FiY2RlZ2hpamtsbW5vcnR1dnh5el18dFtjZGZnaGprbG1ub3J0dnd6XXx1W2Fna3N5el18dlthY2VnaW51XXx3W2ZzXXx5W2V0XXx6W2Ftd10nXG5cbi8vIERPTidUIHRyeSB0byBtYWtlIFBScyB3aXRoIGNoYW5nZXMuIEV4dGVuZCBUTERzIHdpdGggTGlua2lmeUl0LnRsZHMoKSBpbnN0ZWFkXG5jb25zdCB0bGRzX2RlZmF1bHQgPSAnYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YQnLnNwbGl0KCd8JylcblxuZnVuY3Rpb24gcmVzZXRTY2FuQ2FjaGUgKHNlbGYpIHtcbiAgc2VsZi5fX2luZGV4X18gPSAtMVxuICBzZWxmLl9fdGV4dF9jYWNoZV9fID0gJydcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmFsaWRhdG9yIChyZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHRleHQsIHBvcykge1xuICAgIGNvbnN0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcylcblxuICAgIGlmIChyZS50ZXN0KHRhaWwpKSB7XG4gICAgICByZXR1cm4gdGFpbC5tYXRjaChyZSlbMF0ubGVuZ3RoXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9ybWFsaXplciAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobWF0Y2gsIHNlbGYpIHtcbiAgICBzZWxmLm5vcm1hbGl6ZShtYXRjaClcbiAgfVxufVxuXG4vLyBTY2hlbWFzIGNvbXBpbGVyLiBCdWlsZCByZWdleHBzLlxuLy9cbmZ1bmN0aW9uIGNvbXBpbGUgKHNlbGYpIHtcbiAgLy8gTG9hZCAmIGNsb25lIFJFIHBhdHRlcm5zLlxuICBjb25zdCByZSA9IHNlbGYucmUgPSByZUZhY3Rvcnkoc2VsZi5fX29wdHNfXylcblxuICAvLyBEZWZpbmUgZHluYW1pYyBwYXR0ZXJuc1xuICBjb25zdCB0bGRzID0gc2VsZi5fX3RsZHNfXy5zbGljZSgpXG5cbiAgc2VsZi5vbkNvbXBpbGUoKVxuXG4gIGlmICghc2VsZi5fX3RsZHNfcmVwbGFjZWRfXykge1xuICAgIHRsZHMucHVzaCh0bGRzXzJjaF9zcmNfcmUpXG4gIH1cbiAgdGxkcy5wdXNoKHJlLnNyY194bilcblxuICByZS5zcmNfdGxkcyA9IHRsZHMuam9pbignfCcpXG5cbiAgZnVuY3Rpb24gdW50cGwgKHRwbCkgeyByZXR1cm4gdHBsLnJlcGxhY2UoJyVUTERTJScsIHJlLnNyY190bGRzKSB9XG5cbiAgcmUuZW1haWxfZnV6enkgPSBSZWdFeHAodW50cGwocmUudHBsX2VtYWlsX2Z1enp5KSwgJ2knKVxuICByZS5saW5rX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9saW5rX2Z1enp5KSwgJ2knKVxuICByZS5saW5rX25vX2lwX2Z1enp5ID0gUmVnRXhwKHVudHBsKHJlLnRwbF9saW5rX25vX2lwX2Z1enp5KSwgJ2knKVxuICByZS5ob3N0X2Z1enp5X3Rlc3QgPSBSZWdFeHAodW50cGwocmUudHBsX2hvc3RfZnV6enlfdGVzdCksICdpJylcblxuICAvL1xuICAvLyBDb21waWxlIGVhY2ggc2NoZW1hXG4gIC8vXG5cbiAgY29uc3QgYWxpYXNlcyA9IFtdXG5cbiAgc2VsZi5fX2NvbXBpbGVkX18gPSB7fSAvLyBSZXNldCBjb21waWxlZCBkYXRhXG5cbiAgZnVuY3Rpb24gc2NoZW1hRXJyb3IgKG5hbWUsIHZhbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignKExpbmtpZnlJdCkgSW52YWxpZCBzY2hlbWEgXCInICsgbmFtZSArICdcIjogJyArIHZhbClcbiAgfVxuXG4gIE9iamVjdC5rZXlzKHNlbGYuX19zY2hlbWFzX18pLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCB2YWwgPSBzZWxmLl9fc2NoZW1hc19fW25hbWVdXG5cbiAgICAvLyBza2lwIGRpc2FibGVkIG1ldGhvZHNcbiAgICBpZiAodmFsID09PSBudWxsKSB7IHJldHVybiB9XG5cbiAgICBjb25zdCBjb21waWxlZCA9IHsgdmFsaWRhdGU6IG51bGwsIGxpbms6IG51bGwgfVxuXG4gICAgc2VsZi5fX2NvbXBpbGVkX19bbmFtZV0gPSBjb21waWxlZFxuXG4gICAgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGlmIChpc1JlZ0V4cCh2YWwudmFsaWRhdGUpKSB7XG4gICAgICAgIGNvbXBpbGVkLnZhbGlkYXRlID0gY3JlYXRlVmFsaWRhdG9yKHZhbC52YWxpZGF0ZSlcbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih2YWwudmFsaWRhdGUpKSB7XG4gICAgICAgIGNvbXBpbGVkLnZhbGlkYXRlID0gdmFsLnZhbGlkYXRlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbC5ub3JtYWxpemUpKSB7XG4gICAgICAgIGNvbXBpbGVkLm5vcm1hbGl6ZSA9IHZhbC5ub3JtYWxpemVcbiAgICAgIH0gZWxzZSBpZiAoIXZhbC5ub3JtYWxpemUpIHtcbiAgICAgICAgY29tcGlsZWQubm9ybWFsaXplID0gY3JlYXRlTm9ybWFsaXplcigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWFFcnJvcihuYW1lLCB2YWwpXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyh2YWwpKSB7XG4gICAgICBhbGlhc2VzLnB1c2gobmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNjaGVtYUVycm9yKG5hbWUsIHZhbClcbiAgfSlcblxuICAvL1xuICAvLyBDb21waWxlIHBvc3Rwb25lZCBhbGlhc2VzXG4gIC8vXG5cbiAgYWxpYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgIGlmICghc2VsZi5fX2NvbXBpbGVkX19bc2VsZi5fX3NjaGVtYXNfX1thbGlhc11dKSB7XG4gICAgICAvLyBTaWxlbnRseSBmYWlsIG9uIG1pc3NlZCBzY2hlbWFzIHRvIGF2b2lkIGVycm9ucyBvbiBkaXNhYmxlLlxuICAgICAgLy8gc2NoZW1hRXJyb3IoYWxpYXMsIHNlbGYuX19zY2hlbWFzX19bYWxpYXNdKTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNlbGYuX19jb21waWxlZF9fW2FsaWFzXS52YWxpZGF0ZSA9XG4gICAgICBzZWxmLl9fY29tcGlsZWRfX1tzZWxmLl9fc2NoZW1hc19fW2FsaWFzXV0udmFsaWRhdGVcbiAgICBzZWxmLl9fY29tcGlsZWRfX1thbGlhc10ubm9ybWFsaXplID1cbiAgICAgIHNlbGYuX19jb21waWxlZF9fW3NlbGYuX19zY2hlbWFzX19bYWxpYXNdXS5ub3JtYWxpemVcbiAgfSlcblxuICAvL1xuICAvLyBGYWtlIHJlY29yZCBmb3IgZ3Vlc3NlZCBsaW5rc1xuICAvL1xuICBzZWxmLl9fY29tcGlsZWRfX1snJ10gPSB7IHZhbGlkYXRlOiBudWxsLCBub3JtYWxpemU6IGNyZWF0ZU5vcm1hbGl6ZXIoKSB9XG5cbiAgLy9cbiAgLy8gQnVpbGQgc2NoZW1hIGNvbmRpdGlvblxuICAvL1xuICBjb25zdCBzbGlzdCA9IE9iamVjdC5rZXlzKHNlbGYuX19jb21waWxlZF9fKVxuICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIC8vIEZpbHRlciBkaXNhYmxlZCAmIGZha2Ugc2NoZW1hc1xuICAgICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMCAmJiBzZWxmLl9fY29tcGlsZWRfX1tuYW1lXVxuICAgIH0pXG4gICAgLm1hcChlc2NhcGVSRSlcbiAgICAuam9pbignfCcpXG4gIC8vICg/IV8pIGNhdXNlIDEuNXggc2xvd2Rvd25cbiAgc2VsZi5yZS5zY2hlbWFfdGVzdCA9IFJlZ0V4cCgnKF58KD8hXykoPzpbPjxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSkoJyArIHNsaXN0ICsgJyknLCAnaScpXG4gIHNlbGYucmUuc2NoZW1hX3NlYXJjaCA9IFJlZ0V4cCgnKF58KD8hXykoPzpbPjxcXHVmZjVjXXwnICsgcmUuc3JjX1pQQ2MgKyAnKSkoJyArIHNsaXN0ICsgJyknLCAnaWcnKVxuICBzZWxmLnJlLnNjaGVtYV9hdF9zdGFydCA9IFJlZ0V4cCgnXicgKyBzZWxmLnJlLnNjaGVtYV9zZWFyY2guc291cmNlLCAnaScpXG5cbiAgc2VsZi5yZS5wcmV0ZXN0ID0gUmVnRXhwKFxuICAgICcoJyArIHNlbGYucmUuc2NoZW1hX3Rlc3Quc291cmNlICsgJyl8KCcgKyBzZWxmLnJlLmhvc3RfZnV6enlfdGVzdC5zb3VyY2UgKyAnKXxAJyxcbiAgICAnaSdcbiAgKVxuXG4gIC8vXG4gIC8vIENsZWFudXBcbiAgLy9cblxuICByZXNldFNjYW5DYWNoZShzZWxmKVxufVxuXG4vKipcbiAqIGNsYXNzIE1hdGNoXG4gKlxuICogTWF0Y2ggcmVzdWx0LiBTaW5nbGUgZWxlbWVudCBvZiBhcnJheSwgcmV0dXJuZWQgYnkgW1tMaW5raWZ5SXQjbWF0Y2hdXVxuICoqL1xuZnVuY3Rpb24gTWF0Y2ggKHNlbGYsIHNoaWZ0KSB7XG4gIGNvbnN0IHN0YXJ0ID0gc2VsZi5fX2luZGV4X19cbiAgY29uc3QgZW5kID0gc2VsZi5fX2xhc3RfaW5kZXhfX1xuICBjb25zdCB0ZXh0ID0gc2VsZi5fX3RleHRfY2FjaGVfXy5zbGljZShzdGFydCwgZW5kKVxuXG4gIC8qKlxuICAgKiBNYXRjaCNzY2hlbWEgLT4gU3RyaW5nXG4gICAqXG4gICAqIFByZWZpeCAocHJvdG9jb2wpIGZvciBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLnNjaGVtYSA9IHNlbGYuX19zY2hlbWFfXy50b0xvd2VyQ2FzZSgpXG4gIC8qKlxuICAgKiBNYXRjaCNpbmRleCAtPiBOdW1iZXJcbiAgICpcbiAgICogRmlyc3QgcG9zaXRpb24gb2YgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy5pbmRleCA9IHN0YXJ0ICsgc2hpZnRcbiAgLyoqXG4gICAqIE1hdGNoI2xhc3RJbmRleCAtPiBOdW1iZXJcbiAgICpcbiAgICogTmV4dCBwb3NpdGlvbiBhZnRlciBtYXRjaGVkIHN0cmluZy5cbiAgICoqL1xuICB0aGlzLmxhc3RJbmRleCA9IGVuZCArIHNoaWZ0XG4gIC8qKlxuICAgKiBNYXRjaCNyYXcgLT4gU3RyaW5nXG4gICAqXG4gICAqIE1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMucmF3ID0gdGV4dFxuICAvKipcbiAgICogTWF0Y2gjdGV4dCAtPiBTdHJpbmdcbiAgICpcbiAgICogTm90bWFsaXplZCB0ZXh0IG9mIG1hdGNoZWQgc3RyaW5nLlxuICAgKiovXG4gIHRoaXMudGV4dCA9IHRleHRcbiAgLyoqXG4gICAqIE1hdGNoI3VybCAtPiBTdHJpbmdcbiAgICpcbiAgICogTm9ybWFsaXplZCB1cmwgb2YgbWF0Y2hlZCBzdHJpbmcuXG4gICAqKi9cbiAgdGhpcy51cmwgPSB0ZXh0XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hdGNoIChzZWxmLCBzaGlmdCkge1xuICBjb25zdCBtYXRjaCA9IG5ldyBNYXRjaChzZWxmLCBzaGlmdClcblxuICBzZWxmLl9fY29tcGlsZWRfX1ttYXRjaC5zY2hlbWFdLm5vcm1hbGl6ZShtYXRjaCwgc2VsZilcblxuICByZXR1cm4gbWF0Y2hcbn1cblxuLyoqXG4gKiBjbGFzcyBMaW5raWZ5SXRcbiAqKi9cblxuLyoqXG4gKiBuZXcgTGlua2lmeUl0KHNjaGVtYXMsIG9wdGlvbnMpXG4gKiAtIHNjaGVtYXMgKE9iamVjdCk6IE9wdGlvbmFsLiBBZGRpdGlvbmFsIHNjaGVtYXMgdG8gdmFsaWRhdGUgKHByZWZpeC92YWxpZGF0b3IpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHsgZnV6enlMaW5rfGZ1enp5RW1haWx8ZnV6enlJUDogdHJ1ZXxmYWxzZSB9XG4gKlxuICogQ3JlYXRlcyBuZXcgbGlua2lmaWVyIGluc3RhbmNlIHdpdGggb3B0aW9uYWwgYWRkaXRpb25hbCBzY2hlbWFzLlxuICogQ2FuIGJlIGNhbGxlZCB3aXRob3V0IGBuZXdgIGtleXdvcmQgZm9yIGNvbnZlbmllbmNlLlxuICpcbiAqIEJ5IGRlZmF1bHQgdW5kZXJzdGFuZHM6XG4gKlxuICogLSBgaHR0cChzKTovLy4uLmAgLCBgZnRwOi8vLi4uYCwgYG1haWx0bzouLi5gICYgYC8vLi4uYCBsaW5rc1xuICogLSBcImZ1enp5XCIgbGlua3MgYW5kIGVtYWlscyAoZXhhbXBsZS5jb20sIGZvb0BiYXIuY29tKS5cbiAqXG4gKiBgc2NoZW1hc2AgaXMgYW4gb2JqZWN0LCB3aGVyZSBlYWNoIGtleS92YWx1ZSBkZXNjcmliZXMgcHJvdG9jb2wvcnVsZTpcbiAqXG4gKiAtIF9fa2V5X18gLSBsaW5rIHByZWZpeCAodXN1YWxseSwgcHJvdG9jb2wgbmFtZSB3aXRoIGA6YCBhdCB0aGUgZW5kLCBgc2t5cGU6YFxuICogICBmb3IgZXhhbXBsZSkuIGBsaW5raWZ5LWl0YCBtYWtlcyBzaHVyZSB0aGF0IHByZWZpeCBpcyBub3QgcHJlY2VlZGVkIHdpdGhcbiAqICAgYWxwaGFudW1lcmljIGNoYXIgYW5kIHN5bWJvbHMuIE9ubHkgd2hpdGVzcGFjZXMgYW5kIHB1bmN0dWF0aW9uIGFsbG93ZWQuXG4gKiAtIF9fdmFsdWVfXyAtIHJ1bGUgdG8gY2hlY2sgdGFpbCBhZnRlciBsaW5rIHByZWZpeFxuICogICAtIF9TdHJpbmdfIC0ganVzdCBhbGlhcyB0byBleGlzdGluZyBydWxlXG4gKiAgIC0gX09iamVjdF9cbiAqICAgICAtIF92YWxpZGF0ZV8gLSB2YWxpZGF0b3IgZnVuY3Rpb24gKHNob3VsZCByZXR1cm4gbWF0Y2hlZCBsZW5ndGggb24gc3VjY2VzcyksXG4gKiAgICAgICBvciBgUmVnRXhwYC5cbiAqICAgICAtIF9ub3JtYWxpemVfIC0gb3B0aW9uYWwgZnVuY3Rpb24gdG8gbm9ybWFsaXplIHRleHQgJiB1cmwgb2YgbWF0Y2hlZCByZXN1bHRcbiAqICAgICAgIChmb3IgZXhhbXBsZSwgZm9yIEB0d2l0dGVyIG1lbnRpb25zKS5cbiAqXG4gKiBgb3B0aW9uc2A6XG4gKlxuICogLSBfX2Z1enp5TGlua19fIC0gcmVjb2duaWdlIFVSTC1zIHdpdGhvdXQgYGh0dHAocyk6YCBwcmVmaXguIERlZmF1bHQgYHRydWVgLlxuICogLSBfX2Z1enp5SVBfXyAtIGFsbG93IElQcyBpbiBmdXp6eSBsaW5rcyBhYm92ZS4gQ2FuIGNvbmZsaWN0IHdpdGggc29tZSB0ZXh0c1xuICogICBsaWtlIHZlcnNpb24gbnVtYmVycy4gRGVmYXVsdCBgZmFsc2VgLlxuICogLSBfX2Z1enp5RW1haWxfXyAtIHJlY29nbml6ZSBlbWFpbHMgd2l0aG91dCBgbWFpbHRvOmAgcHJlZml4LlxuICpcbiAqKi9cbmZ1bmN0aW9uIExpbmtpZnlJdCAoc2NoZW1hcywgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGlua2lmeUl0KSkge1xuICAgIHJldHVybiBuZXcgTGlua2lmeUl0KHNjaGVtYXMsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBpZiAoaXNPcHRpb25zT2JqKHNjaGVtYXMpKSB7XG4gICAgICBvcHRpb25zID0gc2NoZW1hc1xuICAgICAgc2NoZW1hcyA9IHt9XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fX29wdHNfXyA9IGFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpXG5cbiAgLy8gQ2FjaGUgbGFzdCB0ZXN0ZWQgcmVzdWx0LiBVc2VkIHRvIHNraXAgcmVwZWF0aW5nIHN0ZXBzIG9uIG5leHQgYG1hdGNoYCBjYWxsLlxuICB0aGlzLl9faW5kZXhfXyA9IC0xXG4gIHRoaXMuX19sYXN0X2luZGV4X18gPSAtMSAvLyBOZXh0IHNjYW4gcG9zaXRpb25cbiAgdGhpcy5fX3NjaGVtYV9fID0gJydcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9ICcnXG5cbiAgdGhpcy5fX3NjaGVtYXNfXyA9IGFzc2lnbih7fSwgZGVmYXVsdFNjaGVtYXMsIHNjaGVtYXMpXG4gIHRoaXMuX19jb21waWxlZF9fID0ge31cblxuICB0aGlzLl9fdGxkc19fID0gdGxkc19kZWZhdWx0XG4gIHRoaXMuX190bGRzX3JlcGxhY2VkX18gPSBmYWxzZVxuXG4gIHRoaXMucmUgPSB7fVxuXG4gIGNvbXBpbGUodGhpcylcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I2FkZChzY2hlbWEsIGRlZmluaXRpb24pXG4gKiAtIHNjaGVtYSAoU3RyaW5nKTogcnVsZSBuYW1lIChmaXhlZCBwYXR0ZXJuIHByZWZpeClcbiAqIC0gZGVmaW5pdGlvbiAoU3RyaW5nfFJlZ0V4cHxPYmplY3QpOiBzY2hlbWEgZGVmaW5pdGlvblxuICpcbiAqIEFkZCBuZXcgcnVsZSBkZWZpbml0aW9uLiBTZWUgY29uc3RydWN0b3IgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAoc2NoZW1hLCBkZWZpbml0aW9uKSB7XG4gIHRoaXMuX19zY2hlbWFzX19bc2NoZW1hXSA9IGRlZmluaXRpb25cbiAgY29tcGlsZSh0aGlzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBMaW5raWZ5SXQjc2V0KG9wdGlvbnMpXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHsgZnV6enlMaW5rfGZ1enp5RW1haWx8ZnV6enlJUDogdHJ1ZXxmYWxzZSB9XG4gKlxuICogU2V0IHJlY29nbml0aW9uIG9wdGlvbnMgZm9yIGxpbmtzIHdpdGhvdXQgc2NoZW1hLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKG9wdGlvbnMpIHtcbiAgdGhpcy5fX29wdHNfXyA9IGFzc2lnbih0aGlzLl9fb3B0c19fLCBvcHRpb25zKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqIExpbmtpZnlJdCN0ZXN0KHRleHQpIC0+IEJvb2xlYW5cbiAqXG4gKiBTZWFyY2hlcyBsaW5raWZpYWJsZSBwYXR0ZXJuIGFuZCByZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzIG9yIGBmYWxzZWAgb24gZmFpbC5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uIHRlc3QgKHRleHQpIHtcbiAgLy8gUmVzZXQgc2NhbiBjYWNoZVxuICB0aGlzLl9fdGV4dF9jYWNoZV9fID0gdGV4dFxuICB0aGlzLl9faW5kZXhfXyA9IC0xXG5cbiAgaWYgKCF0ZXh0Lmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBtLCBtbCwgbWUsIGxlbiwgc2hpZnQsIG5leHQsIHJlLCB0bGRfcG9zLCBhdF9wb3NcblxuICAvLyB0cnkgdG8gc2NhbiBmb3IgbGluayB3aXRoIHNjaGVtYSAtIHRoYXQncyB0aGUgbW9zdCBzaW1wbGUgcnVsZVxuICBpZiAodGhpcy5yZS5zY2hlbWFfdGVzdC50ZXN0KHRleHQpKSB7XG4gICAgcmUgPSB0aGlzLnJlLnNjaGVtYV9zZWFyY2hcbiAgICByZS5sYXN0SW5kZXggPSAwXG4gICAgd2hpbGUgKChtID0gcmUuZXhlYyh0ZXh0KSkgIT09IG51bGwpIHtcbiAgICAgIGxlbiA9IHRoaXMudGVzdFNjaGVtYUF0KHRleHQsIG1bMl0sIHJlLmxhc3RJbmRleClcbiAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gbVsyXVxuICAgICAgICB0aGlzLl9faW5kZXhfXyA9IG0uaW5kZXggKyBtWzFdLmxlbmd0aFxuICAgICAgICB0aGlzLl9fbGFzdF9pbmRleF9fID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoICsgbGVuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuX19vcHRzX18uZnV6enlMaW5rICYmIHRoaXMuX19jb21waWxlZF9fWydodHRwOiddKSB7XG4gICAgLy8gZ3Vlc3Mgc2NoZW1hbGVzcyBsaW5rc1xuICAgIHRsZF9wb3MgPSB0ZXh0LnNlYXJjaCh0aGlzLnJlLmhvc3RfZnV6enlfdGVzdClcbiAgICBpZiAodGxkX3BvcyA+PSAwKSB7XG4gICAgICAvLyBpZiB0bGQgaXMgbG9jYXRlZCBhZnRlciBmb3VuZCBsaW5rIC0gbm8gbmVlZCB0byBjaGVjayBmdXp6eSBwYXR0ZXJuXG4gICAgICBpZiAodGhpcy5fX2luZGV4X18gPCAwIHx8IHRsZF9wb3MgPCB0aGlzLl9faW5kZXhfXykge1xuICAgICAgICBpZiAoKG1sID0gdGV4dC5tYXRjaCh0aGlzLl9fb3B0c19fLmZ1enp5SVAgPyB0aGlzLnJlLmxpbmtfZnV6enkgOiB0aGlzLnJlLmxpbmtfbm9faXBfZnV6enkpKSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNoaWZ0ID0gbWwuaW5kZXggKyBtbFsxXS5sZW5ndGhcblxuICAgICAgICAgIGlmICh0aGlzLl9faW5kZXhfXyA8IDAgfHwgc2hpZnQgPCB0aGlzLl9faW5kZXhfXykge1xuICAgICAgICAgICAgdGhpcy5fX3NjaGVtYV9fID0gJydcbiAgICAgICAgICAgIHRoaXMuX19pbmRleF9fID0gc2hpZnRcbiAgICAgICAgICAgIHRoaXMuX19sYXN0X2luZGV4X18gPSBtbC5pbmRleCArIG1sWzBdLmxlbmd0aFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl9fb3B0c19fLmZ1enp5RW1haWwgJiYgdGhpcy5fX2NvbXBpbGVkX19bJ21haWx0bzonXSkge1xuICAgIC8vIGd1ZXNzIHNjaGVtYWxlc3MgZW1haWxzXG4gICAgYXRfcG9zID0gdGV4dC5pbmRleE9mKCdAJylcbiAgICBpZiAoYXRfcG9zID49IDApIHtcbiAgICAgIC8vIFdlIGNhbid0IHNraXAgdGhpcyBjaGVjaywgYmVjYXVzZSB0aGlzIGNhc2VzIGFyZSBwb3NzaWJsZTpcbiAgICAgIC8vIDE5Mi4xNjguMS4xQGdtYWlsLmNvbSwgbXkuaW5AZXhhbXBsZS5jb21cbiAgICAgIGlmICgobWUgPSB0ZXh0Lm1hdGNoKHRoaXMucmUuZW1haWxfZnV6enkpKSAhPT0gbnVsbCkge1xuICAgICAgICBzaGlmdCA9IG1lLmluZGV4ICsgbWVbMV0ubGVuZ3RoXG4gICAgICAgIG5leHQgPSBtZS5pbmRleCArIG1lWzBdLmxlbmd0aFxuXG4gICAgICAgIGlmICh0aGlzLl9faW5kZXhfXyA8IDAgfHwgc2hpZnQgPCB0aGlzLl9faW5kZXhfXyB8fFxuICAgICAgICAgICAgKHNoaWZ0ID09PSB0aGlzLl9faW5kZXhfXyAmJiBuZXh0ID4gdGhpcy5fX2xhc3RfaW5kZXhfXykpIHtcbiAgICAgICAgICB0aGlzLl9fc2NoZW1hX18gPSAnbWFpbHRvOidcbiAgICAgICAgICB0aGlzLl9faW5kZXhfXyA9IHNoaWZ0XG4gICAgICAgICAgdGhpcy5fX2xhc3RfaW5kZXhfXyA9IG5leHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzLl9faW5kZXhfXyA+PSAwXG59XG5cbi8qKlxuICogTGlua2lmeUl0I3ByZXRlc3QodGV4dCkgLT4gQm9vbGVhblxuICpcbiAqIFZlcnkgcXVpY2sgY2hlY2ssIHRoYXQgY2FuIGdpdmUgZmFsc2UgcG9zaXRpdmVzLiBSZXR1cm5zIHRydWUgaWYgbGluayBNQVkgQkVcbiAqIGNhbiBleGlzdHMuIENhbiBiZSB1c2VkIGZvciBzcGVlZCBvcHRpbWl6YXRpb24sIHdoZW4geW91IG5lZWQgdG8gY2hlY2sgdGhhdFxuICogbGluayBOT1QgZXhpc3RzLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS5wcmV0ZXN0ID0gZnVuY3Rpb24gcHJldGVzdCAodGV4dCkge1xuICByZXR1cm4gdGhpcy5yZS5wcmV0ZXN0LnRlc3QodGV4dClcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjdGVzdFNjaGVtYUF0KHRleHQsIG5hbWUsIHBvc2l0aW9uKSAtPiBOdW1iZXJcbiAqIC0gdGV4dCAoU3RyaW5nKTogdGV4dCB0byBzY2FuXG4gKiAtIG5hbWUgKFN0cmluZyk6IHJ1bGUgKHNjaGVtYSkgbmFtZVxuICogLSBwb3NpdGlvbiAoTnVtYmVyKTogdGV4dCBvZmZzZXQgdG8gY2hlY2sgZnJvbVxuICpcbiAqIFNpbWlsYXIgdG8gW1tMaW5raWZ5SXQjdGVzdF1dIGJ1dCBjaGVja3Mgb25seSBzcGVjaWZpYyBwcm90b2NvbCB0YWlsIGV4YWN0bHlcbiAqIGF0IGdpdmVuIHBvc2l0aW9uLiBSZXR1cm5zIGxlbmd0aCBvZiBmb3VuZCBwYXR0ZXJuICgwIG9uIGZhaWwpLlxuICoqL1xuTGlua2lmeUl0LnByb3RvdHlwZS50ZXN0U2NoZW1hQXQgPSBmdW5jdGlvbiB0ZXN0U2NoZW1hQXQgKHRleHQsIHNjaGVtYSwgcG9zKSB7XG4gIC8vIElmIG5vdCBzdXBwb3J0ZWQgc2NoZW1hIGNoZWNrIHJlcXVlc3RlZCAtIHRlcm1pbmF0ZVxuICBpZiAoIXRoaXMuX19jb21waWxlZF9fW3NjaGVtYS50b0xvd2VyQ2FzZSgpXSkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgcmV0dXJuIHRoaXMuX19jb21waWxlZF9fW3NjaGVtYS50b0xvd2VyQ2FzZSgpXS52YWxpZGF0ZSh0ZXh0LCBwb3MsIHRoaXMpXG59XG5cbi8qKlxuICogTGlua2lmeUl0I21hdGNoKHRleHQpIC0+IEFycmF5fG51bGxcbiAqXG4gKiBSZXR1cm5zIGFycmF5IG9mIGZvdW5kIGxpbmsgZGVzY3JpcHRpb25zIG9yIGBudWxsYCBvbiBmYWlsLiBXZSBzdHJvbmdseVxuICogcmVjb21tZW5kIHRvIHVzZSBbW0xpbmtpZnlJdCN0ZXN0XV0gZmlyc3QsIGZvciBiZXN0IHNwZWVkLlxuICpcbiAqICMjIyMjIFJlc3VsdCBtYXRjaCBkZXNjcmlwdGlvblxuICpcbiAqIC0gX19zY2hlbWFfXyAtIGxpbmsgc2NoZW1hLCBjYW4gYmUgZW1wdHkgZm9yIGZ1enp5IGxpbmtzLCBvciBgLy9gIGZvclxuICogICBwcm90b2NvbC1uZXV0cmFsICBsaW5rcy5cbiAqIC0gX19pbmRleF9fIC0gb2Zmc2V0IG9mIG1hdGNoZWQgdGV4dFxuICogLSBfX2xhc3RJbmRleF9fIC0gaW5kZXggb2YgbmV4dCBjaGFyIGFmdGVyIG1hdGhjaCBlbmRcbiAqIC0gX19yYXdfXyAtIG1hdGNoZWQgdGV4dFxuICogLSBfX3RleHRfXyAtIG5vcm1hbGl6ZWQgdGV4dFxuICogLSBfX3VybF9fIC0gbGluaywgZ2VuZXJhdGVkIGZyb20gbWF0Y2hlZCB0ZXh0XG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2ggKHRleHQpIHtcbiAgY29uc3QgcmVzdWx0ID0gW11cbiAgbGV0IHNoaWZ0ID0gMFxuXG4gIC8vIFRyeSB0byB0YWtlIHByZXZpb3VzIGVsZW1lbnQgZnJvbSBjYWNoZSwgaWYgLnRlc3QoKSBjYWxsZWQgYmVmb3JlXG4gIGlmICh0aGlzLl9faW5kZXhfXyA+PSAwICYmIHRoaXMuX190ZXh0X2NhY2hlX18gPT09IHRleHQpIHtcbiAgICByZXN1bHQucHVzaChjcmVhdGVNYXRjaCh0aGlzLCBzaGlmdCkpXG4gICAgc2hpZnQgPSB0aGlzLl9fbGFzdF9pbmRleF9fXG4gIH1cblxuICAvLyBDdXQgaGVhZCBpZiBjYWNoZSB3YXMgdXNlZFxuICBsZXQgdGFpbCA9IHNoaWZ0ID8gdGV4dC5zbGljZShzaGlmdCkgOiB0ZXh0XG5cbiAgLy8gU2NhbiBzdHJpbmcgdW50aWwgZW5kIHJlYWNoZWRcbiAgd2hpbGUgKHRoaXMudGVzdCh0YWlsKSkge1xuICAgIHJlc3VsdC5wdXNoKGNyZWF0ZU1hdGNoKHRoaXMsIHNoaWZ0KSlcblxuICAgIHRhaWwgPSB0YWlsLnNsaWNlKHRoaXMuX19sYXN0X2luZGV4X18pXG4gICAgc2hpZnQgKz0gdGhpcy5fX2xhc3RfaW5kZXhfX1xuICB9XG5cbiAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIExpbmtpZnlJdCNtYXRjaEF0U3RhcnQodGV4dCkgLT4gTWF0Y2h8bnVsbFxuICpcbiAqIFJldHVybnMgZnVsbHktZm9ybWVkIChub3QgZnV6enkpIGxpbmsgaWYgaXQgc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmdcbiAqIG9mIHRoZSBzdHJpbmcsIGFuZCBudWxsIG90aGVyd2lzZS5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUubWF0Y2hBdFN0YXJ0ID0gZnVuY3Rpb24gbWF0Y2hBdFN0YXJ0ICh0ZXh0KSB7XG4gIC8vIFJlc2V0IHNjYW4gY2FjaGVcbiAgdGhpcy5fX3RleHRfY2FjaGVfXyA9IHRleHRcbiAgdGhpcy5fX2luZGV4X18gPSAtMVxuXG4gIGlmICghdGV4dC5sZW5ndGgpIHJldHVybiBudWxsXG5cbiAgY29uc3QgbSA9IHRoaXMucmUuc2NoZW1hX2F0X3N0YXJ0LmV4ZWModGV4dClcbiAgaWYgKCFtKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGxlbiA9IHRoaXMudGVzdFNjaGVtYUF0KHRleHQsIG1bMl0sIG1bMF0ubGVuZ3RoKVxuICBpZiAoIWxlbikgcmV0dXJuIG51bGxcblxuICB0aGlzLl9fc2NoZW1hX18gPSBtWzJdXG4gIHRoaXMuX19pbmRleF9fID0gbS5pbmRleCArIG1bMV0ubGVuZ3RoXG4gIHRoaXMuX19sYXN0X2luZGV4X18gPSBtLmluZGV4ICsgbVswXS5sZW5ndGggKyBsZW5cblxuICByZXR1cm4gY3JlYXRlTWF0Y2godGhpcywgMClcbn1cblxuLyoqIGNoYWluYWJsZVxuICogTGlua2lmeUl0I3RsZHMobGlzdCBbLCBrZWVwT2xkXSkgLT4gdGhpc1xuICogLSBsaXN0IChBcnJheSk6IGxpc3Qgb2YgdGxkc1xuICogLSBrZWVwT2xkIChCb29sZWFuKTogbWVyZ2Ugd2l0aCBjdXJyZW50IGxpc3QgaWYgYHRydWVgIChgZmFsc2VgIGJ5IGRlZmF1bHQpXG4gKlxuICogTG9hZCAob3IgbWVyZ2UpIG5ldyB0bGRzIGxpc3QuIFRob3NlIGFyZSB1c2VyIGZvciBmdXp6eSBsaW5rcyAod2l0aG91dCBwcmVmaXgpXG4gKiB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMuIEJ5IGRlZmF1bHQgdGhpcyBhbGdvcnl0aG0gdXNlZDpcbiAqXG4gKiAtIGhvc3RuYW1lIHdpdGggYW55IDItbGV0dGVyIHJvb3Qgem9uZXMgYXJlIG9rLlxuICogLSBiaXp8Y29tfGVkdXxnb3Z8bmV0fG9yZ3xwcm98d2VifHh4eHxhZXJvfGFzaWF8Y29vcHxpbmZvfG11c2V1bXxuYW1lfHNob3B80YDRhFxuICogICBhcmUgb2suXG4gKiAtIGVuY29kZWQgKGB4bi0tLi4uYCkgcm9vdCB6b25lcyBhcmUgb2suXG4gKlxuICogSWYgbGlzdCBpcyByZXBsYWNlZCwgdGhlbiBleGFjdCBtYXRjaCBmb3IgMi1jaGFycyByb290IHpvbmVzIHdpbGwgYmUgY2hlY2tlZC5cbiAqKi9cbkxpbmtpZnlJdC5wcm90b3R5cGUudGxkcyA9IGZ1bmN0aW9uIHRsZHMgKGxpc3QsIGtlZXBPbGQpIHtcbiAgbGlzdCA9IEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW2xpc3RdXG5cbiAgaWYgKCFrZWVwT2xkKSB7XG4gICAgdGhpcy5fX3RsZHNfXyA9IGxpc3Quc2xpY2UoKVxuICAgIHRoaXMuX190bGRzX3JlcGxhY2VkX18gPSB0cnVlXG4gICAgY29tcGlsZSh0aGlzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0aGlzLl9fdGxkc19fID0gdGhpcy5fX3RsZHNfXy5jb25jYXQobGlzdClcbiAgICAuc29ydCgpXG4gICAgLmZpbHRlcihmdW5jdGlvbiAoZWwsIGlkeCwgYXJyKSB7XG4gICAgICByZXR1cm4gZWwgIT09IGFycltpZHggLSAxXVxuICAgIH0pXG4gICAgLnJldmVyc2UoKVxuXG4gIGNvbXBpbGUodGhpcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjbm9ybWFsaXplKG1hdGNoKVxuICpcbiAqIERlZmF1bHQgbm9ybWFsaXplciAoaWYgc2NoZW1hIGRvZXMgbm90IGRlZmluZSBpdCdzIG93bikuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIG5vcm1hbGl6ZSAobWF0Y2gpIHtcbiAgLy8gRG8gbWluaW1hbCBwb3NzaWJsZSBjaGFuZ2VzIGJ5IGRlZmF1bHQuIE5lZWQgdG8gY29sbGVjdCBmZWVkYmFjayBwcmlvclxuICAvLyB0byBtb3ZlIGZvcndhcmQgaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L2xpbmtpZnktaXQvaXNzdWVzLzFcblxuICBpZiAoIW1hdGNoLnNjaGVtYSkgeyBtYXRjaC51cmwgPSAnaHR0cDovLycgKyBtYXRjaC51cmwgfVxuXG4gIGlmIChtYXRjaC5zY2hlbWEgPT09ICdtYWlsdG86JyAmJiAhL15tYWlsdG86L2kudGVzdChtYXRjaC51cmwpKSB7XG4gICAgbWF0Y2gudXJsID0gJ21haWx0bzonICsgbWF0Y2gudXJsXG4gIH1cbn1cblxuLyoqXG4gKiBMaW5raWZ5SXQjb25Db21waWxlKClcbiAqXG4gKiBPdmVycmlkZSB0byBtb2RpZnkgYmFzaWMgUmVnRXhwLXMuXG4gKiovXG5MaW5raWZ5SXQucHJvdG90eXBlLm9uQ29tcGlsZSA9IGZ1bmN0aW9uIG9uQ29tcGlsZSAoKSB7XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpbmtpZnlJdFxuIiwiaW1wb3J0IHsgQW55LCBDYywgWiwgUCB9IGZyb20gJ3VjLm1pY3JvJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3B0cykge1xuICBjb25zdCByZSA9IHt9XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG5cbiAgcmUuc3JjX0FueSA9IEFueS5zb3VyY2VcbiAgcmUuc3JjX0NjID0gQ2Muc291cmNlXG4gIHJlLnNyY19aID0gWi5zb3VyY2VcbiAgcmUuc3JjX1AgPSBQLnNvdXJjZVxuXG4gIC8vIFxccHtcXFpcXFBcXENjXFxDRn0gKHdoaXRlIHNwYWNlcyArIGNvbnRyb2wgKyBmb3JtYXQgKyBwdW5jdHVhdGlvbilcbiAgcmUuc3JjX1pQQ2MgPSBbcmUuc3JjX1osIHJlLnNyY19QLCByZS5zcmNfQ2NdLmpvaW4oJ3wnKVxuXG4gIC8vIFxccHtcXFpcXENjfSAod2hpdGUgc3BhY2VzICsgY29udHJvbClcbiAgcmUuc3JjX1pDYyA9IFtyZS5zcmNfWiwgcmUuc3JjX0NjXS5qb2luKCd8JylcblxuICAvLyBFeHBlcmltZW50YWwuIExpc3Qgb2YgY2hhcnMsIGNvbXBsZXRlbHkgcHJvaGliaXRlZCBpbiBsaW5rc1xuICAvLyBiZWNhdXNlIGNhbiBzZXBhcmF0ZSBpdCBmcm9tIG90aGVyIHBhcnQgb2YgdGV4dFxuICBjb25zdCB0ZXh0X3NlcGFyYXRvcnMgPSAnWz48XFx1ZmY1Y10nXG5cbiAgLy8gQWxsIHBvc3NpYmxlIHdvcmQgY2hhcmFjdGVycyAoZXZlcnl0aGluZyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzcGFjZXMgJiBjb250cm9scylcbiAgLy8gRGVmaW5lZCB2aWEgcHVuY3R1YXRpb24gJiBzcGFjZXMgdG8gc2F2ZSBzcGFjZVxuICAvLyBTaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgXFxwe1xcTFxcTlxcU1xcTX0gKFxcdyBidXQgd2l0aG91dCBgX2ApXG4gIHJlLnNyY19wc2V1ZG9fbGV0dGVyID0gJyg/Oig/IScgKyB0ZXh0X3NlcGFyYXRvcnMgKyAnfCcgKyByZS5zcmNfWlBDYyArICcpJyArIHJlLnNyY19BbnkgKyAnKSdcbiAgLy8gVGhlIHNhbWUgYXMgYWJvdGhlIGJ1dCB3aXRob3V0IFswLTldXG4gIC8vIHZhciBzcmNfcHNldWRvX2xldHRlcl9ub25fZCA9ICcoPzooPyFbMC05XXwnICsgc3JjX1pQQ2MgKyAnKScgKyBzcmNfQW55ICsgJyknO1xuXG4gIHJlLnNyY19pcDQgPVxuXG4gICAgJyg/OigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFxcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPyknXG5cbiAgLy8gUHJvaGliaXQgYW55IG9mIFwiQC9bXSgpXCIgaW4gdXNlci9wYXNzIHRvIGF2b2lkIHdyb25nIGRvbWFpbiBmZXRjaC5cbiAgcmUuc3JjX2F1dGggPSAnKD86KD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFtAL1xcXFxbXFxcXF0oKV0pLikrQCk/J1xuXG4gIHJlLnNyY19wb3J0ID1cblxuICAgICcoPzo6KD86Nig/OlswLTRdXFxcXGR7M318NSg/OlswLTRdXFxcXGR7Mn18NSg/OlswLTJdXFxcXGR8M1swLTVdKSkpfFsxLTVdP1xcXFxkezEsNH0pKT8nXG5cbiAgcmUuc3JjX2hvc3RfdGVybWluYXRvciA9XG5cbiAgICAnKD89JHwnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3wnICsgcmUuc3JjX1pQQ2MgKyAnKScgK1xuICAgICcoPyEnICsgKG9wdHNbJy0tLSddID8gJy0oPyEtLSl8JyA6ICctfCcpICsgJ198OlxcXFxkfFxcXFwuLXxcXFxcLig/ISR8JyArIHJlLnNyY19aUENjICsgJykpJ1xuXG4gIHJlLnNyY19wYXRoID1cblxuICAgICcoPzonICtcbiAgICAgICdbLz8jXScgK1xuICAgICAgICAnKD86JyArXG4gICAgICAgICAgJyg/IScgKyByZS5zcmNfWkNjICsgJ3wnICsgdGV4dF9zZXBhcmF0b3JzICsgJ3xbKClbXFxcXF17fS4sXCJcXCc/IVxcXFwtO10pLnwnICtcbiAgICAgICAgICAnXFxcXFsoPzooPyEnICsgcmUuc3JjX1pDYyArICd8XFxcXF0pLikqXFxcXF18JyArXG4gICAgICAgICAgJ1xcXFwoKD86KD8hJyArIHJlLnNyY19aQ2MgKyAnfFspXSkuKSpcXFxcKXwnICtcbiAgICAgICAgICAnXFxcXHsoPzooPyEnICsgcmUuc3JjX1pDYyArICd8W31dKS4pKlxcXFx9fCcgK1xuICAgICAgICAgICdcXFxcXCIoPzooPyEnICsgcmUuc3JjX1pDYyArICd8W1wiXSkuKStcXFxcXCJ8JyArXG4gICAgICAgICAgXCJcXFxcJyg/Oig/IVwiICsgcmUuc3JjX1pDYyArIFwifFsnXSkuKStcXFxcJ3xcIiArXG5cbiAgICAgICAgICAvLyBhbGxvdyBgSSdtX2tpbmdgIGlmIG5vIHBhaXIgZm91bmRcbiAgICAgICAgICBcIlxcXFwnKD89XCIgKyByZS5zcmNfcHNldWRvX2xldHRlciArICd8Wy1dKXwnICtcblxuICAgICAgICAgIC8vIGdvb2dsZSBoYXMgbWFueSBkb3RzIGluIFwiZ29vZ2xlIHNlYXJjaFwiIGxpbmtzICgjNjYsICM4MSkuXG4gICAgICAgICAgLy8gZ2l0aHViIGhhcyAuLi4gaW4gY29tbWl0IHJhbmdlIGxpbmtzLFxuICAgICAgICAgIC8vIFJlc3RyaWN0IHRvXG4gICAgICAgICAgLy8gLSBlbmdsaXNoXG4gICAgICAgICAgLy8gLSBwZXJjZW50LWVuY29kZWRcbiAgICAgICAgICAvLyAtIHBhcnRzIG9mIGZpbGUgcGF0aFxuICAgICAgICAgIC8vIC0gcGFyYW1zIHNlcGFyYXRvclxuICAgICAgICAgIC8vIHVudGlsIG1vcmUgZXhhbXBsZXMgZm91bmQuXG4gICAgICAgICAgJ1xcXFwuezIsfVthLXpBLVowLTklLyZdfCcgK1xuXG4gICAgICAgICAgJ1xcXFwuKD8hJyArIHJlLnNyY19aQ2MgKyAnfFsuXXwkKXwnICtcbiAgICAgICAgICAob3B0c1snLS0tJ11cbiAgICAgICAgICAgID8gJ1xcXFwtKD8hLS0oPzpbXi1dfCQpKSg/Oi0qKXwnIC8vIGAtLS1gID0+IGxvbmcgZGFzaCwgdGVybWluYXRlXG4gICAgICAgICAgICA6ICdcXFxcLSt8J1xuICAgICAgICAgICkgK1xuICAgICAgICAgIC8vIGFsbG93IGAsLCxgIGluIHBhdGhzXG4gICAgICAgICAgJywoPyEnICsgcmUuc3JjX1pDYyArICd8JCl8JyArXG5cbiAgICAgICAgICAvLyBhbGxvdyBgO2AgaWYgbm90IGZvbGxvd2VkIGJ5IHNwYWNlLWxpa2UgY2hhclxuICAgICAgICAgICc7KD8hJyArIHJlLnNyY19aQ2MgKyAnfCQpfCcgK1xuXG4gICAgICAgICAgLy8gYWxsb3cgYCEhIWAgaW4gcGF0aHMsIGJ1dCBub3QgYXQgdGhlIGVuZFxuICAgICAgICAgICdcXFxcISsoPyEnICsgcmUuc3JjX1pDYyArICd8WyFdfCQpfCcgK1xuXG4gICAgICAgICAgJ1xcXFw/KD8hJyArIHJlLnNyY19aQ2MgKyAnfFs/XXwkKScgK1xuICAgICAgICAnKSsnICtcbiAgICAgICd8XFxcXC8nICtcbiAgICAnKT8nXG5cbiAgLy8gQWxsb3cgYW55dGhpbmcgaW4gbWFya2Rvd24gc3BlYywgZm9yYmlkIHF1b3RlIChcIikgYXQgdGhlIGZpcnN0IHBvc2l0aW9uXG4gIC8vIGJlY2F1c2UgZW1haWxzIGVuY2xvc2VkIGluIHF1b3RlcyBhcmUgZmFyIG1vcmUgY29tbW9uXG4gIHJlLnNyY19lbWFpbF9uYW1lID1cblxuICAgICdbXFxcXC07OiY9XFxcXCtcXFxcJCxcXFxcLmEtekEtWjAtOV9dW1xcXFwtOzomPVxcXFwrXFxcXCQsXFxcXFwiXFxcXC5hLXpBLVowLTlfXSonXG5cbiAgcmUuc3JjX3huID1cblxuICAgICd4bi0tW2EtejAtOVxcXFwtXXsxLDU5fSdcblxuICAvLyBNb3JlIHRvIHJlYWQgYWJvdXQgZG9tYWluIG5hbWVzXG4gIC8vIGh0dHA6Ly9zZXJ2ZXJmYXVsdC5jb20vcXVlc3Rpb25zLzYzODI2MC9cblxuICByZS5zcmNfZG9tYWluX3Jvb3QgPVxuXG4gICAgLy8gQWxsb3cgbGV0dGVycyAmIGRpZ2l0cyAoaHR0cDovL3Rlc3QxKVxuICAgICcoPzonICtcbiAgICAgIHJlLnNyY194biArXG4gICAgICAnfCcgK1xuICAgICAgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnezEsNjN9JyArXG4gICAgJyknXG5cbiAgcmUuc3JjX2RvbWFpbiA9XG5cbiAgICAnKD86JyArXG4gICAgICByZS5zcmNfeG4gK1xuICAgICAgJ3wnICtcbiAgICAgICcoPzonICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKScgK1xuICAgICAgJ3wnICtcbiAgICAgICcoPzonICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKD86LXwnICsgcmUuc3JjX3BzZXVkb19sZXR0ZXIgKyAnKXswLDYxfScgKyByZS5zcmNfcHNldWRvX2xldHRlciArICcpJyArXG4gICAgJyknXG5cbiAgcmUuc3JjX2hvc3QgPVxuXG4gICAgJyg/OicgK1xuICAgIC8vIERvbid0IG5lZWQgSVAgY2hlY2ssIGJlY2F1c2UgZGlnaXRzIGFyZSBhbHJlYWR5IGFsbG93ZWQgaW4gbm9ybWFsIGRvbWFpbiBuYW1lc1xuICAgIC8vICAgc3JjX2lwNCArXG4gICAgLy8gJ3wnICtcbiAgICAgICcoPzooPzooPzonICsgcmUuc3JjX2RvbWFpbiArICcpXFxcXC4pKicgKyByZS5zcmNfZG9tYWluLyogX3Jvb3QgKi8gKyAnKScgK1xuICAgICcpJ1xuXG4gIHJlLnRwbF9ob3N0X2Z1enp5ID1cblxuICAgICcoPzonICtcbiAgICAgIHJlLnNyY19pcDQgK1xuICAgICd8JyArXG4gICAgICAnKD86KD86KD86JyArIHJlLnNyY19kb21haW4gKyAnKVxcXFwuKSsoPzolVExEUyUpKScgK1xuICAgICcpJ1xuXG4gIHJlLnRwbF9ob3N0X25vX2lwX2Z1enp5ID1cblxuICAgICcoPzooPzooPzonICsgcmUuc3JjX2RvbWFpbiArICcpXFxcXC4pKyg/OiVUTERTJSkpJ1xuXG4gIHJlLnNyY19ob3N0X3N0cmljdCA9XG5cbiAgICByZS5zcmNfaG9zdCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9mdXp6eV9zdHJpY3QgPVxuXG4gICAgcmUudHBsX2hvc3RfZnV6enkgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgcmUuc3JjX2hvc3RfcG9ydF9zdHJpY3QgPVxuXG4gICAgcmUuc3JjX2hvc3QgKyByZS5zcmNfcG9ydCArIHJlLnNyY19ob3N0X3Rlcm1pbmF0b3JcblxuICByZS50cGxfaG9zdF9wb3J0X2Z1enp5X3N0cmljdCA9XG5cbiAgICByZS50cGxfaG9zdF9mdXp6eSArIHJlLnNyY19wb3J0ICsgcmUuc3JjX2hvc3RfdGVybWluYXRvclxuXG4gIHJlLnRwbF9ob3N0X3BvcnRfbm9faXBfZnV6enlfc3RyaWN0ID1cblxuICAgIHJlLnRwbF9ob3N0X25vX2lwX2Z1enp5ICsgcmUuc3JjX3BvcnQgKyByZS5zcmNfaG9zdF90ZXJtaW5hdG9yXG5cbiAgLy9cbiAgLy8gTWFpbiBydWxlc1xuICAvL1xuXG4gIC8vIFJ1ZGUgdGVzdCBmdXp6eSBsaW5rcyBieSBob3N0LCBmb3IgcXVpY2sgZGVueVxuICByZS50cGxfaG9zdF9mdXp6eV90ZXN0ID1cblxuICAgICdsb2NhbGhvc3R8d3d3XFxcXC58XFxcXC5cXFxcZHsxLDN9XFxcXC58KD86XFxcXC4oPzolVExEUyUpKD86JyArIHJlLnNyY19aUENjICsgJ3w+fCQpKSdcblxuICByZS50cGxfZW1haWxfZnV6enkgPVxuXG4gICAgICAnKF58JyArIHRleHRfc2VwYXJhdG9ycyArICd8XCJ8XFxcXCh8JyArIHJlLnNyY19aQ2MgKyAnKScgK1xuICAgICAgJygnICsgcmUuc3JjX2VtYWlsX25hbWUgKyAnQCcgKyByZS50cGxfaG9zdF9mdXp6eV9zdHJpY3QgKyAnKSdcblxuICByZS50cGxfbGlua19mdXp6eSA9XG4gICAgICAvLyBGdXp6eSBsaW5rIGNhbid0IGJlIHByZXBlbmRlZCB3aXRoIC46L1xcLSBhbmQgbm9uIHB1bmN0dWF0aW9uLlxuICAgICAgLy8gYnV0IGNhbiBzdGFydCB3aXRoID4gKG1hcmtkb3duIGJsb2NrcXVvdGUpXG4gICAgICAnKF58KD8hWy46L1xcXFwtX0BdKSg/OlskKzw9Pl5gfFxcdWZmNWNdfCcgKyByZS5zcmNfWlBDYyArICcpKScgK1xuICAgICAgJygoPyFbJCs8PT5eYHxcXHVmZjVjXSknICsgcmUudHBsX2hvc3RfcG9ydF9mdXp6eV9zdHJpY3QgKyByZS5zcmNfcGF0aCArICcpJ1xuXG4gIHJlLnRwbF9saW5rX25vX2lwX2Z1enp5ID1cbiAgICAgIC8vIEZ1enp5IGxpbmsgY2FuJ3QgYmUgcHJlcGVuZGVkIHdpdGggLjovXFwtIGFuZCBub24gcHVuY3R1YXRpb24uXG4gICAgICAvLyBidXQgY2FuIHN0YXJ0IHdpdGggPiAobWFya2Rvd24gYmxvY2txdW90ZSlcbiAgICAgICcoXnwoPyFbLjovXFxcXC1fQF0pKD86WyQrPD0+XmB8XFx1ZmY1Y118JyArIHJlLnNyY19aUENjICsgJykpJyArXG4gICAgICAnKCg/IVskKzw9Pl5gfFxcdWZmNWNdKScgKyByZS50cGxfaG9zdF9wb3J0X25vX2lwX2Z1enp5X3N0cmljdCArIHJlLnNyY19wYXRoICsgJyknXG5cbiAgcmV0dXJuIHJlXG59XG4iLCJleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9saWIvaW5kZXgubWpzJ1xuIiwiLy8gTGlzdCBvZiB2YWxpZCBodG1sIGJsb2NrcyBuYW1lcywgYWNjb3JkaW5nIHRvIGNvbW1vbm1hcmsgc3BlY1xuLy8gaHR0cHM6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMzAvI2h0bWwtYmxvY2tzXG5cbmV4cG9ydCBkZWZhdWx0IFtcbiAgJ2FkZHJlc3MnLFxuICAnYXJ0aWNsZScsXG4gICdhc2lkZScsXG4gICdiYXNlJyxcbiAgJ2Jhc2Vmb250JyxcbiAgJ2Jsb2NrcXVvdGUnLFxuICAnYm9keScsXG4gICdjYXB0aW9uJyxcbiAgJ2NlbnRlcicsXG4gICdjb2wnLFxuICAnY29sZ3JvdXAnLFxuICAnZGQnLFxuICAnZGV0YWlscycsXG4gICdkaWFsb2cnLFxuICAnZGlyJyxcbiAgJ2RpdicsXG4gICdkbCcsXG4gICdkdCcsXG4gICdmaWVsZHNldCcsXG4gICdmaWdjYXB0aW9uJyxcbiAgJ2ZpZ3VyZScsXG4gICdmb290ZXInLFxuICAnZm9ybScsXG4gICdmcmFtZScsXG4gICdmcmFtZXNldCcsXG4gICdoMScsXG4gICdoMicsXG4gICdoMycsXG4gICdoNCcsXG4gICdoNScsXG4gICdoNicsXG4gICdoZWFkJyxcbiAgJ2hlYWRlcicsXG4gICdocicsXG4gICdodG1sJyxcbiAgJ2lmcmFtZScsXG4gICdsZWdlbmQnLFxuICAnbGknLFxuICAnbGluaycsXG4gICdtYWluJyxcbiAgJ21lbnUnLFxuICAnbWVudWl0ZW0nLFxuICAnbmF2JyxcbiAgJ25vZnJhbWVzJyxcbiAgJ29sJyxcbiAgJ29wdGdyb3VwJyxcbiAgJ29wdGlvbicsXG4gICdwJyxcbiAgJ3BhcmFtJyxcbiAgJ3NlYXJjaCcsXG4gICdzZWN0aW9uJyxcbiAgJ3N1bW1hcnknLFxuICAndGFibGUnLFxuICAndGJvZHknLFxuICAndGQnLFxuICAndGZvb3QnLFxuICAndGgnLFxuICAndGhlYWQnLFxuICAndGl0bGUnLFxuICAndHInLFxuICAndHJhY2snLFxuICAndWwnXG5dXG4iLCIvLyBSZWdleHBzIHRvIG1hdGNoIGh0bWwgZWxlbWVudHNcblxuY29uc3QgYXR0cl9uYW1lICAgICA9ICdbYS16QS1aXzpdW2EtekEtWjAtOTouXy1dKidcblxuY29uc3QgdW5xdW90ZWQgICAgICA9ICdbXlwiXFwnPTw+YFxcXFx4MDAtXFxcXHgyMF0rJ1xuY29uc3Qgc2luZ2xlX3F1b3RlZCA9IFwiJ1teJ10qJ1wiXG5jb25zdCBkb3VibGVfcXVvdGVkID0gJ1wiW15cIl0qXCInXG5cbmNvbnN0IGF0dHJfdmFsdWUgID0gJyg/OicgKyB1bnF1b3RlZCArICd8JyArIHNpbmdsZV9xdW90ZWQgKyAnfCcgKyBkb3VibGVfcXVvdGVkICsgJyknXG5cbmNvbnN0IGF0dHJpYnV0ZSAgID0gJyg/OlxcXFxzKycgKyBhdHRyX25hbWUgKyAnKD86XFxcXHMqPVxcXFxzKicgKyBhdHRyX3ZhbHVlICsgJyk/KSdcblxuY29uc3Qgb3Blbl90YWcgICAgPSAnPFtBLVphLXpdW0EtWmEtejAtOVxcXFwtXSonICsgYXR0cmlidXRlICsgJypcXFxccypcXFxcLz8+J1xuXG5jb25zdCBjbG9zZV90YWcgICA9ICc8XFxcXC9bQS1aYS16XVtBLVphLXowLTlcXFxcLV0qXFxcXHMqPidcbmNvbnN0IGNvbW1lbnQgICAgID0gJzwhLS0tPz58PCEtLSg/OlteLV18LVteLV18LS1bXj5dKSotLT4nXG5jb25zdCBwcm9jZXNzaW5nICA9ICc8Wz9dW1xcXFxzXFxcXFNdKj9bP10+J1xuY29uc3QgZGVjbGFyYXRpb24gPSAnPCFbQS1aYS16XVtePl0qPidcbmNvbnN0IGNkYXRhICAgICAgID0gJzwhXFxcXFtDREFUQVxcXFxbW1xcXFxzXFxcXFNdKj9cXFxcXVxcXFxdPidcblxuY29uc3QgSFRNTF9UQUdfUkUgPSBuZXcgUmVnRXhwKCdeKD86JyArIG9wZW5fdGFnICsgJ3wnICsgY2xvc2VfdGFnICsgJ3wnICsgY29tbWVudCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnfCcgKyBwcm9jZXNzaW5nICsgJ3wnICsgZGVjbGFyYXRpb24gKyAnfCcgKyBjZGF0YSArICcpJylcbmNvbnN0IEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUgPSBuZXcgUmVnRXhwKCdeKD86JyArIG9wZW5fdGFnICsgJ3wnICsgY2xvc2VfdGFnICsgJyknKVxuXG5leHBvcnQgeyBIVE1MX1RBR19SRSwgSFRNTF9PUEVOX0NMT1NFX1RBR19SRSB9XG4iLCIvLyBVdGlsaXRpZXNcbi8vXG5cbmltcG9ydCAqIGFzIG1kdXJsIGZyb20gJ21kdXJsJ1xuaW1wb3J0ICogYXMgdWNtaWNybyBmcm9tICd1Yy5taWNybydcbmltcG9ydCB7IGRlY29kZUhUTUwgfSBmcm9tICdlbnRpdGllcydcblxuZnVuY3Rpb24gX2NsYXNzIChvYmopIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopIH1cblxuZnVuY3Rpb24gaXNTdHJpbmcgKG9iaikgeyByZXR1cm4gX2NsYXNzKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nIH1cblxuY29uc3QgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuXG5mdW5jdGlvbiBoYXMgKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBfaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcbn1cblxuLy8gTWVyZ2Ugb2JqZWN0c1xuLy9cbmZ1bmN0aW9uIGFzc2lnbiAob2JqIC8qIGZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiAqLykge1xuICBjb25zdCBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKVxuXG4gIHNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgaWYgKCFzb3VyY2UpIHsgcmV0dXJuIH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBvYmplY3QnKVxuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBvYmpba2V5XSA9IHNvdXJjZVtrZXldXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gb2JqXG59XG5cbi8vIFJlbW92ZSBlbGVtZW50IGZyb20gYXJyYXkgYW5kIHB1dCBhbm90aGVyIGFycmF5IGF0IHRob3NlIHBvc2l0aW9uLlxuLy8gVXNlZnVsIGZvciBzb21lIG9wZXJhdGlvbnMgd2l0aCB0b2tlbnNcbmZ1bmN0aW9uIGFycmF5UmVwbGFjZUF0IChzcmMsIHBvcywgbmV3RWxlbWVudHMpIHtcbiAgcmV0dXJuIFtdLmNvbmNhdChzcmMuc2xpY2UoMCwgcG9zKSwgbmV3RWxlbWVudHMsIHNyYy5zbGljZShwb3MgKyAxKSlcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEVudGl0eUNvZGUgKGMpIHtcbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6MCAqL1xuICAvLyBicm9rZW4gc2VxdWVuY2VcbiAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhERkZGKSB7IHJldHVybiBmYWxzZSB9XG4gIC8vIG5ldmVyIHVzZWRcbiAgaWYgKGMgPj0gMHhGREQwICYmIGMgPD0gMHhGREVGKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmICgoYyAmIDB4RkZGRikgPT09IDB4RkZGRiB8fCAoYyAmIDB4RkZGRikgPT09IDB4RkZGRSkgeyByZXR1cm4gZmFsc2UgfVxuICAvLyBjb250cm9sIGNvZGVzXG4gIGlmIChjID49IDB4MDAgJiYgYyA8PSAweDA4KSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChjID09PSAweDBCKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChjID49IDB4MEUgJiYgYyA8PSAweDFGKSB7IHJldHVybiBmYWxzZSB9XG4gIGlmIChjID49IDB4N0YgJiYgYyA8PSAweDlGKSB7IHJldHVybiBmYWxzZSB9XG4gIC8vIG91dCBvZiByYW5nZVxuICBpZiAoYyA+IDB4MTBGRkZGKSB7IHJldHVybiBmYWxzZSB9XG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGZyb21Db2RlUG9pbnQgKGMpIHtcbiAgLyogZXNsaW50IG5vLWJpdHdpc2U6MCAqL1xuICBpZiAoYyA+IDB4ZmZmZikge1xuICAgIGMgLT0gMHgxMDAwMFxuICAgIGNvbnN0IHN1cnJvZ2F0ZTEgPSAweGQ4MDAgKyAoYyA+PiAxMClcbiAgICBjb25zdCBzdXJyb2dhdGUyID0gMHhkYzAwICsgKGMgJiAweDNmZilcblxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHN1cnJvZ2F0ZTEsIHN1cnJvZ2F0ZTIpXG4gIH1cbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYylcbn1cblxuY29uc3QgVU5FU0NBUEVfTURfUkUgID0gL1xcXFwoWyFcIiMkJSYnKCkqKyxcXC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nXG5jb25zdCBFTlRJVFlfUkUgICAgICAgPSAvJihbYS16I11bYS16MC05XXsxLDMxfSk7L2dpXG5jb25zdCBVTkVTQ0FQRV9BTExfUkUgPSBuZXcgUmVnRXhwKFVORVNDQVBFX01EX1JFLnNvdXJjZSArICd8JyArIEVOVElUWV9SRS5zb3VyY2UsICdnaScpXG5cbmNvbnN0IERJR0lUQUxfRU5USVRZX1RFU1RfUkUgPSAvXiMoKD86eFthLWYwLTldezEsOH18WzAtOV17MSw4fSkpJC9pXG5cbmZ1bmN0aW9uIHJlcGxhY2VFbnRpdHlQYXR0ZXJuIChtYXRjaCwgbmFtZSkge1xuICBpZiAobmFtZS5jaGFyQ29kZUF0KDApID09PSAweDIzLyogIyAqLyAmJiBESUdJVEFMX0VOVElUWV9URVNUX1JFLnRlc3QobmFtZSkpIHtcbiAgICBjb25zdCBjb2RlID0gbmFtZVsxXS50b0xvd2VyQ2FzZSgpID09PSAneCdcbiAgICAgID8gcGFyc2VJbnQobmFtZS5zbGljZSgyKSwgMTYpXG4gICAgICA6IHBhcnNlSW50KG5hbWUuc2xpY2UoMSksIDEwKVxuXG4gICAgaWYgKGlzVmFsaWRFbnRpdHlDb2RlKGNvZGUpKSB7XG4gICAgICByZXR1cm4gZnJvbUNvZGVQb2ludChjb2RlKVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaFxuICB9XG5cbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUhUTUwobWF0Y2gpXG4gIGlmIChkZWNvZGVkICE9PSBtYXRjaCkge1xuICAgIHJldHVybiBkZWNvZGVkXG4gIH1cblxuICByZXR1cm4gbWF0Y2hcbn1cblxuLyogZnVuY3Rpb24gcmVwbGFjZUVudGl0aWVzKHN0cikge1xuICBpZiAoc3RyLmluZGV4T2YoJyYnKSA8IDApIHsgcmV0dXJuIHN0cjsgfVxuXG4gIHJldHVybiBzdHIucmVwbGFjZShFTlRJVFlfUkUsIHJlcGxhY2VFbnRpdHlQYXR0ZXJuKTtcbn0gKi9cblxuZnVuY3Rpb24gdW5lc2NhcGVNZCAoc3RyKSB7XG4gIGlmIChzdHIuaW5kZXhPZignXFxcXCcpIDwgMCkgeyByZXR1cm4gc3RyIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFVORVNDQVBFX01EX1JFLCAnJDEnKVxufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUFsbCAoc3RyKSB7XG4gIGlmIChzdHIuaW5kZXhPZignXFxcXCcpIDwgMCAmJiBzdHIuaW5kZXhPZignJicpIDwgMCkgeyByZXR1cm4gc3RyIH1cblxuICByZXR1cm4gc3RyLnJlcGxhY2UoVU5FU0NBUEVfQUxMX1JFLCBmdW5jdGlvbiAobWF0Y2gsIGVzY2FwZWQsIGVudGl0eSkge1xuICAgIGlmIChlc2NhcGVkKSB7IHJldHVybiBlc2NhcGVkIH1cbiAgICByZXR1cm4gcmVwbGFjZUVudGl0eVBhdHRlcm4obWF0Y2gsIGVudGl0eSlcbiAgfSlcbn1cblxuY29uc3QgSFRNTF9FU0NBUEVfVEVTVF9SRSA9IC9bJjw+XCJdL1xuY29uc3QgSFRNTF9FU0NBUEVfUkVQTEFDRV9SRSA9IC9bJjw+XCJdL2dcbmNvbnN0IEhUTUxfUkVQTEFDRU1FTlRTID0ge1xuICAnJic6ICcmYW1wOycsXG4gICc8JzogJyZsdDsnLFxuICAnPic6ICcmZ3Q7JyxcbiAgJ1wiJzogJyZxdW90Oydcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVVuc2FmZUNoYXIgKGNoKSB7XG4gIHJldHVybiBIVE1MX1JFUExBQ0VNRU5UU1tjaF1cbn1cblxuZnVuY3Rpb24gZXNjYXBlSHRtbCAoc3RyKSB7XG4gIGlmIChIVE1MX0VTQ0FQRV9URVNUX1JFLnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShIVE1MX0VTQ0FQRV9SRVBMQUNFX1JFLCByZXBsYWNlVW5zYWZlQ2hhcilcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmNvbnN0IFJFR0VYUF9FU0NBUEVfUkUgPSAvWy4/KiteJFtcXF1cXFxcKCl7fXwtXS9nXG5cbmZ1bmN0aW9uIGVzY2FwZVJFIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYUF9FU0NBUEVfUkUsICdcXFxcJCYnKVxufVxuXG5mdW5jdGlvbiBpc1NwYWNlIChjb2RlKSB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgMHgwOTpcbiAgICBjYXNlIDB4MjA6XG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBacyAodW5pY29kZSBjbGFzcykgfHwgW1xcdFxcZlxcdlxcclxcbl1cbmZ1bmN0aW9uIGlzV2hpdGVTcGFjZSAoY29kZSkge1xuICBpZiAoY29kZSA+PSAweDIwMDAgJiYgY29kZSA8PSAweDIwMEEpIHsgcmV0dXJuIHRydWUgfVxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlIDB4MDk6IC8vIFxcdFxuICAgIGNhc2UgMHgwQTogLy8gXFxuXG4gICAgY2FzZSAweDBCOiAvLyBcXHZcbiAgICBjYXNlIDB4MEM6IC8vIFxcZlxuICAgIGNhc2UgMHgwRDogLy8gXFxyXG4gICAgY2FzZSAweDIwOlxuICAgIGNhc2UgMHhBMDpcbiAgICBjYXNlIDB4MTY4MDpcbiAgICBjYXNlIDB4MjAyRjpcbiAgICBjYXNlIDB4MjA1RjpcbiAgICBjYXNlIDB4MzAwMDpcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxuLy8gQ3VycmVudGx5IHdpdGhvdXQgYXN0cmFsIGNoYXJhY3RlcnMgc3VwcG9ydC5cbmZ1bmN0aW9uIGlzUHVuY3RDaGFyIChjaCkge1xuICByZXR1cm4gdWNtaWNyby5QLnRlc3QoY2gpIHx8IHVjbWljcm8uUy50ZXN0KGNoKVxufVxuXG4vLyBNYXJrZG93biBBU0NJSSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLlxuLy9cbi8vICEsIFwiLCAjLCAkLCAlLCAmLCAnLCAoLCApLCAqLCArLCAsLCAtLCAuLCAvLCA6LCA7LCA8LCA9LCA+LCA/LCBALCBbLCBcXCwgXSwgXiwgXywgYCwgeywgfCwgfSwgb3IgflxuLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xNS8jYXNjaWktcHVuY3R1YXRpb24tY2hhcmFjdGVyXG4vL1xuLy8gRG9uJ3QgY29uZnVzZSB3aXRoIHVuaWNvZGUgcHVuY3R1YXRpb24gISEhIEl0IGxhY2tzIHNvbWUgY2hhcnMgaW4gYXNjaWkgcmFuZ2UuXG4vL1xuZnVuY3Rpb24gaXNNZEFzY2lpUHVuY3QgKGNoKSB7XG4gIHN3aXRjaCAoY2gpIHtcbiAgICBjYXNlIDB4MjEvKiAhICovOlxuICAgIGNhc2UgMHgyMi8qIFwiICovOlxuICAgIGNhc2UgMHgyMy8qICMgKi86XG4gICAgY2FzZSAweDI0LyogJCAqLzpcbiAgICBjYXNlIDB4MjUvKiAlICovOlxuICAgIGNhc2UgMHgyNi8qICYgKi86XG4gICAgY2FzZSAweDI3LyogJyAqLzpcbiAgICBjYXNlIDB4MjgvKiAoICovOlxuICAgIGNhc2UgMHgyOS8qICkgKi86XG4gICAgY2FzZSAweDJBLyogKiAqLzpcbiAgICBjYXNlIDB4MkIvKiArICovOlxuICAgIGNhc2UgMHgyQy8qICwgKi86XG4gICAgY2FzZSAweDJELyogLSAqLzpcbiAgICBjYXNlIDB4MkUvKiAuICovOlxuICAgIGNhc2UgMHgyRi8qIC8gKi86XG4gICAgY2FzZSAweDNBLyogOiAqLzpcbiAgICBjYXNlIDB4M0IvKiA7ICovOlxuICAgIGNhc2UgMHgzQy8qIDwgKi86XG4gICAgY2FzZSAweDNELyogPSAqLzpcbiAgICBjYXNlIDB4M0UvKiA+ICovOlxuICAgIGNhc2UgMHgzRi8qID8gKi86XG4gICAgY2FzZSAweDQwLyogQCAqLzpcbiAgICBjYXNlIDB4NUIvKiBbICovOlxuICAgIGNhc2UgMHg1Qy8qIFxcICovOlxuICAgIGNhc2UgMHg1RC8qIF0gKi86XG4gICAgY2FzZSAweDVFLyogXiAqLzpcbiAgICBjYXNlIDB4NUYvKiBfICovOlxuICAgIGNhc2UgMHg2MC8qIGAgKi86XG4gICAgY2FzZSAweDdCLyogeyAqLzpcbiAgICBjYXNlIDB4N0MvKiB8ICovOlxuICAgIGNhc2UgMHg3RC8qIH0gKi86XG4gICAgY2FzZSAweDdFLyogfiAqLzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8vIEhlcGxlciB0byB1bmlmeSBbcmVmZXJlbmNlIGxhYmVsc10uXG4vL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVmZXJlbmNlIChzdHIpIHtcbiAgLy8gVHJpbSBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuICAvL1xuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKVxuXG4gIC8vIEluIG5vZGUgdjEwICfhup4nLnRvTG93ZXJDYXNlKCkgPT09ICfhub4nLCB3aGljaCBpcyBwcmVzdW1lZCB0byBiZSBhIGJ1Z1xuICAvLyBmaXhlZCBpbiB2MTIgKGNvdWxkbid0IGZpbmQgYW55IGRldGFpbHMpLlxuICAvL1xuICAvLyBTbyB0cmVhdCB0aGlzIG9uZSBhcyBhIHNwZWNpYWwgY2FzZVxuICAvLyAocmVtb3ZlIHRoaXMgd2hlbiBub2RlIHYxMCBpcyBubyBsb25nZXIgc3VwcG9ydGVkKS5cbiAgLy9cbiAgaWYgKCfhup4nLnRvTG93ZXJDYXNlKCkgPT09ICfhub4nKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL+G6ni9nLCAnw58nKVxuICB9XG5cbiAgLy8gLnRvTG93ZXJDYXNlKCkudG9VcHBlckNhc2UoKSBzaG91bGQgZ2V0IHJpZCBvZiBhbGwgZGlmZmVyZW5jZXNcbiAgLy8gYmV0d2VlbiBsZXR0ZXIgdmFyaWFudHMuXG4gIC8vXG4gIC8vIFNpbXBsZSAudG9Mb3dlckNhc2UoKSBkb2Vzbid0IG5vcm1hbGl6ZSAxMjUgY29kZSBwb2ludHMgY29ycmVjdGx5LFxuICAvLyBhbmQgLnRvVXBwZXJDYXNlIGRvZXNuJ3Qgbm9ybWFsaXplIDYgb2YgdGhlbSAobGlzdCBvZiBleGNlcHRpb25zOlxuICAvLyDEsCwgz7QsIOG6niwg4oSmLCDihKosIOKEqyAtIHRob3NlIGFyZSBhbHJlYWR5IHVwcGVyY2FzZWQsIGJ1dCBoYXZlIGRpZmZlcmVudGx5XG4gIC8vIHVwcGVyY2FzZWQgdmVyc2lvbnMpLlxuICAvL1xuICAvLyBIZXJlJ3MgYW4gZXhhbXBsZSBzaG93aW5nIGhvdyBpdCBoYXBwZW5zLiBMZXRzIHRha2UgZ3JlZWsgbGV0dGVyIG9tZWdhOlxuICAvLyB1cHBlcmNhc2UgVSswMzk4ICjOmCksIFUrMDNmNCAoz7QpIGFuZCBsb3dlcmNhc2UgVSswM2I4ICjOuCksIFUrMDNkMSAoz5EpXG4gIC8vXG4gIC8vIFVuaWNvZGUgZW50cmllczpcbiAgLy8gMDM5ODtHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQTtMdTswO0w7Ozs7O047Ozs7MDNCODtcbiAgLy8gMDNCODtHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEE7TGw7MDtMOzs7OztOOzs7MDM5ODs7MDM5OFxuICAvLyAwM0QxO0dSRUVLIFRIRVRBIFNZTUJPTDtMbDswO0w7PGNvbXBhdD4gMDNCODs7OztOO0dSRUVLIFNNQUxMIExFVFRFUiBTQ1JJUFQgVEhFVEE7OzAzOTg7OzAzOThcbiAgLy8gMDNGNDtHUkVFSyBDQVBJVEFMIFRIRVRBIFNZTUJPTDtMdTswO0w7PGNvbXBhdD4gMDM5ODs7OztOOzs7OzAzQjg7XG4gIC8vXG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBzaG91bGQgdHJlYXQgYWxsIG9mIHRoZW0gYXMgZXF1aXZhbGVudC5cbiAgLy9cbiAgLy8gQnV0IC50b0xvd2VyQ2FzZSgpIGRvZXNuJ3QgY2hhbmdlIM+RIChpdCdzIGFscmVhZHkgbG93ZXJjYXNlKSxcbiAgLy8gYW5kIC50b1VwcGVyQ2FzZSgpIGRvZXNuJ3QgY2hhbmdlIM+0IChhbHJlYWR5IHVwcGVyY2FzZSkuXG4gIC8vXG4gIC8vIEFwcGx5aW5nIGZpcnN0IGxvd2VyIHRoZW4gdXBwZXIgY2FzZSBub3JtYWxpemVzIGFueSBjaGFyYWN0ZXI6XG4gIC8vICdcXHUwMzk4XFx1MDNmNFxcdTAzYjhcXHUwM2QxJy50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkgPT09ICdcXHUwMzk4XFx1MDM5OFxcdTAzOThcXHUwMzk4J1xuICAvL1xuICAvLyBOb3RlOiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdW5pY29kZSBjYXNlIGZvbGRpbmc7IHVuaWNvZGUgbm9ybWFsaXphdGlvblxuICAvLyBpcyBhIGRpZmZlcmVudCBzdGVwIHRoYXQgaXMgbm90IHJlcXVpcmVkIGhlcmUuXG4gIC8vXG4gIC8vIEZpbmFsIHJlc3VsdCBzaG91bGQgYmUgdXBwZXJjYXNlZCwgYmVjYXVzZSBpdCdzIGxhdGVyIHN0b3JlZCBpbiBhbiBvYmplY3RcbiAgLy8gKHRoaXMgYXZvaWQgYSBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgbWVtYmVycyxcbiAgLy8gbW9zdCBub3RhYmx5LCBgX19wcm90b19fYClcbiAgLy9cbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKClcbn1cblxuLy8gUmUtZXhwb3J0IGxpYnJhcmllcyBjb21tb25seSB1c2VkIGluIGJvdGggbWFya2Rvd24taXQgYW5kIGl0cyBwbHVnaW5zLFxuLy8gc28gcGx1Z2lucyB3b24ndCBoYXZlIHRvIGRlcGVuZCBvbiB0aGVtIGV4cGxpY2l0bHksIHdoaWNoIHJlZHVjZXMgdGhlaXJcbi8vIGJ1bmRsZWQgc2l6ZSAoZS5nLiBhIGJyb3dzZXIgYnVpbGQpLlxuLy9cbmNvbnN0IGxpYiA9IHsgbWR1cmwsIHVjbWljcm8gfVxuXG5leHBvcnQge1xuICBsaWIsXG4gIGFzc2lnbixcbiAgaXNTdHJpbmcsXG4gIGhhcyxcbiAgdW5lc2NhcGVNZCxcbiAgdW5lc2NhcGVBbGwsXG4gIGlzVmFsaWRFbnRpdHlDb2RlLFxuICBmcm9tQ29kZVBvaW50LFxuICBlc2NhcGVIdG1sLFxuICBhcnJheVJlcGxhY2VBdCxcbiAgaXNTcGFjZSxcbiAgaXNXaGl0ZVNwYWNlLFxuICBpc01kQXNjaWlQdW5jdCxcbiAgaXNQdW5jdENoYXIsXG4gIGVzY2FwZVJFLFxuICBub3JtYWxpemVSZWZlcmVuY2Vcbn1cbiIsIi8vIEp1c3QgYSBzaG9ydGN1dCBmb3IgYnVsayBleHBvcnRcblxuaW1wb3J0IHBhcnNlTGlua0xhYmVsIGZyb20gJy4vcGFyc2VfbGlua19sYWJlbC5tanMnXG5pbXBvcnQgcGFyc2VMaW5rRGVzdGluYXRpb24gZnJvbSAnLi9wYXJzZV9saW5rX2Rlc3RpbmF0aW9uLm1qcydcbmltcG9ydCBwYXJzZUxpbmtUaXRsZSBmcm9tICcuL3BhcnNlX2xpbmtfdGl0bGUubWpzJ1xuXG5leHBvcnQge1xuICBwYXJzZUxpbmtMYWJlbCxcbiAgcGFyc2VMaW5rRGVzdGluYXRpb24sXG4gIHBhcnNlTGlua1RpdGxlXG59XG4iLCIvLyBQYXJzZSBsaW5rIGRlc3RpbmF0aW9uXG4vL1xuXG5pbXBvcnQgeyB1bmVzY2FwZUFsbCB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlTGlua0Rlc3RpbmF0aW9uIChzdHIsIHN0YXJ0LCBtYXgpIHtcbiAgbGV0IGNvZGVcbiAgbGV0IHBvcyA9IHN0YXJ0XG5cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIG9rOiBmYWxzZSxcbiAgICBwb3M6IDAsXG4gICAgc3RyOiAnJ1xuICB9XG5cbiAgaWYgKHN0ci5jaGFyQ29kZUF0KHBvcykgPT09IDB4M0MgLyogPCAqLykge1xuICAgIHBvcysrXG4gICAgd2hpbGUgKHBvcyA8IG1heCkge1xuICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmIChjb2RlID09PSAweDBBIC8qIFxcbiAqLykgeyByZXR1cm4gcmVzdWx0IH1cbiAgICAgIGlmIChjb2RlID09PSAweDNDIC8qIDwgKi8pIHsgcmV0dXJuIHJlc3VsdCB9XG4gICAgICBpZiAoY29kZSA9PT0gMHgzRSAvKiA+ICovKSB7XG4gICAgICAgIHJlc3VsdC5wb3MgPSBwb3MgKyAxXG4gICAgICAgIHJlc3VsdC5zdHIgPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQgKyAxLCBwb3MpKVxuICAgICAgICByZXN1bHQub2sgPSB0cnVlXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICAgIGlmIChjb2RlID09PSAweDVDIC8qIFxcICovICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICAgICAgcG9zICs9IDJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICAvLyBubyBjbG9zaW5nICc+J1xuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIHRoaXMgc2hvdWxkIGJlIC4uLiB9IGVsc2UgeyAuLi4gYnJhbmNoXG5cbiAgbGV0IGxldmVsID0gMFxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmIChjb2RlID09PSAweDIwKSB7IGJyZWFrIH1cblxuICAgIC8vIGFzY2lpIGNvbnRyb2wgY2hhcmFjdGVyc1xuICAgIGlmIChjb2RlIDwgMHgyMCB8fCBjb2RlID09PSAweDdGKSB7IGJyZWFrIH1cblxuICAgIGlmIChjb2RlID09PSAweDVDIC8qIFxcICovICYmIHBvcyArIDEgPCBtYXgpIHtcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gMHgyMCkgeyBicmVhayB9XG4gICAgICBwb3MgKz0gMlxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMHgyOCAvKiAoICovKSB7XG4gICAgICBsZXZlbCsrXG4gICAgICBpZiAobGV2ZWwgPiAzMikgeyByZXR1cm4gcmVzdWx0IH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gMHgyOSAvKiApICovKSB7XG4gICAgICBpZiAobGV2ZWwgPT09IDApIHsgYnJlYWsgfVxuICAgICAgbGV2ZWwtLVxuICAgIH1cblxuICAgIHBvcysrXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHBvcykgeyByZXR1cm4gcmVzdWx0IH1cbiAgaWYgKGxldmVsICE9PSAwKSB7IHJldHVybiByZXN1bHQgfVxuXG4gIHJlc3VsdC5zdHIgPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQsIHBvcykpXG4gIHJlc3VsdC5wb3MgPSBwb3NcbiAgcmVzdWx0Lm9rID0gdHJ1ZVxuICByZXR1cm4gcmVzdWx0XG59XG4iLCIvLyBQYXJzZSBsaW5rIGxhYmVsXG4vL1xuLy8gdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZmlyc3QgY2hhcmFjdGVyIChcIltcIikgYWxyZWFkeSBtYXRjaGVzO1xuLy8gcmV0dXJucyB0aGUgZW5kIG9mIHRoZSBsYWJlbFxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VMaW5rTGFiZWwgKHN0YXRlLCBzdGFydCwgZGlzYWJsZU5lc3RlZCkge1xuICBsZXQgbGV2ZWwsIGZvdW5kLCBtYXJrZXIsIHByZXZQb3NcblxuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcbiAgY29uc3Qgb2xkUG9zID0gc3RhdGUucG9zXG5cbiAgc3RhdGUucG9zID0gc3RhcnQgKyAxXG4gIGxldmVsID0gMVxuXG4gIHdoaWxlIChzdGF0ZS5wb3MgPCBtYXgpIHtcbiAgICBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChzdGF0ZS5wb3MpXG4gICAgaWYgKG1hcmtlciA9PT0gMHg1RCAvKiBdICovKSB7XG4gICAgICBsZXZlbC0tXG4gICAgICBpZiAobGV2ZWwgPT09IDApIHtcbiAgICAgICAgZm91bmQgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJldlBvcyA9IHN0YXRlLnBvc1xuICAgIHN0YXRlLm1kLmlubGluZS5za2lwVG9rZW4oc3RhdGUpXG4gICAgaWYgKG1hcmtlciA9PT0gMHg1QiAvKiBbICovKSB7XG4gICAgICBpZiAocHJldlBvcyA9PT0gc3RhdGUucG9zIC0gMSkge1xuICAgICAgICAvLyBpbmNyZWFzZSBsZXZlbCBpZiB3ZSBmaW5kIHRleHQgYFtgLCB3aGljaCBpcyBub3QgYSBwYXJ0IG9mIGFueSB0b2tlblxuICAgICAgICBsZXZlbCsrXG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGVOZXN0ZWQpIHtcbiAgICAgICAgc3RhdGUucG9zID0gb2xkUG9zXG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCBsYWJlbEVuZCA9IC0xXG5cbiAgaWYgKGZvdW5kKSB7XG4gICAgbGFiZWxFbmQgPSBzdGF0ZS5wb3NcbiAgfVxuXG4gIC8vIHJlc3RvcmUgb2xkIHN0YXRlXG4gIHN0YXRlLnBvcyA9IG9sZFBvc1xuXG4gIHJldHVybiBsYWJlbEVuZFxufVxuIiwiLy8gUGFyc2UgbGluayB0aXRsZVxuLy9cblxuaW1wb3J0IHsgdW5lc2NhcGVBbGwgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG4vLyBQYXJzZSBsaW5rIHRpdGxlIHdpdGhpbiBgc3RyYCBpbiBbc3RhcnQsIG1heF0gcmFuZ2UsXG4vLyBvciBjb250aW51ZSBwcmV2aW91cyBwYXJzaW5nIGlmIGBwcmV2X3N0YXRlYCBpcyBkZWZpbmVkIChlcXVhbCB0byByZXN1bHQgb2YgbGFzdCBleGVjdXRpb24pLlxuLy9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlTGlua1RpdGxlIChzdHIsIHN0YXJ0LCBtYXgsIHByZXZfc3RhdGUpIHtcbiAgbGV0IGNvZGVcbiAgbGV0IHBvcyA9IHN0YXJ0XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgLy8gaWYgYHRydWVgLCB0aGlzIGlzIGEgdmFsaWQgbGluayB0aXRsZVxuICAgIG9rOiBmYWxzZSxcbiAgICAvLyBpZiBgdHJ1ZWAsIHRoaXMgbGluayBjYW4gYmUgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmVcbiAgICBjYW5fY29udGludWU6IGZhbHNlLFxuICAgIC8vIGlmIGBva2AsIGl0J3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNsb3NpbmcgbWFya2VyXG4gICAgcG9zOiAwLFxuICAgIC8vIGlmIGBva2AsIGl0J3MgdGhlIHVuZXNjYXBlZCB0aXRsZVxuICAgIHN0cjogJycsXG4gICAgLy8gZXhwZWN0ZWQgY2xvc2luZyBtYXJrZXIgY2hhcmFjdGVyIGNvZGVcbiAgICBtYXJrZXI6IDBcbiAgfVxuXG4gIGlmIChwcmV2X3N0YXRlKSB7XG4gICAgLy8gdGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBvZiBhIHByZXZpb3VzIHBhcnNlTGlua1RpdGxlIGNhbGwgb24gdGhlIG5leHQgbGluZSxcbiAgICAvLyB1c2VkIGluIHJlZmVyZW5jZSBsaW5rcyBvbmx5XG4gICAgc3RhdGUuc3RyID0gcHJldl9zdGF0ZS5zdHJcbiAgICBzdGF0ZS5tYXJrZXIgPSBwcmV2X3N0YXRlLm1hcmtlclxuICB9IGVsc2Uge1xuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiBzdGF0ZSB9XG5cbiAgICBsZXQgbWFya2VyID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChtYXJrZXIgIT09IDB4MjIgLyogXCIgKi8gJiYgbWFya2VyICE9PSAweDI3IC8qICcgKi8gJiYgbWFya2VyICE9PSAweDI4IC8qICggKi8pIHsgcmV0dXJuIHN0YXRlIH1cblxuICAgIHN0YXJ0KytcbiAgICBwb3MrK1xuXG4gICAgLy8gaWYgb3BlbmluZyBtYXJrZXIgaXMgXCIoXCIsIHN3aXRjaCBpdCB0byBjbG9zaW5nIG1hcmtlciBcIilcIlxuICAgIGlmIChtYXJrZXIgPT09IDB4MjgpIHsgbWFya2VyID0gMHgyOSB9XG5cbiAgICBzdGF0ZS5tYXJrZXIgPSBtYXJrZXJcbiAgfVxuXG4gIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmIChjb2RlID09PSBzdGF0ZS5tYXJrZXIpIHtcbiAgICAgIHN0YXRlLnBvcyA9IHBvcyArIDFcbiAgICAgIHN0YXRlLnN0ciArPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQsIHBvcykpXG4gICAgICBzdGF0ZS5vayA9IHRydWVcbiAgICAgIHJldHVybiBzdGF0ZVxuICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyOCAvKiAoICovICYmIHN0YXRlLm1hcmtlciA9PT0gMHgyOSAvKiApICovKSB7XG4gICAgICByZXR1cm4gc3RhdGVcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4NUMgLyogXFwgKi8gJiYgcG9zICsgMSA8IG1heCkge1xuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgLy8gbm8gY2xvc2luZyBtYXJrZXIgZm91bmQsIGJ1dCB0aGlzIGxpbmsgdGl0bGUgbWF5IGNvbnRpbnVlIG9uIHRoZSBuZXh0IGxpbmUgKGZvciByZWZlcmVuY2VzKVxuICBzdGF0ZS5jYW5fY29udGludWUgPSB0cnVlXG4gIHN0YXRlLnN0ciArPSB1bmVzY2FwZUFsbChzdHIuc2xpY2Uoc3RhcnQsIHBvcykpXG4gIHJldHVybiBzdGF0ZVxufVxuIiwiLy8gTWFpbiBwYXJzZXIgY2xhc3NcblxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi9jb21tb24vdXRpbHMubWpzJ1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tICcuL2hlbHBlcnMvaW5kZXgubWpzJ1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vcmVuZGVyZXIubWpzJ1xuaW1wb3J0IFBhcnNlckNvcmUgZnJvbSAnLi9wYXJzZXJfY29yZS5tanMnXG5pbXBvcnQgUGFyc2VyQmxvY2sgZnJvbSAnLi9wYXJzZXJfYmxvY2subWpzJ1xuaW1wb3J0IFBhcnNlcklubGluZSBmcm9tICcuL3BhcnNlcl9pbmxpbmUubWpzJ1xuaW1wb3J0IExpbmtpZnlJdCBmcm9tICdsaW5raWZ5LWl0J1xuaW1wb3J0ICogYXMgbWR1cmwgZnJvbSAnbWR1cmwnXG5pbXBvcnQgcHVueWNvZGUgZnJvbSAncHVueWNvZGUuanMnXG5cbmltcG9ydCBjZmdfZGVmYXVsdCBmcm9tICcuL3ByZXNldHMvZGVmYXVsdC5tanMnXG5pbXBvcnQgY2ZnX3plcm8gZnJvbSAnLi9wcmVzZXRzL3plcm8ubWpzJ1xuaW1wb3J0IGNmZ19jb21tb25tYXJrIGZyb20gJy4vcHJlc2V0cy9jb21tb25tYXJrLm1qcydcblxuY29uc3QgY29uZmlnID0ge1xuICBkZWZhdWx0OiBjZmdfZGVmYXVsdCxcbiAgemVybzogY2ZnX3plcm8sXG4gIGNvbW1vbm1hcms6IGNmZ19jb21tb25tYXJrXG59XG5cbi8vXG4vLyBUaGlzIHZhbGlkYXRvciBjYW4gcHJvaGliaXQgbW9yZSB0aGFuIHJlYWxseSBuZWVkZWQgdG8gcHJldmVudCBYU1MuIEl0J3MgYVxuLy8gdHJhZGVvZmYgdG8ga2VlcCBjb2RlIHNpbXBsZSBhbmQgdG8gYmUgc2VjdXJlIGJ5IGRlZmF1bHQuXG4vL1xuLy8gSWYgeW91IG5lZWQgZGlmZmVyZW50IHNldHVwIC0gb3ZlcnJpZGUgdmFsaWRhdG9yIG1ldGhvZCBhcyB5b3Ugd2lzaC4gT3Jcbi8vIHJlcGxhY2UgaXQgd2l0aCBkdW1teSBmdW5jdGlvbiBhbmQgdXNlIGV4dGVybmFsIHNhbml0aXplci5cbi8vXG5cbmNvbnN0IEJBRF9QUk9UT19SRSA9IC9eKHZic2NyaXB0fGphdmFzY3JpcHR8ZmlsZXxkYXRhKTovXG5jb25zdCBHT09EX0RBVEFfUkUgPSAvXmRhdGE6aW1hZ2VcXC8oZ2lmfHBuZ3xqcGVnfHdlYnApOy9cblxuZnVuY3Rpb24gdmFsaWRhdGVMaW5rICh1cmwpIHtcbiAgLy8gdXJsIHNob3VsZCBiZSBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnQsIGFuZCBleGlzdGluZyBlbnRpdGllcyBhcmUgZGVjb2RlZFxuICBjb25zdCBzdHIgPSB1cmwudHJpbSgpLnRvTG93ZXJDYXNlKClcblxuICByZXR1cm4gQkFEX1BST1RPX1JFLnRlc3Qoc3RyKSA/IEdPT0RfREFUQV9SRS50ZXN0KHN0cikgOiB0cnVlXG59XG5cbmNvbnN0IFJFQ09ERV9IT1NUTkFNRV9GT1IgPSBbJ2h0dHA6JywgJ2h0dHBzOicsICdtYWlsdG86J11cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluayAodXJsKSB7XG4gIGNvbnN0IHBhcnNlZCA9IG1kdXJsLnBhcnNlKHVybCwgdHJ1ZSlcblxuICBpZiAocGFyc2VkLmhvc3RuYW1lKSB7XG4gICAgLy8gRW5jb2RlIGhvc3RuYW1lcyBpbiB1cmxzIGxpa2U6XG4gICAgLy8gYGh0dHA6Ly9ob3N0L2AsIGBodHRwczovL2hvc3QvYCwgYG1haWx0bzp1c2VyQGhvc3RgLCBgLy9ob3N0L2BcbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IGVuY29kZSB1bmtub3duIHNjaGVtYXMsIGJlY2F1c2UgaXQncyBsaWtlbHkgdGhhdCB3ZSBlbmNvZGVcbiAgICAvLyBzb21ldGhpbmcgd2Ugc2hvdWxkbid0IChlLmcuIGBza3lwZTpuYW1lYCB0cmVhdGVkIGFzIGBza3lwZTpob3N0YClcbiAgICAvL1xuICAgIGlmICghcGFyc2VkLnByb3RvY29sIHx8IFJFQ09ERV9IT1NUTkFNRV9GT1IuaW5kZXhPZihwYXJzZWQucHJvdG9jb2wpID49IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZC5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkocGFyc2VkLmhvc3RuYW1lKVxuICAgICAgfSBjYXRjaCAoZXIpIHsgLyoqLyB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kdXJsLmVuY29kZShtZHVybC5mb3JtYXQocGFyc2VkKSlcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlua1RleHQgKHVybCkge1xuICBjb25zdCBwYXJzZWQgPSBtZHVybC5wYXJzZSh1cmwsIHRydWUpXG5cbiAgaWYgKHBhcnNlZC5ob3N0bmFtZSkge1xuICAgIC8vIEVuY29kZSBob3N0bmFtZXMgaW4gdXJscyBsaWtlOlxuICAgIC8vIGBodHRwOi8vaG9zdC9gLCBgaHR0cHM6Ly9ob3N0L2AsIGBtYWlsdG86dXNlckBob3N0YCwgYC8vaG9zdC9gXG4gICAgLy9cbiAgICAvLyBXZSBkb24ndCBlbmNvZGUgdW5rbm93biBzY2hlbWFzLCBiZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UgZW5jb2RlXG4gICAgLy8gc29tZXRoaW5nIHdlIHNob3VsZG4ndCAoZS5nLiBgc2t5cGU6bmFtZWAgdHJlYXRlZCBhcyBgc2t5cGU6aG9zdGApXG4gICAgLy9cbiAgICBpZiAoIXBhcnNlZC5wcm90b2NvbCB8fCBSRUNPREVfSE9TVE5BTUVfRk9SLmluZGV4T2YocGFyc2VkLnByb3RvY29sKSA+PSAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQuaG9zdG5hbWUgPSBwdW55Y29kZS50b1VuaWNvZGUocGFyc2VkLmhvc3RuYW1lKVxuICAgICAgfSBjYXRjaCAoZXIpIHsgLyoqLyB9XG4gICAgfVxuICB9XG5cbiAgLy8gYWRkICclJyB0byBleGNsdWRlIGxpc3QgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvaXNzdWVzLzcyMFxuICByZXR1cm4gbWR1cmwuZGVjb2RlKG1kdXJsLmZvcm1hdChwYXJzZWQpLCBtZHVybC5kZWNvZGUuZGVmYXVsdENoYXJzICsgJyUnKVxufVxuXG4vKipcbiAqIGNsYXNzIE1hcmtkb3duSXRcbiAqXG4gKiBNYWluIHBhcnNlci9yZW5kZXJlciBjbGFzcy5cbiAqXG4gKiAjIyMjIyBVc2FnZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIG5vZGUuanMsIFwiY2xhc3NpY1wiIHdheTpcbiAqIHZhciBNYXJrZG93bkl0ID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSxcbiAqICAgICBtZCA9IG5ldyBNYXJrZG93bkl0KCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqXG4gKiAvLyBub2RlLmpzLCB0aGUgc2FtZSwgYnV0IHdpdGggc3VnYXI6XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqXG4gKiAvLyBicm93c2VyIHdpdGhvdXQgQU1ELCBhZGRlZCB0byBcIndpbmRvd1wiIG9uIHNjcmlwdCBsb2FkXG4gKiAvLyBOb3RlLCB0aGVyZSBhcmUgbm8gZGFzaC5cbiAqIHZhciBtZCA9IHdpbmRvdy5tYXJrZG93bml0KCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVyKCcjIG1hcmtkb3duLWl0IHJ1bGV6eiEnKTtcbiAqIGBgYFxuICpcbiAqIFNpbmdsZSBsaW5lIHJlbmRlcmluZywgd2l0aG91dCBwYXJhZ3JhcGggd3JhcDpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKiB2YXIgcmVzdWx0ID0gbWQucmVuZGVySW5saW5lKCdfX21hcmtkb3duLWl0X18gcnVsZXp6IScpO1xuICogYGBgXG4gKiovXG5cbi8qKlxuICogbmV3IE1hcmtkb3duSXQoW3ByZXNldE5hbWUsIG9wdGlvbnNdKVxuICogLSBwcmVzZXROYW1lIChTdHJpbmcpOiBvcHRpb25hbCwgYGNvbW1vbm1hcmtgIC8gYHplcm9gXG4gKiAtIG9wdGlvbnMgKE9iamVjdClcbiAqXG4gKiBDcmVhdGVzIHBhcnNlciBpbnN0YW5zZSB3aXRoIGdpdmVuIGNvbmZpZy4gQ2FuIGJlIGNhbGxlZCB3aXRob3V0IGBuZXdgLlxuICpcbiAqICMjIyMjIHByZXNldE5hbWVcbiAqXG4gKiBNYXJrZG93bkl0IHByb3ZpZGVzIG5hbWVkIHByZXNldHMgYXMgYSBjb252ZW5pZW5jZSB0byBxdWlja2x5XG4gKiBlbmFibGUvZGlzYWJsZSBhY3RpdmUgc3ludGF4IHJ1bGVzIGFuZCBvcHRpb25zIGZvciBjb21tb24gdXNlIGNhc2VzLlxuICpcbiAqIC0gW1wiY29tbW9ubWFya1wiXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3ByZXNldHMvY29tbW9ubWFyay5tanMpIC1cbiAqICAgY29uZmlndXJlcyBwYXJzZXIgdG8gc3RyaWN0IFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSBtb2RlLlxuICogLSBbZGVmYXVsdF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9wcmVzZXRzL2RlZmF1bHQubWpzKSAtXG4gKiAgIHNpbWlsYXIgdG8gR0ZNLCB1c2VkIHdoZW4gbm8gcHJlc2V0IG5hbWUgZ2l2ZW4uIEVuYWJsZXMgYWxsIGF2YWlsYWJsZSBydWxlcyxcbiAqICAgYnV0IHN0aWxsIHdpdGhvdXQgaHRtbCwgdHlwb2dyYXBoZXIgJiBhdXRvbGlua2VyLlxuICogLSBbXCJ6ZXJvXCJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9ibG9iL21hc3Rlci9saWIvcHJlc2V0cy96ZXJvLm1qcykgLVxuICogICBhbGwgcnVsZXMgZGlzYWJsZWQuIFVzZWZ1bCB0byBxdWlja2x5IHNldHVwIHlvdXIgY29uZmlnIHZpYSBgLmVuYWJsZSgpYC5cbiAqICAgRm9yIGV4YW1wbGUsIHdoZW4geW91IG5lZWQgb25seSBgYm9sZGAgYW5kIGBpdGFsaWNgIG1hcmt1cCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqICMjIyMjIG9wdGlvbnM6XG4gKlxuICogLSBfX2h0bWxfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gZW5hYmxlIEhUTUwgdGFncyBpbiBzb3VyY2UuIEJlIGNhcmVmdWwhXG4gKiAgIFRoYXQncyBub3Qgc2FmZSEgWW91IG1heSBuZWVkIGV4dGVybmFsIHNhbml0aXplciB0byBwcm90ZWN0IG91dHB1dCBmcm9tIFhTUy5cbiAqICAgSXQncyBiZXR0ZXIgdG8gZXh0ZW5kIGZlYXR1cmVzIHZpYSBwbHVnaW5zLCBpbnN0ZWFkIG9mIGVuYWJsaW5nIEhUTUwuXG4gKiAtIF9feGh0bWxPdXRfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gYWRkICcvJyB3aGVuIGNsb3Npbmcgc2luZ2xlIHRhZ3NcbiAqICAgKGA8YnIgLz5gKS4gVGhpcyBpcyBuZWVkZWQgb25seSBmb3IgZnVsbCBDb21tb25NYXJrIGNvbXBhdGliaWxpdHkuIEluIHJlYWxcbiAqICAgd29ybGQgeW91IHdpbGwgbmVlZCBIVE1MIG91dHB1dC5cbiAqIC0gX19icmVha3NfXyAtIGBmYWxzZWAuIFNldCBgdHJ1ZWAgdG8gY29udmVydCBgXFxuYCBpbiBwYXJhZ3JhcGhzIGludG8gYDxicj5gLlxuICogLSBfX2xhbmdQcmVmaXhfXyAtIGBsYW5ndWFnZS1gLiBDU1MgbGFuZ3VhZ2UgY2xhc3MgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzLlxuICogICBDYW4gYmUgdXNlZnVsIGZvciBleHRlcm5hbCBoaWdobGlnaHRlcnMuXG4gKiAtIF9fbGlua2lmeV9fIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0IHRvIGxpbmtzLlxuICogLSBfX3R5cG9ncmFwaGVyX18gIC0gYGZhbHNlYC4gU2V0IGB0cnVlYCB0byBlbmFibGUgW3NvbWUgbGFuZ3VhZ2UtbmV1dHJhbFxuICogICByZXBsYWNlbWVudF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9ydWxlc19jb3JlL3JlcGxhY2VtZW50cy5tanMpICtcbiAqICAgcXVvdGVzIGJlYXV0aWZpY2F0aW9uIChzbWFydHF1b3RlcykuXG4gKiAtIF9fcXVvdGVzX18gLSBg4oCc4oCd4oCY4oCZYCwgU3RyaW5nIG9yIEFycmF5LiBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50XG4gKiAgIHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQgYW5kIHNtYXJ0cXVvdGVzIG9uLiBGb3IgZXhhbXBsZSwgeW91IGNhblxuICogICB1c2UgYCfCq8K74oCe4oCcJ2AgZm9yIFJ1c3NpYW4sIGAn4oCe4oCc4oCa4oCYJ2AgZm9yIEdlcm1hbiwgYW5kXG4gKiAgIGBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddYCBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gKiAtIF9faGlnaGxpZ2h0X18gLSBgbnVsbGAuIEhpZ2hsaWdodGVyIGZ1bmN0aW9uIGZvciBmZW5jZWQgY29kZSBibG9ja3MuXG4gKiAgIEhpZ2hsaWdodGVyIGBmdW5jdGlvbiAoc3RyLCBsYW5nKWAgc2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwuIEl0IGNhbiBhbHNvXG4gKiAgIHJldHVybiBlbXB0eSBzdHJpbmcgaWYgdGhlIHNvdXJjZSB3YXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkXG4gKiAgIGV4dGVybmFseS4gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBjb21tb25tYXJrIG1vZGVcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoJ2NvbW1vbm1hcmsnKTtcbiAqXG4gKiAvLyBkZWZhdWx0IG1vZGVcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiAvLyBlbmFibGUgZXZlcnl0aGluZ1xuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSh7XG4gKiAgIGh0bWw6IHRydWUsXG4gKiAgIGxpbmtpZnk6IHRydWUsXG4gKiAgIHR5cG9ncmFwaGVyOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyMjIFN5bnRheCBoaWdobGlnaHRpbmdcbiAqXG4gKiBgYGBqc1xuICogdmFyIGhsanMgPSByZXF1aXJlKCdoaWdobGlnaHQuanMnKSAvLyBodHRwczovL2hpZ2hsaWdodGpzLm9yZy9cbiAqXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKHtcbiAqICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoc3RyLCBsYW5nKSB7XG4gKiAgICAgaWYgKGxhbmcgJiYgaGxqcy5nZXRMYW5ndWFnZShsYW5nKSkge1xuICogICAgICAgdHJ5IHtcbiAqICAgICAgICAgcmV0dXJuIGhsanMuaGlnaGxpZ2h0KHN0ciwgeyBsYW5ndWFnZTogbGFuZywgaWdub3JlSWxsZWdhbHM6IHRydWUgfSkudmFsdWU7XG4gKiAgICAgICB9IGNhdGNoIChfXykge31cbiAqICAgICB9XG4gKlxuICogICAgIHJldHVybiAnJzsgLy8gdXNlIGV4dGVybmFsIGRlZmF1bHQgZXNjYXBpbmdcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBPciB3aXRoIGZ1bGwgd3JhcHBlciBvdmVycmlkZSAoaWYgeW91IG5lZWQgYXNzaWduIGNsYXNzIHRvIGA8cHJlPmAgb3IgYDxjb2RlPmApOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBobGpzID0gcmVxdWlyZSgnaGlnaGxpZ2h0LmpzJykgLy8gaHR0cHM6Ly9oaWdobGlnaHRqcy5vcmcvXG4gKlxuICogLy8gQWN0dWFsIGRlZmF1bHQgdmFsdWVzXG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKHtcbiAqICAgaGlnaGxpZ2h0OiBmdW5jdGlvbiAoc3RyLCBsYW5nKSB7XG4gKiAgICAgaWYgKGxhbmcgJiYgaGxqcy5nZXRMYW5ndWFnZShsYW5nKSkge1xuICogICAgICAgdHJ5IHtcbiAqICAgICAgICAgcmV0dXJuICc8cHJlPjxjb2RlIGNsYXNzPVwiaGxqc1wiPicgK1xuICogICAgICAgICAgICAgICAgaGxqcy5oaWdobGlnaHQoc3RyLCB7IGxhbmd1YWdlOiBsYW5nLCBpZ25vcmVJbGxlZ2FsczogdHJ1ZSB9KS52YWx1ZSArXG4gKiAgICAgICAgICAgICAgICAnPC9jb2RlPjwvcHJlPic7XG4gKiAgICAgICB9IGNhdGNoIChfXykge31cbiAqICAgICB9XG4gKlxuICogICAgIHJldHVybiAnPHByZT48Y29kZSBjbGFzcz1cImhsanNcIj4nICsgbWQudXRpbHMuZXNjYXBlSHRtbChzdHIpICsgJzwvY29kZT48L3ByZT4nO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqKi9cbmZ1bmN0aW9uIE1hcmtkb3duSXQgKHByZXNldE5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hcmtkb3duSXQpKSB7XG4gICAgcmV0dXJuIG5ldyBNYXJrZG93bkl0KHByZXNldE5hbWUsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICBpZiAoIXV0aWxzLmlzU3RyaW5nKHByZXNldE5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gcHJlc2V0TmFtZSB8fCB7fVxuICAgICAgcHJlc2V0TmFtZSA9ICdkZWZhdWx0J1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I2lubGluZSAtPiBQYXJzZXJJbmxpbmVcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tQYXJzZXJJbmxpbmVdXS4gWW91IG1heSBuZWVkIGl0IHRvIGFkZCBuZXcgcnVsZXMgd2hlblxuICAgKiB3cml0aW5nIHBsdWdpbnMuIEZvciBzaW1wbGUgcnVsZXMgY29udHJvbCB1c2UgW1tNYXJrZG93bkl0LmRpc2FibGVdXSBhbmRcbiAgICogW1tNYXJrZG93bkl0LmVuYWJsZV1dLlxuICAgKiovXG4gIHRoaXMuaW5saW5lID0gbmV3IFBhcnNlcklubGluZSgpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjYmxvY2sgLT4gUGFyc2VyQmxvY2tcbiAgICpcbiAgICogSW5zdGFuY2Ugb2YgW1tQYXJzZXJCbG9ja11dLiBZb3UgbWF5IG5lZWQgaXQgdG8gYWRkIG5ldyBydWxlcyB3aGVuXG4gICAqIHdyaXRpbmcgcGx1Z2lucy4gRm9yIHNpbXBsZSBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dIGFuZFxuICAgKiBbW01hcmtkb3duSXQuZW5hYmxlXV0uXG4gICAqKi9cbiAgdGhpcy5ibG9jayA9IG5ldyBQYXJzZXJCbG9jaygpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjY29yZSAtPiBDb3JlXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbQ29yZV1dIGNoYWluIGV4ZWN1dG9yLiBZb3UgbWF5IG5lZWQgaXQgdG8gYWRkIG5ldyBydWxlcyB3aGVuXG4gICAqIHdyaXRpbmcgcGx1Z2lucy4gRm9yIHNpbXBsZSBydWxlcyBjb250cm9sIHVzZSBbW01hcmtkb3duSXQuZGlzYWJsZV1dIGFuZFxuICAgKiBbW01hcmtkb3duSXQuZW5hYmxlXV0uXG4gICAqKi9cbiAgdGhpcy5jb3JlID0gbmV3IFBhcnNlckNvcmUoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I3JlbmRlcmVyIC0+IFJlbmRlcmVyXG4gICAqXG4gICAqIEluc3RhbmNlIG9mIFtbUmVuZGVyZXJdXS4gVXNlIGl0IHRvIG1vZGlmeSBvdXRwdXQgbG9vay4gT3IgdG8gYWRkIHJlbmRlcmluZ1xuICAgKiBydWxlcyBmb3IgbmV3IHRva2VuIHR5cGVzLCBnZW5lcmF0ZWQgYnkgcGx1Z2lucy5cbiAgICpcbiAgICogIyMjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAgICpcbiAgICogZnVuY3Rpb24gbXlUb2tlbih0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzZWxmKSB7XG4gICAqICAgLy8uLi5cbiAgICogICByZXR1cm4gcmVzdWx0O1xuICAgKiB9O1xuICAgKlxuICAgKiBtZC5yZW5kZXJlci5ydWxlc1snbXlfdG9rZW4nXSA9IG15VG9rZW5cbiAgICogYGBgXG4gICAqXG4gICAqIFNlZSBbW1JlbmRlcmVyXV0gZG9jcyBhbmQgW3NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbWFya2Rvd24taXQvYmxvYi9tYXN0ZXIvbGliL3JlbmRlcmVyLm1qcykuXG4gICAqKi9cbiAgdGhpcy5yZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjbGlua2lmeSAtPiBMaW5raWZ5SXRcbiAgICpcbiAgICogW2xpbmtpZnktaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9saW5raWZ5LWl0KSBpbnN0YW5jZS5cbiAgICogVXNlZCBieSBbbGlua2lmeV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9ydWxlc19jb3JlL2xpbmtpZnkubWpzKVxuICAgKiBydWxlLlxuICAgKiovXG4gIHRoaXMubGlua2lmeSA9IG5ldyBMaW5raWZ5SXQoKVxuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I3ZhbGlkYXRlTGluayh1cmwpIC0+IEJvb2xlYW5cbiAgICpcbiAgICogTGluayB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBDb21tb25NYXJrIGFsbG93cyB0b28gbXVjaCBpbiBsaW5rcy4gQnkgZGVmYXVsdFxuICAgKiB3ZSBkaXNhYmxlIGBqYXZhc2NyaXB0OmAsIGB2YnNjcmlwdDpgLCBgZmlsZTpgIHNjaGVtYXMsIGFuZCBhbG1vc3QgYWxsIGBkYXRhOi4uLmAgc2NoZW1hc1xuICAgKiBleGNlcHQgc29tZSBlbWJlZGRlZCBpbWFnZSB0eXBlcy5cbiAgICpcbiAgICogWW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvdXI6XG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpO1xuICAgKiAvLyBlbmFibGUgZXZlcnl0aGluZ1xuICAgKiBtZC52YWxpZGF0ZUxpbmsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9XG4gICAqIGBgYFxuICAgKiovXG4gIHRoaXMudmFsaWRhdGVMaW5rID0gdmFsaWRhdGVMaW5rXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjbm9ybWFsaXplTGluayh1cmwpIC0+IFN0cmluZ1xuICAgKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIGVuY29kZSBsaW5rIHVybCB0byBhIG1hY2hpbmUtcmVhZGFibGUgZm9ybWF0LFxuICAgKiB3aGljaCBpbmNsdWRlcyB1cmwtZW5jb2RpbmcsIHB1bnljb2RlLCBldGMuXG4gICAqKi9cbiAgdGhpcy5ub3JtYWxpemVMaW5rID0gbm9ybWFsaXplTGlua1xuXG4gIC8qKlxuICAgKiBNYXJrZG93bkl0I25vcm1hbGl6ZUxpbmtUZXh0KHVybCkgLT4gU3RyaW5nXG4gICAqXG4gICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGVjb2RlIGxpbmsgdXJsIHRvIGEgaHVtYW4tcmVhZGFibGUgZm9ybWF0YFxuICAgKiovXG4gIHRoaXMubm9ybWFsaXplTGlua1RleHQgPSBub3JtYWxpemVMaW5rVGV4dFxuXG4gIC8vIEV4cG9zZSB1dGlscyAmIGhlbHBlcnMgZm9yIGVhc3kgYWNjZXMgZnJvbSBwbHVnaW5zXG5cbiAgLyoqXG4gICAqIE1hcmtkb3duSXQjdXRpbHMgLT4gdXRpbHNcbiAgICpcbiAgICogQXNzb3J0ZWQgdXRpbGl0eSBmdW5jdGlvbnMsIHVzZWZ1bCB0byB3cml0ZSBwbHVnaW5zLiBTZWUgZGV0YWlsc1xuICAgKiBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9jb21tb24vdXRpbHMubWpzKS5cbiAgICoqL1xuICB0aGlzLnV0aWxzID0gdXRpbHNcblxuICAvKipcbiAgICogTWFya2Rvd25JdCNoZWxwZXJzIC0+IGhlbHBlcnNcbiAgICpcbiAgICogTGluayBjb21wb25lbnRzIHBhcnNlciBmdW5jdGlvbnMsIHVzZWZ1bCB0byB3cml0ZSBwbHVnaW5zLiBTZWUgZGV0YWlsc1xuICAgKiBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9oZWxwZXJzKS5cbiAgICoqL1xuICB0aGlzLmhlbHBlcnMgPSB1dGlscy5hc3NpZ24oe30sIGhlbHBlcnMpXG5cbiAgdGhpcy5vcHRpb25zID0ge31cbiAgdGhpcy5jb25maWd1cmUocHJlc2V0TmFtZSlcblxuICBpZiAob3B0aW9ucykgeyB0aGlzLnNldChvcHRpb25zKSB9XG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQuc2V0KG9wdGlvbnMpXG4gKlxuICogU2V0IHBhcnNlciBvcHRpb25zIChpbiB0aGUgc2FtZSBmb3JtYXQgYXMgaW4gY29uc3RydWN0b3IpLiBQcm9iYWJseSwgeW91XG4gKiB3aWxsIG5ldmVyIG5lZWQgaXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSBvcHRpb25zIGFmdGVyIGNvbnN0cnVjdG9yIGNhbGwuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKVxuICogICAgICAgICAgICAgLnNldCh7IGh0bWw6IHRydWUsIGJyZWFrczogdHJ1ZSB9KVxuICogICAgICAgICAgICAgLnNldCh7IHR5cG9ncmFwaGVyLCB0cnVlIH0pO1xuICogYGBgXG4gKlxuICogX19Ob3RlOl9fIFRvIGFjaGlldmUgdGhlIGJlc3QgcG9zc2libGUgcGVyZm9ybWFuY2UsIGRvbid0IG1vZGlmeSBhXG4gKiBgbWFya2Rvd24taXRgIGluc3RhbmNlIG9wdGlvbnMgb24gdGhlIGZseS4gSWYgeW91IG5lZWQgbXVsdGlwbGUgY29uZmlndXJhdGlvbnNcbiAqIGl0J3MgYmVzdCB0byBjcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIGFuZCBpbml0aWFsaXplIGVhY2ggd2l0aCBzZXBhcmF0ZVxuICogY29uZmlnLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgdXRpbHMuYXNzaWduKHRoaXMub3B0aW9ucywgb3B0aW9ucylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqIGNoYWluYWJsZSwgaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQuY29uZmlndXJlKHByZXNldHMpXG4gKlxuICogQmF0Y2ggbG9hZCBvZiBhbGwgb3B0aW9ucyBhbmQgY29tcGVuZW50IHNldHRpbmdzLiBUaGlzIGlzIGludGVybmFsIG1ldGhvZCxcbiAqIGFuZCB5b3UgcHJvYmFibHkgd2lsbCBub3QgbmVlZCBpdC4gQnV0IGlmIHlvdSB3aWxsIC0gc2VlIGF2YWlsYWJsZSBwcmVzZXRzXG4gKiBhbmQgZGF0YSBzdHJ1Y3R1cmUgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC90cmVlL21hc3Rlci9saWIvcHJlc2V0cylcbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIHByZXNldHMgaW5zdGVhZCBvZiBkaXJlY3QgY29uZmlnIGxvYWRzLiBUaGF0XG4gKiB3aWxsIGdpdmUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBuZXh0IHZlcnNpb25zLlxuICoqL1xuTWFya2Rvd25JdC5wcm90b3R5cGUuY29uZmlndXJlID0gZnVuY3Rpb24gKHByZXNldHMpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXNcblxuICBpZiAodXRpbHMuaXNTdHJpbmcocHJlc2V0cykpIHtcbiAgICBjb25zdCBwcmVzZXROYW1lID0gcHJlc2V0c1xuICAgIHByZXNldHMgPSBjb25maWdbcHJlc2V0TmFtZV1cbiAgICBpZiAoIXByZXNldHMpIHsgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBgbWFya2Rvd24taXRgIHByZXNldCBcIicgKyBwcmVzZXROYW1lICsgJ1wiLCBjaGVjayBuYW1lJykgfVxuICB9XG5cbiAgaWYgKCFwcmVzZXRzKSB7IHRocm93IG5ldyBFcnJvcignV3JvbmcgYG1hcmtkb3duLWl0YCBwcmVzZXQsIGNhblxcJ3QgYmUgZW1wdHknKSB9XG5cbiAgaWYgKHByZXNldHMub3B0aW9ucykgeyBzZWxmLnNldChwcmVzZXRzLm9wdGlvbnMpIH1cblxuICBpZiAocHJlc2V0cy5jb21wb25lbnRzKSB7XG4gICAgT2JqZWN0LmtleXMocHJlc2V0cy5jb21wb25lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBpZiAocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzKSB7XG4gICAgICAgIHNlbGZbbmFtZV0ucnVsZXIuZW5hYmxlT25seShwcmVzZXRzLmNvbXBvbmVudHNbbmFtZV0ucnVsZXMpXG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0cy5jb21wb25lbnRzW25hbWVdLnJ1bGVzMikge1xuICAgICAgICBzZWxmW25hbWVdLnJ1bGVyMi5lbmFibGVPbmx5KHByZXNldHMuY29tcG9uZW50c1tuYW1lXS5ydWxlczIpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogY2hhaW5hYmxlXG4gKiBNYXJrZG93bkl0LmVuYWJsZShsaXN0LCBpZ25vcmVJbnZhbGlkKVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBydWxlIG5hbWUgb3IgbGlzdCBvZiBydWxlIG5hbWVzIHRvIGVuYWJsZVxuICogLSBpZ25vcmVJbnZhbGlkIChCb29sZWFuKTogc2V0IGB0cnVlYCB0byBpZ25vcmUgZXJyb3JzIHdoZW4gcnVsZSBub3QgZm91bmQuXG4gKlxuICogRW5hYmxlIGxpc3Qgb3IgcnVsZXMuIEl0IHdpbGwgYXV0b21hdGljYWxseSBmaW5kIGFwcHJvcHJpYXRlIGNvbXBvbmVudHMsXG4gKiBjb250YWluaW5nIHJ1bGVzIHdpdGggZ2l2ZW4gbmFtZXMuIElmIHJ1bGUgbm90IGZvdW5kLCBhbmQgYGlnbm9yZUludmFsaWRgXG4gKiBub3Qgc2V0IC0gdGhyb3dzIGV4Y2VwdGlvbi5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIG1kID0gcmVxdWlyZSgnbWFya2Rvd24taXQnKSgpXG4gKiAgICAgICAgICAgICAuZW5hYmxlKFsnc3ViJywgJ3N1cCddKVxuICogICAgICAgICAgICAgLmRpc2FibGUoJ3NtYXJ0cXVvdGVzJyk7XG4gKiBgYGBcbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGxldCByZXN1bHQgPSBbXVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBbJ2NvcmUnLCAnYmxvY2snLCAnaW5saW5lJ10uZm9yRWFjaChmdW5jdGlvbiAoY2hhaW4pIHtcbiAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXNbY2hhaW5dLnJ1bGVyLmVuYWJsZShsaXN0LCB0cnVlKSlcbiAgfSwgdGhpcylcblxuICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuaW5saW5lLnJ1bGVyMi5lbmFibGUobGlzdCwgdHJ1ZSkpXG5cbiAgY29uc3QgbWlzc2VkID0gbGlzdC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHJlc3VsdC5pbmRleE9mKG5hbWUpIDwgMCB9KVxuXG4gIGlmIChtaXNzZWQubGVuZ3RoICYmICFpZ25vcmVJbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXJrZG93bkl0LiBGYWlsZWQgdG8gZW5hYmxlIHVua25vd24gcnVsZShzKTogJyArIG1pc3NlZClcbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQuZGlzYWJsZShsaXN0LCBpZ25vcmVJbnZhbGlkKVxuICogLSBsaXN0IChTdHJpbmd8QXJyYXkpOiBydWxlIG5hbWUgb3IgbGlzdCBvZiBydWxlIG5hbWVzIHRvIGRpc2FibGUuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW01hcmtkb3duSXQuZW5hYmxlXV0sIGJ1dCB0dXJuIHNwZWNpZmllZCBydWxlcyBvZmYuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgbGV0IHJlc3VsdCA9IFtdXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIFsnY29yZScsICdibG9jaycsICdpbmxpbmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodGhpc1tjaGFpbl0ucnVsZXIuZGlzYWJsZShsaXN0LCB0cnVlKSlcbiAgfSwgdGhpcylcblxuICByZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuaW5saW5lLnJ1bGVyMi5kaXNhYmxlKGxpc3QsIHRydWUpKVxuXG4gIGNvbnN0IG1pc3NlZCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiByZXN1bHQuaW5kZXhPZihuYW1lKSA8IDAgfSlcblxuICBpZiAobWlzc2VkLmxlbmd0aCAmJiAhaWdub3JlSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWFya2Rvd25JdC4gRmFpbGVkIHRvIGRpc2FibGUgdW5rbm93biBydWxlKHMpOiAnICsgbWlzc2VkKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbi8qKiBjaGFpbmFibGVcbiAqIE1hcmtkb3duSXQudXNlKHBsdWdpbiwgcGFyYW1zKVxuICpcbiAqIExvYWQgc3BlY2lmaWVkIHBsdWdpbiB3aXRoIGdpdmVuIHBhcmFtcyBpbnRvIGN1cnJlbnQgcGFyc2VyIGluc3RhbmNlLlxuICogSXQncyBqdXN0IGEgc3VnYXIgdG8gY2FsbCBgcGx1Z2luKG1kLCBwYXJhbXMpYCB3aXRoIGN1cnJpbmcuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBpdGVyYXRvciA9IHJlcXVpcmUoJ21hcmtkb3duLWl0LWZvci1pbmxpbmUnKTtcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKVxuICogICAgICAgICAgICAgLnVzZShpdGVyYXRvciwgJ2Zvb19yZXBsYWNlJywgJ3RleHQnLCBmdW5jdGlvbiAodG9rZW5zLCBpZHgpIHtcbiAqICAgICAgICAgICAgICAgdG9rZW5zW2lkeF0uY29udGVudCA9IHRva2Vuc1tpZHhdLmNvbnRlbnQucmVwbGFjZSgvZm9vL2csICdiYXInKTtcbiAqICAgICAgICAgICAgIH0pO1xuICogYGBgXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAocGx1Z2luIC8qLCBwYXJhbXMsIC4uLiAqLykge1xuICBjb25zdCBhcmdzID0gW3RoaXNdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKVxuICBwbHVnaW4uYXBwbHkocGx1Z2luLCBhcmdzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKiogaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQucGFyc2Uoc3JjLCBlbnYpIC0+IEFycmF5XG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBQYXJzZSBpbnB1dCBzdHJpbmcgYW5kIHJldHVybiBsaXN0IG9mIGJsb2NrIHRva2VucyAoc3BlY2lhbCB0b2tlbiB0eXBlXG4gKiBcImlubGluZVwiIHdpbGwgY29udGFpbiBsaXN0IG9mIGlubGluZSB0b2tlbnMpLiBZb3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXNcbiAqIG1ldGhvZCBkaXJlY3RseSwgdW50aWwgeW91IHdyaXRlIGN1c3RvbSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIHRvIHByb2R1Y2VcbiAqIEFTVCkuXG4gKlxuICogYGVudmAgaXMgdXNlZCB0byBwYXNzIGRhdGEgYmV0d2VlbiBcImRpc3RyaWJ1dGVkXCIgcnVsZXMgYW5kIHJldHVybiBhZGRpdGlvbmFsXG4gKiBtZXRhZGF0YSBsaWtlIHJlZmVyZW5jZSBpbmZvLCBuZWVkZWQgZm9yIHRoZSByZW5kZXJlci4gSXQgYWxzbyBjYW4gYmUgdXNlZCB0b1xuICogaW5qZWN0IGRhdGEgaW4gc3BlY2lmaWMgY2FzZXMuIFVzdWFsbHksIHlvdSB3aWxsIGJlIG9rIHRvIHBhc3MgYHt9YCxcbiAqIGFuZCB0aGVuIHBhc3MgdXBkYXRlZCBvYmplY3QgdG8gcmVuZGVyZXIuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgc2hvdWxkIGJlIGEgU3RyaW5nJylcbiAgfVxuXG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuY29yZS5TdGF0ZShzcmMsIHRoaXMsIGVudilcblxuICB0aGlzLmNvcmUucHJvY2VzcyhzdGF0ZSlcblxuICByZXR1cm4gc3RhdGUudG9rZW5zXG59XG5cbi8qKlxuICogTWFya2Rvd25JdC5yZW5kZXIoc3JjIFssIGVudl0pIC0+IFN0cmluZ1xuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogUmVuZGVyIG1hcmtkb3duIHN0cmluZyBpbnRvIGh0bWwuIEl0IGRvZXMgYWxsIG1hZ2ljIGZvciB5b3UgOikuXG4gKlxuICogYGVudmAgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGFkZGl0aW9uYWwgbWV0YWRhdGEgKGB7fWAgYnkgZGVmYXVsdCkuXG4gKiBCdXQgeW91IHdpbGwgbm90IG5lZWQgaXQgd2l0aCBoaWdoIHByb2JhYmlsaXR5LiBTZWUgYWxzbyBjb21tZW50XG4gKiBpbiBbW01hcmtkb3duSXQucGFyc2VdXS5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChzcmMsIGVudikge1xuICBlbnYgPSBlbnYgfHwge31cblxuICByZXR1cm4gdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5wYXJzZShzcmMsIGVudiksIHRoaXMub3B0aW9ucywgZW52KVxufVxuXG4vKiogaW50ZXJuYWxcbiAqIE1hcmtkb3duSXQucGFyc2VJbmxpbmUoc3JjLCBlbnYpIC0+IEFycmF5XG4gKiAtIHNyYyAoU3RyaW5nKTogc291cmNlIHN0cmluZ1xuICogLSBlbnYgKE9iamVjdCk6IGVudmlyb25tZW50IHNhbmRib3hcbiAqXG4gKiBUaGUgc2FtZSBhcyBbW01hcmtkb3duSXQucGFyc2VdXSBidXQgc2tpcCBhbGwgYmxvY2sgcnVsZXMuIEl0IHJldHVybnMgdGhlXG4gKiBibG9jayB0b2tlbnMgbGlzdCB3aXRoIHRoZSBzaW5nbGUgYGlubGluZWAgZWxlbWVudCwgY29udGFpbmluZyBwYXJzZWQgaW5saW5lXG4gKiB0b2tlbnMgaW4gYGNoaWxkcmVuYCBwcm9wZXJ0eS4gQWxzbyB1cGRhdGVzIGBlbnZgIG9iamVjdC5cbiAqKi9cbk1hcmtkb3duSXQucHJvdG90eXBlLnBhcnNlSW5saW5lID0gZnVuY3Rpb24gKHNyYywgZW52KSB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IHRoaXMuY29yZS5TdGF0ZShzcmMsIHRoaXMsIGVudilcblxuICBzdGF0ZS5pbmxpbmVNb2RlID0gdHJ1ZVxuICB0aGlzLmNvcmUucHJvY2VzcyhzdGF0ZSlcblxuICByZXR1cm4gc3RhdGUudG9rZW5zXG59XG5cbi8qKlxuICogTWFya2Rvd25JdC5yZW5kZXJJbmxpbmUoc3JjIFssIGVudl0pIC0+IFN0cmluZ1xuICogLSBzcmMgKFN0cmluZyk6IHNvdXJjZSBzdHJpbmdcbiAqIC0gZW52IChPYmplY3QpOiBlbnZpcm9ubWVudCBzYW5kYm94XG4gKlxuICogU2ltaWxhciB0byBbW01hcmtkb3duSXQucmVuZGVyXV0gYnV0IGZvciBzaW5nbGUgcGFyYWdyYXBoIGNvbnRlbnQuIFJlc3VsdFxuICogd2lsbCBOT1QgYmUgd3JhcHBlZCBpbnRvIGA8cD5gIHRhZ3MuXG4gKiovXG5NYXJrZG93bkl0LnByb3RvdHlwZS5yZW5kZXJJbmxpbmUgPSBmdW5jdGlvbiAoc3JjLCBlbnYpIHtcbiAgZW52ID0gZW52IHx8IHt9XG5cbiAgcmV0dXJuIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2VJbmxpbmUoc3JjLCBlbnYpLCB0aGlzLm9wdGlvbnMsIGVudilcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFya2Rvd25JdFxuIiwiLyoqIGludGVybmFsXG4gKiBjbGFzcyBQYXJzZXJCbG9ja1xuICpcbiAqIEJsb2NrLWxldmVsIHRva2VuaXplci5cbiAqKi9cblxuaW1wb3J0IFJ1bGVyIGZyb20gJy4vcnVsZXIubWpzJ1xuaW1wb3J0IFN0YXRlQmxvY2sgZnJvbSAnLi9ydWxlc19ibG9jay9zdGF0ZV9ibG9jay5tanMnXG5cbmltcG9ydCByX3RhYmxlIGZyb20gJy4vcnVsZXNfYmxvY2svdGFibGUubWpzJ1xuaW1wb3J0IHJfY29kZSBmcm9tICcuL3J1bGVzX2Jsb2NrL2NvZGUubWpzJ1xuaW1wb3J0IHJfZmVuY2UgZnJvbSAnLi9ydWxlc19ibG9jay9mZW5jZS5tanMnXG5pbXBvcnQgcl9ibG9ja3F1b3RlIGZyb20gJy4vcnVsZXNfYmxvY2svYmxvY2txdW90ZS5tanMnXG5pbXBvcnQgcl9ociBmcm9tICcuL3J1bGVzX2Jsb2NrL2hyLm1qcydcbmltcG9ydCByX2xpc3QgZnJvbSAnLi9ydWxlc19ibG9jay9saXN0Lm1qcydcbmltcG9ydCByX3JlZmVyZW5jZSBmcm9tICcuL3J1bGVzX2Jsb2NrL3JlZmVyZW5jZS5tanMnXG5pbXBvcnQgcl9odG1sX2Jsb2NrIGZyb20gJy4vcnVsZXNfYmxvY2svaHRtbF9ibG9jay5tanMnXG5pbXBvcnQgcl9oZWFkaW5nIGZyb20gJy4vcnVsZXNfYmxvY2svaGVhZGluZy5tanMnXG5pbXBvcnQgcl9saGVhZGluZyBmcm9tICcuL3J1bGVzX2Jsb2NrL2xoZWFkaW5nLm1qcydcbmltcG9ydCByX3BhcmFncmFwaCBmcm9tICcuL3J1bGVzX2Jsb2NrL3BhcmFncmFwaC5tanMnXG5cbmNvbnN0IF9ydWxlcyA9IFtcbiAgLy8gRmlyc3QgMiBwYXJhbXMgLSBydWxlIG5hbWUgJiBzb3VyY2UuIFNlY29uZGFyeSBhcnJheSAtIGxpc3Qgb2YgcnVsZXMsXG4gIC8vIHdoaWNoIGNhbiBiZSB0ZXJtaW5hdGVkIGJ5IHRoaXMgb25lLlxuICBbJ3RhYmxlJywgICAgICByX3RhYmxlLCAgICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZSddXSxcbiAgWydjb2RlJywgICAgICAgcl9jb2RlXSxcbiAgWydmZW5jZScsICAgICAgcl9mZW5jZSwgICAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZScsICdsaXN0J11dLFxuICBbJ2Jsb2NrcXVvdGUnLCByX2Jsb2NrcXVvdGUsIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJywgJ2xpc3QnXV0sXG4gIFsnaHInLCAgICAgICAgIHJfaHIsICAgICAgICAgWydwYXJhZ3JhcGgnLCAncmVmZXJlbmNlJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCddXSxcbiAgWydsaXN0JywgICAgICAgcl9saXN0LCAgICAgICBbJ3BhcmFncmFwaCcsICdyZWZlcmVuY2UnLCAnYmxvY2txdW90ZSddXSxcbiAgWydyZWZlcmVuY2UnLCAgcl9yZWZlcmVuY2VdLFxuICBbJ2h0bWxfYmxvY2snLCByX2h0bWxfYmxvY2ssIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJ11dLFxuICBbJ2hlYWRpbmcnLCAgICByX2hlYWRpbmcsICAgIFsncGFyYWdyYXBoJywgJ3JlZmVyZW5jZScsICdibG9ja3F1b3RlJ11dLFxuICBbJ2xoZWFkaW5nJywgICByX2xoZWFkaW5nXSxcbiAgWydwYXJhZ3JhcGgnLCAgcl9wYXJhZ3JhcGhdXG5dXG5cbi8qKlxuICogbmV3IFBhcnNlckJsb2NrKClcbiAqKi9cbmZ1bmN0aW9uIFBhcnNlckJsb2NrICgpIHtcbiAgLyoqXG4gICAqIFBhcnNlckJsb2NrI3J1bGVyIC0+IFJ1bGVyXG4gICAqXG4gICAqIFtbUnVsZXJdXSBpbnN0YW5jZS4gS2VlcCBjb25maWd1cmF0aW9uIG9mIGJsb2NrIHJ1bGVzLlxuICAgKiovXG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlci5wdXNoKF9ydWxlc1tpXVswXSwgX3J1bGVzW2ldWzFdLCB7IGFsdDogKF9ydWxlc1tpXVsyXSB8fCBbXSkuc2xpY2UoKSB9KVxuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRva2VucyBmb3IgaW5wdXQgcmFuZ2Vcbi8vXG5QYXJzZXJCbG9jay5wcm90b3R5cGUudG9rZW5pemUgPSBmdW5jdGlvbiAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSkge1xuICBjb25zdCBydWxlcyA9IHRoaXMucnVsZXIuZ2V0UnVsZXMoJycpXG4gIGNvbnN0IGxlbiA9IHJ1bGVzLmxlbmd0aFxuICBjb25zdCBtYXhOZXN0aW5nID0gc3RhdGUubWQub3B0aW9ucy5tYXhOZXN0aW5nXG4gIGxldCBsaW5lID0gc3RhcnRMaW5lXG4gIGxldCBoYXNFbXB0eUxpbmVzID0gZmFsc2VcblxuICB3aGlsZSAobGluZSA8IGVuZExpbmUpIHtcbiAgICBzdGF0ZS5saW5lID0gbGluZSA9IHN0YXRlLnNraXBFbXB0eUxpbmVzKGxpbmUpXG4gICAgaWYgKGxpbmUgPj0gZW5kTGluZSkgeyBicmVhayB9XG5cbiAgICAvLyBUZXJtaW5hdGlvbiBjb25kaXRpb24gZm9yIG5lc3RlZCBjYWxscy5cbiAgICAvLyBOZXN0ZWQgY2FsbHMgY3VycmVudGx5IHVzZWQgZm9yIGJsb2NrcXVvdGVzICYgbGlzdHNcbiAgICBpZiAoc3RhdGUuc0NvdW50W2xpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrIH1cblxuICAgIC8vIElmIG5lc3RpbmcgbGV2ZWwgZXhjZWVkZWQgLSBza2lwIHRhaWwgdG8gdGhlIGVuZC4gVGhhdCdzIG5vdCBvcmRpbmFyeVxuICAgIC8vIHNpdHVhdGlvbiBhbmQgd2Ugc2hvdWxkIG5vdCBjYXJlIGFib3V0IGNvbnRlbnQuXG4gICAgaWYgKHN0YXRlLmxldmVsID49IG1heE5lc3RpbmcpIHtcbiAgICAgIHN0YXRlLmxpbmUgPSBlbmRMaW5lXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIFRyeSBhbGwgcG9zc2libGUgcnVsZXMuXG4gICAgLy8gT24gc3VjY2VzcywgcnVsZSBzaG91bGQ6XG4gICAgLy9cbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUubGluZWBcbiAgICAvLyAtIHVwZGF0ZSBgc3RhdGUudG9rZW5zYFxuICAgIC8vIC0gcmV0dXJuIHRydWVcbiAgICBjb25zdCBwcmV2TGluZSA9IHN0YXRlLmxpbmVcbiAgICBsZXQgb2sgPSBmYWxzZVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgb2sgPSBydWxlc1tpXShzdGF0ZSwgbGluZSwgZW5kTGluZSwgZmFsc2UpXG4gICAgICBpZiAob2spIHtcbiAgICAgICAgaWYgKHByZXZMaW5lID49IHN0YXRlLmxpbmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBydWxlIGRpZG4ndCBpbmNyZW1lbnQgc3RhdGUubGluZVwiKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdXNlciBkaXNhYmxlcyBwYXJhZ3JhcGggcnVsZVxuICAgIGlmICghb2spIHRocm93IG5ldyBFcnJvcignbm9uZSBvZiB0aGUgYmxvY2sgcnVsZXMgbWF0Y2hlZCcpXG5cbiAgICAvLyBzZXQgc3RhdGUudGlnaHQgaWYgd2UgaGFkIGFuIGVtcHR5IGxpbmUgYmVmb3JlIGN1cnJlbnQgdGFnXG4gICAgLy8gaS5lLiBsYXRlc3QgZW1wdHkgbGluZSBzaG91bGQgbm90IGNvdW50XG4gICAgc3RhdGUudGlnaHQgPSAhaGFzRW1wdHlMaW5lc1xuXG4gICAgLy8gcGFyYWdyYXBoIG1pZ2h0IFwiZWF0XCIgb25lIG5ld2xpbmUgYWZ0ZXIgaXQgaW4gbmVzdGVkIGxpc3RzXG4gICAgaWYgKHN0YXRlLmlzRW1wdHkoc3RhdGUubGluZSAtIDEpKSB7XG4gICAgICBoYXNFbXB0eUxpbmVzID0gdHJ1ZVxuICAgIH1cblxuICAgIGxpbmUgPSBzdGF0ZS5saW5lXG5cbiAgICBpZiAobGluZSA8IGVuZExpbmUgJiYgc3RhdGUuaXNFbXB0eShsaW5lKSkge1xuICAgICAgaGFzRW1wdHlMaW5lcyA9IHRydWVcbiAgICAgIGxpbmUrK1xuICAgICAgc3RhdGUubGluZSA9IGxpbmVcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXJCbG9jay5wYXJzZShzdHIsIG1kLCBlbnYsIG91dFRva2VucylcbiAqXG4gKiBQcm9jZXNzIGlucHV0IHN0cmluZyBhbmQgcHVzaCBibG9jayB0b2tlbnMgaW50byBgb3V0VG9rZW5zYFxuICoqL1xuUGFyc2VyQmxvY2sucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHNyYywgbWQsIGVudiwgb3V0VG9rZW5zKSB7XG4gIGlmICghc3JjKSB7IHJldHVybiB9XG5cbiAgY29uc3Qgc3RhdGUgPSBuZXcgdGhpcy5TdGF0ZShzcmMsIG1kLCBlbnYsIG91dFRva2VucylcblxuICB0aGlzLnRva2VuaXplKHN0YXRlLCBzdGF0ZS5saW5lLCBzdGF0ZS5saW5lTWF4KVxufVxuXG5QYXJzZXJCbG9jay5wcm90b3R5cGUuU3RhdGUgPSBTdGF0ZUJsb2NrXG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlckJsb2NrXG4iLCIvKiogaW50ZXJuYWxcbiAqIGNsYXNzIENvcmVcbiAqXG4gKiBUb3AtbGV2ZWwgcnVsZXMgZXhlY3V0b3IuIEdsdWVzIGJsb2NrL2lubGluZSBwYXJzZXJzIGFuZCBkb2VzIGludGVybWVkaWF0ZVxuICogdHJhbnNmb3JtYXRpb25zLlxuICoqL1xuXG5pbXBvcnQgUnVsZXIgZnJvbSAnLi9ydWxlci5tanMnXG5pbXBvcnQgU3RhdGVDb3JlIGZyb20gJy4vcnVsZXNfY29yZS9zdGF0ZV9jb3JlLm1qcydcblxuaW1wb3J0IHJfbm9ybWFsaXplIGZyb20gJy4vcnVsZXNfY29yZS9ub3JtYWxpemUubWpzJ1xuaW1wb3J0IHJfYmxvY2sgZnJvbSAnLi9ydWxlc19jb3JlL2Jsb2NrLm1qcydcbmltcG9ydCByX2lubGluZSBmcm9tICcuL3J1bGVzX2NvcmUvaW5saW5lLm1qcydcbmltcG9ydCByX2xpbmtpZnkgZnJvbSAnLi9ydWxlc19jb3JlL2xpbmtpZnkubWpzJ1xuaW1wb3J0IHJfcmVwbGFjZW1lbnRzIGZyb20gJy4vcnVsZXNfY29yZS9yZXBsYWNlbWVudHMubWpzJ1xuaW1wb3J0IHJfc21hcnRxdW90ZXMgZnJvbSAnLi9ydWxlc19jb3JlL3NtYXJ0cXVvdGVzLm1qcydcbmltcG9ydCByX3RleHRfam9pbiBmcm9tICcuL3J1bGVzX2NvcmUvdGV4dF9qb2luLm1qcydcblxuY29uc3QgX3J1bGVzID0gW1xuICBbJ25vcm1hbGl6ZScsICAgICAgcl9ub3JtYWxpemVdLFxuICBbJ2Jsb2NrJywgICAgICAgICAgcl9ibG9ja10sXG4gIFsnaW5saW5lJywgICAgICAgICByX2lubGluZV0sXG4gIFsnbGlua2lmeScsICAgICAgICByX2xpbmtpZnldLFxuICBbJ3JlcGxhY2VtZW50cycsICAgcl9yZXBsYWNlbWVudHNdLFxuICBbJ3NtYXJ0cXVvdGVzJywgICAgcl9zbWFydHF1b3Rlc10sXG4gIC8vIGB0ZXh0X2pvaW5gIGZpbmRzIGB0ZXh0X3NwZWNpYWxgIHRva2VucyAoZm9yIGVzY2FwZSBzZXF1ZW5jZXMpXG4gIC8vIGFuZCBqb2lucyB0aGVtIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHRleHRcbiAgWyd0ZXh0X2pvaW4nLCAgICAgIHJfdGV4dF9qb2luXVxuXVxuXG4vKipcbiAqIG5ldyBDb3JlKClcbiAqKi9cbmZ1bmN0aW9uIENvcmUgKCkge1xuICAvKipcbiAgICogQ29yZSNydWxlciAtPiBSdWxlclxuICAgKlxuICAgKiBbW1J1bGVyXV0gaW5zdGFuY2UuIEtlZXAgY29uZmlndXJhdGlvbiBvZiBjb3JlIHJ1bGVzLlxuICAgKiovXG4gIHRoaXMucnVsZXIgPSBuZXcgUnVsZXIoKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlci5wdXNoKF9ydWxlc1tpXVswXSwgX3J1bGVzW2ldWzFdKVxuICB9XG59XG5cbi8qKlxuICogQ29yZS5wcm9jZXNzKHN0YXRlKVxuICpcbiAqIEV4ZWN1dGVzIGNvcmUgY2hhaW4gcnVsZXMuXG4gKiovXG5Db3JlLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlci5nZXRSdWxlcygnJylcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHJ1bGVzW2ldKHN0YXRlKVxuICB9XG59XG5cbkNvcmUucHJvdG90eXBlLlN0YXRlID0gU3RhdGVDb3JlXG5cbmV4cG9ydCBkZWZhdWx0IENvcmVcbiIsIi8qKiBpbnRlcm5hbFxuICogY2xhc3MgUGFyc2VySW5saW5lXG4gKlxuICogVG9rZW5pemVzIHBhcmFncmFwaCBjb250ZW50LlxuICoqL1xuXG5pbXBvcnQgUnVsZXIgZnJvbSAnLi9ydWxlci5tanMnXG5pbXBvcnQgU3RhdGVJbmxpbmUgZnJvbSAnLi9ydWxlc19pbmxpbmUvc3RhdGVfaW5saW5lLm1qcydcblxuaW1wb3J0IHJfdGV4dCBmcm9tICcuL3J1bGVzX2lubGluZS90ZXh0Lm1qcydcbmltcG9ydCByX2xpbmtpZnkgZnJvbSAnLi9ydWxlc19pbmxpbmUvbGlua2lmeS5tanMnXG5pbXBvcnQgcl9uZXdsaW5lIGZyb20gJy4vcnVsZXNfaW5saW5lL25ld2xpbmUubWpzJ1xuaW1wb3J0IHJfZXNjYXBlIGZyb20gJy4vcnVsZXNfaW5saW5lL2VzY2FwZS5tanMnXG5pbXBvcnQgcl9iYWNrdGlja3MgZnJvbSAnLi9ydWxlc19pbmxpbmUvYmFja3RpY2tzLm1qcydcbmltcG9ydCByX3N0cmlrZXRocm91Z2ggZnJvbSAnLi9ydWxlc19pbmxpbmUvc3RyaWtldGhyb3VnaC5tanMnXG5pbXBvcnQgcl9lbXBoYXNpcyBmcm9tICcuL3J1bGVzX2lubGluZS9lbXBoYXNpcy5tanMnXG5pbXBvcnQgcl9saW5rIGZyb20gJy4vcnVsZXNfaW5saW5lL2xpbmsubWpzJ1xuaW1wb3J0IHJfaW1hZ2UgZnJvbSAnLi9ydWxlc19pbmxpbmUvaW1hZ2UubWpzJ1xuaW1wb3J0IHJfYXV0b2xpbmsgZnJvbSAnLi9ydWxlc19pbmxpbmUvYXV0b2xpbmsubWpzJ1xuaW1wb3J0IHJfaHRtbF9pbmxpbmUgZnJvbSAnLi9ydWxlc19pbmxpbmUvaHRtbF9pbmxpbmUubWpzJ1xuaW1wb3J0IHJfZW50aXR5IGZyb20gJy4vcnVsZXNfaW5saW5lL2VudGl0eS5tanMnXG5cbmltcG9ydCByX2JhbGFuY2VfcGFpcnMgZnJvbSAnLi9ydWxlc19pbmxpbmUvYmFsYW5jZV9wYWlycy5tanMnXG5pbXBvcnQgcl9mcmFnbWVudHNfam9pbiBmcm9tICcuL3J1bGVzX2lubGluZS9mcmFnbWVudHNfam9pbi5tanMnXG5cbi8vIFBhcnNlciBydWxlc1xuXG5jb25zdCBfcnVsZXMgPSBbXG4gIFsndGV4dCcsICAgICAgICAgICAgcl90ZXh0XSxcbiAgWydsaW5raWZ5JywgICAgICAgICByX2xpbmtpZnldLFxuICBbJ25ld2xpbmUnLCAgICAgICAgIHJfbmV3bGluZV0sXG4gIFsnZXNjYXBlJywgICAgICAgICAgcl9lc2NhcGVdLFxuICBbJ2JhY2t0aWNrcycsICAgICAgIHJfYmFja3RpY2tzXSxcbiAgWydzdHJpa2V0aHJvdWdoJywgICByX3N0cmlrZXRocm91Z2gudG9rZW5pemVdLFxuICBbJ2VtcGhhc2lzJywgICAgICAgIHJfZW1waGFzaXMudG9rZW5pemVdLFxuICBbJ2xpbmsnLCAgICAgICAgICAgIHJfbGlua10sXG4gIFsnaW1hZ2UnLCAgICAgICAgICAgcl9pbWFnZV0sXG4gIFsnYXV0b2xpbmsnLCAgICAgICAgcl9hdXRvbGlua10sXG4gIFsnaHRtbF9pbmxpbmUnLCAgICAgcl9odG1sX2lubGluZV0sXG4gIFsnZW50aXR5JywgICAgICAgICAgcl9lbnRpdHldXG5dXG5cbi8vIGBydWxlMmAgcnVsZXNldCB3YXMgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIGVtcGhhc2lzL3N0cmlrZXRocm91Z2hcbi8vIHBvc3QtcHJvY2Vzc2luZyBhbmQgbWF5IGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBEb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgZXhjZXB0IHBhaXJzIChwbHVnaW5zIHdvcmtpbmcgd2l0aCBgYmFsYW5jZV9wYWlyc2ApLlxuLy9cbmNvbnN0IF9ydWxlczIgPSBbXG4gIFsnYmFsYW5jZV9wYWlycycsICAgcl9iYWxhbmNlX3BhaXJzXSxcbiAgWydzdHJpa2V0aHJvdWdoJywgICByX3N0cmlrZXRocm91Z2gucG9zdFByb2Nlc3NdLFxuICBbJ2VtcGhhc2lzJywgICAgICAgIHJfZW1waGFzaXMucG9zdFByb2Nlc3NdLFxuICAvLyBydWxlcyBmb3IgcGFpcnMgc2VwYXJhdGUgJyoqJyBpbnRvIGl0cyBvd24gdGV4dCB0b2tlbnMsIHdoaWNoIG1heSBiZSBsZWZ0IHVudXNlZCxcbiAgLy8gcnVsZSBiZWxvdyBtZXJnZXMgdW51c2VkIHNlZ21lbnRzIGJhY2sgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGV4dFxuICBbJ2ZyYWdtZW50c19qb2luJywgIHJfZnJhZ21lbnRzX2pvaW5dXG5dXG5cbi8qKlxuICogbmV3IFBhcnNlcklubGluZSgpXG4gKiovXG5mdW5jdGlvbiBQYXJzZXJJbmxpbmUgKCkge1xuICAvKipcbiAgICogUGFyc2VySW5saW5lI3J1bGVyIC0+IFJ1bGVyXG4gICAqXG4gICAqIFtbUnVsZXJdXSBpbnN0YW5jZS4gS2VlcCBjb25maWd1cmF0aW9uIG9mIGlubGluZSBydWxlcy5cbiAgICoqL1xuICB0aGlzLnJ1bGVyID0gbmV3IFJ1bGVyKClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IF9ydWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMucnVsZXIucHVzaChfcnVsZXNbaV1bMF0sIF9ydWxlc1tpXVsxXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXJJbmxpbmUjcnVsZXIyIC0+IFJ1bGVyXG4gICAqXG4gICAqIFtbUnVsZXJdXSBpbnN0YW5jZS4gU2Vjb25kIHJ1bGVyIHVzZWQgZm9yIHBvc3QtcHJvY2Vzc2luZ1xuICAgKiAoZS5nLiBpbiBlbXBoYXNpcy1saWtlIHJ1bGVzKS5cbiAgICoqL1xuICB0aGlzLnJ1bGVyMiA9IG5ldyBSdWxlcigpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBfcnVsZXMyLmxlbmd0aDsgaSsrKSB7XG4gICAgdGhpcy5ydWxlcjIucHVzaChfcnVsZXMyW2ldWzBdLCBfcnVsZXMyW2ldWzFdKVxuICB9XG59XG5cbi8vIFNraXAgc2luZ2xlIHRva2VuIGJ5IHJ1bm5pbmcgYWxsIHJ1bGVzIGluIHZhbGlkYXRpb24gbW9kZTtcbi8vIHJldHVybnMgYHRydWVgIGlmIGFueSBydWxlIHJlcG9ydGVkIHN1Y2Nlc3Ncbi8vXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLnNraXBUb2tlbiA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICBjb25zdCBwb3MgPSBzdGF0ZS5wb3NcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcbiAgY29uc3QgbWF4TmVzdGluZyA9IHN0YXRlLm1kLm9wdGlvbnMubWF4TmVzdGluZ1xuICBjb25zdCBjYWNoZSA9IHN0YXRlLmNhY2hlXG5cbiAgaWYgKHR5cGVvZiBjYWNoZVtwb3NdICE9PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXRlLnBvcyA9IGNhY2hlW3Bvc11cbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBvayA9IGZhbHNlXG5cbiAgaWYgKHN0YXRlLmxldmVsIDwgbWF4TmVzdGluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIC8vIEluY3JlbWVudCBzdGF0ZS5sZXZlbCBhbmQgZGVjcmVtZW50IGl0IGxhdGVyIHRvIGxpbWl0IHJlY3Vyc2lvbi5cbiAgICAgIC8vIEl0J3MgaGFybWxlc3MgdG8gZG8gaGVyZSwgYmVjYXVzZSBubyB0b2tlbnMgYXJlIGNyZWF0ZWQuIEJ1dCBpZGVhbGx5LFxuICAgICAgLy8gd2UnZCBuZWVkIGEgc2VwYXJhdGUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZSBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgLy9cbiAgICAgIHN0YXRlLmxldmVsKytcbiAgICAgIG9rID0gcnVsZXNbaV0oc3RhdGUsIHRydWUpXG4gICAgICBzdGF0ZS5sZXZlbC0tXG5cbiAgICAgIGlmIChvaykge1xuICAgICAgICBpZiAocG9zID49IHN0YXRlLnBvcykgeyB0aHJvdyBuZXcgRXJyb3IoXCJpbmxpbmUgcnVsZSBkaWRuJ3QgaW5jcmVtZW50IHN0YXRlLnBvc1wiKSB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRvbyBtdWNoIG5lc3RpbmcsIGp1c3Qgc2tpcCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwYXJhZ3JhcGguXG4gICAgLy9cbiAgICAvLyBOT1RFOiB0aGlzIHdpbGwgY2F1c2UgbGlua3MgdG8gYmVoYXZlIGluY29ycmVjdGx5IGluIHRoZSBmb2xsb3dpbmcgY2FzZSxcbiAgICAvLyAgICAgICB3aGVuIGFuIGFtb3VudCBvZiBgW2AgaXMgZXhhY3RseSBlcXVhbCB0byBgbWF4TmVzdGluZyArIDFgOlxuICAgIC8vXG4gICAgLy8gICAgICAgW1tbW1tbW1tbW1tbW1tbW1tbW1tbZm9vXSgpXG4gICAgLy9cbiAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyB3b3JrYXJvdW5kIHdoZW4gQ00gc3RhbmRhcmQgd2lsbCBhbGxvdyBuZXN0ZWQgbGlua3NcbiAgICAvLyAgICAgICAod2UgY2FuIHJlcGxhY2UgaXQgYnkgcHJldmVudGluZyBsaW5rcyBmcm9tIGJlaW5nIHBhcnNlZCBpblxuICAgIC8vICAgICAgIHZhbGlkYXRpb24gbW9kZSlcbiAgICAvL1xuICAgIHN0YXRlLnBvcyA9IHN0YXRlLnBvc01heFxuICB9XG5cbiAgaWYgKCFvaykgeyBzdGF0ZS5wb3MrKyB9XG4gIGNhY2hlW3Bvc10gPSBzdGF0ZS5wb3Ncbn1cblxuLy8gR2VuZXJhdGUgdG9rZW5zIGZvciBpbnB1dCByYW5nZVxuLy9cblBhcnNlcklubGluZS5wcm90b3R5cGUudG9rZW5pemUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVyLmdldFJ1bGVzKCcnKVxuICBjb25zdCBsZW4gPSBydWxlcy5sZW5ndGhcbiAgY29uc3QgZW5kID0gc3RhdGUucG9zTWF4XG4gIGNvbnN0IG1heE5lc3RpbmcgPSBzdGF0ZS5tZC5vcHRpb25zLm1heE5lc3RpbmdcblxuICB3aGlsZSAoc3RhdGUucG9zIDwgZW5kKSB7XG4gICAgLy8gVHJ5IGFsbCBwb3NzaWJsZSBydWxlcy5cbiAgICAvLyBPbiBzdWNjZXNzLCBydWxlIHNob3VsZDpcbiAgICAvL1xuICAgIC8vIC0gdXBkYXRlIGBzdGF0ZS5wb3NgXG4gICAgLy8gLSB1cGRhdGUgYHN0YXRlLnRva2Vuc2BcbiAgICAvLyAtIHJldHVybiB0cnVlXG4gICAgY29uc3QgcHJldlBvcyA9IHN0YXRlLnBvc1xuICAgIGxldCBvayA9IGZhbHNlXG5cbiAgICBpZiAoc3RhdGUubGV2ZWwgPCBtYXhOZXN0aW5nKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIG9rID0gcnVsZXNbaV0oc3RhdGUsIGZhbHNlKVxuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBpZiAocHJldlBvcyA+PSBzdGF0ZS5wb3MpIHsgdGhyb3cgbmV3IEVycm9yKFwiaW5saW5lIHJ1bGUgZGlkbid0IGluY3JlbWVudCBzdGF0ZS5wb3NcIikgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob2spIHtcbiAgICAgIGlmIChzdGF0ZS5wb3MgPj0gZW5kKSB7IGJyZWFrIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmNbc3RhdGUucG9zKytdXG4gIH1cblxuICBpZiAoc3RhdGUucGVuZGluZykge1xuICAgIHN0YXRlLnB1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcklubGluZS5wYXJzZShzdHIsIG1kLCBlbnYsIG91dFRva2VucylcbiAqXG4gKiBQcm9jZXNzIGlucHV0IHN0cmluZyBhbmQgcHVzaCBpbmxpbmUgdG9rZW5zIGludG8gYG91dFRva2Vuc2BcbiAqKi9cblBhcnNlcklubGluZS5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc3RyLCBtZCwgZW52LCBvdXRUb2tlbnMpIHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgdGhpcy5TdGF0ZShzdHIsIG1kLCBlbnYsIG91dFRva2VucylcblxuICB0aGlzLnRva2VuaXplKHN0YXRlKVxuXG4gIGNvbnN0IHJ1bGVzID0gdGhpcy5ydWxlcjIuZ2V0UnVsZXMoJycpXG4gIGNvbnN0IGxlbiA9IHJ1bGVzLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBydWxlc1tpXShzdGF0ZSlcbiAgfVxufVxuXG5QYXJzZXJJbmxpbmUucHJvdG90eXBlLlN0YXRlID0gU3RhdGVJbmxpbmVcblxuZXhwb3J0IGRlZmF1bHQgUGFyc2VySW5saW5lXG4iLCIvLyBDb21tb25tYXJrIGRlZmF1bHQgb3B0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9wdGlvbnM6IHtcbiAgICAvLyBFbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZVxuICAgIGh0bWw6IHRydWUsXG5cbiAgICAvLyBVc2UgJy8nIHRvIGNsb3NlIHNpbmdsZSB0YWdzICg8YnIgLz4pXG4gICAgeGh0bWxPdXQ6IHRydWUsXG5cbiAgICAvLyBDb252ZXJ0ICdcXG4nIGluIHBhcmFncmFwaHMgaW50byA8YnI+XG4gICAgYnJlYWtzOiBmYWxzZSxcblxuICAgIC8vIENTUyBsYW5ndWFnZSBwcmVmaXggZm9yIGZlbmNlZCBibG9ja3NcbiAgICBsYW5nUHJlZml4OiAnbGFuZ3VhZ2UtJyxcblxuICAgIC8vIGF1dG9jb252ZXJ0IFVSTC1saWtlIHRleHRzIHRvIGxpbmtzXG4gICAgbGlua2lmeTogZmFsc2UsXG5cbiAgICAvLyBFbmFibGUgc29tZSBsYW5ndWFnZS1uZXV0cmFsIHJlcGxhY2VtZW50cyArIHF1b3RlcyBiZWF1dGlmaWNhdGlvblxuICAgIHR5cG9ncmFwaGVyOiBmYWxzZSxcblxuICAgIC8vIERvdWJsZSArIHNpbmdsZSBxdW90ZXMgcmVwbGFjZW1lbnQgcGFpcnMsIHdoZW4gdHlwb2dyYXBoZXIgZW5hYmxlZCxcbiAgICAvLyBhbmQgc21hcnRxdW90ZXMgb24uIENvdWxkIGJlIGVpdGhlciBhIFN0cmluZyBvciBhbiBBcnJheS5cbiAgICAvL1xuICAgIC8vIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSAnwqvCu+KAnuKAnCcgZm9yIFJ1c3NpYW4sICfigJ7igJzigJrigJgnIGZvciBHZXJtYW4sXG4gICAgLy8gYW5kIFsnwqtcXHhBMCcsICdcXHhBMMK7JywgJ+KAuVxceEEwJywgJ1xceEEw4oC6J10gZm9yIEZyZW5jaCAoaW5jbHVkaW5nIG5ic3ApLlxuICAgIHF1b3RlczogJ1xcdTIwMWNcXHUyMDFkXFx1MjAxOFxcdTIwMTknLCAvKiDigJzigJ3igJjigJkgKi9cblxuICAgIC8vIEhpZ2hsaWdodGVyIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIGVzY2FwZWQgSFRNTCxcbiAgICAvLyBvciAnJyBpZiB0aGUgc291cmNlIHN0cmluZyBpcyBub3QgY2hhbmdlZCBhbmQgc2hvdWxkIGJlIGVzY2FwZWQgZXh0ZXJuYWx5LlxuICAgIC8vIElmIHJlc3VsdCBzdGFydHMgd2l0aCA8cHJlLi4uIGludGVybmFsIHdyYXBwZXIgaXMgc2tpcHBlZC5cbiAgICAvL1xuICAgIC8vIGZ1bmN0aW9uICgvKnN0ciwgbGFuZyovKSB7IHJldHVybiAnJzsgfVxuICAgIC8vXG4gICAgaGlnaGxpZ2h0OiBudWxsLFxuXG4gICAgLy8gSW50ZXJuYWwgcHJvdGVjdGlvbiwgcmVjdXJzaW9uIGxpbWl0XG4gICAgbWF4TmVzdGluZzogMjBcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG5cbiAgICBjb3JlOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgJ2Jsb2NrJyxcbiAgICAgICAgJ2lubGluZScsXG4gICAgICAgICd0ZXh0X2pvaW4nXG4gICAgICBdXG4gICAgfSxcblxuICAgIGJsb2NrOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAnYmxvY2txdW90ZScsXG4gICAgICAgICdjb2RlJyxcbiAgICAgICAgJ2ZlbmNlJyxcbiAgICAgICAgJ2hlYWRpbmcnLFxuICAgICAgICAnaHInLFxuICAgICAgICAnaHRtbF9ibG9jaycsXG4gICAgICAgICdsaGVhZGluZycsXG4gICAgICAgICdsaXN0JyxcbiAgICAgICAgJ3JlZmVyZW5jZScsXG4gICAgICAgICdwYXJhZ3JhcGgnXG4gICAgICBdXG4gICAgfSxcblxuICAgIGlubGluZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ2F1dG9saW5rJyxcbiAgICAgICAgJ2JhY2t0aWNrcycsXG4gICAgICAgICdlbXBoYXNpcycsXG4gICAgICAgICdlbnRpdHknLFxuICAgICAgICAnZXNjYXBlJyxcbiAgICAgICAgJ2h0bWxfaW5saW5lJyxcbiAgICAgICAgJ2ltYWdlJyxcbiAgICAgICAgJ2xpbmsnLFxuICAgICAgICAnbmV3bGluZScsXG4gICAgICAgICd0ZXh0J1xuICAgICAgXSxcbiAgICAgIHJ1bGVzMjogW1xuICAgICAgICAnYmFsYW5jZV9wYWlycycsXG4gICAgICAgICdlbXBoYXNpcycsXG4gICAgICAgICdmcmFnbWVudHNfam9pbidcbiAgICAgIF1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIG1hcmtkb3duLWl0IGRlZmF1bHQgb3B0aW9uc1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9wdGlvbnM6IHtcbiAgICAvLyBFbmFibGUgSFRNTCB0YWdzIGluIHNvdXJjZVxuICAgIGh0bWw6IGZhbHNlLFxuXG4gICAgLy8gVXNlICcvJyB0byBjbG9zZSBzaW5nbGUgdGFncyAoPGJyIC8+KVxuICAgIHhodG1sT3V0OiBmYWxzZSxcblxuICAgIC8vIENvbnZlcnQgJ1xcbicgaW4gcGFyYWdyYXBocyBpbnRvIDxicj5cbiAgICBicmVha3M6IGZhbHNlLFxuXG4gICAgLy8gQ1NTIGxhbmd1YWdlIHByZWZpeCBmb3IgZmVuY2VkIGJsb2Nrc1xuICAgIGxhbmdQcmVmaXg6ICdsYW5ndWFnZS0nLFxuXG4gICAgLy8gYXV0b2NvbnZlcnQgVVJMLWxpa2UgdGV4dHMgdG8gbGlua3NcbiAgICBsaW5raWZ5OiBmYWxzZSxcblxuICAgIC8vIEVuYWJsZSBzb21lIGxhbmd1YWdlLW5ldXRyYWwgcmVwbGFjZW1lbnRzICsgcXVvdGVzIGJlYXV0aWZpY2F0aW9uXG4gICAgdHlwb2dyYXBoZXI6IGZhbHNlLFxuXG4gICAgLy8gRG91YmxlICsgc2luZ2xlIHF1b3RlcyByZXBsYWNlbWVudCBwYWlycywgd2hlbiB0eXBvZ3JhcGhlciBlbmFibGVkLFxuICAgIC8vIGFuZCBzbWFydHF1b3RlcyBvbi4gQ291bGQgYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGFuIEFycmF5LlxuICAgIC8vXG4gICAgLy8gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlICfCq8K74oCe4oCcJyBmb3IgUnVzc2lhbiwgJ+KAnuKAnOKAmuKAmCcgZm9yIEdlcm1hbixcbiAgICAvLyBhbmQgWyfCq1xceEEwJywgJ1xceEEwwrsnLCAn4oC5XFx4QTAnLCAnXFx4QTDigLonXSBmb3IgRnJlbmNoIChpbmNsdWRpbmcgbmJzcCkuXG4gICAgcXVvdGVzOiAnXFx1MjAxY1xcdTIwMWRcXHUyMDE4XFx1MjAxOScsIC8qIOKAnOKAneKAmOKAmSAqL1xuXG4gICAgLy8gSGlnaGxpZ2h0ZXIgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gZXNjYXBlZCBIVE1MLFxuICAgIC8vIG9yICcnIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIG5vdCBjaGFuZ2VkIGFuZCBzaG91bGQgYmUgZXNjYXBlZCBleHRlcm5hbHkuXG4gICAgLy8gSWYgcmVzdWx0IHN0YXJ0cyB3aXRoIDxwcmUuLi4gaW50ZXJuYWwgd3JhcHBlciBpcyBza2lwcGVkLlxuICAgIC8vXG4gICAgLy8gZnVuY3Rpb24gKC8qc3RyLCBsYW5nKi8pIHsgcmV0dXJuICcnOyB9XG4gICAgLy9cbiAgICBoaWdobGlnaHQ6IG51bGwsXG5cbiAgICAvLyBJbnRlcm5hbCBwcm90ZWN0aW9uLCByZWN1cnNpb24gbGltaXRcbiAgICBtYXhOZXN0aW5nOiAxMDBcbiAgfSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgY29yZToge30sXG4gICAgYmxvY2s6IHt9LFxuICAgIGlubGluZToge31cbiAgfVxufVxuIiwiLy8gXCJaZXJvXCIgcHJlc2V0LCB3aXRoIG5vdGhpbmcgZW5hYmxlZC4gVXNlZnVsIGZvciBtYW51YWwgY29uZmlndXJpbmcgb2Ygc2ltcGxlXG4vLyBtb2Rlcy4gRm9yIGV4YW1wbGUsIHRvIHBhcnNlIGJvbGQvaXRhbGljIG9ubHkuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb3B0aW9uczoge1xuICAgIC8vIEVuYWJsZSBIVE1MIHRhZ3MgaW4gc291cmNlXG4gICAgaHRtbDogZmFsc2UsXG5cbiAgICAvLyBVc2UgJy8nIHRvIGNsb3NlIHNpbmdsZSB0YWdzICg8YnIgLz4pXG4gICAgeGh0bWxPdXQ6IGZhbHNlLFxuXG4gICAgLy8gQ29udmVydCAnXFxuJyBpbiBwYXJhZ3JhcGhzIGludG8gPGJyPlxuICAgIGJyZWFrczogZmFsc2UsXG5cbiAgICAvLyBDU1MgbGFuZ3VhZ2UgcHJlZml4IGZvciBmZW5jZWQgYmxvY2tzXG4gICAgbGFuZ1ByZWZpeDogJ2xhbmd1YWdlLScsXG5cbiAgICAvLyBhdXRvY29udmVydCBVUkwtbGlrZSB0ZXh0cyB0byBsaW5rc1xuICAgIGxpbmtpZnk6IGZhbHNlLFxuXG4gICAgLy8gRW5hYmxlIHNvbWUgbGFuZ3VhZ2UtbmV1dHJhbCByZXBsYWNlbWVudHMgKyBxdW90ZXMgYmVhdXRpZmljYXRpb25cbiAgICB0eXBvZ3JhcGhlcjogZmFsc2UsXG5cbiAgICAvLyBEb3VibGUgKyBzaW5nbGUgcXVvdGVzIHJlcGxhY2VtZW50IHBhaXJzLCB3aGVuIHR5cG9ncmFwaGVyIGVuYWJsZWQsXG4gICAgLy8gYW5kIHNtYXJ0cXVvdGVzIG9uLiBDb3VsZCBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYW4gQXJyYXkuXG4gICAgLy9cbiAgICAvLyBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgJ8KrwrvigJ7igJwnIGZvciBSdXNzaWFuLCAn4oCe4oCc4oCa4oCYJyBmb3IgR2VybWFuLFxuICAgIC8vIGFuZCBbJ8KrXFx4QTAnLCAnXFx4QTDCuycsICfigLlcXHhBMCcsICdcXHhBMOKAuiddIGZvciBGcmVuY2ggKGluY2x1ZGluZyBuYnNwKS5cbiAgICBxdW90ZXM6ICdcXHUyMDFjXFx1MjAxZFxcdTIwMThcXHUyMDE5JywgLyog4oCc4oCd4oCY4oCZICovXG5cbiAgICAvLyBIaWdobGlnaHRlciBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiBlc2NhcGVkIEhUTUwsXG4gICAgLy8gb3IgJycgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgbm90IGNoYW5nZWQgYW5kIHNob3VsZCBiZSBlc2NhcGVkIGV4dGVybmFseS5cbiAgICAvLyBJZiByZXN1bHQgc3RhcnRzIHdpdGggPHByZS4uLiBpbnRlcm5hbCB3cmFwcGVyIGlzIHNraXBwZWQuXG4gICAgLy9cbiAgICAvLyBmdW5jdGlvbiAoLypzdHIsIGxhbmcqLykgeyByZXR1cm4gJyc7IH1cbiAgICAvL1xuICAgIGhpZ2hsaWdodDogbnVsbCxcblxuICAgIC8vIEludGVybmFsIHByb3RlY3Rpb24sIHJlY3Vyc2lvbiBsaW1pdFxuICAgIG1heE5lc3Rpbmc6IDIwXG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuXG4gICAgY29yZToge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdibG9jaycsXG4gICAgICAgICdpbmxpbmUnLFxuICAgICAgICAndGV4dF9qb2luJ1xuICAgICAgXVxuICAgIH0sXG5cbiAgICBibG9jazoge1xuICAgICAgcnVsZXM6IFtcbiAgICAgICAgJ3BhcmFncmFwaCdcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgaW5saW5lOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICAndGV4dCdcbiAgICAgIF0sXG4gICAgICBydWxlczI6IFtcbiAgICAgICAgJ2JhbGFuY2VfcGFpcnMnLFxuICAgICAgICAnZnJhZ21lbnRzX2pvaW4nXG4gICAgICBdXG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIGNsYXNzIFJlbmRlcmVyXG4gKlxuICogR2VuZXJhdGVzIEhUTUwgZnJvbSBwYXJzZWQgdG9rZW4gc3RyZWFtLiBFYWNoIGluc3RhbmNlIGhhcyBpbmRlcGVuZGVudFxuICogY29weSBvZiBydWxlcy4gVGhvc2UgY2FuIGJlIHJld3JpdHRlbiB3aXRoIGVhc2UuIEFsc28sIHlvdSBjYW4gYWRkIG5ld1xuICogcnVsZXMgaWYgeW91IGNyZWF0ZSBwbHVnaW4gYW5kIGFkZHMgbmV3IHRva2VuIHR5cGVzLlxuICoqL1xuXG5pbXBvcnQgeyBhc3NpZ24sIHVuZXNjYXBlQWxsLCBlc2NhcGVIdG1sIH0gZnJvbSAnLi9jb21tb24vdXRpbHMubWpzJ1xuXG5jb25zdCBkZWZhdWx0X3J1bGVzID0ge31cblxuZGVmYXVsdF9ydWxlcy5jb2RlX2lubGluZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucywgZW52LCBzbGYpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuXG4gIHJldHVybiAgJzxjb2RlJyArIHNsZi5yZW5kZXJBdHRycyh0b2tlbikgKyAnPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwodG9rZW4uY29udGVudCkgK1xuICAgICAgICAgICc8L2NvZGU+J1xufVxuXG5kZWZhdWx0X3J1bGVzLmNvZGVfYmxvY2sgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2xmKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cblxuICByZXR1cm4gICc8cHJlJyArIHNsZi5yZW5kZXJBdHRycyh0b2tlbikgKyAnPjxjb2RlPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwodG9rZW5zW2lkeF0uY29udGVudCkgK1xuICAgICAgICAgICc8L2NvZGU+PC9wcmU+XFxuJ1xufVxuXG5kZWZhdWx0X3J1bGVzLmZlbmNlID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHNsZikge1xuICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpZHhdXG4gIGNvbnN0IGluZm8gPSB0b2tlbi5pbmZvID8gdW5lc2NhcGVBbGwodG9rZW4uaW5mbykudHJpbSgpIDogJydcbiAgbGV0IGxhbmdOYW1lID0gJydcbiAgbGV0IGxhbmdBdHRycyA9ICcnXG5cbiAgaWYgKGluZm8pIHtcbiAgICBjb25zdCBhcnIgPSBpbmZvLnNwbGl0KC8oXFxzKykvZylcbiAgICBsYW5nTmFtZSA9IGFyclswXVxuICAgIGxhbmdBdHRycyA9IGFyci5zbGljZSgyKS5qb2luKCcnKVxuICB9XG5cbiAgbGV0IGhpZ2hsaWdodGVkXG4gIGlmIChvcHRpb25zLmhpZ2hsaWdodCkge1xuICAgIGhpZ2hsaWdodGVkID0gb3B0aW9ucy5oaWdobGlnaHQodG9rZW4uY29udGVudCwgbGFuZ05hbWUsIGxhbmdBdHRycykgfHwgZXNjYXBlSHRtbCh0b2tlbi5jb250ZW50KVxuICB9IGVsc2Uge1xuICAgIGhpZ2hsaWdodGVkID0gZXNjYXBlSHRtbCh0b2tlbi5jb250ZW50KVxuICB9XG5cbiAgaWYgKGhpZ2hsaWdodGVkLmluZGV4T2YoJzxwcmUnKSA9PT0gMCkge1xuICAgIHJldHVybiBoaWdobGlnaHRlZCArICdcXG4nXG4gIH1cblxuICAvLyBJZiBsYW5ndWFnZSBleGlzdHMsIGluamVjdCBjbGFzcyBnZW50bHksIHdpdGhvdXQgbW9kaWZ5aW5nIG9yaWdpbmFsIHRva2VuLlxuICAvLyBNYXkgYmUsIG9uZSBkYXkgd2Ugd2lsbCBhZGQgLmRlZXBDbG9uZSgpIGZvciB0b2tlbiBhbmQgc2ltcGxpZnkgdGhpcyBwYXJ0LCBidXRcbiAgLy8gbm93IHdlIHByZWZlciB0byBrZWVwIHRoaW5ncyBsb2NhbC5cbiAgaWYgKGluZm8pIHtcbiAgICBjb25zdCBpID0gdG9rZW4uYXR0ckluZGV4KCdjbGFzcycpXG4gICAgY29uc3QgdG1wQXR0cnMgPSB0b2tlbi5hdHRycyA/IHRva2VuLmF0dHJzLnNsaWNlKCkgOiBbXVxuXG4gICAgaWYgKGkgPCAwKSB7XG4gICAgICB0bXBBdHRycy5wdXNoKFsnY2xhc3MnLCBvcHRpb25zLmxhbmdQcmVmaXggKyBsYW5nTmFtZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRtcEF0dHJzW2ldID0gdG1wQXR0cnNbaV0uc2xpY2UoKVxuICAgICAgdG1wQXR0cnNbaV1bMV0gKz0gJyAnICsgb3B0aW9ucy5sYW5nUHJlZml4ICsgbGFuZ05hbWVcbiAgICB9XG5cbiAgICAvLyBGYWtlIHRva2VuIGp1c3QgdG8gcmVuZGVyIGF0dHJpYnV0ZXNcbiAgICBjb25zdCB0bXBUb2tlbiA9IHtcbiAgICAgIGF0dHJzOiB0bXBBdHRyc1xuICAgIH1cblxuICAgIHJldHVybiBgPHByZT48Y29kZSR7c2xmLnJlbmRlckF0dHJzKHRtcFRva2VuKX0+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+XFxuYFxuICB9XG5cbiAgcmV0dXJuIGA8cHJlPjxjb2RlJHtzbGYucmVuZGVyQXR0cnModG9rZW4pfT4ke2hpZ2hsaWdodGVkfTwvY29kZT48L3ByZT5cXG5gXG59XG5cbmRlZmF1bHRfcnVsZXMuaW1hZ2UgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMsIGVudiwgc2xmKSB7XG4gIGNvbnN0IHRva2VuID0gdG9rZW5zW2lkeF1cblxuICAvLyBcImFsdFwiIGF0dHIgTVVTVCBiZSBzZXQsIGV2ZW4gaWYgZW1wdHkuIEJlY2F1c2UgaXQncyBtYW5kYXRvcnkgYW5kXG4gIC8vIHNob3VsZCBiZSBwbGFjZWQgb24gcHJvcGVyIHBvc2l0aW9uIGZvciB0ZXN0cy5cbiAgLy9cbiAgLy8gUmVwbGFjZSBjb250ZW50IHdpdGggYWN0dWFsIHZhbHVlXG5cbiAgdG9rZW4uYXR0cnNbdG9rZW4uYXR0ckluZGV4KCdhbHQnKV1bMV0gPVxuICAgIHNsZi5yZW5kZXJJbmxpbmVBc1RleHQodG9rZW4uY2hpbGRyZW4sIG9wdGlvbnMsIGVudilcblxuICByZXR1cm4gc2xmLnJlbmRlclRva2VuKHRva2VucywgaWR4LCBvcHRpb25zKVxufVxuXG5kZWZhdWx0X3J1bGVzLmhhcmRicmVhayA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCwgb3B0aW9ucyAvKiwgZW52ICovKSB7XG4gIHJldHVybiBvcHRpb25zLnhodG1sT3V0ID8gJzxiciAvPlxcbicgOiAnPGJyPlxcbidcbn1cbmRlZmF1bHRfcnVsZXMuc29mdGJyZWFrID0gZnVuY3Rpb24gKHRva2VucywgaWR4LCBvcHRpb25zIC8qLCBlbnYgKi8pIHtcbiAgcmV0dXJuIG9wdGlvbnMuYnJlYWtzID8gKG9wdGlvbnMueGh0bWxPdXQgPyAnPGJyIC8+XFxuJyA6ICc8YnI+XFxuJykgOiAnXFxuJ1xufVxuXG5kZWZhdWx0X3J1bGVzLnRleHQgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gZXNjYXBlSHRtbCh0b2tlbnNbaWR4XS5jb250ZW50KVxufVxuXG5kZWZhdWx0X3J1bGVzLmh0bWxfYmxvY2sgPSBmdW5jdGlvbiAodG9rZW5zLCBpZHggLyosIG9wdGlvbnMsIGVudiAqLykge1xuICByZXR1cm4gdG9rZW5zW2lkeF0uY29udGVudFxufVxuZGVmYXVsdF9ydWxlcy5odG1sX2lubGluZSA9IGZ1bmN0aW9uICh0b2tlbnMsIGlkeCAvKiwgb3B0aW9ucywgZW52ICovKSB7XG4gIHJldHVybiB0b2tlbnNbaWR4XS5jb250ZW50XG59XG5cbi8qKlxuICogbmV3IFJlbmRlcmVyKClcbiAqXG4gKiBDcmVhdGVzIG5ldyBbW1JlbmRlcmVyXV0gaW5zdGFuY2UgYW5kIGZpbGwgW1tSZW5kZXJlciNydWxlc11dIHdpdGggZGVmYXVsdHMuXG4gKiovXG5mdW5jdGlvbiBSZW5kZXJlciAoKSB7XG4gIC8qKlxuICAgKiBSZW5kZXJlciNydWxlcyAtPiBPYmplY3RcbiAgICpcbiAgICogQ29udGFpbnMgcmVuZGVyIHJ1bGVzIGZvciB0b2tlbnMuIENhbiBiZSB1cGRhdGVkIGFuZCBleHRlbmRlZC5cbiAgICpcbiAgICogIyMjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAgICpcbiAgICogbWQucmVuZGVyZXIucnVsZXMuc3Ryb25nX29wZW4gID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJzxiPic7IH07XG4gICAqIG1kLnJlbmRlcmVyLnJ1bGVzLnN0cm9uZ19jbG9zZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICc8L2I+JzsgfTtcbiAgICpcbiAgICogdmFyIHJlc3VsdCA9IG1kLnJlbmRlcklubGluZSguLi4pO1xuICAgKiBgYGBcbiAgICpcbiAgICogRWFjaCBydWxlIGlzIGNhbGxlZCBhcyBpbmRlcGVuZGVudCBzdGF0aWMgZnVuY3Rpb24gd2l0aCBmaXhlZCBzaWduYXR1cmU6XG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogZnVuY3Rpb24gbXlfdG9rZW5fcmVuZGVyKHRva2VucywgaWR4LCBvcHRpb25zLCBlbnYsIHJlbmRlcmVyKSB7XG4gICAqICAgLy8gLi4uXG4gICAqICAgcmV0dXJuIHJlbmRlcmVkSFRNTDtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIFtzb3VyY2UgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0L2Jsb2IvbWFzdGVyL2xpYi9yZW5kZXJlci5tanMpXG4gICAqIGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzLlxuICAgKiovXG4gIHRoaXMucnVsZXMgPSBhc3NpZ24oe30sIGRlZmF1bHRfcnVsZXMpXG59XG5cbi8qKlxuICogUmVuZGVyZXIucmVuZGVyQXR0cnModG9rZW4pIC0+IFN0cmluZ1xuICpcbiAqIFJlbmRlciB0b2tlbiBhdHRyaWJ1dGVzIHRvIHN0cmluZy5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJBdHRycyA9IGZ1bmN0aW9uIHJlbmRlckF0dHJzICh0b2tlbikge1xuICBsZXQgaSwgbCwgcmVzdWx0XG5cbiAgaWYgKCF0b2tlbi5hdHRycykgeyByZXR1cm4gJycgfVxuXG4gIHJlc3VsdCA9ICcnXG5cbiAgZm9yIChpID0gMCwgbCA9IHRva2VuLmF0dHJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHJlc3VsdCArPSAnICcgKyBlc2NhcGVIdG1sKHRva2VuLmF0dHJzW2ldWzBdKSArICc9XCInICsgZXNjYXBlSHRtbCh0b2tlbi5hdHRyc1tpXVsxXSkgKyAnXCInXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVuZGVyZXIucmVuZGVyVG9rZW4odG9rZW5zLCBpZHgsIG9wdGlvbnMpIC0+IFN0cmluZ1xuICogLSB0b2tlbnMgKEFycmF5KTogbGlzdCBvZiB0b2tlbnNcbiAqIC0gaWR4IChOdW1iZWQpOiB0b2tlbiBpbmRleCB0byByZW5kZXJcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcGFyYW1zIG9mIHBhcnNlciBpbnN0YW5jZVxuICpcbiAqIERlZmF1bHQgdG9rZW4gcmVuZGVyZXIuIENhbiBiZSBvdmVycmlkZW4gYnkgY3VzdG9tIGZ1bmN0aW9uXG4gKiBpbiBbW1JlbmRlcmVyI3J1bGVzXV0uXG4gKiovXG5SZW5kZXJlci5wcm90b3R5cGUucmVuZGVyVG9rZW4gPSBmdW5jdGlvbiByZW5kZXJUb2tlbiAodG9rZW5zLCBpZHgsIG9wdGlvbnMpIHtcbiAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaWR4XVxuICBsZXQgcmVzdWx0ID0gJydcblxuICAvLyBUaWdodCBsaXN0IHBhcmFncmFwaHNcbiAgaWYgKHRva2VuLmhpZGRlbikge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIGhpZGRlbiBwYXJhZ3JhcGggYW5kIHN1YnNlcXVlbnQgb3BlbmluZ1xuICAvLyBibG9jay1sZXZlbCB0YWcuXG4gIC8vXG4gIC8vIEZvciBleGFtcGxlLCBoZXJlIHdlIHNob3VsZCBpbnNlcnQgYSBuZXdsaW5lIGJlZm9yZSBibG9ja3F1b3RlOlxuICAvLyAgLSBhXG4gIC8vICAgID5cbiAgLy9cbiAgaWYgKHRva2VuLmJsb2NrICYmIHRva2VuLm5lc3RpbmcgIT09IC0xICYmIGlkeCAmJiB0b2tlbnNbaWR4IC0gMV0uaGlkZGVuKSB7XG4gICAgcmVzdWx0ICs9ICdcXG4nXG4gIH1cblxuICAvLyBBZGQgdG9rZW4gbmFtZSwgZS5nLiBgPGltZ2BcbiAgcmVzdWx0ICs9ICh0b2tlbi5uZXN0aW5nID09PSAtMSA/ICc8LycgOiAnPCcpICsgdG9rZW4udGFnXG5cbiAgLy8gRW5jb2RlIGF0dHJpYnV0ZXMsIGUuZy4gYDxpbWcgc3JjPVwiZm9vXCJgXG4gIHJlc3VsdCArPSB0aGlzLnJlbmRlckF0dHJzKHRva2VuKVxuXG4gIC8vIEFkZCBhIHNsYXNoIGZvciBzZWxmLWNsb3NpbmcgdGFncywgZS5nLiBgPGltZyBzcmM9XCJmb29cIiAvYFxuICBpZiAodG9rZW4ubmVzdGluZyA9PT0gMCAmJiBvcHRpb25zLnhodG1sT3V0KSB7XG4gICAgcmVzdWx0ICs9ICcgLydcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gYWRkIGEgbmV3bGluZSBhZnRlciB0aGlzIHRhZ1xuICBsZXQgbmVlZExmID0gZmFsc2VcbiAgaWYgKHRva2VuLmJsb2NrKSB7XG4gICAgbmVlZExmID0gdHJ1ZVxuXG4gICAgaWYgKHRva2VuLm5lc3RpbmcgPT09IDEpIHtcbiAgICAgIGlmIChpZHggKyAxIDwgdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXh0VG9rZW4gPSB0b2tlbnNbaWR4ICsgMV1cblxuICAgICAgICBpZiAobmV4dFRva2VuLnR5cGUgPT09ICdpbmxpbmUnIHx8IG5leHRUb2tlbi5oaWRkZW4pIHtcbiAgICAgICAgICAvLyBCbG9jay1sZXZlbCB0YWcgY29udGFpbmluZyBhbiBpbmxpbmUgdGFnLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmVlZExmID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIGlmIChuZXh0VG9rZW4ubmVzdGluZyA9PT0gLTEgJiYgbmV4dFRva2VuLnRhZyA9PT0gdG9rZW4udGFnKSB7XG4gICAgICAgICAgLy8gT3BlbmluZyB0YWcgKyBjbG9zaW5nIHRhZyBvZiB0aGUgc2FtZSB0eXBlLiBFLmcuIGA8bGk+PC9saT5gLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmVlZExmID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc3VsdCArPSBuZWVkTGYgPyAnPlxcbicgOiAnPidcblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVuZGVyZXIucmVuZGVySW5saW5lKHRva2Vucywgb3B0aW9ucywgZW52KSAtPiBTdHJpbmdcbiAqIC0gdG9rZW5zIChBcnJheSk6IGxpc3Qgb24gYmxvY2sgdG9rZW5zIHRvIHJlbmRlclxuICogLSBvcHRpb25zIChPYmplY3QpOiBwYXJhbXMgb2YgcGFyc2VyIGluc3RhbmNlXG4gKiAtIGVudiAoT2JqZWN0KTogYWRkaXRpb25hbCBkYXRhIGZyb20gcGFyc2VkIGlucHV0IChyZWZlcmVuY2VzLCBmb3IgZXhhbXBsZSlcbiAqXG4gKiBUaGUgc2FtZSBhcyBbW1JlbmRlcmVyLnJlbmRlcl1dLCBidXQgZm9yIHNpbmdsZSB0b2tlbiBvZiBgaW5saW5lYCB0eXBlLlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlcklubGluZSA9IGZ1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMsIGVudikge1xuICBsZXQgcmVzdWx0ID0gJydcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVzXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0b2tlbnNbaV0udHlwZVxuXG4gICAgaWYgKHR5cGVvZiBydWxlc1t0eXBlXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJlc3VsdCArPSBydWxlc1t0eXBlXSh0b2tlbnMsIGksIG9wdGlvbnMsIGVudiwgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IHRoaXMucmVuZGVyVG9rZW4odG9rZW5zLCBpLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqIGludGVybmFsXG4gKiBSZW5kZXJlci5yZW5kZXJJbmxpbmVBc1RleHQodG9rZW5zLCBvcHRpb25zLCBlbnYpIC0+IFN0cmluZ1xuICogLSB0b2tlbnMgKEFycmF5KTogbGlzdCBvbiBibG9jayB0b2tlbnMgdG8gcmVuZGVyXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHBhcmFtcyBvZiBwYXJzZXIgaW5zdGFuY2VcbiAqIC0gZW52IChPYmplY3QpOiBhZGRpdGlvbmFsIGRhdGEgZnJvbSBwYXJzZWQgaW5wdXQgKHJlZmVyZW5jZXMsIGZvciBleGFtcGxlKVxuICpcbiAqIFNwZWNpYWwga2x1ZGdlIGZvciBpbWFnZSBgYWx0YCBhdHRyaWJ1dGVzIHRvIGNvbmZvcm0gQ29tbW9uTWFyayBzcGVjLlxuICogRG9uJ3QgdHJ5IHRvIHVzZSBpdCEgU3BlYyByZXF1aXJlcyB0byBzaG93IGBhbHRgIGNvbnRlbnQgd2l0aCBzdHJpcHBlZCBtYXJrdXAsXG4gKiBpbnN0ZWFkIG9mIHNpbXBsZSBlc2NhcGluZy5cbiAqKi9cblJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJJbmxpbmVBc1RleHQgPSBmdW5jdGlvbiAodG9rZW5zLCBvcHRpb25zLCBlbnYpIHtcbiAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAodG9rZW5zW2ldLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICByZXN1bHQgKz0gdG9rZW5zW2ldLmNvbnRlbnRcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgcmVzdWx0ICs9IHRoaXMucmVuZGVySW5saW5lQXNUZXh0KHRva2Vuc1tpXS5jaGlsZHJlbiwgb3B0aW9ucywgZW52KVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnaHRtbF9pbmxpbmUnOlxuICAgICAgY2FzZSAnaHRtbF9ibG9jayc6XG4gICAgICAgIHJlc3VsdCArPSB0b2tlbnNbaV0uY29udGVudFxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc29mdGJyZWFrJzpcbiAgICAgIGNhc2UgJ2hhcmRicmVhayc6XG4gICAgICAgIHJlc3VsdCArPSAnXFxuJ1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gYWxsIG90aGVyIHRva2VucyBhcmUgc2tpcHBlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSZW5kZXJlci5yZW5kZXIodG9rZW5zLCBvcHRpb25zLCBlbnYpIC0+IFN0cmluZ1xuICogLSB0b2tlbnMgKEFycmF5KTogbGlzdCBvbiBibG9jayB0b2tlbnMgdG8gcmVuZGVyXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHBhcmFtcyBvZiBwYXJzZXIgaW5zdGFuY2VcbiAqIC0gZW52IChPYmplY3QpOiBhZGRpdGlvbmFsIGRhdGEgZnJvbSBwYXJzZWQgaW5wdXQgKHJlZmVyZW5jZXMsIGZvciBleGFtcGxlKVxuICpcbiAqIFRha2VzIHRva2VuIHN0cmVhbSBhbmQgZ2VuZXJhdGVzIEhUTUwuIFByb2JhYmx5LCB5b3Ugd2lsbCBuZXZlciBuZWVkIHRvIGNhbGxcbiAqIHRoaXMgbWV0aG9kIGRpcmVjdGx5LlxuICoqL1xuUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMsIGVudikge1xuICBsZXQgcmVzdWx0ID0gJydcbiAgY29uc3QgcnVsZXMgPSB0aGlzLnJ1bGVzXG5cbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHR5cGUgPSB0b2tlbnNbaV0udHlwZVxuXG4gICAgaWYgKHR5cGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5yZW5kZXJJbmxpbmUodG9rZW5zW2ldLmNoaWxkcmVuLCBvcHRpb25zLCBlbnYpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcnVsZXNbdHlwZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQgKz0gcnVsZXNbdHlwZV0odG9rZW5zLCBpLCBvcHRpb25zLCBlbnYsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCArPSB0aGlzLnJlbmRlclRva2VuKHRva2VucywgaSwgb3B0aW9ucywgZW52KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyZXJcbiIsIi8qKlxuICogY2xhc3MgUnVsZXJcbiAqXG4gKiBIZWxwZXIgY2xhc3MsIHVzZWQgYnkgW1tNYXJrZG93bkl0I2NvcmVdXSwgW1tNYXJrZG93bkl0I2Jsb2NrXV0gYW5kXG4gKiBbW01hcmtkb3duSXQjaW5saW5lXV0gdG8gbWFuYWdlIHNlcXVlbmNlcyBvZiBmdW5jdGlvbnMgKHJ1bGVzKTpcbiAqXG4gKiAtIGtlZXAgcnVsZXMgaW4gZGVmaW5lZCBvcmRlclxuICogLSBhc3NpZ24gdGhlIG5hbWUgdG8gZWFjaCBydWxlXG4gKiAtIGVuYWJsZS9kaXNhYmxlIHJ1bGVzXG4gKiAtIGFkZC9yZXBsYWNlIHJ1bGVzXG4gKiAtIGFsbG93IGFzc2lnbiBydWxlcyB0byBhZGRpdGlvbmFsIG5hbWVkIGNoYWlucyAoaW4gdGhlIHNhbWUpXG4gKiAtIGNhY2hlaW5nIGxpc3RzIG9mIGFjdGl2ZSBydWxlc1xuICpcbiAqIFlvdSB3aWxsIG5vdCBuZWVkIHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5IHVudGlsIHdyaXRlIHBsdWdpbnMuIEZvciBzaW1wbGVcbiAqIHJ1bGVzIGNvbnRyb2wgdXNlIFtbTWFya2Rvd25JdC5kaXNhYmxlXV0sIFtbTWFya2Rvd25JdC5lbmFibGVdXSBhbmRcbiAqIFtbTWFya2Rvd25JdC51c2VdXS5cbiAqKi9cblxuLyoqXG4gKiBuZXcgUnVsZXIoKVxuICoqL1xuZnVuY3Rpb24gUnVsZXIgKCkge1xuICAvLyBMaXN0IG9mIGFkZGVkIHJ1bGVzLiBFYWNoIGVsZW1lbnQgaXM6XG4gIC8vXG4gIC8vIHtcbiAgLy8gICBuYW1lOiBYWFgsXG4gIC8vICAgZW5hYmxlZDogQm9vbGVhbixcbiAgLy8gICBmbjogRnVuY3Rpb24oKSxcbiAgLy8gICBhbHQ6IFsgbmFtZTIsIG5hbWUzIF1cbiAgLy8gfVxuICAvL1xuICB0aGlzLl9fcnVsZXNfXyA9IFtdXG5cbiAgLy8gQ2FjaGVkIHJ1bGUgY2hhaW5zLlxuICAvL1xuICAvLyBGaXJzdCBsZXZlbCAtIGNoYWluIG5hbWUsICcnIGZvciBkZWZhdWx0LlxuICAvLyBTZWNvbmQgbGV2ZWwgLSBkaWdpbmFsIGFuY2hvciBmb3IgZmFzdCBmaWx0ZXJpbmcgYnkgY2hhcmNvZGVzLlxuICAvL1xuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLy8gSGVscGVyIG1ldGhvZHMsIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseVxuXG4vLyBGaW5kIHJ1bGUgaW5kZXggYnkgbmFtZVxuLy9cblJ1bGVyLnByb3RvdHlwZS5fX2ZpbmRfXyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fX3J1bGVzX18ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodGhpcy5fX3J1bGVzX19baV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbi8vIEJ1aWxkIHJ1bGVzIGxvb2t1cCBjYWNoZVxuLy9cblJ1bGVyLnByb3RvdHlwZS5fX2NvbXBpbGVfXyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgY29uc3QgY2hhaW5zID0gWycnXVxuXG4gIC8vIGNvbGxlY3QgdW5pcXVlIG5hbWVzXG4gIHNlbGYuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHtcbiAgICBpZiAoIXJ1bGUuZW5hYmxlZCkgeyByZXR1cm4gfVxuXG4gICAgcnVsZS5hbHQuZm9yRWFjaChmdW5jdGlvbiAoYWx0TmFtZSkge1xuICAgICAgaWYgKGNoYWlucy5pbmRleE9mKGFsdE5hbWUpIDwgMCkge1xuICAgICAgICBjaGFpbnMucHVzaChhbHROYW1lKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgc2VsZi5fX2NhY2hlX18gPSB7fVxuXG4gIGNoYWlucy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFpbikge1xuICAgIHNlbGYuX19jYWNoZV9fW2NoYWluXSA9IFtdXG4gICAgc2VsZi5fX3J1bGVzX18uZm9yRWFjaChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgaWYgKCFydWxlLmVuYWJsZWQpIHsgcmV0dXJuIH1cblxuICAgICAgaWYgKGNoYWluICYmIHJ1bGUuYWx0LmluZGV4T2YoY2hhaW4pIDwgMCkgeyByZXR1cm4gfVxuXG4gICAgICBzZWxmLl9fY2FjaGVfX1tjaGFpbl0ucHVzaChydWxlLmZuKVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogUnVsZXIuYXQobmFtZSwgZm4gWywgb3B0aW9uc10pXG4gKiAtIG5hbWUgKFN0cmluZyk6IHJ1bGUgbmFtZSB0byByZXBsYWNlLlxuICogLSBmbiAoRnVuY3Rpb24pOiBuZXcgcnVsZSBmdW5jdGlvbi5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogbmV3IHJ1bGUgb3B0aW9ucyAobm90IG1hbmRhdG9yeSkuXG4gKlxuICogUmVwbGFjZSBydWxlIGJ5IG5hbWUgd2l0aCBuZXcgZnVuY3Rpb24gJiBvcHRpb25zLiBUaHJvd3MgZXJyb3IgaWYgbmFtZSBub3RcbiAqIGZvdW5kLlxuICpcbiAqICMjIyMjIE9wdGlvbnM6XG4gKlxuICogLSBfX2FsdF9fIC0gYXJyYXkgd2l0aCBuYW1lcyBvZiBcImFsdGVybmF0ZVwiIGNoYWlucy5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogUmVwbGFjZSBleGlzdGluZyB0eXBvZ3JhcGhlciByZXBsYWNlbWVudCBydWxlIHdpdGggbmV3IG9uZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuY29yZS5ydWxlci5hdCgncmVwbGFjZW1lbnRzJywgZnVuY3Rpb24gcmVwbGFjZShzdGF0ZSkge1xuICogICAvLy4uLlxuICogfSk7XG4gKiBgYGBcbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIChuYW1lLCBmbiwgb3B0aW9ucykge1xuICBjb25zdCBpbmRleCA9IHRoaXMuX19maW5kX18obmFtZSlcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICcgKyBuYW1lKSB9XG5cbiAgdGhpcy5fX3J1bGVzX19baW5kZXhdLmZuID0gZm5cbiAgdGhpcy5fX3J1bGVzX19baW5kZXhdLmFsdCA9IG9wdC5hbHQgfHwgW11cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG59XG5cbi8qKlxuICogUnVsZXIuYmVmb3JlKGJlZm9yZU5hbWUsIHJ1bGVOYW1lLCBmbiBbLCBvcHRpb25zXSlcbiAqIC0gYmVmb3JlTmFtZSAoU3RyaW5nKTogbmV3IHJ1bGUgd2lsbCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBvbmUuXG4gKiAtIHJ1bGVOYW1lIChTdHJpbmcpOiBuYW1lIG9mIGFkZGVkIHJ1bGUuXG4gKiAtIGZuIChGdW5jdGlvbik6IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHJ1bGUgb3B0aW9ucyAobm90IG1hbmRhdG9yeSkuXG4gKlxuICogQWRkIG5ldyBydWxlIHRvIGNoYWluIGJlZm9yZSBvbmUgd2l0aCBnaXZlbiBuYW1lLiBTZWUgYWxzb1xuICogW1tSdWxlci5hZnRlcl1dLCBbW1J1bGVyLnB1c2hdXS5cbiAqXG4gKiAjIyMjIyBPcHRpb25zOlxuICpcbiAqIC0gX19hbHRfXyAtIGFycmF5IHdpdGggbmFtZXMgb2YgXCJhbHRlcm5hdGVcIiBjaGFpbnMuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiBtZC5ibG9jay5ydWxlci5iZWZvcmUoJ3BhcmFncmFwaCcsICdteV9ydWxlJywgZnVuY3Rpb24gcmVwbGFjZShzdGF0ZSkge1xuICogICAvLy4uLlxuICogfSk7XG4gKiBgYGBcbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5iZWZvcmUgPSBmdW5jdGlvbiAoYmVmb3JlTmFtZSwgcnVsZU5hbWUsIGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IGluZGV4ID0gdGhpcy5fX2ZpbmRfXyhiZWZvcmVOYW1lKVxuICBjb25zdCBvcHQgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKGluZGV4ID09PSAtMSkgeyB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNlciBydWxlIG5vdCBmb3VuZDogJyArIGJlZm9yZU5hbWUpIH1cblxuICB0aGlzLl9fcnVsZXNfXy5zcGxpY2UoaW5kZXgsIDAsIHtcbiAgICBuYW1lOiBydWxlTmFtZSxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGZuLFxuICAgIGFsdDogb3B0LmFsdCB8fCBbXVxuICB9KVxuXG4gIHRoaXMuX19jYWNoZV9fID0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bGVyLmFmdGVyKGFmdGVyTmFtZSwgcnVsZU5hbWUsIGZuIFssIG9wdGlvbnNdKVxuICogLSBhZnRlck5hbWUgKFN0cmluZyk6IG5ldyBydWxlIHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhpcyBvbmUuXG4gKiAtIHJ1bGVOYW1lIChTdHJpbmcpOiBuYW1lIG9mIGFkZGVkIHJ1bGUuXG4gKiAtIGZuIChGdW5jdGlvbik6IHJ1bGUgZnVuY3Rpb24uXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHJ1bGUgb3B0aW9ucyAobm90IG1hbmRhdG9yeSkuXG4gKlxuICogQWRkIG5ldyBydWxlIHRvIGNoYWluIGFmdGVyIG9uZSB3aXRoIGdpdmVuIG5hbWUuIFNlZSBhbHNvXG4gKiBbW1J1bGVyLmJlZm9yZV1dLCBbW1J1bGVyLnB1c2hdXS5cbiAqXG4gKiAjIyMjIyBPcHRpb25zOlxuICpcbiAqIC0gX19hbHRfXyAtIGFycmF5IHdpdGggbmFtZXMgb2YgXCJhbHRlcm5hdGVcIiBjaGFpbnMuXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBtZCA9IHJlcXVpcmUoJ21hcmtkb3duLWl0JykoKTtcbiAqXG4gKiBtZC5pbmxpbmUucnVsZXIuYWZ0ZXIoJ3RleHQnLCAnbXlfcnVsZScsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RhdGUpIHtcbiAqICAgLy8uLi5cbiAqIH0pO1xuICogYGBgXG4gKiovXG5SdWxlci5wcm90b3R5cGUuYWZ0ZXIgPSBmdW5jdGlvbiAoYWZ0ZXJOYW1lLCBydWxlTmFtZSwgZm4sIG9wdGlvbnMpIHtcbiAgY29uc3QgaW5kZXggPSB0aGlzLl9fZmluZF9fKGFmdGVyTmFtZSlcbiAgY29uc3Qgb3B0ID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHsgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICcgKyBhZnRlck5hbWUpIH1cblxuICB0aGlzLl9fcnVsZXNfXy5zcGxpY2UoaW5kZXggKyAxLCAwLCB7XG4gICAgbmFtZTogcnVsZU5hbWUsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBmbixcbiAgICBhbHQ6IG9wdC5hbHQgfHwgW11cbiAgfSlcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLyoqXG4gKiBSdWxlci5wdXNoKHJ1bGVOYW1lLCBmbiBbLCBvcHRpb25zXSlcbiAqIC0gcnVsZU5hbWUgKFN0cmluZyk6IG5hbWUgb2YgYWRkZWQgcnVsZS5cbiAqIC0gZm4gKEZ1bmN0aW9uKTogcnVsZSBmdW5jdGlvbi5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogcnVsZSBvcHRpb25zIChub3QgbWFuZGF0b3J5KS5cbiAqXG4gKiBQdXNoIG5ldyBydWxlIHRvIHRoZSBlbmQgb2YgY2hhaW4uIFNlZSBhbHNvXG4gKiBbW1J1bGVyLmJlZm9yZV1dLCBbW1J1bGVyLmFmdGVyXV0uXG4gKlxuICogIyMjIyMgT3B0aW9uczpcbiAqXG4gKiAtIF9fYWx0X18gLSBhcnJheSB3aXRoIG5hbWVzIG9mIFwiYWx0ZXJuYXRlXCIgY2hhaW5zLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgbWQgPSByZXF1aXJlKCdtYXJrZG93bi1pdCcpKCk7XG4gKlxuICogbWQuY29yZS5ydWxlci5wdXNoKCdteV9ydWxlJywgZnVuY3Rpb24gcmVwbGFjZShzdGF0ZSkge1xuICogICAvLy4uLlxuICogfSk7XG4gKiBgYGBcbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHJ1bGVOYW1lLCBmbiwgb3B0aW9ucykge1xuICBjb25zdCBvcHQgPSBvcHRpb25zIHx8IHt9XG5cbiAgdGhpcy5fX3J1bGVzX18ucHVzaCh7XG4gICAgbmFtZTogcnVsZU5hbWUsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBmbixcbiAgICBhbHQ6IG9wdC5hbHQgfHwgW11cbiAgfSlcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbn1cblxuLyoqXG4gKiBSdWxlci5lbmFibGUobGlzdCBbLCBpZ25vcmVJbnZhbGlkXSkgLT4gQXJyYXlcbiAqIC0gbGlzdCAoU3RyaW5nfEFycmF5KTogbGlzdCBvZiBydWxlIG5hbWVzIHRvIGVuYWJsZS5cbiAqIC0gaWdub3JlSW52YWxpZCAoQm9vbGVhbik6IHNldCBgdHJ1ZWAgdG8gaWdub3JlIGVycm9ycyB3aGVuIHJ1bGUgbm90IGZvdW5kLlxuICpcbiAqIEVuYWJsZSBydWxlcyB3aXRoIGdpdmVuIG5hbWVzLiBJZiBhbnkgcnVsZSBuYW1lIG5vdCBmb3VuZCAtIHRocm93IEVycm9yLlxuICogRXJyb3JzIGNhbiBiZSBkaXNhYmxlZCBieSBzZWNvbmQgcGFyYW0uXG4gKlxuICogUmV0dXJucyBsaXN0IG9mIGZvdW5kIHJ1bGUgbmFtZXMgKGlmIG5vIGV4Y2VwdGlvbiBoYXBwZW5lZCkuXG4gKlxuICogU2VlIGFsc28gW1tSdWxlci5kaXNhYmxlXV0sIFtbUnVsZXIuZW5hYmxlT25seV1dLlxuICoqL1xuUnVsZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChsaXN0LCBpZ25vcmVJbnZhbGlkKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkgeyBsaXN0ID0gW2xpc3RdIH1cblxuICBjb25zdCByZXN1bHQgPSBbXVxuXG4gIC8vIFNlYXJjaCBieSBuYW1lIGFuZCBlbmFibGVcbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fX2ZpbmRfXyhuYW1lKVxuXG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIGlmIChpZ25vcmVJbnZhbGlkKSB7IHJldHVybiB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bGVzIG1hbmFnZXI6IGludmFsaWQgcnVsZSBuYW1lICcgKyBuYW1lKVxuICAgIH1cbiAgICB0aGlzLl9fcnVsZXNfX1tpZHhdLmVuYWJsZWQgPSB0cnVlXG4gICAgcmVzdWx0LnB1c2gobmFtZSlcbiAgfSwgdGhpcylcblxuICB0aGlzLl9fY2FjaGVfXyA9IG51bGxcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJ1bGVyLmVuYWJsZU9ubHkobGlzdCBbLCBpZ25vcmVJbnZhbGlkXSlcbiAqIC0gbGlzdCAoU3RyaW5nfEFycmF5KTogbGlzdCBvZiBydWxlIG5hbWVzIHRvIGVuYWJsZSAod2hpdGVsaXN0KS5cbiAqIC0gaWdub3JlSW52YWxpZCAoQm9vbGVhbik6IHNldCBgdHJ1ZWAgdG8gaWdub3JlIGVycm9ycyB3aGVuIHJ1bGUgbm90IGZvdW5kLlxuICpcbiAqIEVuYWJsZSBydWxlcyB3aXRoIGdpdmVuIG5hbWVzLCBhbmQgZGlzYWJsZSBldmVyeXRoaW5nIGVsc2UuIElmIGFueSBydWxlIG5hbWVcbiAqIG5vdCBmb3VuZCAtIHRocm93IEVycm9yLiBFcnJvcnMgY2FuIGJlIGRpc2FibGVkIGJ5IHNlY29uZCBwYXJhbS5cbiAqXG4gKiBTZWUgYWxzbyBbW1J1bGVyLmRpc2FibGVdXSwgW1tSdWxlci5lbmFibGVdXS5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5lbmFibGVPbmx5ID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIHRoaXMuX19ydWxlc19fLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUpIHsgcnVsZS5lbmFibGVkID0gZmFsc2UgfSlcblxuICB0aGlzLmVuYWJsZShsaXN0LCBpZ25vcmVJbnZhbGlkKVxufVxuXG4vKipcbiAqIFJ1bGVyLmRpc2FibGUobGlzdCBbLCBpZ25vcmVJbnZhbGlkXSkgLT4gQXJyYXlcbiAqIC0gbGlzdCAoU3RyaW5nfEFycmF5KTogbGlzdCBvZiBydWxlIG5hbWVzIHRvIGRpc2FibGUuXG4gKiAtIGlnbm9yZUludmFsaWQgKEJvb2xlYW4pOiBzZXQgYHRydWVgIHRvIGlnbm9yZSBlcnJvcnMgd2hlbiBydWxlIG5vdCBmb3VuZC5cbiAqXG4gKiBEaXNhYmxlIHJ1bGVzIHdpdGggZ2l2ZW4gbmFtZXMuIElmIGFueSBydWxlIG5hbWUgbm90IGZvdW5kIC0gdGhyb3cgRXJyb3IuXG4gKiBFcnJvcnMgY2FuIGJlIGRpc2FibGVkIGJ5IHNlY29uZCBwYXJhbS5cbiAqXG4gKiBSZXR1cm5zIGxpc3Qgb2YgZm91bmQgcnVsZSBuYW1lcyAoaWYgbm8gZXhjZXB0aW9uIGhhcHBlbmVkKS5cbiAqXG4gKiBTZWUgYWxzbyBbW1J1bGVyLmVuYWJsZV1dLCBbW1J1bGVyLmVuYWJsZU9ubHldXS5cbiAqKi9cblJ1bGVyLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKGxpc3QsIGlnbm9yZUludmFsaWQpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7IGxpc3QgPSBbbGlzdF0gfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdXG5cbiAgLy8gU2VhcmNoIGJ5IG5hbWUgYW5kIGRpc2FibGVcbiAgbGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5fX2ZpbmRfXyhuYW1lKVxuXG4gICAgaWYgKGlkeCA8IDApIHtcbiAgICAgIGlmIChpZ25vcmVJbnZhbGlkKSB7IHJldHVybiB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bGVzIG1hbmFnZXI6IGludmFsaWQgcnVsZSBuYW1lICcgKyBuYW1lKVxuICAgIH1cbiAgICB0aGlzLl9fcnVsZXNfX1tpZHhdLmVuYWJsZWQgPSBmYWxzZVxuICAgIHJlc3VsdC5wdXNoKG5hbWUpXG4gIH0sIHRoaXMpXG5cbiAgdGhpcy5fX2NhY2hlX18gPSBudWxsXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBSdWxlci5nZXRSdWxlcyhjaGFpbk5hbWUpIC0+IEFycmF5XG4gKlxuICogUmV0dXJuIGFycmF5IG9mIGFjdGl2ZSBmdW5jdGlvbnMgKHJ1bGVzKSBmb3IgZ2l2ZW4gY2hhaW4gbmFtZS4gSXQgYW5hbHl6ZXNcbiAqIHJ1bGVzIGNvbmZpZ3VyYXRpb24sIGNvbXBpbGVzIGNhY2hlcyBpZiBub3QgZXhpc3RzIGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBEZWZhdWx0IGNoYWluIG5hbWUgaXMgYCcnYCAoZW1wdHkgc3RyaW5nKS4gSXQgY2FuJ3QgYmUgc2tpcHBlZC4gVGhhdCdzXG4gKiBkb25lIGludGVudGlvbmFsbHksIHRvIGtlZXAgc2lnbmF0dXJlIG1vbm9tb3JwaGljIGZvciBoaWdoIHNwZWVkLlxuICoqL1xuUnVsZXIucHJvdG90eXBlLmdldFJ1bGVzID0gZnVuY3Rpb24gKGNoYWluTmFtZSkge1xuICBpZiAodGhpcy5fX2NhY2hlX18gPT09IG51bGwpIHtcbiAgICB0aGlzLl9fY29tcGlsZV9fKClcbiAgfVxuXG4gIC8vIENoYWluIGNhbiBiZSBlbXB0eSwgaWYgcnVsZXMgZGlzYWJsZWQuIEJ1dCB3ZSBzdGlsbCBoYXZlIHRvIHJldHVybiBBcnJheS5cbiAgcmV0dXJuIHRoaXMuX19jYWNoZV9fW2NoYWluTmFtZV0gfHwgW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVsZXJcbiIsIi8vIEJsb2NrIHF1b3Rlc1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmxvY2txdW90ZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGxldCBwb3MgPSBzdGF0ZS5iTWFya3Nbc3RhcnRMaW5lXSArIHN0YXRlLnRTaGlmdFtzdGFydExpbmVdXG4gIGxldCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuXG4gIGNvbnN0IG9sZExpbmVNYXggPSBzdGF0ZS5saW5lTWF4XG5cbiAgLy8gaWYgaXQncyBpbmRlbnRlZCBtb3JlIHRoYW4gMyBzcGFjZXMsIGl0IHNob3VsZCBiZSBhIGNvZGUgYmxvY2tcbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBjaGVjayB0aGUgYmxvY2sgcXVvdGUgbWFya2VyXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNFLyogPiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIHdlIGtub3cgdGhhdCBpdCdzIGdvaW5nIHRvIGJlIGEgdmFsaWQgYmxvY2txdW90ZSxcbiAgLy8gc28gbm8gcG9pbnQgdHJ5aW5nIHRvIGZpbmQgdGhlIGVuZCBvZiBpdCBpbiBzaWxlbnQgbW9kZVxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICBjb25zdCBvbGRCTWFya3MgID0gW11cbiAgY29uc3Qgb2xkQlNDb3VudCA9IFtdXG4gIGNvbnN0IG9sZFNDb3VudCAgPSBbXVxuICBjb25zdCBvbGRUU2hpZnQgID0gW11cblxuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygnYmxvY2txdW90ZScpXG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdibG9ja3F1b3RlJ1xuICBsZXQgbGFzdExpbmVFbXB0eSA9IGZhbHNlXG4gIGxldCBuZXh0TGluZVxuXG4gIC8vIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBibG9ja1xuICAvL1xuICAvLyBCbG9jayBlbmRzIHdpdGggZWl0aGVyOlxuICAvLyAgMS4gYW4gZW1wdHkgbGluZSBvdXRzaWRlOlxuICAvLyAgICAgYGBgXG4gIC8vICAgICA+IHRlc3RcbiAgLy9cbiAgLy8gICAgIGBgYFxuICAvLyAgMi4gYW4gZW1wdHkgbGluZSBpbnNpZGU6XG4gIC8vICAgICBgYGBcbiAgLy8gICAgID5cbiAgLy8gICAgIHRlc3RcbiAgLy8gICAgIGBgYFxuICAvLyAgMy4gYW5vdGhlciB0YWc6XG4gIC8vICAgICBgYGBcbiAgLy8gICAgID4gdGVzdFxuICAvLyAgICAgIC0gLSAtXG4gIC8vICAgICBgYGBcbiAgZm9yIChuZXh0TGluZSA9IHN0YXJ0TGluZTsgbmV4dExpbmUgPCBlbmRMaW5lOyBuZXh0TGluZSsrKSB7XG4gICAgLy8gY2hlY2sgaWYgaXQncyBvdXRkZW50ZWQsIGkuZS4gaXQncyBpbnNpZGUgbGlzdCBpdGVtIGFuZCBpbmRlbnRlZFxuICAgIC8vIGxlc3MgdGhhbiBzYWlkIGxpc3QgaXRlbTpcbiAgICAvL1xuICAgIC8vIGBgYFxuICAgIC8vIDEuIGFueXRoaW5nXG4gICAgLy8gICAgPiBjdXJyZW50IGJsb2NrcXVvdGVcbiAgICAvLyAyLiBjaGVja2luZyB0aGlzIGxpbmVcbiAgICAvLyBgYGBcbiAgICBjb25zdCBpc091dGRlbnRlZCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnRcblxuICAgIHBvcyA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgbWF4ID0gc3RhdGUuZU1hcmtzW25leHRMaW5lXVxuXG4gICAgaWYgKHBvcyA+PSBtYXgpIHtcbiAgICAgIC8vIENhc2UgMTogbGluZSBpcyBub3QgaW5zaWRlIHRoZSBibG9ja3F1b3RlLCBhbmQgdGhpcyBsaW5lIGlzIGVtcHR5LlxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspID09PSAweDNFLyogPiAqLyAmJiAhaXNPdXRkZW50ZWQpIHtcbiAgICAgIC8vIFRoaXMgbGluZSBpcyBpbnNpZGUgdGhlIGJsb2NrcXVvdGUuXG5cbiAgICAgIC8vIHNldCBvZmZzZXQgcGFzdCBzcGFjZXMgYW5kIFwiPlwiXG4gICAgICBsZXQgaW5pdGlhbCA9IHN0YXRlLnNDb3VudFtuZXh0TGluZV0gKyAxXG4gICAgICBsZXQgc3BhY2VBZnRlck1hcmtlclxuICAgICAgbGV0IGFkanVzdFRhYlxuXG4gICAgICAvLyBza2lwIG9uZSBvcHRpb25hbCBzcGFjZSBhZnRlciAnPidcbiAgICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDIwIC8qIHNwYWNlICovKSB7XG4gICAgICAgIC8vICcgPiAgIHRlc3QgJ1xuICAgICAgICAvLyAgICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmU6XG4gICAgICAgIHBvcysrXG4gICAgICAgIGluaXRpYWwrK1xuICAgICAgICBhZGp1c3RUYWIgPSBmYWxzZVxuICAgICAgICBzcGFjZUFmdGVyTWFya2VyID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDA5IC8qIHRhYiAqLykge1xuICAgICAgICBzcGFjZUFmdGVyTWFya2VyID0gdHJ1ZVxuXG4gICAgICAgIGlmICgoc3RhdGUuYnNDb3VudFtuZXh0TGluZV0gKyBpbml0aWFsKSAlIDQgPT09IDMpIHtcbiAgICAgICAgICAvLyAnICA+XFx0ICB0ZXN0ICdcbiAgICAgICAgICAvLyAgICAgICBeIC0tIHBvc2l0aW9uIHN0YXJ0IG9mIGxpbmUgaGVyZSAodGFiIGhhcyB3aWR0aD09PTEpXG4gICAgICAgICAgcG9zKytcbiAgICAgICAgICBpbml0aWFsKytcbiAgICAgICAgICBhZGp1c3RUYWIgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vICcgPlxcdCAgdGVzdCAnXG4gICAgICAgICAgLy8gICAgXiAtLSBwb3NpdGlvbiBzdGFydCBvZiBsaW5lIGhlcmUgKyBzaGlmdCBic0NvdW50IHNsaWdodGx5XG4gICAgICAgICAgLy8gICAgICAgICB0byBtYWtlIGV4dHJhIHNwYWNlIGFwcGVhclxuICAgICAgICAgIGFkanVzdFRhYiA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BhY2VBZnRlck1hcmtlciA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGxldCBvZmZzZXQgPSBpbml0aWFsXG4gICAgICBvbGRCTWFya3MucHVzaChzdGF0ZS5iTWFya3NbbmV4dExpbmVdKVxuICAgICAgc3RhdGUuYk1hcmtzW25leHRMaW5lXSA9IHBvc1xuXG4gICAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgICAgIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgICAgIGlmIChjaCA9PT0gMHgwOSkge1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDQgLSAob2Zmc2V0ICsgc3RhdGUuYnNDb3VudFtuZXh0TGluZV0gKyAoYWRqdXN0VGFiID8gMSA6IDApKSAlIDRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0KytcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcysrXG4gICAgICB9XG5cbiAgICAgIGxhc3RMaW5lRW1wdHkgPSBwb3MgPj0gbWF4XG5cbiAgICAgIG9sZEJTQ291bnQucHVzaChzdGF0ZS5ic0NvdW50W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLmJzQ291bnRbbmV4dExpbmVdID0gc3RhdGUuc0NvdW50W25leHRMaW5lXSArIDEgKyAoc3BhY2VBZnRlck1hcmtlciA/IDEgOiAwKVxuXG4gICAgICBvbGRTQ291bnQucHVzaChzdGF0ZS5zQ291bnRbbmV4dExpbmVdKVxuICAgICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IG9mZnNldCAtIGluaXRpYWxcblxuICAgICAgb2xkVFNoaWZ0LnB1c2goc3RhdGUudFNoaWZ0W25leHRMaW5lXSlcbiAgICAgIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPSBwb3MgLSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIENhc2UgMjogbGluZSBpcyBub3QgaW5zaWRlIHRoZSBibG9ja3F1b3RlLCBhbmQgdGhlIGxhc3QgbGluZSB3YXMgZW1wdHkuXG4gICAgaWYgKGxhc3RMaW5lRW1wdHkpIHsgYnJlYWsgfVxuXG4gICAgLy8gQ2FzZSAzOiBhbm90aGVyIHRhZyBmb3VuZC5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlcm1pbmF0ZSkge1xuICAgICAgLy8gUXVpcmsgdG8gZW5mb3JjZSBcImhhcmQgdGVybWluYXRpb24gbW9kZVwiIGZvciBwYXJhZ3JhcGhzO1xuICAgICAgLy8gbm9ybWFsbHkgaWYgeW91IGNhbGwgYHRva2VuaXplKHN0YXRlLCBzdGFydExpbmUsIG5leHRMaW5lKWAsXG4gICAgICAvLyBwYXJhZ3JhcGhzIHdpbGwgbG9vayBiZWxvdyBuZXh0TGluZSBmb3IgcGFyYWdyYXBoIGNvbnRpbnVhdGlvbixcbiAgICAgIC8vIGJ1dCBpZiBibG9ja3F1b3RlIGlzIHRlcm1pbmF0ZWQgYnkgYW5vdGhlciB0YWcsIHRoZXkgc2hvdWxkbid0XG4gICAgICBzdGF0ZS5saW5lTWF4ID0gbmV4dExpbmVcblxuICAgICAgaWYgKHN0YXRlLmJsa0luZGVudCAhPT0gMCkge1xuICAgICAgICAvLyBzdGF0ZS5ibGtJbmRlbnQgd2FzIG5vbi16ZXJvLCB3ZSBub3cgc2V0IGl0IHRvIHplcm8sXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gcmUtY2FsY3VsYXRlIGFsbCBvZmZzZXRzIHRvIGFwcGVhciBhc1xuICAgICAgICAvLyBpZiBpbmRlbnQgd2Fzbid0IGNoYW5nZWRcbiAgICAgICAgb2xkQk1hcmtzLnB1c2goc3RhdGUuYk1hcmtzW25leHRMaW5lXSlcbiAgICAgICAgb2xkQlNDb3VudC5wdXNoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKVxuICAgICAgICBvbGRUU2hpZnQucHVzaChzdGF0ZS50U2hpZnRbbmV4dExpbmVdKVxuICAgICAgICBvbGRTQ291bnQucHVzaChzdGF0ZS5zQ291bnRbbmV4dExpbmVdKVxuICAgICAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC09IHN0YXRlLmJsa0luZGVudFxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIG9sZEJNYXJrcy5wdXNoKHN0YXRlLmJNYXJrc1tuZXh0TGluZV0pXG4gICAgb2xkQlNDb3VudC5wdXNoKHN0YXRlLmJzQ291bnRbbmV4dExpbmVdKVxuICAgIG9sZFRTaGlmdC5wdXNoKHN0YXRlLnRTaGlmdFtuZXh0TGluZV0pXG4gICAgb2xkU0NvdW50LnB1c2goc3RhdGUuc0NvdW50W25leHRMaW5lXSlcblxuICAgIC8vIEEgbmVnYXRpdmUgaW5kZW50YXRpb24gbWVhbnMgdGhhdCB0aGlzIGlzIGEgcGFyYWdyYXBoIGNvbnRpbnVhdGlvblxuICAgIC8vXG4gICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IC0xXG4gIH1cblxuICBjb25zdCBvbGRJbmRlbnQgPSBzdGF0ZS5ibGtJbmRlbnRcbiAgc3RhdGUuYmxrSW5kZW50ID0gMFxuXG4gIGNvbnN0IHRva2VuX28gID0gc3RhdGUucHVzaCgnYmxvY2txdW90ZV9vcGVuJywgJ2Jsb2NrcXVvdGUnLCAxKVxuICB0b2tlbl9vLm1hcmt1cCA9ICc+J1xuICBjb25zdCBsaW5lcyA9IFtzdGFydExpbmUsIDBdXG4gIHRva2VuX28ubWFwICAgID0gbGluZXNcblxuICBzdGF0ZS5tZC5ibG9jay50b2tlbml6ZShzdGF0ZSwgc3RhcnRMaW5lLCBuZXh0TGluZSlcblxuICBjb25zdCB0b2tlbl9jICA9IHN0YXRlLnB1c2goJ2Jsb2NrcXVvdGVfY2xvc2UnLCAnYmxvY2txdW90ZScsIC0xKVxuICB0b2tlbl9jLm1hcmt1cCA9ICc+J1xuXG4gIHN0YXRlLmxpbmVNYXggPSBvbGRMaW5lTWF4XG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG4gIGxpbmVzWzFdID0gc3RhdGUubGluZVxuXG4gIC8vIFJlc3RvcmUgb3JpZ2luYWwgdFNoaWZ0OyB0aGlzIG1pZ2h0IG5vdCBiZSBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhcnNlclxuICAvLyBoYXMgYWxyZWFkeSBiZWVuIGhlcmUsIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZG8gdGhhdC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUU2hpZnQubGVuZ3RoOyBpKyspIHtcbiAgICBzdGF0ZS5iTWFya3NbaSArIHN0YXJ0TGluZV0gPSBvbGRCTWFya3NbaV1cbiAgICBzdGF0ZS50U2hpZnRbaSArIHN0YXJ0TGluZV0gPSBvbGRUU2hpZnRbaV1cbiAgICBzdGF0ZS5zQ291bnRbaSArIHN0YXJ0TGluZV0gPSBvbGRTQ291bnRbaV1cbiAgICBzdGF0ZS5ic0NvdW50W2kgKyBzdGFydExpbmVdID0gb2xkQlNDb3VudFtpXVxuICB9XG4gIHN0YXRlLmJsa0luZGVudCA9IG9sZEluZGVudFxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBDb2RlIGJsb2NrICg0IHNwYWNlcyBwYWRkZWQpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvZGUgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUvKiwgc2lsZW50ICovKSB7XG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA8IDQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG4gIGxldCBsYXN0ID0gbmV4dExpbmVcblxuICB3aGlsZSAobmV4dExpbmUgPCBlbmRMaW5lKSB7XG4gICAgaWYgKHN0YXRlLmlzRW1wdHkobmV4dExpbmUpKSB7XG4gICAgICBuZXh0TGluZSsrXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHtcbiAgICAgIG5leHRMaW5lKytcbiAgICAgIGxhc3QgPSBuZXh0TGluZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgYnJlYWtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBsYXN0XG5cbiAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ2NvZGVfYmxvY2snLCAnY29kZScsIDApXG4gIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIGxhc3QsIDQgKyBzdGF0ZS5ibGtJbmRlbnQsIGZhbHNlKSArICdcXG4nXG4gIHRva2VuLm1hcCAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBmZW5jZXMgKGBgYCBsYW5nLCB+fn4gbGFuZylcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZmVuY2UgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChwb3MgKyAzID4gbWF4KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChtYXJrZXIgIT09IDB4N0UvKiB+ICovICYmIG1hcmtlciAhPT0gMHg2MCAvKiBgICovKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBzY2FuIG1hcmtlciBsZW5ndGhcbiAgbGV0IG1lbSA9IHBvc1xuICBwb3MgPSBzdGF0ZS5za2lwQ2hhcnMocG9zLCBtYXJrZXIpXG5cbiAgbGV0IGxlbiA9IHBvcyAtIG1lbVxuXG4gIGlmIChsZW4gPCAzKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgbWFya3VwID0gc3RhdGUuc3JjLnNsaWNlKG1lbSwgcG9zKVxuICBjb25zdCBwYXJhbXMgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpXG5cbiAgaWYgKG1hcmtlciA9PT0gMHg2MCAvKiBgICovKSB7XG4gICAgaWYgKHBhcmFtcy5pbmRleE9mKFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKSkgPj0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gU2luY2Ugc3RhcnQgaXMgZm91bmQsIHdlIGNhbiByZXBvcnQgc3VjY2VzcyBoZXJlIGluIHZhbGlkYXRpb24gbW9kZVxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICAvLyBzZWFyY2ggZW5kIG9mIGJsb2NrXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZVxuICBsZXQgaGF2ZUVuZE1hcmtlciA9IGZhbHNlXG5cbiAgZm9yICg7Oykge1xuICAgIG5leHRMaW5lKytcbiAgICBpZiAobmV4dExpbmUgPj0gZW5kTGluZSkge1xuICAgICAgLy8gdW5jbG9zZWQgYmxvY2sgc2hvdWxkIGJlIGF1dG9jbG9zZWQgYnkgZW5kIG9mIGRvY3VtZW50LlxuICAgICAgLy8gYWxzbyBibG9jayBzZWVtcyB0byBiZSBhdXRvY2xvc2VkIGJ5IGVuZCBvZiBwYXJlbnRcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcG9zID0gbWVtID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG5cbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHtcbiAgICAgIC8vIG5vbi1lbXB0eSBsaW5lIHdpdGggbmVnYXRpdmUgaW5kZW50IHNob3VsZCBzdG9wIHRoZSBsaXN0OlxuICAgICAgLy8gLSBgYGBcbiAgICAgIC8vICB0ZXN0XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSBtYXJrZXIpIHsgY29udGludWUgfVxuXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkge1xuICAgICAgLy8gY2xvc2luZyBmZW5jZSBzaG91bGQgYmUgaW5kZW50ZWQgbGVzcyB0aGFuIDQgc3BhY2VzXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHBvcyA9IHN0YXRlLnNraXBDaGFycyhwb3MsIG1hcmtlcilcblxuICAgIC8vIGNsb3NpbmcgY29kZSBmZW5jZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIG9wZW5pbmcgb25lXG4gICAgaWYgKHBvcyAtIG1lbSA8IGxlbikgeyBjb250aW51ZSB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGFpbCBoYXMgc3BhY2VzIG9ubHlcbiAgICBwb3MgPSBzdGF0ZS5za2lwU3BhY2VzKHBvcylcblxuICAgIGlmIChwb3MgPCBtYXgpIHsgY29udGludWUgfVxuXG4gICAgaGF2ZUVuZE1hcmtlciA9IHRydWVcbiAgICAvLyBmb3VuZCFcbiAgICBicmVha1xuICB9XG5cbiAgLy8gSWYgYSBmZW5jZSBoYXMgaGVhZGluZyBzcGFjZXMsIHRoZXkgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBpdHMgaW5uZXIgYmxvY2tcbiAgbGVuID0gc3RhdGUuc0NvdW50W3N0YXJ0TGluZV1cblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmUgKyAoaGF2ZUVuZE1hcmtlciA/IDEgOiAwKVxuXG4gIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCdmZW5jZScsICdjb2RlJywgMClcbiAgdG9rZW4uaW5mbyAgICA9IHBhcmFtc1xuICB0b2tlbi5jb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lICsgMSwgbmV4dExpbmUsIGxlbiwgdHJ1ZSlcbiAgdG9rZW4ubWFya3VwICA9IG1hcmt1cFxuICB0b2tlbi5tYXAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gaGVhZGluZyAoIywgIyMsIC4uLilcblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhlYWRpbmcgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBjaCAgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgaWYgKGNoICE9PSAweDIzLyogIyAqLyB8fCBwb3MgPj0gbWF4KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gY291bnQgaGVhZGluZyBsZXZlbFxuICBsZXQgbGV2ZWwgPSAxXG4gIGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoKytwb3MpXG4gIHdoaWxlIChjaCA9PT0gMHgyMy8qICMgKi8gJiYgcG9zIDwgbWF4ICYmIGxldmVsIDw9IDYpIHtcbiAgICBsZXZlbCsrXG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdCgrK3BvcylcbiAgfVxuXG4gIGlmIChsZXZlbCA+IDYgfHwgKHBvcyA8IG1heCAmJiAhaXNTcGFjZShjaCkpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgLy8gTGV0J3MgY3V0IHRhaWxzIGxpa2UgJyAgICAjIyMgICcgZnJvbSB0aGUgZW5kIG9mIHN0cmluZ1xuXG4gIG1heCA9IHN0YXRlLnNraXBTcGFjZXNCYWNrKG1heCwgcG9zKVxuICBjb25zdCB0bXAgPSBzdGF0ZS5za2lwQ2hhcnNCYWNrKG1heCwgMHgyMywgcG9zKSAvLyAjXG4gIGlmICh0bXAgPiBwb3MgJiYgaXNTcGFjZShzdGF0ZS5zcmMuY2hhckNvZGVBdCh0bXAgLSAxKSkpIHtcbiAgICBtYXggPSB0bXBcbiAgfVxuXG4gIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW5fbyAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX29wZW4nLCAnaCcgKyBTdHJpbmcobGV2ZWwpLCAxKVxuICB0b2tlbl9vLm1hcmt1cCA9ICcjIyMjIyMjIycuc2xpY2UoMCwgbGV2ZWwpXG4gIHRva2VuX28ubWFwICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICBjb25zdCB0b2tlbl9pICAgID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gIHRva2VuX2kuY29udGVudCAgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXgpLnRyaW0oKVxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cbiAgdG9rZW5faS5jaGlsZHJlbiA9IFtdXG5cbiAgY29uc3QgdG9rZW5fYyAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX2Nsb3NlJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgLTEpXG4gIHRva2VuX2MubWFya3VwID0gJyMjIyMjIyMjJy5zbGljZSgwLCBsZXZlbClcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gSG9yaXpvbnRhbCBydWxlXG5cbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBociAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tzdGFydExpbmVdXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IHBvcyA9IHN0YXRlLmJNYXJrc1tzdGFydExpbmVdICsgc3RhdGUudFNoaWZ0W3N0YXJ0TGluZV1cbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG5cbiAgLy8gQ2hlY2sgaHIgbWFya2VyXG4gIGlmIChtYXJrZXIgIT09IDB4MkEvKiAqICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4MkQvKiAtICovICYmXG4gICAgICBtYXJrZXIgIT09IDB4NUYvKiBfICovKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBtYXJrZXJzIGNhbiBiZSBtaXhlZCB3aXRoIHNwYWNlcywgYnV0IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCAzIG9mIHRoZW1cblxuICBsZXQgY250ID0gMVxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MrKylcbiAgICBpZiAoY2ggIT09IG1hcmtlciAmJiAhaXNTcGFjZShjaCkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAoY2ggPT09IG1hcmtlcikgeyBjbnQrKyB9XG4gIH1cblxuICBpZiAoY250IDwgMykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIHN0YXRlLmxpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW4gID0gc3RhdGUucHVzaCgnaHInLCAnaHInLCAwKVxuICB0b2tlbi5tYXAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuICB0b2tlbi5tYXJrdXAgPSBBcnJheShjbnQgKyAxKS5qb2luKFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyKSlcblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gSFRNTCBibG9ja1xuXG5pbXBvcnQgYmxvY2tfbmFtZXMgZnJvbSAnLi4vY29tbW9uL2h0bWxfYmxvY2tzLm1qcydcbmltcG9ydCB7IEhUTUxfT1BFTl9DTE9TRV9UQUdfUkUgfSBmcm9tICcuLi9jb21tb24vaHRtbF9yZS5tanMnXG5cbi8vIEFuIGFycmF5IG9mIG9wZW5pbmcgYW5kIGNvcnJlc3BvbmRpbmcgY2xvc2luZyBzZXF1ZW5jZXMgZm9yIGh0bWwgdGFncyxcbi8vIGxhc3QgYXJndW1lbnQgZGVmaW5lcyB3aGV0aGVyIGl0IGNhbiB0ZXJtaW5hdGUgYSBwYXJhZ3JhcGggb3Igbm90XG4vL1xuY29uc3QgSFRNTF9TRVFVRU5DRVMgPSBbXG4gIFsvXjwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSkoPz0oXFxzfD58JCkpL2ksIC88XFwvKHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpPi9pLCB0cnVlXSxcbiAgWy9ePCEtLS8sICAgICAgICAvLS0+LywgICB0cnVlXSxcbiAgWy9ePFxcPy8sICAgICAgICAgL1xcPz4vLCAgIHRydWVdLFxuICBbL148IVtBLVpdLywgICAgIC8+LywgICAgIHRydWVdLFxuICBbL148IVxcW0NEQVRBXFxbLywgL1xcXVxcXT4vLCB0cnVlXSxcbiAgW25ldyBSZWdFeHAoJ148Lz8oJyArIGJsb2NrX25hbWVzLmpvaW4oJ3wnKSArICcpKD89KFxcXFxzfC8/PnwkKSknLCAnaScpLCAvXiQvLCB0cnVlXSxcbiAgW25ldyBSZWdFeHAoSFRNTF9PUEVOX0NMT1NFX1RBR19SRS5zb3VyY2UgKyAnXFxcXHMqJCcpLCAgL14kLywgZmFsc2VdXG5dXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh0bWxfYmxvY2sgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W3N0YXJ0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5odG1sKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0MvKiA8ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgbGV0IGxpbmVUZXh0ID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gIGxldCBpID0gMFxuICBmb3IgKDsgaSA8IEhUTUxfU0VRVUVOQ0VTLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKEhUTUxfU0VRVUVOQ0VTW2ldWzBdLnRlc3QobGluZVRleHQpKSB7IGJyZWFrIH1cbiAgfVxuICBpZiAoaSA9PT0gSFRNTF9TRVFVRU5DRVMubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkge1xuICAgIC8vIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgYSB0ZXJtaW5hdG9yLCBmYWxzZSBvdGhlcndpc2VcbiAgICByZXR1cm4gSFRNTF9TRVFVRU5DRVNbaV1bMl1cbiAgfVxuXG4gIGxldCBuZXh0TGluZSA9IHN0YXJ0TGluZSArIDFcblxuICAvLyBJZiB3ZSBhcmUgaGVyZSAtIHdlIGRldGVjdGVkIEhUTUwgYmxvY2suXG4gIC8vIExldCdzIHJvbGwgZG93biB0aWxsIGJsb2NrIGVuZC5cbiAgaWYgKCFIVE1MX1NFUVVFTkNFU1tpXVsxXS50ZXN0KGxpbmVUZXh0KSkge1xuICAgIGZvciAoOyBuZXh0TGluZSA8IGVuZExpbmU7IG5leHRMaW5lKyspIHtcbiAgICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrIH1cblxuICAgICAgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cbiAgICAgIGxpbmVUZXh0ID0gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxuXG4gICAgICBpZiAoSFRNTF9TRVFVRU5DRVNbaV1bMV0udGVzdChsaW5lVGV4dCkpIHtcbiAgICAgICAgaWYgKGxpbmVUZXh0Lmxlbmd0aCAhPT0gMCkgeyBuZXh0TGluZSsrIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcblxuICBjb25zdCB0b2tlbiAgID0gc3RhdGUucHVzaCgnaHRtbF9ibG9jaycsICcnLCAwKVxuICB0b2tlbi5tYXAgICAgID0gW3N0YXJ0TGluZSwgbmV4dExpbmVdXG4gIHRva2VuLmNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCBzdGF0ZS5ibGtJbmRlbnQsIHRydWUpXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIGxoZWFkaW5nICgtLS0sID09PSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGhlYWRpbmcgKHN0YXRlLCBzdGFydExpbmUsIGVuZExpbmUvKiwgc2lsZW50ICovKSB7XG4gIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdwYXJhZ3JhcGgnKVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdwYXJhZ3JhcGgnIC8vIHVzZSBwYXJhZ3JhcGggdG8gbWF0Y2ggdGVybWluYXRvclJ1bGVzXG5cbiAgLy8ganVtcCBsaW5lLWJ5LWxpbmUgdW50aWwgZW1wdHkgb25lIG9yIEVPRlxuICBsZXQgbGV2ZWwgPSAwXG4gIGxldCBtYXJrZXJcbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIGZvciAoOyBuZXh0TGluZSA8IGVuZExpbmUgJiYgIXN0YXRlLmlzRW1wdHkobmV4dExpbmUpOyBuZXh0TGluZSsrKSB7XG4gICAgLy8gdGhpcyB3b3VsZCBiZSBhIGNvZGUgYmxvY2sgbm9ybWFsbHksIGJ1dCBhZnRlciBwYXJhZ3JhcGhcbiAgICAvLyBpdCdzIGNvbnNpZGVyZWQgYSBsYXp5IGNvbnRpbnVhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQncyB0aGVyZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID4gMykgeyBjb250aW51ZSB9XG5cbiAgICAvL1xuICAgIC8vIENoZWNrIGZvciB1bmRlcmxpbmUgaW4gc2V0ZXh0IGhlYWRlclxuICAgIC8vXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPj0gc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICAgIGNvbnN0IG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgICAgaWYgKHBvcyA8IG1heCkge1xuICAgICAgICBtYXJrZXIgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHgyRC8qIC0gKi8gfHwgbWFya2VyID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIHBvcyA9IHN0YXRlLnNraXBDaGFycyhwb3MsIG1hcmtlcilcbiAgICAgICAgICBwb3MgPSBzdGF0ZS5za2lwU3BhY2VzKHBvcylcblxuICAgICAgICAgIGlmIChwb3MgPj0gbWF4KSB7XG4gICAgICAgICAgICBsZXZlbCA9IChtYXJrZXIgPT09IDB4M0QvKiA9ICovID8gMSA6IDIpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHF1aXJrIGZvciBibG9ja3F1b3RlcywgdGhpcyBsaW5lIHNob3VsZCBhbHJlYWR5IGJlIGNoZWNrZWQgYnkgdGhhdCBydWxlXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCAwKSB7IGNvbnRpbnVlIH1cblxuICAgIC8vIFNvbWUgdGFncyBjYW4gdGVybWluYXRlIHBhcmFncmFwaCB3aXRob3V0IGVtcHR5IGxpbmUuXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrIH1cbiAgfVxuXG4gIGlmICghbGV2ZWwpIHtcbiAgICAvLyBEaWRuJ3QgZmluZCB2YWxpZCB1bmRlcmxpbmVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBzdGF0ZS5nZXRMaW5lcyhzdGFydExpbmUsIG5leHRMaW5lLCBzdGF0ZS5ibGtJbmRlbnQsIGZhbHNlKS50cmltKClcblxuICBzdGF0ZS5saW5lID0gbmV4dExpbmUgKyAxXG5cbiAgY29uc3QgdG9rZW5fbyAgICA9IHN0YXRlLnB1c2goJ2hlYWRpbmdfb3BlbicsICdoJyArIFN0cmluZyhsZXZlbCksIDEpXG4gIHRva2VuX28ubWFya3VwICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcbiAgdG9rZW5fby5tYXAgICAgICA9IFtzdGFydExpbmUsIHN0YXRlLmxpbmVdXG5cbiAgY29uc3QgdG9rZW5faSAgICA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICB0b2tlbl9pLmNvbnRlbnQgID0gY29udGVudFxuICB0b2tlbl9pLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZSAtIDFdXG4gIHRva2VuX2kuY2hpbGRyZW4gPSBbXVxuXG4gIGNvbnN0IHRva2VuX2MgICAgPSBzdGF0ZS5wdXNoKCdoZWFkaW5nX2Nsb3NlJywgJ2gnICsgU3RyaW5nKGxldmVsKSwgLTEpXG4gIHRva2VuX2MubWFya3VwICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBMaXN0c1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuLy8gU2VhcmNoIGBbLSsqXVtcXG4gXWAsIHJldHVybnMgbmV4dCBwb3MgYWZ0ZXIgbWFya2VyIG9uIHN1Y2Nlc3Ncbi8vIG9yIC0xIG9uIGZhaWwuXG5mdW5jdGlvbiBza2lwQnVsbGV0TGlzdE1hcmtlciAoc3RhdGUsIHN0YXJ0TGluZSkge1xuICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICAvLyBDaGVjayBidWxsZXRcbiAgaWYgKG1hcmtlciAhPT0gMHgyQS8qICogKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHgyRC8qIC0gKi8gJiZcbiAgICAgIG1hcmtlciAhPT0gMHgyQi8qICsgKi8pIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIGlmIChwb3MgPCBtYXgpIHtcbiAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmICghaXNTcGFjZShjaCkpIHtcbiAgICAgIC8vIFwiIC10ZXN0IFwiIC0gaXMgbm90IGEgbGlzdCBpdGVtXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcG9zXG59XG5cbi8vIFNlYXJjaCBgXFxkK1suKV1bXFxuIF1gLCByZXR1cm5zIG5leHQgcG9zIGFmdGVyIG1hcmtlciBvbiBzdWNjZXNzXG4vLyBvciAtMSBvbiBmYWlsLlxuZnVuY3Rpb24gc2tpcE9yZGVyZWRMaXN0TWFya2VyIChzdGF0ZSwgc3RhcnRMaW5lKSB7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3Nbc3RhcnRMaW5lXVxuICBsZXQgcG9zID0gc3RhcnRcblxuICAvLyBMaXN0IG1hcmtlciBzaG91bGQgaGF2ZSBhdCBsZWFzdCAyIGNoYXJzIChkaWdpdCArIGRvdClcbiAgaWYgKHBvcyArIDEgPj0gbWF4KSB7IHJldHVybiAtMSB9XG5cbiAgbGV0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKyspXG5cbiAgaWYgKGNoIDwgMHgzMC8qIDAgKi8gfHwgY2ggPiAweDM5LyogOSAqLykgeyByZXR1cm4gLTEgfVxuXG4gIGZvciAoOzspIHtcbiAgICAvLyBFT0wgLT4gZmFpbFxuICAgIGlmIChwb3MgPj0gbWF4KSB7IHJldHVybiAtMSB9XG5cbiAgICBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuXG4gICAgaWYgKGNoID49IDB4MzAvKiAwICovICYmIGNoIDw9IDB4MzkvKiA5ICovKSB7XG4gICAgICAvLyBMaXN0IG1hcmtlciBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gOSBkaWdpdHNcbiAgICAgIC8vIChwcmV2ZW50cyBpbnRlZ2VyIG92ZXJmbG93IGluIGJyb3dzZXJzKVxuICAgICAgaWYgKHBvcyAtIHN0YXJ0ID49IDEwKSB7IHJldHVybiAtMSB9XG5cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gZm91bmQgdmFsaWQgbWFya2VyXG4gICAgaWYgKGNoID09PSAweDI5LyogKSAqLyB8fCBjaCA9PT0gMHgyZS8qIC4gKi8pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICBpZiAocG9zIDwgbWF4KSB7XG4gICAgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoIWlzU3BhY2UoY2gpKSB7XG4gICAgICAvLyBcIiAxLnRlc3QgXCIgLSBpcyBub3QgYSBsaXN0IGl0ZW1cbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbmZ1bmN0aW9uIG1hcmtUaWdodFBhcmFncmFwaHMgKHN0YXRlLCBpZHgpIHtcbiAgY29uc3QgbGV2ZWwgPSBzdGF0ZS5sZXZlbCArIDJcblxuICBmb3IgKGxldCBpID0gaWR4ICsgMiwgbCA9IHN0YXRlLnRva2Vucy5sZW5ndGggLSAyOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHN0YXRlLnRva2Vuc1tpXS5sZXZlbCA9PT0gbGV2ZWwgJiYgc3RhdGUudG9rZW5zW2ldLnR5cGUgPT09ICdwYXJhZ3JhcGhfb3BlbicpIHtcbiAgICAgIHN0YXRlLnRva2Vuc1tpICsgMl0uaGlkZGVuID0gdHJ1ZVxuICAgICAgc3RhdGUudG9rZW5zW2ldLmhpZGRlbiA9IHRydWVcbiAgICAgIGkgKz0gMlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaXN0IChzdGF0ZSwgc3RhcnRMaW5lLCBlbmRMaW5lLCBzaWxlbnQpIHtcbiAgbGV0IG1heCwgcG9zLCBzdGFydCwgdG9rZW5cbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lXG4gIGxldCB0aWdodCA9IHRydWVcblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlOlxuICAvLyAgLSBpdGVtIDFcbiAgLy8gICAtIGl0ZW0gMlxuICAvLyAgICAtIGl0ZW0gM1xuICAvLyAgICAgLSBpdGVtIDRcbiAgLy8gICAgICAtIHRoaXMgb25lIGlzIGEgcGFyYWdyYXBoIGNvbnRpbnVhdGlvblxuICBpZiAoc3RhdGUubGlzdEluZGVudCA+PSAwICYmXG4gICAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUubGlzdEluZGVudCA+PSA0ICYmXG4gICAgICBzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgaXNUZXJtaW5hdGluZ1BhcmFncmFwaCA9IGZhbHNlXG5cbiAgLy8gbGltaXQgY29uZGl0aW9ucyB3aGVuIGxpc3QgY2FuIGludGVycnVwdFxuICAvLyBhIHBhcmFncmFwaCAodmFsaWRhdGlvbiBtb2RlIG9ubHkpXG4gIGlmIChzaWxlbnQgJiYgc3RhdGUucGFyZW50VHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAvLyBOZXh0IGxpc3QgaXRlbSBzaG91bGQgc3RpbGwgdGVybWluYXRlIHByZXZpb3VzIGxpc3QgaXRlbTtcbiAgICAvL1xuICAgIC8vIFRoaXMgY29kZSBjYW4gZmFpbCBpZiBwbHVnaW5zIHVzZSBibGtJbmRlbnQgYXMgd2VsbCBhcyBsaXN0cyxcbiAgICAvLyBidXQgSSBob3BlIHRoZSBzcGVjIGdldHMgZml4ZWQgbG9uZyBiZWZvcmUgdGhhdCBoYXBwZW5zLlxuICAgIC8vXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPj0gc3RhdGUuYmxrSW5kZW50KSB7XG4gICAgICBpc1Rlcm1pbmF0aW5nUGFyYWdyYXBoID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVjdCBsaXN0IHR5cGUgYW5kIHBvc2l0aW9uIGFmdGVyIG1hcmtlclxuICBsZXQgaXNPcmRlcmVkXG4gIGxldCBtYXJrZXJWYWx1ZVxuICBsZXQgcG9zQWZ0ZXJNYXJrZXJcbiAgaWYgKChwb3NBZnRlck1hcmtlciA9IHNraXBPcmRlcmVkTGlzdE1hcmtlcihzdGF0ZSwgbmV4dExpbmUpKSA+PSAwKSB7XG4gICAgaXNPcmRlcmVkID0gdHJ1ZVxuICAgIHN0YXJ0ID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICBtYXJrZXJWYWx1ZSA9IE51bWJlcihzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQsIHBvc0FmdGVyTWFya2VyIC0gMSkpXG5cbiAgICAvLyBJZiB3ZSdyZSBzdGFydGluZyBhIG5ldyBvcmRlcmVkIGxpc3QgcmlnaHQgYWZ0ZXJcbiAgICAvLyBhIHBhcmFncmFwaCwgaXQgc2hvdWxkIHN0YXJ0IHdpdGggMS5cbiAgICBpZiAoaXNUZXJtaW5hdGluZ1BhcmFncmFwaCAmJiBtYXJrZXJWYWx1ZSAhPT0gMSkgcmV0dXJuIGZhbHNlXG4gIH0gZWxzZSBpZiAoKHBvc0FmdGVyTWFya2VyID0gc2tpcEJ1bGxldExpc3RNYXJrZXIoc3RhdGUsIG5leHRMaW5lKSkgPj0gMCkge1xuICAgIGlzT3JkZXJlZCA9IGZhbHNlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBJZiB3ZSdyZSBzdGFydGluZyBhIG5ldyB1bm9yZGVyZWQgbGlzdCByaWdodCBhZnRlclxuICAvLyBhIHBhcmFncmFwaCwgZmlyc3QgbGluZSBzaG91bGQgbm90IGJlIGVtcHR5LlxuICBpZiAoaXNUZXJtaW5hdGluZ1BhcmFncmFwaCkge1xuICAgIGlmIChzdGF0ZS5za2lwU3BhY2VzKHBvc0FmdGVyTWFya2VyKSA+PSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZvciB2YWxpZGF0aW9uIG1vZGUgd2UgY2FuIHRlcm1pbmF0ZSBpbW1lZGlhdGVseVxuICBpZiAoc2lsZW50KSB7IHJldHVybiB0cnVlIH1cblxuICAvLyBXZSBzaG91bGQgdGVybWluYXRlIGxpc3Qgb24gc3R5bGUgY2hhbmdlLiBSZW1lbWJlciBmaXJzdCBvbmUgdG8gY29tcGFyZS5cbiAgY29uc3QgbWFya2VyQ2hhckNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3NBZnRlck1hcmtlciAtIDEpXG5cbiAgLy8gU3RhcnQgbGlzdFxuICBjb25zdCBsaXN0VG9rSWR4ID0gc3RhdGUudG9rZW5zLmxlbmd0aFxuXG4gIGlmIChpc09yZGVyZWQpIHtcbiAgICB0b2tlbiAgICAgICA9IHN0YXRlLnB1c2goJ29yZGVyZWRfbGlzdF9vcGVuJywgJ29sJywgMSlcbiAgICBpZiAobWFya2VyVmFsdWUgIT09IDEpIHtcbiAgICAgIHRva2VuLmF0dHJzID0gW1snc3RhcnQnLCBtYXJrZXJWYWx1ZV1dXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRva2VuICAgICAgID0gc3RhdGUucHVzaCgnYnVsbGV0X2xpc3Rfb3BlbicsICd1bCcsIDEpXG4gIH1cblxuICBjb25zdCBsaXN0TGluZXMgPSBbbmV4dExpbmUsIDBdXG4gIHRva2VuLm1hcCAgICA9IGxpc3RMaW5lc1xuICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuXG4gIC8vXG4gIC8vIEl0ZXJhdGUgbGlzdCBpdGVtc1xuICAvL1xuXG4gIGxldCBwcmV2RW1wdHlFbmQgPSBmYWxzZVxuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygnbGlzdCcpXG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICdsaXN0J1xuXG4gIHdoaWxlIChuZXh0TGluZSA8IGVuZExpbmUpIHtcbiAgICBwb3MgPSBwb3NBZnRlck1hcmtlclxuICAgIG1heCA9IHN0YXRlLmVNYXJrc1tuZXh0TGluZV1cblxuICAgIGNvbnN0IGluaXRpYWwgPSBzdGF0ZS5zQ291bnRbbmV4dExpbmVdICsgcG9zQWZ0ZXJNYXJrZXIgLSAoc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0pXG4gICAgbGV0IG9mZnNldCA9IGluaXRpYWxcblxuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgb2Zmc2V0ICs9IDQgLSAob2Zmc2V0ICsgc3RhdGUuYnNDb3VudFtuZXh0TGluZV0pICUgNFxuICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMCkge1xuICAgICAgICBvZmZzZXQrK1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50U3RhcnQgPSBwb3NcbiAgICBsZXQgaW5kZW50QWZ0ZXJNYXJrZXJcblxuICAgIGlmIChjb250ZW50U3RhcnQgPj0gbWF4KSB7XG4gICAgICAvLyB0cmltbWluZyBzcGFjZSBpbiBcIi0gICAgXFxuICAzXCIgY2FzZSwgaW5kZW50IGlzIDEgaGVyZVxuICAgICAgaW5kZW50QWZ0ZXJNYXJrZXIgPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGVudEFmdGVyTWFya2VyID0gb2Zmc2V0IC0gaW5pdGlhbFxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbW9yZSB0aGFuIDQgc3BhY2VzLCB0aGUgaW5kZW50IGlzIDFcbiAgICAvLyAodGhlIHJlc3QgaXMganVzdCBpbmRlbnRlZCBjb2RlIGJsb2NrKVxuICAgIGlmIChpbmRlbnRBZnRlck1hcmtlciA+IDQpIHsgaW5kZW50QWZ0ZXJNYXJrZXIgPSAxIH1cblxuICAgIC8vIFwiICAtICB0ZXN0XCJcbiAgICAvLyAgXl5eXl4gLSBjYWxjdWxhdGluZyB0b3RhbCBsZW5ndGggb2YgdGhpcyB0aGluZ1xuICAgIGNvbnN0IGluZGVudCA9IGluaXRpYWwgKyBpbmRlbnRBZnRlck1hcmtlclxuXG4gICAgLy8gUnVuIHN1YnBhcnNlciAmIHdyaXRlIHRva2Vuc1xuICAgIHRva2VuICAgICAgICA9IHN0YXRlLnB1c2goJ2xpc3RfaXRlbV9vcGVuJywgJ2xpJywgMSlcbiAgICB0b2tlbi5tYXJrdXAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlckNoYXJDb2RlKVxuICAgIGNvbnN0IGl0ZW1MaW5lcyA9IFtuZXh0TGluZSwgMF1cbiAgICB0b2tlbi5tYXAgICAgPSBpdGVtTGluZXNcbiAgICBpZiAoaXNPcmRlcmVkKSB7XG4gICAgICB0b2tlbi5pbmZvID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3NBZnRlck1hcmtlciAtIDEpXG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIGN1cnJlbnQgc3RhdGUsIHRoZW4gcmVzdG9yZSBpdCBhZnRlciBwYXJzZXIgc3ViY2FsbFxuICAgIGNvbnN0IG9sZFRpZ2h0ID0gc3RhdGUudGlnaHRcbiAgICBjb25zdCBvbGRUU2hpZnQgPSBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgY29uc3Qgb2xkU0NvdW50ID0gc3RhdGUuc0NvdW50W25leHRMaW5lXVxuXG4gICAgLy8gIC0gZXhhbXBsZSBsaXN0XG4gICAgLy8gXiBsaXN0SW5kZW50IHBvc2l0aW9uIHdpbGwgYmUgaGVyZVxuICAgIC8vICAgXiBibGtJbmRlbnQgcG9zaXRpb24gd2lsbCBiZSBoZXJlXG4gICAgLy9cbiAgICBjb25zdCBvbGRMaXN0SW5kZW50ID0gc3RhdGUubGlzdEluZGVudFxuICAgIHN0YXRlLmxpc3RJbmRlbnQgPSBzdGF0ZS5ibGtJbmRlbnRcbiAgICBzdGF0ZS5ibGtJbmRlbnQgPSBpbmRlbnRcblxuICAgIHN0YXRlLnRpZ2h0ID0gdHJ1ZVxuICAgIHN0YXRlLnRTaGlmdFtuZXh0TGluZV0gPSBjb250ZW50U3RhcnQgLSBzdGF0ZS5iTWFya3NbbmV4dExpbmVdXG4gICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IG9mZnNldFxuXG4gICAgaWYgKGNvbnRlbnRTdGFydCA+PSBtYXggJiYgc3RhdGUuaXNFbXB0eShuZXh0TGluZSArIDEpKSB7XG4gICAgICAvLyB3b3JrYXJvdW5kIGZvciB0aGlzIGNhc2VcbiAgICAgIC8vIChsaXN0IGl0ZW0gaXMgZW1wdHksIGxpc3QgdGVybWluYXRlcyBiZWZvcmUgXCJmb29cIik6XG4gICAgICAvLyB+fn5+fn5+flxuICAgICAgLy8gICAtXG4gICAgICAvL1xuICAgICAgLy8gICAgIGZvb1xuICAgICAgLy8gfn5+fn5+fn5cbiAgICAgIHN0YXRlLmxpbmUgPSBNYXRoLm1pbihzdGF0ZS5saW5lICsgMiwgZW5kTGluZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUubWQuYmxvY2sudG9rZW5pemUoc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKVxuICAgIH1cblxuICAgIC8vIElmIGFueSBvZiBsaXN0IGl0ZW0gaXMgdGlnaHQsIG1hcmsgbGlzdCBhcyB0aWdodFxuICAgIGlmICghc3RhdGUudGlnaHQgfHwgcHJldkVtcHR5RW5kKSB7XG4gICAgICB0aWdodCA9IGZhbHNlXG4gICAgfVxuICAgIC8vIEl0ZW0gYmVjb21lIGxvb3NlIGlmIGZpbmlzaCB3aXRoIGVtcHR5IGxpbmUsXG4gICAgLy8gYnV0IHdlIHNob3VsZCBmaWx0ZXIgbGFzdCBlbGVtZW50LCBiZWNhdXNlIGl0IG1lYW5zIGxpc3QgZmluaXNoXG4gICAgcHJldkVtcHR5RW5kID0gKHN0YXRlLmxpbmUgLSBuZXh0TGluZSkgPiAxICYmIHN0YXRlLmlzRW1wdHkoc3RhdGUubGluZSAtIDEpXG5cbiAgICBzdGF0ZS5ibGtJbmRlbnQgPSBzdGF0ZS5saXN0SW5kZW50XG4gICAgc3RhdGUubGlzdEluZGVudCA9IG9sZExpc3RJbmRlbnRcbiAgICBzdGF0ZS50U2hpZnRbbmV4dExpbmVdID0gb2xkVFNoaWZ0XG4gICAgc3RhdGUuc0NvdW50W25leHRMaW5lXSA9IG9sZFNDb3VudFxuICAgIHN0YXRlLnRpZ2h0ID0gb2xkVGlnaHRcblxuICAgIHRva2VuICAgICAgICA9IHN0YXRlLnB1c2goJ2xpc3RfaXRlbV9jbG9zZScsICdsaScsIC0xKVxuICAgIHRva2VuLm1hcmt1cCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyQ2hhckNvZGUpXG5cbiAgICBuZXh0TGluZSA9IHN0YXRlLmxpbmVcbiAgICBpdGVtTGluZXNbMV0gPSBuZXh0TGluZVxuXG4gICAgaWYgKG5leHRMaW5lID49IGVuZExpbmUpIHsgYnJlYWsgfVxuXG4gICAgLy9cbiAgICAvLyBUcnkgdG8gY2hlY2sgaWYgbGlzdCBpcyB0ZXJtaW5hdGVkIG9yIGNvbnRpbnVlZC5cbiAgICAvL1xuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgc3RhdGUuYmxrSW5kZW50KSB7IGJyZWFrIH1cblxuICAgIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyBicmVhayB9XG5cbiAgICAvLyBmYWlsIGlmIHRlcm1pbmF0aW5nIGJsb2NrIGZvdW5kXG4gICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0ZXJtaW5hdG9yUnVsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAodGVybWluYXRvclJ1bGVzW2ldKHN0YXRlLCBuZXh0TGluZSwgZW5kTGluZSwgdHJ1ZSkpIHtcbiAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGVybWluYXRlKSB7IGJyZWFrIH1cblxuICAgIC8vIGZhaWwgaWYgbGlzdCBoYXMgYW5vdGhlciB0eXBlXG4gICAgaWYgKGlzT3JkZXJlZCkge1xuICAgICAgcG9zQWZ0ZXJNYXJrZXIgPSBza2lwT3JkZXJlZExpc3RNYXJrZXIoc3RhdGUsIG5leHRMaW5lKVxuICAgICAgaWYgKHBvc0FmdGVyTWFya2VyIDwgMCkgeyBicmVhayB9XG4gICAgICBzdGFydCA9IHN0YXRlLmJNYXJrc1tuZXh0TGluZV0gKyBzdGF0ZS50U2hpZnRbbmV4dExpbmVdXG4gICAgfSBlbHNlIHtcbiAgICAgIHBvc0FmdGVyTWFya2VyID0gc2tpcEJ1bGxldExpc3RNYXJrZXIoc3RhdGUsIG5leHRMaW5lKVxuICAgICAgaWYgKHBvc0FmdGVyTWFya2VyIDwgMCkgeyBicmVhayB9XG4gICAgfVxuXG4gICAgaWYgKG1hcmtlckNoYXJDb2RlICE9PSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3NBZnRlck1hcmtlciAtIDEpKSB7IGJyZWFrIH1cbiAgfVxuXG4gIC8vIEZpbmFsaXplIGxpc3RcbiAgaWYgKGlzT3JkZXJlZCkge1xuICAgIHRva2VuID0gc3RhdGUucHVzaCgnb3JkZXJlZF9saXN0X2Nsb3NlJywgJ29sJywgLTEpXG4gIH0gZWxzZSB7XG4gICAgdG9rZW4gPSBzdGF0ZS5wdXNoKCdidWxsZXRfbGlzdF9jbG9zZScsICd1bCcsIC0xKVxuICB9XG4gIHRva2VuLm1hcmt1cCA9IFN0cmluZy5mcm9tQ2hhckNvZGUobWFya2VyQ2hhckNvZGUpXG5cbiAgbGlzdExpbmVzWzFdID0gbmV4dExpbmVcbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG5cbiAgc3RhdGUucGFyZW50VHlwZSA9IG9sZFBhcmVudFR5cGVcblxuICAvLyBtYXJrIHBhcmFncmFwaHMgdGlnaHQgaWYgbmVlZGVkXG4gIGlmICh0aWdodCkge1xuICAgIG1hcmtUaWdodFBhcmFncmFwaHMoc3RhdGUsIGxpc3RUb2tJZHgpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUGFyYWdyYXBoXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcmFncmFwaCAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSkge1xuICBjb25zdCB0ZXJtaW5hdG9yUnVsZXMgPSBzdGF0ZS5tZC5ibG9jay5ydWxlci5nZXRSdWxlcygncGFyYWdyYXBoJylcbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuICBzdGF0ZS5wYXJlbnRUeXBlID0gJ3BhcmFncmFwaCdcblxuICAvLyBqdW1wIGxpbmUtYnktbGluZSB1bnRpbCBlbXB0eSBvbmUgb3IgRU9GXG4gIGZvciAoOyBuZXh0TGluZSA8IGVuZExpbmUgJiYgIXN0YXRlLmlzRW1wdHkobmV4dExpbmUpOyBuZXh0TGluZSsrKSB7XG4gICAgLy8gdGhpcyB3b3VsZCBiZSBhIGNvZGUgYmxvY2sgbm9ybWFsbHksIGJ1dCBhZnRlciBwYXJhZ3JhcGhcbiAgICAvLyBpdCdzIGNvbnNpZGVyZWQgYSBsYXp5IGNvbnRpbnVhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQncyB0aGVyZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID4gMykgeyBjb250aW51ZSB9XG5cbiAgICAvLyBxdWlyayBmb3IgYmxvY2txdW90ZXMsIHRoaXMgbGluZSBzaG91bGQgYWxyZWFkeSBiZSBjaGVja2VkIGJ5IHRoYXQgcnVsZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIDwgMCkgeyBjb250aW51ZSB9XG5cbiAgICAvLyBTb21lIHRhZ3MgY2FuIHRlcm1pbmF0ZSBwYXJhZ3JhcGggd2l0aG91dCBlbXB0eSBsaW5lLlxuICAgIGxldCB0ZXJtaW5hdGUgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGVybWluYXRvclJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgIHRlcm1pbmF0ZSA9IHRydWVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gc3RhdGUuZ2V0TGluZXMoc3RhcnRMaW5lLCBuZXh0TGluZSwgc3RhdGUuYmxrSW5kZW50LCBmYWxzZSkudHJpbSgpXG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG5cbiAgY29uc3QgdG9rZW5fbyAgICA9IHN0YXRlLnB1c2goJ3BhcmFncmFwaF9vcGVuJywgJ3AnLCAxKVxuICB0b2tlbl9vLm1hcCAgICAgID0gW3N0YXJ0TGluZSwgc3RhdGUubGluZV1cblxuICBjb25zdCB0b2tlbl9pICAgID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gIHRva2VuX2kuY29udGVudCAgPSBjb250ZW50XG4gIHRva2VuX2kubWFwICAgICAgPSBbc3RhcnRMaW5lLCBzdGF0ZS5saW5lXVxuICB0b2tlbl9pLmNoaWxkcmVuID0gW11cblxuICBzdGF0ZS5wdXNoKCdwYXJhZ3JhcGhfY2xvc2UnLCAncCcsIC0xKVxuXG4gIHN0YXRlLnBhcmVudFR5cGUgPSBvbGRQYXJlbnRUeXBlXG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCB7IGlzU3BhY2UsIG5vcm1hbGl6ZVJlZmVyZW5jZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZmVyZW5jZSAoc3RhdGUsIHN0YXJ0TGluZSwgX2VuZExpbmUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW3N0YXJ0TGluZV0gKyBzdGF0ZS50U2hpZnRbc3RhcnRMaW5lXVxuICBsZXQgbWF4ID0gc3RhdGUuZU1hcmtzW3N0YXJ0TGluZV1cbiAgbGV0IG5leHRMaW5lID0gc3RhcnRMaW5lICsgMVxuXG4gIC8vIGlmIGl0J3MgaW5kZW50ZWQgbW9yZSB0aGFuIDMgc3BhY2VzLCBpdCBzaG91bGQgYmUgYSBjb2RlIGJsb2NrXG4gIGlmIChzdGF0ZS5zQ291bnRbc3RhcnRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4NUIvKiBbICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgZnVuY3Rpb24gZ2V0TmV4dExpbmUgKG5leHRMaW5lKSB7XG4gICAgY29uc3QgZW5kTGluZSA9IHN0YXRlLmxpbmVNYXhcblxuICAgIGlmIChuZXh0TGluZSA+PSBlbmRMaW5lIHx8IHN0YXRlLmlzRW1wdHkobmV4dExpbmUpKSB7XG4gICAgICAvLyBlbXB0eSBsaW5lIG9yIGVuZCBvZiBpbnB1dFxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBsZXQgaXNDb250aW51YXRpb24gPSBmYWxzZVxuXG4gICAgLy8gdGhpcyB3b3VsZCBiZSBhIGNvZGUgYmxvY2sgbm9ybWFsbHksIGJ1dCBhZnRlciBwYXJhZ3JhcGhcbiAgICAvLyBpdCdzIGNvbnNpZGVyZWQgYSBsYXp5IGNvbnRpbnVhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQncyB0aGVyZVxuICAgIGlmIChzdGF0ZS5zQ291bnRbbmV4dExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID4gMykgeyBpc0NvbnRpbnVhdGlvbiA9IHRydWUgfVxuXG4gICAgLy8gcXVpcmsgZm9yIGJsb2NrcXVvdGVzLCB0aGlzIGxpbmUgc2hvdWxkIGFscmVhZHkgYmUgY2hlY2tlZCBieSB0aGF0IHJ1bGVcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IDApIHsgaXNDb250aW51YXRpb24gPSB0cnVlIH1cblxuICAgIGlmICghaXNDb250aW51YXRpb24pIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0b3JSdWxlcyA9IHN0YXRlLm1kLmJsb2NrLnJ1bGVyLmdldFJ1bGVzKCdyZWZlcmVuY2UnKVxuICAgICAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgICAgIHN0YXRlLnBhcmVudFR5cGUgPSAncmVmZXJlbmNlJ1xuXG4gICAgICAvLyBTb21lIHRhZ3MgY2FuIHRlcm1pbmF0ZSBwYXJhZ3JhcGggd2l0aG91dCBlbXB0eSBsaW5lLlxuICAgICAgbGV0IHRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKHRlcm1pbmF0b3JSdWxlc1tpXShzdGF0ZSwgbmV4dExpbmUsIGVuZExpbmUsIHRydWUpKSB7XG4gICAgICAgICAgdGVybWluYXRlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RhdGUucGFyZW50VHlwZSA9IG9sZFBhcmVudFR5cGVcbiAgICAgIGlmICh0ZXJtaW5hdGUpIHtcbiAgICAgICAgLy8gdGVybWluYXRlZCBieSBhbm90aGVyIGJsb2NrXG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdXG5cbiAgICAvLyBtYXggKyAxIGV4cGxpY2l0bHkgaW5jbHVkZXMgdGhlIG5ld2xpbmVcbiAgICByZXR1cm4gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4ICsgMSlcbiAgfVxuXG4gIGxldCBzdHIgPSBzdGF0ZS5zcmMuc2xpY2UocG9zLCBtYXggKyAxKVxuXG4gIG1heCA9IHN0ci5sZW5ndGhcbiAgbGV0IGxhYmVsRW5kID0gLTFcblxuICBmb3IgKHBvcyA9IDE7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoY2ggPT09IDB4NUIgLyogWyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1RCAvKiBdICovKSB7XG4gICAgICBsYWJlbEVuZCA9IHBvc1xuICAgICAgYnJlYWtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAweDBBIC8qIFxcbiAqLykge1xuICAgICAgY29uc3QgbGluZUNvbnRlbnQgPSBnZXROZXh0TGluZShuZXh0TGluZSlcbiAgICAgIGlmIChsaW5lQ29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICAgICAgbWF4ID0gc3RyLmxlbmd0aFxuICAgICAgICBuZXh0TGluZSsrXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gMHg1QyAvKiBcXCAqLykge1xuICAgICAgcG9zKytcbiAgICAgIGlmIChwb3MgPCBtYXggJiYgc3RyLmNoYXJDb2RlQXQocG9zKSA9PT0gMHgwQSkge1xuICAgICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgICAgICBpZiAobGluZUNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICAgICAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgICAgICAgbmV4dExpbmUrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhYmVsRW5kIDwgMCB8fCBzdHIuY2hhckNvZGVBdChsYWJlbEVuZCArIDEpICE9PSAweDNBLyogOiAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgXl5eIHNraXAgb3B0aW9uYWwgd2hpdGVzcGFjZSBoZXJlXG4gIGZvciAocG9zID0gbGFiZWxFbmQgKyAyOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKGNoID09PSAweDBBKSB7XG4gICAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgICAgaWYgKGxpbmVDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29udGVudFxuICAgICAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgICAgIG5leHRMaW5lKytcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU3BhY2UoY2gpKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tZW1wdHk6MCAqL1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIFtsYWJlbF06ICAgZGVzdGluYXRpb24gICAndGl0bGUnXG4gIC8vICAgICAgICAgICAgXl5eXl5eXl5eXl4gcGFyc2UgdGhpc1xuICBjb25zdCBkZXN0UmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtEZXN0aW5hdGlvbihzdHIsIHBvcywgbWF4KVxuICBpZiAoIWRlc3RSZXMub2spIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBocmVmID0gc3RhdGUubWQubm9ybWFsaXplTGluayhkZXN0UmVzLnN0cilcbiAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoaHJlZikpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBwb3MgPSBkZXN0UmVzLnBvc1xuXG4gIC8vIHNhdmUgY3Vyc29yIHN0YXRlLCB3ZSBjb3VsZCByZXF1aXJlIHRvIHJvbGxiYWNrIGxhdGVyXG4gIGNvbnN0IGRlc3RFbmRQb3MgPSBwb3NcbiAgY29uc3QgZGVzdEVuZExpbmVObyA9IG5leHRMaW5lXG5cbiAgLy8gW2xhYmVsXTogICBkZXN0aW5hdGlvbiAgICd0aXRsZSdcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIF5eXiBza2lwcGluZyB0aG9zZSBzcGFjZXNcbiAgY29uc3Qgc3RhcnQgPSBwb3NcbiAgZm9yICg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHN0ci5jaGFyQ29kZUF0KHBvcylcbiAgICBpZiAoY2ggPT09IDB4MEEpIHtcbiAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gZ2V0TmV4dExpbmUobmV4dExpbmUpXG4gICAgICBpZiAobGluZUNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3RyICs9IGxpbmVDb250ZW50XG4gICAgICAgIG1heCA9IHN0ci5sZW5ndGhcbiAgICAgICAgbmV4dExpbmUrK1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgIC8qIGVzbGludCBuby1lbXB0eTowICovXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy8gW2xhYmVsXTogICBkZXN0aW5hdGlvbiAgICd0aXRsZSdcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl4gcGFyc2UgdGhpc1xuICBsZXQgdGl0bGVSZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua1RpdGxlKHN0ciwgcG9zLCBtYXgpXG4gIHdoaWxlICh0aXRsZVJlcy5jYW5fY29udGludWUpIHtcbiAgICBjb25zdCBsaW5lQ29udGVudCA9IGdldE5leHRMaW5lKG5leHRMaW5lKVxuICAgIGlmIChsaW5lQ29udGVudCA9PT0gbnVsbCkgYnJlYWtcbiAgICBzdHIgKz0gbGluZUNvbnRlbnRcbiAgICBwb3MgPSBtYXhcbiAgICBtYXggPSBzdHIubGVuZ3RoXG4gICAgbmV4dExpbmUrK1xuICAgIHRpdGxlUmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtUaXRsZShzdHIsIHBvcywgbWF4LCB0aXRsZVJlcylcbiAgfVxuICBsZXQgdGl0bGVcblxuICBpZiAocG9zIDwgbWF4ICYmIHN0YXJ0ICE9PSBwb3MgJiYgdGl0bGVSZXMub2spIHtcbiAgICB0aXRsZSA9IHRpdGxlUmVzLnN0clxuICAgIHBvcyA9IHRpdGxlUmVzLnBvc1xuICB9IGVsc2Uge1xuICAgIHRpdGxlID0gJydcbiAgICBwb3MgPSBkZXN0RW5kUG9zXG4gICAgbmV4dExpbmUgPSBkZXN0RW5kTGluZU5vXG4gIH1cblxuICAvLyBza2lwIHRyYWlsaW5nIHNwYWNlcyB1bnRpbCB0aGUgcmVzdCBvZiB0aGUgbGluZVxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgY29uc3QgY2ggPSBzdHIuY2hhckNvZGVBdChwb3MpXG4gICAgaWYgKCFpc1NwYWNlKGNoKSkgeyBicmVhayB9XG4gICAgcG9zKytcbiAgfVxuXG4gIGlmIChwb3MgPCBtYXggJiYgc3RyLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgwQSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgLy8gZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIGFmdGVyIHRpdGxlLFxuICAgICAgLy8gYnV0IGl0IGNvdWxkIHN0aWxsIGJlIGEgdmFsaWQgcmVmZXJlbmNlIGlmIHdlIHJvbGwgYmFja1xuICAgICAgdGl0bGUgPSAnJ1xuICAgICAgcG9zID0gZGVzdEVuZFBvc1xuICAgICAgbmV4dExpbmUgPSBkZXN0RW5kTGluZU5vXG4gICAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICAgIGNvbnN0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICAgICAgICBpZiAoIWlzU3BhY2UoY2gpKSB7IGJyZWFrIH1cbiAgICAgICAgcG9zKytcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocG9zIDwgbWF4ICYmIHN0ci5jaGFyQ29kZUF0KHBvcykgIT09IDB4MEEpIHtcbiAgICAvLyBnYXJiYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNvbnN0IGxhYmVsID0gbm9ybWFsaXplUmVmZXJlbmNlKHN0ci5zbGljZSgxLCBsYWJlbEVuZCkpXG4gIGlmICghbGFiZWwpIHtcbiAgICAvLyBDb21tb25NYXJrIDAuMjAgZGlzYWxsb3dzIGVtcHR5IGxhYmVsc1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gUmVmZXJlbmNlIGNhbiBub3QgdGVybWluYXRlIGFueXRoaW5nLiBUaGlzIGNoZWNrIGlzIGZvciBzYWZldHkgb25seS5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIHRydWUgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdGUuZW52LnJlZmVyZW5jZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgc3RhdGUuZW52LnJlZmVyZW5jZXMgPSB7fVxuICB9XG4gIGlmICh0eXBlb2Ygc3RhdGUuZW52LnJlZmVyZW5jZXNbbGFiZWxdID09PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXRlLmVudi5yZWZlcmVuY2VzW2xhYmVsXSA9IHsgdGl0bGUsIGhyZWYgfVxuICB9XG5cbiAgc3RhdGUubGluZSA9IG5leHRMaW5lXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQYXJzZXIgc3RhdGUgY2xhc3NcblxuaW1wb3J0IFRva2VuIGZyb20gJy4uL3Rva2VuLm1qcydcbmltcG9ydCB7IGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5mdW5jdGlvbiBTdGF0ZUJsb2NrIChzcmMsIG1kLCBlbnYsIHRva2Vucykge1xuICB0aGlzLnNyYyA9IHNyY1xuXG4gIC8vIGxpbmsgdG8gcGFyc2VyIGluc3RhbmNlXG4gIHRoaXMubWQgICAgID0gbWRcblxuICB0aGlzLmVudiA9IGVudlxuXG4gIC8vXG4gIC8vIEludGVybmFsIHN0YXRlIHZhcnRpYWJsZXNcbiAgLy9cblxuICB0aGlzLnRva2VucyA9IHRva2Vuc1xuXG4gIHRoaXMuYk1hcmtzID0gW10gIC8vIGxpbmUgYmVnaW4gb2Zmc2V0cyBmb3IgZmFzdCBqdW1wc1xuICB0aGlzLmVNYXJrcyA9IFtdICAvLyBsaW5lIGVuZCBvZmZzZXRzIGZvciBmYXN0IGp1bXBzXG4gIHRoaXMudFNoaWZ0ID0gW10gIC8vIG9mZnNldHMgb2YgdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyYWN0ZXJzICh0YWJzIG5vdCBleHBhbmRlZClcbiAgdGhpcy5zQ291bnQgPSBbXSAgLy8gaW5kZW50cyBmb3IgZWFjaCBsaW5lICh0YWJzIGV4cGFuZGVkKVxuXG4gIC8vIEFuIGFtb3VudCBvZiB2aXJ0dWFsIHNwYWNlcyAodGFicyBleHBhbmRlZCkgYmV0d2VlbiBiZWdpbm5pbmdcbiAgLy8gb2YgZWFjaCBsaW5lIChiTWFya3MpIGFuZCByZWFsIGJlZ2lubmluZyBvZiB0aGF0IGxpbmUuXG4gIC8vXG4gIC8vIEl0IGV4aXN0cyBvbmx5IGFzIGEgaGFjayBiZWNhdXNlIGJsb2NrcXVvdGVzIG92ZXJyaWRlIGJNYXJrc1xuICAvLyBsb3NpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHByb2Nlc3MuXG4gIC8vXG4gIC8vIEl0J3MgdXNlZCBvbmx5IHdoZW4gZXhwYW5kaW5nIHRhYnMsIHlvdSBjYW4gdGhpbmsgYWJvdXQgaXQgYXNcbiAgLy8gYW4gaW5pdGlhbCB0YWIgbGVuZ3RoLCBlLmcuIGJzQ291bnQ9MjEgYXBwbGllZCB0byBzdHJpbmcgYFxcdDEyM2BcbiAgLy8gbWVhbnMgZmlyc3QgdGFiIHNob3VsZCBiZSBleHBhbmRlZCB0byA0LTIxJTQgPT09IDMgc3BhY2VzLlxuICAvL1xuICB0aGlzLmJzQ291bnQgPSBbXVxuXG4gIC8vIGJsb2NrIHBhcnNlciB2YXJpYWJsZXNcblxuICAvLyByZXF1aXJlZCBibG9jayBjb250ZW50IGluZGVudCAoZm9yIGV4YW1wbGUsIGlmIHdlIGFyZVxuICAvLyBpbnNpZGUgYSBsaXN0LCBpdCB3b3VsZCBiZSBwb3NpdGlvbmVkIGFmdGVyIGxpc3QgbWFya2VyKVxuICB0aGlzLmJsa0luZGVudCAgPSAwXG4gIHRoaXMubGluZSAgICAgICA9IDAgLy8gbGluZSBpbmRleCBpbiBzcmNcbiAgdGhpcy5saW5lTWF4ICAgID0gMCAvLyBsaW5lcyBjb3VudFxuICB0aGlzLnRpZ2h0ICAgICAgPSBmYWxzZSAgLy8gbG9vc2UvdGlnaHQgbW9kZSBmb3IgbGlzdHNcbiAgdGhpcy5kZEluZGVudCAgID0gLTEgLy8gaW5kZW50IG9mIHRoZSBjdXJyZW50IGRkIGJsb2NrICgtMSBpZiB0aGVyZSBpc24ndCBhbnkpXG4gIHRoaXMubGlzdEluZGVudCA9IC0xIC8vIGluZGVudCBvZiB0aGUgY3VycmVudCBsaXN0IGJsb2NrICgtMSBpZiB0aGVyZSBpc24ndCBhbnkpXG5cbiAgLy8gY2FuIGJlICdibG9ja3F1b3RlJywgJ2xpc3QnLCAncm9vdCcsICdwYXJhZ3JhcGgnIG9yICdyZWZlcmVuY2UnXG4gIC8vIHVzZWQgaW4gbGlzdHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgaW50ZXJydXB0IGEgcGFyYWdyYXBoXG4gIHRoaXMucGFyZW50VHlwZSA9ICdyb290J1xuXG4gIHRoaXMubGV2ZWwgPSAwXG5cbiAgLy8gQ3JlYXRlIGNhY2hlc1xuICAvLyBHZW5lcmF0ZSBtYXJrZXJzLlxuICBjb25zdCBzID0gdGhpcy5zcmNcblxuICBmb3IgKGxldCBzdGFydCA9IDAsIHBvcyA9IDAsIGluZGVudCA9IDAsIG9mZnNldCA9IDAsIGxlbiA9IHMubGVuZ3RoLCBpbmRlbnRfZm91bmQgPSBmYWxzZTsgcG9zIDwgbGVuOyBwb3MrKykge1xuICAgIGNvbnN0IGNoID0gcy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmICghaW5kZW50X2ZvdW5kKSB7XG4gICAgICBpZiAoaXNTcGFjZShjaCkpIHtcbiAgICAgICAgaW5kZW50KytcblxuICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICBvZmZzZXQgKz0gNCAtIG9mZnNldCAlIDRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnRfZm91bmQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAweDBBIHx8IHBvcyA9PT0gbGVuIC0gMSkge1xuICAgICAgaWYgKGNoICE9PSAweDBBKSB7IHBvcysrIH1cbiAgICAgIHRoaXMuYk1hcmtzLnB1c2goc3RhcnQpXG4gICAgICB0aGlzLmVNYXJrcy5wdXNoKHBvcylcbiAgICAgIHRoaXMudFNoaWZ0LnB1c2goaW5kZW50KVxuICAgICAgdGhpcy5zQ291bnQucHVzaChvZmZzZXQpXG4gICAgICB0aGlzLmJzQ291bnQucHVzaCgwKVxuXG4gICAgICBpbmRlbnRfZm91bmQgPSBmYWxzZVxuICAgICAgaW5kZW50ID0gMFxuICAgICAgb2Zmc2V0ID0gMFxuICAgICAgc3RhcnQgPSBwb3MgKyAxXG4gICAgfVxuICB9XG5cbiAgLy8gUHVzaCBmYWtlIGVudHJ5IHRvIHNpbXBsaWZ5IGNhY2hlIGJvdW5kcyBjaGVja3NcbiAgdGhpcy5iTWFya3MucHVzaChzLmxlbmd0aClcbiAgdGhpcy5lTWFya3MucHVzaChzLmxlbmd0aClcbiAgdGhpcy50U2hpZnQucHVzaCgwKVxuICB0aGlzLnNDb3VudC5wdXNoKDApXG4gIHRoaXMuYnNDb3VudC5wdXNoKDApXG5cbiAgdGhpcy5saW5lTWF4ID0gdGhpcy5iTWFya3MubGVuZ3RoIC0gMSAvLyBkb24ndCBjb3VudCBsYXN0IGZha2UgbGluZVxufVxuXG4vLyBQdXNoIG5ldyB0b2tlbiB0byBcInN0cmVhbVwiLlxuLy9cblN0YXRlQmxvY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodHlwZSwgdGFnLCBuZXN0aW5nKSB7XG4gIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKHR5cGUsIHRhZywgbmVzdGluZylcbiAgdG9rZW4uYmxvY2sgPSB0cnVlXG5cbiAgaWYgKG5lc3RpbmcgPCAwKSB0aGlzLmxldmVsLS0gLy8gY2xvc2luZyB0YWdcbiAgdG9rZW4ubGV2ZWwgPSB0aGlzLmxldmVsXG4gIGlmIChuZXN0aW5nID4gMCkgdGhpcy5sZXZlbCsrIC8vIG9wZW5pbmcgdGFnXG5cbiAgdGhpcy50b2tlbnMucHVzaCh0b2tlbilcbiAgcmV0dXJuIHRva2VuXG59XG5cblN0YXRlQmxvY2sucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5IChsaW5lKSB7XG4gIHJldHVybiB0aGlzLmJNYXJrc1tsaW5lXSArIHRoaXMudFNoaWZ0W2xpbmVdID49IHRoaXMuZU1hcmtzW2xpbmVdXG59XG5cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBFbXB0eUxpbmVzID0gZnVuY3Rpb24gc2tpcEVtcHR5TGluZXMgKGZyb20pIHtcbiAgZm9yIChsZXQgbWF4ID0gdGhpcy5saW5lTWF4OyBmcm9tIDwgbWF4OyBmcm9tKyspIHtcbiAgICBpZiAodGhpcy5iTWFya3NbZnJvbV0gKyB0aGlzLnRTaGlmdFtmcm9tXSA8IHRoaXMuZU1hcmtzW2Zyb21dKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnJvbVxufVxuXG4vLyBTa2lwIHNwYWNlcyBmcm9tIGdpdmVuIHBvc2l0aW9uLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcFNwYWNlcyA9IGZ1bmN0aW9uIHNraXBTcGFjZXMgKHBvcykge1xuICBmb3IgKGxldCBtYXggPSB0aGlzLnNyYy5sZW5ndGg7IHBvcyA8IG1heDsgcG9zKyspIHtcbiAgICBjb25zdCBjaCA9IHRoaXMuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgIGlmICghaXNTcGFjZShjaCkpIHsgYnJlYWsgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBzcGFjZXMgZnJvbSBnaXZlbiBwb3NpdGlvbiBpbiByZXZlcnNlLlxuU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcFNwYWNlc0JhY2sgPSBmdW5jdGlvbiBza2lwU3BhY2VzQmFjayAocG9zLCBtaW4pIHtcbiAgaWYgKHBvcyA8PSBtaW4pIHsgcmV0dXJuIHBvcyB9XG5cbiAgd2hpbGUgKHBvcyA+IG1pbikge1xuICAgIGlmICghaXNTcGFjZSh0aGlzLnNyYy5jaGFyQ29kZUF0KC0tcG9zKSkpIHsgcmV0dXJuIHBvcyArIDEgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBjaGFyIGNvZGVzIGZyb20gZ2l2ZW4gcG9zaXRpb25cblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBDaGFycyA9IGZ1bmN0aW9uIHNraXBDaGFycyAocG9zLCBjb2RlKSB7XG4gIGZvciAobGV0IG1heCA9IHRoaXMuc3JjLmxlbmd0aDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgIGlmICh0aGlzLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IGNvZGUpIHsgYnJlYWsgfVxuICB9XG4gIHJldHVybiBwb3Ncbn1cblxuLy8gU2tpcCBjaGFyIGNvZGVzIHJldmVyc2UgZnJvbSBnaXZlbiBwb3NpdGlvbiAtIDFcblN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBDaGFyc0JhY2sgPSBmdW5jdGlvbiBza2lwQ2hhcnNCYWNrIChwb3MsIGNvZGUsIG1pbikge1xuICBpZiAocG9zIDw9IG1pbikgeyByZXR1cm4gcG9zIH1cblxuICB3aGlsZSAocG9zID4gbWluKSB7XG4gICAgaWYgKGNvZGUgIT09IHRoaXMuc3JjLmNoYXJDb2RlQXQoLS1wb3MpKSB7IHJldHVybiBwb3MgKyAxIH1cbiAgfVxuICByZXR1cm4gcG9zXG59XG5cbi8vIGN1dCBsaW5lcyByYW5nZSBmcm9tIHNvdXJjZS5cblN0YXRlQmxvY2sucHJvdG90eXBlLmdldExpbmVzID0gZnVuY3Rpb24gZ2V0TGluZXMgKGJlZ2luLCBlbmQsIGluZGVudCwga2VlcExhc3RMRikge1xuICBpZiAoYmVnaW4gPj0gZW5kKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBxdWV1ZSA9IG5ldyBBcnJheShlbmQgLSBiZWdpbilcblxuICBmb3IgKGxldCBpID0gMCwgbGluZSA9IGJlZ2luOyBsaW5lIDwgZW5kOyBsaW5lKyssIGkrKykge1xuICAgIGxldCBsaW5lSW5kZW50ID0gMFxuICAgIGNvbnN0IGxpbmVTdGFydCA9IHRoaXMuYk1hcmtzW2xpbmVdXG4gICAgbGV0IGZpcnN0ID0gbGluZVN0YXJ0XG4gICAgbGV0IGxhc3RcblxuICAgIGlmIChsaW5lICsgMSA8IGVuZCB8fCBrZWVwTGFzdExGKSB7XG4gICAgICAvLyBObyBuZWVkIGZvciBib3VuZHMgY2hlY2sgYmVjYXVzZSB3ZSBoYXZlIGZha2UgZW50cnkgb24gdGFpbC5cbiAgICAgIGxhc3QgPSB0aGlzLmVNYXJrc1tsaW5lXSArIDFcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IHRoaXMuZU1hcmtzW2xpbmVdXG4gICAgfVxuXG4gICAgd2hpbGUgKGZpcnN0IDwgbGFzdCAmJiBsaW5lSW5kZW50IDwgaW5kZW50KSB7XG4gICAgICBjb25zdCBjaCA9IHRoaXMuc3JjLmNoYXJDb2RlQXQoZmlyc3QpXG5cbiAgICAgIGlmIChpc1NwYWNlKGNoKSkge1xuICAgICAgICBpZiAoY2ggPT09IDB4MDkpIHtcbiAgICAgICAgICBsaW5lSW5kZW50ICs9IDQgLSAobGluZUluZGVudCArIHRoaXMuYnNDb3VudFtsaW5lXSkgJSA0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZUluZGVudCsrXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlyc3QgLSBsaW5lU3RhcnQgPCB0aGlzLnRTaGlmdFtsaW5lXSkge1xuICAgICAgICAvLyBwYXRjaGVkIHRTaGlmdCBtYXNrZWQgY2hhcmFjdGVycyB0byBsb29rIGxpa2Ugc3BhY2VzIChibG9ja3F1b3RlcywgbGlzdCBtYXJrZXJzKVxuICAgICAgICBsaW5lSW5kZW50KytcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGZpcnN0KytcbiAgICB9XG5cbiAgICBpZiAobGluZUluZGVudCA+IGluZGVudCkge1xuICAgICAgLy8gcGFydGlhbGx5IGV4cGFuZGluZyB0YWJzIGluIGNvZGUgYmxvY2tzLCBlLmcgJ1xcdFxcdGZvb2JhcidcbiAgICAgIC8vIHdpdGggaW5kZW50PTIgYmVjb21lcyAnICBcXHRmb29iYXInXG4gICAgICBxdWV1ZVtpXSA9IG5ldyBBcnJheShsaW5lSW5kZW50IC0gaW5kZW50ICsgMSkuam9pbignICcpICsgdGhpcy5zcmMuc2xpY2UoZmlyc3QsIGxhc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlW2ldID0gdGhpcy5zcmMuc2xpY2UoZmlyc3QsIGxhc3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHF1ZXVlLmpvaW4oJycpXG59XG5cbi8vIHJlLWV4cG9ydCBUb2tlbiBjbGFzcyB0byB1c2UgaW4gYmxvY2sgcnVsZXNcblN0YXRlQmxvY2sucHJvdG90eXBlLlRva2VuID0gVG9rZW5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVCbG9ja1xuIiwiLy8gR0ZNIHRhYmxlLCBodHRwczovL2dpdGh1Yi5naXRodWIuY29tL2dmbS8jdGFibGVzLWV4dGVuc2lvbi1cblxuaW1wb3J0IHsgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbi8vIExpbWl0IHRoZSBhbW91bnQgb2YgZW1wdHkgYXV0b2NvbXBsZXRlZCBjZWxscyBpbiBhIHRhYmxlLFxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9tYXJrZG93bi1pdC9pc3N1ZXMvMTAwMCxcbi8vXG4vLyBCb3RoIHB1bGxkb3duLWNtYXJrIGFuZCBjb21tb25tYXJrLWhzIGxpbWl0IHRoZSBudW1iZXIgb2YgY2VsbHMgdGhpcyB3YXkgdG8gfjIwMGsuXG4vLyBXZSBzZXQgaXQgdG8gNjVrLCB3aGljaCBjYW4gZXhwYW5kIHVzZXIgaW5wdXQgYnkgYSBmYWN0b3Igb2YgeDM3MFxuLy8gKDI1NngyNTYgc3F1YXJlIGlzIDEuOGtCIGV4cGFuZGVkIGludG8gNjUwa0IpLlxuY29uc3QgTUFYX0FVVE9DT01QTEVURURfQ0VMTFMgPSAweDEwMDAwXG5cbmZ1bmN0aW9uIGdldExpbmUgKHN0YXRlLCBsaW5lKSB7XG4gIGNvbnN0IHBvcyA9IHN0YXRlLmJNYXJrc1tsaW5lXSArIHN0YXRlLnRTaGlmdFtsaW5lXVxuICBjb25zdCBtYXggPSBzdGF0ZS5lTWFya3NbbGluZV1cblxuICByZXR1cm4gc3RhdGUuc3JjLnNsaWNlKHBvcywgbWF4KVxufVxuXG5mdW5jdGlvbiBlc2NhcGVkU3BsaXQgKHN0cikge1xuICBjb25zdCByZXN1bHQgPSBbXVxuICBjb25zdCBtYXggPSBzdHIubGVuZ3RoXG5cbiAgbGV0IHBvcyA9IDBcbiAgbGV0IGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICBsZXQgaXNFc2NhcGVkID0gZmFsc2VcbiAgbGV0IGxhc3RQb3MgPSAwXG4gIGxldCBjdXJyZW50ID0gJydcblxuICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgaWYgKGNoID09PSAweDdjLyogfCAqLykge1xuICAgICAgaWYgKCFpc0VzY2FwZWQpIHtcbiAgICAgICAgLy8gcGlwZSBzZXBhcmF0aW5nIGNlbGxzLCAnfCdcbiAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudCArIHN0ci5zdWJzdHJpbmcobGFzdFBvcywgcG9zKSlcbiAgICAgICAgY3VycmVudCA9ICcnXG4gICAgICAgIGxhc3RQb3MgPSBwb3MgKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2NhcGVkIHBpcGUsICdcXHwnXG4gICAgICAgIGN1cnJlbnQgKz0gc3RyLnN1YnN0cmluZyhsYXN0UG9zLCBwb3MgLSAxKVxuICAgICAgICBsYXN0UG9zID0gcG9zXG4gICAgICB9XG4gICAgfVxuXG4gICAgaXNFc2NhcGVkID0gKGNoID09PSAweDVjLyogXFwgKi8pXG4gICAgcG9zKytcblxuICAgIGNoID0gc3RyLmNoYXJDb2RlQXQocG9zKVxuICB9XG5cbiAgcmVzdWx0LnB1c2goY3VycmVudCArIHN0ci5zdWJzdHJpbmcobGFzdFBvcykpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0YWJsZSAoc3RhdGUsIHN0YXJ0TGluZSwgZW5kTGluZSwgc2lsZW50KSB7XG4gIC8vIHNob3VsZCBoYXZlIGF0IGxlYXN0IHR3byBsaW5lc1xuICBpZiAoc3RhcnRMaW5lICsgMiA+IGVuZExpbmUpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBsZXQgbmV4dExpbmUgPSBzdGFydExpbmUgKyAxXG5cbiAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gPCBzdGF0ZS5ibGtJbmRlbnQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAvLyBpZiBpdCdzIGluZGVudGVkIG1vcmUgdGhhbiAzIHNwYWNlcywgaXQgc2hvdWxkIGJlIGEgY29kZSBibG9ja1xuICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSAtIHN0YXRlLmJsa0luZGVudCA+PSA0KSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLy8gZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZWNvbmQgbGluZSBzaG91bGQgYmUgJ3wnLCAnLScsICc6JyxcbiAgLy8gYW5kIG5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgYnV0IHNwYWNlcztcbiAgLy8gYmFzaWNhbGx5LCB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIC9eWy06fF1bLTp8XFxzXSokLyByZWdleHBcblxuICBsZXQgcG9zID0gc3RhdGUuYk1hcmtzW25leHRMaW5lXSArIHN0YXRlLnRTaGlmdFtuZXh0TGluZV1cbiAgaWYgKHBvcyA+PSBzdGF0ZS5lTWFya3NbbmV4dExpbmVdKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3QgZmlyc3RDaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICBpZiAoZmlyc3RDaCAhPT0gMHg3Qy8qIHwgKi8gJiYgZmlyc3RDaCAhPT0gMHgyRC8qIC0gKi8gJiYgZmlyc3RDaCAhPT0gMHgzQS8qIDogKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAocG9zID49IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBzZWNvbmRDaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcysrKVxuICBpZiAoc2Vjb25kQ2ggIT09IDB4N0MvKiB8ICovICYmIHNlY29uZENoICE9PSAweDJELyogLSAqLyAmJiBzZWNvbmRDaCAhPT0gMHgzQS8qIDogKi8gJiYgIWlzU3BhY2Uoc2Vjb25kQ2gpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBpZiBmaXJzdCBjaGFyYWN0ZXIgaXMgJy0nLCB0aGVuIHNlY29uZCBjaGFyYWN0ZXIgbXVzdCBub3QgYmUgYSBzcGFjZVxuICAvLyAoZHVlIHRvIHBhcnNpbmcgYW1iaWd1aXR5IHdpdGggbGlzdClcbiAgaWYgKGZpcnN0Q2ggPT09IDB4MkQvKiAtICovICYmIGlzU3BhY2Uoc2Vjb25kQ2gpKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgd2hpbGUgKHBvcyA8IHN0YXRlLmVNYXJrc1tuZXh0TGluZV0pIHtcbiAgICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmIChjaCAhPT0gMHg3Qy8qIHwgKi8gJiYgY2ggIT09IDB4MkQvKiAtICovICYmIGNoICE9PSAweDNBLyogOiAqLyAmJiAhaXNTcGFjZShjaCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIHBvcysrXG4gIH1cblxuICBsZXQgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBzdGFydExpbmUgKyAxKVxuICBsZXQgY29sdW1ucyA9IGxpbmVUZXh0LnNwbGl0KCd8JylcbiAgY29uc3QgYWxpZ25zID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdCA9IGNvbHVtbnNbaV0udHJpbSgpXG4gICAgaWYgKCF0KSB7XG4gICAgICAvLyBhbGxvdyBlbXB0eSBjb2x1bW5zIGJlZm9yZSBhbmQgYWZ0ZXIgdGFibGUsIGJ1dCBub3QgaW4gYmV0d2VlbiBjb2x1bW5zO1xuICAgICAgLy8gZS5nLiBhbGxvdyBgIHwtLS18IGAsIGRpc2FsbG93IGAgLS0tfHwtLS0gYFxuICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gY29sdW1ucy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIS9eOj8tKzo/JC8udGVzdCh0KSkgeyByZXR1cm4gZmFsc2UgfVxuICAgIGlmICh0LmNoYXJDb2RlQXQodC5sZW5ndGggLSAxKSA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGFsaWducy5wdXNoKHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzQS8qIDogKi8gPyAnY2VudGVyJyA6ICdyaWdodCcpXG4gICAgfSBlbHNlIGlmICh0LmNoYXJDb2RlQXQoMCkgPT09IDB4M0EvKiA6ICovKSB7XG4gICAgICBhbGlnbnMucHVzaCgnbGVmdCcpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFsaWducy5wdXNoKCcnKVxuICAgIH1cbiAgfVxuXG4gIGxpbmVUZXh0ID0gZ2V0TGluZShzdGF0ZSwgc3RhcnRMaW5lKS50cmltKClcbiAgaWYgKGxpbmVUZXh0LmluZGV4T2YoJ3wnKSA9PT0gLTEpIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKHN0YXRlLnNDb3VudFtzdGFydExpbmVdIC0gc3RhdGUuYmxrSW5kZW50ID49IDQpIHsgcmV0dXJuIGZhbHNlIH1cbiAgY29sdW1ucyA9IGVzY2FwZWRTcGxpdChsaW5lVGV4dClcbiAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbMF0gPT09ICcnKSBjb2x1bW5zLnNoaWZ0KClcbiAgaWYgKGNvbHVtbnMubGVuZ3RoICYmIGNvbHVtbnNbY29sdW1ucy5sZW5ndGggLSAxXSA9PT0gJycpIGNvbHVtbnMucG9wKClcblxuICAvLyBoZWFkZXIgcm93IHdpbGwgZGVmaW5lIGFuIGFtb3VudCBvZiBjb2x1bW5zIGluIHRoZSBlbnRpcmUgdGFibGUsXG4gIC8vIGFuZCBhbGlnbiByb3cgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgKHRoZSByZXN0IG9mIHRoZSByb3dzIGNhbiBkaWZmZXIpXG4gIGNvbnN0IGNvbHVtbkNvdW50ID0gY29sdW1ucy5sZW5ndGhcbiAgaWYgKGNvbHVtbkNvdW50ID09PSAwIHx8IGNvbHVtbkNvdW50ICE9PSBhbGlnbnMubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gdHJ1ZSB9XG5cbiAgY29uc3Qgb2xkUGFyZW50VHlwZSA9IHN0YXRlLnBhcmVudFR5cGVcbiAgc3RhdGUucGFyZW50VHlwZSA9ICd0YWJsZSdcblxuICAvLyB1c2UgJ2Jsb2NrcXVvdGUnIGxpc3RzIGZvciB0ZXJtaW5hdGlvbiBiZWNhdXNlIGl0J3NcbiAgLy8gdGhlIG1vc3Qgc2ltaWxhciB0byB0YWJsZXNcbiAgY29uc3QgdGVybWluYXRvclJ1bGVzID0gc3RhdGUubWQuYmxvY2sucnVsZXIuZ2V0UnVsZXMoJ2Jsb2NrcXVvdGUnKVxuXG4gIGNvbnN0IHRva2VuX3RvID0gc3RhdGUucHVzaCgndGFibGVfb3BlbicsICd0YWJsZScsIDEpXG4gIGNvbnN0IHRhYmxlTGluZXMgPSBbc3RhcnRMaW5lLCAwXVxuICB0b2tlbl90by5tYXAgPSB0YWJsZUxpbmVzXG5cbiAgY29uc3QgdG9rZW5fdGhvID0gc3RhdGUucHVzaCgndGhlYWRfb3BlbicsICd0aGVhZCcsIDEpXG4gIHRva2VuX3Roby5tYXAgPSBbc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxXVxuXG4gIGNvbnN0IHRva2VuX2h0cm8gPSBzdGF0ZS5wdXNoKCd0cl9vcGVuJywgJ3RyJywgMSlcbiAgdG9rZW5faHRyby5tYXAgPSBbc3RhcnRMaW5lLCBzdGFydExpbmUgKyAxXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuX2hvID0gc3RhdGUucHVzaCgndGhfb3BlbicsICd0aCcsIDEpXG4gICAgaWYgKGFsaWduc1tpXSkge1xuICAgICAgdG9rZW5faG8uYXR0cnMgID0gW1snc3R5bGUnLCAndGV4dC1hbGlnbjonICsgYWxpZ25zW2ldXV1cbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbl9pbCA9IHN0YXRlLnB1c2goJ2lubGluZScsICcnLCAwKVxuICAgIHRva2VuX2lsLmNvbnRlbnQgID0gY29sdW1uc1tpXS50cmltKClcbiAgICB0b2tlbl9pbC5jaGlsZHJlbiA9IFtdXG5cbiAgICBzdGF0ZS5wdXNoKCd0aF9jbG9zZScsICd0aCcsIC0xKVxuICB9XG5cbiAgc3RhdGUucHVzaCgndHJfY2xvc2UnLCAndHInLCAtMSlcbiAgc3RhdGUucHVzaCgndGhlYWRfY2xvc2UnLCAndGhlYWQnLCAtMSlcblxuICBsZXQgdGJvZHlMaW5lc1xuICBsZXQgYXV0b2NvbXBsZXRlZENlbGxzID0gMFxuXG4gIGZvciAobmV4dExpbmUgPSBzdGFydExpbmUgKyAyOyBuZXh0TGluZSA8IGVuZExpbmU7IG5leHRMaW5lKyspIHtcbiAgICBpZiAoc3RhdGUuc0NvdW50W25leHRMaW5lXSA8IHN0YXRlLmJsa0luZGVudCkgeyBicmVhayB9XG5cbiAgICBsZXQgdGVybWluYXRlID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRlcm1pbmF0b3JSdWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0ZXJtaW5hdG9yUnVsZXNbaV0oc3RhdGUsIG5leHRMaW5lLCBlbmRMaW5lLCB0cnVlKSkge1xuICAgICAgICB0ZXJtaW5hdGUgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlcm1pbmF0ZSkgeyBicmVhayB9XG4gICAgbGluZVRleHQgPSBnZXRMaW5lKHN0YXRlLCBuZXh0TGluZSkudHJpbSgpXG4gICAgaWYgKCFsaW5lVGV4dCkgeyBicmVhayB9XG4gICAgaWYgKHN0YXRlLnNDb3VudFtuZXh0TGluZV0gLSBzdGF0ZS5ibGtJbmRlbnQgPj0gNCkgeyBicmVhayB9XG4gICAgY29sdW1ucyA9IGVzY2FwZWRTcGxpdChsaW5lVGV4dClcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggJiYgY29sdW1uc1swXSA9PT0gJycpIGNvbHVtbnMuc2hpZnQoKVxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCAmJiBjb2x1bW5zW2NvbHVtbnMubGVuZ3RoIC0gMV0gPT09ICcnKSBjb2x1bW5zLnBvcCgpXG5cbiAgICAvLyBub3RlOiBhdXRvY29tcGxldGUgY291bnQgY2FuIGJlIG5lZ2F0aXZlIGlmIHVzZXIgc3BlY2lmaWVzIG1vcmUgY29sdW1ucyB0aGFuIGhlYWRlcixcbiAgICAvLyBidXQgdGhhdCBkb2VzIG5vdCBhZmZlY3QgaW50ZW5kZWQgdXNlICh3aGljaCBpcyBsaW1pdGluZyBleHBhbnNpb24pXG4gICAgYXV0b2NvbXBsZXRlZENlbGxzICs9IGNvbHVtbkNvdW50IC0gY29sdW1ucy5sZW5ndGhcbiAgICBpZiAoYXV0b2NvbXBsZXRlZENlbGxzID4gTUFYX0FVVE9DT01QTEVURURfQ0VMTFMpIHsgYnJlYWsgfVxuXG4gICAgaWYgKG5leHRMaW5lID09PSBzdGFydExpbmUgKyAyKSB7XG4gICAgICBjb25zdCB0b2tlbl90Ym8gPSBzdGF0ZS5wdXNoKCd0Ym9keV9vcGVuJywgJ3Rib2R5JywgMSlcbiAgICAgIHRva2VuX3Riby5tYXAgPSB0Ym9keUxpbmVzID0gW3N0YXJ0TGluZSArIDIsIDBdXG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5fdHJvID0gc3RhdGUucHVzaCgndHJfb3BlbicsICd0cicsIDEpXG4gICAgdG9rZW5fdHJvLm1hcCA9IFtuZXh0TGluZSwgbmV4dExpbmUgKyAxXVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB0b2tlbl90ZG8gPSBzdGF0ZS5wdXNoKCd0ZF9vcGVuJywgJ3RkJywgMSlcbiAgICAgIGlmIChhbGlnbnNbaV0pIHtcbiAgICAgICAgdG9rZW5fdGRvLmF0dHJzICA9IFtbJ3N0eWxlJywgJ3RleHQtYWxpZ246JyArIGFsaWduc1tpXV1dXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuX2lsID0gc3RhdGUucHVzaCgnaW5saW5lJywgJycsIDApXG4gICAgICB0b2tlbl9pbC5jb250ZW50ICA9IGNvbHVtbnNbaV0gPyBjb2x1bW5zW2ldLnRyaW0oKSA6ICcnXG4gICAgICB0b2tlbl9pbC5jaGlsZHJlbiA9IFtdXG5cbiAgICAgIHN0YXRlLnB1c2goJ3RkX2Nsb3NlJywgJ3RkJywgLTEpXG4gICAgfVxuICAgIHN0YXRlLnB1c2goJ3RyX2Nsb3NlJywgJ3RyJywgLTEpXG4gIH1cblxuICBpZiAodGJvZHlMaW5lcykge1xuICAgIHN0YXRlLnB1c2goJ3Rib2R5X2Nsb3NlJywgJ3Rib2R5JywgLTEpXG4gICAgdGJvZHlMaW5lc1sxXSA9IG5leHRMaW5lXG4gIH1cblxuICBzdGF0ZS5wdXNoKCd0YWJsZV9jbG9zZScsICd0YWJsZScsIC0xKVxuICB0YWJsZUxpbmVzWzFdID0gbmV4dExpbmVcblxuICBzdGF0ZS5wYXJlbnRUeXBlID0gb2xkUGFyZW50VHlwZVxuICBzdGF0ZS5saW5lID0gbmV4dExpbmVcbiAgcmV0dXJuIHRydWVcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJsb2NrIChzdGF0ZSkge1xuICBsZXQgdG9rZW5cblxuICBpZiAoc3RhdGUuaW5saW5lTW9kZSkge1xuICAgIHRva2VuICAgICAgICAgID0gbmV3IHN0YXRlLlRva2VuKCdpbmxpbmUnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ICA9IHN0YXRlLnNyY1xuICAgIHRva2VuLm1hcCAgICAgID0gWzAsIDFdXG4gICAgdG9rZW4uY2hpbGRyZW4gPSBbXVxuICAgIHN0YXRlLnRva2Vucy5wdXNoKHRva2VuKVxuICB9IGVsc2Uge1xuICAgIHN0YXRlLm1kLmJsb2NrLnBhcnNlKHN0YXRlLnNyYywgc3RhdGUubWQsIHN0YXRlLmVudiwgc3RhdGUudG9rZW5zKVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbmxpbmUgKHN0YXRlKSB7XG4gIGNvbnN0IHRva2VucyA9IHN0YXRlLnRva2Vuc1xuXG4gIC8vIFBhcnNlIGlubGluZXNcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgdG9rID0gdG9rZW5zW2ldXG4gICAgaWYgKHRvay50eXBlID09PSAnaW5saW5lJykge1xuICAgICAgc3RhdGUubWQuaW5saW5lLnBhcnNlKHRvay5jb250ZW50LCBzdGF0ZS5tZCwgc3RhdGUuZW52LCB0b2suY2hpbGRyZW4pXG4gICAgfVxuICB9XG59XG4iLCIvLyBSZXBsYWNlIGxpbmstbGlrZSB0ZXh0cyB3aXRoIGxpbmsgbm9kZXMuXG4vL1xuLy8gQ3VycmVudGx5IHJlc3RyaWN0ZWQgYnkgYG1kLnZhbGlkYXRlTGluaygpYCB0byBodHRwL2h0dHBzL2Z0cFxuLy9cblxuaW1wb3J0IHsgYXJyYXlSZXBsYWNlQXQgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5mdW5jdGlvbiBpc0xpbmtPcGVuIChzdHIpIHtcbiAgcmV0dXJuIC9ePGFbPlxcc10vaS50ZXN0KHN0cilcbn1cbmZ1bmN0aW9uIGlzTGlua0Nsb3NlIChzdHIpIHtcbiAgcmV0dXJuIC9ePFxcL2FcXHMqPi9pLnRlc3Qoc3RyKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5raWZ5IChzdGF0ZSkge1xuICBjb25zdCBibG9ja1Rva2VucyA9IHN0YXRlLnRva2Vuc1xuXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5saW5raWZ5KSB7IHJldHVybiB9XG5cbiAgZm9yIChsZXQgaiA9IDAsIGwgPSBibG9ja1Rva2Vucy5sZW5ndGg7IGogPCBsOyBqKyspIHtcbiAgICBpZiAoYmxvY2tUb2tlbnNbal0udHlwZSAhPT0gJ2lubGluZScgfHxcbiAgICAgICAgIXN0YXRlLm1kLmxpbmtpZnkucHJldGVzdChibG9ja1Rva2Vuc1tqXS5jb250ZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgdG9rZW5zID0gYmxvY2tUb2tlbnNbal0uY2hpbGRyZW5cblxuICAgIGxldCBodG1sTGlua0xldmVsID0gMFxuXG4gICAgLy8gV2Ugc2NhbiBmcm9tIHRoZSBlbmQsIHRvIGtlZXAgcG9zaXRpb24gd2hlbiBuZXcgdGFncyBhZGRlZC5cbiAgICAvLyBVc2UgcmV2ZXJzZWQgbG9naWMgaW4gbGlua3Mgc3RhcnQvZW5kIG1hdGNoXG4gICAgZm9yIChsZXQgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgY3VycmVudFRva2VuID0gdG9rZW5zW2ldXG5cbiAgICAgIC8vIFNraXAgY29udGVudCBvZiBtYXJrZG93biBsaW5rc1xuICAgICAgaWYgKGN1cnJlbnRUb2tlbi50eXBlID09PSAnbGlua19jbG9zZScpIHtcbiAgICAgICAgaS0tXG4gICAgICAgIHdoaWxlICh0b2tlbnNbaV0ubGV2ZWwgIT09IGN1cnJlbnRUb2tlbi5sZXZlbCAmJiB0b2tlbnNbaV0udHlwZSAhPT0gJ2xpbmtfb3BlbicpIHtcbiAgICAgICAgICBpLS1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBTa2lwIGNvbnRlbnQgb2YgaHRtbCB0YWcgbGlua3NcbiAgICAgIGlmIChjdXJyZW50VG9rZW4udHlwZSA9PT0gJ2h0bWxfaW5saW5lJykge1xuICAgICAgICBpZiAoaXNMaW5rT3BlbihjdXJyZW50VG9rZW4uY29udGVudCkgJiYgaHRtbExpbmtMZXZlbCA+IDApIHtcbiAgICAgICAgICBodG1sTGlua0xldmVsLS1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNMaW5rQ2xvc2UoY3VycmVudFRva2VuLmNvbnRlbnQpKSB7XG4gICAgICAgICAgaHRtbExpbmtMZXZlbCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChodG1sTGlua0xldmVsID4gMCkgeyBjb250aW51ZSB9XG5cbiAgICAgIGlmIChjdXJyZW50VG9rZW4udHlwZSA9PT0gJ3RleHQnICYmIHN0YXRlLm1kLmxpbmtpZnkudGVzdChjdXJyZW50VG9rZW4uY29udGVudCkpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IGN1cnJlbnRUb2tlbi5jb250ZW50XG4gICAgICAgIGxldCBsaW5rcyA9IHN0YXRlLm1kLmxpbmtpZnkubWF0Y2godGV4dClcblxuICAgICAgICAvLyBOb3cgc3BsaXQgc3RyaW5nIHRvIG5vZGVzXG4gICAgICAgIGNvbnN0IG5vZGVzID0gW11cbiAgICAgICAgbGV0IGxldmVsID0gY3VycmVudFRva2VuLmxldmVsXG4gICAgICAgIGxldCBsYXN0UG9zID0gMFxuXG4gICAgICAgIC8vIGZvcmJpZCBlc2NhcGUgc2VxdWVuY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsXG4gICAgICAgIC8vIHRoaXMgYXZvaWRzIGh0dHBcXDovL2V4YW1wbGUuY29tLyBmcm9tIGJlaW5nIGxpbmtpZmllZCBhc1xuICAgICAgICAvLyBodHRwOjxhIGhyZWY9XCIvL2V4YW1wbGUuY29tL1wiPi8vZXhhbXBsZS5jb20vPC9hPlxuICAgICAgICBpZiAobGlua3MubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgbGlua3NbMF0uaW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgIGkgPiAwICYmXG4gICAgICAgICAgICB0b2tlbnNbaSAtIDFdLnR5cGUgPT09ICd0ZXh0X3NwZWNpYWwnKSB7XG4gICAgICAgICAgbGlua3MgPSBsaW5rcy5zbGljZSgxKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmtzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGxpbmtzW2xuXS51cmxcbiAgICAgICAgICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluayh1cmwpXG4gICAgICAgICAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHsgY29udGludWUgfVxuXG4gICAgICAgICAgbGV0IHVybFRleHQgPSBsaW5rc1tsbl0udGV4dFxuXG4gICAgICAgICAgLy8gTGlua2lmaWVyIG1pZ2h0IHNlbmQgcmF3IGhvc3RuYW1lcyBsaWtlIFwiZXhhbXBsZS5jb21cIiwgd2hlcmUgdXJsXG4gICAgICAgICAgLy8gc3RhcnRzIHdpdGggZG9tYWluIG5hbWUuIFNvIHdlIHByZXBlbmQgaHR0cDovLyBpbiB0aG9zZSBjYXNlcyxcbiAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGl0IGFmdGVyd2FyZHMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBpZiAoIWxpbmtzW2xuXS5zY2hlbWEpIHtcbiAgICAgICAgICAgIHVybFRleHQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCgnaHR0cDovLycgKyB1cmxUZXh0KS5yZXBsYWNlKC9eaHR0cDpcXC9cXC8vLCAnJylcbiAgICAgICAgICB9IGVsc2UgaWYgKGxpbmtzW2xuXS5zY2hlbWEgPT09ICdtYWlsdG86JyAmJiAhL15tYWlsdG86L2kudGVzdCh1cmxUZXh0KSkge1xuICAgICAgICAgICAgdXJsVGV4dCA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmtUZXh0KCdtYWlsdG86JyArIHVybFRleHQpLnJlcGxhY2UoL15tYWlsdG86LywgJycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybFRleHQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCh1cmxUZXh0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBvcyA9IGxpbmtzW2xuXS5pbmRleFxuXG4gICAgICAgICAgaWYgKHBvcyA+IGxhc3RQb3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuICAgPSBuZXcgc3RhdGUuVG9rZW4oJ3RleHQnLCAnJywgMClcbiAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSB0ZXh0LnNsaWNlKGxhc3RQb3MsIHBvcylcbiAgICAgICAgICAgIHRva2VuLmxldmVsICAgPSBsZXZlbFxuICAgICAgICAgICAgbm9kZXMucHVzaCh0b2tlbilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0b2tlbl9vICAgPSBuZXcgc3RhdGUuVG9rZW4oJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICAgICAgICB0b2tlbl9vLmF0dHJzICAgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgICAgICAgdG9rZW5fby5sZXZlbCAgID0gbGV2ZWwrK1xuICAgICAgICAgIHRva2VuX28ubWFya3VwICA9ICdsaW5raWZ5J1xuICAgICAgICAgIHRva2VuX28uaW5mbyAgICA9ICdhdXRvJ1xuICAgICAgICAgIG5vZGVzLnB1c2godG9rZW5fbylcblxuICAgICAgICAgIGNvbnN0IHRva2VuX3QgICA9IG5ldyBzdGF0ZS5Ub2tlbigndGV4dCcsICcnLCAwKVxuICAgICAgICAgIHRva2VuX3QuY29udGVudCA9IHVybFRleHRcbiAgICAgICAgICB0b2tlbl90LmxldmVsICAgPSBsZXZlbFxuICAgICAgICAgIG5vZGVzLnB1c2godG9rZW5fdClcblxuICAgICAgICAgIGNvbnN0IHRva2VuX2MgICA9IG5ldyBzdGF0ZS5Ub2tlbignbGlua19jbG9zZScsICdhJywgLTEpXG4gICAgICAgICAgdG9rZW5fYy5sZXZlbCAgID0gLS1sZXZlbFxuICAgICAgICAgIHRva2VuX2MubWFya3VwICA9ICdsaW5raWZ5J1xuICAgICAgICAgIHRva2VuX2MuaW5mbyAgICA9ICdhdXRvJ1xuICAgICAgICAgIG5vZGVzLnB1c2godG9rZW5fYylcblxuICAgICAgICAgIGxhc3RQb3MgPSBsaW5rc1tsbl0ubGFzdEluZGV4XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RQb3MgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuICAgPSBuZXcgc3RhdGUuVG9rZW4oJ3RleHQnLCAnJywgMClcbiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gdGV4dC5zbGljZShsYXN0UG9zKVxuICAgICAgICAgIHRva2VuLmxldmVsICAgPSBsZXZlbFxuICAgICAgICAgIG5vZGVzLnB1c2godG9rZW4pXG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXBsYWNlIGN1cnJlbnQgbm9kZVxuICAgICAgICBibG9ja1Rva2Vuc1tqXS5jaGlsZHJlbiA9IHRva2VucyA9IGFycmF5UmVwbGFjZUF0KHRva2VucywgaSwgbm9kZXMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvLyBOb3JtYWxpemUgaW5wdXQgc3RyaW5nXG5cbi8vIGh0dHBzOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjI5LyNsaW5lLWVuZGluZ1xuY29uc3QgTkVXTElORVNfUkUgID0gL1xcclxcbj98XFxuL2dcbmNvbnN0IE5VTExfUkUgICAgICA9IC9cXDAvZ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub3JtYWxpemUgKHN0YXRlKSB7XG4gIGxldCBzdHJcblxuICAvLyBOb3JtYWxpemUgbmV3bGluZXNcbiAgc3RyID0gc3RhdGUuc3JjLnJlcGxhY2UoTkVXTElORVNfUkUsICdcXG4nKVxuXG4gIC8vIFJlcGxhY2UgTlVMTCBjaGFyYWN0ZXJzXG4gIHN0ciA9IHN0ci5yZXBsYWNlKE5VTExfUkUsICdcXHVGRkZEJylcblxuICBzdGF0ZS5zcmMgPSBzdHJcbn1cbiIsIi8vIFNpbXBsZSB0eXBvZ3JhcGhpYyByZXBsYWNlbWVudHNcbi8vXG4vLyAoYykgKEMpIOKGkiDCqVxuLy8gKHRtKSAoVE0pIOKGkiDihKJcbi8vIChyKSAoUikg4oaSIMKuXG4vLyArLSDihpIgwrFcbi8vIC4uLiDihpIg4oCmIChhbHNvID8uLi4uIOKGkiA/Li4sICEuLi4uIOKGkiAhLi4pXG4vLyA/Pz8/Pz8/PyDihpIgPz8/LCAhISEhISDihpIgISEhLCBgLCxgIOKGkiBgLGBcbi8vIC0tIOKGkiAmbmRhc2g7LCAtLS0g4oaSICZtZGFzaDtcbi8vXG5cbi8vIFRPRE86XG4vLyAtIGZyYWN0aW9uYWxzIDEvMiwgMS80LCAzLzQgLT4gwr0sIMK8LCDCvlxuLy8gLSBtdWx0aXBsaWNhdGlvbnMgMiB4IDQgLT4gMiDDlyA0XG5cbmNvbnN0IFJBUkVfUkUgPSAvXFwrLXxcXC5cXC58XFw/XFw/XFw/XFw/fCEhISF8LCx8LS0vXG5cbi8vIFdvcmthcm91bmQgZm9yIHBoYW50b21qcyAtIG5lZWQgcmVnZXggd2l0aG91dCAvZyBmbGFnLFxuLy8gb3Igcm9vdCBjaGVjayB3aWxsIGZhaWwgZXZlcnkgc2Vjb25kIHRpbWVcbmNvbnN0IFNDT1BFRF9BQkJSX1RFU1RfUkUgPSAvXFwoKGN8dG18cilcXCkvaVxuXG5jb25zdCBTQ09QRURfQUJCUl9SRSA9IC9cXCgoY3x0bXxyKVxcKS9pZ1xuY29uc3QgU0NPUEVEX0FCQlIgPSB7XG4gIGM6ICfCqScsXG4gIHI6ICfCricsXG4gIHRtOiAn4oSiJ1xufVxuXG5mdW5jdGlvbiByZXBsYWNlRm4gKG1hdGNoLCBuYW1lKSB7XG4gIHJldHVybiBTQ09QRURfQUJCUltuYW1lLnRvTG93ZXJDYXNlKCldXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2Vfc2NvcGVkIChpbmxpbmVUb2tlbnMpIHtcbiAgbGV0IGluc2lkZV9hdXRvbGluayA9IDBcblxuICBmb3IgKGxldCBpID0gaW5saW5lVG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdG9rZW4gPSBpbmxpbmVUb2tlbnNbaV1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAndGV4dCcgJiYgIWluc2lkZV9hdXRvbGluaykge1xuICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQucmVwbGFjZShTQ09QRURfQUJCUl9SRSwgcmVwbGFjZUZuKVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19vcGVuJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluay0tXG4gICAgfVxuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdsaW5rX2Nsb3NlJyAmJiB0b2tlbi5pbmZvID09PSAnYXV0bycpIHtcbiAgICAgIGluc2lkZV9hdXRvbGluaysrXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VfcmFyZSAoaW5saW5lVG9rZW5zKSB7XG4gIGxldCBpbnNpZGVfYXV0b2xpbmsgPSAwXG5cbiAgZm9yIChsZXQgaSA9IGlubGluZVRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHRva2VuID0gaW5saW5lVG9rZW5zW2ldXG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3RleHQnICYmICFpbnNpZGVfYXV0b2xpbmspIHtcbiAgICAgIGlmIChSQVJFX1JFLnRlc3QodG9rZW4uY29udGVudCkpIHtcbiAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZSgvXFwrLS9nLCAnwrEnKVxuICAgICAgICAgIC8vIC4uLCAuLi4sIC4uLi4uLi4gLT4g4oCmXG4gICAgICAgICAgLy8gYnV0ID8uLi4uLiAmICEuLi4uLiAtPiA/Li4gJiAhLi5cbiAgICAgICAgICAucmVwbGFjZSgvXFwuezIsfS9nLCAn4oCmJykucmVwbGFjZSgvKFs/IV0p4oCmL2csICckMS4uJylcbiAgICAgICAgICAucmVwbGFjZSgvKFs/IV0pezQsfS9nLCAnJDEkMSQxJykucmVwbGFjZSgvLHsyLH0vZywgJywnKVxuICAgICAgICAgIC8vIGVtLWRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvKF58W14tXSktLS0oPz1bXi1dfCQpL21nLCAnJDFcXHUyMDE0JylcbiAgICAgICAgICAvLyBlbi1kYXNoXG4gICAgICAgICAgLnJlcGxhY2UoLyhefFxccyktLSg/PVxcc3wkKS9tZywgJyQxXFx1MjAxMycpXG4gICAgICAgICAgLnJlcGxhY2UoLyhefFteLVxcc10pLS0oPz1bXi1cXHNdfCQpL21nLCAnJDFcXHUyMDEzJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2xpbmtfb3BlbicgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmstLVxuICAgIH1cblxuICAgIGlmICh0b2tlbi50eXBlID09PSAnbGlua19jbG9zZScgJiYgdG9rZW4uaW5mbyA9PT0gJ2F1dG8nKSB7XG4gICAgICBpbnNpZGVfYXV0b2xpbmsrK1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXBsYWNlIChzdGF0ZSkge1xuICBsZXQgYmxrSWR4XG5cbiAgaWYgKCFzdGF0ZS5tZC5vcHRpb25zLnR5cG9ncmFwaGVyKSB7IHJldHVybiB9XG5cbiAgZm9yIChibGtJZHggPSBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMTsgYmxrSWR4ID49IDA7IGJsa0lkeC0tKSB7XG4gICAgaWYgKHN0YXRlLnRva2Vuc1tibGtJZHhdLnR5cGUgIT09ICdpbmxpbmUnKSB7IGNvbnRpbnVlIH1cblxuICAgIGlmIChTQ09QRURfQUJCUl9URVNUX1JFLnRlc3Qoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY29udGVudCkpIHtcbiAgICAgIHJlcGxhY2Vfc2NvcGVkKHN0YXRlLnRva2Vuc1tibGtJZHhdLmNoaWxkcmVuKVxuICAgIH1cblxuICAgIGlmIChSQVJFX1JFLnRlc3Qoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY29udGVudCkpIHtcbiAgICAgIHJlcGxhY2VfcmFyZShzdGF0ZS50b2tlbnNbYmxrSWR4XS5jaGlsZHJlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8vIENvbnZlcnQgc3RyYWlnaHQgcXVvdGF0aW9uIG1hcmtzIHRvIHR5cG9ncmFwaGljIG9uZXNcbi8vXG5cbmltcG9ydCB7IGlzV2hpdGVTcGFjZSwgaXNQdW5jdENoYXIsIGlzTWRBc2NpaVB1bmN0IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgUVVPVEVfVEVTVF9SRSA9IC9bJ1wiXS9cbmNvbnN0IFFVT1RFX1JFID0gL1snXCJdL2dcbmNvbnN0IEFQT1NUUk9QSEUgPSAnXFx1MjAxOScgLyog4oCZICovXG5cbmZ1bmN0aW9uIHJlcGxhY2VBdCAoc3RyLCBpbmRleCwgY2gpIHtcbiAgcmV0dXJuIHN0ci5zbGljZSgwLCBpbmRleCkgKyBjaCArIHN0ci5zbGljZShpbmRleCArIDEpXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NfaW5saW5lcyAodG9rZW5zLCBzdGF0ZSkge1xuICBsZXQgalxuXG4gIGNvbnN0IHN0YWNrID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICBjb25zdCB0aGlzTGV2ZWwgPSB0b2tlbnNbaV0ubGV2ZWxcblxuICAgIGZvciAoaiA9IHN0YWNrLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBpZiAoc3RhY2tbal0ubGV2ZWwgPD0gdGhpc0xldmVsKSB7IGJyZWFrIH1cbiAgICB9XG4gICAgc3RhY2subGVuZ3RoID0gaiArIDFcblxuICAgIGlmICh0b2tlbi50eXBlICE9PSAndGV4dCcpIHsgY29udGludWUgfVxuXG4gICAgbGV0IHRleHQgPSB0b2tlbi5jb250ZW50XG4gICAgbGV0IHBvcyA9IDBcbiAgICBsZXQgbWF4ID0gdGV4dC5sZW5ndGhcblxuICAgIC8qIGVzbGludCBuby1sYWJlbHM6MCxibG9jay1zY29wZWQtdmFyOjAgKi9cbiAgICBPVVRFUjpcbiAgICB3aGlsZSAocG9zIDwgbWF4KSB7XG4gICAgICBRVU9URV9SRS5sYXN0SW5kZXggPSBwb3NcbiAgICAgIGNvbnN0IHQgPSBRVU9URV9SRS5leGVjKHRleHQpXG4gICAgICBpZiAoIXQpIHsgYnJlYWsgfVxuXG4gICAgICBsZXQgY2FuT3BlbiA9IHRydWVcbiAgICAgIGxldCBjYW5DbG9zZSA9IHRydWVcbiAgICAgIHBvcyA9IHQuaW5kZXggKyAxXG4gICAgICBjb25zdCBpc1NpbmdsZSA9ICh0WzBdID09PSBcIidcIilcblxuICAgICAgLy8gRmluZCBwcmV2aW91cyBjaGFyYWN0ZXIsXG4gICAgICAvLyBkZWZhdWx0IHRvIHNwYWNlIGlmIGl0J3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgLy9cbiAgICAgIGxldCBsYXN0Q2hhciA9IDB4MjBcblxuICAgICAgaWYgKHQuaW5kZXggLSAxID49IDApIHtcbiAgICAgICAgbGFzdENoYXIgPSB0ZXh0LmNoYXJDb2RlQXQodC5pbmRleCAtIDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICBpZiAodG9rZW5zW2pdLnR5cGUgPT09ICdzb2Z0YnJlYWsnIHx8IHRva2Vuc1tqXS50eXBlID09PSAnaGFyZGJyZWFrJykgYnJlYWsgLy8gbGFzdENoYXIgZGVmYXVsdHMgdG8gMHgyMFxuICAgICAgICAgIGlmICghdG9rZW5zW2pdLmNvbnRlbnQpIGNvbnRpbnVlIC8vIHNob3VsZCBza2lwIGFsbCB0b2tlbnMgZXhjZXB0ICd0ZXh0JywgJ2h0bWxfaW5saW5lJyBvciAnY29kZV9pbmxpbmUnXG5cbiAgICAgICAgICBsYXN0Q2hhciA9IHRva2Vuc1tqXS5jb250ZW50LmNoYXJDb2RlQXQodG9rZW5zW2pdLmNvbnRlbnQubGVuZ3RoIC0gMSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgbmV4dCBjaGFyYWN0ZXIsXG4gICAgICAvLyBkZWZhdWx0IHRvIHNwYWNlIGlmIGl0J3MgdGhlIGVuZCBvZiB0aGUgbGluZVxuICAgICAgLy9cbiAgICAgIGxldCBuZXh0Q2hhciA9IDB4MjBcblxuICAgICAgaWYgKHBvcyA8IG1heCkge1xuICAgICAgICBuZXh0Q2hhciA9IHRleHQuY2hhckNvZGVBdChwb3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8IHRva2Vucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIGlmICh0b2tlbnNbal0udHlwZSA9PT0gJ3NvZnRicmVhaycgfHwgdG9rZW5zW2pdLnR5cGUgPT09ICdoYXJkYnJlYWsnKSBicmVhayAvLyBuZXh0Q2hhciBkZWZhdWx0cyB0byAweDIwXG4gICAgICAgICAgaWYgKCF0b2tlbnNbal0uY29udGVudCkgY29udGludWUgLy8gc2hvdWxkIHNraXAgYWxsIHRva2VucyBleGNlcHQgJ3RleHQnLCAnaHRtbF9pbmxpbmUnIG9yICdjb2RlX2lubGluZSdcblxuICAgICAgICAgIG5leHRDaGFyID0gdG9rZW5zW2pdLmNvbnRlbnQuY2hhckNvZGVBdCgwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNMYXN0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobGFzdENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobGFzdENoYXIpKVxuICAgICAgY29uc3QgaXNOZXh0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobmV4dENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXIpKVxuXG4gICAgICBjb25zdCBpc0xhc3RXaGl0ZVNwYWNlID0gaXNXaGl0ZVNwYWNlKGxhc3RDaGFyKVxuICAgICAgY29uc3QgaXNOZXh0V2hpdGVTcGFjZSA9IGlzV2hpdGVTcGFjZShuZXh0Q2hhcilcblxuICAgICAgaWYgKGlzTmV4dFdoaXRlU3BhY2UpIHtcbiAgICAgICAgY2FuT3BlbiA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzTmV4dFB1bmN0Q2hhcikge1xuICAgICAgICBpZiAoIShpc0xhc3RXaGl0ZVNwYWNlIHx8IGlzTGFzdFB1bmN0Q2hhcikpIHtcbiAgICAgICAgICBjYW5PcGVuID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNMYXN0V2hpdGVTcGFjZSkge1xuICAgICAgICBjYW5DbG9zZSA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzTGFzdFB1bmN0Q2hhcikge1xuICAgICAgICBpZiAoIShpc05leHRXaGl0ZVNwYWNlIHx8IGlzTmV4dFB1bmN0Q2hhcikpIHtcbiAgICAgICAgICBjYW5DbG9zZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDaGFyID09PSAweDIyIC8qIFwiICovICYmIHRbMF0gPT09ICdcIicpIHtcbiAgICAgICAgaWYgKGxhc3RDaGFyID49IDB4MzAgLyogMCAqLyAmJiBsYXN0Q2hhciA8PSAweDM5IC8qIDkgKi8pIHtcbiAgICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IDFcIlwiIC0gY291bnQgZmlyc3QgcXVvdGUgYXMgYW4gaW5jaFxuICAgICAgICAgIGNhbkNsb3NlID0gY2FuT3BlbiA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNhbk9wZW4gJiYgY2FuQ2xvc2UpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBxdW90ZXMgaW4gdGhlIG1pZGRsZSBvZiBwdW5jdHVhdGlvbiBzZXF1ZW5jZSwgYnV0IG5vdFxuICAgICAgICAvLyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB3b3JkcywgaS5lLjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gMS4gZm9vIFwiIGJhciBcIiBiYXogLSBub3QgcmVwbGFjZWRcbiAgICAgICAgLy8gMi4gZm9vLVwiLWJhci1cIi1iYXogLSByZXBsYWNlZFxuICAgICAgICAvLyAzLiBmb29cImJhclwiYmF6ICAgICAtIG5vdCByZXBsYWNlZFxuICAgICAgICAvL1xuICAgICAgICBjYW5PcGVuID0gaXNMYXN0UHVuY3RDaGFyXG4gICAgICAgIGNhbkNsb3NlID0gaXNOZXh0UHVuY3RDaGFyXG4gICAgICB9XG5cbiAgICAgIGlmICghY2FuT3BlbiAmJiAhY2FuQ2xvc2UpIHtcbiAgICAgICAgLy8gbWlkZGxlIG9mIHdvcmRcbiAgICAgICAgaWYgKGlzU2luZ2xlKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHJlcGxhY2VBdCh0b2tlbi5jb250ZW50LCB0LmluZGV4LCBBUE9TVFJPUEhFKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5DbG9zZSkge1xuICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgY2xvc2luZyBxdW90ZSwgcmV3aW5kIHRoZSBzdGFjayB0byBnZXQgYSBtYXRjaFxuICAgICAgICBmb3IgKGogPSBzdGFjay5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICAgIGxldCBpdGVtID0gc3RhY2tbal1cbiAgICAgICAgICBpZiAoc3RhY2tbal0ubGV2ZWwgPCB0aGlzTGV2ZWwpIHsgYnJlYWsgfVxuICAgICAgICAgIGlmIChpdGVtLnNpbmdsZSA9PT0gaXNTaW5nbGUgJiYgc3RhY2tbal0ubGV2ZWwgPT09IHRoaXNMZXZlbCkge1xuICAgICAgICAgICAgaXRlbSA9IHN0YWNrW2pdXG5cbiAgICAgICAgICAgIGxldCBvcGVuUXVvdGVcbiAgICAgICAgICAgIGxldCBjbG9zZVF1b3RlXG4gICAgICAgICAgICBpZiAoaXNTaW5nbGUpIHtcbiAgICAgICAgICAgICAgb3BlblF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbMl1cbiAgICAgICAgICAgICAgY2xvc2VRdW90ZSA9IHN0YXRlLm1kLm9wdGlvbnMucXVvdGVzWzNdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvcGVuUXVvdGUgPSBzdGF0ZS5tZC5vcHRpb25zLnF1b3Rlc1swXVxuICAgICAgICAgICAgICBjbG9zZVF1b3RlID0gc3RhdGUubWQub3B0aW9ucy5xdW90ZXNbMV1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVwbGFjZSB0b2tlbi5jb250ZW50ICpiZWZvcmUqIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50LFxuICAgICAgICAgICAgLy8gYmVjYXVzZSwgaWYgdGhleSBhcmUgcG9pbnRpbmcgYXQgdGhlIHNhbWUgdG9rZW4sIHJlcGxhY2VBdFxuICAgICAgICAgICAgLy8gY291bGQgbWVzcyB1cCBpbmRpY2VzIHdoZW4gcXVvdGUgbGVuZ3RoICE9IDFcbiAgICAgICAgICAgIHRva2VuLmNvbnRlbnQgPSByZXBsYWNlQXQodG9rZW4uY29udGVudCwgdC5pbmRleCwgY2xvc2VRdW90ZSlcbiAgICAgICAgICAgIHRva2Vuc1tpdGVtLnRva2VuXS5jb250ZW50ID0gcmVwbGFjZUF0KFxuICAgICAgICAgICAgICB0b2tlbnNbaXRlbS50b2tlbl0uY29udGVudCwgaXRlbS5wb3MsIG9wZW5RdW90ZSlcblxuICAgICAgICAgICAgcG9zICs9IGNsb3NlUXVvdGUubGVuZ3RoIC0gMVxuICAgICAgICAgICAgaWYgKGl0ZW0udG9rZW4gPT09IGkpIHsgcG9zICs9IG9wZW5RdW90ZS5sZW5ndGggLSAxIH1cblxuICAgICAgICAgICAgdGV4dCA9IHRva2VuLmNvbnRlbnRcbiAgICAgICAgICAgIG1heCA9IHRleHQubGVuZ3RoXG5cbiAgICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGpcbiAgICAgICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5PcGVuKSB7XG4gICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgIHRva2VuOiBpLFxuICAgICAgICAgIHBvczogdC5pbmRleCxcbiAgICAgICAgICBzaW5nbGU6IGlzU2luZ2xlLFxuICAgICAgICAgIGxldmVsOiB0aGlzTGV2ZWxcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoY2FuQ2xvc2UgJiYgaXNTaW5nbGUpIHtcbiAgICAgICAgdG9rZW4uY29udGVudCA9IHJlcGxhY2VBdCh0b2tlbi5jb250ZW50LCB0LmluZGV4LCBBUE9TVFJPUEhFKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzbWFydHF1b3RlcyAoc3RhdGUpIHtcbiAgLyogZXNsaW50IG1heC1kZXB0aDowICovXG4gIGlmICghc3RhdGUubWQub3B0aW9ucy50eXBvZ3JhcGhlcikgeyByZXR1cm4gfVxuXG4gIGZvciAobGV0IGJsa0lkeCA9IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxOyBibGtJZHggPj0gMDsgYmxrSWR4LS0pIHtcbiAgICBpZiAoc3RhdGUudG9rZW5zW2Jsa0lkeF0udHlwZSAhPT0gJ2lubGluZScgfHxcbiAgICAgICAgIVFVT1RFX1RFU1RfUkUudGVzdChzdGF0ZS50b2tlbnNbYmxrSWR4XS5jb250ZW50KSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBwcm9jZXNzX2lubGluZXMoc3RhdGUudG9rZW5zW2Jsa0lkeF0uY2hpbGRyZW4sIHN0YXRlKVxuICB9XG59XG4iLCIvLyBDb3JlIHN0YXRlIG9iamVjdFxuLy9cblxuaW1wb3J0IFRva2VuIGZyb20gJy4uL3Rva2VuLm1qcydcblxuZnVuY3Rpb24gU3RhdGVDb3JlIChzcmMsIG1kLCBlbnYpIHtcbiAgdGhpcy5zcmMgPSBzcmNcbiAgdGhpcy5lbnYgPSBlbnZcbiAgdGhpcy50b2tlbnMgPSBbXVxuICB0aGlzLmlubGluZU1vZGUgPSBmYWxzZVxuICB0aGlzLm1kID0gbWQgLy8gbGluayB0byBwYXJzZXIgaW5zdGFuY2Vcbn1cblxuLy8gcmUtZXhwb3J0IFRva2VuIGNsYXNzIHRvIHVzZSBpbiBjb3JlIHJ1bGVzXG5TdGF0ZUNvcmUucHJvdG90eXBlLlRva2VuID0gVG9rZW5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVDb3JlXG4iLCIvLyBKb2luIHJhdyB0ZXh0IHRva2VucyB3aXRoIHRoZSByZXN0IG9mIHRoZSB0ZXh0XG4vL1xuLy8gVGhpcyBpcyBzZXQgYXMgYSBzZXBhcmF0ZSBydWxlIHRvIHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgZm9yIHBsdWdpbnNcbi8vIHRvIHJ1biB0ZXh0IHJlcGxhY2VtZW50cyBhZnRlciB0ZXh0IGpvaW4sIGJ1dCBiZWZvcmUgZXNjYXBlIGpvaW4uXG4vL1xuLy8gRm9yIGV4YW1wbGUsIGBcXDopYCBzaG91bGRuJ3QgYmUgcmVwbGFjZWQgd2l0aCBhbiBlbW9qaS5cbi8vXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRleHRfam9pbiAoc3RhdGUpIHtcbiAgbGV0IGN1cnIsIGxhc3RcbiAgY29uc3QgYmxvY2tUb2tlbnMgPSBzdGF0ZS50b2tlbnNcbiAgY29uc3QgbCA9IGJsb2NrVG9rZW5zLmxlbmd0aFxuXG4gIGZvciAobGV0IGogPSAwOyBqIDwgbDsgaisrKSB7XG4gICAgaWYgKGJsb2NrVG9rZW5zW2pdLnR5cGUgIT09ICdpbmxpbmUnKSBjb250aW51ZVxuXG4gICAgY29uc3QgdG9rZW5zID0gYmxvY2tUb2tlbnNbal0uY2hpbGRyZW5cbiAgICBjb25zdCBtYXggPSB0b2tlbnMubGVuZ3RoXG5cbiAgICBmb3IgKGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICAgIGlmICh0b2tlbnNbY3Vycl0udHlwZSA9PT0gJ3RleHRfc3BlY2lhbCcpIHtcbiAgICAgICAgdG9rZW5zW2N1cnJdLnR5cGUgPSAndGV4dCdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGN1cnIgPSBsYXN0ID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgICBpZiAodG9rZW5zW2N1cnJdLnR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgICAgIGN1cnIgKyAxIDwgbWF4ICYmXG4gICAgICAgICAgdG9rZW5zW2N1cnIgKyAxXS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgLy8gY29sbGFwc2UgdHdvIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50ID0gdG9rZW5zW2N1cnJdLmNvbnRlbnQgKyB0b2tlbnNbY3VyciArIDFdLmNvbnRlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXJyICE9PSBsYXN0KSB7IHRva2Vuc1tsYXN0XSA9IHRva2Vuc1tjdXJyXSB9XG5cbiAgICAgICAgbGFzdCsrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnIgIT09IGxhc3QpIHtcbiAgICAgIHRva2Vucy5sZW5ndGggPSBsYXN0XG4gICAgfVxuICB9XG59XG4iLCIvLyBQcm9jZXNzIGF1dG9saW5rcyAnPHByb3RvY29sOi4uLj4nXG5cbi8qIGVzbGludCBtYXgtbGVuOjAgKi9cbmNvbnN0IEVNQUlMX1JFICAgID0gL14oW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSopJC9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4ICovXG5jb25zdCBBVVRPTElOS19SRSA9IC9eKFthLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0pOihbXjw+XFx4MDAtXFx4MjBdKikkL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhdXRvbGluayAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0MvKiA8ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWF4ID0gc3RhdGUucG9zTWF4XG5cbiAgZm9yICg7Oykge1xuICAgIGlmICgrK3BvcyA+PSBtYXgpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG5cbiAgICBpZiAoY2ggPT09IDB4M0MgLyogPCAqLykgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGNoID09PSAweDNFIC8qID4gKi8pIGJyZWFrXG4gIH1cblxuICBjb25zdCB1cmwgPSBzdGF0ZS5zcmMuc2xpY2Uoc3RhcnQgKyAxLCBwb3MpXG5cbiAgaWYgKEFVVE9MSU5LX1JFLnRlc3QodXJsKSkge1xuICAgIGNvbnN0IGZ1bGxVcmwgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHVybClcbiAgICBpZiAoIXN0YXRlLm1kLnZhbGlkYXRlTGluayhmdWxsVXJsKSkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGNvbnN0IHRva2VuX28gICA9IHN0YXRlLnB1c2goJ2xpbmtfb3BlbicsICdhJywgMSlcbiAgICAgIHRva2VuX28uYXR0cnMgICA9IFtbJ2hyZWYnLCBmdWxsVXJsXV1cbiAgICAgIHRva2VuX28ubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX28uaW5mbyAgICA9ICdhdXRvJ1xuXG4gICAgICBjb25zdCB0b2tlbl90ICAgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgICB0b2tlbl90LmNvbnRlbnQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCh1cmwpXG5cbiAgICAgIGNvbnN0IHRva2VuX2MgICA9IHN0YXRlLnB1c2goJ2xpbmtfY2xvc2UnLCAnYScsIC0xKVxuICAgICAgdG9rZW5fYy5tYXJrdXAgID0gJ2F1dG9saW5rJ1xuICAgICAgdG9rZW5fYy5pbmZvICAgID0gJ2F1dG8nXG4gICAgfVxuXG4gICAgc3RhdGUucG9zICs9IHVybC5sZW5ndGggKyAyXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChFTUFJTF9SRS50ZXN0KHVybCkpIHtcbiAgICBjb25zdCBmdWxsVXJsID0gc3RhdGUubWQubm9ybWFsaXplTGluaygnbWFpbHRvOicgKyB1cmwpXG4gICAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBjb25zdCB0b2tlbl9vICAgPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgICB0b2tlbl9vLmF0dHJzICAgPSBbWydocmVmJywgZnVsbFVybF1dXG4gICAgICB0b2tlbl9vLm1hcmt1cCAgPSAnYXV0b2xpbmsnXG4gICAgICB0b2tlbl9vLmluZm8gICAgPSAnYXV0bydcblxuICAgICAgY29uc3QgdG9rZW5fdCAgID0gc3RhdGUucHVzaCgndGV4dCcsICcnLCAwKVxuICAgICAgdG9rZW5fdC5jb250ZW50ID0gc3RhdGUubWQubm9ybWFsaXplTGlua1RleHQodXJsKVxuXG4gICAgICBjb25zdCB0b2tlbl9jICAgPSBzdGF0ZS5wdXNoKCdsaW5rX2Nsb3NlJywgJ2EnLCAtMSlcbiAgICAgIHRva2VuX2MubWFya3VwICA9ICdhdXRvbGluaydcbiAgICAgIHRva2VuX2MuaW5mbyAgICA9ICdhdXRvJ1xuICAgIH1cblxuICAgIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoICsgMlxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8vIFBhcnNlIGJhY2t0aWNrc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBiYWNrdGljayAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IGNoID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChjaCAhPT0gMHg2MC8qIGAgKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBzdGFydCA9IHBvc1xuICBwb3MrK1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICAvLyBzY2FuIG1hcmtlciBsZW5ndGhcbiAgd2hpbGUgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDYwLyogYCAqLykgeyBwb3MrKyB9XG5cbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MpXG4gIGNvbnN0IG9wZW5lckxlbmd0aCA9IG1hcmtlci5sZW5ndGhcblxuICBpZiAoc3RhdGUuYmFja3RpY2tzU2Nhbm5lZCAmJiAoc3RhdGUuYmFja3RpY2tzW29wZW5lckxlbmd0aF0gfHwgMCkgPD0gc3RhcnQpIHtcbiAgICBpZiAoIXNpbGVudCkgc3RhdGUucGVuZGluZyArPSBtYXJrZXJcbiAgICBzdGF0ZS5wb3MgKz0gb3BlbmVyTGVuZ3RoXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBtYXRjaEVuZCA9IHBvc1xuICBsZXQgbWF0Y2hTdGFydFxuXG4gIC8vIE5vdGhpbmcgZm91bmQgaW4gdGhlIGNhY2hlLCBzY2FuIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmUgKG9yIHVudGlsIG1hcmtlciBpcyBmb3VuZClcbiAgd2hpbGUgKChtYXRjaFN0YXJ0ID0gc3RhdGUuc3JjLmluZGV4T2YoJ2AnLCBtYXRjaEVuZCkpICE9PSAtMSkge1xuICAgIG1hdGNoRW5kID0gbWF0Y2hTdGFydCArIDFcblxuICAgIC8vIHNjYW4gbWFya2VyIGxlbmd0aFxuICAgIHdoaWxlIChtYXRjaEVuZCA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChtYXRjaEVuZCkgPT09IDB4NjAvKiBgICovKSB7IG1hdGNoRW5kKysgfVxuXG4gICAgY29uc3QgY2xvc2VyTGVuZ3RoID0gbWF0Y2hFbmQgLSBtYXRjaFN0YXJ0XG5cbiAgICBpZiAoY2xvc2VyTGVuZ3RoID09PSBvcGVuZXJMZW5ndGgpIHtcbiAgICAgIC8vIEZvdW5kIG1hdGNoaW5nIGNsb3NlciBsZW5ndGguXG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ2NvZGVfaW5saW5lJywgJ2NvZGUnLCAwKVxuICAgICAgICB0b2tlbi5tYXJrdXAgPSBtYXJrZXJcbiAgICAgICAgdG9rZW4uY29udGVudCA9IHN0YXRlLnNyYy5zbGljZShwb3MsIG1hdGNoU3RhcnQpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnICcpXG4gICAgICAgICAgLnJlcGxhY2UoL14gKC4rKSAkLywgJyQxJylcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyA9IG1hdGNoRW5kXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIFNvbWUgZGlmZmVyZW50IGxlbmd0aCBmb3VuZCwgcHV0IGl0IGluIGNhY2hlIGFzIHVwcGVyIGxpbWl0IG9mIHdoZXJlIGNsb3NlciBjYW4gYmUgZm91bmRcbiAgICBzdGF0ZS5iYWNrdGlja3NbY2xvc2VyTGVuZ3RoXSA9IG1hdGNoU3RhcnRcbiAgfVxuXG4gIC8vIFNjYW5uZWQgdGhyb3VnaCB0aGUgZW5kLCBkaWRuJ3QgZmluZCBhbnl0aGluZ1xuICBzdGF0ZS5iYWNrdGlja3NTY2FubmVkID0gdHJ1ZVxuXG4gIGlmICghc2lsZW50KSBzdGF0ZS5wZW5kaW5nICs9IG1hcmtlclxuICBzdGF0ZS5wb3MgKz0gb3BlbmVyTGVuZ3RoXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBGb3IgZWFjaCBvcGVuaW5nIGVtcGhhc2lzLWxpa2UgbWFya2VyIGZpbmQgYSBtYXRjaGluZyBjbG9zaW5nIG9uZVxuLy9cblxuZnVuY3Rpb24gcHJvY2Vzc0RlbGltaXRlcnMgKGRlbGltaXRlcnMpIHtcbiAgY29uc3Qgb3BlbmVyc0JvdHRvbSA9IHt9XG4gIGNvbnN0IG1heCA9IGRlbGltaXRlcnMubGVuZ3RoXG5cbiAgaWYgKCFtYXgpIHJldHVyblxuXG4gIC8vIGhlYWRlcklkeCBpcyB0aGUgZmlyc3QgZGVsaW1pdGVyIG9mIHRoZSBjdXJyZW50ICh3aGVyZSBjbG9zZXIgaXMpIGRlbGltaXRlciBydW5cbiAgbGV0IGhlYWRlcklkeCA9IDBcbiAgbGV0IGxhc3RUb2tlbklkeCA9IC0yIC8vIG5lZWRzIGFueSB2YWx1ZSBsb3dlciB0aGFuIC0xXG4gIGNvbnN0IGp1bXBzID0gW11cblxuICBmb3IgKGxldCBjbG9zZXJJZHggPSAwOyBjbG9zZXJJZHggPCBtYXg7IGNsb3NlcklkeCsrKSB7XG4gICAgY29uc3QgY2xvc2VyID0gZGVsaW1pdGVyc1tjbG9zZXJJZHhdXG5cbiAgICBqdW1wcy5wdXNoKDApXG5cbiAgICAvLyBtYXJrZXJzIGJlbG9uZyB0byBzYW1lIGRlbGltaXRlciBydW4gaWY6XG4gICAgLy8gIC0gdGhleSBoYXZlIGFkamFjZW50IHRva2Vuc1xuICAgIC8vICAtIEFORCBtYXJrZXJzIGFyZSB0aGUgc2FtZVxuICAgIC8vXG4gICAgaWYgKGRlbGltaXRlcnNbaGVhZGVySWR4XS5tYXJrZXIgIT09IGNsb3Nlci5tYXJrZXIgfHwgbGFzdFRva2VuSWR4ICE9PSBjbG9zZXIudG9rZW4gLSAxKSB7XG4gICAgICBoZWFkZXJJZHggPSBjbG9zZXJJZHhcbiAgICB9XG5cbiAgICBsYXN0VG9rZW5JZHggPSBjbG9zZXIudG9rZW5cblxuICAgIC8vIExlbmd0aCBpcyBvbmx5IHVzZWQgZm9yIGVtcGhhc2lzLXNwZWNpZmljIFwicnVsZSBvZiAzXCIsXG4gICAgLy8gaWYgaXQncyBub3QgZGVmaW5lZCAoaW4gc3RyaWtldGhyb3VnaCBvciAzcmQgcGFydHkgcGx1Z2lucyksXG4gICAgLy8gd2UgY2FuIGRlZmF1bHQgaXQgdG8gMCB0byBkaXNhYmxlIHRob3NlIGNoZWNrcy5cbiAgICAvL1xuICAgIGNsb3Nlci5sZW5ndGggPSBjbG9zZXIubGVuZ3RoIHx8IDBcblxuICAgIGlmICghY2xvc2VyLmNsb3NlKSBjb250aW51ZVxuXG4gICAgLy8gUHJldmlvdXNseSBjYWxjdWxhdGVkIGxvd2VyIGJvdW5kcyAocHJldmlvdXMgZmFpbHMpXG4gICAgLy8gZm9yIGVhY2ggbWFya2VyLCBlYWNoIGRlbGltaXRlciBsZW5ndGggbW9kdWxvIDMsXG4gICAgLy8gYW5kIGZvciB3aGV0aGVyIHRoaXMgY2xvc2VyIGNhbiBiZSBhbiBvcGVuZXI7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NvbW1vbm1hcmsvY21hcmsvY29tbWl0LzM0MjUwZTEyY2NlYmRjNjM3MmI4YjQ5YzQ0ZmFiNTdjNzI0NDM0NjBcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zICovXG4gICAgaWYgKCFvcGVuZXJzQm90dG9tLmhhc093blByb3BlcnR5KGNsb3Nlci5tYXJrZXIpKSB7XG4gICAgICBvcGVuZXJzQm90dG9tW2Nsb3Nlci5tYXJrZXJdID0gWy0xLCAtMSwgLTEsIC0xLCAtMSwgLTFdXG4gICAgfVxuXG4gICAgY29uc3QgbWluT3BlbmVySWR4ID0gb3BlbmVyc0JvdHRvbVtjbG9zZXIubWFya2VyXVsoY2xvc2VyLm9wZW4gPyAzIDogMCkgKyAoY2xvc2VyLmxlbmd0aCAlIDMpXVxuXG4gICAgbGV0IG9wZW5lcklkeCA9IGhlYWRlcklkeCAtIGp1bXBzW2hlYWRlcklkeF0gLSAxXG5cbiAgICBsZXQgbmV3TWluT3BlbmVySWR4ID0gb3BlbmVySWR4XG5cbiAgICBmb3IgKDsgb3BlbmVySWR4ID4gbWluT3BlbmVySWR4OyBvcGVuZXJJZHggLT0ganVtcHNbb3BlbmVySWR4XSArIDEpIHtcbiAgICAgIGNvbnN0IG9wZW5lciA9IGRlbGltaXRlcnNbb3BlbmVySWR4XVxuXG4gICAgICBpZiAob3BlbmVyLm1hcmtlciAhPT0gY2xvc2VyLm1hcmtlcikgY29udGludWVcblxuICAgICAgaWYgKG9wZW5lci5vcGVuICYmIG9wZW5lci5lbmQgPCAwKSB7XG4gICAgICAgIGxldCBpc09kZE1hdGNoID0gZmFsc2VcblxuICAgICAgICAvLyBmcm9tIHNwZWM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG9uZSBvZiB0aGUgZGVsaW1pdGVycyBjYW4gYm90aCBvcGVuIGFuZCBjbG9zZSBlbXBoYXNpcywgdGhlbiB0aGVcbiAgICAgICAgLy8gc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBkZWxpbWl0ZXIgcnVucyBjb250YWluaW5nIHRoZSBvcGVuaW5nIGFuZFxuICAgICAgICAvLyBjbG9zaW5nIGRlbGltaXRlcnMgbXVzdCBub3QgYmUgYSBtdWx0aXBsZSBvZiAzIHVubGVzcyBib3RoIGxlbmd0aHNcbiAgICAgICAgLy8gYXJlIG11bHRpcGxlcyBvZiAzLlxuICAgICAgICAvL1xuICAgICAgICBpZiAob3BlbmVyLmNsb3NlIHx8IGNsb3Nlci5vcGVuKSB7XG4gICAgICAgICAgaWYgKChvcGVuZXIubGVuZ3RoICsgY2xvc2VyLmxlbmd0aCkgJSAzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAob3BlbmVyLmxlbmd0aCAlIDMgIT09IDAgfHwgY2xvc2VyLmxlbmd0aCAlIDMgIT09IDApIHtcbiAgICAgICAgICAgICAgaXNPZGRNYXRjaCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2RkTWF0Y2gpIHtcbiAgICAgICAgICAvLyBJZiBwcmV2aW91cyBkZWxpbWl0ZXIgY2Fubm90IGJlIGFuIG9wZW5lciwgd2UgY2FuIHNhZmVseSBza2lwXG4gICAgICAgICAgLy8gdGhlIGVudGlyZSBzZXF1ZW5jZSBpbiBmdXR1cmUgY2hlY2tzLiBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2VcbiAgICAgICAgICAvLyBzdXJlIGFsZ29yaXRobSBoYXMgbGluZWFyIGNvbXBsZXhpdHkgKHNlZSAqXypfKl8qXypfLi4uIGNhc2UpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBvcGVuZXJJZHggPiAwICYmICFkZWxpbWl0ZXJzW29wZW5lcklkeCAtIDFdLm9wZW5cbiAgICAgICAgICAgID8ganVtcHNbb3BlbmVySWR4IC0gMV0gKyAxXG4gICAgICAgICAgICA6IDBcblxuICAgICAgICAgIGp1bXBzW2Nsb3NlcklkeF0gPSBjbG9zZXJJZHggLSBvcGVuZXJJZHggKyBsYXN0SnVtcFxuICAgICAgICAgIGp1bXBzW29wZW5lcklkeF0gPSBsYXN0SnVtcFxuXG4gICAgICAgICAgY2xvc2VyLm9wZW4gID0gZmFsc2VcbiAgICAgICAgICBvcGVuZXIuZW5kICAgPSBjbG9zZXJJZHhcbiAgICAgICAgICBvcGVuZXIuY2xvc2UgPSBmYWxzZVxuICAgICAgICAgIG5ld01pbk9wZW5lcklkeCA9IC0xXG4gICAgICAgICAgLy8gdHJlYXQgbmV4dCB0b2tlbiBhcyBzdGFydCBvZiBydW4sXG4gICAgICAgICAgLy8gaXQgb3B0aW1pemVzIHNraXBzIGluICoqPC4uLj4qKmEqKjwuLi4+KiogcGF0aG9sb2dpY2FsIGNhc2VcbiAgICAgICAgICBsYXN0VG9rZW5JZHggPSAtMlxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3TWluT3BlbmVySWR4ICE9PSAtMSkge1xuICAgICAgLy8gSWYgbWF0Y2ggZm9yIHRoaXMgZGVsaW1pdGVyIHJ1biBmYWlsZWQsIHdlIHdhbnQgdG8gc2V0IGxvd2VyIGJvdW5kIGZvclxuICAgICAgLy8gZnV0dXJlIGxvb2t1cHMuIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBzdXJlIGFsZ29yaXRobSBoYXMgbGluZWFyXG4gICAgICAvLyBjb21wbGV4aXR5LlxuICAgICAgLy9cbiAgICAgIC8vIFNlZSBkZXRhaWxzIGhlcmU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY29tbW9ubWFyay9jbWFyay9pc3N1ZXMvMTc4I2lzc3VlY29tbWVudC0yNzA0MTc0NDJcbiAgICAgIC8vXG4gICAgICBvcGVuZXJzQm90dG9tW2Nsb3Nlci5tYXJrZXJdWyhjbG9zZXIub3BlbiA/IDMgOiAwKSArICgoY2xvc2VyLmxlbmd0aCB8fCAwKSAlIDMpXSA9IG5ld01pbk9wZW5lcklkeFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5rX3BhaXJzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHByb2Nlc3NEZWxpbWl0ZXJzKHN0YXRlLmRlbGltaXRlcnMpXG5cbiAgZm9yIChsZXQgY3VyciA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgIGlmICh0b2tlbnNfbWV0YVtjdXJyXSAmJiB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKSB7XG4gICAgICBwcm9jZXNzRGVsaW1pdGVycyh0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKVxuICAgIH1cbiAgfVxufVxuIiwiLy8gUHJvY2VzcyAqdGhpcyogYW5kIF90aGF0X1xuLy9cblxuLy8gSW5zZXJ0IGVhY2ggbWFya2VyIGFzIGEgc2VwYXJhdGUgdGV4dCB0b2tlbiwgYW5kIGFkZCBpdCB0byBkZWxpbWl0ZXIgbGlzdFxuLy9cbmZ1bmN0aW9uIGVtcGhhc2lzX3Rva2VuaXplIChzdGF0ZSwgc2lsZW50KSB7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhdGUucG9zXG4gIGNvbnN0IG1hcmtlciA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KVxuXG4gIGlmIChzaWxlbnQpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAobWFya2VyICE9PSAweDVGIC8qIF8gKi8gJiYgbWFya2VyICE9PSAweDJBIC8qICogKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBzY2FubmVkID0gc3RhdGUuc2NhbkRlbGltcyhzdGF0ZS5wb3MsIG1hcmtlciA9PT0gMHgyQSlcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNjYW5uZWQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXJrZXIpXG5cbiAgICBzdGF0ZS5kZWxpbWl0ZXJzLnB1c2goe1xuICAgICAgLy8gQ2hhciBjb2RlIG9mIHRoZSBzdGFydGluZyBtYXJrZXIgKG51bWJlcikuXG4gICAgICAvL1xuICAgICAgbWFya2VyLFxuXG4gICAgICAvLyBUb3RhbCBsZW5ndGggb2YgdGhlc2Ugc2VyaWVzIG9mIGRlbGltaXRlcnMuXG4gICAgICAvL1xuICAgICAgbGVuZ3RoOiBzY2FubmVkLmxlbmd0aCxcblxuICAgICAgLy8gQSBwb3NpdGlvbiBvZiB0aGUgdG9rZW4gdGhpcyBkZWxpbWl0ZXIgY29ycmVzcG9uZHMgdG8uXG4gICAgICAvL1xuICAgICAgdG9rZW46IHN0YXRlLnRva2Vucy5sZW5ndGggLSAxLFxuXG4gICAgICAvLyBJZiB0aGlzIGRlbGltaXRlciBpcyBtYXRjaGVkIGFzIGEgdmFsaWQgb3BlbmVyLCBgZW5kYCB3aWxsIGJlXG4gICAgICAvLyBlcXVhbCB0byBpdHMgcG9zaXRpb24sIG90aGVyd2lzZSBpdCdzIGAtMWAuXG4gICAgICAvL1xuICAgICAgZW5kOiAtMSxcblxuICAgICAgLy8gQm9vbGVhbiBmbGFncyB0aGF0IGRldGVybWluZSBpZiB0aGlzIGRlbGltaXRlciBjb3VsZCBvcGVuIG9yIGNsb3NlXG4gICAgICAvLyBhbiBlbXBoYXNpcy5cbiAgICAgIC8vXG4gICAgICBvcGVuOiBzY2FubmVkLmNhbl9vcGVuLFxuICAgICAgY2xvc2U6IHNjYW5uZWQuY2FuX2Nsb3NlXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRlLnBvcyArPSBzY2FubmVkLmxlbmd0aFxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHBvc3RQcm9jZXNzIChzdGF0ZSwgZGVsaW1pdGVycykge1xuICBjb25zdCBtYXggPSBkZWxpbWl0ZXJzLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSBtYXggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHN0YXJ0RGVsaW0gPSBkZWxpbWl0ZXJzW2ldXG5cbiAgICBpZiAoc3RhcnREZWxpbS5tYXJrZXIgIT09IDB4NUYvKiBfICovICYmIHN0YXJ0RGVsaW0ubWFya2VyICE9PSAweDJBLyogKiAqLykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIG9ubHkgb3BlbmluZyBtYXJrZXJzXG4gICAgaWYgKHN0YXJ0RGVsaW0uZW5kID09PSAtMSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBlbmREZWxpbSA9IGRlbGltaXRlcnNbc3RhcnREZWxpbS5lbmRdXG5cbiAgICAvLyBJZiB0aGUgcHJldmlvdXMgZGVsaW1pdGVyIGhhcyB0aGUgc2FtZSBtYXJrZXIgYW5kIGlzIGFkamFjZW50IHRvIHRoaXMgb25lLFxuICAgIC8vIG1lcmdlIHRob3NlIGludG8gb25lIHN0cm9uZyBkZWxpbWl0ZXIuXG4gICAgLy9cbiAgICAvLyBgPGVtPjxlbT53aGF0ZXZlcjwvZW0+PC9lbT5gIC0+IGA8c3Ryb25nPndoYXRldmVyPC9zdHJvbmc+YFxuICAgIC8vXG4gICAgY29uc3QgaXNTdHJvbmcgPSBpID4gMCAmJlxuICAgICAgICAgICAgICAgZGVsaW1pdGVyc1tpIC0gMV0uZW5kID09PSBzdGFydERlbGltLmVuZCArIDEgJiZcbiAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgZmlyc3QgdHdvIG1hcmtlcnMgbWF0Y2ggYW5kIGFkamFjZW50XG4gICAgICAgICAgICAgICBkZWxpbWl0ZXJzW2kgLSAxXS5tYXJrZXIgPT09IHN0YXJ0RGVsaW0ubWFya2VyICYmXG4gICAgICAgICAgICAgICBkZWxpbWl0ZXJzW2kgLSAxXS50b2tlbiA9PT0gc3RhcnREZWxpbS50b2tlbiAtIDEgJiZcbiAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgbGFzdCB0d28gbWFya2VycyBhcmUgYWRqYWNlbnQgKHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoZXkgbWF0Y2gpXG4gICAgICAgICAgICAgICBkZWxpbWl0ZXJzW3N0YXJ0RGVsaW0uZW5kICsgMV0udG9rZW4gPT09IGVuZERlbGltLnRva2VuICsgMVxuXG4gICAgY29uc3QgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0YXJ0RGVsaW0ubWFya2VyKVxuXG4gICAgY29uc3QgdG9rZW5fbyAgID0gc3RhdGUudG9rZW5zW3N0YXJ0RGVsaW0udG9rZW5dXG4gICAgdG9rZW5fby50eXBlICAgID0gaXNTdHJvbmcgPyAnc3Ryb25nX29wZW4nIDogJ2VtX29wZW4nXG4gICAgdG9rZW5fby50YWcgICAgID0gaXNTdHJvbmcgPyAnc3Ryb25nJyA6ICdlbSdcbiAgICB0b2tlbl9vLm5lc3RpbmcgPSAxXG4gICAgdG9rZW5fby5tYXJrdXAgID0gaXNTdHJvbmcgPyBjaCArIGNoIDogY2hcbiAgICB0b2tlbl9vLmNvbnRlbnQgPSAnJ1xuXG4gICAgY29uc3QgdG9rZW5fYyAgID0gc3RhdGUudG9rZW5zW2VuZERlbGltLnRva2VuXVxuICAgIHRva2VuX2MudHlwZSAgICA9IGlzU3Ryb25nID8gJ3N0cm9uZ19jbG9zZScgOiAnZW1fY2xvc2UnXG4gICAgdG9rZW5fYy50YWcgICAgID0gaXNTdHJvbmcgPyAnc3Ryb25nJyA6ICdlbSdcbiAgICB0b2tlbl9jLm5lc3RpbmcgPSAtMVxuICAgIHRva2VuX2MubWFya3VwICA9IGlzU3Ryb25nID8gY2ggKyBjaCA6IGNoXG4gICAgdG9rZW5fYy5jb250ZW50ID0gJydcblxuICAgIGlmIChpc1N0cm9uZykge1xuICAgICAgc3RhdGUudG9rZW5zW2RlbGltaXRlcnNbaSAtIDFdLnRva2VuXS5jb250ZW50ID0gJydcbiAgICAgIHN0YXRlLnRva2Vuc1tkZWxpbWl0ZXJzW3N0YXJ0RGVsaW0uZW5kICsgMV0udG9rZW5dLmNvbnRlbnQgPSAnJ1xuICAgICAgaS0tXG4gICAgfVxuICB9XG59XG5cbi8vIFdhbGsgdGhyb3VnaCBkZWxpbWl0ZXIgbGlzdCBhbmQgcmVwbGFjZSB0ZXh0IHRva2VucyB3aXRoIHRhZ3Ncbi8vXG5mdW5jdGlvbiBlbXBoYXNpc19wb3N0X3Byb2Nlc3MgKHN0YXRlKSB7XG4gIGNvbnN0IHRva2Vuc19tZXRhID0gc3RhdGUudG9rZW5zX21ldGFcbiAgY29uc3QgbWF4ID0gc3RhdGUudG9rZW5zX21ldGEubGVuZ3RoXG5cbiAgcG9zdFByb2Nlc3Moc3RhdGUsIHN0YXRlLmRlbGltaXRlcnMpXG5cbiAgZm9yIChsZXQgY3VyciA9IDA7IGN1cnIgPCBtYXg7IGN1cnIrKykge1xuICAgIGlmICh0b2tlbnNfbWV0YVtjdXJyXSAmJiB0b2tlbnNfbWV0YVtjdXJyXS5kZWxpbWl0ZXJzKSB7XG4gICAgICBwb3N0UHJvY2VzcyhzdGF0ZSwgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycylcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB0b2tlbml6ZTogZW1waGFzaXNfdG9rZW5pemUsXG4gIHBvc3RQcm9jZXNzOiBlbXBoYXNpc19wb3N0X3Byb2Nlc3Ncbn1cbiIsIi8vIFByb2Nlc3MgaHRtbCBlbnRpdHkgLSAmIzEyMzssICYjeEFGOywgJnF1b3Q7LCAuLi5cblxuaW1wb3J0IHsgZGVjb2RlSFRNTCB9IGZyb20gJ2VudGl0aWVzJ1xuaW1wb3J0IHsgaXNWYWxpZEVudGl0eUNvZGUsIGZyb21Db2RlUG9pbnQgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5jb25zdCBESUdJVEFMX1JFID0gL14mIygoPzp4W2EtZjAtOV17MSw2fXxbMC05XXsxLDd9KSk7L2lcbmNvbnN0IE5BTUVEX1JFICAgPSAvXiYoW2Etel1bYS16MC05XXsxLDMxfSk7L2lcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW50aXR5IChzdGF0ZSwgc2lsZW50KSB7XG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSAhPT0gMHgyNi8qICYgKi8pIHJldHVybiBmYWxzZVxuXG4gIGlmIChwb3MgKyAxID49IG1heCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgY2ggPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKVxuXG4gIGlmIChjaCA9PT0gMHgyMyAvKiAjICovKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5tYXRjaChESUdJVEFMX1JFKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IG1hdGNoWzFdWzBdLnRvTG93ZXJDYXNlKCkgPT09ICd4JyA/IHBhcnNlSW50KG1hdGNoWzFdLnNsaWNlKDEpLCAxNikgOiBwYXJzZUludChtYXRjaFsxXSwgMTApXG5cbiAgICAgICAgY29uc3QgdG9rZW4gICA9IHN0YXRlLnB1c2goJ3RleHRfc3BlY2lhbCcsICcnLCAwKVxuICAgICAgICB0b2tlbi5jb250ZW50ID0gaXNWYWxpZEVudGl0eUNvZGUoY29kZSkgPyBmcm9tQ29kZVBvaW50KGNvZGUpIDogZnJvbUNvZGVQb2ludCgweEZGRkQpXG4gICAgICAgIHRva2VuLm1hcmt1cCAgPSBtYXRjaFswXVxuICAgICAgICB0b2tlbi5pbmZvICAgID0gJ2VudGl0eSdcbiAgICAgIH1cbiAgICAgIHN0YXRlLnBvcyArPSBtYXRjaFswXS5sZW5ndGhcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1hdGNoID0gc3RhdGUuc3JjLnNsaWNlKHBvcykubWF0Y2goTkFNRURfUkUpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlSFRNTChtYXRjaFswXSlcbiAgICAgIGlmIChkZWNvZGVkICE9PSBtYXRjaFswXSkge1xuICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgIGNvbnN0IHRva2VuICAgPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcbiAgICAgICAgICB0b2tlbi5jb250ZW50ID0gZGVjb2RlZFxuICAgICAgICAgIHRva2VuLm1hcmt1cCAgPSBtYXRjaFswXVxuICAgICAgICAgIHRva2VuLmluZm8gICAgPSAnZW50aXR5J1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnBvcyArPSBtYXRjaFswXS5sZW5ndGhcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8vIFByb2Nlc3MgZXNjYXBlZCBjaGFycyBhbmQgaGFyZGJyZWFrc1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuY29uc3QgRVNDQVBFRCA9IFtdXG5cbmZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgRVNDQVBFRC5wdXNoKDApIH1cblxuJ1xcXFwhXCIjJCUmXFwnKCkqKywuLzo7PD0+P0BbXV5fYHt8fX4tJ1xuICAuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGNoKSB7IEVTQ0FQRURbY2guY2hhckNvZGVBdCgwKV0gPSAxIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVzY2FwZSAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDVDLyogXFwgKi8pIHJldHVybiBmYWxzZVxuICBwb3MrK1xuXG4gIC8vICdcXCcgYXQgdGhlIGVuZCBvZiB0aGUgaW5saW5lIGJsb2NrXG4gIGlmIChwb3MgPj0gbWF4KSByZXR1cm4gZmFsc2VcblxuICBsZXQgY2gxID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuXG4gIGlmIChjaDEgPT09IDB4MEEpIHtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgc3RhdGUucHVzaCgnaGFyZGJyZWFrJywgJ2JyJywgMClcbiAgICB9XG5cbiAgICBwb3MrK1xuICAgIC8vIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlcyBmcm9tIG5leHQgbGluZVxuICAgIHdoaWxlIChwb3MgPCBtYXgpIHtcbiAgICAgIGNoMSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjaDEpKSBicmVha1xuICAgICAgcG9zKytcbiAgICB9XG5cbiAgICBzdGF0ZS5wb3MgPSBwb3NcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGVzY2FwZWRTdHIgPSBzdGF0ZS5zcmNbcG9zXVxuXG4gIGlmIChjaDEgPj0gMHhEODAwICYmIGNoMSA8PSAweERCRkYgJiYgcG9zICsgMSA8IG1heCkge1xuICAgIGNvbnN0IGNoMiA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDEpXG5cbiAgICBpZiAoY2gyID49IDB4REMwMCAmJiBjaDIgPD0gMHhERkZGKSB7XG4gICAgICBlc2NhcGVkU3RyICs9IHN0YXRlLnNyY1twb3MgKyAxXVxuICAgICAgcG9zKytcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcmlnU3RyID0gJ1xcXFwnICsgZXNjYXBlZFN0clxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgY29uc3QgdG9rZW4gPSBzdGF0ZS5wdXNoKCd0ZXh0X3NwZWNpYWwnLCAnJywgMClcblxuICAgIGlmIChjaDEgPCAyNTYgJiYgRVNDQVBFRFtjaDFdICE9PSAwKSB7XG4gICAgICB0b2tlbi5jb250ZW50ID0gZXNjYXBlZFN0clxuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbi5jb250ZW50ID0gb3JpZ1N0clxuICAgIH1cblxuICAgIHRva2VuLm1hcmt1cCA9IG9yaWdTdHJcbiAgICB0b2tlbi5pbmZvICAgPSAnZXNjYXBlJ1xuICB9XG5cbiAgc3RhdGUucG9zID0gcG9zICsgMVxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gQ2xlYW4gdXAgdG9rZW5zIGFmdGVyIGVtcGhhc2lzIGFuZCBzdHJpa2V0aHJvdWdoIHBvc3Rwcm9jZXNzaW5nOlxuLy8gbWVyZ2UgYWRqYWNlbnQgdGV4dCBub2RlcyBpbnRvIG9uZSBhbmQgcmUtY2FsY3VsYXRlIGFsbCB0b2tlbiBsZXZlbHNcbi8vXG4vLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGluaXRpYWxseSBlbXBoYXNpcyBkZWxpbWl0ZXIgbWFya2VycyAoKiwgXywgfilcbi8vIGFyZSB0cmVhdGVkIGFzIHRoZWlyIG93biBzZXBhcmF0ZSB0ZXh0IHRva2Vucy4gVGhlbiBlbXBoYXNpcyBydWxlIGVpdGhlclxuLy8gbGVhdmVzIHRoZW0gYXMgdGV4dCAobmVlZGVkIHRvIG1lcmdlIHdpdGggYWRqYWNlbnQgdGV4dCkgb3IgdHVybnMgdGhlbVxuLy8gaW50byBvcGVuaW5nL2Nsb3NpbmcgdGFncyAod2hpY2ggbWVzc2VzIHVwIGxldmVscyBpbnNpZGUpLlxuLy9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZnJhZ21lbnRzX2pvaW4gKHN0YXRlKSB7XG4gIGxldCBjdXJyLCBsYXN0XG4gIGxldCBsZXZlbCA9IDBcbiAgY29uc3QgdG9rZW5zID0gc3RhdGUudG9rZW5zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vucy5sZW5ndGhcblxuICBmb3IgKGN1cnIgPSBsYXN0ID0gMDsgY3VyciA8IG1heDsgY3VycisrKSB7XG4gICAgLy8gcmUtY2FsY3VsYXRlIGxldmVscyBhZnRlciBlbXBoYXNpcy9zdHJpa2V0aHJvdWdoIHR1cm5zIHNvbWUgdGV4dCBub2Rlc1xuICAgIC8vIGludG8gb3BlbmluZy9jbG9zaW5nIHRhZ3NcbiAgICBpZiAodG9rZW5zW2N1cnJdLm5lc3RpbmcgPCAwKSBsZXZlbC0tIC8vIGNsb3NpbmcgdGFnXG4gICAgdG9rZW5zW2N1cnJdLmxldmVsID0gbGV2ZWxcbiAgICBpZiAodG9rZW5zW2N1cnJdLm5lc3RpbmcgPiAwKSBsZXZlbCsrIC8vIG9wZW5pbmcgdGFnXG5cbiAgICBpZiAodG9rZW5zW2N1cnJdLnR5cGUgPT09ICd0ZXh0JyAmJlxuICAgICAgICBjdXJyICsgMSA8IG1heCAmJlxuICAgICAgICB0b2tlbnNbY3VyciArIDFdLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgLy8gY29sbGFwc2UgdHdvIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgIHRva2Vuc1tjdXJyICsgMV0uY29udGVudCA9IHRva2Vuc1tjdXJyXS5jb250ZW50ICsgdG9rZW5zW2N1cnIgKyAxXS5jb250ZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXJyICE9PSBsYXN0KSB7IHRva2Vuc1tsYXN0XSA9IHRva2Vuc1tjdXJyXSB9XG5cbiAgICAgIGxhc3QrK1xuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyICE9PSBsYXN0KSB7XG4gICAgdG9rZW5zLmxlbmd0aCA9IGxhc3RcbiAgfVxufVxuIiwiLy8gUHJvY2VzcyBodG1sIHRhZ3NcblxuaW1wb3J0IHsgSFRNTF9UQUdfUkUgfSBmcm9tICcuLi9jb21tb24vaHRtbF9yZS5tanMnXG5cbmZ1bmN0aW9uIGlzTGlua09wZW4gKHN0cikge1xuICByZXR1cm4gL148YVs+XFxzXS9pLnRlc3Qoc3RyKVxufVxuZnVuY3Rpb24gaXNMaW5rQ2xvc2UgKHN0cikge1xuICByZXR1cm4gL148XFwvYVxccyo+L2kudGVzdChzdHIpXG59XG5cbmZ1bmN0aW9uIGlzTGV0dGVyIChjaCkge1xuICAvKiBlc2xpbnQgbm8tYml0d2lzZTowICovXG4gIGNvbnN0IGxjID0gY2ggfCAweDIwIC8vIHRvIGxvd2VyIGNhc2VcbiAgcmV0dXJuIChsYyA+PSAweDYxLyogYSAqLykgJiYgKGxjIDw9IDB4N2EvKiB6ICovKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBodG1sX2lubGluZSAoc3RhdGUsIHNpbGVudCkge1xuICBpZiAoIXN0YXRlLm1kLm9wdGlvbnMuaHRtbCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIC8vIENoZWNrIHN0YXJ0XG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuICBjb25zdCBwb3MgPSBzdGF0ZS5wb3NcbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4M0MvKiA8ICovIHx8XG4gICAgICBwb3MgKyAyID49IG1heCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gUXVpY2sgZmFpbCBvbiBzZWNvbmQgY2hhclxuICBjb25zdCBjaCA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcyArIDEpXG4gIGlmIChjaCAhPT0gMHgyMS8qICEgKi8gJiZcbiAgICAgIGNoICE9PSAweDNGLyogPyAqLyAmJlxuICAgICAgY2ggIT09IDB4MkYvKiAvICovICYmXG4gICAgICAhaXNMZXR0ZXIoY2gpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHN0YXRlLnNyYy5zbGljZShwb3MpLm1hdGNoKEhUTUxfVEFHX1JFKVxuICBpZiAoIW1hdGNoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBjb25zdCB0b2tlbiA9IHN0YXRlLnB1c2goJ2h0bWxfaW5saW5lJywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IG1hdGNoWzBdXG5cbiAgICBpZiAoaXNMaW5rT3Blbih0b2tlbi5jb250ZW50KSkgIHN0YXRlLmxpbmtMZXZlbCsrXG4gICAgaWYgKGlzTGlua0Nsb3NlKHRva2VuLmNvbnRlbnQpKSBzdGF0ZS5saW5rTGV2ZWwtLVxuICB9XG4gIHN0YXRlLnBvcyArPSBtYXRjaFswXS5sZW5ndGhcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIFByb2Nlc3MgIVtpbWFnZV0oPHNyYz4gXCJ0aXRsZVwiKVxuXG5pbXBvcnQgeyBub3JtYWxpemVSZWZlcmVuY2UsIGlzU3BhY2UgfSBmcm9tICcuLi9jb21tb24vdXRpbHMubWpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbWFnZSAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgY29kZSwgY29udGVudCwgbGFiZWwsIHBvcywgcmVmLCByZXMsIHRpdGxlLCBzdGFydFxuICBsZXQgaHJlZiA9ICcnXG4gIGNvbnN0IG9sZFBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhdGUucG9zKSAhPT0gMHgyMS8qICEgKi8pIHsgcmV0dXJuIGZhbHNlIH1cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcyArIDEpICE9PSAweDVCLyogWyAqLykgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGNvbnN0IGxhYmVsU3RhcnQgPSBzdGF0ZS5wb3MgKyAyXG4gIGNvbnN0IGxhYmVsRW5kID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtMYWJlbChzdGF0ZSwgc3RhdGUucG9zICsgMSwgZmFsc2UpXG5cbiAgLy8gcGFyc2VyIGZhaWxlZCB0byBmaW5kICddJywgc28gaXQncyBub3QgYSB2YWxpZCBsaW5rXG4gIGlmIChsYWJlbEVuZCA8IDApIHsgcmV0dXJuIGZhbHNlIH1cblxuICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDI4LyogKCAqLykge1xuICAgIC8vXG4gICAgLy8gSW5saW5lIGxpbmtcbiAgICAvL1xuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgcG9zKytcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjb2RlKSAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrIH1cbiAgICB9XG4gICAgaWYgKHBvcyA+PSBtYXgpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgICAgXl5eXl5eIHBhcnNpbmcgbGluayBkZXN0aW5hdGlvblxuICAgIHN0YXJ0ID0gcG9zXG4gICAgcmVzID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtEZXN0aW5hdGlvbihzdGF0ZS5zcmMsIHBvcywgc3RhdGUucG9zTWF4KVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGhyZWYgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHJlcy5zdHIpXG4gICAgICBpZiAoc3RhdGUubWQudmFsaWRhdGVMaW5rKGhyZWYpKSB7XG4gICAgICAgIHBvcyA9IHJlcy5wb3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhyZWYgPSAnJ1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgLy8gICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgc3RhcnQgPSBwb3NcbiAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgIGlmICghaXNTcGFjZShjb2RlKSAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrIH1cbiAgICB9XG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICAgICAgICAgICAgXl5eXl5eXiBwYXJzaW5nIGxpbmsgdGl0bGVcbiAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua1RpdGxlKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgaWYgKHBvcyA8IG1heCAmJiBzdGFydCAhPT0gcG9zICYmIHJlcy5vaykge1xuICAgICAgdGl0bGUgPSByZXMuc3RyXG4gICAgICBwb3MgPSByZXMucG9zXG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICAgIGNvZGUgPSBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpXG4gICAgICAgIGlmICghaXNTcGFjZShjb2RlKSAmJiBjb2RlICE9PSAweDBBKSB7IGJyZWFrIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGUgPSAnJ1xuICAgIH1cblxuICAgIGlmIChwb3MgPj0gbWF4IHx8IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4MjkvKiApICovKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBvbGRQb3NcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBwb3MrK1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy8gTGluayByZWZlcmVuY2VcbiAgICAvL1xuICAgIGlmICh0eXBlb2Ygc3RhdGUuZW52LnJlZmVyZW5jZXMgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgPT09IDB4NUIvKiBbICovKSB7XG4gICAgICBzdGFydCA9IHBvcyArIDFcbiAgICAgIHBvcyA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHBvcylcbiAgICAgIGlmIChwb3MgPj0gMCkge1xuICAgICAgICBsYWJlbCA9IHN0YXRlLnNyYy5zbGljZShzdGFydCwgcG9zKyspXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zID0gbGFiZWxFbmQgKyAxXG4gICAgfVxuXG4gICAgLy8gY292ZXJzIGxhYmVsID09PSAnJyBhbmQgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgIC8vIChjb2xsYXBzZWQgcmVmZXJlbmNlIGxpbmsgYW5kIHNob3J0Y3V0IHJlZmVyZW5jZSBsaW5rIHJlc3BlY3RpdmVseSlcbiAgICBpZiAoIWxhYmVsKSB7IGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKGxhYmVsU3RhcnQsIGxhYmVsRW5kKSB9XG5cbiAgICByZWYgPSBzdGF0ZS5lbnYucmVmZXJlbmNlc1tub3JtYWxpemVSZWZlcmVuY2UobGFiZWwpXVxuICAgIGlmICghcmVmKSB7XG4gICAgICBzdGF0ZS5wb3MgPSBvbGRQb3NcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBocmVmID0gcmVmLmhyZWZcbiAgICB0aXRsZSA9IHJlZi50aXRsZVxuICB9XG5cbiAgLy9cbiAgLy8gV2UgZm91bmQgdGhlIGVuZCBvZiB0aGUgbGluaywgYW5kIGtub3cgZm9yIGEgZmFjdCBpdCdzIGEgdmFsaWQgbGluaztcbiAgLy8gc28gYWxsIHRoYXQncyBsZWZ0IHRvIGRvIGlzIHRvIGNhbGwgdG9rZW5pemVyLlxuICAvL1xuICBpZiAoIXNpbGVudCkge1xuICAgIGNvbnRlbnQgPSBzdGF0ZS5zcmMuc2xpY2UobGFiZWxTdGFydCwgbGFiZWxFbmQpXG5cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIHN0YXRlLm1kLmlubGluZS5wYXJzZShcbiAgICAgIGNvbnRlbnQsXG4gICAgICBzdGF0ZS5tZCxcbiAgICAgIHN0YXRlLmVudixcbiAgICAgIHRva2Vuc1xuICAgIClcblxuICAgIGNvbnN0IHRva2VuID0gc3RhdGUucHVzaCgnaW1hZ2UnLCAnaW1nJywgMClcbiAgICBjb25zdCBhdHRycyA9IFtbJ3NyYycsIGhyZWZdLCBbJ2FsdCcsICcnXV1cbiAgICB0b2tlbi5hdHRycyA9IGF0dHJzXG4gICAgdG9rZW4uY2hpbGRyZW4gPSB0b2tlbnNcbiAgICB0b2tlbi5jb250ZW50ID0gY29udGVudFxuXG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBhdHRycy5wdXNoKFsndGl0bGUnLCB0aXRsZV0pXG4gICAgfVxuICB9XG5cbiAgc3RhdGUucG9zID0gcG9zXG4gIHN0YXRlLnBvc01heCA9IG1heFxuICByZXR1cm4gdHJ1ZVxufVxuIiwiLy8gUHJvY2VzcyBbbGlua10oPHRvPiBcInN0dWZmXCIpXG5cbmltcG9ydCB7IG5vcm1hbGl6ZVJlZmVyZW5jZSwgaXNTcGFjZSB9IGZyb20gJy4uL2NvbW1vbi91dGlscy5tanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmsgKHN0YXRlLCBzaWxlbnQpIHtcbiAgbGV0IGNvZGUsIGxhYmVsLCByZXMsIHJlZlxuICBsZXQgaHJlZiA9ICcnXG4gIGxldCB0aXRsZSA9ICcnXG4gIGxldCBzdGFydCA9IHN0YXRlLnBvc1xuICBsZXQgcGFyc2VSZWZlcmVuY2UgPSB0cnVlXG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHN0YXRlLnBvcykgIT09IDB4NUIvKiBbICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgb2xkUG9zID0gc3RhdGUucG9zXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuICBjb25zdCBsYWJlbFN0YXJ0ID0gc3RhdGUucG9zICsgMVxuICBjb25zdCBsYWJlbEVuZCA9IHN0YXRlLm1kLmhlbHBlcnMucGFyc2VMaW5rTGFiZWwoc3RhdGUsIHN0YXRlLnBvcywgdHJ1ZSlcblxuICAvLyBwYXJzZXIgZmFpbGVkIHRvIGZpbmQgJ10nLCBzbyBpdCdzIG5vdCBhIHZhbGlkIGxpbmtcbiAgaWYgKGxhYmVsRW5kIDwgMCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCBwb3MgPSBsYWJlbEVuZCArIDFcbiAgaWYgKHBvcyA8IG1heCAmJiBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpID09PSAweDI4LyogKCAqLykge1xuICAgIC8vXG4gICAgLy8gSW5saW5lIGxpbmtcbiAgICAvL1xuXG4gICAgLy8gbWlnaHQgaGF2ZSBmb3VuZCBhIHZhbGlkIHNob3J0Y3V0IGxpbmssIGRpc2FibGUgcmVmZXJlbmNlIHBhcnNpbmdcbiAgICBwYXJzZVJlZmVyZW5jZSA9IGZhbHNlXG5cbiAgICAvLyBbbGlua10oICA8aHJlZj4gIFwidGl0bGVcIiAgKVxuICAgIC8vICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICBwb3MrK1xuICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgaWYgKCFpc1NwYWNlKGNvZGUpICYmIGNvZGUgIT09IDB4MEEpIHsgYnJlYWsgfVxuICAgIH1cbiAgICBpZiAocG9zID49IG1heCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAvLyAgICAgICAgICBeXl5eXl4gcGFyc2luZyBsaW5rIGRlc3RpbmF0aW9uXG4gICAgc3RhcnQgPSBwb3NcbiAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua0Rlc3RpbmF0aW9uKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgaHJlZiA9IHN0YXRlLm1kLm5vcm1hbGl6ZUxpbmsocmVzLnN0cilcbiAgICAgIGlmIChzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoaHJlZikpIHtcbiAgICAgICAgcG9zID0gcmVzLnBvc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHJlZiA9ICcnXG4gICAgICB9XG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICBeXiBza2lwcGluZyB0aGVzZSBzcGFjZXNcbiAgICAgIHN0YXJ0ID0gcG9zXG4gICAgICBmb3IgKDsgcG9zIDwgbWF4OyBwb3MrKykge1xuICAgICAgICBjb2RlID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKVxuICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICB9XG5cbiAgICAgIC8vIFtsaW5rXSggIDxocmVmPiAgXCJ0aXRsZVwiICApXG4gICAgICAvLyAgICAgICAgICAgICAgICAgIF5eXl5eXl4gcGFyc2luZyBsaW5rIHRpdGxlXG4gICAgICByZXMgPSBzdGF0ZS5tZC5oZWxwZXJzLnBhcnNlTGlua1RpdGxlKHN0YXRlLnNyYywgcG9zLCBzdGF0ZS5wb3NNYXgpXG4gICAgICBpZiAocG9zIDwgbWF4ICYmIHN0YXJ0ICE9PSBwb3MgJiYgcmVzLm9rKSB7XG4gICAgICAgIHRpdGxlID0gcmVzLnN0clxuICAgICAgICBwb3MgPSByZXMucG9zXG5cbiAgICAgICAgLy8gW2xpbmtdKCAgPGhyZWY+ICBcInRpdGxlXCIgIClcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgXl4gc2tpcHBpbmcgdGhlc2Ugc3BhY2VzXG4gICAgICAgIGZvciAoOyBwb3MgPCBtYXg7IHBvcysrKSB7XG4gICAgICAgICAgY29kZSA9IHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcylcbiAgICAgICAgICBpZiAoIWlzU3BhY2UoY29kZSkgJiYgY29kZSAhPT0gMHgwQSkgeyBicmVhayB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zID49IG1heCB8fCBzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDI5LyogKSAqLykge1xuICAgICAgLy8gcGFyc2luZyBhIHZhbGlkIHNob3J0Y3V0IGxpbmsgZmFpbGVkLCBmYWxsYmFjayB0byByZWZlcmVuY2VcbiAgICAgIHBhcnNlUmVmZXJlbmNlID0gdHJ1ZVxuICAgIH1cbiAgICBwb3MrK1xuICB9XG5cbiAgaWYgKHBhcnNlUmVmZXJlbmNlKSB7XG4gICAgLy9cbiAgICAvLyBMaW5rIHJlZmVyZW5jZVxuICAgIC8vXG4gICAgaWYgKHR5cGVvZiBzdGF0ZS5lbnYucmVmZXJlbmNlcyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlIH1cblxuICAgIGlmIChwb3MgPCBtYXggJiYgc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zKSA9PT0gMHg1Qi8qIFsgKi8pIHtcbiAgICAgIHN0YXJ0ID0gcG9zICsgMVxuICAgICAgcG9zID0gc3RhdGUubWQuaGVscGVycy5wYXJzZUxpbmtMYWJlbChzdGF0ZSwgcG9zKVxuICAgICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAgIGxhYmVsID0gc3RhdGUuc3JjLnNsaWNlKHN0YXJ0LCBwb3MrKylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvcyA9IGxhYmVsRW5kICsgMVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3MgPSBsYWJlbEVuZCArIDFcbiAgICB9XG5cbiAgICAvLyBjb3ZlcnMgbGFiZWwgPT09ICcnIGFuZCBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgLy8gKGNvbGxhcHNlZCByZWZlcmVuY2UgbGluayBhbmQgc2hvcnRjdXQgcmVmZXJlbmNlIGxpbmsgcmVzcGVjdGl2ZWx5KVxuICAgIGlmICghbGFiZWwpIHsgbGFiZWwgPSBzdGF0ZS5zcmMuc2xpY2UobGFiZWxTdGFydCwgbGFiZWxFbmQpIH1cblxuICAgIHJlZiA9IHN0YXRlLmVudi5yZWZlcmVuY2VzW25vcm1hbGl6ZVJlZmVyZW5jZShsYWJlbCldXG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHN0YXRlLnBvcyA9IG9sZFBvc1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGhyZWYgPSByZWYuaHJlZlxuICAgIHRpdGxlID0gcmVmLnRpdGxlXG4gIH1cblxuICAvL1xuICAvLyBXZSBmb3VuZCB0aGUgZW5kIG9mIHRoZSBsaW5rLCBhbmQga25vdyBmb3IgYSBmYWN0IGl0J3MgYSB2YWxpZCBsaW5rO1xuICAvLyBzbyBhbGwgdGhhdCdzIGxlZnQgdG8gZG8gaXMgdG8gY2FsbCB0b2tlbml6ZXIuXG4gIC8vXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucG9zID0gbGFiZWxTdGFydFxuICAgIHN0YXRlLnBvc01heCA9IGxhYmVsRW5kXG5cbiAgICBjb25zdCB0b2tlbl9vID0gc3RhdGUucHVzaCgnbGlua19vcGVuJywgJ2EnLCAxKVxuICAgIGNvbnN0IGF0dHJzID0gW1snaHJlZicsIGhyZWZdXVxuICAgIHRva2VuX28uYXR0cnMgID0gYXR0cnNcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGF0dHJzLnB1c2goWyd0aXRsZScsIHRpdGxlXSlcbiAgICB9XG5cbiAgICBzdGF0ZS5saW5rTGV2ZWwrK1xuICAgIHN0YXRlLm1kLmlubGluZS50b2tlbml6ZShzdGF0ZSlcbiAgICBzdGF0ZS5saW5rTGV2ZWwtLVxuXG4gICAgc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcbiAgc3RhdGUucG9zTWF4ID0gbWF4XG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZXNzIGxpbmtzIGxpa2UgaHR0cHM6Ly9leGFtcGxlLm9yZy9cblxuLy8gUkZDMzk4Njogc2NoZW1lID0gQUxQSEEgKiggQUxQSEEgLyBESUdJVCAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiApXG5jb25zdCBTQ0hFTUVfUkUgPSAvKD86XnxbXmEtejAtOS4rLV0pKFthLXpdW2EtejAtOS4rLV0qKSQvaVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsaW5raWZ5IChzdGF0ZSwgc2lsZW50KSB7XG4gIGlmICghc3RhdGUubWQub3B0aW9ucy5saW5raWZ5KSByZXR1cm4gZmFsc2VcbiAgaWYgKHN0YXRlLmxpbmtMZXZlbCA+IDApIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHBvcyA9IHN0YXRlLnBvc1xuICBjb25zdCBtYXggPSBzdGF0ZS5wb3NNYXhcblxuICBpZiAocG9zICsgMyA+IG1heCkgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpICE9PSAweDNBLyogOiAqLykgcmV0dXJuIGZhbHNlXG4gIGlmIChzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MgKyAxKSAhPT0gMHgyRi8qIC8gKi8pIHJldHVybiBmYWxzZVxuICBpZiAoc3RhdGUuc3JjLmNoYXJDb2RlQXQocG9zICsgMikgIT09IDB4MkYvKiAvICovKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBtYXRjaCA9IHN0YXRlLnBlbmRpbmcubWF0Y2goU0NIRU1FX1JFKVxuICBpZiAoIW1hdGNoKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwcm90byA9IG1hdGNoWzFdXG5cbiAgY29uc3QgbGluayA9IHN0YXRlLm1kLmxpbmtpZnkubWF0Y2hBdFN0YXJ0KHN0YXRlLnNyYy5zbGljZShwb3MgLSBwcm90by5sZW5ndGgpKVxuICBpZiAoIWxpbmspIHJldHVybiBmYWxzZVxuXG4gIGxldCB1cmwgPSBsaW5rLnVybFxuXG4gIC8vIGludmFsaWQgbGluaywgYnV0IHN0aWxsIGRldGVjdGVkIGJ5IGxpbmtpZnkgc29tZWhvdztcbiAgLy8gbmVlZCB0byBjaGVjayB0byBwcmV2ZW50IGluZmluaXRlIGxvb3AgYmVsb3dcbiAgaWYgKHVybC5sZW5ndGggPD0gcHJvdG8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICAvLyBkaXNhbGxvdyAnKicgYXQgdGhlIGVuZCBvZiB0aGUgbGluayAoY29uZmxpY3RzIHdpdGggZW1waGFzaXMpXG4gIHVybCA9IHVybC5yZXBsYWNlKC9cXCorJC8sICcnKVxuXG4gIGNvbnN0IGZ1bGxVcmwgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rKHVybClcbiAgaWYgKCFzdGF0ZS5tZC52YWxpZGF0ZUxpbmsoZnVsbFVybCkpIHJldHVybiBmYWxzZVxuXG4gIGlmICghc2lsZW50KSB7XG4gICAgc3RhdGUucGVuZGluZyA9IHN0YXRlLnBlbmRpbmcuc2xpY2UoMCwgLXByb3RvLmxlbmd0aClcblxuICAgIGNvbnN0IHRva2VuX28gPSBzdGF0ZS5wdXNoKCdsaW5rX29wZW4nLCAnYScsIDEpXG4gICAgdG9rZW5fby5hdHRycyA9IFtbJ2hyZWYnLCBmdWxsVXJsXV1cbiAgICB0b2tlbl9vLm1hcmt1cCA9ICdsaW5raWZ5J1xuICAgIHRva2VuX28uaW5mbyA9ICdhdXRvJ1xuXG4gICAgY29uc3QgdG9rZW5fdCA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbl90LmNvbnRlbnQgPSBzdGF0ZS5tZC5ub3JtYWxpemVMaW5rVGV4dCh1cmwpXG5cbiAgICBjb25zdCB0b2tlbl9jID0gc3RhdGUucHVzaCgnbGlua19jbG9zZScsICdhJywgLTEpXG4gICAgdG9rZW5fYy5tYXJrdXAgPSAnbGlua2lmeSdcbiAgICB0b2tlbl9jLmluZm8gPSAnYXV0bydcbiAgfVxuXG4gIHN0YXRlLnBvcyArPSB1cmwubGVuZ3RoIC0gcHJvdG8ubGVuZ3RoXG4gIHJldHVybiB0cnVlXG59XG4iLCIvLyBQcm9jZWVzcyAnXFxuJ1xuXG5pbXBvcnQgeyBpc1NwYWNlIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmV3bGluZSAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG5cbiAgaWYgKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykgIT09IDB4MEEvKiBcXG4gKi8pIHsgcmV0dXJuIGZhbHNlIH1cblxuICBjb25zdCBwbWF4ID0gc3RhdGUucGVuZGluZy5sZW5ndGggLSAxXG4gIGNvbnN0IG1heCA9IHN0YXRlLnBvc01heFxuXG4gIC8vICcgIFxcbicgLT4gaGFyZGJyZWFrXG4gIC8vIExvb2t1cCBpbiBwZW5kaW5nIGNoYXJzIGlzIGJhZCBwcmFjdGljZSEgRG9uJ3QgY29weSB0byBvdGhlciBydWxlcyFcbiAgLy8gUGVuZGluZyBzdHJpbmcgaXMgc3RvcmVkIGluIGNvbmNhdCBtb2RlLCBpbmRleGVkIGxvb2t1cHMgd2lsbCBjYXVzZVxuICAvLyBjb252ZXJ0aW9uIHRvIGZsYXQgbW9kZS5cbiAgaWYgKCFzaWxlbnQpIHtcbiAgICBpZiAocG1heCA+PSAwICYmIHN0YXRlLnBlbmRpbmcuY2hhckNvZGVBdChwbWF4KSA9PT0gMHgyMCkge1xuICAgICAgaWYgKHBtYXggPj0gMSAmJiBzdGF0ZS5wZW5kaW5nLmNoYXJDb2RlQXQocG1heCAtIDEpID09PSAweDIwKSB7XG4gICAgICAgIC8vIEZpbmQgd2hpdGVzcGFjZXMgdGFpbCBvZiBwZW5kaW5nIGNoYXJzLlxuICAgICAgICBsZXQgd3MgPSBwbWF4IC0gMVxuICAgICAgICB3aGlsZSAod3MgPj0gMSAmJiBzdGF0ZS5wZW5kaW5nLmNoYXJDb2RlQXQod3MgLSAxKSA9PT0gMHgyMCkgd3MtLVxuXG4gICAgICAgIHN0YXRlLnBlbmRpbmcgPSBzdGF0ZS5wZW5kaW5nLnNsaWNlKDAsIHdzKVxuICAgICAgICBzdGF0ZS5wdXNoKCdoYXJkYnJlYWsnLCAnYnInLCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucGVuZGluZyA9IHN0YXRlLnBlbmRpbmcuc2xpY2UoMCwgLTEpXG4gICAgICAgIHN0YXRlLnB1c2goJ3NvZnRicmVhaycsICdicicsIDApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLnB1c2goJ3NvZnRicmVhaycsICdicicsIDApXG4gICAgfVxuICB9XG5cbiAgcG9zKytcblxuICAvLyBza2lwIGhlYWRpbmcgc3BhY2VzIGZvciBuZXh0IGxpbmVcbiAgd2hpbGUgKHBvcyA8IG1heCAmJiBpc1NwYWNlKHN0YXRlLnNyYy5jaGFyQ29kZUF0KHBvcykpKSB7IHBvcysrIH1cblxuICBzdGF0ZS5wb3MgPSBwb3NcbiAgcmV0dXJuIHRydWVcbn1cbiIsIi8vIElubGluZSBwYXJzZXIgc3RhdGVcblxuaW1wb3J0IFRva2VuIGZyb20gJy4uL3Rva2VuLm1qcydcbmltcG9ydCB7IGlzV2hpdGVTcGFjZSwgaXNQdW5jdENoYXIsIGlzTWRBc2NpaVB1bmN0IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzLm1qcydcblxuZnVuY3Rpb24gU3RhdGVJbmxpbmUgKHNyYywgbWQsIGVudiwgb3V0VG9rZW5zKSB7XG4gIHRoaXMuc3JjID0gc3JjXG4gIHRoaXMuZW52ID0gZW52XG4gIHRoaXMubWQgPSBtZFxuICB0aGlzLnRva2VucyA9IG91dFRva2Vuc1xuICB0aGlzLnRva2Vuc19tZXRhID0gQXJyYXkob3V0VG9rZW5zLmxlbmd0aClcblxuICB0aGlzLnBvcyA9IDBcbiAgdGhpcy5wb3NNYXggPSB0aGlzLnNyYy5sZW5ndGhcbiAgdGhpcy5sZXZlbCA9IDBcbiAgdGhpcy5wZW5kaW5nID0gJydcbiAgdGhpcy5wZW5kaW5nTGV2ZWwgPSAwXG5cbiAgLy8gU3RvcmVzIHsgc3RhcnQ6IGVuZCB9IHBhaXJzLiBVc2VmdWwgZm9yIGJhY2t0cmFja1xuICAvLyBvcHRpbWl6YXRpb24gb2YgcGFpcnMgcGFyc2UgKGVtcGhhc2lzLCBzdHJpa2VzKS5cbiAgdGhpcy5jYWNoZSA9IHt9XG5cbiAgLy8gTGlzdCBvZiBlbXBoYXNpcy1saWtlIGRlbGltaXRlcnMgZm9yIGN1cnJlbnQgdGFnXG4gIHRoaXMuZGVsaW1pdGVycyA9IFtdXG5cbiAgLy8gU3RhY2sgb2YgZGVsaW1pdGVyIGxpc3RzIGZvciB1cHBlciBsZXZlbCB0YWdzXG4gIHRoaXMuX3ByZXZfZGVsaW1pdGVycyA9IFtdXG5cbiAgLy8gYmFja3RpY2sgbGVuZ3RoID0+IGxhc3Qgc2VlbiBwb3NpdGlvblxuICB0aGlzLmJhY2t0aWNrcyA9IHt9XG4gIHRoaXMuYmFja3RpY2tzU2Nhbm5lZCA9IGZhbHNlXG5cbiAgLy8gQ291bnRlciB1c2VkIHRvIGRpc2FibGUgaW5saW5lIGxpbmtpZnktaXQgZXhlY3V0aW9uXG4gIC8vIGluc2lkZSA8YT4gYW5kIG1hcmtkb3duIGxpbmtzXG4gIHRoaXMubGlua0xldmVsID0gMFxufVxuXG4vLyBGbHVzaCBwZW5kaW5nIHRleHRcbi8vXG5TdGF0ZUlubGluZS5wcm90b3R5cGUucHVzaFBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKCd0ZXh0JywgJycsIDApXG4gIHRva2VuLmNvbnRlbnQgPSB0aGlzLnBlbmRpbmdcbiAgdG9rZW4ubGV2ZWwgPSB0aGlzLnBlbmRpbmdMZXZlbFxuICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKVxuICB0aGlzLnBlbmRpbmcgPSAnJ1xuICByZXR1cm4gdG9rZW5cbn1cblxuLy8gUHVzaCBuZXcgdG9rZW4gdG8gXCJzdHJlYW1cIi5cbi8vIElmIHBlbmRpbmcgdGV4dCBleGlzdHMgLSBmbHVzaCBpdCBhcyB0ZXh0IHRva2VuXG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodHlwZSwgdGFnLCBuZXN0aW5nKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICB0aGlzLnB1c2hQZW5kaW5nKClcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKHR5cGUsIHRhZywgbmVzdGluZylcbiAgbGV0IHRva2VuX21ldGEgPSBudWxsXG5cbiAgaWYgKG5lc3RpbmcgPCAwKSB7XG4gICAgLy8gY2xvc2luZyB0YWdcbiAgICB0aGlzLmxldmVsLS1cbiAgICB0aGlzLmRlbGltaXRlcnMgPSB0aGlzLl9wcmV2X2RlbGltaXRlcnMucG9wKClcbiAgfVxuXG4gIHRva2VuLmxldmVsID0gdGhpcy5sZXZlbFxuXG4gIGlmIChuZXN0aW5nID4gMCkge1xuICAgIC8vIG9wZW5pbmcgdGFnXG4gICAgdGhpcy5sZXZlbCsrXG4gICAgdGhpcy5fcHJldl9kZWxpbWl0ZXJzLnB1c2godGhpcy5kZWxpbWl0ZXJzKVxuICAgIHRoaXMuZGVsaW1pdGVycyA9IFtdXG4gICAgdG9rZW5fbWV0YSA9IHsgZGVsaW1pdGVyczogdGhpcy5kZWxpbWl0ZXJzIH1cbiAgfVxuXG4gIHRoaXMucGVuZGluZ0xldmVsID0gdGhpcy5sZXZlbFxuICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKVxuICB0aGlzLnRva2Vuc19tZXRhLnB1c2godG9rZW5fbWV0YSlcbiAgcmV0dXJuIHRva2VuXG59XG5cbi8vIFNjYW4gYSBzZXF1ZW5jZSBvZiBlbXBoYXNpcy1saWtlIG1hcmtlcnMsIGFuZCBkZXRlcm1pbmUgd2hldGhlclxuLy8gaXQgY2FuIHN0YXJ0IGFuIGVtcGhhc2lzIHNlcXVlbmNlIG9yIGVuZCBhbiBlbXBoYXNpcyBzZXF1ZW5jZS5cbi8vXG4vLyAgLSBzdGFydCAtIHBvc2l0aW9uIHRvIHNjYW4gZnJvbSAoaXQgc2hvdWxkIHBvaW50IGF0IGEgdmFsaWQgbWFya2VyKTtcbi8vICAtIGNhblNwbGl0V29yZCAtIGRldGVybWluZSBpZiB0aGVzZSBtYXJrZXJzIGNhbiBiZSBmb3VuZCBpbnNpZGUgYSB3b3JkXG4vL1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLnNjYW5EZWxpbXMgPSBmdW5jdGlvbiAoc3RhcnQsIGNhblNwbGl0V29yZCkge1xuICBjb25zdCBtYXggPSB0aGlzLnBvc01heFxuICBjb25zdCBtYXJrZXIgPSB0aGlzLnNyYy5jaGFyQ29kZUF0KHN0YXJ0KVxuXG4gIC8vIHRyZWF0IGJlZ2lubmluZyBvZiB0aGUgbGluZSBhcyBhIHdoaXRlc3BhY2VcbiAgY29uc3QgbGFzdENoYXIgPSBzdGFydCA+IDAgPyB0aGlzLnNyYy5jaGFyQ29kZUF0KHN0YXJ0IC0gMSkgOiAweDIwXG5cbiAgbGV0IHBvcyA9IHN0YXJ0XG4gIHdoaWxlIChwb3MgPCBtYXggJiYgdGhpcy5zcmMuY2hhckNvZGVBdChwb3MpID09PSBtYXJrZXIpIHsgcG9zKysgfVxuXG4gIGNvbnN0IGNvdW50ID0gcG9zIC0gc3RhcnRcblxuICAvLyB0cmVhdCBlbmQgb2YgdGhlIGxpbmUgYXMgYSB3aGl0ZXNwYWNlXG4gIGNvbnN0IG5leHRDaGFyID0gcG9zIDwgbWF4ID8gdGhpcy5zcmMuY2hhckNvZGVBdChwb3MpIDogMHgyMFxuXG4gIGNvbnN0IGlzTGFzdFB1bmN0Q2hhciA9IGlzTWRBc2NpaVB1bmN0KGxhc3RDaGFyKSB8fCBpc1B1bmN0Q2hhcihTdHJpbmcuZnJvbUNoYXJDb2RlKGxhc3RDaGFyKSlcbiAgY29uc3QgaXNOZXh0UHVuY3RDaGFyID0gaXNNZEFzY2lpUHVuY3QobmV4dENoYXIpIHx8IGlzUHVuY3RDaGFyKFN0cmluZy5mcm9tQ2hhckNvZGUobmV4dENoYXIpKVxuXG4gIGNvbnN0IGlzTGFzdFdoaXRlU3BhY2UgPSBpc1doaXRlU3BhY2UobGFzdENoYXIpXG4gIGNvbnN0IGlzTmV4dFdoaXRlU3BhY2UgPSBpc1doaXRlU3BhY2UobmV4dENoYXIpXG5cbiAgY29uc3QgbGVmdF9mbGFua2luZyA9XG4gICAgIWlzTmV4dFdoaXRlU3BhY2UgJiYgKCFpc05leHRQdW5jdENoYXIgfHwgaXNMYXN0V2hpdGVTcGFjZSB8fCBpc0xhc3RQdW5jdENoYXIpXG4gIGNvbnN0IHJpZ2h0X2ZsYW5raW5nID1cbiAgICAhaXNMYXN0V2hpdGVTcGFjZSAmJiAoIWlzTGFzdFB1bmN0Q2hhciB8fCBpc05leHRXaGl0ZVNwYWNlIHx8IGlzTmV4dFB1bmN0Q2hhcilcblxuICBjb25zdCBjYW5fb3BlbiAgPSBsZWZ0X2ZsYW5raW5nICAmJiAoY2FuU3BsaXRXb3JkIHx8ICFyaWdodF9mbGFua2luZyB8fCBpc0xhc3RQdW5jdENoYXIpXG4gIGNvbnN0IGNhbl9jbG9zZSA9IHJpZ2h0X2ZsYW5raW5nICYmIChjYW5TcGxpdFdvcmQgfHwgIWxlZnRfZmxhbmtpbmcgIHx8IGlzTmV4dFB1bmN0Q2hhcilcblxuICByZXR1cm4geyBjYW5fb3BlbiwgY2FuX2Nsb3NlLCBsZW5ndGg6IGNvdW50IH1cbn1cblxuLy8gcmUtZXhwb3J0IFRva2VuIGNsYXNzIHRvIHVzZSBpbiBibG9jayBydWxlc1xuU3RhdGVJbmxpbmUucHJvdG90eXBlLlRva2VuID0gVG9rZW5cblxuZXhwb3J0IGRlZmF1bHQgU3RhdGVJbmxpbmVcbiIsIi8vIH5+c3RyaWtlIHRocm91Z2h+flxuLy9cblxuLy8gSW5zZXJ0IGVhY2ggbWFya2VyIGFzIGEgc2VwYXJhdGUgdGV4dCB0b2tlbiwgYW5kIGFkZCBpdCB0byBkZWxpbWl0ZXIgbGlzdFxuLy9cbmZ1bmN0aW9uIHN0cmlrZXRocm91Z2hfdG9rZW5pemUgKHN0YXRlLCBzaWxlbnQpIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGF0ZS5wb3NcbiAgY29uc3QgbWFya2VyID0gc3RhdGUuc3JjLmNoYXJDb2RlQXQoc3RhcnQpXG5cbiAgaWYgKHNpbGVudCkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGlmIChtYXJrZXIgIT09IDB4N0UvKiB+ICovKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgY29uc3Qgc2Nhbm5lZCA9IHN0YXRlLnNjYW5EZWxpbXMoc3RhdGUucG9zLCB0cnVlKVxuICBsZXQgbGVuID0gc2Nhbm5lZC5sZW5ndGhcbiAgY29uc3QgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1hcmtlcilcblxuICBpZiAobGVuIDwgMikgeyByZXR1cm4gZmFsc2UgfVxuXG4gIGxldCB0b2tlblxuXG4gIGlmIChsZW4gJSAyKSB7XG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnB1c2goJ3RleHQnLCAnJywgMClcbiAgICB0b2tlbi5jb250ZW50ID0gY2hcbiAgICBsZW4tLVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS5wdXNoKCd0ZXh0JywgJycsIDApXG4gICAgdG9rZW4uY29udGVudCA9IGNoICsgY2hcblxuICAgIHN0YXRlLmRlbGltaXRlcnMucHVzaCh7XG4gICAgICBtYXJrZXIsXG4gICAgICBsZW5ndGg6IDAsICAgICAvLyBkaXNhYmxlIFwicnVsZSBvZiAzXCIgbGVuZ3RoIGNoZWNrcyBtZWFudCBmb3IgZW1waGFzaXNcbiAgICAgIHRva2VuOiBzdGF0ZS50b2tlbnMubGVuZ3RoIC0gMSxcbiAgICAgIGVuZDogLTEsXG4gICAgICBvcGVuOiBzY2FubmVkLmNhbl9vcGVuLFxuICAgICAgY2xvc2U6IHNjYW5uZWQuY2FuX2Nsb3NlXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRlLnBvcyArPSBzY2FubmVkLmxlbmd0aFxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHBvc3RQcm9jZXNzIChzdGF0ZSwgZGVsaW1pdGVycykge1xuICBsZXQgdG9rZW5cbiAgY29uc3QgbG9uZU1hcmtlcnMgPSBbXVxuICBjb25zdCBtYXggPSBkZWxpbWl0ZXJzLmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICBjb25zdCBzdGFydERlbGltID0gZGVsaW1pdGVyc1tpXVxuXG4gICAgaWYgKHN0YXJ0RGVsaW0ubWFya2VyICE9PSAweDdFLyogfiAqLykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoc3RhcnREZWxpbS5lbmQgPT09IC0xKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGVuZERlbGltID0gZGVsaW1pdGVyc1tzdGFydERlbGltLmVuZF1cblxuICAgIHRva2VuICAgICAgICAgPSBzdGF0ZS50b2tlbnNbc3RhcnREZWxpbS50b2tlbl1cbiAgICB0b2tlbi50eXBlICAgID0gJ3Nfb3BlbidcbiAgICB0b2tlbi50YWcgICAgID0gJ3MnXG4gICAgdG9rZW4ubmVzdGluZyA9IDFcbiAgICB0b2tlbi5tYXJrdXAgID0gJ35+J1xuICAgIHRva2VuLmNvbnRlbnQgPSAnJ1xuXG4gICAgdG9rZW4gICAgICAgICA9IHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbl1cbiAgICB0b2tlbi50eXBlICAgID0gJ3NfY2xvc2UnXG4gICAgdG9rZW4udGFnICAgICA9ICdzJ1xuICAgIHRva2VuLm5lc3RpbmcgPSAtMVxuICAgIHRva2VuLm1hcmt1cCAgPSAnfn4nXG4gICAgdG9rZW4uY29udGVudCA9ICcnXG5cbiAgICBpZiAoc3RhdGUudG9rZW5zW2VuZERlbGltLnRva2VuIC0gMV0udHlwZSA9PT0gJ3RleHQnICYmXG4gICAgICAgIHN0YXRlLnRva2Vuc1tlbmREZWxpbS50b2tlbiAtIDFdLmNvbnRlbnQgPT09ICd+Jykge1xuICAgICAgbG9uZU1hcmtlcnMucHVzaChlbmREZWxpbS50b2tlbiAtIDEpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgYSBtYXJrZXIgc2VxdWVuY2UgaGFzIGFuIG9kZCBudW1iZXIgb2YgY2hhcmFjdGVycywgaXQncyBzcGxpdHRlZFxuICAvLyBsaWtlIHRoaXM6IGB+fn5+fmAgLT4gYH5gICsgYH5+YCArIGB+fmAsIGxlYXZpbmcgb25lIG1hcmtlciBhdCB0aGVcbiAgLy8gc3RhcnQgb2YgdGhlIHNlcXVlbmNlLlxuICAvL1xuICAvLyBTbywgd2UgaGF2ZSB0byBtb3ZlIGFsbCB0aG9zZSBtYXJrZXJzIGFmdGVyIHN1YnNlcXVlbnQgc19jbG9zZSB0YWdzLlxuICAvL1xuICB3aGlsZSAobG9uZU1hcmtlcnMubGVuZ3RoKSB7XG4gICAgY29uc3QgaSA9IGxvbmVNYXJrZXJzLnBvcCgpXG4gICAgbGV0IGogPSBpICsgMVxuXG4gICAgd2hpbGUgKGogPCBzdGF0ZS50b2tlbnMubGVuZ3RoICYmIHN0YXRlLnRva2Vuc1tqXS50eXBlID09PSAnc19jbG9zZScpIHtcbiAgICAgIGorK1xuICAgIH1cblxuICAgIGotLVxuXG4gICAgaWYgKGkgIT09IGopIHtcbiAgICAgIHRva2VuID0gc3RhdGUudG9rZW5zW2pdXG4gICAgICBzdGF0ZS50b2tlbnNbal0gPSBzdGF0ZS50b2tlbnNbaV1cbiAgICAgIHN0YXRlLnRva2Vuc1tpXSA9IHRva2VuXG4gICAgfVxuICB9XG59XG5cbi8vIFdhbGsgdGhyb3VnaCBkZWxpbWl0ZXIgbGlzdCBhbmQgcmVwbGFjZSB0ZXh0IHRva2VucyB3aXRoIHRhZ3Ncbi8vXG5mdW5jdGlvbiBzdHJpa2V0aHJvdWdoX3Bvc3RQcm9jZXNzIChzdGF0ZSkge1xuICBjb25zdCB0b2tlbnNfbWV0YSA9IHN0YXRlLnRva2Vuc19tZXRhXG4gIGNvbnN0IG1heCA9IHN0YXRlLnRva2Vuc19tZXRhLmxlbmd0aFxuXG4gIHBvc3RQcm9jZXNzKHN0YXRlLCBzdGF0ZS5kZWxpbWl0ZXJzKVxuXG4gIGZvciAobGV0IGN1cnIgPSAwOyBjdXJyIDwgbWF4OyBjdXJyKyspIHtcbiAgICBpZiAodG9rZW5zX21ldGFbY3Vycl0gJiYgdG9rZW5zX21ldGFbY3Vycl0uZGVsaW1pdGVycykge1xuICAgICAgcG9zdFByb2Nlc3Moc3RhdGUsIHRva2Vuc19tZXRhW2N1cnJdLmRlbGltaXRlcnMpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgdG9rZW5pemU6IHN0cmlrZXRocm91Z2hfdG9rZW5pemUsXG4gIHBvc3RQcm9jZXNzOiBzdHJpa2V0aHJvdWdoX3Bvc3RQcm9jZXNzXG59XG4iLCIvLyBTa2lwIHRleHQgY2hhcmFjdGVycyBmb3IgdGV4dCB0b2tlbiwgcGxhY2UgdGhvc2UgdG8gcGVuZGluZyBidWZmZXJcbi8vIGFuZCBpbmNyZW1lbnQgY3VycmVudCBwb3NcblxuLy8gUnVsZSB0byBza2lwIHB1cmUgdGV4dFxuLy8gJ3t9JCVAfis9OicgcmVzZXJ2ZWQgZm9yIGV4dGVudGlvbnNcblxuLy8gISwgXCIsICMsICQsICUsICYsICcsICgsICksICosICssICwsIC0sIC4sIC8sIDosIDssIDwsID0sID4sID8sIEAsIFssIFxcLCBdLCBeLCBfLCBgLCB7LCB8LCB9LCBvciB+XG5cbi8vICEhISEgRG9uJ3QgY29uZnVzZSB3aXRoIFwiTWFya2Rvd24gQVNDSUkgUHVuY3R1YXRpb25cIiBjaGFyc1xuLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xNS8jYXNjaWktcHVuY3R1YXRpb24tY2hhcmFjdGVyXG5mdW5jdGlvbiBpc1Rlcm1pbmF0b3JDaGFyIChjaCkge1xuICBzd2l0Y2ggKGNoKSB7XG4gICAgY2FzZSAweDBBLyogXFxuICovOlxuICAgIGNhc2UgMHgyMS8qICEgKi86XG4gICAgY2FzZSAweDIzLyogIyAqLzpcbiAgICBjYXNlIDB4MjQvKiAkICovOlxuICAgIGNhc2UgMHgyNS8qICUgKi86XG4gICAgY2FzZSAweDI2LyogJiAqLzpcbiAgICBjYXNlIDB4MkEvKiAqICovOlxuICAgIGNhc2UgMHgyQi8qICsgKi86XG4gICAgY2FzZSAweDJELyogLSAqLzpcbiAgICBjYXNlIDB4M0EvKiA6ICovOlxuICAgIGNhc2UgMHgzQy8qIDwgKi86XG4gICAgY2FzZSAweDNELyogPSAqLzpcbiAgICBjYXNlIDB4M0UvKiA+ICovOlxuICAgIGNhc2UgMHg0MC8qIEAgKi86XG4gICAgY2FzZSAweDVCLyogWyAqLzpcbiAgICBjYXNlIDB4NUMvKiBcXCAqLzpcbiAgICBjYXNlIDB4NUQvKiBdICovOlxuICAgIGNhc2UgMHg1RS8qIF4gKi86XG4gICAgY2FzZSAweDVGLyogXyAqLzpcbiAgICBjYXNlIDB4NjAvKiBgICovOlxuICAgIGNhc2UgMHg3Qi8qIHsgKi86XG4gICAgY2FzZSAweDdELyogfSAqLzpcbiAgICBjYXNlIDB4N0UvKiB+ICovOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGV4dCAoc3RhdGUsIHNpbGVudCkge1xuICBsZXQgcG9zID0gc3RhdGUucG9zXG5cbiAgd2hpbGUgKHBvcyA8IHN0YXRlLnBvc01heCAmJiAhaXNUZXJtaW5hdG9yQ2hhcihzdGF0ZS5zcmMuY2hhckNvZGVBdChwb3MpKSkge1xuICAgIHBvcysrXG4gIH1cblxuICBpZiAocG9zID09PSBzdGF0ZS5wb3MpIHsgcmV0dXJuIGZhbHNlIH1cblxuICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShzdGF0ZS5wb3MsIHBvcykgfVxuXG4gIHN0YXRlLnBvcyA9IHBvc1xuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIEFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uLCBmb3IgbWVtb3J5LlxuLy9cbi8vIEl0IGNvc3RzIDEwJSBvZiBwZXJmb3JtYW5jZSwgYnV0IGFsbG93cyBleHRlbmQgdGVybWluYXRvcnMgbGlzdCwgaWYgcGxhY2UgaXRcbi8vIHRvIGBQYXJzZXJJbmxpbmVgIHByb3BlcnR5LiBQcm9iYWJseSwgd2lsbCBzd2l0Y2ggdG8gaXQgc29tZXRpbWUsIHN1Y2hcbi8vIGZsZXhpYmlsaXR5IHJlcXVpcmVkLlxuXG4vKlxudmFyIFRFUk1JTkFUT1JfUkUgPSAvW1xcbiEjJCUmKitcXC06PD0+QFtcXFxcXFxdXl9ge31+XS87XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGV4dChzdGF0ZSwgc2lsZW50KSB7XG4gIHZhciBwb3MgPSBzdGF0ZS5wb3MsXG4gICAgICBpZHggPSBzdGF0ZS5zcmMuc2xpY2UocG9zKS5zZWFyY2goVEVSTUlOQVRPUl9SRSk7XG5cbiAgLy8gZmlyc3QgY2hhciBpcyB0ZXJtaW5hdG9yIC0+IGVtcHR5IHRleHRcbiAgaWYgKGlkeCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyBubyB0ZXJtaW5hdG9yIC0+IHRleHQgdGlsbCBlbmQgb2Ygc3RyaW5nXG4gIGlmIChpZHggPCAwKSB7XG4gICAgaWYgKCFzaWxlbnQpIHsgc3RhdGUucGVuZGluZyArPSBzdGF0ZS5zcmMuc2xpY2UocG9zKTsgfVxuICAgIHN0YXRlLnBvcyA9IHN0YXRlLnNyYy5sZW5ndGg7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXNpbGVudCkgeyBzdGF0ZS5wZW5kaW5nICs9IHN0YXRlLnNyYy5zbGljZShwb3MsIHBvcyArIGlkeCk7IH1cblxuICBzdGF0ZS5wb3MgKz0gaWR4O1xuXG4gIHJldHVybiB0cnVlO1xufTsgKi9cbiIsIi8vIFRva2VuIGNsYXNzXG5cbi8qKlxuICogY2xhc3MgVG9rZW5cbiAqKi9cblxuLyoqXG4gKiBuZXcgVG9rZW4odHlwZSwgdGFnLCBuZXN0aW5nKVxuICpcbiAqIENyZWF0ZSBuZXcgdG9rZW4gYW5kIGZpbGwgcGFzc2VkIHByb3BlcnRpZXMuXG4gKiovXG5mdW5jdGlvbiBUb2tlbiAodHlwZSwgdGFnLCBuZXN0aW5nKSB7XG4gIC8qKlxuICAgKiBUb2tlbiN0eXBlIC0+IFN0cmluZ1xuICAgKlxuICAgKiBUeXBlIG9mIHRoZSB0b2tlbiAoc3RyaW5nLCBlLmcuIFwicGFyYWdyYXBoX29wZW5cIilcbiAgICoqL1xuICB0aGlzLnR5cGUgICAgID0gdHlwZVxuXG4gIC8qKlxuICAgKiBUb2tlbiN0YWcgLT4gU3RyaW5nXG4gICAqXG4gICAqIGh0bWwgdGFnIG5hbWUsIGUuZy4gXCJwXCJcbiAgICoqL1xuICB0aGlzLnRhZyAgICAgID0gdGFnXG5cbiAgLyoqXG4gICAqIFRva2VuI2F0dHJzIC0+IEFycmF5XG4gICAqXG4gICAqIEh0bWwgYXR0cmlidXRlcy4gRm9ybWF0OiBgWyBbIG5hbWUxLCB2YWx1ZTEgXSwgWyBuYW1lMiwgdmFsdWUyIF0gXWBcbiAgICoqL1xuICB0aGlzLmF0dHJzICAgID0gbnVsbFxuXG4gIC8qKlxuICAgKiBUb2tlbiNtYXAgLT4gQXJyYXlcbiAgICpcbiAgICogU291cmNlIG1hcCBpbmZvLiBGb3JtYXQ6IGBbIGxpbmVfYmVnaW4sIGxpbmVfZW5kIF1gXG4gICAqKi9cbiAgdGhpcy5tYXAgICAgICA9IG51bGxcblxuICAvKipcbiAgICogVG9rZW4jbmVzdGluZyAtPiBOdW1iZXJcbiAgICpcbiAgICogTGV2ZWwgY2hhbmdlIChudW1iZXIgaW4gey0xLCAwLCAxfSBzZXQpLCB3aGVyZTpcbiAgICpcbiAgICogLSAgYDFgIG1lYW5zIHRoZSB0YWcgaXMgb3BlbmluZ1xuICAgKiAtICBgMGAgbWVhbnMgdGhlIHRhZyBpcyBzZWxmLWNsb3NpbmdcbiAgICogLSBgLTFgIG1lYW5zIHRoZSB0YWcgaXMgY2xvc2luZ1xuICAgKiovXG4gIHRoaXMubmVzdGluZyAgPSBuZXN0aW5nXG5cbiAgLyoqXG4gICAqIFRva2VuI2xldmVsIC0+IE51bWJlclxuICAgKlxuICAgKiBuZXN0aW5nIGxldmVsLCB0aGUgc2FtZSBhcyBgc3RhdGUubGV2ZWxgXG4gICAqKi9cbiAgdGhpcy5sZXZlbCAgICA9IDBcblxuICAvKipcbiAgICogVG9rZW4jY2hpbGRyZW4gLT4gQXJyYXlcbiAgICpcbiAgICogQW4gYXJyYXkgb2YgY2hpbGQgbm9kZXMgKGlubGluZSBhbmQgaW1nIHRva2VucylcbiAgICoqL1xuICB0aGlzLmNoaWxkcmVuID0gbnVsbFxuXG4gIC8qKlxuICAgKiBUb2tlbiNjb250ZW50IC0+IFN0cmluZ1xuICAgKlxuICAgKiBJbiBhIGNhc2Ugb2Ygc2VsZi1jbG9zaW5nIHRhZyAoY29kZSwgaHRtbCwgZmVuY2UsIGV0Yy4pLFxuICAgKiBpdCBoYXMgY29udGVudHMgb2YgdGhpcyB0YWcuXG4gICAqKi9cbiAgdGhpcy5jb250ZW50ICA9ICcnXG5cbiAgLyoqXG4gICAqIFRva2VuI21hcmt1cCAtPiBTdHJpbmdcbiAgICpcbiAgICogJyonIG9yICdfJyBmb3IgZW1waGFzaXMsIGZlbmNlIHN0cmluZyBmb3IgZmVuY2UsIGV0Yy5cbiAgICoqL1xuICB0aGlzLm1hcmt1cCAgID0gJydcblxuICAvKipcbiAgICogVG9rZW4jaW5mbyAtPiBTdHJpbmdcbiAgICpcbiAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbjpcbiAgICpcbiAgICogLSBJbmZvIHN0cmluZyBmb3IgXCJmZW5jZVwiIHRva2Vuc1xuICAgKiAtIFRoZSB2YWx1ZSBcImF1dG9cIiBmb3IgYXV0b2xpbmsgXCJsaW5rX29wZW5cIiBhbmQgXCJsaW5rX2Nsb3NlXCIgdG9rZW5zXG4gICAqIC0gVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgaXRlbSBtYXJrZXIgZm9yIG9yZGVyZWQtbGlzdCBcImxpc3RfaXRlbV9vcGVuXCIgdG9rZW5zXG4gICAqKi9cbiAgdGhpcy5pbmZvICAgICA9ICcnXG5cbiAgLyoqXG4gICAqIFRva2VuI21ldGEgLT4gT2JqZWN0XG4gICAqXG4gICAqIEEgcGxhY2UgZm9yIHBsdWdpbnMgdG8gc3RvcmUgYW4gYXJiaXRyYXJ5IGRhdGFcbiAgICoqL1xuICB0aGlzLm1ldGEgICAgID0gbnVsbFxuXG4gIC8qKlxuICAgKiBUb2tlbiNibG9jayAtPiBCb29sZWFuXG4gICAqXG4gICAqIFRydWUgZm9yIGJsb2NrLWxldmVsIHRva2VucywgZmFsc2UgZm9yIGlubGluZSB0b2tlbnMuXG4gICAqIFVzZWQgaW4gcmVuZGVyZXIgdG8gY2FsY3VsYXRlIGxpbmUgYnJlYWtzXG4gICAqKi9cbiAgdGhpcy5ibG9jayAgICA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFRva2VuI2hpZGRlbiAtPiBCb29sZWFuXG4gICAqXG4gICAqIElmIGl0J3MgdHJ1ZSwgaWdub3JlIHRoaXMgZWxlbWVudCB3aGVuIHJlbmRlcmluZy4gVXNlZCBmb3IgdGlnaHQgbGlzdHNcbiAgICogdG8gaGlkZSBwYXJhZ3JhcGhzLlxuICAgKiovXG4gIHRoaXMuaGlkZGVuICAgPSBmYWxzZVxufVxuXG4vKipcbiAqIFRva2VuLmF0dHJJbmRleChuYW1lKSAtPiBOdW1iZXJcbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlIGluZGV4IGJ5IG5hbWUuXG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0ckluZGV4ID0gZnVuY3Rpb24gYXR0ckluZGV4IChuYW1lKSB7XG4gIGlmICghdGhpcy5hdHRycykgeyByZXR1cm4gLTEgfVxuXG4gIGNvbnN0IGF0dHJzID0gdGhpcy5hdHRyc1xuXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhdHRycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChhdHRyc1tpXVswXSA9PT0gbmFtZSkgeyByZXR1cm4gaSB9XG4gIH1cbiAgcmV0dXJuIC0xXG59XG5cbi8qKlxuICogVG9rZW4uYXR0clB1c2goYXR0ckRhdGEpXG4gKlxuICogQWRkIGBbIG5hbWUsIHZhbHVlIF1gIGF0dHJpYnV0ZSB0byBsaXN0LiBJbml0IGF0dHJzIGlmIG5lY2Vzc2FyeVxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJQdXNoID0gZnVuY3Rpb24gYXR0clB1c2ggKGF0dHJEYXRhKSB7XG4gIGlmICh0aGlzLmF0dHJzKSB7XG4gICAgdGhpcy5hdHRycy5wdXNoKGF0dHJEYXRhKVxuICB9IGVsc2Uge1xuICAgIHRoaXMuYXR0cnMgPSBbYXR0ckRhdGFdXG4gIH1cbn1cblxuLyoqXG4gKiBUb2tlbi5hdHRyU2V0KG5hbWUsIHZhbHVlKVxuICpcbiAqIFNldCBgbmFtZWAgYXR0cmlidXRlIHRvIGB2YWx1ZWAuIE92ZXJyaWRlIG9sZCB2YWx1ZSBpZiBleGlzdHMuXG4gKiovXG5Ub2tlbi5wcm90b3R5cGUuYXR0clNldCA9IGZ1bmN0aW9uIGF0dHJTZXQgKG5hbWUsIHZhbHVlKSB7XG4gIGNvbnN0IGlkeCA9IHRoaXMuYXR0ckluZGV4KG5hbWUpXG4gIGNvbnN0IGF0dHJEYXRhID0gW25hbWUsIHZhbHVlXVxuXG4gIGlmIChpZHggPCAwKSB7XG4gICAgdGhpcy5hdHRyUHVzaChhdHRyRGF0YSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmF0dHJzW2lkeF0gPSBhdHRyRGF0YVxuICB9XG59XG5cbi8qKlxuICogVG9rZW4uYXR0ckdldChuYW1lKVxuICpcbiAqIEdldCB0aGUgdmFsdWUgb2YgYXR0cmlidXRlIGBuYW1lYCwgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAqKi9cblRva2VuLnByb3RvdHlwZS5hdHRyR2V0ID0gZnVuY3Rpb24gYXR0ckdldCAobmFtZSkge1xuICBjb25zdCBpZHggPSB0aGlzLmF0dHJJbmRleChuYW1lKVxuICBsZXQgdmFsdWUgPSBudWxsXG4gIGlmIChpZHggPj0gMCkge1xuICAgIHZhbHVlID0gdGhpcy5hdHRyc1tpZHhdWzFdXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogVG9rZW4uYXR0ckpvaW4obmFtZSwgdmFsdWUpXG4gKlxuICogSm9pbiB2YWx1ZSB0byBleGlzdGluZyBhdHRyaWJ1dGUgdmlhIHNwYWNlLiBPciBjcmVhdGUgbmV3IGF0dHJpYnV0ZSBpZiBub3RcbiAqIGV4aXN0cy4gVXNlZnVsIHRvIG9wZXJhdGUgd2l0aCB0b2tlbiBjbGFzc2VzLlxuICoqL1xuVG9rZW4ucHJvdG90eXBlLmF0dHJKb2luID0gZnVuY3Rpb24gYXR0ckpvaW4gKG5hbWUsIHZhbHVlKSB7XG4gIGNvbnN0IGlkeCA9IHRoaXMuYXR0ckluZGV4KG5hbWUpXG5cbiAgaWYgKGlkeCA8IDApIHtcbiAgICB0aGlzLmF0dHJQdXNoKFtuYW1lLCB2YWx1ZV0pXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hdHRyc1tpZHhdWzFdID0gdGhpcy5hdHRyc1tpZHhdWzFdICsgJyAnICsgdmFsdWVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUb2tlblxuIiwiaW1wb3J0IGRlY29kZSBmcm9tICcuL2xpYi9kZWNvZGUubWpzJ1xuaW1wb3J0IGVuY29kZSBmcm9tICcuL2xpYi9lbmNvZGUubWpzJ1xuaW1wb3J0IGZvcm1hdCBmcm9tICcuL2xpYi9mb3JtYXQubWpzJ1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vbGliL3BhcnNlLm1qcydcblxuZXhwb3J0IHtcbiAgZGVjb2RlLFxuICBlbmNvZGUsXG4gIGZvcm1hdCxcbiAgcGFyc2Vcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblxuY29uc3QgZGVjb2RlQ2FjaGUgPSB7fVxuXG5mdW5jdGlvbiBnZXREZWNvZGVDYWNoZSAoZXhjbHVkZSkge1xuICBsZXQgY2FjaGUgPSBkZWNvZGVDYWNoZVtleGNsdWRlXVxuICBpZiAoY2FjaGUpIHsgcmV0dXJuIGNhY2hlIH1cblxuICBjYWNoZSA9IGRlY29kZUNhY2hlW2V4Y2x1ZGVdID0gW11cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDEyODsgaSsrKSB7XG4gICAgY29uc3QgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG4gICAgY2FjaGUucHVzaChjaClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZXhjbHVkZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gZXhjbHVkZS5jaGFyQ29kZUF0KGkpXG4gICAgY2FjaGVbY2hdID0gJyUnICsgKCcwJyArIGNoLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zbGljZSgtMilcbiAgfVxuXG4gIHJldHVybiBjYWNoZVxufVxuXG4vLyBEZWNvZGUgcGVyY2VudC1lbmNvZGVkIHN0cmluZy5cbi8vXG5mdW5jdGlvbiBkZWNvZGUgKHN0cmluZywgZXhjbHVkZSkge1xuICBpZiAodHlwZW9mIGV4Y2x1ZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgZXhjbHVkZSA9IGRlY29kZS5kZWZhdWx0Q2hhcnNcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RGVjb2RlQ2FjaGUoZXhjbHVkZSlcblxuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyglW2EtZjAtOV17Mn0pKy9naSwgZnVuY3Rpb24gKHNlcSkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzZXEubGVuZ3RoOyBpIDwgbDsgaSArPSAzKSB7XG4gICAgICBjb25zdCBiMSA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgMSwgaSArIDMpLCAxNilcblxuICAgICAgaWYgKGIxIDwgMHg4MCkge1xuICAgICAgICByZXN1bHQgKz0gY2FjaGVbYjFdXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICgoYjEgJiAweEUwKSA9PT0gMHhDMCAmJiAoaSArIDMgPCBsKSkge1xuICAgICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgICBjb25zdCBiMiA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNCwgaSArIDYpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBjb25zdCBjaHIgPSAoKGIxIDw8IDYpICYgMHg3QzApIHwgKGIyICYgMHgzRilcblxuICAgICAgICAgIGlmIChjaHIgPCAweDgwKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaHIpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSArPSAzXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKGIxICYgMHhGMCkgPT09IDB4RTAgJiYgKGkgKyA2IDwgbCkpIHtcbiAgICAgICAgLy8gMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHhcbiAgICAgICAgY29uc3QgYjIgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDQsIGkgKyA2KSwgMTYpXG4gICAgICAgIGNvbnN0IGIzID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA3LCBpICsgOSksIDE2KVxuXG4gICAgICAgIGlmICgoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgIGNvbnN0IGNociA9ICgoYjEgPDwgMTIpICYgMHhGMDAwKSB8ICgoYjIgPDwgNikgJiAweEZDMCkgfCAoYjMgJiAweDNGKVxuXG4gICAgICAgICAgaWYgKGNociA8IDB4ODAwIHx8IChjaHIgPj0gMHhEODAwICYmIGNociA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmRcXHVmZmZkXFx1ZmZmZCdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGkgKz0gNlxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKChiMSAmIDB4RjgpID09PSAweEYwICYmIChpICsgOSA8IGwpKSB7XG4gICAgICAgIC8vIDExMTExMHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICAgIGNvbnN0IGIyID0gcGFyc2VJbnQoc2VxLnNsaWNlKGkgKyA0LCBpICsgNiksIDE2KVxuICAgICAgICBjb25zdCBiMyA9IHBhcnNlSW50KHNlcS5zbGljZShpICsgNywgaSArIDkpLCAxNilcbiAgICAgICAgY29uc3QgYjQgPSBwYXJzZUludChzZXEuc2xpY2UoaSArIDEwLCBpICsgMTIpLCAxNilcblxuICAgICAgICBpZiAoKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODAgJiYgKGI0ICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICBsZXQgY2hyID0gKChiMSA8PCAxOCkgJiAweDFDMDAwMCkgfCAoKGIyIDw8IDEyKSAmIDB4M0YwMDApIHwgKChiMyA8PCA2KSAmIDB4RkMwKSB8IChiNCAmIDB4M0YpXG5cbiAgICAgICAgICBpZiAoY2hyIDwgMHgxMDAwMCB8fCBjaHIgPiAweDEwRkZGRikge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkXFx1ZmZmZFxcdWZmZmRcXHVmZmZkJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaHIgLT0gMHgxMDAwMFxuICAgICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwICsgKGNociA+PiAxMCksIDB4REMwMCArIChjaHIgJiAweDNGRikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSArPSA5XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufVxuXG5kZWNvZGUuZGVmYXVsdENoYXJzID0gJzsvPzpAJj0rJCwjJ1xuZGVjb2RlLmNvbXBvbmVudENoYXJzID0gJydcblxuZXhwb3J0IGRlZmF1bHQgZGVjb2RlXG4iLCJjb25zdCBlbmNvZGVDYWNoZSA9IHt9XG5cbi8vIENyZWF0ZSBhIGxvb2t1cCBhcnJheSB3aGVyZSBhbnl0aGluZyBidXQgY2hhcmFjdGVycyBpbiBgY2hhcnNgIHN0cmluZ1xuLy8gYW5kIGFscGhhbnVtZXJpYyBjaGFycyBpcyBwZXJjZW50LWVuY29kZWQuXG4vL1xuZnVuY3Rpb24gZ2V0RW5jb2RlQ2FjaGUgKGV4Y2x1ZGUpIHtcbiAgbGV0IGNhY2hlID0gZW5jb2RlQ2FjaGVbZXhjbHVkZV1cbiAgaWYgKGNhY2hlKSB7IHJldHVybiBjYWNoZSB9XG5cbiAgY2FjaGUgPSBlbmNvZGVDYWNoZVtleGNsdWRlXSA9IFtdXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjg7IGkrKykge1xuICAgIGNvbnN0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShpKVxuXG4gICAgaWYgKC9eWzAtOWEtel0kL2kudGVzdChjaCkpIHtcbiAgICAgIC8vIGFsd2F5cyBhbGxvdyB1bmVuY29kZWQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgIGNhY2hlLnB1c2goY2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlLnB1c2goJyUnICsgKCcwJyArIGkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKSlcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4Y2x1ZGUubGVuZ3RoOyBpKyspIHtcbiAgICBjYWNoZVtleGNsdWRlLmNoYXJDb2RlQXQoaSldID0gZXhjbHVkZVtpXVxuICB9XG5cbiAgcmV0dXJuIGNhY2hlXG59XG5cbi8vIEVuY29kZSB1bnNhZmUgY2hhcmFjdGVycyB3aXRoIHBlcmNlbnQtZW5jb2RpbmcsIHNraXBwaW5nIGFscmVhZHlcbi8vIGVuY29kZWQgc2VxdWVuY2VzLlxuLy9cbi8vICAtIHN0cmluZyAgICAgICAtIHN0cmluZyB0byBlbmNvZGVcbi8vICAtIGV4Y2x1ZGUgICAgICAtIGxpc3Qgb2YgY2hhcmFjdGVycyB0byBpZ25vcmUgKGluIGFkZGl0aW9uIHRvIGEtekEtWjAtOSlcbi8vICAtIGtlZXBFc2NhcGVkICAtIGRvbid0IGVuY29kZSAnJScgaW4gYSBjb3JyZWN0IGVzY2FwZSBzZXF1ZW5jZSAoZGVmYXVsdDogdHJ1ZSlcbi8vXG5mdW5jdGlvbiBlbmNvZGUgKHN0cmluZywgZXhjbHVkZSwga2VlcEVzY2FwZWQpIHtcbiAgaWYgKHR5cGVvZiBleGNsdWRlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGVuY29kZShzdHJpbmcsIGtlZXBFc2NhcGVkKVxuICAgIGtlZXBFc2NhcGVkID0gZXhjbHVkZVxuICAgIGV4Y2x1ZGUgPSBlbmNvZGUuZGVmYXVsdENoYXJzXG4gIH1cblxuICBpZiAodHlwZW9mIGtlZXBFc2NhcGVkID09PSAndW5kZWZpbmVkJykge1xuICAgIGtlZXBFc2NhcGVkID0gdHJ1ZVxuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXRFbmNvZGVDYWNoZShleGNsdWRlKVxuICBsZXQgcmVzdWx0ID0gJydcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IHN0cmluZy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBjb2RlID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIGlmIChrZWVwRXNjYXBlZCAmJiBjb2RlID09PSAweDI1IC8qICUgKi8gJiYgaSArIDIgPCBsKSB7XG4gICAgICBpZiAoL15bMC05YS1mXXsyfSQvaS50ZXN0KHN0cmluZy5zbGljZShpICsgMSwgaSArIDMpKSkge1xuICAgICAgICByZXN1bHQgKz0gc3RyaW5nLnNsaWNlKGksIGkgKyAzKVxuICAgICAgICBpICs9IDJcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZSA8IDEyOCkge1xuICAgICAgcmVzdWx0ICs9IGNhY2hlW2NvZGVdXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChjb2RlID49IDB4RDgwMCAmJiBjb2RlIDw9IDB4REZGRikge1xuICAgICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhEQkZGICYmIGkgKyAxIDwgbCkge1xuICAgICAgICBjb25zdCBuZXh0Q29kZSA9IHN0cmluZy5jaGFyQ29kZUF0KGkgKyAxKVxuICAgICAgICBpZiAobmV4dENvZGUgPj0gMHhEQzAwICYmIG5leHRDb2RlIDw9IDB4REZGRikge1xuICAgICAgICAgIHJlc3VsdCArPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5nW2ldICsgc3RyaW5nW2kgKyAxXSlcbiAgICAgICAgICBpKytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gJyVFRiVCRiVCRCdcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdbaV0pXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmVuY29kZS5kZWZhdWx0Q2hhcnMgPSBcIjsvPzpAJj0rJCwtXy4hfionKCkjXCJcbmVuY29kZS5jb21wb25lbnRDaGFycyA9IFwiLV8uIX4qJygpXCJcblxuZXhwb3J0IGRlZmF1bHQgZW5jb2RlXG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQgKHVybCkge1xuICBsZXQgcmVzdWx0ID0gJydcblxuICByZXN1bHQgKz0gdXJsLnByb3RvY29sIHx8ICcnXG4gIHJlc3VsdCArPSB1cmwuc2xhc2hlcyA/ICcvLycgOiAnJ1xuICByZXN1bHQgKz0gdXJsLmF1dGggPyB1cmwuYXV0aCArICdAJyA6ICcnXG5cbiAgaWYgKHVybC5ob3N0bmFtZSAmJiB1cmwuaG9zdG5hbWUuaW5kZXhPZignOicpICE9PSAtMSkge1xuICAgIC8vIGlwdjYgYWRkcmVzc1xuICAgIHJlc3VsdCArPSAnWycgKyB1cmwuaG9zdG5hbWUgKyAnXSdcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgKz0gdXJsLmhvc3RuYW1lIHx8ICcnXG4gIH1cblxuICByZXN1bHQgKz0gdXJsLnBvcnQgPyAnOicgKyB1cmwucG9ydCA6ICcnXG4gIHJlc3VsdCArPSB1cmwucGF0aG5hbWUgfHwgJydcbiAgcmVzdWx0ICs9IHVybC5zZWFyY2ggfHwgJydcbiAgcmVzdWx0ICs9IHVybC5oYXNoIHx8ICcnXG5cbiAgcmV0dXJuIHJlc3VsdFxufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vL1xuLy8gQ2hhbmdlcyBmcm9tIGpveWVudC9ub2RlOlxuLy9cbi8vIDEuIE5vIGxlYWRpbmcgc2xhc2ggaW4gcGF0aHMsXG4vLyAgICBlLmcuIGluIGB1cmwucGFyc2UoJ2h0dHA6Ly9mb28/YmFyJylgIHBhdGhuYW1lIGlzIGBgLCBub3QgYC9gXG4vL1xuLy8gMi4gQmFja3NsYXNoZXMgYXJlIG5vdCByZXBsYWNlZCB3aXRoIHNsYXNoZXMsXG4vLyAgICBzbyBgaHR0cDpcXFxcZXhhbXBsZS5vcmdcXGAgaXMgdHJlYXRlZCBsaWtlIGEgcmVsYXRpdmUgcGF0aFxuLy9cbi8vIDMuIFRyYWlsaW5nIGNvbG9uIGlzIHRyZWF0ZWQgbGlrZSBhIHBhcnQgb2YgdGhlIHBhdGgsXG4vLyAgICBpLmUuIGluIGBodHRwOi8vZXhhbXBsZS5vcmc6Zm9vYCBwYXRobmFtZSBpcyBgOmZvb2Bcbi8vXG4vLyA0LiBOb3RoaW5nIGlzIFVSTC1lbmNvZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LFxuLy8gICAgKGluIGpveWVudC9ub2RlIHNvbWUgY2hhcnMgaW4gYXV0aCBhbmQgcGF0aHMgYXJlIGVuY29kZWQpXG4vL1xuLy8gNS4gYHVybC5wYXJzZSgpYCBkb2VzIG5vdCBoYXZlIGBwYXJzZVF1ZXJ5U3RyaW5nYCBhcmd1bWVudFxuLy9cbi8vIDYuIFJlbW92ZWQgZXh0cmFuZW91cyByZXN1bHQgcHJvcGVydGllczogYGhvc3RgLCBgcGF0aGAsIGBxdWVyeWAsIGV0Yy4sXG4vLyAgICB3aGljaCBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgb3RoZXIgcGFydHMgb2YgdGhlIHVybC5cbi8vXG5cbmZ1bmN0aW9uIFVybCAoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsXG4gIHRoaXMuc2xhc2hlcyA9IG51bGxcbiAgdGhpcy5hdXRoID0gbnVsbFxuICB0aGlzLnBvcnQgPSBudWxsXG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsXG4gIHRoaXMuaGFzaCA9IG51bGxcbiAgdGhpcy5zZWFyY2ggPSBudWxsXG4gIHRoaXMucGF0aG5hbWUgPSBudWxsXG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG5jb25zdCBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pXG5jb25zdCBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC9cblxuLy8gU3BlY2lhbCBjYXNlIGZvciBhIHNpbXBsZSBwYXRoIFVSTFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlICovXG5jb25zdCBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC9cblxuLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbi8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG5jb25zdCBkZWxpbXMgPSBbJzwnLCAnPicsICdcIicsICdgJywgJyAnLCAnXFxyJywgJ1xcbicsICdcXHQnXVxuXG4vLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuY29uc3QgdW53aXNlID0gWyd7JywgJ30nLCAnfCcsICdcXFxcJywgJ14nLCAnYCddLmNvbmNhdChkZWxpbXMpXG5cbi8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbmNvbnN0IGF1dG9Fc2NhcGUgPSBbJ1xcJyddLmNvbmNhdCh1bndpc2UpXG4vLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuLy8gTm90ZSB0aGF0IGFueSBpbnZhbGlkIGNoYXJzIGFyZSBhbHNvIGhhbmRsZWQsIGJ1dCB0aGVzZVxuLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4vLyB0aGVtLlxuY29uc3Qgbm9uSG9zdENoYXJzID0gWyclJywgJy8nLCAnPycsICc7JywgJyMnXS5jb25jYXQoYXV0b0VzY2FwZSlcbmNvbnN0IGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXVxuY29uc3QgaG9zdG5hbWVNYXhMZW4gPSAyNTVcbmNvbnN0IGhvc3RuYW1lUGFydFBhdHRlcm4gPSAvXlsrYS16MC05QS1aXy1dezAsNjN9JC9cbmNvbnN0IGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvXG4vLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbi8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbmNvbnN0IGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gIGphdmFzY3JpcHQ6IHRydWUsXG4gICdqYXZhc2NyaXB0Oic6IHRydWVcbn1cbi8vIHByb3RvY29scyB0aGF0IGFsd2F5cyBjb250YWluIGEgLy8gYml0LlxuY29uc3Qgc2xhc2hlZFByb3RvY29sID0ge1xuICBodHRwOiB0cnVlLFxuICBodHRwczogdHJ1ZSxcbiAgZnRwOiB0cnVlLFxuICBnb3BoZXI6IHRydWUsXG4gIGZpbGU6IHRydWUsXG4gICdodHRwOic6IHRydWUsXG4gICdodHRwczonOiB0cnVlLFxuICAnZnRwOic6IHRydWUsXG4gICdnb3BoZXI6JzogdHJ1ZSxcbiAgJ2ZpbGU6JzogdHJ1ZVxufVxuXG5mdW5jdGlvbiB1cmxQYXJzZSAodXJsLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHVybCBpbnN0YW5jZW9mIFVybCkgcmV0dXJuIHVybFxuXG4gIGNvbnN0IHUgPSBuZXcgVXJsKClcbiAgdS5wYXJzZSh1cmwsIHNsYXNoZXNEZW5vdGVIb3N0KVxuICByZXR1cm4gdVxufVxuXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgbGV0IGxvd2VyUHJvdG8sIGhlYywgc2xhc2hlc1xuICBsZXQgcmVzdCA9IHVybFxuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpXG5cbiAgaWYgKCFzbGFzaGVzRGVub3RlSG9zdCAmJiB1cmwuc3BsaXQoJyMnKS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIGNvbnN0IHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpXG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdXG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG5cbiAgbGV0IHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdClcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXVxuICAgIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpXG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvXG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aClcbiAgfVxuXG4gIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBnb3QgYSBob3N0XG4gIC8vIHVzZXJAc2VydmVyIGlzICphbHdheXMqIGludGVycHJldGVkIGFzIGEgaG9zdG5hbWUsIGFuZCB1cmxcbiAgLy8gcmVzb2x1dGlvbiB3aWxsIHRyZWF0IC8vZm9vL2JhciBhcyBob3N0PWZvbyxwYXRoPWJhciBiZWNhdXNlIHRoYXQnc1xuICAvLyBob3cgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgcmVsYXRpdmUgVVJMcy5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlICovXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHNsYXNoZXMgPSByZXN0LnN1YnN0cigwLCAyKSA9PT0gJy8vJ1xuICAgIGlmIChzbGFzaGVzICYmICEocHJvdG8gJiYgaG9zdGxlc3NQcm90b2NvbFtwcm90b10pKSB7XG4gICAgICByZXN0ID0gcmVzdC5zdWJzdHIoMilcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIGxldCBob3N0RW5kID0gLTFcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgaGVjID0gcmVzdC5pbmRleE9mKGhvc3RFbmRpbmdDaGFyc1tpXSlcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSkge1xuICAgICAgICBob3N0RW5kID0gaGVjXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgZWl0aGVyIHdlIGhhdmUgYW4gZXhwbGljaXQgcG9pbnQgd2hlcmUgdGhlXG4gICAgLy8gYXV0aCBwb3J0aW9uIGNhbm5vdCBnbyBwYXN0LCBvciB0aGUgbGFzdCBAIGNoYXIgaXMgdGhlIGRlY2lkZXIuXG4gICAgbGV0IGF1dGgsIGF0U2lnblxuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAvLyBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcsIGhvc3RFbmQpXG4gICAgfVxuXG4gICAgLy8gTm93IHdlIGhhdmUgYSBwb3J0aW9uIHdoaWNoIGlzIGRlZmluaXRlbHkgdGhlIGF1dGguXG4gICAgLy8gUHVsbCB0aGF0IG9mZi5cbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgYXV0aCA9IHJlc3Quc2xpY2UoMCwgYXRTaWduKVxuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSlcbiAgICAgIHRoaXMuYXV0aCA9IGF1dGhcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub25Ib3N0Q2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pXG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpIHtcbiAgICAgICAgaG9zdEVuZCA9IGhlY1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7XG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAocmVzdFtob3N0RW5kIC0gMV0gPT09ICc6JykgeyBob3N0RW5kLS0gfVxuICAgIGNvbnN0IGhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpXG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoaG9zdEVuZClcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoaG9zdClcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJ1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICBjb25zdCBpcHY2SG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lWzBdID09PSAnWycgJiZcbiAgICAgICAgdGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDFdID09PSAnXSdcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICBjb25zdCBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKVxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBob3N0cGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBob3N0cGFydHNbaV1cbiAgICAgICAgaWYgKCFwYXJ0KSB7IGNvbnRpbnVlIH1cbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgbGV0IG5ld3BhcnQgPSAnJ1xuICAgICAgICAgIGZvciAobGV0IGogPSAwLCBrID0gcGFydC5sZW5ndGg7IGogPCBrOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJ0LmNoYXJDb2RlQXQoaikgPiAxMjcpIHtcbiAgICAgICAgICAgICAgLy8gd2UgcmVwbGFjZSBub24tQVNDSUkgY2hhciB3aXRoIGEgdGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcyB0byBtYWtlIHN1cmUgc2l6ZSBvZiBob3N0bmFtZSBpcyBub3RcbiAgICAgICAgICAgICAgLy8gYnJva2VuIGJ5IHJlcGxhY2luZyBub24tQVNDSUkgYnkgbm90aGluZ1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9ICd4J1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIHRlc3QgYWdhaW4gd2l0aCBBU0NJSSBjaGFyIG9ubHlcbiAgICAgICAgICBpZiAoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkUGFydHMgPSBob3N0cGFydHMuc2xpY2UoMCwgaSlcbiAgICAgICAgICAgIGNvbnN0IG5vdEhvc3QgPSBob3N0cGFydHMuc2xpY2UoaSArIDEpXG4gICAgICAgICAgICBjb25zdCBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KVxuICAgICAgICAgICAgaWYgKGJpdCkge1xuICAgICAgICAgICAgICB2YWxpZFBhcnRzLnB1c2goYml0WzFdKVxuICAgICAgICAgICAgICBub3RIb3N0LnVuc2hpZnQoYml0WzJdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSB2YWxpZFBhcnRzLmpvaW4oJy4nKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnXG4gICAgfVxuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMilcbiAgICB9XG4gIH1cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICBjb25zdCBoYXNoID0gcmVzdC5pbmRleE9mKCcjJylcbiAgaWYgKGhhc2ggIT09IC0xKSB7XG4gICAgLy8gZ290IGEgZnJhZ21lbnQgc3RyaW5nLlxuICAgIHRoaXMuaGFzaCA9IHJlc3Quc3Vic3RyKGhhc2gpXG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaClcbiAgfVxuICBjb25zdCBxbSA9IHJlc3QuaW5kZXhPZignPycpXG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKVxuICB9XG4gIGlmIChyZXN0KSB7IHRoaXMucGF0aG5hbWUgPSByZXN0IH1cbiAgaWYgKHNsYXNoZWRQcm90b2NvbFtsb3dlclByb3RvXSAmJlxuICAgICAgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnJ1xuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbiAoaG9zdCkge1xuICBsZXQgcG9ydCA9IHBvcnRQYXR0ZXJuLmV4ZWMoaG9zdClcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXVxuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpXG4gICAgfVxuICAgIGhvc3QgPSBob3N0LnN1YnN0cigwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKVxuICB9XG4gIGlmIChob3N0KSB7IHRoaXMuaG9zdG5hbWUgPSBob3N0IH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgdXJsUGFyc2VcbiIsIi8vIDo6LSBQZXJzaXN0ZW50IGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBvcmRlcmVkIG1hcHBpbmcgZnJvbVxuLy8gc3RyaW5ncyB0byB2YWx1ZXMsIHdpdGggc29tZSBjb252ZW5pZW50IHVwZGF0ZSBtZXRob2RzLlxuZnVuY3Rpb24gT3JkZXJlZE1hcChjb250ZW50KSB7XG4gIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG59XG5cbk9yZGVyZWRNYXAucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogT3JkZXJlZE1hcCxcblxuICBmaW5kOiBmdW5jdGlvbihrZXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkgKz0gMilcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT09IGtleSkgcmV0dXJuIGlcbiAgICByZXR1cm4gLTFcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nKSDihpIgP2FueVxuICAvLyBSZXRyaWV2ZSB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyIGBrZXlgLCBvciByZXR1cm4gdW5kZWZpbmVkIHdoZW5cbiAgLy8gbm8gc3VjaCBrZXkgZXhpc3RzLlxuICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBmb3VuZCA9IHRoaXMuZmluZChrZXkpO1xuICAgIHJldHVybiBmb3VuZCA9PSAtMSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudFtmb3VuZCArIDFdXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55LCA/c3RyaW5nKSDihpIgT3JkZXJlZE1hcFxuICAvLyBDcmVhdGUgYSBuZXcgbWFwIGJ5IHJlcGxhY2luZyB0aGUgdmFsdWUgb2YgYGtleWAgd2l0aCBhIG5ld1xuICAvLyB2YWx1ZSwgb3IgYWRkaW5nIGEgYmluZGluZyB0byB0aGUgZW5kIG9mIHRoZSBtYXAuIElmIGBuZXdLZXlgIGlzXG4gIC8vIGdpdmVuLCB0aGUga2V5IG9mIHRoZSBiaW5kaW5nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGF0IGtleS5cbiAgdXBkYXRlOiBmdW5jdGlvbihrZXksIHZhbHVlLCBuZXdLZXkpIHtcbiAgICB2YXIgc2VsZiA9IG5ld0tleSAmJiBuZXdLZXkgIT0ga2V5ID8gdGhpcy5yZW1vdmUobmV3S2V5KSA6IHRoaXM7XG4gICAgdmFyIGZvdW5kID0gc2VsZi5maW5kKGtleSksIGNvbnRlbnQgPSBzZWxmLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHtcbiAgICAgIGNvbnRlbnQucHVzaChuZXdLZXkgfHwga2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRbZm91bmQgKyAxXSA9IHZhbHVlO1xuICAgICAgaWYgKG5ld0tleSkgY29udGVudFtmb3VuZF0gPSBuZXdLZXk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIFJldHVybiBhIG1hcCB3aXRoIHRoZSBnaXZlbiBrZXkgcmVtb3ZlZCwgaWYgaXQgZXhpc3RlZC5cbiAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgZm91bmQgPSB0aGlzLmZpbmQoa2V5KTtcbiAgICBpZiAoZm91bmQgPT0gLTEpIHJldHVybiB0aGlzXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmNvbnRlbnQuc2xpY2UoKTtcbiAgICBjb250ZW50LnNwbGljZShmb3VuZCwgMik7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKHN0cmluZywgYW55KSDihpIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBuZXcga2V5IHRvIHRoZSBzdGFydCBvZiB0aGUgbWFwLlxuICBhZGRUb1N0YXJ0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKFtrZXksIHZhbHVlXS5jb25jYXQodGhpcy5yZW1vdmUoa2V5KS5jb250ZW50KSlcbiAgfSxcblxuICAvLyA6OiAoc3RyaW5nLCBhbnkpIOKGkiBPcmRlcmVkTWFwXG4gIC8vIEFkZCBhIG5ldyBrZXkgdG8gdGhlIGVuZCBvZiB0aGUgbWFwLlxuICBhZGRUb0VuZDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBjb250ZW50ID0gdGhpcy5yZW1vdmUoa2V5KS5jb250ZW50LnNsaWNlKCk7XG4gICAgY29udGVudC5wdXNoKGtleSwgdmFsdWUpO1xuICAgIHJldHVybiBuZXcgT3JkZXJlZE1hcChjb250ZW50KVxuICB9LFxuXG4gIC8vIDo6IChzdHJpbmcsIHN0cmluZywgYW55KSDihpIgT3JkZXJlZE1hcFxuICAvLyBBZGQgYSBrZXkgYWZ0ZXIgdGhlIGdpdmVuIGtleS4gSWYgYHBsYWNlYCBpcyBub3QgZm91bmQsIHRoZSBuZXdcbiAgLy8ga2V5IGlzIGFkZGVkIHRvIHRoZSBlbmQuXG4gIGFkZEJlZm9yZTogZnVuY3Rpb24ocGxhY2UsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgd2l0aG91dCA9IHRoaXMucmVtb3ZlKGtleSksIGNvbnRlbnQgPSB3aXRob3V0LmNvbnRlbnQuc2xpY2UoKTtcbiAgICB2YXIgZm91bmQgPSB3aXRob3V0LmZpbmQocGxhY2UpO1xuICAgIGNvbnRlbnQuc3BsaWNlKGZvdW5kID09IC0xID8gY29udGVudC5sZW5ndGggOiBmb3VuZCwgMCwga2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKGNvbnRlbnQpXG4gIH0sXG5cbiAgLy8gOjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkpXG4gIC8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGtleS92YWx1ZSBwYWlyIGluIHRoZSBtYXAsIGluXG4gIC8vIG9yZGVyLlxuICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICBmKHRoaXMuY29udGVudFtpXSwgdGhpcy5jb250ZW50W2kgKyAxXSk7XG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgcHJlcGVuZGluZyB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYCBiZWZvcmUgdGhlIGtleXMgaW4gYG1hcGAuXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKG1hcC5jb250ZW50LmNvbmNhdCh0aGlzLnN1YnRyYWN0KG1hcCkuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG5ldyBtYXAgYnkgYXBwZW5kaW5nIHRoZSBrZXlzIGluIHRoaXMgbWFwIHRoYXQgZG9uJ3RcbiAgLy8gYXBwZWFyIGluIGBtYXBgIGFmdGVyIHRoZSBrZXlzIGluIGBtYXBgLlxuICBhcHBlbmQ6IGZ1bmN0aW9uKG1hcCkge1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGlmICghbWFwLnNpemUpIHJldHVybiB0aGlzXG4gICAgcmV0dXJuIG5ldyBPcmRlcmVkTWFwKHRoaXMuc3VidHJhY3QobWFwKS5jb250ZW50LmNvbmNhdChtYXAuY29udGVudCkpXG4gIH0sXG5cbiAgLy8gOjogKHVuaW9uPE9iamVjdCwgT3JkZXJlZE1hcD4pIOKGkiBPcmRlcmVkTWFwXG4gIC8vIENyZWF0ZSBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUga2V5cyBpbiB0aGlzIG1hcCB0aGF0IGRvbid0XG4gIC8vIGFwcGVhciBpbiBgbWFwYC5cbiAgc3VidHJhY3Q6IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzO1xuICAgIG1hcCA9IE9yZGVyZWRNYXAuZnJvbShtYXApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLmNvbnRlbnQubGVuZ3RoOyBpICs9IDIpXG4gICAgICByZXN1bHQgPSByZXN1bHQucmVtb3ZlKG1hcC5jb250ZW50W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0sXG5cbiAgLy8gOjogKCkg4oaSIE9iamVjdFxuICAvLyBUdXJuIG9yZGVyZWQgbWFwIGludG8gYSBwbGFpbiBvYmplY3QuXG4gIHRvT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsgcmVzdWx0W2tleV0gPSB2YWx1ZTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9LFxuXG4gIC8vIDo6IG51bWJlclxuICAvLyBUaGUgYW1vdW50IG9mIGtleXMgaW4gdGhpcyBtYXAuXG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID4+IDFcbiAgfVxufTtcblxuLy8gOjogKD91bmlvbjxPYmplY3QsIE9yZGVyZWRNYXA+KSDihpIgT3JkZXJlZE1hcFxuLy8gUmV0dXJuIGEgbWFwIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuIElmIG51bGwsIGNyZWF0ZSBhbiBlbXB0eVxuLy8gbWFwLiBJZiBnaXZlbiBhbiBvcmRlcmVkIG1hcCwgcmV0dXJuIHRoYXQgbWFwIGl0c2VsZi4gSWYgZ2l2ZW4gYW5cbi8vIG9iamVjdCwgY3JlYXRlIGEgbWFwIGZyb20gdGhlIG9iamVjdCdzIHByb3BlcnRpZXMuXG5PcmRlcmVkTWFwLmZyb20gPSBmdW5jdGlvbih2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPcmRlcmVkTWFwKSByZXR1cm4gdmFsdWVcbiAgdmFyIGNvbnRlbnQgPSBbXTtcbiAgaWYgKHZhbHVlKSBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSBjb250ZW50LnB1c2gocHJvcCwgdmFsdWVbcHJvcF0pO1xuICByZXR1cm4gbmV3IE9yZGVyZWRNYXAoY29udGVudClcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE9yZGVyZWRNYXA7XG4iLCJpbXBvcnQgeyBsaWZ0VGFyZ2V0LCByZXBsYWNlU3RlcCwgUmVwbGFjZVN0ZXAsIGNhbkpvaW4sIGpvaW5Qb2ludCwgY2FuU3BsaXQsIFJlcGxhY2VBcm91bmRTdGVwLCBmaW5kV3JhcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgU2xpY2UsIEZyYWdtZW50IH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgTm9kZVNlbGVjdGlvbiwgU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uLCBBbGxTZWxlY3Rpb24sIFNlbGVjdGlvblJhbmdlIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuXG4vKipcbkRlbGV0ZSB0aGUgc2VsZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4qL1xuY29uc3QgZGVsZXRlU2VsZWN0aW9uID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24uZW1wdHkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmRlbGV0ZVNlbGVjdGlvbigpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldykge1xuICAgIGxldCB7ICRjdXJzb3IgfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoISRjdXJzb3IgfHwgKHZpZXcgPyAhdmlldy5lbmRPZlRleHRibG9jayhcImJhY2t3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0ID4gMCkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiAkY3Vyc29yO1xufVxuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBhdCB0aGUgc3RhcnQgb2YgYSB0ZXh0YmxvY2ssIHRyeSB0b1xucmVkdWNlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoYXQgYmxvY2sgYW5kIHRoZSBvbmUgYmVmb3JlIGl04oCUaWZcbnRoZXJlJ3MgYSBibG9jayBkaXJlY3RseSBiZWZvcmUgaXQgdGhhdCBjYW4gYmUgam9pbmVkLCBqb2luIHRoZW0uXG5JZiBub3QsIHRyeSB0byBtb3ZlIHRoZSBzZWxlY3RlZCBibG9jayBjbG9zZXIgdG8gdGhlIG5leHQgb25lIGluXG50aGUgZG9jdW1lbnQgc3RydWN0dXJlIGJ5IGxpZnRpbmcgaXQgb3V0IG9mIGl0cyBwYXJlbnQgb3IgbW92aW5nIGl0XG5pbnRvIGEgcGFyZW50IG9mIHRoZSBwcmV2aW91cyBibG9jay4gV2lsbCB1c2UgdGhlIHZpZXcgZm9yIGFjY3VyYXRlXG4oYmlkaS1hd2FyZSkgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrU3RhcnQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEJlZm9yZSgkY3Vyc29yKTtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSB0aGlzLCB0cnkgdG8gbGlmdFxuICAgIGlmICghJGN1dCkge1xuICAgICAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIubGlmdChyYW5nZSwgdGFyZ2V0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBiZWZvcmUgPSAkY3V0Lm5vZGVCZWZvcmU7XG4gICAgLy8gQXBwbHkgdGhlIGpvaW5pbmcgYWxnb3JpdGhtXG4gICAgaWYgKGRlbGV0ZUJhcnJpZXIoc3RhdGUsICRjdXQsIGRpc3BhdGNoLCAtMSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGJlbG93IGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBhYm92ZSBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBiZWxvdyBhbmQgc2VsZWN0IHRoZSBvbmUgYWJvdmUuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpIHx8IE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKGJlZm9yZSkpKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gJGN1cnNvci5kZXB0aDs7IGRlcHRoLS0pIHtcbiAgICAgICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZShkZXB0aCksICRjdXJzb3IuYWZ0ZXIoZGVwdGgpLCBTbGljZS5lbXB0eSk7XG4gICAgICAgICAgICBpZiAoZGVsU3RlcCAmJiBkZWxTdGVwLnNsaWNlLnNpemUgPCBkZWxTdGVwLnRvIC0gZGVsU3RlcC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnN0ZXAoZGVsU3RlcCk7XG4gICAgICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbih0ZXh0YmxvY2tBdChiZWZvcmUsIFwiZW5kXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFNlbGVjdGlvbi5maW5kRnJvbSh0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcCgkY3V0LnBvcywgLTEpKSwgLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgJGN1dC5wb3MgLSBiZWZvcmUubm9kZVNpemUpKTtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlcHRoID09IDEgfHwgJGN1cnNvci5ub2RlKGRlcHRoIC0gMSkuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5vZGUgYmVmb3JlIGlzIGFuIGF0b20sIGRlbGV0ZSBpdFxuICAgIGlmIChiZWZvcmUuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkY3V0LnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG5BIG1vcmUgbGltaXRlZCBmb3JtIG9mIFtgam9pbkJhY2t3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5CYWNrd2FyZClcbnRoYXQgb25seSB0cmllcyB0byBqb2luIHRoZSBjdXJyZW50IHRleHRibG9jayB0byB0aGUgb25lIGJlZm9yZVxuaXQsIGlmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLlxuKi9cbmNvbnN0IGpvaW5UZXh0YmxvY2tCYWNrd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tTdGFydChzdGF0ZSwgdmlldyk7XG4gICAgaWYgKCEkY3Vyc29yKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRjdXQgPSBmaW5kQ3V0QmVmb3JlKCRjdXJzb3IpO1xuICAgIHJldHVybiAkY3V0ID8gam9pblRleHRibG9ja3NBcm91bmQoc3RhdGUsICRjdXQsIGRpc3BhdGNoKSA6IGZhbHNlO1xufTtcbi8qKlxuQSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBbYGpvaW5Gb3J3YXJkYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLmpvaW5Gb3J3YXJkKVxudGhhdCBvbmx5IHRyaWVzIHRvIGpvaW4gdGhlIGN1cnJlbnQgdGV4dGJsb2NrIHRvIHRoZSBvbmUgYWZ0ZXJcbml0LCBpZiB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgYSB0ZXh0YmxvY2suXG4qL1xuY29uc3Qgam9pblRleHRibG9ja0ZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0ICRjdXJzb3IgPSBhdEJsb2NrRW5kKHN0YXRlLCB2aWV3KTtcbiAgICBpZiAoISRjdXJzb3IpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJGN1dCA9IGZpbmRDdXRBZnRlcigkY3Vyc29yKTtcbiAgICByZXR1cm4gJGN1dCA/IGpvaW5UZXh0YmxvY2tzQXJvdW5kKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiBqb2luVGV4dGJsb2Nrc0Fyb3VuZChzdGF0ZSwgJGN1dCwgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJGN1dC5ub2RlQmVmb3JlLCBiZWZvcmVUZXh0ID0gYmVmb3JlLCBiZWZvcmVQb3MgPSAkY3V0LnBvcyAtIDE7XG4gICAgZm9yICg7ICFiZWZvcmVUZXh0LmlzVGV4dGJsb2NrOyBiZWZvcmVQb3MtLSkge1xuICAgICAgICBpZiAoYmVmb3JlVGV4dC50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSBiZWZvcmVUZXh0Lmxhc3RDaGlsZDtcbiAgICAgICAgaWYgKCFjaGlsZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYmVmb3JlVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyUG9zID0gJGN1dC5wb3MgKyAxO1xuICAgIGZvciAoOyAhYWZ0ZXJUZXh0LmlzVGV4dGJsb2NrOyBhZnRlclBvcysrKSB7XG4gICAgICAgIGlmIChhZnRlclRleHQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IGNoaWxkID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGFmdGVyVGV4dCA9IGNoaWxkO1xuICAgIH1cbiAgICBsZXQgc3RlcCA9IHJlcGxhY2VTdGVwKHN0YXRlLmRvYywgYmVmb3JlUG9zLCBhZnRlclBvcywgU2xpY2UuZW1wdHkpO1xuICAgIGlmICghc3RlcCB8fCBzdGVwLmZyb20gIT0gYmVmb3JlUG9zIHx8XG4gICAgICAgIHN0ZXAgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCAmJiBzdGVwLnNsaWNlLnNpemUgPj0gYWZ0ZXJQb3MgLSBiZWZvcmVQb3MpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChzdGVwKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgYmVmb3JlUG9zKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHRleHRibG9ja0F0KG5vZGUsIHNpZGUsIG9ubHkgPSBmYWxzZSkge1xuICAgIGZvciAobGV0IHNjYW4gPSBub2RlOyBzY2FuOyBzY2FuID0gKHNpZGUgPT0gXCJzdGFydFwiID8gc2Nhbi5maXJzdENoaWxkIDogc2Nhbi5sYXN0Q2hpbGQpKSB7XG4gICAgICAgIGlmIChzY2FuLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChvbmx5ICYmIHNjYW4uY2hpbGRDb3VudCAhPSAxKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLCBzZWxlY3RcbnRoZSBub2RlIGJlZm9yZSB0aGF0IHRleHRibG9jaywgaWYgcG9zc2libGUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmVcbmJvdW5kIHRvIGtleXMgbGlrZSBiYWNrc3BhY2UsIGFmdGVyXG5bYGpvaW5CYWNrd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luQmFja3dhcmQpIG9yIG90aGVyIGRlbGV0aW5nXG5jb21tYW5kcywgYXMgYSBmYWxsLWJhY2sgYmVoYXZpb3Igd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgYWxsb3dcbmRlbGV0aW9uIGF0IHRoZSBzZWxlY3RlZCBwb2ludC5cbiovXG5jb25zdCBzZWxlY3ROb2RlQmFja3dhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiYmFja3dhcmRcIiwgc3RhdGUpIDogJGhlYWQucGFyZW50T2Zmc2V0ID4gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgJGN1dCA9IGZpbmRDdXRCZWZvcmUoJGhlYWQpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9ICRjdXQgJiYgJGN1dC5ub2RlQmVmb3JlO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zIC0gbm9kZS5ub2RlU2l6ZSkpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbmZ1bmN0aW9uIGZpbmRDdXRCZWZvcmUoJHBvcykge1xuICAgIGlmICghJHBvcy5wYXJlbnQudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKCRwb3MuaW5kZXgoaSkgPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmRvYy5yZXNvbHZlKCRwb3MuYmVmb3JlKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGkpLnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpIHtcbiAgICBsZXQgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkY3Vyc29yIHx8ICh2aWV3ID8gIXZpZXcuZW5kT2ZUZXh0YmxvY2soXCJmb3J3YXJkXCIsIHN0YXRlKVxuICAgICAgICA6ICRjdXJzb3IucGFyZW50T2Zmc2V0IDwgJGN1cnNvci5wYXJlbnQuY29udGVudC5zaXplKSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuICRjdXJzb3I7XG59XG4vKipcbklmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkgYW5kIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiBhXG50ZXh0YmxvY2ssIHRyeSB0byByZWR1Y2Ugb3IgcmVtb3ZlIHRoZSBib3VuZGFyeSBiZXR3ZWVuIHRoYXQgYmxvY2tcbmFuZCB0aGUgb25lIGFmdGVyIGl0LCBlaXRoZXIgYnkgam9pbmluZyB0aGVtIG9yIGJ5IG1vdmluZyB0aGUgb3RoZXJcbmJsb2NrIGNsb3NlciB0byB0aGlzIG9uZSBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUuIFdpbGwgdXNlIHRoZSB2aWV3XG5mb3IgYWNjdXJhdGUgc3RhcnQtb2YtdGV4dGJsb2NrIGRldGVjdGlvbiBpZiBnaXZlbi5cbiovXG5jb25zdCBqb2luRm9yd2FyZCA9IChzdGF0ZSwgZGlzcGF0Y2gsIHZpZXcpID0+IHtcbiAgICBsZXQgJGN1cnNvciA9IGF0QmxvY2tFbmQoc3RhdGUsIHZpZXcpO1xuICAgIGlmICghJGN1cnNvcilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkY3V0ID0gZmluZEN1dEFmdGVyKCRjdXJzb3IpO1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIG5vZGUgYWZ0ZXIgdGhpcywgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCEkY3V0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGFmdGVyID0gJGN1dC5ub2RlQWZ0ZXI7XG4gICAgLy8gVHJ5IHRoZSBqb2luaW5nIGFsZ29yaXRobVxuICAgIGlmIChkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCwgMSkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIElmIHRoZSBub2RlIGFib3ZlIGhhcyBubyBjb250ZW50IGFuZCB0aGUgbm9kZSBiZWxvdyBpc1xuICAgIC8vIHNlbGVjdGFibGUsIGRlbGV0ZSB0aGUgbm9kZSBhYm92ZSBhbmQgc2VsZWN0IHRoZSBvbmUgYmVsb3cuXG4gICAgaWYgKCRjdXJzb3IucGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwICYmXG4gICAgICAgICh0ZXh0YmxvY2tBdChhZnRlciwgXCJzdGFydFwiKSB8fCBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShhZnRlcikpKSB7XG4gICAgICAgIGxldCBkZWxTdGVwID0gcmVwbGFjZVN0ZXAoc3RhdGUuZG9jLCAkY3Vyc29yLmJlZm9yZSgpLCAkY3Vyc29yLmFmdGVyKCksIFNsaWNlLmVtcHR5KTtcbiAgICAgICAgaWYgKGRlbFN0ZXAgJiYgZGVsU3RlcC5zbGljZS5zaXplIDwgZGVsU3RlcC50byAtIGRlbFN0ZXAuZnJvbSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuc3RlcChkZWxTdGVwKTtcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24odGV4dGJsb2NrQXQoYWZ0ZXIsIFwic3RhcnRcIikgPyBTZWxlY3Rpb24uZmluZEZyb20odHIuZG9jLnJlc29sdmUodHIubWFwcGluZy5tYXAoJGN1dC5wb3MpKSwgMSlcbiAgICAgICAgICAgICAgICAgICAgOiBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh0ci5kb2MsIHRyLm1hcHBpbmcubWFwKCRjdXQucG9zKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGhlIG5leHQgbm9kZSBpcyBhbiBhdG9tLCBkZWxldGUgaXRcbiAgICBpZiAoYWZ0ZXIuaXNBdG9tICYmICRjdXQuZGVwdGggPT0gJGN1cnNvci5kZXB0aCAtIDEpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRjdXQucG9zLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplKS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG4vKipcbldoZW4gdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhbmQgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jaywgc2VsZWN0XG50aGUgbm9kZSBjb21pbmcgYWZ0ZXIgdGhhdCB0ZXh0YmxvY2ssIGlmIHBvc3NpYmxlLiBUaGlzIGlzIGludGVuZGVkXG50byBiZSBib3VuZCB0byBrZXlzIGxpa2UgZGVsZXRlLCBhZnRlclxuW2Bqb2luRm9yd2FyZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5qb2luRm9yd2FyZCkgYW5kIHNpbWlsYXIgZGVsZXRpbmdcbmNvbW1hbmRzLCB0byBwcm92aWRlIGEgZmFsbC1iYWNrIGJlaGF2aW9yIHdoZW4gdGhlIHNjaGVtYSBkb2Vzbid0XG5hbGxvdyBkZWxldGlvbiBhdCB0aGUgc2VsZWN0ZWQgcG9pbnQuXG4qL1xuY29uc3Qgc2VsZWN0Tm9kZUZvcndhcmQgPSAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSA9PiB7XG4gICAgbGV0IHsgJGhlYWQsIGVtcHR5IH0gPSBzdGF0ZS5zZWxlY3Rpb24sICRjdXQgPSAkaGVhZDtcbiAgICBpZiAoIWVtcHR5KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCRoZWFkLnBhcmVudC5pc1RleHRibG9jaykge1xuICAgICAgICBpZiAodmlldyA/ICF2aWV3LmVuZE9mVGV4dGJsb2NrKFwiZm9yd2FyZFwiLCBzdGF0ZSkgOiAkaGVhZC5wYXJlbnRPZmZzZXQgPCAkaGVhZC5wYXJlbnQuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAkY3V0ID0gZmluZEN1dEFmdGVyKCRoZWFkKTtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSAkY3V0ICYmICRjdXQubm9kZUFmdGVyO1xuICAgIGlmICghbm9kZSB8fCAhTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihOb2RlU2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsICRjdXQucG9zKSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZmluZEN1dEFmdGVyKCRwb3MpIHtcbiAgICBpZiAoISRwb3MucGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgIGZvciAobGV0IGkgPSAkcG9zLmRlcHRoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkcG9zLm5vZGUoaSk7XG4gICAgICAgICAgICBpZiAoJHBvcy5pbmRleChpKSArIDEgPCBwYXJlbnQuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5kb2MucmVzb2x2ZSgkcG9zLmFmdGVyKGkgKyAxKSk7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUuc3BlYy5pc29sYXRpbmcpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuSm9pbiB0aGUgc2VsZWN0ZWQgYmxvY2sgb3IsIGlmIHRoZXJlIGlzIGEgdGV4dCBzZWxlY3Rpb24sIHRoZVxuY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgY2FuIGJlIGpvaW5lZCwgd2l0aFxudGhlIHNpYmxpbmcgYWJvdmUgaXQuXG4qL1xuY29uc3Qgam9pblVwID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIG5vZGVTZWwgPSBzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uLCBwb2ludDtcbiAgICBpZiAobm9kZVNlbCkge1xuICAgICAgICBpZiAoc2VsLm5vZGUuaXNUZXh0YmxvY2sgfHwgIWNhbkpvaW4oc3RhdGUuZG9jLCBzZWwuZnJvbSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLmZyb207XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwb2ludCA9IGpvaW5Qb2ludChzdGF0ZS5kb2MsIHNlbC5mcm9tLCAtMSk7XG4gICAgICAgIGlmIChwb2ludCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuam9pbihwb2ludCk7XG4gICAgICAgIGlmIChub2RlU2VsKVxuICAgICAgICAgICAgdHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgcG9pbnQgLSBzdGF0ZS5kb2MucmVzb2x2ZShwb2ludCkubm9kZUJlZm9yZS5ub2RlU2l6ZSkpO1xuICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5Kb2luIHRoZSBzZWxlY3RlZCBibG9jaywgb3IgdGhlIGNsb3Nlc3QgYW5jZXN0b3Igb2YgdGhlIHNlbGVjdGlvblxudGhhdCBjYW4gYmUgam9pbmVkLCB3aXRoIHRoZSBzaWJsaW5nIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGpvaW5Eb3duID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sIHBvaW50O1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGlmIChzZWwubm9kZS5pc1RleHRibG9jayB8fCAhY2FuSm9pbihzdGF0ZS5kb2MsIHNlbC50bykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHBvaW50ID0gc2VsLnRvO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcG9pbnQgPSBqb2luUG9pbnQoc3RhdGUuZG9jLCBzZWwudG8sIDEpO1xuICAgICAgICBpZiAocG9pbnQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5qb2luKHBvaW50KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbkxpZnQgdGhlIHNlbGVjdGVkIGJsb2NrLCBvciB0aGUgY2xvc2VzdCBhbmNlc3RvciBibG9jayBvZiB0aGVcbnNlbGVjdGlvbiB0aGF0IGNhbiBiZSBsaWZ0ZWQsIG91dCBvZiBpdHMgcGFyZW50IG5vZGUuXG4qL1xuY29uc3QgbGlmdCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pLCB0YXJnZXQgPSByYW5nZSAmJiBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmxpZnQocmFuZ2UsIHRhcmdldCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5JZiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aG9zZSB0eXBlIGhhcyBhIHRydXRoeVxuW2Bjb2RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvZGUpIHByb3BlcnR5IGluIGl0cyBzcGVjLCByZXBsYWNlIHRoZVxuc2VsZWN0aW9uIHdpdGggYSBuZXdsaW5lIGNoYXJhY3Rlci5cbiovXG5jb25zdCBuZXdsaW5lSW5Db2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmluc2VydFRleHQoXCJcXG5cIikuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuZnVuY3Rpb24gZGVmYXVsdEJsb2NrQXQobWF0Y2gpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCB7IHR5cGUgfSA9IG1hdGNoLmVkZ2UoaSk7XG4gICAgICAgIGlmICh0eXBlLmlzVGV4dGJsb2NrICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSlcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuV2hlbiB0aGUgc2VsZWN0aW9uIGlzIGluIGEgbm9kZSB3aXRoIGEgdHJ1dGh5XG5bYGNvZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuY29kZSkgcHJvcGVydHkgaW4gaXRzIHNwZWMsIGNyZWF0ZSBhXG5kZWZhdWx0IGJsb2NrIGFmdGVyIHRoZSBjb2RlIGJsb2NrLCBhbmQgbW92ZSB0aGUgY3Vyc29yIHRoZXJlLlxuKi9cbmNvbnN0IGV4aXRDb2RlID0gKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGxldCB7ICRoZWFkLCAkYW5jaG9yIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQudHlwZS5zcGVjLmNvZGUgfHwgISRoZWFkLnNhbWVQYXJlbnQoJGFuY2hvcikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYWJvdmUgPSAkaGVhZC5ub2RlKC0xKSwgYWZ0ZXIgPSAkaGVhZC5pbmRleEFmdGVyKC0xKSwgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KGFib3ZlLmNvbnRlbnRNYXRjaEF0KGFmdGVyKSk7XG4gICAgaWYgKCF0eXBlIHx8ICFhYm92ZS5jYW5SZXBsYWNlV2l0aChhZnRlciwgYWZ0ZXIsIHR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBwb3MgPSAkaGVhZC5hZnRlcigpLCB0ciA9IHN0YXRlLnRyLnJlcGxhY2VXaXRoKHBvcywgcG9zLCB0eXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShwb3MpLCAxKSk7XG4gICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbklmIGEgYmxvY2sgbm9kZSBpcyBzZWxlY3RlZCwgY3JlYXRlIGFuIGVtcHR5IHBhcmFncmFwaCBiZWZvcmUgKGlmXG5pdCBpcyBpdHMgcGFyZW50J3MgZmlyc3QgY2hpbGQpIG9yIGFmdGVyIGl0LlxuKi9cbmNvbnN0IGNyZWF0ZVBhcmFncmFwaE5lYXIgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHNlbCA9IHN0YXRlLnNlbGVjdGlvbiwgeyAkZnJvbSwgJHRvIH0gPSBzZWw7XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbiB8fCAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCB8fCAkdG8ucGFyZW50LmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IGRlZmF1bHRCbG9ja0F0KCR0by5wYXJlbnQuY29udGVudE1hdGNoQXQoJHRvLmluZGV4QWZ0ZXIoKSkpO1xuICAgIGlmICghdHlwZSB8fCAhdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICBsZXQgc2lkZSA9ICghJGZyb20ucGFyZW50T2Zmc2V0ICYmICR0by5pbmRleCgpIDwgJHRvLnBhcmVudC5jaGlsZENvdW50ID8gJGZyb20gOiAkdG8pLnBvcztcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuaW5zZXJ0KHNpZGUsIHR5cGUuY3JlYXRlQW5kRmlsbCgpKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uY3JlYXRlKHRyLmRvYywgc2lkZSArIDEpKTtcbiAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuSWYgdGhlIGN1cnNvciBpcyBpbiBhbiBlbXB0eSB0ZXh0YmxvY2sgdGhhdCBjYW4gYmUgbGlmdGVkLCBsaWZ0IHRoZVxuYmxvY2suXG4qL1xuY29uc3QgbGlmdEVtcHR5QmxvY2sgPSAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgbGV0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGN1cnNvciB8fCAkY3Vyc29yLnBhcmVudC5jb250ZW50LnNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoJGN1cnNvci5kZXB0aCA+IDEgJiYgJGN1cnNvci5hZnRlcigpICE9ICRjdXJzb3IuZW5kKC0xKSkge1xuICAgICAgICBsZXQgYmVmb3JlID0gJGN1cnNvci5iZWZvcmUoKTtcbiAgICAgICAgaWYgKGNhblNwbGl0KHN0YXRlLmRvYywgYmVmb3JlKSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNwbGl0KGJlZm9yZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcmFuZ2UgPSAkY3Vyc29yLmJsb2NrUmFuZ2UoKSwgdGFyZ2V0ID0gcmFuZ2UgJiYgbGlmdFRhcmdldChyYW5nZSk7XG4gICAgaWYgKHRhcmdldCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuQ3JlYXRlIGEgdmFyaWFudCBvZiBbYHNwbGl0QmxvY2tgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jY29tbWFuZHMuc3BsaXRCbG9jaykgdGhhdCB1c2VzXG5hIGN1c3RvbSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIG5ld2x5IHNwbGl0IG9mZiBibG9jay5cbiovXG5mdW5jdGlvbiBzcGxpdEJsb2NrQXMoc3BsaXROb2RlKSB7XG4gICAgcmV0dXJuIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbiAmJiBzdGF0ZS5zZWxlY3Rpb24ubm9kZS5pc0Jsb2NrKSB7XG4gICAgICAgICAgICBpZiAoISRmcm9tLnBhcmVudE9mZnNldCB8fCAhY2FuU3BsaXQoc3RhdGUuZG9jLCAkZnJvbS5wb3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zcGxpdCgkZnJvbS5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkZnJvbS5kZXB0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgbGV0IHR5cGVzID0gW107XG4gICAgICAgIGxldCBzcGxpdERlcHRoLCBkZWZsdCwgYXRFbmQgPSBmYWxzZSwgYXRTdGFydCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGg7OyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gJGZyb20ubm9kZShkKTtcbiAgICAgICAgICAgIGlmIChub2RlLmlzQmxvY2spIHtcbiAgICAgICAgICAgICAgICBhdEVuZCA9ICRmcm9tLmVuZChkKSA9PSAkZnJvbS5wb3MgKyAoJGZyb20uZGVwdGggLSBkKTtcbiAgICAgICAgICAgICAgICBhdFN0YXJ0ID0gJGZyb20uc3RhcnQoZCkgPT0gJGZyb20ucG9zIC0gKCRmcm9tLmRlcHRoIC0gZCk7XG4gICAgICAgICAgICAgICAgZGVmbHQgPSBkZWZhdWx0QmxvY2tBdCgkZnJvbS5ub2RlKGQgLSAxKS5jb250ZW50TWF0Y2hBdCgkZnJvbS5pbmRleEFmdGVyKGQgLSAxKSkpO1xuICAgICAgICAgICAgICAgIGxldCBzcGxpdFR5cGUgPSBzcGxpdE5vZGUgJiYgc3BsaXROb2RlKCR0by5wYXJlbnQsIGF0RW5kLCAkZnJvbSk7XG4gICAgICAgICAgICAgICAgdHlwZXMudW5zaGlmdChzcGxpdFR5cGUgfHwgKGF0RW5kICYmIGRlZmx0ID8geyB0eXBlOiBkZWZsdCB9IDogbnVsbCkpO1xuICAgICAgICAgICAgICAgIHNwbGl0RGVwdGggPSBkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGQgPT0gMSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHR5cGVzLnVuc2hpZnQobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uIHx8IHN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIEFsbFNlbGVjdGlvbilcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICBsZXQgc3BsaXRQb3MgPSB0ci5tYXBwaW5nLm1hcCgkZnJvbS5wb3MpO1xuICAgICAgICBsZXQgY2FuID0gY2FuU3BsaXQodHIuZG9jLCBzcGxpdFBvcywgdHlwZXMubGVuZ3RoLCB0eXBlcyk7XG4gICAgICAgIGlmICghY2FuKSB7XG4gICAgICAgICAgICB0eXBlc1swXSA9IGRlZmx0ID8geyB0eXBlOiBkZWZsdCB9IDogbnVsbDtcbiAgICAgICAgICAgIGNhbiA9IGNhblNwbGl0KHRyLmRvYywgc3BsaXRQb3MsIHR5cGVzLmxlbmd0aCwgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2FuKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0ci5zcGxpdChzcGxpdFBvcywgdHlwZXMubGVuZ3RoLCB0eXBlcyk7XG4gICAgICAgIGlmICghYXRFbmQgJiYgYXRTdGFydCAmJiAkZnJvbS5ub2RlKHNwbGl0RGVwdGgpLnR5cGUgIT0gZGVmbHQpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRyLm1hcHBpbmcubWFwKCRmcm9tLmJlZm9yZShzcGxpdERlcHRoKSksICRmaXJzdCA9IHRyLmRvYy5yZXNvbHZlKGZpcnN0KTtcbiAgICAgICAgICAgIGlmIChkZWZsdCAmJiAkZnJvbS5ub2RlKHNwbGl0RGVwdGggLSAxKS5jYW5SZXBsYWNlV2l0aCgkZmlyc3QuaW5kZXgoKSwgJGZpcnN0LmluZGV4KCkgKyAxLCBkZWZsdCkpXG4gICAgICAgICAgICAgICAgdHIuc2V0Tm9kZU1hcmt1cCh0ci5tYXBwaW5nLm1hcCgkZnJvbS5iZWZvcmUoc3BsaXREZXB0aCkpLCBkZWZsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblNwbGl0IHRoZSBwYXJlbnQgYmxvY2sgb2YgdGhlIHNlbGVjdGlvbi4gSWYgdGhlIHNlbGVjdGlvbiBpcyBhIHRleHRcbnNlbGVjdGlvbiwgYWxzbyBkZWxldGUgaXRzIGNvbnRlbnQuXG4qL1xuY29uc3Qgc3BsaXRCbG9jayA9IHNwbGl0QmxvY2tBcygpO1xuLyoqXG5BY3RzIGxpa2UgW2BzcGxpdEJsb2NrYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnNwbGl0QmxvY2spLCBidXQgd2l0aG91dFxucmVzZXR0aW5nIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzIGF0IHRoZSBjdXJzb3IuXG4qL1xuY29uc3Qgc3BsaXRCbG9ja0tlZXBNYXJrcyA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gc3BsaXRCbG9jayhzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgbGV0IG1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3MgfHwgKHN0YXRlLnNlbGVjdGlvbi4kdG8ucGFyZW50T2Zmc2V0ICYmIHN0YXRlLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpKTtcbiAgICAgICAgaWYgKG1hcmtzKVxuICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgfSkpO1xufTtcbi8qKlxuTW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBub2RlIHdyYXBwaW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgaWZcbmFueS4gKFdpbGwgbm90IHNlbGVjdCB0aGUgZG9jdW1lbnQgbm9kZS4pXG4qL1xuY29uc3Qgc2VsZWN0UGFyZW50Tm9kZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgeyAkZnJvbSwgdG8gfSA9IHN0YXRlLnNlbGVjdGlvbiwgcG9zO1xuICAgIGxldCBzYW1lID0gJGZyb20uc2hhcmVkRGVwdGgodG8pO1xuICAgIGlmIChzYW1lID09IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBwb3MgPSAkZnJvbS5iZWZvcmUoc2FtZSk7XG4gICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oTm9kZVNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBwb3MpKSk7XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG5TZWxlY3QgdGhlIHdob2xlIGRvY3VtZW50LlxuKi9cbmNvbnN0IHNlbGVjdEFsbCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXcgQWxsU2VsZWN0aW9uKHN0YXRlLmRvYykpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5mdW5jdGlvbiBqb2luTWF5YmVDbGVhcihzdGF0ZSwgJHBvcywgZGlzcGF0Y2gpIHtcbiAgICBsZXQgYmVmb3JlID0gJHBvcy5ub2RlQmVmb3JlLCBhZnRlciA9ICRwb3Mubm9kZUFmdGVyLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICBpZiAoIWJlZm9yZSB8fCAhYWZ0ZXIgfHwgIWJlZm9yZS50eXBlLmNvbXBhdGlibGVDb250ZW50KGFmdGVyLnR5cGUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFiZWZvcmUuY29udGVudC5zaXplICYmICRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXggLSAxLCBpbmRleCkpIHtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuZGVsZXRlKCRwb3MucG9zIC0gYmVmb3JlLm5vZGVTaXplLCAkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoISRwb3MucGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSkgfHwgIShhZnRlci5pc1RleHRibG9jayB8fCBjYW5Kb2luKHN0YXRlLmRvYywgJHBvcy5wb3MpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIuam9pbigkcG9zLnBvcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBkZWxldGVCYXJyaWVyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCwgZGlyKSB7XG4gICAgbGV0IGJlZm9yZSA9ICRjdXQubm9kZUJlZm9yZSwgYWZ0ZXIgPSAkY3V0Lm5vZGVBZnRlciwgY29ubiwgbWF0Y2g7XG4gICAgbGV0IGlzb2xhdGVkID0gYmVmb3JlLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgYWZ0ZXIudHlwZS5zcGVjLmlzb2xhdGluZztcbiAgICBpZiAoIWlzb2xhdGVkICYmIGpvaW5NYXliZUNsZWFyKHN0YXRlLCAkY3V0LCBkaXNwYXRjaCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBjYW5EZWxBZnRlciA9ICFpc29sYXRlZCAmJiAkY3V0LnBhcmVudC5jYW5SZXBsYWNlKCRjdXQuaW5kZXgoKSwgJGN1dC5pbmRleCgpICsgMSk7XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmXG4gICAgICAgIChjb25uID0gKG1hdGNoID0gYmVmb3JlLmNvbnRlbnRNYXRjaEF0KGJlZm9yZS5jaGlsZENvdW50KSkuZmluZFdyYXBwaW5nKGFmdGVyLnR5cGUpKSAmJlxuICAgICAgICBtYXRjaC5tYXRjaFR5cGUoY29ublswXSB8fCBhZnRlci50eXBlKS52YWxpZEVuZCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCB3cmFwID0gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY29ubi5sZW5ndGggLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbShjb25uW2ldLmNyZWF0ZShudWxsLCB3cmFwKSk7XG4gICAgICAgICAgICB3cmFwID0gRnJhZ21lbnQuZnJvbShiZWZvcmUuY29weSh3cmFwKSk7XG4gICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIDEsIGVuZCwgJGN1dC5wb3MsIGVuZCwgbmV3IFNsaWNlKHdyYXAsIDEsIDApLCBjb25uLmxlbmd0aCwgdHJ1ZSkpO1xuICAgICAgICAgICAgbGV0ICRqb2luQXQgPSB0ci5kb2MucmVzb2x2ZShlbmQgKyAyICogY29ubi5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCRqb2luQXQubm9kZUFmdGVyICYmICRqb2luQXQubm9kZUFmdGVyLnR5cGUgPT0gYmVmb3JlLnR5cGUgJiZcbiAgICAgICAgICAgICAgICBjYW5Kb2luKHRyLmRvYywgJGpvaW5BdC5wb3MpKVxuICAgICAgICAgICAgICAgIHRyLmpvaW4oJGpvaW5BdC5wb3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBzZWxBZnRlciA9IGFmdGVyLnR5cGUuc3BlYy5pc29sYXRpbmcgfHwgKGRpciA+IDAgJiYgaXNvbGF0ZWQpID8gbnVsbCA6IFNlbGVjdGlvbi5maW5kRnJvbSgkY3V0LCAxKTtcbiAgICBsZXQgcmFuZ2UgPSBzZWxBZnRlciAmJiBzZWxBZnRlci4kZnJvbS5ibG9ja1JhbmdlKHNlbEFmdGVyLiR0byksIHRhcmdldCA9IHJhbmdlICYmIGxpZnRUYXJnZXQocmFuZ2UpO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgPj0gJGN1dC5kZXB0aCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5saWZ0KHJhbmdlLCB0YXJnZXQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNhbkRlbEFmdGVyICYmIHRleHRibG9ja0F0KGFmdGVyLCBcInN0YXJ0XCIsIHRydWUpICYmIHRleHRibG9ja0F0KGJlZm9yZSwgXCJlbmRcIikpIHtcbiAgICAgICAgbGV0IGF0ID0gYmVmb3JlLCB3cmFwID0gW107XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIHdyYXAucHVzaChhdCk7XG4gICAgICAgICAgICBpZiAoYXQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBhdCA9IGF0Lmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWZ0ZXJUZXh0ID0gYWZ0ZXIsIGFmdGVyRGVwdGggPSAxO1xuICAgICAgICBmb3IgKDsgIWFmdGVyVGV4dC5pc1RleHRibG9jazsgYWZ0ZXJUZXh0ID0gYWZ0ZXJUZXh0LmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICBhZnRlckRlcHRoKys7XG4gICAgICAgIGlmIChhdC5jYW5SZXBsYWNlKGF0LmNoaWxkQ291bnQsIGF0LmNoaWxkQ291bnQsIGFmdGVyVGV4dC5jb250ZW50KSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IEZyYWdtZW50LmVtcHR5O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB3cmFwLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgICAgICBlbmQgPSBGcmFnbWVudC5mcm9tKHdyYXBbaV0uY29weShlbmQpKTtcbiAgICAgICAgICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcCgkY3V0LnBvcyAtIHdyYXAubGVuZ3RoLCAkY3V0LnBvcyArIGFmdGVyLm5vZGVTaXplLCAkY3V0LnBvcyArIGFmdGVyRGVwdGgsICRjdXQucG9zICsgYWZ0ZXIubm9kZVNpemUgLSBhZnRlckRlcHRoLCBuZXcgU2xpY2UoZW5kLCB3cmFwLmxlbmd0aCwgMCksIDAsIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNlbGVjdFRleHRibG9ja1NpZGUoc2lkZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb24sICRwb3MgPSBzaWRlIDwgMCA/IHNlbC4kZnJvbSA6IHNlbC4kdG87XG4gICAgICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGg7XG4gICAgICAgIHdoaWxlICgkcG9zLm5vZGUoZGVwdGgpLmlzSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIWRlcHRoKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEkcG9zLm5vZGUoZGVwdGgpLmlzVGV4dGJsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRTZWxlY3Rpb24oVGV4dFNlbGVjdGlvbi5jcmVhdGUoc3RhdGUuZG9jLCBzaWRlIDwgMCA/ICRwb3Muc3RhcnQoZGVwdGgpIDogJHBvcy5lbmQoZGVwdGgpKSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5Nb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiBjdXJyZW50IHRleHQgYmxvY2suXG4qL1xuY29uc3Qgc2VsZWN0VGV4dGJsb2NrU3RhcnQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKC0xKTtcbi8qKlxuTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIGN1cnJlbnQgdGV4dCBibG9jay5cbiovXG5jb25zdCBzZWxlY3RUZXh0YmxvY2tFbmQgPSBzZWxlY3RUZXh0YmxvY2tTaWRlKDEpO1xuLy8gUGFyYW1ldGVyaXplZCBjb21tYW5kc1xuLyoqXG5XcmFwIHRoZSBzZWxlY3Rpb24gaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGdpdmVuXG5hdHRyaWJ1dGVzLlxuKi9cbmZ1bmN0aW9uIHdyYXBJbihub2RlVHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byksIHdyYXBwaW5nID0gcmFuZ2UgJiYgZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMpO1xuICAgICAgICBpZiAoIXdyYXBwaW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci53cmFwKHJhbmdlLCB3cmFwcGluZykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcblJldHVybnMgYSBjb21tYW5kIHRoYXQgdHJpZXMgdG8gc2V0IHRoZSBzZWxlY3RlZCB0ZXh0YmxvY2tzIHRvIHRoZVxuZ2l2ZW4gbm9kZSB0eXBlIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuXG4qL1xuZnVuY3Rpb24gc2V0QmxvY2tUeXBlKG5vZGVUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgYXBwbGljYWJsZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoICYmICFhcHBsaWNhYmxlOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tOiB7IHBvczogZnJvbSB9LCAkdG86IHsgcG9zOiB0byB9IH0gPSBzdGF0ZS5zZWxlY3Rpb24ucmFuZ2VzW2ldO1xuICAgICAgICAgICAgc3RhdGUuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhYmxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzVGV4dGJsb2NrIHx8IG5vZGUuaGFzTWFya3VwKG5vZGVUeXBlLCBhdHRycykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09IG5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGxpY2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9ICRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCArIDEsIG5vZGVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFwcGxpY2FibGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLnNlbGVjdGlvbi5yYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbTogeyBwb3M6IGZyb20gfSwgJHRvOiB7IHBvczogdG8gfSB9ID0gc3RhdGUuc2VsZWN0aW9uLnJhbmdlc1tpXTtcbiAgICAgICAgICAgICAgICB0ci5zZXRCbG9ja1R5cGUoZnJvbSwgdG8sIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaCh0ci5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbWFya0FwcGxpZXMoZG9jLCByYW5nZXMsIHR5cGUsIGVudGVyQXRvbXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgIGxldCBjYW4gPSAkZnJvbS5kZXB0aCA9PSAwID8gZG9jLmlubGluZUNvbnRlbnQgJiYgZG9jLnR5cGUuYWxsb3dzTWFya1R5cGUodHlwZSkgOiBmYWxzZTtcbiAgICAgICAgZG9jLm5vZGVzQmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIChub2RlLCBwb3MpID0+IHtcbiAgICAgICAgICAgIGlmIChjYW4gfHwgIWVudGVyQXRvbXMgJiYgbm9kZS5pc0F0b20gJiYgbm9kZS5pc0lubGluZSAmJiBwb3MgPj0gJGZyb20ucG9zICYmIHBvcyArIG5vZGUubm9kZVNpemUgPD0gJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYW4gPSBub2RlLmlubGluZUNvbnRlbnQgJiYgbm9kZS50eXBlLmFsbG93c01hcmtUeXBlKHR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZW1vdmVJbmxpbmVBdG9tcyhyYW5nZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gcmFuZ2VzW2ldO1xuICAgICAgICAkZnJvbS5kb2Mubm9kZXNCZXR3ZWVuKCRmcm9tLnBvcywgJHRvLnBvcywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNBdG9tICYmIG5vZGUuY29udGVudC5zaXplICYmIG5vZGUuaXNJbmxpbmUgJiYgcG9zID49ICRmcm9tLnBvcyAmJiBwb3MgKyBub2RlLm5vZGVTaXplIDw9ICR0by5wb3MpIHtcbiAgICAgICAgICAgICAgICBpZiAocG9zICsgMSA+ICRmcm9tLnBvcylcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFNlbGVjdGlvblJhbmdlKCRmcm9tLCAkZnJvbS5kb2MucmVzb2x2ZShwb3MgKyAxKSkpO1xuICAgICAgICAgICAgICAgICRmcm9tID0gJGZyb20uZG9jLnJlc29sdmUocG9zICsgMSArIG5vZGUuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoJGZyb20ucG9zIDwgJHRvLnBvcylcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBTZWxlY3Rpb25SYW5nZSgkZnJvbSwgJHRvKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB0b2dnbGVzIHRoZSBnaXZlbiBtYXJrIHdpdGggdGhlXG5naXZlbiBhdHRyaWJ1dGVzLiBXaWxsIHJldHVybiBgZmFsc2VgIHdoZW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG5kb2Vzbid0IHN1cHBvcnQgdGhhdCBtYXJrLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBtYXJrIGlmIGFueSBtYXJrc1xub2YgdGhhdCB0eXBlIGV4aXN0IGluIHRoZSBzZWxlY3Rpb24sIG9yIGFkZCBpdCBvdGhlcndpc2UuIElmIHRoZVxuc2VsZWN0aW9uIGlzIGVtcHR5LCB0aGlzIGFwcGxpZXMgdG8gdGhlIFtzdG9yZWRcbm1hcmtzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuc3RvcmVkTWFya3MpIGluc3RlYWQgb2YgYSByYW5nZSBvZiB0aGVcbmRvY3VtZW50LlxuKi9cbmZ1bmN0aW9uIHRvZ2dsZU1hcmsobWFya1R5cGUsIGF0dHJzID0gbnVsbCwgb3B0aW9ucykge1xuICAgIGxldCByZW1vdmVXaGVuUHJlc2VudCA9IChvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlV2hlblByZXNlbnQpICE9PSBmYWxzZTtcbiAgICBsZXQgZW50ZXJBdG9tcyA9IChvcHRpb25zICYmIG9wdGlvbnMuZW50ZXJJbmxpbmVBdG9tcykgIT09IGZhbHNlO1xuICAgIGxldCBkcm9wU3BhY2UgPSAhKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlV2hpdGVzcGFjZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgZW1wdHksICRjdXJzb3IsIHJhbmdlcyB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoKGVtcHR5ICYmICEkY3Vyc29yKSB8fCAhbWFya0FwcGxpZXMoc3RhdGUuZG9jLCByYW5nZXMsIG1hcmtUeXBlLCBlbnRlckF0b21zKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICBpZiAoJGN1cnNvcikge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrVHlwZS5pc0luU2V0KHN0YXRlLnN0b3JlZE1hcmtzIHx8ICRjdXJzb3IubWFya3MoKSkpXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnJlbW92ZVN0b3JlZE1hcmsobWFya1R5cGUpKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLmFkZFN0b3JlZE1hcmsobWFya1R5cGUuY3JlYXRlKGF0dHJzKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGFkZCwgdHIgPSBzdGF0ZS50cjtcbiAgICAgICAgICAgICAgICBpZiAoIWVudGVyQXRvbXMpXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlcyA9IHJlbW92ZUlubGluZUF0b21zKHJhbmdlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZVdoZW5QcmVzZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZCA9ICFyYW5nZXMuc29tZShyID0+IHN0YXRlLmRvYy5yYW5nZUhhc01hcmsoci4kZnJvbS5wb3MsIHIuJHRvLnBvcywgbWFya1R5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZCA9ICFyYW5nZXMuZXZlcnkociA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWlzc2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHIuZG9jLm5vZGVzQmV0d2VlbihyLiRmcm9tLnBvcywgci4kdG8ucG9zLCAobm9kZSwgcG9zLCBwYXJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgPSAhbWFya1R5cGUuaXNJblNldChub2RlLm1hcmtzKSAmJiAhIXBhcmVudCAmJiBwYXJlbnQudHlwZS5hbGxvd3NNYXJrVHlwZShtYXJrVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShub2RlLmlzVGV4dCAmJiAvXlxccyokLy50ZXN0KG5vZGUudGV4dEJldHdlZW4oTWF0aC5tYXgoMCwgci4kZnJvbS5wb3MgLSBwb3MpLCBNYXRoLm1pbihub2RlLm5vZGVTaXplLCByLiR0by5wb3MgLSBwb3MpKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1pc3Npbmc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5yZW1vdmVNYXJrKCRmcm9tLnBvcywgJHRvLnBvcywgbWFya1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSAkZnJvbS5wb3MsIHRvID0gJHRvLnBvcywgc3RhcnQgPSAkZnJvbS5ub2RlQWZ0ZXIsIGVuZCA9ICR0by5ub2RlQmVmb3JlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwYWNlU3RhcnQgPSBkcm9wU3BhY2UgJiYgc3RhcnQgJiYgc3RhcnQuaXNUZXh0ID8gL15cXHMqLy5leGVjKHN0YXJ0LnRleHQpWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BhY2VFbmQgPSBkcm9wU3BhY2UgJiYgZW5kICYmIGVuZC5pc1RleHQgPyAvXFxzKiQvLmV4ZWMoZW5kLnRleHQpWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSArIHNwYWNlU3RhcnQgPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gc3BhY2VTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAtPSBzcGFjZUVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoZnJvbSwgdG8sIG1hcmtUeXBlLmNyZWF0ZShhdHRycykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5mdW5jdGlvbiB3cmFwRGlzcGF0Y2hGb3JKb2luKGRpc3BhdGNoLCBpc0pvaW5hYmxlKSB7XG4gICAgcmV0dXJuICh0cikgPT4ge1xuICAgICAgICBpZiAoIXRyLmlzR2VuZXJpYylcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaCh0cik7XG4gICAgICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ci5tYXBwaW5nLm1hcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJhbmdlcy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICByYW5nZXNbal0gPSBtYXAubWFwKHJhbmdlc1tqXSk7XG4gICAgICAgICAgICBtYXAuZm9yRWFjaCgoX3MsIF9lLCBmcm9tLCB0bykgPT4gcmFuZ2VzLnB1c2goZnJvbSwgdG8pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIGpvaW5hYmxlIHBvaW50cyBleGlzdCBpbnNpZGUgdGhvc2UgcmFuZ2VzLFxuICAgICAgICAvLyBieSBjaGVja2luZyBhbGwgbm9kZSBib3VuZGFyaWVzIGluIHRoZWlyIHBhcmVudCBub2Rlcy5cbiAgICAgICAgbGV0IGpvaW5hYmxlID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlc1tpXSwgdG8gPSByYW5nZXNbaSArIDFdO1xuICAgICAgICAgICAgbGV0ICRmcm9tID0gdHIuZG9jLnJlc29sdmUoZnJvbSksIGRlcHRoID0gJGZyb20uc2hhcmVkRGVwdGgodG8pLCBwYXJlbnQgPSAkZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gJGZyb20uaW5kZXhBZnRlcihkZXB0aCksIHBvcyA9ICRmcm9tLmFmdGVyKGRlcHRoICsgMSk7IHBvcyA8PSB0bzsgKytpbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBhZnRlciA9IHBhcmVudC5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoIWFmdGVyKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggJiYgam9pbmFibGUuaW5kZXhPZihwb3MpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBwYXJlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZS50eXBlID09IGFmdGVyLnR5cGUgJiYgaXNKb2luYWJsZShiZWZvcmUsIGFmdGVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5hYmxlLnB1c2gocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zICs9IGFmdGVyLm5vZGVTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpvaW4gdGhlIGpvaW5hYmxlIHBvaW50c1xuICAgICAgICBqb2luYWJsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGZvciAobGV0IGkgPSBqb2luYWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKGNhbkpvaW4odHIuZG9jLCBqb2luYWJsZVtpXSkpXG4gICAgICAgICAgICAgICAgdHIuam9pbihqb2luYWJsZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgIH07XG59XG4vKipcbldyYXAgYSBjb21tYW5kIHNvIHRoYXQsIHdoZW4gaXQgcHJvZHVjZXMgYSB0cmFuc2Zvcm0gdGhhdCBjYXVzZXNcbnR3byBqb2luYWJsZSBub2RlcyB0byBlbmQgdXAgbmV4dCB0byBlYWNoIG90aGVyLCB0aG9zZSBhcmUgam9pbmVkLlxuTm9kZXMgYXJlIGNvbnNpZGVyZWQgam9pbmFibGUgd2hlbiB0aGV5IGFyZSBvZiB0aGUgc2FtZSB0eXBlIGFuZFxud2hlbiB0aGUgYGlzSm9pbmFibGVgIHByZWRpY2F0ZSByZXR1cm5zIHRydWUgZm9yIHRoZW0gb3IsIGlmIGFuXG5hcnJheSBvZiBzdHJpbmdzIHdhcyBwYXNzZWQsIGlmIHRoZWlyIG5vZGUgdHlwZSBuYW1lIGlzIGluIHRoYXRcbmFycmF5LlxuKi9cbmZ1bmN0aW9uIGF1dG9Kb2luKGNvbW1hbmQsIGlzSm9pbmFibGUpIHtcbiAgICBsZXQgY2FuSm9pbiA9IEFycmF5LmlzQXJyYXkoaXNKb2luYWJsZSkgPyAobm9kZSkgPT4gaXNKb2luYWJsZS5pbmRleE9mKG5vZGUudHlwZS5uYW1lKSA+IC0xXG4gICAgICAgIDogaXNKb2luYWJsZTtcbiAgICByZXR1cm4gKHN0YXRlLCBkaXNwYXRjaCwgdmlldykgPT4gY29tbWFuZChzdGF0ZSwgZGlzcGF0Y2ggJiYgd3JhcERpc3BhdGNoRm9ySm9pbihkaXNwYXRjaCwgY2FuSm9pbiksIHZpZXcpO1xufVxuLyoqXG5Db21iaW5lIGEgbnVtYmVyIG9mIGNvbW1hbmQgZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gKHdoaWNoXG5jYWxscyB0aGVtIG9uZSBieSBvbmUgdW50aWwgb25lIHJldHVybnMgdHJ1ZSkuXG4qL1xuZnVuY3Rpb24gY2hhaW5Db21tYW5kcyguLi5jb21tYW5kcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoY29tbWFuZHNbaV0oc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG5sZXQgYmFja3NwYWNlID0gY2hhaW5Db21tYW5kcyhkZWxldGVTZWxlY3Rpb24sIGpvaW5CYWNrd2FyZCwgc2VsZWN0Tm9kZUJhY2t3YXJkKTtcbmxldCBkZWwgPSBjaGFpbkNvbW1hbmRzKGRlbGV0ZVNlbGVjdGlvbiwgam9pbkZvcndhcmQsIHNlbGVjdE5vZGVGb3J3YXJkKTtcbi8qKlxuQSBiYXNpYyBrZXltYXAgY29udGFpbmluZyBiaW5kaW5ncyBub3Qgc3BlY2lmaWMgdG8gYW55IHNjaGVtYS5cbkJpbmRzIHRoZSBmb2xsb3dpbmcga2V5cyAod2hlbiBtdWx0aXBsZSBjb21tYW5kcyBhcmUgbGlzdGVkLCB0aGV5XG5hcmUgY2hhaW5lZCB3aXRoIFtgY2hhaW5Db21tYW5kc2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5jaGFpbkNvbW1hbmRzKSk6XG5cbiogKipFbnRlcioqIHRvIGBuZXdsaW5lSW5Db2RlYCwgYGNyZWF0ZVBhcmFncmFwaE5lYXJgLCBgbGlmdEVtcHR5QmxvY2tgLCBgc3BsaXRCbG9ja2BcbiogKipNb2QtRW50ZXIqKiB0byBgZXhpdENvZGVgXG4qICoqQmFja3NwYWNlKiogYW5kICoqTW9kLUJhY2tzcGFjZSoqIHRvIGBkZWxldGVTZWxlY3Rpb25gLCBgam9pbkJhY2t3YXJkYCwgYHNlbGVjdE5vZGVCYWNrd2FyZGBcbiogKipEZWxldGUqKiBhbmQgKipNb2QtRGVsZXRlKiogdG8gYGRlbGV0ZVNlbGVjdGlvbmAsIGBqb2luRm9yd2FyZGAsIGBzZWxlY3ROb2RlRm9yd2FyZGBcbiogKipNb2QtRGVsZXRlKiogdG8gYGRlbGV0ZVNlbGVjdGlvbmAsIGBqb2luRm9yd2FyZGAsIGBzZWxlY3ROb2RlRm9yd2FyZGBcbiogKipNb2QtYSoqIHRvIGBzZWxlY3RBbGxgXG4qL1xuY29uc3QgcGNCYXNlS2V5bWFwID0ge1xuICAgIFwiRW50ZXJcIjogY2hhaW5Db21tYW5kcyhuZXdsaW5lSW5Db2RlLCBjcmVhdGVQYXJhZ3JhcGhOZWFyLCBsaWZ0RW1wdHlCbG9jaywgc3BsaXRCbG9jayksXG4gICAgXCJNb2QtRW50ZXJcIjogZXhpdENvZGUsXG4gICAgXCJCYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiTW9kLUJhY2tzcGFjZVwiOiBiYWNrc3BhY2UsXG4gICAgXCJTaGlmdC1CYWNrc3BhY2VcIjogYmFja3NwYWNlLFxuICAgIFwiRGVsZXRlXCI6IGRlbCxcbiAgICBcIk1vZC1EZWxldGVcIjogZGVsLFxuICAgIFwiTW9kLWFcIjogc2VsZWN0QWxsXG59O1xuLyoqXG5BIGNvcHkgb2YgYHBjQmFzZUtleW1hcGAgdGhhdCBhbHNvIGJpbmRzICoqQ3RybC1oKiogbGlrZSBCYWNrc3BhY2UsXG4qKkN0cmwtZCoqIGxpa2UgRGVsZXRlLCAqKkFsdC1CYWNrc3BhY2UqKiBsaWtlIEN0cmwtQmFja3NwYWNlLCBhbmRcbioqQ3RybC1BbHQtQmFja3NwYWNlKiosICoqQWx0LURlbGV0ZSoqLCBhbmQgKipBbHQtZCoqIGxpa2VcbkN0cmwtRGVsZXRlLlxuKi9cbmNvbnN0IG1hY0Jhc2VLZXltYXAgPSB7XG4gICAgXCJDdHJsLWhcIjogcGNCYXNlS2V5bWFwW1wiQmFja3NwYWNlXCJdLFxuICAgIFwiQWx0LUJhY2tzcGFjZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtQmFja3NwYWNlXCJdLFxuICAgIFwiQ3RybC1kXCI6IHBjQmFzZUtleW1hcFtcIkRlbGV0ZVwiXSxcbiAgICBcIkN0cmwtQWx0LUJhY2tzcGFjZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtRGVsZXRlXCJdLFxuICAgIFwiQWx0LURlbGV0ZVwiOiBwY0Jhc2VLZXltYXBbXCJNb2QtRGVsZXRlXCJdLFxuICAgIFwiQWx0LWRcIjogcGNCYXNlS2V5bWFwW1wiTW9kLURlbGV0ZVwiXSxcbiAgICBcIkN0cmwtYVwiOiBzZWxlY3RUZXh0YmxvY2tTdGFydCxcbiAgICBcIkN0cmwtZVwiOiBzZWxlY3RUZXh0YmxvY2tFbmRcbn07XG5mb3IgKGxldCBrZXkgaW4gcGNCYXNlS2V5bWFwKVxuICAgIG1hY0Jhc2VLZXltYXBba2V5XSA9IHBjQmFzZUtleW1hcFtrZXldO1xuY29uc3QgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiID8gL01hY3xpUChob25lfFtvYV1kKS8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIDogdHlwZW9mIG9zICE9IFwidW5kZWZpbmVkXCIgJiYgb3MucGxhdGZvcm0gPyBvcy5wbGF0Zm9ybSgpID09IFwiZGFyd2luXCIgOiBmYWxzZTtcbi8qKlxuRGVwZW5kaW5nIG9uIHRoZSBkZXRlY3RlZCBwbGF0Zm9ybSwgdGhpcyB3aWxsIGhvbGRcbltgcGNCYXNla2V5bWFwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2NvbW1hbmRzLnBjQmFzZUtleW1hcCkgb3JcbltgbWFjQmFzZUtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcy5tYWNCYXNlS2V5bWFwKS5cbiovXG5jb25zdCBiYXNlS2V5bWFwID0gbWFjID8gbWFjQmFzZUtleW1hcCA6IHBjQmFzZUtleW1hcDtcblxuZXhwb3J0IHsgYXV0b0pvaW4sIGJhc2VLZXltYXAsIGNoYWluQ29tbWFuZHMsIGNyZWF0ZVBhcmFncmFwaE5lYXIsIGRlbGV0ZVNlbGVjdGlvbiwgZXhpdENvZGUsIGpvaW5CYWNrd2FyZCwgam9pbkRvd24sIGpvaW5Gb3J3YXJkLCBqb2luVGV4dGJsb2NrQmFja3dhcmQsIGpvaW5UZXh0YmxvY2tGb3J3YXJkLCBqb2luVXAsIGxpZnQsIGxpZnRFbXB0eUJsb2NrLCBtYWNCYXNlS2V5bWFwLCBuZXdsaW5lSW5Db2RlLCBwY0Jhc2VLZXltYXAsIHNlbGVjdEFsbCwgc2VsZWN0Tm9kZUJhY2t3YXJkLCBzZWxlY3ROb2RlRm9yd2FyZCwgc2VsZWN0UGFyZW50Tm9kZSwgc2VsZWN0VGV4dGJsb2NrRW5kLCBzZWxlY3RUZXh0YmxvY2tTdGFydCwgc2V0QmxvY2tUeXBlLCBzcGxpdEJsb2NrLCBzcGxpdEJsb2NrQXMsIHNwbGl0QmxvY2tLZWVwTWFya3MsIHRvZ2dsZU1hcmssIHdyYXBJbiB9O1xuIiwiaW1wb3J0IFJvcGVTZXF1ZW5jZSBmcm9tICdyb3BlLXNlcXVlbmNlJztcbmltcG9ydCB7IE1hcHBpbmcgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGx1Z2luS2V5LCBQbHVnaW4gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5cbi8vIFByb3NlTWlycm9yJ3MgaGlzdG9yeSBpc24ndCBzaW1wbHkgYSB3YXkgdG8gcm9sbCBiYWNrIHRvIGEgcHJldmlvdXNcbi8vIHN0YXRlLCBiZWNhdXNlIFByb3NlTWlycm9yIHN1cHBvcnRzIGFwcGx5aW5nIGNoYW5nZXMgd2l0aG91dCBhZGRpbmdcbi8vIHRoZW0gdG8gdGhlIGhpc3RvcnkgKGZvciBleGFtcGxlIGR1cmluZyBjb2xsYWJvcmF0aW9uKS5cbi8vXG4vLyBUbyB0aGlzIGVuZCwgZWFjaCAnQnJhbmNoJyAob25lIGZvciB0aGUgdW5kbyBoaXN0b3J5IGFuZCBvbmUgZm9yXG4vLyB0aGUgcmVkbyBoaXN0b3J5KSBrZWVwcyBhbiBhcnJheSBvZiAnSXRlbXMnLCB3aGljaCBjYW4gb3B0aW9uYWxseVxuLy8gaG9sZCBhIHN0ZXAgKGFuIGFjdHVhbCB1bmRvYWJsZSBjaGFuZ2UpLCBhbmQgYWx3YXlzIGhvbGQgYSBwb3NpdGlvblxuLy8gbWFwICh3aGljaCBpcyBuZWVkZWQgdG8gbW92ZSBjaGFuZ2VzIGJlbG93IHRoZW0gdG8gYXBwbHkgdG8gdGhlXG4vLyBjdXJyZW50IGRvY3VtZW50KS5cbi8vXG4vLyBBbiBpdGVtIHRoYXQgaGFzIGJvdGggYSBzdGVwIGFuZCBhIHNlbGVjdGlvbiBib29rbWFyayBpcyB0aGUgc3RhcnRcbi8vIG9mIGFuICdldmVudCcg4oCUIGEgZ3JvdXAgb2YgY2hhbmdlcyB0aGF0IHdpbGwgYmUgdW5kb25lIG9yIHJlZG9uZSBhdFxuLy8gb25jZS4gKEl0IHN0b3JlcyBvbmx5IHRoZSBib29rbWFyaywgc2luY2UgdGhhdCB3YXkgd2UgZG9uJ3QgaGF2ZSB0b1xuLy8gcHJvdmlkZSBhIGRvY3VtZW50IHVudGlsIHRoZSBzZWxlY3Rpb24gaXMgYWN0dWFsbHkgYXBwbGllZCwgd2hpY2hcbi8vIGlzIHVzZWZ1bCB3aGVuIGNvbXByZXNzaW5nLilcbi8vIFVzZWQgdG8gc2NoZWR1bGUgaGlzdG9yeSBjb21wcmVzc2lvblxuY29uc3QgbWF4X2VtcHR5X2l0ZW1zID0gNTAwO1xuY2xhc3MgQnJhbmNoIHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcywgZXZlbnRDb3VudCkge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuZXZlbnRDb3VudCA9IGV2ZW50Q291bnQ7XG4gICAgfVxuICAgIC8vIFBvcCB0aGUgbGF0ZXN0IGV2ZW50IG9mZiB0aGUgYnJhbmNoJ3MgaGlzdG9yeSBhbmQgYXBwbHkgaXRcbiAgICAvLyB0byBhIGRvY3VtZW50IHRyYW5zZm9ybS5cbiAgICBwb3BFdmVudChzdGF0ZSwgcHJlc2VydmVJdGVtcykge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgICBmb3IgKDs7IGVuZC0tKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuaXRlbXMuZ2V0KGVuZCAtIDEpO1xuICAgICAgICAgICAgaWYgKG5leHQuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLS1lbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbWFwLCBtYXBGcm9tO1xuICAgICAgICBpZiAocHJlc2VydmVJdGVtcykge1xuICAgICAgICAgICAgcmVtYXAgPSB0aGlzLnJlbWFwcGluZyhlbmQsIHRoaXMuaXRlbXMubGVuZ3RoKTtcbiAgICAgICAgICAgIG1hcEZyb20gPSByZW1hcC5tYXBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHJhbnNmb3JtID0gc3RhdGUudHI7XG4gICAgICAgIGxldCBzZWxlY3Rpb24sIHJlbWFpbmluZztcbiAgICAgICAgbGV0IGFkZEFmdGVyID0gW10sIGFkZEJlZm9yZSA9IFtdO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZW1hcCkge1xuICAgICAgICAgICAgICAgICAgICByZW1hcCA9IHRoaXMucmVtYXBwaW5nKGVuZCwgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBtYXBGcm9tID0gcmVtYXAubWFwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVtYXApIHtcbiAgICAgICAgICAgICAgICBhZGRCZWZvcmUucHVzaChuZXcgSXRlbShpdGVtLm1hcCkpO1xuICAgICAgICAgICAgICAgIGxldCBzdGVwID0gaXRlbS5zdGVwLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSksIG1hcDtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCAmJiB0cmFuc2Zvcm0ubWF5YmVTdGVwKHN0ZXApLmRvYykge1xuICAgICAgICAgICAgICAgICAgICBtYXAgPSB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzW3RyYW5zZm9ybS5tYXBwaW5nLm1hcHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGFkZEFmdGVyLnB1c2gobmV3IEl0ZW0obWFwLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWRkQWZ0ZXIubGVuZ3RoICsgYWRkQmVmb3JlLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBGcm9tLS07XG4gICAgICAgICAgICAgICAgaWYgKG1hcClcbiAgICAgICAgICAgICAgICAgICAgcmVtYXAuYXBwZW5kTWFwKG1hcCwgbWFwRnJvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ubWF5YmVTdGVwKGl0ZW0uc3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSByZW1hcCA/IGl0ZW0uc2VsZWN0aW9uLm1hcChyZW1hcC5zbGljZShtYXBGcm9tKSkgOiBpdGVtLnNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBuZXcgQnJhbmNoKHRoaXMuaXRlbXMuc2xpY2UoMCwgZW5kKS5hcHBlbmQoYWRkQmVmb3JlLnJldmVyc2UoKS5jb25jYXQoYWRkQWZ0ZXIpKSwgdGhpcy5ldmVudENvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiB7IHJlbWFpbmluZzogcmVtYWluaW5nLCB0cmFuc2Zvcm0sIHNlbGVjdGlvbjogc2VsZWN0aW9uIH07XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhIG5ldyBicmFuY2ggd2l0aCB0aGUgZ2l2ZW4gdHJhbnNmb3JtIGFkZGVkLlxuICAgIGFkZFRyYW5zZm9ybSh0cmFuc2Zvcm0sIHNlbGVjdGlvbiwgaGlzdE9wdGlvbnMsIHByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgbGV0IG5ld0l0ZW1zID0gW10sIGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIGxldCBvbGRJdGVtcyA9IHRoaXMuaXRlbXMsIGxhc3RJdGVtID0gIXByZXNlcnZlSXRlbXMgJiYgb2xkSXRlbXMubGVuZ3RoID8gb2xkSXRlbXMuZ2V0KG9sZEl0ZW1zLmxlbmd0aCAtIDEpIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm0uc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzdGVwID0gdHJhbnNmb3JtLnN0ZXBzW2ldLmludmVydCh0cmFuc2Zvcm0uZG9jc1tpXSk7XG4gICAgICAgICAgICBsZXQgaXRlbSA9IG5ldyBJdGVtKHRyYW5zZm9ybS5tYXBwaW5nLm1hcHNbaV0sIHN0ZXAsIHNlbGVjdGlvbiksIG1lcmdlZDtcbiAgICAgICAgICAgIGlmIChtZXJnZWQgPSBsYXN0SXRlbSAmJiBsYXN0SXRlbS5tZXJnZShpdGVtKSkge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBtZXJnZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGkpXG4gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW1zLnBvcCgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb2xkSXRlbXMgPSBvbGRJdGVtcy5zbGljZSgwLCBvbGRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0l0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRDb3VudCsrO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJlc2VydmVJdGVtcylcbiAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG92ZXJmbG93ID0gZXZlbnRDb3VudCAtIGhpc3RPcHRpb25zLmRlcHRoO1xuICAgICAgICBpZiAob3ZlcmZsb3cgPiBERVBUSF9PVkVSRkxPVykge1xuICAgICAgICAgICAgb2xkSXRlbXMgPSBjdXRPZmZFdmVudHMob2xkSXRlbXMsIG92ZXJmbG93KTtcbiAgICAgICAgICAgIGV2ZW50Q291bnQgLT0gb3ZlcmZsb3c7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2gob2xkSXRlbXMuYXBwZW5kKG5ld0l0ZW1zKSwgZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIHJlbWFwcGluZyhmcm9tLCB0bykge1xuICAgICAgICBsZXQgbWFwcyA9IG5ldyBNYXBwaW5nO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICAgIGxldCBtaXJyb3JQb3MgPSBpdGVtLm1pcnJvck9mZnNldCAhPSBudWxsICYmIGkgLSBpdGVtLm1pcnJvck9mZnNldCA+PSBmcm9tXG4gICAgICAgICAgICAgICAgPyBtYXBzLm1hcHMubGVuZ3RoIC0gaXRlbS5taXJyb3JPZmZzZXQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtYXBzLmFwcGVuZE1hcChpdGVtLm1hcCwgbWlycm9yUG9zKTtcbiAgICAgICAgfSwgZnJvbSwgdG8pO1xuICAgICAgICByZXR1cm4gbWFwcztcbiAgICB9XG4gICAgYWRkTWFwcyhhcnJheSkge1xuICAgICAgICBpZiAodGhpcy5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBCcmFuY2godGhpcy5pdGVtcy5hcHBlbmQoYXJyYXkubWFwKG1hcCA9PiBuZXcgSXRlbShtYXApKSksIHRoaXMuZXZlbnRDb3VudCk7XG4gICAgfVxuICAgIC8vIFdoZW4gdGhlIGNvbGxhYiBtb2R1bGUgcmVjZWl2ZXMgcmVtb3RlIGNoYW5nZXMsIHRoZSBoaXN0b3J5IGhhc1xuICAgIC8vIHRvIGtub3cgYWJvdXQgdGhvc2UsIHNvIHRoYXQgaXQgY2FuIGFkanVzdCB0aGUgc3RlcHMgdGhhdCB3ZXJlXG4gICAgLy8gcmViYXNlZCBvbiB0b3Agb2YgdGhlIHJlbW90ZSBjaGFuZ2VzLCBhbmQgaW5jbHVkZSB0aGUgcG9zaXRpb25cbiAgICAvLyBtYXBzIGZvciB0aGUgcmVtb3RlIGNoYW5nZXMgaW4gaXRzIGFycmF5IG9mIGl0ZW1zLlxuICAgIHJlYmFzZWQocmViYXNlZFRyYW5zZm9ybSwgcmViYXNlZENvdW50KSB7XG4gICAgICAgIGlmICghdGhpcy5ldmVudENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCByZWJhc2VkSXRlbXMgPSBbXSwgc3RhcnQgPSBNYXRoLm1heCgwLCB0aGlzLml0ZW1zLmxlbmd0aCAtIHJlYmFzZWRDb3VudCk7XG4gICAgICAgIGxldCBtYXBwaW5nID0gcmViYXNlZFRyYW5zZm9ybS5tYXBwaW5nO1xuICAgICAgICBsZXQgbmV3VW50aWwgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzLmxlbmd0aDtcbiAgICAgICAgbGV0IGV2ZW50Q291bnQgPSB0aGlzLmV2ZW50Q291bnQ7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHsgaWYgKGl0ZW0uc2VsZWN0aW9uKVxuICAgICAgICAgICAgZXZlbnRDb3VudC0tOyB9LCBzdGFydCk7XG4gICAgICAgIGxldCBpUmViYXNlZCA9IHJlYmFzZWRDb3VudDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcuZ2V0TWlycm9yKC0taVJlYmFzZWQpO1xuICAgICAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIG5ld1VudGlsID0gTWF0aC5taW4obmV3VW50aWwsIHBvcyk7XG4gICAgICAgICAgICBsZXQgbWFwID0gbWFwcGluZy5tYXBzW3Bvc107XG4gICAgICAgICAgICBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSByZWJhc2VkVHJhbnNmb3JtLnN0ZXBzW3Bvc10uaW52ZXJ0KHJlYmFzZWRUcmFuc2Zvcm0uZG9jc1twb3NdKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKG1hcHBpbmcuc2xpY2UoaVJlYmFzZWQgKyAxLCBwb3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICBldmVudENvdW50Kys7XG4gICAgICAgICAgICAgICAgcmViYXNlZEl0ZW1zLnB1c2gobmV3IEl0ZW0obWFwLCBzdGVwLCBzZWxlY3Rpb24pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYmFzZWRJdGVtcy5wdXNoKG5ldyBJdGVtKG1hcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBzdGFydCk7XG4gICAgICAgIGxldCBuZXdNYXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSByZWJhc2VkQ291bnQ7IGkgPCBuZXdVbnRpbDsgaSsrKVxuICAgICAgICAgICAgbmV3TWFwcy5wdXNoKG5ldyBJdGVtKG1hcHBpbmcubWFwc1tpXSkpO1xuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHN0YXJ0KS5hcHBlbmQobmV3TWFwcykuYXBwZW5kKHJlYmFzZWRJdGVtcyk7XG4gICAgICAgIGxldCBicmFuY2ggPSBuZXcgQnJhbmNoKGl0ZW1zLCBldmVudENvdW50KTtcbiAgICAgICAgaWYgKGJyYW5jaC5lbXB0eUl0ZW1Db3VudCgpID4gbWF4X2VtcHR5X2l0ZW1zKVxuICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoLmNvbXByZXNzKHRoaXMuaXRlbXMubGVuZ3RoIC0gcmViYXNlZEl0ZW1zLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBicmFuY2g7XG4gICAgfVxuICAgIGVtcHR5SXRlbUNvdW50KCkge1xuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7IGlmICghaXRlbS5zdGVwKVxuICAgICAgICAgICAgY291bnQrKzsgfSk7XG4gICAgICAgIHJldHVybiBjb3VudDtcbiAgICB9XG4gICAgLy8gQ29tcHJlc3NpbmcgYSBicmFuY2ggbWVhbnMgcmV3cml0aW5nIGl0IHRvIHB1c2ggdGhlIGFpciAobWFwLW9ubHlcbiAgICAvLyBpdGVtcykgb3V0LiBEdXJpbmcgY29sbGFib3JhdGlvbiwgdGhlc2UgbmF0dXJhbGx5IGFjY3VtdWxhdGVcbiAgICAvLyBiZWNhdXNlIGVhY2ggcmVtb3RlIGNoYW5nZSBhZGRzIG9uZS4gVGhlIGB1cHRvYCBhcmd1bWVudCBpcyB1c2VkXG4gICAgLy8gdG8gZW5zdXJlIHRoYXQgb25seSB0aGUgaXRlbXMgYmVsb3cgYSBnaXZlbiBsZXZlbCBhcmUgY29tcHJlc3NlZCxcbiAgICAvLyBiZWNhdXNlIGByZWJhc2VkYCByZWxpZXMgb24gYSBjbGVhbiwgdW50b3VjaGVkIHNldCBvZiBpdGVtcyBpblxuICAgIC8vIG9yZGVyIHRvIGFzc29jaWF0ZSBvbGQgaXRlbXMgd2l0aCByZWJhc2VkIHN0ZXBzLlxuICAgIGNvbXByZXNzKHVwdG8gPSB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgcmVtYXAgPSB0aGlzLnJlbWFwcGluZygwLCB1cHRvKSwgbWFwRnJvbSA9IHJlbWFwLm1hcHMubGVuZ3RoO1xuICAgICAgICBsZXQgaXRlbXMgPSBbXSwgZXZlbnRzID0gMDtcbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA+PSB1cHRvKSB7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5zZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5zdGVwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZXAgPSBpdGVtLnN0ZXAubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKSwgbWFwID0gc3RlcCAmJiBzdGVwLmdldE1hcCgpO1xuICAgICAgICAgICAgICAgIG1hcEZyb20tLTtcbiAgICAgICAgICAgICAgICBpZiAobWFwKVxuICAgICAgICAgICAgICAgICAgICByZW1hcC5hcHBlbmRNYXAobWFwLCBtYXBGcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gaXRlbS5zZWxlY3Rpb24gJiYgaXRlbS5zZWxlY3Rpb24ubWFwKHJlbWFwLnNsaWNlKG1hcEZyb20pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cysrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SXRlbSA9IG5ldyBJdGVtKG1hcC5pbnZlcnQoKSwgc3RlcCwgc2VsZWN0aW9uKSwgbWVyZ2VkLCBsYXN0ID0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZCA9IGl0ZW1zLmxlbmd0aCAmJiBpdGVtc1tsYXN0XS5tZXJnZShuZXdJdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xhc3RdID0gbWVyZ2VkO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0ubWFwKSB7XG4gICAgICAgICAgICAgICAgbWFwRnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzLml0ZW1zLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiBuZXcgQnJhbmNoKFJvcGVTZXF1ZW5jZS5mcm9tKGl0ZW1zLnJldmVyc2UoKSksIGV2ZW50cyk7XG4gICAgfVxufVxuQnJhbmNoLmVtcHR5ID0gbmV3IEJyYW5jaChSb3BlU2VxdWVuY2UuZW1wdHksIDApO1xuZnVuY3Rpb24gY3V0T2ZmRXZlbnRzKGl0ZW1zLCBuKSB7XG4gICAgbGV0IGN1dFBvaW50O1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc2VsZWN0aW9uICYmIChuLS0gPT0gMCkpIHtcbiAgICAgICAgICAgIGN1dFBvaW50ID0gaTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBpdGVtcy5zbGljZShjdXRQb2ludCk7XG59XG5jbGFzcyBJdGVtIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGUgKGZvcndhcmQpIHN0ZXAgbWFwIGZvciB0aGlzIGl0ZW0uXG4gICAgbWFwLCBcbiAgICAvLyBUaGUgaW52ZXJ0ZWQgc3RlcFxuICAgIHN0ZXAsIFxuICAgIC8vIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoaXMgaXRlbSBpcyB0aGUgc3RhcnQgb2YgYSBncm91cCwgYW5kXG4gICAgLy8gdGhpcyBzZWxlY3Rpb24gaXMgdGhlIHN0YXJ0aW5nIHNlbGVjdGlvbiBmb3IgdGhlIGdyb3VwICh0aGUgb25lXG4gICAgLy8gdGhhdCB3YXMgYWN0aXZlIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcCB3YXMgYXBwbGllZClcbiAgICBzZWxlY3Rpb24sIFxuICAgIC8vIElmIHRoaXMgaXRlbSBpcyB0aGUgaW52ZXJzZSBvZiBhIHByZXZpb3VzIG1hcHBpbmcgb24gdGhlIHN0YWNrLFxuICAgIC8vIHRoaXMgcG9pbnRzIGF0IHRoZSBpbnZlcnNlJ3Mgb2Zmc2V0XG4gICAgbWlycm9yT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5taXJyb3JPZmZzZXQgPSBtaXJyb3JPZmZzZXQ7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnN0ZXAgJiYgb3RoZXIuc3RlcCAmJiAhb3RoZXIuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc3RlcCA9IG90aGVyLnN0ZXAubWVyZ2UodGhpcy5zdGVwKTtcbiAgICAgICAgICAgIGlmIChzdGVwKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbShzdGVwLmdldE1hcCgpLmludmVydCgpLCBzdGVwLCB0aGlzLnNlbGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlIGZpZWxkIHRoYXQgdHJhY2tzIHVuZG8vcmVkbyBoaXN0b3J5IGZvciB0aGF0XG4vLyBzdGF0ZS4gV2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBsdWdpbiBzdGF0ZSB3aGVuIHRoZSBoaXN0b3J5IHBsdWdpblxuLy8gaXMgYWN0aXZlLlxuY2xhc3MgSGlzdG9yeVN0YXRlIHtcbiAgICBjb25zdHJ1Y3Rvcihkb25lLCB1bmRvbmUsIHByZXZSYW5nZXMsIHByZXZUaW1lLCBwcmV2Q29tcG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5kb25lID0gZG9uZTtcbiAgICAgICAgdGhpcy51bmRvbmUgPSB1bmRvbmU7XG4gICAgICAgIHRoaXMucHJldlJhbmdlcyA9IHByZXZSYW5nZXM7XG4gICAgICAgIHRoaXMucHJldlRpbWUgPSBwcmV2VGltZTtcbiAgICAgICAgdGhpcy5wcmV2Q29tcG9zaXRpb24gPSBwcmV2Q29tcG9zaXRpb247XG4gICAgfVxufVxuY29uc3QgREVQVEhfT1ZFUkZMT1cgPSAyMDtcbi8vIFJlY29yZCBhIHRyYW5zZm9ybWF0aW9uIGluIHVuZG8gaGlzdG9yeS5cbmZ1bmN0aW9uIGFwcGx5VHJhbnNhY3Rpb24oaGlzdG9yeSwgc3RhdGUsIHRyLCBvcHRpb25zKSB7XG4gICAgbGV0IGhpc3RvcnlUciA9IHRyLmdldE1ldGEoaGlzdG9yeUtleSksIHJlYmFzZWQ7XG4gICAgaWYgKGhpc3RvcnlUcilcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlUci5oaXN0b3J5U3RhdGU7XG4gICAgaWYgKHRyLmdldE1ldGEoY2xvc2VIaXN0b3J5S2V5KSlcbiAgICAgICAgaGlzdG9yeSA9IG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZSwgbnVsbCwgMCwgLTEpO1xuICAgIGxldCBhcHBlbmRlZCA9IHRyLmdldE1ldGEoXCJhcHBlbmRlZFRyYW5zYWN0aW9uXCIpO1xuICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXBwZW5kZWQgJiYgYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KSkge1xuICAgICAgICBpZiAoYXBwZW5kZWQuZ2V0TWV0YShoaXN0b3J5S2V5KS5yZWRvKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZFRyYW5zZm9ybSh0ciwgdW5kZWZpbmVkLCBvcHRpb25zLCBtdXN0UHJlc2VydmVJdGVtcyhzdGF0ZSkpLCBoaXN0b3J5LnVuZG9uZSwgcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwcyksIGhpc3RvcnkucHJldlRpbWUsIGhpc3RvcnkucHJldkNvbXBvc2l0aW9uKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLCBoaXN0b3J5LnVuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIHVuZGVmaW5lZCwgb3B0aW9ucywgbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpKSwgbnVsbCwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0ci5nZXRNZXRhKFwiYWRkVG9IaXN0b3J5XCIpICE9PSBmYWxzZSAmJiAhKGFwcGVuZGVkICYmIGFwcGVuZGVkLmdldE1ldGEoXCJhZGRUb0hpc3RvcnlcIikgPT09IGZhbHNlKSkge1xuICAgICAgICAvLyBHcm91cCB0cmFuc2Zvcm1zIHRoYXQgb2NjdXIgaW4gcXVpY2sgc3VjY2Vzc2lvbiBpbnRvIG9uZSBldmVudC5cbiAgICAgICAgbGV0IGNvbXBvc2l0aW9uID0gdHIuZ2V0TWV0YShcImNvbXBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgbmV3R3JvdXAgPSBoaXN0b3J5LnByZXZUaW1lID09IDAgfHxcbiAgICAgICAgICAgICghYXBwZW5kZWQgJiYgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24gIT0gY29tcG9zaXRpb24gJiZcbiAgICAgICAgICAgICAgICAoaGlzdG9yeS5wcmV2VGltZSA8ICh0ci50aW1lIHx8IDApIC0gb3B0aW9ucy5uZXdHcm91cERlbGF5IHx8ICFpc0FkamFjZW50VG8odHIsIGhpc3RvcnkucHJldlJhbmdlcykpKTtcbiAgICAgICAgbGV0IHByZXZSYW5nZXMgPSBhcHBlbmRlZCA/IG1hcFJhbmdlcyhoaXN0b3J5LnByZXZSYW5nZXMsIHRyLm1hcHBpbmcpIDogcmFuZ2VzRm9yKHRyLm1hcHBpbmcubWFwcyk7XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKGhpc3RvcnkuZG9uZS5hZGRUcmFuc2Zvcm0odHIsIG5ld0dyb3VwID8gc3RhdGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCkgOiB1bmRlZmluZWQsIG9wdGlvbnMsIG11c3RQcmVzZXJ2ZUl0ZW1zKHN0YXRlKSksIEJyYW5jaC5lbXB0eSwgcHJldlJhbmdlcywgdHIudGltZSwgY29tcG9zaXRpb24gPT0gbnVsbCA/IGhpc3RvcnkucHJldkNvbXBvc2l0aW9uIDogY29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZWJhc2VkID0gdHIuZ2V0TWV0YShcInJlYmFzZWRcIikpIHtcbiAgICAgICAgLy8gVXNlZCBieSB0aGUgY29sbGFiIG1vZHVsZSB0byB0ZWxsIHRoZSBoaXN0b3J5IHRoYXQgc29tZSBvZiBpdHNcbiAgICAgICAgLy8gY29udGVudCBoYXMgYmVlbiByZWJhc2VkLlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlTdGF0ZShoaXN0b3J5LmRvbmUucmViYXNlZCh0ciwgcmViYXNlZCksIGhpc3RvcnkudW5kb25lLnJlYmFzZWQodHIsIHJlYmFzZWQpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIaXN0b3J5U3RhdGUoaGlzdG9yeS5kb25lLmFkZE1hcHModHIubWFwcGluZy5tYXBzKSwgaGlzdG9yeS51bmRvbmUuYWRkTWFwcyh0ci5tYXBwaW5nLm1hcHMpLCBtYXBSYW5nZXMoaGlzdG9yeS5wcmV2UmFuZ2VzLCB0ci5tYXBwaW5nKSwgaGlzdG9yeS5wcmV2VGltZSwgaGlzdG9yeS5wcmV2Q29tcG9zaXRpb24pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQWRqYWNlbnRUbyh0cmFuc2Zvcm0sIHByZXZSYW5nZXMpIHtcbiAgICBpZiAoIXByZXZSYW5nZXMpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRyYW5zZm9ybS5kb2NDaGFuZ2VkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgYWRqYWNlbnQgPSBmYWxzZTtcbiAgICB0cmFuc2Zvcm0ubWFwcGluZy5tYXBzWzBdLmZvckVhY2goKHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2UmFuZ2VzLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICAgICAgaWYgKHN0YXJ0IDw9IHByZXZSYW5nZXNbaSArIDFdICYmIGVuZCA+PSBwcmV2UmFuZ2VzW2ldKVxuICAgICAgICAgICAgICAgIGFkamFjZW50ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWRqYWNlbnQ7XG59XG5mdW5jdGlvbiByYW5nZXNGb3IobWFwcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gbWFwcy5sZW5ndGggLSAxOyBpID49IDAgJiYgcmVzdWx0Lmxlbmd0aCA9PSAwOyBpLS0pXG4gICAgICAgIG1hcHNbaV0uZm9yRWFjaCgoX2Zyb20sIF90bywgZnJvbSwgdG8pID0+IHJlc3VsdC5wdXNoKGZyb20sIHRvKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1hcFJhbmdlcyhyYW5nZXMsIG1hcHBpbmcpIHtcbiAgICBpZiAoIXJhbmdlcylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXAocmFuZ2VzW2ldLCAxKSwgdG8gPSBtYXBwaW5nLm1hcChyYW5nZXNbaSArIDFdLCAtMSk7XG4gICAgICAgIGlmIChmcm9tIDw9IHRvKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJvbSwgdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQXBwbHkgdGhlIGxhdGVzdCBldmVudCBmcm9tIG9uZSBicmFuY2ggdG8gdGhlIGRvY3VtZW50IGFuZCBzaGlmdCB0aGUgZXZlbnRcbi8vIG9udG8gdGhlIG90aGVyIGJyYW5jaC5cbmZ1bmN0aW9uIGhpc3RUcmFuc2FjdGlvbihoaXN0b3J5LCBzdGF0ZSwgcmVkbykge1xuICAgIGxldCBwcmVzZXJ2ZUl0ZW1zID0gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpO1xuICAgIGxldCBoaXN0T3B0aW9ucyA9IGhpc3RvcnlLZXkuZ2V0KHN0YXRlKS5zcGVjLmNvbmZpZztcbiAgICBsZXQgcG9wID0gKHJlZG8gPyBoaXN0b3J5LnVuZG9uZSA6IGhpc3RvcnkuZG9uZSkucG9wRXZlbnQoc3RhdGUsIHByZXNlcnZlSXRlbXMpO1xuICAgIGlmICghcG9wKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgc2VsZWN0aW9uID0gcG9wLnNlbGVjdGlvbi5yZXNvbHZlKHBvcC50cmFuc2Zvcm0uZG9jKTtcbiAgICBsZXQgYWRkZWQgPSAocmVkbyA/IGhpc3RvcnkuZG9uZSA6IGhpc3RvcnkudW5kb25lKS5hZGRUcmFuc2Zvcm0ocG9wLnRyYW5zZm9ybSwgc3RhdGUuc2VsZWN0aW9uLmdldEJvb2ttYXJrKCksIGhpc3RPcHRpb25zLCBwcmVzZXJ2ZUl0ZW1zKTtcbiAgICBsZXQgbmV3SGlzdCA9IG5ldyBIaXN0b3J5U3RhdGUocmVkbyA/IGFkZGVkIDogcG9wLnJlbWFpbmluZywgcmVkbyA/IHBvcC5yZW1haW5pbmcgOiBhZGRlZCwgbnVsbCwgMCwgLTEpO1xuICAgIHJldHVybiBwb3AudHJhbnNmb3JtLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pLnNldE1ldGEoaGlzdG9yeUtleSwgeyByZWRvLCBoaXN0b3J5U3RhdGU6IG5ld0hpc3QgfSk7XG59XG5sZXQgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlLCBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IG51bGw7XG4vLyBDaGVjayB3aGV0aGVyIGFueSBwbHVnaW4gaW4gdGhlIGdpdmVuIHN0YXRlIGhhcyBhXG4vLyBgaGlzdG9yeVByZXNlcnZlSXRlbXNgIHByb3BlcnR5IGluIGl0cyBzcGVjLCBpbiB3aGljaCBjYXNlIHdlIG11c3Rcbi8vIHByZXNlcnZlIHN0ZXBzIGV4YWN0bHkgYXMgdGhleSBjYW1lIGluLCBzbyB0aGF0IHRoZXkgY2FuIGJlXG4vLyByZWJhc2VkLlxuZnVuY3Rpb24gbXVzdFByZXNlcnZlSXRlbXMoc3RhdGUpIHtcbiAgICBsZXQgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnM7XG4gICAgaWYgKGNhY2hlZFByZXNlcnZlSXRlbXNQbHVnaW5zICE9IHBsdWdpbnMpIHtcbiAgICAgICAgY2FjaGVkUHJlc2VydmVJdGVtcyA9IGZhbHNlO1xuICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zUGx1Z2lucyA9IHBsdWdpbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChwbHVnaW5zW2ldLnNwZWMuaGlzdG9yeVByZXNlcnZlSXRlbXMpIHtcbiAgICAgICAgICAgICAgICBjYWNoZWRQcmVzZXJ2ZUl0ZW1zID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFByZXNlcnZlSXRlbXM7XG59XG4vKipcblNldCBhIGZsYWcgb24gdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHRoYXQgd2lsbCBwcmV2ZW50IGZ1cnRoZXIgc3RlcHNcbmZyb20gYmVpbmcgYXBwZW5kZWQgdG8gYW4gZXhpc3RpbmcgaGlzdG9yeSBldmVudCAoc28gdGhhdCB0aGV5XG5yZXF1aXJlIGEgc2VwYXJhdGUgdW5kbyBjb21tYW5kIHRvIHVuZG8pLlxuKi9cbmZ1bmN0aW9uIGNsb3NlSGlzdG9yeSh0cikge1xuICAgIHJldHVybiB0ci5zZXRNZXRhKGNsb3NlSGlzdG9yeUtleSwgdHJ1ZSk7XG59XG5jb25zdCBoaXN0b3J5S2V5ID0gbmV3IFBsdWdpbktleShcImhpc3RvcnlcIik7XG5jb25zdCBjbG9zZUhpc3RvcnlLZXkgPSBuZXcgUGx1Z2luS2V5KFwiY2xvc2VIaXN0b3J5XCIpO1xuLyoqXG5SZXR1cm5zIGEgcGx1Z2luIHRoYXQgZW5hYmxlcyB0aGUgdW5kbyBoaXN0b3J5IGZvciBhbiBlZGl0b3IuIFRoZVxucGx1Z2luIHdpbGwgdHJhY2sgdW5kbyBhbmQgcmVkbyBzdGFja3MsIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlXG5bYHVuZG9gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jaGlzdG9yeS51bmRvKSBhbmQgW2ByZWRvYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI2hpc3RvcnkucmVkbykgY29tbWFuZHMuXG5cbllvdSBjYW4gc2V0IGFuIGBcImFkZFRvSGlzdG9yeVwiYCBbbWV0YWRhdGFcbnByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuVHJhbnNhY3Rpb24uc2V0TWV0YSkgb2YgYGZhbHNlYCBvbiBhIHRyYW5zYWN0aW9uXG50byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcm9sbGVkIGJhY2sgYnkgdW5kby5cbiovXG5mdW5jdGlvbiBoaXN0b3J5KGNvbmZpZyA9IHt9KSB7XG4gICAgY29uZmlnID0geyBkZXB0aDogY29uZmlnLmRlcHRoIHx8IDEwMCxcbiAgICAgICAgbmV3R3JvdXBEZWxheTogY29uZmlnLm5ld0dyb3VwRGVsYXkgfHwgNTAwIH07XG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xuICAgICAgICBrZXk6IGhpc3RvcnlLZXksXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGlzdG9yeVN0YXRlKEJyYW5jaC5lbXB0eSwgQnJhbmNoLmVtcHR5LCBudWxsLCAwLCAtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwbHkodHIsIGhpc3QsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5VHJhbnNhY3Rpb24oaGlzdCwgc3RhdGUsIHRyLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgICAgICAgICBiZWZvcmVpbnB1dCh2aWV3LCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dFR5cGUgPSBlLmlucHV0VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSBpbnB1dFR5cGUgPT0gXCJoaXN0b3J5VW5kb1wiID8gdW5kbyA6IGlucHV0VHlwZSA9PSBcImhpc3RvcnlSZWRvXCIgPyByZWRvIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21tYW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gYnVpbGRDb21tYW5kKHJlZG8sIHNjcm9sbCkge1xuICAgIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGxldCBoaXN0ID0gaGlzdG9yeUtleS5nZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgIGlmICghaGlzdCB8fCAocmVkbyA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lKS5ldmVudENvdW50ID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgICAgbGV0IHRyID0gaGlzdFRyYW5zYWN0aW9uKGhpc3QsIHN0YXRlLCByZWRvKTtcbiAgICAgICAgICAgIGlmICh0cilcbiAgICAgICAgICAgICAgICBkaXNwYXRjaChzY3JvbGwgPyB0ci5zY3JvbGxJbnRvVmlldygpIDogdHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcbkEgY29tbWFuZCBmdW5jdGlvbiB0aGF0IHVuZG9lcyB0aGUgbGFzdCBjaGFuZ2UsIGlmIGFueS5cbiovXG5jb25zdCB1bmRvID0gYnVpbGRDb21tYW5kKGZhbHNlLCB0cnVlKTtcbi8qKlxuQSBjb21tYW5kIGZ1bmN0aW9uIHRoYXQgcmVkb2VzIHRoZSBsYXN0IHVuZG9uZSBjaGFuZ2UsIGlmIGFueS5cbiovXG5jb25zdCByZWRvID0gYnVpbGRDb21tYW5kKHRydWUsIHRydWUpO1xuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB1bmRvZXMgdGhlIGxhc3QgY2hhbmdlLiBEb24ndCBzY3JvbGwgdGhlXG5zZWxlY3Rpb24gaW50byB2aWV3LlxuKi9cbmNvbnN0IHVuZG9Ob1Njcm9sbCA9IGJ1aWxkQ29tbWFuZChmYWxzZSwgZmFsc2UpO1xuLyoqXG5BIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCByZWRvZXMgdGhlIGxhc3QgdW5kb25lIGNoYW5nZS4gRG9uJ3RcbnNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlldy5cbiovXG5jb25zdCByZWRvTm9TY3JvbGwgPSBidWlsZENvbW1hbmQodHJ1ZSwgZmFsc2UpO1xuLyoqXG5UaGUgYW1vdW50IG9mIHVuZG9hYmxlIGV2ZW50cyBhdmFpbGFibGUgaW4gYSBnaXZlbiBzdGF0ZS5cbiovXG5mdW5jdGlvbiB1bmRvRGVwdGgoc3RhdGUpIHtcbiAgICBsZXQgaGlzdCA9IGhpc3RvcnlLZXkuZ2V0U3RhdGUoc3RhdGUpO1xuICAgIHJldHVybiBoaXN0ID8gaGlzdC5kb25lLmV2ZW50Q291bnQgOiAwO1xufVxuLyoqXG5UaGUgYW1vdW50IG9mIHJlZG9hYmxlIGV2ZW50cyBhdmFpbGFibGUgaW4gYSBnaXZlbiBlZGl0b3Igc3RhdGUuXG4qL1xuZnVuY3Rpb24gcmVkb0RlcHRoKHN0YXRlKSB7XG4gICAgbGV0IGhpc3QgPSBoaXN0b3J5S2V5LmdldFN0YXRlKHN0YXRlKTtcbiAgICByZXR1cm4gaGlzdCA/IGhpc3QudW5kb25lLmV2ZW50Q291bnQgOiAwO1xufVxuXG5leHBvcnQgeyBjbG9zZUhpc3RvcnksIGhpc3RvcnksIHJlZG8sIHJlZG9EZXB0aCwgcmVkb05vU2Nyb2xsLCB1bmRvLCB1bmRvRGVwdGgsIHVuZG9Ob1Njcm9sbCB9O1xuIiwiaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgZmluZFdyYXBwaW5nLCBjYW5Kb2luIH0gZnJvbSAncHJvc2VtaXJyb3ItdHJhbnNmb3JtJztcblxuLyoqXG5JbnB1dCBydWxlcyBhcmUgcmVndWxhciBleHByZXNzaW9ucyBkZXNjcmliaW5nIGEgcGllY2Ugb2YgdGV4dFxudGhhdCwgd2hlbiB0eXBlZCwgY2F1c2VzIHNvbWV0aGluZyB0byBoYXBwZW4uIFRoaXMgbWlnaHQgYmVcbmNoYW5naW5nIHR3byBkYXNoZXMgaW50byBhbiBlbWRhc2gsIHdyYXBwaW5nIGEgcGFyYWdyYXBoIHN0YXJ0aW5nXG53aXRoIGBcIj4gXCJgIGludG8gYSBibG9ja3F1b3RlLCBvciBzb21ldGhpbmcgZW50aXJlbHkgZGlmZmVyZW50LlxuKi9cbmNsYXNzIElucHV0UnVsZSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGlucHV0IHJ1bGUuIFRoZSBydWxlIGFwcGxpZXMgd2hlbiB0aGUgdXNlciB0eXBlZFxuICAgIHNvbWV0aGluZyBhbmQgdGhlIHRleHQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgdGhlIGN1cnNvciBtYXRjaGVzXG4gICAgYG1hdGNoYCwgd2hpY2ggc2hvdWxkIGVuZCB3aXRoIGAkYC5cbiAgICBcbiAgICBUaGUgYGhhbmRsZXJgIGNhbiBiZSBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSB0aGUgbWF0Y2hlZCB0ZXh0LCBvclxuICAgIHRoZSBmaXJzdCBtYXRjaGVkIGdyb3VwIGluIHRoZSByZWdleHAsIGlzIHJlcGxhY2VkIGJ5IHRoYXRcbiAgICBzdHJpbmcuXG4gICAgXG4gICAgT3IgYSBpdCBjYW4gYmUgYSBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbWF0Y2hcbiAgICBhcnJheSBwcm9kdWNlZCBieVxuICAgIFtgUmVnRXhwLmV4ZWNgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9SZWdFeHAvZXhlYyksXG4gICAgYXMgd2VsbCBhcyB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbWF0Y2hlZCByYW5nZSwgYW5kIHdoaWNoIGNhblxuICAgIHJldHVybiBhIFt0cmFuc2FjdGlvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlRyYW5zYWN0aW9uKSB0aGF0IGRlc2NyaWJlcyB0aGVcbiAgICBydWxlJ3MgZWZmZWN0LCBvciBudWxsIHRvIGluZGljYXRlIHRoZSBpbnB1dCB3YXMgbm90IGhhbmRsZWQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoLCBoYW5kbGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5tYXRjaCA9IG1hdGNoO1xuICAgICAgICB0aGlzLm1hdGNoID0gbWF0Y2g7XG4gICAgICAgIHRoaXMuaGFuZGxlciA9IHR5cGVvZiBoYW5kbGVyID09IFwic3RyaW5nXCIgPyBzdHJpbmdIYW5kbGVyKGhhbmRsZXIpIDogaGFuZGxlcjtcbiAgICAgICAgdGhpcy51bmRvYWJsZSA9IG9wdGlvbnMudW5kb2FibGUgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmluQ29kZSA9IG9wdGlvbnMuaW5Db2RlIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmluQ29kZU1hcmsgPSBvcHRpb25zLmluQ29kZU1hcmsgIT09IGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ0hhbmRsZXIoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgbGV0IGluc2VydCA9IHN0cmluZztcbiAgICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gbWF0Y2hbMF0ubGFzdEluZGV4T2YobWF0Y2hbMV0pO1xuICAgICAgICAgICAgaW5zZXJ0ICs9IG1hdGNoWzBdLnNsaWNlKG9mZnNldCArIG1hdGNoWzFdLmxlbmd0aCk7XG4gICAgICAgICAgICBzdGFydCArPSBvZmZzZXQ7XG4gICAgICAgICAgICBsZXQgY3V0T2ZmID0gc3RhcnQgLSBlbmQ7XG4gICAgICAgICAgICBpZiAoY3V0T2ZmID4gMCkge1xuICAgICAgICAgICAgICAgIGluc2VydCA9IG1hdGNoWzBdLnNsaWNlKG9mZnNldCAtIGN1dE9mZiwgb2Zmc2V0KSArIGluc2VydDtcbiAgICAgICAgICAgICAgICBzdGFydCA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdGUudHIuaW5zZXJ0VGV4dChpbnNlcnQsIHN0YXJ0LCBlbmQpO1xuICAgIH07XG59XG5jb25zdCBNQVhfTUFUQ0ggPSA1MDA7XG4vKipcbkNyZWF0ZSBhbiBpbnB1dCBydWxlcyBwbHVnaW4uIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBjYXVzZSB0ZXh0XG5pbnB1dCB0aGF0IG1hdGNoZXMgYW55IG9mIHRoZSBnaXZlbiBydWxlcyB0byB0cmlnZ2VyIHRoZSBydWxlJ3NcbmFjdGlvbi5cbiovXG5mdW5jdGlvbiBpbnB1dFJ1bGVzKHsgcnVsZXMgfSkge1xuICAgIGxldCBwbHVnaW4gPSBuZXcgUGx1Z2luKHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgIGluaXQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgYXBwbHkodHIsIHByZXYpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RvcmVkID0gdHIuZ2V0TWV0YSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ci5zZWxlY3Rpb25TZXQgfHwgdHIuZG9jQ2hhbmdlZCA/IG51bGwgOiBwcmV2O1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaGFuZGxlVGV4dElucHV0KHZpZXcsIGZyb20sIHRvLCB0ZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bih2aWV3LCBmcm9tLCB0bywgdGV4dCwgcnVsZXMsIHBsdWdpbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRpb25lbmQ6ICh2aWV3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHsgJGN1cnNvciB9ID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGN1cnNvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4odmlldywgJGN1cnNvci5wb3MsICRjdXJzb3IucG9zLCBcIlwiLCBydWxlcywgcGx1Z2luKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpc0lucHV0UnVsZXM6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gcGx1Z2luO1xufVxuZnVuY3Rpb24gcnVuKHZpZXcsIGZyb20sIHRvLCB0ZXh0LCBydWxlcywgcGx1Z2luKSB7XG4gICAgaWYgKHZpZXcuY29tcG9zaW5nKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHN0YXRlID0gdmlldy5zdGF0ZSwgJGZyb20gPSBzdGF0ZS5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICBsZXQgdGV4dEJlZm9yZSA9ICRmcm9tLnBhcmVudC50ZXh0QmV0d2VlbihNYXRoLm1heCgwLCAkZnJvbS5wYXJlbnRPZmZzZXQgLSBNQVhfTUFUQ0gpLCAkZnJvbS5wYXJlbnRPZmZzZXQsIG51bGwsIFwiXFx1ZmZmY1wiKSArIHRleHQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzW2ldO1xuICAgICAgICBpZiAoIXJ1bGUuaW5Db2RlTWFyayAmJiAkZnJvbS5tYXJrcygpLnNvbWUobSA9PiBtLnR5cGUuc3BlYy5jb2RlKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoJGZyb20ucGFyZW50LnR5cGUuc3BlYy5jb2RlKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGUuaW5Db2RlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ1bGUuaW5Db2RlID09PSBcIm9ubHlcIikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gcnVsZS5tYXRjaC5leGVjKHRleHRCZWZvcmUpO1xuICAgICAgICBsZXQgdHIgPSBtYXRjaCAmJiBtYXRjaFswXS5sZW5ndGggPj0gdGV4dC5sZW5ndGggJiZcbiAgICAgICAgICAgIHJ1bGUuaGFuZGxlcihzdGF0ZSwgbWF0Y2gsIGZyb20gLSAobWF0Y2hbMF0ubGVuZ3RoIC0gdGV4dC5sZW5ndGgpLCB0byk7XG4gICAgICAgIGlmICghdHIpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKHJ1bGUudW5kb2FibGUpXG4gICAgICAgICAgICB0ci5zZXRNZXRhKHBsdWdpbiwgeyB0cmFuc2Zvcm06IHRyLCBmcm9tLCB0bywgdGV4dCB9KTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcblRoaXMgaXMgYSBjb21tYW5kIHRoYXQgd2lsbCB1bmRvIGFuIGlucHV0IHJ1bGUsIGlmIGFwcGx5aW5nIHN1Y2ggYVxucnVsZSB3YXMgdGhlIGxhc3QgdGhpbmcgdGhhdCB0aGUgdXNlciBkaWQuXG4qL1xuY29uc3QgdW5kb0lucHV0UnVsZSA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBsZXQgcGx1Z2lucyA9IHN0YXRlLnBsdWdpbnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5zW2ldLCB1bmRvYWJsZTtcbiAgICAgICAgaWYgKHBsdWdpbi5zcGVjLmlzSW5wdXRSdWxlcyAmJiAodW5kb2FibGUgPSBwbHVnaW4uZ2V0U3RhdGUoc3RhdGUpKSkge1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRyID0gc3RhdGUudHIsIHRvVW5kbyA9IHVuZG9hYmxlLnRyYW5zZm9ybTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gdG9VbmRvLnN0ZXBzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKVxuICAgICAgICAgICAgICAgICAgICB0ci5zdGVwKHRvVW5kby5zdGVwc1tqXS5pbnZlcnQodG9VbmRvLmRvY3Nbal0pKTtcbiAgICAgICAgICAgICAgICBpZiAodW5kb2FibGUudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFya3MgPSB0ci5kb2MucmVzb2x2ZSh1bmRvYWJsZS5mcm9tKS5tYXJrcygpO1xuICAgICAgICAgICAgICAgICAgICB0ci5yZXBsYWNlV2l0aCh1bmRvYWJsZS5mcm9tLCB1bmRvYWJsZS50bywgc3RhdGUuc2NoZW1hLnRleHQodW5kb2FibGUudGV4dCwgbWFya3MpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyLmRlbGV0ZSh1bmRvYWJsZS5mcm9tLCB1bmRvYWJsZS50byk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuQ29udmVydHMgZG91YmxlIGRhc2hlcyB0byBhbiBlbWRhc2guXG4qL1xuY29uc3QgZW1EYXNoID0gbmV3IElucHV0UnVsZSgvLS0kLywgXCLigJRcIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxuQ29udmVydHMgdGhyZWUgZG90cyB0byBhbiBlbGxpcHNpcyBjaGFyYWN0ZXIuXG4qL1xuY29uc3QgZWxsaXBzaXMgPSBuZXcgSW5wdXRSdWxlKC9cXC5cXC5cXC4kLywgXCLigKZcIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxu4oCcU21hcnTigJ0gb3BlbmluZyBkb3VibGUgcXVvdGVzLlxuKi9cbmNvbnN0IG9wZW5Eb3VibGVRdW90ZSA9IG5ldyBJbnB1dFJ1bGUoLyg/Ol58W1xcc1xce1xcW1xcKFxcPCdcIlxcdTIwMThcXHUyMDFDXSkoXCIpJC8sIFwi4oCcXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcbuKAnFNtYXJ04oCdIGNsb3NpbmcgZG91YmxlIHF1b3Rlcy5cbiovXG5jb25zdCBjbG9zZURvdWJsZVF1b3RlID0gbmV3IElucHV0UnVsZSgvXCIkLywgXCLigJ1cIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxu4oCcU21hcnTigJ0gb3BlbmluZyBzaW5nbGUgcXVvdGVzLlxuKi9cbmNvbnN0IG9wZW5TaW5nbGVRdW90ZSA9IG5ldyBJbnB1dFJ1bGUoLyg/Ol58W1xcc1xce1xcW1xcKFxcPCdcIlxcdTIwMThcXHUyMDFDXSkoJykkLywgXCLigJhcIiwgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KTtcbi8qKlxu4oCcU21hcnTigJ0gY2xvc2luZyBzaW5nbGUgcXVvdGVzLlxuKi9cbmNvbnN0IGNsb3NlU2luZ2xlUXVvdGUgPSBuZXcgSW5wdXRSdWxlKC8nJC8sIFwi4oCZXCIsIHsgaW5Db2RlTWFyazogZmFsc2UgfSk7XG4vKipcblNtYXJ0LXF1b3RlIHJlbGF0ZWQgaW5wdXQgcnVsZXMuXG4qL1xuY29uc3Qgc21hcnRRdW90ZXMgPSBbb3BlbkRvdWJsZVF1b3RlLCBjbG9zZURvdWJsZVF1b3RlLCBvcGVuU2luZ2xlUXVvdGUsIGNsb3NlU2luZ2xlUXVvdGVdO1xuXG4vKipcbkJ1aWxkIGFuIGlucHV0IHJ1bGUgZm9yIGF1dG9tYXRpY2FsbHkgd3JhcHBpbmcgYSB0ZXh0YmxvY2sgd2hlbiBhXG5naXZlbiBzdHJpbmcgaXMgdHlwZWQuIFRoZSBgcmVnZXhwYCBhcmd1bWVudCBpc1xuZGlyZWN0bHkgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGBJbnB1dFJ1bGVgIGNvbnN0cnVjdG9yLiBZb3UnbGxcbnByb2JhYmx5IHdhbnQgdGhlIHJlZ2V4cCB0byBzdGFydCB3aXRoIGBeYCwgc28gdGhhdCB0aGUgcGF0dGVybiBjYW5cbm9ubHkgb2NjdXIgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrLlxuXG5gbm9kZVR5cGVgIGlzIHRoZSB0eXBlIG9mIG5vZGUgdG8gd3JhcCBpbi4gSWYgaXQgbmVlZHMgYXR0cmlidXRlcyxcbnlvdSBjYW4gZWl0aGVyIHBhc3MgdGhlbSBkaXJlY3RseSwgb3IgcGFzcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbFxuY29tcHV0ZSB0aGVtIGZyb20gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaC5cblxuQnkgZGVmYXVsdCwgaWYgdGhlcmUncyBhIG5vZGUgd2l0aCB0aGUgc2FtZSB0eXBlIGFib3ZlIHRoZSBuZXdseVxud3JhcHBlZCBub2RlLCB0aGUgcnVsZSB3aWxsIHRyeSB0byBbam9pbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5UcmFuc2Zvcm0uam9pbikgdGhvc2VcbnR3byBub2Rlcy4gWW91IGNhbiBwYXNzIGEgam9pbiBwcmVkaWNhdGUsIHdoaWNoIHRha2VzIGEgcmVndWxhclxuZXhwcmVzc2lvbiBtYXRjaCBhbmQgdGhlIG5vZGUgYmVmb3JlIHRoZSB3cmFwcGVkIG5vZGUsIGFuZCBjYW5cbnJldHVybiBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciBhIGpvaW4gc2hvdWxkIGhhcHBlbi5cbiovXG5mdW5jdGlvbiB3cmFwcGluZ0lucHV0UnVsZShyZWdleHAsIG5vZGVUeXBlLCBnZXRBdHRycyA9IG51bGwsIGpvaW5QcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gbmV3IElucHV0UnVsZShyZWdleHAsIChzdGF0ZSwgbWF0Y2gsIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgICAgbGV0IGF0dHJzID0gZ2V0QXR0cnMgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGdldEF0dHJzKG1hdGNoKSA6IGdldEF0dHJzO1xuICAgICAgICBsZXQgdHIgPSBzdGF0ZS50ci5kZWxldGUoc3RhcnQsIGVuZCk7XG4gICAgICAgIGxldCAkc3RhcnQgPSB0ci5kb2MucmVzb2x2ZShzdGFydCksIHJhbmdlID0gJHN0YXJ0LmJsb2NrUmFuZ2UoKSwgd3JhcHBpbmcgPSByYW5nZSAmJiBmaW5kV3JhcHBpbmcocmFuZ2UsIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgICAgIGlmICghd3JhcHBpbmcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdHIud3JhcChyYW5nZSwgd3JhcHBpbmcpO1xuICAgICAgICBsZXQgYmVmb3JlID0gdHIuZG9jLnJlc29sdmUoc3RhcnQgLSAxKS5ub2RlQmVmb3JlO1xuICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZS50eXBlID09IG5vZGVUeXBlICYmIGNhbkpvaW4odHIuZG9jLCBzdGFydCAtIDEpICYmXG4gICAgICAgICAgICAoIWpvaW5QcmVkaWNhdGUgfHwgam9pblByZWRpY2F0ZShtYXRjaCwgYmVmb3JlKSkpXG4gICAgICAgICAgICB0ci5qb2luKHN0YXJ0IC0gMSk7XG4gICAgICAgIHJldHVybiB0cjtcbiAgICB9KTtcbn1cbi8qKlxuQnVpbGQgYW4gaW5wdXQgcnVsZSB0aGF0IGNoYW5nZXMgdGhlIHR5cGUgb2YgYSB0ZXh0YmxvY2sgd2hlbiB0aGVcbm1hdGNoZWQgdGV4dCBpcyB0eXBlZCBpbnRvIGl0LiBZb3UnbGwgdXN1YWxseSB3YW50IHRvIHN0YXJ0IHlvdXJcbnJlZ2V4cCB3aXRoIGBeYCB0byB0aGF0IGl0IGlzIG9ubHkgbWF0Y2hlZCBhdCB0aGUgc3RhcnQgb2YgYVxudGV4dGJsb2NrLiBUaGUgb3B0aW9uYWwgYGdldEF0dHJzYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZVxudGhlIG5ldyBub2RlJ3MgYXR0cmlidXRlcywgYW5kIHdvcmtzIHRoZSBzYW1lIGFzIGluIHRoZVxuYHdyYXBwaW5nSW5wdXRSdWxlYCBmdW5jdGlvbi5cbiovXG5mdW5jdGlvbiB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKHJlZ2V4cCwgbm9kZVR5cGUsIGdldEF0dHJzID0gbnVsbCkge1xuICAgIHJldHVybiBuZXcgSW5wdXRSdWxlKHJlZ2V4cCwgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgICBsZXQgJHN0YXJ0ID0gc3RhdGUuZG9jLnJlc29sdmUoc3RhcnQpO1xuICAgICAgICBsZXQgYXR0cnMgPSBnZXRBdHRycyBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gZ2V0QXR0cnMobWF0Y2gpIDogZ2V0QXR0cnM7XG4gICAgICAgIGlmICghJHN0YXJ0Lm5vZGUoLTEpLmNhblJlcGxhY2VXaXRoKCRzdGFydC5pbmRleCgtMSksICRzdGFydC5pbmRleEFmdGVyKC0xKSwgbm9kZVR5cGUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBzdGF0ZS50clxuICAgICAgICAgICAgLmRlbGV0ZShzdGFydCwgZW5kKVxuICAgICAgICAgICAgLnNldEJsb2NrVHlwZShzdGFydCwgc3RhcnQsIG5vZGVUeXBlLCBhdHRycyk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB7IElucHV0UnVsZSwgY2xvc2VEb3VibGVRdW90ZSwgY2xvc2VTaW5nbGVRdW90ZSwgZWxsaXBzaXMsIGVtRGFzaCwgaW5wdXRSdWxlcywgb3BlbkRvdWJsZVF1b3RlLCBvcGVuU2luZ2xlUXVvdGUsIHNtYXJ0UXVvdGVzLCB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlLCB1bmRvSW5wdXRSdWxlLCB3cmFwcGluZ0lucHV0UnVsZSB9O1xuIiwiaW1wb3J0IHsga2V5TmFtZSwgYmFzZSB9IGZyb20gJ3czYy1rZXluYW1lJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3QgbWFjID0gdHlwZW9mIG5hdmlnYXRvciAhPSBcInVuZGVmaW5lZFwiICYmIC9NYWN8aVAoaG9uZXxbb2FdZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTtcbmNvbnN0IHdpbmRvd3MgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgJiYgL1dpbi8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pO1xuZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lKSB7XG4gICAgbGV0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLyksIHJlc3VsdCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChyZXN1bHQgPT0gXCJTcGFjZVwiKVxuICAgICAgICByZXN1bHQgPSBcIiBcIjtcbiAgICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgbWV0YTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBsZXQgbW9kID0gcGFydHNbaV07XG4gICAgICAgIGlmICgvXihjbWR8bWV0YXxtKSQvaS50ZXN0KG1vZCkpXG4gICAgICAgICAgICBtZXRhID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKVxuICAgICAgICAgICAgYWx0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL14oY3xjdHJsfGNvbnRyb2wpJC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICgvXnMoaGlmdCk/JC9pLnRlc3QobW9kKSlcbiAgICAgICAgICAgIHNoaWZ0ID0gdHJ1ZTtcbiAgICAgICAgZWxzZSBpZiAoL15tb2QkL2kudGVzdChtb2QpKSB7XG4gICAgICAgICAgICBpZiAobWFjKVxuICAgICAgICAgICAgICAgIG1ldGEgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGN0cmwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiBcIiArIG1vZCk7XG4gICAgfVxuICAgIGlmIChhbHQpXG4gICAgICAgIHJlc3VsdCA9IFwiQWx0LVwiICsgcmVzdWx0O1xuICAgIGlmIChjdHJsKVxuICAgICAgICByZXN1bHQgPSBcIkN0cmwtXCIgKyByZXN1bHQ7XG4gICAgaWYgKG1ldGEpXG4gICAgICAgIHJlc3VsdCA9IFwiTWV0YS1cIiArIHJlc3VsdDtcbiAgICBpZiAoc2hpZnQpXG4gICAgICAgIHJlc3VsdCA9IFwiU2hpZnQtXCIgKyByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZShtYXApIHtcbiAgICBsZXQgY29weSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBtYXApXG4gICAgICAgIGNvcHlbbm9ybWFsaXplS2V5TmFtZShwcm9wKV0gPSBtYXBbcHJvcF07XG4gICAgcmV0dXJuIGNvcHk7XG59XG5mdW5jdGlvbiBtb2RpZmllcnMobmFtZSwgZXZlbnQsIHNoaWZ0ID0gdHJ1ZSkge1xuICAgIGlmIChldmVudC5hbHRLZXkpXG4gICAgICAgIG5hbWUgPSBcIkFsdC1cIiArIG5hbWU7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkpXG4gICAgICAgIG5hbWUgPSBcIkN0cmwtXCIgKyBuYW1lO1xuICAgIGlmIChldmVudC5tZXRhS2V5KVxuICAgICAgICBuYW1lID0gXCJNZXRhLVwiICsgbmFtZTtcbiAgICBpZiAoc2hpZnQgJiYgZXZlbnQuc2hpZnRLZXkpXG4gICAgICAgIG5hbWUgPSBcIlNoaWZ0LVwiICsgbmFtZTtcbiAgICByZXR1cm4gbmFtZTtcbn1cbi8qKlxuQ3JlYXRlIGEga2V5bWFwIHBsdWdpbiBmb3IgdGhlIGdpdmVuIHNldCBvZiBiaW5kaW5ncy5cblxuQmluZGluZ3Mgc2hvdWxkIG1hcCBrZXkgbmFtZXMgdG8gW2NvbW1hbmRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNjb21tYW5kcyktc3R5bGVcbmZ1bmN0aW9ucywgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBgKEVkaXRvclN0YXRlLCBkaXNwYXRjaCxcbkVkaXRvclZpZXcpYCBhcmd1bWVudHMsIGFuZCBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGV5J3ZlIGhhbmRsZWRcbnRoZSBrZXkuIE5vdGUgdGhhdCB0aGUgdmlldyBhcmd1bWVudCBpc24ndCBwYXJ0IG9mIHRoZSBjb21tYW5kXG5wcm90b2NvbCwgYnV0IGNhbiBiZSB1c2VkIGFzIGFuIGVzY2FwZSBoYXRjaCBpZiBhIGJpbmRpbmcgbmVlZHMgdG9cbmRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIFVJLlxuXG5LZXkgbmFtZXMgbWF5IGJlIHN0cmluZ3MgbGlrZSBgXCJTaGlmdC1DdHJsLUVudGVyXCJg4oCUYSBrZXlcbmlkZW50aWZpZXIgcHJlZml4ZWQgd2l0aCB6ZXJvIG9yIG1vcmUgbW9kaWZpZXJzLiBLZXkgaWRlbnRpZmllcnNcbmFyZSBiYXNlZCBvbiB0aGUgc3RyaW5ncyB0aGF0IGNhbiBhcHBlYXIgaW5cbltgS2V5RXZlbnQua2V5YF0oaHR0cHM6ZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSkuXG5Vc2UgbG93ZXJjYXNlIGxldHRlcnMgdG8gcmVmZXIgdG8gbGV0dGVyIGtleXMgKG9yIHVwcGVyY2FzZSBsZXR0ZXJzXG5pZiB5b3Ugd2FudCBzaGlmdCB0byBiZSBoZWxkKS4gWW91IG1heSB1c2UgYFwiU3BhY2VcImAgYXMgYW4gYWxpYXNcbmZvciB0aGUgYFwiIFwiYCBuYW1lLlxuXG5Nb2RpZmllcnMgY2FuIGJlIGdpdmVuIGluIGFueSBvcmRlci4gYFNoaWZ0LWAgKG9yIGBzLWApLCBgQWx0LWAgKG9yXG5gYS1gKSwgYEN0cmwtYCAob3IgYGMtYCBvciBgQ29udHJvbC1gKSBhbmQgYENtZC1gIChvciBgbS1gIG9yXG5gTWV0YS1gKSBhcmUgcmVjb2duaXplZC4gRm9yIGNoYXJhY3RlcnMgdGhhdCBhcmUgY3JlYXRlZCBieSBob2xkaW5nXG5zaGlmdCwgdGhlIGBTaGlmdC1gIHByZWZpeCBpcyBpbXBsaWVkLCBhbmQgc2hvdWxkIG5vdCBiZSBhZGRlZFxuZXhwbGljaXRseS5cblxuWW91IGNhbiB1c2UgYE1vZC1gIGFzIGEgc2hvcnRoYW5kIGZvciBgQ21kLWAgb24gTWFjIGFuZCBgQ3RybC1gIG9uXG5vdGhlciBwbGF0Zm9ybXMuXG5cbllvdSBjYW4gYWRkIG11bHRpcGxlIGtleW1hcCBwbHVnaW5zIHRvIGFuIGVkaXRvci4gVGhlIG9yZGVyIGluXG53aGljaCB0aGV5IGFwcGVhciBkZXRlcm1pbmVzIHRoZWlyIHByZWNlZGVuY2UgKHRoZSBvbmVzIGVhcmx5IGluXG50aGUgYXJyYXkgZ2V0IHRvIGRpc3BhdGNoIGZpcnN0KS5cbiovXG5mdW5jdGlvbiBrZXltYXAoYmluZGluZ3MpIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbih7IHByb3BzOiB7IGhhbmRsZUtleURvd246IGtleWRvd25IYW5kbGVyKGJpbmRpbmdzKSB9IH0pO1xufVxuLyoqXG5HaXZlbiBhIHNldCBvZiBiaW5kaW5ncyAodXNpbmcgdGhlIHNhbWUgZm9ybWF0IGFzXG5bYGtleW1hcGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNrZXltYXAua2V5bWFwKSksIHJldHVybiBhIFtrZXlkb3duXG5oYW5kbGVyXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JQcm9wcy5oYW5kbGVLZXlEb3duKSB0aGF0IGhhbmRsZXMgdGhlbS5cbiovXG5mdW5jdGlvbiBrZXlkb3duSGFuZGxlcihiaW5kaW5ncykge1xuICAgIGxldCBtYXAgPSBub3JtYWxpemUoYmluZGluZ3MpO1xuICAgIHJldHVybiBmdW5jdGlvbiAodmlldywgZXZlbnQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBrZXlOYW1lKGV2ZW50KSwgYmFzZU5hbWUsIGRpcmVjdCA9IG1hcFttb2RpZmllcnMobmFtZSwgZXZlbnQpXTtcbiAgICAgICAgaWYgKGRpcmVjdCAmJiBkaXJlY3Qodmlldy5zdGF0ZSwgdmlldy5kaXNwYXRjaCwgdmlldykpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gQSBjaGFyYWN0ZXIga2V5XG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA9PSAxICYmIG5hbWUgIT0gXCIgXCIpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIG5hbWUgd2FzIGFscmVhZHkgbW9kaWZpZWQgYnkgc2hpZnQsIHRyeSBsb29raW5nXG4gICAgICAgICAgICAgICAgLy8gaXQgdXAgd2l0aG91dCBpdHMgc2hpZnQgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICBsZXQgbm9TaGlmdCA9IG1hcFttb2RpZmllcnMobmFtZSwgZXZlbnQsIGZhbHNlKV07XG4gICAgICAgICAgICAgICAgaWYgKG5vU2hpZnQgJiYgbm9TaGlmdCh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmXG4gICAgICAgICAgICAgICAgLy8gQ3RybC1BbHQgbWF5IGJlIHVzZWQgZm9yIEFsdEdyIG9uIFdpbmRvd3NcbiAgICAgICAgICAgICAgICAhKHdpbmRvd3MgJiYgZXZlbnQuY3RybEtleSAmJiBldmVudC5hbHRLZXkpICYmXG4gICAgICAgICAgICAgICAgKGJhc2VOYW1lID0gYmFzZVtldmVudC5rZXlDb2RlXSkgJiYgYmFzZU5hbWUgIT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBmYWxsaW5nIGJhY2sgdG8gdGhlIGtleUNvZGUgd2hlbiB0aGVyZSdzIGEgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICAvLyBhY3RpdmUgb3IgdGhlIGNoYXJhY3RlciBwcm9kdWNlZCBpc24ndCBBU0NJSSwgYW5kIG91ciB0YWJsZVxuICAgICAgICAgICAgICAgIC8vIHByb2R1Y2VzIGEgZGlmZmVyZW50IG5hbWUgZnJvbSB0aGUgdGhlIGtleUNvZGUuIFNlZSAjNjY4LFxuICAgICAgICAgICAgICAgIC8vICMxMDYwLCAjMTUyOS5cbiAgICAgICAgICAgICAgICBsZXQgZnJvbUNvZGUgPSBtYXBbbW9kaWZpZXJzKGJhc2VOYW1lLCBldmVudCldO1xuICAgICAgICAgICAgICAgIGlmIChmcm9tQ29kZSAmJiBmcm9tQ29kZSh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoLCB2aWV3KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGtleWRvd25IYW5kbGVyLCBrZXltYXAgfTtcbiIsImltcG9ydCB7IFNjaGVtYSwgTWFyayB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCBNYXJrZG93bkl0IGZyb20gJ21hcmtkb3duLWl0JztcblxuLyoqXG5Eb2N1bWVudCBzY2hlbWEgZm9yIHRoZSBkYXRhIG1vZGVsIHVzZWQgYnkgQ29tbW9uTWFyay5cbiovXG5jb25zdCBzY2hlbWEgPSBuZXcgU2NoZW1hKHtcbiAgICBub2Rlczoge1xuICAgICAgICBkb2M6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiYmxvY2srXCJcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImlubGluZSpcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInBcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wicFwiLCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBibG9ja3F1b3RlOiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYmxvY2txdW90ZVwiIH1dLFxuICAgICAgICAgICAgdG9ET00oKSB7IHJldHVybiBbXCJibG9ja3F1b3RlXCIsIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGhvcml6b250YWxfcnVsZToge1xuICAgICAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiaHJcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wiZGl2XCIsIFtcImhyXCJdXTsgfVxuICAgICAgICB9LFxuICAgICAgICBoZWFkaW5nOiB7XG4gICAgICAgICAgICBhdHRyczogeyBsZXZlbDogeyBkZWZhdWx0OiAxIH0gfSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiKHRleHQgfCBpbWFnZSkqXCIsXG4gICAgICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImgxXCIsIGF0dHJzOiB7IGxldmVsOiAxIH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoMlwiLCBhdHRyczogeyBsZXZlbDogMiB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDNcIiwgYXR0cnM6IHsgbGV2ZWw6IDMgfSB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImg0XCIsIGF0dHJzOiB7IGxldmVsOiA0IH0gfSxcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJoNVwiLCBhdHRyczogeyBsZXZlbDogNSB9IH0sXG4gICAgICAgICAgICAgICAgeyB0YWc6IFwiaDZcIiwgYXR0cnM6IHsgbGV2ZWw6IDYgfSB9XSxcbiAgICAgICAgICAgIHRvRE9NKG5vZGUpIHsgcmV0dXJuIFtcImhcIiArIG5vZGUuYXR0cnMubGV2ZWwsIDBdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGVfYmxvY2s6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwidGV4dCpcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgICAgICBtYXJrczogXCJcIixcbiAgICAgICAgICAgIGF0dHJzOiB7IHBhcmFtczogeyBkZWZhdWx0OiBcIlwiIH0gfSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicHJlXCIsIHByZXNlcnZlV2hpdGVzcGFjZTogXCJmdWxsXCIsIGdldEF0dHJzOiBub2RlID0+ICh7IHBhcmFtczogbm9kZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhcmFtc1wiKSB8fCBcIlwiIH0pIH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wicHJlXCIsIG5vZGUuYXR0cnMucGFyYW1zID8geyBcImRhdGEtcGFyYW1zXCI6IG5vZGUuYXR0cnMucGFyYW1zIH0gOiB7fSwgW1wiY29kZVwiLCAwXV07IH1cbiAgICAgICAgfSxcbiAgICAgICAgb3JkZXJlZF9saXN0OiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImxpc3RfaXRlbStcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBhdHRyczogeyBvcmRlcjogeyBkZWZhdWx0OiAxIH0sIHRpZ2h0OiB7IGRlZmF1bHQ6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwib2xcIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvcmRlcjogZG9tLmhhc0F0dHJpYnV0ZShcInN0YXJ0XCIpID8gK2RvbS5nZXRBdHRyaWJ1dGUoXCJzdGFydFwiKSA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlnaHQ6IGRvbS5oYXNBdHRyaWJ1dGUoXCJkYXRhLXRpZ2h0XCIpIH07XG4gICAgICAgICAgICAgICAgICAgIH0gfV0sXG4gICAgICAgICAgICB0b0RPTShub2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcIm9sXCIsIHsgc3RhcnQ6IG5vZGUuYXR0cnMub3JkZXIgPT0gMSA/IG51bGwgOiBub2RlLmF0dHJzLm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkYXRhLXRpZ2h0XCI6IG5vZGUuYXR0cnMudGlnaHQgPyBcInRydWVcIiA6IG51bGwgfSwgMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1bGxldF9saXN0OiB7XG4gICAgICAgICAgICBjb250ZW50OiBcImxpc3RfaXRlbStcIixcbiAgICAgICAgICAgIGdyb3VwOiBcImJsb2NrXCIsXG4gICAgICAgICAgICBhdHRyczogeyB0aWdodDogeyBkZWZhdWx0OiBmYWxzZSB9IH0sXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcInVsXCIsIGdldEF0dHJzOiBkb20gPT4gKHsgdGlnaHQ6IGRvbS5oYXNBdHRyaWJ1dGUoXCJkYXRhLXRpZ2h0XCIpIH0pIH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1widWxcIiwgeyBcImRhdGEtdGlnaHRcIjogbm9kZS5hdHRycy50aWdodCA/IFwidHJ1ZVwiIDogbnVsbCB9LCAwXTsgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0X2l0ZW06IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFwiYmxvY2srXCIsXG4gICAgICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwibGlcIiB9XSxcbiAgICAgICAgICAgIHRvRE9NKCkgeyByZXR1cm4gW1wibGlcIiwgMF07IH1cbiAgICAgICAgfSxcbiAgICAgICAgdGV4dDoge1xuICAgICAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCJcbiAgICAgICAgfSxcbiAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICAgICAgc3JjOiB7fSxcbiAgICAgICAgICAgICAgICBhbHQ6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdyb3VwOiBcImlubGluZVwiLFxuICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJpbWdbc3JjXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBkb20uZ2V0QXR0cmlidXRlKFwic3JjXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiBkb20uZ2V0QXR0cmlidXRlKFwiYWx0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wiaW1nXCIsIG5vZGUuYXR0cnNdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIGhhcmRfYnJlYWs6IHtcbiAgICAgICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgICAgIGdyb3VwOiBcImlubGluZVwiLFxuICAgICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImJyXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImJyXCJdOyB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1hcmtzOiB7XG4gICAgICAgIGVtOiB7XG4gICAgICAgICAgICBwYXJzZURPTTogW1xuICAgICAgICAgICAgICAgIHsgdGFnOiBcImlcIiB9LCB7IHRhZzogXCJlbVwiIH0sXG4gICAgICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPWl0YWxpY1wiIH0sXG4gICAgICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPW5vcm1hbFwiLCBjbGVhck1hcms6IG0gPT4gbS50eXBlLm5hbWUgPT0gXCJlbVwiIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImVtXCJdOyB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0cm9uZzoge1xuICAgICAgICAgICAgcGFyc2VET006IFtcbiAgICAgICAgICAgICAgICB7IHRhZzogXCJzdHJvbmdcIiB9LFxuICAgICAgICAgICAgICAgIHsgdGFnOiBcImJcIiwgZ2V0QXR0cnM6IG5vZGUgPT4gbm9kZS5zdHlsZS5mb250V2VpZ2h0ICE9IFwibm9ybWFsXCIgJiYgbnVsbCB9LFxuICAgICAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHQ9NDAwXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXdlaWdodFwiLCBnZXRBdHRyczogdmFsdWUgPT4gL14oYm9sZChlcik/fFs1LTldXFxkezIsfSkkLy50ZXN0KHZhbHVlKSAmJiBudWxsIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcInN0cm9uZ1wiXTsgfVxuICAgICAgICB9LFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgICAgIGhyZWY6IHt9LFxuICAgICAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImFbaHJlZl1cIiwgZ2V0QXR0cnMoZG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBocmVmOiBkb20uZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSwgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSB9O1xuICAgICAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICAgICAgdG9ET00obm9kZSkgeyByZXR1cm4gW1wiYVwiLCBub2RlLmF0dHJzXTsgfVxuICAgICAgICB9LFxuICAgICAgICBjb2RlOiB7XG4gICAgICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJjb2RlXCIgfV0sXG4gICAgICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIFtcImNvZGVcIl07IH1cbiAgICAgICAgfVxuICAgIH1cbn0pO1xuXG4vLyBAdHMtaWdub3JlXG5mdW5jdGlvbiBtYXliZU1lcmdlKGEsIGIpIHtcbiAgICBpZiAoYS5pc1RleHQgJiYgYi5pc1RleHQgJiYgTWFyay5zYW1lU2V0KGEubWFya3MsIGIubWFya3MpKVxuICAgICAgICByZXR1cm4gYS53aXRoVGV4dChhLnRleHQgKyBiLnRleHQpO1xufVxuLy8gT2JqZWN0IHVzZWQgdG8gdHJhY2sgdGhlIGNvbnRleHQgb2YgYSBydW5uaW5nIHBhcnNlLlxuY2xhc3MgTWFya2Rvd25QYXJzZVN0YXRlIHtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEsIHRva2VuSGFuZGxlcnMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMudG9rZW5IYW5kbGVycyA9IHRva2VuSGFuZGxlcnM7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBbeyB0eXBlOiBzY2hlbWEudG9wTm9kZVR5cGUsIGF0dHJzOiBudWxsLCBjb250ZW50OiBbXSwgbWFya3M6IE1hcmsubm9uZSB9XTtcbiAgICB9XG4gICAgdG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBwdXNoKGVsdCkge1xuICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnRvcCgpLmNvbnRlbnQucHVzaChlbHQpO1xuICAgIH1cbiAgICAvLyBBZGRzIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCxcbiAgICAvLyB1c2luZyB0aGUgY3VycmVudCBtYXJrcyBhcyBzdHlsaW5nLlxuICAgIGFkZFRleHQodGV4dCkge1xuICAgICAgICBpZiAoIXRleHQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCgpLCBub2RlcyA9IHRvcC5jb250ZW50LCBsYXN0ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5zY2hlbWEudGV4dCh0ZXh0LCB0b3AubWFya3MpLCBtZXJnZWQ7XG4gICAgICAgIGlmIChsYXN0ICYmIChtZXJnZWQgPSBtYXliZU1lcmdlKGxhc3QsIG5vZGUpKSlcbiAgICAgICAgICAgIG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdID0gbWVyZ2VkO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgICAvLyBBZGRzIHRoZSBnaXZlbiBtYXJrIHRvIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzLlxuICAgIG9wZW5NYXJrKG1hcmspIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMudG9wKCk7XG4gICAgICAgIHRvcC5tYXJrcyA9IG1hcmsuYWRkVG9TZXQodG9wLm1hcmtzKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlcyB0aGUgZ2l2ZW4gbWFyayBmcm9tIHRoZSBzZXQgb2YgYWN0aXZlIG1hcmtzLlxuICAgIGNsb3NlTWFyayhtYXJrKSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCgpO1xuICAgICAgICB0b3AubWFya3MgPSBtYXJrLnJlbW92ZUZyb21TZXQodG9wLm1hcmtzKTtcbiAgICB9XG4gICAgcGFyc2VUb2tlbnModG9rcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB0b2sgPSB0b2tzW2ldO1xuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSB0aGlzLnRva2VuSGFuZGxlcnNbdG9rLnR5cGVdO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRva2VuIHR5cGUgYFwiICsgdG9rLnR5cGUgKyBcImAgbm90IHN1cHBvcnRlZCBieSBNYXJrZG93biBwYXJzZXJcIik7XG4gICAgICAgICAgICBoYW5kbGVyKHRoaXMsIHRvaywgdG9rcywgaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWRkIGEgbm9kZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi5cbiAgICBhZGROb2RlKHR5cGUsIGF0dHJzLCBjb250ZW50KSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcCgpO1xuICAgICAgICBsZXQgbm9kZSA9IHR5cGUuY3JlYXRlQW5kRmlsbChhdHRycywgY29udGVudCwgdG9wID8gdG9wLm1hcmtzIDogW10pO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5wdXNoKG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLy8gV3JhcCBzdWJzZXF1ZW50IGNvbnRlbnQgaW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlLlxuICAgIG9wZW5Ob2RlKHR5cGUsIGF0dHJzKSB7XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IHR5cGU6IHR5cGUsIGF0dHJzOiBhdHRycywgY29udGVudDogW10sIG1hcmtzOiBNYXJrLm5vbmUgfSk7XG4gICAgfVxuICAgIC8vIENsb3NlIGFuZCByZXR1cm4gdGhlIG5vZGUgdGhhdCBpcyBjdXJyZW50bHkgb24gdG9wIG9mIHRoZSBzdGFjay5cbiAgICBjbG9zZU5vZGUoKSB7XG4gICAgICAgIGxldCBpbmZvID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTm9kZShpbmZvLnR5cGUsIGluZm8uYXR0cnMsIGluZm8uY29udGVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXR0cnMoc3BlYywgdG9rZW4sIHRva2VucywgaSkge1xuICAgIGlmIChzcGVjLmdldEF0dHJzKVxuICAgICAgICByZXR1cm4gc3BlYy5nZXRBdHRycyh0b2tlbiwgdG9rZW5zLCBpKTtcbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2hlbiBgYXR0cnNgIGlzIGEgRnVuY3Rpb25cbiAgICBlbHNlIGlmIChzcGVjLmF0dHJzIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgIHJldHVybiBzcGVjLmF0dHJzKHRva2VuKTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBzcGVjLmF0dHJzO1xufVxuLy8gQ29kZSBjb250ZW50IGlzIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIHRva2VuIHdpdGggYSBgY29udGVudGBcbi8vIHByb3BlcnR5IGluIE1hcmtkb3duLWl0LlxuZnVuY3Rpb24gbm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpIHtcbiAgICByZXR1cm4gc3BlYy5ub0Nsb3NlVG9rZW4gfHwgdHlwZSA9PSBcImNvZGVfaW5saW5lXCIgfHwgdHlwZSA9PSBcImNvZGVfYmxvY2tcIiB8fCB0eXBlID09IFwiZmVuY2VcIjtcbn1cbmZ1bmN0aW9uIHdpdGhvdXRUcmFpbGluZ05ld2xpbmUoc3RyKSB7XG4gICAgcmV0dXJuIHN0cltzdHIubGVuZ3RoIC0gMV0gPT0gXCJcXG5cIiA/IHN0ci5zbGljZSgwLCBzdHIubGVuZ3RoIC0gMSkgOiBzdHI7XG59XG5mdW5jdGlvbiBub09wKCkgeyB9XG5mdW5jdGlvbiB0b2tlbkhhbmRsZXJzKHNjaGVtYSwgdG9rZW5zKSB7XG4gICAgbGV0IGhhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGxldCB0eXBlIGluIHRva2Vucykge1xuICAgICAgICBsZXQgc3BlYyA9IHRva2Vuc1t0eXBlXTtcbiAgICAgICAgaWYgKHNwZWMuYmxvY2spIHtcbiAgICAgICAgICAgIGxldCBub2RlVHlwZSA9IHNjaGVtYS5ub2RlVHlwZShzcGVjLmJsb2NrKTtcbiAgICAgICAgICAgIGlmIChub0Nsb3NlVG9rZW4oc3BlYywgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlXSA9IChzdGF0ZSwgdG9rLCB0b2tlbnMsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUub3Blbk5vZGUobm9kZVR5cGUsIGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmFkZFRleHQod2l0aG91dFRyYWlsaW5nTmV3bGluZSh0b2suY29udGVudCkpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jbG9zZU5vZGUoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX29wZW5cIl0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiBzdGF0ZS5vcGVuTm9kZShub2RlVHlwZSwgYXR0cnMoc3BlYywgdG9rLCB0b2tlbnMsIGkpKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfY2xvc2VcIl0gPSBzdGF0ZSA9PiBzdGF0ZS5jbG9zZU5vZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcGVjLm5vZGUpIHtcbiAgICAgICAgICAgIGxldCBub2RlVHlwZSA9IHNjaGVtYS5ub2RlVHlwZShzcGVjLm5vZGUpO1xuICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiBzdGF0ZS5hZGROb2RlKG5vZGVUeXBlLCBhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNwZWMubWFyaykge1xuICAgICAgICAgICAgbGV0IG1hcmtUeXBlID0gc2NoZW1hLm1hcmtzW3NwZWMubWFya107XG4gICAgICAgICAgICBpZiAobm9DbG9zZVRva2VuKHNwZWMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZV0gPSAoc3RhdGUsIHRvaywgdG9rZW5zLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLm9wZW5NYXJrKG1hcmtUeXBlLmNyZWF0ZShhdHRycyhzcGVjLCB0b2ssIHRva2VucywgaSkpKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuYWRkVGV4dCh3aXRob3V0VHJhaWxpbmdOZXdsaW5lKHRvay5jb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmNsb3NlTWFyayhtYXJrVHlwZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9vcGVuXCJdID0gKHN0YXRlLCB0b2ssIHRva2VucywgaSkgPT4gc3RhdGUub3Blbk1hcmsobWFya1R5cGUuY3JlYXRlKGF0dHJzKHNwZWMsIHRvaywgdG9rZW5zLCBpKSkpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW3R5cGUgKyBcIl9jbG9zZVwiXSA9IHN0YXRlID0+IHN0YXRlLmNsb3NlTWFyayhtYXJrVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3BlYy5pZ25vcmUpIHtcbiAgICAgICAgICAgIGlmIChub0Nsb3NlVG9rZW4oc3BlYywgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlXSA9IG5vT3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyc1t0eXBlICsgXCJfb3BlblwiXSA9IG5vT3A7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnNbdHlwZSArIFwiX2Nsb3NlXCJdID0gbm9PcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVW5yZWNvZ25pemVkIHBhcnNpbmcgc3BlYyBcIiArIEpTT04uc3RyaW5naWZ5KHNwZWMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVycy50ZXh0ID0gKHN0YXRlLCB0b2spID0+IHN0YXRlLmFkZFRleHQodG9rLmNvbnRlbnQpO1xuICAgIGhhbmRsZXJzLmlubGluZSA9IChzdGF0ZSwgdG9rKSA9PiBzdGF0ZS5wYXJzZVRva2Vucyh0b2suY2hpbGRyZW4pO1xuICAgIGhhbmRsZXJzLnNvZnRicmVhayA9IGhhbmRsZXJzLnNvZnRicmVhayB8fCAoc3RhdGUgPT4gc3RhdGUuYWRkVGV4dChcIiBcIikpO1xuICAgIHJldHVybiBoYW5kbGVycztcbn1cbi8qKlxuQSBjb25maWd1cmF0aW9uIG9mIGEgTWFya2Rvd24gcGFyc2VyLiBTdWNoIGEgcGFyc2VyIHVzZXNcblttYXJrZG93bi1pdF0oaHR0cHM6Ly9naXRodWIuY29tL21hcmtkb3duLWl0L21hcmtkb3duLWl0KSB0b1xudG9rZW5pemUgYSBmaWxlLCBhbmQgdGhlbiBydW5zIHRoZSBjdXN0b20gcnVsZXMgaXQgaXMgZ2l2ZW4gb3ZlclxudGhlIHRva2VucyB0byBjcmVhdGUgYSBQcm9zZU1pcnJvciBkb2N1bWVudCB0cmVlLlxuKi9cbmNsYXNzIE1hcmtkb3duUGFyc2VyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwYXJzZXIgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gWW91IGNhbiBjb25maWd1cmVcbiAgICB0aGUgbWFya2Rvd24taXQgcGFyc2VyIHRvIHBhcnNlIHRoZSBkaWFsZWN0IHlvdSB3YW50LCBhbmQgcHJvdmlkZVxuICAgIGEgZGVzY3JpcHRpb24gb2YgdGhlIFByb3NlTWlycm9yIGVudGl0aWVzIHRob3NlIHRva2VucyBtYXAgdG8gaW5cbiAgICB0aGUgYHRva2Vuc2Agb2JqZWN0LCB3aGljaCBtYXBzIHRva2VuIG5hbWVzIHRvIGRlc2NyaXB0aW9ucyBvZlxuICAgIHdoYXQgdG8gZG8gd2l0aCB0aGVtLiBTdWNoIGEgZGVzY3JpcHRpb24gaXMgYW4gb2JqZWN0LCBhbmQgbWF5XG4gICAgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgcGFyc2VyJ3MgZG9jdW1lbnQgc2NoZW1hLlxuICAgICovXG4gICAgc2NoZW1hLCBcbiAgICAvKipcbiAgICBUaGlzIHBhcnNlcidzIG1hcmtkb3duLWl0IHRva2VuaXplci5cbiAgICAqL1xuICAgIHRva2VuaXplciwgXG4gICAgLyoqXG4gICAgVGhlIHZhbHVlIG9mIHRoZSBgdG9rZW5zYCBvYmplY3QgdXNlZCB0byBjb25zdHJ1Y3QgdGhpc1xuICAgIHBhcnNlci4gQ2FuIGJlIHVzZWZ1bCB0byBjb3B5IGFuZCBtb2RpZnkgdG8gYmFzZSBvdGhlciBwYXJzZXJzXG4gICAgb24uXG4gICAgKi9cbiAgICB0b2tlbnMpIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIHRoaXMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICAgICAgdGhpcy50b2tlbkhhbmRsZXJzID0gdG9rZW5IYW5kbGVycyhzY2hlbWEsIHRva2Vucyk7XG4gICAgfVxuICAgIC8qKlxuICAgIFBhcnNlIGEgc3RyaW5nIGFzIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSBtYXJrdXAsXG4gICAgYW5kIGNyZWF0ZSBhIFByb3NlTWlycm9yIGRvY3VtZW50IGFzIHByZXNjcmliZWQgYnkgdGhpcyBwYXJzZXInc1xuICAgIHJ1bGVzLlxuICAgIFxuICAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIHdoZW4gZ2l2ZW4sIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZVxuICAgIFtNYXJrZG93blxuICAgIHBhcnNlcl0oaHR0cHM6Ly9tYXJrZG93bi1pdC5naXRodWIuaW8vbWFya2Rvd24taXQvI01hcmtkb3duSXQucGFyc2UpLlxuICAgICovXG4gICAgcGFyc2UodGV4dCwgbWFya2Rvd25FbnYgPSB7fSkge1xuICAgICAgICBsZXQgc3RhdGUgPSBuZXcgTWFya2Rvd25QYXJzZVN0YXRlKHRoaXMuc2NoZW1hLCB0aGlzLnRva2VuSGFuZGxlcnMpLCBkb2M7XG4gICAgICAgIHN0YXRlLnBhcnNlVG9rZW5zKHRoaXMudG9rZW5pemVyLnBhcnNlKHRleHQsIG1hcmtkb3duRW52KSk7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRvYyA9IHN0YXRlLmNsb3NlTm9kZSgpO1xuICAgICAgICB9IHdoaWxlIChzdGF0ZS5zdGFjay5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gZG9jIHx8IHRoaXMuc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0SXNUaWdodCh0b2tlbnMsIGkpIHtcbiAgICB3aGlsZSAoKytpIDwgdG9rZW5zLmxlbmd0aClcbiAgICAgICAgaWYgKHRva2Vuc1tpXS50eXBlICE9IFwibGlzdF9pdGVtX29wZW5cIilcbiAgICAgICAgICAgIHJldHVybiB0b2tlbnNbaV0uaGlkZGVuO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuQSBwYXJzZXIgcGFyc2luZyB1bmV4dGVuZGVkIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSxcbndpdGhvdXQgaW5saW5lIEhUTUwsIGFuZCBwcm9kdWNpbmcgYSBkb2N1bWVudCBpbiB0aGUgYmFzaWMgc2NoZW1hLlxuKi9cbmNvbnN0IGRlZmF1bHRNYXJrZG93blBhcnNlciA9IG5ldyBNYXJrZG93blBhcnNlcihzY2hlbWEsIE1hcmtkb3duSXQoXCJjb21tb25tYXJrXCIsIHsgaHRtbDogZmFsc2UgfSksIHtcbiAgICBibG9ja3F1b3RlOiB7IGJsb2NrOiBcImJsb2NrcXVvdGVcIiB9LFxuICAgIHBhcmFncmFwaDogeyBibG9jazogXCJwYXJhZ3JhcGhcIiB9LFxuICAgIGxpc3RfaXRlbTogeyBibG9jazogXCJsaXN0X2l0ZW1cIiB9LFxuICAgIGJ1bGxldF9saXN0OiB7IGJsb2NrOiBcImJ1bGxldF9saXN0XCIsIGdldEF0dHJzOiAoXywgdG9rZW5zLCBpKSA9PiAoeyB0aWdodDogbGlzdElzVGlnaHQodG9rZW5zLCBpKSB9KSB9LFxuICAgIG9yZGVyZWRfbGlzdDogeyBibG9jazogXCJvcmRlcmVkX2xpc3RcIiwgZ2V0QXR0cnM6ICh0b2ssIHRva2VucywgaSkgPT4gKHtcbiAgICAgICAgICAgIG9yZGVyOiArdG9rLmF0dHJHZXQoXCJzdGFydFwiKSB8fCAxLFxuICAgICAgICAgICAgdGlnaHQ6IGxpc3RJc1RpZ2h0KHRva2VucywgaSlcbiAgICAgICAgfSkgfSxcbiAgICBoZWFkaW5nOiB7IGJsb2NrOiBcImhlYWRpbmdcIiwgZ2V0QXR0cnM6IHRvayA9PiAoeyBsZXZlbDogK3Rvay50YWcuc2xpY2UoMSkgfSkgfSxcbiAgICBjb2RlX2Jsb2NrOiB7IGJsb2NrOiBcImNvZGVfYmxvY2tcIiwgbm9DbG9zZVRva2VuOiB0cnVlIH0sXG4gICAgZmVuY2U6IHsgYmxvY2s6IFwiY29kZV9ibG9ja1wiLCBnZXRBdHRyczogdG9rID0+ICh7IHBhcmFtczogdG9rLmluZm8gfHwgXCJcIiB9KSwgbm9DbG9zZVRva2VuOiB0cnVlIH0sXG4gICAgaHI6IHsgbm9kZTogXCJob3Jpem9udGFsX3J1bGVcIiB9LFxuICAgIGltYWdlOiB7IG5vZGU6IFwiaW1hZ2VcIiwgZ2V0QXR0cnM6IHRvayA9PiAoe1xuICAgICAgICAgICAgc3JjOiB0b2suYXR0ckdldChcInNyY1wiKSxcbiAgICAgICAgICAgIHRpdGxlOiB0b2suYXR0ckdldChcInRpdGxlXCIpIHx8IG51bGwsXG4gICAgICAgICAgICBhbHQ6IHRvay5jaGlsZHJlblswXSAmJiB0b2suY2hpbGRyZW5bMF0uY29udGVudCB8fCBudWxsXG4gICAgICAgIH0pIH0sXG4gICAgaGFyZGJyZWFrOiB7IG5vZGU6IFwiaGFyZF9icmVha1wiIH0sXG4gICAgZW06IHsgbWFyazogXCJlbVwiIH0sXG4gICAgc3Ryb25nOiB7IG1hcms6IFwic3Ryb25nXCIgfSxcbiAgICBsaW5rOiB7IG1hcms6IFwibGlua1wiLCBnZXRBdHRyczogdG9rID0+ICh7XG4gICAgICAgICAgICBocmVmOiB0b2suYXR0ckdldChcImhyZWZcIiksXG4gICAgICAgICAgICB0aXRsZTogdG9rLmF0dHJHZXQoXCJ0aXRsZVwiKSB8fCBudWxsXG4gICAgICAgIH0pIH0sXG4gICAgY29kZV9pbmxpbmU6IHsgbWFyazogXCJjb2RlXCIsIG5vQ2xvc2VUb2tlbjogdHJ1ZSB9XG59KTtcblxuY29uc3QgYmxhbmtNYXJrID0geyBvcGVuOiBcIlwiLCBjbG9zZTogXCJcIiwgbWl4YWJsZTogdHJ1ZSB9O1xuLyoqXG5BIHNwZWNpZmljYXRpb24gZm9yIHNlcmlhbGl6aW5nIGEgUHJvc2VNaXJyb3IgZG9jdW1lbnQgYXNcbk1hcmtkb3duL0NvbW1vbk1hcmsgdGV4dC5cbiovXG5jbGFzcyBNYXJrZG93blNlcmlhbGl6ZXIge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHNlcmlhbGl6ZXIgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gVGhlIGBub2Rlc2BcbiAgICBvYmplY3Qgc2hvdWxkIG1hcCBub2RlIG5hbWVzIGluIGEgZ2l2ZW4gc2NoZW1hIHRvIGZ1bmN0aW9uIHRoYXRcbiAgICB0YWtlIGEgc2VyaWFsaXplciBzdGF0ZSBhbmQgc3VjaCBhIG5vZGUsIGFuZCBzZXJpYWxpemUgdGhlIG5vZGUuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbm9kZSBzZXJpYWxpemVyIGZ1bmN0aW9ucyBmb3IgdGhpcyBzZXJpYWxpemVyLlxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHNlcmlhbGl6ZXIgaW5mby5cbiAgICAqL1xuICAgIG1hcmtzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gbm9kZSB0b1xuICAgIFtDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKS5cbiAgICAqL1xuICAgIHNlcmlhbGl6ZShjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGxldCBzdGF0ZSA9IG5ldyBNYXJrZG93blNlcmlhbGl6ZXJTdGF0ZSh0aGlzLm5vZGVzLCB0aGlzLm1hcmtzLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUucmVuZGVyQ29udGVudChjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLm91dDtcbiAgICB9XG59XG4vKipcbkEgc2VyaWFsaXplciBmb3IgdGhlIFtiYXNpYyBzY2hlbWFdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEpLlxuKi9cbmNvbnN0IGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIgPSBuZXcgTWFya2Rvd25TZXJpYWxpemVyKHtcbiAgICBibG9ja3F1b3RlKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyYXBCbG9jayhcIj4gXCIsIG51bGwsIG5vZGUsICgpID0+IHN0YXRlLnJlbmRlckNvbnRlbnQobm9kZSkpO1xuICAgIH0sXG4gICAgY29kZV9ibG9jayhzdGF0ZSwgbm9kZSkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGZyb250IG1hdHRlciBmZW5jZXMgYXJlIGxvbmdlciB0aGFuIGFueSBkYXNoIHNlcXVlbmNlIHdpdGhpbiBpdFxuICAgICAgICBjb25zdCBiYWNrdGlja3MgPSBub2RlLnRleHRDb250ZW50Lm1hdGNoKC9gezMsfS9nbSk7XG4gICAgICAgIGNvbnN0IGZlbmNlID0gYmFja3RpY2tzID8gKGJhY2t0aWNrcy5zb3J0KCkuc2xpY2UoLTEpWzBdICsgXCJgXCIpIDogXCJgYGBcIjtcbiAgICAgICAgc3RhdGUud3JpdGUoZmVuY2UgKyAobm9kZS5hdHRycy5wYXJhbXMgfHwgXCJcIikgKyBcIlxcblwiKTtcbiAgICAgICAgc3RhdGUudGV4dChub2RlLnRleHRDb250ZW50LCBmYWxzZSk7XG4gICAgICAgIC8vIEFkZCBhIG5ld2xpbmUgdG8gdGhlIGN1cnJlbnQgY29udGVudCBiZWZvcmUgYWRkaW5nIGNsb3NpbmcgbWFya2VyXG4gICAgICAgIHN0YXRlLndyaXRlKFwiXFxuXCIpO1xuICAgICAgICBzdGF0ZS53cml0ZShmZW5jZSk7XG4gICAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBoZWFkaW5nKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLndyaXRlKHN0YXRlLnJlcGVhdChcIiNcIiwgbm9kZS5hdHRycy5sZXZlbCkgKyBcIiBcIik7XG4gICAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlLCBmYWxzZSk7XG4gICAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBob3Jpem9udGFsX3J1bGUoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUud3JpdGUobm9kZS5hdHRycy5tYXJrdXAgfHwgXCItLS1cIik7XG4gICAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBidWxsZXRfbGlzdChzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS5yZW5kZXJMaXN0KG5vZGUsIFwiICBcIiwgKCkgPT4gKG5vZGUuYXR0cnMuYnVsbGV0IHx8IFwiKlwiKSArIFwiIFwiKTtcbiAgICB9LFxuICAgIG9yZGVyZWRfbGlzdChzdGF0ZSwgbm9kZSkge1xuICAgICAgICBsZXQgc3RhcnQgPSBub2RlLmF0dHJzLm9yZGVyIHx8IDE7XG4gICAgICAgIGxldCBtYXhXID0gU3RyaW5nKHN0YXJ0ICsgbm9kZS5jaGlsZENvdW50IC0gMSkubGVuZ3RoO1xuICAgICAgICBsZXQgc3BhY2UgPSBzdGF0ZS5yZXBlYXQoXCIgXCIsIG1heFcgKyAyKTtcbiAgICAgICAgc3RhdGUucmVuZGVyTGlzdChub2RlLCBzcGFjZSwgaSA9PiB7XG4gICAgICAgICAgICBsZXQgblN0ciA9IFN0cmluZyhzdGFydCArIGkpO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnJlcGVhdChcIiBcIiwgbWF4VyAtIG5TdHIubGVuZ3RoKSArIG5TdHIgKyBcIi4gXCI7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgbGlzdF9pdGVtKHN0YXRlLCBub2RlKSB7XG4gICAgICAgIHN0YXRlLnJlbmRlckNvbnRlbnQobm9kZSk7XG4gICAgfSxcbiAgICBwYXJhZ3JhcGgoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUucmVuZGVySW5saW5lKG5vZGUpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaW1hZ2Uoc3RhdGUsIG5vZGUpIHtcbiAgICAgICAgc3RhdGUud3JpdGUoXCIhW1wiICsgc3RhdGUuZXNjKG5vZGUuYXR0cnMuYWx0IHx8IFwiXCIpICsgXCJdKFwiICsgbm9kZS5hdHRycy5zcmMucmVwbGFjZSgvW1xcKFxcKV0vZywgXCJcXFxcJCZcIikgK1xuICAgICAgICAgICAgKG5vZGUuYXR0cnMudGl0bGUgPyAnIFwiJyArIG5vZGUuYXR0cnMudGl0bGUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJyA6IFwiXCIpICsgXCIpXCIpO1xuICAgIH0sXG4gICAgaGFyZF9icmVhayhzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgICBmb3IgKGxldCBpID0gaW5kZXggKyAxOyBpIDwgcGFyZW50LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgICAgIGlmIChwYXJlbnQuY2hpbGQoaSkudHlwZSAhPSBub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS53cml0ZShcIlxcXFxcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgIH0sXG4gICAgdGV4dChzdGF0ZSwgbm9kZSkge1xuICAgICAgICBzdGF0ZS50ZXh0KG5vZGUudGV4dCwgIXN0YXRlLmluQXV0b2xpbmspO1xuICAgIH1cbn0sIHtcbiAgICBlbTogeyBvcGVuOiBcIipcIiwgY2xvc2U6IFwiKlwiLCBtaXhhYmxlOiB0cnVlLCBleHBlbEVuY2xvc2luZ1doaXRlc3BhY2U6IHRydWUgfSxcbiAgICBzdHJvbmc6IHsgb3BlbjogXCIqKlwiLCBjbG9zZTogXCIqKlwiLCBtaXhhYmxlOiB0cnVlLCBleHBlbEVuY2xvc2luZ1doaXRlc3BhY2U6IHRydWUgfSxcbiAgICBsaW5rOiB7XG4gICAgICAgIG9wZW4oc3RhdGUsIG1hcmssIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHN0YXRlLmluQXV0b2xpbmsgPSBpc1BsYWluVVJMKG1hcmssIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmluQXV0b2xpbmsgPyBcIjxcIiA6IFwiW1wiO1xuICAgICAgICB9LFxuICAgICAgICBjbG9zZShzdGF0ZSwgbWFyaywgcGFyZW50LCBpbmRleCkge1xuICAgICAgICAgICAgbGV0IHsgaW5BdXRvbGluayB9ID0gc3RhdGU7XG4gICAgICAgICAgICBzdGF0ZS5pbkF1dG9saW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGluQXV0b2xpbmsgPyBcIj5cIlxuICAgICAgICAgICAgICAgIDogXCJdKFwiICsgbWFyay5hdHRycy5ocmVmLnJlcGxhY2UoL1tcXChcXClcIl0vZywgXCJcXFxcJCZcIikgKyAobWFyay5hdHRycy50aXRsZSA/IGAgXCIke21hcmsuYXR0cnMudGl0bGUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYCA6IFwiXCIpICsgXCIpXCI7XG4gICAgICAgIH0sXG4gICAgICAgIG1peGFibGU6IHRydWVcbiAgICB9LFxuICAgIGNvZGU6IHsgb3Blbihfc3RhdGUsIF9tYXJrLCBwYXJlbnQsIGluZGV4KSB7IHJldHVybiBiYWNrdGlja3NGb3IocGFyZW50LmNoaWxkKGluZGV4KSwgLTEpOyB9LFxuICAgICAgICBjbG9zZShfc3RhdGUsIF9tYXJrLCBwYXJlbnQsIGluZGV4KSB7IHJldHVybiBiYWNrdGlja3NGb3IocGFyZW50LmNoaWxkKGluZGV4IC0gMSksIDEpOyB9LFxuICAgICAgICBlc2NhcGU6IGZhbHNlIH1cbn0pO1xuZnVuY3Rpb24gYmFja3RpY2tzRm9yKG5vZGUsIHNpZGUpIHtcbiAgICBsZXQgdGlja3MgPSAvYCsvZywgbSwgbGVuID0gMDtcbiAgICBpZiAobm9kZS5pc1RleHQpXG4gICAgICAgIHdoaWxlIChtID0gdGlja3MuZXhlYyhub2RlLnRleHQpKVxuICAgICAgICAgICAgbGVuID0gTWF0aC5tYXgobGVuLCBtWzBdLmxlbmd0aCk7XG4gICAgbGV0IHJlc3VsdCA9IGxlbiA+IDAgJiYgc2lkZSA+IDAgPyBcIiBgXCIgOiBcImBcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgICByZXN1bHQgKz0gXCJgXCI7XG4gICAgaWYgKGxlbiA+IDAgJiYgc2lkZSA8IDApXG4gICAgICAgIHJlc3VsdCArPSBcIiBcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNQbGFpblVSTChsaW5rLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgaWYgKGxpbmsuYXR0cnMudGl0bGUgfHwgIS9eXFx3KzovLnRlc3QobGluay5hdHRycy5ocmVmKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBjb250ZW50ID0gcGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICBpZiAoIWNvbnRlbnQuaXNUZXh0IHx8IGNvbnRlbnQudGV4dCAhPSBsaW5rLmF0dHJzLmhyZWYgfHwgY29udGVudC5tYXJrc1tjb250ZW50Lm1hcmtzLmxlbmd0aCAtIDFdICE9IGxpbmspXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaW5kZXggPT0gcGFyZW50LmNoaWxkQ291bnQgLSAxIHx8ICFsaW5rLmlzSW5TZXQocGFyZW50LmNoaWxkKGluZGV4ICsgMSkubWFya3MpO1xufVxuLyoqXG5UaGlzIGlzIGFuIG9iamVjdCB1c2VkIHRvIHRyYWNrIHN0YXRlIGFuZCBleHBvc2Vcbm1ldGhvZHMgcmVsYXRlZCB0byBtYXJrZG93biBzZXJpYWxpemF0aW9uLiBJbnN0YW5jZXMgYXJlIHBhc3NlZCB0b1xubm9kZSBhbmQgbWFyayBzZXJpYWxpemF0aW9uIG1ldGhvZHMgKHNlZSBgdG9NYXJrZG93bmApLlxuKi9cbmNsYXNzIE1hcmtkb3duU2VyaWFsaXplclN0YXRlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbm9kZXMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFya3MsIFxuICAgIC8qKlxuICAgIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgc2VyaWFsaXplci5cbiAgICAqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxpbSA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vdXQgPSBcIlwiO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2xvc2VkID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmluQXV0b2xpbmsgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmluVGlnaHRMaXN0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnRpZ2h0TGlzdHMgPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50aWdodExpc3RzID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmhhcmRCcmVha05vZGVOYW1lID09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaGFyZEJyZWFrTm9kZU5hbWUgPSBcImhhcmRfYnJlYWtcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBmbHVzaENsb3NlKHNpemUgPSAyKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF0QmxhbmsoKSlcbiAgICAgICAgICAgICAgICB0aGlzLm91dCArPSBcIlxcblwiO1xuICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlbGltTWluID0gdGhpcy5kZWxpbTtcbiAgICAgICAgICAgICAgICBsZXQgdHJpbSA9IC9cXHMrJC8uZXhlYyhkZWxpbU1pbik7XG4gICAgICAgICAgICAgICAgaWYgKHRyaW0pXG4gICAgICAgICAgICAgICAgICAgIGRlbGltTWluID0gZGVsaW1NaW4uc2xpY2UoMCwgZGVsaW1NaW4ubGVuZ3RoIC0gdHJpbVswXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dCArPSBkZWxpbU1pbiArIFwiXFxuXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXRNYXJrKG5hbWUpIHtcbiAgICAgICAgbGV0IGluZm8gPSB0aGlzLm1hcmtzW25hbWVdO1xuICAgICAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaWN0ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hcmsgdHlwZSBcXGAke25hbWV9XFxgIG5vdCBzdXBwb3J0ZWQgYnkgTWFya2Rvd24gcmVuZGVyZXJgKTtcbiAgICAgICAgICAgIGluZm8gPSBibGFua01hcms7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbmRlciBhIGJsb2NrLCBwcmVmaXhpbmcgZWFjaCBsaW5lIHdpdGggYGRlbGltYCwgYW5kIHRoZSBmaXJzdFxuICAgIGxpbmUgaW4gYGZpcnN0RGVsaW1gLiBgbm9kZWAgc2hvdWxkIGJlIHRoZSBub2RlIHRoYXQgaXMgY2xvc2VkIGF0XG4gICAgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIGFuZCBgZmAgaXMgYSBmdW5jdGlvbiB0aGF0IHJlbmRlcnMgdGhlXG4gICAgY29udGVudCBvZiB0aGUgYmxvY2suXG4gICAgKi9cbiAgICB3cmFwQmxvY2soZGVsaW0sIGZpcnN0RGVsaW0sIG5vZGUsIGYpIHtcbiAgICAgICAgbGV0IG9sZCA9IHRoaXMuZGVsaW07XG4gICAgICAgIHRoaXMud3JpdGUoZmlyc3REZWxpbSAhPSBudWxsID8gZmlyc3REZWxpbSA6IGRlbGltKTtcbiAgICAgICAgdGhpcy5kZWxpbSArPSBkZWxpbTtcbiAgICAgICAgZigpO1xuICAgICAgICB0aGlzLmRlbGltID0gb2xkO1xuICAgICAgICB0aGlzLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYXRCbGFuaygpIHtcbiAgICAgICAgcmV0dXJuIC8oXnxcXG4pJC8udGVzdCh0aGlzLm91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEVuc3VyZSB0aGUgY3VycmVudCBjb250ZW50IGVuZHMgd2l0aCBhIG5ld2xpbmUuXG4gICAgKi9cbiAgICBlbnN1cmVOZXdMaW5lKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXRCbGFuaygpKVxuICAgICAgICAgICAgdGhpcy5vdXQgKz0gXCJcXG5cIjtcbiAgICB9XG4gICAgLyoqXG4gICAgUHJlcGFyZSB0aGUgc3RhdGUgZm9yIHdyaXRpbmcgb3V0cHV0IChjbG9zaW5nIGNsb3NlZCBwYXJhZ3JhcGhzLFxuICAgIGFkZGluZyBkZWxpbWl0ZXJzLCBhbmQgc28gb24pLCBhbmQgdGhlbiBvcHRpb25hbGx5IGFkZCBjb250ZW50XG4gICAgKHVuZXNjYXBlZCkgdG8gdGhlIG91dHB1dC5cbiAgICAqL1xuICAgIHdyaXRlKGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5mbHVzaENsb3NlKCk7XG4gICAgICAgIGlmICh0aGlzLmRlbGltICYmIHRoaXMuYXRCbGFuaygpKVxuICAgICAgICAgICAgdGhpcy5vdXQgKz0gdGhpcy5kZWxpbTtcbiAgICAgICAgaWYgKGNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLm91dCArPSBjb250ZW50O1xuICAgIH1cbiAgICAvKipcbiAgICBDbG9zZSB0aGUgYmxvY2sgZm9yIHRoZSBnaXZlbiBub2RlLlxuICAgICovXG4gICAgY2xvc2VCbG9jayhub2RlKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBkb2N1bWVudC4gV2hlbiBlc2NhcGUgaXMgbm90IGBmYWxzZWAsXG4gICAgaXQgd2lsbCBiZSBlc2NhcGVkLlxuICAgICovXG4gICAgdGV4dCh0ZXh0LCBlc2NhcGUgPSB0cnVlKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGUoKTtcbiAgICAgICAgICAgIC8vIEVzY2FwZSBleGNsYW1hdGlvbiBtYXJrcyBpbiBmcm9udCBvZiBsaW5rc1xuICAgICAgICAgICAgaWYgKCFlc2NhcGUgJiYgbGluZXNbaV1bMF0gPT0gXCJbXCIgJiYgLyhefFteXFxcXF0pXFwhJC8udGVzdCh0aGlzLm91dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5vdXQgPSB0aGlzLm91dC5zbGljZSgwLCB0aGlzLm91dC5sZW5ndGggLSAxKSArIFwiXFxcXCFcIjtcbiAgICAgICAgICAgIHRoaXMub3V0ICs9IGVzY2FwZSA/IHRoaXMuZXNjKGxpbmVzW2ldLCB0aGlzLmF0QmxvY2tTdGFydCkgOiBsaW5lc1tpXTtcbiAgICAgICAgICAgIGlmIChpICE9IGxpbmVzLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgdGhpcy5vdXQgKz0gXCJcXG5cIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBSZW5kZXIgdGhlIGdpdmVuIG5vZGUgYXMgYSBibG9jay5cbiAgICAqL1xuICAgIHJlbmRlcihub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVzW25vZGUudHlwZS5uYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5ub2Rlc1tub2RlLnR5cGUubmFtZV0odGhpcywgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmljdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiB0eXBlIGBcIiArIG5vZGUudHlwZS5uYW1lICsgXCJgIG5vdCBzdXBwb3J0ZWQgYnkgTWFya2Rvd24gcmVuZGVyZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghbm9kZS50eXBlLmlzTGVhZikge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvbnRlbnQobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNCbG9jaylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZUJsb2NrKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbmRlciB0aGUgY29udGVudHMgb2YgYHBhcmVudGAgYXMgYmxvY2sgbm9kZXMuXG4gICAgKi9cbiAgICByZW5kZXJDb250ZW50KHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuZm9yRWFjaCgobm9kZSwgXywgaSkgPT4gdGhpcy5yZW5kZXIobm9kZSwgcGFyZW50LCBpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbmRlciB0aGUgY29udGVudHMgb2YgYHBhcmVudGAgYXMgaW5saW5lIGNvbnRlbnQuXG4gICAgKi9cbiAgICByZW5kZXJJbmxpbmUocGFyZW50LCBmcm9tQmxvY2tTdGFydCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmcm9tQmxvY2tTdGFydDtcbiAgICAgICAgbGV0IGFjdGl2ZSA9IFtdLCB0cmFpbGluZyA9IFwiXCI7XG4gICAgICAgIGxldCBwcm9ncmVzcyA9IChub2RlLCBvZmZzZXQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSBub2RlID8gbm9kZS5tYXJrcyA6IFtdO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIG1hcmtzIGZyb20gYGhhcmRfYnJlYWtgIHRoYXQgYXJlIHRoZSBsYXN0IG5vZGUgaW5zaWRlXG4gICAgICAgICAgICAvLyB0aGF0IG1hcmsgdG8gcHJldmVudCBwYXJzZXIgZWRnZSBjYXNlcyB3aXRoIG5ldyBsaW5lcyBqdXN0XG4gICAgICAgICAgICAvLyBiZWZvcmUgY2xvc2luZyBtYXJrcy5cbiAgICAgICAgICAgIGlmIChub2RlICYmIG5vZGUudHlwZS5uYW1lID09PSB0aGlzLm9wdGlvbnMuaGFyZEJyZWFrTm9kZU5hbWUpXG4gICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5maWx0ZXIobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPT0gcGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcGFyZW50LmNoaWxkKGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmlzSW5TZXQobmV4dC5tYXJrcykgJiYgKCFuZXh0LmlzVGV4dCB8fCAvXFxTLy50ZXN0KG5leHQudGV4dCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGxlYWRpbmcgPSB0cmFpbGluZztcbiAgICAgICAgICAgIHRyYWlsaW5nID0gXCJcIjtcbiAgICAgICAgICAgIC8vIElmIHdoaXRlc3BhY2UgaGFzIHRvIGJlIGV4cGVsbGVkIGZyb20gdGhlIG5vZGUsIGFkanVzdFxuICAgICAgICAgICAgLy8gbGVhZGluZyBhbmQgdHJhaWxpbmcgYWNjb3JkaW5nbHkuXG4gICAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLmlzVGV4dCAmJiBtYXJrcy5zb21lKG1hcmsgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gdGhpcy5nZXRNYXJrKG1hcmsudHlwZS5uYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLmV4cGVsRW5jbG9zaW5nV2hpdGVzcGFjZSAmJiAhbWFyay5pc0luU2V0KGFjdGl2ZSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGxldCBbXywgbGVhZCwgcmVzdF0gPSAvXihcXHMqKSguKikkL20uZXhlYyhub2RlLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWRpbmcgKz0gbGVhZDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHJlc3QgPyBub2RlLndpdGhUZXh0KHJlc3QpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBhY3RpdmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pc1RleHQgJiYgbWFya3Muc29tZShtYXJrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuZ2V0TWFyayhtYXJrLnR5cGUubmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZm8gJiYgaW5mby5leHBlbEVuY2xvc2luZ1doaXRlc3BhY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgKGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50IC0gMSB8fCAhbWFyay5pc0luU2V0KHBhcmVudC5jaGlsZChpbmRleCArIDEpLm1hcmtzKSk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGxldCBbXywgcmVzdCwgdHJhaWxdID0gL14oLio/KShcXHMqKSQvbS5leGVjKG5vZGUudGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJhaWw7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSByZXN0ID8gbm9kZS53aXRoVGV4dChyZXN0KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gYWN0aXZlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpbm5lciA9IG1hcmtzLmxlbmd0aCA/IG1hcmtzW21hcmtzLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICAgICAgICAgIGxldCBub0VzYyA9IGlubmVyICYmIHRoaXMuZ2V0TWFyayhpbm5lci50eXBlLm5hbWUpLmVzY2FwZSA9PT0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbGVuID0gbWFya3MubGVuZ3RoIC0gKG5vRXNjID8gMSA6IDApO1xuICAgICAgICAgICAgLy8gVHJ5IHRvIHJlb3JkZXIgJ21peGFibGUnIG1hcmtzLCBzdWNoIGFzIGVtIGFuZCBzdHJvbmcsIHdoaWNoXG4gICAgICAgICAgICAvLyBpbiBNYXJrZG93biBtYXkgYmUgb3BlbmVkIGFuZCBjbG9zZWQgaW4gZGlmZmVyZW50IG9yZGVyLCBzb1xuICAgICAgICAgICAgLy8gdGhhdCBvcmRlciBvZiB0aGUgbWFya3MgZm9yIHRoZSB0b2tlbiBtYXRjaGVzIHRoZSBvcmRlciBpblxuICAgICAgICAgICAgLy8gYWN0aXZlLlxuICAgICAgICAgICAgb3V0ZXI6IGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbWFyayA9IG1hcmtzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRNYXJrKG1hcmsudHlwZS5uYW1lKS5taXhhYmxlKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFjdGl2ZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBhY3RpdmVbal07XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRNYXJrKG90aGVyLnR5cGUubmFtZSkubWl4YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFyay5lcShvdGhlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gailcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLnNsaWNlKDAsIGopLmNvbmNhdChtYXJrKS5jb25jYXQobWFya3Muc2xpY2UoaiwgaSkpLmNvbmNhdChtYXJrcy5zbGljZShpICsgMSwgbGVuKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqID4gaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IG1hcmtzLnNsaWNlKDAsIGkpLmNvbmNhdChtYXJrcy5zbGljZShpICsgMSwgaikpLmNvbmNhdChtYXJrKS5jb25jYXQobWFya3Muc2xpY2UoaiwgbGVuKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHByZWZpeCBvZiB0aGUgbWFyayBzZXQgdGhhdCBkaWRuJ3QgY2hhbmdlXG4gICAgICAgICAgICBsZXQga2VlcCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoa2VlcCA8IE1hdGgubWluKGFjdGl2ZS5sZW5ndGgsIGxlbikgJiYgbWFya3Nba2VlcF0uZXEoYWN0aXZlW2tlZXBdKSlcbiAgICAgICAgICAgICAgICArK2tlZXA7XG4gICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWFya3MgdGhhdCBuZWVkIHRvIGJlIGNsb3NlZFxuICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRoaXMudGV4dCh0aGlzLm1hcmtTdHJpbmcoYWN0aXZlLnBvcCgpLCBmYWxzZSwgcGFyZW50LCBpbmRleCksIGZhbHNlKTtcbiAgICAgICAgICAgIC8vIE91dHB1dCBhbnkgcHJldmlvdXNseSBleHBlbGxlZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG91dHNpZGUgdGhlIG1hcmtzXG4gICAgICAgICAgICBpZiAobGVhZGluZylcbiAgICAgICAgICAgICAgICB0aGlzLnRleHQobGVhZGluZyk7XG4gICAgICAgICAgICAvLyBPcGVuIHRoZSBtYXJrcyB0aGF0IG5lZWQgdG8gYmUgb3BlbmVkXG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChhY3RpdmUubGVuZ3RoIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSBtYXJrc1thY3RpdmUubGVuZ3RoXTtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlLnB1c2goYWRkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0KHRoaXMubWFya1N0cmluZyhhZGQsIHRydWUsIHBhcmVudCwgaW5kZXgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgbm9kZS4gU3BlY2lhbCBjYXNlIGNvZGUgbWFya3MsIHNpbmNlIHRoZWlyIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAvLyBtYXkgbm90IGJlIGVzY2FwZWQuXG4gICAgICAgICAgICAgICAgaWYgKG5vRXNjICYmIG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQodGhpcy5tYXJrU3RyaW5nKGlubmVyLCB0cnVlLCBwYXJlbnQsIGluZGV4KSArIG5vZGUudGV4dCArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtTdHJpbmcoaW5uZXIsIGZhbHNlLCBwYXJlbnQsIGluZGV4ICsgMSksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZnRlciB0aGUgZmlyc3Qgbm9uLWVtcHR5IHRleHQgbm9kZSBpcyByZW5kZXJlZCwgdGhlIGVuZCBvZiBvdXRwdXRcbiAgICAgICAgICAgIC8vIGlzIG5vIGxvbmdlciBhdCBibG9jayBzdGFydC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBGSVhNRTogSWYgYSBub24tdGV4dCBub2RlIHdyaXRlcyBzb21ldGhpbmcgdG8gdGhlIG91dHB1dCBmb3IgdGhpc1xuICAgICAgICAgICAgLy8gYmxvY2ssIHRoZSBlbmQgb2Ygb3V0cHV0IGlzIGFsc28gbm8gbG9uZ2VyIGF0IGJsb2NrIHN0YXJ0LiBCdXQgaG93XG4gICAgICAgICAgICAvLyBjYW4gd2UgZGV0ZWN0IHRoYXQ/XG4gICAgICAgICAgICBpZiAoKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZS5pc1RleHQpICYmIG5vZGUubm9kZVNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdEJsb2NrU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcGFyZW50LmZvckVhY2gocHJvZ3Jlc3MpO1xuICAgICAgICBwcm9ncmVzcyhudWxsLCAwLCBwYXJlbnQuY2hpbGRDb3VudCk7XG4gICAgICAgIHRoaXMuYXRCbG9ja1N0YXJ0ID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbmRlciBhIG5vZGUncyBjb250ZW50IGFzIGEgbGlzdC4gYGRlbGltYCBzaG91bGQgYmUgdGhlIGV4dHJhXG4gICAgaW5kZW50YXRpb24gYWRkZWQgdG8gYWxsIGxpbmVzIGV4Y2VwdCB0aGUgZmlyc3QgaW4gYW4gaXRlbSxcbiAgICBgZmlyc3REZWxpbWAgaXMgYSBmdW5jdGlvbiBnb2luZyBmcm9tIGFuIGl0ZW0gaW5kZXggdG8gYVxuICAgIGRlbGltaXRlciBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGl0ZW0uXG4gICAgKi9cbiAgICByZW5kZXJMaXN0KG5vZGUsIGRlbGltLCBmaXJzdERlbGltKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCAmJiB0aGlzLmNsb3NlZC50eXBlID09IG5vZGUudHlwZSlcbiAgICAgICAgICAgIHRoaXMuZmx1c2hDbG9zZSgzKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5pblRpZ2h0TGlzdClcbiAgICAgICAgICAgIHRoaXMuZmx1c2hDbG9zZSgxKTtcbiAgICAgICAgbGV0IGlzVGlnaHQgPSB0eXBlb2Ygbm9kZS5hdHRycy50aWdodCAhPSBcInVuZGVmaW5lZFwiID8gbm9kZS5hdHRycy50aWdodCA6IHRoaXMub3B0aW9ucy50aWdodExpc3RzO1xuICAgICAgICBsZXQgcHJldlRpZ2h0ID0gdGhpcy5pblRpZ2h0TGlzdDtcbiAgICAgICAgdGhpcy5pblRpZ2h0TGlzdCA9IGlzVGlnaHQ7XG4gICAgICAgIG5vZGUuZm9yRWFjaCgoY2hpbGQsIF8sIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpICYmIGlzVGlnaHQpXG4gICAgICAgICAgICAgICAgdGhpcy5mbHVzaENsb3NlKDEpO1xuICAgICAgICAgICAgdGhpcy53cmFwQmxvY2soZGVsaW0sIGZpcnN0RGVsaW0oaSksIG5vZGUsICgpID0+IHRoaXMucmVuZGVyKGNoaWxkLCBub2RlLCBpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluVGlnaHRMaXN0ID0gcHJldlRpZ2h0O1xuICAgIH1cbiAgICAvKipcbiAgICBFc2NhcGUgdGhlIGdpdmVuIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBzYWZlbHkgYXBwZWFyIGluIE1hcmtkb3duXG4gICAgY29udGVudC4gSWYgYHN0YXJ0T2ZMaW5lYCBpcyB0cnVlLCBhbHNvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXRcbiAgICBoYXZlIHNwZWNpYWwgbWVhbmluZyBvbmx5IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS5cbiAgICAqL1xuICAgIGVzYyhzdHIsIHN0YXJ0T2ZMaW5lID0gZmFsc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1tgKlxcXFx+XFxbXFxdX10vZywgKG0sIGkpID0+IG0gPT0gXCJfXCIgJiYgaSA+IDAgJiYgaSArIDEgPCBzdHIubGVuZ3RoICYmIHN0cltpIC0gMV0ubWF0Y2goL1xcdy8pICYmIHN0cltpICsgMV0ubWF0Y2goL1xcdy8pID8gbSA6IFwiXFxcXFwiICsgbSk7XG4gICAgICAgIGlmIChzdGFydE9mTGluZSlcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9eKFxcK1sgXXxbXFwtKj5dKS8sIFwiXFxcXCQmXCIpLnJlcGxhY2UoL14oXFxzKikoI3sxLDZ9KShcXHN8JCkvLCAnJDFcXFxcJDIkMycpLnJlcGxhY2UoL14oXFxzKlxcZCspXFwuXFxzLywgXCIkMVxcXFwuIFwiKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lc2NhcGVFeHRyYUNoYXJhY3RlcnMpXG4gICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSh0aGlzLm9wdGlvbnMuZXNjYXBlRXh0cmFDaGFyYWN0ZXJzLCBcIlxcXFwkJlwiKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBxdW90ZShzdHIpIHtcbiAgICAgICAgbGV0IHdyYXAgPSBzdHIuaW5kZXhPZignXCInKSA9PSAtMSA/ICdcIlwiJyA6IHN0ci5pbmRleE9mKFwiJ1wiKSA9PSAtMSA/IFwiJydcIiA6IFwiKClcIjtcbiAgICAgICAgcmV0dXJuIHdyYXBbMF0gKyBzdHIgKyB3cmFwWzFdO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBlYXQgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgKi9cbiAgICByZXBlYXQoc3RyLCBuKSB7XG4gICAgICAgIGxldCBvdXQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKylcbiAgICAgICAgICAgIG91dCArPSBzdHI7XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbWFya2Rvd24gc3RyaW5nIGZvciBhIGdpdmVuIG9wZW5pbmcgb3IgY2xvc2luZyBtYXJrLlxuICAgICovXG4gICAgbWFya1N0cmluZyhtYXJrLCBvcGVuLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICAgIGxldCBpbmZvID0gdGhpcy5nZXRNYXJrKG1hcmsudHlwZS5uYW1lKTtcbiAgICAgICAgbGV0IHZhbHVlID0gb3BlbiA/IGluZm8ub3BlbiA6IGluZm8uY2xvc2U7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUodGhpcywgbWFyaywgcGFyZW50LCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gYSBzdHJpbmcuIFZhbHVlcyBvZlxuICAgIGxlYWRpbmcgb3IgdHJhaWxpbmcgcHJvcGVydHkgb2YgdGhlIHJldHVybiBvYmplY3Qgd2lsbCBiZSB1bmRlZmluZWRcbiAgICBpZiB0aGVyZSBpcyBubyBtYXRjaC5cbiAgICAqL1xuICAgIGdldEVuY2xvc2luZ1doaXRlc3BhY2UodGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVhZGluZzogKHRleHQubWF0Y2goL14oXFxzKykvKSB8fCBbdW5kZWZpbmVkXSlbMF0sXG4gICAgICAgICAgICB0cmFpbGluZzogKHRleHQubWF0Y2goLyhcXHMrKSQvKSB8fCBbdW5kZWZpbmVkXSlbMF1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IE1hcmtkb3duUGFyc2VyLCBNYXJrZG93blNlcmlhbGl6ZXIsIE1hcmtkb3duU2VyaWFsaXplclN0YXRlLCBkZWZhdWx0TWFya2Rvd25QYXJzZXIsIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIsIHNjaGVtYSB9O1xuIiwiaW1wb3J0IE9yZGVyZWRNYXAgZnJvbSAnb3JkZXJlZG1hcCc7XG5cbmZ1bmN0aW9uIGZpbmREaWZmU3RhcnQoYSwgYiwgcG9zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT0gYS5jaGlsZENvdW50IHx8IGkgPT0gYi5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIGEuY2hpbGRDb3VudCA9PSBiLmNoaWxkQ291bnQgPyBudWxsIDogcG9zO1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZChpKSwgY2hpbGRCID0gYi5jaGlsZChpKTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvcyArPSBjaGlsZEEubm9kZVNpemU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoaWxkQS5zYW1lTWFya3VwKGNoaWxkQikpXG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICBpZiAoY2hpbGRBLmlzVGV4dCAmJiBjaGlsZEEudGV4dCAhPSBjaGlsZEIudGV4dCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGNoaWxkQS50ZXh0W2pdID09IGNoaWxkQi50ZXh0W2pdOyBqKyspXG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZEEuY29udGVudC5zaXplIHx8IGNoaWxkQi5jb250ZW50LnNpemUpIHtcbiAgICAgICAgICAgIGxldCBpbm5lciA9IGZpbmREaWZmU3RhcnQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3MgKyAxKTtcbiAgICAgICAgICAgIGlmIChpbm5lciAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3MgKz0gY2hpbGRBLm5vZGVTaXplO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZpbmREaWZmRW5kKGEsIGIsIHBvc0EsIHBvc0IpIHtcbiAgICBmb3IgKGxldCBpQSA9IGEuY2hpbGRDb3VudCwgaUIgPSBiLmNoaWxkQ291bnQ7Oykge1xuICAgICAgICBpZiAoaUEgPT0gMCB8fCBpQiA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGlBID09IGlCID8gbnVsbCA6IHsgYTogcG9zQSwgYjogcG9zQiB9O1xuICAgICAgICBsZXQgY2hpbGRBID0gYS5jaGlsZCgtLWlBKSwgY2hpbGRCID0gYi5jaGlsZCgtLWlCKSwgc2l6ZSA9IGNoaWxkQS5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKGNoaWxkQSA9PSBjaGlsZEIpIHtcbiAgICAgICAgICAgIHBvc0EgLT0gc2l6ZTtcbiAgICAgICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRBLnNhbWVNYXJrdXAoY2hpbGRCKSlcbiAgICAgICAgICAgIHJldHVybiB7IGE6IHBvc0EsIGI6IHBvc0IgfTtcbiAgICAgICAgaWYgKGNoaWxkQS5pc1RleHQgJiYgY2hpbGRBLnRleHQgIT0gY2hpbGRCLnRleHQpIHtcbiAgICAgICAgICAgIGxldCBzYW1lID0gMCwgbWluU2l6ZSA9IE1hdGgubWluKGNoaWxkQS50ZXh0Lmxlbmd0aCwgY2hpbGRCLnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIHdoaWxlIChzYW1lIDwgbWluU2l6ZSAmJiBjaGlsZEEudGV4dFtjaGlsZEEudGV4dC5sZW5ndGggLSBzYW1lIC0gMV0gPT0gY2hpbGRCLnRleHRbY2hpbGRCLnRleHQubGVuZ3RoIC0gc2FtZSAtIDFdKSB7XG4gICAgICAgICAgICAgICAgc2FtZSsrO1xuICAgICAgICAgICAgICAgIHBvc0EtLTtcbiAgICAgICAgICAgICAgICBwb3NCLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBhOiBwb3NBLCBiOiBwb3NCIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkQS5jb250ZW50LnNpemUgfHwgY2hpbGRCLmNvbnRlbnQuc2l6ZSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZERpZmZFbmQoY2hpbGRBLmNvbnRlbnQsIGNoaWxkQi5jb250ZW50LCBwb3NBIC0gMSwgcG9zQiAtIDEpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBwb3NBIC09IHNpemU7XG4gICAgICAgIHBvc0IgLT0gc2l6ZTtcbiAgICB9XG59XG5cbi8qKlxuQSBmcmFnbWVudCByZXByZXNlbnRzIGEgbm9kZSdzIGNvbGxlY3Rpb24gb2YgY2hpbGQgbm9kZXMuXG5cbkxpa2Ugbm9kZXMsIGZyYWdtZW50cyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB5b3VcbnNob3VsZCBub3QgbXV0YXRlIHRoZW0gb3IgdGhlaXIgY29udGVudC4gUmF0aGVyLCB5b3UgY3JlYXRlIG5ld1xuaW5zdGFuY2VzIHdoZW5ldmVyIG5lZWRlZC4gVGhlIEFQSSB0cmllcyB0byBtYWtlIHRoaXMgZWFzeS5cbiovXG5jbGFzcyBGcmFnbWVudCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgY2hpbGQgbm9kZXMgaW4gdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIGNvbnRlbnQsIHNpemUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZSB8fCAwO1xuICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZSArPSBjb250ZW50W2ldLm5vZGVTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gdHdvXG4gICAgcG9zaXRpb25zIChyZWxhdGl2ZSB0byBzdGFydCBvZiB0aGlzIGZyYWdtZW50KS4gRG9lc24ndCBkZXNjZW5kXG4gICAgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgbm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBmLCBub2RlU3RhcnQgPSAwLCBwYXJlbnQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IHBvcyA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID4gZnJvbSAmJiBmKGNoaWxkLCBub2RlU3RhcnQgKyBwb3MsIHBhcmVudCB8fCBudWxsLCBpKSAhPT0gZmFsc2UgJiYgY2hpbGQuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zICsgMTtcbiAgICAgICAgICAgICAgICBjaGlsZC5ub2Rlc0JldHdlZW4oTWF0aC5tYXgoMCwgZnJvbSAtIHN0YXJ0KSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHN0YXJ0KSwgZiwgbm9kZVN0YXJ0ICsgc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGwgdGhlIGdpdmVuIGNhbGxiYWNrIGZvciBldmVyeSBkZXNjZW5kYW50IG5vZGUuIGBwb3NgIHdpbGwgYmVcbiAgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZyYWdtZW50LiBUaGUgY2FsbGJhY2sgbWF5IHJldHVyblxuICAgIGBmYWxzZWAgdG8gcHJldmVudCB0cmF2ZXJzYWwgb2YgYSBnaXZlbiBub2RlJ3MgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBkZXNjZW5kYW50cyhmKSB7XG4gICAgICAgIHRoaXMubm9kZXNCZXR3ZWVuKDAsIHRoaXMuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIEV4dHJhY3QgdGhlIHRleHQgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuIFNlZSB0aGUgc2FtZSBtZXRob2Qgb25cbiAgICBbYE5vZGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS50ZXh0QmV0d2VlbikuXG4gICAgKi9cbiAgICB0ZXh0QmV0d2Vlbihmcm9tLCB0bywgYmxvY2tTZXBhcmF0b3IsIGxlYWZUZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIiwgZmlyc3QgPSB0cnVlO1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICAgICAgbGV0IG5vZGVUZXh0ID0gbm9kZS5pc1RleHQgPyBub2RlLnRleHQuc2xpY2UoTWF0aC5tYXgoZnJvbSwgcG9zKSAtIHBvcywgdG8gLSBwb3MpXG4gICAgICAgICAgICAgICAgOiAhbm9kZS5pc0xlYWYgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgIDogbGVhZlRleHQgPyAodHlwZW9mIGxlYWZUZXh0ID09PSBcImZ1bmN0aW9uXCIgPyBsZWFmVGV4dChub2RlKSA6IGxlYWZUZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBub2RlLnR5cGUuc3BlYy5sZWFmVGV4dCA/IG5vZGUudHlwZS5zcGVjLmxlYWZUZXh0KG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNCbG9jayAmJiAobm9kZS5pc0xlYWYgJiYgbm9kZVRleHQgfHwgbm9kZS5pc1RleHRibG9jaykgJiYgYmxvY2tTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IGJsb2NrU2VwYXJhdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGV4dCArPSBub2RlVGV4dDtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgY29tYmluZWQgY29udGVudCBvZiB0aGlzXG4gICAgZnJhZ21lbnQgYW5kIHRoZSBvdGhlci5cbiAgICAqL1xuICAgIGFwcGVuZChvdGhlcikge1xuICAgICAgICBpZiAoIW90aGVyLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLnNpemUpXG4gICAgICAgICAgICByZXR1cm4gb3RoZXI7XG4gICAgICAgIGxldCBsYXN0ID0gdGhpcy5sYXN0Q2hpbGQsIGZpcnN0ID0gb3RoZXIuZmlyc3RDaGlsZCwgY29udGVudCA9IHRoaXMuY29udGVudC5zbGljZSgpLCBpID0gMDtcbiAgICAgICAgaWYgKGxhc3QuaXNUZXh0ICYmIGxhc3Quc2FtZU1hcmt1cChmaXJzdCkpIHtcbiAgICAgICAgICAgIGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9IGxhc3Qud2l0aFRleHQobGFzdC50ZXh0ICsgZmlyc3QudGV4dCk7XG4gICAgICAgICAgICBpID0gMTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IG90aGVyLmNvbnRlbnQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjb250ZW50LnB1c2gob3RoZXIuY29udGVudFtpXSk7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoY29udGVudCwgdGhpcy5zaXplICsgb3RoZXIuc2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHN1Yi1mcmFnbWVudCBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gcG9zaXRpb25zLlxuICAgICovXG4gICAgY3V0KGZyb20sIHRvID0gdGhpcy5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXSwgc2l6ZSA9IDA7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcG9zID0gMDsgcG9zIDwgdG87IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXSwgZW5kID0gcG9zICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICAgICAgaWYgKGVuZCA+IGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IGZyb20gfHwgZW5kID4gdG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc1RleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5jdXQoTWF0aC5tYXgoMCwgZnJvbSAtIHBvcyksIE1hdGgubWluKGNoaWxkLnRleHQubGVuZ3RoLCB0byAtIHBvcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KE1hdGgubWF4KDAsIGZyb20gLSBwb3MgLSAxKSwgTWF0aC5taW4oY2hpbGQuY29udGVudC5zaXplLCB0byAtIHBvcyAtIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBvcyA9IGVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChyZXN1bHQsIHNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGN1dEJ5SW5kZXgoZnJvbSwgdG8pIHtcbiAgICAgICAgaWYgKGZyb20gPT0gdG8pXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHRoaXMuY29udGVudC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBuZXcgZnJhZ21lbnQgaW4gd2hpY2ggdGhlIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4IGlzXG4gICAgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5vZGUuXG4gICAgKi9cbiAgICByZXBsYWNlQ2hpbGQoaW5kZXgsIG5vZGUpIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmNvbnRlbnRbaW5kZXhdO1xuICAgICAgICBpZiAoY3VycmVudCA9PSBub2RlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGxldCBjb3B5ID0gdGhpcy5jb250ZW50LnNsaWNlKCk7XG4gICAgICAgIGxldCBzaXplID0gdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSAtIGN1cnJlbnQubm9kZVNpemU7XG4gICAgICAgIGNvcHlbaW5kZXhdID0gbm9kZTtcbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb3B5LCBzaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGJ5IHByZXBlbmRpbmcgdGhlIGdpdmVuIG5vZGUgdG8gdGhpc1xuICAgIGZyYWdtZW50LlxuICAgICovXG4gICAgYWRkVG9TdGFydChub2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQoW25vZGVdLmNvbmNhdCh0aGlzLmNvbnRlbnQpLCB0aGlzLnNpemUgKyBub2RlLm5vZGVTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IGZyYWdtZW50IGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4gbm9kZSB0byB0aGlzXG4gICAgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBhZGRUb0VuZChub2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJhZ21lbnQodGhpcy5jb250ZW50LmNvbmNhdChub2RlKSwgdGhpcy5zaXplICsgbm9kZS5ub2RlU2l6ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbXBhcmUgdGhpcyBmcmFnbWVudCB0byBhbm90aGVyIG9uZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQubGVuZ3RoICE9IG90aGVyLmNvbnRlbnQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50W2ldLmVxKG90aGVyLmNvbnRlbnRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgZnJhZ21lbnQsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cbiAgICAqL1xuICAgIGdldCBmaXJzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudFswXSA6IG51bGw7IH1cbiAgICAvKipcbiAgICBUaGUgbGFzdCBjaGlsZCBvZiB0aGUgZnJhZ21lbnQsIG9yIGBudWxsYCBpZiBpdCBpcyBlbXB0eS5cbiAgICAqL1xuICAgIGdldCBsYXN0Q2hpbGQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoID8gdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSA6IG51bGw7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkIG5vZGVzIGluIHRoaXMgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBnZXQgY2hpbGRDb3VudCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGg7IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNoaWxkIG5vZGUgYXQgdGhlIGdpdmVuIGluZGV4LiBSYWlzZSBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMuY29udGVudFtpbmRleF07XG4gICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IFwiICsgaW5kZXggKyBcIiBvdXQgb2YgcmFuZ2UgZm9yIFwiICsgdGhpcyk7XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50W2luZGV4XSB8fCBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBDYWxsIGBmYCBmb3IgZXZlcnkgY2hpbGQgbm9kZSwgcGFzc2luZyB0aGUgbm9kZSwgaXRzIG9mZnNldFxuICAgIGludG8gdGhpcyBwYXJlbnQgbm9kZSwgYW5kIGl0cyBpbmRleC5cbiAgICAqL1xuICAgIGZvckVhY2goZikge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgcCA9IDA7IGkgPCB0aGlzLmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY29udGVudFtpXTtcbiAgICAgICAgICAgIGYoY2hpbGQsIHAsIGkpO1xuICAgICAgICAgICAgcCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCB0aGlzIGZyYWdtZW50IGFuZCBhbm90aGVyXG4gICAgZnJhZ21lbnQgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmUgdGhlIHNhbWUuXG4gICAgKi9cbiAgICBmaW5kRGlmZlN0YXJ0KG90aGVyLCBwb3MgPSAwKSB7XG4gICAgICAgIHJldHVybiBmaW5kRGlmZlN0YXJ0KHRoaXMsIG90aGVyLCBwb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBmaXJzdCBwb3NpdGlvbiwgc2VhcmNoaW5nIGZyb20gdGhlIGVuZCwgYXQgd2hpY2ggdGhpc1xuICAgIGZyYWdtZW50IGFuZCB0aGUgZ2l2ZW4gZnJhZ21lbnQgZGlmZmVyLCBvciBgbnVsbGAgaWYgdGhleSBhcmVcbiAgICB0aGUgc2FtZS4gU2luY2UgdGhpcyBwb3NpdGlvbiB3aWxsIG5vdCBiZSB0aGUgc2FtZSBpbiBib3RoXG4gICAgbm9kZXMsIGFuIG9iamVjdCB3aXRoIHR3byBzZXBhcmF0ZSBwb3NpdGlvbnMgaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBmaW5kRGlmZkVuZChvdGhlciwgcG9zID0gdGhpcy5zaXplLCBvdGhlclBvcyA9IG90aGVyLnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmREaWZmRW5kKHRoaXMsIG90aGVyLCBwb3MsIG90aGVyUG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgaW5kZXggYW5kIGlubmVyIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gcmVsYXRpdmVcbiAgICBwb3NpdGlvbiBpbiB0aGlzIGZyYWdtZW50LiBUaGUgcmVzdWx0IG9iamVjdCB3aWxsIGJlIHJldXNlZFxuICAgIChvdmVyd3JpdHRlbikgdGhlIG5leHQgdGltZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGZpbmRJbmRleChwb3MsIHJvdW5kID0gLTEpIHtcbiAgICAgICAgaWYgKHBvcyA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KDAsIHBvcyk7XG4gICAgICAgIGlmIChwb3MgPT0gdGhpcy5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KHRoaXMuY29udGVudC5sZW5ndGgsIHBvcyk7XG4gICAgICAgIGlmIChwb3MgPiB0aGlzLnNpemUgfHwgcG9zIDwgMClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBQb3NpdGlvbiAke3Bvc30gb3V0c2lkZSBvZiBmcmFnbWVudCAoJHt0aGlzfSlgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGN1clBvcyA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkKGkpLCBlbmQgPSBjdXJQb3MgKyBjdXIubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoZW5kID49IHBvcykge1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPT0gcG9zIHx8IHJvdW5kID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldEluZGV4KGkgKyAxLCBlbmQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRJbmRleChpLCBjdXJQb3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIGRlYnVnZ2luZyBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhpcyBmcmFnbWVudC5cbiAgICAqL1xuICAgIHRvU3RyaW5nKCkgeyByZXR1cm4gXCI8XCIgKyB0aGlzLnRvU3RyaW5nSW5uZXIoKSArIFwiPlwiOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZ0lubmVyKCkgeyByZXR1cm4gdGhpcy5jb250ZW50LmpvaW4oXCIsIFwiKTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIEpTT04tc2VyaWFsaXplYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGZyYWdtZW50LlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50Lmxlbmd0aCA/IHRoaXMuY29udGVudC5tYXAobiA9PiBuLnRvSlNPTigpKSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgZnJhZ21lbnQgZnJvbSBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZW1wdHk7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEZyYWdtZW50LmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEZyYWdtZW50KHZhbHVlLm1hcChzY2hlbWEubm9kZUZyb21KU09OKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgZnJhZ21lbnQgZnJvbSBhbiBhcnJheSBvZiBub2Rlcy4gRW5zdXJlcyB0aGF0IGFkamFjZW50XG4gICAgdGV4dCBub2RlcyB3aXRoIHRoZSBzYW1lIG1hcmtzIGFyZSBqb2luZWQgdG9nZXRoZXIuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUFycmF5KGFycmF5KSB7XG4gICAgICAgIGlmICghYXJyYXkubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBsZXQgam9pbmVkLCBzaXplID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIHNpemUgKz0gbm9kZS5ub2RlU2l6ZTtcbiAgICAgICAgICAgIGlmIChpICYmIG5vZGUuaXNUZXh0ICYmIGFycmF5W2kgLSAxXS5zYW1lTWFya3VwKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2luZWQpXG4gICAgICAgICAgICAgICAgICAgIGpvaW5lZCA9IGFycmF5LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgIGpvaW5lZFtqb2luZWQubGVuZ3RoIC0gMV0gPSBub2RlXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGV4dChqb2luZWRbam9pbmVkLmxlbmd0aCAtIDFdLnRleHQgKyBub2RlLnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoam9pbmVkKSB7XG4gICAgICAgICAgICAgICAgam9pbmVkLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChqb2luZWQgfHwgYXJyYXksIHNpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBmcmFnbWVudCBmcm9tIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhXG4gICAgc2V0IG9mIG5vZGVzLiBGb3IgYG51bGxgLCBpdCByZXR1cm5zIHRoZSBlbXB0eSBmcmFnbWVudC4gRm9yIGFcbiAgICBmcmFnbWVudCwgdGhlIGZyYWdtZW50IGl0c2VsZi4gRm9yIGEgbm9kZSBvciBhcnJheSBvZiBub2RlcywgYVxuICAgIGZyYWdtZW50IGNvbnRhaW5pbmcgdGhvc2Ugbm9kZXMuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbShub2Rlcykge1xuICAgICAgICBpZiAoIW5vZGVzKVxuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmVtcHR5O1xuICAgICAgICBpZiAobm9kZXMgaW5zdGFuY2VvZiBGcmFnbWVudClcbiAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUFycmF5KG5vZGVzKTtcbiAgICAgICAgaWYgKG5vZGVzLmF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGcmFnbWVudChbbm9kZXNdLCBub2Rlcy5ub2RlU2l6ZSk7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2FuIG5vdCBjb252ZXJ0IFwiICsgbm9kZXMgKyBcIiB0byBhIEZyYWdtZW50XCIgK1xuICAgICAgICAgICAgKG5vZGVzLm5vZGVzQmV0d2VlbiA/IFwiIChsb29rcyBsaWtlIG11bHRpcGxlIHZlcnNpb25zIG9mIHByb3NlbWlycm9yLW1vZGVsIHdlcmUgbG9hZGVkKVwiIDogXCJcIikpO1xuICAgIH1cbn1cbi8qKlxuQW4gZW1wdHkgZnJhZ21lbnQuIEludGVuZGVkIHRvIGJlIHJldXNlZCB3aGVuZXZlciBhIG5vZGUgZG9lc24ndFxuY29udGFpbiBhbnl0aGluZyAocmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBmcmFnbWVudCBmb3JcbmVhY2ggbGVhZiBub2RlKS5cbiovXG5GcmFnbWVudC5lbXB0eSA9IG5ldyBGcmFnbWVudChbXSwgMCk7XG5jb25zdCBmb3VuZCA9IHsgaW5kZXg6IDAsIG9mZnNldDogMCB9O1xuZnVuY3Rpb24gcmV0SW5kZXgoaW5kZXgsIG9mZnNldCkge1xuICAgIGZvdW5kLmluZGV4ID0gaW5kZXg7XG4gICAgZm91bmQub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIHJldHVybiBmb3VuZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZURlZXAoYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIShhICYmIHR5cGVvZiBhID09IFwib2JqZWN0XCIpIHx8XG4gICAgICAgICEoYiAmJiB0eXBlb2YgYiA9PSBcIm9iamVjdFwiKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBhcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYikgIT0gYXJyYXkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVEZWVwKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IHAgaW4gYSlcbiAgICAgICAgICAgIGlmICghKHAgaW4gYikgfHwgIWNvbXBhcmVEZWVwKGFbcF0sIGJbcF0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBiKVxuICAgICAgICAgICAgaWYgKCEocCBpbiBhKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbkEgbWFyayBpcyBhIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIGEgbm9kZSxcbnN1Y2ggYXMgaXQgYmVpbmcgZW1waGFzaXplZCwgaW4gY29kZSBmb250LCBvciBhIGxpbmsuIEl0IGhhcyBhXG50eXBlIGFuZCBvcHRpb25hbGx5IGEgc2V0IG9mIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGZ1cnRoZXJcbmluZm9ybWF0aW9uIChzdWNoIGFzIHRoZSB0YXJnZXQgb2YgdGhlIGxpbmspLiBNYXJrcyBhcmUgY3JlYXRlZFxudGhyb3VnaCBhIGBTY2hlbWFgLCB3aGljaCBjb250cm9scyB3aGljaCB0eXBlcyBleGlzdCBhbmQgd2hpY2hcbmF0dHJpYnV0ZXMgdGhleSBoYXZlLlxuKi9cbmNsYXNzIE1hcmsge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHR5cGUgb2YgdGhpcyBtYXJrLlxuICAgICovXG4gICAgdHlwZSwgXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFyay5cbiAgICAqL1xuICAgIGF0dHJzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICB9XG4gICAgLyoqXG4gICAgR2l2ZW4gYSBzZXQgb2YgbWFya3MsIGNyZWF0ZSBhIG5ldyBzZXQgd2hpY2ggY29udGFpbnMgdGhpcyBvbmUgYXNcbiAgICB3ZWxsLCBpbiB0aGUgcmlnaHQgcG9zaXRpb24uIElmIHRoaXMgbWFyayBpcyBhbHJlYWR5IGluIHRoZSBzZXQsXG4gICAgdGhlIHNldCBpdHNlbGYgaXMgcmV0dXJuZWQuIElmIGFueSBtYXJrcyB0aGF0IGFyZSBzZXQgdG8gYmVcbiAgICBbZXhjbHVzaXZlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMuZXhjbHVkZXMpIHdpdGggdGhpcyBtYXJrIGFyZSBwcmVzZW50LFxuICAgIHRob3NlIGFyZSByZXBsYWNlZCBieSB0aGlzIG9uZS5cbiAgICAqL1xuICAgIGFkZFRvU2V0KHNldCkge1xuICAgICAgICBsZXQgY29weSwgcGxhY2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgb3RoZXIgPSBzZXRbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5lcShvdGhlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUuZXhjbHVkZXMob3RoZXIudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBzZXQuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvdGhlci50eXBlLmV4Y2x1ZGVzKHRoaXMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwbGFjZWQgJiYgb3RoZXIudHlwZS5yYW5rID4gdGhpcy50eXBlLnJhbmspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb3B5KVxuICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IHNldC5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgY29weS5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29weSlcbiAgICAgICAgICAgICAgICAgICAgY29weS5wdXNoKG90aGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICBjb3B5ID0gc2V0LnNsaWNlKCk7XG4gICAgICAgIGlmICghcGxhY2VkKVxuICAgICAgICAgICAgY29weS5wdXNoKHRoaXMpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIHRoaXMgbWFyayBmcm9tIHRoZSBnaXZlbiBzZXQsIHJldHVybmluZyBhIG5ldyBzZXQuIElmIHRoaXNcbiAgICBtYXJrIGlzIG5vdCBpbiB0aGUgc2V0LCB0aGUgc2V0IGl0c2VsZiBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIHJlbW92ZUZyb21TZXQoc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHRoaXMuZXEoc2V0W2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0LnNsaWNlKDAsIGkpLmNvbmNhdChzZXQuc2xpY2UoaSArIDEpKTtcbiAgICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoaXMgbWFyayBpcyBpbiB0aGUgZ2l2ZW4gc2V0IG9mIG1hcmtzLlxuICAgICovXG4gICAgaXNJblNldChzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAodGhpcy5lcShzZXRbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0aGlzIG1hcmsgaGFzIHRoZSBzYW1lIHR5cGUgYW5kIGF0dHJpYnV0ZXMgYXNcbiAgICBhbm90aGVyIG1hcmsuXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKHRoaXMudHlwZSA9PSBvdGhlci50eXBlICYmIGNvbXBhcmVEZWVwKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgdGhpcyBtYXJrIHRvIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgb2JqID0geyB0eXBlOiB0aGlzLnR5cGUubmFtZSB9O1xuICAgICAgICBmb3IgKGxldCBfIGluIHRoaXMuYXR0cnMpIHtcbiAgICAgICAgICAgIG9iai5hdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgICAvKipcbiAgICBEZXNlcmlhbGl6ZSBhIG1hcmsgZnJvbSBKU09OLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIE1hcmsuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCB0eXBlID0gc2NoZW1hLm1hcmtzW2pzb24udHlwZV07XG4gICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSBpcyBubyBtYXJrIHR5cGUgJHtqc29uLnR5cGV9IGluIHRoaXMgc2NoZW1hYCk7XG4gICAgICAgIGxldCBtYXJrID0gdHlwZS5jcmVhdGUoanNvbi5hdHRycyk7XG4gICAgICAgIHR5cGUuY2hlY2tBdHRycyhtYXJrLmF0dHJzKTtcbiAgICAgICAgcmV0dXJuIG1hcms7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0d28gc2V0cyBvZiBtYXJrcyBhcmUgaWRlbnRpY2FsLlxuICAgICovXG4gICAgc3RhdGljIHNhbWVTZXQoYSwgYikge1xuICAgICAgICBpZiAoYSA9PSBiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFhW2ldLmVxKGJbaV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIHByb3Blcmx5IHNvcnRlZCBtYXJrIHNldCBmcm9tIG51bGwsIGEgc2luZ2xlIG1hcmssIG9yIGFuXG4gICAgdW5zb3J0ZWQgYXJyYXkgb2YgbWFya3MuXG4gICAgKi9cbiAgICBzdGF0aWMgc2V0RnJvbShtYXJrcykge1xuICAgICAgICBpZiAoIW1hcmtzIHx8IEFycmF5LmlzQXJyYXkobWFya3MpICYmIG1hcmtzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIE1hcmsubm9uZTtcbiAgICAgICAgaWYgKG1hcmtzIGluc3RhbmNlb2YgTWFyaylcbiAgICAgICAgICAgIHJldHVybiBbbWFya3NdO1xuICAgICAgICBsZXQgY29weSA9IG1hcmtzLnNsaWNlKCk7XG4gICAgICAgIGNvcHkuc29ydCgoYSwgYikgPT4gYS50eXBlLnJhbmsgLSBiLnR5cGUucmFuayk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBtYXJrcy5cbiovXG5NYXJrLm5vbmUgPSBbXTtcblxuLyoqXG5FcnJvciB0eXBlIHJhaXNlZCBieSBbYE5vZGUucmVwbGFjZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnJlcGxhY2UpIHdoZW5cbmdpdmVuIGFuIGludmFsaWQgcmVwbGFjZW1lbnQuXG4qL1xuY2xhc3MgUmVwbGFjZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xufVxuLypcblJlcGxhY2VFcnJvciA9IGZ1bmN0aW9uKHRoaXM6IGFueSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gIGxldCBlcnIgPSBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpXG4gIDsoZXJyIGFzIGFueSkuX19wcm90b19fID0gUmVwbGFjZUVycm9yLnByb3RvdHlwZVxuICByZXR1cm4gZXJyXG59IGFzIGFueVxuXG5SZXBsYWNlRXJyb3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpXG5SZXBsYWNlRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVwbGFjZUVycm9yXG5SZXBsYWNlRXJyb3IucHJvdG90eXBlLm5hbWUgPSBcIlJlcGxhY2VFcnJvclwiXG4qL1xuLyoqXG5BIHNsaWNlIHJlcHJlc2VudHMgYSBwaWVjZSBjdXQgb3V0IG9mIGEgbGFyZ2VyIGRvY3VtZW50LiBJdFxuc3RvcmVzIG5vdCBvbmx5IGEgZnJhZ21lbnQsIGJ1dCBhbHNvIHRoZSBkZXB0aCB1cCB0byB3aGljaCBub2RlcyBvblxuYm90aCBzaWRlIGFyZSDigJhvcGVu4oCZIChjdXQgdGhyb3VnaCkuXG4qL1xuY2xhc3MgU2xpY2Uge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHNsaWNlLiBXaGVuIHNwZWNpZnlpbmcgYSBub24temVybyBvcGVuIGRlcHRoLCB5b3UgbXVzdFxuICAgIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBub2RlcyBvZiBhdCBsZWFzdCB0aGF0IGRlcHRoIGF0IHRoZVxuICAgIGFwcHJvcHJpYXRlIHNpZGUgb2YgdGhlIGZyYWdtZW504oCUaS5lLiBpZiB0aGUgZnJhZ21lbnQgaXMgYW5cbiAgICBlbXB0eSBwYXJhZ3JhcGggbm9kZSwgYG9wZW5TdGFydGAgYW5kIGBvcGVuRW5kYCBjYW4ndCBiZSBncmVhdGVyXG4gICAgdGhhbiAxLlxuICAgIFxuICAgIEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBjb250ZW50IG9mIG9wZW4gbm9kZXMgdG8gY29uZm9ybSB0b1xuICAgIHRoZSBzY2hlbWEncyBjb250ZW50IGNvbnN0cmFpbnRzLCB0aG91Z2ggaXQgc2hvdWxkIGJlIGEgdmFsaWRcbiAgICBzdGFydC9lbmQvbWlkZGxlIGZvciBzdWNoIGEgbm9kZSwgZGVwZW5kaW5nIG9uIHdoaWNoIHNpZGVzIGFyZVxuICAgIG9wZW4uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc2xpY2UncyBjb250ZW50LlxuICAgICovXG4gICAgY29udGVudCwgXG4gICAgLyoqXG4gICAgVGhlIG9wZW4gZGVwdGggYXQgdGhlIHN0YXJ0IG9mIHRoZSBmcmFnbWVudC5cbiAgICAqL1xuICAgIG9wZW5TdGFydCwgXG4gICAgLyoqXG4gICAgVGhlIG9wZW4gZGVwdGggYXQgdGhlIGVuZC5cbiAgICAqL1xuICAgIG9wZW5FbmQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5vcGVuU3RhcnQgPSBvcGVuU3RhcnQ7XG4gICAgICAgIHRoaXMub3BlbkVuZCA9IG9wZW5FbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzaXplIHRoaXMgc2xpY2Ugd291bGQgYWRkIHdoZW4gaW5zZXJ0ZWQgaW50byBhIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuc2l6ZSAtIHRoaXMub3BlblN0YXJ0IC0gdGhpcy5vcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGluc2VydEF0KHBvcywgZnJhZ21lbnQpIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBpbnNlcnRJbnRvKHRoaXMuY29udGVudCwgcG9zICsgdGhpcy5vcGVuU3RhcnQsIGZyYWdtZW50KTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQgJiYgbmV3IFNsaWNlKGNvbnRlbnQsIHRoaXMub3BlblN0YXJ0LCB0aGlzLm9wZW5FbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHJlbW92ZUJldHdlZW4oZnJvbSwgdG8pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShyZW1vdmVSYW5nZSh0aGlzLmNvbnRlbnQsIGZyb20gKyB0aGlzLm9wZW5TdGFydCwgdG8gKyB0aGlzLm9wZW5TdGFydCksIHRoaXMub3BlblN0YXJ0LCB0aGlzLm9wZW5FbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0cyB3aGV0aGVyIHRoaXMgc2xpY2UgaXMgZXF1YWwgdG8gYW5vdGhlciBzbGljZS5cbiAgICAqL1xuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZXEob3RoZXIuY29udGVudCkgJiYgdGhpcy5vcGVuU3RhcnQgPT0gb3RoZXIub3BlblN0YXJ0ICYmIHRoaXMub3BlbkVuZCA9PSBvdGhlci5vcGVuRW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50ICsgXCIoXCIgKyB0aGlzLm9wZW5TdGFydCArIFwiLFwiICsgdGhpcy5vcGVuRW5kICsgXCIpXCI7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbnZlcnQgYSBzbGljZSB0byBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBqc29uID0geyBjb250ZW50OiB0aGlzLmNvbnRlbnQudG9KU09OKCkgfTtcbiAgICAgICAgaWYgKHRoaXMub3BlblN0YXJ0ID4gMClcbiAgICAgICAgICAgIGpzb24ub3BlblN0YXJ0ID0gdGhpcy5vcGVuU3RhcnQ7XG4gICAgICAgIGlmICh0aGlzLm9wZW5FbmQgPiAwKVxuICAgICAgICAgICAganNvbi5vcGVuRW5kID0gdGhpcy5vcGVuRW5kO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBzbGljZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24pXG4gICAgICAgICAgICByZXR1cm4gU2xpY2UuZW1wdHk7XG4gICAgICAgIGxldCBvcGVuU3RhcnQgPSBqc29uLm9wZW5TdGFydCB8fCAwLCBvcGVuRW5kID0ganNvbi5vcGVuRW5kIHx8IDA7XG4gICAgICAgIGlmICh0eXBlb2Ygb3BlblN0YXJ0ICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIG9wZW5FbmQgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU2xpY2UuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbUpTT04oc2NoZW1hLCBqc29uLmNvbnRlbnQpLCBvcGVuU3RhcnQsIG9wZW5FbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzbGljZSBmcm9tIGEgZnJhZ21lbnQgYnkgdGFraW5nIHRoZSBtYXhpbXVtIHBvc3NpYmxlXG4gICAgb3BlbiB2YWx1ZSBvbiBib3RoIHNpZGUgb2YgdGhlIGZyYWdtZW50LlxuICAgICovXG4gICAgc3RhdGljIG1heE9wZW4oZnJhZ21lbnQsIG9wZW5Jc29sYXRpbmcgPSB0cnVlKSB7XG4gICAgICAgIGxldCBvcGVuU3RhcnQgPSAwLCBvcGVuRW5kID0gMDtcbiAgICAgICAgZm9yIChsZXQgbiA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7IG4gJiYgIW4uaXNMZWFmICYmIChvcGVuSXNvbGF0aW5nIHx8ICFuLnR5cGUuc3BlYy5pc29sYXRpbmcpOyBuID0gbi5maXJzdENoaWxkKVxuICAgICAgICAgICAgb3BlblN0YXJ0Kys7XG4gICAgICAgIGZvciAobGV0IG4gPSBmcmFnbWVudC5sYXN0Q2hpbGQ7IG4gJiYgIW4uaXNMZWFmICYmIChvcGVuSXNvbGF0aW5nIHx8ICFuLnR5cGUuc3BlYy5pc29sYXRpbmcpOyBuID0gbi5sYXN0Q2hpbGQpXG4gICAgICAgICAgICBvcGVuRW5kKys7XG4gICAgICAgIHJldHVybiBuZXcgU2xpY2UoZnJhZ21lbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgfVxufVxuLyoqXG5UaGUgZW1wdHkgc2xpY2UuXG4qL1xuU2xpY2UuZW1wdHkgPSBuZXcgU2xpY2UoRnJhZ21lbnQuZW1wdHksIDAsIDApO1xuZnVuY3Rpb24gcmVtb3ZlUmFuZ2UoY29udGVudCwgZnJvbSwgdG8pIHtcbiAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBjb250ZW50LmZpbmRJbmRleChmcm9tKSwgY2hpbGQgPSBjb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgIGxldCB7IGluZGV4OiBpbmRleFRvLCBvZmZzZXQ6IG9mZnNldFRvIH0gPSBjb250ZW50LmZpbmRJbmRleCh0byk7XG4gICAgaWYgKG9mZnNldCA9PSBmcm9tIHx8IGNoaWxkLmlzVGV4dCkge1xuICAgICAgICBpZiAob2Zmc2V0VG8gIT0gdG8gJiYgIWNvbnRlbnQuY2hpbGQoaW5kZXhUbykuaXNUZXh0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSZW1vdmluZyBub24tZmxhdCByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQuY3V0KDAsIGZyb20pLmFwcGVuZChjb250ZW50LmN1dCh0bykpO1xuICAgIH1cbiAgICBpZiAoaW5kZXggIT0gaW5kZXhUbylcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJSZW1vdmluZyBub24tZmxhdCByYW5nZVwiKTtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGNoaWxkLmNvcHkocmVtb3ZlUmFuZ2UoY2hpbGQuY29udGVudCwgZnJvbSAtIG9mZnNldCAtIDEsIHRvIC0gb2Zmc2V0IC0gMSkpKTtcbn1cbmZ1bmN0aW9uIGluc2VydEludG8oY29udGVudCwgZGlzdCwgaW5zZXJ0LCBwYXJlbnQpIHtcbiAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBjb250ZW50LmZpbmRJbmRleChkaXN0KSwgY2hpbGQgPSBjb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgIGlmIChvZmZzZXQgPT0gZGlzdCB8fCBjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgaWYgKHBhcmVudCAmJiAhcGFyZW50LmNhblJlcGxhY2UoaW5kZXgsIGluZGV4LCBpbnNlcnQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBjb250ZW50LmN1dCgwLCBkaXN0KS5hcHBlbmQoaW5zZXJ0KS5hcHBlbmQoY29udGVudC5jdXQoZGlzdCkpO1xuICAgIH1cbiAgICBsZXQgaW5uZXIgPSBpbnNlcnRJbnRvKGNoaWxkLmNvbnRlbnQsIGRpc3QgLSBvZmZzZXQgLSAxLCBpbnNlcnQpO1xuICAgIHJldHVybiBpbm5lciAmJiBjb250ZW50LnJlcGxhY2VDaGlsZChpbmRleCwgY2hpbGQuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gcmVwbGFjZSgkZnJvbSwgJHRvLCBzbGljZSkge1xuICAgIGlmIChzbGljZS5vcGVuU3RhcnQgPiAkZnJvbS5kZXB0aClcbiAgICAgICAgdGhyb3cgbmV3IFJlcGxhY2VFcnJvcihcIkluc2VydGVkIGNvbnRlbnQgZGVlcGVyIHRoYW4gaW5zZXJ0aW9uIHBvc2l0aW9uXCIpO1xuICAgIGlmICgkZnJvbS5kZXB0aCAtIHNsaWNlLm9wZW5TdGFydCAhPSAkdG8uZGVwdGggLSBzbGljZS5vcGVuRW5kKVxuICAgICAgICB0aHJvdyBuZXcgUmVwbGFjZUVycm9yKFwiSW5jb25zaXN0ZW50IG9wZW4gZGVwdGhzXCIpO1xuICAgIHJldHVybiByZXBsYWNlT3V0ZXIoJGZyb20sICR0bywgc2xpY2UsIDApO1xufVxuZnVuY3Rpb24gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCBkZXB0aCkge1xuICAgIGxldCBpbmRleCA9ICRmcm9tLmluZGV4KGRlcHRoKSwgbm9kZSA9ICRmcm9tLm5vZGUoZGVwdGgpO1xuICAgIGlmIChpbmRleCA9PSAkdG8uaW5kZXgoZGVwdGgpICYmIGRlcHRoIDwgJGZyb20uZGVwdGggLSBzbGljZS5vcGVuU3RhcnQpIHtcbiAgICAgICAgbGV0IGlubmVyID0gcmVwbGFjZU91dGVyKCRmcm9tLCAkdG8sIHNsaWNlLCBkZXB0aCArIDEpO1xuICAgICAgICByZXR1cm4gbm9kZS5jb3B5KG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQoaW5kZXgsIGlubmVyKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFzbGljZS5jb250ZW50LnNpemUpIHtcbiAgICAgICAgcmV0dXJuIGNsb3NlKG5vZGUsIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXNsaWNlLm9wZW5TdGFydCAmJiAhc2xpY2Uub3BlbkVuZCAmJiAkZnJvbS5kZXB0aCA9PSBkZXB0aCAmJiAkdG8uZGVwdGggPT0gZGVwdGgpIHsgLy8gU2ltcGxlLCBmbGF0IGNhc2VcbiAgICAgICAgbGV0IHBhcmVudCA9ICRmcm9tLnBhcmVudCwgY29udGVudCA9IHBhcmVudC5jb250ZW50O1xuICAgICAgICByZXR1cm4gY2xvc2UocGFyZW50LCBjb250ZW50LmN1dCgwLCAkZnJvbS5wYXJlbnRPZmZzZXQpLmFwcGVuZChzbGljZS5jb250ZW50KS5hcHBlbmQoY29udGVudC5jdXQoJHRvLnBhcmVudE9mZnNldCkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IHByZXBhcmVTbGljZUZvclJlcGxhY2Uoc2xpY2UsICRmcm9tKTtcbiAgICAgICAgcmV0dXJuIGNsb3NlKG5vZGUsIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgc3RhcnQsIGVuZCwgJHRvLCBkZXB0aCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrSm9pbihtYWluLCBzdWIpIHtcbiAgICBpZiAoIXN1Yi50eXBlLmNvbXBhdGlibGVDb250ZW50KG1haW4udHlwZSkpXG4gICAgICAgIHRocm93IG5ldyBSZXBsYWNlRXJyb3IoXCJDYW5ub3Qgam9pbiBcIiArIHN1Yi50eXBlLm5hbWUgKyBcIiBvbnRvIFwiICsgbWFpbi50eXBlLm5hbWUpO1xufVxuZnVuY3Rpb24gam9pbmFibGUoJGJlZm9yZSwgJGFmdGVyLCBkZXB0aCkge1xuICAgIGxldCBub2RlID0gJGJlZm9yZS5ub2RlKGRlcHRoKTtcbiAgICBjaGVja0pvaW4obm9kZSwgJGFmdGVyLm5vZGUoZGVwdGgpKTtcbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGFkZE5vZGUoY2hpbGQsIHRhcmdldCkge1xuICAgIGxldCBsYXN0ID0gdGFyZ2V0Lmxlbmd0aCAtIDE7XG4gICAgaWYgKGxhc3QgPj0gMCAmJiBjaGlsZC5pc1RleHQgJiYgY2hpbGQuc2FtZU1hcmt1cCh0YXJnZXRbbGFzdF0pKVxuICAgICAgICB0YXJnZXRbbGFzdF0gPSBjaGlsZC53aXRoVGV4dCh0YXJnZXRbbGFzdF0udGV4dCArIGNoaWxkLnRleHQpO1xuICAgIGVsc2VcbiAgICAgICAgdGFyZ2V0LnB1c2goY2hpbGQpO1xufVxuZnVuY3Rpb24gYWRkUmFuZ2UoJHN0YXJ0LCAkZW5kLCBkZXB0aCwgdGFyZ2V0KSB7XG4gICAgbGV0IG5vZGUgPSAoJGVuZCB8fCAkc3RhcnQpLm5vZGUoZGVwdGgpO1xuICAgIGxldCBzdGFydEluZGV4ID0gMCwgZW5kSW5kZXggPSAkZW5kID8gJGVuZC5pbmRleChkZXB0aCkgOiBub2RlLmNoaWxkQ291bnQ7XG4gICAgaWYgKCRzdGFydCkge1xuICAgICAgICBzdGFydEluZGV4ID0gJHN0YXJ0LmluZGV4KGRlcHRoKTtcbiAgICAgICAgaWYgKCRzdGFydC5kZXB0aCA+IGRlcHRoKSB7XG4gICAgICAgICAgICBzdGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJHN0YXJ0LnRleHRPZmZzZXQpIHtcbiAgICAgICAgICAgIGFkZE5vZGUoJHN0YXJ0Lm5vZGVBZnRlciwgdGFyZ2V0KTtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspXG4gICAgICAgIGFkZE5vZGUobm9kZS5jaGlsZChpKSwgdGFyZ2V0KTtcbiAgICBpZiAoJGVuZCAmJiAkZW5kLmRlcHRoID09IGRlcHRoICYmICRlbmQudGV4dE9mZnNldClcbiAgICAgICAgYWRkTm9kZSgkZW5kLm5vZGVCZWZvcmUsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBjbG9zZShub2RlLCBjb250ZW50KSB7XG4gICAgbm9kZS50eXBlLmNoZWNrQ29udGVudChjb250ZW50KTtcbiAgICByZXR1cm4gbm9kZS5jb3B5KGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gcmVwbGFjZVRocmVlV2F5KCRmcm9tLCAkc3RhcnQsICRlbmQsICR0bywgZGVwdGgpIHtcbiAgICBsZXQgb3BlblN0YXJ0ID0gJGZyb20uZGVwdGggPiBkZXB0aCAmJiBqb2luYWJsZSgkZnJvbSwgJHN0YXJ0LCBkZXB0aCArIDEpO1xuICAgIGxldCBvcGVuRW5kID0gJHRvLmRlcHRoID4gZGVwdGggJiYgam9pbmFibGUoJGVuZCwgJHRvLCBkZXB0aCArIDEpO1xuICAgIGxldCBjb250ZW50ID0gW107XG4gICAgYWRkUmFuZ2UobnVsbCwgJGZyb20sIGRlcHRoLCBjb250ZW50KTtcbiAgICBpZiAob3BlblN0YXJ0ICYmIG9wZW5FbmQgJiYgJHN0YXJ0LmluZGV4KGRlcHRoKSA9PSAkZW5kLmluZGV4KGRlcHRoKSkge1xuICAgICAgICBjaGVja0pvaW4ob3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgYWRkTm9kZShjbG9zZShvcGVuU3RhcnQsIHJlcGxhY2VUaHJlZVdheSgkZnJvbSwgJHN0YXJ0LCAkZW5kLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChvcGVuU3RhcnQpXG4gICAgICAgICAgICBhZGROb2RlKGNsb3NlKG9wZW5TdGFydCwgcmVwbGFjZVR3b1dheSgkZnJvbSwgJHN0YXJ0LCBkZXB0aCArIDEpKSwgY29udGVudCk7XG4gICAgICAgIGFkZFJhbmdlKCRzdGFydCwgJGVuZCwgZGVwdGgsIGNvbnRlbnQpO1xuICAgICAgICBpZiAob3BlbkVuZClcbiAgICAgICAgICAgIGFkZE5vZGUoY2xvc2Uob3BlbkVuZCwgcmVwbGFjZVR3b1dheSgkZW5kLCAkdG8sIGRlcHRoICsgMSkpLCBjb250ZW50KTtcbiAgICB9XG4gICAgYWRkUmFuZ2UoJHRvLCBudWxsLCBkZXB0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIG5ldyBGcmFnbWVudChjb250ZW50KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGgpIHtcbiAgICBsZXQgY29udGVudCA9IFtdO1xuICAgIGFkZFJhbmdlKG51bGwsICRmcm9tLCBkZXB0aCwgY29udGVudCk7XG4gICAgaWYgKCRmcm9tLmRlcHRoID4gZGVwdGgpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBqb2luYWJsZSgkZnJvbSwgJHRvLCBkZXB0aCArIDEpO1xuICAgICAgICBhZGROb2RlKGNsb3NlKHR5cGUsIHJlcGxhY2VUd29XYXkoJGZyb20sICR0bywgZGVwdGggKyAxKSksIGNvbnRlbnQpO1xuICAgIH1cbiAgICBhZGRSYW5nZSgkdG8sIG51bGwsIGRlcHRoLCBjb250ZW50KTtcbiAgICByZXR1cm4gbmV3IEZyYWdtZW50KGNvbnRlbnQpO1xufVxuZnVuY3Rpb24gcHJlcGFyZVNsaWNlRm9yUmVwbGFjZShzbGljZSwgJGFsb25nKSB7XG4gICAgbGV0IGV4dHJhID0gJGFsb25nLmRlcHRoIC0gc2xpY2Uub3BlblN0YXJ0LCBwYXJlbnQgPSAkYWxvbmcubm9kZShleHRyYSk7XG4gICAgbGV0IG5vZGUgPSBwYXJlbnQuY29weShzbGljZS5jb250ZW50KTtcbiAgICBmb3IgKGxldCBpID0gZXh0cmEgLSAxOyBpID49IDA7IGktLSlcbiAgICAgICAgbm9kZSA9ICRhbG9uZy5ub2RlKGkpLmNvcHkoRnJhZ21lbnQuZnJvbShub2RlKSk7XG4gICAgcmV0dXJuIHsgc3RhcnQ6IG5vZGUucmVzb2x2ZU5vQ2FjaGUoc2xpY2Uub3BlblN0YXJ0ICsgZXh0cmEpLFxuICAgICAgICBlbmQ6IG5vZGUucmVzb2x2ZU5vQ2FjaGUobm9kZS5jb250ZW50LnNpemUgLSBzbGljZS5vcGVuRW5kIC0gZXh0cmEpIH07XG59XG5cbi8qKlxuWW91IGNhbiBbX3Jlc29sdmVfXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZS5yZXNvbHZlKSBhIHBvc2l0aW9uIHRvIGdldCBtb3JlXG5pbmZvcm1hdGlvbiBhYm91dCBpdC4gT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBzdWNoIGFcbnJlc29sdmVkIHBvc2l0aW9uLCBwcm92aWRpbmcgdmFyaW91cyBwaWVjZXMgb2YgY29udGV4dFxuaW5mb3JtYXRpb24sIGFuZCBzb21lIGhlbHBlciBtZXRob2RzLlxuXG5UaHJvdWdob3V0IHRoaXMgaW50ZXJmYWNlLCBtZXRob2RzIHRoYXQgdGFrZSBhbiBvcHRpb25hbCBgZGVwdGhgXG5wYXJhbWV0ZXIgd2lsbCBpbnRlcnByZXQgdW5kZWZpbmVkIGFzIGB0aGlzLmRlcHRoYCBhbmQgbmVnYXRpdmVcbm51bWJlcnMgYXMgYHRoaXMuZGVwdGggKyB2YWx1ZWAuXG4qL1xuY2xhc3MgUmVzb2x2ZWRQb3Mge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIHRoYXQgd2FzIHJlc29sdmVkLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHBhdGgsIFxuICAgIC8qKlxuICAgIFRoZSBvZmZzZXQgdGhpcyBwb3NpdGlvbiBoYXMgaW50byBpdHMgcGFyZW50IG5vZGUuXG4gICAgKi9cbiAgICBwYXJlbnRPZmZzZXQpIHtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0gcGFyZW50T2Zmc2V0O1xuICAgICAgICB0aGlzLmRlcHRoID0gcGF0aC5sZW5ndGggLyAzIC0gMTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZXNvbHZlRGVwdGgodmFsKSB7XG4gICAgICAgIGlmICh2YWwgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcHRoO1xuICAgICAgICBpZiAodmFsIDwgMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcHRoICsgdmFsO1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgcGFyZW50IG5vZGUgdGhhdCB0aGUgcG9zaXRpb24gcG9pbnRzIGludG8uIE5vdGUgdGhhdCBldmVuIGlmXG4gICAgYSBwb3NpdGlvbiBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgdGhhdCBub2RlIGlzIG5vdCBjb25zaWRlcmVkXG4gICAgdGhlIHBhcmVudOKAlHRleHQgbm9kZXMgYXJlIOKAmGZsYXTigJkgaW4gdGhpcyBtb2RlbCwgYW5kIGhhdmUgbm8gY29udGVudC5cbiAgICAqL1xuICAgIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLm5vZGUodGhpcy5kZXB0aCk7IH1cbiAgICAvKipcbiAgICBUaGUgcm9vdCBub2RlIGluIHdoaWNoIHRoZSBwb3NpdGlvbiB3YXMgcmVzb2x2ZWQuXG4gICAgKi9cbiAgICBnZXQgZG9jKCkgeyByZXR1cm4gdGhpcy5ub2RlKDApOyB9XG4gICAgLyoqXG4gICAgVGhlIGFuY2VzdG9yIG5vZGUgYXQgdGhlIGdpdmVuIGxldmVsLiBgcC5ub2RlKHAuZGVwdGgpYCBpcyB0aGVcbiAgICBzYW1lIGFzIGBwLnBhcmVudGAuXG4gICAgKi9cbiAgICBub2RlKGRlcHRoKSB7IHJldHVybiB0aGlzLnBhdGhbdGhpcy5yZXNvbHZlRGVwdGgoZGVwdGgpICogM107IH1cbiAgICAvKipcbiAgICBUaGUgaW5kZXggaW50byB0aGUgYW5jZXN0b3IgYXQgdGhlIGdpdmVuIGxldmVsLiBJZiB0aGlzIHBvaW50c1xuICAgIGF0IHRoZSAzcmQgbm9kZSBpbiB0aGUgMm5kIHBhcmFncmFwaCBvbiB0aGUgdG9wIGxldmVsLCBmb3JcbiAgICBleGFtcGxlLCBgcC5pbmRleCgwKWAgaXMgMSBhbmQgYHAuaW5kZXgoMSlgIGlzIDIuXG4gICAgKi9cbiAgICBpbmRleChkZXB0aCkgeyByZXR1cm4gdGhpcy5wYXRoW3RoaXMucmVzb2x2ZURlcHRoKGRlcHRoKSAqIDMgKyAxXTsgfVxuICAgIC8qKlxuICAgIFRoZSBpbmRleCBwb2ludGluZyBhZnRlciB0aGlzIHBvc2l0aW9uIGludG8gdGhlIGFuY2VzdG9yIGF0IHRoZVxuICAgIGdpdmVuIGxldmVsLlxuICAgICovXG4gICAgaW5kZXhBZnRlcihkZXB0aCkge1xuICAgICAgICBkZXB0aCA9IHRoaXMucmVzb2x2ZURlcHRoKGRlcHRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXgoZGVwdGgpICsgKGRlcHRoID09IHRoaXMuZGVwdGggJiYgIXRoaXMudGV4dE9mZnNldCA/IDAgOiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIChhYnNvbHV0ZSkgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBub2RlIGF0IHRoZSBnaXZlblxuICAgIGxldmVsLlxuICAgICovXG4gICAgc3RhcnQoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSAwID8gMCA6IHRoaXMucGF0aFtkZXB0aCAqIDMgLSAxXSArIDE7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSAoYWJzb2x1dGUpIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIG5vZGUgYXQgdGhlIGdpdmVuXG4gICAgbGV2ZWwuXG4gICAgKi9cbiAgICBlbmQoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0KGRlcHRoKSArIHRoaXMubm9kZShkZXB0aCkuY29udGVudC5zaXplO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBkaXJlY3RseSBiZWZvcmUgdGhlIHdyYXBwaW5nIG5vZGUgYXQgdGhlXG4gICAgZ2l2ZW4gbGV2ZWwsIG9yLCB3aGVuIGBkZXB0aGAgaXMgYHRoaXMuZGVwdGggKyAxYCwgdGhlIG9yaWdpbmFsXG4gICAgcG9zaXRpb24uXG4gICAgKi9cbiAgICBiZWZvcmUoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZXJlIGlzIG5vIHBvc2l0aW9uIGJlZm9yZSB0aGUgdG9wLWxldmVsIG5vZGVcIik7XG4gICAgICAgIHJldHVybiBkZXB0aCA9PSB0aGlzLmRlcHRoICsgMSA/IHRoaXMucG9zIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgKGFic29sdXRlKSBwb3NpdGlvbiBkaXJlY3RseSBhZnRlciB0aGUgd3JhcHBpbmcgbm9kZSBhdCB0aGVcbiAgICBnaXZlbiBsZXZlbCwgb3IgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHdoZW4gYGRlcHRoYCBpcyBgdGhpcy5kZXB0aCArIDFgLlxuICAgICovXG4gICAgYWZ0ZXIoZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGlmICghZGVwdGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZXJlIGlzIG5vIHBvc2l0aW9uIGFmdGVyIHRoZSB0b3AtbGV2ZWwgbm9kZVwiKTtcbiAgICAgICAgcmV0dXJuIGRlcHRoID09IHRoaXMuZGVwdGggKyAxID8gdGhpcy5wb3MgOiB0aGlzLnBhdGhbZGVwdGggKiAzIC0gMV0gKyB0aGlzLnBhdGhbZGVwdGggKiAzXS5ub2RlU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgV2hlbiB0aGlzIHBvc2l0aW9uIHBvaW50cyBpbnRvIGEgdGV4dCBub2RlLCB0aGlzIHJldHVybnMgdGhlXG4gICAgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9zaXRpb24gYW5kIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBub2RlLlxuICAgIFdpbGwgYmUgemVybyBmb3IgcG9zaXRpb25zIHRoYXQgcG9pbnQgYmV0d2VlbiBub2Rlcy5cbiAgICAqL1xuICAgIGdldCB0ZXh0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5wb3MgLSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBub2RlIGRpcmVjdGx5IGFmdGVyIHRoZSBwb3NpdGlvbiwgaWYgYW55LiBJZiB0aGUgcG9zaXRpb25cbiAgICBwb2ludHMgaW50byBhIHRleHQgbm9kZSwgb25seSB0aGUgcGFydCBvZiB0aGF0IG5vZGUgYWZ0ZXIgdGhlXG4gICAgcG9zaXRpb24gaXMgcmV0dXJuZWQuXG4gICAgKi9cbiAgICBnZXQgbm9kZUFmdGVyKCkge1xuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQsIGluZGV4ID0gdGhpcy5pbmRleCh0aGlzLmRlcHRoKTtcbiAgICAgICAgaWYgKGluZGV4ID09IHBhcmVudC5jaGlsZENvdW50KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkT2ZmID0gdGhpcy5wb3MgLSB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdLCBjaGlsZCA9IHBhcmVudC5jaGlsZChpbmRleCk7XG4gICAgICAgIHJldHVybiBkT2ZmID8gcGFyZW50LmNoaWxkKGluZGV4KS5jdXQoZE9mZikgOiBjaGlsZDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBub2RlIGRpcmVjdGx5IGJlZm9yZSB0aGUgcG9zaXRpb24sIGlmIGFueS4gSWYgdGhlXG4gICAgcG9zaXRpb24gcG9pbnRzIGludG8gYSB0ZXh0IG5vZGUsIG9ubHkgdGhlIHBhcnQgb2YgdGhhdCBub2RlXG4gICAgYmVmb3JlIHRoZSBwb3NpdGlvbiBpcyByZXR1cm5lZC5cbiAgICAqL1xuICAgIGdldCBub2RlQmVmb3JlKCkge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmluZGV4KHRoaXMuZGVwdGgpO1xuICAgICAgICBsZXQgZE9mZiA9IHRoaXMucG9zIC0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGRPZmYpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuY2hpbGQoaW5kZXgpLmN1dCgwLCBkT2ZmKTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID09IDAgPyBudWxsIDogdGhpcy5wYXJlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBwb3NpdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIHBhcmVudCBub2RlIGF0IHRoZVxuICAgIGdpdmVuIGRlcHRoICh3aGljaCBkZWZhdWx0cyB0byBgdGhpcy5kZXB0aGApLlxuICAgICovXG4gICAgcG9zQXRJbmRleChpbmRleCwgZGVwdGgpIHtcbiAgICAgICAgZGVwdGggPSB0aGlzLnJlc29sdmVEZXB0aChkZXB0aCk7XG4gICAgICAgIGxldCBub2RlID0gdGhpcy5wYXRoW2RlcHRoICogM10sIHBvcyA9IGRlcHRoID09IDAgPyAwIDogdGhpcy5wYXRoW2RlcHRoICogMyAtIDFdICsgMTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKVxuICAgICAgICAgICAgcG9zICs9IG5vZGUuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbWFya3MgYXQgdGhpcyBwb3NpdGlvbiwgZmFjdG9yaW5nIGluIHRoZSBzdXJyb3VuZGluZ1xuICAgIG1hcmtzJyBbYGluY2x1c2l2ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5pbmNsdXNpdmUpIHByb3BlcnR5LiBJZiB0aGVcbiAgICBwb3NpdGlvbiBpcyBhdCB0aGUgc3RhcnQgb2YgYSBub24tZW1wdHkgbm9kZSwgdGhlIG1hcmtzIG9mIHRoZVxuICAgIG5vZGUgYWZ0ZXIgaXQgKGlmIGFueSkgYXJlIHJldHVybmVkLlxuICAgICovXG4gICAgbWFya3MoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudCwgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICAgIC8vIEluIGFuIGVtcHR5IHBhcmVudCwgcmV0dXJuIHRoZSBlbXB0eSBhcnJheVxuICAgICAgICBpZiAocGFyZW50LmNvbnRlbnQuc2l6ZSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIE1hcmsubm9uZTtcbiAgICAgICAgLy8gV2hlbiBpbnNpZGUgYSB0ZXh0IG5vZGUsIGp1c3QgcmV0dXJuIHRoZSB0ZXh0IG5vZGUncyBtYXJrc1xuICAgICAgICBpZiAodGhpcy50ZXh0T2Zmc2V0KVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jaGlsZChpbmRleCkubWFya3M7XG4gICAgICAgIGxldCBtYWluID0gcGFyZW50Lm1heWJlQ2hpbGQoaW5kZXggLSAxKSwgb3RoZXIgPSBwYXJlbnQubWF5YmVDaGlsZChpbmRleCk7XG4gICAgICAgIC8vIElmIHRoZSBgYWZ0ZXJgIGZsYWcgaXMgdHJ1ZSBvZiB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSwgbWFrZVxuICAgICAgICAvLyB0aGUgbm9kZSBhZnRlciB0aGlzIHBvc2l0aW9uIHRoZSBtYWluIHJlZmVyZW5jZS5cbiAgICAgICAgaWYgKCFtYWluKSB7XG4gICAgICAgICAgICBsZXQgdG1wID0gbWFpbjtcbiAgICAgICAgICAgIG1haW4gPSBvdGhlcjtcbiAgICAgICAgICAgIG90aGVyID0gdG1wO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBhbGwgbWFya3MgaW4gdGhlIG1haW4gbm9kZSwgZXhjZXB0IHRob3NlIHRoYXQgaGF2ZVxuICAgICAgICAvLyBgaW5jbHVzaXZlYCBzZXQgdG8gZmFsc2UgYW5kIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3RoZXIgbm9kZS5cbiAgICAgICAgbGV0IG1hcmtzID0gbWFpbi5tYXJrcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChtYXJrc1tpXS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSAmJiAoIW90aGVyIHx8ICFtYXJrc1tpXS5pc0luU2V0KG90aGVyLm1hcmtzKSkpXG4gICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrc1tpLS1dLnJlbW92ZUZyb21TZXQobWFya3MpO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgbWFya3MgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24sIGlmIGFueSwgZXhjZXB0IHRob3NlXG4gICAgdGhhdCBhcmUgbm9uLWluY2x1c2l2ZSBhbmQgbm90IHByZXNlbnQgYXQgcG9zaXRpb24gYCRlbmRgLiBUaGlzXG4gICAgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgZ2V0dGluZyB0aGUgc2V0IG9mIG1hcmtzIHRvIHByZXNlcnZlIGFmdGVyIGFcbiAgICBkZWxldGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZlxuICAgIGl0cyBwYXJlbnQgbm9kZSBvciBpdHMgcGFyZW50IG5vZGUgaXNuJ3QgYSB0ZXh0YmxvY2sgKGluIHdoaWNoXG4gICAgY2FzZSBubyBtYXJrcyBzaG91bGQgYmUgcHJlc2VydmVkKS5cbiAgICAqL1xuICAgIG1hcmtzQWNyb3NzKCRlbmQpIHtcbiAgICAgICAgbGV0IGFmdGVyID0gdGhpcy5wYXJlbnQubWF5YmVDaGlsZCh0aGlzLmluZGV4KCkpO1xuICAgICAgICBpZiAoIWFmdGVyIHx8ICFhZnRlci5pc0lubGluZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbWFya3MgPSBhZnRlci5tYXJrcywgbmV4dCA9ICRlbmQucGFyZW50Lm1heWJlQ2hpbGQoJGVuZC5pbmRleCgpKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChtYXJrc1tpXS50eXBlLnNwZWMuaW5jbHVzaXZlID09PSBmYWxzZSAmJiAoIW5leHQgfHwgIW1hcmtzW2ldLmlzSW5TZXQobmV4dC5tYXJrcykpKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3NbaS0tXS5yZW1vdmVGcm9tU2V0KG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgZGVwdGggdXAgdG8gd2hpY2ggdGhpcyBwb3NpdGlvbiBhbmQgdGhlIGdpdmVuIChub24tcmVzb2x2ZWQpXG4gICAgcG9zaXRpb24gc2hhcmUgdGhlIHNhbWUgcGFyZW50IG5vZGVzLlxuICAgICovXG4gICAgc2hhcmVkRGVwdGgocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gdGhpcy5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKVxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnQoZGVwdGgpIDw9IHBvcyAmJiB0aGlzLmVuZChkZXB0aCkgPj0gcG9zKVxuICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybnMgYSByYW5nZSBiYXNlZCBvbiB0aGUgcGxhY2Ugd2hlcmUgdGhpcyBwb3NpdGlvbiBhbmQgdGhlXG4gICAgZ2l2ZW4gcG9zaXRpb24gZGl2ZXJnZSBhcm91bmQgYmxvY2sgY29udGVudC4gSWYgYm90aCBwb2ludCBpbnRvXG4gICAgdGhlIHNhbWUgdGV4dGJsb2NrLCBmb3IgZXhhbXBsZSwgYSByYW5nZSBhcm91bmQgdGhhdCB0ZXh0YmxvY2tcbiAgICB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGV5IHBvaW50IGludG8gZGlmZmVyZW50IGJsb2NrcywgdGhlIHJhbmdlXG4gICAgYXJvdW5kIHRob3NlIGJsb2NrcyBpbiB0aGVpciBzaGFyZWQgYW5jZXN0b3IgaXMgcmV0dXJuZWQuIFlvdSBjYW5cbiAgICBwYXNzIGluIGFuIG9wdGlvbmFsIHByZWRpY2F0ZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggYSBwYXJlbnRcbiAgICBub2RlIHRvIHNlZSBpZiBhIHJhbmdlIGludG8gdGhhdCBwYXJlbnQgaXMgYWNjZXB0YWJsZS5cbiAgICAqL1xuICAgIGJsb2NrUmFuZ2Uob3RoZXIgPSB0aGlzLCBwcmVkKSB7XG4gICAgICAgIGlmIChvdGhlci5wb3MgPCB0aGlzLnBvcylcbiAgICAgICAgICAgIHJldHVybiBvdGhlci5ibG9ja1JhbmdlKHRoaXMpO1xuICAgICAgICBmb3IgKGxldCBkID0gdGhpcy5kZXB0aCAtICh0aGlzLnBhcmVudC5pbmxpbmVDb250ZW50IHx8IHRoaXMucG9zID09IG90aGVyLnBvcyA/IDEgOiAwKTsgZCA+PSAwOyBkLS0pXG4gICAgICAgICAgICBpZiAob3RoZXIucG9zIDw9IHRoaXMuZW5kKGQpICYmICghcHJlZCB8fCBwcmVkKHRoaXMubm9kZShkKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZVJhbmdlKHRoaXMsIG90aGVyLCBkKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFF1ZXJ5IHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIHNoYXJlcyB0aGUgc2FtZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIHNhbWVQYXJlbnQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zIC0gdGhpcy5wYXJlbnRPZmZzZXQgPT0gb3RoZXIucG9zIC0gb3RoZXIucGFyZW50T2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm4gdGhlIGdyZWF0ZXIgb2YgdGhpcyBhbmQgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbWF4KG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlci5wb3MgPiB0aGlzLnBvcyA/IG90aGVyIDogdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRoZSBzbWFsbGVyIG9mIHRoaXMgYW5kIHRoZSBnaXZlbiBwb3NpdGlvbi5cbiAgICAqL1xuICAgIG1pbihvdGhlcikge1xuICAgICAgICByZXR1cm4gb3RoZXIucG9zIDwgdGhpcy5wb3MgPyBvdGhlciA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBzdHIgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLmRlcHRoOyBpKyspXG4gICAgICAgICAgICBzdHIgKz0gKHN0ciA/IFwiL1wiIDogXCJcIikgKyB0aGlzLm5vZGUoaSkudHlwZS5uYW1lICsgXCJfXCIgKyB0aGlzLmluZGV4KGkgLSAxKTtcbiAgICAgICAgcmV0dXJuIHN0ciArIFwiOlwiICsgdGhpcy5wYXJlbnRPZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHJlc29sdmUoZG9jLCBwb3MpIHtcbiAgICAgICAgaWYgKCEocG9zID49IDAgJiYgcG9zIDw9IGRvYy5jb250ZW50LnNpemUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJQb3NpdGlvbiBcIiArIHBvcyArIFwiIG91dCBvZiByYW5nZVwiKTtcbiAgICAgICAgbGV0IHBhdGggPSBbXTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gMCwgcGFyZW50T2Zmc2V0ID0gcG9zO1xuICAgICAgICBmb3IgKGxldCBub2RlID0gZG9jOzspIHtcbiAgICAgICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IG5vZGUuY29udGVudC5maW5kSW5kZXgocGFyZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIGxldCByZW0gPSBwYXJlbnRPZmZzZXQgLSBvZmZzZXQ7XG4gICAgICAgICAgICBwYXRoLnB1c2gobm9kZSwgaW5kZXgsIHN0YXJ0ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICghcmVtKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgcGFyZW50T2Zmc2V0ID0gcmVtIC0gMTtcbiAgICAgICAgICAgIHN0YXJ0ICs9IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFBvcyhwb3MsIHBhdGgsIHBhcmVudE9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIHJlc29sdmVDYWNoZWQoZG9jLCBwb3MpIHtcbiAgICAgICAgbGV0IGNhY2hlID0gcmVzb2x2ZUNhY2hlLmdldChkb2MpO1xuICAgICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FjaGUuZWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBlbHQgPSBjYWNoZS5lbHRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChlbHQucG9zID09IHBvcylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVDYWNoZS5zZXQoZG9jLCBjYWNoZSA9IG5ldyBSZXNvbHZlQ2FjaGUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjYWNoZS5lbHRzW2NhY2hlLmldID0gUmVzb2x2ZWRQb3MucmVzb2x2ZShkb2MsIHBvcyk7XG4gICAgICAgIGNhY2hlLmkgPSAoY2FjaGUuaSArIDEpICUgcmVzb2x2ZUNhY2hlU2l6ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5jbGFzcyBSZXNvbHZlQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5pID0gMDtcbiAgICB9XG59XG5jb25zdCByZXNvbHZlQ2FjaGVTaXplID0gMTIsIHJlc29sdmVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcblJlcHJlc2VudHMgYSBmbGF0IHJhbmdlIG9mIGNvbnRlbnQsIGkuZS4gb25lIHRoYXQgc3RhcnRzIGFuZFxuZW5kcyBpbiB0aGUgc2FtZSBub2RlLlxuKi9cbmNsYXNzIE5vZGVSYW5nZSB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgbm9kZSByYW5nZS4gYCRmcm9tYCBhbmQgYCR0b2Agc2hvdWxkIHBvaW50IGludG8gdGhlXG4gICAgc2FtZSBub2RlIHVudGlsIGF0IGxlYXN0IHRoZSBnaXZlbiBgZGVwdGhgLCBzaW5jZSBhIG5vZGUgcmFuZ2VcbiAgICBkZW5vdGVzIGFuIGFkamFjZW50IHNldCBvZiBub2RlcyBpbiBhIHNpbmdsZSBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEEgcmVzb2x2ZWQgcG9zaXRpb24gYWxvbmcgdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50LiBNYXkgaGF2ZSBhXG4gICAgYGRlcHRoYCBncmVhdGVyIHRoYW4gdGhpcyBvYmplY3QncyBgZGVwdGhgIHByb3BlcnR5LCBzaW5jZVxuICAgIHRoZXNlIGFyZSB0aGUgcG9zaXRpb25zIHRoYXQgd2VyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHJhbmdlLFxuICAgIG5vdCByZS1yZXNvbHZlZCBwb3NpdGlvbnMgZGlyZWN0bHkgYXQgaXRzIGJvdW5kYXJpZXMuXG4gICAgKi9cbiAgICAkZnJvbSwgXG4gICAgLyoqXG4gICAgQSBwb3NpdGlvbiBhbG9uZyB0aGUgZW5kIG9mIHRoZSBjb250ZW50LiBTZWVcbiAgICBjYXZlYXQgZm9yIFtgJGZyb21gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVJhbmdlLiRmcm9tKS5cbiAgICAqL1xuICAgICR0bywgXG4gICAgLyoqXG4gICAgVGhlIGRlcHRoIG9mIHRoZSBub2RlIHRoYXQgdGhpcyByYW5nZSBwb2ludHMgaW50by5cbiAgICAqL1xuICAgIGRlcHRoKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgc3RhcnQoKSB7IHJldHVybiB0aGlzLiRmcm9tLmJlZm9yZSh0aGlzLmRlcHRoICsgMSk7IH1cbiAgICAvKipcbiAgICBUaGUgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgZW5kKCkgeyByZXR1cm4gdGhpcy4kdG8uYWZ0ZXIodGhpcy5kZXB0aCArIDEpOyB9XG4gICAgLyoqXG4gICAgVGhlIHBhcmVudCBub2RlIHRoYXQgdGhlIHJhbmdlIHBvaW50cyBpbnRvLlxuICAgICovXG4gICAgZ2V0IHBhcmVudCgpIHsgcmV0dXJuIHRoaXMuJGZyb20ubm9kZSh0aGlzLmRlcHRoKTsgfVxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IHN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLiRmcm9tLmluZGV4KHRoaXMuZGVwdGgpOyB9XG4gICAgLyoqXG4gICAgVGhlIGVuZCBpbmRleCBvZiB0aGUgcmFuZ2UgaW4gdGhlIHBhcmVudCBub2RlLlxuICAgICovXG4gICAgZ2V0IGVuZEluZGV4KCkgeyByZXR1cm4gdGhpcy4kdG8uaW5kZXhBZnRlcih0aGlzLmRlcHRoKTsgfVxufVxuXG5jb25zdCBlbXB0eUF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgdHJlZSB0aGF0IG1ha2VzIHVwIGFcblByb3NlTWlycm9yIGRvY3VtZW50LiBTbyBhIGRvY3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGBOb2RlYCwgd2l0aFxuY2hpbGRyZW4gdGhhdCBhcmUgYWxzbyBpbnN0YW5jZXMgb2YgYE5vZGVgLlxuXG5Ob2RlcyBhcmUgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMuIEluc3RlYWQgb2YgY2hhbmdpbmcgdGhlbSwgeW91XG5jcmVhdGUgbmV3IG9uZXMgd2l0aCB0aGUgY29udGVudCB5b3Ugd2FudC4gT2xkIG9uZXMga2VlcCBwb2ludGluZ1xuYXQgdGhlIG9sZCBkb2N1bWVudCBzaGFwZS4gVGhpcyBpcyBtYWRlIGNoZWFwZXIgYnkgc2hhcmluZ1xuc3RydWN0dXJlIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGRhdGEgYXMgbXVjaCBhcyBwb3NzaWJsZSwgd2hpY2ggYVxudHJlZSBzaGFwZSBsaWtlIHRoaXMgKHdpdGhvdXQgYmFjayBwb2ludGVycykgbWFrZXMgZWFzeS5cblxuKipEbyBub3QqKiBkaXJlY3RseSBtdXRhdGUgdGhlIHByb3BlcnRpZXMgb2YgYSBgTm9kZWAgb2JqZWN0LiBTZWVcblt0aGUgZ3VpZGVdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI2RvYykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4qL1xuY2xhc3MgTm9kZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgdHlwZSBvZiBub2RlIHRoYXQgdGhpcyBpcy5cbiAgICAqL1xuICAgIHR5cGUsIFxuICAgIC8qKlxuICAgIEFuIG9iamVjdCBtYXBwaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB2YWx1ZXMuIFRoZSBraW5kIG9mXG4gICAgYXR0cmlidXRlcyBhbGxvd2VkIGFuZCByZXF1aXJlZCBhcmVcbiAgICBbZGV0ZXJtaW5lZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmF0dHJzKSBieSB0aGUgbm9kZSB0eXBlLlxuICAgICovXG4gICAgYXR0cnMsIFxuICAgIC8vIEEgZnJhZ21lbnQgaG9sZGluZyB0aGUgbm9kZSdzIGNoaWxkcmVuLlxuICAgIGNvbnRlbnQsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrcyAodGhpbmdzIGxpa2Ugd2hldGhlciBpdCBpcyBlbXBoYXNpemVkIG9yIHBhcnQgb2YgYVxuICAgIGxpbmspIGFwcGxpZWQgdG8gdGhpcyBub2RlLlxuICAgICovXG4gICAgbWFya3MgPSBNYXJrLm5vbmUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQgfHwgRnJhZ21lbnQuZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBhcnJheSBvZiB0aGlzIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAqL1xuICAgIGdldCBjaGlsZHJlbigpIHsgcmV0dXJuIHRoaXMuY29udGVudC5jb250ZW50OyB9XG4gICAgLyoqXG4gICAgVGhlIHNpemUgb2YgdGhpcyBub2RlLCBhcyBkZWZpbmVkIGJ5IHRoZSBpbnRlZ2VyLWJhc2VkIFtpbmRleGluZ1xuICAgIHNjaGVtZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9ndWlkZS8jZG9jLmluZGV4aW5nKS4gRm9yIHRleHQgbm9kZXMsIHRoaXMgaXMgdGhlXG4gICAgYW1vdW50IG9mIGNoYXJhY3RlcnMuIEZvciBvdGhlciBsZWFmIG5vZGVzLCBpdCBpcyBvbmUuIEZvclxuICAgIG5vbi1sZWFmIG5vZGVzLCBpdCBpcyB0aGUgc2l6ZSBvZiB0aGUgY29udGVudCBwbHVzIHR3byAodGhlXG4gICAgc3RhcnQgYW5kIGVuZCB0b2tlbikuXG4gICAgKi9cbiAgICBnZXQgbm9kZVNpemUoKSB7IHJldHVybiB0aGlzLmlzTGVhZiA/IDEgOiAyICsgdGhpcy5jb250ZW50LnNpemU7IH1cbiAgICAvKipcbiAgICBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgdGhlIG5vZGUgaGFzLlxuICAgICovXG4gICAgZ2V0IGNoaWxkQ291bnQoKSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGRDb3VudDsgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgY2hpbGQgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFJhaXNlcyBhbiBlcnJvciB3aGVuIHRoZVxuICAgIGluZGV4IGlzIG91dCBvZiByYW5nZS5cbiAgICAqL1xuICAgIGNoaWxkKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjaGlsZCBub2RlIGF0IHRoZSBnaXZlbiBpbmRleCwgaWYgaXQgZXhpc3RzLlxuICAgICovXG4gICAgbWF5YmVDaGlsZChpbmRleCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lm1heWJlQ2hpbGQoaW5kZXgpOyB9XG4gICAgLyoqXG4gICAgQ2FsbCBgZmAgZm9yIGV2ZXJ5IGNoaWxkIG5vZGUsIHBhc3NpbmcgdGhlIG5vZGUsIGl0cyBvZmZzZXRcbiAgICBpbnRvIHRoaXMgcGFyZW50IG5vZGUsIGFuZCBpdHMgaW5kZXguXG4gICAgKi9cbiAgICBmb3JFYWNoKGYpIHsgdGhpcy5jb250ZW50LmZvckVhY2goZik7IH1cbiAgICAvKipcbiAgICBJbnZva2UgYSBjYWxsYmFjayBmb3IgYWxsIGRlc2NlbmRhbnQgbm9kZXMgcmVjdXJzaXZlbHkgYmV0d2VlblxuICAgIHRoZSBnaXZlbiB0d28gcG9zaXRpb25zIHRoYXQgYXJlIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoaXNcbiAgICBub2RlJ3MgY29udGVudC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCB0aGUgbm9kZSwgaXRzXG4gICAgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIG5vZGUgKG1ldGhvZCByZWNlaXZlciksXG4gICAgaXRzIHBhcmVudCBub2RlLCBhbmQgaXRzIGNoaWxkIGluZGV4LiBXaGVuIHRoZSBjYWxsYmFjayByZXR1cm5zXG4gICAgZmFsc2UgZm9yIGEgZ2l2ZW4gbm9kZSwgdGhhdCBub2RlJ3MgY2hpbGRyZW4gd2lsbCBub3QgYmVcbiAgICByZWN1cnNlZCBvdmVyLiBUaGUgbGFzdCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhXG4gICAgc3RhcnRpbmcgcG9zaXRpb24gdG8gY291bnQgZnJvbS5cbiAgICAqL1xuICAgIG5vZGVzQmV0d2Vlbihmcm9tLCB0bywgZiwgc3RhcnRQb3MgPSAwKSB7XG4gICAgICAgIHRoaXMuY29udGVudC5ub2Rlc0JldHdlZW4oZnJvbSwgdG8sIGYsIHN0YXJ0UG9zLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ2FsbCB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IGRlc2NlbmRhbnQgbm9kZS4gRG9lc24ndFxuICAgIGRlc2NlbmQgaW50byBhIG5vZGUgd2hlbiB0aGUgY2FsbGJhY2sgcmV0dXJucyBgZmFsc2VgLlxuICAgICovXG4gICAgZGVzY2VuZGFudHMoZikge1xuICAgICAgICB0aGlzLm5vZGVzQmV0d2VlbigwLCB0aGlzLmNvbnRlbnQuc2l6ZSwgZik7XG4gICAgfVxuICAgIC8qKlxuICAgIENvbmNhdGVuYXRlcyBhbGwgdGhlIHRleHQgbm9kZXMgZm91bmQgaW4gdGhpcyBmcmFnbWVudCBhbmQgaXRzXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgdGV4dENvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0xlYWYgJiYgdGhpcy50eXBlLnNwZWMubGVhZlRleHQpXG4gICAgICAgICAgICA/IHRoaXMudHlwZS5zcGVjLmxlYWZUZXh0KHRoaXMpXG4gICAgICAgICAgICA6IHRoaXMudGV4dEJldHdlZW4oMCwgdGhpcy5jb250ZW50LnNpemUsIFwiXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYWxsIHRleHQgYmV0d2VlbiBwb3NpdGlvbnMgYGZyb21gIGFuZCBgdG9gLiBXaGVuXG4gICAgYGJsb2NrU2VwYXJhdG9yYCBpcyBnaXZlbiwgaXQgd2lsbCBiZSBpbnNlcnRlZCB0byBzZXBhcmF0ZSB0ZXh0XG4gICAgZnJvbSBkaWZmZXJlbnQgYmxvY2sgbm9kZXMuIElmIGBsZWFmVGV4dGAgaXMgZ2l2ZW4sIGl0J2xsIGJlXG4gICAgaW5zZXJ0ZWQgZm9yIGV2ZXJ5IG5vbi10ZXh0IGxlYWYgbm9kZSBlbmNvdW50ZXJlZCwgb3RoZXJ3aXNlXG4gICAgW2BsZWFmVGV4dGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlY15sZWFmVGV4dCkgd2lsbCBiZSB1c2VkLlxuICAgICovXG4gICAgdGV4dEJldHdlZW4oZnJvbSwgdG8sIGJsb2NrU2VwYXJhdG9yLCBsZWFmVGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnRleHRCZXR3ZWVuKGZyb20sIHRvLCBibG9ja1NlcGFyYXRvciwgbGVhZlRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoaXMgbm9kZSdzIGZpcnN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgZmlyc3RDaGlsZCgpIHsgcmV0dXJuIHRoaXMuY29udGVudC5maXJzdENoaWxkOyB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0aGlzIG5vZGUncyBsYXN0IGNoaWxkLCBvciBgbnVsbGAgaWYgdGhlcmUgYXJlIG5vXG4gICAgY2hpbGRyZW4uXG4gICAgKi9cbiAgICBnZXQgbGFzdENoaWxkKCkgeyByZXR1cm4gdGhpcy5jb250ZW50Lmxhc3RDaGlsZDsgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciB0d28gbm9kZXMgcmVwcmVzZW50IHRoZSBzYW1lIHBpZWNlIG9mIGRvY3VtZW50LlxuICAgICovXG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgKHRoaXMuc2FtZU1hcmt1cChvdGhlcikgJiYgdGhpcy5jb250ZW50LmVxKG90aGVyLmNvbnRlbnQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29tcGFyZSB0aGUgbWFya3VwICh0eXBlLCBhdHRyaWJ1dGVzLCBhbmQgbWFya3MpIG9mIHRoaXMgbm9kZSB0b1xuICAgIHRob3NlIG9mIGFub3RoZXIuIFJldHVybnMgYHRydWVgIGlmIGJvdGggaGF2ZSB0aGUgc2FtZSBtYXJrdXAuXG4gICAgKi9cbiAgICBzYW1lTWFya3VwKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc01hcmt1cChvdGhlci50eXBlLCBvdGhlci5hdHRycywgb3RoZXIubWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSdzIG1hcmt1cCBjb3JyZXNwb25kIHRvIHRoZSBnaXZlbiB0eXBlLFxuICAgIGF0dHJpYnV0ZXMsIGFuZCBtYXJrcy5cbiAgICAqL1xuICAgIGhhc01hcmt1cCh0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0eXBlICYmXG4gICAgICAgICAgICBjb21wYXJlRGVlcCh0aGlzLmF0dHJzLCBhdHRycyB8fCB0eXBlLmRlZmF1bHRBdHRycyB8fCBlbXB0eUF0dHJzKSAmJlxuICAgICAgICAgICAgTWFyay5zYW1lU2V0KHRoaXMubWFya3MsIG1hcmtzIHx8IE1hcmsubm9uZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggdGhlIHNhbWUgbWFya3VwIGFzIHRoaXMgbm9kZSwgY29udGFpbmluZ1xuICAgIHRoZSBnaXZlbiBjb250ZW50IChvciBlbXB0eSwgaWYgbm8gY29udGVudCBpcyBnaXZlbikuXG4gICAgKi9cbiAgICBjb3B5KGNvbnRlbnQgPSBudWxsKSB7XG4gICAgICAgIGlmIChjb250ZW50ID09IHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCBjb250ZW50LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgY29weSBvZiB0aGlzIG5vZGUsIHdpdGggdGhlIGdpdmVuIHNldCBvZiBtYXJrcyBpbnN0ZWFkXG4gICAgb2YgdGhlIG5vZGUncyBvd24gbWFya3MuXG4gICAgKi9cbiAgICBtYXJrKG1hcmtzKSB7XG4gICAgICAgIHJldHVybiBtYXJrcyA9PSB0aGlzLm1hcmtzID8gdGhpcyA6IG5ldyBOb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy5jb250ZW50LCBtYXJrcyk7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlIHdpdGggb25seSB0aGUgY29udGVudCBiZXR3ZWVuIHRoZVxuICAgIGdpdmVuIHBvc2l0aW9ucy4gSWYgYHRvYCBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2ZcbiAgICB0aGUgbm9kZS5cbiAgICAqL1xuICAgIGN1dChmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplKSB7XG4gICAgICAgIGlmIChmcm9tID09IDAgJiYgdG8gPT0gdGhpcy5jb250ZW50LnNpemUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weSh0aGlzLmNvbnRlbnQuY3V0KGZyb20sIHRvKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEN1dCBvdXQgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucywgYW5kXG4gICAgcmV0dXJuIGl0IGFzIGEgYFNsaWNlYCBvYmplY3QuXG4gICAgKi9cbiAgICBzbGljZShmcm9tLCB0byA9IHRoaXMuY29udGVudC5zaXplLCBpbmNsdWRlUGFyZW50cyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChmcm9tID09IHRvKVxuICAgICAgICAgICAgcmV0dXJuIFNsaWNlLmVtcHR5O1xuICAgICAgICBsZXQgJGZyb20gPSB0aGlzLnJlc29sdmUoZnJvbSksICR0byA9IHRoaXMucmVzb2x2ZSh0byk7XG4gICAgICAgIGxldCBkZXB0aCA9IGluY2x1ZGVQYXJlbnRzID8gMCA6ICRmcm9tLnNoYXJlZERlcHRoKHRvKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uc3RhcnQoZGVwdGgpLCBub2RlID0gJGZyb20ubm9kZShkZXB0aCk7XG4gICAgICAgIGxldCBjb250ZW50ID0gbm9kZS5jb250ZW50LmN1dCgkZnJvbS5wb3MgLSBzdGFydCwgJHRvLnBvcyAtIHN0YXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBTbGljZShjb250ZW50LCAkZnJvbS5kZXB0aCAtIGRlcHRoLCAkdG8uZGVwdGggLSBkZXB0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucyB3aXRoXG4gICAgdGhlIGdpdmVuIHNsaWNlLiBUaGUgc2xpY2UgbXVzdCAnZml0JywgbWVhbmluZyBpdHMgb3BlbiBzaWRlc1xuICAgIG11c3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzdXJyb3VuZGluZyBjb250ZW50LCBhbmQgaXRzXG4gICAgY29udGVudCBub2RlcyBtdXN0IGJlIHZhbGlkIGNoaWxkcmVuIGZvciB0aGUgbm9kZSB0aGV5IGFyZSBwbGFjZWRcbiAgICBpbnRvLiBJZiBhbnkgb2YgdGhpcyBpcyB2aW9sYXRlZCwgYW4gZXJyb3Igb2YgdHlwZVxuICAgIFtgUmVwbGFjZUVycm9yYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlcGxhY2VFcnJvcikgaXMgdGhyb3duLlxuICAgICovXG4gICAgcmVwbGFjZShmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2UodGhpcy5yZXNvbHZlKGZyb20pLCB0aGlzLnJlc29sdmUodG8pLCBzbGljZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIG5vZGUgZGlyZWN0bHkgYWZ0ZXIgdGhlIGdpdmVuIHBvc2l0aW9uLlxuICAgICovXG4gICAgbm9kZUF0KHBvcykge1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpczs7KSB7XG4gICAgICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHBvcyk7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXliZUNoaWxkKGluZGV4KTtcbiAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zIHx8IG5vZGUuaXNUZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgcG9zIC09IG9mZnNldCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBhZnRlciB0aGUgZ2l2ZW4gb2Zmc2V0LCBpZiBhbnksXG4gICAgYW5kIHJldHVybiBpdCBhbG9uZyB3aXRoIGl0cyBpbmRleCBhbmQgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoaXNcbiAgICBub2RlLlxuICAgICovXG4gICAgY2hpbGRBZnRlcihwb3MpIHtcbiAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldCB9ID0gdGhpcy5jb250ZW50LmZpbmRJbmRleChwb3MpO1xuICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnQubWF5YmVDaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgKGRpcmVjdCkgY2hpbGQgbm9kZSBiZWZvcmUgdGhlIGdpdmVuIG9mZnNldCwgaWYgYW55LFxuICAgIGFuZCByZXR1cm4gaXQgYWxvbmcgd2l0aCBpdHMgaW5kZXggYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGlzXG4gICAgbm9kZS5cbiAgICAqL1xuICAgIGNoaWxkQmVmb3JlKHBvcykge1xuICAgICAgICBpZiAocG9zID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBudWxsLCBpbmRleDogMCwgb2Zmc2V0OiAwIH07XG4gICAgICAgIGxldCB7IGluZGV4LCBvZmZzZXQgfSA9IHRoaXMuY29udGVudC5maW5kSW5kZXgocG9zKTtcbiAgICAgICAgaWYgKG9mZnNldCA8IHBvcylcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudC5jaGlsZChpbmRleCksIGluZGV4LCBvZmZzZXQgfTtcbiAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNvbnRlbnQuY2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgaW5kZXg6IGluZGV4IC0gMSwgb2Zmc2V0OiBvZmZzZXQgLSBub2RlLm5vZGVTaXplIH07XG4gICAgfVxuICAgIC8qKlxuICAgIFJlc29sdmUgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCwgcmV0dXJuaW5nIGFuXG4gICAgW29iamVjdF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLlJlc29sdmVkUG9zKSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGl0cyBjb250ZXh0LlxuICAgICovXG4gICAgcmVzb2x2ZShwb3MpIHsgcmV0dXJuIFJlc29sdmVkUG9zLnJlc29sdmVDYWNoZWQodGhpcywgcG9zKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVzb2x2ZU5vQ2FjaGUocG9zKSB7IHJldHVybiBSZXNvbHZlZFBvcy5yZXNvbHZlKHRoaXMsIHBvcyk7IH1cbiAgICAvKipcbiAgICBUZXN0IHdoZXRoZXIgYSBnaXZlbiBtYXJrIG9yIG1hcmsgdHlwZSBvY2N1cnMgaW4gdGhpcyBkb2N1bWVudFxuICAgIGJldHdlZW4gdGhlIHR3byBnaXZlbiBwb3NpdGlvbnMuXG4gICAgKi9cbiAgICByYW5nZUhhc01hcmsoZnJvbSwgdG8sIHR5cGUpIHtcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgIGlmICh0byA+IGZyb20pXG4gICAgICAgICAgICB0aGlzLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgbm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNJblNldChub2RlLm1hcmtzKSlcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIGJsb2NrIChub24taW5saW5lIG5vZGUpXG4gICAgKi9cbiAgICBnZXQgaXNCbG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc0Jsb2NrOyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSB0ZXh0YmxvY2sgbm9kZSwgYSBibG9jayBub2RlIHdpdGggaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMudHlwZS5pc1RleHRibG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG5vZGUgYWxsb3dzIGlubGluZSBjb250ZW50LlxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7IHJldHVybiB0aGlzLnR5cGUuaW5saW5lQ29udGVudDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGlubGluZSBub2RlIChhIHRleHQgbm9kZSBvciBhIG5vZGUgdGhhdCBjYW5cbiAgICBhcHBlYXIgYW1vbmcgdGV4dCkuXG4gICAgKi9cbiAgICBnZXQgaXNJbmxpbmUoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNJbmxpbmU7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBpcyBhIHRleHQgbm9kZS5cbiAgICAqL1xuICAgIGdldCBpc1RleHQoKSB7IHJldHVybiB0aGlzLnR5cGUuaXNUZXh0OyB9XG4gICAgLyoqXG4gICAgVHJ1ZSB3aGVuIHRoaXMgaXMgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBnZXQgaXNMZWFmKCkgeyByZXR1cm4gdGhpcy50eXBlLmlzTGVhZjsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5XG4gICAgZWRpdGFibGUgY29udGVudC4gVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIGBpc0xlYWZgLCBidXQgY2FuXG4gICAgYmUgY29uZmlndXJlZCB3aXRoIHRoZSBbYGF0b21gIHByb3BlcnR5XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuYXRvbSlcbiAgICBvbiBhIG5vZGUncyBzcGVjICh0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSBub2RlIGlzIGRpc3BsYXllZCBhc1xuICAgIGFuIHVuZWRpdGFibGUgW25vZGUgdmlld10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpKS5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLnR5cGUuaXNBdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZSBmb3IgZGVidWdnaW5nXG4gICAgcHVycG9zZXMuXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNwZWMudG9EZWJ1Z1N0cmluZyh0aGlzKTtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnR5cGUubmFtZTtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgbmFtZSArPSBcIihcIiArIHRoaXMuY29udGVudC50b1N0cmluZ0lubmVyKCkgKyBcIilcIjtcbiAgICAgICAgcmV0dXJuIHdyYXBNYXJrcyh0aGlzLm1hcmtzLCBuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBjb250ZW50IG1hdGNoIGluIHRoaXMgbm9kZSBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAgKi9cbiAgICBjb250ZW50TWF0Y2hBdChpbmRleCkge1xuICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnR5cGUuY29udGVudE1hdGNoLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCAwLCBpbmRleCk7XG4gICAgICAgIGlmICghbWF0Y2gpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWxsZWQgY29udGVudE1hdGNoQXQgb24gYSBub2RlIHdpdGggaW52YWxpZCBjb250ZW50XCIpO1xuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGJldHdlZW4gYGZyb21gIGFuZCBgdG9gIChieVxuICAgIGNoaWxkIGluZGV4KSB3aXRoIHRoZSBnaXZlbiByZXBsYWNlbWVudCBmcmFnbWVudCAod2hpY2ggZGVmYXVsdHNcbiAgICB0byB0aGUgZW1wdHkgZnJhZ21lbnQpIHdvdWxkIGxlYXZlIHRoZSBub2RlJ3MgY29udGVudCB2YWxpZC4gWW91XG4gICAgY2FuIG9wdGlvbmFsbHkgcGFzcyBgc3RhcnRgIGFuZCBgZW5kYCBpbmRpY2VzIGludG8gdGhlXG4gICAgcmVwbGFjZW1lbnQgZnJhZ21lbnQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlKGZyb20sIHRvLCByZXBsYWNlbWVudCA9IEZyYWdtZW50LmVtcHR5LCBzdGFydCA9IDAsIGVuZCA9IHJlcGxhY2VtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgbGV0IG9uZSA9IHRoaXMuY29udGVudE1hdGNoQXQoZnJvbSkubWF0Y2hGcmFnbWVudChyZXBsYWNlbWVudCwgc3RhcnQsIGVuZCk7XG4gICAgICAgIGxldCB0d28gPSBvbmUgJiYgb25lLm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIGlmICghdHdvIHx8ICF0d28udmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGUuYWxsb3dzTWFya3MocmVwbGFjZW1lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlc3Qgd2hldGhlciByZXBsYWNpbmcgdGhlIHJhbmdlIGBmcm9tYCB0byBgdG9gIChieSBpbmRleCkgd2l0aFxuICAgIGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSB3b3VsZCBsZWF2ZSB0aGUgbm9kZSdzIGNvbnRlbnQgdmFsaWQuXG4gICAgKi9cbiAgICBjYW5SZXBsYWNlV2l0aChmcm9tLCB0bywgdHlwZSwgbWFya3MpIHtcbiAgICAgICAgaWYgKG1hcmtzICYmICF0aGlzLnR5cGUuYWxsb3dzTWFya3MobWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmNvbnRlbnRNYXRjaEF0KGZyb20pLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICYmIHN0YXJ0Lm1hdGNoRnJhZ21lbnQodGhpcy5jb250ZW50LCB0byk7XG4gICAgICAgIHJldHVybiBlbmQgPyBlbmQudmFsaWRFbmQgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBub2RlJ3MgY29udGVudCBjb3VsZCBiZSBhcHBlbmRlZCB0byB0aGlzXG4gICAgbm9kZS4gSWYgdGhhdCBub2RlIGlzIGVtcHR5LCB0aGlzIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBpZiB0aGVyZVxuICAgIGlzIGF0IGxlYXN0IG9uZSBub2RlIHR5cGUgdGhhdCBjYW4gYXBwZWFyIGluIGJvdGggbm9kZXMgKHRvIGF2b2lkXG4gICAgbWVyZ2luZyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSBub2RlcykuXG4gICAgKi9cbiAgICBjYW5BcHBlbmQob3RoZXIpIHtcbiAgICAgICAgaWYgKG90aGVyLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhblJlcGxhY2UodGhpcy5jaGlsZENvdW50LCB0aGlzLmNoaWxkQ291bnQsIG90aGVyLmNvbnRlbnQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmNvbXBhdGlibGVDb250ZW50KG90aGVyLnR5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSBhbmQgaXRzIGRlc2NlbmRhbnRzIGNvbmZvcm0gdG8gdGhlXG4gICAgc2NoZW1hLCBhbmQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhleSBkbyBub3QuXG4gICAgKi9cbiAgICBjaGVjaygpIHtcbiAgICAgICAgdGhpcy50eXBlLmNoZWNrQ29udGVudCh0aGlzLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLnR5cGUuY2hlY2tBdHRycyh0aGlzLmF0dHJzKTtcbiAgICAgICAgbGV0IGNvcHkgPSBNYXJrLm5vbmU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcmsgPSB0aGlzLm1hcmtzW2ldO1xuICAgICAgICAgICAgbWFyay50eXBlLmNoZWNrQXR0cnMobWFyay5hdHRycyk7XG4gICAgICAgICAgICBjb3B5ID0gbWFyay5hZGRUb1NldChjb3B5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU1hcmsuc2FtZVNldChjb3B5LCB0aGlzLm1hcmtzKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIGNvbGxlY3Rpb24gb2YgbWFya3MgZm9yIG5vZGUgJHt0aGlzLnR5cGUubmFtZX06ICR7dGhpcy5tYXJrcy5tYXAobSA9PiBtLnR5cGUubmFtZSl9YCk7XG4gICAgICAgIHRoaXMuY29udGVudC5mb3JFYWNoKG5vZGUgPT4gbm9kZS5jaGVjaygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJuIGEgSlNPTi1zZXJpYWxpemVhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgdHlwZTogdGhpcy50eXBlLm5hbWUgfTtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICBvYmouYXR0cnMgPSB0aGlzLmF0dHJzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5zaXplKVxuICAgICAgICAgICAgb2JqLmNvbnRlbnQgPSB0aGlzLmNvbnRlbnQudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLm1hcmtzLmxlbmd0aClcbiAgICAgICAgICAgIG9iai5tYXJrcyA9IHRoaXMubWFya3MubWFwKG4gPT4gbi50b0pTT04oKSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAoIWpzb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIE5vZGUuZnJvbUpTT05cIik7XG4gICAgICAgIGxldCBtYXJrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGpzb24ubWFya3MpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLm1hcmtzKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgbWFyayBkYXRhIGZvciBOb2RlLmZyb21KU09OXCIpO1xuICAgICAgICAgICAgbWFya3MgPSBqc29uLm1hcmtzLm1hcChzY2hlbWEubWFya0Zyb21KU09OKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoanNvbi50eXBlID09IFwidGV4dFwiKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb24udGV4dCAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCB0ZXh0IG5vZGUgaW4gSlNPTlwiKTtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEudGV4dChqc29uLnRleHQsIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmZyb21KU09OKHNjaGVtYSwganNvbi5jb250ZW50KTtcbiAgICAgICAgbGV0IG5vZGUgPSBzY2hlbWEubm9kZVR5cGUoanNvbi50eXBlKS5jcmVhdGUoanNvbi5hdHRycywgY29udGVudCwgbWFya3MpO1xuICAgICAgICBub2RlLnR5cGUuY2hlY2tBdHRycyhub2RlLmF0dHJzKTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxufVxuTm9kZS5wcm90b3R5cGUudGV4dCA9IHVuZGVmaW5lZDtcbmNsYXNzIFRleHROb2RlIGV4dGVuZHMgTm9kZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBhdHRycywgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgc3VwZXIodHlwZSwgYXR0cnMsIG51bGwsIG1hcmtzKTtcbiAgICAgICAgaWYgKCFjb250ZW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFbXB0eSB0ZXh0IG5vZGVzIGFyZSBub3QgYWxsb3dlZFwiKTtcbiAgICAgICAgdGhpcy50ZXh0ID0gY29udGVudDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUuc3BlYy50b0RlYnVnU3RyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5zcGVjLnRvRGVidWdTdHJpbmcodGhpcyk7XG4gICAgICAgIHJldHVybiB3cmFwTWFya3ModGhpcy5tYXJrcywgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXh0KSk7XG4gICAgfVxuICAgIGdldCB0ZXh0Q29udGVudCgpIHsgcmV0dXJuIHRoaXMudGV4dDsgfVxuICAgIHRleHRCZXR3ZWVuKGZyb20sIHRvKSB7IHJldHVybiB0aGlzLnRleHQuc2xpY2UoZnJvbSwgdG8pOyB9XG4gICAgZ2V0IG5vZGVTaXplKCkgeyByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDsgfVxuICAgIG1hcmsobWFya3MpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtzID09IHRoaXMubWFya3MgPyB0aGlzIDogbmV3IFRleHROb2RlKHRoaXMudHlwZSwgdGhpcy5hdHRycywgdGhpcy50ZXh0LCBtYXJrcyk7XG4gICAgfVxuICAgIHdpdGhUZXh0KHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy50ZXh0KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodGhpcy50eXBlLCB0aGlzLmF0dHJzLCB0ZXh0LCB0aGlzLm1hcmtzKTtcbiAgICB9XG4gICAgY3V0KGZyb20gPSAwLCB0byA9IHRoaXMudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGZyb20gPT0gMCAmJiB0byA9PSB0aGlzLnRleHQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLndpdGhUZXh0KHRoaXMudGV4dC5zbGljZShmcm9tLCB0bykpO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zYW1lTWFya3VwKG90aGVyKSAmJiB0aGlzLnRleHQgPT0gb3RoZXIudGV4dDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgYmFzZSA9IHN1cGVyLnRvSlNPTigpO1xuICAgICAgICBiYXNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICAgIHJldHVybiBiYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHdyYXBNYXJrcyhtYXJrcywgc3RyKSB7XG4gICAgZm9yIChsZXQgaSA9IG1hcmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICBzdHIgPSBtYXJrc1tpXS50eXBlLm5hbWUgKyBcIihcIiArIHN0ciArIFwiKVwiO1xuICAgIHJldHVybiBzdHI7XG59XG5cbi8qKlxuSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgbWF0Y2ggc3RhdGUgb2YgYSBub2RlIHR5cGUnc1xuW2NvbnRlbnQgZXhwcmVzc2lvbl0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmNvbnRlbnQpLCBhbmQgY2FuIGJlIHVzZWQgdG9cbmZpbmQgb3V0IHdoZXRoZXIgZnVydGhlciBjb250ZW50IG1hdGNoZXMgaGVyZSwgYW5kIHdoZXRoZXIgYSBnaXZlblxucG9zaXRpb24gaXMgYSB2YWxpZCBlbmQgb2YgdGhlIG5vZGUuXG4qL1xuY2xhc3MgQ29udGVudE1hdGNoIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGlzIG1hdGNoIHN0YXRlIHJlcHJlc2VudHMgYSB2YWxpZCBlbmQgb2YgdGhlIG5vZGUuXG4gICAgKi9cbiAgICB2YWxpZEVuZCkge1xuICAgICAgICB0aGlzLnZhbGlkRW5kID0gdmFsaWRFbmQ7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uZXh0ID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy53cmFwQ2FjaGUgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgcGFyc2Uoc3RyaW5nLCBub2RlVHlwZXMpIHtcbiAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBUb2tlblN0cmVhbShzdHJpbmcsIG5vZGVUeXBlcyk7XG4gICAgICAgIGlmIChzdHJlYW0ubmV4dCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRNYXRjaC5lbXB0eTtcbiAgICAgICAgbGV0IGV4cHIgPSBwYXJzZUV4cHIoc3RyZWFtKTtcbiAgICAgICAgaWYgKHN0cmVhbS5uZXh0KVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdHJhaWxpbmcgdGV4dFwiKTtcbiAgICAgICAgbGV0IG1hdGNoID0gZGZhKG5mYShleHByKSk7XG4gICAgICAgIGNoZWNrRm9yRGVhZEVuZHMobWF0Y2gsIHN0cmVhbSk7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG4gICAgLyoqXG4gICAgTWF0Y2ggYSBub2RlIHR5cGUsIHJldHVybmluZyBhIG1hdGNoIGFmdGVyIHRoYXQgbm9kZSBpZlxuICAgIHN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBtYXRjaFR5cGUodHlwZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHRbaV0udHlwZSA9PSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5leHRbaV0ubmV4dDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFRyeSB0byBtYXRjaCBhIGZyYWdtZW50LiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgbWF0Y2ggd2hlblxuICAgIHN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBtYXRjaEZyYWdtZW50KGZyYWcsIHN0YXJ0ID0gMCwgZW5kID0gZnJhZy5jaGlsZENvdW50KSB7XG4gICAgICAgIGxldCBjdXIgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGN1ciAmJiBpIDwgZW5kOyBpKyspXG4gICAgICAgICAgICBjdXIgPSBjdXIubWF0Y2hUeXBlKGZyYWcuY2hpbGQoaSkudHlwZSk7XG4gICAgICAgIHJldHVybiBjdXI7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IGlubGluZUNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQubGVuZ3RoICE9IDAgJiYgdGhpcy5uZXh0WzBdLnR5cGUuaXNJbmxpbmU7XG4gICAgfVxuICAgIC8qKlxuICAgIEdldCB0aGUgZmlyc3QgbWF0Y2hpbmcgbm9kZSB0eXBlIGF0IHRoaXMgbWF0Y2ggcG9zaXRpb24gdGhhdCBjYW5cbiAgICBiZSBnZW5lcmF0ZWQuXG4gICAgKi9cbiAgICBnZXQgZGVmYXVsdFR5cGUoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyB0eXBlIH0gPSB0aGlzLm5leHRbaV07XG4gICAgICAgICAgICBpZiAoISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29tcGF0aWJsZShvdGhlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3RoZXIubmV4dC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0W2ldLnR5cGUgPT0gb3RoZXIubmV4dFtqXS50eXBlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gbWF0Y2ggdGhlIGdpdmVuIGZyYWdtZW50LCBhbmQgaWYgdGhhdCBmYWlscywgc2VlIGlmIGl0IGNhblxuICAgIGJlIG1hZGUgdG8gbWF0Y2ggYnkgaW5zZXJ0aW5nIG5vZGVzIGluIGZyb250IG9mIGl0LiBXaGVuXG4gICAgc3VjY2Vzc2Z1bCwgcmV0dXJuIGEgZnJhZ21lbnQgb2YgaW5zZXJ0ZWQgbm9kZXMgKHdoaWNoIG1heSBiZVxuICAgIGVtcHR5IGlmIG5vdGhpbmcgaGFkIHRvIGJlIGluc2VydGVkKS4gV2hlbiBgdG9FbmRgIGlzIHRydWUsIG9ubHlcbiAgICByZXR1cm4gYSBmcmFnbWVudCBpZiB0aGUgcmVzdWx0aW5nIG1hdGNoIGdvZXMgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBjb250ZW50IGV4cHJlc3Npb24uXG4gICAgKi9cbiAgICBmaWxsQmVmb3JlKGFmdGVyLCB0b0VuZCA9IGZhbHNlLCBzdGFydEluZGV4ID0gMCkge1xuICAgICAgICBsZXQgc2VlbiA9IFt0aGlzXTtcbiAgICAgICAgZnVuY3Rpb24gc2VhcmNoKG1hdGNoLCB0eXBlcykge1xuICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gbWF0Y2gubWF0Y2hGcmFnbWVudChhZnRlciwgc3RhcnRJbmRleCk7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWQgJiYgKCF0b0VuZCB8fCBmaW5pc2hlZC52YWxpZEVuZCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb20odHlwZXMubWFwKHRwID0+IHRwLmNyZWF0ZUFuZEZpbGwoKSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gbWF0Y2gubmV4dFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkgJiYgc2Vlbi5pbmRleE9mKG5leHQpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW4ucHVzaChuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc2VhcmNoKG5leHQsIHR5cGVzLmNvbmNhdCh0eXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VhcmNoKHRoaXMsIFtdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhIHNldCBvZiB3cmFwcGluZyBub2RlIHR5cGVzIHRoYXQgd291bGQgYWxsb3cgYSBub2RlIG9mIHRoZVxuICAgIGdpdmVuIHR5cGUgdG8gYXBwZWFyIGF0IHRoaXMgcG9zaXRpb24uIFRoZSByZXN1bHQgbWF5IGJlIGVtcHR5XG4gICAgKHdoZW4gaXQgZml0cyBkaXJlY3RseSkgYW5kIHdpbGwgYmUgbnVsbCB3aGVuIG5vIHN1Y2ggd3JhcHBpbmdcbiAgICBleGlzdHMuXG4gICAgKi9cbiAgICBmaW5kV3JhcHBpbmcodGFyZ2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy53cmFwQ2FjaGUubGVuZ3RoOyBpICs9IDIpXG4gICAgICAgICAgICBpZiAodGhpcy53cmFwQ2FjaGVbaV0gPT0gdGFyZ2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBDYWNoZVtpICsgMV07XG4gICAgICAgIGxldCBjb21wdXRlZCA9IHRoaXMuY29tcHV0ZVdyYXBwaW5nKHRhcmdldCk7XG4gICAgICAgIHRoaXMud3JhcENhY2hlLnB1c2godGFyZ2V0LCBjb21wdXRlZCk7XG4gICAgICAgIHJldHVybiBjb21wdXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb21wdXRlV3JhcHBpbmcodGFyZ2V0KSB7XG4gICAgICAgIGxldCBzZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgYWN0aXZlID0gW3sgbWF0Y2g6IHRoaXMsIHR5cGU6IG51bGwsIHZpYTogbnVsbCB9XTtcbiAgICAgICAgd2hpbGUgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYWN0aXZlLnNoaWZ0KCksIG1hdGNoID0gY3VycmVudC5tYXRjaDtcbiAgICAgICAgICAgIGlmIChtYXRjaC5tYXRjaFR5cGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvYmogPSBjdXJyZW50OyBvYmoudHlwZTsgb2JqID0gb2JqLnZpYSlcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob2JqLnR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaC5uZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gbWF0Y2gubmV4dFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNMZWFmICYmICF0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSAmJiAhKHR5cGUubmFtZSBpbiBzZWVuKSAmJiAoIWN1cnJlbnQudHlwZSB8fCBuZXh0LnZhbGlkRW5kKSkge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmUucHVzaCh7IG1hdGNoOiB0eXBlLmNvbnRlbnRNYXRjaCwgdHlwZSwgdmlhOiBjdXJyZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICBzZWVuW3R5cGUubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG51bWJlciBvZiBvdXRnb2luZyBlZGdlcyB0aGlzIG5vZGUgaGFzIGluIHRoZSBmaW5pdGVcbiAgICBhdXRvbWF0b24gdGhhdCBkZXNjcmliZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbi5cbiAgICAqL1xuICAgIGdldCBlZGdlQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5leHQubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIF9uX+KAi3RoIG91dGdvaW5nIGVkZ2UgZnJvbSB0aGlzIG5vZGUgaW4gdGhlIGZpbml0ZVxuICAgIGF1dG9tYXRvbiB0aGF0IGRlc2NyaWJlcyB0aGUgY29udGVudCBleHByZXNzaW9uLlxuICAgICovXG4gICAgZWRnZShuKSB7XG4gICAgICAgIGlmIChuID49IHRoaXMubmV4dC5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlcmUncyBubyAke259dGggZWRnZSBpbiB0aGlzIGNvbnRlbnQgbWF0Y2hgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dFtuXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgbGV0IHNlZW4gPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gc2NhbihtKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2gobSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG0ubmV4dC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG0ubmV4dFtpXS5uZXh0KSA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgc2NhbihtLm5leHRbaV0ubmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgc2Nhbih0aGlzKTtcbiAgICAgICAgcmV0dXJuIHNlZW4ubWFwKChtLCBpKSA9PiB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gaSArIChtLnZhbGlkRW5kID8gXCIqXCIgOiBcIiBcIikgKyBcIiBcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbS5uZXh0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIG91dCArPSAoaSA/IFwiLCBcIiA6IFwiXCIpICsgbS5uZXh0W2ldLnR5cGUubmFtZSArIFwiLT5cIiArIHNlZW4uaW5kZXhPZihtLm5leHRbaV0ubmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9KS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbn1cbi8qKlxuQGludGVybmFsXG4qL1xuQ29udGVudE1hdGNoLmVtcHR5ID0gbmV3IENvbnRlbnRNYXRjaCh0cnVlKTtcbmNsYXNzIFRva2VuU3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpbmcsIG5vZGVUeXBlcykge1xuICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZztcbiAgICAgICAgdGhpcy5ub2RlVHlwZXMgPSBub2RlVHlwZXM7XG4gICAgICAgIHRoaXMuaW5saW5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLnRva2VucyA9IHN0cmluZy5zcGxpdCgvXFxzKig/PVxcYnxcXFd8JCkvKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zW3RoaXMudG9rZW5zLmxlbmd0aCAtIDFdID09IFwiXCIpXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zWzBdID09IFwiXCIpXG4gICAgICAgICAgICB0aGlzLnRva2Vucy5zaGlmdCgpO1xuICAgIH1cbiAgICBnZXQgbmV4dCgpIHsgcmV0dXJuIHRoaXMudG9rZW5zW3RoaXMucG9zXTsgfVxuICAgIGVhdCh0b2spIHsgcmV0dXJuIHRoaXMubmV4dCA9PSB0b2sgJiYgKHRoaXMucG9zKysgfHwgdHJ1ZSk7IH1cbiAgICBlcnIoc3RyKSB7IHRocm93IG5ldyBTeW50YXhFcnJvcihzdHIgKyBcIiAoaW4gY29udGVudCBleHByZXNzaW9uICdcIiArIHRoaXMuc3RyaW5nICsgXCInKVwiKTsgfVxufVxuZnVuY3Rpb24gcGFyc2VFeHByKHN0cmVhbSkge1xuICAgIGxldCBleHBycyA9IFtdO1xuICAgIGRvIHtcbiAgICAgICAgZXhwcnMucHVzaChwYXJzZUV4cHJTZXEoc3RyZWFtKSk7XG4gICAgfSB3aGlsZSAoc3RyZWFtLmVhdChcInxcIikpO1xuICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByU2VxKHN0cmVhbSkge1xuICAgIGxldCBleHBycyA9IFtdO1xuICAgIGRvIHtcbiAgICAgICAgZXhwcnMucHVzaChwYXJzZUV4cHJTdWJzY3JpcHQoc3RyZWFtKSk7XG4gICAgfSB3aGlsZSAoc3RyZWFtLm5leHQgJiYgc3RyZWFtLm5leHQgIT0gXCIpXCIgJiYgc3RyZWFtLm5leHQgIT0gXCJ8XCIpO1xuICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcInNlcVwiLCBleHBycyB9O1xufVxuZnVuY3Rpb24gcGFyc2VFeHByU3Vic2NyaXB0KHN0cmVhbSkge1xuICAgIGxldCBleHByID0gcGFyc2VFeHByQXRvbShzdHJlYW0pO1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKHN0cmVhbS5lYXQoXCIrXCIpKVxuICAgICAgICAgICAgZXhwciA9IHsgdHlwZTogXCJwbHVzXCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIipcIikpXG4gICAgICAgICAgICBleHByID0geyB0eXBlOiBcInN0YXJcIiwgZXhwciB9O1xuICAgICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KFwiP1wiKSlcbiAgICAgICAgICAgIGV4cHIgPSB7IHR5cGU6IFwib3B0XCIsIGV4cHIgfTtcbiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdChcIntcIikpXG4gICAgICAgICAgICBleHByID0gcGFyc2VFeHByUmFuZ2Uoc3RyZWFtLCBleHByKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xufVxuZnVuY3Rpb24gcGFyc2VOdW0oc3RyZWFtKSB7XG4gICAgaWYgKC9cXEQvLnRlc3Qoc3RyZWFtLm5leHQpKVxuICAgICAgICBzdHJlYW0uZXJyKFwiRXhwZWN0ZWQgbnVtYmVyLCBnb3QgJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgbGV0IHJlc3VsdCA9IE51bWJlcihzdHJlYW0ubmV4dCk7XG4gICAgc3RyZWFtLnBvcysrO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJSYW5nZShzdHJlYW0sIGV4cHIpIHtcbiAgICBsZXQgbWluID0gcGFyc2VOdW0oc3RyZWFtKSwgbWF4ID0gbWluO1xuICAgIGlmIChzdHJlYW0uZWF0KFwiLFwiKSkge1xuICAgICAgICBpZiAoc3RyZWFtLm5leHQgIT0gXCJ9XCIpXG4gICAgICAgICAgICBtYXggPSBwYXJzZU51bShzdHJlYW0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXggPSAtMTtcbiAgICB9XG4gICAgaWYgKCFzdHJlYW0uZWF0KFwifVwiKSlcbiAgICAgICAgc3RyZWFtLmVycihcIlVuY2xvc2VkIGJyYWNlZCByYW5nZVwiKTtcbiAgICByZXR1cm4geyB0eXBlOiBcInJhbmdlXCIsIG1pbiwgbWF4LCBleHByIH07XG59XG5mdW5jdGlvbiByZXNvbHZlTmFtZShzdHJlYW0sIG5hbWUpIHtcbiAgICBsZXQgdHlwZXMgPSBzdHJlYW0ubm9kZVR5cGVzLCB0eXBlID0gdHlwZXNbbmFtZV07XG4gICAgaWYgKHR5cGUpXG4gICAgICAgIHJldHVybiBbdHlwZV07XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IHR5cGVOYW1lIGluIHR5cGVzKSB7XG4gICAgICAgIGxldCB0eXBlID0gdHlwZXNbdHlwZU5hbWVdO1xuICAgICAgICBpZiAodHlwZS5pc0luR3JvdXAobmFtZSkpXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMClcbiAgICAgICAgc3RyZWFtLmVycihcIk5vIG5vZGUgdHlwZSBvciBncm91cCAnXCIgKyBuYW1lICsgXCInIGZvdW5kXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBwYXJzZUV4cHJBdG9tKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0uZWF0KFwiKFwiKSkge1xuICAgICAgICBsZXQgZXhwciA9IHBhcnNlRXhwcihzdHJlYW0pO1xuICAgICAgICBpZiAoIXN0cmVhbS5lYXQoXCIpXCIpKVxuICAgICAgICAgICAgc3RyZWFtLmVycihcIk1pc3NpbmcgY2xvc2luZyBwYXJlblwiKTtcbiAgICAgICAgcmV0dXJuIGV4cHI7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEvXFxXLy50ZXN0KHN0cmVhbS5uZXh0KSkge1xuICAgICAgICBsZXQgZXhwcnMgPSByZXNvbHZlTmFtZShzdHJlYW0sIHN0cmVhbS5uZXh0KS5tYXAodHlwZSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtLmlubGluZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5pbmxpbmUgPSB0eXBlLmlzSW5saW5lO1xuICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLmlubGluZSAhPSB0eXBlLmlzSW5saW5lKVxuICAgICAgICAgICAgICAgIHN0cmVhbS5lcnIoXCJNaXhpbmcgaW5saW5lIGFuZCBibG9jayBjb250ZW50XCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJuYW1lXCIsIHZhbHVlOiB0eXBlIH07XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ucG9zKys7XG4gICAgICAgIHJldHVybiBleHBycy5sZW5ndGggPT0gMSA/IGV4cHJzWzBdIDogeyB0eXBlOiBcImNob2ljZVwiLCBleHBycyB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc3RyZWFtLmVycihcIlVuZXhwZWN0ZWQgdG9rZW4gJ1wiICsgc3RyZWFtLm5leHQgKyBcIidcIik7XG4gICAgfVxufVxuLy8gQ29uc3RydWN0IGFuIE5GQSBmcm9tIGFuIGV4cHJlc3Npb24gYXMgcmV0dXJuZWQgYnkgdGhlIHBhcnNlci4gVGhlXG4vLyBORkEgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2Ygc3RhdGVzLCB3aGljaCBhcmUgdGhlbXNlbHZlc1xuLy8gYXJyYXlzIG9mIGVkZ2VzLCB3aGljaCBhcmUgYHt0ZXJtLCB0b31gIG9iamVjdHMuIFRoZSBmaXJzdCBzdGF0ZSBpc1xuLy8gdGhlIGVudHJ5IHN0YXRlIGFuZCB0aGUgbGFzdCBub2RlIGlzIHRoZSBzdWNjZXNzIHN0YXRlLlxuLy9cbi8vIE5vdGUgdGhhdCB1bmxpa2UgdHlwaWNhbCBORkFzLCB0aGUgZWRnZSBvcmRlcmluZyBpbiB0aGlzIG9uZSBpc1xuLy8gc2lnbmlmaWNhbnQsIGluIHRoYXQgaXQgaXMgdXNlZCB0byBjb250cnVjdCBmaWxsZXIgY29udGVudCB3aGVuXG4vLyBuZWNlc3NhcnkuXG5mdW5jdGlvbiBuZmEoZXhwcikge1xuICAgIGxldCBuZmEgPSBbW11dO1xuICAgIGNvbm5lY3QoY29tcGlsZShleHByLCAwKSwgbm9kZSgpKTtcbiAgICByZXR1cm4gbmZhO1xuICAgIGZ1bmN0aW9uIG5vZGUoKSB7IHJldHVybiBuZmEucHVzaChbXSkgLSAxOyB9XG4gICAgZnVuY3Rpb24gZWRnZShmcm9tLCB0bywgdGVybSkge1xuICAgICAgICBsZXQgZWRnZSA9IHsgdGVybSwgdG8gfTtcbiAgICAgICAgbmZhW2Zyb21dLnB1c2goZWRnZSk7XG4gICAgICAgIHJldHVybiBlZGdlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb25uZWN0KGVkZ2VzLCB0bykge1xuICAgICAgICBlZGdlcy5mb3JFYWNoKGVkZ2UgPT4gZWRnZS50byA9IHRvKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGlsZShleHByLCBmcm9tKSB7XG4gICAgICAgIGlmIChleHByLnR5cGUgPT0gXCJjaG9pY2VcIikge1xuICAgICAgICAgICAgcmV0dXJuIGV4cHIuZXhwcnMucmVkdWNlKChvdXQsIGV4cHIpID0+IG91dC5jb25jYXQoY29tcGlsZShleHByLCBmcm9tKSksIFtdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJzZXFcIikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7OyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGNvbXBpbGUoZXhwci5leHByc1tpXSwgZnJvbSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gZXhwci5leHBycy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgICAgICBjb25uZWN0KG5leHQsIGZyb20gPSBub2RlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4cHIudHlwZSA9PSBcInN0YXJcIikge1xuICAgICAgICAgICAgbGV0IGxvb3AgPSBub2RlKCk7XG4gICAgICAgICAgICBlZGdlKGZyb20sIGxvb3ApO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgbG9vcCksIGxvb3ApO1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGxvb3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJwbHVzXCIpIHtcbiAgICAgICAgICAgIGxldCBsb29wID0gbm9kZSgpO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgZnJvbSksIGxvb3ApO1xuICAgICAgICAgICAgY29ubmVjdChjb21waWxlKGV4cHIuZXhwciwgbG9vcCksIGxvb3ApO1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGxvb3ApXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJvcHRcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtlZGdlKGZyb20pXS5jb25jYXQoY29tcGlsZShleHByLmV4cHIsIGZyb20pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChleHByLnR5cGUgPT0gXCJyYW5nZVwiKSB7XG4gICAgICAgICAgICBsZXQgY3VyID0gZnJvbTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5taW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZSgpO1xuICAgICAgICAgICAgICAgIGNvbm5lY3QoY29tcGlsZShleHByLmV4cHIsIGN1ciksIG5leHQpO1xuICAgICAgICAgICAgICAgIGN1ciA9IG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5tYXggPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBjdXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGV4cHIubWluOyBpIDwgZXhwci5tYXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IG5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgZWRnZShjdXIsIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0KGNvbXBpbGUoZXhwci5leHByLCBjdXIpLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyID0gbmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UoY3VyKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhwci50eXBlID09IFwibmFtZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gW2VkZ2UoZnJvbSwgdW5kZWZpbmVkLCBleHByLnZhbHVlKV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGV4cHIgdHlwZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNtcChhLCBiKSB7IHJldHVybiBiIC0gYTsgfVxuLy8gR2V0IHRoZSBzZXQgb2Ygbm9kZXMgcmVhY2hhYmxlIGJ5IG51bGwgZWRnZXMgZnJvbSBgbm9kZWAuIE9taXRcbi8vIG5vZGVzIHdpdGggb25seSBhIHNpbmdsZSBudWxsLW91dC1lZGdlLCBzaW5jZSB0aGV5IG1heSBsZWFkIHRvXG4vLyBuZWVkbGVzcyBkdXBsaWNhdGVkIG5vZGVzLlxuZnVuY3Rpb24gbnVsbEZyb20obmZhLCBub2RlKSB7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIHNjYW4obm9kZSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KGNtcCk7XG4gICAgZnVuY3Rpb24gc2Nhbihub2RlKSB7XG4gICAgICAgIGxldCBlZGdlcyA9IG5mYVtub2RlXTtcbiAgICAgICAgaWYgKGVkZ2VzLmxlbmd0aCA9PSAxICYmICFlZGdlc1swXS50ZXJtKVxuICAgICAgICAgICAgcmV0dXJuIHNjYW4oZWRnZXNbMF0udG8pO1xuICAgICAgICByZXN1bHQucHVzaChub2RlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgdGVybSwgdG8gfSA9IGVkZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKCF0ZXJtICYmIHJlc3VsdC5pbmRleE9mKHRvKSA9PSAtMSlcbiAgICAgICAgICAgICAgICBzY2FuKHRvKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIENvbXBpbGVzIGFuIE5GQSBhcyBwcm9kdWNlZCBieSBgbmZhYCBpbnRvIGEgREZBLCBtb2RlbGVkIGFzIGEgc2V0XG4vLyBvZiBzdGF0ZSBvYmplY3RzIChgQ29udGVudE1hdGNoYCBpbnN0YW5jZXMpIHdpdGggdHJhbnNpdGlvbnNcbi8vIGJldHdlZW4gdGhlbS5cbmZ1bmN0aW9uIGRmYShuZmEpIHtcbiAgICBsZXQgbGFiZWxlZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmV0dXJuIGV4cGxvcmUobnVsbEZyb20obmZhLCAwKSk7XG4gICAgZnVuY3Rpb24gZXhwbG9yZShzdGF0ZXMpIHtcbiAgICAgICAgbGV0IG91dCA9IFtdO1xuICAgICAgICBzdGF0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5mYVtub2RlXS5mb3JFYWNoKCh7IHRlcm0sIHRvIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRlcm0pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBsZXQgc2V0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0W2ldWzBdID09IHRlcm0pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSBvdXRbaV1bMV07XG4gICAgICAgICAgICAgICAgbnVsbEZyb20obmZhLCB0bykuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChbdGVybSwgc2V0ID0gW11dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldC5pbmRleE9mKG5vZGUpID09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBzdGF0ZSA9IGxhYmVsZWRbc3RhdGVzLmpvaW4oXCIsXCIpXSA9IG5ldyBDb250ZW50TWF0Y2goc3RhdGVzLmluZGV4T2YobmZhLmxlbmd0aCAtIDEpID4gLTEpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXRlcyA9IG91dFtpXVsxXS5zb3J0KGNtcCk7XG4gICAgICAgICAgICBzdGF0ZS5uZXh0LnB1c2goeyB0eXBlOiBvdXRbaV1bMF0sIG5leHQ6IGxhYmVsZWRbc3RhdGVzLmpvaW4oXCIsXCIpXSB8fCBleHBsb3JlKHN0YXRlcykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrRm9yRGVhZEVuZHMobWF0Y2gsIHN0cmVhbSkge1xuICAgIGZvciAobGV0IGkgPSAwLCB3b3JrID0gW21hdGNoXTsgaSA8IHdvcmsubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHN0YXRlID0gd29ya1tpXSwgZGVhZCA9ICFzdGF0ZS52YWxpZEVuZCwgbm9kZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdGF0ZS5uZXh0Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBsZXQgeyB0eXBlLCBuZXh0IH0gPSBzdGF0ZS5uZXh0W2pdO1xuICAgICAgICAgICAgbm9kZXMucHVzaCh0eXBlLm5hbWUpO1xuICAgICAgICAgICAgaWYgKGRlYWQgJiYgISh0eXBlLmlzVGV4dCB8fCB0eXBlLmhhc1JlcXVpcmVkQXR0cnMoKSkpXG4gICAgICAgICAgICAgICAgZGVhZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHdvcmsuaW5kZXhPZihuZXh0KSA9PSAtMSlcbiAgICAgICAgICAgICAgICB3b3JrLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlYWQpXG4gICAgICAgICAgICBzdHJlYW0uZXJyKFwiT25seSBub24tZ2VuZXJhdGFibGUgbm9kZXMgKFwiICsgbm9kZXMuam9pbihcIiwgXCIpICsgXCIpIGluIGEgcmVxdWlyZWQgcG9zaXRpb24gKHNlZSBodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL2d1aWRlLyNnZW5lcmF0YWJsZSlcIik7XG4gICAgfVxufVxuXG4vLyBGb3Igbm9kZSB0eXBlcyB3aGVyZSBhbGwgYXR0cnMgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgKG9yIHdoaWNoIGRvbid0XG4vLyBoYXZlIGFueSBhdHRyaWJ1dGVzKSwgYnVpbGQgdXAgYSBzaW5nbGUgcmV1c2FibGUgZGVmYXVsdCBhdHRyaWJ1dGVcbi8vIG9iamVjdCwgYW5kIHVzZSBpdCBmb3IgYWxsIG5vZGVzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBzcGVjaWZpY1xuLy8gYXR0cmlidXRlcy5cbmZ1bmN0aW9uIGRlZmF1bHRBdHRycyhhdHRycykge1xuICAgIGxldCBkZWZhdWx0cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgYXR0ck5hbWUgaW4gYXR0cnMpIHtcbiAgICAgICAgbGV0IGF0dHIgPSBhdHRyc1thdHRyTmFtZV07XG4gICAgICAgIGlmICghYXR0ci5oYXNEZWZhdWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGRlZmF1bHRzW2F0dHJOYW1lXSA9IGF0dHIuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xufVxuZnVuY3Rpb24gY29tcHV0ZUF0dHJzKGF0dHJzLCB2YWx1ZSkge1xuICAgIGxldCBidWlsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBhdHRycykge1xuICAgICAgICBsZXQgZ2l2ZW4gPSB2YWx1ZSAmJiB2YWx1ZVtuYW1lXTtcbiAgICAgICAgaWYgKGdpdmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBhdHRyID0gYXR0cnNbbmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0ci5oYXNEZWZhdWx0KVxuICAgICAgICAgICAgICAgIGdpdmVuID0gYXR0ci5kZWZhdWx0O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gdmFsdWUgc3VwcGxpZWQgZm9yIGF0dHJpYnV0ZSBcIiArIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGJ1aWx0W25hbWVdID0gZ2l2ZW47XG4gICAgfVxuICAgIHJldHVybiBidWlsdDtcbn1cbmZ1bmN0aW9uIGNoZWNrQXR0cnMoYXR0cnMsIHZhbHVlcywgdHlwZSwgbmFtZSkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gdmFsdWVzKVxuICAgICAgICBpZiAoIShuYW1lIGluIGF0dHJzKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBVbnN1cHBvcnRlZCBhdHRyaWJ1dGUgJHtuYW1lfSBmb3IgJHt0eXBlfSBvZiB0eXBlICR7bmFtZX1gKTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG4gICAgICAgIGxldCBhdHRyID0gYXR0cnNbbmFtZV07XG4gICAgICAgIGlmIChhdHRyLnZhbGlkYXRlKVxuICAgICAgICAgICAgYXR0ci52YWxpZGF0ZSh2YWx1ZXNbbmFtZV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaXRBdHRycyh0eXBlTmFtZSwgYXR0cnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoYXR0cnMpXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gYXR0cnMpXG4gICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBuZXcgQXR0cmlidXRlKHR5cGVOYW1lLCBuYW1lLCBhdHRyc1tuYW1lXSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuTm9kZSB0eXBlcyBhcmUgb2JqZWN0cyBhbGxvY2F0ZWQgb25jZSBwZXIgYFNjaGVtYWAgYW5kIHVzZWQgdG9cblt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnR5cGUpIGBOb2RlYCBpbnN0YW5jZXMuIFRoZXkgY29udGFpbiBpbmZvcm1hdGlvblxuYWJvdXQgdGhlIG5vZGUgdHlwZSwgc3VjaCBhcyBpdHMgbmFtZSBhbmQgd2hhdCBraW5kIG9mIG5vZGUgaXRcbnJlcHJlc2VudHMuXG4qL1xuY2xhc3MgTm9kZVR5cGUge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIG5hbWUgdGhlIG5vZGUgdHlwZSBoYXMgaW4gdGhpcyBzY2hlbWEuXG4gICAgKi9cbiAgICBuYW1lLCBcbiAgICAvKipcbiAgICBBIGxpbmsgYmFjayB0byB0aGUgYFNjaGVtYWAgdGhlIG5vZGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgICovXG4gICAgc2NoZW1hLCBcbiAgICAvKipcbiAgICBUaGUgc3BlYyB0aGF0IHRoaXMgdHlwZSBpcyBiYXNlZCBvblxuICAgICovXG4gICAgc3BlYykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBzZXQgb2YgbWFya3MgYWxsb3dlZCBpbiB0aGlzIG5vZGUuIGBudWxsYCBtZWFucyBhbGwgbWFya3NcbiAgICAgICAgYXJlIGFsbG93ZWQuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMubWFya1NldCA9IG51bGw7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gc3BlYy5ncm91cCA/IHNwZWMuZ3JvdXAuc3BsaXQoXCIgXCIpIDogW107XG4gICAgICAgIHRoaXMuYXR0cnMgPSBpbml0QXR0cnMobmFtZSwgc3BlYy5hdHRycyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdEF0dHJzID0gZGVmYXVsdEF0dHJzKHRoaXMuYXR0cnMpO1xuICAgICAgICB0aGlzLmNvbnRlbnRNYXRjaCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5saW5lQ29udGVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNCbG9jayA9ICEoc3BlYy5pbmxpbmUgfHwgbmFtZSA9PSBcInRleHRcIik7XG4gICAgICAgIHRoaXMuaXNUZXh0ID0gbmFtZSA9PSBcInRleHRcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgVHJ1ZSBpZiB0aGlzIGlzIGFuIGlubGluZSB0eXBlLlxuICAgICovXG4gICAgZ2V0IGlzSW5saW5lKCkgeyByZXR1cm4gIXRoaXMuaXNCbG9jazsgfVxuICAgIC8qKlxuICAgIFRydWUgaWYgdGhpcyBpcyBhIHRleHRibG9jayB0eXBlLCBhIGJsb2NrIHRoYXQgY29udGFpbnMgaW5saW5lXG4gICAgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc1RleHRibG9jaygpIHsgcmV0dXJuIHRoaXMuaXNCbG9jayAmJiB0aGlzLmlubGluZUNvbnRlbnQ7IH1cbiAgICAvKipcbiAgICBUcnVlIGZvciBub2RlIHR5cGVzIHRoYXQgYWxsb3cgbm8gY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc0xlYWYoKSB7IHJldHVybiB0aGlzLmNvbnRlbnRNYXRjaCA9PSBDb250ZW50TWF0Y2guZW1wdHk7IH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIGFuIGF0b20sIGkuZS4gd2hlbiBpdCBkb2VzIG5vdCBoYXZlXG4gICAgZGlyZWN0bHkgZWRpdGFibGUgY29udGVudC5cbiAgICAqL1xuICAgIGdldCBpc0F0b20oKSB7IHJldHVybiB0aGlzLmlzTGVhZiB8fCAhIXRoaXMuc3BlYy5hdG9tOyB9XG4gICAgLyoqXG4gICAgUmV0dXJuIHRydWUgd2hlbiB0aGlzIG5vZGUgdHlwZSBpcyBwYXJ0IG9mIHRoZSBnaXZlblxuICAgIFtncm91cF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmdyb3VwKS5cbiAgICAqL1xuICAgIGlzSW5Hcm91cChncm91cCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cHMuaW5kZXhPZihncm91cCkgPiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIG5vZGUgdHlwZSdzIFt3aGl0ZXNwYWNlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMud2hpdGVzcGFjZSkgb3B0aW9uLlxuICAgICovXG4gICAgZ2V0IHdoaXRlc3BhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMud2hpdGVzcGFjZSB8fCAodGhpcy5zcGVjLmNvZGUgPyBcInByZVwiIDogXCJub3JtYWxcIik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoaXMgbm9kZSB0eXBlIGhhcyBhbnkgcmVxdWlyZWQgYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIGhhc1JlcXVpcmVkQXR0cnMoKSB7XG4gICAgICAgIGZvciAobGV0IG4gaW4gdGhpcy5hdHRycylcbiAgICAgICAgICAgIGlmICh0aGlzLmF0dHJzW25dLmlzUmVxdWlyZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBub2RlIGFsbG93cyBzb21lIG9mIHRoZSBzYW1lIGNvbnRlbnQgYXNcbiAgICB0aGUgZ2l2ZW4gbm9kZSB0eXBlLlxuICAgICovXG4gICAgY29tcGF0aWJsZUNvbnRlbnQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXIgfHwgdGhpcy5jb250ZW50TWF0Y2guY29tcGF0aWJsZShvdGhlci5jb250ZW50TWF0Y2gpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbXB1dGVBdHRycyhhdHRycykge1xuICAgICAgICBpZiAoIWF0dHJzICYmIHRoaXMuZGVmYXVsdEF0dHJzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEF0dHJzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgYE5vZGVgIG9mIHRoaXMgdHlwZS4gVGhlIGdpdmVuIGF0dHJpYnV0ZXMgYXJlXG4gICAgY2hlY2tlZCBhbmQgZGVmYXVsdGVkICh5b3UgY2FuIHBhc3MgYG51bGxgIHRvIHVzZSB0aGUgdHlwZSdzXG4gICAgZGVmYXVsdHMgZW50aXJlbHksIGlmIG5vIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZXhpc3QpLiBgY29udGVudGBcbiAgICBtYXkgYmUgYSBgRnJhZ21lbnRgLCBhIG5vZGUsIGFuIGFycmF5IG9mIG5vZGVzLCBvclxuICAgIGBudWxsYC4gU2ltaWxhcmx5IGBtYXJrc2AgbWF5IGJlIGBudWxsYCB0byBkZWZhdWx0IHRvIHRoZSBlbXB0eVxuICAgIHNldCBvZiBtYXJrcy5cbiAgICAqL1xuICAgIGNyZWF0ZShhdHRycyA9IG51bGwsIGNvbnRlbnQsIG1hcmtzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVGV4dClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVUeXBlLmNyZWF0ZSBjYW4ndCBjb25zdHJ1Y3QgdGV4dCBub2Rlc1wiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIHRoaXMuY29tcHV0ZUF0dHJzKGF0dHJzKSwgRnJhZ21lbnQuZnJvbShjb250ZW50KSwgTWFyay5zZXRGcm9tKG1hcmtzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIExpa2UgW2BjcmVhdGVgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUuY3JlYXRlKSwgYnV0IGNoZWNrIHRoZSBnaXZlbiBjb250ZW50XG4gICAgYWdhaW5zdCB0aGUgbm9kZSB0eXBlJ3MgY29udGVudCByZXN0cmljdGlvbnMsIGFuZCB0aHJvdyBhbiBlcnJvclxuICAgIGlmIGl0IGRvZXNuJ3QgbWF0Y2guXG4gICAgKi9cbiAgICBjcmVhdGVDaGVja2VkKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20oY29udGVudCk7XG4gICAgICAgIHRoaXMuY2hlY2tDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgdGhpcy5jb21wdXRlQXR0cnMoYXR0cnMpLCBjb250ZW50LCBNYXJrLnNldEZyb20obWFya3MpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgTGlrZSBbYGNyZWF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlVHlwZS5jcmVhdGUpLCBidXQgc2VlIGlmIGl0IGlzXG4gICAgbmVjZXNzYXJ5IHRvIGFkZCBub2RlcyB0byB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSBnaXZlbiBmcmFnbWVudFxuICAgIHRvIG1ha2UgaXQgZml0IHRoZSBub2RlLiBJZiBubyBmaXR0aW5nIHdyYXBwaW5nIGNhbiBiZSBmb3VuZCxcbiAgICByZXR1cm4gbnVsbC4gTm90ZSB0aGF0LCBkdWUgdG8gdGhlIGZhY3QgdGhhdCByZXF1aXJlZCBub2RlcyBjYW5cbiAgICBhbHdheXMgYmUgY3JlYXRlZCwgdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkIGlmIHlvdSBwYXNzIG51bGwgb3JcbiAgICBgRnJhZ21lbnQuZW1wdHlgIGFzIGNvbnRlbnQuXG4gICAgKi9cbiAgICBjcmVhdGVBbmRGaWxsKGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgYXR0cnMgPSB0aGlzLmNvbXB1dGVBdHRycyhhdHRycyk7XG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKGNvbnRlbnQpO1xuICAgICAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdGhpcy5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShjb250ZW50KTtcbiAgICAgICAgICAgIGlmICghYmVmb3JlKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29udGVudCA9IGJlZm9yZS5hcHBlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoZWQgPSB0aGlzLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICBsZXQgYWZ0ZXIgPSBtYXRjaGVkICYmIG1hdGNoZWQuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgICAgIGlmICghYWZ0ZXIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlKHRoaXMsIGF0dHJzLCBjb250ZW50LmFwcGVuZChhZnRlciksIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZyYWdtZW50IGlzIHZhbGlkIGNvbnRlbnQgZm9yIHRoaXMgbm9kZVxuICAgIHR5cGUuXG4gICAgKi9cbiAgICB2YWxpZENvbnRlbnQoY29udGVudCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChjb250ZW50KTtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC52YWxpZEVuZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50LmNoaWxkQ291bnQ7IGkrKylcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxvd3NNYXJrcyhjb250ZW50LmNoaWxkKGkpLm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBUaHJvd3MgYSBSYW5nZUVycm9yIGlmIHRoZSBnaXZlbiBmcmFnbWVudCBpcyBub3QgdmFsaWQgY29udGVudCBmb3IgdGhpc1xuICAgIG5vZGUgdHlwZS5cbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoZWNrQ29udGVudChjb250ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZENvbnRlbnQoY29udGVudCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBjb250ZW50IGZvciBub2RlICR7dGhpcy5uYW1lfTogJHtjb250ZW50LnRvU3RyaW5nKCkuc2xpY2UoMCwgNTApfWApO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNoZWNrQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgY2hlY2tBdHRycyh0aGlzLmF0dHJzLCBhdHRycywgXCJub2RlXCIsIHRoaXMubmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1hcmsgdHlwZSBpcyBhbGxvd2VkIGluIHRoaXMgbm9kZS5cbiAgICAqL1xuICAgIGFsbG93c01hcmtUeXBlKG1hcmtUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcmtTZXQgPT0gbnVsbCB8fCB0aGlzLm1hcmtTZXQuaW5kZXhPZihtYXJrVHlwZSkgPiAtMTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBzZXQgb2YgbWFya3MgYXJlIGFsbG93ZWQgaW4gdGhpcyBub2RlLlxuICAgICovXG4gICAgYWxsb3dzTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKHRoaXMubWFya1NldCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya1R5cGUobWFya3NbaV0udHlwZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlcyB0aGUgbWFya3MgdGhhdCBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBub2RlIGZyb20gdGhlIGdpdmVuIHNldC5cbiAgICAqL1xuICAgIGFsbG93ZWRNYXJrcyhtYXJrcykge1xuICAgICAgICBpZiAodGhpcy5tYXJrU2V0ID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgICAgIGxldCBjb3B5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTWFya1R5cGUobWFya3NbaV0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvcHkpXG4gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBtYXJrcy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvcHkpIHtcbiAgICAgICAgICAgICAgICBjb3B5LnB1c2gobWFya3NbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY29weSA/IG1hcmtzIDogY29weS5sZW5ndGggPyBjb3B5IDogTWFyay5ub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBjb21waWxlKG5vZGVzLCBzY2hlbWEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIG5vZGVzLmZvckVhY2goKG5hbWUsIHNwZWMpID0+IHJlc3VsdFtuYW1lXSA9IG5ldyBOb2RlVHlwZShuYW1lLCBzY2hlbWEsIHNwZWMpKTtcbiAgICAgICAgbGV0IHRvcFR5cGUgPSBzY2hlbWEuc3BlYy50b3BOb2RlIHx8IFwiZG9jXCI7XG4gICAgICAgIGlmICghcmVzdWx0W3RvcFR5cGVdKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJTY2hlbWEgaXMgbWlzc2luZyBpdHMgdG9wIG5vZGUgdHlwZSAoJ1wiICsgdG9wVHlwZSArIFwiJylcIik7XG4gICAgICAgIGlmICghcmVzdWx0LnRleHQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkV2ZXJ5IHNjaGVtYSBuZWVkcyBhICd0ZXh0JyB0eXBlXCIpO1xuICAgICAgICBmb3IgKGxldCBfIGluIHJlc3VsdC50ZXh0LmF0dHJzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgdGV4dCBub2RlIHR5cGUgc2hvdWxkIG5vdCBoYXZlIGF0dHJpYnV0ZXNcIik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVUeXBlKHR5cGVOYW1lLCBhdHRyTmFtZSwgdHlwZSkge1xuICAgIGxldCB0eXBlcyA9IHR5cGUuc3BsaXQoXCJ8XCIpO1xuICAgIHJldHVybiAodmFsdWUpID0+IHtcbiAgICAgICAgbGV0IG5hbWUgPSB2YWx1ZSA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZXMuaW5kZXhPZihuYW1lKSA8IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSAke3R5cGVzfSBmb3IgYXR0cmlidXRlICR7YXR0ck5hbWV9IG9uIHR5cGUgJHt0eXBlTmFtZX0sIGdvdCAke25hbWV9YCk7XG4gICAgfTtcbn1cbi8vIEF0dHJpYnV0ZSBkZXNjcmlwdG9yc1xuY2xhc3MgQXR0cmlidXRlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlTmFtZSwgYXR0ck5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5oYXNEZWZhdWx0ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gb3B0aW9ucy5kZWZhdWx0O1xuICAgICAgICB0aGlzLnZhbGlkYXRlID0gdHlwZW9mIG9wdGlvbnMudmFsaWRhdGUgPT0gXCJzdHJpbmdcIiA/IHZhbGlkYXRlVHlwZSh0eXBlTmFtZSwgYXR0ck5hbWUsIG9wdGlvbnMudmFsaWRhdGUpIDogb3B0aW9ucy52YWxpZGF0ZTtcbiAgICB9XG4gICAgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNEZWZhdWx0O1xuICAgIH1cbn1cbi8vIE1hcmtzXG4vKipcbkxpa2Ugbm9kZXMsIG1hcmtzICh3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIG5vZGVzIHRvIHNpZ25pZnlcbnRoaW5ncyBsaWtlIGVtcGhhc2lzIG9yIGJlaW5nIHBhcnQgb2YgYSBsaW5rKSBhcmVcblt0YWdnZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrLnR5cGUpIHdpdGggdHlwZSBvYmplY3RzLCB3aGljaCBhcmVcbmluc3RhbnRpYXRlZCBvbmNlIHBlciBgU2NoZW1hYC5cbiovXG5jbGFzcyBNYXJrVHlwZSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbmFtZSBvZiB0aGUgbWFyayB0eXBlLlxuICAgICovXG4gICAgbmFtZSwgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByYW5rLCBcbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIHRoYXQgdGhpcyBtYXJrIHR5cGUgaW5zdGFuY2UgaXMgcGFydCBvZi5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNwZWMgb24gd2hpY2ggdGhlIHR5cGUgaXMgYmFzZWQuXG4gICAgKi9cbiAgICBzcGVjKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMucmFuayA9IHJhbms7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgICAgICB0aGlzLmF0dHJzID0gaW5pdEF0dHJzKG5hbWUsIHNwZWMuYXR0cnMpO1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkID0gbnVsbDtcbiAgICAgICAgbGV0IGRlZmF1bHRzID0gZGVmYXVsdEF0dHJzKHRoaXMuYXR0cnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gZGVmYXVsdHMgPyBuZXcgTWFyayh0aGlzLCBkZWZhdWx0cykgOiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIG9mIHRoaXMgdHlwZS4gYGF0dHJzYCBtYXkgYmUgYG51bGxgIG9yIGFuIG9iamVjdFxuICAgIGNvbnRhaW5pbmcgb25seSBzb21lIG9mIHRoZSBtYXJrJ3MgYXR0cmlidXRlcy4gVGhlIG90aGVycywgaWZcbiAgICB0aGV5IGhhdmUgZGVmYXVsdHMsIHdpbGwgYmUgYWRkZWQuXG4gICAgKi9cbiAgICBjcmVhdGUoYXR0cnMgPSBudWxsKSB7XG4gICAgICAgIGlmICghYXR0cnMgJiYgdGhpcy5pbnN0YW5jZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICAgICAgICByZXR1cm4gbmV3IE1hcmsodGhpcywgY29tcHV0ZUF0dHJzKHRoaXMuYXR0cnMsIGF0dHJzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGNvbXBpbGUobWFya3MsIHNjaGVtYSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgcmFuayA9IDA7XG4gICAgICAgIG1hcmtzLmZvckVhY2goKG5hbWUsIHNwZWMpID0+IHJlc3VsdFtuYW1lXSA9IG5ldyBNYXJrVHlwZShuYW1lLCByYW5rKyssIHNjaGVtYSwgc3BlYykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICBXaGVuIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldCwgYSBuZXcgc2V0XG4gICAgd2l0aG91dCBpdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgc2V0IGlzIHJldHVybmVkLlxuICAgICovXG4gICAgcmVtb3ZlRnJvbVNldChzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoc2V0W2ldLnR5cGUgPT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHNldCA9IHNldC5zbGljZSgwLCBpKS5jb25jYXQoc2V0LnNsaWNlKGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIGEgbWFyayBvZiB0aGlzIHR5cGUgaW4gdGhlIGdpdmVuIHNldC5cbiAgICAqL1xuICAgIGlzSW5TZXQoc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKHNldFtpXS50eXBlID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFtpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjaGVja0F0dHJzKGF0dHJzKSB7XG4gICAgICAgIGNoZWNrQXR0cnModGhpcy5hdHRycywgYXR0cnMsIFwibWFya1wiLCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBRdWVyaWVzIHdoZXRoZXIgYSBnaXZlbiBtYXJrIHR5cGUgaXNcbiAgICBbZXhjbHVkZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5NYXJrU3BlYy5leGNsdWRlcykgYnkgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBleGNsdWRlcyhvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5leGNsdWRlZC5pbmRleE9mKG90aGVyKSA+IC0xO1xuICAgIH1cbn1cbi8qKlxuQSBkb2N1bWVudCBzY2hlbWEuIEhvbGRzIFtub2RlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVR5cGUpIGFuZCBbbWFya1xudHlwZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk1hcmtUeXBlKSBvYmplY3RzIGZvciB0aGUgbm9kZXMgYW5kIG1hcmtzIHRoYXQgbWF5XG5vY2N1ciBpbiBjb25mb3JtaW5nIGRvY3VtZW50cywgYW5kIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yXG5jcmVhdGluZyBhbmQgZGVzZXJpYWxpemluZyBzdWNoIGRvY3VtZW50cy5cblxuV2hlbiBnaXZlbiwgdGhlIHR5cGUgcGFyYW1ldGVycyBwcm92aWRlIHRoZSBuYW1lcyBvZiB0aGUgbm9kZXMgYW5kXG5tYXJrcyBpbiB0aGlzIHNjaGVtYS5cbiovXG5jbGFzcyBTY2hlbWEge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHNjaGVtYSBmcm9tIGEgc2NoZW1hIFtzcGVjaWZpY2F0aW9uXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2NoZW1hU3BlYykuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzcGVjKSB7XG4gICAgICAgIC8qKlxuICAgICAgICBUaGUgW2xpbmVicmVha1xuICAgICAgICByZXBsYWNlbWVudF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmxpbmVicmVha1JlcGxhY2VtZW50KSBub2RlIGRlZmluZWRcbiAgICAgICAgaW4gdGhpcyBzY2hlbWEsIGlmIGFueS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lYnJlYWtSZXBsYWNlbWVudCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBBbiBvYmplY3QgZm9yIHN0b3Jpbmcgd2hhdGV2ZXIgdmFsdWVzIG1vZHVsZXMgbWF5IHdhbnQgdG9cbiAgICAgICAgY29tcHV0ZSBhbmQgY2FjaGUgcGVyIHNjaGVtYS4gKElmIHlvdSB3YW50IHRvIHN0b3JlIHNvbWV0aGluZ1xuICAgICAgICBpbiBpdCwgdHJ5IHRvIHVzZSBwcm9wZXJ0eSBuYW1lcyB1bmxpa2VseSB0byBjbGFzaC4pXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2FjaGVkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IGluc3RhbmNlU3BlYyA9IHRoaXMuc3BlYyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNwZWMpXG4gICAgICAgICAgICBpbnN0YW5jZVNwZWNbcHJvcF0gPSBzcGVjW3Byb3BdO1xuICAgICAgICBpbnN0YW5jZVNwZWMubm9kZXMgPSBPcmRlcmVkTWFwLmZyb20oc3BlYy5ub2RlcyksXG4gICAgICAgICAgICBpbnN0YW5jZVNwZWMubWFya3MgPSBPcmRlcmVkTWFwLmZyb20oc3BlYy5tYXJrcyB8fCB7fSksXG4gICAgICAgICAgICB0aGlzLm5vZGVzID0gTm9kZVR5cGUuY29tcGlsZSh0aGlzLnNwZWMubm9kZXMsIHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtzID0gTWFya1R5cGUuY29tcGlsZSh0aGlzLnNwZWMubWFya3MsIHRoaXMpO1xuICAgICAgICBsZXQgY29udGVudEV4cHJDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gdGhpcy5ub2Rlcykge1xuICAgICAgICAgICAgaWYgKHByb3AgaW4gdGhpcy5tYXJrcylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihwcm9wICsgXCIgY2FuIG5vdCBiZSBib3RoIGEgbm9kZSBhbmQgYSBtYXJrXCIpO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm5vZGVzW3Byb3BdLCBjb250ZW50RXhwciA9IHR5cGUuc3BlYy5jb250ZW50IHx8IFwiXCIsIG1hcmtFeHByID0gdHlwZS5zcGVjLm1hcmtzO1xuICAgICAgICAgICAgdHlwZS5jb250ZW50TWF0Y2ggPSBjb250ZW50RXhwckNhY2hlW2NvbnRlbnRFeHByXSB8fFxuICAgICAgICAgICAgICAgIChjb250ZW50RXhwckNhY2hlW2NvbnRlbnRFeHByXSA9IENvbnRlbnRNYXRjaC5wYXJzZShjb250ZW50RXhwciwgdGhpcy5ub2RlcykpO1xuICAgICAgICAgICAgdHlwZS5pbmxpbmVDb250ZW50ID0gdHlwZS5jb250ZW50TWF0Y2guaW5saW5lQ29udGVudDtcbiAgICAgICAgICAgIGlmICh0eXBlLnNwZWMubGluZWJyZWFrUmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lYnJlYWtSZXBsYWNlbWVudClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdWx0aXBsZSBsaW5lYnJlYWsgbm9kZXMgZGVmaW5lZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNJbmxpbmUgfHwgIXR5cGUuaXNMZWFmKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkxpbmVicmVhayByZXBsYWNlbWVudCBub2RlcyBtdXN0IGJlIGlubGluZSBsZWFmIG5vZGVzXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMubGluZWJyZWFrUmVwbGFjZW1lbnQgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZS5tYXJrU2V0ID0gbWFya0V4cHIgPT0gXCJfXCIgPyBudWxsIDpcbiAgICAgICAgICAgICAgICBtYXJrRXhwciA/IGdhdGhlck1hcmtzKHRoaXMsIG1hcmtFeHByLnNwbGl0KFwiIFwiKSkgOlxuICAgICAgICAgICAgICAgICAgICBtYXJrRXhwciA9PSBcIlwiIHx8ICF0eXBlLmlubGluZUNvbnRlbnQgPyBbXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0aGlzLm1hcmtzKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMubWFya3NbcHJvcF0sIGV4Y2wgPSB0eXBlLnNwZWMuZXhjbHVkZXM7XG4gICAgICAgICAgICB0eXBlLmV4Y2x1ZGVkID0gZXhjbCA9PSBudWxsID8gW3R5cGVdIDogZXhjbCA9PSBcIlwiID8gW10gOiBnYXRoZXJNYXJrcyh0aGlzLCBleGNsLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlRnJvbUpTT04gPSB0aGlzLm5vZGVGcm9tSlNPTi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm1hcmtGcm9tSlNPTiA9IHRoaXMubWFya0Zyb21KU09OLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudG9wTm9kZVR5cGUgPSB0aGlzLm5vZGVzW3RoaXMuc3BlYy50b3BOb2RlIHx8IFwiZG9jXCJdO1xuICAgICAgICB0aGlzLmNhY2hlZC53cmFwcGluZ3MgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIGluIHRoaXMgc2NoZW1hLiBUaGUgYHR5cGVgIG1heSBiZSBhIHN0cmluZyBvciBhXG4gICAgYE5vZGVUeXBlYCBpbnN0YW5jZS4gQXR0cmlidXRlcyB3aWxsIGJlIGV4dGVuZGVkIHdpdGggZGVmYXVsdHMsXG4gICAgYGNvbnRlbnRgIG1heSBiZSBhIGBGcmFnbWVudGAsIGBudWxsYCwgYSBgTm9kZWAsIG9yIGFuIGFycmF5IG9mXG4gICAgbm9kZXMuXG4gICAgKi9cbiAgICBub2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCwgbWFya3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICB0eXBlID0gdGhpcy5ub2RlVHlwZSh0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAoISh0eXBlIGluc3RhbmNlb2YgTm9kZVR5cGUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIG5vZGUgdHlwZTogXCIgKyB0eXBlKTtcbiAgICAgICAgZWxzZSBpZiAodHlwZS5zY2hlbWEgIT0gdGhpcylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm9kZSB0eXBlIGZyb20gZGlmZmVyZW50IHNjaGVtYSB1c2VkIChcIiArIHR5cGUubmFtZSArIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIHR5cGUuY3JlYXRlQ2hlY2tlZChhdHRycywgY29udGVudCwgbWFya3MpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSB0ZXh0IG5vZGUgaW4gdGhlIHNjaGVtYS4gRW1wdHkgdGV4dCBub2RlcyBhcmUgbm90XG4gICAgYWxsb3dlZC5cbiAgICAqL1xuICAgIHRleHQodGV4dCwgbWFya3MpIHtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLm5vZGVzLnRleHQ7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dE5vZGUodHlwZSwgdHlwZS5kZWZhdWx0QXR0cnMsIHRleHQsIE1hcmsuc2V0RnJvbShtYXJrcykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGF0dHJpYnV0ZXMuXG4gICAgKi9cbiAgICBtYXJrKHR5cGUsIGF0dHJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdHlwZSA9IHRoaXMubWFya3NbdHlwZV07XG4gICAgICAgIHJldHVybiB0eXBlLmNyZWF0ZShhdHRycyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbm9kZSBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbm9kZUZyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE5vZGUuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgbWFyayBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGlzIG1ldGhvZCBpc1xuICAgIGJvdW5kLlxuICAgICovXG4gICAgbWFya0Zyb21KU09OKGpzb24pIHtcbiAgICAgICAgcmV0dXJuIE1hcmsuZnJvbUpTT04odGhpcywganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbm9kZVR5cGUobmFtZSkge1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLm5vZGVzW25hbWVdO1xuICAgICAgICBpZiAoIWZvdW5kKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVbmtub3duIG5vZGUgdHlwZTogXCIgKyBuYW1lKTtcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdhdGhlck1hcmtzKHNjaGVtYSwgbWFya3MpIHtcbiAgICBsZXQgZm91bmQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBuYW1lID0gbWFya3NbaV0sIG1hcmsgPSBzY2hlbWEubWFya3NbbmFtZV0sIG9rID0gbWFyaztcbiAgICAgICAgaWYgKG1hcmspIHtcbiAgICAgICAgICAgIGZvdW5kLnB1c2gobWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNjaGVtYS5tYXJrcykge1xuICAgICAgICAgICAgICAgIGxldCBtYXJrID0gc2NoZW1hLm1hcmtzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lID09IFwiX1wiIHx8IChtYXJrLnNwZWMuZ3JvdXAgJiYgbWFyay5zcGVjLmdyb3VwLnNwbGl0KFwiIFwiKS5pbmRleE9mKG5hbWUpID4gLTEpKVxuICAgICAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKG9rID0gbWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvaylcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVua25vd24gbWFyayB0eXBlOiAnXCIgKyBtYXJrc1tpXSArIFwiJ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xufVxuXG5mdW5jdGlvbiBpc1RhZ1J1bGUocnVsZSkgeyByZXR1cm4gcnVsZS50YWcgIT0gbnVsbDsgfVxuZnVuY3Rpb24gaXNTdHlsZVJ1bGUocnVsZSkgeyByZXR1cm4gcnVsZS5zdHlsZSAhPSBudWxsOyB9XG4vKipcbkEgRE9NIHBhcnNlciByZXByZXNlbnRzIGEgc3RyYXRlZ3kgZm9yIHBhcnNpbmcgRE9NIGNvbnRlbnQgaW50byBhXG5Qcm9zZU1pcnJvciBkb2N1bWVudCBjb25mb3JtaW5nIHRvIGEgZ2l2ZW4gc2NoZW1hLiBJdHMgYmVoYXZpb3IgaXNcbmRlZmluZWQgYnkgYW4gYXJyYXkgb2YgW3J1bGVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuUGFyc2VSdWxlKS5cbiovXG5jbGFzcyBET01QYXJzZXIge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBhcnNlciB0aGF0IHRhcmdldHMgdGhlIGdpdmVuIHNjaGVtYSwgdXNpbmcgdGhlIGdpdmVuXG4gICAgcGFyc2luZyBydWxlcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzY2hlbWEgaW50byB3aGljaCB0aGUgcGFyc2VyIHBhcnNlcy5cbiAgICAqL1xuICAgIHNjaGVtYSwgXG4gICAgLyoqXG4gICAgVGhlIHNldCBvZiBbcGFyc2UgcnVsZXNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUpIHRoYXQgdGhlIHBhcnNlclxuICAgIHVzZXMsIGluIG9yZGVyIG9mIHByZWNlZGVuY2UuXG4gICAgKi9cbiAgICBydWxlcykge1xuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgICAgdGhpcy5ydWxlcyA9IHJ1bGVzO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudGFncyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuc3R5bGVzID0gW107XG4gICAgICAgIGxldCBtYXRjaGVkU3R5bGVzID0gdGhpcy5tYXRjaGVkU3R5bGVzID0gW107XG4gICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNUYWdSdWxlKHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1N0eWxlUnVsZShydWxlKSkge1xuICAgICAgICAgICAgICAgIGxldCBwcm9wID0gL1tePV0qLy5leGVjKHJ1bGUuc3R5bGUpWzBdO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkU3R5bGVzLmluZGV4T2YocHJvcCkgPCAwKVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU3R5bGVzLnB1c2gocHJvcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9ubHkgbm9ybWFsaXplIGxpc3QgZWxlbWVudHMgd2hlbiBsaXN0cyBpbiB0aGUgc2NoZW1hIGNhbid0IGRpcmVjdGx5IGNvbnRhaW4gdGhlbXNlbHZlc1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZUxpc3RzID0gIXRoaXMudGFncy5zb21lKHIgPT4ge1xuICAgICAgICAgICAgaWYgKCEvXih1bHxvbClcXGIvLnRlc3Qoci50YWcpIHx8ICFyLm5vZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBzY2hlbWEubm9kZXNbci5ub2RlXTtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnRlbnRNYXRjaC5tYXRjaFR5cGUobm9kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICBQYXJzZSBhIGRvY3VtZW50IGZyb20gdGhlIGNvbnRlbnQgb2YgYSBET00gbm9kZS5cbiAgICAqL1xuICAgIHBhcnNlKGRvbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gbmV3IFBhcnNlQ29udGV4dCh0aGlzLCBvcHRpb25zLCBmYWxzZSk7XG4gICAgICAgIGNvbnRleHQuYWRkQWxsKGRvbSwgTWFyay5ub25lLCBvcHRpb25zLmZyb20sIG9wdGlvbnMudG8pO1xuICAgICAgICByZXR1cm4gY29udGV4dC5maW5pc2goKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUGFyc2VzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gbm9kZSwgbGlrZVxuICAgIFtgcGFyc2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuRE9NUGFyc2VyLnBhcnNlKSwgYW5kIHRha2VzIHRoZSBzYW1lIHNldCBvZlxuICAgIG9wdGlvbnMuIEJ1dCB1bmxpa2UgdGhhdCBtZXRob2QsIHdoaWNoIHByb2R1Y2VzIGEgd2hvbGUgbm9kZSxcbiAgICB0aGlzIG9uZSByZXR1cm5zIGEgc2xpY2UgdGhhdCBpcyBvcGVuIGF0IHRoZSBzaWRlcywgbWVhbmluZyB0aGF0XG4gICAgdGhlIHNjaGVtYSBjb25zdHJhaW50cyBhcmVuJ3QgYXBwbGllZCB0byB0aGUgc3RhcnQgb2Ygbm9kZXMgdG9cbiAgICB0aGUgbGVmdCBvZiB0aGUgaW5wdXQgYW5kIHRoZSBlbmQgb2Ygbm9kZXMgYXQgdGhlIGVuZC5cbiAgICAqL1xuICAgIHBhcnNlU2xpY2UoZG9tLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IGNvbnRleHQgPSBuZXcgUGFyc2VDb250ZXh0KHRoaXMsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZEFsbChkb20sIE1hcmsubm9uZSwgb3B0aW9ucy5mcm9tLCBvcHRpb25zLnRvKTtcbiAgICAgICAgcmV0dXJuIFNsaWNlLm1heE9wZW4oY29udGV4dC5maW5pc2goKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWF0Y2hUYWcoZG9tLCBjb250ZXh0LCBhZnRlcikge1xuICAgICAgICBmb3IgKGxldCBpID0gYWZ0ZXIgPyB0aGlzLnRhZ3MuaW5kZXhPZihhZnRlcikgKyAxIDogMDsgaSA8IHRoaXMudGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnRhZ3NbaV07XG4gICAgICAgICAgICBpZiAobWF0Y2hlcyhkb20sIHJ1bGUudGFnKSAmJlxuICAgICAgICAgICAgICAgIChydWxlLm5hbWVzcGFjZSA9PT0gdW5kZWZpbmVkIHx8IGRvbS5uYW1lc3BhY2VVUkkgPT0gcnVsZS5uYW1lc3BhY2UpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlLmNvbnRleHQgfHwgY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpKSkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmdldEF0dHJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBydWxlLmdldEF0dHJzKGRvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIG1hdGNoU3R5bGUocHJvcCwgdmFsdWUsIGNvbnRleHQsIGFmdGVyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBhZnRlciA/IHRoaXMuc3R5bGVzLmluZGV4T2YoYWZ0ZXIpICsgMSA6IDA7IGkgPCB0aGlzLnN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnN0eWxlc1tpXSwgc3R5bGUgPSBydWxlLnN0eWxlO1xuICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YocHJvcCkgIT0gMCB8fFxuICAgICAgICAgICAgICAgIHJ1bGUuY29udGV4dCAmJiAhY29udGV4dC5tYXRjaGVzQ29udGV4dChydWxlLmNvbnRleHQpIHx8XG4gICAgICAgICAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBzdHlsZSBzdHJpbmcgZWl0aGVyIHByZWNpc2VseSBtYXRjaGVzIHRoZSBwcm9wLFxuICAgICAgICAgICAgICAgIC8vIG9yIGhhcyBhbiAnPScgc2lnbiBhZnRlciB0aGUgcHJvcCwgZm9sbG93ZWQgYnkgdGhlIGdpdmVuXG4gICAgICAgICAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgICAgICAgICAgc3R5bGUubGVuZ3RoID4gcHJvcC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKHN0eWxlLmNoYXJDb2RlQXQocHJvcC5sZW5ndGgpICE9IDYxIHx8IHN0eWxlLnNsaWNlKHByb3AubGVuZ3RoICsgMSkgIT0gdmFsdWUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJ1bGUuZ2V0QXR0cnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcnVsZS5nZXRBdHRycyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJ1bGUuYXR0cnMgPSByZXN1bHQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgc2NoZW1hUnVsZXMoc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0KHJ1bGUpIHtcbiAgICAgICAgICAgIGxldCBwcmlvcml0eSA9IHJ1bGUucHJpb3JpdHkgPT0gbnVsbCA/IDUwIDogcnVsZS5wcmlvcml0eSwgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gcmVzdWx0W2ldLCBuZXh0UHJpb3JpdHkgPSBuZXh0LnByaW9yaXR5ID09IG51bGwgPyA1MCA6IG5leHQucHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRQcmlvcml0eSA8IHByaW9yaXR5KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoaSwgMCwgcnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBzY2hlbWEubWFya3MpIHtcbiAgICAgICAgICAgIGxldCBydWxlcyA9IHNjaGVtYS5tYXJrc1tuYW1lXS5zcGVjLnBhcnNlRE9NO1xuICAgICAgICAgICAgaWYgKHJ1bGVzKVxuICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydChydWxlID0gY29weShydWxlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHJ1bGUubWFyayB8fCBydWxlLmlnbm9yZSB8fCBydWxlLmNsZWFyTWFyaykpXG4gICAgICAgICAgICAgICAgICAgICAgICBydWxlLm1hcmsgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gc2NoZW1hLm5vZGVzKSB7XG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBzY2hlbWEubm9kZXNbbmFtZV0uc3BlYy5wYXJzZURPTTtcbiAgICAgICAgICAgIGlmIChydWxlcylcbiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbnNlcnQocnVsZSA9IGNvcHkocnVsZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShydWxlLm5vZGUgfHwgcnVsZS5pZ25vcmUgfHwgcnVsZS5tYXJrKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUubm9kZSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGEgRE9NIHBhcnNlciB1c2luZyB0aGUgcGFyc2luZyBydWxlcyBsaXN0ZWQgaW4gYVxuICAgIHNjaGVtYSdzIFtub2RlIHNwZWNzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMucGFyc2VET00pLCByZW9yZGVyZWQgYnlcbiAgICBbcHJpb3JpdHldKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5QYXJzZVJ1bGUucHJpb3JpdHkpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuY2FjaGVkLmRvbVBhcnNlciB8fFxuICAgICAgICAgICAgKHNjaGVtYS5jYWNoZWQuZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcihzY2hlbWEsIERPTVBhcnNlci5zY2hlbWFSdWxlcyhzY2hlbWEpKSk7XG4gICAgfVxufVxuY29uc3QgYmxvY2tUYWdzID0ge1xuICAgIGFkZHJlc3M6IHRydWUsIGFydGljbGU6IHRydWUsIGFzaWRlOiB0cnVlLCBibG9ja3F1b3RlOiB0cnVlLCBjYW52YXM6IHRydWUsXG4gICAgZGQ6IHRydWUsIGRpdjogdHJ1ZSwgZGw6IHRydWUsIGZpZWxkc2V0OiB0cnVlLCBmaWdjYXB0aW9uOiB0cnVlLCBmaWd1cmU6IHRydWUsXG4gICAgZm9vdGVyOiB0cnVlLCBmb3JtOiB0cnVlLCBoMTogdHJ1ZSwgaDI6IHRydWUsIGgzOiB0cnVlLCBoNDogdHJ1ZSwgaDU6IHRydWUsXG4gICAgaDY6IHRydWUsIGhlYWRlcjogdHJ1ZSwgaGdyb3VwOiB0cnVlLCBocjogdHJ1ZSwgbGk6IHRydWUsIG5vc2NyaXB0OiB0cnVlLCBvbDogdHJ1ZSxcbiAgICBvdXRwdXQ6IHRydWUsIHA6IHRydWUsIHByZTogdHJ1ZSwgc2VjdGlvbjogdHJ1ZSwgdGFibGU6IHRydWUsIHRmb290OiB0cnVlLCB1bDogdHJ1ZVxufTtcbmNvbnN0IGlnbm9yZVRhZ3MgPSB7XG4gICAgaGVhZDogdHJ1ZSwgbm9zY3JpcHQ6IHRydWUsIG9iamVjdDogdHJ1ZSwgc2NyaXB0OiB0cnVlLCBzdHlsZTogdHJ1ZSwgdGl0bGU6IHRydWVcbn07XG5jb25zdCBsaXN0VGFncyA9IHsgb2w6IHRydWUsIHVsOiB0cnVlIH07XG4vLyBVc2luZyBhIGJpdGZpZWxkIGZvciBub2RlIGNvbnRleHQgb3B0aW9uc1xuY29uc3QgT1BUX1BSRVNFUlZFX1dTID0gMSwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgPSAyLCBPUFRfT1BFTl9MRUZUID0gNDtcbmZ1bmN0aW9uIHdzT3B0aW9uc0Zvcih0eXBlLCBwcmVzZXJ2ZVdoaXRlc3BhY2UsIGJhc2UpIHtcbiAgICBpZiAocHJlc2VydmVXaGl0ZXNwYWNlICE9IG51bGwpXG4gICAgICAgIHJldHVybiAocHJlc2VydmVXaGl0ZXNwYWNlID8gT1BUX1BSRVNFUlZFX1dTIDogMCkgfFxuICAgICAgICAgICAgKHByZXNlcnZlV2hpdGVzcGFjZSA9PT0gXCJmdWxsXCIgPyBPUFRfUFJFU0VSVkVfV1NfRlVMTCA6IDApO1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gT1BUX1BSRVNFUlZFX1dTIHwgT1BUX1BSRVNFUlZFX1dTX0ZVTEwgOiBiYXNlICYgfk9QVF9PUEVOX0xFRlQ7XG59XG5jbGFzcyBOb2RlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgYXR0cnMsIG1hcmtzLCBzb2xpZCwgbWF0Y2gsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzO1xuICAgICAgICB0aGlzLm1hcmtzID0gbWFya3M7XG4gICAgICAgIHRoaXMuc29saWQgPSBzb2xpZDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5jb250ZW50ID0gW107XG4gICAgICAgIC8vIE1hcmtzIGFwcGxpZWQgdG8gdGhlIG5vZGUncyBjaGlsZHJlblxuICAgICAgICB0aGlzLmFjdGl2ZU1hcmtzID0gTWFyay5ub25lO1xuICAgICAgICB0aGlzLm1hdGNoID0gbWF0Y2ggfHwgKG9wdGlvbnMgJiBPUFRfT1BFTl9MRUZUID8gbnVsbCA6IHR5cGUuY29udGVudE1hdGNoKTtcbiAgICB9XG4gICAgZmluZFdyYXBwaW5nKG5vZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICBsZXQgZmlsbCA9IHRoaXMudHlwZS5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5mcm9tKG5vZGUpKTtcbiAgICAgICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaCA9IHRoaXMudHlwZS5jb250ZW50TWF0Y2gubWF0Y2hGcmFnbWVudChmaWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMudHlwZS5jb250ZW50TWF0Y2gsIHdyYXA7XG4gICAgICAgICAgICAgICAgaWYgKHdyYXAgPSBzdGFydC5maW5kV3JhcHBpbmcobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoLmZpbmRXcmFwcGluZyhub2RlLnR5cGUpO1xuICAgIH1cbiAgICBmaW5pc2gob3BlbkVuZCkge1xuICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMgJiBPUFRfUFJFU0VSVkVfV1MpKSB7IC8vIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSwgbTtcbiAgICAgICAgICAgIGlmIChsYXN0ICYmIGxhc3QuaXNUZXh0ICYmIChtID0gL1sgXFx0XFxyXFxuXFx1MDAwY10rJC8uZXhlYyhsYXN0LnRleHQpKSkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gbGFzdDtcbiAgICAgICAgICAgICAgICBpZiAobGFzdC50ZXh0Lmxlbmd0aCA9PSBtWzBdLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnBvcCgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50W3RoaXMuY29udGVudC5sZW5ndGggLSAxXSA9IHRleHQud2l0aFRleHQodGV4dC50ZXh0LnNsaWNlKDAsIHRleHQudGV4dC5sZW5ndGggLSBtWzBdLmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjb250ZW50ID0gRnJhZ21lbnQuZnJvbSh0aGlzLmNvbnRlbnQpO1xuICAgICAgICBpZiAoIW9wZW5FbmQgJiYgdGhpcy5tYXRjaClcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmFwcGVuZCh0aGlzLm1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA/IHRoaXMudHlwZS5jcmVhdGUodGhpcy5hdHRycywgY29udGVudCwgdGhpcy5tYXJrcykgOiBjb250ZW50O1xuICAgIH1cbiAgICBpbmxpbmVDb250ZXh0KG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUuaW5saW5lQ29udGVudDtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50WzBdLmlzSW5saW5lO1xuICAgICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlICYmICFibG9ja1RhZ3MuaGFzT3duUHJvcGVydHkobm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbn1cbmNsYXNzIFBhcnNlQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhlIHBhcnNlciB3ZSBhcmUgdXNpbmcuXG4gICAgcGFyc2VyLCBcbiAgICAvLyBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhpcyBwYXJzZS5cbiAgICBvcHRpb25zLCBpc09wZW4pIHtcbiAgICAgICAgdGhpcy5wYXJzZXIgPSBwYXJzZXI7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gaXNPcGVuO1xuICAgICAgICB0aGlzLm9wZW4gPSAwO1xuICAgICAgICB0aGlzLmxvY2FsUHJlc2VydmVXUyA9IGZhbHNlO1xuICAgICAgICBsZXQgdG9wTm9kZSA9IG9wdGlvbnMudG9wTm9kZSwgdG9wQ29udGV4dDtcbiAgICAgICAgbGV0IHRvcE9wdGlvbnMgPSB3c09wdGlvbnNGb3IobnVsbCwgb3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2UsIDApIHwgKGlzT3BlbiA/IE9QVF9PUEVOX0xFRlQgOiAwKTtcbiAgICAgICAgaWYgKHRvcE5vZGUpXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KHRvcE5vZGUudHlwZSwgdG9wTm9kZS5hdHRycywgTWFyay5ub25lLCB0cnVlLCBvcHRpb25zLnRvcE1hdGNoIHx8IHRvcE5vZGUudHlwZS5jb250ZW50TWF0Y2gsIHRvcE9wdGlvbnMpO1xuICAgICAgICBlbHNlIGlmIChpc09wZW4pXG4gICAgICAgICAgICB0b3BDb250ZXh0ID0gbmV3IE5vZGVDb250ZXh0KG51bGwsIG51bGwsIE1hcmsubm9uZSwgdHJ1ZSwgbnVsbCwgdG9wT3B0aW9ucyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRvcENvbnRleHQgPSBuZXcgTm9kZUNvbnRleHQocGFyc2VyLnNjaGVtYS50b3BOb2RlVHlwZSwgbnVsbCwgTWFyay5ub25lLCB0cnVlLCBudWxsLCB0b3BPcHRpb25zKTtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFt0b3BDb250ZXh0XTtcbiAgICAgICAgdGhpcy5maW5kID0gb3B0aW9ucy5maW5kUG9zaXRpb25zO1xuICAgICAgICB0aGlzLm5lZWRzQmxvY2sgPSBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXNbdGhpcy5vcGVuXTtcbiAgICB9XG4gICAgLy8gQWRkIGEgRE9NIG5vZGUgdG8gdGhlIGNvbnRlbnQuIFRleHQgaXMgaW5zZXJ0ZWQgYXMgdGV4dCBub2RlLFxuICAgIC8vIG90aGVyd2lzZSwgdGhlIG5vZGUgaXMgcGFzc2VkIHRvIGBhZGRFbGVtZW50YCBvciwgaWYgaXQgaGFzIGFcbiAgICAvLyBgc3R5bGVgIGF0dHJpYnV0ZSwgYGFkZEVsZW1lbnRXaXRoU3R5bGVzYC5cbiAgICBhZGRET00oZG9tLCBtYXJrcykge1xuICAgICAgICBpZiAoZG9tLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKGRvbSwgbWFya3MpO1xuICAgICAgICBlbHNlIGlmIChkb20ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudChkb20sIG1hcmtzKTtcbiAgICB9XG4gICAgYWRkVGV4dE5vZGUoZG9tLCBtYXJrcykge1xuICAgICAgICBsZXQgdmFsdWUgPSBkb20ubm9kZVZhbHVlO1xuICAgICAgICBsZXQgdG9wID0gdGhpcy50b3AsIHByZXNlcnZlV1MgPSAodG9wLm9wdGlvbnMgJiBPUFRfUFJFU0VSVkVfV1NfRlVMTCkgPyBcImZ1bGxcIlxuICAgICAgICAgICAgOiB0aGlzLmxvY2FsUHJlc2VydmVXUyB8fCAodG9wLm9wdGlvbnMgJiBPUFRfUFJFU0VSVkVfV1MpID4gMDtcbiAgICAgICAgaWYgKHByZXNlcnZlV1MgPT09IFwiZnVsbFwiIHx8XG4gICAgICAgICAgICB0b3AuaW5saW5lQ29udGV4dChkb20pIHx8XG4gICAgICAgICAgICAvW14gXFx0XFxyXFxuXFx1MDAwY10vLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlV1MpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1sgXFx0XFxyXFxuXFx1MDAwY10rL2csIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YXJ0cyB3aXRoIHdoaXRlc3BhY2UsIGFuZCB0aGVyZSBpcyBubyBub2RlIGJlZm9yZSBpdCwgb3JcbiAgICAgICAgICAgICAgICAvLyBhIGhhcmQgYnJlYWssIG9yIGEgdGV4dCBub2RlIHRoYXQgZW5kcyB3aXRoIHdoaXRlc3BhY2UsIHN0cmlwIHRoZVxuICAgICAgICAgICAgICAgIC8vIGxlYWRpbmcgc3BhY2UuXG4gICAgICAgICAgICAgICAgaWYgKC9eWyBcXHRcXHJcXG5cXHUwMDBjXS8udGVzdCh2YWx1ZSkgJiYgdGhpcy5vcGVuID09IHRoaXMubm9kZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZUJlZm9yZSA9IHRvcC5jb250ZW50W3RvcC5jb250ZW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tTm9kZUJlZm9yZSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZUJlZm9yZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRvbU5vZGVCZWZvcmUgJiYgZG9tTm9kZUJlZm9yZS5ub2RlTmFtZSA9PSAnQlInKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5vZGVCZWZvcmUuaXNUZXh0ICYmIC9bIFxcdFxcclxcblxcdTAwMGNdJC8udGVzdChub2RlQmVmb3JlLnRleHQpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJlc2VydmVXUyAhPT0gXCJmdWxsXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xccj9cXG58XFxyL2csIFwiIFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxyXFxuPy9nLCBcIlxcblwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydE5vZGUodGhpcy5wYXJzZXIuc2NoZW1hLnRleHQodmFsdWUpLCBtYXJrcywgIS9cXFMvLnRlc3QodmFsdWUpKTtcbiAgICAgICAgICAgIHRoaXMuZmluZEluVGV4dChkb20pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maW5kSW5zaWRlKGRvbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpbmQgYSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdGFnIGFuZCB1c2UgdGhhdCB0byBwYXJzZS4gSWZcbiAgICAvLyBub25lIGlzIGZvdW5kLCB0aGUgZWxlbWVudCdzIGNvbnRlbnQgbm9kZXMgYXJlIGFkZGVkIGRpcmVjdGx5LlxuICAgIGFkZEVsZW1lbnQoZG9tLCBtYXJrcywgbWF0Y2hBZnRlcikge1xuICAgICAgICBsZXQgb3V0ZXJXUyA9IHRoaXMubG9jYWxQcmVzZXJ2ZVdTLCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgaWYgKGRvbS50YWdOYW1lID09IFwiUFJFXCIgfHwgL3ByZS8udGVzdChkb20uc3R5bGUgJiYgZG9tLnN0eWxlLndoaXRlU3BhY2UpKVxuICAgICAgICAgICAgdGhpcy5sb2NhbFByZXNlcnZlV1MgPSB0cnVlO1xuICAgICAgICBsZXQgbmFtZSA9IGRvbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBydWxlSUQ7XG4gICAgICAgIGlmIChsaXN0VGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB0aGlzLnBhcnNlci5ub3JtYWxpemVMaXN0cylcbiAgICAgICAgICAgIG5vcm1hbGl6ZUxpc3QoZG9tKTtcbiAgICAgICAgbGV0IHJ1bGUgPSAodGhpcy5vcHRpb25zLnJ1bGVGcm9tTm9kZSAmJiB0aGlzLm9wdGlvbnMucnVsZUZyb21Ob2RlKGRvbSkpIHx8XG4gICAgICAgICAgICAocnVsZUlEID0gdGhpcy5wYXJzZXIubWF0Y2hUYWcoZG9tLCB0aGlzLCBtYXRjaEFmdGVyKSk7XG4gICAgICAgIG91dDogaWYgKHJ1bGUgPyBydWxlLmlnbm9yZSA6IGlnbm9yZVRhZ3MuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEluc2lkZShkb20pO1xuICAgICAgICAgICAgdGhpcy5pZ25vcmVGYWxsYmFjayhkb20sIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcnVsZSB8fCBydWxlLnNraXAgfHwgcnVsZS5jbG9zZVBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5jbG9zZVBhcmVudClcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBNYXRoLm1heCgwLCB0aGlzLm9wZW4gLSAxKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUgJiYgcnVsZS5za2lwLm5vZGVUeXBlKVxuICAgICAgICAgICAgICAgIGRvbSA9IHJ1bGUuc2tpcDtcbiAgICAgICAgICAgIGxldCBzeW5jLCBvbGROZWVkc0Jsb2NrID0gdGhpcy5uZWVkc0Jsb2NrO1xuICAgICAgICAgICAgaWYgKGJsb2NrVGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgIGlmICh0b3AuY29udGVudC5sZW5ndGggJiYgdG9wLmNvbnRlbnRbMF0uaXNJbmxpbmUgJiYgdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3Blbi0tO1xuICAgICAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0b3AudHlwZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZWVkc0Jsb2NrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFkb20uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGVhZkZhbGxiYWNrKGRvbSwgbWFya3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrIG91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpbm5lck1hcmtzID0gcnVsZSAmJiBydWxlLnNraXAgPyBtYXJrcyA6IHRoaXMucmVhZFN0eWxlcyhkb20sIG1hcmtzKTtcbiAgICAgICAgICAgIGlmIChpbm5lck1hcmtzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQWxsKGRvbSwgaW5uZXJNYXJrcyk7XG4gICAgICAgICAgICBpZiAoc3luYylcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmModG9wKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNCbG9jayA9IG9sZE5lZWRzQmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW5uZXJNYXJrcyA9IHRoaXMucmVhZFN0eWxlcyhkb20sIG1hcmtzKTtcbiAgICAgICAgICAgIGlmIChpbm5lck1hcmtzKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudEJ5UnVsZShkb20sIHJ1bGUsIGlubmVyTWFya3MsIHJ1bGUuY29uc3VtaW5nID09PSBmYWxzZSA/IHJ1bGVJRCA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2NhbFByZXNlcnZlV1MgPSBvdXRlcldTO1xuICAgIH1cbiAgICAvLyBDYWxsZWQgZm9yIGxlYWYgRE9NIG5vZGVzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGlnbm9yZWRcbiAgICBsZWFmRmFsbGJhY2soZG9tLCBtYXJrcykge1xuICAgICAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiQlJcIiAmJiB0aGlzLnRvcC50eXBlICYmIHRoaXMudG9wLnR5cGUuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHRoaXMuYWRkVGV4dE5vZGUoZG9tLm93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcXG5cIiksIG1hcmtzKTtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGZvciBpZ25vcmVkIG5vZGVzXG4gICAgaWdub3JlRmFsbGJhY2soZG9tLCBtYXJrcykge1xuICAgICAgICAvLyBJZ25vcmVkIEJSIG5vZGVzIHNob3VsZCBhdCBsZWFzdCBjcmVhdGUgYW4gaW5saW5lIGNvbnRleHRcbiAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgKCF0aGlzLnRvcC50eXBlIHx8ICF0aGlzLnRvcC50eXBlLmlubGluZUNvbnRlbnQpKVxuICAgICAgICAgICAgdGhpcy5maW5kUGxhY2UodGhpcy5wYXJzZXIuc2NoZW1hLnRleHQoXCItXCIpLCBtYXJrcywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIFJ1biBhbnkgc3R5bGUgcGFyc2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZSdzIHN0eWxlcy4gRWl0aGVyXG4gICAgLy8gcmV0dXJuIGFuIHVwZGF0ZWQgYXJyYXkgb2YgbWFya3MsIG9yIG51bGwgdG8gaW5kaWNhdGUgc29tZSBvZiB0aGVcbiAgICAvLyBzdHlsZXMgaGFkIGEgcnVsZSB3aXRoIGBpZ25vcmVgIHNldC5cbiAgICByZWFkU3R5bGVzKGRvbSwgbWFya3MpIHtcbiAgICAgICAgbGV0IHN0eWxlcyA9IGRvbS5zdHlsZTtcbiAgICAgICAgLy8gQmVjYXVzZSBtYW55IHByb3BlcnRpZXMgd2lsbCBvbmx5IHNob3cgdXAgaW4gJ25vcm1hbGl6ZWQnIGZvcm1cbiAgICAgICAgLy8gaW4gYHN0eWxlLml0ZW1gIChpLmUuIHRleHQtZGVjb3JhdGlvbiBiZWNvbWVzXG4gICAgICAgIC8vIHRleHQtZGVjb3JhdGlvbi1saW5lLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGV0YyksIHdlIGRpcmVjdGx5XG4gICAgICAgIC8vIHF1ZXJ5IHRoZSBzdHlsZXMgbWVudGlvbmVkIGluIG91ciBydWxlcyBpbnN0ZWFkIG9mIGl0ZXJhdGluZ1xuICAgICAgICAvLyBvdmVyIHRoZSBpdGVtcy5cbiAgICAgICAgaWYgKHN0eWxlcyAmJiBzdHlsZXMubGVuZ3RoKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhcnNlci5tYXRjaGVkU3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhcnNlci5tYXRjaGVkU3R5bGVzW2ldLCB2YWx1ZSA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWZ0ZXIgPSB1bmRlZmluZWQ7Oykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSB0aGlzLnBhcnNlci5tYXRjaFN0eWxlKG5hbWUsIHZhbHVlLCB0aGlzLCBhZnRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pZ25vcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5jbGVhck1hcmspXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5maWx0ZXIobSA9PiAhcnVsZS5jbGVhck1hcmsobSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtzID0gbWFya3MuY29uY2F0KHRoaXMucGFyc2VyLnNjaGVtYS5tYXJrc1tydWxlLm1hcmtdLmNyZWF0ZShydWxlLmF0dHJzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5jb25zdW1pbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gcnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8vIExvb2sgdXAgYSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gbm9kZS4gSWYgbm9uZSBhcmUgZm91bmQsIHJldHVyblxuICAgIC8vIGZhbHNlLiBPdGhlcndpc2UsIGFwcGx5IGl0LCB1c2UgaXRzIHJldHVybiB2YWx1ZSB0byBkcml2ZSB0aGUgd2F5XG4gICAgLy8gdGhlIG5vZGUncyBjb250ZW50IGlzIHdyYXBwZWQsIGFuZCByZXR1cm4gdHJ1ZS5cbiAgICBhZGRFbGVtZW50QnlSdWxlKGRvbSwgcnVsZSwgbWFya3MsIGNvbnRpbnVlQWZ0ZXIpIHtcbiAgICAgICAgbGV0IHN5bmMsIG5vZGVUeXBlO1xuICAgICAgICBpZiAocnVsZS5ub2RlKSB7XG4gICAgICAgICAgICBub2RlVHlwZSA9IHRoaXMucGFyc2VyLnNjaGVtYS5ub2Rlc1tydWxlLm5vZGVdO1xuICAgICAgICAgICAgaWYgKCFub2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5uZXIgPSB0aGlzLmVudGVyKG5vZGVUeXBlLCBydWxlLmF0dHJzIHx8IG51bGwsIG1hcmtzLCBydWxlLnByZXNlcnZlV2hpdGVzcGFjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtYXJrcyA9IGlubmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmluc2VydE5vZGUobm9kZVR5cGUuY3JlYXRlKHJ1bGUuYXR0cnMpLCBtYXJrcywgZG9tLm5vZGVOYW1lID09IFwiQlJcIikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxlYWZGYWxsYmFjayhkb20sIG1hcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtYXJrVHlwZSA9IHRoaXMucGFyc2VyLnNjaGVtYS5tYXJrc1tydWxlLm1hcmtdO1xuICAgICAgICAgICAgbWFya3MgPSBtYXJrcy5jb25jYXQobWFya1R5cGUuY3JlYXRlKHJ1bGUuYXR0cnMpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnRJbiA9IHRoaXMudG9wO1xuICAgICAgICBpZiAobm9kZVR5cGUgJiYgbm9kZVR5cGUuaXNMZWFmKSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250aW51ZUFmdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnQoZG9tLCBtYXJrcywgY29udGludWVBZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnVsZS5nZXRDb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmZpbmRJbnNpZGUoZG9tKTtcbiAgICAgICAgICAgIHJ1bGUuZ2V0Q29udGVudChkb20sIHRoaXMucGFyc2VyLnNjaGVtYSkuZm9yRWFjaChub2RlID0+IHRoaXMuaW5zZXJ0Tm9kZShub2RlLCBtYXJrcywgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50RE9NID0gZG9tO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBydWxlLmNvbnRlbnRFbGVtZW50ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgY29udGVudERPTSA9IGRvbS5xdWVyeVNlbGVjdG9yKHJ1bGUuY29udGVudEVsZW1lbnQpO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHJ1bGUuY29udGVudEVsZW1lbnQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBydWxlLmNvbnRlbnRFbGVtZW50KGRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlLmNvbnRlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBydWxlLmNvbnRlbnRFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5maW5kQXJvdW5kKGRvbSwgY29udGVudERPTSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmFkZEFsbChjb250ZW50RE9NLCBtYXJrcyk7XG4gICAgICAgICAgICB0aGlzLmZpbmRBcm91bmQoZG9tLCBjb250ZW50RE9NLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5bmMgJiYgdGhpcy5zeW5jKHN0YXJ0SW4pKVxuICAgICAgICAgICAgdGhpcy5vcGVuLS07XG4gICAgfVxuICAgIC8vIEFkZCBhbGwgY2hpbGQgbm9kZXMgYmV0d2VlbiBgc3RhcnRJbmRleGAgYW5kIGBlbmRJbmRleGAgKG9yIHRoZVxuICAgIC8vIHdob2xlIG5vZGUsIGlmIG5vdCBnaXZlbikuIElmIGBzeW5jYCBpcyBwYXNzZWQsIHVzZSBpdCB0b1xuICAgIC8vIHN5bmNocm9uaXplIGFmdGVyIGV2ZXJ5IGJsb2NrIGVsZW1lbnQuXG4gICAgYWRkQWxsKHBhcmVudCwgbWFya3MsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7XG4gICAgICAgIGxldCBpbmRleCA9IHN0YXJ0SW5kZXggfHwgMDtcbiAgICAgICAgZm9yIChsZXQgZG9tID0gc3RhcnRJbmRleCA/IHBhcmVudC5jaGlsZE5vZGVzW3N0YXJ0SW5kZXhdIDogcGFyZW50LmZpcnN0Q2hpbGQsIGVuZCA9IGVuZEluZGV4ID09IG51bGwgPyBudWxsIDogcGFyZW50LmNoaWxkTm9kZXNbZW5kSW5kZXhdOyBkb20gIT0gZW5kOyBkb20gPSBkb20ubmV4dFNpYmxpbmcsICsraW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuZmluZEF0UG9pbnQocGFyZW50LCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLmFkZERPTShkb20sIG1hcmtzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmRBdFBvaW50KHBhcmVudCwgaW5kZXgpO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gZmluZCBhIHdheSB0byBmaXQgdGhlIGdpdmVuIG5vZGUgdHlwZSBpbnRvIHRoZSBjdXJyZW50XG4gICAgLy8gY29udGV4dC4gTWF5IGFkZCBpbnRlcm1lZGlhdGUgd3JhcHBlcnMgYW5kL29yIGxlYXZlIG5vbi1zb2xpZFxuICAgIC8vIG5vZGVzIHRoYXQgd2UncmUgaW4uXG4gICAgZmluZFBsYWNlKG5vZGUsIG1hcmtzLCBjYXV0aW91cykge1xuICAgICAgICBsZXQgcm91dGUsIHN5bmM7XG4gICAgICAgIGZvciAobGV0IGRlcHRoID0gdGhpcy5vcGVuLCBwZW5hbHR5ID0gMDsgZGVwdGggPj0gMDsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGN4ID0gdGhpcy5ub2Rlc1tkZXB0aF07XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBjeC5maW5kV3JhcHBpbmcobm9kZSk7XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgKCFyb3V0ZSB8fCByb3V0ZS5sZW5ndGggPiBmb3VuZC5sZW5ndGggKyBwZW5hbHR5KSkge1xuICAgICAgICAgICAgICAgIHJvdXRlID0gZm91bmQ7XG4gICAgICAgICAgICAgICAgc3luYyA9IGN4O1xuICAgICAgICAgICAgICAgIGlmICghZm91bmQubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjeC5zb2xpZCkge1xuICAgICAgICAgICAgICAgIGlmIChjYXV0aW91cylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgcGVuYWx0eSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcm91dGUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdGhpcy5zeW5jKHN5bmMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgbWFya3MgPSB0aGlzLmVudGVySW5uZXIocm91dGVbaV0sIG51bGwsIG1hcmtzLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGluc2VydCB0aGUgZ2l2ZW4gbm9kZSwgYWRqdXN0aW5nIHRoZSBjb250ZXh0IHdoZW4gbmVlZGVkLlxuICAgIGluc2VydE5vZGUobm9kZSwgbWFya3MsIGNhdXRpb3VzKSB7XG4gICAgICAgIGlmIChub2RlLmlzSW5saW5lICYmIHRoaXMubmVlZHNCbG9jayAmJiAhdGhpcy50b3AudHlwZSkge1xuICAgICAgICAgICAgbGV0IGJsb2NrID0gdGhpcy50ZXh0YmxvY2tGcm9tQ29udGV4dCgpO1xuICAgICAgICAgICAgaWYgKGJsb2NrKVxuICAgICAgICAgICAgICAgIG1hcmtzID0gdGhpcy5lbnRlcklubmVyKGJsb2NrLCBudWxsLCBtYXJrcyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlubmVyTWFya3MgPSB0aGlzLmZpbmRQbGFjZShub2RlLCBtYXJrcywgY2F1dGlvdXMpO1xuICAgICAgICBpZiAoaW5uZXJNYXJrcykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUV4dHJhKCk7XG4gICAgICAgICAgICBsZXQgdG9wID0gdGhpcy50b3A7XG4gICAgICAgICAgICBpZiAodG9wLm1hdGNoKVxuICAgICAgICAgICAgICAgIHRvcC5tYXRjaCA9IHRvcC5tYXRjaC5tYXRjaFR5cGUobm9kZS50eXBlKTtcbiAgICAgICAgICAgIGxldCBub2RlTWFya3MgPSBNYXJrLm5vbmU7XG4gICAgICAgICAgICBmb3IgKGxldCBtIG9mIGlubmVyTWFya3MuY29uY2F0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgICAgIGlmICh0b3AudHlwZSA/IHRvcC50eXBlLmFsbG93c01hcmtUeXBlKG0udHlwZSkgOiBtYXJrTWF5QXBwbHkobS50eXBlLCBub2RlLnR5cGUpKVxuICAgICAgICAgICAgICAgICAgICBub2RlTWFya3MgPSBtLmFkZFRvU2V0KG5vZGVNYXJrcyk7XG4gICAgICAgICAgICB0b3AuY29udGVudC5wdXNoKG5vZGUubWFyayhub2RlTWFya3MpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIHN0YXJ0IGEgbm9kZSBvZiB0aGUgZ2l2ZW4gdHlwZSwgYWRqdXN0aW5nIHRoZSBjb250ZXh0IHdoZW5cbiAgICAvLyBuZWNlc3NhcnkuXG4gICAgZW50ZXIodHlwZSwgYXR0cnMsIG1hcmtzLCBwcmVzZXJ2ZVdTKSB7XG4gICAgICAgIGxldCBpbm5lck1hcmtzID0gdGhpcy5maW5kUGxhY2UodHlwZS5jcmVhdGUoYXR0cnMpLCBtYXJrcywgZmFsc2UpO1xuICAgICAgICBpZiAoaW5uZXJNYXJrcylcbiAgICAgICAgICAgIGlubmVyTWFya3MgPSB0aGlzLmVudGVySW5uZXIodHlwZSwgYXR0cnMsIG1hcmtzLCB0cnVlLCBwcmVzZXJ2ZVdTKTtcbiAgICAgICAgcmV0dXJuIGlubmVyTWFya3M7XG4gICAgfVxuICAgIC8vIE9wZW4gYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG4gICAgZW50ZXJJbm5lcih0eXBlLCBhdHRycywgbWFya3MsIHNvbGlkID0gZmFsc2UsIHByZXNlcnZlV1MpIHtcbiAgICAgICAgdGhpcy5jbG9zZUV4dHJhKCk7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnRvcDtcbiAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoICYmIHRvcC5tYXRjaC5tYXRjaFR5cGUodHlwZSk7XG4gICAgICAgIGxldCBvcHRpb25zID0gd3NPcHRpb25zRm9yKHR5cGUsIHByZXNlcnZlV1MsIHRvcC5vcHRpb25zKTtcbiAgICAgICAgaWYgKCh0b3Aub3B0aW9ucyAmIE9QVF9PUEVOX0xFRlQpICYmIHRvcC5jb250ZW50Lmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgb3B0aW9ucyB8PSBPUFRfT1BFTl9MRUZUO1xuICAgICAgICBsZXQgYXBwbHlNYXJrcyA9IE1hcmsubm9uZTtcbiAgICAgICAgbWFya3MgPSBtYXJrcy5maWx0ZXIobSA9PiB7XG4gICAgICAgICAgICBpZiAodG9wLnR5cGUgPyB0b3AudHlwZS5hbGxvd3NNYXJrVHlwZShtLnR5cGUpIDogbWFya01heUFwcGx5KG0udHlwZSwgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICBhcHBseU1hcmtzID0gbS5hZGRUb1NldChhcHBseU1hcmtzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm9kZXMucHVzaChuZXcgTm9kZUNvbnRleHQodHlwZSwgYXR0cnMsIGFwcGx5TWFya3MsIHNvbGlkLCBudWxsLCBvcHRpb25zKSk7XG4gICAgICAgIHRoaXMub3BlbisrO1xuICAgICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSBhbGwgbm9kZXMgYWJvdmUgdGhpcy5vcGVuIGFyZSBmaW5pc2hlZCBhbmQgYWRkZWQgdG9cbiAgICAvLyB0aGVpciBwYXJlbnRzXG4gICAgY2xvc2VFeHRyYShvcGVuRW5kID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChpID4gdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICBmb3IgKDsgaSA+IHRoaXMub3BlbjsgaS0tKVxuICAgICAgICAgICAgICAgIHRoaXMubm9kZXNbaSAtIDFdLmNvbnRlbnQucHVzaCh0aGlzLm5vZGVzW2ldLmZpbmlzaChvcGVuRW5kKSk7XG4gICAgICAgICAgICB0aGlzLm5vZGVzLmxlbmd0aCA9IHRoaXMub3BlbiArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLm9wZW4gPSAwO1xuICAgICAgICB0aGlzLmNsb3NlRXh0cmEodGhpcy5pc09wZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2Rlc1swXS5maW5pc2goISEodGhpcy5pc09wZW4gfHwgdGhpcy5vcHRpb25zLnRvcE9wZW4pKTtcbiAgICB9XG4gICAgc3luYyh0bykge1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5vcGVuOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubm9kZXNbaV0gPT0gdG8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW4gPSBpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sb2NhbFByZXNlcnZlV1MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVzW2ldLm9wdGlvbnMgfD0gT1BUX1BSRVNFUlZFX1dTO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRQb3MoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VFeHRyYSgpO1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMub3BlbjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5ub2Rlc1tpXS5jb250ZW50O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGNvbnRlbnQubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pXG4gICAgICAgICAgICAgICAgcG9zICs9IGNvbnRlbnRbal0ubm9kZVNpemU7XG4gICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICBmaW5kQXRQb2ludChwYXJlbnQsIG9mZnNldCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gcGFyZW50ICYmIHRoaXMuZmluZFtpXS5vZmZzZXQgPT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICBmaW5kSW5zaWRlKHBhcmVudCkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLnBvcyA9PSBudWxsICYmIHBhcmVudC5ub2RlVHlwZSA9PSAxICYmIHBhcmVudC5jb250YWlucyh0aGlzLmZpbmRbaV0ubm9kZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3M7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIGZpbmRBcm91bmQocGFyZW50LCBjb250ZW50LCBiZWZvcmUpIHtcbiAgICAgICAgaWYgKHBhcmVudCAhPSBjb250ZW50ICYmIHRoaXMuZmluZClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZFtpXS5wb3MgPT0gbnVsbCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMSAmJiBwYXJlbnQuY29udGFpbnModGhpcy5maW5kW2ldLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3MgPSBjb250ZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuZmluZFtpXS5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAmIChiZWZvcmUgPyAyIDogNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRbaV0ucG9zID0gdGhpcy5jdXJyZW50UG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZmluZEluVGV4dCh0ZXh0Tm9kZSkge1xuICAgICAgICBpZiAodGhpcy5maW5kKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpbmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kW2ldLm5vZGUgPT0gdGV4dE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFtpXS5wb3MgPSB0aGlzLmN1cnJlbnRQb3MgLSAodGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCAtIHRoaXMuZmluZFtpXS5vZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRleHQgc3RyaW5nIG1hdGNoZXMgdGhpcyBjb250ZXh0LlxuICAgIG1hdGNoZXNDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuaW5kZXhPZihcInxcIikgPiAtMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnNwbGl0KC9cXHMqXFx8XFxzKi8pLnNvbWUodGhpcy5tYXRjaGVzQ29udGV4dCwgdGhpcyk7XG4gICAgICAgIGxldCBwYXJ0cyA9IGNvbnRleHQuc3BsaXQoXCIvXCIpO1xuICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5vcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGxldCB1c2VSb290ID0gIXRoaXMuaXNPcGVuICYmICghb3B0aW9uIHx8IG9wdGlvbi5wYXJlbnQudHlwZSA9PSB0aGlzLm5vZGVzWzBdLnR5cGUpO1xuICAgICAgICBsZXQgbWluRGVwdGggPSAtKG9wdGlvbiA/IG9wdGlvbi5kZXB0aCArIDEgOiAwKSArICh1c2VSb290ID8gMCA6IDEpO1xuICAgICAgICBsZXQgbWF0Y2ggPSAoaSwgZGVwdGgpID0+IHtcbiAgICAgICAgICAgIGZvciAoOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBwYXJ0cy5sZW5ndGggLSAxIHx8IGkgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZGVwdGggPj0gbWluRGVwdGg7IGRlcHRoLS0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2goaSAtIDEsIGRlcHRoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBkZXB0aCA+IDAgfHwgKGRlcHRoID09IDAgJiYgdXNlUm9vdCkgPyB0aGlzLm5vZGVzW2RlcHRoXS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbiAmJiBkZXB0aCA+PSBtaW5EZXB0aCA/IG9wdGlvbi5ub2RlKGRlcHRoIC0gbWluRGVwdGgpLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCB8fCAobmV4dC5uYW1lICE9IHBhcnQgJiYgIW5leHQuaXNJbkdyb3VwKHBhcnQpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG1hdGNoKHBhcnRzLmxlbmd0aCAtIDEsIHRoaXMub3Blbik7XG4gICAgfVxuICAgIHRleHRibG9ja0Zyb21Db250ZXh0KCkge1xuICAgICAgICBsZXQgJGNvbnRleHQgPSB0aGlzLm9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKCRjb250ZXh0KVxuICAgICAgICAgICAgZm9yIChsZXQgZCA9ICRjb250ZXh0LmRlcHRoOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgICAgIGxldCBkZWZsdCA9ICRjb250ZXh0Lm5vZGUoZCkuY29udGVudE1hdGNoQXQoJGNvbnRleHQuaW5kZXhBZnRlcihkKSkuZGVmYXVsdFR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmx0ICYmIGRlZmx0LmlzVGV4dGJsb2NrICYmIGRlZmx0LmRlZmF1bHRBdHRycylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmx0O1xuICAgICAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMucGFyc2VyLnNjaGVtYS5ub2Rlcykge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSB0aGlzLnBhcnNlci5zY2hlbWEubm9kZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZS5pc1RleHRibG9jayAmJiB0eXBlLmRlZmF1bHRBdHRycylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBkaXJlY3RseSBuZXN0ZWQgbGlzdCBub2RlcyBwcm9kdWNlZCBieSBzb21lXG4vLyB0b29scyBhbmQgYWxsb3dlZCBieSBicm93c2VycyB0byBtZWFuIHRoYXQgdGhlIG5lc3RlZCBsaXN0IGlzXG4vLyBhY3R1YWxseSBwYXJ0IG9mIHRoZSBsaXN0IGl0ZW0gYWJvdmUgaXQuXG5mdW5jdGlvbiBub3JtYWxpemVMaXN0KGRvbSkge1xuICAgIGZvciAobGV0IGNoaWxkID0gZG9tLmZpcnN0Q2hpbGQsIHByZXZJdGVtID0gbnVsbDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBjaGlsZC5ub2RlVHlwZSA9PSAxID8gY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgIGlmIChuYW1lICYmIGxpc3RUYWdzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHByZXZJdGVtKSB7XG4gICAgICAgICAgICBwcmV2SXRlbS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICBjaGlsZCA9IHByZXZJdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT0gXCJsaVwiKSB7XG4gICAgICAgICAgICBwcmV2SXRlbSA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIHByZXZJdGVtID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEFwcGx5IGEgQ1NTIHNlbGVjdG9yLlxuZnVuY3Rpb24gbWF0Y2hlcyhkb20sIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIChkb20ubWF0Y2hlcyB8fCBkb20ubXNNYXRjaGVzU2VsZWN0b3IgfHwgZG9tLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBkb20ubW96TWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGRvbSwgc2VsZWN0b3IpO1xufVxuZnVuY3Rpb24gY29weShvYmopIHtcbiAgICBsZXQgY29weSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gb2JqKVxuICAgICAgICBjb3B5W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIHJldHVybiBjb3B5O1xufVxuLy8gVXNlZCB3aGVuIGZpbmRpbmcgYSBtYXJrIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmcmFnbWVudCBwYXJzZS5cbi8vIENoZWNrcyB3aGV0aGVyIGl0IHdvdWxkIGJlIHJlYXNvbmFibGUgdG8gYXBwbHkgYSBnaXZlbiBtYXJrIHR5cGUgdG9cbi8vIGEgZ2l2ZW4gbm9kZSwgYnkgbG9va2luZyBhdCB0aGUgd2F5IHRoZSBtYXJrIG9jY3VycyBpbiB0aGUgc2NoZW1hLlxuZnVuY3Rpb24gbWFya01heUFwcGx5KG1hcmtUeXBlLCBub2RlVHlwZSkge1xuICAgIGxldCBub2RlcyA9IG5vZGVUeXBlLnNjaGVtYS5ub2RlcztcbiAgICBmb3IgKGxldCBuYW1lIGluIG5vZGVzKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSBub2Rlc1tuYW1lXTtcbiAgICAgICAgaWYgKCFwYXJlbnQuYWxsb3dzTWFya1R5cGUobWFya1R5cGUpKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCBzZWVuID0gW10sIHNjYW4gPSAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChtYXRjaCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoLmVkZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgdHlwZSwgbmV4dCB9ID0gbWF0Y2guZWRnZShpKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBub2RlVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHNlZW4uaW5kZXhPZihuZXh0KSA8IDAgJiYgc2NhbihuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChzY2FuKHBhcmVudC5jb250ZW50TWF0Y2gpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG4vKipcbkEgRE9NIHNlcmlhbGl6ZXIga25vd3MgaG93IHRvIGNvbnZlcnQgUHJvc2VNaXJyb3Igbm9kZXMgYW5kXG5tYXJrcyBvZiB2YXJpb3VzIHR5cGVzIHRvIERPTSBub2Rlcy5cbiovXG5jbGFzcyBET01TZXJpYWxpemVyIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXJpYWxpemVyLiBgbm9kZXNgIHNob3VsZCBtYXAgbm9kZSBuYW1lcyB0byBmdW5jdGlvbnNcbiAgICB0aGF0IHRha2UgYSBub2RlIGFuZCByZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICAgIERPTS4gYG1hcmtzYCBkb2VzIHRoZSBzYW1lIGZvciBtYXJrIG5hbWVzLCBidXQgYWxzbyBnZXRzIGFuXG4gICAgYXJndW1lbnQgdGhhdCB0ZWxscyBpdCB3aGV0aGVyIHRoZSBtYXJrJ3MgY29udGVudCBpcyBibG9jayBvclxuICAgIGlubGluZSBjb250ZW50IChmb3IgdHlwaWNhbCB1c2UsIGl0J2xsIGFsd2F5cyBiZSBpbmxpbmUpLiBBIG1hcmtcbiAgICBzZXJpYWxpemVyIG1heSBiZSBgbnVsbGAgdG8gaW5kaWNhdGUgdGhhdCBtYXJrcyBvZiB0aGF0IHR5cGVcbiAgICBzaG91bGQgbm90IGJlIHNlcmlhbGl6ZWQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbm9kZSBzZXJpYWxpemF0aW9uIGZ1bmN0aW9ucy5cbiAgICAqL1xuICAgIG5vZGVzLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayBzZXJpYWxpemF0aW9uIGZ1bmN0aW9ucy5cbiAgICAqL1xuICAgIG1hcmtzKSB7XG4gICAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICAgICAgdGhpcy5tYXJrcyA9IG1hcmtzO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhlIGNvbnRlbnQgb2YgdGhpcyBmcmFnbWVudCB0byBhIERPTSBmcmFnbWVudC4gV2hlblxuICAgIG5vdCBpbiB0aGUgYnJvd3NlciwgdGhlIGBkb2N1bWVudGAgb3B0aW9uLCBjb250YWluaW5nIGEgRE9NXG4gICAgZG9jdW1lbnQsIHNob3VsZCBiZSBwYXNzZWQgc28gdGhhdCB0aGUgc2VyaWFsaXplciBjYW4gY3JlYXRlXG4gICAgbm9kZXMuXG4gICAgKi9cbiAgICBzZXJpYWxpemVGcmFnbWVudChmcmFnbWVudCwgb3B0aW9ucyA9IHt9LCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSBkb2Mob3B0aW9ucykuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICBsZXQgdG9wID0gdGFyZ2V0LCBhY3RpdmUgPSBbXTtcbiAgICAgICAgZnJhZ21lbnQuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChhY3RpdmUubGVuZ3RoIHx8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtlZXAgPSAwLCByZW5kZXJlZCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGtlZXAgPCBhY3RpdmUubGVuZ3RoICYmIHJlbmRlcmVkIDwgbm9kZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBub2RlLm1hcmtzW3JlbmRlcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtzW25leHQudHlwZS5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dC5lcShhY3RpdmVba2VlcF1bMF0pIHx8IG5leHQudHlwZS5zcGVjLnNwYW5uaW5nID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBrZWVwKys7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChrZWVwIDwgYWN0aXZlLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gYWN0aXZlLnBvcCgpWzFdO1xuICAgICAgICAgICAgICAgIHdoaWxlIChyZW5kZXJlZCA8IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhZGQgPSBub2RlLm1hcmtzW3JlbmRlcmVkKytdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFya0RPTSA9IHRoaXMuc2VyaWFsaXplTWFyayhhZGQsIG5vZGUuaXNJbmxpbmUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFya0RPTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLnB1c2goW2FkZCwgdG9wXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuYXBwZW5kQ2hpbGQobWFya0RPTS5kb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gbWFya0RPTS5jb250ZW50RE9NIHx8IG1hcmtET00uZG9tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9wLmFwcGVuZENoaWxkKHRoaXMuc2VyaWFsaXplTm9kZUlubmVyKG5vZGUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc2VyaWFsaXplTm9kZUlubmVyKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHsgZG9tLCBjb250ZW50RE9NIH0gPSByZW5kZXJTcGVjKGRvYyhvcHRpb25zKSwgdGhpcy5ub2Rlc1tub2RlLnR5cGUubmFtZV0obm9kZSksIG51bGwsIG5vZGUuYXR0cnMpO1xuICAgICAgICBpZiAoY29udGVudERPTSkge1xuICAgICAgICAgICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQ29udGVudCBob2xlIG5vdCBhbGxvd2VkIGluIGEgbGVhZiBub2RlIHNwZWNcIik7XG4gICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZUZyYWdtZW50KG5vZGUuY29udGVudCwgb3B0aW9ucywgY29udGVudERPTSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoaXMgbm9kZSB0byBhIERPTSBub2RlLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3VcbiAgICBuZWVkIHRvIHNlcmlhbGl6ZSBhIHBhcnQgb2YgYSBkb2N1bWVudCwgYXMgb3Bwb3NlZCB0byB0aGUgd2hvbGVcbiAgICBkb2N1bWVudC4gVG8gc2VyaWFsaXplIGEgd2hvbGUgZG9jdW1lbnQsIHVzZVxuICAgIFtgc2VyaWFsaXplRnJhZ21lbnRgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuRE9NU2VyaWFsaXplci5zZXJpYWxpemVGcmFnbWVudCkgb25cbiAgICBpdHMgW2NvbnRlbnRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLmNvbnRlbnQpLlxuICAgICovXG4gICAgc2VyaWFsaXplTm9kZShub2RlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IGRvbSA9IHRoaXMuc2VyaWFsaXplTm9kZUlubmVyKG5vZGUsIG9wdGlvbnMpO1xuICAgICAgICBmb3IgKGxldCBpID0gbm9kZS5tYXJrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHdyYXAgPSB0aGlzLnNlcmlhbGl6ZU1hcmsobm9kZS5tYXJrc1tpXSwgbm9kZS5pc0lubGluZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAod3JhcCkge1xuICAgICAgICAgICAgICAgICh3cmFwLmNvbnRlbnRET00gfHwgd3JhcC5kb20pLmFwcGVuZENoaWxkKGRvbSk7XG4gICAgICAgICAgICAgICAgZG9tID0gd3JhcC5kb207XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXJpYWxpemVNYXJrKG1hcmssIGlubGluZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB0b0RPTSA9IHRoaXMubWFya3NbbWFyay50eXBlLm5hbWVdO1xuICAgICAgICByZXR1cm4gdG9ET00gJiYgcmVuZGVyU3BlYyhkb2Mob3B0aW9ucyksIHRvRE9NKG1hcmssIGlubGluZSksIG51bGwsIG1hcmsuYXR0cnMpO1xuICAgIH1cbiAgICBzdGF0aWMgcmVuZGVyU3BlYyhkb2MsIHN0cnVjdHVyZSwgeG1sTlMgPSBudWxsLCBibG9ja0FycmF5c0luKSB7XG4gICAgICAgIHJldHVybiByZW5kZXJTcGVjKGRvYywgc3RydWN0dXJlLCB4bWxOUywgYmxvY2tBcnJheXNJbik7XG4gICAgfVxuICAgIC8qKlxuICAgIEJ1aWxkIGEgc2VyaWFsaXplciB1c2luZyB0aGUgW2B0b0RPTWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy50b0RPTSlcbiAgICBwcm9wZXJ0aWVzIGluIGEgc2NoZW1hJ3Mgbm9kZSBhbmQgbWFyayBzcGVjcy5cbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmNhY2hlZC5kb21TZXJpYWxpemVyIHx8XG4gICAgICAgICAgICAoc2NoZW1hLmNhY2hlZC5kb21TZXJpYWxpemVyID0gbmV3IERPTVNlcmlhbGl6ZXIodGhpcy5ub2Rlc0Zyb21TY2hlbWEoc2NoZW1hKSwgdGhpcy5tYXJrc0Zyb21TY2hlbWEoc2NoZW1hKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICBHYXRoZXIgdGhlIHNlcmlhbGl6ZXJzIGluIGEgc2NoZW1hJ3Mgbm9kZSBzcGVjcyBpbnRvIGFuIG9iamVjdC5cbiAgICBUaGlzIGNhbiBiZSB1c2VmdWwgYXMgYSBiYXNlIHRvIGJ1aWxkIGEgY3VzdG9tIHNlcmlhbGl6ZXIgZnJvbS5cbiAgICAqL1xuICAgIHN0YXRpYyBub2Rlc0Zyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBnYXRoZXJUb0RPTShzY2hlbWEubm9kZXMpO1xuICAgICAgICBpZiAoIXJlc3VsdC50ZXh0KVxuICAgICAgICAgICAgcmVzdWx0LnRleHQgPSBub2RlID0+IG5vZGUudGV4dDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgR2F0aGVyIHRoZSBzZXJpYWxpemVycyBpbiBhIHNjaGVtYSdzIG1hcmsgc3BlY3MgaW50byBhbiBvYmplY3QuXG4gICAgKi9cbiAgICBzdGF0aWMgbWFya3NGcm9tU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gZ2F0aGVyVG9ET00oc2NoZW1hLm1hcmtzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnYXRoZXJUb0RPTShvYmopIHtcbiAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvYmopIHtcbiAgICAgICAgbGV0IHRvRE9NID0gb2JqW25hbWVdLnNwZWMudG9ET007XG4gICAgICAgIGlmICh0b0RPTSlcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHRvRE9NO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gZG9jKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5kb2N1bWVudCB8fCB3aW5kb3cuZG9jdW1lbnQ7XG59XG5jb25zdCBzdXNwaWNpb3VzQXR0cmlidXRlQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gc3VzcGljaW91c0F0dHJpYnV0ZXMoYXR0cnMpIHtcbiAgICBsZXQgdmFsdWUgPSBzdXNwaWNpb3VzQXR0cmlidXRlQ2FjaGUuZ2V0KGF0dHJzKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgc3VzcGljaW91c0F0dHJpYnV0ZUNhY2hlLnNldChhdHRycywgdmFsdWUgPSBzdXNwaWNpb3VzQXR0cmlidXRlc0lubmVyKGF0dHJzKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gc3VzcGljaW91c0F0dHJpYnV0ZXNJbm5lcihhdHRycykge1xuICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgIGZ1bmN0aW9uIHNjYW4odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4odmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHNjYW4odmFsdWVbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNjYW4oYXR0cnMpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiByZW5kZXJTcGVjKGRvYywgc3RydWN0dXJlLCB4bWxOUywgYmxvY2tBcnJheXNJbikge1xuICAgIGlmICh0eXBlb2Ygc3RydWN0dXJlID09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiB7IGRvbTogZG9jLmNyZWF0ZVRleHROb2RlKHN0cnVjdHVyZSkgfTtcbiAgICBpZiAoc3RydWN0dXJlLm5vZGVUeXBlICE9IG51bGwpXG4gICAgICAgIHJldHVybiB7IGRvbTogc3RydWN0dXJlIH07XG4gICAgaWYgKHN0cnVjdHVyZS5kb20gJiYgc3RydWN0dXJlLmRvbS5ub2RlVHlwZSAhPSBudWxsKVxuICAgICAgICByZXR1cm4gc3RydWN0dXJlO1xuICAgIGxldCB0YWdOYW1lID0gc3RydWN0dXJlWzBdLCBzdXNwaWNpb3VzO1xuICAgIGlmICh0eXBlb2YgdGFnTmFtZSAhPSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgYXJyYXkgcGFzc2VkIHRvIHJlbmRlclNwZWNcIik7XG4gICAgaWYgKGJsb2NrQXJyYXlzSW4gJiYgKHN1c3BpY2lvdXMgPSBzdXNwaWNpb3VzQXR0cmlidXRlcyhibG9ja0FycmF5c0luKSkgJiZcbiAgICAgICAgc3VzcGljaW91cy5pbmRleE9mKHN0cnVjdHVyZSkgPiAtMSlcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJVc2luZyBhbiBhcnJheSBmcm9tIGFuIGF0dHJpYnV0ZSBvYmplY3QgYXMgYSBET00gc3BlYy4gVGhpcyBtYXkgYmUgYW4gYXR0ZW1wdGVkIGNyb3NzIHNpdGUgc2NyaXB0aW5nIGF0dGFjay5cIik7XG4gICAgbGV0IHNwYWNlID0gdGFnTmFtZS5pbmRleE9mKFwiIFwiKTtcbiAgICBpZiAoc3BhY2UgPiAwKSB7XG4gICAgICAgIHhtbE5TID0gdGFnTmFtZS5zbGljZSgwLCBzcGFjZSk7XG4gICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnNsaWNlKHNwYWNlICsgMSk7XG4gICAgfVxuICAgIGxldCBjb250ZW50RE9NO1xuICAgIGxldCBkb20gPSAoeG1sTlMgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHhtbE5TLCB0YWdOYW1lKSA6IGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTtcbiAgICBsZXQgYXR0cnMgPSBzdHJ1Y3R1cmVbMV0sIHN0YXJ0ID0gMTtcbiAgICBpZiAoYXR0cnMgJiYgdHlwZW9mIGF0dHJzID09IFwib2JqZWN0XCIgJiYgYXR0cnMubm9kZVR5cGUgPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShhdHRycykpIHtcbiAgICAgICAgc3RhcnQgPSAyO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKVxuICAgICAgICAgICAgaWYgKGF0dHJzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BhY2UgPSBuYW1lLmluZGV4T2YoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+IDApXG4gICAgICAgICAgICAgICAgICAgIGRvbS5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNsaWNlKDAsIHNwYWNlKSwgbmFtZS5zbGljZShzcGFjZSArIDEpLCBhdHRyc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGF0dHJzW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHN0cnVjdHVyZVtpXTtcbiAgICAgICAgaWYgKGNoaWxkID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHN0cnVjdHVyZS5sZW5ndGggLSAxIHx8IGkgPiBzdGFydClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRlbnQgaG9sZSBtdXN0IGJlIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgbm9kZVwiKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbSwgY29udGVudERPTTogZG9tIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgeyBkb206IGlubmVyLCBjb250ZW50RE9NOiBpbm5lckNvbnRlbnQgfSA9IHJlbmRlclNwZWMoZG9jLCBjaGlsZCwgeG1sTlMsIGJsb2NrQXJyYXlzSW4pO1xuICAgICAgICAgICAgZG9tLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICAgICAgICAgIGlmIChpbm5lckNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdWx0aXBsZSBjb250ZW50IGhvbGVzXCIpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRET00gPSBpbm5lckNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZG9tLCBjb250ZW50RE9NIH07XG59XG5cbmV4cG9ydCB7IENvbnRlbnRNYXRjaCwgRE9NUGFyc2VyLCBET01TZXJpYWxpemVyLCBGcmFnbWVudCwgTWFyaywgTWFya1R5cGUsIE5vZGUsIE5vZGVSYW5nZSwgTm9kZVR5cGUsIFJlcGxhY2VFcnJvciwgUmVzb2x2ZWRQb3MsIFNjaGVtYSwgU2xpY2UgfTtcbiIsImltcG9ydCB7IFNjaGVtYSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuY29uc3QgcERPTSA9IFtcInBcIiwgMF0sIGJsb2NrcXVvdGVET00gPSBbXCJibG9ja3F1b3RlXCIsIDBdLCBockRPTSA9IFtcImhyXCJdLCBwcmVET00gPSBbXCJwcmVcIiwgW1wiY29kZVwiLCAwXV0sIGJyRE9NID0gW1wiYnJcIl07XG4vKipcbltTcGVjc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjKSBmb3IgdGhlIG5vZGVzIGRlZmluZWQgaW4gdGhpcyBzY2hlbWEuXG4qL1xuY29uc3Qgbm9kZXMgPSB7XG4gICAgLyoqXG4gICAgTm9kZVNwZWMgVGhlIHRvcCBsZXZlbCBkb2N1bWVudCBub2RlLlxuICAgICovXG4gICAgZG9jOiB7XG4gICAgICAgIGNvbnRlbnQ6IFwiYmxvY2srXCJcbiAgICB9LFxuICAgIC8qKlxuICAgIEEgcGxhaW4gcGFyYWdyYXBoIHRleHRibG9jay4gUmVwcmVzZW50ZWQgaW4gdGhlIERPTVxuICAgIGFzIGEgYDxwPmAgZWxlbWVudC5cbiAgICAqL1xuICAgIHBhcmFncmFwaDoge1xuICAgICAgICBjb250ZW50OiBcImlubGluZSpcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJwXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gcERPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBibG9ja3F1b3RlIChgPGJsb2NrcXVvdGU+YCkgd3JhcHBpbmcgb25lIG9yIG1vcmUgYmxvY2tzLlxuICAgICovXG4gICAgYmxvY2txdW90ZToge1xuICAgICAgICBjb250ZW50OiBcImJsb2NrK1wiLFxuICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJibG9ja3F1b3RlXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gYmxvY2txdW90ZURPTTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBob3Jpem9udGFsIHJ1bGUgKGA8aHI+YCkuXG4gICAgKi9cbiAgICBob3Jpem9udGFsX3J1bGU6IHtcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoclwiIH1dLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGhyRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIGhlYWRpbmcgdGV4dGJsb2NrLCB3aXRoIGEgYGxldmVsYCBhdHRyaWJ1dGUgdGhhdFxuICAgIHNob3VsZCBob2xkIHRoZSBudW1iZXIgMSB0byA2LiBQYXJzZWQgYW5kIHNlcmlhbGl6ZWQgYXMgYDxoMT5gIHRvXG4gICAgYDxoNj5gIGVsZW1lbnRzLlxuICAgICovXG4gICAgaGVhZGluZzoge1xuICAgICAgICBhdHRyczogeyBsZXZlbDogeyBkZWZhdWx0OiAxLCB2YWxpZGF0ZTogXCJudW1iZXJcIiB9IH0sXG4gICAgICAgIGNvbnRlbnQ6IFwiaW5saW5lKlwiLFxuICAgICAgICBncm91cDogXCJibG9ja1wiLFxuICAgICAgICBkZWZpbmluZzogdHJ1ZSxcbiAgICAgICAgcGFyc2VET006IFt7IHRhZzogXCJoMVwiLCBhdHRyczogeyBsZXZlbDogMSB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoMlwiLCBhdHRyczogeyBsZXZlbDogMiB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoM1wiLCBhdHRyczogeyBsZXZlbDogMyB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNFwiLCBhdHRyczogeyBsZXZlbDogNCB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNVwiLCBhdHRyczogeyBsZXZlbDogNSB9IH0sXG4gICAgICAgICAgICB7IHRhZzogXCJoNlwiLCBhdHRyczogeyBsZXZlbDogNiB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IHJldHVybiBbXCJoXCIgKyBub2RlLmF0dHJzLmxldmVsLCAwXTsgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgQSBjb2RlIGxpc3RpbmcuIERpc2FsbG93cyBtYXJrcyBvciBub24tdGV4dCBpbmxpbmVcbiAgICBub2RlcyBieSBkZWZhdWx0LiBSZXByZXNlbnRlZCBhcyBhIGA8cHJlPmAgZWxlbWVudCB3aXRoIGFcbiAgICBgPGNvZGU+YCBlbGVtZW50IGluc2lkZSBvZiBpdC5cbiAgICAqL1xuICAgIGNvZGVfYmxvY2s6IHtcbiAgICAgICAgY29udGVudDogXCJ0ZXh0KlwiLFxuICAgICAgICBtYXJrczogXCJcIixcbiAgICAgICAgZ3JvdXA6IFwiYmxvY2tcIixcbiAgICAgICAgY29kZTogdHJ1ZSxcbiAgICAgICAgZGVmaW5pbmc6IHRydWUsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwicHJlXCIsIHByZXNlcnZlV2hpdGVzcGFjZTogXCJmdWxsXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gcHJlRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBUaGUgdGV4dCBub2RlLlxuICAgICovXG4gICAgdGV4dDoge1xuICAgICAgICBncm91cDogXCJpbmxpbmVcIlxuICAgIH0sXG4gICAgLyoqXG4gICAgQW4gaW5saW5lIGltYWdlIChgPGltZz5gKSBub2RlLiBTdXBwb3J0cyBgc3JjYCxcbiAgICBgYWx0YCwgYW5kIGBocmVmYCBhdHRyaWJ1dGVzLiBUaGUgbGF0dGVyIHR3byBkZWZhdWx0IHRvIHRoZSBlbXB0eVxuICAgIHN0cmluZy5cbiAgICAqL1xuICAgIGltYWdlOiB7XG4gICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIHNyYzogeyB2YWxpZGF0ZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgYWx0OiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfSxcbiAgICAgICAgICAgIHRpdGxlOiB7IGRlZmF1bHQ6IG51bGwsIHZhbGlkYXRlOiBcInN0cmluZ3xudWxsXCIgfVxuICAgICAgICB9LFxuICAgICAgICBncm91cDogXCJpbmxpbmVcIixcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImltZ1tzcmNdXCIsIGdldEF0dHJzKGRvbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBkb20uZ2V0QXR0cmlidXRlKFwic3JjXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdDogZG9tLmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gfV0sXG4gICAgICAgIHRvRE9NKG5vZGUpIHsgbGV0IHsgc3JjLCBhbHQsIHRpdGxlIH0gPSBub2RlLmF0dHJzOyByZXR1cm4gW1wiaW1nXCIsIHsgc3JjLCBhbHQsIHRpdGxlIH1dOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIGhhcmQgbGluZSBicmVhaywgcmVwcmVzZW50ZWQgaW4gdGhlIERPTSBhcyBgPGJyPmAuXG4gICAgKi9cbiAgICBoYXJkX2JyZWFrOiB7XG4gICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgZ3JvdXA6IFwiaW5saW5lXCIsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImJyXCIgfV0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gYnJET007IH1cbiAgICB9XG59O1xuY29uc3QgZW1ET00gPSBbXCJlbVwiLCAwXSwgc3Ryb25nRE9NID0gW1wic3Ryb25nXCIsIDBdLCBjb2RlRE9NID0gW1wiY29kZVwiLCAwXTtcbi8qKlxuW1NwZWNzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTWFya1NwZWMpIGZvciB0aGUgbWFya3MgaW4gdGhlIHNjaGVtYS5cbiovXG5jb25zdCBtYXJrcyA9IHtcbiAgICAvKipcbiAgICBBIGxpbmsuIEhhcyBgaHJlZmAgYW5kIGB0aXRsZWAgYXR0cmlidXRlcy4gYHRpdGxlYFxuICAgIGRlZmF1bHRzIHRvIHRoZSBlbXB0eSBzdHJpbmcuIFJlbmRlcmVkIGFuZCBwYXJzZWQgYXMgYW4gYDxhPmBcbiAgICBlbGVtZW50LlxuICAgICovXG4gICAgbGluazoge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgaHJlZjogeyB2YWxpZGF0ZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCwgdmFsaWRhdGU6IFwic3RyaW5nfG51bGxcIiB9XG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwiYVtocmVmXVwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaHJlZjogZG9tLmdldEF0dHJpYnV0ZShcImhyZWZcIiksIHRpdGxlOiBkb20uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgfTtcbiAgICAgICAgICAgICAgICB9IH1dLFxuICAgICAgICB0b0RPTShub2RlKSB7IGxldCB7IGhyZWYsIHRpdGxlIH0gPSBub2RlLmF0dHJzOyByZXR1cm4gW1wiYVwiLCB7IGhyZWYsIHRpdGxlIH0sIDBdOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBbiBlbXBoYXNpcyBtYXJrLiBSZW5kZXJlZCBhcyBhbiBgPGVtPmAgZWxlbWVudC4gSGFzIHBhcnNlIHJ1bGVzXG4gICAgdGhhdCBhbHNvIG1hdGNoIGA8aT5gIGFuZCBgZm9udC1zdHlsZTogaXRhbGljYC5cbiAgICAqL1xuICAgIGVtOiB7XG4gICAgICAgIHBhcnNlRE9NOiBbXG4gICAgICAgICAgICB7IHRhZzogXCJpXCIgfSwgeyB0YWc6IFwiZW1cIiB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXN0eWxlPWl0YWxpY1wiIH0sXG4gICAgICAgICAgICB7IHN0eWxlOiBcImZvbnQtc3R5bGU9bm9ybWFsXCIsIGNsZWFyTWFyazogbSA9PiBtLnR5cGUubmFtZSA9PSBcImVtXCIgfVxuICAgICAgICBdLFxuICAgICAgICB0b0RPTSgpIHsgcmV0dXJuIGVtRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBBIHN0cm9uZyBtYXJrLiBSZW5kZXJlZCBhcyBgPHN0cm9uZz5gLCBwYXJzZSBydWxlcyBhbHNvIG1hdGNoXG4gICAgYDxiPmAgYW5kIGBmb250LXdlaWdodDogYm9sZGAuXG4gICAgKi9cbiAgICBzdHJvbmc6IHtcbiAgICAgICAgcGFyc2VET006IFtcbiAgICAgICAgICAgIHsgdGFnOiBcInN0cm9uZ1wiIH0sXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGFyb3VuZCBhIEdvb2dsZSBEb2NzIG1pc2JlaGF2aW9yIHdoZXJlXG4gICAgICAgICAgICAvLyBwYXN0ZWQgY29udGVudCB3aWxsIGJlIGluZXhwbGljYWJseSB3cmFwcGVkIGluIGA8Yj5gXG4gICAgICAgICAgICAvLyB0YWdzIHdpdGggYSBmb250LXdlaWdodCBub3JtYWwuXG4gICAgICAgICAgICB7IHRhZzogXCJiXCIsIGdldEF0dHJzOiAobm9kZSkgPT4gbm9kZS5zdHlsZS5mb250V2VpZ2h0ICE9IFwibm9ybWFsXCIgJiYgbnVsbCB9LFxuICAgICAgICAgICAgeyBzdHlsZTogXCJmb250LXdlaWdodD00MDBcIiwgY2xlYXJNYXJrOiBtID0+IG0udHlwZS5uYW1lID09IFwic3Ryb25nXCIgfSxcbiAgICAgICAgICAgIHsgc3R5bGU6IFwiZm9udC13ZWlnaHRcIiwgZ2V0QXR0cnM6ICh2YWx1ZSkgPT4gL14oYm9sZChlcik/fFs1LTldXFxkezIsfSkkLy50ZXN0KHZhbHVlKSAmJiBudWxsIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHRvRE9NKCkgeyByZXR1cm4gc3Ryb25nRE9NOyB9XG4gICAgfSxcbiAgICAvKipcbiAgICBDb2RlIGZvbnQgbWFyay4gUmVwcmVzZW50ZWQgYXMgYSBgPGNvZGU+YCBlbGVtZW50LlxuICAgICovXG4gICAgY29kZToge1xuICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICBwYXJzZURPTTogW3sgdGFnOiBcImNvZGVcIiB9XSxcbiAgICAgICAgdG9ET00oKSB7IHJldHVybiBjb2RlRE9NOyB9XG4gICAgfVxufTtcbi8qKlxuVGhpcyBzY2hlbWEgcm91Z2hseSBjb3JyZXNwb25kcyB0byB0aGUgZG9jdW1lbnQgc2NoZW1hIHVzZWQgYnlcbltDb21tb25NYXJrXShodHRwOi8vY29tbW9ubWFyay5vcmcvKSwgbWludXMgdGhlIGxpc3QgZWxlbWVudHMsXG53aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgW2Bwcm9zZW1pcnJvci1zY2hlbWEtbGlzdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdClcbm1vZHVsZS5cblxuVG8gcmV1c2UgZWxlbWVudHMgZnJvbSB0aGlzIHNjaGVtYSwgZXh0ZW5kIG9yIHJlYWQgZnJvbSBpdHNcbmBzcGVjLm5vZGVzYCBhbmQgYHNwZWMubWFya3NgIFtwcm9wZXJ0aWVzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuU2NoZW1hLnNwZWMpLlxuKi9cbmNvbnN0IHNjaGVtYSA9IG5ldyBTY2hlbWEoeyBub2RlcywgbWFya3MgfSk7XG5cbmV4cG9ydCB7IG1hcmtzLCBub2Rlcywgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBmaW5kV3JhcHBpbmcsIFJlcGxhY2VBcm91bmRTdGVwLCBjYW5TcGxpdCwgbGlmdFRhcmdldCwgY2FuSm9pbiB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBOb2RlUmFuZ2UsIEZyYWdtZW50LCBTbGljZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcblxuY29uc3Qgb2xET00gPSBbXCJvbFwiLCAwXSwgdWxET00gPSBbXCJ1bFwiLCAwXSwgbGlET00gPSBbXCJsaVwiLCAwXTtcbi8qKlxuQW4gb3JkZXJlZCBsaXN0IFtub2RlIHNwZWNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYykuIEhhcyBhIHNpbmdsZVxuYXR0cmlidXRlLCBgb3JkZXJgLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgYXQgd2hpY2ggdGhlIGxpc3RcbnN0YXJ0cyBjb3VudGluZywgYW5kIGRlZmF1bHRzIHRvIDEuIFJlcHJlc2VudGVkIGFzIGFuIGA8b2w+YFxuZWxlbWVudC5cbiovXG5jb25zdCBvcmRlcmVkTGlzdCA9IHtcbiAgICBhdHRyczogeyBvcmRlcjogeyBkZWZhdWx0OiAxLCB2YWxpZGF0ZTogXCJudW1iZXJcIiB9IH0sXG4gICAgcGFyc2VET006IFt7IHRhZzogXCJvbFwiLCBnZXRBdHRycyhkb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBvcmRlcjogZG9tLmhhc0F0dHJpYnV0ZShcInN0YXJ0XCIpID8gK2RvbS5nZXRBdHRyaWJ1dGUoXCJzdGFydFwiKSA6IDEgfTtcbiAgICAgICAgICAgIH0gfV0sXG4gICAgdG9ET00obm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5hdHRycy5vcmRlciA9PSAxID8gb2xET00gOiBbXCJvbFwiLCB7IHN0YXJ0OiBub2RlLmF0dHJzLm9yZGVyIH0sIDBdO1xuICAgIH1cbn07XG4vKipcbkEgYnVsbGV0IGxpc3Qgbm9kZSBzcGVjLCByZXByZXNlbnRlZCBpbiB0aGUgRE9NIGFzIGA8dWw+YC5cbiovXG5jb25zdCBidWxsZXRMaXN0ID0ge1xuICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwidWxcIiB9XSxcbiAgICB0b0RPTSgpIHsgcmV0dXJuIHVsRE9NOyB9XG59O1xuLyoqXG5BIGxpc3QgaXRlbSAoYDxsaT5gKSBzcGVjLlxuKi9cbmNvbnN0IGxpc3RJdGVtID0ge1xuICAgIHBhcnNlRE9NOiBbeyB0YWc6IFwibGlcIiB9XSxcbiAgICB0b0RPTSgpIHsgcmV0dXJuIGxpRE9NOyB9LFxuICAgIGRlZmluaW5nOiB0cnVlXG59O1xuZnVuY3Rpb24gYWRkKG9iaiwgcHJvcHMpIHtcbiAgICBsZXQgY29weSA9IHt9O1xuICAgIGZvciAobGV0IHByb3AgaW4gb2JqKVxuICAgICAgICBjb3B5W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpXG4gICAgICAgIGNvcHlbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICByZXR1cm4gY29weTtcbn1cbi8qKlxuQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGFkZGluZyBsaXN0LXJlbGF0ZWQgbm9kZSB0eXBlcyB0byBhIG1hcFxuc3BlY2lmeWluZyB0aGUgbm9kZXMgZm9yIGEgc2NoZW1hLiBBZGRzXG5bYG9yZGVyZWRMaXN0YF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3NjaGVtYS1saXN0Lm9yZGVyZWRMaXN0KSBhcyBgXCJvcmRlcmVkX2xpc3RcImAsXG5bYGJ1bGxldExpc3RgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3QuYnVsbGV0TGlzdCkgYXMgYFwiYnVsbGV0X2xpc3RcImAsIGFuZFxuW2BsaXN0SXRlbWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzY2hlbWEtbGlzdC5saXN0SXRlbSkgYXMgYFwibGlzdF9pdGVtXCJgLlxuXG5gaXRlbUNvbnRlbnRgIGRldGVybWluZXMgdGhlIGNvbnRlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGxpc3QgaXRlbXMuXG5JZiB5b3Ugd2FudCB0aGUgY29tbWFuZHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSB0byBhcHBseSB0byB5b3VyXG5saXN0IHN0cnVjdHVyZSwgaXQgc2hvdWxkIGhhdmUgYSBzaGFwZSBsaWtlIGBcInBhcmFncmFwaCBibG9jaypcImAgb3JcbmBcInBhcmFncmFwaCAob3JkZXJlZF9saXN0IHwgYnVsbGV0X2xpc3QpKlwiYC4gYGxpc3RHcm91cGAgY2FuIGJlXG5naXZlbiB0byBhc3NpZ24gYSBncm91cCBuYW1lIHRvIHRoZSBsaXN0IG5vZGUgdHlwZXMsIGZvciBleGFtcGxlXG5gXCJibG9ja1wiYC5cbiovXG5mdW5jdGlvbiBhZGRMaXN0Tm9kZXMobm9kZXMsIGl0ZW1Db250ZW50LCBsaXN0R3JvdXApIHtcbiAgICByZXR1cm4gbm9kZXMuYXBwZW5kKHtcbiAgICAgICAgb3JkZXJlZF9saXN0OiBhZGQob3JkZXJlZExpc3QsIHsgY29udGVudDogXCJsaXN0X2l0ZW0rXCIsIGdyb3VwOiBsaXN0R3JvdXAgfSksXG4gICAgICAgIGJ1bGxldF9saXN0OiBhZGQoYnVsbGV0TGlzdCwgeyBjb250ZW50OiBcImxpc3RfaXRlbStcIiwgZ3JvdXA6IGxpc3RHcm91cCB9KSxcbiAgICAgICAgbGlzdF9pdGVtOiBhZGQobGlzdEl0ZW0sIHsgY29udGVudDogaXRlbUNvbnRlbnQgfSlcbiAgICB9KTtcbn1cbi8qKlxuUmV0dXJucyBhIGNvbW1hbmQgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgc2VsZWN0aW9uIGluIGEgbGlzdCB3aXRoXG50aGUgZ2l2ZW4gdHlwZSBhbiBhdHRyaWJ1dGVzLiBJZiBgZGlzcGF0Y2hgIGlzIG51bGwsIG9ubHkgcmV0dXJuIGFcbnZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBwb3NzaWJsZSwgYnV0IGRvbid0IGFjdHVhbGx5XG5wZXJmb3JtIHRoZSBjaGFuZ2UuXG4qL1xuZnVuY3Rpb24gd3JhcEluTGlzdChsaXN0VHlwZSwgYXR0cnMgPSBudWxsKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgICAgbGV0IHsgJGZyb20sICR0byB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBsZXQgcmFuZ2UgPSAkZnJvbS5ibG9ja1JhbmdlKCR0byk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCB0ciA9IGRpc3BhdGNoID8gc3RhdGUudHIgOiBudWxsO1xuICAgICAgICBpZiAoIXdyYXBSYW5nZUluTGlzdCh0ciwgcmFuZ2UsIGxpc3RUeXBlLCBhdHRycykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkaXNwYXRjaClcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xufVxuLyoqXG5UcnkgdG8gd3JhcCB0aGUgZ2l2ZW4gbm9kZSByYW5nZSBpbiBhIGxpc3Qgb2YgdGhlIGdpdmVuIHR5cGUuXG5SZXR1cm4gYHRydWVgIHdoZW4gdGhpcyBpcyBwb3NzaWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuIFdoZW4gYHRyYFxuaXMgbm9uLW51bGwsIHRoZSB3cmFwcGluZyBpcyBhZGRlZCB0byB0aGF0IHRyYW5zYWN0aW9uLiBXaGVuIGl0IGlzXG5gbnVsbGAsIHRoZSBmdW5jdGlvbiBvbmx5IHF1ZXJpZXMgd2hldGhlciB0aGUgd3JhcHBpbmcgaXNcbnBvc3NpYmxlLlxuKi9cbmZ1bmN0aW9uIHdyYXBSYW5nZUluTGlzdCh0ciwgcmFuZ2UsIGxpc3RUeXBlLCBhdHRycyA9IG51bGwpIHtcbiAgICBsZXQgZG9Kb2luID0gZmFsc2UsIG91dGVyUmFuZ2UgPSByYW5nZSwgZG9jID0gcmFuZ2UuJGZyb20uZG9jO1xuICAgIC8vIFRoaXMgaXMgYXQgdGhlIHRvcCBvZiBhbiBleGlzdGluZyBsaXN0IGl0ZW1cbiAgICBpZiAocmFuZ2UuZGVwdGggPj0gMiAmJiByYW5nZS4kZnJvbS5ub2RlKHJhbmdlLmRlcHRoIC0gMSkudHlwZS5jb21wYXRpYmxlQ29udGVudChsaXN0VHlwZSkgJiYgcmFuZ2Uuc3RhcnRJbmRleCA9PSAwKSB7XG4gICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAocmFuZ2UuJGZyb20uaW5kZXgocmFuZ2UuZGVwdGggLSAxKSA9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgJGluc2VydCA9IGRvYy5yZXNvbHZlKHJhbmdlLnN0YXJ0IC0gMik7XG4gICAgICAgIG91dGVyUmFuZ2UgPSBuZXcgTm9kZVJhbmdlKCRpbnNlcnQsICRpbnNlcnQsIHJhbmdlLmRlcHRoKTtcbiAgICAgICAgaWYgKHJhbmdlLmVuZEluZGV4IDwgcmFuZ2UucGFyZW50LmNoaWxkQ291bnQpXG4gICAgICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UocmFuZ2UuJGZyb20sIGRvYy5yZXNvbHZlKHJhbmdlLiR0by5lbmQocmFuZ2UuZGVwdGgpKSwgcmFuZ2UuZGVwdGgpO1xuICAgICAgICBkb0pvaW4gPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgd3JhcCA9IGZpbmRXcmFwcGluZyhvdXRlclJhbmdlLCBsaXN0VHlwZSwgYXR0cnMsIHJhbmdlKTtcbiAgICBpZiAoIXdyYXApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAodHIpXG4gICAgICAgIGRvV3JhcEluTGlzdCh0ciwgcmFuZ2UsIHdyYXAsIGRvSm9pbiwgbGlzdFR5cGUpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZG9XcmFwSW5MaXN0KHRyLCByYW5nZSwgd3JhcHBlcnMsIGpvaW5CZWZvcmUsIGxpc3RUeXBlKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBpID0gd3JhcHBlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICAgIGNvbnRlbnQgPSBGcmFnbWVudC5mcm9tKHdyYXBwZXJzW2ldLnR5cGUuY3JlYXRlKHdyYXBwZXJzW2ldLmF0dHJzLCBjb250ZW50KSk7XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAocmFuZ2Uuc3RhcnQgLSAoam9pbkJlZm9yZSA/IDIgOiAwKSwgcmFuZ2UuZW5kLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCBuZXcgU2xpY2UoY29udGVudCwgMCwgMCksIHdyYXBwZXJzLmxlbmd0aCwgdHJ1ZSkpO1xuICAgIGxldCBmb3VuZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3cmFwcGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKHdyYXBwZXJzW2ldLnR5cGUgPT0gbGlzdFR5cGUpXG4gICAgICAgICAgICBmb3VuZCA9IGkgKyAxO1xuICAgIGxldCBzcGxpdERlcHRoID0gd3JhcHBlcnMubGVuZ3RoIC0gZm91bmQ7XG4gICAgbGV0IHNwbGl0UG9zID0gcmFuZ2Uuc3RhcnQgKyB3cmFwcGVycy5sZW5ndGggLSAoam9pbkJlZm9yZSA/IDIgOiAwKSwgcGFyZW50ID0gcmFuZ2UucGFyZW50O1xuICAgIGZvciAobGV0IGkgPSByYW5nZS5zdGFydEluZGV4LCBlID0gcmFuZ2UuZW5kSW5kZXgsIGZpcnN0ID0gdHJ1ZTsgaSA8IGU7IGkrKywgZmlyc3QgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIWZpcnN0ICYmIGNhblNwbGl0KHRyLmRvYywgc3BsaXRQb3MsIHNwbGl0RGVwdGgpKSB7XG4gICAgICAgICAgICB0ci5zcGxpdChzcGxpdFBvcywgc3BsaXREZXB0aCk7XG4gICAgICAgICAgICBzcGxpdFBvcyArPSAyICogc3BsaXREZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBzcGxpdFBvcyArPSBwYXJlbnQuY2hpbGQoaSkubm9kZVNpemU7XG4gICAgfVxuICAgIHJldHVybiB0cjtcbn1cbi8qKlxuQnVpbGQgYSBjb21tYW5kIHRoYXQgc3BsaXRzIGEgbm9uLWVtcHR5IHRleHRibG9jayBhdCB0aGUgdG9wIGxldmVsXG5vZiBhIGxpc3QgaXRlbSBieSBhbHNvIHNwbGl0dGluZyB0aGF0IGxpc3QgaXRlbS5cbiovXG5mdW5jdGlvbiBzcGxpdExpc3RJdGVtKGl0ZW1UeXBlLCBpdGVtQXR0cnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvLCBub2RlIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGlmICgobm9kZSAmJiBub2RlLmlzQmxvY2spIHx8ICRmcm9tLmRlcHRoIDwgMiB8fCAhJGZyb20uc2FtZVBhcmVudCgkdG8pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZ3JhbmRQYXJlbnQgPSAkZnJvbS5ub2RlKC0xKTtcbiAgICAgICAgaWYgKGdyYW5kUGFyZW50LnR5cGUgIT0gaXRlbVR5cGUpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICgkZnJvbS5wYXJlbnQuY29udGVudC5zaXplID09IDAgJiYgJGZyb20ubm9kZSgtMSkuY2hpbGRDb3VudCA9PSAkZnJvbS5pbmRleEFmdGVyKC0xKSkge1xuICAgICAgICAgICAgLy8gSW4gYW4gZW1wdHkgYmxvY2suIElmIHRoaXMgaXMgYSBuZXN0ZWQgbGlzdCwgdGhlIHdyYXBwaW5nXG4gICAgICAgICAgICAvLyBsaXN0IGl0ZW0gc2hvdWxkIGJlIHNwbGl0LiBPdGhlcndpc2UsIGJhaWwgb3V0IGFuZCBsZXQgbmV4dFxuICAgICAgICAgICAgLy8gY29tbWFuZCBoYW5kbGUgbGlmdGluZy5cbiAgICAgICAgICAgIGlmICgkZnJvbS5kZXB0aCA9PSAzIHx8ICRmcm9tLm5vZGUoLTMpLnR5cGUgIT0gaXRlbVR5cGUgfHxcbiAgICAgICAgICAgICAgICAkZnJvbS5pbmRleCgtMikgIT0gJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCAtIDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHdyYXAgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGhCZWZvcmUgPSAkZnJvbS5pbmRleCgtMSkgPyAxIDogJGZyb20uaW5kZXgoLTIpID8gMiA6IDM7XG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBmcmFnbWVudCBjb250YWluaW5nIGVtcHR5IHZlcnNpb25zIG9mIHRoZSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBvdXRlciBsaXN0IGl0ZW0gdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBjdXJzb3JcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkID0gJGZyb20uZGVwdGggLSBkZXB0aEJlZm9yZTsgZCA+PSAkZnJvbS5kZXB0aCAtIDM7IGQtLSlcbiAgICAgICAgICAgICAgICAgICAgd3JhcCA9IEZyYWdtZW50LmZyb20oJGZyb20ubm9kZShkKS5jb3B5KHdyYXApKTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGhBZnRlciA9ICRmcm9tLmluZGV4QWZ0ZXIoLTEpIDwgJGZyb20ubm9kZSgtMikuY2hpbGRDb3VudCA/IDFcbiAgICAgICAgICAgICAgICAgICAgOiAkZnJvbS5pbmRleEFmdGVyKC0yKSA8ICRmcm9tLm5vZGUoLTMpLmNoaWxkQ291bnQgPyAyIDogMztcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBzZWNvbmQgbGlzdCBpdGVtIHdpdGggYW4gZW1wdHkgZGVmYXVsdCBzdGFydCBub2RlXG4gICAgICAgICAgICAgICAgd3JhcCA9IHdyYXAuYXBwZW5kKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlQW5kRmlsbCgpKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJGZyb20uYmVmb3JlKCRmcm9tLmRlcHRoIC0gKGRlcHRoQmVmb3JlIC0gMSkpO1xuICAgICAgICAgICAgICAgIGxldCB0ciA9IHN0YXRlLnRyLnJlcGxhY2Uoc3RhcnQsICRmcm9tLmFmdGVyKC1kZXB0aEFmdGVyKSwgbmV3IFNsaWNlKHdyYXAsIDQgLSBkZXB0aEJlZm9yZSwgMCkpO1xuICAgICAgICAgICAgICAgIGxldCBzZWwgPSAtMTtcbiAgICAgICAgICAgICAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKHN0YXJ0LCB0ci5kb2MuY29udGVudC5zaXplLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWwgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNUZXh0YmxvY2sgJiYgbm9kZS5jb250ZW50LnNpemUgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IHBvcyArIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCA+IC0xKVxuICAgICAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc2VsKSkpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5leHRUeXBlID0gJHRvLnBvcyA9PSAkZnJvbS5lbmQoKSA/IGdyYW5kUGFyZW50LmNvbnRlbnRNYXRjaEF0KDApLmRlZmF1bHRUeXBlIDogbnVsbDtcbiAgICAgICAgbGV0IHRyID0gc3RhdGUudHIuZGVsZXRlKCRmcm9tLnBvcywgJHRvLnBvcyk7XG4gICAgICAgIGxldCB0eXBlcyA9IG5leHRUeXBlID8gW2l0ZW1BdHRycyA/IHsgdHlwZTogaXRlbVR5cGUsIGF0dHJzOiBpdGVtQXR0cnMgfSA6IG51bGwsIHsgdHlwZTogbmV4dFR5cGUgfV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY2FuU3BsaXQodHIuZG9jLCAkZnJvbS5wb3MsIDIsIHR5cGVzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRpc3BhdGNoKVxuICAgICAgICAgICAgZGlzcGF0Y2godHIuc3BsaXQoJGZyb20ucG9zLCAyLCB0eXBlcykuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG4vKipcbkFjdHMgbGlrZSBbYHNwbGl0TGlzdEl0ZW1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc2NoZW1hLWxpc3Quc3BsaXRMaXN0SXRlbSksIGJ1dFxud2l0aG91dCByZXNldHRpbmcgdGhlIHNldCBvZiBhY3RpdmUgbWFya3MgYXQgdGhlIGN1cnNvci5cbiovXG5mdW5jdGlvbiBzcGxpdExpc3RJdGVtS2VlcE1hcmtzKGl0ZW1UeXBlLCBpdGVtQXR0cnMpIHtcbiAgICBsZXQgc3BsaXQgPSBzcGxpdExpc3RJdGVtKGl0ZW1UeXBlLCBpdGVtQXR0cnMpO1xuICAgIHJldHVybiAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIHJldHVybiBzcGxpdChzdGF0ZSwgZGlzcGF0Y2ggJiYgKHRyID0+IHtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzIHx8IChzdGF0ZS5zZWxlY3Rpb24uJHRvLnBhcmVudE9mZnNldCAmJiBzdGF0ZS5zZWxlY3Rpb24uJGZyb20ubWFya3MoKSk7XG4gICAgICAgICAgICBpZiAobWFya3MpXG4gICAgICAgICAgICAgICAgdHIuZW5zdXJlTWFya3MobWFya3MpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbn1cbi8qKlxuQ3JlYXRlIGEgY29tbWFuZCB0byBsaWZ0IHRoZSBsaXN0IGl0ZW0gYXJvdW5kIHRoZSBzZWxlY3Rpb24gdXAgaW50b1xuYSB3cmFwcGluZyBsaXN0LlxuKi9cbmZ1bmN0aW9uIGxpZnRMaXN0SXRlbShpdGVtVHlwZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgbGV0IHJhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIG5vZGUgPT4gbm9kZS5jaGlsZENvdW50ID4gMCAmJiBub2RlLmZpcnN0Q2hpbGQudHlwZSA9PSBpdGVtVHlwZSk7XG4gICAgICAgIGlmICghcmFuZ2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghZGlzcGF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCRmcm9tLm5vZGUocmFuZ2UuZGVwdGggLSAxKS50eXBlID09IGl0ZW1UeXBlKSAvLyBJbnNpZGUgYSBwYXJlbnQgbGlzdFxuICAgICAgICAgICAgcmV0dXJuIGxpZnRUb091dGVyTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIGl0ZW1UeXBlLCByYW5nZSk7XG4gICAgICAgIGVsc2UgLy8gT3V0ZXIgbGlzdCBub2RlXG4gICAgICAgICAgICByZXR1cm4gbGlmdE91dE9mTGlzdChzdGF0ZSwgZGlzcGF0Y2gsIHJhbmdlKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gbGlmdFRvT3V0ZXJMaXN0KHN0YXRlLCBkaXNwYXRjaCwgaXRlbVR5cGUsIHJhbmdlKSB7XG4gICAgbGV0IHRyID0gc3RhdGUudHIsIGVuZCA9IHJhbmdlLmVuZCwgZW5kT2ZMaXN0ID0gcmFuZ2UuJHRvLmVuZChyYW5nZS5kZXB0aCk7XG4gICAgaWYgKGVuZCA8IGVuZE9mTGlzdCkge1xuICAgICAgICAvLyBUaGVyZSBhcmUgc2libGluZ3MgYWZ0ZXIgdGhlIGxpZnRlZCBpdGVtcywgd2hpY2ggbXVzdCBiZWNvbWVcbiAgICAgICAgLy8gY2hpbGRyZW4gb2YgdGhlIGxhc3QgaXRlbVxuICAgICAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChlbmQgLSAxLCBlbmRPZkxpc3QsIGVuZCwgZW5kT2ZMaXN0LCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShpdGVtVHlwZS5jcmVhdGUobnVsbCwgcmFuZ2UucGFyZW50LmNvcHkoKSkpLCAxLCAwKSwgMSwgdHJ1ZSkpO1xuICAgICAgICByYW5nZSA9IG5ldyBOb2RlUmFuZ2UodHIuZG9jLnJlc29sdmUocmFuZ2UuJGZyb20ucG9zKSwgdHIuZG9jLnJlc29sdmUoZW5kT2ZMaXN0KSwgcmFuZ2UuZGVwdGgpO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBsaWZ0VGFyZ2V0KHJhbmdlKTtcbiAgICBpZiAodGFyZ2V0ID09IG51bGwpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB0ci5saWZ0KHJhbmdlLCB0YXJnZXQpO1xuICAgIGxldCAkYWZ0ZXIgPSB0ci5kb2MucmVzb2x2ZSh0ci5tYXBwaW5nLm1hcChlbmQsIC0xKSAtIDEpO1xuICAgIGlmIChjYW5Kb2luKHRyLmRvYywgJGFmdGVyLnBvcykgJiYgJGFmdGVyLm5vZGVCZWZvcmUudHlwZSA9PSAkYWZ0ZXIubm9kZUFmdGVyLnR5cGUpXG4gICAgICAgIHRyLmpvaW4oJGFmdGVyLnBvcyk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBsaWZ0T3V0T2ZMaXN0KHN0YXRlLCBkaXNwYXRjaCwgcmFuZ2UpIHtcbiAgICBsZXQgdHIgPSBzdGF0ZS50ciwgbGlzdCA9IHJhbmdlLnBhcmVudDtcbiAgICAvLyBNZXJnZSB0aGUgbGlzdCBpdGVtcyBpbnRvIGEgc2luZ2xlIGJpZyBpdGVtXG4gICAgZm9yIChsZXQgcG9zID0gcmFuZ2UuZW5kLCBpID0gcmFuZ2UuZW5kSW5kZXggLSAxLCBlID0gcmFuZ2Uuc3RhcnRJbmRleDsgaSA+IGU7IGktLSkge1xuICAgICAgICBwb3MgLT0gbGlzdC5jaGlsZChpKS5ub2RlU2l6ZTtcbiAgICAgICAgdHIuZGVsZXRlKHBvcyAtIDEsIHBvcyArIDEpO1xuICAgIH1cbiAgICBsZXQgJHN0YXJ0ID0gdHIuZG9jLnJlc29sdmUocmFuZ2Uuc3RhcnQpLCBpdGVtID0gJHN0YXJ0Lm5vZGVBZnRlcjtcbiAgICBpZiAodHIubWFwcGluZy5tYXAocmFuZ2UuZW5kKSAhPSByYW5nZS5zdGFydCArICRzdGFydC5ub2RlQWZ0ZXIubm9kZVNpemUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYXRTdGFydCA9IHJhbmdlLnN0YXJ0SW5kZXggPT0gMCwgYXRFbmQgPSByYW5nZS5lbmRJbmRleCA9PSBsaXN0LmNoaWxkQ291bnQ7XG4gICAgbGV0IHBhcmVudCA9ICRzdGFydC5ub2RlKC0xKSwgaW5kZXhCZWZvcmUgPSAkc3RhcnQuaW5kZXgoLTEpO1xuICAgIGlmICghcGFyZW50LmNhblJlcGxhY2UoaW5kZXhCZWZvcmUgKyAoYXRTdGFydCA/IDAgOiAxKSwgaW5kZXhCZWZvcmUgKyAxLCBpdGVtLmNvbnRlbnQuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QpKSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc3RhcnQgPSAkc3RhcnQucG9zLCBlbmQgPSBzdGFydCArIGl0ZW0ubm9kZVNpemU7XG4gICAgLy8gU3RyaXAgb2ZmIHRoZSBzdXJyb3VuZGluZyBsaXN0LiBBdCB0aGUgc2lkZXMgd2hlcmUgd2UncmUgbm90IGF0XG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhlIGV4aXN0aW5nIGxpc3QgaXMgY2xvc2VkLiBBdCBzaWRlcyB3aGVyZVxuICAgIC8vIHRoaXMgaXMgdGhlIGVuZCwgaXQgaXMgb3ZlcndyaXR0ZW4gdG8gaXRzIGVuZC5cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlQXJvdW5kU3RlcChzdGFydCAtIChhdFN0YXJ0ID8gMSA6IDApLCBlbmQgKyAoYXRFbmQgPyAxIDogMCksIHN0YXJ0ICsgMSwgZW5kIC0gMSwgbmV3IFNsaWNlKChhdFN0YXJ0ID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKVxuICAgICAgICAuYXBwZW5kKGF0RW5kID8gRnJhZ21lbnQuZW1wdHkgOiBGcmFnbWVudC5mcm9tKGxpc3QuY29weShGcmFnbWVudC5lbXB0eSkpKSwgYXRTdGFydCA/IDAgOiAxLCBhdEVuZCA/IDAgOiAxKSwgYXRTdGFydCA/IDAgOiAxKSk7XG4gICAgZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbkNyZWF0ZSBhIGNvbW1hbmQgdG8gc2luayB0aGUgbGlzdCBpdGVtIGFyb3VuZCB0aGUgc2VsZWN0aW9uIGRvd25cbmludG8gYW4gaW5uZXIgbGlzdC5cbiovXG5mdW5jdGlvbiBzaW5rTGlzdEl0ZW0oaXRlbVR5cGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBkaXNwYXRjaCkge1xuICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICAgIGxldCByYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvLCBub2RlID0+IG5vZGUuY2hpbGRDb3VudCA+IDAgJiYgbm9kZS5maXJzdENoaWxkLnR5cGUgPT0gaXRlbVR5cGUpO1xuICAgICAgICBpZiAoIXJhbmdlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IHJhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICAgIGlmIChzdGFydEluZGV4ID09IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCBwYXJlbnQgPSByYW5nZS5wYXJlbnQsIG5vZGVCZWZvcmUgPSBwYXJlbnQuY2hpbGQoc3RhcnRJbmRleCAtIDEpO1xuICAgICAgICBpZiAobm9kZUJlZm9yZS50eXBlICE9IGl0ZW1UeXBlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBuZXN0ZWRCZWZvcmUgPSBub2RlQmVmb3JlLmxhc3RDaGlsZCAmJiBub2RlQmVmb3JlLmxhc3RDaGlsZC50eXBlID09IHBhcmVudC50eXBlO1xuICAgICAgICAgICAgbGV0IGlubmVyID0gRnJhZ21lbnQuZnJvbShuZXN0ZWRCZWZvcmUgPyBpdGVtVHlwZS5jcmVhdGUoKSA6IG51bGwpO1xuICAgICAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oaXRlbVR5cGUuY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20ocGFyZW50LnR5cGUuY3JlYXRlKG51bGwsIGlubmVyKSkpKSwgbmVzdGVkQmVmb3JlID8gMyA6IDEsIDApO1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IHJhbmdlLnN0YXJ0LCBhZnRlciA9IHJhbmdlLmVuZDtcbiAgICAgICAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKGJlZm9yZSAtIChuZXN0ZWRCZWZvcmUgPyAzIDogMSksIGFmdGVyLCBiZWZvcmUsIGFmdGVyLCBzbGljZSwgMSwgdHJ1ZSkpXG4gICAgICAgICAgICAgICAgLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFkZExpc3ROb2RlcywgYnVsbGV0TGlzdCwgbGlmdExpc3RJdGVtLCBsaXN0SXRlbSwgb3JkZXJlZExpc3QsIHNpbmtMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbSwgc3BsaXRMaXN0SXRlbUtlZXBNYXJrcywgd3JhcEluTGlzdCwgd3JhcFJhbmdlSW5MaXN0IH07XG4iLCJpbXBvcnQgeyBTbGljZSwgRnJhZ21lbnQsIE1hcmssIE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBSZXBsYWNlU3RlcCwgUmVwbGFjZUFyb3VuZFN0ZXAsIFRyYW5zZm9ybSB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGNsYXNzZXNCeUlkID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuU3VwZXJjbGFzcyBmb3IgZWRpdG9yIHNlbGVjdGlvbnMuIEV2ZXJ5IHNlbGVjdGlvbiB0eXBlIHNob3VsZFxuZXh0ZW5kIHRoaXMuIFNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuKi9cbmNsYXNzIFNlbGVjdGlvbiB7XG4gICAgLyoqXG4gICAgSW5pdGlhbGl6ZSBhIHNlbGVjdGlvbiB3aXRoIHRoZSBoZWFkIGFuZCBhbmNob3IgYW5kIHJhbmdlcy4gSWYgbm9cbiAgICByYW5nZXMgYXJlIGdpdmVuLCBjb25zdHJ1Y3RzIGEgc2luZ2xlIHJhbmdlIGFjcm9zcyBgJGFuY2hvcmAgYW5kXG4gICAgYCRoZWFkYC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCBhbmNob3Igb2YgdGhlIHNlbGVjdGlvbiAodGhlIHNpZGUgdGhhdCBzdGF5cyBpblxuICAgIHBsYWNlIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBtb2RpZmllZCkuXG4gICAgKi9cbiAgICAkYW5jaG9yLCBcbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgaGVhZCBvZiB0aGUgc2VsZWN0aW9uICh0aGUgc2lkZSB0aGF0IG1vdmVzIHdoZW5cbiAgICB0aGUgc2VsZWN0aW9uIGlzIG1vZGlmaWVkKS5cbiAgICAqL1xuICAgICRoZWFkLCByYW5nZXMpIHtcbiAgICAgICAgdGhpcy4kYW5jaG9yID0gJGFuY2hvcjtcbiAgICAgICAgdGhpcy4kaGVhZCA9ICRoZWFkO1xuICAgICAgICB0aGlzLnJhbmdlcyA9IHJhbmdlcyB8fCBbbmV3IFNlbGVjdGlvblJhbmdlKCRhbmNob3IubWluKCRoZWFkKSwgJGFuY2hvci5tYXgoJGhlYWQpKV07XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBhbmNob3IsIGFzIGFuIHVucmVzb2x2ZWQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBnZXQgYW5jaG9yKCkgeyByZXR1cm4gdGhpcy4kYW5jaG9yLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBzZWxlY3Rpb24ncyBoZWFkLlxuICAgICovXG4gICAgZ2V0IGhlYWQoKSB7IHJldHVybiB0aGlzLiRoZWFkLnBvczsgfVxuICAgIC8qKlxuICAgIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCBmcm9tKCkgeyByZXR1cm4gdGhpcy4kZnJvbS5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHNlbGVjdGlvbidzIG1haW4gcmFuZ2UuXG4gICAgKi9cbiAgICBnZXQgdG8oKSB7IHJldHVybiB0aGlzLiR0by5wb3M7IH1cbiAgICAvKipcbiAgICBUaGUgcmVzb2x2ZWQgbG93ZXIgIGJvdW5kIG9mIHRoZSBzZWxlY3Rpb24ncyBtYWluIHJhbmdlLlxuICAgICovXG4gICAgZ2V0ICRmcm9tKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yYW5nZXNbMF0uJGZyb207XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSByZXNvbHZlZCB1cHBlciBib3VuZCBvZiB0aGUgc2VsZWN0aW9uJ3MgbWFpbiByYW5nZS5cbiAgICAqL1xuICAgIGdldCAkdG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlc1swXS4kdG87XG4gICAgfVxuICAgIC8qKlxuICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY29udGFpbnMgYW55IGNvbnRlbnQuXG4gICAgKi9cbiAgICBnZXQgZW1wdHkoKSB7XG4gICAgICAgIGxldCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocmFuZ2VzW2ldLiRmcm9tLnBvcyAhPSByYW5nZXNbaV0uJHRvLnBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBzZWxlY3Rpb24gYXMgYSBzbGljZS5cbiAgICAqL1xuICAgIGNvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRmcm9tLmRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBzZWxlY3Rpb24gd2l0aCBhIHNsaWNlIG9yLCBpZiBubyBzbGljZSBpcyBnaXZlbixcbiAgICBkZWxldGUgdGhlIHNlbGVjdGlvbi4gV2lsbCBhcHBlbmQgdG8gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgcmVwbGFjZSh0ciwgY29udGVudCA9IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgIC8vIFB1dCB0aGUgbmV3IHNlbGVjdGlvbiBhdCB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlIGluc2VydGVkXG4gICAgICAgIC8vIGNvbnRlbnQuIFdoZW4gdGhhdCBlbmRlZCBpbiBhbiBpbmxpbmUgbm9kZSwgc2VhcmNoIGJhY2t3YXJkcyxcbiAgICAgICAgLy8gdG8gZ2V0IHRoZSBwb3NpdGlvbiBhZnRlciB0aGF0IG5vZGUuIElmIG5vdCwgc2VhcmNoIGZvcndhcmQuXG4gICAgICAgIGxldCBsYXN0Tm9kZSA9IGNvbnRlbnQuY29udGVudC5sYXN0Q2hpbGQsIGxhc3RQYXJlbnQgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQub3BlbkVuZDsgaSsrKSB7XG4gICAgICAgICAgICBsYXN0UGFyZW50ID0gbGFzdE5vZGU7XG4gICAgICAgICAgICBsYXN0Tm9kZSA9IGxhc3ROb2RlLmxhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFwRnJvbSA9IHRyLnN0ZXBzLmxlbmd0aCwgcmFuZ2VzID0gdGhpcy5yYW5nZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeyAkZnJvbSwgJHRvIH0gPSByYW5nZXNbaV0sIG1hcHBpbmcgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pO1xuICAgICAgICAgICAgdHIucmVwbGFjZVJhbmdlKG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIG1hcHBpbmcubWFwKCR0by5wb3MpLCBpID8gU2xpY2UuZW1wdHkgOiBjb250ZW50KTtcbiAgICAgICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVG9JbnNlcnRpb25FbmQodHIsIG1hcEZyb20sIChsYXN0Tm9kZSA/IGxhc3ROb2RlLmlzSW5saW5lIDogbGFzdFBhcmVudCAmJiBsYXN0UGFyZW50LmlzVGV4dGJsb2NrKSA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUsIGFwcGVuZGluZyB0aGUgY2hhbmdlc1xuICAgIHRvIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHJlcGxhY2VXaXRoKHRyLCBub2RlKSB7XG4gICAgICAgIGxldCBtYXBGcm9tID0gdHIuc3RlcHMubGVuZ3RoLCByYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHJhbmdlc1tpXSwgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKCRmcm9tLnBvcyksIHRvID0gbWFwcGluZy5tYXAoJHRvLnBvcyk7XG4gICAgICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgICAgIHRyLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIG5vZGUpO1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBtYXBGcm9tLCBub2RlLmlzSW5saW5lID8gLTEgOiAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gc3RhcnRpbmcgYXQgdGhlIGdpdmVuXG4gICAgcG9zaXRpb24gYW5kIHNlYXJjaGluZyBiYWNrIGlmIGBkaXJgIGlzIG5lZ2F0aXZlLCBhbmQgZm9yd2FyZCBpZlxuICAgIHBvc2l0aXZlLiBXaGVuIGB0ZXh0T25seWAgaXMgdHJ1ZSwgb25seSBjb25zaWRlciBjdXJzb3JcbiAgICBzZWxlY3Rpb25zLiBXaWxsIHJldHVybiBudWxsIHdoZW4gbm8gdmFsaWQgc2VsZWN0aW9uIHBvc2l0aW9uIGlzXG4gICAgZm91bmQuXG4gICAgKi9cbiAgICBzdGF0aWMgZmluZEZyb20oJHBvcywgZGlyLCB0ZXh0T25seSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBpbm5lciA9ICRwb3MucGFyZW50LmlubGluZUNvbnRlbnQgPyBuZXcgVGV4dFNlbGVjdGlvbigkcG9zKVxuICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLnBhcmVudCwgJHBvcy5wb3MsICRwb3MuaW5kZXgoKSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgIGlmIChpbm5lcilcbiAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgZm9yIChsZXQgZGVwdGggPSAkcG9zLmRlcHRoIC0gMTsgZGVwdGggPj0gMDsgZGVwdGgtLSkge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gZGlyIDwgMFxuICAgICAgICAgICAgICAgID8gZmluZFNlbGVjdGlvbkluKCRwb3Mubm9kZSgwKSwgJHBvcy5ub2RlKGRlcHRoKSwgJHBvcy5iZWZvcmUoZGVwdGggKyAxKSwgJHBvcy5pbmRleChkZXB0aCksIGRpciwgdGV4dE9ubHkpXG4gICAgICAgICAgICAgICAgOiBmaW5kU2VsZWN0aW9uSW4oJHBvcy5ub2RlKDApLCAkcG9zLm5vZGUoZGVwdGgpLCAkcG9zLmFmdGVyKGRlcHRoICsgMSksICRwb3MuaW5kZXgoZGVwdGgpICsgMSwgZGlyLCB0ZXh0T25seSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIGEgdmFsaWQgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gbmVhciB0aGUgZ2l2ZW5cbiAgICBwb3NpdGlvbi4gU2VhcmNoZXMgZm9yd2FyZCBmaXJzdCBieSBkZWZhdWx0LCBidXQgaWYgYGJpYXNgIGlzXG4gICAgbmVnYXRpdmUsIGl0IHdpbGwgc2VhcmNoIGJhY2t3YXJkcyBmaXJzdC5cbiAgICAqL1xuICAgIHN0YXRpYyBuZWFyKCRwb3MsIGJpYXMgPSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGcm9tKCRwb3MsIGJpYXMpIHx8IHRoaXMuZmluZEZyb20oJHBvcywgLWJpYXMpIHx8IG5ldyBBbGxTZWxlY3Rpb24oJHBvcy5ub2RlKDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgY3Vyc29yIG9yIGxlYWYgbm9kZSBzZWxlY3Rpb24gY2xvc2VzdCB0byB0aGUgc3RhcnQgb2ZcbiAgICB0aGUgZ2l2ZW4gZG9jdW1lbnQuIFdpbGwgcmV0dXJuIGFuXG4gICAgW2BBbGxTZWxlY3Rpb25gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuQWxsU2VsZWN0aW9uKSBpZiBubyB2YWxpZCBwb3NpdGlvblxuICAgIGV4aXN0cy5cbiAgICAqL1xuICAgIHN0YXRpYyBhdFN0YXJ0KGRvYykge1xuICAgICAgICByZXR1cm4gZmluZFNlbGVjdGlvbkluKGRvYywgZG9jLCAwLCAwLCAxKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIGN1cnNvciBvciBsZWFmIG5vZGUgc2VsZWN0aW9uIGNsb3Nlc3QgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIHN0YXRpYyBhdEVuZChkb2MpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRTZWxlY3Rpb25Jbihkb2MsIGRvYywgZG9jLmNvbnRlbnQuc2l6ZSwgZG9jLmNoaWxkQ291bnQsIC0xKSB8fCBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7XG4gICAgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc2VsZWN0aW9uLiBNdXN0IGJlXG4gICAgaW1wbGVtZW50ZWQgZm9yIGN1c3RvbSBjbGFzc2VzIChhcyBhIHN0YXRpYyBjbGFzcyBtZXRob2QpLlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAoIWpzb24gfHwgIWpzb24udHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICBsZXQgY2xzID0gY2xhc3Nlc0J5SWRbanNvbi50eXBlXTtcbiAgICAgICAgaWYgKCFjbHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTm8gc2VsZWN0aW9uIHR5cGUgJHtqc29uLnR5cGV9IGRlZmluZWRgKTtcbiAgICAgICAgcmV0dXJuIGNscy5mcm9tSlNPTihkb2MsIGpzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICBUbyBiZSBhYmxlIHRvIGRlc2VyaWFsaXplIHNlbGVjdGlvbnMgZnJvbSBKU09OLCBjdXN0b20gc2VsZWN0aW9uXG4gICAgY2xhc3NlcyBtdXN0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBhbiBJRCBzdHJpbmcsIHNvIHRoYXQgdGhleVxuICAgIGNhbiBiZSBkaXNhbWJpZ3VhdGVkLiBUcnkgdG8gcGljayBzb21ldGhpbmcgdGhhdCdzIHVubGlrZWx5IHRvXG4gICAgY2xhc2ggd2l0aCBjbGFzc2VzIGZyb20gb3RoZXIgbW9kdWxlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBqc29uSUQoaWQsIHNlbGVjdGlvbkNsYXNzKSB7XG4gICAgICAgIGlmIChpZCBpbiBjbGFzc2VzQnlJZClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRHVwbGljYXRlIHVzZSBvZiBzZWxlY3Rpb24gSlNPTiBJRCBcIiArIGlkKTtcbiAgICAgICAgY2xhc3Nlc0J5SWRbaWRdID0gc2VsZWN0aW9uQ2xhc3M7XG4gICAgICAgIHNlbGVjdGlvbkNsYXNzLnByb3RvdHlwZS5qc29uSUQgPSBpZDtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbkNsYXNzO1xuICAgIH1cbiAgICAvKipcbiAgICBHZXQgYSBbYm9va21hcmtdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TZWxlY3Rpb25Cb29rbWFyaykgZm9yIHRoaXMgc2VsZWN0aW9uLFxuICAgIHdoaWNoIGlzIGEgdmFsdWUgdGhhdCBjYW4gYmUgbWFwcGVkIHdpdGhvdXQgaGF2aW5nIGFjY2VzcyB0byBhXG4gICAgY3VycmVudCBkb2N1bWVudCwgYW5kIGxhdGVyIHJlc29sdmVkIHRvIGEgcmVhbCBzZWxlY3Rpb24gZm9yIGFcbiAgICBnaXZlbiBkb2N1bWVudCBhZ2Fpbi4gKFRoaXMgaXMgdXNlZCBtb3N0bHkgYnkgdGhlIGhpc3RvcnkgdG9cbiAgICB0cmFjayBhbmQgcmVzdG9yZSBvbGQgc2VsZWN0aW9ucy4pIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mXG4gICAgdGhpcyBtZXRob2QganVzdCBjb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHRvIGEgdGV4dCBzZWxlY3Rpb24gYW5kXG4gICAgcmV0dXJucyB0aGUgYm9va21hcmsgZm9yIHRoYXQuXG4gICAgKi9cbiAgICBnZXRCb29rbWFyaygpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbih0aGlzLiRhbmNob3IsIHRoaXMuJGhlYWQpLmdldEJvb2ttYXJrKCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gdHJ1ZTtcbi8qKlxuUmVwcmVzZW50cyBhIHNlbGVjdGVkIHJhbmdlIGluIGEgZG9jdW1lbnQuXG4qL1xuY2xhc3MgU2VsZWN0aW9uUmFuZ2Uge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJhbmdlLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS5cbiAgICAqL1xuICAgICRmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLlxuICAgICovXG4gICAgJHRvKSB7XG4gICAgICAgIHRoaXMuJGZyb20gPSAkZnJvbTtcbiAgICAgICAgdGhpcy4kdG8gPSAkdG87XG4gICAgfVxufVxubGV0IHdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiA9IGZhbHNlO1xuZnVuY3Rpb24gY2hlY2tUZXh0U2VsZWN0aW9uKCRwb3MpIHtcbiAgICBpZiAoIXdhcm5lZEFib3V0VGV4dFNlbGVjdGlvbiAmJiAhJHBvcy5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICB3YXJuZWRBYm91dFRleHRTZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBjb25zb2xlW1wid2FyblwiXShcIlRleHRTZWxlY3Rpb24gZW5kcG9pbnQgbm90IHBvaW50aW5nIGludG8gYSBub2RlIHdpdGggaW5saW5lIGNvbnRlbnQgKFwiICsgJHBvcy5wYXJlbnQudHlwZS5uYW1lICsgXCIpXCIpO1xuICAgIH1cbn1cbi8qKlxuQSB0ZXh0IHNlbGVjdGlvbiByZXByZXNlbnRzIGEgY2xhc3NpY2FsIGVkaXRvciBzZWxlY3Rpb24sIHdpdGggYVxuaGVhZCAodGhlIG1vdmluZyBzaWRlKSBhbmQgYW5jaG9yIChpbW1vYmlsZSBzaWRlKSwgYm90aCBvZiB3aGljaFxucG9pbnQgaW50byB0ZXh0YmxvY2sgbm9kZXMuIEl0IGNhbiBiZSBlbXB0eSAoYSByZWd1bGFyIGN1cnNvclxucG9zaXRpb24pLlxuKi9cbmNsYXNzIFRleHRTZWxlY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb24ge1xuICAgIC8qKlxuICAgIENvbnN0cnVjdCBhIHRleHQgc2VsZWN0aW9uIGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRhbmNob3IsICRoZWFkID0gJGFuY2hvcikge1xuICAgICAgICBjaGVja1RleHRTZWxlY3Rpb24oJGFuY2hvcik7XG4gICAgICAgIGNoZWNrVGV4dFNlbGVjdGlvbigkaGVhZCk7XG4gICAgICAgIHN1cGVyKCRhbmNob3IsICRoZWFkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyBhIHJlc29sdmVkIHBvc2l0aW9uIGlmIHRoaXMgaXMgYSBjdXJzb3Igc2VsZWN0aW9uIChhblxuICAgIGVtcHR5IHRleHQgc2VsZWN0aW9uKSwgYW5kIG51bGwgb3RoZXJ3aXNlLlxuICAgICovXG4gICAgZ2V0ICRjdXJzb3IoKSB7IHJldHVybiB0aGlzLiRhbmNob3IucG9zID09IHRoaXMuJGhlYWQucG9zID8gdGhpcy4kaGVhZCA6IG51bGw7IH1cbiAgICBtYXAoZG9jLCBtYXBwaW5nKSB7XG4gICAgICAgIGxldCAkaGVhZCA9IGRvYy5yZXNvbHZlKG1hcHBpbmcubWFwKHRoaXMuaGVhZCkpO1xuICAgICAgICBpZiAoISRoZWFkLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvbi5uZWFyKCRoZWFkKTtcbiAgICAgICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShtYXBwaW5nLm1hcCh0aGlzLmFuY2hvcikpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRhbmNob3IgOiAkaGVhZCwgJGhlYWQpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgc3VwZXIucmVwbGFjZSh0ciwgY29udGVudCk7XG4gICAgICAgIGlmIChjb250ZW50ID09IFNsaWNlLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgbWFya3MgPSB0aGlzLiRmcm9tLm1hcmtzQWNyb3NzKHRoaXMuJHRvKTtcbiAgICAgICAgICAgIGlmIChtYXJrcylcbiAgICAgICAgICAgICAgICB0ci5lbnN1cmVNYXJrcyhtYXJrcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXEob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJiBvdGhlci5hbmNob3IgPT0gdGhpcy5hbmNob3IgJiYgb3RoZXIuaGVhZCA9PSB0aGlzLmhlYWQ7XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRleHRCb29rbWFyayh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgYW5jaG9yOiB0aGlzLmFuY2hvciwgaGVhZDogdGhpcy5oZWFkIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGRvYywganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uYW5jaG9yICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGpzb24uaGVhZCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBUZXh0U2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpLCBkb2MucmVzb2x2ZShqc29uLmhlYWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgdGV4dCBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGFuY2hvciwgaGVhZCA9IGFuY2hvcikge1xuICAgICAgICBsZXQgJGFuY2hvciA9IGRvYy5yZXNvbHZlKGFuY2hvcik7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcygkYW5jaG9yLCBoZWFkID09IGFuY2hvciA/ICRhbmNob3IgOiBkb2MucmVzb2x2ZShoZWFkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFJldHVybiBhIHRleHQgc2VsZWN0aW9uIHRoYXQgc3BhbnMgdGhlIGdpdmVuIHBvc2l0aW9ucyBvciwgaWZcbiAgICB0aGV5IGFyZW4ndCB0ZXh0IHBvc2l0aW9ucywgZmluZCBhIHRleHQgc2VsZWN0aW9uIG5lYXIgdGhlbS5cbiAgICBgYmlhc2AgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtZXRob2Qgc2VhcmNoZXMgZm9yd2FyZCAoZGVmYXVsdClcbiAgICBvciBiYWNrd2FyZHMgKG5lZ2F0aXZlIG51bWJlcikgZmlyc3QuIFdpbGwgZmFsbCBiYWNrIHRvIGNhbGxpbmdcbiAgICBbYFNlbGVjdGlvbi5uZWFyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbl5uZWFyKSB3aGVuIHRoZSBkb2N1bWVudFxuICAgIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHRleHQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcykge1xuICAgICAgICBsZXQgZFBvcyA9ICRhbmNob3IucG9zIC0gJGhlYWQucG9zO1xuICAgICAgICBpZiAoIWJpYXMgfHwgZFBvcylcbiAgICAgICAgICAgIGJpYXMgPSBkUG9zID49IDAgPyAxIDogLTE7XG4gICAgICAgIGlmICghJGhlYWQucGFyZW50LmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IFNlbGVjdGlvbi5maW5kRnJvbSgkaGVhZCwgYmlhcywgdHJ1ZSkgfHwgU2VsZWN0aW9uLmZpbmRGcm9tKCRoZWFkLCAtYmlhcywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgJGhlYWQgPSBmb3VuZC4kaGVhZDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uLm5lYXIoJGhlYWQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghJGFuY2hvci5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKGRQb3MgPT0gMCkge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAkaGVhZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRhbmNob3IgPSAoU2VsZWN0aW9uLmZpbmRGcm9tKCRhbmNob3IsIC1iaWFzLCB0cnVlKSB8fCBTZWxlY3Rpb24uZmluZEZyb20oJGFuY2hvciwgYmlhcywgdHJ1ZSkpLiRhbmNob3I7XG4gICAgICAgICAgICAgICAgaWYgKCgkYW5jaG9yLnBvcyA8ICRoZWFkLnBvcykgIT0gKGRQb3MgPCAwKSlcbiAgICAgICAgICAgICAgICAgICAgJGFuY2hvciA9ICRoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFNlbGVjdGlvbigkYW5jaG9yLCAkaGVhZCk7XG4gICAgfVxufVxuU2VsZWN0aW9uLmpzb25JRChcInRleHRcIiwgVGV4dFNlbGVjdGlvbik7XG5jbGFzcyBUZXh0Qm9va21hcmsge1xuICAgIGNvbnN0cnVjdG9yKGFuY2hvciwgaGVhZCkge1xuICAgICAgICB0aGlzLmFuY2hvciA9IGFuY2hvcjtcbiAgICAgICAgdGhpcy5oZWFkID0gaGVhZDtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0Qm9va21hcmsobWFwcGluZy5tYXAodGhpcy5hbmNob3IpLCBtYXBwaW5nLm1hcCh0aGlzLmhlYWQpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgcmV0dXJuIFRleHRTZWxlY3Rpb24uYmV0d2Vlbihkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIGRvYy5yZXNvbHZlKHRoaXMuaGVhZCkpO1xuICAgIH1cbn1cbi8qKlxuQSBub2RlIHNlbGVjdGlvbiBpcyBhIHNlbGVjdGlvbiB0aGF0IHBvaW50cyBhdCBhIHNpbmdsZSBub2RlLiBBbGxcbm5vZGVzIG1hcmtlZCBbc2VsZWN0YWJsZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLnNlbGVjdGFibGUpIGNhbiBiZSB0aGVcbnRhcmdldCBvZiBhIG5vZGUgc2VsZWN0aW9uLiBJbiBzdWNoIGEgc2VsZWN0aW9uLCBgZnJvbWAgYW5kIGB0b2BcbnBvaW50IGRpcmVjdGx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNlbGVjdGVkIG5vZGUsIGBhbmNob3JgIGVxdWFsc1xuYGZyb21gLCBhbmQgYGhlYWRgIGVxdWFscyBgdG9gLi5cbiovXG5jbGFzcyBOb2RlU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIHNlbGVjdGlvbi4gRG9lcyBub3QgdmVyaWZ5IHRoZSB2YWxpZGl0eSBvZiBpdHNcbiAgICBhcmd1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCRwb3MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgbGV0ICRlbmQgPSAkcG9zLm5vZGUoMCkucmVzb2x2ZSgkcG9zLnBvcyArIG5vZGUubm9kZVNpemUpO1xuICAgICAgICBzdXBlcigkcG9zLCAkZW5kKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbWFwKGRvYywgbWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgICAgICBpZiAoZGVsZXRlZClcbiAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKCRwb3MpO1xuICAgIH1cbiAgICBjb250ZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odGhpcy5ub2RlKSwgMCwgMCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgb3RoZXIuYW5jaG9yID09IHRoaXMuYW5jaG9yO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwibm9kZVwiLCBhbmNob3I6IHRoaXMuYW5jaG9yIH07XG4gICAgfVxuICAgIGdldEJvb2ttYXJrKCkgeyByZXR1cm4gbmV3IE5vZGVCb29rbWFyayh0aGlzLmFuY2hvcik7IH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0YXRpYyBmcm9tSlNPTihkb2MsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmFuY2hvciAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBOb2RlU2VsZWN0aW9uLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oZG9jLnJlc29sdmUoanNvbi5hbmNob3IpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbm9kZSBzZWxlY3Rpb24gZnJvbSBub24tcmVzb2x2ZWQgcG9zaXRpb25zLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkb2MsIGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlU2VsZWN0aW9uKGRvYy5yZXNvbHZlKGZyb20pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIG1heSBiZSBzZWxlY3RlZCBhcyBhIG5vZGVcbiAgICBzZWxlY3Rpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgaXNTZWxlY3RhYmxlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuICFub2RlLmlzVGV4dCAmJiBub2RlLnR5cGUuc3BlYy5zZWxlY3RhYmxlICE9PSBmYWxzZTtcbiAgICB9XG59XG5Ob2RlU2VsZWN0aW9uLnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7XG5TZWxlY3Rpb24uanNvbklEKFwibm9kZVwiLCBOb2RlU2VsZWN0aW9uKTtcbmNsYXNzIE5vZGVCb29rbWFyayB7XG4gICAgY29uc3RydWN0b3IoYW5jaG9yKSB7XG4gICAgICAgIHRoaXMuYW5jaG9yID0gYW5jaG9yO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgeyBkZWxldGVkLCBwb3MgfSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuYW5jaG9yKTtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQgPyBuZXcgVGV4dEJvb2ttYXJrKHBvcywgcG9zKSA6IG5ldyBOb2RlQm9va21hcmsocG9zKTtcbiAgICB9XG4gICAgcmVzb2x2ZShkb2MpIHtcbiAgICAgICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZSh0aGlzLmFuY2hvciksIG5vZGUgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgaWYgKG5vZGUgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVTZWxlY3Rpb24oJHBvcyk7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb24ubmVhcigkcG9zKTtcbiAgICB9XG59XG4vKipcbkEgc2VsZWN0aW9uIHR5cGUgdGhhdCByZXByZXNlbnRzIHNlbGVjdGluZyB0aGUgd2hvbGUgZG9jdW1lbnRcbih3aGljaCBjYW4gbm90IG5lY2Vzc2FyaWx5IGJlIGV4cHJlc3NlZCB3aXRoIGEgdGV4dCBzZWxlY3Rpb24sIHdoZW5cbnRoZXJlIGFyZSBmb3IgZXhhbXBsZSBsZWFmIGJsb2NrIG5vZGVzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlXG5kb2N1bWVudCkuXG4qL1xuY2xhc3MgQWxsU2VsZWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYW4gYWxsLXNlbGVjdGlvbiBvdmVyIHRoZSBnaXZlbiBkb2N1bWVudC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRvYykge1xuICAgICAgICBzdXBlcihkb2MucmVzb2x2ZSgwKSwgZG9jLnJlc29sdmUoZG9jLmNvbnRlbnQuc2l6ZSkpO1xuICAgIH1cbiAgICByZXBsYWNlKHRyLCBjb250ZW50ID0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT0gU2xpY2UuZW1wdHkpIHtcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgwLCB0ci5kb2MuY29udGVudC5zaXplKTtcbiAgICAgICAgICAgIGxldCBzZWwgPSBTZWxlY3Rpb24uYXRTdGFydCh0ci5kb2MpO1xuICAgICAgICAgICAgaWYgKCFzZWwuZXEodHIuc2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLnJlcGxhY2UodHIsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHsgcmV0dXJuIHsgdHlwZTogXCJhbGxcIiB9OyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBtYXAoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbiAgICBlcShvdGhlcikgeyByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBBbGxTZWxlY3Rpb247IH1cbiAgICBnZXRCb29rbWFyaygpIHsgcmV0dXJuIEFsbEJvb2ttYXJrOyB9XG59XG5TZWxlY3Rpb24uanNvbklEKFwiYWxsXCIsIEFsbFNlbGVjdGlvbik7XG5jb25zdCBBbGxCb29rbWFyayA9IHtcbiAgICBtYXAoKSB7IHJldHVybiB0aGlzOyB9LFxuICAgIHJlc29sdmUoZG9jKSB7IHJldHVybiBuZXcgQWxsU2VsZWN0aW9uKGRvYyk7IH1cbn07XG4vLyBGSVhNRSB3ZSdsbCBuZWVkIHNvbWUgYXdhcmVuZXNzIG9mIHRleHQgZGlyZWN0aW9uIHdoZW4gc2Nhbm5pbmcgZm9yIHNlbGVjdGlvbnNcbi8vIFRyeSB0byBmaW5kIGEgc2VsZWN0aW9uIGluc2lkZSB0aGUgZ2l2ZW4gbm9kZS4gYHBvc2AgcG9pbnRzIGF0IHRoZVxuLy8gcG9zaXRpb24gd2hlcmUgdGhlIHNlYXJjaCBzdGFydHMuIFdoZW4gYHRleHRgIGlzIHRydWUsIG9ubHkgcmV0dXJuXG4vLyB0ZXh0IHNlbGVjdGlvbnMuXG5mdW5jdGlvbiBmaW5kU2VsZWN0aW9uSW4oZG9jLCBub2RlLCBwb3MsIGluZGV4LCBkaXIsIHRleHQgPSBmYWxzZSkge1xuICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQpXG4gICAgICAgIHJldHVybiBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyk7XG4gICAgZm9yIChsZXQgaSA9IGluZGV4IC0gKGRpciA+IDAgPyAwIDogMSk7IGRpciA+IDAgPyBpIDwgbm9kZS5jaGlsZENvdW50IDogaSA+PSAwOyBpICs9IGRpcikge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkKGkpO1xuICAgICAgICBpZiAoIWNoaWxkLmlzQXRvbSkge1xuICAgICAgICAgICAgbGV0IGlubmVyID0gZmluZFNlbGVjdGlvbkluKGRvYywgY2hpbGQsIHBvcyArIGRpciwgZGlyIDwgMCA/IGNoaWxkLmNoaWxkQ291bnQgOiAwLCBkaXIsIHRleHQpO1xuICAgICAgICAgICAgaWYgKGlubmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdGV4dCAmJiBOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIHBvcyAtIChkaXIgPCAwID8gY2hpbGQubm9kZVNpemUgOiAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcG9zICs9IGNoaWxkLm5vZGVTaXplICogZGlyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvSW5zZXJ0aW9uRW5kKHRyLCBzdGFydExlbiwgYmlhcykge1xuICAgIGxldCBsYXN0ID0gdHIuc3RlcHMubGVuZ3RoIC0gMTtcbiAgICBpZiAobGFzdCA8IHN0YXJ0TGVuKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHN0ZXAgPSB0ci5zdGVwc1tsYXN0XTtcbiAgICBpZiAoIShzdGVwIGluc3RhbmNlb2YgUmVwbGFjZVN0ZXAgfHwgc3RlcCBpbnN0YW5jZW9mIFJlcGxhY2VBcm91bmRTdGVwKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBtYXAgPSB0ci5tYXBwaW5nLm1hcHNbbGFzdF0sIGVuZDtcbiAgICBtYXAuZm9yRWFjaCgoX2Zyb20sIF90bywgX25ld0Zyb20sIG5ld1RvKSA9PiB7IGlmIChlbmQgPT0gbnVsbClcbiAgICAgICAgZW5kID0gbmV3VG87IH0pO1xuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZShlbmQpLCBiaWFzKSk7XG59XG5cbmNvbnN0IFVQREFURURfU0VMID0gMSwgVVBEQVRFRF9NQVJLUyA9IDIsIFVQREFURURfU0NST0xMID0gNDtcbi8qKlxuQW4gZWRpdG9yIHN0YXRlIHRyYW5zYWN0aW9uLCB3aGljaCBjYW4gYmUgYXBwbGllZCB0byBhIHN0YXRlIHRvXG5jcmVhdGUgYW4gdXBkYXRlZCBzdGF0ZS4gVXNlXG5bYEVkaXRvclN0YXRlLnRyYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnRyKSB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG5cblRyYW5zYWN0aW9ucyB0cmFjayBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCAodGhleSBhcmUgYSBzdWJjbGFzcyBvZlxuW2BUcmFuc2Zvcm1gXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybSkpLCBidXQgYWxzbyBvdGhlciBzdGF0ZSBjaGFuZ2VzLFxubGlrZSBzZWxlY3Rpb24gdXBkYXRlcyBhbmQgYWRqdXN0bWVudHMgb2YgdGhlIHNldCBvZiBbc3RvcmVkXG5tYXJrc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlLnN0b3JlZE1hcmtzKS4gSW4gYWRkaXRpb24sIHlvdSBjYW4gc3RvcmVcbm1ldGFkYXRhIHByb3BlcnRpZXMgaW4gYSB0cmFuc2FjdGlvbiwgd2hpY2ggYXJlIGV4dHJhIHBpZWNlcyBvZlxuaW5mb3JtYXRpb24gdGhhdCBjbGllbnQgY29kZSBvciBwbHVnaW5zIGNhbiB1c2UgdG8gZGVzY3JpYmUgd2hhdCBhXG50cmFuc2FjdGlvbiByZXByZXNlbnRzLCBzbyB0aGF0IHRoZXkgY2FuIHVwZGF0ZSB0aGVpciBbb3duXG5zdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlN0YXRlRmllbGQpIGFjY29yZGluZ2x5LlxuXG5UaGUgW2VkaXRvciB2aWV3XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5FZGl0b3JWaWV3KSB1c2VzIGEgZmV3IG1ldGFkYXRhXG5wcm9wZXJ0aWVzOiBpdCB3aWxsIGF0dGFjaCBhIHByb3BlcnR5IGBcInBvaW50ZXJcImAgd2l0aCB0aGUgdmFsdWVcbmB0cnVlYCB0byBzZWxlY3Rpb24gdHJhbnNhY3Rpb25zIGRpcmVjdGx5IGNhdXNlZCBieSBtb3VzZSBvciB0b3VjaFxuaW5wdXQsIGEgYFwiY29tcG9zaXRpb25cImAgcHJvcGVydHkgaG9sZGluZyBhbiBJRCBpZGVudGlmeWluZyB0aGVcbmNvbXBvc2l0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIHRyYW5zYWN0aW9ucyBjYXVzZWQgYnkgY29tcG9zZWQgRE9NXG5pbnB1dCwgYW5kIGEgYFwidWlFdmVudFwiYCBwcm9wZXJ0eSBvZiB0aGF0IG1heSBiZSBgXCJwYXN0ZVwiYCxcbmBcImN1dFwiYCwgb3IgYFwiZHJvcFwiYC5cbiovXG5jbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSkge1xuICAgICAgICBzdXBlcihzdGF0ZS5kb2MpO1xuICAgICAgICAvLyBUaGUgc3RlcCBjb3VudCBmb3Igd2hpY2ggdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIHZhbGlkLlxuICAgICAgICB0aGlzLmN1clNlbGVjdGlvbkZvciA9IDA7XG4gICAgICAgIC8vIEJpdGZpZWxkIHRvIHRyYWNrIHdoaWNoIGFzcGVjdHMgb2YgdGhlIHN0YXRlIHdlcmUgdXBkYXRlZCBieVxuICAgICAgICAvLyB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAgICB0aGlzLnVwZGF0ZWQgPSAwO1xuICAgICAgICAvLyBPYmplY3QgdXNlZCB0byBzdG9yZSBtZXRhZGF0YSBwcm9wZXJ0aWVzIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgIHRoaXMubWV0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMudGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gc3RhdGUuc3RvcmVkTWFya3M7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSB0cmFuc2FjdGlvbidzIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBlZGl0b3JcbiAgICBzZWxlY3Rpb24gW21hcHBlZF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlNlbGVjdGlvbi5tYXApIHRocm91Z2ggdGhlIHN0ZXBzIGluIHRoZVxuICAgIHRyYW5zYWN0aW9uLCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIHdpdGhcbiAgICBbYHNldFNlbGVjdGlvbmBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbi5zZXRTZWxlY3Rpb24pLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VyU2VsZWN0aW9uRm9yIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uID0gdGhpcy5jdXJTZWxlY3Rpb24ubWFwKHRoaXMuZG9jLCB0aGlzLm1hcHBpbmcuc2xpY2UodGhpcy5jdXJTZWxlY3Rpb25Gb3IpKTtcbiAgICAgICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyU2VsZWN0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHRyYW5zYWN0aW9uJ3MgY3VycmVudCBzZWxlY3Rpb24uIFdpbGwgZGV0ZXJtaW5lIHRoZVxuICAgIHNlbGVjdGlvbiB0aGF0IHRoZSBlZGl0b3IgZ2V0cyB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhcHBsaWVkLlxuICAgICovXG4gICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xuICAgICAgICBpZiAoc2VsZWN0aW9uLiRmcm9tLmRvYyAhPSB0aGlzLmRvYylcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiU2VsZWN0aW9uIHBhc3NlZCB0byBzZXRTZWxlY3Rpb24gbXVzdCBwb2ludCBhdCB0aGUgY3VycmVudCBkb2N1bWVudFwiKTtcbiAgICAgICAgdGhpcy5jdXJTZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMuY3VyU2VsZWN0aW9uRm9yID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9ICh0aGlzLnVwZGF0ZWQgfCBVUERBVEVEX1NFTCkgJiB+VVBEQVRFRF9NQVJLUztcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gd2FzIGV4cGxpY2l0bHkgdXBkYXRlZCBieSB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHNlbGVjdGlvblNldCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnVwZGF0ZWQgJiBVUERBVEVEX1NFTCkgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXQgdGhlIGN1cnJlbnQgc3RvcmVkIG1hcmtzLlxuICAgICovXG4gICAgc2V0U3RvcmVkTWFya3MobWFya3MpIHtcbiAgICAgICAgdGhpcy5zdG9yZWRNYXJrcyA9IG1hcmtzO1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9NQVJLUztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBzdG9yZWQgbWFya3Mgb3IsIGlmIHRoYXQgaXMgbnVsbCwgdGhlIG1hcmtzXG4gICAgYXQgdGhlIHNlbGVjdGlvbiwgbWF0Y2ggdGhlIGdpdmVuIHNldCBvZiBtYXJrcy4gRG9lcyBub3RoaW5nIGlmXG4gICAgdGhpcyBpcyBhbHJlYWR5IHRoZSBjYXNlLlxuICAgICovXG4gICAgZW5zdXJlTWFya3MobWFya3MpIHtcbiAgICAgICAgaWYgKCFNYXJrLnNhbWVTZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kZnJvbS5tYXJrcygpLCBtYXJrcykpXG4gICAgICAgICAgICB0aGlzLnNldFN0b3JlZE1hcmtzKG1hcmtzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIG1hcmsgdG8gdGhlIHNldCBvZiBzdG9yZWQgbWFya3MuXG4gICAgKi9cbiAgICBhZGRTdG9yZWRNYXJrKG1hcmspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlTWFya3MobWFyay5hZGRUb1NldCh0aGlzLnN0b3JlZE1hcmtzIHx8IHRoaXMuc2VsZWN0aW9uLiRoZWFkLm1hcmtzKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVtb3ZlIGEgbWFyayBvciBtYXJrIHR5cGUgZnJvbSB0aGUgc2V0IG9mIHN0b3JlZCBtYXJrcy5cbiAgICAqL1xuICAgIHJlbW92ZVN0b3JlZE1hcmsobWFyaykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnN1cmVNYXJrcyhtYXJrLnJlbW92ZUZyb21TZXQodGhpcy5zdG9yZWRNYXJrcyB8fCB0aGlzLnNlbGVjdGlvbi4kaGVhZC5tYXJrcygpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgIFdoZXRoZXIgdGhlIHN0b3JlZCBtYXJrcyB3ZXJlIGV4cGxpY2l0bHkgc2V0IGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICovXG4gICAgZ2V0IHN0b3JlZE1hcmtzU2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudXBkYXRlZCAmIFVQREFURURfTUFSS1MpID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBhZGRTdGVwKHN0ZXAsIGRvYykge1xuICAgICAgICBzdXBlci5hZGRTdGVwKHN0ZXAsIGRvYyk7XG4gICAgICAgIHRoaXMudXBkYXRlZCA9IHRoaXMudXBkYXRlZCAmIH5VUERBVEVEX01BUktTO1xuICAgICAgICB0aGlzLnN0b3JlZE1hcmtzID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgVXBkYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNldFRpbWUodGltZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gc2xpY2UuXG4gICAgKi9cbiAgICByZXBsYWNlU2VsZWN0aW9uKHNsaWNlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlcGxhY2UodGhpcywgc2xpY2UpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIG5vZGUuIFdoZW4gYGluaGVyaXRNYXJrc2AgaXNcbiAgICB0cnVlIGFuZCB0aGUgY29udGVudCBpcyBpbmxpbmUsIGl0IGluaGVyaXRzIHRoZSBtYXJrcyBmcm9tIHRoZVxuICAgIHBsYWNlIHdoZXJlIGl0IGlzIGluc2VydGVkLlxuICAgICovXG4gICAgcmVwbGFjZVNlbGVjdGlvbldpdGgobm9kZSwgaW5oZXJpdE1hcmtzID0gdHJ1ZSkge1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICAgIGlmIChpbmhlcml0TWFya3MpXG4gICAgICAgICAgICBub2RlID0gbm9kZS5tYXJrKHRoaXMuc3RvcmVkTWFya3MgfHwgKHNlbGVjdGlvbi5lbXB0eSA/IHNlbGVjdGlvbi4kZnJvbS5tYXJrcygpIDogKHNlbGVjdGlvbi4kZnJvbS5tYXJrc0Fjcm9zcyhzZWxlY3Rpb24uJHRvKSB8fCBNYXJrLm5vbmUpKSk7XG4gICAgICAgIHNlbGVjdGlvbi5yZXBsYWNlV2l0aCh0aGlzLCBub2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIERlbGV0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICovXG4gICAgZGVsZXRlU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXBsYWNlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSB0aGUgZ2l2ZW4gcmFuZ2UsIG9yIHRoZSBzZWxlY3Rpb24gaWYgbm8gcmFuZ2UgaXMgZ2l2ZW4sXG4gICAgd2l0aCBhIHRleHQgbm9kZSBjb250YWluaW5nIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAgKi9cbiAgICBpbnNlcnRUZXh0KHRleHQsIGZyb20sIHRvKSB7XG4gICAgICAgIGxldCBzY2hlbWEgPSB0aGlzLmRvYy50eXBlLnNjaGVtYTtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdGlvbldpdGgoc2NoZW1hLnRleHQodGV4dCksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRvID09IG51bGwpXG4gICAgICAgICAgICAgICAgdG8gPSBmcm9tO1xuICAgICAgICAgICAgdG8gPSB0byA9PSBudWxsID8gZnJvbSA6IHRvO1xuICAgICAgICAgICAgaWYgKCF0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVJhbmdlKGZyb20sIHRvKTtcbiAgICAgICAgICAgIGxldCBtYXJrcyA9IHRoaXMuc3RvcmVkTWFya3M7XG4gICAgICAgICAgICBpZiAoIW1hcmtzKSB7XG4gICAgICAgICAgICAgICAgbGV0ICRmcm9tID0gdGhpcy5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICAgICAgICAgICAgICBtYXJrcyA9IHRvID09IGZyb20gPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3ModGhpcy5kb2MucmVzb2x2ZSh0bykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoKGZyb20sIHRvLCBzY2hlbWEudGV4dCh0ZXh0LCBtYXJrcykpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5lbXB0eSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0aGlzLnNlbGVjdGlvbi4kdG8pKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIFN0b3JlIGEgbWV0YWRhdGEgcHJvcGVydHkgaW4gdGhpcyB0cmFuc2FjdGlvbiwga2V5ZWQgZWl0aGVyIGJ5XG4gICAgbmFtZSBvciBieSBwbHVnaW4uXG4gICAgKi9cbiAgICBzZXRNZXRhKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5tZXRhW3R5cGVvZiBrZXkgPT0gXCJzdHJpbmdcIiA/IGtleSA6IGtleS5rZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXRyaWV2ZSBhIG1ldGFkYXRhIHByb3BlcnR5IGZvciBhIGdpdmVuIG5hbWUgb3IgcGx1Z2luLlxuICAgICovXG4gICAgZ2V0TWV0YShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YVt0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIgPyBrZXkgOiBrZXkua2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNhY3Rpb24gZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YSxcbiAgICBhbmQgY2FuIHRodXMgc2FmZWx5IGJlIGV4dGVuZGVkLlxuICAgICovXG4gICAgZ2V0IGlzR2VuZXJpYygpIHtcbiAgICAgICAgZm9yIChsZXQgXyBpbiB0aGlzLm1ldGEpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICBJbmRpY2F0ZSB0aGF0IHRoZSBlZGl0b3Igc2hvdWxkIHNjcm9sbCB0aGUgc2VsZWN0aW9uIGludG8gdmlld1xuICAgIHdoZW4gdXBkYXRlZCB0byB0aGUgc3RhdGUgcHJvZHVjZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAqL1xuICAgIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZWQgfD0gVVBEQVRFRF9TQ1JPTEw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnVlIHdoZW4gdGhpcyB0cmFuc2FjdGlvbiBoYXMgaGFkIGBzY3JvbGxJbnRvVmlld2AgY2FsbGVkIG9uIGl0LlxuICAgICovXG4gICAgZ2V0IHNjcm9sbGVkSW50b1ZpZXcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy51cGRhdGVkICYgVVBEQVRFRF9TQ1JPTEwpID4gMDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmQoZiwgc2VsZikge1xuICAgIHJldHVybiAhc2VsZiB8fCAhZiA/IGYgOiBmLmJpbmQoc2VsZik7XG59XG5jbGFzcyBGaWVsZERlc2Mge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2MsIHNlbGYpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5pbml0ID0gYmluZChkZXNjLmluaXQsIHNlbGYpO1xuICAgICAgICB0aGlzLmFwcGx5ID0gYmluZChkZXNjLmFwcGx5LCBzZWxmKTtcbiAgICB9XG59XG5jb25zdCBiYXNlRmllbGRzID0gW1xuICAgIG5ldyBGaWVsZERlc2MoXCJkb2NcIiwge1xuICAgICAgICBpbml0KGNvbmZpZykgeyByZXR1cm4gY29uZmlnLmRvYyB8fCBjb25maWcuc2NoZW1hLnRvcE5vZGVUeXBlLmNyZWF0ZUFuZEZpbGwoKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLmRvYzsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzZWxlY3Rpb25cIiwge1xuICAgICAgICBpbml0KGNvbmZpZywgaW5zdGFuY2UpIHsgcmV0dXJuIGNvbmZpZy5zZWxlY3Rpb24gfHwgU2VsZWN0aW9uLmF0U3RhcnQoaW5zdGFuY2UuZG9jKTsgfSxcbiAgICAgICAgYXBwbHkodHIpIHsgcmV0dXJuIHRyLnNlbGVjdGlvbjsgfVxuICAgIH0pLFxuICAgIG5ldyBGaWVsZERlc2MoXCJzdG9yZWRNYXJrc1wiLCB7XG4gICAgICAgIGluaXQoY29uZmlnKSB7IHJldHVybiBjb25maWcuc3RvcmVkTWFya3MgfHwgbnVsbDsgfSxcbiAgICAgICAgYXBwbHkodHIsIF9tYXJrcywgX29sZCwgc3RhdGUpIHsgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi4kY3Vyc29yID8gdHIuc3RvcmVkTWFya3MgOiBudWxsOyB9XG4gICAgfSksXG4gICAgbmV3IEZpZWxkRGVzYyhcInNjcm9sbFRvU2VsZWN0aW9uXCIsIHtcbiAgICAgICAgaW5pdCgpIHsgcmV0dXJuIDA7IH0sXG4gICAgICAgIGFwcGx5KHRyLCBwcmV2KSB7IHJldHVybiB0ci5zY3JvbGxlZEludG9WaWV3ID8gcHJldiArIDEgOiBwcmV2OyB9XG4gICAgfSlcbl07XG4vLyBPYmplY3Qgd3JhcHBpbmcgdGhlIHBhcnQgb2YgYSBzdGF0ZSBvYmplY3QgdGhhdCBzdGF5cyB0aGUgc2FtZVxuLy8gYWNyb3NzIHRyYW5zYWN0aW9ucy4gU3RvcmVkIGluIHRoZSBzdGF0ZSdzIGBjb25maWdgIHByb3BlcnR5LlxuY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hLCBwbHVnaW5zKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5zQnlLZXkgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGJhc2VGaWVsZHMuc2xpY2UoKTtcbiAgICAgICAgaWYgKHBsdWdpbnMpXG4gICAgICAgICAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbHVnaW5zQnlLZXlbcGx1Z2luLmtleV0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQWRkaW5nIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBrZXllZCBwbHVnaW4gKFwiICsgcGx1Z2luLmtleSArIFwiKVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc0J5S2V5W3BsdWdpbi5rZXldID0gcGx1Z2luO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5zdGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZHMucHVzaChuZXcgRmllbGREZXNjKHBsdWdpbi5rZXksIHBsdWdpbi5zcGVjLnN0YXRlLCBwbHVnaW4pKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuVGhlIHN0YXRlIG9mIGEgUHJvc2VNaXJyb3IgZWRpdG9yIGlzIHJlcHJlc2VudGVkIGJ5IGFuIG9iamVjdCBvZlxudGhpcyB0eXBlLiBBIHN0YXRlIGlzIGEgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZeKAlGl0IGlzbid0XG51cGRhdGVkLCBidXQgcmF0aGVyIGEgbmV3IHN0YXRlIHZhbHVlIGlzIGNvbXB1dGVkIGZyb20gYW4gb2xkIG9uZVxudXNpbmcgdGhlIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIG1ldGhvZC5cblxuQSBzdGF0ZSBob2xkcyBhIG51bWJlciBvZiBidWlsdC1pbiBmaWVsZHMsIGFuZCBwbHVnaW5zIGNhblxuW2RlZmluZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuc3RhdGUpIGFkZGl0aW9uYWwgZmllbGRzLlxuKi9cbmNsYXNzIEVkaXRvclN0YXRlIHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc2NoZW1hIG9mIHRoZSBzdGF0ZSdzIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNjaGVtYTtcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHBsdWdpbnMgdGhhdCBhcmUgYWN0aXZlIGluIHRoaXMgc3RhdGUuXG4gICAgKi9cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnBsdWdpbnM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFwcGx5IHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB0byBwcm9kdWNlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHkodHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlUcmFuc2FjdGlvbih0cikuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZmlsdGVyVHJhbnNhY3Rpb24odHIsIGlnbm9yZSA9IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmIChpICE9IGlnbm9yZSkge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5maWx0ZXJUcmFuc2FjdGlvbiAmJiAhcGx1Z2luLnNwZWMuZmlsdGVyVHJhbnNhY3Rpb24uY2FsbChwbHVnaW4sIHRyLCB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgVmVyYm9zZSB2YXJpYW50IG9mIFtgYXBwbHlgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jc3RhdGUuRWRpdG9yU3RhdGUuYXBwbHkpIHRoYXRcbiAgICByZXR1cm5zIHRoZSBwcmVjaXNlIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgYXBwbGllZCAod2hpY2ggbWlnaHRcbiAgICBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBbdHJhbnNhY3Rpb25cbiAgICBob29rc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLlBsdWdpblNwZWMuZmlsdGVyVHJhbnNhY3Rpb24pIG9mXG4gICAgcGx1Z2lucykgYWxvbmcgd2l0aCB0aGUgbmV3IHN0YXRlLlxuICAgICovXG4gICAgYXBwbHlUcmFuc2FjdGlvbihyb290VHIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclRyYW5zYWN0aW9uKHJvb3RUcikpXG4gICAgICAgICAgICByZXR1cm4geyBzdGF0ZTogdGhpcywgdHJhbnNhY3Rpb25zOiBbXSB9O1xuICAgICAgICBsZXQgdHJzID0gW3Jvb3RUcl0sIG5ld1N0YXRlID0gdGhpcy5hcHBseUlubmVyKHJvb3RUciksIHNlZW4gPSBudWxsO1xuICAgICAgICAvLyBUaGlzIGxvb3AgcmVwZWF0ZWRseSBnaXZlcyBwbHVnaW5zIGEgY2hhbmNlIHRvIHJlc3BvbmQgdG9cbiAgICAgICAgLy8gdHJhbnNhY3Rpb25zIGFzIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGFkZGVkLCBtYWtpbmcgc3VyZSB0byBvbmx5XG4gICAgICAgIC8vIHBhc3MgdGhlIHRyYW5zYWN0aW9ucyB0aGUgcGx1Z2luIGRpZCBub3Qgc2VlIGJlZm9yZS5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IGhhdmVOZXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSB0aGlzLmNvbmZpZy5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy5hcHBlbmRUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHNlZW4gPyBzZWVuW2ldLm4gOiAwLCBvbGRTdGF0ZSA9IHNlZW4gPyBzZWVuW2ldLnN0YXRlIDogdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRyID0gbiA8IHRycy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uLmNhbGwocGx1Z2luLCBuID8gdHJzLnNsaWNlKG4pIDogdHJzLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHIgJiYgbmV3U3RhdGUuZmlsdGVyVHJhbnNhY3Rpb24odHIsIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiYXBwZW5kZWRUcmFuc2FjdGlvblwiLCByb290VHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb25maWcucGx1Z2lucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGogPCBpID8geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfSA6IHsgc3RhdGU6IHRoaXMsIG46IDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnMucHVzaCh0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSA9IG5ld1N0YXRlLmFwcGx5SW5uZXIodHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZU5ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2ldID0geyBzdGF0ZTogbmV3U3RhdGUsIG46IHRycy5sZW5ndGggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhdmVOZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IG5ld1N0YXRlLCB0cmFuc2FjdGlvbnM6IHRycyB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYXBwbHlJbm5lcih0cikge1xuICAgICAgICBpZiAoIXRyLmJlZm9yZS5lcSh0aGlzLmRvYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkFwcGx5aW5nIGEgbWlzbWF0Y2hlZCB0cmFuc2FjdGlvblwiKTtcbiAgICAgICAgbGV0IG5ld0luc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKHRoaXMuY29uZmlnKSwgZmllbGRzID0gdGhpcy5jb25maWcuZmllbGRzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICAgICAgbmV3SW5zdGFuY2VbZmllbGQubmFtZV0gPSBmaWVsZC5hcHBseSh0ciwgdGhpc1tmaWVsZC5uYW1lXSwgdGhpcywgbmV3SW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgU3RhcnQgYSBbdHJhbnNhY3Rpb25dKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5UcmFuc2FjdGlvbikgZnJvbSB0aGlzIHN0YXRlLlxuICAgICovXG4gICAgZ2V0IHRyKCkgeyByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHRoaXMpOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IHN0YXRlLlxuICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShjb25maWcpIHtcbiAgICAgICAgbGV0ICRjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZG9jID8gY29uZmlnLmRvYy50eXBlLnNjaGVtYSA6IGNvbmZpZy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gbmV3IEVkaXRvclN0YXRlKCRjb25maWcpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRjb25maWcuZmllbGRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaW5zdGFuY2VbJGNvbmZpZy5maWVsZHNbaV0ubmFtZV0gPSAkY29uZmlnLmZpZWxkc1tpXS5pbml0KGNvbmZpZywgaW5zdGFuY2UpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzdGF0ZSBiYXNlZCBvbiB0aGlzIG9uZSwgYnV0IHdpdGggYW4gYWRqdXN0ZWQgc2V0XG4gICAgb2YgYWN0aXZlIHBsdWdpbnMuIFN0YXRlIGZpZWxkcyB0aGF0IGV4aXN0IGluIGJvdGggc2V0cyBvZlxuICAgIHBsdWdpbnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiBUaG9zZSB0aGF0IG5vIGxvbmdlciBleGlzdCBhcmVcbiAgICBkcm9wcGVkLCBhbmQgdGhvc2UgdGhhdCBhcmUgbmV3IGFyZSBpbml0aWFsaXplZCB1c2luZyB0aGVpclxuICAgIFtgaW5pdGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5TdGF0ZUZpZWxkLmluaXQpIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgbmV3XG4gICAgY29uZmlndXJhdGlvbiBvYmplY3QuLlxuICAgICovXG4gICAgcmVjb25maWd1cmUoY29uZmlnKSB7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24odGhpcy5zY2hlbWEsIGNvbmZpZy5wbHVnaW5zKTtcbiAgICAgICAgbGV0IGZpZWxkcyA9ICRjb25maWcuZmllbGRzLCBpbnN0YW5jZSA9IG5ldyBFZGl0b3JTdGF0ZSgkY29uZmlnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gZmllbGRzW2ldLm5hbWU7XG4gICAgICAgICAgICBpbnN0YW5jZVtuYW1lXSA9IHRoaXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyB0aGlzW25hbWVdIDogZmllbGRzW2ldLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICBTZXJpYWxpemUgdGhpcyBzdGF0ZSB0byBKU09OLiBJZiB5b3Ugd2FudCB0byBzZXJpYWxpemUgdGhlIHN0YXRlXG4gICAgb2YgcGx1Z2lucywgcGFzcyBhbiBvYmplY3QgbWFwcGluZyBwcm9wZXJ0eSBuYW1lcyB0byB1c2UgaW4gdGhlXG4gICAgcmVzdWx0aW5nIEpTT04gb2JqZWN0IHRvIHBsdWdpbiBvYmplY3RzLiBUaGUgYXJndW1lbnQgbWF5IGFsc28gYmVcbiAgICBhIHN0cmluZyBvciBudW1iZXIsIGluIHdoaWNoIGNhc2UgaXQgaXMgaWdub3JlZCwgdG8gc3VwcG9ydCB0aGVcbiAgICB3YXkgYEpTT04uc3RyaW5naWZ5YCBjYWxscyBgdG9TdHJpbmdgIG1ldGhvZHMuXG4gICAgKi9cbiAgICB0b0pTT04ocGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRvYzogdGhpcy5kb2MudG9KU09OKCksIHNlbGVjdGlvbjogdGhpcy5zZWxlY3Rpb24udG9KU09OKCkgfTtcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVkTWFya3MpXG4gICAgICAgICAgICByZXN1bHQuc3RvcmVkTWFya3MgPSB0aGlzLnN0b3JlZE1hcmtzLm1hcChtID0+IG0udG9KU09OKCkpO1xuICAgICAgICBpZiAocGx1Z2luRmllbGRzICYmIHR5cGVvZiBwbHVnaW5GaWVsZHMgPT0gJ29iamVjdCcpXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09IFwiZG9jXCIgfHwgcHJvcCA9PSBcInNlbGVjdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBKU09OIGZpZWxkcyBgZG9jYCBhbmQgYHNlbGVjdGlvbmAgYXJlIHJlc2VydmVkXCIpO1xuICAgICAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5GaWVsZHNbcHJvcF0sIHN0YXRlID0gcGx1Z2luLnNwZWMuc3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLnRvSlNPTilcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gc3RhdGUudG9KU09OLmNhbGwocGx1Z2luLCB0aGlzW3BsdWdpbi5rZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RhdGUuIGBjb25maWdgIHNob3VsZFxuICAgIGhhdmUgYXQgbGVhc3QgYSBgc2NoZW1hYCBmaWVsZCwgYW5kIHNob3VsZCBjb250YWluIGFycmF5IG9mXG4gICAgcGx1Z2lucyB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSB3aXRoLiBgcGx1Z2luRmllbGRzYCBjYW4gYmUgdXNlZFxuICAgIHRvIGRlc2VyaWFsaXplIHRoZSBzdGF0ZSBvZiBwbHVnaW5zLCBieSBhc3NvY2lhdGluZyBwbHVnaW5cbiAgICBpbnN0YW5jZXMgd2l0aCB0aGUgcHJvcGVydHkgbmFtZXMgdGhleSB1c2UgaW4gdGhlIEpTT04gb2JqZWN0LlxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKGNvbmZpZywganNvbiwgcGx1Z2luRmllbGRzKSB7XG4gICAgICAgIGlmICghanNvbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRWRpdG9yU3RhdGUuZnJvbUpTT05cIik7XG4gICAgICAgIGlmICghY29uZmlnLnNjaGVtYSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiUmVxdWlyZWQgY29uZmlnIGZpZWxkICdzY2hlbWEnIG1pc3NpbmdcIik7XG4gICAgICAgIGxldCAkY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oY29uZmlnLnNjaGVtYSwgY29uZmlnLnBsdWdpbnMpO1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgRWRpdG9yU3RhdGUoJGNvbmZpZyk7XG4gICAgICAgICRjb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm5hbWUgPT0gXCJkb2NcIikge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlLmRvYyA9IE5vZGUuZnJvbUpTT04oY29uZmlnLnNjaGVtYSwganNvbi5kb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2Uuc2VsZWN0aW9uID0gU2VsZWN0aW9uLmZyb21KU09OKGluc3RhbmNlLmRvYywganNvbi5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQubmFtZSA9PSBcInN0b3JlZE1hcmtzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvbi5zdG9yZWRNYXJrcylcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Uuc3RvcmVkTWFya3MgPSBqc29uLnN0b3JlZE1hcmtzLm1hcChjb25maWcuc2NoZW1hLm1hcmtGcm9tSlNPTik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHBsdWdpbkZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbkZpZWxkc1twcm9wXSwgc3RhdGUgPSBwbHVnaW4uc3BlYy5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW4ua2V5ID09IGZpZWxkLm5hbWUgJiYgc3RhdGUgJiYgc3RhdGUuZnJvbUpTT04gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoanNvbiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IHN0YXRlLmZyb21KU09OLmNhbGwocGx1Z2luLCBjb25maWcsIGpzb25bcHJvcF0sIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtmaWVsZC5uYW1lXSA9IGZpZWxkLmluaXQoY29uZmlnLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kUHJvcHMob2JqLCBzZWxmLCB0YXJnZXQpIHtcbiAgICBmb3IgKGxldCBwcm9wIGluIG9iaikge1xuICAgICAgICBsZXQgdmFsID0gb2JqW3Byb3BdO1xuICAgICAgICBpZiAodmFsIGluc3RhbmNlb2YgRnVuY3Rpb24pXG4gICAgICAgICAgICB2YWwgPSB2YWwuYmluZChzZWxmKTtcbiAgICAgICAgZWxzZSBpZiAocHJvcCA9PSBcImhhbmRsZURPTUV2ZW50c1wiKVxuICAgICAgICAgICAgdmFsID0gYmluZFByb3BzKHZhbCwgc2VsZiwge30pO1xuICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcblBsdWdpbnMgYnVuZGxlIGZ1bmN0aW9uYWxpdHkgdGhhdCBjYW4gYmUgYWRkZWQgdG8gYW4gZWRpdG9yLlxuVGhleSBhcmUgcGFydCBvZiB0aGUgW2VkaXRvciBzdGF0ZV0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3N0YXRlLkVkaXRvclN0YXRlKSBhbmRcbm1heSBpbmZsdWVuY2UgdGhhdCBzdGF0ZSBhbmQgdGhlIHZpZXcgdGhhdCBjb250YWlucyBpdC5cbiovXG5jbGFzcyBQbHVnaW4ge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHBsdWdpbi5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwbHVnaW4ncyBbc3BlYyBvYmplY3RdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjKS5cbiAgICAqL1xuICAgIHNwZWMpIHtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKSBleHBvcnRlZCBieSB0aGlzIHBsdWdpbi5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcm9wcyA9IHt9O1xuICAgICAgICBpZiAoc3BlYy5wcm9wcylcbiAgICAgICAgICAgIGJpbmRQcm9wcyhzcGVjLnByb3BzLCB0aGlzLCB0aGlzLnByb3BzKTtcbiAgICAgICAgdGhpcy5rZXkgPSBzcGVjLmtleSA/IHNwZWMua2V5LmtleSA6IGNyZWF0ZUtleShcInBsdWdpblwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRXh0cmFjdCB0aGUgcGx1Z2luJ3Mgc3RhdGUgZmllbGQgZnJvbSBhbiBlZGl0b3Igc3RhdGUuXG4gICAgKi9cbiAgICBnZXRTdGF0ZShzdGF0ZSkgeyByZXR1cm4gc3RhdGVbdGhpcy5rZXldOyB9XG59XG5jb25zdCBrZXlzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZ1bmN0aW9uIGNyZWF0ZUtleShuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4ga2V5cylcbiAgICAgICAgcmV0dXJuIG5hbWUgKyBcIiRcIiArICsra2V5c1tuYW1lXTtcbiAgICBrZXlzW25hbWVdID0gMDtcbiAgICByZXR1cm4gbmFtZSArIFwiJFwiO1xufVxuLyoqXG5BIGtleSBpcyB1c2VkIHRvIFt0YWddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNzdGF0ZS5QbHVnaW5TcGVjLmtleSkgcGx1Z2lucyBpbiBhIHdheVxudGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBmaW5kIHRoZW0sIGdpdmVuIGFuIGVkaXRvciBzdGF0ZS5cbkFzc2lnbmluZyBhIGtleSBkb2VzIG1lYW4gb25seSBvbmUgcGx1Z2luIG9mIHRoYXQgdHlwZSBjYW4gYmVcbmFjdGl2ZSBpbiBhIHN0YXRlLlxuKi9cbmNsYXNzIFBsdWdpbktleSB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgcGx1Z2luIGtleS5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUgPSBcImtleVwiKSB7IHRoaXMua2V5ID0gY3JlYXRlS2V5KG5hbWUpOyB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBhY3RpdmUgcGx1Z2luIHdpdGggdGhpcyBrZXksIGlmIGFueSwgZnJvbSBhbiBlZGl0b3JcbiAgICBzdGF0ZS5cbiAgICAqL1xuICAgIGdldChzdGF0ZSkgeyByZXR1cm4gc3RhdGUuY29uZmlnLnBsdWdpbnNCeUtleVt0aGlzLmtleV07IH1cbiAgICAvKipcbiAgICBHZXQgdGhlIHBsdWdpbidzIHN0YXRlIGZyb20gYW4gZWRpdG9yIHN0YXRlLlxuICAgICovXG4gICAgZ2V0U3RhdGUoc3RhdGUpIHsgcmV0dXJuIHN0YXRlW3RoaXMua2V5XTsgfVxufVxuXG5leHBvcnQgeyBBbGxTZWxlY3Rpb24sIEVkaXRvclN0YXRlLCBOb2RlU2VsZWN0aW9uLCBQbHVnaW4sIFBsdWdpbktleSwgU2VsZWN0aW9uLCBTZWxlY3Rpb25SYW5nZSwgVGV4dFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfTtcbiIsImltcG9ydCB7IFJlcGxhY2VFcnJvciwgU2xpY2UsIEZyYWdtZW50LCBNYXJrVHlwZSwgTWFyayB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcblxuLy8gUmVjb3ZlcnkgdmFsdWVzIGVuY29kZSBhIHJhbmdlIGluZGV4IGFuZCBhbiBvZmZzZXQuIFRoZXkgYXJlXG4vLyByZXByZXNlbnRlZCBhcyBudW1iZXJzLCBiZWNhdXNlIHRvbnMgb2YgdGhlbSB3aWxsIGJlIGNyZWF0ZWQgd2hlblxuLy8gbWFwcGluZywgZm9yIGV4YW1wbGUsIGEgbGFyZ2UgbnVtYmVyIG9mIGRlY29yYXRpb25zLiBUaGUgbnVtYmVyJ3Ncbi8vIGxvd2VyIDE2IGJpdHMgcHJvdmlkZSB0aGUgaW5kZXgsIHRoZSByZW1haW5pbmcgYml0cyB0aGUgb2Zmc2V0LlxuLy9cbi8vIE5vdGU6IFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGJpdCBzaGlmdCBvcGVyYXRvcnMgdG8gZW4tIGFuZFxuLy8gZGVjb2RlIHRoZXNlLCBzaW5jZSB0aG9zZSBjbGlwIHRvIDMyIGJpdHMsIHdoaWNoIHdlIG1pZ2h0IGluIHJhcmVcbi8vIGNhc2VzIHdhbnQgdG8gb3ZlcmZsb3cuIEEgNjQtYml0IGZsb2F0IGNhbiByZXByZXNlbnQgNDgtYml0XG4vLyBpbnRlZ2VycyBwcmVjaXNlbHkuXG5jb25zdCBsb3dlcjE2ID0gMHhmZmZmO1xuY29uc3QgZmFjdG9yMTYgPSBNYXRoLnBvdygyLCAxNik7XG5mdW5jdGlvbiBtYWtlUmVjb3ZlcihpbmRleCwgb2Zmc2V0KSB7IHJldHVybiBpbmRleCArIG9mZnNldCAqIGZhY3RvcjE2OyB9XG5mdW5jdGlvbiByZWNvdmVySW5kZXgodmFsdWUpIHsgcmV0dXJuIHZhbHVlICYgbG93ZXIxNjsgfVxuZnVuY3Rpb24gcmVjb3Zlck9mZnNldCh2YWx1ZSkgeyByZXR1cm4gKHZhbHVlIC0gKHZhbHVlICYgbG93ZXIxNikpIC8gZmFjdG9yMTY7IH1cbmNvbnN0IERFTF9CRUZPUkUgPSAxLCBERUxfQUZURVIgPSAyLCBERUxfQUNST1NTID0gNCwgREVMX1NJREUgPSA4O1xuLyoqXG5BbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgbWFwcGVkIHBvc2l0aW9uIHdpdGggZXh0cmFcbmluZm9ybWF0aW9uLlxuKi9cbmNsYXNzIE1hcFJlc3VsdCB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgbWFwcGVkIHZlcnNpb24gb2YgdGhlIHBvc2l0aW9uLlxuICAgICovXG4gICAgcG9zLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGRlbEluZm8sIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmVjb3Zlcikge1xuICAgICAgICB0aGlzLnBvcyA9IHBvcztcbiAgICAgICAgdGhpcy5kZWxJbmZvID0gZGVsSW5mbztcbiAgICAgICAgdGhpcy5yZWNvdmVyID0gcmVjb3ZlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgVGVsbHMgeW91IHdoZXRoZXIgdGhlIHBvc2l0aW9uIHdhcyBkZWxldGVkLCB0aGF0IGlzLCB3aGV0aGVyIHRoZVxuICAgIHN0ZXAgcmVtb3ZlZCB0aGUgdG9rZW4gb24gdGhlIHNpZGUgcXVlcmllZCAodmlhIHRoZSBgYXNzb2NgKVxuICAgIGFyZ3VtZW50IGZyb20gdGhlIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGRlbGV0ZWQoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgREVMX1NJREUpID4gMDsgfVxuICAgIC8qKlxuICAgIFRlbGxzIHlvdSB3aGV0aGVyIHRoZSB0b2tlbiBiZWZvcmUgdGhlIG1hcHBlZCBwb3NpdGlvbiB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIGdldCBkZWxldGVkQmVmb3JlKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIChERUxfQkVGT1JFIHwgREVMX0FDUk9TUykpID4gMDsgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGUgdG9rZW4gYWZ0ZXIgdGhlIG1hcHBlZCBwb3NpdGlvbiB3YXMgZGVsZXRlZC5cbiAgICAqL1xuICAgIGdldCBkZWxldGVkQWZ0ZXIoKSB7IHJldHVybiAodGhpcy5kZWxJbmZvICYgKERFTF9BRlRFUiB8IERFTF9BQ1JPU1MpKSA+IDA7IH1cbiAgICAvKipcbiAgICBUZWxscyB3aGV0aGVyIGFueSBvZiB0aGUgc3RlcHMgbWFwcGVkIHRocm91Z2ggZGVsZXRlcyBhY3Jvc3MgdGhlXG4gICAgcG9zaXRpb24gKGluY2x1ZGluZyBib3RoIHRoZSB0b2tlbiBiZWZvcmUgYW5kIGFmdGVyIHRoZVxuICAgIHBvc2l0aW9uKS5cbiAgICAqL1xuICAgIGdldCBkZWxldGVkQWNyb3NzKCkgeyByZXR1cm4gKHRoaXMuZGVsSW5mbyAmIERFTF9BQ1JPU1MpID4gMDsgfVxufVxuLyoqXG5BIG1hcCBkZXNjcmliaW5nIHRoZSBkZWxldGlvbnMgYW5kIGluc2VydGlvbnMgbWFkZSBieSBhIHN0ZXAsIHdoaWNoXG5jYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHBvc2l0aW9ucyBpbiB0aGVcbnByZS1zdGVwIHZlcnNpb24gb2YgYSBkb2N1bWVudCBhbmQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlXG5wb3N0LXN0ZXAgdmVyc2lvbi5cbiovXG5jbGFzcyBTdGVwTWFwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBwb3NpdGlvbiBtYXAuIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudCBhcmVcbiAgICByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBudW1iZXJzLCBpbiB3aGljaCBlYWNoIGdyb3VwIG9mIHRocmVlXG4gICAgcmVwcmVzZW50cyBhIG1vZGlmaWVkIGNodW5rIGFzIGBbc3RhcnQsIG9sZFNpemUsIG5ld1NpemVdYC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgcmFuZ2VzLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGludmVydGVkID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5yYW5nZXMgPSByYW5nZXM7XG4gICAgICAgIHRoaXMuaW52ZXJ0ZWQgPSBpbnZlcnRlZDtcbiAgICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoICYmIFN0ZXBNYXAuZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gU3RlcE1hcC5lbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICByZWNvdmVyKHZhbHVlKSB7XG4gICAgICAgIGxldCBkaWZmID0gMCwgaW5kZXggPSByZWNvdmVySW5kZXgodmFsdWUpO1xuICAgICAgICBpZiAoIXRoaXMuaW52ZXJ0ZWQpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspXG4gICAgICAgICAgICAgICAgZGlmZiArPSB0aGlzLnJhbmdlc1tpICogMyArIDJdIC0gdGhpcy5yYW5nZXNbaSAqIDMgKyAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VzW2luZGV4ICogM10gKyBkaWZmICsgcmVjb3Zlck9mZnNldCh2YWx1ZSk7XG4gICAgfVxuICAgIG1hcFJlc3VsdChwb3MsIGFzc29jID0gMSkgeyByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIGZhbHNlKTsgfVxuICAgIG1hcChwb3MsIGFzc29jID0gMSkgeyByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIHRydWUpOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBfbWFwKHBvcywgYXNzb2MsIHNpbXBsZSkge1xuICAgICAgICBsZXQgZGlmZiA9IDAsIG9sZEluZGV4ID0gdGhpcy5pbnZlcnRlZCA/IDIgOiAxLCBuZXdJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAxIDogMjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5yYW5nZXNbaV0gLSAodGhpcy5pbnZlcnRlZCA/IGRpZmYgOiAwKTtcbiAgICAgICAgICAgIGlmIChzdGFydCA+IHBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGxldCBvbGRTaXplID0gdGhpcy5yYW5nZXNbaSArIG9sZEluZGV4XSwgbmV3U2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBuZXdJbmRleF0sIGVuZCA9IHN0YXJ0ICsgb2xkU2l6ZTtcbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNpZGUgPSAhb2xkU2l6ZSA/IGFzc29jIDogcG9zID09IHN0YXJ0ID8gLTEgOiBwb3MgPT0gZW5kID8gMSA6IGFzc29jO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBzdGFydCArIGRpZmYgKyAoc2lkZSA8IDAgPyAwIDogbmV3U2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNpbXBsZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICBsZXQgcmVjb3ZlciA9IHBvcyA9PSAoYXNzb2MgPCAwID8gc3RhcnQgOiBlbmQpID8gbnVsbCA6IG1ha2VSZWNvdmVyKGkgLyAzLCBwb3MgLSBzdGFydCk7XG4gICAgICAgICAgICAgICAgbGV0IGRlbCA9IHBvcyA9PSBzdGFydCA/IERFTF9BRlRFUiA6IHBvcyA9PSBlbmQgPyBERUxfQkVGT1JFIDogREVMX0FDUk9TUztcbiAgICAgICAgICAgICAgICBpZiAoYXNzb2MgPCAwID8gcG9zICE9IHN0YXJ0IDogcG9zICE9IGVuZClcbiAgICAgICAgICAgICAgICAgICAgZGVsIHw9IERFTF9TSURFO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWFwUmVzdWx0KHJlc3VsdCwgZGVsLCByZWNvdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpZmYgKz0gbmV3U2l6ZSAtIG9sZFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNpbXBsZSA/IHBvcyArIGRpZmYgOiBuZXcgTWFwUmVzdWx0KHBvcyArIGRpZmYsIDAsIG51bGwpO1xuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHRvdWNoZXMocG9zLCByZWNvdmVyKSB7XG4gICAgICAgIGxldCBkaWZmID0gMCwgaW5kZXggPSByZWNvdmVySW5kZXgocmVjb3Zlcik7XG4gICAgICAgIGxldCBvbGRJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAyIDogMSwgbmV3SW5kZXggPSB0aGlzLmludmVydGVkID8gMSA6IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMucmFuZ2VzW2ldIC0gKHRoaXMuaW52ZXJ0ZWQgPyBkaWZmIDogMCk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPiBwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgb2xkU2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBvbGRJbmRleF0sIGVuZCA9IHN0YXJ0ICsgb2xkU2l6ZTtcbiAgICAgICAgICAgIGlmIChwb3MgPD0gZW5kICYmIGkgPT0gaW5kZXggKiAzKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZGlmZiArPSB0aGlzLnJhbmdlc1tpICsgbmV3SW5kZXhdIC0gb2xkU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBvbiBlYWNoIG9mIHRoZSBjaGFuZ2VkIHJhbmdlcyBpbmNsdWRlZCBpblxuICAgIHRoaXMgbWFwLlxuICAgICovXG4gICAgZm9yRWFjaChmKSB7XG4gICAgICAgIGxldCBvbGRJbmRleCA9IHRoaXMuaW52ZXJ0ZWQgPyAyIDogMSwgbmV3SW5kZXggPSB0aGlzLmludmVydGVkID8gMSA6IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBkaWZmID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnJhbmdlc1tpXSwgb2xkU3RhcnQgPSBzdGFydCAtICh0aGlzLmludmVydGVkID8gZGlmZiA6IDApLCBuZXdTdGFydCA9IHN0YXJ0ICsgKHRoaXMuaW52ZXJ0ZWQgPyAwIDogZGlmZik7XG4gICAgICAgICAgICBsZXQgb2xkU2l6ZSA9IHRoaXMucmFuZ2VzW2kgKyBvbGRJbmRleF0sIG5ld1NpemUgPSB0aGlzLnJhbmdlc1tpICsgbmV3SW5kZXhdO1xuICAgICAgICAgICAgZihvbGRTdGFydCwgb2xkU3RhcnQgKyBvbGRTaXplLCBuZXdTdGFydCwgbmV3U3RhcnQgKyBuZXdTaXplKTtcbiAgICAgICAgICAgIGRpZmYgKz0gbmV3U2l6ZSAtIG9sZFNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGFuIGludmVydGVkIHZlcnNpb24gb2YgdGhpcyBtYXAuIFRoZSByZXN1bHQgY2FuIGJlIHVzZWQgdG9cbiAgICBtYXAgcG9zaXRpb25zIGluIHRoZSBwb3N0LXN0ZXAgZG9jdW1lbnQgdG8gdGhlIHByZS1zdGVwIGRvY3VtZW50LlxuICAgICovXG4gICAgaW52ZXJ0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0ZXBNYXAodGhpcy5yYW5nZXMsICF0aGlzLmludmVydGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmludmVydGVkID8gXCItXCIgOiBcIlwiKSArIEpTT04uc3RyaW5naWZ5KHRoaXMucmFuZ2VzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFwIHRoYXQgbW92ZXMgYWxsIHBvc2l0aW9ucyBieSBvZmZzZXQgYG5gICh3aGljaCBtYXkgYmVcbiAgICBuZWdhdGl2ZSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGFwcGx5aW5nIHN0ZXBzIG1lYW50IGZvciBhXG4gICAgc3ViLWRvY3VtZW50IHRvIGEgbGFyZ2VyIGRvY3VtZW50LCBvciB2aWNlLXZlcnNhLlxuICAgICovXG4gICAgc3RhdGljIG9mZnNldChuKSB7XG4gICAgICAgIHJldHVybiBuID09IDAgPyBTdGVwTWFwLmVtcHR5IDogbmV3IFN0ZXBNYXAobiA8IDAgPyBbMCwgLW4sIDBdIDogWzAsIDAsIG5dKTtcbiAgICB9XG59XG4vKipcbkEgU3RlcE1hcCB0aGF0IGNvbnRhaW5zIG5vIGNoYW5nZWQgcmFuZ2VzLlxuKi9cblN0ZXBNYXAuZW1wdHkgPSBuZXcgU3RlcE1hcChbXSk7XG4vKipcbkEgbWFwcGluZyByZXByZXNlbnRzIGEgcGlwZWxpbmUgb2YgemVybyBvciBtb3JlIFtzdGVwXG5tYXBzXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXBNYXApLiBJdCBoYXMgc3BlY2lhbCBwcm92aXNpb25zIGZvciBsb3NzbGVzc2x5XG5oYW5kbGluZyBtYXBwaW5nIHBvc2l0aW9ucyB0aHJvdWdoIGEgc2VyaWVzIG9mIHN0ZXBzIGluIHdoaWNoIHNvbWVcbnN0ZXBzIGFyZSBpbnZlcnRlZCB2ZXJzaW9ucyBvZiBlYXJsaWVyIHN0ZXBzLiAoVGhpcyBjb21lcyB1cCB3aGVuXG7igJhbcmViYXNpbmddKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvZ3VpZGUvI3RyYW5zZm9ybS5yZWJhc2luZynigJkgc3RlcHMgZm9yXG5jb2xsYWJvcmF0aW9uIG9yIGhpc3RvcnkgbWFuYWdlbWVudC4pXG4qL1xuY2xhc3MgTWFwcGluZyB7XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbmV3IG1hcHBpbmcgd2l0aCB0aGUgZ2l2ZW4gcG9zaXRpb24gbWFwcy5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1hcHMsIFxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWlycm9yLCBcbiAgICAvKipcbiAgICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGBtYXBzYCBhcnJheSwgdXNlZCB3aGVuIGBtYXBgIG9yXG4gICAgYG1hcFJlc3VsdGAgaXMgY2FsbGVkLlxuICAgICovXG4gICAgZnJvbSA9IDAsIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgcG9zaXRpb24gaW4gdGhlIGBtYXBzYCBhcnJheS5cbiAgICAqL1xuICAgIHRvID0gbWFwcyA/IG1hcHMubGVuZ3RoIDogMCkge1xuICAgICAgICB0aGlzLm1pcnJvciA9IG1pcnJvcjtcbiAgICAgICAgdGhpcy5mcm9tID0gZnJvbTtcbiAgICAgICAgdGhpcy50byA9IHRvO1xuICAgICAgICB0aGlzLl9tYXBzID0gbWFwcyB8fCBbXTtcbiAgICAgICAgdGhpcy5vd25EYXRhID0gIShtYXBzIHx8IG1pcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRoZSBzdGVwIG1hcHMgaW4gdGhpcyBtYXBwaW5nLlxuICAgICovXG4gICAgZ2V0IG1hcHMoKSB7IHJldHVybiB0aGlzLl9tYXBzOyB9XG4gICAgLyoqXG4gICAgQ3JlYXRlIGEgbWFwcGluZyB0aGF0IG1hcHMgb25seSB0aHJvdWdoIGEgcGFydCBvZiB0aGlzIG9uZS5cbiAgICAqL1xuICAgIHNsaWNlKGZyb20gPSAwLCB0byA9IHRoaXMubWFwcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwaW5nKHRoaXMuX21hcHMsIHRoaXMubWlycm9yLCBmcm9tLCB0byk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIHN0ZXAgbWFwIHRvIHRoZSBlbmQgb2YgdGhpcyBtYXBwaW5nLiBJZiBgbWlycm9yc2AgaXNcbiAgICBnaXZlbiwgaXQgc2hvdWxkIGJlIHRoZSBpbmRleCBvZiB0aGUgc3RlcCBtYXAgdGhhdCBpcyB0aGUgbWlycm9yXG4gICAgaW1hZ2Ugb2YgdGhpcyBvbmUuXG4gICAgKi9cbiAgICBhcHBlbmRNYXAobWFwLCBtaXJyb3JzKSB7XG4gICAgICAgIGlmICghdGhpcy5vd25EYXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXBzID0gdGhpcy5fbWFwcy5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5taXJyb3IgPSB0aGlzLm1pcnJvciAmJiB0aGlzLm1pcnJvci5zbGljZSgpO1xuICAgICAgICAgICAgdGhpcy5vd25EYXRhID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvID0gdGhpcy5fbWFwcy5wdXNoKG1hcCk7XG4gICAgICAgIGlmIChtaXJyb3JzICE9IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNldE1pcnJvcih0aGlzLl9tYXBzLmxlbmd0aCAtIDEsIG1pcnJvcnMpO1xuICAgIH1cbiAgICAvKipcbiAgICBBZGQgYWxsIHRoZSBzdGVwIG1hcHMgaW4gYSBnaXZlbiBtYXBwaW5nIHRvIHRoaXMgb25lIChwcmVzZXJ2aW5nXG4gICAgbWlycm9yaW5nIGluZm9ybWF0aW9uKS5cbiAgICAqL1xuICAgIGFwcGVuZE1hcHBpbmcobWFwcGluZykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgc3RhcnRTaXplID0gdGhpcy5fbWFwcy5sZW5ndGg7IGkgPCBtYXBwaW5nLl9tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWlyciA9IG1hcHBpbmcuZ2V0TWlycm9yKGkpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRNYXAobWFwcGluZy5fbWFwc1tpXSwgbWlyciAhPSBudWxsICYmIG1pcnIgPCBpID8gc3RhcnRTaXplICsgbWlyciA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgRmluZHMgdGhlIG9mZnNldCBvZiB0aGUgc3RlcCBtYXAgdGhhdCBtaXJyb3JzIHRoZSBtYXAgYXQgdGhlXG4gICAgZ2l2ZW4gb2Zmc2V0LCBpbiB0aGlzIG1hcHBpbmcgKGFzIHBlciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvXG4gICAgYGFwcGVuZE1hcGApLlxuICAgICovXG4gICAgZ2V0TWlycm9yKG4pIHtcbiAgICAgICAgaWYgKHRoaXMubWlycm9yKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1pcnJvci5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taXJyb3JbaV0gPT0gbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWlycm9yW2kgKyAoaSAlIDIgPyAtMSA6IDEpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzZXRNaXJyb3IobiwgbSkge1xuICAgICAgICBpZiAoIXRoaXMubWlycm9yKVxuICAgICAgICAgICAgdGhpcy5taXJyb3IgPSBbXTtcbiAgICAgICAgdGhpcy5taXJyb3IucHVzaChuLCBtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQXBwZW5kIHRoZSBpbnZlcnNlIG9mIHRoZSBnaXZlbiBtYXBwaW5nIHRvIHRoaXMgb25lLlxuICAgICovXG4gICAgYXBwZW5kTWFwcGluZ0ludmVydGVkKG1hcHBpbmcpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG1hcHBpbmcubWFwcy5sZW5ndGggLSAxLCB0b3RhbFNpemUgPSB0aGlzLl9tYXBzLmxlbmd0aCArIG1hcHBpbmcuX21hcHMubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IG1pcnIgPSBtYXBwaW5nLmdldE1pcnJvcihpKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kTWFwKG1hcHBpbmcuX21hcHNbaV0uaW52ZXJ0KCksIG1pcnIgIT0gbnVsbCAmJiBtaXJyID4gaSA/IHRvdGFsU2l6ZSAtIG1pcnIgLSAxIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYW4gaW52ZXJ0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hcHBpbmcuXG4gICAgKi9cbiAgICBpbnZlcnQoKSB7XG4gICAgICAgIGxldCBpbnZlcnNlID0gbmV3IE1hcHBpbmc7XG4gICAgICAgIGludmVyc2UuYXBwZW5kTWFwcGluZ0ludmVydGVkKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW52ZXJzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIGEgcG9zaXRpb24gdGhyb3VnaCB0aGlzIG1hcHBpbmcuXG4gICAgKi9cbiAgICBtYXAocG9zLCBhc3NvYyA9IDEpIHtcbiAgICAgICAgaWYgKHRoaXMubWlycm9yKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcChwb3MsIGFzc29jLCB0cnVlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZnJvbTsgaSA8IHRoaXMudG87IGkrKylcbiAgICAgICAgICAgIHBvcyA9IHRoaXMuX21hcHNbaV0ubWFwKHBvcywgYXNzb2MpO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBNYXAgYSBwb3NpdGlvbiB0aHJvdWdoIHRoaXMgbWFwcGluZywgcmV0dXJuaW5nIGEgbWFwcGluZ1xuICAgIHJlc3VsdC5cbiAgICAqL1xuICAgIG1hcFJlc3VsdChwb3MsIGFzc29jID0gMSkgeyByZXR1cm4gdGhpcy5fbWFwKHBvcywgYXNzb2MsIGZhbHNlKTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgX21hcChwb3MsIGFzc29jLCBzaW1wbGUpIHtcbiAgICAgICAgbGV0IGRlbEluZm8gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5mcm9tOyBpIDwgdGhpcy50bzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5fbWFwc1tpXSwgcmVzdWx0ID0gbWFwLm1hcFJlc3VsdChwb3MsIGFzc29jKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVjb3ZlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvcnIgPSB0aGlzLmdldE1pcnJvcihpKTtcbiAgICAgICAgICAgICAgICBpZiAoY29yciAhPSBudWxsICYmIGNvcnIgPiBpICYmIGNvcnIgPCB0aGlzLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBjb3JyO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSB0aGlzLl9tYXBzW2NvcnJdLnJlY292ZXIocmVzdWx0LnJlY292ZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxJbmZvIHw9IHJlc3VsdC5kZWxJbmZvO1xuICAgICAgICAgICAgcG9zID0gcmVzdWx0LnBvcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2ltcGxlID8gcG9zIDogbmV3IE1hcFJlc3VsdChwb3MsIGRlbEluZm8sIG51bGwpO1xuICAgIH1cbn1cblxuY29uc3Qgc3RlcHNCeUlEID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKlxuQSBzdGVwIG9iamVjdCByZXByZXNlbnRzIGFuIGF0b21pYyBjaGFuZ2UuIEl0IGdlbmVyYWxseSBhcHBsaWVzXG5vbmx5IHRvIHRoZSBkb2N1bWVudCBpdCB3YXMgY3JlYXRlZCBmb3IsIHNpbmNlIHRoZSBwb3NpdGlvbnNcbnN0b3JlZCBpbiBpdCB3aWxsIG9ubHkgbWFrZSBzZW5zZSBmb3IgdGhhdCBkb2N1bWVudC5cblxuTmV3IHN0ZXBzIGFyZSBkZWZpbmVkIGJ5IGNyZWF0aW5nIGNsYXNzZXMgdGhhdCBleHRlbmQgYFN0ZXBgLFxub3ZlcnJpZGluZyB0aGUgYGFwcGx5YCwgYGludmVydGAsIGBtYXBgLCBgZ2V0TWFwYCBhbmQgYGZyb21KU09OYFxubWV0aG9kcywgYW5kIHJlZ2lzdGVyaW5nIHlvdXIgY2xhc3Mgd2l0aCBhIHVuaXF1ZVxuSlNPTi1zZXJpYWxpemF0aW9uIGlkZW50aWZpZXIgdXNpbmdcbltgU3RlcC5qc29uSURgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlN0ZXBeanNvbklEKS5cbiovXG5jbGFzcyBTdGVwIHtcbiAgICAvKipcbiAgICBHZXQgdGhlIHN0ZXAgbWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhbmdlcyBtYWRlIGJ5IHRoaXMgc3RlcCxcbiAgICBhbmQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIGJldHdlZW4gcG9zaXRpb25zIGluIHRoZSBvbGRcbiAgICBhbmQgdGhlIG5ldyBkb2N1bWVudC5cbiAgICAqL1xuICAgIGdldE1hcCgpIHsgcmV0dXJuIFN0ZXBNYXAuZW1wdHk7IH1cbiAgICAvKipcbiAgICBUcnkgdG8gbWVyZ2UgdGhpcyBzdGVwIHdpdGggYW5vdGhlciBvbmUsIHRvIGJlIGFwcGxpZWQgZGlyZWN0bHlcbiAgICBhZnRlciBpdC4gUmV0dXJucyB0aGUgbWVyZ2VkIHN0ZXAgd2hlbiBwb3NzaWJsZSwgbnVsbCBpZiB0aGVcbiAgICBzdGVwcyBjYW4ndCBiZSBtZXJnZWQuXG4gICAgKi9cbiAgICBtZXJnZShvdGhlcikgeyByZXR1cm4gbnVsbDsgfVxuICAgIC8qKlxuICAgIERlc2VyaWFsaXplIGEgc3RlcCBmcm9tIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLiBXaWxsIGNhbGxcbiAgICB0aHJvdWdoIHRvIHRoZSBzdGVwIGNsYXNzJyBvd24gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICghanNvbiB8fCAhanNvbi5zdGVwVHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgbGV0IHR5cGUgPSBzdGVwc0J5SURbanNvbi5zdGVwVHlwZV07XG4gICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBObyBzdGVwIHR5cGUgJHtqc29uLnN0ZXBUeXBlfSBkZWZpbmVkYCk7XG4gICAgICAgIHJldHVybiB0eXBlLmZyb21KU09OKHNjaGVtYSwganNvbik7XG4gICAgfVxuICAgIC8qKlxuICAgIFRvIGJlIGFibGUgdG8gc2VyaWFsaXplIHN0ZXBzIHRvIEpTT04sIGVhY2ggc3RlcCBuZWVkcyBhIHN0cmluZ1xuICAgIElEIHRvIGF0dGFjaCB0byBpdHMgSlNPTiByZXByZXNlbnRhdGlvbi4gVXNlIHRoaXMgbWV0aG9kIHRvXG4gICAgcmVnaXN0ZXIgYW4gSUQgZm9yIHlvdXIgc3RlcCBjbGFzc2VzLiBUcnkgdG8gcGljayBzb21ldGhpbmdcbiAgICB0aGF0J3MgdW5saWtlbHkgdG8gY2xhc2ggd2l0aCBzdGVwcyBmcm9tIG90aGVyIG1vZHVsZXMuXG4gICAgKi9cbiAgICBzdGF0aWMganNvbklEKGlkLCBzdGVwQ2xhc3MpIHtcbiAgICAgICAgaWYgKGlkIGluIHN0ZXBzQnlJRClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiRHVwbGljYXRlIHVzZSBvZiBzdGVwIEpTT04gSUQgXCIgKyBpZCk7XG4gICAgICAgIHN0ZXBzQnlJRFtpZF0gPSBzdGVwQ2xhc3M7XG4gICAgICAgIHN0ZXBDbGFzcy5wcm90b3R5cGUuanNvbklEID0gaWQ7XG4gICAgICAgIHJldHVybiBzdGVwQ2xhc3M7XG4gICAgfVxufVxuLyoqXG5UaGUgcmVzdWx0IG9mIFthcHBseWluZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwLmFwcGx5KSBhIHN0ZXAuIENvbnRhaW5zIGVpdGhlciBhXG5uZXcgZG9jdW1lbnQgb3IgYSBmYWlsdXJlIHZhbHVlLlxuKi9cbmNsYXNzIFN0ZXBSZXN1bHQge1xuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHRyYW5zZm9ybWVkIGRvY3VtZW50LCBpZiBzdWNjZXNzZnVsLlxuICAgICovXG4gICAgZG9jLCBcbiAgICAvKipcbiAgICBUaGUgZmFpbHVyZSBtZXNzYWdlLCBpZiB1bnN1Y2Nlc3NmdWwuXG4gICAgKi9cbiAgICBmYWlsZWQpIHtcbiAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgIHRoaXMuZmFpbGVkID0gZmFpbGVkO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzdWNjZXNzZnVsIHN0ZXAgcmVzdWx0LlxuICAgICovXG4gICAgc3RhdGljIG9rKGRvYykgeyByZXR1cm4gbmV3IFN0ZXBSZXN1bHQoZG9jLCBudWxsKTsgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIGZhaWxlZCBzdGVwIHJlc3VsdC5cbiAgICAqL1xuICAgIHN0YXRpYyBmYWlsKG1lc3NhZ2UpIHsgcmV0dXJuIG5ldyBTdGVwUmVzdWx0KG51bGwsIG1lc3NhZ2UpOyB9XG4gICAgLyoqXG4gICAgQ2FsbCBbYE5vZGUucmVwbGFjZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlLnJlcGxhY2UpIHdpdGggdGhlIGdpdmVuXG4gICAgYXJndW1lbnRzLiBDcmVhdGUgYSBzdWNjZXNzZnVsIHJlc3VsdCBpZiBpdCBzdWNjZWVkcywgYW5kIGFcbiAgICBmYWlsZWQgb25lIGlmIGl0IHRocm93cyBhIGBSZXBsYWNlRXJyb3JgLlxuICAgICovXG4gICAgc3RhdGljIGZyb21SZXBsYWNlKGRvYywgZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5vayhkb2MucmVwbGFjZShmcm9tLCB0bywgc2xpY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZXBsYWNlRXJyb3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbWFwRnJhZ21lbnQoZnJhZ21lbnQsIGYsIHBhcmVudCkge1xuICAgIGxldCBtYXBwZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyYWdtZW50LmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBmcmFnbWVudC5jaGlsZChpKTtcbiAgICAgICAgaWYgKGNoaWxkLmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY29weShtYXBGcmFnbWVudChjaGlsZC5jb250ZW50LCBmLCBjaGlsZCkpO1xuICAgICAgICBpZiAoY2hpbGQuaXNJbmxpbmUpXG4gICAgICAgICAgICBjaGlsZCA9IGYoY2hpbGQsIHBhcmVudCwgaSk7XG4gICAgICAgIG1hcHBlZC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIEZyYWdtZW50LmZyb21BcnJheShtYXBwZWQpO1xufVxuLyoqXG5BZGQgYSBtYXJrIHRvIGFsbCBpbmxpbmUgY29udGVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMuXG4qL1xuY2xhc3MgQWRkTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBtYXJrIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgb2YgdGhlIG1hcmtlZCByYW5nZS5cbiAgICAqL1xuICAgIGZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgdGhlIG1hcmtlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byBhZGQuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBvbGRTbGljZSA9IGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pLCAkZnJvbSA9IGRvYy5yZXNvbHZlKHRoaXMuZnJvbSk7XG4gICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5ub2RlKCRmcm9tLnNoYXJlZERlcHRoKHRoaXMudG8pKTtcbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKG1hcEZyYWdtZW50KG9sZFNsaWNlLmNvbnRlbnQsIChub2RlLCBwYXJlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICghbm9kZS5pc0F0b20gfHwgIXBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKHRoaXMubWFyay50eXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm1hcmsodGhpcy5tYXJrLmFkZFRvU2V0KG5vZGUubWFya3MpKTtcbiAgICAgICAgfSwgcGFyZW50KSwgb2xkU2xpY2Uub3BlblN0YXJ0LCBvbGRTbGljZS5vcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIHNsaWNlKTtcbiAgICB9XG4gICAgaW52ZXJ0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU1hcmtTdGVwKHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZCAmJiB0by5kZWxldGVkIHx8IGZyb20ucG9zID49IHRvLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IEFkZE1hcmtTdGVwKGZyb20ucG9zLCB0by5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEFkZE1hcmtTdGVwICYmXG4gICAgICAgICAgICBvdGhlci5tYXJrLmVxKHRoaXMubWFyaykgJiZcbiAgICAgICAgICAgIHRoaXMuZnJvbSA8PSBvdGhlci50byAmJiB0aGlzLnRvID49IG90aGVyLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbmV3IEFkZE1hcmtTdGVwKE1hdGgubWluKHRoaXMuZnJvbSwgb3RoZXIuZnJvbSksIE1hdGgubWF4KHRoaXMudG8sIG90aGVyLnRvKSwgdGhpcy5tYXJrKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwiYWRkTWFya1wiLCBtYXJrOiB0aGlzLm1hcmsudG9KU09OKCksXG4gICAgICAgICAgICBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEFkZE1hcmtTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZE1hcmtTdGVwKGpzb24uZnJvbSwganNvbi50bywgc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uLm1hcmspKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcImFkZE1hcmtcIiwgQWRkTWFya1N0ZXApO1xuLyoqXG5SZW1vdmUgYSBtYXJrIGZyb20gYWxsIGlubGluZSBjb250ZW50IGJldHdlZW4gdHdvIHBvc2l0aW9ucy5cbiovXG5jbGFzcyBSZW1vdmVNYXJrU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmstcmVtb3Zpbmcgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBzdGFydCBvZiB0aGUgdW5tYXJrZWQgcmFuZ2UuXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIG9mIHRoZSB1bm1hcmtlZCByYW5nZS5cbiAgICAqL1xuICAgIHRvLCBcbiAgICAvKipcbiAgICBUaGUgbWFyayB0byByZW1vdmUuXG4gICAgKi9cbiAgICBtYXJrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5tYXJrID0gbWFyaztcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGxldCBvbGRTbGljZSA9IGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pO1xuICAgICAgICBsZXQgc2xpY2UgPSBuZXcgU2xpY2UobWFwRnJhZ21lbnQob2xkU2xpY2UuY29udGVudCwgbm9kZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5tYXJrKHRoaXMubWFyay5yZW1vdmVGcm9tU2V0KG5vZGUubWFya3MpKTtcbiAgICAgICAgfSwgZG9jKSwgb2xkU2xpY2Uub3BlblN0YXJ0LCBvbGRTbGljZS5vcGVuRW5kKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIHNsaWNlKTtcbiAgICB9XG4gICAgaW52ZXJ0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFkZE1hcmtTdGVwKHRoaXMuZnJvbSwgdGhpcy50bywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLmZyb20sIDEpLCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMudG8sIC0xKTtcbiAgICAgICAgaWYgKGZyb20uZGVsZXRlZCAmJiB0by5kZWxldGVkIHx8IGZyb20ucG9zID49IHRvLnBvcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU1hcmtTdGVwKGZyb20ucG9zLCB0by5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFJlbW92ZU1hcmtTdGVwICYmXG4gICAgICAgICAgICBvdGhlci5tYXJrLmVxKHRoaXMubWFyaykgJiZcbiAgICAgICAgICAgIHRoaXMuZnJvbSA8PSBvdGhlci50byAmJiB0aGlzLnRvID49IG90aGVyLmZyb20pXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU1hcmtTdGVwKE1hdGgubWluKHRoaXMuZnJvbSwgb3RoZXIuZnJvbSksIE1hdGgubWF4KHRoaXMudG8sIG90aGVyLnRvKSwgdGhpcy5tYXJrKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwicmVtb3ZlTWFya1wiLCBtYXJrOiB0aGlzLm1hcmsudG9KU09OKCksXG4gICAgICAgICAgICBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlbW92ZU1hcmtTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU1hcmtTdGVwKGpzb24uZnJvbSwganNvbi50bywgc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uLm1hcmspKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcInJlbW92ZU1hcmtcIiwgUmVtb3ZlTWFya1N0ZXApO1xuLyoqXG5BZGQgYSBtYXJrIHRvIGEgc3BlY2lmaWMgbm9kZS5cbiovXG5jbGFzcyBBZGROb2RlTWFya1N0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSBub2RlIG1hcmsgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHRvIGFkZC5cbiAgICAqL1xuICAgIG1hcmspIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiTm8gbm9kZSBhdCBtYXJrIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKG5vZGUuYXR0cnMsIG51bGwsIHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5wb3MsIHRoaXMucG9zICsgMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odXBkYXRlZCksIDAsIG5vZGUuaXNMZWFmID8gMCA6IDEpKTtcbiAgICB9XG4gICAgaW52ZXJ0KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5ld1NldCA9IHRoaXMubWFyay5hZGRUb1NldChub2RlLm1hcmtzKTtcbiAgICAgICAgICAgIGlmIChuZXdTZXQubGVuZ3RoID09IG5vZGUubWFya3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLm1hcmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUubWFya3NbaV0uaXNJblNldChuZXdTZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGROb2RlTWFya1N0ZXAodGhpcy5wb3MsIG5vZGUubWFya3NbaV0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVtb3ZlTm9kZU1hcmtTdGVwKHRoaXMucG9zLCB0aGlzLm1hcmspO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgcG9zID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5wb3MsIDEpO1xuICAgICAgICByZXR1cm4gcG9zLmRlbGV0ZWRBZnRlciA/IG51bGwgOiBuZXcgQWRkTm9kZU1hcmtTdGVwKHBvcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwiYWRkTm9kZU1hcmtcIiwgcG9zOiB0aGlzLnBvcywgbWFyazogdGhpcy5tYXJrLnRvSlNPTigpIH07XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24ucG9zICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIEFkZE5vZGVNYXJrU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGROb2RlTWFya1N0ZXAoanNvbi5wb3MsIHNjaGVtYS5tYXJrRnJvbUpTT04oanNvbi5tYXJrKSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhZGROb2RlTWFya1wiLCBBZGROb2RlTWFya1N0ZXApO1xuLyoqXG5SZW1vdmUgYSBtYXJrIGZyb20gYSBzcGVjaWZpYyBub2RlLlxuKi9cbmNsYXNzIFJlbW92ZU5vZGVNYXJrU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIG1hcmstcmVtb3Zpbmcgc3RlcC5cbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgKi9cbiAgICBwb3MsIFxuICAgIC8qKlxuICAgIFRoZSBtYXJrIHRvIHJlbW92ZS5cbiAgICAqL1xuICAgIG1hcmspIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiTm8gbm9kZSBhdCBtYXJrIHN0ZXAncyBwb3NpdGlvblwiKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBub2RlLnR5cGUuY3JlYXRlKG5vZGUuYXR0cnMsIG51bGwsIHRoaXMubWFyay5yZW1vdmVGcm9tU2V0KG5vZGUubWFya3MpKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLnBvcywgdGhpcy5wb3MgKyAxLCBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKSwgMCwgbm9kZS5pc0xlYWYgPyAwIDogMSkpO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIGxldCBub2RlID0gZG9jLm5vZGVBdCh0aGlzLnBvcyk7XG4gICAgICAgIGlmICghbm9kZSB8fCAhdGhpcy5tYXJrLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBBZGROb2RlTWFya1N0ZXAodGhpcy5wb3MsIHRoaXMubWFyayk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBwb3MgPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnBvcywgMSk7XG4gICAgICAgIHJldHVybiBwb3MuZGVsZXRlZEFmdGVyID8gbnVsbCA6IG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAocG9zLnBvcywgdGhpcy5tYXJrKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4geyBzdGVwVHlwZTogXCJyZW1vdmVOb2RlTWFya1wiLCBwb3M6IHRoaXMucG9zLCBtYXJrOiB0aGlzLm1hcmsudG9KU09OKCkgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBzdGF0aWMgZnJvbUpTT04oc2NoZW1hLCBqc29uKSB7XG4gICAgICAgIGlmICh0eXBlb2YganNvbi5wb3MgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgUmVtb3ZlTm9kZU1hcmtTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlbW92ZU5vZGVNYXJrU3RlcChqc29uLnBvcywgc2NoZW1hLm1hcmtGcm9tSlNPTihqc29uLm1hcmspKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcInJlbW92ZU5vZGVNYXJrXCIsIFJlbW92ZU5vZGVNYXJrU3RlcCk7XG5cbi8qKlxuUmVwbGFjZSBhIHBhcnQgb2YgdGhlIGRvY3VtZW50IHdpdGggYSBzbGljZSBvZiBuZXcgY29udGVudC5cbiovXG5jbGFzcyBSZXBsYWNlU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIFRoZSBnaXZlbiBgc2xpY2VgIHNob3VsZCBmaXQgdGhlICdnYXAnIGJldHdlZW4gYGZyb21gIGFuZFxuICAgIGB0b2DigJR0aGUgZGVwdGhzIG11c3QgbGluZSB1cCwgYW5kIHRoZSBzdXJyb3VuZGluZyBub2RlcyBtdXN0IGJlXG4gICAgYWJsZSB0byBiZSBqb2luZWQgd2l0aCB0aGUgb3BlbiBzaWRlcyBvZiB0aGUgc2xpY2UuIFdoZW5cbiAgICBgc3RydWN0dXJlYCBpcyB0cnVlLCB0aGUgc3RlcCB3aWxsIGZhaWwgaWYgdGhlIGNvbnRlbnQgYmV0d2VlblxuICAgIGZyb20gYW5kIHRvIGlzIG5vdCBqdXN0IGEgc2VxdWVuY2Ugb2YgY2xvc2luZyBhbmQgdGhlbiBvcGVuaW5nXG4gICAgdG9rZW5zICh0aGlzIGlzIHRvIGd1YXJkIGFnYWluc3QgcmViYXNlZCByZXBsYWNlIHN0ZXBzXG4gICAgb3ZlcndyaXRpbmcgc29tZXRoaW5nIHRoZXkgd2VyZW4ndCBzdXBwb3NlZCB0bykuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHNsaWNlIHRvIGluc2VydC5cbiAgICAqL1xuICAgIHNsaWNlLCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0cnVjdHVyZSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlO1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IHN0cnVjdHVyZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSAmJiBjb250ZW50QmV0d2Vlbihkb2MsIHRoaXMuZnJvbSwgdGhpcy50bykpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiU3RydWN0dXJlIHJlcGxhY2Ugd291bGQgb3ZlcndyaXRlIGNvbnRlbnRcIik7XG4gICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZyb21SZXBsYWNlKGRvYywgdGhpcy5mcm9tLCB0aGlzLnRvLCB0aGlzLnNsaWNlKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0ZXBNYXAoW3RoaXMuZnJvbSwgdGhpcy50byAtIHRoaXMuZnJvbSwgdGhpcy5zbGljZS5zaXplXSk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCh0aGlzLmZyb20sIHRoaXMuZnJvbSArIHRoaXMuc2xpY2Uuc2l6ZSwgZG9jLnNsaWNlKHRoaXMuZnJvbSwgdGhpcy50bykpO1xuICAgIH1cbiAgICBtYXAobWFwcGluZykge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMuZnJvbSwgMSksIHRvID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy50bywgLTEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkQWNyb3NzICYmIHRvLmRlbGV0ZWRBY3Jvc3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcChmcm9tLnBvcywgTWF0aC5tYXgoZnJvbS5wb3MsIHRvLnBvcyksIHRoaXMuc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICB9XG4gICAgbWVyZ2Uob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBSZXBsYWNlU3RlcCkgfHwgb3RoZXIuc3RydWN0dXJlIHx8IHRoaXMuc3RydWN0dXJlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICh0aGlzLmZyb20gKyB0aGlzLnNsaWNlLnNpemUgPT0gb3RoZXIuZnJvbSAmJiAhdGhpcy5zbGljZS5vcGVuRW5kICYmICFvdGhlci5zbGljZS5vcGVuU3RhcnQpIHtcbiAgICAgICAgICAgIGxldCBzbGljZSA9IHRoaXMuc2xpY2Uuc2l6ZSArIG90aGVyLnNsaWNlLnNpemUgPT0gMCA/IFNsaWNlLmVtcHR5XG4gICAgICAgICAgICAgICAgOiBuZXcgU2xpY2UodGhpcy5zbGljZS5jb250ZW50LmFwcGVuZChvdGhlci5zbGljZS5jb250ZW50KSwgdGhpcy5zbGljZS5vcGVuU3RhcnQsIG90aGVyLnNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCh0aGlzLmZyb20sIHRoaXMudG8gKyAob3RoZXIudG8gLSBvdGhlci5mcm9tKSwgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvdGhlci50byA9PSB0aGlzLmZyb20gJiYgIXRoaXMuc2xpY2Uub3BlblN0YXJ0ICYmICFvdGhlci5zbGljZS5vcGVuRW5kKSB7XG4gICAgICAgICAgICBsZXQgc2xpY2UgPSB0aGlzLnNsaWNlLnNpemUgKyBvdGhlci5zbGljZS5zaXplID09IDAgPyBTbGljZS5lbXB0eVxuICAgICAgICAgICAgICAgIDogbmV3IFNsaWNlKG90aGVyLnNsaWNlLmNvbnRlbnQuYXBwZW5kKHRoaXMuc2xpY2UuY29udGVudCksIG90aGVyLnNsaWNlLm9wZW5TdGFydCwgdGhpcy5zbGljZS5vcGVuRW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAob3RoZXIuZnJvbSwgdGhpcy50bywgc2xpY2UsIHRoaXMuc3RydWN0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSB7IHN0ZXBUeXBlOiBcInJlcGxhY2VcIiwgZnJvbTogdGhpcy5mcm9tLCB0bzogdGhpcy50byB9O1xuICAgICAgICBpZiAodGhpcy5zbGljZS5zaXplKVxuICAgICAgICAgICAganNvbi5zbGljZSA9IHRoaXMuc2xpY2UudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIGpzb24uc3RydWN0dXJlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgaW5wdXQgZm9yIFJlcGxhY2VTdGVwLmZyb21KU09OXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VTdGVwKGpzb24uZnJvbSwganNvbi50bywgU2xpY2UuZnJvbUpTT04oc2NoZW1hLCBqc29uLnNsaWNlKSwgISFqc29uLnN0cnVjdHVyZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJyZXBsYWNlXCIsIFJlcGxhY2VTdGVwKTtcbi8qKlxuUmVwbGFjZSBhIHBhcnQgb2YgdGhlIGRvY3VtZW50IHdpdGggYSBzbGljZSBvZiBjb250ZW50LCBidXRcbnByZXNlcnZlIGEgcmFuZ2Ugb2YgdGhlIHJlcGxhY2VkIGNvbnRlbnQgYnkgbW92aW5nIGl0IGludG8gdGhlXG5zbGljZS5cbiovXG5jbGFzcyBSZXBsYWNlQXJvdW5kU3RlcCBleHRlbmRzIFN0ZXAge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHJlcGxhY2UtYXJvdW5kIHN0ZXAgd2l0aCB0aGUgZ2l2ZW4gcmFuZ2UgYW5kIGdhcC5cbiAgICBgaW5zZXJ0YCBzaG91bGQgYmUgdGhlIHBvaW50IGluIHRoZSBzbGljZSBpbnRvIHdoaWNoIHRoZSBjb250ZW50XG4gICAgb2YgdGhlIGdhcCBzaG91bGQgYmUgbW92ZWQuIGBzdHJ1Y3R1cmVgIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzXG4gICAgaXQgaGFzIGluIHRoZSBbYFJlcGxhY2VTdGVwYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5SZXBsYWNlU3RlcCkgY2xhc3MuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlcGxhY2VkIHJhbmdlLlxuICAgICovXG4gICAgZnJvbSwgXG4gICAgLyoqXG4gICAgVGhlIGVuZCBwb3NpdGlvbiBvZiB0aGUgcmVwbGFjZWQgcmFuZ2UuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0IG9mIHByZXNlcnZlZCByYW5nZS5cbiAgICAqL1xuICAgIGdhcEZyb20sIFxuICAgIC8qKlxuICAgIFRoZSBlbmQgb2YgcHJlc2VydmVkIHJhbmdlLlxuICAgICovXG4gICAgZ2FwVG8sIFxuICAgIC8qKlxuICAgIFRoZSBzbGljZSB0byBpbnNlcnQuXG4gICAgKi9cbiAgICBzbGljZSwgXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIGluIHRoZSBzbGljZSB3aGVyZSB0aGUgcHJlc2VydmVkIHJhbmdlIHNob3VsZCBiZVxuICAgIGluc2VydGVkLlxuICAgICovXG4gICAgaW5zZXJ0LCBcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHN0cnVjdHVyZSA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy5nYXBGcm9tID0gZ2FwRnJvbTtcbiAgICAgICAgdGhpcy5nYXBUbyA9IGdhcFRvO1xuICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7XG4gICAgICAgIHRoaXMuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgICAgICB0aGlzLnN0cnVjdHVyZSA9IHN0cnVjdHVyZTtcbiAgICB9XG4gICAgYXBwbHkoZG9jKSB7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSAmJiAoY29udGVudEJldHdlZW4oZG9jLCB0aGlzLmZyb20sIHRoaXMuZ2FwRnJvbSkgfHxcbiAgICAgICAgICAgIGNvbnRlbnRCZXR3ZWVuKGRvYywgdGhpcy5nYXBUbywgdGhpcy50bykpKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIlN0cnVjdHVyZSBnYXAtcmVwbGFjZSB3b3VsZCBvdmVyd3JpdGUgY29udGVudFwiKTtcbiAgICAgICAgbGV0IGdhcCA9IGRvYy5zbGljZSh0aGlzLmdhcEZyb20sIHRoaXMuZ2FwVG8pO1xuICAgICAgICBpZiAoZ2FwLm9wZW5TdGFydCB8fCBnYXAub3BlbkVuZClcbiAgICAgICAgICAgIHJldHVybiBTdGVwUmVzdWx0LmZhaWwoXCJHYXAgaXMgbm90IGEgZmxhdCByYW5nZVwiKTtcbiAgICAgICAgbGV0IGluc2VydGVkID0gdGhpcy5zbGljZS5pbnNlcnRBdCh0aGlzLmluc2VydCwgZ2FwLmNvbnRlbnQpO1xuICAgICAgICBpZiAoIWluc2VydGVkKVxuICAgICAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZmFpbChcIkNvbnRlbnQgZG9lcyBub3QgZml0IGluIGdhcFwiKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQuZnJvbVJlcGxhY2UoZG9jLCB0aGlzLmZyb20sIHRoaXMudG8sIGluc2VydGVkKTtcbiAgICB9XG4gICAgZ2V0TWFwKCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0ZXBNYXAoW3RoaXMuZnJvbSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmluc2VydCxcbiAgICAgICAgICAgIHRoaXMuZ2FwVG8sIHRoaXMudG8gLSB0aGlzLmdhcFRvLCB0aGlzLnNsaWNlLnNpemUgLSB0aGlzLmluc2VydF0pO1xuICAgIH1cbiAgICBpbnZlcnQoZG9jKSB7XG4gICAgICAgIGxldCBnYXAgPSB0aGlzLmdhcFRvIC0gdGhpcy5nYXBGcm9tO1xuICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKHRoaXMuZnJvbSwgdGhpcy5mcm9tICsgdGhpcy5zbGljZS5zaXplICsgZ2FwLCB0aGlzLmZyb20gKyB0aGlzLmluc2VydCwgdGhpcy5mcm9tICsgdGhpcy5pbnNlcnQgKyBnYXAsIGRvYy5zbGljZSh0aGlzLmZyb20sIHRoaXMudG8pLnJlbW92ZUJldHdlZW4odGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLmdhcFRvIC0gdGhpcy5mcm9tKSwgdGhpcy5nYXBGcm9tIC0gdGhpcy5mcm9tLCB0aGlzLnN0cnVjdHVyZSk7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nKSB7XG4gICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXBSZXN1bHQodGhpcy5mcm9tLCAxKSwgdG8gPSBtYXBwaW5nLm1hcFJlc3VsdCh0aGlzLnRvLCAtMSk7XG4gICAgICAgIGxldCBnYXBGcm9tID0gdGhpcy5mcm9tID09IHRoaXMuZ2FwRnJvbSA/IGZyb20ucG9zIDogbWFwcGluZy5tYXAodGhpcy5nYXBGcm9tLCAtMSk7XG4gICAgICAgIGxldCBnYXBUbyA9IHRoaXMudG8gPT0gdGhpcy5nYXBUbyA/IHRvLnBvcyA6IG1hcHBpbmcubWFwKHRoaXMuZ2FwVG8sIDEpO1xuICAgICAgICBpZiAoKGZyb20uZGVsZXRlZEFjcm9zcyAmJiB0by5kZWxldGVkQWNyb3NzKSB8fCBnYXBGcm9tIDwgZnJvbS5wb3MgfHwgZ2FwVG8gPiB0by5wb3MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcChmcm9tLnBvcywgdG8ucG9zLCBnYXBGcm9tLCBnYXBUbywgdGhpcy5zbGljZSwgdGhpcy5pbnNlcnQsIHRoaXMuc3RydWN0dXJlKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQganNvbiA9IHsgc3RlcFR5cGU6IFwicmVwbGFjZUFyb3VuZFwiLCBmcm9tOiB0aGlzLmZyb20sIHRvOiB0aGlzLnRvLFxuICAgICAgICAgICAgZ2FwRnJvbTogdGhpcy5nYXBGcm9tLCBnYXBUbzogdGhpcy5nYXBUbywgaW5zZXJ0OiB0aGlzLmluc2VydCB9O1xuICAgICAgICBpZiAodGhpcy5zbGljZS5zaXplKVxuICAgICAgICAgICAganNvbi5zbGljZSA9IHRoaXMuc2xpY2UudG9KU09OKCk7XG4gICAgICAgIGlmICh0aGlzLnN0cnVjdHVyZSlcbiAgICAgICAgICAgIGpzb24uc3RydWN0dXJlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgc3RhdGljIGZyb21KU09OKHNjaGVtYSwganNvbikge1xuICAgICAgICBpZiAodHlwZW9mIGpzb24uZnJvbSAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLnRvICE9IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBqc29uLmdhcEZyb20gIT0gXCJudW1iZXJcIiB8fCB0eXBlb2YganNvbi5nYXBUbyAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmluc2VydCAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGlucHV0IGZvciBSZXBsYWNlQXJvdW5kU3RlcC5mcm9tSlNPTlwiKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlQXJvdW5kU3RlcChqc29uLmZyb20sIGpzb24udG8sIGpzb24uZ2FwRnJvbSwganNvbi5nYXBUbywgU2xpY2UuZnJvbUpTT04oc2NoZW1hLCBqc29uLnNsaWNlKSwganNvbi5pbnNlcnQsICEhanNvbi5zdHJ1Y3R1cmUpO1xuICAgIH1cbn1cblN0ZXAuanNvbklEKFwicmVwbGFjZUFyb3VuZFwiLCBSZXBsYWNlQXJvdW5kU3RlcCk7XG5mdW5jdGlvbiBjb250ZW50QmV0d2Vlbihkb2MsIGZyb20sIHRvKSB7XG4gICAgbGV0ICRmcm9tID0gZG9jLnJlc29sdmUoZnJvbSksIGRpc3QgPSB0byAtIGZyb20sIGRlcHRoID0gJGZyb20uZGVwdGg7XG4gICAgd2hpbGUgKGRpc3QgPiAwICYmIGRlcHRoID4gMCAmJiAkZnJvbS5pbmRleEFmdGVyKGRlcHRoKSA9PSAkZnJvbS5ub2RlKGRlcHRoKS5jaGlsZENvdW50KSB7XG4gICAgICAgIGRlcHRoLS07XG4gICAgICAgIGRpc3QtLTtcbiAgICB9XG4gICAgaWYgKGRpc3QgPiAwKSB7XG4gICAgICAgIGxldCBuZXh0ID0gJGZyb20ubm9kZShkZXB0aCkubWF5YmVDaGlsZCgkZnJvbS5pbmRleEFmdGVyKGRlcHRoKSk7XG4gICAgICAgIHdoaWxlIChkaXN0ID4gMCkge1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQuaXNMZWFmKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGRpc3QtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFkZE1hcmsodHIsIGZyb20sIHRvLCBtYXJrKSB7XG4gICAgbGV0IHJlbW92ZWQgPSBbXSwgYWRkZWQgPSBbXTtcbiAgICBsZXQgcmVtb3ZpbmcsIGFkZGluZztcbiAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zLCBwYXJlbnQpID0+IHtcbiAgICAgICAgaWYgKCFub2RlLmlzSW5saW5lKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbWFya3MgPSBub2RlLm1hcmtzO1xuICAgICAgICBpZiAoIW1hcmsuaXNJblNldChtYXJrcykgJiYgcGFyZW50LnR5cGUuYWxsb3dzTWFya1R5cGUobWFyay50eXBlKSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgocG9zLCBmcm9tKSwgZW5kID0gTWF0aC5taW4ocG9zICsgbm9kZS5ub2RlU2l6ZSwgdG8pO1xuICAgICAgICAgICAgbGV0IG5ld1NldCA9IG1hcmsuYWRkVG9TZXQobWFya3MpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghbWFya3NbaV0uaXNJblNldChuZXdTZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmluZyAmJiByZW1vdmluZy50byA9PSBzdGFydCAmJiByZW1vdmluZy5tYXJrLmVxKG1hcmtzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92aW5nLnRvID0gZW5kO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkLnB1c2gocmVtb3ZpbmcgPSBuZXcgUmVtb3ZlTWFya1N0ZXAoc3RhcnQsIGVuZCwgbWFya3NbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkaW5nICYmIGFkZGluZy50byA9PSBzdGFydClcbiAgICAgICAgICAgICAgICBhZGRpbmcudG8gPSBlbmQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWRkZWQucHVzaChhZGRpbmcgPSBuZXcgQWRkTWFya1N0ZXAoc3RhcnQsIGVuZCwgbWFyaykpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmVtb3ZlZC5mb3JFYWNoKHMgPT4gdHIuc3RlcChzKSk7XG4gICAgYWRkZWQuZm9yRWFjaChzID0+IHRyLnN0ZXAocykpO1xufVxuZnVuY3Rpb24gcmVtb3ZlTWFyayh0ciwgZnJvbSwgdG8sIG1hcmspIHtcbiAgICBsZXQgbWF0Y2hlZCA9IFtdLCBzdGVwID0gMDtcbiAgICB0ci5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCAobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgIGlmICghbm9kZS5pc0lubGluZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3RlcCsrO1xuICAgICAgICBsZXQgdG9SZW1vdmUgPSBudWxsO1xuICAgICAgICBpZiAobWFyayBpbnN0YW5jZW9mIE1hcmtUeXBlKSB7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbm9kZS5tYXJrcywgZm91bmQ7XG4gICAgICAgICAgICB3aGlsZSAoZm91bmQgPSBtYXJrLmlzSW5TZXQoc2V0KSkge1xuICAgICAgICAgICAgICAgICh0b1JlbW92ZSB8fCAodG9SZW1vdmUgPSBbXSkpLnB1c2goZm91bmQpO1xuICAgICAgICAgICAgICAgIHNldCA9IGZvdW5kLnJlbW92ZUZyb21TZXQoc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXJrKSB7XG4gICAgICAgICAgICBpZiAobWFyay5pc0luU2V0KG5vZGUubWFya3MpKVxuICAgICAgICAgICAgICAgIHRvUmVtb3ZlID0gW21hcmtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG9SZW1vdmUgPSBub2RlLm1hcmtzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b1JlbW92ZSAmJiB0b1JlbW92ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihwb3MgKyBub2RlLm5vZGVTaXplLCB0byk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gdG9SZW1vdmVbaV0sIGZvdW5kO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0Y2hlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbSA9IG1hdGNoZWRbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLnN0ZXAgPT0gc3RlcCAtIDEgJiYgc3R5bGUuZXEobWF0Y2hlZFtqXS5zdHlsZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZC50byA9IGVuZDtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQuc3RlcCA9IHN0ZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkLnB1c2goeyBzdHlsZSwgZnJvbTogTWF0aC5tYXgocG9zLCBmcm9tKSwgdG86IGVuZCwgc3RlcCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBtYXRjaGVkLmZvckVhY2gobSA9PiB0ci5zdGVwKG5ldyBSZW1vdmVNYXJrU3RlcChtLmZyb20sIG0udG8sIG0uc3R5bGUpKSk7XG59XG5mdW5jdGlvbiBjbGVhckluY29tcGF0aWJsZSh0ciwgcG9zLCBwYXJlbnRUeXBlLCBtYXRjaCA9IHBhcmVudFR5cGUuY29udGVudE1hdGNoLCBjbGVhck5ld2xpbmVzID0gdHJ1ZSkge1xuICAgIGxldCBub2RlID0gdHIuZG9jLm5vZGVBdChwb3MpO1xuICAgIGxldCByZXBsU3RlcHMgPSBbXSwgY3VyID0gcG9zICsgMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuY2hpbGRDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IG5vZGUuY2hpbGQoaSksIGVuZCA9IGN1ciArIGNoaWxkLm5vZGVTaXplO1xuICAgICAgICBsZXQgYWxsb3dlZCA9IG1hdGNoLm1hdGNoVHlwZShjaGlsZC50eXBlKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkKSB7XG4gICAgICAgICAgICByZXBsU3RlcHMucHVzaChuZXcgUmVwbGFjZVN0ZXAoY3VyLCBlbmQsIFNsaWNlLmVtcHR5KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtYXRjaCA9IGFsbG93ZWQ7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLm1hcmtzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50VHlwZS5hbGxvd3NNYXJrVHlwZShjaGlsZC5tYXJrc1tqXS50eXBlKSlcbiAgICAgICAgICAgICAgICAgICAgdHIuc3RlcChuZXcgUmVtb3ZlTWFya1N0ZXAoY3VyLCBlbmQsIGNoaWxkLm1hcmtzW2pdKSk7XG4gICAgICAgICAgICBpZiAoY2xlYXJOZXdsaW5lcyAmJiBjaGlsZC5pc1RleHQgJiYgcGFyZW50VHlwZS53aGl0ZXNwYWNlICE9IFwicHJlXCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgbSwgbmV3bGluZSA9IC9cXHI/XFxufFxcci9nLCBzbGljZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobSA9IG5ld2xpbmUuZXhlYyhjaGlsZC50ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNsaWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoRnJhZ21lbnQuZnJvbShwYXJlbnRUeXBlLnNjaGVtYS50ZXh0KFwiIFwiLCBwYXJlbnRUeXBlLmFsbG93ZWRNYXJrcyhjaGlsZC5tYXJrcykpKSwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxTdGVwcy5wdXNoKG5ldyBSZXBsYWNlU3RlcChjdXIgKyBtLmluZGV4LCBjdXIgKyBtLmluZGV4ICsgbVswXS5sZW5ndGgsIHNsaWNlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1ciA9IGVuZDtcbiAgICB9XG4gICAgaWYgKCFtYXRjaC52YWxpZEVuZCkge1xuICAgICAgICBsZXQgZmlsbCA9IG1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICB0ci5yZXBsYWNlKGN1ciwgY3VyLCBuZXcgU2xpY2UoZmlsbCwgMCwgMCkpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gcmVwbFN0ZXBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICB0ci5zdGVwKHJlcGxTdGVwc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNhbkN1dChub2RlLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIChzdGFydCA9PSAwIHx8IG5vZGUuY2FuUmVwbGFjZShzdGFydCwgbm9kZS5jaGlsZENvdW50KSkgJiZcbiAgICAgICAgKGVuZCA9PSBub2RlLmNoaWxkQ291bnQgfHwgbm9kZS5jYW5SZXBsYWNlKDAsIGVuZCkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHRhcmdldCBkZXB0aCB0byB3aGljaCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2VcbmNhbiBiZSBsaWZ0ZWQuIFdpbGwgbm90IGdvIGFjcm9zc1xuW2lzb2xhdGluZ10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLk5vZGVTcGVjLmlzb2xhdGluZykgcGFyZW50IG5vZGVzLlxuKi9cbmZ1bmN0aW9uIGxpZnRUYXJnZXQocmFuZ2UpIHtcbiAgICBsZXQgcGFyZW50ID0gcmFuZ2UucGFyZW50O1xuICAgIGxldCBjb250ZW50ID0gcGFyZW50LmNvbnRlbnQuY3V0QnlJbmRleChyYW5nZS5zdGFydEluZGV4LCByYW5nZS5lbmRJbmRleCk7XG4gICAgZm9yIChsZXQgZGVwdGggPSByYW5nZS5kZXB0aDs7IC0tZGVwdGgpIHtcbiAgICAgICAgbGV0IG5vZGUgPSByYW5nZS4kZnJvbS5ub2RlKGRlcHRoKTtcbiAgICAgICAgbGV0IGluZGV4ID0gcmFuZ2UuJGZyb20uaW5kZXgoZGVwdGgpLCBlbmRJbmRleCA9IHJhbmdlLiR0by5pbmRleEFmdGVyKGRlcHRoKTtcbiAgICAgICAgaWYgKGRlcHRoIDwgcmFuZ2UuZGVwdGggJiYgbm9kZS5jYW5SZXBsYWNlKGluZGV4LCBlbmRJbmRleCwgY29udGVudCkpXG4gICAgICAgICAgICByZXR1cm4gZGVwdGg7XG4gICAgICAgIGlmIChkZXB0aCA9PSAwIHx8IG5vZGUudHlwZS5zcGVjLmlzb2xhdGluZyB8fCAhY2FuQ3V0KG5vZGUsIGluZGV4LCBlbmRJbmRleCkpXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBsaWZ0KHRyLCByYW5nZSwgdGFyZ2V0KSB7XG4gICAgbGV0IHsgJGZyb20sICR0bywgZGVwdGggfSA9IHJhbmdlO1xuICAgIGxldCBnYXBTdGFydCA9ICRmcm9tLmJlZm9yZShkZXB0aCArIDEpLCBnYXBFbmQgPSAkdG8uYWZ0ZXIoZGVwdGggKyAxKTtcbiAgICBsZXQgc3RhcnQgPSBnYXBTdGFydCwgZW5kID0gZ2FwRW5kO1xuICAgIGxldCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgb3BlblN0YXJ0ID0gMDtcbiAgICBmb3IgKGxldCBkID0gZGVwdGgsIHNwbGl0dGluZyA9IGZhbHNlOyBkID4gdGFyZ2V0OyBkLS0pXG4gICAgICAgIGlmIChzcGxpdHRpbmcgfHwgJGZyb20uaW5kZXgoZCkgPiAwKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYmVmb3JlID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgICAgICBvcGVuU3RhcnQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0LS07XG4gICAgICAgIH1cbiAgICBsZXQgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eSwgb3BlbkVuZCA9IDA7XG4gICAgZm9yIChsZXQgZCA9IGRlcHRoLCBzcGxpdHRpbmcgPSBmYWxzZTsgZCA+IHRhcmdldDsgZC0tKVxuICAgICAgICBpZiAoc3BsaXR0aW5nIHx8ICR0by5hZnRlcihkICsgMSkgPCAkdG8uZW5kKGQpKSB7XG4gICAgICAgICAgICBzcGxpdHRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgYWZ0ZXIgPSBGcmFnbWVudC5mcm9tKCR0by5ub2RlKGQpLmNvcHkoYWZ0ZXIpKTtcbiAgICAgICAgICAgIG9wZW5FbmQrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnQsIGVuZCwgZ2FwU3RhcnQsIGdhcEVuZCwgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBvcGVuU3RhcnQsIG9wZW5FbmQpLCBiZWZvcmUuc2l6ZSAtIG9wZW5TdGFydCwgdHJ1ZSkpO1xufVxuLyoqXG5UcnkgdG8gZmluZCBhIHZhbGlkIHdheSB0byB3cmFwIHRoZSBjb250ZW50IGluIHRoZSBnaXZlbiByYW5nZSBpbiBhXG5ub2RlIG9mIHRoZSBnaXZlbiB0eXBlLiBNYXkgaW50cm9kdWNlIGV4dHJhIG5vZGVzIGFyb3VuZCBhbmQgaW5zaWRlXG50aGUgd3JhcHBlciBub2RlLCBpZiBuZWNlc3NhcnkuIFJldHVybnMgbnVsbCBpZiBubyB2YWxpZCB3cmFwcGluZ1xuY291bGQgYmUgZm91bmQuIFdoZW4gYGlubmVyUmFuZ2VgIGlzIGdpdmVuLCB0aGF0IHJhbmdlJ3MgY29udGVudCBpc1xudXNlZCBhcyB0aGUgY29udGVudCB0byBmaXQgaW50byB0aGUgd3JhcHBpbmcsIGluc3RlYWQgb2YgdGhlXG5jb250ZW50IG9mIGByYW5nZWAuXG4qL1xuZnVuY3Rpb24gZmluZFdyYXBwaW5nKHJhbmdlLCBub2RlVHlwZSwgYXR0cnMgPSBudWxsLCBpbm5lclJhbmdlID0gcmFuZ2UpIHtcbiAgICBsZXQgYXJvdW5kID0gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgbm9kZVR5cGUpO1xuICAgIGxldCBpbm5lciA9IGFyb3VuZCAmJiBmaW5kV3JhcHBpbmdJbnNpZGUoaW5uZXJSYW5nZSwgbm9kZVR5cGUpO1xuICAgIGlmICghaW5uZXIpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcm91bmQubWFwKHdpdGhBdHRycylcbiAgICAgICAgLmNvbmNhdCh7IHR5cGU6IG5vZGVUeXBlLCBhdHRycyB9KS5jb25jYXQoaW5uZXIubWFwKHdpdGhBdHRycykpO1xufVxuZnVuY3Rpb24gd2l0aEF0dHJzKHR5cGUpIHsgcmV0dXJuIHsgdHlwZSwgYXR0cnM6IG51bGwgfTsgfVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nT3V0c2lkZShyYW5nZSwgdHlwZSkge1xuICAgIGxldCB7IHBhcmVudCwgc3RhcnRJbmRleCwgZW5kSW5kZXggfSA9IHJhbmdlO1xuICAgIGxldCBhcm91bmQgPSBwYXJlbnQuY29udGVudE1hdGNoQXQoc3RhcnRJbmRleCkuZmluZFdyYXBwaW5nKHR5cGUpO1xuICAgIGlmICghYXJvdW5kKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgb3V0ZXIgPSBhcm91bmQubGVuZ3RoID8gYXJvdW5kWzBdIDogdHlwZTtcbiAgICByZXR1cm4gcGFyZW50LmNhblJlcGxhY2VXaXRoKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBvdXRlcikgPyBhcm91bmQgOiBudWxsO1xufVxuZnVuY3Rpb24gZmluZFdyYXBwaW5nSW5zaWRlKHJhbmdlLCB0eXBlKSB7XG4gICAgbGV0IHsgcGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCB9ID0gcmFuZ2U7XG4gICAgbGV0IGlubmVyID0gcGFyZW50LmNoaWxkKHN0YXJ0SW5kZXgpO1xuICAgIGxldCBpbnNpZGUgPSB0eXBlLmNvbnRlbnRNYXRjaC5maW5kV3JhcHBpbmcoaW5uZXIudHlwZSk7XG4gICAgaWYgKCFpbnNpZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBsYXN0VHlwZSA9IGluc2lkZS5sZW5ndGggPyBpbnNpZGVbaW5zaWRlLmxlbmd0aCAtIDFdIDogdHlwZTtcbiAgICBsZXQgaW5uZXJNYXRjaCA9IGxhc3RUeXBlLmNvbnRlbnRNYXRjaDtcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaW5uZXJNYXRjaCAmJiBpIDwgZW5kSW5kZXg7IGkrKylcbiAgICAgICAgaW5uZXJNYXRjaCA9IGlubmVyTWF0Y2gubWF0Y2hUeXBlKHBhcmVudC5jaGlsZChpKS50eXBlKTtcbiAgICBpZiAoIWlubmVyTWF0Y2ggfHwgIWlubmVyTWF0Y2gudmFsaWRFbmQpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpbnNpZGU7XG59XG5mdW5jdGlvbiB3cmFwKHRyLCByYW5nZSwgd3JhcHBlcnMpIHtcbiAgICBsZXQgY29udGVudCA9IEZyYWdtZW50LmVtcHR5O1xuICAgIGZvciAobGV0IGkgPSB3cmFwcGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSB3cmFwcGVyc1tpXS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJXcmFwcGVyIHR5cGUgZ2l2ZW4gdG8gVHJhbnNmb3JtLndyYXAgZG9lcyBub3QgZm9ybSB2YWxpZCBjb250ZW50IG9mIGl0cyBwYXJlbnQgd3JhcHBlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gRnJhZ21lbnQuZnJvbSh3cmFwcGVyc1tpXS50eXBlLmNyZWF0ZSh3cmFwcGVyc1tpXS5hdHRycywgY29udGVudCkpO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSByYW5nZS5zdGFydCwgZW5kID0gcmFuZ2UuZW5kO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHN0YXJ0LCBlbmQsIHN0YXJ0LCBlbmQsIG5ldyBTbGljZShjb250ZW50LCAwLCAwKSwgd3JhcHBlcnMubGVuZ3RoLCB0cnVlKSk7XG59XG5mdW5jdGlvbiBzZXRCbG9ja1R5cGUodHIsIGZyb20sIHRvLCB0eXBlLCBhdHRycykge1xuICAgIGlmICghdHlwZS5pc1RleHRibG9jaylcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUeXBlIGdpdmVuIHRvIHNldEJsb2NrVHlwZSBzaG91bGQgYmUgYSB0ZXh0YmxvY2tcIik7XG4gICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgdHIuZG9jLm5vZGVzQmV0d2Vlbihmcm9tLCB0bywgKG5vZGUsIHBvcykgPT4ge1xuICAgICAgICBsZXQgYXR0cnNIZXJlID0gdHlwZW9mIGF0dHJzID09IFwiZnVuY3Rpb25cIiA/IGF0dHJzKG5vZGUpIDogYXR0cnM7XG4gICAgICAgIGlmIChub2RlLmlzVGV4dGJsb2NrICYmICFub2RlLmhhc01hcmt1cCh0eXBlLCBhdHRyc0hlcmUpICYmXG4gICAgICAgICAgICBjYW5DaGFuZ2VUeXBlKHRyLmRvYywgdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zKSwgdHlwZSkpIHtcbiAgICAgICAgICAgIGxldCBjb252ZXJ0TmV3bGluZXMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZSA9IHR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiLCBzdXBwb3J0TGluZWJyZWFrID0gISF0eXBlLmNvbnRlbnRNYXRjaC5tYXRjaFR5cGUodHlwZS5zY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChwcmUgJiYgIXN1cHBvcnRMaW5lYnJlYWspXG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnROZXdsaW5lcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFwcmUgJiYgc3VwcG9ydExpbmVicmVhaylcbiAgICAgICAgICAgICAgICAgICAgY29udmVydE5ld2xpbmVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBhbGwgbWFya3VwIHRoYXQgaXNuJ3QgYWxsb3dlZCBpbiB0aGUgbmV3IG5vZGUgdHlwZSBpcyBjbGVhcmVkXG4gICAgICAgICAgICBpZiAoY29udmVydE5ld2xpbmVzID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICByZXBsYWNlTGluZWJyZWFrcyh0ciwgbm9kZSwgcG9zLCBtYXBGcm9tKTtcbiAgICAgICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRyLCB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MsIDEpLCB0eXBlLCB1bmRlZmluZWQsIGNvbnZlcnROZXdsaW5lcyA9PT0gbnVsbCk7XG4gICAgICAgICAgICBsZXQgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSk7XG4gICAgICAgICAgICBsZXQgc3RhcnRNID0gbWFwcGluZy5tYXAocG9zLCAxKSwgZW5kTSA9IG1hcHBpbmcubWFwKHBvcyArIG5vZGUubm9kZVNpemUsIDEpO1xuICAgICAgICAgICAgdHIuc3RlcChuZXcgUmVwbGFjZUFyb3VuZFN0ZXAoc3RhcnRNLCBlbmRNLCBzdGFydE0gKyAxLCBlbmRNIC0gMSwgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGUoYXR0cnNIZXJlLCBudWxsLCBub2RlLm1hcmtzKSksIDAsIDApLCAxLCB0cnVlKSk7XG4gICAgICAgICAgICBpZiAoY29udmVydE5ld2xpbmVzID09PSB0cnVlKVxuICAgICAgICAgICAgICAgIHJlcGxhY2VOZXdsaW5lcyh0ciwgbm9kZSwgcG9zLCBtYXBGcm9tKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gcmVwbGFjZU5ld2xpbmVzKHRyLCBub2RlLCBwb3MsIG1hcEZyb20pIHtcbiAgICBub2RlLmZvckVhY2goKGNoaWxkLCBvZmZzZXQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLmlzVGV4dCkge1xuICAgICAgICAgICAgbGV0IG0sIG5ld2xpbmUgPSAvXFxyP1xcbnxcXHIvZztcbiAgICAgICAgICAgIHdoaWxlIChtID0gbmV3bGluZS5leGVjKGNoaWxkLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdHIubWFwcGluZy5zbGljZShtYXBGcm9tKS5tYXAocG9zICsgMSArIG9mZnNldCArIG0uaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRyLnJlcGxhY2VXaXRoKHN0YXJ0LCBzdGFydCArIDEsIG5vZGUudHlwZS5zY2hlbWEubGluZWJyZWFrUmVwbGFjZW1lbnQuY3JlYXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXBsYWNlTGluZWJyZWFrcyh0ciwgbm9kZSwgcG9zLCBtYXBGcm9tKSB7XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgb2Zmc2V0KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09IGNoaWxkLnR5cGUuc2NoZW1hLmxpbmVicmVha1JlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0ci5tYXBwaW5nLnNsaWNlKG1hcEZyb20pLm1hcChwb3MgKyAxICsgb2Zmc2V0KTtcbiAgICAgICAgICAgIHRyLnJlcGxhY2VXaXRoKHN0YXJ0LCBzdGFydCArIDEsIG5vZGUudHlwZS5zY2hlbWEudGV4dChcIlxcblwiKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGNhbkNoYW5nZVR5cGUoZG9jLCBwb3MsIHR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyksIGluZGV4ID0gJHBvcy5pbmRleCgpO1xuICAgIHJldHVybiAkcG9zLnBhcmVudC5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXggKyAxLCB0eXBlKTtcbn1cbi8qKlxuQ2hhbmdlIHRoZSB0eXBlLCBhdHRyaWJ1dGVzLCBhbmQvb3IgbWFya3Mgb2YgdGhlIG5vZGUgYXQgYHBvc2AuXG5XaGVuIGB0eXBlYCBpc24ndCBnaXZlbiwgdGhlIGV4aXN0aW5nIG5vZGUgdHlwZSBpcyBwcmVzZXJ2ZWQsXG4qL1xuZnVuY3Rpb24gc2V0Tm9kZU1hcmt1cCh0ciwgcG9zLCB0eXBlLCBhdHRycywgbWFya3MpIHtcbiAgICBsZXQgbm9kZSA9IHRyLmRvYy5ub2RlQXQocG9zKTtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhdCBnaXZlbiBwb3NpdGlvblwiKTtcbiAgICBpZiAoIXR5cGUpXG4gICAgICAgIHR5cGUgPSBub2RlLnR5cGU7XG4gICAgbGV0IG5ld05vZGUgPSB0eXBlLmNyZWF0ZShhdHRycywgbnVsbCwgbWFya3MgfHwgbm9kZS5tYXJrcyk7XG4gICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICByZXR1cm4gdHIucmVwbGFjZVdpdGgocG9zLCBwb3MgKyBub2RlLm5vZGVTaXplLCBuZXdOb2RlKTtcbiAgICBpZiAoIXR5cGUudmFsaWRDb250ZW50KG5vZGUuY29udGVudCkpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBjb250ZW50IGZvciBub2RlIHR5cGUgXCIgKyB0eXBlLm5hbWUpO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VBcm91bmRTdGVwKHBvcywgcG9zICsgbm9kZS5ub2RlU2l6ZSwgcG9zICsgMSwgcG9zICsgbm9kZS5ub2RlU2l6ZSAtIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5ld05vZGUpLCAwLCAwKSwgMSwgdHJ1ZSkpO1xufVxuLyoqXG5DaGVjayB3aGV0aGVyIHNwbGl0dGluZyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgYWxsb3dlZC5cbiovXG5mdW5jdGlvbiBjYW5TcGxpdChkb2MsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBiYXNlID0gJHBvcy5kZXB0aCAtIGRlcHRoO1xuICAgIGxldCBpbm5lclR5cGUgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW3R5cGVzQWZ0ZXIubGVuZ3RoIC0gMV0pIHx8ICRwb3MucGFyZW50O1xuICAgIGlmIChiYXNlIDwgMCB8fCAkcG9zLnBhcmVudC50eXBlLnNwZWMuaXNvbGF0aW5nIHx8XG4gICAgICAgICEkcG9zLnBhcmVudC5jYW5SZXBsYWNlKCRwb3MuaW5kZXgoKSwgJHBvcy5wYXJlbnQuY2hpbGRDb3VudCkgfHxcbiAgICAgICAgIWlubmVyVHlwZS50eXBlLnZhbGlkQ29udGVudCgkcG9zLnBhcmVudC5jb250ZW50LmN1dEJ5SW5kZXgoJHBvcy5pbmRleCgpLCAkcG9zLnBhcmVudC5jaGlsZENvdW50KSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCAtIDEsIGkgPSBkZXB0aCAtIDI7IGQgPiBiYXNlOyBkLS0sIGktLSkge1xuICAgICAgICBsZXQgbm9kZSA9ICRwb3Mubm9kZShkKSwgaW5kZXggPSAkcG9zLmluZGV4KGQpO1xuICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmVzdCA9IG5vZGUuY29udGVudC5jdXRCeUluZGV4KGluZGV4LCBub2RlLmNoaWxkQ291bnQpO1xuICAgICAgICBsZXQgb3ZlcnJpZGVDaGlsZCA9IHR5cGVzQWZ0ZXIgJiYgdHlwZXNBZnRlcltpICsgMV07XG4gICAgICAgIGlmIChvdmVycmlkZUNoaWxkKVxuICAgICAgICAgICAgcmVzdCA9IHJlc3QucmVwbGFjZUNoaWxkKDAsIG92ZXJyaWRlQ2hpbGQudHlwZS5jcmVhdGUob3ZlcnJpZGVDaGlsZC5hdHRycykpO1xuICAgICAgICBsZXQgYWZ0ZXIgPSAodHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyW2ldKSB8fCBub2RlO1xuICAgICAgICBpZiAoIW5vZGUuY2FuUmVwbGFjZShpbmRleCArIDEsIG5vZGUuY2hpbGRDb3VudCkgfHwgIWFmdGVyLnR5cGUudmFsaWRDb250ZW50KHJlc3QpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSAkcG9zLmluZGV4QWZ0ZXIoYmFzZSk7XG4gICAgbGV0IGJhc2VUeXBlID0gdHlwZXNBZnRlciAmJiB0eXBlc0FmdGVyWzBdO1xuICAgIHJldHVybiAkcG9zLm5vZGUoYmFzZSkuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBiYXNlVHlwZSA/IGJhc2VUeXBlLnR5cGUgOiAkcG9zLm5vZGUoYmFzZSArIDEpLnR5cGUpO1xufVxuZnVuY3Rpb24gc3BsaXQodHIsIHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgbGV0ICRwb3MgPSB0ci5kb2MucmVzb2x2ZShwb3MpLCBiZWZvcmUgPSBGcmFnbWVudC5lbXB0eSwgYWZ0ZXIgPSBGcmFnbWVudC5lbXB0eTtcbiAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aCwgZSA9ICRwb3MuZGVwdGggLSBkZXB0aCwgaSA9IGRlcHRoIC0gMTsgZCA+IGU7IGQtLSwgaS0tKSB7XG4gICAgICAgIGJlZm9yZSA9IEZyYWdtZW50LmZyb20oJHBvcy5ub2RlKGQpLmNvcHkoYmVmb3JlKSk7XG4gICAgICAgIGxldCB0eXBlQWZ0ZXIgPSB0eXBlc0FmdGVyICYmIHR5cGVzQWZ0ZXJbaV07XG4gICAgICAgIGFmdGVyID0gRnJhZ21lbnQuZnJvbSh0eXBlQWZ0ZXIgPyB0eXBlQWZ0ZXIudHlwZS5jcmVhdGUodHlwZUFmdGVyLmF0dHJzLCBhZnRlcikgOiAkcG9zLm5vZGUoZCkuY29weShhZnRlcikpO1xuICAgIH1cbiAgICB0ci5zdGVwKG5ldyBSZXBsYWNlU3RlcChwb3MsIHBvcywgbmV3IFNsaWNlKGJlZm9yZS5hcHBlbmQoYWZ0ZXIpLCBkZXB0aCwgZGVwdGgpLCB0cnVlKSk7XG59XG4vKipcblRlc3Qgd2hldGhlciB0aGUgYmxvY2tzIGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBwb3NpdGlvbiBjYW4gYmVcbmpvaW5lZC5cbiovXG5mdW5jdGlvbiBjYW5Kb2luKGRvYywgcG9zKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpLCBpbmRleCA9ICRwb3MuaW5kZXgoKTtcbiAgICByZXR1cm4gam9pbmFibGUoJHBvcy5ub2RlQmVmb3JlLCAkcG9zLm5vZGVBZnRlcikgJiZcbiAgICAgICAgJHBvcy5wYXJlbnQuY2FuUmVwbGFjZShpbmRleCwgaW5kZXggKyAxKTtcbn1cbmZ1bmN0aW9uIGNhbkFwcGVuZFdpdGhTdWJzdGl0dXRlZExpbmVicmVha3MoYSwgYikge1xuICAgIGlmICghYi5jb250ZW50LnNpemUpXG4gICAgICAgIGEudHlwZS5jb21wYXRpYmxlQ29udGVudChiLnR5cGUpO1xuICAgIGxldCBtYXRjaCA9IGEuY29udGVudE1hdGNoQXQoYS5jaGlsZENvdW50KTtcbiAgICBsZXQgeyBsaW5lYnJlYWtSZXBsYWNlbWVudCB9ID0gYS50eXBlLnNjaGVtYTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGIuY2hpbGRDb3VudDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGIuY2hpbGQoaSk7XG4gICAgICAgIGxldCB0eXBlID0gY2hpbGQudHlwZSA9PSBsaW5lYnJlYWtSZXBsYWNlbWVudCA/IGEudHlwZS5zY2hlbWEubm9kZXMudGV4dCA6IGNoaWxkLnR5cGU7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gubWF0Y2hUeXBlKHR5cGUpO1xuICAgICAgICBpZiAoIW1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWEudHlwZS5hbGxvd3NNYXJrcyhjaGlsZC5tYXJrcykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaC52YWxpZEVuZDtcbn1cbmZ1bmN0aW9uIGpvaW5hYmxlKGEsIGIpIHtcbiAgICByZXR1cm4gISEoYSAmJiBiICYmICFhLmlzTGVhZiAmJiBjYW5BcHBlbmRXaXRoU3Vic3RpdHV0ZWRMaW5lYnJlYWtzKGEsIGIpKTtcbn1cbi8qKlxuRmluZCBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcG9zaXRpb24gdGhhdCBjYW4gYmUgam9pbmVkIHRvIHRoZVxuYmxvY2sgYmVmb3JlIChvciBhZnRlciBpZiBgZGlyYCBpcyBwb3NpdGl2ZSkuIFJldHVybnMgdGhlIGpvaW5hYmxlXG5wb2ludCwgaWYgYW55LlxuKi9cbmZ1bmN0aW9uIGpvaW5Qb2ludChkb2MsIHBvcywgZGlyID0gLTEpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGg7OyBkLS0pIHtcbiAgICAgICAgbGV0IGJlZm9yZSwgYWZ0ZXIsIGluZGV4ID0gJHBvcy5pbmRleChkKTtcbiAgICAgICAgaWYgKGQgPT0gJHBvcy5kZXB0aCkge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlQmVmb3JlO1xuICAgICAgICAgICAgYWZ0ZXIgPSAkcG9zLm5vZGVBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkaXIgPiAwKSB7XG4gICAgICAgICAgICBiZWZvcmUgPSAkcG9zLm5vZGUoZCArIDEpO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlKGQpLm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmVmb3JlID0gJHBvcy5ub2RlKGQpLm1heWJlQ2hpbGQoaW5kZXggLSAxKTtcbiAgICAgICAgICAgIGFmdGVyID0gJHBvcy5ub2RlKGQgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVmb3JlICYmICFiZWZvcmUuaXNUZXh0YmxvY2sgJiYgam9pbmFibGUoYmVmb3JlLCBhZnRlcikgJiZcbiAgICAgICAgICAgICRwb3Mubm9kZShkKS5jYW5SZXBsYWNlKGluZGV4LCBpbmRleCArIDEpKVxuICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgaWYgKGQgPT0gMClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBwb3MgPSBkaXIgPCAwID8gJHBvcy5iZWZvcmUoZCkgOiAkcG9zLmFmdGVyKGQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGpvaW4odHIsIHBvcywgZGVwdGgpIHtcbiAgICBsZXQgY29udmVydE5ld2xpbmVzID0gbnVsbDtcbiAgICBsZXQgeyBsaW5lYnJlYWtSZXBsYWNlbWVudCB9ID0gdHIuZG9jLnR5cGUuc2NoZW1hO1xuICAgIGxldCAkYmVmb3JlID0gdHIuZG9jLnJlc29sdmUocG9zIC0gZGVwdGgpLCBiZWZvcmVUeXBlID0gJGJlZm9yZS5ub2RlKCkudHlwZTtcbiAgICBpZiAobGluZWJyZWFrUmVwbGFjZW1lbnQgJiYgYmVmb3JlVHlwZS5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGxldCBwcmUgPSBiZWZvcmVUeXBlLndoaXRlc3BhY2UgPT0gXCJwcmVcIjtcbiAgICAgICAgbGV0IHN1cHBvcnRMaW5lYnJlYWsgPSAhIWJlZm9yZVR5cGUuY29udGVudE1hdGNoLm1hdGNoVHlwZShsaW5lYnJlYWtSZXBsYWNlbWVudCk7XG4gICAgICAgIGlmIChwcmUgJiYgIXN1cHBvcnRMaW5lYnJlYWspXG4gICAgICAgICAgICBjb252ZXJ0TmV3bGluZXMgPSBmYWxzZTtcbiAgICAgICAgZWxzZSBpZiAoIXByZSAmJiBzdXBwb3J0TGluZWJyZWFrKVxuICAgICAgICAgICAgY29udmVydE5ld2xpbmVzID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IG1hcEZyb20gPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgaWYgKGNvbnZlcnROZXdsaW5lcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0ICRhZnRlciA9IHRyLmRvYy5yZXNvbHZlKHBvcyArIGRlcHRoKTtcbiAgICAgICAgcmVwbGFjZUxpbmVicmVha3ModHIsICRhZnRlci5ub2RlKCksICRhZnRlci5iZWZvcmUoKSwgbWFwRnJvbSk7XG4gICAgfVxuICAgIGlmIChiZWZvcmVUeXBlLmlubGluZUNvbnRlbnQpXG4gICAgICAgIGNsZWFySW5jb21wYXRpYmxlKHRyLCBwb3MgKyBkZXB0aCAtIDEsIGJlZm9yZVR5cGUsICRiZWZvcmUubm9kZSgpLmNvbnRlbnRNYXRjaEF0KCRiZWZvcmUuaW5kZXgoKSksIGNvbnZlcnROZXdsaW5lcyA9PSBudWxsKTtcbiAgICBsZXQgbWFwcGluZyA9IHRyLm1hcHBpbmcuc2xpY2UobWFwRnJvbSksIHN0YXJ0ID0gbWFwcGluZy5tYXAocG9zIC0gZGVwdGgpO1xuICAgIHRyLnN0ZXAobmV3IFJlcGxhY2VTdGVwKHN0YXJ0LCBtYXBwaW5nLm1hcChwb3MgKyBkZXB0aCwgLTEpLCBTbGljZS5lbXB0eSwgdHJ1ZSkpO1xuICAgIGlmIChjb252ZXJ0TmV3bGluZXMgPT09IHRydWUpIHtcbiAgICAgICAgbGV0ICRmdWxsID0gdHIuZG9jLnJlc29sdmUoc3RhcnQpO1xuICAgICAgICByZXBsYWNlTmV3bGluZXModHIsICRmdWxsLm5vZGUoKSwgJGZ1bGwuYmVmb3JlKCksIHRyLnN0ZXBzLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiB0cjtcbn1cbi8qKlxuVHJ5IHRvIGZpbmQgYSBwb2ludCB3aGVyZSBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGUgY2FuIGJlIGluc2VydGVkXG5uZWFyIGBwb3NgLCBieSBzZWFyY2hpbmcgdXAgdGhlIG5vZGUgaGllcmFyY2h5IHdoZW4gYHBvc2AgaXRzZWxmXG5pc24ndCBhIHZhbGlkIHBsYWNlIGJ1dCBpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgbm9kZS4gUmV0dXJuXG5udWxsIGlmIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBpbnNlcnRQb2ludChkb2MsIHBvcywgbm9kZVR5cGUpIHtcbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgaWYgKCRwb3MucGFyZW50LmNhblJlcGxhY2VXaXRoKCRwb3MuaW5kZXgoKSwgJHBvcy5pbmRleCgpLCBub2RlVHlwZSkpXG4gICAgICAgIHJldHVybiBwb3M7XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09IDApXG4gICAgICAgIGZvciAobGV0IGQgPSAkcG9zLmRlcHRoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9ICRwb3MuaW5kZXgoZCk7XG4gICAgICAgICAgICBpZiAoJHBvcy5ub2RlKGQpLmNhblJlcGxhY2VXaXRoKGluZGV4LCBpbmRleCwgbm9kZVR5cGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiAkcG9zLmJlZm9yZShkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgaWYgKCRwb3MucGFyZW50T2Zmc2V0ID09ICRwb3MucGFyZW50LmNvbnRlbnQuc2l6ZSlcbiAgICAgICAgZm9yIChsZXQgZCA9ICRwb3MuZGVwdGggLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gJHBvcy5pbmRleEFmdGVyKGQpO1xuICAgICAgICAgICAgaWYgKCRwb3Mubm9kZShkKS5jYW5SZXBsYWNlV2l0aChpbmRleCwgaW5kZXgsIG5vZGVUeXBlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gJHBvcy5hZnRlcihkICsgMSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPCAkcG9zLm5vZGUoZCkuY2hpbGRDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG5GaW5kcyBhIHBvc2l0aW9uIGF0IG9yIGFyb3VuZCB0aGUgZ2l2ZW4gcG9zaXRpb24gd2hlcmUgdGhlIGdpdmVuXG5zbGljZSBjYW4gYmUgaW5zZXJ0ZWQuIFdpbGwgbG9vayBhdCBwYXJlbnQgbm9kZXMnIG5lYXJlc3QgYm91bmRhcnlcbmFuZCB0cnkgdGhlcmUsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIHBvc2l0aW9uIHdhc24ndCBkaXJlY3RseSBhdCB0aGVcbnN0YXJ0IG9yIGVuZCBvZiB0aGF0IG5vZGUuIFJldHVybnMgbnVsbCB3aGVuIG5vIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiovXG5mdW5jdGlvbiBkcm9wUG9pbnQoZG9jLCBwb3MsIHNsaWNlKSB7XG4gICAgbGV0ICRwb3MgPSBkb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICghc2xpY2UuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIGxldCBjb250ZW50ID0gc2xpY2UuY29udGVudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLm9wZW5TdGFydDsgaSsrKVxuICAgICAgICBjb250ZW50ID0gY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQ7XG4gICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gKHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLnNpemUgPyAyIDogMSk7IHBhc3MrKykge1xuICAgICAgICBmb3IgKGxldCBkID0gJHBvcy5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgICAgIGxldCBiaWFzID0gZCA9PSAkcG9zLmRlcHRoID8gMCA6ICRwb3MucG9zIDw9ICgkcG9zLnN0YXJ0KGQgKyAxKSArICRwb3MuZW5kKGQgKyAxKSkgLyAyID8gLTEgOiAxO1xuICAgICAgICAgICAgbGV0IGluc2VydFBvcyA9ICRwb3MuaW5kZXgoZCkgKyAoYmlhcyA+IDAgPyAxIDogMCk7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gJHBvcy5ub2RlKGQpLCBmaXRzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocGFzcyA9PSAxKSB7XG4gICAgICAgICAgICAgICAgZml0cyA9IHBhcmVudC5jYW5SZXBsYWNlKGluc2VydFBvcywgaW5zZXJ0UG9zLCBjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB3cmFwcGluZyA9IHBhcmVudC5jb250ZW50TWF0Y2hBdChpbnNlcnRQb3MpLmZpbmRXcmFwcGluZyhjb250ZW50LmZpcnN0Q2hpbGQudHlwZSk7XG4gICAgICAgICAgICAgICAgZml0cyA9IHdyYXBwaW5nICYmIHBhcmVudC5jYW5SZXBsYWNlV2l0aChpbnNlcnRQb3MsIGluc2VydFBvcywgd3JhcHBpbmdbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpdHMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpYXMgPT0gMCA/ICRwb3MucG9zIDogYmlhcyA8IDAgPyAkcG9zLmJlZm9yZShkICsgMSkgOiAkcG9zLmFmdGVyKGQgKyAxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG7igJhGaXTigJkgYSBzbGljZSBpbnRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50LCBwcm9kdWNpbmcgYVxuW3N0ZXBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uU3RlcCkgdGhhdCBpbnNlcnRzIGl0LiBXaWxsIHJldHVybiBudWxsIGlmXG50aGVyZSdzIG5vIG1lYW5pbmdmdWwgd2F5IHRvIGluc2VydCB0aGUgc2xpY2UgaGVyZSwgb3IgaW5zZXJ0aW5nIGl0XG53b3VsZCBiZSBhIG5vLW9wIChhbiBlbXB0eSBzbGljZSBvdmVyIGFuIGVtcHR5IHJhbmdlKS5cbiovXG5mdW5jdGlvbiByZXBsYWNlU3RlcChkb2MsIGZyb20sIHRvID0gZnJvbSwgc2xpY2UgPSBTbGljZS5lbXB0eSkge1xuICAgIGlmIChmcm9tID09IHRvICYmICFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgJGZyb20gPSBkb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gZG9jLnJlc29sdmUodG8pO1xuICAgIC8vIE9wdGltaXphdGlvbiAtLSBhdm9pZCB3b3JrIGlmIGl0J3Mgb2J2aW91cyB0aGF0IGl0J3Mgbm90IG5lZWRlZC5cbiAgICBpZiAoZml0c1RyaXZpYWxseSgkZnJvbSwgJHRvLCBzbGljZSkpXG4gICAgICAgIHJldHVybiBuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKTtcbiAgICByZXR1cm4gbmV3IEZpdHRlcigkZnJvbSwgJHRvLCBzbGljZSkuZml0KCk7XG59XG5mdW5jdGlvbiBmaXRzVHJpdmlhbGx5KCRmcm9tLCAkdG8sIHNsaWNlKSB7XG4gICAgcmV0dXJuICFzbGljZS5vcGVuU3RhcnQgJiYgIXNsaWNlLm9wZW5FbmQgJiYgJGZyb20uc3RhcnQoKSA9PSAkdG8uc3RhcnQoKSAmJlxuICAgICAgICAkZnJvbS5wYXJlbnQuY2FuUmVwbGFjZSgkZnJvbS5pbmRleCgpLCAkdG8uaW5kZXgoKSwgc2xpY2UuY29udGVudCk7XG59XG4vLyBBbGdvcml0aG0gZm9yICdwbGFjaW5nJyB0aGUgZWxlbWVudHMgb2YgYSBzbGljZSBpbnRvIGEgZ2FwOlxuLy9cbi8vIFdlIGNvbnNpZGVyIHRoZSBjb250ZW50IG9mIGVhY2ggbm9kZSB0aGF0IGlzIG9wZW4gdG8gdGhlIGxlZnQgdG8gYmVcbi8vIGluZGVwZW5kZW50bHkgcGxhY2VhYmxlLiBJLmUuIGluIDxwKFwiZm9vXCIpLCBwKFwiYmFyXCIpPiwgd2hlbiB0aGVcbi8vIHBhcmFncmFwaCBvbiB0aGUgbGVmdCBpcyBvcGVuLCBcImZvb1wiIGNhbiBiZSBwbGFjZWQgKHNvbWV3aGVyZSBvblxuLy8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQgZ2FwKSBpbmRlcGVuZGVudGx5IGZyb20gcChcImJhclwiKS5cbi8vXG4vLyBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgc3RhdGUgb2YgdGhlIHBsYWNlbWVudCBwcm9ncmVzcyBpbiB0aGVcbi8vIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuLy9cbi8vICAtIGBmcm9udGllcmAgaG9sZHMgYSBzdGFjayBvZiBge3R5cGUsIG1hdGNofWAgb2JqZWN0cyB0aGF0XG4vLyAgICByZXByZXNlbnQgdGhlIG9wZW4gc2lkZSBvZiB0aGUgcmVwbGFjZW1lbnQuIEl0IHN0YXJ0cyBhdFxuLy8gICAgYCRmcm9tYCwgdGhlbiBtb3ZlcyBmb3J3YXJkIGFzIGNvbnRlbnQgaXMgcGxhY2VkLCBhbmQgaXMgZmluYWxseVxuLy8gICAgcmVjb25jaWxlZCB3aXRoIGAkdG9gLlxuLy9cbi8vICAtIGB1bnBsYWNlZGAgaXMgYSBzbGljZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnQgdGhhdCBoYXNuJ3Rcbi8vICAgIGJlZW4gcGxhY2VkIHlldC5cbi8vXG4vLyAgLSBgcGxhY2VkYCBpcyBhIGZyYWdtZW50IG9mIHBsYWNlZCBjb250ZW50LiBJdHMgb3Blbi1zdGFydCB2YWx1ZVxuLy8gICAgaXMgaW1wbGljaXQgaW4gYCRmcm9tYCwgYW5kIGl0cyBvcGVuLWVuZCB2YWx1ZSBpbiBgZnJvbnRpZXJgLlxuY2xhc3MgRml0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigkZnJvbSwgJHRvLCB1bnBsYWNlZCkge1xuICAgICAgICB0aGlzLiRmcm9tID0gJGZyb207XG4gICAgICAgIHRoaXMuJHRvID0gJHRvO1xuICAgICAgICB0aGlzLnVucGxhY2VkID0gdW5wbGFjZWQ7XG4gICAgICAgIHRoaXMuZnJvbnRpZXIgPSBbXTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gJGZyb20uZGVwdGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSAkZnJvbS5ub2RlKGkpO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICAgICAgbWF0Y2g6IG5vZGUuY29udGVudE1hdGNoQXQoJGZyb20uaW5kZXhBZnRlcihpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAkZnJvbS5kZXB0aDsgaSA+IDA7IGktLSlcbiAgICAgICAgICAgIHRoaXMucGxhY2VkID0gRnJhZ21lbnQuZnJvbSgkZnJvbS5ub2RlKGkpLmNvcHkodGhpcy5wbGFjZWQpKTtcbiAgICB9XG4gICAgZ2V0IGRlcHRoKCkgeyByZXR1cm4gdGhpcy5mcm9udGllci5sZW5ndGggLSAxOyB9XG4gICAgZml0KCkge1xuICAgICAgICAvLyBBcyBsb25nIGFzIHRoZXJlJ3MgdW5wbGFjZWQgY29udGVudCwgdHJ5IHRvIHBsYWNlIHNvbWUgb2YgaXQuXG4gICAgICAgIC8vIElmIHRoYXQgZmFpbHMsIGVpdGhlciBpbmNyZWFzZSB0aGUgb3BlbiBzY29yZSBvZiB0aGUgdW5wbGFjZWRcbiAgICAgICAgLy8gc2xpY2UsIG9yIGRyb3Agbm9kZXMgZnJvbSBpdCwgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICB3aGlsZSAodGhpcy51bnBsYWNlZC5zaXplKSB7XG4gICAgICAgICAgICBsZXQgZml0ID0gdGhpcy5maW5kRml0dGFibGUoKTtcbiAgICAgICAgICAgIGlmIChmaXQpXG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZU5vZGVzKGZpdCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuTW9yZSgpIHx8IHRoaXMuZHJvcE5vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoZXJlJ3MgaW5saW5lIGNvbnRlbnQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGZyb250aWVyIF9hbmRfXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIGB0aGlzLiR0b2AsIHdlIG11c3QgZ2VuZXJhdGUgYSBgUmVwbGFjZUFyb3VuZGBcbiAgICAgICAgLy8gc3RlcCB0aGF0IHB1bGxzIHRoYXQgY29udGVudCBpbnRvIHRoZSBub2RlIGFmdGVyIHRoZSBmcm9udGllci5cbiAgICAgICAgLy8gVGhhdCBtZWFucyB0aGUgZml0dGluZyBtdXN0IGJlIGRvbmUgdG8gdGhlIGVuZCBvZiB0aGUgdGV4dGJsb2NrXG4gICAgICAgIC8vIG5vZGUgYWZ0ZXIgYHRoaXMuJHRvYCwgbm90IGB0aGlzLiR0b2AgaXRzZWxmLlxuICAgICAgICBsZXQgbW92ZUlubGluZSA9IHRoaXMubXVzdE1vdmVJbmxpbmUoKSwgcGxhY2VkU2l6ZSA9IHRoaXMucGxhY2VkLnNpemUgLSB0aGlzLmRlcHRoIC0gdGhpcy4kZnJvbS5kZXB0aDtcbiAgICAgICAgbGV0ICRmcm9tID0gdGhpcy4kZnJvbSwgJHRvID0gdGhpcy5jbG9zZShtb3ZlSW5saW5lIDwgMCA/IHRoaXMuJHRvIDogJGZyb20uZG9jLnJlc29sdmUobW92ZUlubGluZSkpO1xuICAgICAgICBpZiAoISR0bylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvLyBJZiBjbG9zaW5nIHRvIGAkdG9gIHN1Y2NlZWRlZCwgY3JlYXRlIGEgc3RlcFxuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMucGxhY2VkLCBvcGVuU3RhcnQgPSAkZnJvbS5kZXB0aCwgb3BlbkVuZCA9ICR0by5kZXB0aDtcbiAgICAgICAgd2hpbGUgKG9wZW5TdGFydCAmJiBvcGVuRW5kICYmIGNvbnRlbnQuY2hpbGRDb3VudCA9PSAxKSB7IC8vIE5vcm1hbGl6ZSBieSBkcm9wcGluZyBvcGVuIHBhcmVudCBub2Rlc1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgICAgICAgICAgb3BlblN0YXJ0LS07XG4gICAgICAgICAgICBvcGVuRW5kLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNsaWNlID0gbmV3IFNsaWNlKGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCk7XG4gICAgICAgIGlmIChtb3ZlSW5saW5lID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGxhY2VBcm91bmRTdGVwKCRmcm9tLnBvcywgbW92ZUlubGluZSwgdGhpcy4kdG8ucG9zLCB0aGlzLiR0by5lbmQoKSwgc2xpY2UsIHBsYWNlZFNpemUpO1xuICAgICAgICBpZiAoc2xpY2Uuc2l6ZSB8fCAkZnJvbS5wb3MgIT0gdGhpcy4kdG8ucG9zKSAvLyBEb24ndCBnZW5lcmF0ZSBuby1vcCBzdGVwc1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBsYWNlU3RlcCgkZnJvbS5wb3MsICR0by5wb3MsIHNsaWNlKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEZpbmQgYSBwb3NpdGlvbiBvbiB0aGUgc3RhcnQgc3BpbmUgb2YgYHRoaXMudW5wbGFjZWRgIHRoYXQgaGFzXG4gICAgLy8gY29udGVudCB0aGF0IGNhbiBiZSBtb3ZlZCBzb21ld2hlcmUgb24gdGhlIGZyb250aWVyLiBSZXR1cm5zIHR3b1xuICAgIC8vIGRlcHRocywgb25lIGZvciB0aGUgc2xpY2UgYW5kIG9uZSBmb3IgdGhlIGZyb250aWVyLlxuICAgIGZpbmRGaXR0YWJsZSgpIHtcbiAgICAgICAgbGV0IHN0YXJ0RGVwdGggPSB0aGlzLnVucGxhY2VkLm9wZW5TdGFydDtcbiAgICAgICAgZm9yIChsZXQgY3VyID0gdGhpcy51bnBsYWNlZC5jb250ZW50LCBkID0gMCwgb3BlbkVuZCA9IHRoaXMudW5wbGFjZWQub3BlbkVuZDsgZCA8IHN0YXJ0RGVwdGg7IGQrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGlmIChjdXIuY2hpbGRDb3VudCA+IDEpXG4gICAgICAgICAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nICYmIG9wZW5FbmQgPD0gZCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGVwdGggPSBkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgdHJ5IHdyYXBwaW5nIG5vZGVzIChwYXNzIDIpIGFmdGVyIGZpbmRpbmcgYSBwbGFjZSB3aXRob3V0XG4gICAgICAgIC8vIHdyYXBwaW5nIGZhaWxlZC5cbiAgICAgICAgZm9yIChsZXQgcGFzcyA9IDE7IHBhc3MgPD0gMjsgcGFzcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzbGljZURlcHRoID0gcGFzcyA9PSAxID8gc3RhcnREZXB0aCA6IHRoaXMudW5wbGFjZWQub3BlblN0YXJ0OyBzbGljZURlcHRoID49IDA7IHNsaWNlRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgIGxldCBmcmFnbWVudCwgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoc2xpY2VEZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBjb250ZW50QXQodGhpcy51bnBsYWNlZC5jb250ZW50LCBzbGljZURlcHRoIC0gMSkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBwYXJlbnQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy51bnBsYWNlZC5jb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGZyb250aWVyRGVwdGggPSB0aGlzLmRlcHRoOyBmcm9udGllckRlcHRoID49IDA7IGZyb250aWVyRGVwdGgtLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyB0eXBlLCBtYXRjaCB9ID0gdGhpcy5mcm9udGllcltmcm9udGllckRlcHRoXSwgd3JhcCwgaW5qZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAxLCBpZiB0aGUgbmV4dCBub2RlIG1hdGNoZXMsIG9yIHRoZXJlIGlzIG5vIG5leHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSBidXQgdGhlIHBhcmVudHMgbG9vayBjb21wYXRpYmxlLCB3ZSd2ZSBmb3VuZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIHBsYWNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAxICYmIChmaXJzdCA/IG1hdGNoLm1hdGNoVHlwZShmaXJzdC50eXBlKSB8fCAoaW5qZWN0ID0gbWF0Y2guZmlsbEJlZm9yZShGcmFnbWVudC5mcm9tKGZpcnN0KSwgZmFsc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnQgJiYgdHlwZS5jb21wYXRpYmxlQ29udGVudChwYXJlbnQudHlwZSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2xpY2VEZXB0aCwgZnJvbnRpZXJEZXB0aCwgcGFyZW50LCBpbmplY3QgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gcGFzcyAyLCBsb29rIGZvciBhIHNldCBvZiB3cmFwcGluZyBub2RlcyB0aGF0IG1ha2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYGZpcnN0YCBmaXQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFzcyA9PSAyICYmIGZpcnN0ICYmICh3cmFwID0gbWF0Y2guZmluZFdyYXBwaW5nKGZpcnN0LnR5cGUpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgd3JhcCB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBjb250aW51ZSBsb29raW5nIGZ1cnRoZXIgdXAgaWYgdGhlIHBhcmVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGZpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIG1hdGNoLm1hdGNoVHlwZShwYXJlbnQudHlwZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3Blbk1vcmUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmICghaW5uZXIuY2hpbGRDb3VudCB8fCBpbm5lci5maXJzdENoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShjb250ZW50LCBvcGVuU3RhcnQgKyAxLCBNYXRoLm1heChvcGVuRW5kLCBpbm5lci5zaXplICsgb3BlblN0YXJ0ID49IGNvbnRlbnQuc2l6ZSAtIG9wZW5FbmQgPyBvcGVuU3RhcnQgKyAxIDogMCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZHJvcE5vZGUoKSB7XG4gICAgICAgIGxldCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gdGhpcy51bnBsYWNlZDtcbiAgICAgICAgbGV0IGlubmVyID0gY29udGVudEF0KGNvbnRlbnQsIG9wZW5TdGFydCk7XG4gICAgICAgIGlmIChpbm5lci5jaGlsZENvdW50IDw9IDEgJiYgb3BlblN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgbGV0IG9wZW5BdEVuZCA9IGNvbnRlbnQuc2l6ZSAtIG9wZW5TdGFydCA8PSBvcGVuU3RhcnQgKyBpbm5lci5zaXplO1xuICAgICAgICAgICAgdGhpcy51bnBsYWNlZCA9IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KGNvbnRlbnQsIG9wZW5TdGFydCAtIDEsIDEpLCBvcGVuU3RhcnQgLSAxLCBvcGVuQXRFbmQgPyBvcGVuU3RhcnQgLSAxIDogb3BlbkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnVucGxhY2VkID0gbmV3IFNsaWNlKGRyb3BGcm9tRnJhZ21lbnQoY29udGVudCwgb3BlblN0YXJ0LCAxKSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNb3ZlIGNvbnRlbnQgZnJvbSB0aGUgdW5wbGFjZWQgc2xpY2UgYXQgYHNsaWNlRGVwdGhgIHRvIHRoZVxuICAgIC8vIGZyb250aWVyIG5vZGUgYXQgYGZyb250aWVyRGVwdGhgLiBDbG9zZSB0aGF0IGZyb250aWVyIG5vZGUgd2hlblxuICAgIC8vIGFwcGxpY2FibGUuXG4gICAgcGxhY2VOb2Rlcyh7IHNsaWNlRGVwdGgsIGZyb250aWVyRGVwdGgsIHBhcmVudCwgaW5qZWN0LCB3cmFwIH0pIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVwdGggPiBmcm9udGllckRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAod3JhcClcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5Gcm9udGllck5vZGUod3JhcFtpXSk7XG4gICAgICAgIGxldCBzbGljZSA9IHRoaXMudW5wbGFjZWQsIGZyYWdtZW50ID0gcGFyZW50ID8gcGFyZW50LmNvbnRlbnQgOiBzbGljZS5jb250ZW50O1xuICAgICAgICBsZXQgb3BlblN0YXJ0ID0gc2xpY2Uub3BlblN0YXJ0IC0gc2xpY2VEZXB0aDtcbiAgICAgICAgbGV0IHRha2VuID0gMCwgYWRkID0gW107XG4gICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdO1xuICAgICAgICBpZiAoaW5qZWN0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdC5jaGlsZENvdW50OyBpKyspXG4gICAgICAgICAgICAgICAgYWRkLnB1c2goaW5qZWN0LmNoaWxkKGkpKTtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2gubWF0Y2hGcmFnbWVudChpbmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXB1dGVzIHRoZSBhbW91bnQgb2YgKGVuZCkgb3BlbiBub2RlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICAgICAgICAvLyBmcmFnbWVudC4gV2hlbiAwLCB0aGUgcGFyZW50IGlzIG9wZW4sIGJ1dCBubyBtb3JlLiBXaGVuXG4gICAgICAgIC8vIG5lZ2F0aXZlLCBub3RoaW5nIGlzIG9wZW4uXG4gICAgICAgIGxldCBvcGVuRW5kQ291bnQgPSAoZnJhZ21lbnQuc2l6ZSArIHNsaWNlRGVwdGgpIC0gKHNsaWNlLmNvbnRlbnQuc2l6ZSAtIHNsaWNlLm9wZW5FbmQpO1xuICAgICAgICAvLyBTY2FuIG92ZXIgdGhlIGZyYWdtZW50LCBmaXR0aW5nIGFzIG1hbnkgY2hpbGQgbm9kZXMgYXNcbiAgICAgICAgLy8gcG9zc2libGUuXG4gICAgICAgIHdoaWxlICh0YWtlbiA8IGZyYWdtZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZnJhZ21lbnQuY2hpbGQodGFrZW4pLCBtYXRjaGVzID0gbWF0Y2gubWF0Y2hUeXBlKG5leHQudHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB0YWtlbisrO1xuICAgICAgICAgICAgaWYgKHRha2VuID4gMSB8fCBvcGVuU3RhcnQgPT0gMCB8fCBuZXh0LmNvbnRlbnQuc2l6ZSkgeyAvLyBEcm9wIGVtcHR5IG9wZW4gbm9kZXNcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXM7XG4gICAgICAgICAgICAgICAgYWRkLnB1c2goY2xvc2VOb2RlU3RhcnQobmV4dC5tYXJrKHR5cGUuYWxsb3dlZE1hcmtzKG5leHQubWFya3MpKSwgdGFrZW4gPT0gMSA/IG9wZW5TdGFydCA6IDAsIHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQgPyBvcGVuRW5kQ291bnQgOiAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB0b0VuZCA9IHRha2VuID09IGZyYWdtZW50LmNoaWxkQ291bnQ7XG4gICAgICAgIGlmICghdG9FbmQpXG4gICAgICAgICAgICBvcGVuRW5kQ291bnQgPSAtMTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCBmcm9udGllckRlcHRoLCBGcmFnbWVudC5mcm9tKGFkZCkpO1xuICAgICAgICB0aGlzLmZyb250aWVyW2Zyb250aWVyRGVwdGhdLm1hdGNoID0gbWF0Y2g7XG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgdHlwZXMgbWF0Y2gsIGFuZCB0aGUgZW50aXJlIG5vZGUgd2FzIG1vdmVkLCBhbmRcbiAgICAgICAgLy8gaXQncyBub3Qgb3BlbiwgY2xvc2UgdGhpcyBmcm9udGllciBub2RlIHJpZ2h0IGF3YXkuXG4gICAgICAgIGlmICh0b0VuZCAmJiBvcGVuRW5kQ291bnQgPCAwICYmIHBhcmVudCAmJiBwYXJlbnQudHlwZSA9PSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLnR5cGUgJiYgdGhpcy5mcm9udGllci5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICAvLyBBZGQgbmV3IGZyb250aWVyIG5vZGVzIGZvciBhbnkgb3BlbiBub2RlcyBhdCB0aGUgZW5kLlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgY3VyID0gZnJhZ21lbnQ7IGkgPCBvcGVuRW5kQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSBjdXIubGFzdENoaWxkO1xuICAgICAgICAgICAgdGhpcy5mcm9udGllci5wdXNoKHsgdHlwZTogbm9kZS50eXBlLCBtYXRjaDogbm9kZS5jb250ZW50TWF0Y2hBdChub2RlLmNoaWxkQ291bnQpIH0pO1xuICAgICAgICAgICAgY3VyID0gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBgdGhpcy51bnBsYWNlZGAuIERyb3AgdGhlIGVudGlyZSBub2RlIGZyb20gd2hpY2ggd2VcbiAgICAgICAgLy8gcGxhY2VkIGl0IHdlIGdvdCB0byBpdHMgZW5kLCBvdGhlcndpc2UganVzdCBkcm9wIHRoZSBwbGFjZWRcbiAgICAgICAgLy8gbm9kZXMuXG4gICAgICAgIHRoaXMudW5wbGFjZWQgPSAhdG9FbmQgPyBuZXcgU2xpY2UoZHJvcEZyb21GcmFnbWVudChzbGljZS5jb250ZW50LCBzbGljZURlcHRoLCB0YWtlbiksIHNsaWNlLm9wZW5TdGFydCwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgICAgIDogc2xpY2VEZXB0aCA9PSAwID8gU2xpY2UuZW1wdHlcbiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZShkcm9wRnJvbUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIHNsaWNlRGVwdGggLSAxLCAxKSwgc2xpY2VEZXB0aCAtIDEsIG9wZW5FbmRDb3VudCA8IDAgPyBzbGljZS5vcGVuRW5kIDogc2xpY2VEZXB0aCAtIDEpO1xuICAgIH1cbiAgICBtdXN0TW92ZUlubGluZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiR0by5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLmZyb250aWVyW3RoaXMuZGVwdGhdLCBsZXZlbDtcbiAgICAgICAgaWYgKCF0b3AudHlwZS5pc1RleHRibG9jayB8fCAhY29udGVudEFmdGVyRml0cyh0aGlzLiR0bywgdGhpcy4kdG8uZGVwdGgsIHRvcC50eXBlLCB0b3AubWF0Y2gsIGZhbHNlKSB8fFxuICAgICAgICAgICAgKHRoaXMuJHRvLmRlcHRoID09IHRoaXMuZGVwdGggJiYgKGxldmVsID0gdGhpcy5maW5kQ2xvc2VMZXZlbCh0aGlzLiR0bykpICYmIGxldmVsLmRlcHRoID09IHRoaXMuZGVwdGgpKVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBsZXQgeyBkZXB0aCB9ID0gdGhpcy4kdG8sIGFmdGVyID0gdGhpcy4kdG8uYWZ0ZXIoZGVwdGgpO1xuICAgICAgICB3aGlsZSAoZGVwdGggPiAxICYmIGFmdGVyID09IHRoaXMuJHRvLmVuZCgtLWRlcHRoKSlcbiAgICAgICAgICAgICsrYWZ0ZXI7XG4gICAgICAgIHJldHVybiBhZnRlcjtcbiAgICB9XG4gICAgZmluZENsb3NlTGV2ZWwoJHRvKSB7XG4gICAgICAgIHNjYW46IGZvciAobGV0IGkgPSBNYXRoLm1pbih0aGlzLmRlcHRoLCAkdG8uZGVwdGgpOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHsgbWF0Y2gsIHR5cGUgfSA9IHRoaXMuZnJvbnRpZXJbaV07XG4gICAgICAgICAgICBsZXQgZHJvcElubmVyID0gaSA8ICR0by5kZXB0aCAmJiAkdG8uZW5kKGkgKyAxKSA9PSAkdG8ucG9zICsgKCR0by5kZXB0aCAtIChpICsgMSkpO1xuICAgICAgICAgICAgbGV0IGZpdCA9IGNvbnRlbnRBZnRlckZpdHMoJHRvLCBpLCB0eXBlLCBtYXRjaCwgZHJvcElubmVyKTtcbiAgICAgICAgICAgIGlmICghZml0KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgZCA9IGkgLSAxOyBkID49IDA7IGQtLSkge1xuICAgICAgICAgICAgICAgIGxldCB7IG1hdGNoLCB0eXBlIH0gPSB0aGlzLmZyb250aWVyW2RdO1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gY29udGVudEFmdGVyRml0cygkdG8sIGQsIHR5cGUsIG1hdGNoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlcy5jaGlsZENvdW50KVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzY2FuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGVwdGg6IGksIGZpdCwgbW92ZTogZHJvcElubmVyID8gJHRvLmRvYy5yZXNvbHZlKCR0by5hZnRlcihpICsgMSkpIDogJHRvIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xvc2UoJHRvKSB7XG4gICAgICAgIGxldCBjbG9zZSA9IHRoaXMuZmluZENsb3NlTGV2ZWwoJHRvKTtcbiAgICAgICAgaWYgKCFjbG9zZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB3aGlsZSAodGhpcy5kZXB0aCA+IGNsb3NlLmRlcHRoKVxuICAgICAgICAgICAgdGhpcy5jbG9zZUZyb250aWVyTm9kZSgpO1xuICAgICAgICBpZiAoY2xvc2UuZml0LmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIGNsb3NlLmRlcHRoLCBjbG9zZS5maXQpO1xuICAgICAgICAkdG8gPSBjbG9zZS5tb3ZlO1xuICAgICAgICBmb3IgKGxldCBkID0gY2xvc2UuZGVwdGggKyAxOyBkIDw9ICR0by5kZXB0aDsgZCsrKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGQpLCBhZGQgPSBub2RlLnR5cGUuY29udGVudE1hdGNoLmZpbGxCZWZvcmUobm9kZS5jb250ZW50LCB0cnVlLCAkdG8uaW5kZXgoZCkpO1xuICAgICAgICAgICAgdGhpcy5vcGVuRnJvbnRpZXJOb2RlKG5vZGUudHlwZSwgbm9kZS5hdHRycywgYWRkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJHRvO1xuICAgIH1cbiAgICBvcGVuRnJvbnRpZXJOb2RlKHR5cGUsIGF0dHJzID0gbnVsbCwgY29udGVudCkge1xuICAgICAgICBsZXQgdG9wID0gdGhpcy5mcm9udGllclt0aGlzLmRlcHRoXTtcbiAgICAgICAgdG9wLm1hdGNoID0gdG9wLm1hdGNoLm1hdGNoVHlwZSh0eXBlKTtcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBhZGRUb0ZyYWdtZW50KHRoaXMucGxhY2VkLCB0aGlzLmRlcHRoLCBGcmFnbWVudC5mcm9tKHR5cGUuY3JlYXRlKGF0dHJzLCBjb250ZW50KSkpO1xuICAgICAgICB0aGlzLmZyb250aWVyLnB1c2goeyB0eXBlLCBtYXRjaDogdHlwZS5jb250ZW50TWF0Y2ggfSk7XG4gICAgfVxuICAgIGNsb3NlRnJvbnRpZXJOb2RlKCkge1xuICAgICAgICBsZXQgb3BlbiA9IHRoaXMuZnJvbnRpZXIucG9wKCk7XG4gICAgICAgIGxldCBhZGQgPSBvcGVuLm1hdGNoLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpO1xuICAgICAgICBpZiAoYWRkLmNoaWxkQ291bnQpXG4gICAgICAgICAgICB0aGlzLnBsYWNlZCA9IGFkZFRvRnJhZ21lbnQodGhpcy5wbGFjZWQsIHRoaXMuZnJvbnRpZXIubGVuZ3RoLCBhZGQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRyb3BGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBjb3VudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuY3V0QnlJbmRleChjb3VudCwgZnJhZ21lbnQuY2hpbGRDb3VudCk7XG4gICAgcmV0dXJuIGZyYWdtZW50LnJlcGxhY2VDaGlsZCgwLCBmcmFnbWVudC5maXJzdENoaWxkLmNvcHkoZHJvcEZyb21GcmFnbWVudChmcmFnbWVudC5maXJzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY291bnQpKSk7XG59XG5mdW5jdGlvbiBhZGRUb0ZyYWdtZW50KGZyYWdtZW50LCBkZXB0aCwgY29udGVudCkge1xuICAgIGlmIChkZXB0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIGZyYWdtZW50Lmxhc3RDaGlsZC5jb3B5KGFkZFRvRnJhZ21lbnQoZnJhZ21lbnQubGFzdENoaWxkLmNvbnRlbnQsIGRlcHRoIC0gMSwgY29udGVudCkpKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBdChmcmFnbWVudCwgZGVwdGgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZC5jb250ZW50O1xuICAgIHJldHVybiBmcmFnbWVudDtcbn1cbmZ1bmN0aW9uIGNsb3NlTm9kZVN0YXJ0KG5vZGUsIG9wZW5TdGFydCwgb3BlbkVuZCkge1xuICAgIGlmIChvcGVuU3RhcnQgPD0gMClcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgbGV0IGZyYWcgPSBub2RlLmNvbnRlbnQ7XG4gICAgaWYgKG9wZW5TdGFydCA+IDEpXG4gICAgICAgIGZyYWcgPSBmcmFnLnJlcGxhY2VDaGlsZCgwLCBjbG9zZU5vZGVTdGFydChmcmFnLmZpcnN0Q2hpbGQsIG9wZW5TdGFydCAtIDEsIGZyYWcuY2hpbGRDb3VudCA9PSAxID8gb3BlbkVuZCAtIDEgOiAwKSk7XG4gICAgaWYgKG9wZW5TdGFydCA+IDApIHtcbiAgICAgICAgZnJhZyA9IG5vZGUudHlwZS5jb250ZW50TWF0Y2guZmlsbEJlZm9yZShmcmFnKS5hcHBlbmQoZnJhZyk7XG4gICAgICAgIGlmIChvcGVuRW5kIDw9IDApXG4gICAgICAgICAgICBmcmFnID0gZnJhZy5hcHBlbmQobm9kZS50eXBlLmNvbnRlbnRNYXRjaC5tYXRjaEZyYWdtZW50KGZyYWcpLmZpbGxCZWZvcmUoRnJhZ21lbnQuZW1wdHksIHRydWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnKTtcbn1cbmZ1bmN0aW9uIGNvbnRlbnRBZnRlckZpdHMoJHRvLCBkZXB0aCwgdHlwZSwgbWF0Y2gsIG9wZW4pIHtcbiAgICBsZXQgbm9kZSA9ICR0by5ub2RlKGRlcHRoKSwgaW5kZXggPSBvcGVuID8gJHRvLmluZGV4QWZ0ZXIoZGVwdGgpIDogJHRvLmluZGV4KGRlcHRoKTtcbiAgICBpZiAoaW5kZXggPT0gbm9kZS5jaGlsZENvdW50ICYmICF0eXBlLmNvbXBhdGlibGVDb250ZW50KG5vZGUudHlwZSkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCBmaXQgPSBtYXRjaC5maWxsQmVmb3JlKG5vZGUuY29udGVudCwgdHJ1ZSwgaW5kZXgpO1xuICAgIHJldHVybiBmaXQgJiYgIWludmFsaWRNYXJrcyh0eXBlLCBub2RlLmNvbnRlbnQsIGluZGV4KSA/IGZpdCA6IG51bGw7XG59XG5mdW5jdGlvbiBpbnZhbGlkTWFya3ModHlwZSwgZnJhZ21lbnQsIHN0YXJ0KSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZnJhZ21lbnQuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuYWxsb3dzTWFya3MoZnJhZ21lbnQuY2hpbGQoaSkubWFya3MpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZGVmaW5lc0NvbnRlbnQodHlwZSkge1xuICAgIHJldHVybiB0eXBlLnNwZWMuZGVmaW5pbmcgfHwgdHlwZS5zcGVjLmRlZmluaW5nRm9yQ29udGVudDtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZSh0ciwgZnJvbSwgdG8sIHNsaWNlKSB7XG4gICAgaWYgKCFzbGljZS5zaXplKVxuICAgICAgICByZXR1cm4gdHIuZGVsZXRlUmFuZ2UoZnJvbSwgdG8pO1xuICAgIGxldCAkZnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pLCAkdG8gPSB0ci5kb2MucmVzb2x2ZSh0byk7XG4gICAgaWYgKGZpdHNUcml2aWFsbHkoJGZyb20sICR0bywgc2xpY2UpKVxuICAgICAgICByZXR1cm4gdHIuc3RlcChuZXcgUmVwbGFjZVN0ZXAoZnJvbSwgdG8sIHNsaWNlKSk7XG4gICAgbGV0IHRhcmdldERlcHRocyA9IGNvdmVyZWREZXB0aHMoJGZyb20sIHRyLmRvYy5yZXNvbHZlKHRvKSk7XG4gICAgLy8gQ2FuJ3QgcmVwbGFjZSB0aGUgd2hvbGUgZG9jdW1lbnQsIHNvIHJlbW92ZSAwIGlmIGl0J3MgcHJlc2VudFxuICAgIGlmICh0YXJnZXREZXB0aHNbdGFyZ2V0RGVwdGhzLmxlbmd0aCAtIDFdID09IDApXG4gICAgICAgIHRhcmdldERlcHRocy5wb3AoKTtcbiAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIHJlcHJlc2VudCBub3QgZXhwYW5zaW9uIG92ZXIgdGhlIHdob2xlIG5vZGUgYXRcbiAgICAvLyB0aGF0IGRlcHRoLCBidXQgcmVwbGFjaW5nIGZyb20gJGZyb20uYmVmb3JlKC1EKSB0byAkdG8ucG9zLlxuICAgIGxldCBwcmVmZXJyZWRUYXJnZXQgPSAtKCRmcm9tLmRlcHRoICsgMSk7XG4gICAgdGFyZ2V0RGVwdGhzLnVuc2hpZnQocHJlZmVycmVkVGFyZ2V0KTtcbiAgICAvLyBUaGlzIGxvb3AgcGlja3MgYSBwcmVmZXJyZWQgdGFyZ2V0IGRlcHRoLCBpZiBvbmUgb2YgdGhlIGNvdmVyaW5nXG4gICAgLy8gZGVwdGhzIGlzIG5vdCBvdXRzaWRlIG9mIGEgZGVmaW5pbmcgbm9kZSwgYW5kIGFkZHMgbmVnYXRpdmVcbiAgICAvLyBkZXB0aHMgZm9yIGFueSBkZXB0aCB0aGF0IGhhcyAkZnJvbSBhdCBpdHMgc3RhcnQgYW5kIGRvZXMgbm90XG4gICAgLy8gY3Jvc3MgYSBkZWZpbmluZyBub2RlLlxuICAgIGZvciAobGV0IGQgPSAkZnJvbS5kZXB0aCwgcG9zID0gJGZyb20ucG9zIC0gMTsgZCA+IDA7IGQtLSwgcG9zLS0pIHtcbiAgICAgICAgbGV0IHNwZWMgPSAkZnJvbS5ub2RlKGQpLnR5cGUuc3BlYztcbiAgICAgICAgaWYgKHNwZWMuZGVmaW5pbmcgfHwgc3BlYy5kZWZpbmluZ0FzQ29udGV4dCB8fCBzcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodGFyZ2V0RGVwdGhzLmluZGV4T2YoZCkgPiAtMSlcbiAgICAgICAgICAgIHByZWZlcnJlZFRhcmdldCA9IGQ7XG4gICAgICAgIGVsc2UgaWYgKCRmcm9tLmJlZm9yZShkKSA9PSBwb3MpXG4gICAgICAgICAgICB0YXJnZXREZXB0aHMuc3BsaWNlKDEsIDAsIC1kKTtcbiAgICB9XG4gICAgLy8gVHJ5IHRvIGZpdCBlYWNoIHBvc3NpYmxlIGRlcHRoIG9mIHRoZSBzbGljZSBpbnRvIGVhY2ggcG9zc2libGVcbiAgICAvLyB0YXJnZXQgZGVwdGgsIHN0YXJ0aW5nIHdpdGggdGhlIHByZWZlcnJlZCBkZXB0aHMuXG4gICAgbGV0IHByZWZlcnJlZFRhcmdldEluZGV4ID0gdGFyZ2V0RGVwdGhzLmluZGV4T2YocHJlZmVycmVkVGFyZ2V0KTtcbiAgICBsZXQgbGVmdE5vZGVzID0gW10sIHByZWZlcnJlZERlcHRoID0gc2xpY2Uub3BlblN0YXJ0O1xuICAgIGZvciAobGV0IGNvbnRlbnQgPSBzbGljZS5jb250ZW50LCBpID0gMDs7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgbGVmdE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmIChpID09IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjb250ZW50ID0gbm9kZS5jb250ZW50O1xuICAgIH1cbiAgICAvLyBCYWNrIHVwIHByZWZlcnJlZERlcHRoIHRvIGNvdmVyIGRlZmluaW5nIHRleHRibG9ja3MgZGlyZWN0bHlcbiAgICAvLyBhYm92ZSBpdCwgcG9zc2libHkgc2tpcHBpbmcgYSBub24tZGVmaW5pbmcgdGV4dGJsb2NrLlxuICAgIGZvciAobGV0IGQgPSBwcmVmZXJyZWREZXB0aCAtIDE7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBsZWZ0Tm9kZSA9IGxlZnROb2Rlc1tkXSwgZGVmID0gZGVmaW5lc0NvbnRlbnQobGVmdE5vZGUudHlwZSk7XG4gICAgICAgIGlmIChkZWYgJiYgIWxlZnROb2RlLnNhbWVNYXJrdXAoJGZyb20ubm9kZShNYXRoLmFicyhwcmVmZXJyZWRUYXJnZXQpIC0gMSkpKVxuICAgICAgICAgICAgcHJlZmVycmVkRGVwdGggPSBkO1xuICAgICAgICBlbHNlIGlmIChkZWYgfHwgIWxlZnROb2RlLnR5cGUuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IHNsaWNlLm9wZW5TdGFydDsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgbGV0IG9wZW5EZXB0aCA9IChqICsgcHJlZmVycmVkRGVwdGggKyAxKSAlIChzbGljZS5vcGVuU3RhcnQgKyAxKTtcbiAgICAgICAgbGV0IGluc2VydCA9IGxlZnROb2Rlc1tvcGVuRGVwdGhdO1xuICAgICAgICBpZiAoIWluc2VydClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldERlcHRocy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHBvc3NpYmxlIGV4cGFuc2lvbiBsZXZlbHMsIHN0YXJ0aW5nIHdpdGggdGhlXG4gICAgICAgICAgICAvLyBwcmVmZXJyZWQgb25lXG4gICAgICAgICAgICBsZXQgdGFyZ2V0RGVwdGggPSB0YXJnZXREZXB0aHNbKGkgKyBwcmVmZXJyZWRUYXJnZXRJbmRleCkgJSB0YXJnZXREZXB0aHMubGVuZ3RoXSwgZXhwYW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0YXJnZXREZXB0aCA8IDApIHtcbiAgICAgICAgICAgICAgICBleHBhbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0YXJnZXREZXB0aCA9IC10YXJnZXREZXB0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSAkZnJvbS5ub2RlKHRhcmdldERlcHRoIC0gMSksIGluZGV4ID0gJGZyb20uaW5kZXgodGFyZ2V0RGVwdGggLSAxKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuY2FuUmVwbGFjZVdpdGgoaW5kZXgsIGluZGV4LCBpbnNlcnQudHlwZSwgaW5zZXJ0Lm1hcmtzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHIucmVwbGFjZSgkZnJvbS5iZWZvcmUodGFyZ2V0RGVwdGgpLCBleHBhbmQgPyAkdG8uYWZ0ZXIodGFyZ2V0RGVwdGgpIDogdG8sIG5ldyBTbGljZShjbG9zZUZyYWdtZW50KHNsaWNlLmNvbnRlbnQsIDAsIHNsaWNlLm9wZW5TdGFydCwgb3BlbkRlcHRoKSwgb3BlbkRlcHRoLCBzbGljZS5vcGVuRW5kKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0U3RlcHMgPSB0ci5zdGVwcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IHRhcmdldERlcHRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB0ci5yZXBsYWNlKGZyb20sIHRvLCBzbGljZSk7XG4gICAgICAgIGlmICh0ci5zdGVwcy5sZW5ndGggPiBzdGFydFN0ZXBzKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGxldCBkZXB0aCA9IHRhcmdldERlcHRoc1tpXTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBmcm9tID0gJGZyb20uYmVmb3JlKGRlcHRoKTtcbiAgICAgICAgdG8gPSAkdG8uYWZ0ZXIoZGVwdGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNsb3NlRnJhZ21lbnQoZnJhZ21lbnQsIGRlcHRoLCBvbGRPcGVuLCBuZXdPcGVuLCBwYXJlbnQpIHtcbiAgICBpZiAoZGVwdGggPCBvbGRPcGVuKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnQucmVwbGFjZUNoaWxkKDAsIGZpcnN0LmNvcHkoY2xvc2VGcmFnbWVudChmaXJzdC5jb250ZW50LCBkZXB0aCArIDEsIG9sZE9wZW4sIG5ld09wZW4sIGZpcnN0KSkpO1xuICAgIH1cbiAgICBpZiAoZGVwdGggPiBuZXdPcGVuKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgwKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gbWF0Y2guZmlsbEJlZm9yZShmcmFnbWVudCkuYXBwZW5kKGZyYWdtZW50KTtcbiAgICAgICAgZnJhZ21lbnQgPSBzdGFydC5hcHBlbmQobWF0Y2gubWF0Y2hGcmFnbWVudChzdGFydCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiByZXBsYWNlUmFuZ2VXaXRoKHRyLCBmcm9tLCB0bywgbm9kZSkge1xuICAgIGlmICghbm9kZS5pc0lubGluZSAmJiBmcm9tID09IHRvICYmIHRyLmRvYy5yZXNvbHZlKGZyb20pLnBhcmVudC5jb250ZW50LnNpemUpIHtcbiAgICAgICAgbGV0IHBvaW50ID0gaW5zZXJ0UG9pbnQodHIuZG9jLCBmcm9tLCBub2RlLnR5cGUpO1xuICAgICAgICBpZiAocG9pbnQgIT0gbnVsbClcbiAgICAgICAgICAgIGZyb20gPSB0byA9IHBvaW50O1xuICAgIH1cbiAgICB0ci5yZXBsYWNlUmFuZ2UoZnJvbSwgdG8sIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKG5vZGUpLCAwLCAwKSk7XG59XG5mdW5jdGlvbiBkZWxldGVSYW5nZSh0ciwgZnJvbSwgdG8pIHtcbiAgICBsZXQgJGZyb20gPSB0ci5kb2MucmVzb2x2ZShmcm9tKSwgJHRvID0gdHIuZG9jLnJlc29sdmUodG8pO1xuICAgIGxldCBjb3ZlcmVkID0gY292ZXJlZERlcHRocygkZnJvbSwgJHRvKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdmVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGRlcHRoID0gY292ZXJlZFtpXSwgbGFzdCA9IGkgPT0gY292ZXJlZC5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoKGxhc3QgJiYgZGVwdGggPT0gMCkgfHwgJGZyb20ubm9kZShkZXB0aCkudHlwZS5jb250ZW50TWF0Y2gudmFsaWRFbmQpXG4gICAgICAgICAgICByZXR1cm4gdHIuZGVsZXRlKCRmcm9tLnN0YXJ0KGRlcHRoKSwgJHRvLmVuZChkZXB0aCkpO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIChsYXN0IHx8ICRmcm9tLm5vZGUoZGVwdGggLSAxKS5jYW5SZXBsYWNlKCRmcm9tLmluZGV4KGRlcHRoIC0gMSksICR0by5pbmRleEFmdGVyKGRlcHRoIC0gMSkpKSlcbiAgICAgICAgICAgIHJldHVybiB0ci5kZWxldGUoJGZyb20uYmVmb3JlKGRlcHRoKSwgJHRvLmFmdGVyKGRlcHRoKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGQgPSAxOyBkIDw9ICRmcm9tLmRlcHRoICYmIGQgPD0gJHRvLmRlcHRoOyBkKyspIHtcbiAgICAgICAgaWYgKGZyb20gLSAkZnJvbS5zdGFydChkKSA9PSAkZnJvbS5kZXB0aCAtIGQgJiYgdG8gPiAkZnJvbS5lbmQoZCkgJiYgJHRvLmVuZChkKSAtIHRvICE9ICR0by5kZXB0aCAtIGQgJiZcbiAgICAgICAgICAgICRmcm9tLnN0YXJ0KGQgLSAxKSA9PSAkdG8uc3RhcnQoZCAtIDEpICYmICRmcm9tLm5vZGUoZCAtIDEpLmNhblJlcGxhY2UoJGZyb20uaW5kZXgoZCAtIDEpLCAkdG8uaW5kZXgoZCAtIDEpKSlcbiAgICAgICAgICAgIHJldHVybiB0ci5kZWxldGUoJGZyb20uYmVmb3JlKGQpLCB0byk7XG4gICAgfVxuICAgIHRyLmRlbGV0ZShmcm9tLCB0byk7XG59XG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBkZXB0aHMgZm9yIHdoaWNoICRmcm9tIC0gJHRvIHNwYW5zIHRoZVxuLy8gd2hvbGUgY29udGVudCBvZiB0aGUgbm9kZXMgYXQgdGhhdCBkZXB0aC5cbmZ1bmN0aW9uIGNvdmVyZWREZXB0aHMoJGZyb20sICR0bykge1xuICAgIGxldCByZXN1bHQgPSBbXSwgbWluRGVwdGggPSBNYXRoLm1pbigkZnJvbS5kZXB0aCwgJHRvLmRlcHRoKTtcbiAgICBmb3IgKGxldCBkID0gbWluRGVwdGg7IGQgPj0gMDsgZC0tKSB7XG4gICAgICAgIGxldCBzdGFydCA9ICRmcm9tLnN0YXJ0KGQpO1xuICAgICAgICBpZiAoc3RhcnQgPCAkZnJvbS5wb3MgLSAoJGZyb20uZGVwdGggLSBkKSB8fFxuICAgICAgICAgICAgJHRvLmVuZChkKSA+ICR0by5wb3MgKyAoJHRvLmRlcHRoIC0gZCkgfHxcbiAgICAgICAgICAgICRmcm9tLm5vZGUoZCkudHlwZS5zcGVjLmlzb2xhdGluZyB8fFxuICAgICAgICAgICAgJHRvLm5vZGUoZCkudHlwZS5zcGVjLmlzb2xhdGluZylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoc3RhcnQgPT0gJHRvLnN0YXJ0KGQpIHx8XG4gICAgICAgICAgICAoZCA9PSAkZnJvbS5kZXB0aCAmJiBkID09ICR0by5kZXB0aCAmJiAkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCAmJiAkdG8ucGFyZW50LmlubGluZUNvbnRlbnQgJiZcbiAgICAgICAgICAgICAgICBkICYmICR0by5zdGFydChkIC0gMSkgPT0gc3RhcnQgLSAxKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcblVwZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gYSBzcGVjaWZpYyBub2RlLlxuKi9cbmNsYXNzIEF0dHJTdGVwIGV4dGVuZHMgU3RlcCB7XG4gICAgLyoqXG4gICAgQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBzdGVwLlxuICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgVGhlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgbm9kZS5cbiAgICAqL1xuICAgIHBvcywgXG4gICAgLyoqXG4gICAgVGhlIGF0dHJpYnV0ZSB0byBzZXQuXG4gICAgKi9cbiAgICBhdHRyLCBcbiAgICAvLyBUaGUgYXR0cmlidXRlJ3MgbmV3IHZhbHVlLlxuICAgIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gcG9zO1xuICAgICAgICB0aGlzLmF0dHIgPSBhdHRyO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGFwcGx5KGRvYykge1xuICAgICAgICBsZXQgbm9kZSA9IGRvYy5ub2RlQXQodGhpcy5wb3MpO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mYWlsKFwiTm8gbm9kZSBhdCBhdHRyaWJ1dGUgc3RlcCdzIHBvc2l0aW9uXCIpO1xuICAgICAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIG5vZGUuYXR0cnMpXG4gICAgICAgICAgICBhdHRyc1tuYW1lXSA9IG5vZGUuYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW3RoaXMuYXR0cl0gPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IG5vZGUudHlwZS5jcmVhdGUoYXR0cnMsIG51bGwsIG5vZGUubWFya3MpO1xuICAgICAgICByZXR1cm4gU3RlcFJlc3VsdC5mcm9tUmVwbGFjZShkb2MsIHRoaXMucG9zLCB0aGlzLnBvcyArIDEsIG5ldyBTbGljZShGcmFnbWVudC5mcm9tKHVwZGF0ZWQpLCAwLCBub2RlLmlzTGVhZiA/IDAgOiAxKSk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIFN0ZXBNYXAuZW1wdHk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdHRyU3RlcCh0aGlzLnBvcywgdGhpcy5hdHRyLCBkb2Mubm9kZUF0KHRoaXMucG9zKS5hdHRyc1t0aGlzLmF0dHJdKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgbGV0IHBvcyA9IG1hcHBpbmcubWFwUmVzdWx0KHRoaXMucG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHBvcy5kZWxldGVkQWZ0ZXIgPyBudWxsIDogbmV3IEF0dHJTdGVwKHBvcy5wb3MsIHRoaXMuYXR0ciwgdGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwiYXR0clwiLCBwb3M6IHRoaXMucG9zLCBhdHRyOiB0aGlzLmF0dHIsIHZhbHVlOiB0aGlzLnZhbHVlIH07XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLnBvcyAhPSBcIm51bWJlclwiIHx8IHR5cGVvZiBqc29uLmF0dHIgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgQXR0clN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgQXR0clN0ZXAoanNvbi5wb3MsIGpzb24uYXR0ciwganNvbi52YWx1ZSk7XG4gICAgfVxufVxuU3RlcC5qc29uSUQoXCJhdHRyXCIsIEF0dHJTdGVwKTtcbi8qKlxuVXBkYXRlIGFuIGF0dHJpYnV0ZSBpbiB0aGUgZG9jIG5vZGUuXG4qL1xuY2xhc3MgRG9jQXR0clN0ZXAgZXh0ZW5kcyBTdGVwIHtcbiAgICAvKipcbiAgICBDb25zdHJ1Y3QgYW4gYXR0cmlidXRlIHN0ZXAuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgYXR0cmlidXRlIHRvIHNldC5cbiAgICAqL1xuICAgIGF0dHIsIFxuICAgIC8vIFRoZSBhdHRyaWJ1dGUncyBuZXcgdmFsdWUuXG4gICAgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdHRyID0gYXR0cjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBhcHBseShkb2MpIHtcbiAgICAgICAgbGV0IGF0dHJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBkb2MuYXR0cnMpXG4gICAgICAgICAgICBhdHRyc1tuYW1lXSA9IGRvYy5hdHRyc1tuYW1lXTtcbiAgICAgICAgYXR0cnNbdGhpcy5hdHRyXSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGxldCB1cGRhdGVkID0gZG9jLnR5cGUuY3JlYXRlKGF0dHJzLCBkb2MuY29udGVudCwgZG9jLm1hcmtzKTtcbiAgICAgICAgcmV0dXJuIFN0ZXBSZXN1bHQub2sodXBkYXRlZCk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIFN0ZXBNYXAuZW1wdHk7XG4gICAgfVxuICAgIGludmVydChkb2MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEb2NBdHRyU3RlcCh0aGlzLmF0dHIsIGRvYy5hdHRyc1t0aGlzLmF0dHJdKTtcbiAgICB9XG4gICAgbWFwKG1hcHBpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RlcFR5cGU6IFwiZG9jQXR0clwiLCBhdHRyOiB0aGlzLmF0dHIsIHZhbHVlOiB0aGlzLnZhbHVlIH07XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tSlNPTihzY2hlbWEsIGpzb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uLmF0dHIgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW52YWxpZCBpbnB1dCBmb3IgRG9jQXR0clN0ZXAuZnJvbUpTT05cIik7XG4gICAgICAgIHJldHVybiBuZXcgRG9jQXR0clN0ZXAoanNvbi5hdHRyLCBqc29uLnZhbHVlKTtcbiAgICB9XG59XG5TdGVwLmpzb25JRChcImRvY0F0dHJcIiwgRG9jQXR0clN0ZXApO1xuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmxldCBUcmFuc2Zvcm1FcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xufTtcblRyYW5zZm9ybUVycm9yID0gZnVuY3Rpb24gVHJhbnNmb3JtRXJyb3IobWVzc2FnZSkge1xuICAgIGxldCBlcnIgPSBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuICAgIGVyci5fX3Byb3RvX18gPSBUcmFuc2Zvcm1FcnJvci5wcm90b3R5cGU7XG4gICAgcmV0dXJuIGVycjtcbn07XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5UcmFuc2Zvcm1FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUcmFuc2Zvcm1FcnJvcjtcblRyYW5zZm9ybUVycm9yLnByb3RvdHlwZS5uYW1lID0gXCJUcmFuc2Zvcm1FcnJvclwiO1xuLyoqXG5BYnN0cmFjdGlvbiB0byBidWlsZCB1cCBhbmQgdHJhY2sgYW4gYXJyYXkgb2ZcbltzdGVwc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3RyYW5zZm9ybS5TdGVwKSByZXByZXNlbnRpbmcgYSBkb2N1bWVudCB0cmFuc2Zvcm1hdGlvbi5cblxuTW9zdCB0cmFuc2Zvcm1pbmcgbWV0aG9kcyByZXR1cm4gdGhlIGBUcmFuc2Zvcm1gIG9iamVjdCBpdHNlbGYsIHNvXG50aGF0IHRoZXkgY2FuIGJlIGNoYWluZWQuXG4qL1xuY2xhc3MgVHJhbnNmb3JtIHtcbiAgICAvKipcbiAgICBDcmVhdGUgYSB0cmFuc2Zvcm0gdGhhdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBkb2N1bWVudCAodGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgc3RlcHMgaW4gdGhlXG4gICAgdHJhbnNmb3JtKS5cbiAgICAqL1xuICAgIGRvYykge1xuICAgICAgICB0aGlzLmRvYyA9IGRvYztcbiAgICAgICAgLyoqXG4gICAgICAgIFRoZSBzdGVwcyBpbiB0aGlzIHRyYW5zZm9ybS5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgVGhlIGRvY3VtZW50cyBiZWZvcmUgZWFjaCBvZiB0aGUgc3RlcHMuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZG9jcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgQSBtYXBwaW5nIHdpdGggdGhlIG1hcHMgZm9yIGVhY2ggb2YgdGhlIHN0ZXBzIGluIHRoaXMgdHJhbnNmb3JtLlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgVGhlIHN0YXJ0aW5nIGRvY3VtZW50LlxuICAgICovXG4gICAgZ2V0IGJlZm9yZSgpIHsgcmV0dXJuIHRoaXMuZG9jcy5sZW5ndGggPyB0aGlzLmRvY3NbMF0gOiB0aGlzLmRvYzsgfVxuICAgIC8qKlxuICAgIEFwcGx5IGEgbmV3IHN0ZXAgaW4gdGhpcyB0cmFuc2Zvcm0sIHNhdmluZyB0aGUgcmVzdWx0LiBUaHJvd3MgYW5cbiAgICBlcnJvciB3aGVuIHRoZSBzdGVwIGZhaWxzLlxuICAgICovXG4gICAgc3RlcChzdGVwKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1heWJlU3RlcChzdGVwKTtcbiAgICAgICAgaWYgKHJlc3VsdC5mYWlsZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtRXJyb3IocmVzdWx0LmZhaWxlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBUcnkgdG8gYXBwbHkgYSBzdGVwIGluIHRoaXMgdHJhbnNmb3JtYXRpb24sIGlnbm9yaW5nIGl0IGlmIGl0XG4gICAgZmFpbHMuIFJldHVybnMgdGhlIHN0ZXAgcmVzdWx0LlxuICAgICovXG4gICAgbWF5YmVTdGVwKHN0ZXApIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHN0ZXAuYXBwbHkodGhpcy5kb2MpO1xuICAgICAgICBpZiAoIXJlc3VsdC5mYWlsZWQpXG4gICAgICAgICAgICB0aGlzLmFkZFN0ZXAoc3RlcCwgcmVzdWx0LmRvYyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgIFRydWUgd2hlbiB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZCAod2hlbiB0aGVyZSBhcmUgYW55XG4gICAgc3RlcHMpLlxuICAgICovXG4gICAgZ2V0IGRvY0NoYW5nZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0ZXBzLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgYWRkU3RlcChzdGVwLCBkb2MpIHtcbiAgICAgICAgdGhpcy5kb2NzLnB1c2godGhpcy5kb2MpO1xuICAgICAgICB0aGlzLnN0ZXBzLnB1c2goc3RlcCk7XG4gICAgICAgIHRoaXMubWFwcGluZy5hcHBlbmRNYXAoc3RlcC5nZXRNYXAoKSk7XG4gICAgICAgIHRoaXMuZG9jID0gZG9jO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCB3aXRoIHRoZVxuICAgIGdpdmVuIGBzbGljZWAuXG4gICAgKi9cbiAgICByZXBsYWNlKGZyb20sIHRvID0gZnJvbSwgc2xpY2UgPSBTbGljZS5lbXB0eSkge1xuICAgICAgICBsZXQgc3RlcCA9IHJlcGxhY2VTdGVwKHRoaXMuZG9jLCBmcm9tLCB0bywgc2xpY2UpO1xuICAgICAgICBpZiAoc3RlcClcbiAgICAgICAgICAgIHRoaXMuc3RlcChzdGVwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlcGxhY2UgdGhlIGdpdmVuIHJhbmdlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQsIHdoaWNoIG1heSBiZSBhXG4gICAgZnJhZ21lbnQsIG5vZGUsIG9yIGFycmF5IG9mIG5vZGVzLlxuICAgICovXG4gICAgcmVwbGFjZVdpdGgoZnJvbSwgdG8sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZShmcm9tLCB0bywgbmV3IFNsaWNlKEZyYWdtZW50LmZyb20oY29udGVudCksIDAsIDApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGVsZXRlIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy5cbiAgICAqL1xuICAgIGRlbGV0ZShmcm9tLCB0bykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXBsYWNlKGZyb20sIHRvLCBTbGljZS5lbXB0eSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEluc2VydCB0aGUgZ2l2ZW4gY29udGVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgKi9cbiAgICBpbnNlcnQocG9zLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VXaXRoKHBvcywgcG9zLCBjb250ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgUmVwbGFjZSBhIHJhbmdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgZ2l2ZW4gc2xpY2UsIHVzaW5nXG4gICAgYGZyb21gLCBgdG9gLCBhbmQgdGhlIHNsaWNlJ3NcbiAgICBbYG9wZW5TdGFydGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5TbGljZS5vcGVuU3RhcnQpIHByb3BlcnR5IGFzIGhpbnRzLCByYXRoZXJcbiAgICB0aGFuIGZpeGVkIHN0YXJ0IGFuZCBlbmQgcG9pbnRzLiBUaGlzIG1ldGhvZCBtYXkgZ3JvdyB0aGVcbiAgICByZXBsYWNlZCBhcmVhIG9yIGNsb3NlIG9wZW4gbm9kZXMgaW4gdGhlIHNsaWNlIGluIG9yZGVyIHRvIGdldCBhXG4gICAgZml0IHRoYXQgaXMgbW9yZSBpbiBsaW5lIHdpdGggV1lTSVdZRyBleHBlY3RhdGlvbnMsIGJ5IGRyb3BwaW5nXG4gICAgZnVsbHkgY292ZXJlZCBwYXJlbnQgbm9kZXMgb2YgdGhlIHJlcGxhY2VkIHJlZ2lvbiB3aGVuIHRoZXkgYXJlXG4gICAgbWFya2VkIFtub24tZGVmaW5pbmcgYXNcbiAgICBjb250ZXh0XShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVNwZWMuZGVmaW5pbmdBc0NvbnRleHQpLCBvciBpbmNsdWRpbmcgYW5cbiAgICBvcGVuIHBhcmVudCBub2RlIGZyb20gdGhlIHNsaWNlIHRoYXQgX2lzXyBtYXJrZWQgYXMgW2RlZmluaW5nXG4gICAgaXRzIGNvbnRlbnRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyNtb2RlbC5Ob2RlU3BlYy5kZWZpbmluZ0ZvckNvbnRlbnQpLlxuICAgIFxuICAgIFRoaXMgaXMgdGhlIG1ldGhvZCwgZm9yIGV4YW1wbGUsIHRvIGhhbmRsZSBwYXN0ZS4gVGhlIHNpbWlsYXJcbiAgICBbYHJlcGxhY2VgXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdHJhbnNmb3JtLlRyYW5zZm9ybS5yZXBsYWNlKSBtZXRob2QgaXMgYSBtb3JlXG4gICAgcHJpbWl0aXZlIHRvb2wgd2hpY2ggd2lsbCBfbm90XyBtb3ZlIHRoZSBzdGFydCBhbmQgZW5kIG9mIGl0cyBnaXZlblxuICAgIHJhbmdlLCBhbmQgaXMgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgeW91IG5lZWQgbW9yZSBwcmVjaXNlXG4gICAgY29udHJvbCBvdmVyIHdoYXQgaGFwcGVucy5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZShmcm9tLCB0bywgc2xpY2UpIHtcbiAgICAgICAgcmVwbGFjZVJhbmdlKHRoaXMsIGZyb20sIHRvLCBzbGljZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXBsYWNlIHRoZSBnaXZlbiByYW5nZSB3aXRoIGEgbm9kZSwgYnV0IHVzZSBgZnJvbWAgYW5kIGB0b2AgYXNcbiAgICBoaW50cywgcmF0aGVyIHRoYW4gcHJlY2lzZSBwb3NpdGlvbnMuIFdoZW4gZnJvbSBhbmQgdG8gYXJlIHRoZSBzYW1lXG4gICAgYW5kIGFyZSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgcGFyZW50IG5vZGUgaW4gd2hpY2ggdGhlIGdpdmVuXG4gICAgbm9kZSBkb2Vzbid0IGZpdCwgdGhpcyBtZXRob2QgbWF5IF9tb3ZlXyB0aGVtIG91dCB0b3dhcmRzIGEgcGFyZW50XG4gICAgdGhhdCBkb2VzIGFsbG93IHRoZSBnaXZlbiBub2RlIHRvIGJlIHBsYWNlZC4gV2hlbiB0aGUgZ2l2ZW4gcmFuZ2VcbiAgICBjb21wbGV0ZWx5IGNvdmVycyBhIHBhcmVudCBub2RlLCB0aGlzIG1ldGhvZCBtYXkgY29tcGxldGVseSByZXBsYWNlXG4gICAgdGhhdCBwYXJlbnQgbm9kZS5cbiAgICAqL1xuICAgIHJlcGxhY2VSYW5nZVdpdGgoZnJvbSwgdG8sIG5vZGUpIHtcbiAgICAgICAgcmVwbGFjZVJhbmdlV2l0aCh0aGlzLCBmcm9tLCB0bywgbm9kZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBEZWxldGUgdGhlIGdpdmVuIHJhbmdlLCBleHBhbmRpbmcgaXQgdG8gY292ZXIgZnVsbHkgY292ZXJlZFxuICAgIHBhcmVudCBub2RlcyB1bnRpbCBhIHZhbGlkIHJlcGxhY2UgaXMgZm91bmQuXG4gICAgKi9cbiAgICBkZWxldGVSYW5nZShmcm9tLCB0bykge1xuICAgICAgICBkZWxldGVSYW5nZSh0aGlzLCBmcm9tLCB0byk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBTcGxpdCB0aGUgY29udGVudCBpbiB0aGUgZ2l2ZW4gcmFuZ2Ugb2ZmIGZyb20gaXRzIHBhcmVudCwgaWYgdGhlcmVcbiAgICBpcyBzaWJsaW5nIGNvbnRlbnQgYmVmb3JlIG9yIGFmdGVyIGl0LCBhbmQgbW92ZSBpdCB1cCB0aGUgdHJlZSB0b1xuICAgIHRoZSBkZXB0aCBzcGVjaWZpZWQgYnkgYHRhcmdldGAuIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVzZVxuICAgIFtgbGlmdFRhcmdldGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0ubGlmdFRhcmdldCkgdG8gY29tcHV0ZSBgdGFyZ2V0YCwgdG8gbWFrZVxuICAgIHN1cmUgdGhlIGxpZnQgaXMgdmFsaWQuXG4gICAgKi9cbiAgICBsaWZ0KHJhbmdlLCB0YXJnZXQpIHtcbiAgICAgICAgbGlmdCh0aGlzLCByYW5nZSwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEpvaW4gdGhlIGJsb2NrcyBhcm91bmQgdGhlIGdpdmVuIHBvc2l0aW9uLiBJZiBkZXB0aCBpcyAyLCB0aGVpclxuICAgIGxhc3QgYW5kIGZpcnN0IHNpYmxpbmdzIGFyZSBhbHNvIGpvaW5lZCwgYW5kIHNvIG9uLlxuICAgICovXG4gICAgam9pbihwb3MsIGRlcHRoID0gMSkge1xuICAgICAgICBqb2luKHRoaXMsIHBvcywgZGVwdGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgV3JhcCB0aGUgZ2l2ZW4gW3JhbmdlXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jbW9kZWwuTm9kZVJhbmdlKSBpbiB0aGUgZ2l2ZW4gc2V0IG9mIHdyYXBwZXJzLlxuICAgIFRoZSB3cmFwcGVycyBhcmUgYXNzdW1lZCB0byBiZSB2YWxpZCBpbiB0aGlzIHBvc2l0aW9uLCBhbmQgc2hvdWxkXG4gICAgcHJvYmFibHkgYmUgY29tcHV0ZWQgd2l0aCBbYGZpbmRXcmFwcGluZ2BdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN0cmFuc2Zvcm0uZmluZFdyYXBwaW5nKS5cbiAgICAqL1xuICAgIHdyYXAocmFuZ2UsIHdyYXBwZXJzKSB7XG4gICAgICAgIHdyYXAodGhpcywgcmFuZ2UsIHdyYXBwZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCB0aGUgdHlwZSBvZiBhbGwgdGV4dGJsb2NrcyAocGFydGx5KSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYCB0b1xuICAgIHRoZSBnaXZlbiBub2RlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIHNldEJsb2NrVHlwZShmcm9tLCB0byA9IGZyb20sIHR5cGUsIGF0dHJzID0gbnVsbCkge1xuICAgICAgICBzZXRCbG9ja1R5cGUodGhpcywgZnJvbSwgdG8sIHR5cGUsIGF0dHJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIENoYW5nZSB0aGUgdHlwZSwgYXR0cmlidXRlcywgYW5kL29yIG1hcmtzIG9mIHRoZSBub2RlIGF0IGBwb3NgLlxuICAgIFdoZW4gYHR5cGVgIGlzbid0IGdpdmVuLCB0aGUgZXhpc3Rpbmcgbm9kZSB0eXBlIGlzIHByZXNlcnZlZCxcbiAgICAqL1xuICAgIHNldE5vZGVNYXJrdXAocG9zLCB0eXBlLCBhdHRycyA9IG51bGwsIG1hcmtzKSB7XG4gICAgICAgIHNldE5vZGVNYXJrdXAodGhpcywgcG9zLCB0eXBlLCBhdHRycywgbWFya3MpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgU2V0IGEgc2luZ2xlIGF0dHJpYnV0ZSBvbiBhIGdpdmVuIG5vZGUgdG8gYSBuZXcgdmFsdWUuXG4gICAgVGhlIGBwb3NgIGFkZHJlc3NlcyB0aGUgZG9jdW1lbnQgY29udGVudC4gVXNlIGBzZXREb2NBdHRyaWJ1dGVgXG4gICAgdG8gc2V0IGF0dHJpYnV0ZXMgb24gdGhlIGRvY3VtZW50IGl0c2VsZi5cbiAgICAqL1xuICAgIHNldE5vZGVBdHRyaWJ1dGUocG9zLCBhdHRyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnN0ZXAobmV3IEF0dHJTdGVwKHBvcywgYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNldCBhIHNpbmdsZSBhdHRyaWJ1dGUgb24gdGhlIGRvY3VtZW50IHRvIGEgbmV3IHZhbHVlLlxuICAgICovXG4gICAgc2V0RG9jQXR0cmlidXRlKGF0dHIsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3RlcChuZXcgRG9jQXR0clN0ZXAoYXR0ciwgdmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCBhIG1hcmsgdG8gdGhlIG5vZGUgYXQgcG9zaXRpb24gYHBvc2AuXG4gICAgKi9cbiAgICBhZGROb2RlTWFyayhwb3MsIG1hcmspIHtcbiAgICAgICAgdGhpcy5zdGVwKG5ldyBBZGROb2RlTWFya1N0ZXAocG9zLCBtYXJrKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgYSBtYXJrIChvciBhbGwgbWFya3Mgb2YgdGhlIGdpdmVuIHR5cGUpIGZyb20gdGhlIG5vZGUgYXRcbiAgICBwb3NpdGlvbiBgcG9zYC5cbiAgICAqL1xuICAgIHJlbW92ZU5vZGVNYXJrKHBvcywgbWFyaykge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMuZG9jLm5vZGVBdChwb3MpO1xuICAgICAgICBpZiAoIW5vZGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIG5vZGUgYXQgcG9zaXRpb24gXCIgKyBwb3MpO1xuICAgICAgICBpZiAobWFyayBpbnN0YW5jZW9mIE1hcmspIHtcbiAgICAgICAgICAgIGlmIChtYXJrLmlzSW5TZXQobm9kZS5tYXJrcykpXG4gICAgICAgICAgICAgICAgdGhpcy5zdGVwKG5ldyBSZW1vdmVOb2RlTWFya1N0ZXAocG9zLCBtYXJrKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2V0ID0gbm9kZS5tYXJrcywgZm91bmQsIHN0ZXBzID0gW107XG4gICAgICAgICAgICB3aGlsZSAoZm91bmQgPSBtYXJrLmlzSW5TZXQoc2V0KSkge1xuICAgICAgICAgICAgICAgIHN0ZXBzLnB1c2gobmV3IFJlbW92ZU5vZGVNYXJrU3RlcChwb3MsIGZvdW5kKSk7XG4gICAgICAgICAgICAgICAgc2V0ID0gZm91bmQucmVtb3ZlRnJvbVNldChzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgICAgICAgICAgIHRoaXMuc3RlcChzdGVwc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFNwbGl0IHRoZSBub2RlIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgYW5kIG9wdGlvbmFsbHksIGlmIGBkZXB0aGAgaXNcbiAgICBncmVhdGVyIHRoYW4gb25lLCBhbnkgbnVtYmVyIG9mIG5vZGVzIGFib3ZlIHRoYXQuIEJ5IGRlZmF1bHQsIHRoZVxuICAgIHBhcnRzIHNwbGl0IG9mZiB3aWxsIGluaGVyaXQgdGhlIG5vZGUgdHlwZSBvZiB0aGUgb3JpZ2luYWwgbm9kZS5cbiAgICBUaGlzIGNhbiBiZSBjaGFuZ2VkIGJ5IHBhc3NpbmcgYW4gYXJyYXkgb2YgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdG9cbiAgICB1c2UgYWZ0ZXIgdGhlIHNwbGl0ICh3aXRoIHRoZSBvdXRlcm1vc3Qgbm9kZXMgY29taW5nIGZpcnN0KS5cbiAgICAqL1xuICAgIHNwbGl0KHBvcywgZGVwdGggPSAxLCB0eXBlc0FmdGVyKSB7XG4gICAgICAgIHNwbGl0KHRoaXMsIHBvcywgZGVwdGgsIHR5cGVzQWZ0ZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgQWRkIHRoZSBnaXZlbiBtYXJrIHRvIHRoZSBpbmxpbmUgY29udGVudCBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbiAgICAqL1xuICAgIGFkZE1hcmsoZnJvbSwgdG8sIG1hcmspIHtcbiAgICAgICAgYWRkTWFyayh0aGlzLCBmcm9tLCB0bywgbWFyayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmUgbWFya3MgZnJvbSBpbmxpbmUgbm9kZXMgYmV0d2VlbiBgZnJvbWAgYW5kIGB0b2AuIFdoZW5cbiAgICBgbWFya2AgaXMgYSBzaW5nbGUgbWFyaywgcmVtb3ZlIHByZWNpc2VseSB0aGF0IG1hcmsuIFdoZW4gaXQgaXNcbiAgICBhIG1hcmsgdHlwZSwgcmVtb3ZlIGFsbCBtYXJrcyBvZiB0aGF0IHR5cGUuIFdoZW4gaXQgaXMgbnVsbCxcbiAgICByZW1vdmUgYWxsIG1hcmtzIG9mIGFueSB0eXBlLlxuICAgICovXG4gICAgcmVtb3ZlTWFyayhmcm9tLCB0bywgbWFyaykge1xuICAgICAgICByZW1vdmVNYXJrKHRoaXMsIGZyb20sIHRvLCBtYXJrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgIFJlbW92ZXMgYWxsIG1hcmtzIGFuZCBub2RlcyBmcm9tIHRoZSBjb250ZW50IG9mIHRoZSBub2RlIGF0XG4gICAgYHBvc2AgdGhhdCBkb24ndCBtYXRjaCB0aGUgZ2l2ZW4gbmV3IHBhcmVudCBub2RlIHR5cGUuIEFjY2VwdHNcbiAgICBhbiBvcHRpb25hbCBzdGFydGluZyBbY29udGVudCBtYXRjaF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI21vZGVsLkNvbnRlbnRNYXRjaCkgYXNcbiAgICB0aGlyZCBhcmd1bWVudC5cbiAgICAqL1xuICAgIGNsZWFySW5jb21wYXRpYmxlKHBvcywgcGFyZW50VHlwZSwgbWF0Y2gpIHtcbiAgICAgICAgY2xlYXJJbmNvbXBhdGlibGUodGhpcywgcG9zLCBwYXJlbnRUeXBlLCBtYXRjaCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgQWRkTWFya1N0ZXAsIEFkZE5vZGVNYXJrU3RlcCwgQXR0clN0ZXAsIERvY0F0dHJTdGVwLCBNYXBSZXN1bHQsIE1hcHBpbmcsIFJlbW92ZU1hcmtTdGVwLCBSZW1vdmVOb2RlTWFya1N0ZXAsIFJlcGxhY2VBcm91bmRTdGVwLCBSZXBsYWNlU3RlcCwgU3RlcCwgU3RlcE1hcCwgU3RlcFJlc3VsdCwgVHJhbnNmb3JtLCBUcmFuc2Zvcm1FcnJvciwgY2FuSm9pbiwgY2FuU3BsaXQsIGRyb3BQb2ludCwgZmluZFdyYXBwaW5nLCBpbnNlcnRQb2ludCwgam9pblBvaW50LCBsaWZ0VGFyZ2V0LCByZXBsYWNlU3RlcCB9O1xuIiwiaW1wb3J0IHsgVGV4dFNlbGVjdGlvbiwgTm9kZVNlbGVjdGlvbiwgQWxsU2VsZWN0aW9uLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBET01TZXJpYWxpemVyLCBGcmFnbWVudCwgTWFyaywgU2xpY2UsIERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IGRyb3BQb2ludCB9IGZyb20gJ3Byb3NlbWlycm9yLXRyYW5zZm9ybSc7XG5cbmNvbnN0IGRvbUluZGV4ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7OyBpbmRleCsrKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn07XG5jb25zdCBwYXJlbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBsZXQgcGFyZW50ID0gbm9kZS5hc3NpZ25lZFNsb3QgfHwgbm9kZS5wYXJlbnROb2RlO1xuICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09IDExID8gcGFyZW50Lmhvc3QgOiBwYXJlbnQ7XG59O1xubGV0IHJldXNlZFJhbmdlID0gbnVsbDtcbi8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgc2FtZSByYW5nZSwgYmVjYXVzZSBET00gcmFuZ2Vcbi8vIG9iamVjdHMgYXJlIGV2ZXJ5IGV4cGVuc2l2ZSwgYW5kIGtlZXAgc2xvd2luZyBkb3duIHN1YnNlcXVlbnQgRE9NXG4vLyB1cGRhdGVzLCBmb3Igc29tZSByZWFzb24uXG5jb25zdCB0ZXh0UmFuZ2UgPSBmdW5jdGlvbiAobm9kZSwgZnJvbSwgdG8pIHtcbiAgICBsZXQgcmFuZ2UgPSByZXVzZWRSYW5nZSB8fCAocmV1c2VkUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpKTtcbiAgICByYW5nZS5zZXRFbmQobm9kZSwgdG8gPT0gbnVsbCA/IG5vZGUubm9kZVZhbHVlLmxlbmd0aCA6IHRvKTtcbiAgICByYW5nZS5zZXRTdGFydChub2RlLCBmcm9tIHx8IDApO1xuICAgIHJldHVybiByYW5nZTtcbn07XG5jb25zdCBjbGVhclJldXNlZFJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldXNlZFJhbmdlID0gbnVsbDtcbn07XG4vLyBTY2FucyBmb3J3YXJkIGFuZCBiYWNrd2FyZCB0aHJvdWdoIERPTSBwb3NpdGlvbnMgZXF1aXZhbGVudCB0byB0aGVcbi8vIGdpdmVuIG9uZSB0byBzZWUgaWYgdGhlIHR3byBhcmUgaW4gdGhlIHNhbWUgcGxhY2UgKGkuZS4gYWZ0ZXIgYVxuLy8gdGV4dCBub2RlIHZzIGF0IHRoZSBlbmQgb2YgdGhhdCB0ZXh0IG5vZGUpXG5jb25zdCBpc0VxdWl2YWxlbnRQb3NpdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZikge1xuICAgIHJldHVybiB0YXJnZXROb2RlICYmIChzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCAtMSkgfHxcbiAgICAgICAgc2NhbkZvcihub2RlLCBvZmYsIHRhcmdldE5vZGUsIHRhcmdldE9mZiwgMSkpO1xufTtcbmNvbnN0IGF0b21FbGVtZW50cyA9IC9eKGltZ3xicnxpbnB1dHx0ZXh0YXJlYXxocikkL2k7XG5mdW5jdGlvbiBzY2FuRm9yKG5vZGUsIG9mZiwgdGFyZ2V0Tm9kZSwgdGFyZ2V0T2ZmLCBkaXIpIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChub2RlID09IHRhcmdldE5vZGUgJiYgb2ZmID09IHRhcmdldE9mZilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAob2ZmID09IChkaXIgPCAwID8gMCA6IG5vZGVTaXplKG5vZGUpKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSAhPSAxIHx8IGhhc0Jsb2NrRGVzYyhub2RlKSB8fCBhdG9tRWxlbWVudHMudGVzdChub2RlLm5vZGVOYW1lKSB8fFxuICAgICAgICAgICAgICAgIG5vZGUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBvZmYgPSBkb21JbmRleChub2RlKSArIChkaXIgPCAwID8gMCA6IDEpO1xuICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbb2ZmICsgKGRpciA8IDAgPyAtMSA6IDApXTtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgb2ZmID0gZGlyIDwgMCA/IG5vZGVTaXplKG5vZGUpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIG5vZGVTaXplKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIHRleHROb2RlQmVmb3JlJDEobm9kZSwgb2Zmc2V0KSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmIG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRFZGl0YWJsZSA9PSBcImZhbHNlXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gbm9kZVNpemUobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IGRvbUluZGV4KG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdGV4dE5vZGVBZnRlciQxKG5vZGUsIG9mZnNldCkge1xuICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiBvZmZzZXQgPCBub2RlLm5vZGVWYWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXRdO1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSkgKyAxO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaXNPbkVkZ2Uobm9kZSwgb2Zmc2V0LCBwYXJlbnQpIHtcbiAgICBmb3IgKGxldCBhdFN0YXJ0ID0gb2Zmc2V0ID09IDAsIGF0RW5kID0gb2Zmc2V0ID09IG5vZGVTaXplKG5vZGUpOyBhdFN0YXJ0IHx8IGF0RW5kOykge1xuICAgICAgICBpZiAobm9kZSA9PSBwYXJlbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGluZGV4ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXRTdGFydCA9IGF0U3RhcnQgJiYgaW5kZXggPT0gMDtcbiAgICAgICAgYXRFbmQgPSBhdEVuZCAmJiBpbmRleCA9PSBub2RlU2l6ZShub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNCbG9ja0Rlc2MoZG9tKSB7XG4gICAgbGV0IGRlc2M7XG4gICAgZm9yIChsZXQgY3VyID0gZG9tOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlKVxuICAgICAgICBpZiAoZGVzYyA9IGN1ci5wbVZpZXdEZXNjKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgcmV0dXJuIGRlc2MgJiYgZGVzYy5ub2RlICYmIGRlc2Mubm9kZS5pc0Jsb2NrICYmIChkZXNjLmRvbSA9PSBkb20gfHwgZGVzYy5jb250ZW50RE9NID09IGRvbSk7XG59XG4vLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3NTIzXG4vLyAoaXNDb2xsYXBzZWQgaW5hcHByb3ByaWF0ZWx5IHJldHVybnMgdHJ1ZSBpbiBzaGFkb3cgZG9tKVxuY29uc3Qgc2VsZWN0aW9uQ29sbGFwc2VkID0gZnVuY3Rpb24gKGRvbVNlbCkge1xuICAgIHJldHVybiBkb21TZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQpO1xufTtcbmZ1bmN0aW9uIGtleUV2ZW50KGtleUNvZGUsIGtleSkge1xuICAgIGxldCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KFwia2V5ZG93blwiLCB0cnVlLCB0cnVlKTtcbiAgICBldmVudC5rZXlDb2RlID0ga2V5Q29kZTtcbiAgICBldmVudC5rZXkgPSBldmVudC5jb2RlID0ga2V5O1xuICAgIHJldHVybiBldmVudDtcbn1cbmZ1bmN0aW9uIGRlZXBBY3RpdmVFbGVtZW50KGRvYykge1xuICAgIGxldCBlbHQgPSBkb2MuYWN0aXZlRWxlbWVudDtcbiAgICB3aGlsZSAoZWx0ICYmIGVsdC5zaGFkb3dSb290KVxuICAgICAgICBlbHQgPSBlbHQuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgIHJldHVybiBlbHQ7XG59XG5mdW5jdGlvbiBjYXJldEZyb21Qb2ludChkb2MsIHgsIHkpIHtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHtcbiAgICAgICAgdHJ5IHsgLy8gRmlyZWZveCB0aHJvd3MgZm9yIHRoaXMgY2FsbCBpbiBoYXJkLXRvLXByZWRpY3QgY2lyY3Vtc3RhbmNlcyAoIzk5NClcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgICAgIC8vIENsaXAgdGhlIG9mZnNldCwgYmVjYXVzZSBDaHJvbWUgd2lsbCByZXR1cm4gYSB0ZXh0IG9mZnNldFxuICAgICAgICAgICAgLy8gaW50byA8aW5wdXQ+IG5vZGVzLCB3aGljaCBjYW4ndCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBET01cbiAgICAgICAgICAgIC8vIG9mZnNldFxuICAgICAgICAgICAgaWYgKHBvcylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBub2RlOiBwb3Mub2Zmc2V0Tm9kZSwgb2Zmc2V0OiBNYXRoLm1pbihub2RlU2l6ZShwb3Mub2Zmc2V0Tm9kZSksIHBvcy5vZmZzZXQpIH07XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgIH1cbiAgICBpZiAoZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gZG9jLmNhcmV0UmFuZ2VGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBvZmZzZXQ6IE1hdGgubWluKG5vZGVTaXplKHJhbmdlLnN0YXJ0Q29udGFpbmVyKSwgcmFuZ2Uuc3RhcnRPZmZzZXQpIH07XG4gICAgfVxufVxuXG5jb25zdCBuYXYgPSB0eXBlb2YgbmF2aWdhdG9yICE9IFwidW5kZWZpbmVkXCIgPyBuYXZpZ2F0b3IgOiBudWxsO1xuY29uc3QgZG9jID0gdHlwZW9mIGRvY3VtZW50ICE9IFwidW5kZWZpbmVkXCIgPyBkb2N1bWVudCA6IG51bGw7XG5jb25zdCBhZ2VudCA9IChuYXYgJiYgbmF2LnVzZXJBZ2VudCkgfHwgXCJcIjtcbmNvbnN0IGllX2VkZ2UgPSAvRWRnZVxcLyhcXGQrKS8uZXhlYyhhZ2VudCk7XG5jb25zdCBpZV91cHRvMTAgPSAvTVNJRSBcXGQvLmV4ZWMoYWdlbnQpO1xuY29uc3QgaWVfMTF1cCA9IC9UcmlkZW50XFwvKD86WzctOV18XFxkezIsfSlcXC4uKnJ2OihcXGQrKS8uZXhlYyhhZ2VudCk7XG5jb25zdCBpZSA9ICEhKGllX3VwdG8xMCB8fCBpZV8xMXVwIHx8IGllX2VkZ2UpO1xuY29uc3QgaWVfdmVyc2lvbiA9IGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSA6IGllXzExdXAgPyAraWVfMTF1cFsxXSA6IGllX2VkZ2UgPyAraWVfZWRnZVsxXSA6IDA7XG5jb25zdCBnZWNrbyA9ICFpZSAmJiAvZ2Vja29cXC8oXFxkKykvaS50ZXN0KGFnZW50KTtcbmdlY2tvICYmICsoL0ZpcmVmb3hcXC8oXFxkKykvLmV4ZWMoYWdlbnQpIHx8IFswLCAwXSlbMV07XG5jb25zdCBfY2hyb21lID0gIWllICYmIC9DaHJvbWVcXC8oXFxkKykvLmV4ZWMoYWdlbnQpO1xuY29uc3QgY2hyb21lID0gISFfY2hyb21lO1xuY29uc3QgY2hyb21lX3ZlcnNpb24gPSBfY2hyb21lID8gK19jaHJvbWVbMV0gOiAwO1xuY29uc3Qgc2FmYXJpID0gIWllICYmICEhbmF2ICYmIC9BcHBsZSBDb21wdXRlci8udGVzdChuYXYudmVuZG9yKTtcbi8vIElzIHRydWUgZm9yIGJvdGggaU9TIGFuZCBpUGFkT1MgZm9yIGNvbnZlbmllbmNlXG5jb25zdCBpb3MgPSBzYWZhcmkgJiYgKC9Nb2JpbGVcXC9cXHcrLy50ZXN0KGFnZW50KSB8fCAhIW5hdiAmJiBuYXYubWF4VG91Y2hQb2ludHMgPiAyKTtcbmNvbnN0IG1hYyA9IGlvcyB8fCAobmF2ID8gL01hYy8udGVzdChuYXYucGxhdGZvcm0pIDogZmFsc2UpO1xuY29uc3Qgd2luZG93cyA9IG5hdiA/IC9XaW4vLnRlc3QobmF2LnBsYXRmb3JtKSA6IGZhbHNlO1xuY29uc3QgYW5kcm9pZCA9IC9BbmRyb2lkIFxcZC8udGVzdChhZ2VudCk7XG5jb25zdCB3ZWJraXQgPSAhIWRvYyAmJiBcIndlYmtpdEZvbnRTbW9vdGhpbmdcIiBpbiBkb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuY29uc3Qgd2Via2l0X3ZlcnNpb24gPSB3ZWJraXQgPyArKC9cXGJBcHBsZVdlYktpdFxcLyhcXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSB8fCBbMCwgMF0pWzFdIDogMDtcblxuZnVuY3Rpb24gd2luZG93UmVjdChkb2MpIHtcbiAgICBsZXQgdnAgPSBkb2MuZGVmYXVsdFZpZXcgJiYgZG9jLmRlZmF1bHRWaWV3LnZpc3VhbFZpZXdwb3J0O1xuICAgIGlmICh2cClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IDAsIHJpZ2h0OiB2cC53aWR0aCxcbiAgICAgICAgICAgIHRvcDogMCwgYm90dG9tOiB2cC5oZWlnaHRcbiAgICAgICAgfTtcbiAgICByZXR1cm4geyBsZWZ0OiAwLCByaWdodDogZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgICAgdG9wOiAwLCBib3R0b206IGRvYy5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IH07XG59XG5mdW5jdGlvbiBnZXRTaWRlKHZhbHVlLCBzaWRlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm51bWJlclwiID8gdmFsdWUgOiB2YWx1ZVtzaWRlXTtcbn1cbmZ1bmN0aW9uIGNsaWVudFJlY3Qobm9kZSkge1xuICAgIGxldCByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyBBZGp1c3QgZm9yIGVsZW1lbnRzIHdpdGggc3R5bGUgXCJ0cmFuc2Zvcm06IHNjYWxlKClcIlxuICAgIGxldCBzY2FsZVggPSAocmVjdC53aWR0aCAvIG5vZGUub2Zmc2V0V2lkdGgpIHx8IDE7XG4gICAgbGV0IHNjYWxlWSA9IChyZWN0LmhlaWdodCAvIG5vZGUub2Zmc2V0SGVpZ2h0KSB8fCAxO1xuICAgIC8vIE1ha2Ugc3VyZSBzY3JvbGxiYXIgd2lkdGggaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHJlY3RhbmdsZVxuICAgIHJldHVybiB7IGxlZnQ6IHJlY3QubGVmdCwgcmlnaHQ6IHJlY3QubGVmdCArIG5vZGUuY2xpZW50V2lkdGggKiBzY2FsZVgsXG4gICAgICAgIHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC50b3AgKyBub2RlLmNsaWVudEhlaWdodCAqIHNjYWxlWSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsUmVjdEludG9WaWV3KHZpZXcsIHJlY3QsIHN0YXJ0RE9NKSB7XG4gICAgbGV0IHNjcm9sbFRocmVzaG9sZCA9IHZpZXcuc29tZVByb3AoXCJzY3JvbGxUaHJlc2hvbGRcIikgfHwgMCwgc2Nyb2xsTWFyZ2luID0gdmlldy5zb21lUHJvcChcInNjcm9sbE1hcmdpblwiKSB8fCA1O1xuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IHBhcmVudCA9IHN0YXJ0RE9NIHx8IHZpZXcuZG9tOzspIHtcbiAgICAgICAgaWYgKCFwYXJlbnQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHBhcmVudC5ub2RlVHlwZSAhPSAxKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZWx0ID0gcGFyZW50O1xuICAgICAgICBsZXQgYXRUb3AgPSBlbHQgPT0gZG9jLmJvZHk7XG4gICAgICAgIGxldCBib3VuZGluZyA9IGF0VG9wID8gd2luZG93UmVjdChkb2MpIDogY2xpZW50UmVjdChlbHQpO1xuICAgICAgICBsZXQgbW92ZVggPSAwLCBtb3ZlWSA9IDA7XG4gICAgICAgIGlmIChyZWN0LnRvcCA8IGJvdW5kaW5nLnRvcCArIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcInRvcFwiKSlcbiAgICAgICAgICAgIG1vdmVZID0gLShib3VuZGluZy50b3AgLSByZWN0LnRvcCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcInRvcFwiKSk7XG4gICAgICAgIGVsc2UgaWYgKHJlY3QuYm90dG9tID4gYm91bmRpbmcuYm90dG9tIC0gZ2V0U2lkZShzY3JvbGxUaHJlc2hvbGQsIFwiYm90dG9tXCIpKVxuICAgICAgICAgICAgbW92ZVkgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gYm91bmRpbmcuYm90dG9tIC0gYm91bmRpbmcudG9wXG4gICAgICAgICAgICAgICAgPyByZWN0LnRvcCArIGdldFNpZGUoc2Nyb2xsTWFyZ2luLCBcInRvcFwiKSAtIGJvdW5kaW5nLnRvcFxuICAgICAgICAgICAgICAgIDogcmVjdC5ib3R0b20gLSBib3VuZGluZy5ib3R0b20gKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJib3R0b21cIik7XG4gICAgICAgIGlmIChyZWN0LmxlZnQgPCBib3VuZGluZy5sZWZ0ICsgZ2V0U2lkZShzY3JvbGxUaHJlc2hvbGQsIFwibGVmdFwiKSlcbiAgICAgICAgICAgIG1vdmVYID0gLShib3VuZGluZy5sZWZ0IC0gcmVjdC5sZWZ0ICsgZ2V0U2lkZShzY3JvbGxNYXJnaW4sIFwibGVmdFwiKSk7XG4gICAgICAgIGVsc2UgaWYgKHJlY3QucmlnaHQgPiBib3VuZGluZy5yaWdodCAtIGdldFNpZGUoc2Nyb2xsVGhyZXNob2xkLCBcInJpZ2h0XCIpKVxuICAgICAgICAgICAgbW92ZVggPSByZWN0LnJpZ2h0IC0gYm91bmRpbmcucmlnaHQgKyBnZXRTaWRlKHNjcm9sbE1hcmdpbiwgXCJyaWdodFwiKTtcbiAgICAgICAgaWYgKG1vdmVYIHx8IG1vdmVZKSB7XG4gICAgICAgICAgICBpZiAoYXRUb3ApIHtcbiAgICAgICAgICAgICAgICBkb2MuZGVmYXVsdFZpZXcuc2Nyb2xsQnkobW92ZVgsIG1vdmVZKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydFggPSBlbHQuc2Nyb2xsTGVmdCwgc3RhcnRZID0gZWx0LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICBpZiAobW92ZVkpXG4gICAgICAgICAgICAgICAgICAgIGVsdC5zY3JvbGxUb3AgKz0gbW92ZVk7XG4gICAgICAgICAgICAgICAgaWYgKG1vdmVYKVxuICAgICAgICAgICAgICAgICAgICBlbHQuc2Nyb2xsTGVmdCArPSBtb3ZlWDtcbiAgICAgICAgICAgICAgICBsZXQgZFggPSBlbHQuc2Nyb2xsTGVmdCAtIHN0YXJ0WCwgZFkgPSBlbHQuc2Nyb2xsVG9wIC0gc3RhcnRZO1xuICAgICAgICAgICAgICAgIHJlY3QgPSB7IGxlZnQ6IHJlY3QubGVmdCAtIGRYLCB0b3A6IHJlY3QudG9wIC0gZFksIHJpZ2h0OiByZWN0LnJpZ2h0IC0gZFgsIGJvdHRvbTogcmVjdC5ib3R0b20gLSBkWSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb3MgPSBhdFRvcCA/IFwiZml4ZWRcIiA6IGdldENvbXB1dGVkU3R5bGUocGFyZW50KS5wb3NpdGlvbjtcbiAgICAgICAgaWYgKC9eKGZpeGVkfHN0aWNreSkkLy50ZXN0KHBvcykpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgcGFyZW50ID0gcG9zID09IFwiYWJzb2x1dGVcIiA/IHBhcmVudC5vZmZzZXRQYXJlbnQgOiBwYXJlbnROb2RlKHBhcmVudCk7XG4gICAgfVxufVxuLy8gU3RvcmUgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yJ3MgcGFyZW50IG5vZGVzLCBhbG9uZyB3aXRoXG4vLyB0aGUgdG9wIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgbmVhciB0aGUgdG9wIG9mIHRoZSBlZGl0b3IsIHdoaWNoXG4vLyB3aWxsIGJlIHVzZWQgdG8gbWFrZSBzdXJlIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHJlbWFpbnMgc3RhYmxlIGV2ZW5cbi8vIHdoZW4gdGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgYWJvdmUgY2hhbmdlcy5cbmZ1bmN0aW9uIHN0b3JlU2Nyb2xsUG9zKHZpZXcpIHtcbiAgICBsZXQgcmVjdCA9IHZpZXcuZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBzdGFydFkgPSBNYXRoLm1heCgwLCByZWN0LnRvcCk7XG4gICAgbGV0IHJlZkRPTSwgcmVmVG9wO1xuICAgIGZvciAobGV0IHggPSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLCB5ID0gc3RhcnRZICsgMTsgeSA8IE1hdGgubWluKGlubmVySGVpZ2h0LCByZWN0LmJvdHRvbSk7IHkgKz0gNSkge1xuICAgICAgICBsZXQgZG9tID0gdmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICAgIGlmICghZG9tIHx8IGRvbSA9PSB2aWV3LmRvbSB8fCAhdmlldy5kb20uY29udGFpbnMoZG9tKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbG9jYWxSZWN0ID0gZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAobG9jYWxSZWN0LnRvcCA+PSBzdGFydFkgLSAyMCkge1xuICAgICAgICAgICAgcmVmRE9NID0gZG9tO1xuICAgICAgICAgICAgcmVmVG9wID0gbG9jYWxSZWN0LnRvcDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlZkRPTTogcmVmRE9NLCByZWZUb3A6IHJlZlRvcCwgc3RhY2s6IHNjcm9sbFN0YWNrKHZpZXcuZG9tKSB9O1xufVxuZnVuY3Rpb24gc2Nyb2xsU3RhY2soZG9tKSB7XG4gICAgbGV0IHN0YWNrID0gW10sIGRvYyA9IGRvbS5vd25lckRvY3VtZW50O1xuICAgIGZvciAobGV0IGN1ciA9IGRvbTsgY3VyOyBjdXIgPSBwYXJlbnROb2RlKGN1cikpIHtcbiAgICAgICAgc3RhY2sucHVzaCh7IGRvbTogY3VyLCB0b3A6IGN1ci5zY3JvbGxUb3AsIGxlZnQ6IGN1ci5zY3JvbGxMZWZ0IH0pO1xuICAgICAgICBpZiAoZG9tID09IGRvYylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gc3RhY2s7XG59XG4vLyBSZXNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBlZGl0b3IncyBwYXJlbnQgbm9kZXMgdG8gdGhhdCB3aGF0XG4vLyBpdCB3YXMgYmVmb3JlLCB3aGVuIHN0b3JlU2Nyb2xsUG9zIHdhcyBjYWxsZWQuXG5mdW5jdGlvbiByZXNldFNjcm9sbFBvcyh7IHJlZkRPTSwgcmVmVG9wLCBzdGFjayB9KSB7XG4gICAgbGV0IG5ld1JlZlRvcCA9IHJlZkRPTSA/IHJlZkRPTS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgOiAwO1xuICAgIHJlc3RvcmVTY3JvbGxTdGFjayhzdGFjaywgbmV3UmVmVG9wID09IDAgPyAwIDogbmV3UmVmVG9wIC0gcmVmVG9wKTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JvbGxTdGFjayhzdGFjaywgZFRvcCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHsgZG9tLCB0b3AsIGxlZnQgfSA9IHN0YWNrW2ldO1xuICAgICAgICBpZiAoZG9tLnNjcm9sbFRvcCAhPSB0b3AgKyBkVG9wKVxuICAgICAgICAgICAgZG9tLnNjcm9sbFRvcCA9IHRvcCArIGRUb3A7XG4gICAgICAgIGlmIChkb20uc2Nyb2xsTGVmdCAhPSBsZWZ0KVxuICAgICAgICAgICAgZG9tLnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgIH1cbn1cbmxldCBwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkID0gbnVsbDtcbi8vIEZlYXR1cmUtZGV0ZWN0cyBzdXBwb3J0IGZvciAuZm9jdXMoe3ByZXZlbnRTY3JvbGw6IHRydWV9KSwgYW5kIHVzZXNcbi8vIGEgZmFsbGJhY2sga2x1ZGdlIHdoZW4gbm90IHN1cHBvcnRlZC5cbmZ1bmN0aW9uIGZvY3VzUHJldmVudFNjcm9sbChkb20pIHtcbiAgICBpZiAoZG9tLnNldEFjdGl2ZSlcbiAgICAgICAgcmV0dXJuIGRvbS5zZXRBY3RpdmUoKTsgLy8gaW4gSUVcbiAgICBpZiAocHJldmVudFNjcm9sbFN1cHBvcnRlZClcbiAgICAgICAgcmV0dXJuIGRvbS5mb2N1cyhwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKTtcbiAgICBsZXQgc3RvcmVkID0gc2Nyb2xsU3RhY2soZG9tKTtcbiAgICBkb20uZm9jdXMocHJldmVudFNjcm9sbFN1cHBvcnRlZCA9PSBudWxsID8ge1xuICAgICAgICBnZXQgcHJldmVudFNjcm9sbCgpIHtcbiAgICAgICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSB7IHByZXZlbnRTY3JvbGw6IHRydWUgfTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFwcmV2ZW50U2Nyb2xsU3VwcG9ydGVkKSB7XG4gICAgICAgIHByZXZlbnRTY3JvbGxTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVzdG9yZVNjcm9sbFN0YWNrKHN0b3JlZCwgMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZmluZE9mZnNldEluTm9kZShub2RlLCBjb29yZHMpIHtcbiAgICBsZXQgY2xvc2VzdCwgZHhDbG9zZXN0ID0gMmU4LCBjb29yZHNDbG9zZXN0LCBvZmZzZXQgPSAwO1xuICAgIGxldCByb3dCb3QgPSBjb29yZHMudG9wLCByb3dUb3AgPSBjb29yZHMudG9wO1xuICAgIGxldCBmaXJzdEJlbG93LCBjb29yZHNCZWxvdztcbiAgICBmb3IgKGxldCBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCwgY2hpbGRJbmRleCA9IDA7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nLCBjaGlsZEluZGV4KyspIHtcbiAgICAgICAgbGV0IHJlY3RzO1xuICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgIHJlY3RzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJlY3RzID0gdGV4dFJhbmdlKGNoaWxkKS5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSByZWN0c1tpXTtcbiAgICAgICAgICAgIGlmIChyZWN0LnRvcCA8PSByb3dCb3QgJiYgcmVjdC5ib3R0b20gPj0gcm93VG9wKSB7XG4gICAgICAgICAgICAgICAgcm93Qm90ID0gTWF0aC5tYXgocmVjdC5ib3R0b20sIHJvd0JvdCk7XG4gICAgICAgICAgICAgICAgcm93VG9wID0gTWF0aC5taW4ocmVjdC50b3AsIHJvd1RvcCk7XG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gcmVjdC5sZWZ0ID4gY29vcmRzLmxlZnQgPyByZWN0LmxlZnQgLSBjb29yZHMubGVmdFxuICAgICAgICAgICAgICAgICAgICA6IHJlY3QucmlnaHQgPCBjb29yZHMubGVmdCA/IGNvb3Jkcy5sZWZ0IC0gcmVjdC5yaWdodCA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGR4IDwgZHhDbG9zZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3QgPSBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgZHhDbG9zZXN0ID0gZHg7XG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc0Nsb3Nlc3QgPSBkeCAmJiBjbG9zZXN0Lm5vZGVUeXBlID09IDMgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiByZWN0LnJpZ2h0IDwgY29vcmRzLmxlZnQgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBjb29yZHMudG9wXG4gICAgICAgICAgICAgICAgICAgIH0gOiBjb29yZHM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxICYmIGR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2hpbGRJbmRleCArIChjb29yZHMubGVmdCA+PSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWN0LnRvcCA+IGNvb3Jkcy50b3AgJiYgIWZpcnN0QmVsb3cgJiYgcmVjdC5sZWZ0IDw9IGNvb3Jkcy5sZWZ0ICYmIHJlY3QucmlnaHQgPj0gY29vcmRzLmxlZnQpIHtcbiAgICAgICAgICAgICAgICBmaXJzdEJlbG93ID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgY29vcmRzQmVsb3cgPSB7IGxlZnQ6IE1hdGgubWF4KHJlY3QubGVmdCwgTWF0aC5taW4ocmVjdC5yaWdodCwgY29vcmRzLmxlZnQpKSwgdG9wOiByZWN0LnRvcCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjbG9zZXN0ICYmIChjb29yZHMubGVmdCA+PSByZWN0LnJpZ2h0ICYmIGNvb3Jkcy50b3AgPj0gcmVjdC50b3AgfHxcbiAgICAgICAgICAgICAgICBjb29yZHMubGVmdCA+PSByZWN0LmxlZnQgJiYgY29vcmRzLnRvcCA+PSByZWN0LmJvdHRvbSkpXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY2hpbGRJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjbG9zZXN0ICYmIGZpcnN0QmVsb3cpIHtcbiAgICAgICAgY2xvc2VzdCA9IGZpcnN0QmVsb3c7XG4gICAgICAgIGNvb3Jkc0Nsb3Nlc3QgPSBjb29yZHNCZWxvdztcbiAgICAgICAgZHhDbG9zZXN0ID0gMDtcbiAgICB9XG4gICAgaWYgKGNsb3Nlc3QgJiYgY2xvc2VzdC5ub2RlVHlwZSA9PSAzKVxuICAgICAgICByZXR1cm4gZmluZE9mZnNldEluVGV4dChjbG9zZXN0LCBjb29yZHNDbG9zZXN0KTtcbiAgICBpZiAoIWNsb3Nlc3QgfHwgKGR4Q2xvc2VzdCAmJiBjbG9zZXN0Lm5vZGVUeXBlID09IDEpKVxuICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQgfTtcbiAgICByZXR1cm4gZmluZE9mZnNldEluTm9kZShjbG9zZXN0LCBjb29yZHNDbG9zZXN0KTtcbn1cbmZ1bmN0aW9uIGZpbmRPZmZzZXRJblRleHQobm9kZSwgY29vcmRzKSB7XG4gICAgbGV0IGxlbiA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgcmFuZ2Uuc2V0RW5kKG5vZGUsIGkgKyAxKTtcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnQobm9kZSwgaSk7XG4gICAgICAgIGxldCByZWN0ID0gc2luZ2xlUmVjdChyYW5nZSwgMSk7XG4gICAgICAgIGlmIChyZWN0LnRvcCA9PSByZWN0LmJvdHRvbSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IGkgKyAoY29vcmRzLmxlZnQgPj0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMiA/IDEgOiAwKSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBub2RlLCBvZmZzZXQ6IDAgfTtcbn1cbmZ1bmN0aW9uIGluUmVjdChjb29yZHMsIHJlY3QpIHtcbiAgICByZXR1cm4gY29vcmRzLmxlZnQgPj0gcmVjdC5sZWZ0IC0gMSAmJiBjb29yZHMubGVmdCA8PSByZWN0LnJpZ2h0ICsgMSAmJlxuICAgICAgICBjb29yZHMudG9wID49IHJlY3QudG9wIC0gMSAmJiBjb29yZHMudG9wIDw9IHJlY3QuYm90dG9tICsgMTtcbn1cbmZ1bmN0aW9uIHRhcmdldEtsdWRnZShkb20sIGNvb3Jkcykge1xuICAgIGxldCBwYXJlbnQgPSBkb20ucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50ICYmIC9ebGkkL2kudGVzdChwYXJlbnQubm9kZU5hbWUpICYmIGNvb3Jkcy5sZWZ0IDwgZG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpXG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgcmV0dXJuIGRvbTtcbn1cbmZ1bmN0aW9uIHBvc0Zyb21FbGVtZW50KHZpZXcsIGVsdCwgY29vcmRzKSB7XG4gICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSBmaW5kT2Zmc2V0SW5Ob2RlKGVsdCwgY29vcmRzKSwgYmlhcyA9IC0xO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgIW5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBsZXQgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGJpYXMgPSByZWN0LmxlZnQgIT0gcmVjdC5yaWdodCAmJiBjb29yZHMubGVmdCA+IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShub2RlLCBvZmZzZXQsIGJpYXMpO1xufVxuZnVuY3Rpb24gcG9zRnJvbUNhcmV0KHZpZXcsIG5vZGUsIG9mZnNldCwgY29vcmRzKSB7XG4gICAgLy8gQnJvd3NlciAoaW4gY2FyZXRQb3NpdGlvbi9SYW5nZUZyb21Qb2ludCkgd2lsbCBhZ3Jlc3NpdmVseVxuICAgIC8vIG5vcm1hbGl6ZSB0b3dhcmRzIG5lYXJieSBpbmxpbmUgbm9kZXMuIFNpbmNlIHdlIGFyZSBpbnRlcmVzdGVkIGluXG4gICAgLy8gcG9zaXRpb25zIGJldHdlZW4gYmxvY2sgbm9kZXMgdG9vLCB3ZSBmaXJzdCB3YWxrIHVwIHRoZSBoaWVyYXJjaHlcbiAgICAvLyBvZiBub2RlcyB0byBzZWUgaWYgdGhlcmUgYXJlIGJsb2NrIG5vZGVzIHRoYXQgdGhlIGNvb3JkaW5hdGVzXG4gICAgLy8gZmFsbCBvdXRzaWRlIG9mLiBJZiBzbywgd2UgdGFrZSB0aGUgcG9zaXRpb24gYmVmb3JlL2FmdGVyIHRoYXRcbiAgICAvLyBibG9jay4gSWYgbm90LCB3ZSBjYWxsIGBwb3NGcm9tRE9NYCBvbiB0aGUgcmF3IG5vZGUvb2Zmc2V0LlxuICAgIGxldCBvdXRzaWRlQmxvY2sgPSAtMTtcbiAgICBmb3IgKGxldCBjdXIgPSBub2RlLCBzYXdCbG9jayA9IGZhbHNlOzspIHtcbiAgICAgICAgaWYgKGN1ciA9PSB2aWV3LmRvbSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBsZXQgZGVzYyA9IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyhjdXIsIHRydWUpLCByZWN0O1xuICAgICAgICBpZiAoIWRlc2MpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGRlc2MuZG9tLm5vZGVUeXBlID09IDEgJiYgKGRlc2Mubm9kZS5pc0Jsb2NrICYmIGRlc2MucGFyZW50IHx8ICFkZXNjLmNvbnRlbnRET00pICYmXG4gICAgICAgICAgICAvLyBJZ25vcmUgZWxlbWVudHMgd2l0aCB6ZXJvLXNpemUgYm91bmRpbmcgcmVjdGFuZ2xlc1xuICAgICAgICAgICAgKChyZWN0ID0gZGVzYy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLndpZHRoIHx8IHJlY3QuaGVpZ2h0KSkge1xuICAgICAgICAgICAgaWYgKGRlc2Mubm9kZS5pc0Jsb2NrICYmIGRlc2MucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhcHBseSB0aGUgaG9yaXpvbnRhbCB0ZXN0IHRvIHRoZSBpbm5lcm1vc3QgYmxvY2suIFZlcnRpY2FsIGZvciBhbnkgcGFyZW50LlxuICAgICAgICAgICAgICAgIGlmICghc2F3QmxvY2sgJiYgcmVjdC5sZWZ0ID4gY29vcmRzLmxlZnQgfHwgcmVjdC50b3AgPiBjb29yZHMudG9wKVxuICAgICAgICAgICAgICAgICAgICBvdXRzaWRlQmxvY2sgPSBkZXNjLnBvc0JlZm9yZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghc2F3QmxvY2sgJiYgcmVjdC5yaWdodCA8IGNvb3Jkcy5sZWZ0IHx8IHJlY3QuYm90dG9tIDwgY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb3V0c2lkZUJsb2NrID0gZGVzYy5wb3NBZnRlcjtcbiAgICAgICAgICAgICAgICBzYXdCbG9jayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRlc2MuY29udGVudERPTSAmJiBvdXRzaWRlQmxvY2sgPCAwICYmICFkZXNjLm5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluc2lkZSBhIGxlYWYsIHJldHVybiB0aGUgc2lkZSBvZiB0aGUgbGVhZiBjbG9zZXIgdG8gdGhlIGNvb3Jkc1xuICAgICAgICAgICAgICAgIGxldCBiZWZvcmUgPSBkZXNjLm5vZGUuaXNCbG9jayA/IGNvb3Jkcy50b3AgPCAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIDogY29vcmRzLmxlZnQgPCAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyO1xuICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUgPyBkZXNjLnBvc0JlZm9yZSA6IGRlc2MucG9zQWZ0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VyID0gZGVzYy5kb20ucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHNpZGVCbG9jayA+IC0xID8gb3V0c2lkZUJsb2NrIDogdmlldy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCAtMSk7XG59XG5mdW5jdGlvbiBlbGVtZW50RnJvbVBvaW50KGVsZW1lbnQsIGNvb3JkcywgYm94KSB7XG4gICAgbGV0IGxlbiA9IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgaWYgKGxlbiAmJiBib3gudG9wIDwgYm94LmJvdHRvbSkge1xuICAgICAgICBmb3IgKGxldCBzdGFydEkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihsZW4gLSAxLCBNYXRoLmZsb29yKGxlbiAqIChjb29yZHMudG9wIC0gYm94LnRvcCkgLyAoYm94LmJvdHRvbSAtIGJveC50b3ApKSAtIDIpKSwgaSA9IHN0YXJ0STs7KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0cyA9IGNoaWxkLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWN0cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVjdCA9IHJlY3RzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5SZWN0KGNvb3JkcywgcmVjdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudEZyb21Qb2ludChjaGlsZCwgY29vcmRzLCByZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGkgPSAoaSArIDEpICUgbGVuKSA9PSBzdGFydEkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG4vLyBHaXZlbiBhbiB4LHkgcG9zaXRpb24gb24gdGhlIGVkaXRvciwgZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQuXG5mdW5jdGlvbiBwb3NBdENvb3Jkcyh2aWV3LCBjb29yZHMpIHtcbiAgICBsZXQgZG9jID0gdmlldy5kb20ub3duZXJEb2N1bWVudCwgbm9kZSwgb2Zmc2V0ID0gMDtcbiAgICBsZXQgY2FyZXQgPSBjYXJldEZyb21Qb2ludChkb2MsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBpZiAoY2FyZXQpXG4gICAgICAgICh7IG5vZGUsIG9mZnNldCB9ID0gY2FyZXQpO1xuICAgIGxldCBlbHQgPSAodmlldy5yb290LmVsZW1lbnRGcm9tUG9pbnQgPyB2aWV3LnJvb3QgOiBkb2MpXG4gICAgICAgIC5lbGVtZW50RnJvbVBvaW50KGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKTtcbiAgICBsZXQgcG9zO1xuICAgIGlmICghZWx0IHx8ICF2aWV3LmRvbS5jb250YWlucyhlbHQubm9kZVR5cGUgIT0gMSA/IGVsdC5wYXJlbnROb2RlIDogZWx0KSkge1xuICAgICAgICBsZXQgYm94ID0gdmlldy5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmICghaW5SZWN0KGNvb3JkcywgYm94KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBlbHQgPSBlbGVtZW50RnJvbVBvaW50KHZpZXcuZG9tLCBjb29yZHMsIGJveCk7XG4gICAgICAgIGlmICghZWx0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFNhZmFyaSdzIGNhcmV0UmFuZ2VGcm9tUG9pbnQgcmV0dXJucyBub25zZW5zZSB3aGVuIG9uIGEgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgICBpZiAoc2FmYXJpKSB7XG4gICAgICAgIGZvciAobGV0IHAgPSBlbHQ7IG5vZGUgJiYgcDsgcCA9IHBhcmVudE5vZGUocCkpXG4gICAgICAgICAgICBpZiAocC5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgbm9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWx0ID0gdGFyZ2V0S2x1ZGdlKGVsdCwgY29vcmRzKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICBpZiAoZ2Vja28gJiYgbm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHdpbGwgc29tZXRpbWVzIHJldHVybiBvZmZzZXRzIGludG8gPGlucHV0PiBub2Rlcywgd2hpY2hcbiAgICAgICAgICAgIC8vIGhhdmUgbm8gYWN0dWFsIGNoaWxkcmVuLCBmcm9tIGNhcmV0UG9zaXRpb25Gcm9tUG9pbnQgKCM5NTMpXG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAgICAgICAgLy8gSXQnbGwgYWxzbyBtb3ZlIHRoZSByZXR1cm5lZCBwb3NpdGlvbiBiZWZvcmUgaW1hZ2Ugbm9kZXMsXG4gICAgICAgICAgICAvLyBldmVuIGlmIHRob3NlIGFyZSBiZWhpbmQgaXQuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0sIGJveDtcbiAgICAgICAgICAgICAgICBpZiAobmV4dC5ub2RlTmFtZSA9PSBcIklNR1wiICYmIChib3ggPSBuZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS5yaWdodCA8PSBjb29yZHMubGVmdCAmJlxuICAgICAgICAgICAgICAgICAgICBib3guYm90dG9tID4gY29vcmRzLnRvcClcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZXY7XG4gICAgICAgIC8vIFdoZW4gY2xpY2tpbmcgYWJvdmUgdGhlIHJpZ2h0IHNpZGUgb2YgYW4gdW5lZGl0YWJsZSBub2RlLCBDaHJvbWUgd2lsbCByZXBvcnQgYSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdGhhdCBub2RlLlxuICAgICAgICBpZiAod2Via2l0ICYmIG9mZnNldCAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgKHByZXYgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0pLm5vZGVUeXBlID09IDEgJiZcbiAgICAgICAgICAgIHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIiAmJiBwcmV2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+PSBjb29yZHMudG9wKVxuICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgIC8vIFN1c3BpY2lvdXNseSBzcGVjaWZpYyBrbHVkZ2UgdG8gd29yayBhcm91bmQgY2FyZXQqRnJvbVBvaW50XG4gICAgICAgIC8vIG5ldmVyIHJldHVybmluZyBhIHBvc2l0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50XG4gICAgICAgIGlmIChub2RlID09IHZpZXcuZG9tICYmIG9mZnNldCA9PSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSAmJiBub2RlLmxhc3RDaGlsZC5ub2RlVHlwZSA9PSAxICYmXG4gICAgICAgICAgICBjb29yZHMudG9wID4gbm9kZS5sYXN0Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKVxuICAgICAgICAgICAgcG9zID0gdmlldy5zdGF0ZS5kb2MuY29udGVudC5zaXplO1xuICAgICAgICAvLyBJZ25vcmUgcG9zaXRpb25zIGRpcmVjdGx5IGFmdGVyIGEgQlIsIHNpbmNlIGNhcmV0KkZyb21Qb2ludFxuICAgICAgICAvLyAncm91bmQgdXAnIHBvc2l0aW9ucyB0aGF0IHdvdWxkIGJlIG1vcmUgYWNjdXJhdGVseSBwbGFjZWRcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBCUiBub2RlLlxuICAgICAgICBlbHNlIGlmIChvZmZzZXQgPT0gMCB8fCBub2RlLm5vZGVUeXBlICE9IDEgfHwgbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdLm5vZGVOYW1lICE9IFwiQlJcIilcbiAgICAgICAgICAgIHBvcyA9IHBvc0Zyb21DYXJldCh2aWV3LCBub2RlLCBvZmZzZXQsIGNvb3Jkcyk7XG4gICAgfVxuICAgIGlmIChwb3MgPT0gbnVsbClcbiAgICAgICAgcG9zID0gcG9zRnJvbUVsZW1lbnQodmlldywgZWx0LCBjb29yZHMpO1xuICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGVsdCwgdHJ1ZSk7XG4gICAgcmV0dXJuIHsgcG9zLCBpbnNpZGU6IGRlc2MgPyBkZXNjLnBvc0F0U3RhcnQgLSBkZXNjLmJvcmRlciA6IC0xIH07XG59XG5mdW5jdGlvbiBub25aZXJvKHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdC50b3AgPCByZWN0LmJvdHRvbSB8fCByZWN0LmxlZnQgPCByZWN0LnJpZ2h0O1xufVxuZnVuY3Rpb24gc2luZ2xlUmVjdCh0YXJnZXQsIGJpYXMpIHtcbiAgICBsZXQgcmVjdHMgPSB0YXJnZXQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBmaXJzdCA9IHJlY3RzW2JpYXMgPCAwID8gMCA6IHJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobm9uWmVybyhmaXJzdCkpXG4gICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHJlY3RzLCBub25aZXJvKSB8fCB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG59XG5jb25zdCBCSURJID0gL1tcXHUwNTkwLVxcdTA1ZjRcXHUwNjAwLVxcdTA2ZmZcXHUwNzAwLVxcdTA4YWNdLztcbi8vIEdpdmVuIGEgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IG1vZGVsLCBnZXQgYSBib3VuZGluZyBib3ggb2YgdGhlXG4vLyBjaGFyYWN0ZXIgYXQgdGhhdCBwb3NpdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdy5cbmZ1bmN0aW9uIGNvb3Jkc0F0UG9zKHZpZXcsIHBvcywgc2lkZSkge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCwgYXRvbSB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCBzaWRlIDwgMCA/IC0xIDogMSk7XG4gICAgbGV0IHN1cHBvcnRFbXB0eVJhbmdlID0gd2Via2l0IHx8IGdlY2tvO1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgLy8gVGhlc2UgYnJvd3NlcnMgc3VwcG9ydCBxdWVyeWluZyBlbXB0eSB0ZXh0IHJhbmdlcy4gUHJlZmVyIHRoYXQgaW5cbiAgICAgICAgLy8gYmlkaSBjb250ZXh0IG9yIHdoZW4gYXQgdGhlIGVuZCBvZiBhIG5vZGUuXG4gICAgICAgIGlmIChzdXBwb3J0RW1wdHlSYW5nZSAmJiAoQklESS50ZXN0KG5vZGUubm9kZVZhbHVlKSB8fCAoc2lkZSA8IDAgPyAhb2Zmc2V0IDogb2Zmc2V0ID09IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkpKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0KSwgc2lkZSk7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHJldHVybnMgYmFkIHJlc3VsdHMgKHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHNwYWNlKVxuICAgICAgICAgICAgLy8gd2hlbiBxdWVyeWluZyBhIHBvc2l0aW9uIGRpcmVjdGx5IGFmdGVyIGxpbmUtYnJva2VuXG4gICAgICAgICAgICAvLyB3aGl0ZXNwYWNlLiBEZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIGFuZCBrbHVkZ2UgYXJvdW5kIGl0XG4gICAgICAgICAgICBpZiAoZ2Vja28gJiYgb2Zmc2V0ICYmIC9cXHMvLnRlc3Qobm9kZS5ub2RlVmFsdWVbb2Zmc2V0IC0gMV0pICYmIG9mZnNldCA8IG5vZGUubm9kZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCByZWN0QmVmb3JlID0gc2luZ2xlUmVjdCh0ZXh0UmFuZ2Uobm9kZSwgb2Zmc2V0IC0gMSwgb2Zmc2V0IC0gMSksIC0xKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjdEJlZm9yZS50b3AgPT0gcmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlY3RBZnRlciA9IHNpbmdsZVJlY3QodGV4dFJhbmdlKG5vZGUsIG9mZnNldCwgb2Zmc2V0ICsgMSksIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3RBZnRlci50b3AgIT0gcmVjdC50b3ApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblYocmVjdEFmdGVyLCByZWN0QWZ0ZXIubGVmdCA8IHJlY3RCZWZvcmUubGVmdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IG9mZnNldCwgdG8gPSBvZmZzZXQsIHRha2VTaWRlID0gc2lkZSA8IDAgPyAxIDogLTE7XG4gICAgICAgICAgICBpZiAoc2lkZSA8IDAgJiYgIW9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRvKys7XG4gICAgICAgICAgICAgICAgdGFrZVNpZGUgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPj0gMCAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgICAgIHRha2VTaWRlID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpZGUgPCAwKSB7XG4gICAgICAgICAgICAgICAgZnJvbS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG8rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRleHRSYW5nZShub2RlLCBmcm9tLCB0byksIHRha2VTaWRlKSwgdGFrZVNpZGUgPCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgJGRvbSA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUocG9zIC0gKGF0b20gfHwgMCkpO1xuICAgIC8vIFJldHVybiBhIGhvcml6b250YWwgbGluZSBpbiBibG9jayBjb250ZXh0XG4gICAgaWYgKCEkZG9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChiZWZvcmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXRvbSA9PSBudWxsICYmIG9mZnNldCA8IG5vZGVTaXplKG5vZGUpKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChhZnRlci5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuSChhZnRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXR0ZW5IKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHNpZGUgPj0gMCk7XG4gICAgfVxuICAgIC8vIElubGluZSwgbm90IGluIHRleHQgbm9kZSAodGhpcyBpcyBub3QgQmlkaS1zYWZlKVxuICAgIGlmIChhdG9tID09IG51bGwgJiYgb2Zmc2V0ICYmIChzaWRlIDwgMCB8fCBvZmZzZXQgPT0gbm9kZVNpemUobm9kZSkpKSB7XG4gICAgICAgIGxldCBiZWZvcmUgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgIGxldCB0YXJnZXQgPSBiZWZvcmUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShiZWZvcmUsIG5vZGVTaXplKGJlZm9yZSkgLSAoc3VwcG9ydEVtcHR5UmFuZ2UgPyAwIDogMSkpXG4gICAgICAgICAgICAvLyBCUiBub2RlcyB0ZW5kIHRvIG9ubHkgcmV0dXJuIHRoZSByZWN0YW5nbGUgYmVmb3JlIHRoZW0uXG4gICAgICAgICAgICAvLyBPbmx5IHVzZSB0aGVtIGlmIHRoZXkgYXJlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlaXIgcGFyZW50XG4gICAgICAgICAgICA6IGJlZm9yZS5ub2RlVHlwZSA9PSAxICYmIChiZWZvcmUubm9kZU5hbWUgIT0gXCJCUlwiIHx8ICFiZWZvcmUubmV4dFNpYmxpbmcpID8gYmVmb3JlIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgMSksIGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKGF0b20gPT0gbnVsbCAmJiBvZmZzZXQgPCBub2RlU2l6ZShub2RlKSkge1xuICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgd2hpbGUgKGFmdGVyLnBtVmlld0Rlc2MgJiYgYWZ0ZXIucG1WaWV3RGVzYy5pZ25vcmVGb3JDb29yZHMpXG4gICAgICAgICAgICBhZnRlciA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gIWFmdGVyID8gbnVsbCA6IGFmdGVyLm5vZGVUeXBlID09IDMgPyB0ZXh0UmFuZ2UoYWZ0ZXIsIDAsIChzdXBwb3J0RW1wdHlSYW5nZSA/IDAgOiAxKSlcbiAgICAgICAgICAgIDogYWZ0ZXIubm9kZVR5cGUgPT0gMSA/IGFmdGVyIDogbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KHRhcmdldCwgLTEpLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gQWxsIGVsc2UgZmFpbGVkLCBqdXN0IHRyeSB0byBnZXQgYSByZWN0YW5nbGUgZm9yIHRoZSB0YXJnZXQgbm9kZVxuICAgIHJldHVybiBmbGF0dGVuVihzaW5nbGVSZWN0KG5vZGUubm9kZVR5cGUgPT0gMyA/IHRleHRSYW5nZShub2RlKSA6IG5vZGUsIC1zaWRlKSwgc2lkZSA+PSAwKTtcbn1cbmZ1bmN0aW9uIGZsYXR0ZW5WKHJlY3QsIGxlZnQpIHtcbiAgICBpZiAocmVjdC53aWR0aCA9PSAwKVxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICBsZXQgeCA9IGxlZnQgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0O1xuICAgIHJldHVybiB7IHRvcDogcmVjdC50b3AsIGJvdHRvbTogcmVjdC5ib3R0b20sIGxlZnQ6IHgsIHJpZ2h0OiB4IH07XG59XG5mdW5jdGlvbiBmbGF0dGVuSChyZWN0LCB0b3ApIHtcbiAgICBpZiAocmVjdC5oZWlnaHQgPT0gMClcbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgbGV0IHkgPSB0b3AgPyByZWN0LnRvcCA6IHJlY3QuYm90dG9tO1xuICAgIHJldHVybiB7IHRvcDogeSwgYm90dG9tOiB5LCBsZWZ0OiByZWN0LmxlZnQsIHJpZ2h0OiByZWN0LnJpZ2h0IH07XG59XG5mdW5jdGlvbiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCBmKSB7XG4gICAgbGV0IHZpZXdTdGF0ZSA9IHZpZXcuc3RhdGUsIGFjdGl2ZSA9IHZpZXcucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgIGlmICh2aWV3U3RhdGUgIT0gc3RhdGUpXG4gICAgICAgIHZpZXcudXBkYXRlU3RhdGUoc3RhdGUpO1xuICAgIGlmIChhY3RpdmUgIT0gdmlldy5kb20pXG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZigpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHZpZXdTdGF0ZSAhPSBzdGF0ZSlcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlld1N0YXRlKTtcbiAgICAgICAgaWYgKGFjdGl2ZSAhPSB2aWV3LmRvbSAmJiBhY3RpdmUpXG4gICAgICAgICAgICBhY3RpdmUuZm9jdXMoKTtcbiAgICB9XG59XG4vLyBXaGV0aGVyIHZlcnRpY2FsIHBvc2l0aW9uIG1vdGlvbiBpbiBhIGdpdmVuIGRpcmVjdGlvblxuLy8gZnJvbSBhIHBvc2l0aW9uIHdvdWxkIGxlYXZlIGEgdGV4dCBibG9jay5cbmZ1bmN0aW9uIGVuZE9mVGV4dGJsb2NrVmVydGljYWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCBzZWwgPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0ICRwb3MgPSBkaXIgPT0gXCJ1cFwiID8gc2VsLiRmcm9tIDogc2VsLiR0bztcbiAgICByZXR1cm4gd2l0aEZsdXNoZWRTdGF0ZSh2aWV3LCBzdGF0ZSwgKCkgPT4ge1xuICAgICAgICBsZXQgeyBub2RlOiBkb20gfSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKCRwb3MucG9zLCBkaXIgPT0gXCJ1cFwiID8gLTEgOiAxKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgbGV0IG5lYXJlc3QgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZG9tLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghbmVhcmVzdClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChuZWFyZXN0Lm5vZGUuaXNCbG9jaykge1xuICAgICAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuY29udGVudERPTSB8fCBuZWFyZXN0LmRvbTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbSA9IG5lYXJlc3QuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvb3JkcyA9IGNvb3Jkc0F0UG9zKHZpZXcsICRwb3MucG9zLCAxKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgPSBkb20uZmlyc3RDaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGxldCBib3hlcztcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxKVxuICAgICAgICAgICAgICAgIGJveGVzID0gY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgYm94ZXMgPSB0ZXh0UmFuZ2UoY2hpbGQsIDAsIGNoaWxkLm5vZGVWYWx1ZS5sZW5ndGgpLmdldENsaWVudFJlY3RzKCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJveCA9IGJveGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChib3guYm90dG9tID4gYm94LnRvcCArIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgKGRpciA9PSBcInVwXCIgPyBjb29yZHMudG9wIC0gYm94LnRvcCA+IChib3guYm90dG9tIC0gY29vcmRzLnRvcCkgKiAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJveC5ib3R0b20gLSBjb29yZHMuYm90dG9tID4gKGNvb3Jkcy5ib3R0b20gLSBib3gudG9wKSAqIDIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5jb25zdCBtYXliZVJUTCA9IC9bXFx1MDU5MC1cXHUwOGFjXS87XG5mdW5jdGlvbiBlbmRPZlRleHRibG9ja0hvcml6b250YWwodmlldywgc3RhdGUsIGRpcikge1xuICAgIGxldCB7ICRoZWFkIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCEkaGVhZC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgb2Zmc2V0ID0gJGhlYWQucGFyZW50T2Zmc2V0LCBhdFN0YXJ0ID0gIW9mZnNldCwgYXRFbmQgPSBvZmZzZXQgPT0gJGhlYWQucGFyZW50LmNvbnRlbnQuc2l6ZTtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbClcbiAgICAgICAgcmV0dXJuICRoZWFkLnBvcyA9PSAkaGVhZC5zdGFydCgpIHx8ICRoZWFkLnBvcyA9PSAkaGVhZC5lbmQoKTtcbiAgICAvLyBJZiB0aGUgdGV4dGJsb2NrIGlzIGFsbCBMVFIsIG9yIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydFxuICAgIC8vIFNlbGVjdGlvbi5tb2RpZnkgKEVkZ2UpLCBmYWxsIGJhY2sgdG8gYSBwcmltaXRpdmUgYXBwcm9hY2hcbiAgICBpZiAoIW1heWJlUlRMLnRlc3QoJGhlYWQucGFyZW50LnRleHRDb250ZW50KSB8fCAhc2VsLm1vZGlmeSlcbiAgICAgICAgcmV0dXJuIGRpciA9PSBcImxlZnRcIiB8fCBkaXIgPT0gXCJiYWNrd2FyZFwiID8gYXRTdGFydCA6IGF0RW5kO1xuICAgIHJldHVybiB3aXRoRmx1c2hlZFN0YXRlKHZpZXcsIHN0YXRlLCAoKSA9PiB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBodWdlIGhhY2ssIGJ1dCBhcHBlYXJzIHRvIGJlIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBjdXJyZW50bHkgZG86IHVzZSBgU2VsZWN0aW9uLm1vZGlmeWAgdG8gbW92ZSB0aGUgc2VsZWN0aW9uIGJ5XG4gICAgICAgIC8vIG9uZSBjaGFyYWN0ZXIsIGFuZCBzZWUgaWYgdGhhdCBtb3ZlcyB0aGUgY3Vyc29yIG91dCBvZiB0aGVcbiAgICAgICAgLy8gdGV4dGJsb2NrIChvciBkb2Vzbid0IG1vdmUgaXQgYXQgYWxsLCB3aGVuIGF0IHRoZSBzdGFydC9lbmQgb2ZcbiAgICAgICAgLy8gdGhlIGRvY3VtZW50KS5cbiAgICAgICAgbGV0IHsgZm9jdXNOb2RlOiBvbGROb2RlLCBmb2N1c09mZnNldDogb2xkT2ZmLCBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG9sZEJpZGlMZXZlbCA9IHNlbC5jYXJldEJpZGlMZXZlbCAvLyBPbmx5IGZvciBGaXJlZm94XG4gICAgICAgIDtcbiAgICAgICAgc2VsLm1vZGlmeShcIm1vdmVcIiwgZGlyLCBcImNoYXJhY3RlclwiKTtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9ICRoZWFkLmRlcHRoID8gdmlldy5kb2NWaWV3LmRvbUFmdGVyUG9zKCRoZWFkLmJlZm9yZSgpKSA6IHZpZXcuZG9tO1xuICAgICAgICBsZXQgeyBmb2N1c05vZGU6IG5ld05vZGUsIGZvY3VzT2Zmc2V0OiBuZXdPZmYgfSA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ld05vZGUgJiYgIXBhcmVudERPTS5jb250YWlucyhuZXdOb2RlLm5vZGVUeXBlID09IDEgPyBuZXdOb2RlIDogbmV3Tm9kZS5wYXJlbnROb2RlKSB8fFxuICAgICAgICAgICAgKG9sZE5vZGUgPT0gbmV3Tm9kZSAmJiBvbGRPZmYgPT0gbmV3T2ZmKTtcbiAgICAgICAgLy8gUmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWwuY29sbGFwc2UoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChvbGROb2RlICYmIChvbGROb2RlICE9IGFuY2hvck5vZGUgfHwgb2xkT2ZmICE9IGFuY2hvck9mZnNldCkgJiYgc2VsLmV4dGVuZClcbiAgICAgICAgICAgICAgICBzZWwuZXh0ZW5kKG9sZE5vZGUsIG9sZE9mZik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICBpZiAob2xkQmlkaUxldmVsICE9IG51bGwpXG4gICAgICAgICAgICBzZWwuY2FyZXRCaWRpTGV2ZWwgPSBvbGRCaWRpTGV2ZWw7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5sZXQgY2FjaGVkU3RhdGUgPSBudWxsO1xubGV0IGNhY2hlZERpciA9IG51bGw7XG5sZXQgY2FjaGVkUmVzdWx0ID0gZmFsc2U7XG5mdW5jdGlvbiBlbmRPZlRleHRibG9jayh2aWV3LCBzdGF0ZSwgZGlyKSB7XG4gICAgaWYgKGNhY2hlZFN0YXRlID09IHN0YXRlICYmIGNhY2hlZERpciA9PSBkaXIpXG4gICAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgY2FjaGVkU3RhdGUgPSBzdGF0ZTtcbiAgICBjYWNoZWREaXIgPSBkaXI7XG4gICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9IGRpciA9PSBcInVwXCIgfHwgZGlyID09IFwiZG93blwiXG4gICAgICAgID8gZW5kT2ZUZXh0YmxvY2tWZXJ0aWNhbCh2aWV3LCBzdGF0ZSwgZGlyKVxuICAgICAgICA6IGVuZE9mVGV4dGJsb2NrSG9yaXpvbnRhbCh2aWV3LCBzdGF0ZSwgZGlyKTtcbn1cblxuLy8gVmlldyBkZXNjcmlwdGlvbnMgYXJlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGRlc2NyaWJlIHRoZSBET00gdGhhdCBpc1xuLy8gdXNlZCB0byByZXByZXNlbnQgdGhlIGVkaXRvcidzIGNvbnRlbnQuIFRoZXkgYXJlIHVzZWQgZm9yOlxuLy9cbi8vIC0gSW5jcmVtZW50YWwgcmVkcmF3aW5nIHdoZW4gdGhlIGRvY3VtZW50IGNoYW5nZXNcbi8vXG4vLyAtIEZpZ3VyaW5nIG91dCB3aGF0IHBhcnQgb2YgdGhlIGRvY3VtZW50IGEgZ2l2ZW4gRE9NIHBvc2l0aW9uXG4vLyAgIGNvcnJlc3BvbmRzIHRvXG4vL1xuLy8gLSBXaXJpbmcgaW4gY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZWRpdGluZyBpbnRlcmZhY2UgZm9yIGFcbi8vICAgZ2l2ZW4gbm9kZVxuLy9cbi8vIFRoZXkgZm9ybSBhIGRvdWJseS1saW5rZWQgbXV0YWJsZSB0cmVlLCBzdGFydGluZyBhdCBgdmlldy5kb2NWaWV3YC5cbmNvbnN0IE5PVF9ESVJUWSA9IDAsIENISUxEX0RJUlRZID0gMSwgQ09OVEVOVF9ESVJUWSA9IDIsIE5PREVfRElSVFkgPSAzO1xuLy8gU3VwZXJjbGFzcyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRpb25zLiBEZWZpbmVzIHRoZWlyXG4vLyBiYXNpYyBzdHJ1Y3R1cmUgYW5kIHNoYXJlZCBtZXRob2RzLlxuY2xhc3MgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgY2hpbGRyZW4sIGRvbSwgXG4gICAgLy8gVGhpcyBpcyB0aGUgbm9kZSB0aGF0IGhvbGRzIHRoZSBjaGlsZCB2aWV3cy4gSXQgbWF5IGJlIG51bGwgZm9yXG4gICAgLy8gZGVzY3MgdGhhdCBkb24ndCBoYXZlIGNoaWxkcmVuLlxuICAgIGNvbnRlbnRET00pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5kb20gPSBkb207XG4gICAgICAgIHRoaXMuY29udGVudERPTSA9IGNvbnRlbnRET007XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIC8vIEFuIGV4cGFuZG8gcHJvcGVydHkgb24gdGhlIERPTSBub2RlIHByb3ZpZGVzIGEgbGluayBiYWNrIHRvIGl0c1xuICAgICAgICAvLyBkZXNjcmlwdGlvbi5cbiAgICAgICAgZG9tLnBtVmlld0Rlc2MgPSB0aGlzO1xuICAgIH1cbiAgICAvLyBVc2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBkZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhXG4gICAgLy8gd2lkZ2V0L21hcmsvbm9kZS5cbiAgICBtYXRjaGVzV2lkZ2V0KHdpZGdldCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIC8vIFdoZW4gcGFyc2luZyBpbi1lZGl0b3IgY29udGVudCAoaW4gZG9tY2hhbmdlLmpzKSwgd2UgYWxsb3dcbiAgICAvLyBkZXNjcmlwdGlvbnMgdG8gZGV0ZXJtaW5lIHRoZSBwYXJzZSBydWxlcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvXG4gICAgLy8gcGFyc2UgdGhlbS5cbiAgICBwYXJzZVJ1bGUoKSB7IHJldHVybiBudWxsOyB9XG4gICAgLy8gVXNlZCBieSB0aGUgZWRpdG9yJ3MgZXZlbnQgaGFuZGxlciB0byBpZ25vcmUgZXZlbnRzIHRoYXQgY29tZVxuICAgIC8vIGZyb20gY2VydGFpbiBkZXNjcy5cbiAgICBzdG9wRXZlbnQoZXZlbnQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgLy8gVGhlIHNpemUgb2YgdGhlIGNvbnRlbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjLlxuICAgIGdldCBzaXplKCkge1xuICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHNpemUgKz0gdGhpcy5jaGlsZHJlbltpXS5zaXplO1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLy8gRm9yIGJsb2NrIG5vZGVzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHNwYWNlIHRha2VuIHVwIGJ5IHRoZWlyXG4gICAgLy8gc3RhcnQvZW5kIHRva2Vucy5cbiAgICBnZXQgYm9yZGVyKCkgeyByZXR1cm4gMDsgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5kb20ucG1WaWV3RGVzYyA9PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpXS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHBvc0JlZm9yZUNoaWxkKGNoaWxkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBwb3MgPSB0aGlzLnBvc0F0U3RhcnQ7OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjdXIgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGN1ciA9PSBjaGlsZClcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICAgICAgcG9zICs9IGN1ci5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwb3NCZWZvcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5wb3NCZWZvcmVDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnBvc0JlZm9yZUNoaWxkKHRoaXMpICsgdGhpcy5ib3JkZXIgOiAwO1xuICAgIH1cbiAgICBnZXQgcG9zQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBvc0JlZm9yZSArIHRoaXMuc2l6ZTtcbiAgICB9XG4gICAgZ2V0IHBvc0F0RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgdGhpcy5zaXplIC0gMiAqIHRoaXMuYm9yZGVyO1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgLy8gSWYgdGhlIERPTSBwb3NpdGlvbiBpcyBpbiB0aGUgY29udGVudCwgdXNlIHRoZSBjaGlsZCBkZXNjIGFmdGVyXG4gICAgICAgIC8vIGl0IHRvIGZpZ3VyZSBvdXQgYSBwb3NpdGlvbi5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChiaWFzIDwgMCkge1xuICAgICAgICAgICAgICAgIGxldCBkb21CZWZvcmUsIGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGRvbSA9PSB0aGlzLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUJlZm9yZSA9IGRvbS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdoaWxlIChkb21CZWZvcmUgJiYgISgoZGVzYyA9IGRvbUJlZm9yZS5wbVZpZXdEZXNjKSAmJiBkZXNjLnBhcmVudCA9PSB0aGlzKSlcbiAgICAgICAgICAgICAgICAgICAgZG9tQmVmb3JlID0gZG9tQmVmb3JlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9tQmVmb3JlID8gdGhpcy5wb3NCZWZvcmVDaGlsZChkZXNjKSArIGRlc2Muc2l6ZSA6IHRoaXMucG9zQXRTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBkb21BZnRlciwgZGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZG9tID09IHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGRvbUFmdGVyID0gZG9tLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAoZG9tQWZ0ZXIgJiYgISgoZGVzYyA9IGRvbUFmdGVyLnBtVmlld0Rlc2MpICYmIGRlc2MucGFyZW50ID09IHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICBkb21BZnRlciA9IGRvbUFmdGVyLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21BZnRlciA/IHRoaXMucG9zQmVmb3JlQ2hpbGQoZGVzYykgOiB0aGlzLnBvc0F0RW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHZhcmlvdXMgaGV1cmlzdGljcywgZmFsbGluZyBiYWNrIG9uIHRoZSBiaWFzXG4gICAgICAgIC8vIHBhcmFtZXRlciwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmV0dXJuIHRoZSBwb3NpdGlvbiBhdCB0aGVcbiAgICAgICAgLy8gc3RhcnQgb3IgYXQgdGhlIGVuZCBvZiB0aGlzIHZpZXcgZGVzYy5cbiAgICAgICAgbGV0IGF0RW5kO1xuICAgICAgICBpZiAoZG9tID09IHRoaXMuZG9tICYmIHRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgYXRFbmQgPSBvZmZzZXQgPiBkb21JbmRleCh0aGlzLmNvbnRlbnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgdGhpcy5kb20uY29udGFpbnModGhpcy5jb250ZW50RE9NKSkge1xuICAgICAgICAgICAgYXRFbmQgPSBkb20uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcy5jb250ZW50RE9NKSAmIDI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20uZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IHNlYXJjaCA9IGRvbTs7IHNlYXJjaCA9IHNlYXJjaC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2ggPT0gdGhpcy5kb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0RW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdEVuZCA9PSBudWxsICYmIG9mZnNldCA9PSBkb20uY2hpbGROb2Rlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gZG9tOzsgc2VhcmNoID0gc2VhcmNoLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaCA9PSB0aGlzLmRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaC5uZXh0U2libGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGF0RW5kID09IG51bGwgPyBiaWFzID4gMCA6IGF0RW5kKSA/IHRoaXMucG9zQXRFbmQgOiB0aGlzLnBvc0F0U3RhcnQ7XG4gICAgfVxuICAgIG5lYXJlc3REZXNjKGRvbSwgb25seU5vZGVzID0gZmFsc2UpIHtcbiAgICAgICAgZm9yIChsZXQgZmlyc3QgPSB0cnVlLCBjdXIgPSBkb207IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gdGhpcy5nZXREZXNjKGN1ciksIG5vZGVET007XG4gICAgICAgICAgICBpZiAoZGVzYyAmJiAoIW9ubHlOb2RlcyB8fCBkZXNjLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZG9tIGlzIG91dHNpZGUgb2YgdGhpcyBkZXNjJ3Mgbm9kZURPTSwgZG9uJ3QgY291bnQgaXQuXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICYmIChub2RlRE9NID0gZGVzYy5ub2RlRE9NKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKG5vZGVET00ubm9kZVR5cGUgPT0gMSA/IG5vZGVET00uY29udGFpbnMoZG9tLm5vZGVUeXBlID09IDEgPyBkb20gOiBkb20ucGFyZW50Tm9kZSkgOiBub2RlRE9NID09IGRvbSkpXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXREZXNjKGRvbSkge1xuICAgICAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgICAgICBmb3IgKGxldCBjdXIgPSBkZXNjOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoY3VyID09IHRoaXMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIHBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IGRvbTsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmdldERlc2Moc2Nhbik7XG4gICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5sb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgZGVzYyBmb3IgdGhlIG5vZGUgYWZ0ZXIgdGhlIGdpdmVuIHBvcywgaWYgYW55LiAoV2hlbiBhXG4gICAgLy8gcGFyZW50IG5vZGUgb3ZlcnJvZGUgcmVuZGVyaW5nLCB0aGVyZSBtaWdodCBub3QgYmUgb25lLilcbiAgICBkZXNjQXQocG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXSwgZW5kID0gb2Zmc2V0ICsgY2hpbGQuc2l6ZTtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gcG9zICYmIGVuZCAhPSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWNoaWxkLmJvcmRlciAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlubmVyID0gY2hpbGQuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gaW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZGVzY0F0KHBvcyAtIG9mZnNldCAtIGNoaWxkLmJvcmRlcik7XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MsIHNpZGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmRvbSwgb2Zmc2V0OiAwLCBhdG9tOiBwb3MgKyAxIH07XG4gICAgICAgIC8vIEZpcnN0IGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBhcnJheVxuICAgICAgICBsZXQgaSA9IDAsIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGN1clBvcyA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBjdXJQb3MgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGVuZCA+IHBvcyB8fCBjaGlsZCBpbnN0YW5jZW9mIFRyYWlsaW5nSGFja1ZpZXdEZXNjKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zIC0gY3VyUG9zO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyUG9zID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoaXMgcG9pbnRzIGludG8gdGhlIG1pZGRsZSBvZiBhIGNoaWxkLCBjYWxsIHRocm91Z2hcbiAgICAgICAgaWYgKG9mZnNldClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuW2ldLmRvbUZyb21Qb3Mob2Zmc2V0IC0gdGhpcy5jaGlsZHJlbltpXS5ib3JkZXIsIHNpZGUpO1xuICAgICAgICAvLyBHbyBiYWNrIGlmIHRoZXJlIHdlcmUgYW55IHplcm8tbGVuZ3RoIHdpZGdldHMgd2l0aCBzaWRlID49IDAgYmVmb3JlIHRoaXMgcG9pbnRcbiAgICAgICAgZm9yIChsZXQgcHJldjsgaSAmJiAhKHByZXYgPSB0aGlzLmNoaWxkcmVuW2kgLSAxXSkuc2l6ZSAmJiBwcmV2IGluc3RhbmNlb2YgV2lkZ2V0Vmlld0Rlc2MgJiYgcHJldi5zaWRlID49IDA7IGktLSkgeyB9XG4gICAgICAgIC8vIFNjYW4gdG93YXJkcyB0aGUgZmlyc3QgdXNlYWJsZSBub2RlXG4gICAgICAgIGlmIChzaWRlIDw9IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGktLSwgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSBpID8gdGhpcy5jaGlsZHJlbltpIC0gMV0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcHJldiB8fCBwcmV2LmRvbS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiAmJiBzaWRlICYmIGVudGVyICYmICFwcmV2LmJvcmRlciAmJiAhcHJldi5kb21BdG9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LmRvbUZyb21Qb3MocHJldi5zaXplLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBwcmV2ID8gZG9tSW5kZXgocHJldi5kb20pICsgMSA6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0LCBlbnRlciA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKDs7IGkrKywgZW50ZXIgPSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPyB0aGlzLmNoaWxkcmVuW2ldIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHQgfHwgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHQgJiYgZW50ZXIgJiYgIW5leHQuYm9yZGVyICYmICFuZXh0LmRvbUF0b20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuZG9tRnJvbVBvcygwLCBzaWRlKTtcbiAgICAgICAgICAgIHJldHVybiB7IG5vZGU6IHRoaXMuY29udGVudERPTSwgb2Zmc2V0OiBuZXh0ID8gZG9tSW5kZXgobmV4dC5kb20pIDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXNlZCB0byBmaW5kIGEgRE9NIHJhbmdlIGluIGEgc2luZ2xlIHBhcmVudCBmb3IgYSBnaXZlbiBjaGFuZ2VkXG4gICAgLy8gcmFuZ2UuXG4gICAgcGFyc2VSYW5nZShmcm9tLCB0bywgYmFzZSA9IDApIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiB0aGlzLmNvbnRlbnRET00sIGZyb20sIHRvLCBmcm9tT2Zmc2V0OiAwLCB0b09mZnNldDogdGhpcy5jb250ZW50RE9NLmNoaWxkTm9kZXMubGVuZ3RoIH07XG4gICAgICAgIGxldCBmcm9tT2Zmc2V0ID0gLTEsIHRvT2Zmc2V0ID0gLTE7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCA9IGJhc2UsIGkgPSAwOzsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBlbmQgPSBvZmZzZXQgKyBjaGlsZC5zaXplO1xuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEgJiYgZnJvbSA8PSBlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRCYXNlID0gb2Zmc2V0ICsgY2hpbGQuYm9yZGVyO1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1heWJlIGRlc2NlbmQgbWFyayB2aWV3cyB0byBwYXJzZSBhIG5hcnJvd2VyIHJhbmdlP1xuICAgICAgICAgICAgICAgIGlmIChmcm9tID49IGNoaWxkQmFzZSAmJiB0byA8PSBlbmQgLSBjaGlsZC5ib3JkZXIgJiYgY2hpbGQubm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBjaGlsZC5jb250ZW50RE9NICYmIHRoaXMuY29udGVudERPTS5jb250YWlucyhjaGlsZC5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnBhcnNlUmFuZ2UoZnJvbSwgdG8sIGNoaWxkQmFzZSk7XG4gICAgICAgICAgICAgICAgZnJvbSA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA+IDA7IGotLSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuY2hpbGRyZW5baiAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldi5zaXplICYmIHByZXYuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFwcmV2LmVtcHR5Q2hpbGRBdCgxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbU9mZnNldCA9IGRvbUluZGV4KHByZXYuZG9tKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcm9tIC09IHByZXYuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIGZyb21PZmZzZXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZyb21PZmZzZXQgPiAtMSAmJiAoZW5kID4gdG8gfHwgaSA9PSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XG4gICAgICAgICAgICAgICAgdG8gPSBlbmQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuY2hpbGRyZW5bal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnNpemUgJiYgbmV4dC5kb20ucGFyZW50Tm9kZSA9PSB0aGlzLmNvbnRlbnRET00gJiYgIW5leHQuZW1wdHlDaGlsZEF0KC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSBkb21JbmRleChuZXh0LmRvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0byArPSBuZXh0LnNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0b09mZnNldCA9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgdG9PZmZzZXQgPSB0aGlzLmNvbnRlbnRET00uY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5jb250ZW50RE9NLCBmcm9tLCB0bywgZnJvbU9mZnNldCwgdG9PZmZzZXQgfTtcbiAgICB9XG4gICAgZW1wdHlDaGlsZEF0KHNpZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuYm9yZGVyIHx8ICF0aGlzLmNvbnRlbnRET00gfHwgIXRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW3NpZGUgPCAwID8gMCA6IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBjaGlsZC5zaXplID09IDAgfHwgY2hpbGQuZW1wdHlDaGlsZEF0KHNpZGUpO1xuICAgIH1cbiAgICBkb21BZnRlclBvcyhwb3MpIHtcbiAgICAgICAgbGV0IHsgbm9kZSwgb2Zmc2V0IH0gPSB0aGlzLmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSB8fCBvZmZzZXQgPT0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gbm9kZSBhZnRlciBwb3MgXCIgKyBwb3MpO1xuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzW29mZnNldF07XG4gICAgfVxuICAgIC8vIFZpZXcgZGVzY3MgYXJlIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIGFueSBzZWxlY3Rpb24gdGhhdCBmYWxsc1xuICAgIC8vIGVudGlyZWx5IGluc2lkZSBvZiB0aGVtLCBzbyB0aGF0IGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgY2FuIGRvXG4gICAgLy8gY3VzdG9tIHRoaW5ncyB3aXRoIHRoZSBzZWxlY3Rpb24uIE5vdGUgdGhhdCB0aGlzIGZhbGxzIGFwYXJ0IHdoZW5cbiAgICAvLyBhIHNlbGVjdGlvbiBzdGFydHMgaW4gc3VjaCBhIG5vZGUgYW5kIGVuZHMgaW4gYW5vdGhlciwgaW4gd2hpY2hcbiAgICAvLyBjYXNlIHdlIGp1c3QgdXNlIHdoYXRldmVyIGRvbUZyb21Qb3MgcHJvZHVjZXMgYXMgYSBiZXN0IGVmZm9ydC5cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gZmFsbHMgZW50aXJlbHkgaW4gYSBjaGlsZCwgZ2l2ZSBpdCB0byB0aGF0IGNoaWxkXG4gICAgICAgIGxldCBmcm9tID0gTWF0aC5taW4oYW5jaG9yLCBoZWFkKSwgdG8gPSBNYXRoLm1heChhbmNob3IsIGhlYWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAoZnJvbSA+IG9mZnNldCAmJiB0byA8IGVuZClcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuc2V0U2VsZWN0aW9uKGFuY2hvciAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgaGVhZCAtIG9mZnNldCAtIGNoaWxkLmJvcmRlciwgdmlldywgZm9yY2UpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbmNob3JET00gPSB0aGlzLmRvbUZyb21Qb3MoYW5jaG9yLCBhbmNob3IgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgaGVhZERPTSA9IGhlYWQgPT0gYW5jaG9yID8gYW5jaG9yRE9NIDogdGhpcy5kb21Gcm9tUG9zKGhlYWQsIGhlYWQgPyAtMSA6IDEpO1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5yb290LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBsZXQgc2VsUmFuZ2UgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgIGxldCBicktsdWRnZSA9IGZhbHNlO1xuICAgICAgICAvLyBPbiBGaXJlZm94LCB1c2luZyBTZWxlY3Rpb24uY29sbGFwc2UgdG8gcHV0IHRoZSBjdXJzb3IgYWZ0ZXIgYVxuICAgICAgICAvLyBCUiBub2RlIGZvciBzb21lIHJlYXNvbiBkb2Vzbid0IGFsd2F5cyB3b3JrICgjMTA3MykuIE9uIFNhZmFyaSxcbiAgICAgICAgLy8gdGhlIGN1cnNvciBzb21ldGltZXMgaW5leHBsaWNhYmxlIHZpc3VhbGx5IGxhZ3MgYmVoaW5kIGl0c1xuICAgICAgICAvLyByZXBvcnRlZCBwb3NpdGlvbiBpbiBzdWNoIHNpdHVhdGlvbnMgKCMxMDkyKS5cbiAgICAgICAgaWYgKChnZWNrbyB8fCBzYWZhcmkpICYmIGFuY2hvciA9PSBoZWFkKSB7XG4gICAgICAgICAgICBsZXQgeyBub2RlLCBvZmZzZXQgfSA9IGFuY2hvckRPTTtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICBicktsdWRnZSA9ICEhKG9mZnNldCAmJiBub2RlLm5vZGVWYWx1ZVtvZmZzZXQgLSAxXSA9PSBcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAvLyBJc3N1ZSAjMTEyOFxuICAgICAgICAgICAgICAgIGlmIChicktsdWRnZSAmJiBvZmZzZXQgPT0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHNjYW4gPSBub2RlLCBhZnRlcjsgc2Nhbjsgc2NhbiA9IHNjYW4ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID0gc2Nhbi5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlci5ub2RlTmFtZSA9PSBcIkJSXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRPTSA9IGhlYWRET00gPSB7IG5vZGU6IGFmdGVyLnBhcmVudE5vZGUsIG9mZnNldDogZG9tSW5kZXgoYWZ0ZXIpICsgMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBzY2FuLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLm5vZGUgJiYgZGVzYy5ub2RlLmlzQmxvY2spXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBicktsdWRnZSA9IHByZXYgJiYgKHByZXYubm9kZU5hbWUgPT0gXCJCUlwiIHx8IHByZXYuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlyZWZveCBjYW4gYWN0IHN0cmFuZ2VseSB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgaW4gZnJvbnQgb2YgYW5cbiAgICAgICAgLy8gdW5lZGl0YWJsZSBub2RlLiBTZWUgIzExNjMgYW5kIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE3MDk1MzZcbiAgICAgICAgaWYgKGdlY2tvICYmIHNlbFJhbmdlLmZvY3VzTm9kZSAmJiBzZWxSYW5nZS5mb2N1c05vZGUgIT0gaGVhZERPTS5ub2RlICYmIHNlbFJhbmdlLmZvY3VzTm9kZS5ub2RlVHlwZSA9PSAxKSB7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBzZWxSYW5nZS5mb2N1c05vZGUuY2hpbGROb2Rlc1tzZWxSYW5nZS5mb2N1c09mZnNldF07XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgJiYgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoZm9yY2UgfHwgYnJLbHVkZ2UgJiYgc2FmYXJpKSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIHNlbFJhbmdlLmFuY2hvck5vZGUsIHNlbFJhbmdlLmFuY2hvck9mZnNldCkgJiZcbiAgICAgICAgICAgIGlzRXF1aXZhbGVudFBvc2l0aW9uKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQsIHNlbFJhbmdlLmZvY3VzTm9kZSwgc2VsUmFuZ2UuZm9jdXNPZmZzZXQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBTZWxlY3Rpb24uZXh0ZW5kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiAnaW52ZXJ0ZWQnIHNlbGVjdGlvblxuICAgICAgICAvLyAob25lIHdoZXJlIHRoZSBmb2N1cyBpcyBiZWZvcmUgdGhlIGFuY2hvciksIGJ1dCBub3QgYWxsXG4gICAgICAgIC8vIGJyb3dzZXJzIHN1cHBvcnQgaXQgeWV0LlxuICAgICAgICBsZXQgZG9tU2VsRXh0ZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKChkb21TZWwuZXh0ZW5kIHx8IGFuY2hvciA9PSBoZWFkKSAmJiAhYnJLbHVkZ2UpIHtcbiAgICAgICAgICAgIGRvbVNlbC5jb2xsYXBzZShhbmNob3JET00ubm9kZSwgYW5jaG9yRE9NLm9mZnNldCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgIT0gaGVhZClcbiAgICAgICAgICAgICAgICAgICAgZG9tU2VsLmV4dGVuZChoZWFkRE9NLm5vZGUsIGhlYWRET00ub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBkb21TZWxFeHRlbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIC8vIEluIHNvbWUgY2FzZXMgd2l0aCBDaHJvbWUgdGhlIHNlbGVjdGlvbiBpcyBlbXB0eSBhZnRlciBjYWxsaW5nXG4gICAgICAgICAgICAgICAgLy8gY29sbGFwc2UsIGV2ZW4gd2hlbiBpdCBzaG91bGQgYmUgdmFsaWQuIFRoaXMgYXBwZWFycyB0byBiZSBhIGJ1ZywgYnV0XG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgZGlmZmljdWx0IHRvIGlzb2xhdGUuIElmIHRoaXMgaGFwcGVucyBmYWxsYmFjayB0byB0aGUgb2xkIHBhdGhcbiAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHVzaW5nIGV4dGVuZC5cbiAgICAgICAgICAgICAgICAvLyBTaW1pbGFybHksIHRoaXMgY291bGQgY3Jhc2ggb24gU2FmYXJpIGlmIHRoZSBlZGl0b3IgaXMgaGlkZGVuLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgbm8gc2VsZWN0aW9uLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZG9tU2VsRXh0ZW5kZWQpIHtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPiBoZWFkKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IGFuY2hvckRPTTtcbiAgICAgICAgICAgICAgICBhbmNob3JET00gPSBoZWFkRE9NO1xuICAgICAgICAgICAgICAgIGhlYWRET00gPSB0bXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kKGhlYWRET00ubm9kZSwgaGVhZERPTS5vZmZzZXQpO1xuICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQpO1xuICAgICAgICAgICAgZG9tU2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXRhdGlvbikge1xuICAgICAgICByZXR1cm4gIXRoaXMuY29udGVudERPTSAmJiBtdXRhdGlvbi50eXBlICE9IFwic2VsZWN0aW9uXCI7XG4gICAgfVxuICAgIGdldCBjb250ZW50TG9zdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudERPTSAmJiB0aGlzLmNvbnRlbnRET00gIT0gdGhpcy5kb20gJiYgIXRoaXMuZG9tLmNvbnRhaW5zKHRoaXMuY29udGVudERPTSk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBhIHN1YnRyZWUgb2YgdGhlIGVsZW1lbnQgdHJlZSB0aGF0IGhhcyBiZWVuIHRvdWNoZWRcbiAgICAvLyBieSBhIERPTSBjaGFuZ2UsIHNvIHRoYXQgdGhlIG5leHQgdXBkYXRlIHdpbGwgcmVkcmF3IGl0LlxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwLCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIGVuZCA9IG9mZnNldCArIGNoaWxkLnNpemU7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09IGVuZCA/IGZyb20gPD0gZW5kICYmIHRvID49IG9mZnNldCA6IGZyb20gPCBlbmQgJiYgdG8gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRJbnNpZGUgPSBvZmZzZXQgKyBjaGlsZC5ib3JkZXIsIGVuZEluc2lkZSA9IGVuZCAtIGNoaWxkLmJvcmRlcjtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA+PSBzdGFydEluc2lkZSAmJiB0byA8PSBlbmRJbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZyb20gPT0gb2Zmc2V0IHx8IHRvID09IGVuZCA/IENPTlRFTlRfRElSVFkgOiBDSElMRF9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20gPT0gc3RhcnRJbnNpZGUgJiYgdG8gPT0gZW5kSW5zaWRlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hpbGQuY29udGVudExvc3QgfHwgY2hpbGQuZG9tLnBhcmVudE5vZGUgIT0gdGhpcy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpcnR5ID0gTk9ERV9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubWFya0RpcnR5KGZyb20gLSBzdGFydEluc2lkZSwgdG8gLSBzdGFydEluc2lkZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLmRpcnR5ID0gY2hpbGQuZG9tID09IGNoaWxkLmNvbnRlbnRET00gJiYgY2hpbGQuZG9tLnBhcmVudE5vZGUgPT0gdGhpcy5jb250ZW50RE9NICYmICFjaGlsZC5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gQ09OVEVOVF9ESVJUWSA6IE5PREVfRElSVFk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkgPSBDT05URU5UX0RJUlRZO1xuICAgIH1cbiAgICBtYXJrUGFyZW50c0RpcnR5KCkge1xuICAgICAgICBsZXQgbGV2ZWwgPSAxO1xuICAgICAgICBmb3IgKGxldCBub2RlID0gdGhpcy5wYXJlbnQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudCwgbGV2ZWwrKykge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gbGV2ZWwgPT0gMSA/IENPTlRFTlRfRElSVFkgOiBDSElMRF9ESVJUWTtcbiAgICAgICAgICAgIGlmIChub2RlLmRpcnR5IDwgZGlydHkpXG4gICAgICAgICAgICAgICAgbm9kZS5kaXJ0eSA9IGRpcnR5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBnZXQgaWdub3JlRm9yQ29vcmRzKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc1RleHQodGV4dCkgeyByZXR1cm4gZmFsc2U7IH1cbn1cbi8vIEEgd2lkZ2V0IGRlc2MgcmVwcmVzZW50cyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlXG4vLyBkcmF3biBiZXR3ZWVuIHRoZSBkb2N1bWVudCBub2Rlcy5cbmNsYXNzIFdpZGdldFZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgd2lkZ2V0LCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IHNlbGYsIGRvbSA9IHdpZGdldC50eXBlLnRvRE9NO1xuICAgICAgICBpZiAodHlwZW9mIGRvbSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBkb20gPSBkb20odmlldywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5wYXJlbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wb3NCZWZvcmVDaGlsZChzZWxmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIXdpZGdldC50eXBlLnNwZWMucmF3KSB7XG4gICAgICAgICAgICBpZiAoZG9tLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgICAgIHdyYXAuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICAgICAgICAgICAgICBkb20gPSB3cmFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9tLmNvbnRlbnRFZGl0YWJsZSA9IFwiZmFsc2VcIjtcbiAgICAgICAgICAgIGRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itd2lkZ2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0O1xuICAgICAgICB0aGlzLndpZGdldCA9IHdpZGdldDtcbiAgICAgICAgc2VsZiA9IHRoaXM7XG4gICAgfVxuICAgIG1hdGNoZXNXaWRnZXQod2lkZ2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiB3aWRnZXQudHlwZS5lcSh0aGlzLndpZGdldC50eXBlKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4geyBpZ25vcmU6IHRydWUgfTsgfVxuICAgIHN0b3BFdmVudChldmVudCkge1xuICAgICAgICBsZXQgc3RvcCA9IHRoaXMud2lkZ2V0LnNwZWMuc3RvcEV2ZW50O1xuICAgICAgICByZXR1cm4gc3RvcCA/IHN0b3AoZXZlbnQpIDogZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBtdXRhdGlvbi50eXBlICE9IFwic2VsZWN0aW9uXCIgfHwgdGhpcy53aWRnZXQuc3BlYy5pZ25vcmVTZWxlY3Rpb247XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMud2lkZ2V0LnR5cGUuZGVzdHJveSh0aGlzLmRvbSk7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZ2V0IGRvbUF0b20oKSB7IHJldHVybiB0cnVlOyB9XG4gICAgZ2V0IHNpZGUoKSB7IHJldHVybiB0aGlzLndpZGdldC50eXBlLnNpZGU7IH1cbn1cbmNsYXNzIENvbXBvc2l0aW9uVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBkb20sIHRleHRET00sIHRleHQpIHtcbiAgICAgICAgc3VwZXIocGFyZW50LCBbXSwgZG9tLCBudWxsKTtcbiAgICAgICAgdGhpcy50ZXh0RE9NID0gdGV4dERPTTtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7IHJldHVybiB0aGlzLnRleHQubGVuZ3RoOyB9XG4gICAgbG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0KSB7XG4gICAgICAgIGlmIChkb20gIT0gdGhpcy50ZXh0RE9NKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIChvZmZzZXQgPyB0aGlzLnNpemUgOiAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zQXRTdGFydCArIG9mZnNldDtcbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy50ZXh0RE9NLCBvZmZzZXQ6IHBvcyB9O1xuICAgIH1cbiAgICBpZ25vcmVNdXRhdGlvbihtdXQpIHtcbiAgICAgICAgcmV0dXJuIG11dC50eXBlID09PSAnY2hhcmFjdGVyRGF0YScgJiYgbXV0LnRhcmdldC5ub2RlVmFsdWUgPT0gbXV0Lm9sZFZhbHVlO1xuICAgIH1cbn1cbi8vIEEgbWFyayBkZXNjIHJlcHJlc2VudHMgYSBtYXJrLiBNYXkgaGF2ZSBtdWx0aXBsZSBjaGlsZHJlbixcbi8vIGRlcGVuZGluZyBvbiBob3cgdGhlIG1hcmsgaXMgc3BsaXQuIE5vdGUgdGhhdCBtYXJrcyBhcmUgZHJhd24gdXNpbmdcbi8vIGEgZml4ZWQgbmVzdGluZyBvcmRlciwgZm9yIHNpbXBsaWNpdHkgYW5kIHByZWRpY3RhYmlsaXR5LCBzbyBpblxuLy8gc29tZSBjYXNlcyB0aGV5IHdpbGwgYmUgc3BsaXQgbW9yZSBvZnRlbiB0aGFuIHdvdWxkIGFwcGVhclxuLy8gbmVjZXNzYXJ5LlxuY2xhc3MgTWFya1ZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbWFyaywgZG9tLCBjb250ZW50RE9NLCBzcGVjKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgY29udGVudERPTSk7XG4gICAgICAgIHRoaXMubWFyayA9IG1hcms7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUocGFyZW50LCBtYXJrLCBpbmxpbmUsIHZpZXcpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHZpZXcubm9kZVZpZXdzW21hcmsudHlwZS5uYW1lXTtcbiAgICAgICAgbGV0IHNwZWMgPSBjdXN0b20gJiYgY3VzdG9tKG1hcmssIHZpZXcsIGlubGluZSk7XG4gICAgICAgIGlmICghc3BlYyB8fCAhc3BlYy5kb20pXG4gICAgICAgICAgICBzcGVjID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvY3VtZW50LCBtYXJrLnR5cGUuc3BlYy50b0RPTShtYXJrLCBpbmxpbmUpLCBudWxsLCBtYXJrLmF0dHJzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXJrVmlld0Rlc2MocGFyZW50LCBtYXJrLCBzcGVjLmRvbSwgc3BlYy5jb250ZW50RE9NIHx8IHNwZWMuZG9tLCBzcGVjKTtcbiAgICB9XG4gICAgcGFyc2VSdWxlKCkge1xuICAgICAgICBpZiAoKHRoaXMuZGlydHkgJiBOT0RFX0RJUlRZKSB8fCB0aGlzLm1hcmsudHlwZS5zcGVjLnJlcGFyc2VJblZpZXcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHsgbWFyazogdGhpcy5tYXJrLnR5cGUubmFtZSwgYXR0cnM6IHRoaXMubWFyay5hdHRycywgY29udGVudEVsZW1lbnQ6IHRoaXMuY29udGVudERPTSB9O1xuICAgIH1cbiAgICBtYXRjaGVzTWFyayhtYXJrKSB7IHJldHVybiB0aGlzLmRpcnR5ICE9IE5PREVfRElSVFkgJiYgdGhpcy5tYXJrLmVxKG1hcmspOyB9XG4gICAgbWFya0RpcnR5KGZyb20sIHRvKSB7XG4gICAgICAgIHN1cGVyLm1hcmtEaXJ0eShmcm9tLCB0byk7XG4gICAgICAgIC8vIE1vdmUgZGlydHkgaW5mbyB0byBuZWFyZXN0IG5vZGUgdmlld1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIHdoaWxlICghcGFyZW50Lm5vZGUpXG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQuZGlydHkgPCB0aGlzLmRpcnR5KVxuICAgICAgICAgICAgICAgIHBhcmVudC5kaXJ0eSA9IHRoaXMuZGlydHk7XG4gICAgICAgICAgICB0aGlzLmRpcnR5ID0gTk9UX0RJUlRZO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNsaWNlKGZyb20sIHRvLCB2aWV3KSB7XG4gICAgICAgIGxldCBjb3B5ID0gTWFya1ZpZXdEZXNjLmNyZWF0ZSh0aGlzLnBhcmVudCwgdGhpcy5tYXJrLCB0cnVlLCB2aWV3KTtcbiAgICAgICAgbGV0IG5vZGVzID0gdGhpcy5jaGlsZHJlbiwgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgaWYgKHRvIDwgc2l6ZSlcbiAgICAgICAgICAgIG5vZGVzID0gcmVwbGFjZU5vZGVzKG5vZGVzLCB0bywgc2l6ZSwgdmlldyk7XG4gICAgICAgIGlmIChmcm9tID4gMClcbiAgICAgICAgICAgIG5vZGVzID0gcmVwbGFjZU5vZGVzKG5vZGVzLCAwLCBmcm9tLCB2aWV3KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIG5vZGVzW2ldLnBhcmVudCA9IGNvcHk7XG4gICAgICAgIGNvcHkuY2hpbGRyZW4gPSBub2RlcztcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24gPyB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24obXV0YXRpb24pIDogc3VwZXIuaWdub3JlTXV0YXRpb24obXV0YXRpb24pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveSgpO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxufVxuLy8gTm9kZSB2aWV3IGRlc2NzIGFyZSB0aGUgbWFpbiwgbW9zdCBjb21tb24gdHlwZSBvZiB2aWV3IGRlc2MsIGFuZFxuLy8gY29ycmVzcG9uZCB0byBhbiBhY3R1YWwgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFVubGlrZSBtYXJrIGRlc2NzLFxuLy8gdGhleSBwb3B1bGF0ZSB0aGVpciBjaGlsZCBhcnJheSB0aGVtc2VsdmVzLlxuY2xhc3MgTm9kZVZpZXdEZXNjIGV4dGVuZHMgVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgdmlldywgcG9zKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgW10sIGRvbSwgY29udGVudERPTSk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMub3V0ZXJEZWNvID0gb3V0ZXJEZWNvO1xuICAgICAgICB0aGlzLmlubmVyRGVjbyA9IGlubmVyRGVjbztcbiAgICAgICAgdGhpcy5ub2RlRE9NID0gbm9kZURPTTtcbiAgICB9XG4gICAgLy8gQnkgZGVmYXVsdCwgYSBub2RlIGlzIHJlbmRlcmVkIHVzaW5nIHRoZSBgdG9ET01gIG1ldGhvZCBmcm9tIHRoZVxuICAgIC8vIG5vZGUgdHlwZSBzcGVjLiBCdXQgY2xpZW50IGNvZGUgY2FuIHVzZSB0aGUgYG5vZGVWaWV3c2Agc3BlYyB0b1xuICAgIC8vIHN1cHBseSBhIGN1c3RvbSBub2RlIHZpZXcsIHdoaWNoIGNhbiBpbmZsdWVuY2UgdmFyaW91cyBhc3BlY3RzIG9mXG4gICAgLy8gdGhlIHdheSB0aGUgbm9kZSB3b3Jrcy5cbiAgICAvL1xuICAgIC8vIChVc2luZyBzdWJjbGFzc2luZyBmb3IgdGhpcyB3YXMgaW50ZW50aW9uYWxseSBkZWNpZGVkIGFnYWluc3QsXG4gICAgLy8gc2luY2UgaXQnZCByZXF1aXJlIGV4cG9zaW5nIGEgd2hvbGUgc2xldyBvZiBmaW5pY2t5XG4gICAgLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscyB0byB0aGUgdXNlciBjb2RlIHRoYXQgdGhleSBwcm9iYWJseSB3aWxsXG4gICAgLy8gbmV2ZXIgbmVlZC4pXG4gICAgc3RhdGljIGNyZWF0ZShwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpIHtcbiAgICAgICAgbGV0IGN1c3RvbSA9IHZpZXcubm9kZVZpZXdzW25vZGUudHlwZS5uYW1lXSwgZGVzY09iajtcbiAgICAgICAgbGV0IHNwZWMgPSBjdXN0b20gJiYgY3VzdG9tKG5vZGUsIHZpZXcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIChUaGlzIGlzIGEgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdGhlIGN1c3RvbSB2aWV3IHRvIGZpbmQgaXRzXG4gICAgICAgICAgICAvLyBvd24gcG9zaXRpb24pXG4gICAgICAgICAgICBpZiAoIWRlc2NPYmopXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcztcbiAgICAgICAgICAgIGlmIChkZXNjT2JqLnBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzY09iai5wYXJlbnQucG9zQmVmb3JlQ2hpbGQoZGVzY09iaik7XG4gICAgICAgIH0sIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgbGV0IGRvbSA9IHNwZWMgJiYgc3BlYy5kb20sIGNvbnRlbnRET00gPSBzcGVjICYmIHNwZWMuY29udGVudERPTTtcbiAgICAgICAgaWYgKG5vZGUuaXNUZXh0KSB7XG4gICAgICAgICAgICBpZiAoIWRvbSlcbiAgICAgICAgICAgICAgICBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlLnRleHQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9tLm5vZGVUeXBlICE9IDMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUZXh0IG11c3QgYmUgcmVuZGVyZWQgYXMgYSBET00gdGV4dCBub2RlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFkb20pIHtcbiAgICAgICAgICAgIGxldCBzcGVjID0gRE9NU2VyaWFsaXplci5yZW5kZXJTcGVjKGRvY3VtZW50LCBub2RlLnR5cGUuc3BlYy50b0RPTShub2RlKSwgbnVsbCwgbm9kZS5hdHRycyk7XG4gICAgICAgICAgICAoeyBkb20sIGNvbnRlbnRET00gfSA9IHNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29udGVudERPTSAmJiAhbm9kZS5pc1RleHQgJiYgZG9tLm5vZGVOYW1lICE9IFwiQlJcIikgeyAvLyBDaHJvbWUgZ2V0cyBjb25mdXNlZCBieSA8YnIgY29udGVudGVkaXRhYmxlPWZhbHNlPlxuICAgICAgICAgICAgaWYgKCFkb20uaGFzQXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIpKVxuICAgICAgICAgICAgICAgIGRvbS5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnNwZWMuZHJhZ2dhYmxlKVxuICAgICAgICAgICAgICAgIGRvbS5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBub2RlRE9NID0gZG9tO1xuICAgICAgICBkb20gPSBhcHBseU91dGVyRGVjbyhkb20sIG91dGVyRGVjbywgbm9kZSk7XG4gICAgICAgIGlmIChzcGVjKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NPYmogPSBuZXcgQ3VzdG9tTm9kZVZpZXdEZXNjKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSB8fCBudWxsLCBub2RlRE9NLCBzcGVjLCB2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgZWxzZSBpZiAobm9kZS5pc1RleHQpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFRleHRWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG5vZGVET00sIHZpZXcpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVWaWV3RGVzYyhwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIGNvbnRlbnRET00gfHwgbnVsbCwgbm9kZURPTSwgdmlldywgcG9zICsgMSk7XG4gICAgfVxuICAgIHBhcnNlUnVsZSgpIHtcbiAgICAgICAgLy8gRXhwZXJpbWVudGFsIGtsdWRnZSB0byBhbGxvdyBvcHQtaW4gcmUtcGFyc2luZyBvZiBub2Rlc1xuICAgICAgICBpZiAodGhpcy5ub2RlLnR5cGUuc3BlYy5yZXBhcnNlSW5WaWV3KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZJWE1FIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBjYW4gYWx3YXlzIHJldHVybiB0aGUgY3VycmVudFxuICAgICAgICAvLyBhdHRycyBtZWFucyB0aGF0IGlmIHRoZSB1c2VyIHNvbWVob3cgbWFuYWdlcyB0byBjaGFuZ2UgdGhlXG4gICAgICAgIC8vIGF0dHJzIGluIHRoZSBkb20sIHRoYXQgd29uJ3QgYmUgcGlja2VkIHVwLiBOb3QgZW50aXJlbHkgc3VyZVxuICAgICAgICAvLyB3aGV0aGVyIHRoaXMgaXMgYSBwcm9ibGVtXG4gICAgICAgIGxldCBydWxlID0geyBub2RlOiB0aGlzLm5vZGUudHlwZS5uYW1lLCBhdHRyczogdGhpcy5ub2RlLmF0dHJzIH07XG4gICAgICAgIGlmICh0aGlzLm5vZGUudHlwZS53aGl0ZXNwYWNlID09IFwicHJlXCIpXG4gICAgICAgICAgICBydWxlLnByZXNlcnZlV2hpdGVzcGFjZSA9IFwiZnVsbFwiO1xuICAgICAgICBpZiAoIXRoaXMuY29udGVudERPTSkge1xuICAgICAgICAgICAgcnVsZS5nZXRDb250ZW50ID0gKCkgPT4gdGhpcy5ub2RlLmNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuY29udGVudExvc3QpIHtcbiAgICAgICAgICAgIHJ1bGUuY29udGVudEVsZW1lbnQgPSB0aGlzLmNvbnRlbnRET007XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDaHJvbWUgbGlrZXMgdG8gcmFuZG9tbHkgcmVjcmVhdGUgcGFyZW50IG5vZGVzIHdoZW5cbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIHRoaW5ncy4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoaXMgdHJpZXMgdG8gZmluZCB0aGVcbiAgICAgICAgICAgIC8vIG5ldyBwYXJlbnQuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9tLmNvbnRhaW5zKGNoaWxkLmRvbS5wYXJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBydWxlLmNvbnRlbnRFbGVtZW50ID0gY2hpbGQuZG9tLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcnVsZS5jb250ZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICBydWxlLmdldENvbnRlbnQgPSAoKSA9PiBGcmFnbWVudC5lbXB0eTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVsZTtcbiAgICB9XG4gICAgbWF0Y2hlc05vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlydHkgPT0gTk9UX0RJUlRZICYmIG5vZGUuZXEodGhpcy5ub2RlKSAmJlxuICAgICAgICAgICAgc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIHRoaXMub3V0ZXJEZWNvKSAmJiBpbm5lckRlY28uZXEodGhpcy5pbm5lckRlY28pO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5ub2RlU2l6ZTsgfVxuICAgIGdldCBib3JkZXIoKSB7IHJldHVybiB0aGlzLm5vZGUuaXNMZWFmID8gMCA6IDE7IH1cbiAgICAvLyBTeW5jcyBgdGhpcy5jaGlsZHJlbmAgdG8gbWF0Y2ggYHRoaXMubm9kZS5jb250ZW50YCBhbmQgdGhlIGxvY2FsXG4gICAgLy8gZGVjb3JhdGlvbnMsIHBvc3NpYmx5IGludHJvZHVjaW5nIG5lc3RpbmcgZm9yIG1hcmtzLiBUaGVuLCBpbiBhXG4gICAgLy8gc2VwYXJhdGUgc3RlcCwgc3luY3MgdGhlIERPTSBpbnNpZGUgYHRoaXMuY29udGVudERPTWAgdG9cbiAgICAvLyBgdGhpcy5jaGlsZHJlbmAuXG4gICAgdXBkYXRlQ2hpbGRyZW4odmlldywgcG9zKSB7XG4gICAgICAgIGxldCBpbmxpbmUgPSB0aGlzLm5vZGUuaW5saW5lQ29udGVudCwgb2ZmID0gcG9zO1xuICAgICAgICBsZXQgY29tcG9zaXRpb24gPSB2aWV3LmNvbXBvc2luZyA/IHRoaXMubG9jYWxDb21wb3NpdGlvbkluZm8odmlldywgcG9zKSA6IG51bGw7XG4gICAgICAgIGxldCBsb2NhbENvbXBvc2l0aW9uID0gY29tcG9zaXRpb24gJiYgY29tcG9zaXRpb24ucG9zID4gLTEgPyBjb21wb3NpdGlvbiA6IG51bGw7XG4gICAgICAgIGxldCBjb21wb3NpdGlvbkluQ2hpbGQgPSBjb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbi5wb3MgPCAwO1xuICAgICAgICBsZXQgdXBkYXRlciA9IG5ldyBWaWV3VHJlZVVwZGF0ZXIodGhpcywgbG9jYWxDb21wb3NpdGlvbiAmJiBsb2NhbENvbXBvc2l0aW9uLm5vZGUsIHZpZXcpO1xuICAgICAgICBpdGVyRGVjbyh0aGlzLm5vZGUsIHRoaXMuaW5uZXJEZWNvLCAod2lkZ2V0LCBpLCBpbnNpZGVOb2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0LnNwZWMubWFya3MpXG4gICAgICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyh3aWRnZXQuc3BlYy5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHdpZGdldC50eXBlLnNpZGUgPj0gMCAmJiAhaW5zaWRlTm9kZSlcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnN5bmNUb01hcmtzKGkgPT0gdGhpcy5ub2RlLmNoaWxkQ291bnQgPyBNYXJrLm5vbmUgOiB0aGlzLm5vZGUuY2hpbGQoaSkubWFya3MsIGlubGluZSwgdmlldyk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBub2RlIGlzIGEgZGVzYyBtYXRjaGluZyB0aGlzIHdpZGdldCwgcmV1c2UgaXQsXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgaW5zZXJ0IHRoZSB3aWRnZXQgYXMgYSBuZXcgdmlldyBkZXNjLlxuICAgICAgICAgICAgdXBkYXRlci5wbGFjZVdpZGdldCh3aWRnZXQsIHZpZXcsIG9mZik7XG4gICAgICAgIH0sIChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGkpID0+IHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgd3JhcHBpbmcgbWFyayBkZXNjcyBtYXRjaCB0aGUgbm9kZSdzIG1hcmtzLlxuICAgICAgICAgICAgdXBkYXRlci5zeW5jVG9NYXJrcyhjaGlsZC5tYXJrcywgaW5saW5lLCB2aWV3KTtcbiAgICAgICAgICAgIC8vIFRyeSBzZXZlcmFsIHN0cmF0ZWdpZXMgZm9yIGRyYXdpbmcgdGhpcyBub2RlXG4gICAgICAgICAgICBsZXQgY29tcEluZGV4O1xuICAgICAgICAgICAgaWYgKHVwZGF0ZXIuZmluZE5vZGVNYXRjaChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGkpKSA7XG4gICAgICAgICAgICBlbHNlIGlmIChjb21wb3NpdGlvbkluQ2hpbGQgJiYgdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA+IG9mZiAmJlxuICAgICAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDwgb2ZmICsgY2hpbGQubm9kZVNpemUgJiZcbiAgICAgICAgICAgICAgICAoY29tcEluZGV4ID0gdXBkYXRlci5maW5kSW5kZXhXaXRoQ2hpbGQoY29tcG9zaXRpb24ubm9kZSkpID4gLTEgJiZcbiAgICAgICAgICAgICAgICB1cGRhdGVyLnVwZGF0ZU5vZGVBdChjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGNvbXBJbmRleCwgdmlldykpIDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHVwZGF0ZXIudXBkYXRlTmV4dE5vZGUoY2hpbGQsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBpLCBvZmYpKSA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgaXQgYXMgYSBuZXcgdmlld1xuICAgICAgICAgICAgICAgIHVwZGF0ZXIuYWRkTm9kZShjaGlsZCwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIG9mZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYgKz0gY2hpbGQubm9kZVNpemU7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBEcm9wIGFsbCByZW1haW5pbmcgZGVzY3MgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICAgIHVwZGF0ZXIuc3luY1RvTWFya3MoW10sIGlubGluZSwgdmlldyk7XG4gICAgICAgIGlmICh0aGlzLm5vZGUuaXNUZXh0YmxvY2spXG4gICAgICAgICAgICB1cGRhdGVyLmFkZFRleHRibG9ja0hhY2tzKCk7XG4gICAgICAgIHVwZGF0ZXIuZGVzdHJveVJlc3QoKTtcbiAgICAgICAgLy8gU3luYyB0aGUgRE9NIGlmIGFueXRoaW5nIGNoYW5nZWRcbiAgICAgICAgaWYgKHVwZGF0ZXIuY2hhbmdlZCB8fCB0aGlzLmRpcnR5ID09IENPTlRFTlRfRElSVFkpIHtcbiAgICAgICAgICAgIC8vIE1heSBoYXZlIHRvIHByb3RlY3QgZm9jdXNlZCBET00gZnJvbSBiZWluZyBjaGFuZ2VkIGlmIGEgY29tcG9zaXRpb24gaXMgYWN0aXZlXG4gICAgICAgICAgICBpZiAobG9jYWxDb21wb3NpdGlvbilcbiAgICAgICAgICAgICAgICB0aGlzLnByb3RlY3RMb2NhbENvbXBvc2l0aW9uKHZpZXcsIGxvY2FsQ29tcG9zaXRpb24pO1xuICAgICAgICAgICAgcmVuZGVyRGVzY3ModGhpcy5jb250ZW50RE9NLCB0aGlzLmNoaWxkcmVuLCB2aWV3KTtcbiAgICAgICAgICAgIGlmIChpb3MpXG4gICAgICAgICAgICAgICAgaW9zSGFja3ModGhpcy5kb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxvY2FsQ29tcG9zaXRpb25JbmZvKHZpZXcsIHBvcykge1xuICAgICAgICAvLyBPbmx5IGRvIHNvbWV0aGluZyBpZiBib3RoIHRoZSBzZWxlY3Rpb24gYW5kIGEgZm9jdXNlZCB0ZXh0IG5vZGVcbiAgICAgICAgLy8gYXJlIGluc2lkZSBvZiB0aGlzIG5vZGVcbiAgICAgICAgbGV0IHsgZnJvbSwgdG8gfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICBpZiAoISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHx8IGZyb20gPCBwb3MgfHwgdG8gPiBwb3MgKyB0aGlzLm5vZGUuY29udGVudC5zaXplKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0ZXh0Tm9kZSA9IHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2RlO1xuICAgICAgICBpZiAoIXRleHROb2RlIHx8ICF0aGlzLmRvbS5jb250YWlucyh0ZXh0Tm9kZS5wYXJlbnROb2RlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAodGhpcy5ub2RlLmlubGluZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRleHQgaW4gdGhlIGZvY3VzZWQgbm9kZSBpbiB0aGUgbm9kZSwgc3RvcCBpZiBpdCdzIG5vdFxuICAgICAgICAgICAgLy8gdGhlcmUgKG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgdGhyb3VnaCBvdGhlciBtZWFucywgaW4gd2hpY2hcbiAgICAgICAgICAgIC8vIGNhc2UgaXQgc2hvdWxkIG92ZXJ3cml0dGVuKVxuICAgICAgICAgICAgbGV0IHRleHQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICBsZXQgdGV4dFBvcyA9IGZpbmRUZXh0SW5GcmFnbWVudCh0aGlzLm5vZGUuY29udGVudCwgdGV4dCwgZnJvbSAtIHBvcywgdG8gLSBwb3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHRQb3MgPCAwID8gbnVsbCA6IHsgbm9kZTogdGV4dE5vZGUsIHBvczogdGV4dFBvcywgdGV4dCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm9kZTogdGV4dE5vZGUsIHBvczogLTEsIHRleHQ6IFwiXCIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm90ZWN0TG9jYWxDb21wb3NpdGlvbih2aWV3LCB7IG5vZGUsIHBvcywgdGV4dCB9KSB7XG4gICAgICAgIC8vIFRoZSBub2RlIGlzIGFscmVhZHkgcGFydCBvZiBhIGxvY2FsIHZpZXcgZGVzYywgbGVhdmUgaXQgdGhlcmVcbiAgICAgICAgaWYgKHRoaXMuZ2V0RGVzYyhub2RlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRpb24gdmlldyBmb3IgdGhlIG9ycGhhbmVkIG5vZGVzXG4gICAgICAgIGxldCB0b3BOb2RlID0gbm9kZTtcbiAgICAgICAgZm9yICg7OyB0b3BOb2RlID0gdG9wTm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAodG9wTm9kZS5wYXJlbnROb2RlID09IHRoaXMuY29udGVudERPTSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHdoaWxlICh0b3BOb2RlLnByZXZpb3VzU2libGluZylcbiAgICAgICAgICAgICAgICB0b3BOb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG9wTm9kZS5wcmV2aW91c1NpYmxpbmcpO1xuICAgICAgICAgICAgd2hpbGUgKHRvcE5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgdG9wTm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRvcE5vZGUubmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgaWYgKHRvcE5vZGUucG1WaWV3RGVzYylcbiAgICAgICAgICAgICAgICB0b3BOb2RlLnBtVmlld0Rlc2MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRlc2MgPSBuZXcgQ29tcG9zaXRpb25WaWV3RGVzYyh0aGlzLCB0b3BOb2RlLCBub2RlLCB0ZXh0KTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbk5vZGVzLnB1c2goZGVzYyk7XG4gICAgICAgIC8vIFBhdGNoIHVwIHRoaXMuY2hpbGRyZW4gdG8gY29udGFpbiB0aGUgY29tcG9zaXRpb24gdmlld1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gcmVwbGFjZU5vZGVzKHRoaXMuY2hpbGRyZW4sIHBvcywgcG9zICsgdGV4dC5sZW5ndGgsIHZpZXcsIGRlc2MpO1xuICAgIH1cbiAgICAvLyBJZiB0aGlzIGRlc2MgbXVzdCBiZSB1cGRhdGVkIHRvIG1hdGNoIHRoZSBnaXZlbiBub2RlIGRlY29yYXRpb24sXG4gICAgLy8gZG8gc28gYW5kIHJldHVybiB0cnVlLlxuICAgIHVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSA9PSBOT0RFX0RJUlRZIHx8XG4gICAgICAgICAgICAhbm9kZS5zYW1lTWFya3VwKHRoaXMubm9kZSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdXBkYXRlSW5uZXIobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICAgICAgdGhpcy5pbm5lckRlY28gPSBpbm5lckRlY287XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRET00pXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKHZpZXcsIHRoaXMucG9zQXRTdGFydCk7XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgfVxuICAgIHVwZGF0ZU91dGVyRGVjbyhvdXRlckRlY28pIHtcbiAgICAgICAgaWYgKHNhbWVPdXRlckRlY28ob3V0ZXJEZWNvLCB0aGlzLm91dGVyRGVjbykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBuZWVkc1dyYXAgPSB0aGlzLm5vZGVET00ubm9kZVR5cGUgIT0gMTtcbiAgICAgICAgbGV0IG9sZERPTSA9IHRoaXMuZG9tO1xuICAgICAgICB0aGlzLmRvbSA9IHBhdGNoT3V0ZXJEZWNvKHRoaXMuZG9tLCB0aGlzLm5vZGVET00sIGNvbXB1dGVPdXRlckRlY28odGhpcy5vdXRlckRlY28sIHRoaXMubm9kZSwgbmVlZHNXcmFwKSwgY29tcHV0ZU91dGVyRGVjbyhvdXRlckRlY28sIHRoaXMubm9kZSwgbmVlZHNXcmFwKSk7XG4gICAgICAgIGlmICh0aGlzLmRvbSAhPSBvbGRET00pIHtcbiAgICAgICAgICAgIG9sZERPTS5wbVZpZXdEZXNjID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5kb20ucG1WaWV3RGVzYyA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRlckRlY28gPSBvdXRlckRlY287XG4gICAgfVxuICAgIC8vIE1hcmsgdGhpcyBub2RlIGFzIGJlaW5nIHRoZSBzZWxlY3RlZCBub2RlLlxuICAgIHNlbGVjdE5vZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVET00ubm9kZVR5cGUgPT0gMSlcbiAgICAgICAgICAgIHRoaXMubm9kZURPTS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICAgICAgICBpZiAodGhpcy5jb250ZW50RE9NIHx8ICF0aGlzLm5vZGUudHlwZS5zcGVjLmRyYWdnYWJsZSlcbiAgICAgICAgICAgIHRoaXMuZG9tLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBzZWxlY3RlZCBub2RlIG1hcmtpbmcgZnJvbSB0aGlzIG5vZGUuXG4gICAgZGVzZWxlY3ROb2RlKCkge1xuICAgICAgICBpZiAodGhpcy5ub2RlRE9NLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZURPTS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlXCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudERPTSB8fCAhdGhpcy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUpXG4gICAgICAgICAgICAgICAgdGhpcy5kb20ucmVtb3ZlQXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdGhpcy5ub2RlLmlzQXRvbTsgfVxufVxuLy8gQ3JlYXRlIGEgdmlldyBkZXNjIGZvciB0aGUgdG9wLWxldmVsIGRvY3VtZW50IG5vZGUsIHRvIGJlIGV4cG9ydGVkXG4vLyBhbmQgdXNlZCBieSB0aGUgdmlldyBjbGFzcy5cbmZ1bmN0aW9uIGRvY1ZpZXdEZXNjKGRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgdmlldykge1xuICAgIGFwcGx5T3V0ZXJEZWNvKGRvbSwgb3V0ZXJEZWNvLCBkb2MpO1xuICAgIGxldCBkb2NWaWV3ID0gbmV3IE5vZGVWaWV3RGVzYyh1bmRlZmluZWQsIGRvYywgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgZG9tLCBkb20sIHZpZXcsIDApO1xuICAgIGlmIChkb2NWaWV3LmNvbnRlbnRET00pXG4gICAgICAgIGRvY1ZpZXcudXBkYXRlQ2hpbGRyZW4odmlldywgMCk7XG4gICAgcmV0dXJuIGRvY1ZpZXc7XG59XG5jbGFzcyBUZXh0Vmlld0Rlc2MgZXh0ZW5kcyBOb2RlVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgbm9kZURPTSwgdmlldykge1xuICAgICAgICBzdXBlcihwYXJlbnQsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCBkb20sIG51bGwsIG5vZGVET00sIHZpZXcsIDApO1xuICAgIH1cbiAgICBwYXJzZVJ1bGUoKSB7XG4gICAgICAgIGxldCBza2lwID0gdGhpcy5ub2RlRE9NLnBhcmVudE5vZGU7XG4gICAgICAgIHdoaWxlIChza2lwICYmIHNraXAgIT0gdGhpcy5kb20gJiYgIXNraXAucG1Jc0RlY28pXG4gICAgICAgICAgICBza2lwID0gc2tpcC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4geyBza2lwOiAoc2tpcCB8fCB0cnVlKSB9O1xuICAgIH1cbiAgICB1cGRhdGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkgPT0gTk9ERV9ESVJUWSB8fCAodGhpcy5kaXJ0eSAhPSBOT1RfRElSVFkgJiYgIXRoaXMuaW5QYXJlbnQoKSkgfHxcbiAgICAgICAgICAgICFub2RlLnNhbWVNYXJrdXAodGhpcy5ub2RlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRlckRlY28ob3V0ZXJEZWNvKTtcbiAgICAgICAgaWYgKCh0aGlzLmRpcnR5ICE9IE5PVF9ESVJUWSB8fCBub2RlLnRleHQgIT0gdGhpcy5ub2RlLnRleHQpICYmIG5vZGUudGV4dCAhPSB0aGlzLm5vZGVET00ubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVET00ubm9kZVZhbHVlID0gbm9kZS50ZXh0O1xuICAgICAgICAgICAgaWYgKHZpZXcudHJhY2tXcml0ZXMgPT0gdGhpcy5ub2RlRE9NKVxuICAgICAgICAgICAgICAgIHZpZXcudHJhY2tXcml0ZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMuZGlydHkgPSBOT1RfRElSVFk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpblBhcmVudCgpIHtcbiAgICAgICAgbGV0IHBhcmVudERPTSA9IHRoaXMucGFyZW50LmNvbnRlbnRET007XG4gICAgICAgIGZvciAobGV0IG4gPSB0aGlzLm5vZGVET007IG47IG4gPSBuLnBhcmVudE5vZGUpXG4gICAgICAgICAgICBpZiAobiA9PSBwYXJlbnRET00pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZG9tRnJvbVBvcyhwb3MpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogdGhpcy5ub2RlRE9NLCBvZmZzZXQ6IHBvcyB9O1xuICAgIH1cbiAgICBsb2NhbFBvc0Zyb21ET00oZG9tLCBvZmZzZXQsIGJpYXMpIHtcbiAgICAgICAgaWYgKGRvbSA9PSB0aGlzLm5vZGVET00pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NBdFN0YXJ0ICsgTWF0aC5taW4ob2Zmc2V0LCB0aGlzLm5vZGUudGV4dC5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gc3VwZXIubG9jYWxQb3NGcm9tRE9NKGRvbSwgb2Zmc2V0LCBiaWFzKTtcbiAgICB9XG4gICAgaWdub3JlTXV0YXRpb24obXV0YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgIT0gXCJjaGFyYWN0ZXJEYXRhXCIgJiYgbXV0YXRpb24udHlwZSAhPSBcInNlbGVjdGlvblwiO1xuICAgIH1cbiAgICBzbGljZShmcm9tLCB0bywgdmlldykge1xuICAgICAgICBsZXQgbm9kZSA9IHRoaXMubm9kZS5jdXQoZnJvbSwgdG8pLCBkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlLnRleHQpO1xuICAgICAgICByZXR1cm4gbmV3IFRleHRWaWV3RGVzYyh0aGlzLnBhcmVudCwgbm9kZSwgdGhpcy5vdXRlckRlY28sIHRoaXMuaW5uZXJEZWNvLCBkb20sIGRvbSwgdmlldyk7XG4gICAgfVxuICAgIG1hcmtEaXJ0eShmcm9tLCB0bykge1xuICAgICAgICBzdXBlci5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICBpZiAodGhpcy5kb20gIT0gdGhpcy5ub2RlRE9NICYmIChmcm9tID09IDAgfHwgdG8gPT0gdGhpcy5ub2RlRE9NLm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IE5PREVfRElSVFk7XG4gICAgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICBpc1RleHQodGV4dCkgeyByZXR1cm4gdGhpcy5ub2RlLnRleHQgPT0gdGV4dDsgfVxufVxuLy8gQSBkdW1teSBkZXNjIHVzZWQgdG8gdGFnIHRyYWlsaW5nIEJSIG9yIElNRyBub2RlcyBjcmVhdGVkIHRvIHdvcmtcbi8vIGFyb3VuZCBjb250ZW50RWRpdGFibGUgdGVycmlibGVuZXNzLlxuY2xhc3MgVHJhaWxpbmdIYWNrVmlld0Rlc2MgZXh0ZW5kcyBWaWV3RGVzYyB7XG4gICAgcGFyc2VSdWxlKCkgeyByZXR1cm4geyBpZ25vcmU6IHRydWUgfTsgfVxuICAgIG1hdGNoZXNIYWNrKG5vZGVOYW1lKSB7IHJldHVybiB0aGlzLmRpcnR5ID09IE5PVF9ESVJUWSAmJiB0aGlzLmRvbS5ub2RlTmFtZSA9PSBub2RlTmFtZTsgfVxuICAgIGdldCBkb21BdG9tKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGdldCBpZ25vcmVGb3JDb29yZHMoKSB7IHJldHVybiB0aGlzLmRvbS5ub2RlTmFtZSA9PSBcIklNR1wiOyB9XG59XG4vLyBBIHNlcGFyYXRlIHN1YmNsYXNzIGlzIHVzZWQgZm9yIGN1c3RvbWl6ZWQgbm9kZSB2aWV3cywgc28gdGhhdCB0aGVcbi8vIGV4dHJhIGNoZWNrcyBvbmx5IGhhdmUgdG8gYmUgbWFkZSBmb3Igbm9kZXMgdGhhdCBhcmUgYWN0dWFsbHlcbi8vIGN1c3RvbWl6ZWQuXG5jbGFzcyBDdXN0b21Ob2RlVmlld0Rlc2MgZXh0ZW5kcyBOb2RlVmlld0Rlc2Mge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgc3BlYywgdmlldywgcG9zKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGRvbSwgY29udGVudERPTSwgbm9kZURPTSwgdmlldywgcG9zKTtcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYztcbiAgICB9XG4gICAgLy8gQSBjdXN0b20gYHVwZGF0ZWAgbWV0aG9kIGdldHMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHVwZGF0ZSBnb2VzXG4gICAgLy8gdGhyb3VnaC4gSWYgaXQgZG9lcywgYW5kIHRoZXJlJ3MgYSBgY29udGVudERPTWAgbm9kZSwgb3VyIGxvZ2ljXG4gICAgLy8gdXBkYXRlcyB0aGUgY2hpbGRyZW4uXG4gICAgdXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5ID09IE5PREVfRElSVFkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnNwZWMudXBkYXRlICYmICh0aGlzLm5vZGUudHlwZSA9PSBub2RlLnR5cGUgfHwgdGhpcy5zcGVjLm11bHRpVHlwZSkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnNwZWMudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbm5lcihub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRlbnRET00gJiYgIW5vZGUuaXNMZWFmKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZWxlY3ROb2RlKCkge1xuICAgICAgICB0aGlzLnNwZWMuc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5zZWxlY3ROb2RlKCkgOiBzdXBlci5zZWxlY3ROb2RlKCk7XG4gICAgfVxuICAgIGRlc2VsZWN0Tm9kZSgpIHtcbiAgICAgICAgdGhpcy5zcGVjLmRlc2VsZWN0Tm9kZSA/IHRoaXMuc3BlYy5kZXNlbGVjdE5vZGUoKSA6IHN1cGVyLmRlc2VsZWN0Tm9kZSgpO1xuICAgIH1cbiAgICBzZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSkge1xuICAgICAgICB0aGlzLnNwZWMuc2V0U2VsZWN0aW9uID8gdGhpcy5zcGVjLnNldFNlbGVjdGlvbihhbmNob3IsIGhlYWQsIHZpZXcucm9vdClcbiAgICAgICAgICAgIDogc3VwZXIuc2V0U2VsZWN0aW9uKGFuY2hvciwgaGVhZCwgdmlldywgZm9yY2UpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5zcGVjLmRlc3Ryb3kpXG4gICAgICAgICAgICB0aGlzLnNwZWMuZGVzdHJveSgpO1xuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHN0b3BFdmVudChldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zcGVjLnN0b3BFdmVudCA/IHRoaXMuc3BlYy5zdG9wRXZlbnQoZXZlbnQpIDogZmFsc2U7XG4gICAgfVxuICAgIGlnbm9yZU11dGF0aW9uKG11dGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24gPyB0aGlzLnNwZWMuaWdub3JlTXV0YXRpb24obXV0YXRpb24pIDogc3VwZXIuaWdub3JlTXV0YXRpb24obXV0YXRpb24pO1xuICAgIH1cbn1cbi8vIFN5bmMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBub2RlIHdpdGggdGhlIG5vZGVzIGFzc29jaWF0ZWRcbi8vIHdpdGggdGhlIGdpdmVuIGFycmF5IG9mIHZpZXcgZGVzY3MsIHJlY3Vyc2luZyBpbnRvIG1hcmsgZGVzY3Ncbi8vIGJlY2F1c2UgdGhpcyBzaG91bGQgc3luYyB0aGUgc3VidHJlZSBmb3IgYSB3aG9sZSBub2RlIGF0IGEgdGltZS5cbmZ1bmN0aW9uIHJlbmRlckRlc2NzKHBhcmVudERPTSwgZGVzY3MsIHZpZXcpIHtcbiAgICBsZXQgZG9tID0gcGFyZW50RE9NLmZpcnN0Q2hpbGQsIHdyaXR0ZW4gPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkZXNjID0gZGVzY3NbaV0sIGNoaWxkRE9NID0gZGVzYy5kb207XG4gICAgICAgIGlmIChjaGlsZERPTS5wYXJlbnROb2RlID09IHBhcmVudERPTSkge1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkRE9NICE9IGRvbSkge1xuICAgICAgICAgICAgICAgIGRvbSA9IHJtKGRvbSk7XG4gICAgICAgICAgICAgICAgd3JpdHRlbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb20gPSBkb20ubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3cml0dGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhcmVudERPTS5pbnNlcnRCZWZvcmUoY2hpbGRET00sIGRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2MgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBkb20gPyBkb20ucHJldmlvdXNTaWJsaW5nIDogcGFyZW50RE9NLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIHJlbmRlckRlc2NzKGRlc2MuY29udGVudERPTSwgZGVzYy5jaGlsZHJlbiwgdmlldyk7XG4gICAgICAgICAgICBkb20gPSBwb3MgPyBwb3MubmV4dFNpYmxpbmcgOiBwYXJlbnRET00uZmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoZG9tKSB7XG4gICAgICAgIGRvbSA9IHJtKGRvbSk7XG4gICAgICAgIHdyaXR0ZW4gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAod3JpdHRlbiAmJiB2aWV3LnRyYWNrV3JpdGVzID09IHBhcmVudERPTSlcbiAgICAgICAgdmlldy50cmFja1dyaXRlcyA9IG51bGw7XG59XG5jb25zdCBPdXRlckRlY29MZXZlbCA9IGZ1bmN0aW9uIChub2RlTmFtZSkge1xuICAgIGlmIChub2RlTmFtZSlcbiAgICAgICAgdGhpcy5ub2RlTmFtZSA9IG5vZGVOYW1lO1xufTtcbk91dGVyRGVjb0xldmVsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5jb25zdCBub0RlY28gPSBbbmV3IE91dGVyRGVjb0xldmVsXTtcbmZ1bmN0aW9uIGNvbXB1dGVPdXRlckRlY28ob3V0ZXJEZWNvLCBub2RlLCBuZWVkc1dyYXApIHtcbiAgICBpZiAob3V0ZXJEZWNvLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gbm9EZWNvO1xuICAgIGxldCB0b3AgPSBuZWVkc1dyYXAgPyBub0RlY29bMF0gOiBuZXcgT3V0ZXJEZWNvTGV2ZWwsIHJlc3VsdCA9IFt0b3BdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0ZXJEZWNvLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBhdHRycyA9IG91dGVyRGVjb1tpXS50eXBlLmF0dHJzO1xuICAgICAgICBpZiAoIWF0dHJzKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChhdHRycy5ub2RlTmFtZSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRvcCA9IG5ldyBPdXRlckRlY29MZXZlbChhdHRycy5ub2RlTmFtZSkpO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG4gICAgICAgICAgICBsZXQgdmFsID0gYXR0cnNbbmFtZV07XG4gICAgICAgICAgICBpZiAodmFsID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAobmVlZHNXcmFwICYmIHJlc3VsdC5sZW5ndGggPT0gMSlcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0b3AgPSBuZXcgT3V0ZXJEZWNvTGV2ZWwobm9kZS5pc0lubGluZSA/IFwic3BhblwiIDogXCJkaXZcIikpO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT0gXCJjbGFzc1wiKVxuICAgICAgICAgICAgICAgIHRvcC5jbGFzcyA9ICh0b3AuY2xhc3MgPyB0b3AuY2xhc3MgKyBcIiBcIiA6IFwiXCIpICsgdmFsO1xuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PSBcInN0eWxlXCIpXG4gICAgICAgICAgICAgICAgdG9wLnN0eWxlID0gKHRvcC5zdHlsZSA/IHRvcC5zdHlsZSArIFwiO1wiIDogXCJcIikgKyB2YWw7XG4gICAgICAgICAgICBlbHNlIGlmIChuYW1lICE9IFwibm9kZU5hbWVcIilcbiAgICAgICAgICAgICAgICB0b3BbbmFtZV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHBhdGNoT3V0ZXJEZWNvKG91dGVyRE9NLCBub2RlRE9NLCBwcmV2Q29tcHV0ZWQsIGN1ckNvbXB1dGVkKSB7XG4gICAgLy8gU2hvcnRjdXQgZm9yIHRyaXZpYWwgY2FzZVxuICAgIGlmIChwcmV2Q29tcHV0ZWQgPT0gbm9EZWNvICYmIGN1ckNvbXB1dGVkID09IG5vRGVjbylcbiAgICAgICAgcmV0dXJuIG5vZGVET007XG4gICAgbGV0IGN1ckRPTSA9IG5vZGVET007XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJDb21wdXRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZGVjbyA9IGN1ckNvbXB1dGVkW2ldLCBwcmV2ID0gcHJldkNvbXB1dGVkW2ldO1xuICAgICAgICBpZiAoaSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudDtcbiAgICAgICAgICAgIGlmIChwcmV2ICYmIHByZXYubm9kZU5hbWUgPT0gZGVjby5ub2RlTmFtZSAmJiBjdXJET00gIT0gb3V0ZXJET00gJiZcbiAgICAgICAgICAgICAgICAocGFyZW50ID0gY3VyRE9NLnBhcmVudE5vZGUpICYmIHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IGRlY28ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjdXJET00gPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRlY28ubm9kZU5hbWUpO1xuICAgICAgICAgICAgICAgIHBhcmVudC5wbUlzRGVjbyA9IHRydWU7XG4gICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGN1ckRPTSk7XG4gICAgICAgICAgICAgICAgcHJldiA9IG5vRGVjb1swXTtcbiAgICAgICAgICAgICAgICBjdXJET00gPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hBdHRyaWJ1dGVzKGN1ckRPTSwgcHJldiB8fCBub0RlY29bMF0sIGRlY28pO1xuICAgIH1cbiAgICByZXR1cm4gY3VyRE9NO1xufVxuZnVuY3Rpb24gcGF0Y2hBdHRyaWJ1dGVzKGRvbSwgcHJldiwgY3VyKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICBpZiAobmFtZSAhPSBcImNsYXNzXCIgJiYgbmFtZSAhPSBcInN0eWxlXCIgJiYgbmFtZSAhPSBcIm5vZGVOYW1lXCIgJiYgIShuYW1lIGluIGN1cikpXG4gICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIGZvciAobGV0IG5hbWUgaW4gY3VyKVxuICAgICAgICBpZiAobmFtZSAhPSBcImNsYXNzXCIgJiYgbmFtZSAhPSBcInN0eWxlXCIgJiYgbmFtZSAhPSBcIm5vZGVOYW1lXCIgJiYgY3VyW25hbWVdICE9IHByZXZbbmFtZV0pXG4gICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKG5hbWUsIGN1cltuYW1lXSk7XG4gICAgaWYgKHByZXYuY2xhc3MgIT0gY3VyLmNsYXNzKSB7XG4gICAgICAgIGxldCBwcmV2TGlzdCA9IHByZXYuY2xhc3MgPyBwcmV2LmNsYXNzLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgICAgbGV0IGN1ckxpc3QgPSBjdXIuY2xhc3MgPyBjdXIuY2xhc3Muc3BsaXQoXCIgXCIpLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZMaXN0Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGN1ckxpc3QuaW5kZXhPZihwcmV2TGlzdFtpXSkgPT0gLTEpXG4gICAgICAgICAgICAgICAgZG9tLmNsYXNzTGlzdC5yZW1vdmUocHJldkxpc3RbaV0pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1ckxpc3QubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAocHJldkxpc3QuaW5kZXhPZihjdXJMaXN0W2ldKSA9PSAtMSlcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NMaXN0LmFkZChjdXJMaXN0W2ldKTtcbiAgICAgICAgaWYgKGRvbS5jbGFzc0xpc3QubGVuZ3RoID09IDApXG4gICAgICAgICAgICBkb20ucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gICAgfVxuICAgIGlmIChwcmV2LnN0eWxlICE9IGN1ci5zdHlsZSkge1xuICAgICAgICBpZiAocHJldi5zdHlsZSkge1xuICAgICAgICAgICAgbGV0IHByb3AgPSAvXFxzKihbXFx3XFwtXFx4YTEtXFx1ZmZmZl0rKVxccyo6KD86XCIoPzpcXFxcLnxbXlwiXSkqXCJ8Jyg/OlxcXFwufFteJ10pKid8XFwoLio/XFwpfFteO10pKi9nLCBtO1xuICAgICAgICAgICAgd2hpbGUgKG0gPSBwcm9wLmV4ZWMocHJldi5zdHlsZSkpXG4gICAgICAgICAgICAgICAgZG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KG1bMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXIuc3R5bGUpXG4gICAgICAgICAgICBkb20uc3R5bGUuY3NzVGV4dCArPSBjdXIuc3R5bGU7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlPdXRlckRlY28oZG9tLCBkZWNvLCBub2RlKSB7XG4gICAgcmV0dXJuIHBhdGNoT3V0ZXJEZWNvKGRvbSwgZG9tLCBub0RlY28sIGNvbXB1dGVPdXRlckRlY28oZGVjbywgbm9kZSwgZG9tLm5vZGVUeXBlICE9IDEpKTtcbn1cbmZ1bmN0aW9uIHNhbWVPdXRlckRlY28oYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFhW2ldLnR5cGUuZXEoYltpXS50eXBlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIFJlbW92ZSBhIERPTSBub2RlIGFuZCByZXR1cm4gaXRzIG5leHQgc2libGluZy5cbmZ1bmN0aW9uIHJtKGRvbSkge1xuICAgIGxldCBuZXh0ID0gZG9tLm5leHRTaWJsaW5nO1xuICAgIGRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG4vLyBIZWxwZXIgY2xhc3MgZm9yIGluY3JlbWVudGFsbHkgdXBkYXRpbmcgYSB0cmVlIG9mIG1hcmsgZGVzY3MgYW5kXG4vLyB0aGUgd2lkZ2V0IGFuZCBub2RlIGRlc2NzIGluc2lkZSBvZiB0aGVtLlxuY2xhc3MgVmlld1RyZWVVcGRhdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b3AsIGxvY2ssIHZpZXcpIHtcbiAgICAgICAgdGhpcy5sb2NrID0gbG9jaztcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgLy8gSW5kZXggaW50byBgdGhpcy50b3BgJ3MgY2hpbGQgYXJyYXksIHJlcHJlc2VudHMgdGhlIGN1cnJlbnRcbiAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uLlxuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgLy8gV2hlbiBlbnRlcmluZyBhIG1hcmssIHRoZSBjdXJyZW50IHRvcCBhbmQgaW5kZXggYXJlIHB1c2hlZFxuICAgICAgICAvLyBvbnRvIHRoaXMuXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgLy8gVHJhY2tzIHdoZXRoZXIgYW55dGhpbmcgd2FzIGNoYW5nZWRcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9wID0gdG9wO1xuICAgICAgICB0aGlzLnByZU1hdGNoID0gcHJlTWF0Y2godG9wLm5vZGUuY29udGVudCwgdG9wKTtcbiAgICB9XG4gICAgLy8gRGVzdHJveSBhbmQgcmVtb3ZlIHRoZSBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBnaXZlbiBpbmRpY2VzIGluXG4gICAgLy8gYHRoaXMudG9wYC5cbiAgICBkZXN0cm95QmV0d2VlbihzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmIChzdGFydCA9PSBlbmQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKVxuICAgICAgICAgICAgdGhpcy50b3AuY2hpbGRyZW5baV0uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRGVzdHJveSBhbGwgcmVtYWluaW5nIGNoaWxkcmVuIGluIGB0aGlzLnRvcGAuXG4gICAgZGVzdHJveVJlc3QoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICB9XG4gICAgLy8gU3luYyB0aGUgY3VycmVudCBzdGFjayBvZiBtYXJrIGRlc2NzIHdpdGggdGhlIGdpdmVuIGFycmF5IG9mXG4gICAgLy8gbWFya3MsIHJldXNpbmcgZXhpc3RpbmcgbWFyayBkZXNjcyB3aGVuIHBvc3NpYmxlLlxuICAgIHN5bmNUb01hcmtzKG1hcmtzLCBpbmxpbmUsIHZpZXcpIHtcbiAgICAgICAgbGV0IGtlZXAgPSAwLCBkZXB0aCA9IHRoaXMuc3RhY2subGVuZ3RoID4+IDE7XG4gICAgICAgIGxldCBtYXhLZWVwID0gTWF0aC5taW4oZGVwdGgsIG1hcmtzLmxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChrZWVwIDwgbWF4S2VlcCAmJlxuICAgICAgICAgICAgKGtlZXAgPT0gZGVwdGggLSAxID8gdGhpcy50b3AgOiB0aGlzLnN0YWNrWyhrZWVwICsgMSkgPDwgMV0pXG4gICAgICAgICAgICAgICAgLm1hdGNoZXNNYXJrKG1hcmtzW2tlZXBdKSAmJiBtYXJrc1trZWVwXS50eXBlLnNwZWMuc3Bhbm5pbmcgIT09IGZhbHNlKVxuICAgICAgICAgICAga2VlcCsrO1xuICAgICAgICB3aGlsZSAoa2VlcCA8IGRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSZXN0KCk7XG4gICAgICAgICAgICB0aGlzLnRvcC5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy50b3AgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZGVwdGggPCBtYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLnRvcCwgdGhpcy5pbmRleCArIDEpO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gLTE7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pbmRleDsgaSA8IE1hdGgubWluKHRoaXMuaW5kZXggKyAzLCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0Lm1hdGNoZXNNYXJrKG1hcmtzW2RlcHRoXSkgJiYgIXRoaXMuaXNMb2NrZWQobmV4dC5kb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvdW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPiB0aGlzLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgZm91bmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRvcCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcmtEZXNjID0gTWFya1ZpZXdEZXNjLmNyZWF0ZSh0aGlzLnRvcCwgbWFya3NbZGVwdGhdLCBpbmxpbmUsIHZpZXcpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuLnNwbGljZSh0aGlzLmluZGV4LCAwLCBtYXJrRGVzYyk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3AgPSBtYXJrRGVzYztcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7XG4gICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byBmaW5kIGEgbm9kZSBkZXNjIG1hdGNoaW5nIHRoZSBnaXZlbiBkYXRhLiBTa2lwIG92ZXIgaXQgYW5kXG4gICAgLy8gcmV0dXJuIHRydWUgd2hlbiBzdWNjZXNzZnVsLlxuICAgIGZpbmROb2RlTWF0Y2gobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGluZGV4KSB7XG4gICAgICAgIGxldCBmb3VuZCA9IC0xLCB0YXJnZXREZXNjO1xuICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy5wcmVNYXRjaC5pbmRleCAmJlxuICAgICAgICAgICAgKHRhcmdldERlc2MgPSB0aGlzLnByZU1hdGNoLm1hdGNoZXNbaW5kZXggLSB0aGlzLnByZU1hdGNoLmluZGV4XSkucGFyZW50ID09IHRoaXMudG9wICYmXG4gICAgICAgICAgICB0YXJnZXREZXNjLm1hdGNoZXNOb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvKSkge1xuICAgICAgICAgICAgZm91bmQgPSB0aGlzLnRvcC5jaGlsZHJlbi5pbmRleE9mKHRhcmdldERlc2MsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXgsIGUgPSBNYXRoLm1pbih0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGgsIGkgKyA1KTsgaSA8IGU7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5tYXRjaGVzTm9kZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbykgJiYgIXRoaXMucHJlTWF0Y2gubWF0Y2hlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCA8IDApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgZm91bmQpO1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB1cGRhdGVOb2RlQXQobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIGluZGV4LCB2aWV3KSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgICAgaWYgKGNoaWxkLmRpcnR5ID09IE5PREVfRElSVFkgJiYgY2hpbGQuZG9tID09IGNoaWxkLmNvbnRlbnRET00pXG4gICAgICAgICAgICBjaGlsZC5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgICAgIGlmICghY2hpbGQudXBkYXRlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3KSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXN0cm95QmV0d2Vlbih0aGlzLmluZGV4LCBpbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZpbmRJbmRleFdpdGhDaGlsZChkb21Ob2RlKSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBkb21Ob2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudClcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09IHRoaXMudG9wLmNvbnRlbnRET00pIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGRvbU5vZGUucG1WaWV3RGVzYztcbiAgICAgICAgICAgICAgICBpZiAoZGVzYylcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuaW5kZXg7IGkgPCB0aGlzLnRvcC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG9wLmNoaWxkcmVuW2ldID09IGRlc2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb21Ob2RlID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyeSB0byB1cGRhdGUgdGhlIG5leHQgbm9kZSwgaWYgYW55LCB0byB0aGUgZ2l2ZW4gZGF0YS4gQ2hlY2tzXG4gICAgLy8gcHJlLW1hdGNoZXMgdG8gYXZvaWQgb3ZlcndyaXRpbmcgbm9kZXMgdGhhdCBjb3VsZCBzdGlsbCBiZSB1c2VkLlxuICAgIHVwZGF0ZU5leHROb2RlKG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBpbmRleCwgcG9zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmluZGV4OyBpIDwgdGhpcy50b3AuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy50b3AuY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE5vZGVWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgIGxldCBwcmVNYXRjaCA9IHRoaXMucHJlTWF0Y2gubWF0Y2hlZC5nZXQobmV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZU1hdGNoICE9IG51bGwgJiYgcHJlTWF0Y2ggIT0gaW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dERPTSA9IG5leHQuZG9tLCB1cGRhdGVkO1xuICAgICAgICAgICAgICAgIC8vIENhbid0IHVwZGF0ZSBpZiBuZXh0RE9NIGlzIG9yIGNvbnRhaW5zIHRoaXMubG9jaywgZXhjZXB0IGlmXG4gICAgICAgICAgICAgICAgLy8gaXQncyBhIHRleHQgbm9kZSB3aG9zZSBjb250ZW50IGFscmVhZHkgbWF0Y2hlcyB0aGUgbmV3IHRleHRcbiAgICAgICAgICAgICAgICAvLyBhbmQgd2hvc2UgZGVjb3JhdGlvbnMgbWF0Y2ggdGhlIG5ldyBvbmVzLlxuICAgICAgICAgICAgICAgIGxldCBsb2NrZWQgPSB0aGlzLmlzTG9ja2VkKG5leHRET00pICYmXG4gICAgICAgICAgICAgICAgICAgICEobm9kZS5pc1RleHQgJiYgbmV4dC5ub2RlICYmIG5leHQubm9kZS5pc1RleHQgJiYgbmV4dC5ub2RlRE9NLm5vZGVWYWx1ZSA9PSBub2RlLnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuZGlydHkgIT0gTk9ERV9ESVJUWSAmJiBzYW1lT3V0ZXJEZWNvKG91dGVyRGVjbywgbmV4dC5vdXRlckRlY28pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2tlZCAmJiBuZXh0LnVwZGF0ZShub2RlLCBvdXRlckRlY28sIGlubmVyRGVjbywgdmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95QmV0d2Vlbih0aGlzLmluZGV4LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZG9tICE9IG5leHRET00pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbG9ja2VkICYmICh1cGRhdGVkID0gdGhpcy5yZWNyZWF0ZVdyYXBwZXIobmV4dCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUJldHdlZW4odGhpcy5pbmRleCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdID0gdXBkYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQuY29udGVudERPTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5kaXJ0eSA9IENPTlRFTlRfRElSVFk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLnVwZGF0ZUNoaWxkcmVuKHZpZXcsIHBvcyArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZC5kaXJ0eSA9IE5PVF9ESVJUWTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFdoZW4gYSBub2RlIHdpdGggY29udGVudCBpcyByZXBsYWNlZCBieSBhIGRpZmZlcmVudCBub2RlIHdpdGhcbiAgICAvLyBpZGVudGljYWwgY29udGVudCwgbW92ZSBvdmVyIGl0cyBjaGlsZHJlbi5cbiAgICByZWNyZWF0ZVdyYXBwZXIobmV4dCwgbm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBpZiAobmV4dC5kaXJ0eSB8fCBub2RlLmlzQXRvbSB8fCAhbmV4dC5jaGlsZHJlbi5sZW5ndGggfHxcbiAgICAgICAgICAgICFuZXh0Lm5vZGUuY29udGVudC5lcShub2RlLmNvbnRlbnQpIHx8XG4gICAgICAgICAgICAhc2FtZU91dGVyRGVjbyhvdXRlckRlY28sIG5leHQub3V0ZXJEZWNvKSB8fCAhaW5uZXJEZWNvLmVxKG5leHQuaW5uZXJEZWNvKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgd3JhcHBlciA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAod3JhcHBlci5jb250ZW50RE9NKSB7XG4gICAgICAgICAgICB3cmFwcGVyLmNoaWxkcmVuID0gbmV4dC5jaGlsZHJlbjtcbiAgICAgICAgICAgIG5leHQuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNoIG9mIHdyYXBwZXIuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgY2gucGFyZW50ID0gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuICAgIC8vIEluc2VydCB0aGUgbm9kZSBhcyBhIG5ld2x5IGNyZWF0ZWQgbm9kZSBkZXNjLlxuICAgIGFkZE5vZGUobm9kZSwgb3V0ZXJEZWNvLCBpbm5lckRlY28sIHZpZXcsIHBvcykge1xuICAgICAgICBsZXQgZGVzYyA9IE5vZGVWaWV3RGVzYy5jcmVhdGUodGhpcy50b3AsIG5vZGUsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB2aWV3LCBwb3MpO1xuICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NKVxuICAgICAgICAgICAgZGVzYy51cGRhdGVDaGlsZHJlbih2aWV3LCBwb3MgKyAxKTtcbiAgICAgICAgdGhpcy50b3AuY2hpbGRyZW4uc3BsaWNlKHRoaXMuaW5kZXgrKywgMCwgZGVzYyk7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIHBsYWNlV2lkZ2V0KHdpZGdldCwgdmlldywgcG9zKSB7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5pbmRleCA8IHRoaXMudG9wLmNoaWxkcmVuLmxlbmd0aCA/IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXhdIDogbnVsbDtcbiAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5tYXRjaGVzV2lkZ2V0KHdpZGdldCkgJiZcbiAgICAgICAgICAgICh3aWRnZXQgPT0gbmV4dC53aWRnZXQgfHwgIW5leHQud2lkZ2V0LnR5cGUudG9ET00ucGFyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkZXNjID0gbmV3IFdpZGdldFZpZXdEZXNjKHRoaXMudG9wLCB3aWRnZXQsIHZpZXcsIHBvcyk7XG4gICAgICAgICAgICB0aGlzLnRvcC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBkZXNjKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIGEgdGV4dGJsb2NrIGxvb2tzIGFuZCBiZWhhdmVzIGNvcnJlY3RseSBpblxuICAgIC8vIGNvbnRlbnRFZGl0YWJsZS5cbiAgICBhZGRUZXh0YmxvY2tIYWNrcygpIHtcbiAgICAgICAgbGV0IGxhc3RDaGlsZCA9IHRoaXMudG9wLmNoaWxkcmVuW3RoaXMuaW5kZXggLSAxXSwgcGFyZW50ID0gdGhpcy50b3A7XG4gICAgICAgIHdoaWxlIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBNYXJrVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IGxhc3RDaGlsZDtcbiAgICAgICAgICAgIGxhc3RDaGlsZCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0Q2hpbGQgfHwgLy8gRW1wdHkgdGV4dGJsb2NrXG4gICAgICAgICAgICAhKGxhc3RDaGlsZCBpbnN0YW5jZW9mIFRleHRWaWV3RGVzYykgfHxcbiAgICAgICAgICAgIC9cXG4kLy50ZXN0KGxhc3RDaGlsZC5ub2RlLnRleHQpIHx8XG4gICAgICAgICAgICAodGhpcy52aWV3LnJlcXVpcmVzR2Vja29IYWNrTm9kZSAmJiAvXFxzJC8udGVzdChsYXN0Q2hpbGQubm9kZS50ZXh0KSkpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGJ1Z3MgaW4gU2FmYXJpJ3MgY3Vyc29yIGRyYXdpbmcgKCMxMTY1KSBhbmQgQ2hyb21lJ3MgbW91c2Ugc2VsZWN0aW9uICgjMTE1MilcbiAgICAgICAgICAgIGlmICgoc2FmYXJpIHx8IGNocm9tZSkgJiYgbGFzdENoaWxkICYmIGxhc3RDaGlsZC5kb20uY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiSU1HXCIsIHBhcmVudCk7XG4gICAgICAgICAgICB0aGlzLmFkZEhhY2tOb2RlKFwiQlJcIiwgdGhpcy50b3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZEhhY2tOb2RlKG5vZGVOYW1lLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnRvcCAmJiB0aGlzLmluZGV4IDwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCAmJiBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0ubWF0Y2hlc0hhY2sobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICAgIGRvbS5jbGFzc05hbWUgPSBcIlByb3NlTWlycm9yLXNlcGFyYXRvclwiO1xuICAgICAgICAgICAgICAgIGRvbS5hbHQgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiQlJcIilcbiAgICAgICAgICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci10cmFpbGluZ0JyZWFrXCI7XG4gICAgICAgICAgICBsZXQgaGFjayA9IG5ldyBUcmFpbGluZ0hhY2tWaWV3RGVzYyh0aGlzLnRvcCwgW10sIGRvbSwgbnVsbCk7XG4gICAgICAgICAgICBpZiAocGFyZW50ICE9IHRoaXMudG9wKVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKGhhY2spO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UodGhpcy5pbmRleCsrLCAwLCBoYWNrKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNMb2NrZWQobm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NrICYmIChub2RlID09IHRoaXMubG9jayB8fCBub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5jb250YWlucyh0aGlzLmxvY2sucGFyZW50Tm9kZSkpO1xuICAgIH1cbn1cbi8vIEl0ZXJhdGUgZnJvbSB0aGUgZW5kIG9mIHRoZSBmcmFnbWVudCBhbmQgYXJyYXkgb2YgZGVzY3MgdG8gZmluZFxuLy8gZGlyZWN0bHkgbWF0Y2hpbmcgb25lcywgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmVhZ2VybHkgcmV1c2luZyB0aG9zZVxuLy8gZm9yIG90aGVyIG5vZGVzLiBSZXR1cm5zIHRoZSBmcmFnbWVudCBpbmRleCBvZiB0aGUgZmlyc3Qgbm9kZSB0aGF0XG4vLyBpcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBvZiBtYXRjaGVkIG5vZGVzIGF0IHRoZSBlbmQgb2YgdGhlXG4vLyBmcmFnbWVudC5cbmZ1bmN0aW9uIHByZU1hdGNoKGZyYWcsIHBhcmVudERlc2MpIHtcbiAgICBsZXQgY3VyRGVzYyA9IHBhcmVudERlc2MsIGRlc2NJID0gY3VyRGVzYy5jaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGZJID0gZnJhZy5jaGlsZENvdW50LCBtYXRjaGVkID0gbmV3IE1hcCwgbWF0Y2hlcyA9IFtdO1xuICAgIG91dGVyOiB3aGlsZSAoZkkgPiAwKSB7XG4gICAgICAgIGxldCBkZXNjO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoZGVzY0kpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1ckRlc2MuY2hpbGRyZW5bZGVzY0kgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIE1hcmtWaWV3RGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjdXJEZXNjID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0kgPSBuZXh0LmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXh0O1xuICAgICAgICAgICAgICAgICAgICBkZXNjSS0tO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJEZXNjID09IHBhcmVudERlc2MpIHtcbiAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZJWE1FXG4gICAgICAgICAgICAgICAgZGVzY0kgPSBjdXJEZXNjLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGN1ckRlc2MpO1xuICAgICAgICAgICAgICAgIGN1ckRlc2MgPSBjdXJEZXNjLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IGRlc2Mubm9kZTtcbiAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChub2RlICE9IGZyYWcuY2hpbGQoZkkgLSAxKSlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAtLWZJO1xuICAgICAgICBtYXRjaGVkLnNldChkZXNjLCBmSSk7XG4gICAgICAgIG1hdGNoZXMucHVzaChkZXNjKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaW5kZXg6IGZJLCBtYXRjaGVkLCBtYXRjaGVzOiBtYXRjaGVzLnJldmVyc2UoKSB9O1xufVxuZnVuY3Rpb24gY29tcGFyZVNpZGUoYSwgYikge1xuICAgIHJldHVybiBhLnR5cGUuc2lkZSAtIGIudHlwZS5zaWRlO1xufVxuLy8gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgaXRlcmF0aW5nIG92ZXIgdGhlIG5vZGVzIGFuZCBkZWNvcmF0aW9ucyBpblxuLy8gYSBmcmFnbWVudC4gQ2FsbHMgYG9uTm9kZWAgZm9yIGVhY2ggbm9kZSwgd2l0aCBpdHMgbG9jYWwgYW5kIGNoaWxkXG4vLyBkZWNvcmF0aW9ucy4gU3BsaXRzIHRleHQgbm9kZXMgd2hlbiB0aGVyZSBpcyBhIGRlY29yYXRpb24gc3RhcnRpbmdcbi8vIG9yIGVuZGluZyBpbnNpZGUgb2YgdGhlbS4gQ2FsbHMgYG9uV2lkZ2V0YCBmb3IgZWFjaCB3aWRnZXQuXG5mdW5jdGlvbiBpdGVyRGVjbyhwYXJlbnQsIGRlY28sIG9uV2lkZ2V0LCBvbk5vZGUpIHtcbiAgICBsZXQgbG9jYWxzID0gZGVjby5sb2NhbHMocGFyZW50KSwgb2Zmc2V0ID0gMDtcbiAgICAvLyBTaW1wbGUsIGNoZWFwIHZhcmlhbnQgZm9yIHdoZW4gdGhlcmUgYXJlIG5vIGxvY2FsIGRlY29yYXRpb25zXG4gICAgaWYgKGxvY2Fscy5sZW5ndGggPT0gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudC5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHBhcmVudC5jaGlsZChpKTtcbiAgICAgICAgICAgIG9uTm9kZShjaGlsZCwgbG9jYWxzLCBkZWNvLmZvckNoaWxkKG9mZnNldCwgY2hpbGQpLCBpKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBkZWNvSW5kZXggPSAwLCBhY3RpdmUgPSBbXSwgcmVzdE5vZGUgPSBudWxsO1xuICAgIGZvciAobGV0IHBhcmVudEluZGV4ID0gMDs7KSB7XG4gICAgICAgIGxldCB3aWRnZXQsIHdpZGdldHM7XG4gICAgICAgIHdoaWxlIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLnRvID09IG9mZnNldCkge1xuICAgICAgICAgICAgbGV0IG5leHQgPSBsb2NhbHNbZGVjb0luZGV4KytdO1xuICAgICAgICAgICAgaWYgKG5leHQud2lkZ2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3aWRnZXQpXG4gICAgICAgICAgICAgICAgICAgIHdpZGdldCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAod2lkZ2V0cyB8fCAod2lkZ2V0cyA9IFt3aWRnZXRdKSkucHVzaChuZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkZ2V0KSB7XG4gICAgICAgICAgICBpZiAod2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHdpZGdldHMuc29ydChjb21wYXJlU2lkZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXRzW2ldLCBwYXJlbnRJbmRleCwgISFyZXN0Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbldpZGdldCh3aWRnZXQsIHBhcmVudEluZGV4LCAhIXJlc3ROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hpbGQsIGluZGV4O1xuICAgICAgICBpZiAocmVzdE5vZGUpIHtcbiAgICAgICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgICAgICBjaGlsZCA9IHJlc3ROb2RlO1xuICAgICAgICAgICAgcmVzdE5vZGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmVudEluZGV4IDwgcGFyZW50LmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgICAgICAgICBjaGlsZCA9IHBhcmVudC5jaGlsZChwYXJlbnRJbmRleCsrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXS50byA8PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgYWN0aXZlLnNwbGljZShpLS0sIDEpO1xuICAgICAgICB3aGlsZSAoZGVjb0luZGV4IDwgbG9jYWxzLmxlbmd0aCAmJiBsb2NhbHNbZGVjb0luZGV4XS5mcm9tIDw9IG9mZnNldCAmJiBsb2NhbHNbZGVjb0luZGV4XS50byA+IG9mZnNldClcbiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGxvY2Fsc1tkZWNvSW5kZXgrK10pO1xuICAgICAgICBsZXQgZW5kID0gb2Zmc2V0ICsgY2hpbGQubm9kZVNpemU7XG4gICAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgICAgIGxldCBjdXRBdCA9IGVuZDtcbiAgICAgICAgICAgIGlmIChkZWNvSW5kZXggPCBsb2NhbHMubGVuZ3RoICYmIGxvY2Fsc1tkZWNvSW5kZXhdLmZyb20gPCBjdXRBdClcbiAgICAgICAgICAgICAgICBjdXRBdCA9IGxvY2Fsc1tkZWNvSW5kZXhdLmZyb207XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlW2ldLnRvIDwgY3V0QXQpXG4gICAgICAgICAgICAgICAgICAgIGN1dEF0ID0gYWN0aXZlW2ldLnRvO1xuICAgICAgICAgICAgaWYgKGN1dEF0IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdE5vZGUgPSBjaGlsZC5jdXQoY3V0QXQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuY3V0KDAsIGN1dEF0IC0gb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBlbmQgPSBjdXRBdDtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGRlY29JbmRleCA8IGxvY2Fscy5sZW5ndGggJiYgbG9jYWxzW2RlY29JbmRleF0udG8gPCBlbmQpXG4gICAgICAgICAgICAgICAgZGVjb0luZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG91dGVyRGVjbyA9IGNoaWxkLmlzSW5saW5lICYmICFjaGlsZC5pc0xlYWYgPyBhY3RpdmUuZmlsdGVyKGQgPT4gIWQuaW5saW5lKSA6IGFjdGl2ZS5zbGljZSgpO1xuICAgICAgICBvbk5vZGUoY2hpbGQsIG91dGVyRGVjbywgZGVjby5mb3JDaGlsZChvZmZzZXQsIGNoaWxkKSwgaW5kZXgpO1xuICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgfVxufVxuLy8gTGlzdCBtYXJrZXJzIGluIE1vYmlsZSBTYWZhcmkgd2lsbCBteXN0ZXJpb3VzbHkgZGlzYXBwZWFyXG4vLyBzb21ldGltZXMuIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQuXG5mdW5jdGlvbiBpb3NIYWNrcyhkb20pIHtcbiAgICBpZiAoZG9tLm5vZGVOYW1lID09IFwiVUxcIiB8fCBkb20ubm9kZU5hbWUgPT0gXCJPTFwiKSB7XG4gICAgICAgIGxldCBvbGRDU1MgPSBkb20uc3R5bGUuY3NzVGV4dDtcbiAgICAgICAgZG9tLnN0eWxlLmNzc1RleHQgPSBvbGRDU1MgKyBcIjsgbGlzdC1zdHlsZTogc3F1YXJlICFpbXBvcnRhbnRcIjtcbiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tKS5saXN0U3R5bGU7XG4gICAgICAgIGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTO1xuICAgIH1cbn1cbi8vIEZpbmQgYSBwaWVjZSBvZiB0ZXh0IGluIGFuIGlubGluZSBmcmFnbWVudCwgb3ZlcmxhcHBpbmcgZnJvbS10b1xuZnVuY3Rpb24gZmluZFRleHRJbkZyYWdtZW50KGZyYWcsIHRleHQsIGZyb20sIHRvKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIHBvcyA9IDA7IGkgPCBmcmFnLmNoaWxkQ291bnQgJiYgcG9zIDw9IHRvOykge1xuICAgICAgICBsZXQgY2hpbGQgPSBmcmFnLmNoaWxkKGkrKyksIGNoaWxkU3RhcnQgPSBwb3M7XG4gICAgICAgIHBvcyArPSBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgaWYgKCFjaGlsZC5pc1RleHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgbGV0IHN0ciA9IGNoaWxkLnRleHQ7XG4gICAgICAgIHdoaWxlIChpIDwgZnJhZy5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGZyYWcuY2hpbGQoaSsrKTtcbiAgICAgICAgICAgIHBvcyArPSBuZXh0Lm5vZGVTaXplO1xuICAgICAgICAgICAgaWYgKCFuZXh0LmlzVGV4dClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHN0ciArPSBuZXh0LnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+PSBmcm9tKSB7XG4gICAgICAgICAgICBpZiAocG9zID49IHRvICYmIHN0ci5zbGljZSh0byAtIHRleHQubGVuZ3RoIC0gY2hpbGRTdGFydCwgdG8gLSBjaGlsZFN0YXJ0KSA9PSB0ZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiB0byAtIHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gY2hpbGRTdGFydCA8IHRvID8gc3RyLmxhc3RJbmRleE9mKHRleHQsIHRvIC0gY2hpbGRTdGFydCAtIDEpIDogLTE7XG4gICAgICAgICAgICBpZiAoZm91bmQgPj0gMCAmJiBmb3VuZCArIHRleHQubGVuZ3RoICsgY2hpbGRTdGFydCA+PSBmcm9tKVxuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZFN0YXJ0ICsgZm91bmQ7XG4gICAgICAgICAgICBpZiAoZnJvbSA9PSB0byAmJiBzdHIubGVuZ3RoID49ICh0byArIHRleHQubGVuZ3RoKSAtIGNoaWxkU3RhcnQgJiZcbiAgICAgICAgICAgICAgICBzdHIuc2xpY2UodG8gLSBjaGlsZFN0YXJ0LCB0byAtIGNoaWxkU3RhcnQgKyB0ZXh0Lmxlbmd0aCkgPT0gdGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gdG87XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLy8gUmVwbGFjZSByYW5nZSBmcm9tLXRvIGluIGFuIGFycmF5IG9mIHZpZXcgZGVzY3Mgd2l0aCByZXBsYWNlbWVudFxuLy8gKG1heSBiZSBudWxsIHRvIGp1c3QgZGVsZXRlKS4gVGhpcyBnb2VzIHZlcnkgbXVjaCBhZ2FpbnN0IHRoZSBncmFpblxuLy8gb2YgdGhlIHJlc3Qgb2YgdGhpcyBjb2RlLCB3aGljaCB0ZW5kcyB0byBjcmVhdGUgbm9kZXMgd2l0aCB0aGVcbi8vIHJpZ2h0IHNoYXBlIGluIG9uZSBnbywgcmF0aGVyIHRoYW4gbWVzc2luZyB3aXRoIHRoZW0gYWZ0ZXJcbi8vIGNyZWF0aW9uLCBidXQgaXMgbmVjZXNzYXJ5IGluIHRoZSBjb21wb3NpdGlvbiBoYWNrLlxuZnVuY3Rpb24gcmVwbGFjZU5vZGVzKG5vZGVzLCBmcm9tLCB0bywgdmlldywgcmVwbGFjZW1lbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDAsIG9mZiA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGQgPSBub2Rlc1tpXSwgc3RhcnQgPSBvZmYsIGVuZCA9IG9mZiArPSBjaGlsZC5zaXplO1xuICAgICAgICBpZiAoc3RhcnQgPj0gdG8gfHwgZW5kIDw9IGZyb20pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IGZyb20pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQuc2xpY2UoMCwgZnJvbSAtIHN0YXJ0LCB2aWV3KSk7XG4gICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXBsYWNlbWVudCk7XG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kID4gdG8pXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQuc2xpY2UodG8gLSBzdGFydCwgY2hpbGQuc2l6ZSwgdmlldykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGlvbkZyb21ET00odmlldywgb3JpZ2luID0gbnVsbCkge1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCksIGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGlmICghZG9tU2VsLmZvY3VzTm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IG5lYXJlc3REZXNjID0gdmlldy5kb2NWaWV3Lm5lYXJlc3REZXNjKGRvbVNlbC5mb2N1c05vZGUpLCBpbldpZGdldCA9IG5lYXJlc3REZXNjICYmIG5lYXJlc3REZXNjLnNpemUgPT0gMDtcbiAgICBsZXQgaGVhZCA9IHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgMSk7XG4gICAgaWYgKGhlYWQgPCAwKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgJGhlYWQgPSBkb2MucmVzb2x2ZShoZWFkKSwgYW5jaG9yLCBzZWxlY3Rpb247XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChkb21TZWwpKSB7XG4gICAgICAgIGFuY2hvciA9IGhlYWQ7XG4gICAgICAgIHdoaWxlIChuZWFyZXN0RGVzYyAmJiAhbmVhcmVzdERlc2Mubm9kZSlcbiAgICAgICAgICAgIG5lYXJlc3REZXNjID0gbmVhcmVzdERlc2MucGFyZW50O1xuICAgICAgICBsZXQgbmVhcmVzdERlc2NOb2RlID0gbmVhcmVzdERlc2Mubm9kZTtcbiAgICAgICAgaWYgKG5lYXJlc3REZXNjICYmIG5lYXJlc3REZXNjTm9kZS5pc0F0b20gJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobmVhcmVzdERlc2NOb2RlKSAmJiBuZWFyZXN0RGVzYy5wYXJlbnRcbiAgICAgICAgICAgICYmICEobmVhcmVzdERlc2NOb2RlLmlzSW5saW5lICYmIGlzT25FZGdlKGRvbVNlbC5mb2N1c05vZGUsIGRvbVNlbC5mb2N1c09mZnNldCwgbmVhcmVzdERlc2MuZG9tKSkpIHtcbiAgICAgICAgICAgIGxldCBwb3MgPSBuZWFyZXN0RGVzYy5wb3NCZWZvcmU7XG4gICAgICAgICAgICBzZWxlY3Rpb24gPSBuZXcgTm9kZVNlbGVjdGlvbihoZWFkID09IHBvcyA/ICRoZWFkIDogZG9jLnJlc29sdmUocG9zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChkb21TZWwgaW5zdGFuY2VvZiB2aWV3LmRvbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LlNlbGVjdGlvbiAmJiBkb21TZWwucmFuZ2VDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGxldCBtaW4gPSBoZWFkLCBtYXggPSBoZWFkO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21TZWwucmFuZ2VDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gZG9tU2VsLmdldFJhbmdlQXQoaSk7XG4gICAgICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShyYW5nZS5zdGFydENvbnRhaW5lciwgcmFuZ2Uuc3RhcnRPZmZzZXQsIDEpKTtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZpZXcuZG9jVmlldy5wb3NGcm9tRE9NKHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0LCAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pbiA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBbYW5jaG9yLCBoZWFkXSA9IG1heCA9PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IgPyBbbWF4LCBtaW5dIDogW21pbiwgbWF4XTtcbiAgICAgICAgICAgICRoZWFkID0gZG9jLnJlc29sdmUoaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IgPSB2aWV3LmRvY1ZpZXcucG9zRnJvbURPTShkb21TZWwuYW5jaG9yTm9kZSwgZG9tU2VsLmFuY2hvck9mZnNldCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuY2hvciA8IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0ICRhbmNob3IgPSBkb2MucmVzb2x2ZShhbmNob3IpO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBiaWFzID0gb3JpZ2luID09IFwicG9pbnRlclwiIHx8ICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5oZWFkIDwgJGhlYWQucG9zICYmICFpbldpZGdldCkgPyAxIDogLTE7XG4gICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdGlvbkJldHdlZW4odmlldywgJGFuY2hvciwgJGhlYWQsIGJpYXMpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uO1xufVxuZnVuY3Rpb24gZWRpdG9yT3duc1NlbGVjdGlvbih2aWV3KSB7XG4gICAgcmV0dXJuIHZpZXcuZWRpdGFibGUgPyB2aWV3Lmhhc0ZvY3VzKCkgOlxuICAgICAgICBoYXNTZWxlY3Rpb24odmlldykgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNvbnRhaW5zKHZpZXcuZG9tKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvblRvRE9NKHZpZXcsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgc3luY05vZGVTZWxlY3Rpb24odmlldywgc2VsKTtcbiAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBUaGUgZGVsYXllZCBkcmFnIHNlbGVjdGlvbiBjYXVzZXMgaXNzdWVzIHdpdGggQ2VsbCBTZWxlY3Rpb25zXG4gICAgLy8gaW4gU2FmYXJpLiBBbmQgdGhlIGRyYWcgc2VsZWN0aW9uIGRlbGF5IGlzIHRvIHdvcmthcm9uZCBpc3N1ZXNcbiAgICAvLyB3aGljaCBvbmx5IHByZXNlbnQgaW4gQ2hyb21lLlxuICAgIGlmICghZm9yY2UgJiYgdmlldy5pbnB1dC5tb3VzZURvd24gJiYgdmlldy5pbnB1dC5tb3VzZURvd24uYWxsb3dEZWZhdWx0ICYmIGNocm9tZSkge1xuICAgICAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpLCBjdXJTZWwgPSB2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb247XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAmJiBjdXJTZWwuYW5jaG9yTm9kZSAmJlxuICAgICAgICAgICAgaXNFcXVpdmFsZW50UG9zaXRpb24oZG9tU2VsLmFuY2hvck5vZGUsIGRvbVNlbC5hbmNob3JPZmZzZXQsIGN1clNlbC5hbmNob3JOb2RlLCBjdXJTZWwuYW5jaG9yT2Zmc2V0KSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZGVsYXllZFNlbGVjdGlvblN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zZXRDdXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICBpZiAodmlldy5jdXJzb3JXcmFwcGVyKSB7XG4gICAgICAgIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgeyBhbmNob3IsIGhlYWQgfSA9IHNlbCwgcmVzZXRFZGl0YWJsZUZyb20sIHJlc2V0RWRpdGFibGVUbztcbiAgICAgICAgaWYgKGJyb2tlblNlbGVjdEJldHdlZW5VbmVkaXRhYmxlICYmICEoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGlmICghc2VsLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGVGcm9tID0gdGVtcG9yYXJpbHlFZGl0YWJsZU5lYXIodmlldywgc2VsLmZyb20pO1xuICAgICAgICAgICAgaWYgKCFzZWwuZW1wdHkgJiYgIXNlbC4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlVG8gPSB0ZW1wb3JhcmlseUVkaXRhYmxlTmVhcih2aWV3LCBzZWwudG8pO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcuZG9jVmlldy5zZXRTZWxlY3Rpb24oYW5jaG9yLCBoZWFkLCB2aWV3LCBmb3JjZSk7XG4gICAgICAgIGlmIChicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSkge1xuICAgICAgICAgICAgaWYgKHJlc2V0RWRpdGFibGVGcm9tKVxuICAgICAgICAgICAgICAgIHJlc2V0RWRpdGFibGUocmVzZXRFZGl0YWJsZUZyb20pO1xuICAgICAgICAgICAgaWYgKHJlc2V0RWRpdGFibGVUbylcbiAgICAgICAgICAgICAgICByZXNldEVkaXRhYmxlKHJlc2V0RWRpdGFibGVUbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbC52aXNpYmxlKSB7XG4gICAgICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZpZXcuZG9tLmNsYXNzTGlzdC5hZGQoXCJQcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKFwib25zZWxlY3Rpb25jaGFuZ2VcIiBpbiBkb2N1bWVudClcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc09uU2VsZWN0aW9uQ2hhbmdlKHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgdmlldy5kb21PYnNlcnZlci5jb25uZWN0U2VsZWN0aW9uKCk7XG59XG4vLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgV2Via2l0IG5vdCBhbGxvd2luZyBhIHNlbGVjdGlvbiB0byBzdGFydC9lbmRcbi8vIGJldHdlZW4gbm9uLWVkaXRhYmxlIGJsb2NrIG5vZGVzLiBXZSBicmllZmx5IG1ha2Ugc29tZXRoaW5nXG4vLyBlZGl0YWJsZSwgc2V0IHRoZSBzZWxlY3Rpb24sIHRoZW4gc2V0IGl0IHVuZWRpdGFibGUgYWdhaW4uXG5jb25zdCBicm9rZW5TZWxlY3RCZXR3ZWVuVW5lZGl0YWJsZSA9IHNhZmFyaSB8fCBjaHJvbWUgJiYgY2hyb21lX3ZlcnNpb24gPCA2MztcbmZ1bmN0aW9uIHRlbXBvcmFyaWx5RWRpdGFibGVOZWFyKHZpZXcsIHBvcykge1xuICAgIGxldCB7IG5vZGUsIG9mZnNldCB9ID0gdmlldy5kb2NWaWV3LmRvbUZyb21Qb3MocG9zLCAwKTtcbiAgICBsZXQgYWZ0ZXIgPSBvZmZzZXQgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID8gbm9kZS5jaGlsZE5vZGVzW29mZnNldF0gOiBudWxsO1xuICAgIGxldCBiZWZvcmUgPSBvZmZzZXQgPyBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0IC0gMV0gOiBudWxsO1xuICAgIGlmIChzYWZhcmkgJiYgYWZ0ZXIgJiYgYWZ0ZXIuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGFmdGVyKTtcbiAgICBpZiAoKCFhZnRlciB8fCBhZnRlci5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSAmJlxuICAgICAgICAoIWJlZm9yZSB8fCBiZWZvcmUuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIikpIHtcbiAgICAgICAgaWYgKGFmdGVyKVxuICAgICAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGFmdGVyKTtcbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlKVxuICAgICAgICAgICAgcmV0dXJuIHNldEVkaXRhYmxlKGJlZm9yZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0RWRpdGFibGUoZWxlbWVudCkge1xuICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaWYgKHNhZmFyaSAmJiBlbGVtZW50LmRyYWdnYWJsZSkge1xuICAgICAgICBlbGVtZW50LmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBlbGVtZW50Lndhc0RyYWdnYWJsZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xufVxuZnVuY3Rpb24gcmVzZXRFZGl0YWJsZShlbGVtZW50KSB7XG4gICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgaWYgKGVsZW1lbnQud2FzRHJhZ2dhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgZWxlbWVudC53YXNEcmFnZ2FibGUgPSBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzT25TZWxlY3Rpb25DaGFuZ2Uodmlldykge1xuICAgIGxldCBkb2MgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50O1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHZpZXcuaW5wdXQuaGlkZVNlbGVjdGlvbkd1YXJkKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gZG9tU2VsLmFuY2hvck5vZGUsIG9mZnNldCA9IGRvbVNlbC5hbmNob3JPZmZzZXQ7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdmlldy5pbnB1dC5oaWRlU2VsZWN0aW9uR3VhcmQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb21TZWwuYW5jaG9yTm9kZSAhPSBub2RlIHx8IGRvbVNlbC5hbmNob3JPZmZzZXQgIT0gb2Zmc2V0KSB7XG4gICAgICAgICAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNlbGVjdGlvbmNoYW5nZVwiLCB2aWV3LmlucHV0LmhpZGVTZWxlY3Rpb25HdWFyZCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVkaXRvck93bnNTZWxlY3Rpb24odmlldykgfHwgdmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kb20uY2xhc3NMaXN0LnJlbW92ZShcIlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb25cIik7XG4gICAgICAgICAgICB9LCAyMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNlbGVjdEN1cnNvcldyYXBwZXIodmlldykge1xuICAgIGxldCBkb21TZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpLCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgaWYgKCFkb21TZWwpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbm9kZSA9IHZpZXcuY3Vyc29yV3JhcHBlci5kb20sIGltZyA9IG5vZGUubm9kZU5hbWUgPT0gXCJJTUdcIjtcbiAgICBpZiAoaW1nKVxuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLnBhcmVudE5vZGUsIGRvbUluZGV4KG5vZGUpICsgMSk7XG4gICAgZWxzZVxuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCAwKTtcbiAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcbiAgICBkb21TZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgZG9tU2VsLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAvLyBLbHVkZ2UgdG8ga2lsbCAnY29udHJvbCBzZWxlY3Rpb24nIGluIElFMTEgd2hlbiBzZWxlY3RpbmcgYW5cbiAgICAvLyBpbnZpc2libGUgY3Vyc29yIHdyYXBwZXIsIHNpbmNlIHRoYXQgd291bGQgcmVzdWx0IGluIHRob3NlIHdlaXJkXG4gICAgLy8gcmVzaXplIGhhbmRsZXMgYW5kIGEgc2VsZWN0aW9uIHRoYXQgY29uc2lkZXJzIHRoZSBhYnNvbHV0ZWx5XG4gICAgLy8gcG9zaXRpb25lZCB3cmFwcGVyLCByYXRoZXIgdGhhbiB0aGUgcm9vdCBlZGl0YWJsZSBub2RlLCB0aGVcbiAgICAvLyBmb2N1c2VkIGVsZW1lbnQuXG4gICAgaWYgKCFpbWcgJiYgIXZpZXcuc3RhdGUuc2VsZWN0aW9uLnZpc2libGUgJiYgaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSkge1xuICAgICAgICBub2RlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbm9kZS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHN5bmNOb2RlU2VsZWN0aW9uKHZpZXcsIHNlbCkge1xuICAgIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSB7XG4gICAgICAgIGxldCBkZXNjID0gdmlldy5kb2NWaWV3LmRlc2NBdChzZWwuZnJvbSk7XG4gICAgICAgIGlmIChkZXNjICE9IHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICAgICAgICAgIGlmIChkZXNjKVxuICAgICAgICAgICAgICAgIGRlc2Muc2VsZWN0Tm9kZSgpO1xuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IGRlc2M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KTtcbiAgICB9XG59XG4vLyBDbGVhciBhbGwgRE9NIHN0YXRlZnVsbmVzcyBvZiB0aGUgbGFzdCBub2RlIHNlbGVjdGlvbi5cbmZ1bmN0aW9uIGNsZWFyTm9kZVNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MpIHtcbiAgICAgICAgaWYgKHZpZXcubGFzdFNlbGVjdGVkVmlld0Rlc2MucGFyZW50KVxuICAgICAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYy5kZXNlbGVjdE5vZGUoKTtcbiAgICAgICAgdmlldy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZWxlY3Rpb25CZXR3ZWVuKHZpZXcsICRhbmNob3IsICRoZWFkLCBiaWFzKSB7XG4gICAgcmV0dXJuIHZpZXcuc29tZVByb3AoXCJjcmVhdGVTZWxlY3Rpb25CZXR3ZWVuXCIsIGYgPT4gZih2aWV3LCAkYW5jaG9yLCAkaGVhZCkpXG4gICAgICAgIHx8IFRleHRTZWxlY3Rpb24uYmV0d2VlbigkYW5jaG9yLCAkaGVhZCwgYmlhcyk7XG59XG5mdW5jdGlvbiBoYXNGb2N1c0FuZFNlbGVjdGlvbih2aWV3KSB7XG4gICAgaWYgKHZpZXcuZWRpdGFibGUgJiYgIXZpZXcuaGFzRm9jdXMoKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBoYXNTZWxlY3Rpb24odmlldyk7XG59XG5mdW5jdGlvbiBoYXNTZWxlY3Rpb24odmlldykge1xuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgaWYgKCFzZWwuYW5jaG9yTm9kZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZpcmVmb3ggd2lsbCByYWlzZSAncGVybWlzc2lvbiBkZW5pZWQnIGVycm9ycyB3aGVuIGFjY2Vzc2luZ1xuICAgICAgICAvLyBwcm9wZXJ0aWVzIG9mIGBzZWwuYW5jaG9yTm9kZWAgd2hlbiBpdCdzIGluIGEgZ2VuZXJhdGVkIENTU1xuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICByZXR1cm4gdmlldy5kb20uY29udGFpbnMoc2VsLmFuY2hvck5vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5hbmNob3JOb2RlLnBhcmVudE5vZGUgOiBzZWwuYW5jaG9yTm9kZSkgJiZcbiAgICAgICAgICAgICh2aWV3LmVkaXRhYmxlIHx8IHZpZXcuZG9tLmNvbnRhaW5zKHNlbC5mb2N1c05vZGUubm9kZVR5cGUgPT0gMyA/IHNlbC5mb2N1c05vZGUucGFyZW50Tm9kZSA6IHNlbC5mb2N1c05vZGUpKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFuY2hvckluUmlnaHRQbGFjZSh2aWV3KSB7XG4gICAgbGV0IGFuY2hvckRPTSA9IHZpZXcuZG9jVmlldy5kb21Gcm9tUG9zKHZpZXcuc3RhdGUuc2VsZWN0aW9uLmFuY2hvciwgMCk7XG4gICAgbGV0IGRvbVNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICByZXR1cm4gaXNFcXVpdmFsZW50UG9zaXRpb24oYW5jaG9yRE9NLm5vZGUsIGFuY2hvckRPTS5vZmZzZXQsIGRvbVNlbC5hbmNob3JOb2RlLCBkb21TZWwuYW5jaG9yT2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gbW92ZVNlbGVjdGlvbkJsb2NrKHN0YXRlLCBkaXIpIHtcbiAgICBsZXQgeyAkYW5jaG9yLCAkaGVhZCB9ID0gc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCAkc2lkZSA9IGRpciA+IDAgPyAkYW5jaG9yLm1heCgkaGVhZCkgOiAkYW5jaG9yLm1pbigkaGVhZCk7XG4gICAgbGV0ICRzdGFydCA9ICEkc2lkZS5wYXJlbnQuaW5saW5lQ29udGVudCA/ICRzaWRlIDogJHNpZGUuZGVwdGggPyBzdGF0ZS5kb2MucmVzb2x2ZShkaXIgPiAwID8gJHNpZGUuYWZ0ZXIoKSA6ICRzaWRlLmJlZm9yZSgpKSA6IG51bGw7XG4gICAgcmV0dXJuICRzdGFydCAmJiBTZWxlY3Rpb24uZmluZEZyb20oJHN0YXJ0LCBkaXIpO1xufVxuZnVuY3Rpb24gYXBwbHkodmlldywgc2VsKSB7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykge1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikge1xuICAgICAgICBpZiAobW9kcy5pbmRleE9mKFwic1wiKSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgeyAkaGVhZCB9ID0gc2VsLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcjtcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dCB8fCAhbm9kZS5pc0xlYWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0ICRuZXdIZWFkID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSgkaGVhZC5wb3MgKyBub2RlLm5vZGVTaXplICogKGRpciA8IDAgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihzZWwuJGFuY2hvciwgJG5ld0hlYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlldy5lbmRPZlRleHRibG9jayhkaXIgPiAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIpKSB7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICAgICAgaWYgKG5leHQgJiYgKG5leHQgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShtYWMgJiYgbW9kcy5pbmRleE9mKFwibVwiKSA+IC0xKSkge1xuICAgICAgICAgICAgbGV0ICRoZWFkID0gc2VsLiRoZWFkLCBub2RlID0gJGhlYWQudGV4dE9mZnNldCA/IG51bGwgOiBkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlciwgZGVzYztcbiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzVGV4dClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbm9kZVBvcyA9IGRpciA8IDAgPyAkaGVhZC5wb3MgLSBub2RlLm5vZGVTaXplIDogJGhlYWQucG9zO1xuICAgICAgICAgICAgaWYgKCEobm9kZS5pc0F0b20gfHwgKGRlc2MgPSB2aWV3LmRvY1ZpZXcuZGVzY0F0KG5vZGVQb3MpKSAmJiAhZGVzYy5jb250ZW50RE9NKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV3IE5vZGVTZWxlY3Rpb24oZGlyIDwgMCA/IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoJGhlYWQucG9zIC0gbm9kZS5ub2RlU2l6ZSkgOiAkaGVhZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod2Via2l0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hyb21lIGFuZCBTYWZhcmkgd2lsbCBpbnRyb2R1Y2UgZXh0cmEgcG9pbnRsZXNzIGN1cnNvclxuICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9ucyBhcm91bmQgaW5saW5lIHVuZWRpdGFibGUgbm9kZXMsIHNvIHdlIGhhdmUgdG9cbiAgICAgICAgICAgICAgICAvLyB0YWtlIG92ZXIgYW5kIG1vdmUgdGhlIGN1cnNvciBwYXN0IHRoZW0gKCM5MzcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5ldyBUZXh0U2VsZWN0aW9uKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoZGlyIDwgMCA/IG5vZGVQb3MgOiBub2RlUG9zICsgbm9kZS5ub2RlU2l6ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBOb2RlU2VsZWN0aW9uICYmIHNlbC5ub2RlLmlzSW5saW5lKSB7XG4gICAgICAgIHJldHVybiBhcHBseSh2aWV3LCBuZXcgVGV4dFNlbGVjdGlvbihkaXIgPiAwID8gc2VsLiR0byA6IHNlbC4kZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IG5leHQgPSBtb3ZlU2VsZWN0aW9uQmxvY2sodmlldy5zdGF0ZSwgZGlyKTtcbiAgICAgICAgaWYgKG5leHQpXG4gICAgICAgICAgICByZXR1cm4gYXBwbHkodmlldywgbmV4dCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBub2RlTGVuKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZS5ub2RlVmFsdWUubGVuZ3RoIDogbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIGlzSWdub3JhYmxlKGRvbSwgZGlyKSB7XG4gICAgbGV0IGRlc2MgPSBkb20ucG1WaWV3RGVzYztcbiAgICByZXR1cm4gZGVzYyAmJiBkZXNjLnNpemUgPT0gMCAmJiAoZGlyIDwgMCB8fCBkb20ubmV4dFNpYmxpbmcgfHwgZG9tLm5vZGVOYW1lICE9IFwiQlJcIik7XG59XG5mdW5jdGlvbiBza2lwSWdub3JlZE5vZGVzKHZpZXcsIGRpcikge1xuICAgIHJldHVybiBkaXIgPCAwID8gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSA6IHNraXBJZ25vcmVkTm9kZXNBZnRlcih2aWV3KTtcbn1cbi8vIE1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzbid0IGRpcmVjdGx5IGFmdGVyIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLCB3aGljaCB3aWxsIGNvbmZ1c2UgdGhlIGJyb3dzZXIncyBjdXJzb3IgbW90aW9uIGxvZ2ljLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0JlZm9yZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBsZXQgbm9kZSA9IHNlbC5mb2N1c05vZGUsIG9mZnNldCA9IHNlbC5mb2N1c09mZnNldDtcbiAgICBpZiAoIW5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgbW92ZU5vZGUsIG1vdmVPZmZzZXQsIGZvcmNlID0gZmFsc2U7XG4gICAgLy8gR2Vja28gd2lsbCBkbyBvZGQgdGhpbmdzIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBkaXJlY3RseSBpbiBmcm9udFxuICAgIC8vIG9mIGEgbm9uLWVkaXRhYmxlIG5vZGUsIHNvIGluIHRoYXQgY2FzZSwgbW92ZSBpdCBpbnRvIHRoZSBuZXh0XG4gICAgLy8gbm9kZSBpZiBwb3NzaWJsZS4gSXNzdWUgcHJvc2VtaXJyb3IvcHJvc2VtaXJyb3IjODMyLlxuICAgIGlmIChnZWNrbyAmJiBub2RlLm5vZGVUeXBlID09IDEgJiYgb2Zmc2V0IDwgbm9kZUxlbihub2RlKSAmJiBpc0lnbm9yYWJsZShub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XSwgLTEpKVxuICAgICAgICBmb3JjZSA9IHRydWU7XG4gICAgZm9yICg7Oykge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGJlZm9yZSA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmFibGUoYmVmb3JlLCAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0ID0gLS1vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJlZm9yZS5ub2RlVHlwZSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0Jsb2NrTm9kZShub2RlKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgcHJldiA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHByZXYgJiYgaXNJZ25vcmFibGUocHJldiwgLTEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KHByZXYpO1xuICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcHJldikge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gcHJldjtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlTGVuKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmb3JjZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbm9kZSwgb2Zmc2V0KTtcbiAgICBlbHNlIGlmIChtb3ZlTm9kZSlcbiAgICAgICAgc2V0U2VsRm9jdXModmlldywgbW92ZU5vZGUsIG1vdmVPZmZzZXQpO1xufVxuLy8gTWFrZSBzdXJlIHRoZSBjdXJzb3IgaXNuJ3QgZGlyZWN0bHkgYmVmb3JlIG9uZSBvciBtb3JlIGlnbm9yZWRcbi8vIG5vZGVzLlxuZnVuY3Rpb24gc2tpcElnbm9yZWROb2Rlc0FmdGVyKHZpZXcpIHtcbiAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBub2RlID0gc2VsLmZvY3VzTm9kZSwgb2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIGlmICghbm9kZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBsZW4gPSBub2RlTGVuKG5vZGUpO1xuICAgIGxldCBtb3ZlTm9kZSwgbW92ZU9mZnNldDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChvZmZzZXQgPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChpc0lnbm9yYWJsZShhZnRlciwgMSkpIHtcbiAgICAgICAgICAgICAgICBtb3ZlTm9kZSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9ICsrb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQmxvY2tOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gbm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdoaWxlIChuZXh0ICYmIGlzSWdub3JhYmxlKG5leHQsIDEpKSB7XG4gICAgICAgICAgICAgICAgbW92ZU5vZGUgPSBuZXh0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgbW92ZU9mZnNldCA9IGRvbUluZGV4KG5leHQpICsgMTtcbiAgICAgICAgICAgICAgICBuZXh0ID0gbmV4dC5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gdmlldy5kb20pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IGxlbiA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGVMZW4obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vdmVOb2RlKVxuICAgICAgICBzZXRTZWxGb2N1cyh2aWV3LCBtb3ZlTm9kZSwgbW92ZU9mZnNldCk7XG59XG5mdW5jdGlvbiBpc0Jsb2NrTm9kZShkb20pIHtcbiAgICBsZXQgZGVzYyA9IGRvbS5wbVZpZXdEZXNjO1xuICAgIHJldHVybiBkZXNjICYmIGRlc2Mubm9kZSAmJiBkZXNjLm5vZGUuaXNCbG9jaztcbn1cbmZ1bmN0aW9uIHRleHROb2RlQWZ0ZXIobm9kZSwgb2Zmc2V0KSB7XG4gICAgd2hpbGUgKG5vZGUgJiYgb2Zmc2V0ID09IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggJiYgIWhhc0Jsb2NrRGVzYyhub2RlKSkge1xuICAgICAgICBvZmZzZXQgPSBkb21JbmRleChub2RlKSArIDE7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBub2RlLmNoaWxkTm9kZXNbb2Zmc2V0XTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG59XG5mdW5jdGlvbiB0ZXh0Tm9kZUJlZm9yZShub2RlLCBvZmZzZXQpIHtcbiAgICB3aGlsZSAobm9kZSAmJiAhb2Zmc2V0ICYmICFoYXNCbG9ja0Rlc2Mobm9kZSkpIHtcbiAgICAgICAgb2Zmc2V0ID0gZG9tSW5kZXgobm9kZSk7XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHdoaWxlIChub2RlICYmIG9mZnNldCkge1xuICAgICAgICBsZXQgbmV4dCA9IG5vZGUuY2hpbGROb2Rlc1tvZmZzZXQgLSAxXTtcbiAgICAgICAgaWYgKG5leHQubm9kZVR5cGUgPT0gMylcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICBpZiAobmV4dC5ub2RlVHlwZSA9PSAxICYmIG5leHQuY29udGVudEVkaXRhYmxlID09IFwiZmFsc2VcIilcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRTZWxGb2N1cyh2aWV3LCBub2RlLCBvZmZzZXQpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSAhPSAzKSB7XG4gICAgICAgIGxldCBiZWZvcmUsIGFmdGVyO1xuICAgICAgICBpZiAoYWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyKG5vZGUsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIG5vZGUgPSBhZnRlcjtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmVmb3JlID0gdGV4dE5vZGVCZWZvcmUobm9kZSwgb2Zmc2V0KSkge1xuICAgICAgICAgICAgbm9kZSA9IGJlZm9yZTtcbiAgICAgICAgICAgIG9mZnNldCA9IGJlZm9yZS5ub2RlVmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHNlbGVjdGlvbkNvbGxhcHNlZChzZWwpKSB7XG4gICAgICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIHJhbmdlLnNldEVuZChub2RlLCBvZmZzZXQpO1xuICAgICAgICByYW5nZS5zZXRTdGFydChub2RlLCBvZmZzZXQpO1xuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbC5leHRlbmQpIHtcbiAgICAgICAgc2VsLmV4dGVuZChub2RlLCBvZmZzZXQpO1xuICAgIH1cbiAgICB2aWV3LmRvbU9ic2VydmVyLnNldEN1clNlbGVjdGlvbigpO1xuICAgIGxldCB7IHN0YXRlIH0gPSB2aWV3O1xuICAgIC8vIElmIG5vIHN0YXRlIHVwZGF0ZSBlbmRzIHVwIGhhcHBlbmluZywgcmVzZXQgdGhlIHNlbGVjdGlvbi5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZXcuc3RhdGUgPT0gc3RhdGUpXG4gICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICB9LCA1MCk7XG59XG5mdW5jdGlvbiBmaW5kRGlyZWN0aW9uKHZpZXcsIHBvcykge1xuICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MpO1xuICAgIGlmICghKGNocm9tZSB8fCB3aW5kb3dzKSAmJiAkcG9zLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGxldCBjb29yZHMgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyk7XG4gICAgICAgIGlmIChwb3MgPiAkcG9zLnN0YXJ0KCkpIHtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSB2aWV3LmNvb3Jkc0F0UG9zKHBvcyAtIDEpO1xuICAgICAgICAgICAgbGV0IG1pZCA9IChiZWZvcmUudG9wICsgYmVmb3JlLmJvdHRvbSkgLyAyO1xuICAgICAgICAgICAgaWYgKG1pZCA+IGNvb3Jkcy50b3AgJiYgbWlkIDwgY29vcmRzLmJvdHRvbSAmJiBNYXRoLmFicyhiZWZvcmUubGVmdCAtIGNvb3Jkcy5sZWZ0KSA+IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJlZm9yZS5sZWZ0IDwgY29vcmRzLmxlZnQgPyBcImx0clwiIDogXCJydGxcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zIDwgJHBvcy5lbmQoKSkge1xuICAgICAgICAgICAgbGV0IGFmdGVyID0gdmlldy5jb29yZHNBdFBvcyhwb3MgKyAxKTtcbiAgICAgICAgICAgIGxldCBtaWQgPSAoYWZ0ZXIudG9wICsgYWZ0ZXIuYm90dG9tKSAvIDI7XG4gICAgICAgICAgICBpZiAobWlkID4gY29vcmRzLnRvcCAmJiBtaWQgPCBjb29yZHMuYm90dG9tICYmIE1hdGguYWJzKGFmdGVyLmxlZnQgLSBjb29yZHMubGVmdCkgPiAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBhZnRlci5sZWZ0ID4gY29vcmRzLmxlZnQgPyBcImx0clwiIDogXCJydGxcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQgPSBnZXRDb21wdXRlZFN0eWxlKHZpZXcuZG9tKS5kaXJlY3Rpb247XG4gICAgcmV0dXJuIGNvbXB1dGVkID09IFwicnRsXCIgPyBcInJ0bFwiIDogXCJsdHJcIjtcbn1cbi8vIENoZWNrIHdoZXRoZXIgdmVydGljYWwgc2VsZWN0aW9uIG1vdGlvbiB3b3VsZCBpbnZvbHZlIG5vZGVcbi8vIHNlbGVjdGlvbnMuIElmIHNvLCBhcHBseSBpdCAoaWYgbm90LCB0aGUgcmVzdWx0IGlzIGxlZnQgdG8gdGhlXG4vLyBicm93c2VyKVxuZnVuY3Rpb24gc2VsZWN0VmVydGljYWxseSh2aWV3LCBkaXIsIG1vZHMpIHtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgIXNlbC5lbXB0eSB8fCBtb2RzLmluZGV4T2YoXCJzXCIpID4gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWFjICYmIG1vZHMuaW5kZXhPZihcIm1cIikgPiAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB7ICRmcm9tLCAkdG8gfSA9IHNlbDtcbiAgICBpZiAoISRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50IHx8IHZpZXcuZW5kT2ZUZXh0YmxvY2soZGlyIDwgMCA/IFwidXBcIiA6IFwiZG93blwiKSkge1xuICAgICAgICBsZXQgbmV4dCA9IG1vdmVTZWxlY3Rpb25CbG9jayh2aWV3LnN0YXRlLCBkaXIpO1xuICAgICAgICBpZiAobmV4dCAmJiAobmV4dCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pKVxuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KHZpZXcsIG5leHQpO1xuICAgIH1cbiAgICBpZiAoISRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgIGxldCBzaWRlID0gZGlyIDwgMCA/ICRmcm9tIDogJHRvO1xuICAgICAgICBsZXQgYmV5b25kID0gc2VsIGluc3RhbmNlb2YgQWxsU2VsZWN0aW9uID8gU2VsZWN0aW9uLm5lYXIoc2lkZSwgZGlyKSA6IFNlbGVjdGlvbi5maW5kRnJvbShzaWRlLCBkaXIpO1xuICAgICAgICByZXR1cm4gYmV5b25kID8gYXBwbHkodmlldywgYmV5b25kKSA6IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzdG9wTmF0aXZlSG9yaXpvbnRhbERlbGV0ZSh2aWV3LCBkaXIpIHtcbiAgICBpZiAoISh2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBsZXQgeyAkaGVhZCwgJGFuY2hvciwgZW1wdHkgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghJGhlYWQuc2FtZVBhcmVudCgkYW5jaG9yKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFlbXB0eSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2aWV3LmVuZE9mVGV4dGJsb2NrKGRpciA+IDAgPyBcImZvcndhcmRcIiA6IFwiYmFja3dhcmRcIikpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGxldCBuZXh0Tm9kZSA9ICEkaGVhZC50ZXh0T2Zmc2V0ICYmIChkaXIgPCAwID8gJGhlYWQubm9kZUJlZm9yZSA6ICRoZWFkLm5vZGVBZnRlcik7XG4gICAgaWYgKG5leHROb2RlICYmICFuZXh0Tm9kZS5pc1RleHQpIHtcbiAgICAgICAgbGV0IHRyID0gdmlldy5zdGF0ZS50cjtcbiAgICAgICAgaWYgKGRpciA8IDApXG4gICAgICAgICAgICB0ci5kZWxldGUoJGhlYWQucG9zIC0gbmV4dE5vZGUubm9kZVNpemUsICRoZWFkLnBvcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZSgkaGVhZC5wb3MsICRoZWFkLnBvcyArIG5leHROb2RlLm5vZGVTaXplKTtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBub2RlLCBzdGF0ZSkge1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgIG5vZGUuY29udGVudEVkaXRhYmxlID0gc3RhdGU7XG4gICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xufVxuLy8gSXNzdWUgIzg2NyAvICMxMDkwIC8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTAzODIxXG4vLyBJbiB3aGljaCBTYWZhcmkgKGFuZCBhdCBzb21lIHBvaW50IGluIHRoZSBwYXN0LCBDaHJvbWUpIGRvZXMgcmVhbGx5XG4vLyB3cm9uZyB0aGluZ3Mgd2hlbiB0aGUgZG93biBhcnJvdyBpcyBwcmVzc2VkIHdoZW4gdGhlIGN1cnNvciBpc1xuLy8gZGlyZWN0bHkgYXQgdGhlIHN0YXJ0IG9mIGEgdGV4dGJsb2NrIGFuZCBoYXMgYW4gdW5lZGl0YWJsZSBub2RlXG4vLyBhZnRlciBpdFxuZnVuY3Rpb24gc2FmYXJpRG93bkFycm93QnVnKHZpZXcpIHtcbiAgICBpZiAoIXNhZmFyaSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kaGVhZC5wYXJlbnRPZmZzZXQgPiAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHsgZm9jdXNOb2RlLCBmb2N1c09mZnNldCB9ID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGlmIChmb2N1c05vZGUgJiYgZm9jdXNOb2RlLm5vZGVUeXBlID09IDEgJiYgZm9jdXNPZmZzZXQgPT0gMCAmJlxuICAgICAgICBmb2N1c05vZGUuZmlyc3RDaGlsZCAmJiBmb2N1c05vZGUuZmlyc3RDaGlsZC5jb250ZW50RWRpdGFibGUgPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IGZvY3VzTm9kZS5maXJzdENoaWxkO1xuICAgICAgICBzd2l0Y2hFZGl0YWJsZSh2aWV3LCBjaGlsZCwgXCJ0cnVlXCIpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHN3aXRjaEVkaXRhYmxlKHZpZXcsIGNoaWxkLCBcImZhbHNlXCIpLCAyMCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIEEgYmFja2Ryb3Aga2V5IG1hcHBpbmcgdXNlZCB0byBtYWtlIHN1cmUgd2UgYWx3YXlzIHN1cHByZXNzIGtleXNcbi8vIHRoYXQgaGF2ZSBhIGRhbmdlcm91cyBkZWZhdWx0IGVmZmVjdCwgZXZlbiBpZiB0aGUgY29tbWFuZHMgdGhleSBhcmVcbi8vIGJvdW5kIHRvIHJldHVybiBmYWxzZSwgYW5kIHRvIG1ha2Ugc3VyZSB0aGF0IGN1cnNvci1tb3Rpb24ga2V5c1xuLy8gZmluZCBhIGN1cnNvciAoYXMgb3Bwb3NlZCB0byBhIG5vZGUgc2VsZWN0aW9uKSB3aGVuIHByZXNzZWQuIEZvclxuLy8gY3Vyc29yLW1vdGlvbiBrZXlzLCB0aGUgY29kZSBpbiB0aGUgaGFuZGxlcnMgYWxzbyB0YWtlcyBjYXJlIG9mXG4vLyBibG9jayBzZWxlY3Rpb25zLlxuZnVuY3Rpb24gZ2V0TW9kcyhldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgIGlmIChldmVudC5jdHJsS2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJjXCI7XG4gICAgaWYgKGV2ZW50Lm1ldGFLZXkpXG4gICAgICAgIHJlc3VsdCArPSBcIm1cIjtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJhXCI7XG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KVxuICAgICAgICByZXN1bHQgKz0gXCJzXCI7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNhcHR1cmVLZXlEb3duKHZpZXcsIGV2ZW50KSB7XG4gICAgbGV0IGNvZGUgPSBldmVudC5rZXlDb2RlLCBtb2RzID0gZ2V0TW9kcyhldmVudCk7XG4gICAgaWYgKGNvZGUgPT0gOCB8fCAobWFjICYmIGNvZGUgPT0gNzIgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gQmFja3NwYWNlLCBDdHJsLWggb24gTWFjXG4gICAgICAgIHJldHVybiBzdG9wTmF0aXZlSG9yaXpvbnRhbERlbGV0ZSh2aWV3LCAtMSkgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAtMSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKChjb2RlID09IDQ2ICYmICFldmVudC5zaGlmdEtleSkgfHwgKG1hYyAmJiBjb2RlID09IDY4ICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIERlbGV0ZSwgQ3RybC1kIG9uIE1hY1xuICAgICAgICByZXR1cm4gc3RvcE5hdGl2ZUhvcml6b250YWxEZWxldGUodmlldywgMSkgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCAxKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAxMyB8fCBjb2RlID09IDI3KSB7IC8vIEVudGVyLCBFc2NcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvZGUgPT0gMzcgfHwgKG1hYyAmJiBjb2RlID09IDY2ICYmIG1vZHMgPT0gXCJjXCIpKSB7IC8vIExlZnQgYXJyb3csIEN0cmwtYiBvbiBNYWNcbiAgICAgICAgbGV0IGRpciA9IGNvZGUgPT0gMzcgPyAoZmluZERpcmVjdGlvbih2aWV3LCB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSA9PSBcImx0clwiID8gLTEgOiAxKSA6IC0xO1xuICAgICAgICByZXR1cm4gc2VsZWN0SG9yaXpvbnRhbGx5KHZpZXcsIGRpciwgbW9kcykgfHwgc2tpcElnbm9yZWROb2Rlcyh2aWV3LCBkaXIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDM5IHx8IChtYWMgJiYgY29kZSA9PSA3MCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBSaWdodCBhcnJvdywgQ3RybC1mIG9uIE1hY1xuICAgICAgICBsZXQgZGlyID0gY29kZSA9PSAzOSA/IChmaW5kRGlyZWN0aW9uKHZpZXcsIHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20pID09IFwibHRyXCIgPyAxIDogLTEpIDogMTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdEhvcml6b250YWxseSh2aWV3LCBkaXIsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgZGlyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29kZSA9PSAzOCB8fCAobWFjICYmIGNvZGUgPT0gODAgJiYgbW9kcyA9PSBcImNcIikpIHsgLy8gVXAgYXJyb3csIEN0cmwtcCBvbiBNYWNcbiAgICAgICAgcmV0dXJuIHNlbGVjdFZlcnRpY2FsbHkodmlldywgLTEsIG1vZHMpIHx8IHNraXBJZ25vcmVkTm9kZXModmlldywgLTEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID09IDQwIHx8IChtYWMgJiYgY29kZSA9PSA3OCAmJiBtb2RzID09IFwiY1wiKSkgeyAvLyBEb3duIGFycm93LCBDdHJsLW4gb24gTWFjXG4gICAgICAgIHJldHVybiBzYWZhcmlEb3duQXJyb3dCdWcodmlldykgfHwgc2VsZWN0VmVydGljYWxseSh2aWV3LCAxLCBtb2RzKSB8fCBza2lwSWdub3JlZE5vZGVzKHZpZXcsIDEpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtb2RzID09IChtYWMgPyBcIm1cIiA6IFwiY1wiKSAmJlxuICAgICAgICAoY29kZSA9PSA2NiB8fCBjb2RlID09IDczIHx8IGNvZGUgPT0gODkgfHwgY29kZSA9PSA5MCkpIHsgLy8gTW9kLVtiaXl6XVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVGb3JDbGlwYm9hcmQodmlldywgc2xpY2UpIHtcbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtQ29waWVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICBsZXQgY29udGV4dCA9IFtdLCB7IGNvbnRlbnQsIG9wZW5TdGFydCwgb3BlbkVuZCB9ID0gc2xpY2U7XG4gICAgd2hpbGUgKG9wZW5TdGFydCA+IDEgJiYgb3BlbkVuZCA+IDEgJiYgY29udGVudC5jaGlsZENvdW50ID09IDEgJiYgY29udGVudC5maXJzdENoaWxkLmNoaWxkQ291bnQgPT0gMSkge1xuICAgICAgICBvcGVuU3RhcnQtLTtcbiAgICAgICAgb3BlbkVuZC0tO1xuICAgICAgICBsZXQgbm9kZSA9IGNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgY29udGV4dC5wdXNoKG5vZGUudHlwZS5uYW1lLCBub2RlLmF0dHJzICE9IG5vZGUudHlwZS5kZWZhdWx0QXR0cnMgPyBub2RlLmF0dHJzIDogbnVsbCk7XG4gICAgICAgIGNvbnRlbnQgPSBub2RlLmNvbnRlbnQ7XG4gICAgfVxuICAgIGxldCBzZXJpYWxpemVyID0gdmlldy5zb21lUHJvcChcImNsaXBib2FyZFNlcmlhbGl6ZXJcIikgfHwgRE9NU2VyaWFsaXplci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKTtcbiAgICBsZXQgZG9jID0gZGV0YWNoZWREb2MoKSwgd3JhcCA9IGRvYy5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHdyYXAuYXBwZW5kQ2hpbGQoc2VyaWFsaXplci5zZXJpYWxpemVGcmFnbWVudChjb250ZW50LCB7IGRvY3VtZW50OiBkb2MgfSkpO1xuICAgIGxldCBmaXJzdENoaWxkID0gd3JhcC5maXJzdENoaWxkLCBuZWVkc1dyYXAsIHdyYXBwZXJzID0gMDtcbiAgICB3aGlsZSAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09IDEgJiYgKG5lZWRzV3JhcCA9IHdyYXBNYXBbZmlyc3RDaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5lZWRzV3JhcC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IHdyYXBwZXIgPSBkb2MuY3JlYXRlRWxlbWVudChuZWVkc1dyYXBbaV0pO1xuICAgICAgICAgICAgd2hpbGUgKHdyYXAuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHdyYXAuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB3cmFwLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xuICAgICAgICAgICAgd3JhcHBlcnMrKztcbiAgICAgICAgfVxuICAgICAgICBmaXJzdENoaWxkID0gd3JhcC5maXJzdENoaWxkO1xuICAgIH1cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09IDEpXG4gICAgICAgIGZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiLCBgJHtvcGVuU3RhcnR9ICR7b3BlbkVuZH0ke3dyYXBwZXJzID8gYCAtJHt3cmFwcGVyc31gIDogXCJcIn0gJHtKU09OLnN0cmluZ2lmeShjb250ZXh0KX1gKTtcbiAgICBsZXQgdGV4dCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0U2VyaWFsaXplclwiLCBmID0+IGYoc2xpY2UsIHZpZXcpKSB8fFxuICAgICAgICBzbGljZS5jb250ZW50LnRleHRCZXR3ZWVuKDAsIHNsaWNlLmNvbnRlbnQuc2l6ZSwgXCJcXG5cXG5cIik7XG4gICAgcmV0dXJuIHsgZG9tOiB3cmFwLCB0ZXh0LCBzbGljZSB9O1xufVxuLy8gUmVhZCBhIHNsaWNlIG9mIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIChvciBkcm9wIGRhdGEpLlxuZnVuY3Rpb24gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIHRleHQsIGh0bWwsIHBsYWluVGV4dCwgJGNvbnRleHQpIHtcbiAgICBsZXQgaW5Db2RlID0gJGNvbnRleHQucGFyZW50LnR5cGUuc3BlYy5jb2RlO1xuICAgIGxldCBkb20sIHNsaWNlO1xuICAgIGlmICghaHRtbCAmJiAhdGV4dClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgbGV0IGFzVGV4dCA9IHRleHQgJiYgKHBsYWluVGV4dCB8fCBpbkNvZGUgfHwgIWh0bWwpO1xuICAgIGlmIChhc1RleHQpIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZFRleHRcIiwgZiA9PiB7IHRleHQgPSBmKHRleHQsIGluQ29kZSB8fCBwbGFpblRleHQsIHZpZXcpOyB9KTtcbiAgICAgICAgaWYgKGluQ29kZSlcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ID8gbmV3IFNsaWNlKEZyYWdtZW50LmZyb20odmlldy5zdGF0ZS5zY2hlbWEudGV4dCh0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikpKSwgMCwgMCkgOiBTbGljZS5lbXB0eTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRUZXh0UGFyc2VyXCIsIGYgPT4gZih0ZXh0LCAkY29udGV4dCwgcGxhaW5UZXh0LCB2aWV3KSk7XG4gICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIHNsaWNlID0gcGFyc2VkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hcmtzID0gJGNvbnRleHQubWFya3MoKTtcbiAgICAgICAgICAgIGxldCB7IHNjaGVtYSB9ID0gdmlldy5zdGF0ZSwgc2VyaWFsaXplciA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICAgICAgZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHRleHQuc3BsaXQoLyg/Olxcclxcbj98XFxuKSsvKS5mb3JFYWNoKGJsb2NrID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcCA9IGRvbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrKVxuICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZENoaWxkKHNlcmlhbGl6ZXIuc2VyaWFsaXplTm9kZShzY2hlbWEudGV4dChibG9jaywgbWFya3MpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5zb21lUHJvcChcInRyYW5zZm9ybVBhc3RlZEhUTUxcIiwgZiA9PiB7IGh0bWwgPSBmKGh0bWwsIHZpZXcpOyB9KTtcbiAgICAgICAgZG9tID0gcmVhZEhUTUwoaHRtbCk7XG4gICAgICAgIGlmICh3ZWJraXQpXG4gICAgICAgICAgICByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHROb2RlID0gZG9tICYmIGRvbS5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtcG0tc2xpY2VdXCIpO1xuICAgIGxldCBzbGljZURhdGEgPSBjb250ZXh0Tm9kZSAmJiAvXihcXGQrKSAoXFxkKykoPzogLShcXGQrKSk/ICguKikvLmV4ZWMoY29udGV4dE5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YS1wbS1zbGljZVwiKSB8fCBcIlwiKTtcbiAgICBpZiAoc2xpY2VEYXRhICYmIHNsaWNlRGF0YVszXSlcbiAgICAgICAgZm9yIChsZXQgaSA9ICtzbGljZURhdGFbM107IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IGRvbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLm5vZGVUeXBlICE9IDEpXG4gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmICghY2hpbGQpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkb20gPSBjaGlsZDtcbiAgICAgICAgfVxuICAgIGlmICghc2xpY2UpIHtcbiAgICAgICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJjbGlwYm9hcmRQYXJzZXJcIikgfHwgdmlldy5zb21lUHJvcChcImRvbVBhcnNlclwiKSB8fCBET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSk7XG4gICAgICAgIHNsaWNlID0gcGFyc2VyLnBhcnNlU2xpY2UoZG9tLCB7XG4gICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2U6ICEhKGFzVGV4dCB8fCBzbGljZURhdGEpLFxuICAgICAgICAgICAgY29udGV4dDogJGNvbnRleHQsXG4gICAgICAgICAgICBydWxlRnJvbU5vZGUoZG9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRvbS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgICBkb20ucGFyZW50Tm9kZSAmJiAhaW5saW5lUGFyZW50cy50ZXN0KGRvbS5wYXJlbnROb2RlLm5vZGVOYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWdub3JlOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2xpY2VEYXRhKSB7XG4gICAgICAgIHNsaWNlID0gYWRkQ29udGV4dChjbG9zZVNsaWNlKHNsaWNlLCArc2xpY2VEYXRhWzFdLCArc2xpY2VEYXRhWzJdKSwgc2xpY2VEYXRhWzRdKTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIEhUTUwgd2Fzbid0IGNyZWF0ZWQgYnkgUHJvc2VNaXJyb3IuIE1ha2Ugc3VyZSB0b3AtbGV2ZWwgc2libGluZ3MgYXJlIGNvaGVyZW50XG4gICAgICAgIHNsaWNlID0gU2xpY2UubWF4T3Blbihub3JtYWxpemVTaWJsaW5ncyhzbGljZS5jb250ZW50LCAkY29udGV4dCksIHRydWUpO1xuICAgICAgICBpZiAoc2xpY2Uub3BlblN0YXJ0IHx8IHNsaWNlLm9wZW5FbmQpIHtcbiAgICAgICAgICAgIGxldCBvcGVuU3RhcnQgPSAwLCBvcGVuRW5kID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQ7IG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydCAmJiAhbm9kZS50eXBlLnNwZWMuaXNvbGF0aW5nOyBvcGVuU3RhcnQrKywgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZCkgeyB9XG4gICAgICAgICAgICBmb3IgKGxldCBub2RlID0gc2xpY2UuY29udGVudC5sYXN0Q2hpbGQ7IG9wZW5FbmQgPCBzbGljZS5vcGVuRW5kICYmICFub2RlLnR5cGUuc3BlYy5pc29sYXRpbmc7IG9wZW5FbmQrKywgbm9kZSA9IG5vZGUubGFzdENoaWxkKSB7IH1cbiAgICAgICAgICAgIHNsaWNlID0gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG5jb25zdCBpbmxpbmVQYXJlbnRzID0gL14oYXxhYmJyfGFjcm9ueW18YnxjaXRlfGNvZGV8ZGVsfGVtfGl8aW5zfGtiZHxsYWJlbHxvdXRwdXR8cXxydWJ5fHN8c2FtcHxzcGFufHN0cm9uZ3xzdWJ8c3VwfHRpbWV8dXx0dHx2YXIpJC9pO1xuLy8gVGFrZXMgYSBzbGljZSBwYXJzZWQgd2l0aCBwYXJzZVNsaWNlLCB3aGljaCBtZWFucyB0aGVyZSBoYXNuJ3QgYmVlblxuLy8gYW55IGNvbnRlbnQtZXhwcmVzc2lvbiBjaGVja2luZyBkb25lIG9uIHRoZSB0b3Agbm9kZXMsIHRyaWVzIHRvXG4vLyBmaW5kIGEgcGFyZW50IG5vZGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dCB0aGF0IG1pZ2h0IGZpdCB0aGUgbm9kZXMsXG4vLyBhbmQgaWYgc3VjY2Vzc2Z1bCwgcmVidWlsZHMgdGhlIHNsaWNlIHNvIHRoYXQgaXQgZml0cyBpbnRvIHRoYXQgcGFyZW50LlxuLy9cbi8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIHRoYXQgVHJhbnNmb3JtLnJlcGxhY2UgZXhwZWN0cyBhXG4vLyBjb2hlcmVudCBzbGljZSwgYW5kIHdpbGwgZmFpbCB0byBwbGFjZSBhIHNldCBvZiBzaWJsaW5ncyB0aGF0IGRvbid0XG4vLyBmaXQgYW55d2hlcmUgaW4gdGhlIHNjaGVtYS5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpYmxpbmdzKGZyYWdtZW50LCAkY29udGV4dCkge1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50IDwgMilcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIGZvciAobGV0IGQgPSAkY29udGV4dC5kZXB0aDsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgbGV0IHBhcmVudCA9ICRjb250ZXh0Lm5vZGUoZCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmVudC5jb250ZW50TWF0Y2hBdCgkY29udGV4dC5pbmRleChkKSk7XG4gICAgICAgIGxldCBsYXN0V3JhcCwgcmVzdWx0ID0gW107XG4gICAgICAgIGZyYWdtZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgd3JhcCA9IG1hdGNoLmZpbmRXcmFwcGluZyhub2RlLnR5cGUpLCBpbkxhc3Q7XG4gICAgICAgICAgICBpZiAoIXdyYXApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaW5MYXN0ID0gcmVzdWx0Lmxlbmd0aCAmJiBsYXN0V3JhcC5sZW5ndGggJiYgYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLCAwKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBpbkxhc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSA9IGNsb3NlUmlnaHQocmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSwgbGFzdFdyYXAubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBlZCA9IHdpdGhXcmFwcGVycyhub2RlLCB3cmFwKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3cmFwcGVkKTtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoLm1hdGNoVHlwZSh3cmFwcGVkLnR5cGUpO1xuICAgICAgICAgICAgICAgIGxhc3RXcmFwID0gd3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG59XG5mdW5jdGlvbiB3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZnJvbSA9IDApIHtcbiAgICBmb3IgKGxldCBpID0gd3JhcC5sZW5ndGggLSAxOyBpID49IGZyb207IGktLSlcbiAgICAgICAgbm9kZSA9IHdyYXBbaV0uY3JlYXRlKG51bGwsIEZyYWdtZW50LmZyb20obm9kZSkpO1xuICAgIHJldHVybiBub2RlO1xufVxuLy8gVXNlZCB0byBncm91cCBhZGphY2VudCBub2RlcyB3cmFwcGVkIGluIHNpbWlsYXIgcGFyZW50cyBieVxuLy8gbm9ybWFsaXplU2libGluZ3MgaW50byB0aGUgc2FtZSBwYXJlbnQgbm9kZVxuZnVuY3Rpb24gYWRkVG9TaWJsaW5nKHdyYXAsIGxhc3RXcmFwLCBub2RlLCBzaWJsaW5nLCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA8IHdyYXAubGVuZ3RoICYmIGRlcHRoIDwgbGFzdFdyYXAubGVuZ3RoICYmIHdyYXBbZGVwdGhdID09IGxhc3RXcmFwW2RlcHRoXSkge1xuICAgICAgICBsZXQgaW5uZXIgPSBhZGRUb1NpYmxpbmcod3JhcCwgbGFzdFdyYXAsIG5vZGUsIHNpYmxpbmcubGFzdENoaWxkLCBkZXB0aCArIDEpO1xuICAgICAgICBpZiAoaW5uZXIpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5yZXBsYWNlQ2hpbGQoc2libGluZy5jaGlsZENvdW50IC0gMSwgaW5uZXIpKTtcbiAgICAgICAgbGV0IG1hdGNoID0gc2libGluZy5jb250ZW50TWF0Y2hBdChzaWJsaW5nLmNoaWxkQ291bnQpO1xuICAgICAgICBpZiAobWF0Y2gubWF0Y2hUeXBlKGRlcHRoID09IHdyYXAubGVuZ3RoIC0gMSA/IG5vZGUudHlwZSA6IHdyYXBbZGVwdGggKyAxXSkpXG4gICAgICAgICAgICByZXR1cm4gc2libGluZy5jb3B5KHNpYmxpbmcuY29udGVudC5hcHBlbmQoRnJhZ21lbnQuZnJvbSh3aXRoV3JhcHBlcnMobm9kZSwgd3JhcCwgZGVwdGggKyAxKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjbG9zZVJpZ2h0KG5vZGUsIGRlcHRoKSB7XG4gICAgaWYgKGRlcHRoID09IDApXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIGxldCBmcmFnbWVudCA9IG5vZGUuY29udGVudC5yZXBsYWNlQ2hpbGQobm9kZS5jaGlsZENvdW50IC0gMSwgY2xvc2VSaWdodChub2RlLmxhc3RDaGlsZCwgZGVwdGggLSAxKSk7XG4gICAgbGV0IGZpbGwgPSBub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG5vZGUuY29weShmcmFnbWVudC5hcHBlbmQoZmlsbCkpO1xufVxuZnVuY3Rpb24gY2xvc2VSYW5nZShmcmFnbWVudCwgc2lkZSwgZnJvbSwgdG8sIGRlcHRoLCBvcGVuRW5kKSB7XG4gICAgbGV0IG5vZGUgPSBzaWRlIDwgMCA/IGZyYWdtZW50LmZpcnN0Q2hpbGQgOiBmcmFnbWVudC5sYXN0Q2hpbGQsIGlubmVyID0gbm9kZS5jb250ZW50O1xuICAgIGlmIChmcmFnbWVudC5jaGlsZENvdW50ID4gMSlcbiAgICAgICAgb3BlbkVuZCA9IDA7XG4gICAgaWYgKGRlcHRoIDwgdG8gLSAxKVxuICAgICAgICBpbm5lciA9IGNsb3NlUmFuZ2UoaW5uZXIsIHNpZGUsIGZyb20sIHRvLCBkZXB0aCArIDEsIG9wZW5FbmQpO1xuICAgIGlmIChkZXB0aCA+PSBmcm9tKVxuICAgICAgICBpbm5lciA9IHNpZGUgPCAwID8gbm9kZS5jb250ZW50TWF0Y2hBdCgwKS5maWxsQmVmb3JlKGlubmVyLCBvcGVuRW5kIDw9IGRlcHRoKS5hcHBlbmQoaW5uZXIpXG4gICAgICAgICAgICA6IGlubmVyLmFwcGVuZChub2RlLmNvbnRlbnRNYXRjaEF0KG5vZGUuY2hpbGRDb3VudCkuZmlsbEJlZm9yZShGcmFnbWVudC5lbXB0eSwgdHJ1ZSkpO1xuICAgIHJldHVybiBmcmFnbWVudC5yZXBsYWNlQ2hpbGQoc2lkZSA8IDAgPyAwIDogZnJhZ21lbnQuY2hpbGRDb3VudCAtIDEsIG5vZGUuY29weShpbm5lcikpO1xufVxuZnVuY3Rpb24gY2xvc2VTbGljZShzbGljZSwgb3BlblN0YXJ0LCBvcGVuRW5kKSB7XG4gICAgaWYgKG9wZW5TdGFydCA8IHNsaWNlLm9wZW5TdGFydClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAtMSwgb3BlblN0YXJ0LCBzbGljZS5vcGVuU3RhcnQsIDAsIHNsaWNlLm9wZW5FbmQpLCBvcGVuU3RhcnQsIHNsaWNlLm9wZW5FbmQpO1xuICAgIGlmIChvcGVuRW5kIDwgc2xpY2Uub3BlbkVuZClcbiAgICAgICAgc2xpY2UgPSBuZXcgU2xpY2UoY2xvc2VSYW5nZShzbGljZS5jb250ZW50LCAxLCBvcGVuRW5kLCBzbGljZS5vcGVuRW5kLCAwLCAwKSwgc2xpY2Uub3BlblN0YXJ0LCBvcGVuRW5kKTtcbiAgICByZXR1cm4gc2xpY2U7XG59XG4vLyBUcmljayBmcm9tIGpRdWVyeSAtLSBzb21lIGVsZW1lbnRzIG11c3QgYmUgd3JhcHBlZCBpbiBvdGhlclxuLy8gZWxlbWVudHMgZm9yIGlubmVySFRNTCB0byB3b3JrLiBJLmUuIGlmIHlvdSBkbyBgZGl2LmlubmVySFRNTCA9XG4vLyBcIjx0ZD4uLjwvdGQ+XCJgIHRoZSB0YWJsZSBjZWxscyBhcmUgaWdub3JlZC5cbmNvbnN0IHdyYXBNYXAgPSB7XG4gICAgdGhlYWQ6IFtcInRhYmxlXCJdLFxuICAgIHRib2R5OiBbXCJ0YWJsZVwiXSxcbiAgICB0Zm9vdDogW1widGFibGVcIl0sXG4gICAgY2FwdGlvbjogW1widGFibGVcIl0sXG4gICAgY29sZ3JvdXA6IFtcInRhYmxlXCJdLFxuICAgIGNvbDogW1widGFibGVcIiwgXCJjb2xncm91cFwiXSxcbiAgICB0cjogW1widGFibGVcIiwgXCJ0Ym9keVwiXSxcbiAgICB0ZDogW1widGFibGVcIiwgXCJ0Ym9keVwiLCBcInRyXCJdLFxuICAgIHRoOiBbXCJ0YWJsZVwiLCBcInRib2R5XCIsIFwidHJcIl1cbn07XG5sZXQgX2RldGFjaGVkRG9jID0gbnVsbDtcbmZ1bmN0aW9uIGRldGFjaGVkRG9jKCkge1xuICAgIHJldHVybiBfZGV0YWNoZWREb2MgfHwgKF9kZXRhY2hlZERvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcInRpdGxlXCIpKTtcbn1cbmxldCBfcG9saWN5ID0gbnVsbDtcbmZ1bmN0aW9uIG1heWJlV3JhcFRydXN0ZWQoaHRtbCkge1xuICAgIGxldCB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuICAgIGlmICghdHJ1c3RlZFR5cGVzKVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAvLyBXaXRoIHRoZSByZXF1aXJlLXRydXN0ZWQtdHlwZXMtZm9yIENTUCwgQ2hyb21lIHdpbGwgYmxvY2tcbiAgICAvLyBpbm5lckhUTUwsIGV2ZW4gb24gYSBkZXRhY2hlZCBkb2N1bWVudC4gVGhpcyB3cmFwcyB0aGUgc3RyaW5nIGluXG4gICAgLy8gYSB3YXkgdGhhdCBtYWtlcyB0aGUgYnJvd3NlciBhbGxvdyB1cyB0byB1c2UgaXRzIHBhcnNlciBhZ2Fpbi5cbiAgICBpZiAoIV9wb2xpY3kpXG4gICAgICAgIF9wb2xpY3kgPSB0cnVzdGVkVHlwZXMuZGVmYXVsdFBvbGljeSB8fCB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KFwiUHJvc2VNaXJyb3JDbGlwYm9hcmRcIiwgeyBjcmVhdGVIVE1MOiAocykgPT4gcyB9KTtcbiAgICByZXR1cm4gX3BvbGljeS5jcmVhdGVIVE1MKGh0bWwpO1xufVxuZnVuY3Rpb24gcmVhZEhUTUwoaHRtbCkge1xuICAgIGxldCBtZXRhcyA9IC9eKFxccyo8bWV0YSBbXj5dKj4pKi8uZXhlYyhodG1sKTtcbiAgICBpZiAobWV0YXMpXG4gICAgICAgIGh0bWwgPSBodG1sLnNsaWNlKG1ldGFzWzBdLmxlbmd0aCk7XG4gICAgbGV0IGVsdCA9IGRldGFjaGVkRG9jKCkuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBsZXQgZmlyc3RUYWcgPSAvPChbYS16XVtePlxcc10rKS9pLmV4ZWMoaHRtbCksIHdyYXA7XG4gICAgaWYgKHdyYXAgPSBmaXJzdFRhZyAmJiB3cmFwTWFwW2ZpcnN0VGFnWzFdLnRvTG93ZXJDYXNlKCldKVxuICAgICAgICBodG1sID0gd3JhcC5tYXAobiA9PiBcIjxcIiArIG4gKyBcIj5cIikuam9pbihcIlwiKSArIGh0bWwgKyB3cmFwLm1hcChuID0+IFwiPC9cIiArIG4gKyBcIj5cIikucmV2ZXJzZSgpLmpvaW4oXCJcIik7XG4gICAgZWx0LmlubmVySFRNTCA9IG1heWJlV3JhcFRydXN0ZWQoaHRtbCk7XG4gICAgaWYgKHdyYXApXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGVsdCA9IGVsdC5xdWVyeVNlbGVjdG9yKHdyYXBbaV0pIHx8IGVsdDtcbiAgICByZXR1cm4gZWx0O1xufVxuLy8gV2Via2l0IGJyb3dzZXJzIGRvIHNvbWUgaGFyZC10by1wcmVkaWN0IHJlcGxhY2VtZW50IG9mIHJlZ3VsYXJcbi8vIHNwYWNlcyB3aXRoIG5vbi1icmVha2luZyBzcGFjZXMgd2hlbiBwdXR0aW5nIGNvbnRlbnQgb24gdGhlXG4vLyBjbGlwYm9hcmQuIFRoaXMgdHJpZXMgdG8gY29udmVydCBzdWNoIG5vbi1icmVha2luZyBzcGFjZXMgKHdoaWNoXG4vLyB3aWxsIGJlIHdyYXBwZWQgaW4gYSBwbGFpbiBzcGFuIG9uIENocm9tZSwgYSBzcGFuIHdpdGggY2xhc3Ncbi8vIEFwcGxlLWNvbnZlcnRlZC1zcGFjZSBvbiBTYWZhcmkpIGJhY2sgdG8gcmVndWxhciBzcGFjZXMuXG5mdW5jdGlvbiByZXN0b3JlUmVwbGFjZWRTcGFjZXMoZG9tKSB7XG4gICAgbGV0IG5vZGVzID0gZG9tLnF1ZXJ5U2VsZWN0b3JBbGwoY2hyb21lID8gXCJzcGFuOm5vdChbY2xhc3NdKTpub3QoW3N0eWxlXSlcIiA6IFwic3Bhbi5BcHBsZS1jb252ZXJ0ZWQtc3BhY2VcIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxICYmIG5vZGUudGV4dENvbnRlbnQgPT0gXCJcXHUwMGEwXCIgJiYgbm9kZS5wYXJlbnROb2RlKVxuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb20ub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIiBcIiksIG5vZGUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZENvbnRleHQoc2xpY2UsIGNvbnRleHQpIHtcbiAgICBpZiAoIXNsaWNlLnNpemUpXG4gICAgICAgIHJldHVybiBzbGljZTtcbiAgICBsZXQgc2NoZW1hID0gc2xpY2UuY29udGVudC5maXJzdENoaWxkLnR5cGUuc2NoZW1hLCBhcnJheTtcbiAgICB0cnkge1xuICAgICAgICBhcnJheSA9IEpTT04ucGFyc2UoY29udGV4dCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzbGljZTtcbiAgICB9XG4gICAgbGV0IHsgY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kIH0gPSBzbGljZTtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHtcbiAgICAgICAgbGV0IHR5cGUgPSBzY2hlbWEubm9kZXNbYXJyYXlbaV1dO1xuICAgICAgICBpZiAoIXR5cGUgfHwgdHlwZS5oYXNSZXF1aXJlZEF0dHJzKCkpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY29udGVudCA9IEZyYWdtZW50LmZyb20odHlwZS5jcmVhdGUoYXJyYXlbaSArIDFdLCBjb250ZW50KSk7XG4gICAgICAgIG9wZW5TdGFydCsrO1xuICAgICAgICBvcGVuRW5kKys7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2xpY2UoY29udGVudCwgb3BlblN0YXJ0LCBvcGVuRW5kKTtcbn1cblxuLy8gQSBjb2xsZWN0aW9uIG9mIERPTSBldmVudHMgdGhhdCBvY2N1ciB3aXRoaW4gdGhlIGVkaXRvciwgYW5kIGNhbGxiYWNrIGZ1bmN0aW9uc1xuLy8gdG8gaW52b2tlIHdoZW4gdGhlIGV2ZW50IGZpcmVzLlxuY29uc3QgaGFuZGxlcnMgPSB7fTtcbmNvbnN0IGVkaXRIYW5kbGVycyA9IHt9O1xuY29uc3QgcGFzc2l2ZUhhbmRsZXJzID0geyB0b3VjaHN0YXJ0OiB0cnVlLCB0b3VjaG1vdmU6IHRydWUgfTtcbmNsYXNzIElucHV0U3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNoaWZ0S2V5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW91c2VEb3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdEtleUNvZGVUaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q2xpY2sgPSB7IHRpbWU6IDAsIHg6IDAsIHk6IDAsIHR5cGU6IFwiXCIsIGJ1dHRvbjogMCB9O1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3Rpb25UaW1lID0gMDtcbiAgICAgICAgdGhpcy5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICB0aGlzLmxhc3RJT1NFbnRlckZhbGxiYWNrVGltZW91dCA9IC0xO1xuICAgICAgICB0aGlzLmxhc3RGb2N1cyA9IDA7XG4gICAgICAgIHRoaXMubGFzdFRvdWNoID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q2hyb21lRGVsZXRlID0gMDtcbiAgICAgICAgdGhpcy5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbk5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbXBvc2luZ1RpbWVvdXQgPSAtMTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbk5vZGVzID0gW107XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25FbmRlZEF0ID0gLTJlODtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvbklEID0gMTtcbiAgICAgICAgLy8gU2V0IHRvIGEgY29tcG9zaXRpb24gSUQgd2hlbiB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGF0IGNvbXBvc2l0aW9uZW5kXG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcyA9IDA7XG4gICAgICAgIHRoaXMuZG9tQ2hhbmdlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmhpZGVTZWxlY3Rpb25HdWFyZCA9IG51bGw7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdElucHV0KHZpZXcpIHtcbiAgICBmb3IgKGxldCBldmVudCBpbiBoYW5kbGVycykge1xuICAgICAgICBsZXQgaGFuZGxlciA9IGhhbmRsZXJzW2V2ZW50XTtcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW2V2ZW50XSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50QmVsb25nc1RvVmlldyh2aWV3LCBldmVudCkgJiYgIXJ1bkN1c3RvbUhhbmRsZXIodmlldywgZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgKHZpZXcuZWRpdGFibGUgfHwgIShldmVudC50eXBlIGluIGVkaXRIYW5kbGVycykpKVxuICAgICAgICAgICAgICAgIGhhbmRsZXIodmlldywgZXZlbnQpO1xuICAgICAgICB9LCBwYXNzaXZlSGFuZGxlcnNbZXZlbnRdID8geyBwYXNzaXZlOiB0cnVlIH0gOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvLyBPbiBTYWZhcmksIGZvciByZWFzb25zIGJleW9uZCBteSB1bmRlcnN0YW5kaW5nLCBhZGRpbmcgYW4gaW5wdXRcbiAgICAvLyBldmVudCBoYW5kbGVyIG1ha2VzIGFuIGlzc3VlIHdoZXJlIHRoZSBjb21wb3NpdGlvbiB2YW5pc2hlcyB3aGVuXG4gICAgLy8geW91IHByZXNzIGVudGVyIGdvIGF3YXkuXG4gICAgaWYgKHNhZmFyaSlcbiAgICAgICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IG51bGwpO1xuICAgIGVuc3VyZUxpc3RlbmVycyh2aWV3KTtcbn1cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBvcmlnaW4pIHtcbiAgICB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gPSBvcmlnaW47XG4gICAgdmlldy5pbnB1dC5sYXN0U2VsZWN0aW9uVGltZSA9IERhdGUubm93KCk7XG59XG5mdW5jdGlvbiBkZXN0cm95SW5wdXQodmlldykge1xuICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgIGZvciAobGV0IHR5cGUgaW4gdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzKVxuICAgICAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHZpZXcuaW5wdXQuZXZlbnRIYW5kbGVyc1t0eXBlXSk7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQuY29tcG9zaW5nVGltZW91dCk7XG4gICAgY2xlYXJUaW1lb3V0KHZpZXcuaW5wdXQubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0KTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUxpc3RlbmVycyh2aWV3KSB7XG4gICAgdmlldy5zb21lUHJvcChcImhhbmRsZURPTUV2ZW50c1wiLCBjdXJyZW50SGFuZGxlcnMgPT4ge1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIGN1cnJlbnRIYW5kbGVycylcbiAgICAgICAgICAgIGlmICghdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW3R5cGVdKVxuICAgICAgICAgICAgICAgIHZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgdmlldy5pbnB1dC5ldmVudEhhbmRsZXJzW3R5cGVdID0gZXZlbnQgPT4gcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkge1xuICAgIHJldHVybiB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlRE9NRXZlbnRzXCIsIGhhbmRsZXJzID0+IHtcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBoYW5kbGVyc1tldmVudC50eXBlXTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIgPyBoYW5kbGVyKHZpZXcsIGV2ZW50KSB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkIDogZmFsc2U7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBldmVudEJlbG9uZ3NUb1ZpZXcodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LmJ1YmJsZXMpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgbm9kZSA9IGV2ZW50LnRhcmdldDsgbm9kZSAhPSB2aWV3LmRvbTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgPT0gMTEgfHxcbiAgICAgICAgICAgIChub2RlLnBtVmlld0Rlc2MgJiYgbm9kZS5wbVZpZXdEZXNjLnN0b3BFdmVudChldmVudCkpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCh2aWV3LCBldmVudCkge1xuICAgIGlmICghcnVuQ3VzdG9tSGFuZGxlcih2aWV3LCBldmVudCkgJiYgaGFuZGxlcnNbZXZlbnQudHlwZV0gJiZcbiAgICAgICAgKHZpZXcuZWRpdGFibGUgfHwgIShldmVudC50eXBlIGluIGVkaXRIYW5kbGVycykpKVxuICAgICAgICBoYW5kbGVyc1tldmVudC50eXBlXSh2aWV3LCBldmVudCk7XG59XG5lZGl0SGFuZGxlcnMua2V5ZG93biA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgdmlldy5pbnB1dC5zaGlmdEtleSA9IGV2ZW50LmtleUNvZGUgPT0gMTYgfHwgZXZlbnQuc2hpZnRLZXk7XG4gICAgaWYgKGluT3JOZWFyQ29tcG9zaXRpb24odmlldywgZXZlbnQpKVxuICAgICAgICByZXR1cm47XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFN1cHByZXNzIGVudGVyIGtleSBldmVudHMgb24gQ2hyb21lIEFuZHJvaWQsIGJlY2F1c2UgdGhvc2UgdGVuZFxuICAgIC8vIHRvIGJlIHBhcnQgb2YgYSBjb25mdXNlZCBzZXF1ZW5jZSBvZiBjb21wb3NpdGlvbiBldmVudHMgZmlyZWQsXG4gICAgLy8gYW5kIGhhbmRsaW5nIHRoZW0gZWFnZXJseSB0ZW5kcyB0byBjb3JydXB0IHRoZSBpbnB1dC5cbiAgICBpZiAoYW5kcm9pZCAmJiBjaHJvbWUgJiYgZXZlbnQua2V5Q29kZSA9PSAxMylcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChldmVudC5rZXlDb2RlICE9IDIyOSlcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgLy8gT24gaU9TLCBpZiB3ZSBwcmV2ZW50RGVmYXVsdCBlbnRlciBrZXkgcHJlc3NlcywgdGhlIHZpcnR1YWxcbiAgICAvLyBrZXlib2FyZCBnZXRzIGNvbmZ1c2VkLiBTbyB0aGUgaGFjayBoZXJlIGlzIHRvIHNldCBhIGZsYWcgdGhhdFxuICAgIC8vIG1ha2VzIHRoZSBET00gY2hhbmdlIGNvZGUgcmVjb2duaXplIHRoYXQgd2hhdCBqdXN0IGhhcHBlbnMgc2hvdWxkXG4gICAgLy8gYmUgcmVwbGFjZWQgYnkgd2hhdGV2ZXIgdGhlIEVudGVyIGtleSBoYW5kbGVycyBkby5cbiAgICBpZiAoaW9zICYmIGV2ZW50LmtleUNvZGUgPT0gMTMgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQubWV0YUtleSkge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSBub3c7XG4gICAgICAgIHZpZXcuaW5wdXQubGFzdElPU0VudGVyRmFsbGJhY2tUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPT0gbm93KSB7XG4gICAgICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSk7XG4gICAgICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAyMDApO1xuICAgIH1cbiAgICBlbHNlIGlmICh2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywgZXZlbnQpKSB8fCBjYXB0dXJlS2V5RG93bih2aWV3LCBldmVudCkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih2aWV3LCBcImtleVwiKTtcbiAgICB9XG59O1xuZWRpdEhhbmRsZXJzLmtleXVwID0gKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gMTYpXG4gICAgICAgIHZpZXcuaW5wdXQuc2hpZnRLZXkgPSBmYWxzZTtcbn07XG5lZGl0SGFuZGxlcnMua2V5cHJlc3MgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIGlmIChpbk9yTmVhckNvbXBvc2l0aW9uKHZpZXcsIGV2ZW50KSB8fCAhZXZlbnQuY2hhckNvZGUgfHxcbiAgICAgICAgZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5IHx8IG1hYyAmJiBldmVudC5tZXRhS2V5KVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlQcmVzc1wiLCBmID0+IGYodmlldywgZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIShzZWwgaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSB8fCAhc2VsLiRmcm9tLnNhbWVQYXJlbnQoc2VsLiR0bykpIHtcbiAgICAgICAgbGV0IHRleHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKTtcbiAgICAgICAgaWYgKCEvW1xcclxcbl0vLnRlc3QodGV4dCkgJiYgIXZpZXcuc29tZVByb3AoXCJoYW5kbGVUZXh0SW5wdXRcIiwgZiA9PiBmKHZpZXcsIHNlbC4kZnJvbS5wb3MsIHNlbC4kdG8ucG9zLCB0ZXh0KSkpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuaW5zZXJ0VGV4dCh0ZXh0KS5zY3JvbGxJbnRvVmlldygpKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59O1xuZnVuY3Rpb24gZXZlbnRDb29yZHMoZXZlbnQpIHsgcmV0dXJuIHsgbGVmdDogZXZlbnQuY2xpZW50WCwgdG9wOiBldmVudC5jbGllbnRZIH07IH1cbmZ1bmN0aW9uIGlzTmVhcihldmVudCwgY2xpY2spIHtcbiAgICBsZXQgZHggPSBjbGljay54IC0gZXZlbnQuY2xpZW50WCwgZHkgPSBjbGljay55IC0gZXZlbnQuY2xpZW50WTtcbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHkgPCAxMDA7XG59XG5mdW5jdGlvbiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIHByb3BOYW1lLCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICBpZiAoaW5zaWRlID09IC0xKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGlmICh2aWV3LnNvbWVQcm9wKHByb3BOYW1lLCBmID0+IGkgPiAkcG9zLmRlcHRoID8gZih2aWV3LCBwb3MsICRwb3Mubm9kZUFmdGVyLCAkcG9zLmJlZm9yZShpKSwgZXZlbnQsIHRydWUpXG4gICAgICAgICAgICA6IGYodmlldywgcG9zLCAkcG9zLm5vZGUoaSksICRwb3MuYmVmb3JlKGkpLCBldmVudCwgZmFsc2UpKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24odmlldywgc2VsZWN0aW9uLCBvcmlnaW4pIHtcbiAgICBpZiAoIXZpZXcuZm9jdXNlZClcbiAgICAgICAgdmlldy5mb2N1cygpO1xuICAgIGlmICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShzZWxlY3Rpb24pKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHRyID0gdmlldy5zdGF0ZS50ci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTtcbiAgICBpZiAob3JpZ2luID09IFwicG9pbnRlclwiKVxuICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdENsaWNrZWRMZWFmKHZpZXcsIGluc2lkZSkge1xuICAgIGlmIChpbnNpZGUgPT0gLTEpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJHBvcyA9IHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoaW5zaWRlKSwgbm9kZSA9ICRwb3Mubm9kZUFmdGVyO1xuICAgIGlmIChub2RlICYmIG5vZGUuaXNBdG9tICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gc2VsZWN0Q2xpY2tlZE5vZGUodmlldywgaW5zaWRlKSB7XG4gICAgaWYgKGluc2lkZSA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzZWwgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbiwgc2VsZWN0ZWROb2RlLCBzZWxlY3RBdDtcbiAgICBpZiAoc2VsIGluc3RhbmNlb2YgTm9kZVNlbGVjdGlvbilcbiAgICAgICAgc2VsZWN0ZWROb2RlID0gc2VsLm5vZGU7XG4gICAgbGV0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGxldCBub2RlID0gaSA+ICRwb3MuZGVwdGggPyAkcG9zLm5vZGVBZnRlciA6ICRwb3Mubm9kZShpKTtcbiAgICAgICAgaWYgKE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWROb2RlICYmIHNlbC4kZnJvbS5kZXB0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICBpID49IHNlbC4kZnJvbS5kZXB0aCAmJiAkcG9zLmJlZm9yZShzZWwuJGZyb20uZGVwdGggKyAxKSA9PSBzZWwuJGZyb20ucG9zKVxuICAgICAgICAgICAgICAgIHNlbGVjdEF0ID0gJHBvcy5iZWZvcmUoc2VsLiRmcm9tLmRlcHRoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZWxlY3RBdCA9ICRwb3MuYmVmb3JlKGkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbGVjdEF0ICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlU2VsZWN0aW9uKHZpZXcsIE5vZGVTZWxlY3Rpb24uY3JlYXRlKHZpZXcuc3RhdGUuZG9jLCBzZWxlY3RBdCksIFwicG9pbnRlclwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2luZ2xlQ2xpY2sodmlldywgcG9zLCBpbnNpZGUsIGV2ZW50LCBzZWxlY3ROb2RlKSB7XG4gICAgcmV0dXJuIHJ1bkhhbmRsZXJPbkNvbnRleHQodmlldywgXCJoYW5kbGVDbGlja09uXCIsIHBvcywgaW5zaWRlLCBldmVudCkgfHxcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUNsaWNrXCIsIGYgPT4gZih2aWV3LCBwb3MsIGV2ZW50KSkgfHxcbiAgICAgICAgKHNlbGVjdE5vZGUgPyBzZWxlY3RDbGlja2VkTm9kZSh2aWV3LCBpbnNpZGUpIDogc2VsZWN0Q2xpY2tlZExlYWYodmlldywgaW5zaWRlKSk7XG59XG5mdW5jdGlvbiBoYW5kbGVEb3VibGVDbGljayh2aWV3LCBwb3MsIGluc2lkZSwgZXZlbnQpIHtcbiAgICByZXR1cm4gcnVuSGFuZGxlck9uQ29udGV4dCh2aWV3LCBcImhhbmRsZURvdWJsZUNsaWNrT25cIiwgcG9zLCBpbnNpZGUsIGV2ZW50KSB8fFxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlRG91YmxlQ2xpY2tcIiwgZiA9PiBmKHZpZXcsIHBvcywgZXZlbnQpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVRyaXBsZUNsaWNrKHZpZXcsIHBvcywgaW5zaWRlLCBldmVudCkge1xuICAgIHJldHVybiBydW5IYW5kbGVyT25Db250ZXh0KHZpZXcsIFwiaGFuZGxlVHJpcGxlQ2xpY2tPblwiLCBwb3MsIGluc2lkZSwgZXZlbnQpIHx8XG4gICAgICAgIHZpZXcuc29tZVByb3AoXCJoYW5kbGVUcmlwbGVDbGlja1wiLCBmID0+IGYodmlldywgcG9zLCBldmVudCkpIHx8XG4gICAgICAgIGRlZmF1bHRUcmlwbGVDbGljayh2aWV3LCBpbnNpZGUsIGV2ZW50KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRUcmlwbGVDbGljayh2aWV3LCBpbnNpZGUsIGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jO1xuICAgIGlmIChpbnNpZGUgPT0gLTEpIHtcbiAgICAgICAgaWYgKGRvYy5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICB1cGRhdGVTZWxlY3Rpb24odmlldywgVGV4dFNlbGVjdGlvbi5jcmVhdGUoZG9jLCAwLCBkb2MuY29udGVudC5zaXplKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgJHBvcyA9IGRvYy5yZXNvbHZlKGluc2lkZSk7XG4gICAgZm9yIChsZXQgaSA9ICRwb3MuZGVwdGggKyAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGxldCBub2RlID0gaSA+ICRwb3MuZGVwdGggPyAkcG9zLm5vZGVBZnRlciA6ICRwb3Mubm9kZShpKTtcbiAgICAgICAgbGV0IG5vZGVQb3MgPSAkcG9zLmJlZm9yZShpKTtcbiAgICAgICAgaWYgKG5vZGUuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBUZXh0U2VsZWN0aW9uLmNyZWF0ZShkb2MsIG5vZGVQb3MgKyAxLCBub2RlUG9zICsgMSArIG5vZGUuY29udGVudC5zaXplKSwgXCJwb2ludGVyXCIpO1xuICAgICAgICBlbHNlIGlmIChOb2RlU2VsZWN0aW9uLmlzU2VsZWN0YWJsZShub2RlKSlcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih2aWV3LCBOb2RlU2VsZWN0aW9uLmNyZWF0ZShkb2MsIG5vZGVQb3MpLCBcInBvaW50ZXJcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBmb3JjZURPTUZsdXNoKHZpZXcpIHtcbiAgICByZXR1cm4gZW5kQ29tcG9zaXRpb24odmlldyk7XG59XG5jb25zdCBzZWxlY3ROb2RlTW9kaWZpZXIgPSBtYWMgPyBcIm1ldGFLZXlcIiA6IFwiY3RybEtleVwiO1xuaGFuZGxlcnMubW91c2Vkb3duID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICB2aWV3LmlucHV0LnNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgbGV0IGZsdXNoZWQgPSBmb3JjZURPTUZsdXNoKHZpZXcpO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpLCB0eXBlID0gXCJzaW5nbGVDbGlja1wiO1xuICAgIGlmIChub3cgLSB2aWV3LmlucHV0Lmxhc3RDbGljay50aW1lIDwgNTAwICYmIGlzTmVhcihldmVudCwgdmlldy5pbnB1dC5sYXN0Q2xpY2spICYmICFldmVudFtzZWxlY3ROb2RlTW9kaWZpZXJdICYmXG4gICAgICAgIHZpZXcuaW5wdXQubGFzdENsaWNrLmJ1dHRvbiA9PSBldmVudC5idXR0b24pIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubGFzdENsaWNrLnR5cGUgPT0gXCJzaW5nbGVDbGlja1wiKVxuICAgICAgICAgICAgdHlwZSA9IFwiZG91YmxlQ2xpY2tcIjtcbiAgICAgICAgZWxzZSBpZiAodmlldy5pbnB1dC5sYXN0Q2xpY2sudHlwZSA9PSBcImRvdWJsZUNsaWNrXCIpXG4gICAgICAgICAgICB0eXBlID0gXCJ0cmlwbGVDbGlja1wiO1xuICAgIH1cbiAgICB2aWV3LmlucHV0Lmxhc3RDbGljayA9IHsgdGltZTogbm93LCB4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZLCB0eXBlLCBidXR0b246IGV2ZW50LmJ1dHRvbiB9O1xuICAgIGxldCBwb3MgPSB2aWV3LnBvc0F0Q29vcmRzKGV2ZW50Q29vcmRzKGV2ZW50KSk7XG4gICAgaWYgKCFwb3MpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAodHlwZSA9PSBcInNpbmdsZUNsaWNrXCIpIHtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQubW91c2VEb3duKVxuICAgICAgICAgICAgdmlldy5pbnB1dC5tb3VzZURvd24uZG9uZSgpO1xuICAgICAgICB2aWV3LmlucHV0Lm1vdXNlRG93biA9IG5ldyBNb3VzZURvd24odmlldywgcG9zLCBldmVudCwgISFmbHVzaGVkKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKHR5cGUgPT0gXCJkb3VibGVDbGlja1wiID8gaGFuZGxlRG91YmxlQ2xpY2sgOiBoYW5kbGVUcmlwbGVDbGljaykodmlldywgcG9zLnBvcywgcG9zLmluc2lkZSwgZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbn07XG5jbGFzcyBNb3VzZURvd24ge1xuICAgIGNvbnN0cnVjdG9yKHZpZXcsIHBvcywgZXZlbnQsIGZsdXNoZWQpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5mbHVzaGVkID0gZmx1c2hlZDtcbiAgICAgICAgdGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1pZ2h0RHJhZyA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhcnREb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlID0gISFldmVudFtzZWxlY3ROb2RlTW9kaWZpZXJdO1xuICAgICAgICB0aGlzLmFsbG93RGVmYXVsdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICBsZXQgdGFyZ2V0Tm9kZSwgdGFyZ2V0UG9zO1xuICAgICAgICBpZiAocG9zLmluc2lkZSA+IC0xKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gdmlldy5zdGF0ZS5kb2Mubm9kZUF0KHBvcy5pbnNpZGUpO1xuICAgICAgICAgICAgdGFyZ2V0UG9zID0gcG9zLmluc2lkZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKTtcbiAgICAgICAgICAgIHRhcmdldE5vZGUgPSAkcG9zLnBhcmVudDtcbiAgICAgICAgICAgIHRhcmdldFBvcyA9ICRwb3MuZGVwdGggPyAkcG9zLmJlZm9yZSgpIDogMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSBmbHVzaGVkID8gbnVsbCA6IGV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgdGFyZ2V0RGVzYyA9IHRhcmdldCA/IHZpZXcuZG9jVmlldy5uZWFyZXN0RGVzYyh0YXJnZXQsIHRydWUpIDogbnVsbDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXREZXNjICYmIHRhcmdldERlc2MuZG9tLm5vZGVUeXBlID09IDEgPyB0YXJnZXREZXNjLmRvbSA6IG51bGw7XG4gICAgICAgIGxldCB7IHNlbGVjdGlvbiB9ID0gdmlldy5zdGF0ZTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PSAwICYmXG4gICAgICAgICAgICB0YXJnZXROb2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgdGFyZ2V0Tm9kZS50eXBlLnNwZWMuc2VsZWN0YWJsZSAhPT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmZyb20gPD0gdGFyZ2V0UG9zICYmIHNlbGVjdGlvbi50byA+IHRhcmdldFBvcylcbiAgICAgICAgICAgIHRoaXMubWlnaHREcmFnID0ge1xuICAgICAgICAgICAgICAgIG5vZGU6IHRhcmdldE5vZGUsXG4gICAgICAgICAgICAgICAgcG9zOiB0YXJnZXRQb3MsXG4gICAgICAgICAgICAgICAgYWRkQXR0cjogISEodGhpcy50YXJnZXQgJiYgIXRoaXMudGFyZ2V0LmRyYWdnYWJsZSksXG4gICAgICAgICAgICAgICAgc2V0VW5lZGl0YWJsZTogISEodGhpcy50YXJnZXQgJiYgZ2Vja28gJiYgIXRoaXMudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLm1pZ2h0RHJhZyAmJiAodGhpcy5taWdodERyYWcuYWRkQXR0ciB8fCB0aGlzLm1pZ2h0RHJhZy5zZXRVbmVkaXRhYmxlKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3LmRvbU9ic2VydmVyLnN0b3AoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pZ2h0RHJhZy5hZGRBdHRyKVxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPT0gdGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnNldEF0dHJpYnV0ZShcImNvbnRlbnRFZGl0YWJsZVwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIHZpZXcucm9vdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwID0gdGhpcy51cC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmlldy5yb290LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5tb3ZlID0gdGhpcy5tb3ZlLmJpbmQodGhpcykpO1xuICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xuICAgIH1cbiAgICBkb25lKCkge1xuICAgICAgICB0aGlzLnZpZXcucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLnVwKTtcbiAgICAgICAgdGhpcy52aWV3LnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm1vdmUpO1xuICAgICAgICBpZiAodGhpcy5taWdodERyYWcgJiYgdGhpcy50YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuYWRkQXR0cilcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5taWdodERyYWcuc2V0VW5lZGl0YWJsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJjb250ZW50RWRpdGFibGVcIik7XG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxheWVkU2VsZWN0aW9uU3luYylcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odGhpcy52aWV3KSk7XG4gICAgICAgIHRoaXMudmlldy5pbnB1dC5tb3VzZURvd24gPSBudWxsO1xuICAgIH1cbiAgICB1cChldmVudCkge1xuICAgICAgICB0aGlzLmRvbmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcuZG9tLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgaWYgKHRoaXMudmlldy5zdGF0ZS5kb2MgIT0gdGhpcy5zdGFydERvYylcbiAgICAgICAgICAgIHBvcyA9IHRoaXMudmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmFsbG93RGVmYXVsdCB8fCAhcG9zKSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFuZGxlU2luZ2xlQ2xpY2sodGhpcy52aWV3LCBwb3MucG9zLCBwb3MuaW5zaWRlLCBldmVudCwgdGhpcy5zZWxlY3ROb2RlKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldmVudC5idXR0b24gPT0gMCAmJlxuICAgICAgICAgICAgKHRoaXMuZmx1c2hlZCB8fFxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBpZ25vcmVzIGNsaWNrcyBvbiBkcmFnZ2FibGUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAoc2FmYXJpICYmIHRoaXMubWlnaHREcmFnICYmICF0aGlzLm1pZ2h0RHJhZy5ub2RlLmlzQXRvbSkgfHxcbiAgICAgICAgICAgICAgICAvLyBDaHJvbWUgd2lsbCBzb21ldGltZXMgdHJlYXQgYSBub2RlIHNlbGVjdGlvbiBhcyBhXG4gICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBidXQgc3RpbGwgcmVwb3J0IHRoYXQgdGhlIG5vZGUgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyB3aGVuIGFza2VkIHRocm91Z2ggZ2V0U2VsZWN0aW9uLiBZb3UnbGwgdGhlbiBnZXQgYVxuICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSBjbGlja2luZyBhdCB0aGUgcG9pbnQgd2hlcmUgdGhhdFxuICAgICAgICAgICAgICAgIC8vIChoaWRkZW4pIGN1cnNvciBpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2VsZWN0aW9uLCBhbmRcbiAgICAgICAgICAgICAgICAvLyB0aHVzIGRvZXNuJ3QgZ2V0IGEgcmVhY3Rpb24gZnJvbSBQcm9zZU1pcnJvci4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIHdvcmtzIGFyb3VuZCB0aGF0LlxuICAgICAgICAgICAgICAgIChjaHJvbWUgJiYgIXRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNYXRoLmFicyhwb3MucG9zIC0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tKSwgTWF0aC5hYnMocG9zLnBvcyAtIHRoaXMudmlldy5zdGF0ZS5zZWxlY3Rpb24udG8pKSA8PSAyKSkpIHtcbiAgICAgICAgICAgIHVwZGF0ZVNlbGVjdGlvbih0aGlzLnZpZXcsIFNlbGVjdGlvbi5uZWFyKHRoaXMudmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MucG9zKSksIFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRTZWxlY3Rpb25PcmlnaW4odGhpcy52aWV3LCBcInBvaW50ZXJcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZShldmVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUFsbG93RGVmYXVsdChldmVudCk7XG4gICAgICAgIHNldFNlbGVjdGlvbk9yaWdpbih0aGlzLnZpZXcsIFwicG9pbnRlclwiKTtcbiAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbnMgPT0gMClcbiAgICAgICAgICAgIHRoaXMuZG9uZSgpO1xuICAgIH1cbiAgICB1cGRhdGVBbGxvd0RlZmF1bHQoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93RGVmYXVsdCAmJiAoTWF0aC5hYnModGhpcy5ldmVudC54IC0gZXZlbnQuY2xpZW50WCkgPiA0IHx8XG4gICAgICAgICAgICBNYXRoLmFicyh0aGlzLmV2ZW50LnkgLSBldmVudC5jbGllbnRZKSA+IDQpKVxuICAgICAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSB0cnVlO1xuICAgIH1cbn1cbmhhbmRsZXJzLnRvdWNoc3RhcnQgPSB2aWV3ID0+IHtcbiAgICB2aWV3LmlucHV0Lmxhc3RUb3VjaCA9IERhdGUubm93KCk7XG4gICAgZm9yY2VET01GbHVzaCh2aWV3KTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLnRvdWNobW92ZSA9IHZpZXcgPT4ge1xuICAgIHZpZXcuaW5wdXQubGFzdFRvdWNoID0gRGF0ZS5ub3coKTtcbiAgICBzZXRTZWxlY3Rpb25PcmlnaW4odmlldywgXCJwb2ludGVyXCIpO1xufTtcbmhhbmRsZXJzLmNvbnRleHRtZW51ID0gdmlldyA9PiBmb3JjZURPTUZsdXNoKHZpZXcpO1xuZnVuY3Rpb24gaW5Pck5lYXJDb21wb3NpdGlvbih2aWV3LCBldmVudCkge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnN0dW0uZGUvMjAxNi8wNi8yNC9oYW5kbGluZy1pbWUtZXZlbnRzLWluLWphdmFzY3JpcHQvLlxuICAgIC8vIE9uIEphcGFuZXNlIGlucHV0IG1ldGhvZCBlZGl0b3JzIChJTUVzKSwgdGhlIEVudGVyIGtleSBpcyB1c2VkIHRvIGNvbmZpcm0gY2hhcmFjdGVyXG4gICAgLy8gc2VsZWN0aW9uLiBPbiBTYWZhcmksIHdoZW4gRW50ZXIgaXMgcHJlc3NlZCwgY29tcG9zaXRpb25lbmQgYW5kIGtleWRvd24gZXZlbnRzIGFyZVxuICAgIC8vIGVtaXR0ZWQuIFRoZSBrZXlkb3duIGV2ZW50IHRyaWdnZXJzIG5ld2xpbmUgaW5zZXJ0aW9uLCB3aGljaCB3ZSBkb24ndCB3YW50LlxuICAgIC8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUga2V5ZG93biBldmVudCBzaG91bGQgYmUgaWdub3JlZC5cbiAgICAvLyBXZSBvbmx5IGlnbm9yZSBpdCBvbmNlLCBhcyBwcmVzc2luZyBFbnRlciBhIHNlY29uZCB0aW1lICpzaG91bGQqIGluc2VydCBhIG5ld2xpbmUuXG4gICAgLy8gRnVydGhlcm1vcmUsIHRoZSBrZXlkb3duIGV2ZW50IHRpbWVzdGFtcCBtdXN0IGJlIGNsb3NlIHRvIHRoZSBjb21wb3NpdGlvbkVuZGVkQXQgdGltZXN0YW1wLlxuICAgIC8vIFRoaXMgZ3VhcmRzIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgY29tcG9zaXRpb25lbmQgaXMgdHJpZ2dlcmVkIHdpdGhvdXQgdGhlIGtleWJvYXJkXG4gICAgLy8gKGUuZy4gY2hhcmFjdGVyIGNvbmZpcm1hdGlvbiBtYXkgYmUgZG9uZSB3aXRoIHRoZSBtb3VzZSksIGFuZCBrZXlkb3duIGlzIHRyaWdnZXJlZFxuICAgIC8vIGFmdGVyd2FyZHMtIHdlIHdvdWxkbid0IHdhbnQgdG8gaWdub3JlIHRoZSBrZXlkb3duIGV2ZW50IGluIHRoaXMgY2FzZS5cbiAgICBpZiAoc2FmYXJpICYmIE1hdGguYWJzKGV2ZW50LnRpbWVTdGFtcCAtIHZpZXcuaW5wdXQuY29tcG9zaXRpb25FbmRlZEF0KSA8IDUwMCkge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IC0yZTg7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBEcm9wIGFjdGl2ZSBjb21wb3NpdGlvbiBhZnRlciA1IHNlY29uZHMgb2YgaW5hY3Rpdml0eSBvbiBBbmRyb2lkXG5jb25zdCB0aW1lb3V0Q29tcG9zaXRpb24gPSBhbmRyb2lkID8gNTAwMCA6IC0xO1xuZWRpdEhhbmRsZXJzLmNvbXBvc2l0aW9uc3RhcnQgPSBlZGl0SGFuZGxlcnMuY29tcG9zaXRpb251cGRhdGUgPSB2aWV3ID0+IHtcbiAgICBpZiAoIXZpZXcuY29tcG9zaW5nKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuZmx1c2goKTtcbiAgICAgICAgbGV0IHsgc3RhdGUgfSA9IHZpZXcsICRwb3MgPSBzdGF0ZS5zZWxlY3Rpb24uJHRvO1xuICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uIGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgKHN0YXRlLnN0b3JlZE1hcmtzIHx8XG4gICAgICAgICAgICAgICAgKCEkcG9zLnRleHRPZmZzZXQgJiYgJHBvcy5wYXJlbnRPZmZzZXQgJiYgJHBvcy5ub2RlQmVmb3JlLm1hcmtzLnNvbWUobSA9PiBtLnR5cGUuc3BlYy5pbmNsdXNpdmUgPT09IGZhbHNlKSkpKSB7XG4gICAgICAgICAgICAvLyBOZWVkIHRvIHdyYXAgdGhlIGN1cnNvciBpbiBtYXJrIG5vZGVzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmVzIGluIHRoZSBET00gY29udGV4dFxuICAgICAgICAgICAgdmlldy5tYXJrQ3Vyc29yID0gdmlldy5zdGF0ZS5zdG9yZWRNYXJrcyB8fCAkcG9zLm1hcmtzKCk7XG4gICAgICAgICAgICBlbmRDb21wb3NpdGlvbih2aWV3LCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcubWFya0N1cnNvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmRDb21wb3NpdGlvbih2aWV3LCAhc3RhdGUuc2VsZWN0aW9uLmVtcHR5KTtcbiAgICAgICAgICAgIC8vIEluIGZpcmVmb3gsIGlmIHRoZSBjdXJzb3IgaXMgYWZ0ZXIgYnV0IG91dHNpZGUgYSBtYXJrZWQgbm9kZSxcbiAgICAgICAgICAgIC8vIHRoZSBpbnNlcnRlZCB0ZXh0IHdvbid0IGluaGVyaXQgdGhlIG1hcmtzLiBTbyB0aGlzIG1vdmVzIGl0XG4gICAgICAgICAgICAvLyBpbnNpZGUgaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgICAgaWYgKGdlY2tvICYmIHN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiAkcG9zLnBhcmVudE9mZnNldCAmJiAhJHBvcy50ZXh0T2Zmc2V0ICYmICRwb3Mubm9kZUJlZm9yZS5tYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG5vZGUgPSBzZWwuZm9jdXNOb2RlLCBvZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQ7IG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PSAxICYmIG9mZnNldCAhPSAwOykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmVmb3JlID0gb2Zmc2V0IDwgMCA/IG5vZGUubGFzdENoaWxkIDogbm9kZS5jaGlsZE5vZGVzW29mZnNldCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJlZm9yZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlLm5vZGVUeXBlID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWwgPSB2aWV3LmRvbVNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwuY29sbGFwc2UoYmVmb3JlLCBiZWZvcmUubm9kZVZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBiZWZvcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IHRydWU7XG4gICAgfVxuICAgIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCB0aW1lb3V0Q29tcG9zaXRpb24pO1xufTtcbmVkaXRIYW5kbGVycy5jb21wb3NpdGlvbmVuZCA9ICh2aWV3LCBldmVudCkgPT4ge1xuICAgIGlmICh2aWV3LmNvbXBvc2luZykge1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uRW5kZWRBdCA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gdmlldy5kb21PYnNlcnZlci5wZW5kaW5nUmVjb3JkcygpLmxlbmd0aCA/IHZpZXcuaW5wdXQuY29tcG9zaXRpb25JRCA6IDA7XG4gICAgICAgIHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2RlID0gbnVsbDtcbiAgICAgICAgaWYgKHZpZXcuaW5wdXQuY29tcG9zaXRpb25QZW5kaW5nQ2hhbmdlcylcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdmlldy5kb21PYnNlcnZlci5mbHVzaCgpKTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbklEKys7XG4gICAgICAgIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCAyMCk7XG4gICAgfVxufTtcbmZ1bmN0aW9uIHNjaGVkdWxlQ29tcG9zZUVuZCh2aWV3LCBkZWxheSkge1xuICAgIGNsZWFyVGltZW91dCh2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQpO1xuICAgIGlmIChkZWxheSA+IC0xKVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2luZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGVuZENvbXBvc2l0aW9uKHZpZXcpLCBkZWxheSk7XG59XG5mdW5jdGlvbiBjbGVhckNvbXBvc2l0aW9uKHZpZXcpIHtcbiAgICBpZiAodmlldy5jb21wb3NpbmcpIHtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmlldy5pbnB1dC5jb21wb3NpdGlvbkVuZGVkQXQgPSB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKTtcbiAgICB9XG4gICAgd2hpbGUgKHZpZXcuaW5wdXQuY29tcG9zaXRpb25Ob2Rlcy5sZW5ndGggPiAwKVxuICAgICAgICB2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZXMucG9wKCkubWFya1BhcmVudHNEaXJ0eSgpO1xufVxuZnVuY3Rpb24gZmluZENvbXBvc2l0aW9uTm9kZSh2aWV3KSB7XG4gICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGxldCB0ZXh0QmVmb3JlID0gdGV4dE5vZGVCZWZvcmUkMShzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpO1xuICAgIGxldCB0ZXh0QWZ0ZXIgPSB0ZXh0Tm9kZUFmdGVyJDEoc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KTtcbiAgICBpZiAodGV4dEJlZm9yZSAmJiB0ZXh0QWZ0ZXIgJiYgdGV4dEJlZm9yZSAhPSB0ZXh0QWZ0ZXIpIHtcbiAgICAgICAgbGV0IGRlc2NBZnRlciA9IHRleHRBZnRlci5wbVZpZXdEZXNjLCBsYXN0Q2hhbmdlZCA9IHZpZXcuZG9tT2JzZXJ2ZXIubGFzdENoYW5nZWRUZXh0Tm9kZTtcbiAgICAgICAgaWYgKHRleHRCZWZvcmUgPT0gbGFzdENoYW5nZWQgfHwgdGV4dEFmdGVyID09IGxhc3RDaGFuZ2VkKVxuICAgICAgICAgICAgcmV0dXJuIGxhc3RDaGFuZ2VkO1xuICAgICAgICBpZiAoIWRlc2NBZnRlciB8fCAhZGVzY0FmdGVyLmlzVGV4dCh0ZXh0QWZ0ZXIubm9kZVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2aWV3LmlucHV0LmNvbXBvc2l0aW9uTm9kZSA9PSB0ZXh0QWZ0ZXIpIHtcbiAgICAgICAgICAgIGxldCBkZXNjQmVmb3JlID0gdGV4dEJlZm9yZS5wbVZpZXdEZXNjO1xuICAgICAgICAgICAgaWYgKCEoIWRlc2NCZWZvcmUgfHwgIWRlc2NCZWZvcmUuaXNUZXh0KHRleHRCZWZvcmUubm9kZVZhbHVlKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRBZnRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dEJlZm9yZSB8fCB0ZXh0QWZ0ZXI7XG59XG5mdW5jdGlvbiB0aW1lc3RhbXBGcm9tQ3VzdG9tRXZlbnQoKSB7XG4gICAgbGV0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBldmVudC5pbml0RXZlbnQoXCJldmVudFwiLCB0cnVlLCB0cnVlKTtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wO1xufVxuLyoqXG5AaW50ZXJuYWxcbiovXG5mdW5jdGlvbiBlbmRDb21wb3NpdGlvbih2aWV3LCByZXN0YXJ0aW5nID0gZmFsc2UpIHtcbiAgICBpZiAoYW5kcm9pZCAmJiB2aWV3LmRvbU9ic2VydmVyLmZsdXNoaW5nU29vbiA+PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmlldy5kb21PYnNlcnZlci5mb3JjZUZsdXNoKCk7XG4gICAgY2xlYXJDb21wb3NpdGlvbih2aWV3KTtcbiAgICBpZiAocmVzdGFydGluZyB8fCB2aWV3LmRvY1ZpZXcgJiYgdmlldy5kb2NWaWV3LmRpcnR5KSB7XG4gICAgICAgIGxldCBzZWwgPSBzZWxlY3Rpb25Gcm9tRE9NKHZpZXcpLCBjdXIgPSB2aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICAgICAgaWYgKHNlbCAmJiAhc2VsLmVxKGN1cikpXG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuc2V0U2VsZWN0aW9uKHNlbCkpO1xuICAgICAgICBlbHNlIGlmICgodmlldy5tYXJrQ3Vyc29yIHx8IHJlc3RhcnRpbmcpICYmICFjdXIuJGZyb20ubm9kZShjdXIuJGZyb20uc2hhcmVkRGVwdGgoY3VyLnRvKSkuaW5saW5lQ29udGVudClcbiAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5kZWxldGVTZWxlY3Rpb24oKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHZpZXcudXBkYXRlU3RhdGUodmlldy5zdGF0ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjYXB0dXJlQ29weSh2aWV3LCBkb20pIHtcbiAgICAvLyBUaGUgZXh0cmEgd3JhcHBlciBpcyBzb21laG93IG5lY2Vzc2FyeSBvbiBJRS9FZGdlIHRvIHByZXZlbnQgdGhlXG4gICAgLy8gY29udGVudCBmcm9tIGJlaW5nIG1hbmdsZWQgd2hlbiBpdCBpcyBwdXQgb250byB0aGUgY2xpcGJvYXJkXG4gICAgaWYgKCF2aWV3LmRvbS5wYXJlbnROb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IHdyYXAgPSB2aWV3LmRvbS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIHdyYXAuYXBwZW5kQ2hpbGQoZG9tKTtcbiAgICB3cmFwLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogLTEwMDAwcHg7IHRvcDogMTBweFwiO1xuICAgIGxldCBzZWwgPSBnZXRTZWxlY3Rpb24oKSwgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhkb20pO1xuICAgIC8vIERvbmUgYmVjYXVzZSBJRSB3aWxsIGZpcmUgYSBzZWxlY3Rpb25jaGFuZ2UgbW92aW5nIHRoZSBzZWxlY3Rpb25cbiAgICAvLyB0byBpdHMgc3RhcnQgd2hlbiByZW1vdmVBbGxSYW5nZXMgaXMgY2FsbGVkIGFuZCB0aGUgZWRpdG9yIHN0aWxsXG4gICAgLy8gaGFzIGZvY3VzICh3aGljaCB3aWxsIG1lc3MgdXAgdGhlIGVkaXRvcidzIHNlbGVjdGlvbiBzdGF0ZSkuXG4gICAgdmlldy5kb20uYmx1cigpO1xuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAod3JhcC5wYXJlbnROb2RlKVxuICAgICAgICAgICAgd3JhcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXApO1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgfSwgNTApO1xufVxuLy8gVGhpcyBpcyB2ZXJ5IGNydWRlLCBidXQgdW5mb3J0dW5hdGVseSBib3RoIHRoZXNlIGJyb3dzZXJzIF9wcmV0ZW5kX1xuLy8gdGhhdCB0aGV5IGhhdmUgYSBjbGlwYm9hcmQgQVBJ4oCUYWxsIHRoZSBvYmplY3RzIGFuZCBtZXRob2RzIGFyZVxuLy8gdGhlcmUsIHRoZXkganVzdCBkb24ndCB3b3JrLCBhbmQgdGhleSBhcmUgaGFyZCB0byB0ZXN0LlxuY29uc3QgYnJva2VuQ2xpcGJvYXJkQVBJID0gKGllICYmIGllX3ZlcnNpb24gPCAxNSkgfHxcbiAgICAoaW9zICYmIHdlYmtpdF92ZXJzaW9uIDwgNjA0KTtcbmhhbmRsZXJzLmNvcHkgPSBlZGl0SGFuZGxlcnMuY3V0ID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24sIGN1dCA9IGV2ZW50LnR5cGUgPT0gXCJjdXRcIjtcbiAgICBpZiAoc2VsLmVtcHR5KVxuICAgICAgICByZXR1cm47XG4gICAgLy8gSUUgYW5kIEVkZ2UncyBjbGlwYm9hcmQgaW50ZXJmYWNlIGlzIGNvbXBsZXRlbHkgYnJva2VuXG4gICAgbGV0IGRhdGEgPSBicm9rZW5DbGlwYm9hcmRBUEkgPyBudWxsIDogZXZlbnQuY2xpcGJvYXJkRGF0YTtcbiAgICBsZXQgc2xpY2UgPSBzZWwuY29udGVudCgpLCB7IGRvbSwgdGV4dCB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIHNsaWNlKTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBkYXRhLmNsZWFyRGF0YSgpO1xuICAgICAgICBkYXRhLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgZG9tLmlubmVySFRNTCk7XG4gICAgICAgIGRhdGEuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjYXB0dXJlQ29weSh2aWV3LCBkb20pO1xuICAgIH1cbiAgICBpZiAoY3V0KVxuICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlU2VsZWN0aW9uKCkuc2Nyb2xsSW50b1ZpZXcoKS5zZXRNZXRhKFwidWlFdmVudFwiLCBcImN1dFwiKSk7XG59O1xuZnVuY3Rpb24gc2xpY2VTaW5nbGVOb2RlKHNsaWNlKSB7XG4gICAgcmV0dXJuIHNsaWNlLm9wZW5TdGFydCA9PSAwICYmIHNsaWNlLm9wZW5FbmQgPT0gMCAmJiBzbGljZS5jb250ZW50LmNoaWxkQ291bnQgPT0gMSA/IHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCA6IG51bGw7XG59XG5mdW5jdGlvbiBjYXB0dXJlUGFzdGUodmlldywgZXZlbnQpIHtcbiAgICBpZiAoIXZpZXcuZG9tLnBhcmVudE5vZGUpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgcGxhaW5UZXh0ID0gdmlldy5pbnB1dC5zaGlmdEtleSB8fCB2aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQudHlwZS5zcGVjLmNvZGU7XG4gICAgbGV0IHRhcmdldCA9IHZpZXcuZG9tLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChwbGFpblRleHQgPyBcInRleHRhcmVhXCIgOiBcImRpdlwiKSk7XG4gICAgaWYgKCFwbGFpblRleHQpXG4gICAgICAgIHRhcmdldC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB0YXJnZXQuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAtMTAwMDBweDsgdG9wOiAxMHB4XCI7XG4gICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgbGV0IHBsYWluID0gdmlldy5pbnB1dC5zaGlmdEtleSAmJiB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlICE9IDQ1O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2aWV3LmZvY3VzKCk7XG4gICAgICAgIGlmICh0YXJnZXQucGFyZW50Tm9kZSlcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldCk7XG4gICAgICAgIGlmIChwbGFpblRleHQpXG4gICAgICAgICAgICBkb1Bhc3RlKHZpZXcsIHRhcmdldC52YWx1ZSwgbnVsbCwgcGxhaW4sIGV2ZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9QYXN0ZSh2aWV3LCB0YXJnZXQudGV4dENvbnRlbnQsIHRhcmdldC5pbm5lckhUTUwsIHBsYWluLCBldmVudCk7XG4gICAgfSwgNTApO1xufVxuZnVuY3Rpb24gZG9QYXN0ZSh2aWV3LCB0ZXh0LCBodG1sLCBwcmVmZXJQbGFpbiwgZXZlbnQpIHtcbiAgICBsZXQgc2xpY2UgPSBwYXJzZUZyb21DbGlwYm9hcmQodmlldywgdGV4dCwgaHRtbCwgcHJlZmVyUGxhaW4sIHZpZXcuc3RhdGUuc2VsZWN0aW9uLiRmcm9tKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZVBhc3RlXCIsIGYgPT4gZih2aWV3LCBldmVudCwgc2xpY2UgfHwgU2xpY2UuZW1wdHkpKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBzaW5nbGVOb2RlID0gc2xpY2VTaW5nbGVOb2RlKHNsaWNlKTtcbiAgICBsZXQgdHIgPSBzaW5nbGVOb2RlXG4gICAgICAgID8gdmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChzaW5nbGVOb2RlLCBwcmVmZXJQbGFpbilcbiAgICAgICAgOiB2aWV3LnN0YXRlLnRyLnJlcGxhY2VTZWxlY3Rpb24oc2xpY2UpO1xuICAgIHZpZXcuZGlzcGF0Y2godHIuc2Nyb2xsSW50b1ZpZXcoKS5zZXRNZXRhKFwicGFzdGVcIiwgdHJ1ZSkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJwYXN0ZVwiKSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRUZXh0KGNsaXBib2FyZERhdGEpIHtcbiAgICBsZXQgdGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcbiAgICBpZiAodGV4dClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgbGV0IHVyaXMgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3VyaS1saXN0XCIpO1xuICAgIHJldHVybiB1cmlzID8gdXJpcy5yZXBsYWNlKC9cXHI/XFxuL2csIFwiIFwiKSA6IFwiXCI7XG59XG5lZGl0SGFuZGxlcnMucGFzdGUgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIEhhbmRsaW5nIHBhc3RlIGZyb20gSmF2YVNjcmlwdCBkdXJpbmcgY29tcG9zaXRpb24gaXMgdmVyeSBwb29ybHlcbiAgICAvLyBoYW5kbGVkIGJ5IGJyb3dzZXJzLCBzbyBhcyBhIGRvZGd5IGJ1dCBwcmVmZXJhYmxlIGtsdWRnZSwgd2UganVzdFxuICAgIC8vIGxldCB0aGUgYnJvd3NlciBkbyBpdHMgbmF0aXZlIHRoaW5nIHRoZXJlLCBleGNlcHQgb24gQW5kcm9pZCxcbiAgICAvLyB3aGVyZSB0aGUgZWRpdG9yIGlzIGFsbW9zdCBhbHdheXMgY29tcG9zaW5nLlxuICAgIGlmICh2aWV3LmNvbXBvc2luZyAmJiAhYW5kcm9pZClcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCBkYXRhID0gYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmNsaXBib2FyZERhdGE7XG4gICAgbGV0IHBsYWluID0gdmlldy5pbnB1dC5zaGlmdEtleSAmJiB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlICE9IDQ1O1xuICAgIGlmIChkYXRhICYmIGRvUGFzdGUodmlldywgZ2V0VGV4dChkYXRhKSwgZGF0YS5nZXREYXRhKFwidGV4dC9odG1sXCIpLCBwbGFpbiwgZXZlbnQpKVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGVsc2VcbiAgICAgICAgY2FwdHVyZVBhc3RlKHZpZXcsIGV2ZW50KTtcbn07XG5jbGFzcyBEcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3Ioc2xpY2UsIG1vdmUsIG5vZGUpIHtcbiAgICAgICAgdGhpcy5zbGljZSA9IHNsaWNlO1xuICAgICAgICB0aGlzLm1vdmUgPSBtb3ZlO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbn1cbmNvbnN0IGRyYWdDb3B5TW9kaWZpZXIgPSBtYWMgPyBcImFsdEtleVwiIDogXCJjdHJsS2V5XCI7XG5mdW5jdGlvbiBkcmFnTW92ZXModmlldywgZXZlbnQpIHtcbiAgICBsZXQgbW92ZXMgPSB2aWV3LnNvbWVQcm9wKFwiZHJhZ0NvcGllc1wiLCB0ZXN0ID0+ICF0ZXN0KGV2ZW50KSk7XG4gICAgcmV0dXJuIG1vdmVzICE9IG51bGwgPyBtb3ZlcyA6ICFldmVudFtkcmFnQ29weU1vZGlmaWVyXTtcbn1cbmhhbmRsZXJzLmRyYWdzdGFydCA9ICh2aWV3LCBfZXZlbnQpID0+IHtcbiAgICBsZXQgZXZlbnQgPSBfZXZlbnQ7XG4gICAgbGV0IG1vdXNlRG93biA9IHZpZXcuaW5wdXQubW91c2VEb3duO1xuICAgIGlmIChtb3VzZURvd24pXG4gICAgICAgIG1vdXNlRG93bi5kb25lKCk7XG4gICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgc2VsID0gdmlldy5zdGF0ZS5zZWxlY3Rpb247XG4gICAgbGV0IHBvcyA9IHNlbC5lbXB0eSA/IG51bGwgOiB2aWV3LnBvc0F0Q29vcmRzKGV2ZW50Q29vcmRzKGV2ZW50KSk7XG4gICAgbGV0IG5vZGU7XG4gICAgaWYgKHBvcyAmJiBwb3MucG9zID49IHNlbC5mcm9tICYmIHBvcy5wb3MgPD0gKHNlbCBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24gPyBzZWwudG8gLSAxIDogc2VsLnRvKSkgO1xuICAgIGVsc2UgaWYgKG1vdXNlRG93biAmJiBtb3VzZURvd24ubWlnaHREcmFnKSB7XG4gICAgICAgIG5vZGUgPSBOb2RlU2VsZWN0aW9uLmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgbW91c2VEb3duLm1pZ2h0RHJhZy5wb3MpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoZXZlbnQudGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5ub2RlLnR5cGUuc3BlYy5kcmFnZ2FibGUgJiYgZGVzYyAhPSB2aWV3LmRvY1ZpZXcpXG4gICAgICAgICAgICBub2RlID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodmlldy5zdGF0ZS5kb2MsIGRlc2MucG9zQmVmb3JlKTtcbiAgICB9XG4gICAgbGV0IGRyYWdnZWRTbGljZSA9IChub2RlIHx8IHZpZXcuc3RhdGUuc2VsZWN0aW9uKS5jb250ZW50KCk7XG4gICAgbGV0IHsgZG9tLCB0ZXh0LCBzbGljZSB9ID0gc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHZpZXcsIGRyYWdnZWRTbGljZSk7XG4gICAgLy8gUHJlLTEyMCBDaHJvbWUgdmVyc2lvbnMgY2xlYXIgZmlsZXMgd2hlbiBjYWxsaW5nIGBjbGVhckRhdGFgICgjMTQ3MilcbiAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggfHwgIWNocm9tZSB8fCBjaHJvbWVfdmVyc2lvbiA+IDEyMClcbiAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmNsZWFyRGF0YSgpO1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKGJyb2tlbkNsaXBib2FyZEFQSSA/IFwiVGV4dFwiIDogXCJ0ZXh0L2h0bWxcIiwgZG9tLmlubmVySFRNTCk7XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci9pc3N1ZXMvMTE1NlxuICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJjb3B5TW92ZVwiO1xuICAgIGlmICghYnJva2VuQ2xpcGJvYXJkQVBJKVxuICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGV4dCk7XG4gICAgdmlldy5kcmFnZ2luZyA9IG5ldyBEcmFnZ2luZyhzbGljZSwgZHJhZ01vdmVzKHZpZXcsIGV2ZW50KSwgbm9kZSk7XG59O1xuaGFuZGxlcnMuZHJhZ2VuZCA9IHZpZXcgPT4ge1xuICAgIGxldCBkcmFnZ2luZyA9IHZpZXcuZHJhZ2dpbmc7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodmlldy5kcmFnZ2luZyA9PSBkcmFnZ2luZylcbiAgICAgICAgICAgIHZpZXcuZHJhZ2dpbmcgPSBudWxsO1xuICAgIH0sIDUwKTtcbn07XG5lZGl0SGFuZGxlcnMuZHJhZ292ZXIgPSBlZGl0SGFuZGxlcnMuZHJhZ2VudGVyID0gKF8sIGUpID0+IGUucHJldmVudERlZmF1bHQoKTtcbmVkaXRIYW5kbGVycy5kcm9wID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBsZXQgZHJhZ2dpbmcgPSB2aWV3LmRyYWdnaW5nO1xuICAgIHZpZXcuZHJhZ2dpbmcgPSBudWxsO1xuICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKVxuICAgICAgICByZXR1cm47XG4gICAgbGV0IGV2ZW50UG9zID0gdmlldy5wb3NBdENvb3JkcyhldmVudENvb3JkcyhldmVudCkpO1xuICAgIGlmICghZXZlbnRQb3MpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgJG1vdXNlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShldmVudFBvcy5wb3MpO1xuICAgIGxldCBzbGljZSA9IGRyYWdnaW5nICYmIGRyYWdnaW5nLnNsaWNlO1xuICAgIGlmIChzbGljZSkge1xuICAgICAgICB2aWV3LnNvbWVQcm9wKFwidHJhbnNmb3JtUGFzdGVkXCIsIGYgPT4geyBzbGljZSA9IGYoc2xpY2UsIHZpZXcpOyB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNsaWNlID0gcGFyc2VGcm9tQ2xpcGJvYXJkKHZpZXcsIGdldFRleHQoZXZlbnQuZGF0YVRyYW5zZmVyKSwgYnJva2VuQ2xpcGJvYXJkQVBJID8gbnVsbCA6IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dC9odG1sXCIpLCBmYWxzZSwgJG1vdXNlKTtcbiAgICB9XG4gICAgbGV0IG1vdmUgPSAhIShkcmFnZ2luZyAmJiBkcmFnTW92ZXModmlldywgZXZlbnQpKTtcbiAgICBpZiAodmlldy5zb21lUHJvcChcImhhbmRsZURyb3BcIiwgZiA9PiBmKHZpZXcsIGV2ZW50LCBzbGljZSB8fCBTbGljZS5lbXB0eSwgbW92ZSkpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzbGljZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IGluc2VydFBvcyA9IHNsaWNlID8gZHJvcFBvaW50KHZpZXcuc3RhdGUuZG9jLCAkbW91c2UucG9zLCBzbGljZSkgOiAkbW91c2UucG9zO1xuICAgIGlmIChpbnNlcnRQb3MgPT0gbnVsbClcbiAgICAgICAgaW5zZXJ0UG9zID0gJG1vdXNlLnBvcztcbiAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyO1xuICAgIGlmIChtb3ZlKSB7XG4gICAgICAgIGxldCB7IG5vZGUgfSA9IGRyYWdnaW5nO1xuICAgICAgICBpZiAobm9kZSlcbiAgICAgICAgICAgIG5vZGUucmVwbGFjZSh0cik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRyLmRlbGV0ZVNlbGVjdGlvbigpO1xuICAgIH1cbiAgICBsZXQgcG9zID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICBsZXQgaXNOb2RlID0gc2xpY2Uub3BlblN0YXJ0ID09IDAgJiYgc2xpY2Uub3BlbkVuZCA9PSAwICYmIHNsaWNlLmNvbnRlbnQuY2hpbGRDb3VudCA9PSAxO1xuICAgIGxldCBiZWZvcmVJbnNlcnQgPSB0ci5kb2M7XG4gICAgaWYgKGlzTm9kZSlcbiAgICAgICAgdHIucmVwbGFjZVJhbmdlV2l0aChwb3MsIHBvcywgc2xpY2UuY29udGVudC5maXJzdENoaWxkKTtcbiAgICBlbHNlXG4gICAgICAgIHRyLnJlcGxhY2VSYW5nZShwb3MsIHBvcywgc2xpY2UpO1xuICAgIGlmICh0ci5kb2MuZXEoYmVmb3JlSW5zZXJ0KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGxldCAkcG9zID0gdHIuZG9jLnJlc29sdmUocG9zKTtcbiAgICBpZiAoaXNOb2RlICYmIE5vZGVTZWxlY3Rpb24uaXNTZWxlY3RhYmxlKHNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZCkgJiZcbiAgICAgICAgJHBvcy5ub2RlQWZ0ZXIgJiYgJHBvcy5ub2RlQWZ0ZXIuc2FtZU1hcmt1cChzbGljZS5jb250ZW50LmZpcnN0Q2hpbGQpKSB7XG4gICAgICAgIHRyLnNldFNlbGVjdGlvbihuZXcgTm9kZVNlbGVjdGlvbigkcG9zKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsZXQgZW5kID0gdHIubWFwcGluZy5tYXAoaW5zZXJ0UG9zKTtcbiAgICAgICAgdHIubWFwcGluZy5tYXBzW3RyLm1hcHBpbmcubWFwcy5sZW5ndGggLSAxXS5mb3JFYWNoKChfZnJvbSwgX3RvLCBfbmV3RnJvbSwgbmV3VG8pID0+IGVuZCA9IG5ld1RvKTtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkJldHdlZW4odmlldywgJHBvcywgdHIuZG9jLnJlc29sdmUoZW5kKSkpO1xuICAgIH1cbiAgICB2aWV3LmZvY3VzKCk7XG4gICAgdmlldy5kaXNwYXRjaCh0ci5zZXRNZXRhKFwidWlFdmVudFwiLCBcImRyb3BcIikpO1xufTtcbmhhbmRsZXJzLmZvY3VzID0gdmlldyA9PiB7XG4gICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSBEYXRlLm5vdygpO1xuICAgIGlmICghdmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QuYWRkKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh2aWV3LmRvY1ZpZXcgJiYgdmlldy5oYXNGb2N1cygpICYmICF2aWV3LmRvbU9ic2VydmVyLmN1cnJlbnRTZWxlY3Rpb24uZXEodmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKSlcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh2aWV3KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbn07XG5oYW5kbGVycy5ibHVyID0gKHZpZXcsIF9ldmVudCkgPT4ge1xuICAgIGxldCBldmVudCA9IF9ldmVudDtcbiAgICBpZiAodmlldy5mb2N1c2VkKSB7XG4gICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuc3RvcCgpO1xuICAgICAgICB2aWV3LmRvbS5jbGFzc0xpc3QucmVtb3ZlKFwiUHJvc2VNaXJyb3ItZm9jdXNlZFwiKTtcbiAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdGFydCgpO1xuICAgICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAmJiB2aWV3LmRvbS5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSlcbiAgICAgICAgICAgIHZpZXcuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB2aWV3LmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG59O1xuaGFuZGxlcnMuYmVmb3JlaW5wdXQgPSAodmlldywgX2V2ZW50KSA9PiB7XG4gICAgbGV0IGV2ZW50ID0gX2V2ZW50O1xuICAgIC8vIFdlIHNob3VsZCBwcm9iYWJseSBkbyBtb3JlIHdpdGggYmVmb3JlaW5wdXQgZXZlbnRzLCBidXQgc3VwcG9ydFxuICAgIC8vIGlzIHNvIHNwb3R0eSB0aGF0IEknbSBzdGlsbCB3YWl0aW5nIHRvIHNlZSB3aGVyZSB0aGV5IGFyZSBnb2luZy5cbiAgICAvLyBWZXJ5IHNwZWNpZmljIGhhY2sgdG8gZGVhbCB3aXRoIGJhY2tzcGFjZSBzb21ldGltZXMgZmFpbGluZyBvblxuICAgIC8vIENocm9tZSBBbmRyb2lkIHdoZW4gYWZ0ZXIgYW4gdW5lZGl0YWJsZSBub2RlLlxuICAgIGlmIChjaHJvbWUgJiYgYW5kcm9pZCAmJiBldmVudC5pbnB1dFR5cGUgPT0gXCJkZWxldGVDb250ZW50QmFja3dhcmRcIikge1xuICAgICAgICB2aWV3LmRvbU9ic2VydmVyLmZsdXNoU29vbigpO1xuICAgICAgICBsZXQgeyBkb21DaGFuZ2VDb3VudCB9ID0gdmlldy5pbnB1dDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCAhPSBkb21DaGFuZ2VDb3VudClcbiAgICAgICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGFscmVhZHkgaGFkIHNvbWUgZWZmZWN0XG4gICAgICAgICAgICAvLyBUaGlzIGJ1ZyB0ZW5kcyB0byBjbG9zZSB0aGUgdmlydHVhbCBrZXlib2FyZCwgc28gd2UgcmVmb2N1c1xuICAgICAgICAgICAgdmlldy5kb20uYmx1cigpO1xuICAgICAgICAgICAgdmlldy5mb2N1cygpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVLZXlEb3duXCIsIGYgPT4gZih2aWV3LCBrZXlFdmVudCg4LCBcIkJhY2tzcGFjZVwiKSkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCB7ICRjdXJzb3IgfSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgLy8gQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiBiYWNrc3BhY2UgYmVoYXZpb3Igd2hlbiBubyBjb21tYW5kIGhhbmRsZWQgaXRcbiAgICAgICAgICAgIGlmICgkY3Vyc29yICYmICRjdXJzb3IucG9zID4gMClcbiAgICAgICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIuZGVsZXRlKCRjdXJzb3IucG9zIC0gMSwgJGN1cnNvci5wb3MpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICB9LCA1MCk7XG4gICAgfVxufTtcbi8vIE1ha2Ugc3VyZSBhbGwgaGFuZGxlcnMgZ2V0IHJlZ2lzdGVyZWRcbmZvciAobGV0IHByb3AgaW4gZWRpdEhhbmRsZXJzKVxuICAgIGhhbmRsZXJzW3Byb3BdID0gZWRpdEhhbmRsZXJzW3Byb3BdO1xuXG5mdW5jdGlvbiBjb21wYXJlT2JqcyhhLCBiKSB7XG4gICAgaWYgKGEgPT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgZm9yIChsZXQgcCBpbiBhKVxuICAgICAgICBpZiAoYVtwXSAhPT0gYltwXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBwIGluIGIpXG4gICAgICAgIGlmICghKHAgaW4gYSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5jbGFzcyBXaWRnZXRUeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcih0b0RPTSwgc3BlYykge1xuICAgICAgICB0aGlzLnRvRE9NID0gdG9ET007XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgICAgICB0aGlzLnNpZGUgPSB0aGlzLnNwZWMuc2lkZSB8fCAwO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IHsgcG9zLCBkZWxldGVkIH0gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIHRoaXMuc2lkZSA8IDAgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gZGVsZXRlZCA/IG51bGwgOiBuZXcgRGVjb3JhdGlvbihwb3MgLSBvZmZzZXQsIHBvcyAtIG9mZnNldCwgdGhpcyk7XG4gICAgfVxuICAgIHZhbGlkKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBXaWRnZXRUeXBlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuc3BlYy5rZXkgJiYgdGhpcy5zcGVjLmtleSA9PSBvdGhlci5zcGVjLmtleSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvRE9NID09IG90aGVyLnRvRE9NICYmIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpKTtcbiAgICB9XG4gICAgZGVzdHJveShub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnNwZWMuZGVzdHJveSlcbiAgICAgICAgICAgIHRoaXMuc3BlYy5kZXN0cm95KG5vZGUpO1xuICAgIH1cbn1cbmNsYXNzIElubGluZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5zcGVjID0gc3BlYyB8fCBub1NwZWM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBzcGFuLCBvZmZzZXQsIG9sZE9mZnNldCkge1xuICAgICAgICBsZXQgZnJvbSA9IG1hcHBpbmcubWFwKHNwYW4uZnJvbSArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZVN0YXJ0ID8gLTEgOiAxKSAtIG9mZnNldDtcbiAgICAgICAgbGV0IHRvID0gbWFwcGluZy5tYXAoc3Bhbi50byArIG9sZE9mZnNldCwgdGhpcy5zcGVjLmluY2x1c2l2ZUVuZCA/IDEgOiAtMSkgLSBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBmcm9tID49IHRvID8gbnVsbCA6IG5ldyBEZWNvcmF0aW9uKGZyb20sIHRvLCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQoXywgc3BhbikgeyByZXR1cm4gc3Bhbi5mcm9tIDwgc3Bhbi50bzsgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzID09IG90aGVyIHx8XG4gICAgICAgICAgICAob3RoZXIgaW5zdGFuY2VvZiBJbmxpbmVUeXBlICYmIGNvbXBhcmVPYmpzKHRoaXMuYXR0cnMsIG90aGVyLmF0dHJzKSAmJlxuICAgICAgICAgICAgICAgIGNvbXBhcmVPYmpzKHRoaXMuc3BlYywgb3RoZXIuc3BlYykpO1xuICAgIH1cbiAgICBzdGF0aWMgaXMoc3BhbikgeyByZXR1cm4gc3Bhbi50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbmNsYXNzIE5vZGVUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihhdHRycywgc3BlYykge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMuc3BlYyA9IHNwZWMgfHwgbm9TcGVjO1xuICAgIH1cbiAgICBtYXAobWFwcGluZywgc3Bhbiwgb2Zmc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgbGV0IGZyb20gPSBtYXBwaW5nLm1hcFJlc3VsdChzcGFuLmZyb20gKyBvbGRPZmZzZXQsIDEpO1xuICAgICAgICBpZiAoZnJvbS5kZWxldGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCB0byA9IG1hcHBpbmcubWFwUmVzdWx0KHNwYW4udG8gKyBvbGRPZmZzZXQsIC0xKTtcbiAgICAgICAgaWYgKHRvLmRlbGV0ZWQgfHwgdG8ucG9zIDw9IGZyb20ucG9zKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLnBvcyAtIG9mZnNldCwgdG8ucG9zIC0gb2Zmc2V0LCB0aGlzKTtcbiAgICB9XG4gICAgdmFsaWQobm9kZSwgc3Bhbikge1xuICAgICAgICBsZXQgeyBpbmRleCwgb2Zmc2V0IH0gPSBub2RlLmNvbnRlbnQuZmluZEluZGV4KHNwYW4uZnJvbSksIGNoaWxkO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ID09IHNwYW4uZnJvbSAmJiAhKGNoaWxkID0gbm9kZS5jaGlsZChpbmRleCkpLmlzVGV4dCAmJiBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZSA9PSBzcGFuLnRvO1xuICAgIH1cbiAgICBlcShvdGhlcikge1xuICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fFxuICAgICAgICAgICAgKG90aGVyIGluc3RhbmNlb2YgTm9kZVR5cGUgJiYgY29tcGFyZU9ianModGhpcy5hdHRycywgb3RoZXIuYXR0cnMpICYmXG4gICAgICAgICAgICAgICAgY29tcGFyZU9ianModGhpcy5zcGVjLCBvdGhlci5zcGVjKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7IH1cbn1cbi8qKlxuRGVjb3JhdGlvbiBvYmplY3RzIGNhbiBiZSBwcm92aWRlZCB0byB0aGUgdmlldyB0aHJvdWdoIHRoZVxuW2BkZWNvcmF0aW9uc2AgcHJvcF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuZGVjb3JhdGlvbnMpLiBUaGV5IGNvbWUgaW5cbnNldmVyYWwgdmFyaWFudHPigJRzZWUgdGhlIHN0YXRpYyBtZW1iZXJzIG9mIHRoaXMgY2xhc3MgZm9yIGRldGFpbHMuXG4qL1xuY2xhc3MgRGVjb3JhdGlvbiB7XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGRlY29yYXRpb24uXG4gICAgKi9cbiAgICBmcm9tLCBcbiAgICAvKipcbiAgICBUaGUgZW5kIHBvc2l0aW9uLiBXaWxsIGJlIHRoZSBzYW1lIGFzIGBmcm9tYCBmb3IgW3dpZGdldFxuICAgIGRlY29yYXRpb25zXShodHRwczovL3Byb3NlbWlycm9yLm5ldC9kb2NzL3JlZi8jdmlldy5EZWNvcmF0aW9uXndpZGdldCkuXG4gICAgKi9cbiAgICB0bywgXG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICB0eXBlKSB7XG4gICAgICAgIHRoaXMuZnJvbSA9IGZyb207XG4gICAgICAgIHRoaXMudG8gPSB0bztcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBjb3B5KGZyb20sIHRvKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgdGhpcy50eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlciwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmVxKG90aGVyLnR5cGUpICYmIHRoaXMuZnJvbSArIG9mZnNldCA9PSBvdGhlci5mcm9tICYmIHRoaXMudG8gKyBvZmZzZXQgPT0gb3RoZXIudG87XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgbWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUubWFwKG1hcHBpbmcsIHRoaXMsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIHdpZGdldCBkZWNvcmF0aW9uLCB3aGljaCBpcyBhIERPTSBub2RlIHRoYXQncyBzaG93biBpblxuICAgIHRoZSBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91XG4gICAgZGVsYXkgcmVuZGVyaW5nIHRoZSB3aWRnZXQgYnkgcGFzc2luZyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZVxuICAgIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgYWN0dWFsbHkgZHJhd24gaW4gYSB2aWV3LCBidXQgeW91IGNhblxuICAgIGFsc28gZGlyZWN0bHkgcGFzcyBhIERPTSBub2RlLiBgZ2V0UG9zYCBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZVxuICAgIHdpZGdldCdzIGN1cnJlbnQgZG9jdW1lbnQgcG9zaXRpb24uXG4gICAgKi9cbiAgICBzdGF0aWMgd2lkZ2V0KHBvcywgdG9ET00sIHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uKHBvcywgcG9zLCBuZXcgV2lkZ2V0VHlwZSh0b0RPTSwgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGVzIGFuIGlubGluZSBkZWNvcmF0aW9uLCB3aGljaCBhZGRzIHRoZSBnaXZlbiBhdHRyaWJ1dGVzIHRvXG4gICAgZWFjaCBpbmxpbmUgbm9kZSBiZXR3ZWVuIGBmcm9tYCBhbmQgYHRvYC5cbiAgICAqL1xuICAgIHN0YXRpYyBpbmxpbmUoZnJvbSwgdG8sIGF0dHJzLCBzcGVjKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjb3JhdGlvbihmcm9tLCB0bywgbmV3IElubGluZVR5cGUoYXR0cnMsIHNwZWMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQ3JlYXRlcyBhIG5vZGUgZGVjb3JhdGlvbi4gYGZyb21gIGFuZCBgdG9gIHNob3VsZCBwb2ludCBwcmVjaXNlbHlcbiAgICBiZWZvcmUgYW5kIGFmdGVyIGEgbm9kZSBpbiB0aGUgZG9jdW1lbnQuIFRoYXQgbm9kZSwgYW5kIG9ubHkgdGhhdFxuICAgIG5vZGUsIHdpbGwgcmVjZWl2ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlcy5cbiAgICAqL1xuICAgIHN0YXRpYyBub2RlKGZyb20sIHRvLCBhdHRycywgc3BlYykge1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZnJvbSwgdG8sIG5ldyBOb2RlVHlwZShhdHRycywgc3BlYykpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGUgc3BlYyBwcm92aWRlZCB3aGVuIGNyZWF0aW5nIHRoaXMgZGVjb3JhdGlvbi4gQ2FuIGJlIHVzZWZ1bFxuICAgIGlmIHlvdSd2ZSBzdG9yZWQgZXh0cmEgaW5mb3JtYXRpb24gaW4gdGhhdCBvYmplY3QuXG4gICAgKi9cbiAgICBnZXQgc3BlYygpIHsgcmV0dXJuIHRoaXMudHlwZS5zcGVjOyB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBnZXQgaW5saW5lKCkgeyByZXR1cm4gdGhpcy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZTsgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZ2V0IHdpZGdldCgpIHsgcmV0dXJuIHRoaXMudHlwZSBpbnN0YW5jZW9mIFdpZGdldFR5cGU7IH1cbn1cbmNvbnN0IG5vbmUgPSBbXSwgbm9TcGVjID0ge307XG4vKipcbkEgY29sbGVjdGlvbiBvZiBbZGVjb3JhdGlvbnNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkRlY29yYXRpb24pLCBvcmdhbml6ZWQgaW4gc3VjaFxuYSB3YXkgdGhhdCB0aGUgZHJhd2luZyBhbGdvcml0aG0gY2FuIGVmZmljaWVudGx5IHVzZSBhbmQgY29tcGFyZVxudGhlbS4gVGhpcyBpcyBhIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmXigJRpdCBpcyBub3QgbW9kaWZpZWQsXG51cGRhdGVzIGNyZWF0ZSBhIG5ldyB2YWx1ZS5cbiovXG5jbGFzcyBEZWNvcmF0aW9uU2V0IHtcbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsLCBjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWwubGVuZ3RoID8gbG9jYWwgOiBub25lO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW4gOiBub25lO1xuICAgIH1cbiAgICAvKipcbiAgICBDcmVhdGUgYSBzZXQgb2YgZGVjb3JhdGlvbnMsIHVzaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdpdmVuXG4gICAgZG9jdW1lbnQuIFRoaXMgd2lsbCBjb25zdW1lIChtb2RpZnkpIHRoZSBgZGVjb3JhdGlvbnNgIGFycmF5LCBzb1xuICAgIHlvdSBtdXN0IG1ha2UgYSBjb3B5IGlmIHlvdSB3YW50IG5lZWQgdG8gcHJlc2VydmUgdGhhdC5cbiAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZG9jLCBkZWNvcmF0aW9ucykge1xuICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnMubGVuZ3RoID8gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBkb2MsIDAsIG5vU3BlYykgOiBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCBhbGwgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQgd2hpY2ggdG91Y2ggdGhlIGdpdmVuIHJhbmdlXG4gICAgKGluY2x1ZGluZyBkZWNvcmF0aW9ucyB0aGF0IHN0YXJ0IG9yIGVuZCBkaXJlY3RseSBhdCB0aGVcbiAgICBib3VuZGFyaWVzKSBhbmQgbWF0Y2ggdGhlIGdpdmVuIHByZWRpY2F0ZSBvbiB0aGVpciBzcGVjLiBXaGVuXG4gICAgYHN0YXJ0YCBhbmQgYGVuZGAgYXJlIG9taXR0ZWQsIGFsbCBkZWNvcmF0aW9ucyBpbiB0aGUgc2V0IGFyZVxuICAgIGNvbnNpZGVyZWQuIFdoZW4gYHByZWRpY2F0ZWAgaXNuJ3QgZ2l2ZW4sIGFsbCBkZWNvcmF0aW9ucyBhcmVcbiAgICBhc3N1bWVkIHRvIG1hdGNoLlxuICAgICovXG4gICAgZmluZChzdGFydCwgZW5kLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmZpbmRJbm5lcihzdGFydCA9PSBudWxsID8gMCA6IHN0YXJ0LCBlbmQgPT0gbnVsbCA/IDFlOSA6IGVuZCwgcmVzdWx0LCAwLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmaW5kSW5uZXIoc3RhcnQsIGVuZCwgcmVzdWx0LCBvZmZzZXQsIHByZWRpY2F0ZSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGFuID0gdGhpcy5sb2NhbFtpXTtcbiAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPD0gZW5kICYmIHNwYW4udG8gPj0gc3RhcnQgJiYgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHNwYW4uc3BlYykpKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYW4uY29weShzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldIDwgZW5kICYmIHRoaXMuY2hpbGRyZW5baSArIDFdID4gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPZmYgPSB0aGlzLmNoaWxkcmVuW2ldICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuW2kgKyAyXS5maW5kSW5uZXIoc3RhcnQgLSBjaGlsZE9mZiwgZW5kIC0gY2hpbGRPZmYsIHJlc3VsdCwgb2Zmc2V0ICsgY2hpbGRPZmYsIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgTWFwIHRoZSBzZXQgb2YgZGVjb3JhdGlvbnMgaW4gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlXG4gICAgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBtYXAobWFwcGluZywgZG9jLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5IHx8IG1hcHBpbmcubWFwcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5tYXBJbm5lcihtYXBwaW5nLCBkb2MsIDAsIDAsIG9wdGlvbnMgfHwgbm9TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBtYXBJbm5lcihtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICBsZXQgbmV3TG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG1hcHBlZCA9IHRoaXMubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQgJiYgbWFwcGVkLnR5cGUudmFsaWQobm9kZSwgbWFwcGVkKSlcbiAgICAgICAgICAgICAgICAobmV3TG9jYWwgfHwgKG5ld0xvY2FsID0gW10pKS5wdXNoKG1hcHBlZCk7XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9uUmVtb3ZlKVxuICAgICAgICAgICAgICAgIG9wdGlvbnMub25SZW1vdmUodGhpcy5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gbWFwQ2hpbGRyZW4odGhpcy5jaGlsZHJlbiwgbmV3TG9jYWwgfHwgW10sIG1hcHBpbmcsIG5vZGUsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG5ld0xvY2FsID8gbmV3IERlY29yYXRpb25TZXQobmV3TG9jYWwuc29ydChieVBvcyksIG5vbmUpIDogZW1wdHk7XG4gICAgfVxuICAgIC8qKlxuICAgIEFkZCB0aGUgZ2l2ZW4gYXJyYXkgb2YgZGVjb3JhdGlvbnMgdG8gdGhlIG9uZXMgaW4gdGhlIHNldCxcbiAgICBwcm9kdWNpbmcgYSBuZXcgc2V0LiBDb25zdW1lcyB0aGUgYGRlY29yYXRpb25zYCBhcnJheS4gTmVlZHNcbiAgICBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0cmVlXG4gICAgc3RydWN0dXJlLlxuICAgICovXG4gICAgYWRkKGRvYywgZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFkZWNvcmF0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMgPT0gZW1wdHkpXG4gICAgICAgICAgICByZXR1cm4gRGVjb3JhdGlvblNldC5jcmVhdGUoZG9jLCBkZWNvcmF0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZElubmVyKGRvYywgZGVjb3JhdGlvbnMsIDApO1xuICAgIH1cbiAgICBhZGRJbm5lcihkb2MsIGRlY29yYXRpb25zLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuLCBjaGlsZEluZGV4ID0gMDtcbiAgICAgICAgZG9jLmZvckVhY2goKGNoaWxkTm9kZSwgY2hpbGRPZmZzZXQpID0+IHtcbiAgICAgICAgICAgIGxldCBiYXNlT2Zmc2V0ID0gY2hpbGRPZmZzZXQgKyBvZmZzZXQsIGZvdW5kO1xuICAgICAgICAgICAgaWYgKCEoZm91bmQgPSB0YWtlU3BhbnNGb3JOb2RlKGRlY29yYXRpb25zLCBjaGlsZE5vZGUsIGJhc2VPZmZzZXQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbi5zbGljZSgpO1xuICAgICAgICAgICAgd2hpbGUgKGNoaWxkSW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY2hpbGRyZW5bY2hpbGRJbmRleF0gPCBjaGlsZE9mZnNldClcbiAgICAgICAgICAgICAgICBjaGlsZEluZGV4ICs9IDM7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW5bY2hpbGRJbmRleF0gPT0gY2hpbGRPZmZzZXQpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdID0gY2hpbGRyZW5bY2hpbGRJbmRleCArIDJdLmFkZElubmVyKGNoaWxkTm9kZSwgZm91bmQsIGJhc2VPZmZzZXQgKyAxKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoY2hpbGRJbmRleCwgMCwgY2hpbGRPZmZzZXQsIGNoaWxkT2Zmc2V0ICsgY2hpbGROb2RlLm5vZGVTaXplLCBidWlsZFRyZWUoZm91bmQsIGNoaWxkTm9kZSwgYmFzZU9mZnNldCArIDEsIG5vU3BlYykpO1xuICAgICAgICAgICAgY2hpbGRJbmRleCArPSAzO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxvY2FsID0gbW92ZVNwYW5zKGNoaWxkSW5kZXggPyB3aXRob3V0TnVsbHMoZGVjb3JhdGlvbnMpIDogZGVjb3JhdGlvbnMsIC1vZmZzZXQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCFsb2NhbFtpXS50eXBlLnZhbGlkKGRvYywgbG9jYWxbaV0pKVxuICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShpLS0sIDEpO1xuICAgICAgICByZXR1cm4gbmV3IERlY29yYXRpb25TZXQobG9jYWwubGVuZ3RoID8gdGhpcy5sb2NhbC5jb25jYXQobG9jYWwpLnNvcnQoYnlQb3MpIDogdGhpcy5sb2NhbCwgY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbik7XG4gICAgfVxuICAgIC8qKlxuICAgIENyZWF0ZSBhIG5ldyBzZXQgdGhhdCBjb250YWlucyB0aGUgZGVjb3JhdGlvbnMgaW4gdGhpcyBzZXQsIG1pbnVzXG4gICAgdGhlIG9uZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICAgICovXG4gICAgcmVtb3ZlKGRlY29yYXRpb25zKSB7XG4gICAgICAgIGlmIChkZWNvcmF0aW9ucy5sZW5ndGggPT0gMCB8fCB0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUlubmVyKGRlY29yYXRpb25zLCAwKTtcbiAgICB9XG4gICAgcmVtb3ZlSW5uZXIoZGVjb3JhdGlvbnMsIG9mZnNldCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuLCBsb2NhbCA9IHRoaXMubG9jYWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZDtcbiAgICAgICAgICAgIGxldCBmcm9tID0gY2hpbGRyZW5baV0gKyBvZmZzZXQsIHRvID0gY2hpbGRyZW5baSArIDFdICsgb2Zmc2V0O1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIHNwYW47IGogPCBkZWNvcmF0aW9ucy5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICBpZiAoc3BhbiA9IGRlY29yYXRpb25zW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuLmZyb20gPiBmcm9tICYmIHNwYW4udG8gPCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbnNbal0gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGZvdW5kIHx8IChmb3VuZCA9IFtdKSkucHVzaChzcGFuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gdGhpcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4uc2xpY2UoKTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gY2hpbGRyZW5baSArIDJdLnJlbW92ZUlubmVyKGZvdW5kLCBmcm9tICsgMSk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAyXSA9IHJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMyk7XG4gICAgICAgICAgICAgICAgaSAtPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbC5sZW5ndGgpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgc3BhbjsgaSA8IGRlY29yYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChzcGFuID0gZGVjb3JhdGlvbnNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsb2NhbC5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFtqXS5lcShzcGFuLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsID09IHRoaXMubG9jYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5sb2NhbC5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnNwbGljZShqLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuID09IHRoaXMuY2hpbGRyZW4gJiYgbG9jYWwgPT0gdGhpcy5sb2NhbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICByZXR1cm4gbG9jYWwubGVuZ3RoIHx8IGNoaWxkcmVuLmxlbmd0aCA/IG5ldyBEZWNvcmF0aW9uU2V0KGxvY2FsLCBjaGlsZHJlbikgOiBlbXB0eTtcbiAgICB9XG4gICAgZm9yQ2hpbGQob2Zmc2V0LCBub2RlKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmIChub2RlLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgY2hpbGQsIGxvY2FsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpXG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA+PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbltpXSA9PSBvZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpICsgMl07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIGxldCBzdGFydCA9IG9mZnNldCArIDEsIGVuZCA9IHN0YXJ0ICsgbm9kZS5jb250ZW50LnNpemU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGRlYyA9IHRoaXMubG9jYWxbaV07XG4gICAgICAgICAgICBpZiAoZGVjLmZyb20gPCBlbmQgJiYgZGVjLnRvID4gc3RhcnQgJiYgKGRlYy50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IE1hdGgubWF4KHN0YXJ0LCBkZWMuZnJvbSkgLSBzdGFydCwgdG8gPSBNYXRoLm1pbihlbmQsIGRlYy50bykgLSBzdGFydDtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbSA8IHRvKVxuICAgICAgICAgICAgICAgICAgICAobG9jYWwgfHwgKGxvY2FsID0gW10pKS5wdXNoKGRlYy5jb3B5KGZyb20sIHRvKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgICAgICBsZXQgbG9jYWxTZXQgPSBuZXcgRGVjb3JhdGlvblNldChsb2NhbC5zb3J0KGJ5UG9zKSwgbm9uZSk7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQgPyBuZXcgRGVjb3JhdGlvbkdyb3VwKFtsb2NhbFNldCwgY2hpbGRdKSA6IGxvY2FsU2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZCB8fCBlbXB0eTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBlcShvdGhlcikge1xuICAgICAgICBpZiAodGhpcyA9PSBvdGhlcilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpIHx8XG4gICAgICAgICAgICB0aGlzLmxvY2FsLmxlbmd0aCAhPSBvdGhlci5sb2NhbC5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9IG90aGVyLmNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxvY2FsLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgaWYgKCF0aGlzLmxvY2FsW2ldLmVxKG90aGVyLmxvY2FsW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldICE9IG90aGVyLmNoaWxkcmVuW2ldIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbltpICsgMV0gIT0gb3RoZXIuY2hpbGRyZW5baSArIDFdIHx8XG4gICAgICAgICAgICAgICAgIXRoaXMuY2hpbGRyZW5baSArIDJdLmVxKG90aGVyLmNoaWxkcmVuW2kgKyAyXSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlT3ZlcmxhcCh0aGlzLmxvY2Fsc0lubmVyKG5vZGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBsb2NhbHNJbm5lcihub2RlKSB7XG4gICAgICAgIGlmICh0aGlzID09IGVtcHR5KVxuICAgICAgICAgICAgcmV0dXJuIG5vbmU7XG4gICAgICAgIGlmIChub2RlLmlubGluZUNvbnRlbnQgfHwgIXRoaXMubG9jYWwuc29tZShJbmxpbmVUeXBlLmlzKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb2NhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5sb2NhbFtpXS50eXBlIGluc3RhbmNlb2YgSW5saW5lVHlwZSkpXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5sb2NhbFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZm9yRWFjaFNldChmKSB7IGYodGhpcyk7IH1cbn1cbi8qKlxuVGhlIGVtcHR5IHNldCBvZiBkZWNvcmF0aW9ucy5cbiovXG5EZWNvcmF0aW9uU2V0LmVtcHR5ID0gbmV3IERlY29yYXRpb25TZXQoW10sIFtdKTtcbi8qKlxuQGludGVybmFsXG4qL1xuRGVjb3JhdGlvblNldC5yZW1vdmVPdmVybGFwID0gcmVtb3ZlT3ZlcmxhcDtcbmNvbnN0IGVtcHR5ID0gRGVjb3JhdGlvblNldC5lbXB0eTtcbi8vIEFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIHRoZSBjb2RlIGRlYWxpbmcgd2l0aCBkZWNvcmF0aW9ucyB0b1xuLy8gdHJlYXQgbXVsdGlwbGUgRGVjb3JhdGlvblNldCBvYmplY3RzIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgb2JqZWN0XG4vLyB3aXRoIChhIHN1YnNldCBvZikgdGhlIHNhbWUgaW50ZXJmYWNlLlxuY2xhc3MgRGVjb3JhdGlvbkdyb3VwIHtcbiAgICBjb25zdHJ1Y3RvcihtZW1iZXJzKSB7XG4gICAgICAgIHRoaXMubWVtYmVycyA9IG1lbWJlcnM7XG4gICAgfVxuICAgIG1hcChtYXBwaW5nLCBkb2MpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkRGVjb3MgPSB0aGlzLm1lbWJlcnMubWFwKG1lbWJlciA9PiBtZW1iZXIubWFwKG1hcHBpbmcsIGRvYywgbm9TcGVjKSk7XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShtYXBwZWREZWNvcyk7XG4gICAgfVxuICAgIGZvckNoaWxkKG9mZnNldCwgY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkLmlzTGVhZilcbiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0aW9uU2V0LmVtcHR5O1xuICAgICAgICBsZXQgZm91bmQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm1lbWJlcnNbaV0uZm9yQ2hpbGQob2Zmc2V0LCBjaGlsZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09IGVtcHR5KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIERlY29yYXRpb25Hcm91cClcbiAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kLmNvbmNhdChyZXN1bHQubWVtYmVycyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm91bmQucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgRGVjb3JhdGlvbkdyb3VwKSB8fFxuICAgICAgICAgICAgb3RoZXIubWVtYmVycy5sZW5ndGggIT0gdGhpcy5tZW1iZXJzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1lbWJlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBpZiAoIXRoaXMubWVtYmVyc1tpXS5lcShvdGhlci5tZW1iZXJzW2ldKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsb2NhbHMobm9kZSkge1xuICAgICAgICBsZXQgcmVzdWx0LCBzb3J0ZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxvY2FscyA9IHRoaXMubWVtYmVyc1tpXS5sb2NhbHNJbm5lcihub2RlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbG9jYWxzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbG9jYWxzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsb2NhbHNbal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQgPyByZW1vdmVPdmVybGFwKHNvcnRlZCA/IHJlc3VsdCA6IHJlc3VsdC5zb3J0KGJ5UG9zKSkgOiBub25lO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBncm91cCBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGRlY29yYXRpb24gc2V0cywgb3IgcmV0dXJuXG4gICAgLy8gYSBzaW5nbGUgc2V0IHdoZW4gcG9zc2libGUuXG4gICAgc3RhdGljIGZyb20obWVtYmVycykge1xuICAgICAgICBzd2l0Y2ggKG1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG1lbWJlcnNbMF07XG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gbmV3IERlY29yYXRpb25Hcm91cChtZW1iZXJzLmV2ZXJ5KG0gPT4gbSBpbnN0YW5jZW9mIERlY29yYXRpb25TZXQpID8gbWVtYmVycyA6XG4gICAgICAgICAgICAgICAgbWVtYmVycy5yZWR1Y2UoKHIsIG0pID0+IHIuY29uY2F0KG0gaW5zdGFuY2VvZiBEZWNvcmF0aW9uU2V0ID8gbSA6IG0ubWVtYmVycyksIFtdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yRWFjaFNldChmKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdGhpcy5tZW1iZXJzW2ldLmZvckVhY2hTZXQoZik7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFwQ2hpbGRyZW4ob2xkQ2hpbGRyZW4sIG5ld0xvY2FsLCBtYXBwaW5nLCBub2RlLCBvZmZzZXQsIG9sZE9mZnNldCwgb3B0aW9ucykge1xuICAgIGxldCBjaGlsZHJlbiA9IG9sZENoaWxkcmVuLnNsaWNlKCk7XG4gICAgLy8gTWFyayB0aGUgY2hpbGRyZW4gdGhhdCBhcmUgZGlyZWN0bHkgdG91Y2hlZCBieSBjaGFuZ2VzLCBhbmRcbiAgICAvLyBtb3ZlIHRob3NlIHRoYXQgYXJlIGFmdGVyIHRoZSBjaGFuZ2VzLlxuICAgIGZvciAobGV0IGkgPSAwLCBiYXNlT2Zmc2V0ID0gb2xkT2Zmc2V0OyBpIDwgbWFwcGluZy5tYXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBtb3ZlZCA9IDA7XG4gICAgICAgIG1hcHBpbmcubWFwc1tpXS5mb3JFYWNoKChvbGRTdGFydCwgb2xkRW5kLCBuZXdTdGFydCwgbmV3RW5kKSA9PiB7XG4gICAgICAgICAgICBsZXQgZFNpemUgPSAobmV3RW5kIC0gbmV3U3RhcnQpIC0gKG9sZEVuZCAtIG9sZFN0YXJ0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kID0gY2hpbGRyZW5baSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChlbmQgPCAwIHx8IG9sZFN0YXJ0ID4gZW5kICsgYmFzZU9mZnNldCAtIG1vdmVkKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBjaGlsZHJlbltpXSArIGJhc2VPZmZzZXQgLSBtb3ZlZDtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW5kID49IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW2kgKyAxXSA9IG9sZFN0YXJ0IDw9IHN0YXJ0ID8gLTIgOiAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob2xkU3RhcnQgPj0gYmFzZU9mZnNldCAmJiBkU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSArPSBkU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdICs9IGRTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmVkICs9IGRTaXplO1xuICAgICAgICB9KTtcbiAgICAgICAgYmFzZU9mZnNldCA9IG1hcHBpbmcubWFwc1tpXS5tYXAoYmFzZU9mZnNldCwgLTEpO1xuICAgIH1cbiAgICAvLyBGaW5kIHRoZSBjaGlsZCBub2RlcyB0aGF0IHN0aWxsIGNvcnJlc3BvbmQgdG8gYSBzaW5nbGUgbm9kZSxcbiAgICAvLyByZWN1cnNpdmVseSBjYWxsIG1hcElubmVyIG9uIHRoZW0gYW5kIHVwZGF0ZSB0aGVpciBwb3NpdGlvbnMuXG4gICAgbGV0IG11c3RSZWJ1aWxkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA8IDApIHsgLy8gVG91Y2hlZCBub2Rlc1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA9PSAtMikge1xuICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpICsgMV0gPSAtMTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmcm9tID0gbWFwcGluZy5tYXAob2xkQ2hpbGRyZW5baV0gKyBvbGRPZmZzZXQpLCBmcm9tTG9jYWwgPSBmcm9tIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGZyb21Mb2NhbCA8IDAgfHwgZnJvbUxvY2FsID49IG5vZGUuY29udGVudC5zaXplKSB7XG4gICAgICAgICAgICAgICAgbXVzdFJlYnVpbGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTXVzdCByZWFkIG9sZENoaWxkcmVuIGJlY2F1c2UgY2hpbGRyZW4gd2FzIHRhZ2dlZCB3aXRoIC0xXG4gICAgICAgICAgICBsZXQgdG8gPSBtYXBwaW5nLm1hcChvbGRDaGlsZHJlbltpICsgMV0gKyBvbGRPZmZzZXQsIC0xKSwgdG9Mb2NhbCA9IHRvIC0gb2Zmc2V0O1xuICAgICAgICAgICAgbGV0IHsgaW5kZXgsIG9mZnNldDogY2hpbGRPZmZzZXQgfSA9IG5vZGUuY29udGVudC5maW5kSW5kZXgoZnJvbUxvY2FsKTtcbiAgICAgICAgICAgIGxldCBjaGlsZE5vZGUgPSBub2RlLm1heWJlQ2hpbGQoaW5kZXgpO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSAmJiBjaGlsZE9mZnNldCA9PSBmcm9tTG9jYWwgJiYgY2hpbGRPZmZzZXQgKyBjaGlsZE5vZGUubm9kZVNpemUgPT0gdG9Mb2NhbCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXBwZWQgPSBjaGlsZHJlbltpICsgMl1cbiAgICAgICAgICAgICAgICAgICAgLm1hcElubmVyKG1hcHBpbmcsIGNoaWxkTm9kZSwgZnJvbSArIDEsIG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBlbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSA9IGZyb21Mb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gdG9Mb2NhbDtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDJdID0gbWFwcGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5baSArIDFdID0gLTI7XG4gICAgICAgICAgICAgICAgICAgIG11c3RSZWJ1aWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtdXN0UmVidWlsZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAvLyBSZW1haW5pbmcgY2hpbGRyZW4gbXVzdCBiZSBjb2xsZWN0ZWQgYW5kIHJlYnVpbHQgaW50byB0aGUgYXBwcm9wcmlhdGUgc3RydWN0dXJlXG4gICAgaWYgKG11c3RSZWJ1aWxkKSB7XG4gICAgICAgIGxldCBkZWNvcmF0aW9ucyA9IG1hcEFuZEdhdGhlclJlbWFpbmluZ0RlY29yYXRpb25zKGNoaWxkcmVuLCBvbGRDaGlsZHJlbiwgbmV3TG9jYWwsIG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0LCBvcHRpb25zKTtcbiAgICAgICAgbGV0IGJ1aWx0ID0gYnVpbGRUcmVlKGRlY29yYXRpb25zLCBub2RlLCAwLCBvcHRpb25zKTtcbiAgICAgICAgbmV3TG9jYWwgPSBidWlsdC5sb2NhbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpICsgMV0gPCAwKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDMpO1xuICAgICAgICAgICAgICAgIGkgLT0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSAwOyBpIDwgYnVpbHQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgIGxldCBmcm9tID0gYnVpbHQuY2hpbGRyZW5baV07XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjaGlsZHJlbltqXSA8IGZyb20pXG4gICAgICAgICAgICAgICAgaiArPSAzO1xuICAgICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGosIDAsIGJ1aWx0LmNoaWxkcmVuW2ldLCBidWlsdC5jaGlsZHJlbltpICsgMV0sIGJ1aWx0LmNoaWxkcmVuW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0aW9uU2V0KG5ld0xvY2FsLnNvcnQoYnlQb3MpLCBjaGlsZHJlbik7XG59XG5mdW5jdGlvbiBtb3ZlU3BhbnMoc3BhbnMsIG9mZnNldCkge1xuICAgIGlmICghb2Zmc2V0IHx8ICFzcGFucy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBzcGFucztcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICByZXN1bHQucHVzaChuZXcgRGVjb3JhdGlvbihzcGFuLmZyb20gKyBvZmZzZXQsIHNwYW4udG8gKyBvZmZzZXQsIHNwYW4udHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbWFwQW5kR2F0aGVyUmVtYWluaW5nRGVjb3JhdGlvbnMoY2hpbGRyZW4sIG9sZENoaWxkcmVuLCBkZWNvcmF0aW9ucywgbWFwcGluZywgb2Zmc2V0LCBvbGRPZmZzZXQsIG9wdGlvbnMpIHtcbiAgICAvLyBHYXRoZXIgYWxsIGRlY29yYXRpb25zIGZyb20gdGhlIHJlbWFpbmluZyBtYXJrZWQgY2hpbGRyZW5cbiAgICBmdW5jdGlvbiBnYXRoZXIoc2V0LCBvbGRPZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubG9jYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBtYXBwZWQgPSBzZXQubG9jYWxbaV0ubWFwKG1hcHBpbmcsIG9mZnNldCwgb2xkT2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQpXG4gICAgICAgICAgICAgICAgZGVjb3JhdGlvbnMucHVzaChtYXBwZWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5vblJlbW92ZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVtb3ZlKHNldC5sb2NhbFtpXS5zcGVjKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgICAgIGdhdGhlcihzZXQuY2hpbGRyZW5baSArIDJdLCBzZXQuY2hpbGRyZW5baV0gKyBvbGRPZmZzZXQgKyAxKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMylcbiAgICAgICAgaWYgKGNoaWxkcmVuW2kgKyAxXSA9PSAtMSlcbiAgICAgICAgICAgIGdhdGhlcihjaGlsZHJlbltpICsgMl0sIG9sZENoaWxkcmVuW2ldICsgb2xkT2Zmc2V0ICsgMSk7XG4gICAgcmV0dXJuIGRlY29yYXRpb25zO1xufVxuZnVuY3Rpb24gdGFrZVNwYW5zRm9yTm9kZShzcGFucywgbm9kZSwgb2Zmc2V0KSB7XG4gICAgaWYgKG5vZGUuaXNMZWFmKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgZW5kID0gb2Zmc2V0ICsgbm9kZS5ub2RlU2l6ZSwgZm91bmQgPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwLCBzcGFuOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKChzcGFuID0gc3BhbnNbaV0pICYmIHNwYW4uZnJvbSA+IG9mZnNldCAmJiBzcGFuLnRvIDwgZW5kKSB7XG4gICAgICAgICAgICAoZm91bmQgfHwgKGZvdW5kID0gW10pKS5wdXNoKHNwYW4pO1xuICAgICAgICAgICAgc3BhbnNbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZDtcbn1cbmZ1bmN0aW9uIHdpdGhvdXROdWxscyhhcnJheSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoYXJyYXlbaV0gIT0gbnVsbClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycmF5W2ldKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gQnVpbGQgdXAgYSB0cmVlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBzZXQgb2YgZGVjb3JhdGlvbnMuIGBvZmZzZXRgXG4vLyBpcyBhIGJhc2Ugb2Zmc2V0IHRoYXQgc2hvdWxkIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYGZyb21gIGFuZCBgdG9gXG4vLyBwb3NpdGlvbnMgaW4gdGhlIHNwYW5zIChzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgbmV3IHNwYW5zXG4vLyBmb3IgcmVjdXJzaXZlIGNhbGxzKS5cbmZ1bmN0aW9uIGJ1aWxkVHJlZShzcGFucywgbm9kZSwgb2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gW10sIGhhc051bGxzID0gZmFsc2U7XG4gICAgbm9kZS5mb3JFYWNoKChjaGlsZE5vZGUsIGxvY2FsU3RhcnQpID0+IHtcbiAgICAgICAgbGV0IGZvdW5kID0gdGFrZVNwYW5zRm9yTm9kZShzcGFucywgY2hpbGROb2RlLCBsb2NhbFN0YXJ0ICsgb2Zmc2V0KTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICBoYXNOdWxscyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgc3VidHJlZSA9IGJ1aWxkVHJlZShmb3VuZCwgY2hpbGROb2RlLCBvZmZzZXQgKyBsb2NhbFN0YXJ0ICsgMSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoc3VidHJlZSAhPSBlbXB0eSlcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGxvY2FsU3RhcnQsIGxvY2FsU3RhcnQgKyBjaGlsZE5vZGUubm9kZVNpemUsIHN1YnRyZWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGxvY2FscyA9IG1vdmVTcGFucyhoYXNOdWxscyA/IHdpdGhvdXROdWxscyhzcGFucykgOiBzcGFucywgLW9mZnNldCkuc29ydChieVBvcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbHMubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghbG9jYWxzW2ldLnR5cGUudmFsaWQobm9kZSwgbG9jYWxzW2ldKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub25SZW1vdmUpXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vblJlbW92ZShsb2NhbHNbaV0uc3BlYyk7XG4gICAgICAgICAgICBsb2NhbHMuc3BsaWNlKGktLSwgMSk7XG4gICAgICAgIH1cbiAgICByZXR1cm4gbG9jYWxzLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPyBuZXcgRGVjb3JhdGlvblNldChsb2NhbHMsIGNoaWxkcmVuKSA6IGVtcHR5O1xufVxuLy8gVXNlZCB0byBzb3J0IGRlY29yYXRpb25zIHNvIHRoYXQgb25lcyB3aXRoIGEgbG93IHN0YXJ0IHBvc2l0aW9uXG4vLyBjb21lIGZpcnN0LCBhbmQgd2l0aGluIGEgc2V0IHdpdGggdGhlIHNhbWUgc3RhcnQgcG9zaXRpb24sIHRob3NlXG4vLyB3aXRoIGFuIHNtYWxsZXIgZW5kIHBvc2l0aW9uIGNvbWUgZmlyc3QuXG5mdW5jdGlvbiBieVBvcyhhLCBiKSB7XG4gICAgcmV0dXJuIGEuZnJvbSAtIGIuZnJvbSB8fCBhLnRvIC0gYi50bztcbn1cbi8vIFNjYW4gYSBzb3J0ZWQgYXJyYXkgb2YgZGVjb3JhdGlvbnMgZm9yIHBhcnRpYWxseSBvdmVybGFwcGluZyBzcGFucyxcbi8vIGFuZCBzcGxpdCB0aG9zZSBzbyB0aGF0IG9ubHkgZnVsbHkgb3ZlcmxhcHBpbmcgc3BhbnMgYXJlIGxlZnQgKHRvXG4vLyBtYWtlIHN1YnNlcXVlbnQgcmVuZGVyaW5nIGVhc2llcikuIFdpbGwgcmV0dXJuIHRoZSBpbnB1dCBhcnJheSBpZlxuLy8gbm8gcGFydGlhbGx5IG92ZXJsYXBwaW5nIHNwYW5zIGFyZSBmb3VuZCAodGhlIGNvbW1vbiBjYXNlKS5cbmZ1bmN0aW9uIHJlbW92ZU92ZXJsYXAoc3BhbnMpIHtcbiAgICBsZXQgd29ya2luZyA9IHNwYW5zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29ya2luZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgbGV0IHNwYW4gPSB3b3JraW5nW2ldO1xuICAgICAgICBpZiAoc3Bhbi5mcm9tICE9IHNwYW4udG8pXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCB3b3JraW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHQgPSB3b3JraW5nW2pdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPT0gc3Bhbi5mcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LnRvICE9IHNwYW4udG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JraW5nID09IHNwYW5zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcgPSBzcGFucy5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93ZWQgYnkgYSBwYXJ0aWFsbHkgb3ZlcmxhcHBpbmcgbGFyZ2VyIHNwYW4uIFNwbGl0IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYW4uXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nW2pdID0gbmV4dC5jb3B5KG5leHQuZnJvbSwgc3Bhbi50byk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBaGVhZCh3b3JraW5nLCBqICsgMSwgbmV4dC5jb3B5KHNwYW4udG8sIG5leHQudG8pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmZyb20gPCBzcGFuLnRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2luZyA9PSBzcGFucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JraW5nID0gc3BhbnMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhpcyBvbmUgb3ZlcmxhcHMgd2l0aCBhIHN1YnNlcXVlbnQgc3Bhbi4gU3BsaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ1tpXSA9IHNwYW4uY29weShzcGFuLmZyb20sIG5leHQuZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBaGVhZCh3b3JraW5nLCBqLCBzcGFuLmNvcHkobmV4dC5mcm9tLCBzcGFuLnRvKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd29ya2luZztcbn1cbmZ1bmN0aW9uIGluc2VydEFoZWFkKGFycmF5LCBpLCBkZWNvKSB7XG4gICAgd2hpbGUgKGkgPCBhcnJheS5sZW5ndGggJiYgYnlQb3MoZGVjbywgYXJyYXlbaV0pID4gMClcbiAgICAgICAgaSsrO1xuICAgIGFycmF5LnNwbGljZShpLCAwLCBkZWNvKTtcbn1cbi8vIEdldCB0aGUgZGVjb3JhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHByb3BzIG9mIGEgdmlldy5cbmZ1bmN0aW9uIHZpZXdEZWNvcmF0aW9ucyh2aWV3KSB7XG4gICAgbGV0IGZvdW5kID0gW107XG4gICAgdmlldy5zb21lUHJvcChcImRlY29yYXRpb25zXCIsIGYgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZih2aWV3LnN0YXRlKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgIT0gZW1wdHkpXG4gICAgICAgICAgICBmb3VuZC5wdXNoKHJlc3VsdCk7XG4gICAgfSk7XG4gICAgaWYgKHZpZXcuY3Vyc29yV3JhcHBlcilcbiAgICAgICAgZm91bmQucHVzaChEZWNvcmF0aW9uU2V0LmNyZWF0ZSh2aWV3LnN0YXRlLmRvYywgW3ZpZXcuY3Vyc29yV3JhcHBlci5kZWNvXSkpO1xuICAgIHJldHVybiBEZWNvcmF0aW9uR3JvdXAuZnJvbShmb3VuZCk7XG59XG5cbmNvbnN0IG9ic2VydmVPcHRpb25zID0ge1xuICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgIGNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZSxcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGF0dHJpYnV0ZU9sZFZhbHVlOiB0cnVlLFxuICAgIHN1YnRyZWU6IHRydWVcbn07XG4vLyBJRTExIGhhcyB2ZXJ5IGJyb2tlbiBtdXRhdGlvbiBvYnNlcnZlcnMsIHNvIHdlIGFsc28gbGlzdGVuIHRvIERPTUNoYXJhY3RlckRhdGFNb2RpZmllZFxuY29uc3QgdXNlQ2hhckRhdGEgPSBpZSAmJiBpZV92ZXJzaW9uIDw9IDExO1xuY2xhc3MgU2VsZWN0aW9uU3RhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFuY2hvck5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvck9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuZm9jdXNOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IDA7XG4gICAgfVxuICAgIHNldChzZWwpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gc2VsLmFuY2hvck5vZGU7XG4gICAgICAgIHRoaXMuYW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldDtcbiAgICAgICAgdGhpcy5mb2N1c05vZGUgPSBzZWwuZm9jdXNOb2RlO1xuICAgICAgICB0aGlzLmZvY3VzT2Zmc2V0ID0gc2VsLmZvY3VzT2Zmc2V0O1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5hbmNob3JOb2RlID0gdGhpcy5mb2N1c05vZGUgPSBudWxsO1xuICAgIH1cbiAgICBlcShzZWwpIHtcbiAgICAgICAgcmV0dXJuIHNlbC5hbmNob3JOb2RlID09IHRoaXMuYW5jaG9yTm9kZSAmJiBzZWwuYW5jaG9yT2Zmc2V0ID09IHRoaXMuYW5jaG9yT2Zmc2V0ICYmXG4gICAgICAgICAgICBzZWwuZm9jdXNOb2RlID09IHRoaXMuZm9jdXNOb2RlICYmIHNlbC5mb2N1c09mZnNldCA9PSB0aGlzLmZvY3VzT2Zmc2V0O1xuICAgIH1cbn1cbmNsYXNzIERPTU9ic2VydmVyIHtcbiAgICBjb25zdHJ1Y3Rvcih2aWV3LCBoYW5kbGVET01DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5oYW5kbGVET01DaGFuZ2UgPSBoYW5kbGVET01DaGFuZ2U7XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25TdGF0ZTtcbiAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2luZ1NlbGVjdGlvblVwZGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sYXN0Q2hhbmdlZFRleHROb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyICYmXG4gICAgICAgICAgICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKG11dGF0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgLy8gSUUxMSB3aWxsIHNvbWV0aW1lcyAob24gYmFja3NwYWNpbmcgb3V0IGEgc2luZ2xlIGNoYXJhY3RlclxuICAgICAgICAgICAgICAgIC8vIHRleHQgbm9kZSBhZnRlciBhIEJSIG5vZGUpIGNhbGwgdGhlIG9ic2VydmVyIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGFjdHVhbGx5IHVwZGF0aW5nIHRoZSBET00sIHdoaWNoIHdpbGwgY2F1c2VcbiAgICAgICAgICAgICAgICAvLyBQcm9zZU1pcnJvciB0byBtaXNzIHRoZSBjaGFuZ2UgKHNlZSAjOTMwKVxuICAgICAgICAgICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmIG11dGF0aW9ucy5zb21lKG0gPT4gbS50eXBlID09IFwiY2hpbGRMaXN0XCIgJiYgbS5yZW1vdmVkTm9kZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG0udHlwZSA9PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtLm9sZFZhbHVlLmxlbmd0aCA+IG0udGFyZ2V0Lm5vZGVWYWx1ZS5sZW5ndGgpKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VDaGFyRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYXJEYXRhID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHsgdGFyZ2V0OiBlLnRhcmdldCwgdHlwZTogXCJjaGFyYWN0ZXJEYXRhXCIsIG9sZFZhbHVlOiBlLnByZXZWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBmbHVzaFNvb24oKSB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoaW5nU29vbiA8IDApXG4gICAgICAgICAgICB0aGlzLmZsdXNoaW5nU29vbiA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5mbHVzaGluZ1Nvb24gPSAtMTsgdGhpcy5mbHVzaCgpOyB9LCAyMCk7XG4gICAgfVxuICAgIGZvcmNlRmx1c2goKSB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoaW5nU29vbiA+IC0xKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hpbmdTb29uKTtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hpbmdTb29uID0gLTE7XG4gICAgICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3LmRvbSwgb2JzZXJ2ZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uQ2hhckRhdGEpXG4gICAgICAgICAgICB0aGlzLnZpZXcuZG9tLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcy5vbkNoYXJEYXRhKTtcbiAgICAgICAgdGhpcy5jb25uZWN0U2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKSB7XG4gICAgICAgICAgICBsZXQgdGFrZSA9IHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKTtcbiAgICAgICAgICAgIGlmICh0YWtlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFrZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHRha2VbaV0pO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZmx1c2goKSwgMjApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25DaGFyRGF0YSlcbiAgICAgICAgICAgIHRoaXMudmlldy5kb20ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLm9uQ2hhckRhdGEpO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RTZWxlY3Rpb24oKTtcbiAgICB9XG4gICAgY29ubmVjdFNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy52aWV3LmRvbS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSk7XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RTZWxlY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudmlldy5kb20ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UpO1xuICAgIH1cbiAgICBzdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NpbmdTZWxlY3Rpb25VcGRhdGVzID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyA9IGZhbHNlLCA1MCk7XG4gICAgfVxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIWhhc0ZvY3VzQW5kU2VsZWN0aW9uKHRoaXMudmlldykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcylcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb25Ub0RPTSh0aGlzLnZpZXcpO1xuICAgICAgICAvLyBEZWxldGlvbnMgb24gSUUxMSBmaXJlIHRoZWlyIGV2ZW50cyBpbiB0aGUgd3Jvbmcgb3JkZXIsIGdpdmluZ1xuICAgICAgICAvLyB1cyBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgYmVmb3JlIHRoZSBET00gY2hhbmdlcyBhcmVcbiAgICAgICAgLy8gcmVwb3J0ZWQuXG4gICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDw9IDExICYmICF0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICAgICAgICBsZXQgc2VsID0gdGhpcy52aWV3LmRvbVNlbGVjdGlvblJhbmdlKCk7XG4gICAgICAgICAgICAvLyBTZWxlY3Rpb24uaXNDb2xsYXBzZWQgaXNuJ3QgcmVsaWFibGUgb24gSUVcbiAgICAgICAgICAgIGlmIChzZWwuZm9jdXNOb2RlICYmIGlzRXF1aXZhbGVudFBvc2l0aW9uKHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsdXNoU29vbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gICAgc2V0Q3VyU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uc2V0KHRoaXMudmlldy5kb21TZWxlY3Rpb25SYW5nZSgpKTtcbiAgICB9XG4gICAgaWdub3JlU2VsZWN0aW9uQ2hhbmdlKHNlbCkge1xuICAgICAgICBpZiAoIXNlbC5mb2N1c05vZGUpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGFuY2VzdG9ycyA9IG5ldyBTZXQsIGNvbnRhaW5lcjtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IHNlbC5mb2N1c05vZGU7IHNjYW47IHNjYW4gPSBwYXJlbnROb2RlKHNjYW4pKVxuICAgICAgICAgICAgYW5jZXN0b3JzLmFkZChzY2FuKTtcbiAgICAgICAgZm9yIChsZXQgc2NhbiA9IHNlbC5hbmNob3JOb2RlOyBzY2FuOyBzY2FuID0gcGFyZW50Tm9kZShzY2FuKSlcbiAgICAgICAgICAgIGlmIChhbmNlc3RvcnMuaGFzKHNjYW4pKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gc2NhbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgbGV0IGRlc2MgPSBjb250YWluZXIgJiYgdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5pZ25vcmVNdXRhdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgdGFyZ2V0OiBjb250YWluZXIubm9kZVR5cGUgPT0gMyA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyXG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldEN1clNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ1JlY29yZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9ic2VydmVyKVxuICAgICAgICAgICAgZm9yIChsZXQgbXV0IG9mIHRoaXMub2JzZXJ2ZXIudGFrZVJlY29yZHMoKSlcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobXV0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVldWU7XG4gICAgfVxuICAgIGZsdXNoKCkge1xuICAgICAgICBsZXQgeyB2aWV3IH0gPSB0aGlzO1xuICAgICAgICBpZiAoIXZpZXcuZG9jVmlldyB8fCB0aGlzLmZsdXNoaW5nU29vbiA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBsZXQgbXV0YXRpb25zID0gdGhpcy5wZW5kaW5nUmVjb3JkcygpO1xuICAgICAgICBpZiAobXV0YXRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgbGV0IHNlbCA9IHZpZXcuZG9tU2VsZWN0aW9uUmFuZ2UoKTtcbiAgICAgICAgbGV0IG5ld1NlbCA9ICF0aGlzLnN1cHByZXNzaW5nU2VsZWN0aW9uVXBkYXRlcyAmJiAhdGhpcy5jdXJyZW50U2VsZWN0aW9uLmVxKHNlbCkgJiYgaGFzRm9jdXNBbmRTZWxlY3Rpb24odmlldykgJiYgIXRoaXMuaWdub3JlU2VsZWN0aW9uQ2hhbmdlKHNlbCk7XG4gICAgICAgIGxldCBmcm9tID0gLTEsIHRvID0gLTEsIHR5cGVPdmVyID0gZmFsc2UsIGFkZGVkID0gW107XG4gICAgICAgIGlmICh2aWV3LmVkaXRhYmxlKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlZ2lzdGVyTXV0YXRpb24obXV0YXRpb25zW2ldLCBhZGRlZCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gZnJvbSA8IDAgPyByZXN1bHQuZnJvbSA6IE1hdGgubWluKHJlc3VsdC5mcm9tLCBmcm9tKTtcbiAgICAgICAgICAgICAgICAgICAgdG8gPSB0byA8IDAgPyByZXN1bHQudG8gOiBNYXRoLm1heChyZXN1bHQudG8sIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlT3ZlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdlY2tvICYmIGFkZGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGJycyA9IGFkZGVkLmZpbHRlcihuID0+IG4ubm9kZU5hbWUgPT0gXCJCUlwiKTtcbiAgICAgICAgICAgIGlmIChicnMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2EsIGJdID0gYnJzO1xuICAgICAgICAgICAgICAgIGlmIChhLnBhcmVudE5vZGUgJiYgYS5wYXJlbnROb2RlLnBhcmVudE5vZGUgPT0gYi5wYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBiLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB7IGZvY3VzTm9kZSB9ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGJyIG9mIGJycykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gYnIucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUgPT0gXCJMSVwiICYmICghZm9jdXNOb2RlIHx8IGJsb2NrUGFyZW50KHZpZXcsIGZvY3VzTm9kZSkgIT0gcGFyZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVhZFNlbCA9IG51bGw7XG4gICAgICAgIC8vIElmIGl0IGxvb2tzIGxpa2UgdGhlIGJyb3dzZXIgaGFzIHJlc2V0IHRoZSBzZWxlY3Rpb24gdG8gdGhlXG4gICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCBhZnRlciBmb2N1cywgcmVzdG9yZSB0aGUgc2VsZWN0aW9uIGZyb21cbiAgICAgICAgLy8gdGhlIHN0YXRlXG4gICAgICAgIGlmIChmcm9tIDwgMCAmJiBuZXdTZWwgJiYgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPiBEYXRlLm5vdygpIC0gMjAwICYmXG4gICAgICAgICAgICBNYXRoLm1heCh2aWV3LmlucHV0Lmxhc3RUb3VjaCwgdmlldy5pbnB1dC5sYXN0Q2xpY2sudGltZSkgPCBEYXRlLm5vdygpIC0gMzAwICYmXG4gICAgICAgICAgICBzZWxlY3Rpb25Db2xsYXBzZWQoc2VsKSAmJiAocmVhZFNlbCA9IHNlbGVjdGlvbkZyb21ET00odmlldykpICYmXG4gICAgICAgICAgICByZWFkU2VsLmVxKFNlbGVjdGlvbi5uZWFyKHZpZXcuc3RhdGUuZG9jLnJlc29sdmUoMCksIDEpKSkge1xuICAgICAgICAgICAgdmlldy5pbnB1dC5sYXN0Rm9jdXMgPSAwO1xuICAgICAgICAgICAgc2VsZWN0aW9uVG9ET00odmlldyk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3Rpb24uc2V0KHNlbCk7XG4gICAgICAgICAgICB2aWV3LnNjcm9sbFRvU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZnJvbSA+IC0xIHx8IG5ld1NlbCkge1xuICAgICAgICAgICAgaWYgKGZyb20gPiAtMSkge1xuICAgICAgICAgICAgICAgIHZpZXcuZG9jVmlldy5tYXJrRGlydHkoZnJvbSwgdG8pO1xuICAgICAgICAgICAgICAgIGNoZWNrQ1NTKHZpZXcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVET01DaGFuZ2UoZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCk7XG4gICAgICAgICAgICBpZiAodmlldy5kb2NWaWV3ICYmIHZpZXcuZG9jVmlldy5kaXJ0eSlcbiAgICAgICAgICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKHZpZXcuc3RhdGUpO1xuICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuY3VycmVudFNlbGVjdGlvbi5lcShzZWwpKVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblRvRE9NKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uLnNldChzZWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlZ2lzdGVyTXV0YXRpb24obXV0LCBhZGRlZCkge1xuICAgICAgICAvLyBJZ25vcmUgbXV0YXRpb25zIGluc2lkZSBub2RlcyB0aGF0IHdlcmUgYWxyZWFkeSBub3RlZCBhcyBpbnNlcnRlZFxuICAgICAgICBpZiAoYWRkZWQuaW5kZXhPZihtdXQudGFyZ2V0KSA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBkZXNjID0gdGhpcy52aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MobXV0LnRhcmdldCk7XG4gICAgICAgIGlmIChtdXQudHlwZSA9PSBcImF0dHJpYnV0ZXNcIiAmJlxuICAgICAgICAgICAgKGRlc2MgPT0gdGhpcy52aWV3LmRvY1ZpZXcgfHwgbXV0LmF0dHJpYnV0ZU5hbWUgPT0gXCJjb250ZW50ZWRpdGFibGVcIiB8fFxuICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc29tZXRpbWVzIGZpcmVzIHNwdXJpb3VzIGV2ZW50cyBmb3IgbnVsbC9lbXB0eSBzdHlsZXNcbiAgICAgICAgICAgICAgICAobXV0LmF0dHJpYnV0ZU5hbWUgPT0gXCJzdHlsZVwiICYmICFtdXQub2xkVmFsdWUgJiYgIW11dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIikpKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIWRlc2MgfHwgZGVzYy5pZ25vcmVNdXRhdGlvbihtdXQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChtdXQudHlwZSA9PSBcImNoaWxkTGlzdFwiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dC5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBtdXQuYWRkZWROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBhZGRlZC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdENoYW5nZWRUZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVzYy5jb250ZW50RE9NICYmIGRlc2MuY29udGVudERPTSAhPSBkZXNjLmRvbSAmJiAhZGVzYy5jb250ZW50RE9NLmNvbnRhaW5zKG11dC50YXJnZXQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGZyb206IGRlc2MucG9zQmVmb3JlLCB0bzogZGVzYy5wb3NBZnRlciB9O1xuICAgICAgICAgICAgbGV0IHByZXYgPSBtdXQucHJldmlvdXNTaWJsaW5nLCBuZXh0ID0gbXV0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgbXV0LmFkZGVkTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gSUUxMSBnaXZlcyB1cyBpbmNvcnJlY3QgbmV4dC9wcmV2IHNpYmxpbmdzIGZvciBzb21lXG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0aW9ucywgc28gaWYgdGhlcmUgYXJlIGFkZGVkIG5vZGVzLCByZWNvbXB1dGUgdGhvc2VcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG11dC5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IHByZXZpb3VzU2libGluZywgbmV4dFNpYmxpbmcgfSA9IG11dC5hZGRlZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZpb3VzU2libGluZyB8fCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKG11dC5hZGRlZE5vZGVzLCBwcmV2aW91c1NpYmxpbmcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dFNpYmxpbmcgfHwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChtdXQuYWRkZWROb2RlcywgbmV4dFNpYmxpbmcpIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbU9mZnNldCA9IHByZXYgJiYgcHJldi5wYXJlbnROb2RlID09IG11dC50YXJnZXRcbiAgICAgICAgICAgICAgICA/IGRvbUluZGV4KHByZXYpICsgMSA6IDA7XG4gICAgICAgICAgICBsZXQgZnJvbSA9IGRlc2MubG9jYWxQb3NGcm9tRE9NKG11dC50YXJnZXQsIGZyb21PZmZzZXQsIC0xKTtcbiAgICAgICAgICAgIGxldCB0b09mZnNldCA9IG5leHQgJiYgbmV4dC5wYXJlbnROb2RlID09IG11dC50YXJnZXRcbiAgICAgICAgICAgICAgICA/IGRvbUluZGV4KG5leHQpIDogbXV0LnRhcmdldC5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCB0byA9IGRlc2MubG9jYWxQb3NGcm9tRE9NKG11dC50YXJnZXQsIHRvT2Zmc2V0LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobXV0LnR5cGUgPT0gXCJhdHRyaWJ1dGVzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGZyb206IGRlc2MucG9zQXRTdGFydCAtIGRlc2MuYm9yZGVyLCB0bzogZGVzYy5wb3NBdEVuZCArIGRlc2MuYm9yZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIFwiY2hhcmFjdGVyRGF0YVwiXG4gICAgICAgICAgICB0aGlzLmxhc3RDaGFuZ2VkVGV4dE5vZGUgPSBtdXQudGFyZ2V0O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBkZXNjLnBvc0F0U3RhcnQsXG4gICAgICAgICAgICAgICAgdG86IGRlc2MucG9zQXRFbmQsXG4gICAgICAgICAgICAgICAgLy8gQW4gZXZlbnQgd2FzIGdlbmVyYXRlZCBmb3IgYSB0ZXh0IGNoYW5nZSB0aGF0IGRpZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICAvLyBhbnkgdGV4dC4gTWFyayB0aGUgZG9tIGNoYW5nZSB0byBmYWxsIGJhY2sgdG8gYXNzdW1pbmcgdGhlXG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIHdhcyB0eXBlZCBvdmVyIHdpdGggYW4gaWRlbnRpY2FsIHZhbHVlIGlmIGl0IGNhbid0XG4gICAgICAgICAgICAgICAgLy8gZmluZCBhbm90aGVyIGNoYW5nZS5cbiAgICAgICAgICAgICAgICB0eXBlT3ZlcjogbXV0LnRhcmdldC5ub2RlVmFsdWUgPT0gbXV0Lm9sZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxubGV0IGNzc0NoZWNrZWQgPSBuZXcgV2Vha01hcCgpO1xubGV0IGNzc0NoZWNrV2FybmVkID0gZmFsc2U7XG5mdW5jdGlvbiBjaGVja0NTUyh2aWV3KSB7XG4gICAgaWYgKGNzc0NoZWNrZWQuaGFzKHZpZXcpKVxuICAgICAgICByZXR1cm47XG4gICAgY3NzQ2hlY2tlZC5zZXQodmlldywgbnVsbCk7XG4gICAgaWYgKFsnbm9ybWFsJywgJ25vd3JhcCcsICdwcmUtbGluZSddLmluZGV4T2YoZ2V0Q29tcHV0ZWRTdHlsZSh2aWV3LmRvbSkud2hpdGVTcGFjZSkgIT09IC0xKSB7XG4gICAgICAgIHZpZXcucmVxdWlyZXNHZWNrb0hhY2tOb2RlID0gZ2Vja287XG4gICAgICAgIGlmIChjc3NDaGVja1dhcm5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc29sZVtcIndhcm5cIl0oXCJQcm9zZU1pcnJvciBleHBlY3RzIHRoZSBDU1Mgd2hpdGUtc3BhY2UgcHJvcGVydHkgdG8gYmUgc2V0LCBwcmVmZXJhYmx5IHRvICdwcmUtd3JhcCcuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGxvYWQgc3R5bGUvcHJvc2VtaXJyb3IuY3NzIGZyb20gdGhlIHByb3NlbWlycm9yLXZpZXcgcGFja2FnZS5cIik7XG4gICAgICAgIGNzc0NoZWNrV2FybmVkID0gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgcmFuZ2UpIHtcbiAgICBsZXQgYW5jaG9yTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBhbmNob3JPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcbiAgICBsZXQgZm9jdXNOb2RlID0gcmFuZ2UuZW5kQ29udGFpbmVyLCBmb2N1c09mZnNldCA9IHJhbmdlLmVuZE9mZnNldDtcbiAgICBsZXQgY3VycmVudEFuY2hvciA9IHZpZXcuZG9tQXRQb3Modmlldy5zdGF0ZS5zZWxlY3Rpb24uYW5jaG9yKTtcbiAgICAvLyBTaW5jZSBzdWNoIGEgcmFuZ2UgZG9lc24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuY2hvciBhbmQgaGVhZCxcbiAgICAvLyB1c2UgYSBoZXVyaXN0aWMgdGhhdCBmbGlwcyBpdCBhcm91bmQgaWYgaXRzIGVuZCBtYXRjaGVzIHRoZVxuICAgIC8vIGN1cnJlbnQgYW5jaG9yLlxuICAgIGlmIChpc0VxdWl2YWxlbnRQb3NpdGlvbihjdXJyZW50QW5jaG9yLm5vZGUsIGN1cnJlbnRBbmNob3Iub2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSlcbiAgICAgICAgW2FuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldF0gPSBbZm9jdXNOb2RlLCBmb2N1c09mZnNldCwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0XTtcbiAgICByZXR1cm4geyBhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQgfTtcbn1cbi8vIFVzZWQgdG8gd29yayBhcm91bmQgYSBTYWZhcmkgU2VsZWN0aW9uL3NoYWRvdyBET00gYnVnXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9kZXYvaXNzdWVzLzQxNCBmaXhcbmZ1bmN0aW9uIHNhZmFyaVNoYWRvd1NlbGVjdGlvblJhbmdlKHZpZXcsIHNlbGVjdGlvbikge1xuICAgIGlmIChzZWxlY3Rpb24uZ2V0Q29tcG9zZWRSYW5nZXMpIHtcbiAgICAgICAgbGV0IHJhbmdlID0gc2VsZWN0aW9uLmdldENvbXBvc2VkUmFuZ2VzKHZpZXcucm9vdClbMF07XG4gICAgICAgIGlmIChyYW5nZSlcbiAgICAgICAgICAgIHJldHVybiByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgcmFuZ2UpO1xuICAgIH1cbiAgICBsZXQgZm91bmQ7XG4gICAgZnVuY3Rpb24gcmVhZChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZm91bmQgPSBldmVudC5nZXRUYXJnZXRSYW5nZXMoKVswXTtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSBTYWZhcmkgKGF0IGxlYXN0IGluIDIwMTgtMjAyMikgZG9lc24ndCBwcm92aWRlIHJlZ3VsYXJcbiAgICAvLyBhY2Nlc3MgdG8gdGhlIHNlbGVjdGlvbiBpbnNpZGUgYSBzaGFkb3dSb290LCB3ZSBoYXZlIHRvIHBlcmZvcm0gYVxuICAgIC8vIHJpZGljdWxvdXMgaGFjayB0byBnZXQgYXQgaXTigJR1c2luZyBgZXhlY0NvbW1hbmRgIHRvIHRyaWdnZXIgYVxuICAgIC8vIGBiZWZvcmVJbnB1dGAgZXZlbnQgc28gdGhhdCB3ZSBjYW4gcmVhZCB0aGUgdGFyZ2V0IHJhbmdlIGZyb20gdGhlXG4gICAgLy8gZXZlbnQuXG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZWlucHV0XCIsIHJlYWQsIHRydWUpO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5kZW50XCIpO1xuICAgIHZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmVpbnB1dFwiLCByZWFkLCB0cnVlKTtcbiAgICByZXR1cm4gZm91bmQgPyByYW5nZVRvU2VsZWN0aW9uUmFuZ2UodmlldywgZm91bmQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGJsb2NrUGFyZW50KHZpZXcsIG5vZGUpIHtcbiAgICBmb3IgKGxldCBwID0gbm9kZS5wYXJlbnROb2RlOyBwICYmIHAgIT0gdmlldy5kb207IHAgPSBwLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB2aWV3LmRvY1ZpZXcubmVhcmVzdERlc2MocCwgdHJ1ZSk7XG4gICAgICAgIGlmIChkZXNjICYmIGRlc2Mubm9kZS5pc0Jsb2NrKVxuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vLyBOb3RlIHRoYXQgYWxsIHJlZmVyZW5jaW5nIGFuZCBwYXJzaW5nIGlzIGRvbmUgd2l0aCB0aGVcbi8vIHN0YXJ0LW9mLW9wZXJhdGlvbiBzZWxlY3Rpb24gYW5kIGRvY3VtZW50LCBzaW5jZSB0aGF0J3MgdGhlIG9uZVxuLy8gdGhhdCB0aGUgRE9NIHJlcHJlc2VudHMuIElmIGFueSBjaGFuZ2VzIGNhbWUgaW4gaW4gdGhlIG1lYW50aW1lLFxuLy8gdGhlIG1vZGlmaWNhdGlvbiBpcyBtYXBwZWQgb3ZlciB0aG9zZSBiZWZvcmUgaXQgaXMgYXBwbGllZCwgaW5cbi8vIHJlYWRET01DaGFuZ2UuXG5mdW5jdGlvbiBwYXJzZUJldHdlZW4odmlldywgZnJvbV8sIHRvXykge1xuICAgIGxldCB7IG5vZGU6IHBhcmVudCwgZnJvbU9mZnNldCwgdG9PZmZzZXQsIGZyb20sIHRvIH0gPSB2aWV3LmRvY1ZpZXcucGFyc2VSYW5nZShmcm9tXywgdG9fKTtcbiAgICBsZXQgZG9tU2VsID0gdmlldy5kb21TZWxlY3Rpb25SYW5nZSgpO1xuICAgIGxldCBmaW5kO1xuICAgIGxldCBhbmNob3IgPSBkb21TZWwuYW5jaG9yTm9kZTtcbiAgICBpZiAoYW5jaG9yICYmIHZpZXcuZG9tLmNvbnRhaW5zKGFuY2hvci5ub2RlVHlwZSA9PSAxID8gYW5jaG9yIDogYW5jaG9yLnBhcmVudE5vZGUpKSB7XG4gICAgICAgIGZpbmQgPSBbeyBub2RlOiBhbmNob3IsIG9mZnNldDogZG9tU2VsLmFuY2hvck9mZnNldCB9XTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25Db2xsYXBzZWQoZG9tU2VsKSlcbiAgICAgICAgICAgIGZpbmQucHVzaCh7IG5vZGU6IGRvbVNlbC5mb2N1c05vZGUsIG9mZnNldDogZG9tU2VsLmZvY3VzT2Zmc2V0IH0pO1xuICAgIH1cbiAgICAvLyBXb3JrIGFyb3VuZCBpc3N1ZSBpbiBDaHJvbWUgd2hlcmUgYmFja3NwYWNpbmcgc29tZXRpbWVzIHJlcGxhY2VzXG4gICAgLy8gdGhlIGRlbGV0ZWQgY29udGVudCB3aXRoIGEgcmFuZG9tIEJSIG5vZGUgKGlzc3VlcyAjNzk5LCAjODMxKVxuICAgIGlmIChjaHJvbWUgJiYgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCkge1xuICAgICAgICBmb3IgKGxldCBvZmYgPSB0b09mZnNldDsgb2ZmID4gZnJvbU9mZnNldDsgb2ZmLS0pIHtcbiAgICAgICAgICAgIGxldCBub2RlID0gcGFyZW50LmNoaWxkTm9kZXNbb2ZmIC0gMV0sIGRlc2MgPSBub2RlLnBtVmlld0Rlc2M7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgIWRlc2MpIHtcbiAgICAgICAgICAgICAgICB0b09mZnNldCA9IG9mZjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGVzYyB8fCBkZXNjLnNpemUpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHN0YXJ0RG9jID0gdmlldy5zdGF0ZS5kb2M7XG4gICAgbGV0IHBhcnNlciA9IHZpZXcuc29tZVByb3AoXCJkb21QYXJzZXJcIikgfHwgRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpO1xuICAgIGxldCAkZnJvbSA9IHN0YXJ0RG9jLnJlc29sdmUoZnJvbSk7XG4gICAgbGV0IHNlbCA9IG51bGwsIGRvYyA9IHBhcnNlci5wYXJzZShwYXJlbnQsIHtcbiAgICAgICAgdG9wTm9kZTogJGZyb20ucGFyZW50LFxuICAgICAgICB0b3BNYXRjaDogJGZyb20ucGFyZW50LmNvbnRlbnRNYXRjaEF0KCRmcm9tLmluZGV4KCkpLFxuICAgICAgICB0b3BPcGVuOiB0cnVlLFxuICAgICAgICBmcm9tOiBmcm9tT2Zmc2V0LFxuICAgICAgICB0bzogdG9PZmZzZXQsXG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZTogJGZyb20ucGFyZW50LnR5cGUud2hpdGVzcGFjZSA9PSBcInByZVwiID8gXCJmdWxsXCIgOiB0cnVlLFxuICAgICAgICBmaW5kUG9zaXRpb25zOiBmaW5kLFxuICAgICAgICBydWxlRnJvbU5vZGUsXG4gICAgICAgIGNvbnRleHQ6ICRmcm9tXG4gICAgfSk7XG4gICAgaWYgKGZpbmQgJiYgZmluZFswXS5wb3MgIT0gbnVsbCkge1xuICAgICAgICBsZXQgYW5jaG9yID0gZmluZFswXS5wb3MsIGhlYWQgPSBmaW5kWzFdICYmIGZpbmRbMV0ucG9zO1xuICAgICAgICBpZiAoaGVhZCA9PSBudWxsKVxuICAgICAgICAgICAgaGVhZCA9IGFuY2hvcjtcbiAgICAgICAgc2VsID0geyBhbmNob3I6IGFuY2hvciArIGZyb20sIGhlYWQ6IGhlYWQgKyBmcm9tIH07XG4gICAgfVxuICAgIHJldHVybiB7IGRvYywgc2VsLCBmcm9tLCB0byB9O1xufVxuZnVuY3Rpb24gcnVsZUZyb21Ob2RlKGRvbSkge1xuICAgIGxldCBkZXNjID0gZG9tLnBtVmlld0Rlc2M7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MucGFyc2VSdWxlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRvbS5ub2RlTmFtZSA9PSBcIkJSXCIgJiYgZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgICAgLy8gU2FmYXJpIHJlcGxhY2VzIHRoZSBsaXN0IGl0ZW0gb3IgdGFibGUgY2VsbCB3aXRoIGEgQlJcbiAgICAgICAgLy8gZGlyZWN0bHkgaW4gdGhlIGxpc3Qgbm9kZSAoPyEpIGlmIHlvdSBkZWxldGUgdGhlIGxhc3RcbiAgICAgICAgLy8gY2hhcmFjdGVyIGluIGEgbGlzdCBpdGVtIG9yIHRhYmxlIGNlbGwgKCM3MDgsICM4NjIpXG4gICAgICAgIGlmIChzYWZhcmkgJiYgL14odWx8b2wpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBza2lwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9tLnBhcmVudE5vZGUubGFzdENoaWxkID09IGRvbSB8fCBzYWZhcmkgJiYgL14odHJ8dGFibGUpJC9pLnRlc3QoZG9tLnBhcmVudE5vZGUubm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkb20ubm9kZU5hbWUgPT0gXCJJTUdcIiAmJiBkb20uZ2V0QXR0cmlidXRlKFwibWFyay1wbGFjZWhvbGRlclwiKSkge1xuICAgICAgICByZXR1cm4geyBpZ25vcmU6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBpc0lubGluZSA9IC9eKGF8YWJicnxhY3JvbnltfGJ8YmRbaW9dfGJpZ3xicnxidXR0b258Y2l0ZXxjb2RlfGRhdGEobGlzdCk/fGRlbHxkZm58ZW18aXxpbnN8a2JkfGxhYmVsfG1hcHxtYXJrfG1ldGVyfG91dHB1dHxxfHJ1Ynl8c3xzYW1wfHNtYWxsfHNwYW58c3Ryb25nfHN1W2JwXXx0aW1lfHV8dHR8dmFyKSQvaTtcbmZ1bmN0aW9uIHJlYWRET01DaGFuZ2UodmlldywgZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZE5vZGVzKSB7XG4gICAgbGV0IGNvbXBvc2l0aW9uSUQgPSB2aWV3LmlucHV0LmNvbXBvc2l0aW9uUGVuZGluZ0NoYW5nZXMgfHwgKHZpZXcuY29tcG9zaW5nID8gdmlldy5pbnB1dC5jb21wb3NpdGlvbklEIDogMCk7XG4gICAgdmlldy5pbnB1dC5jb21wb3NpdGlvblBlbmRpbmdDaGFuZ2VzID0gMDtcbiAgICBpZiAoZnJvbSA8IDApIHtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHZpZXcuaW5wdXQubGFzdFNlbGVjdGlvblRpbWUgPiBEYXRlLm5vdygpIC0gNTAgPyB2aWV3LmlucHV0Lmxhc3RTZWxlY3Rpb25PcmlnaW4gOiBudWxsO1xuICAgICAgICBsZXQgbmV3U2VsID0gc2VsZWN0aW9uRnJvbURPTSh2aWV3LCBvcmlnaW4pO1xuICAgICAgICBpZiAobmV3U2VsICYmICF2aWV3LnN0YXRlLnNlbGVjdGlvbi5lcShuZXdTZWwpKSB7XG4gICAgICAgICAgICBpZiAoY2hyb21lICYmIGFuZHJvaWQgJiZcbiAgICAgICAgICAgICAgICB2aWV3LmlucHV0Lmxhc3RLZXlDb2RlID09PSAxMyAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUgJiZcbiAgICAgICAgICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXdTZWwpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbiA9PSBcInBvaW50ZXJcIilcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwicG9pbnRlclwiLCB0cnVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdpbiA9PSBcImtleVwiKVxuICAgICAgICAgICAgICAgIHRyLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICB0ci5zZXRNZXRhKFwiY29tcG9zaXRpb25cIiwgY29tcG9zaXRpb25JRCk7XG4gICAgICAgICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCAkYmVmb3JlID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShmcm9tKTtcbiAgICBsZXQgc2hhcmVkID0gJGJlZm9yZS5zaGFyZWREZXB0aCh0byk7XG4gICAgZnJvbSA9ICRiZWZvcmUuYmVmb3JlKHNoYXJlZCArIDEpO1xuICAgIHRvID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZSh0bykuYWZ0ZXIoc2hhcmVkICsgMSk7XG4gICAgbGV0IHNlbCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGxldCBwYXJzZSA9IHBhcnNlQmV0d2Vlbih2aWV3LCBmcm9tLCB0byk7XG4gICAgbGV0IGRvYyA9IHZpZXcuc3RhdGUuZG9jLCBjb21wYXJlID0gZG9jLnNsaWNlKHBhcnNlLmZyb20sIHBhcnNlLnRvKTtcbiAgICBsZXQgcHJlZmVycmVkUG9zLCBwcmVmZXJyZWRTaWRlO1xuICAgIC8vIFByZWZlciBhbmNob3JpbmcgdG8gZW5kIHdoZW4gQmFja3NwYWNlIGlzIHByZXNzZWRcbiAgICBpZiAodmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9PT0gOCAmJiBEYXRlLm5vdygpIC0gMTAwIDwgdmlldy5pbnB1dC5sYXN0S2V5Q29kZVRpbWUpIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24udG87XG4gICAgICAgIHByZWZlcnJlZFNpZGUgPSBcImVuZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJlZmVycmVkUG9zID0gdmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbTtcbiAgICAgICAgcHJlZmVycmVkU2lkZSA9IFwic3RhcnRcIjtcbiAgICB9XG4gICAgdmlldy5pbnB1dC5sYXN0S2V5Q29kZSA9IG51bGw7XG4gICAgbGV0IGNoYW5nZSA9IGZpbmREaWZmKGNvbXBhcmUuY29udGVudCwgcGFyc2UuZG9jLmNvbnRlbnQsIHBhcnNlLmZyb20sIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSk7XG4gICAgaWYgKGNoYW5nZSlcbiAgICAgICAgdmlldy5pbnB1dC5kb21DaGFuZ2VDb3VudCsrO1xuICAgIGlmICgoaW9zICYmIHZpZXcuaW5wdXQubGFzdElPU0VudGVyID4gRGF0ZS5ub3coKSAtIDIyNSB8fCBhbmRyb2lkKSAmJlxuICAgICAgICBhZGRlZE5vZGVzLnNvbWUobiA9PiBuLm5vZGVUeXBlID09IDEgJiYgIWlzSW5saW5lLnRlc3Qobi5ub2RlTmFtZSkpICYmXG4gICAgICAgICghY2hhbmdlIHx8IGNoYW5nZS5lbmRBID49IGNoYW5nZS5lbmRCKSAmJlxuICAgICAgICB2aWV3LnNvbWVQcm9wKFwiaGFuZGxlS2V5RG93blwiLCBmID0+IGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpKSkge1xuICAgICAgICB2aWV3LmlucHV0Lmxhc3RJT1NFbnRlciA9IDA7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgaWYgKHR5cGVPdmVyICYmIHNlbCBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24gJiYgIXNlbC5lbXB0eSAmJiBzZWwuJGhlYWQuc2FtZVBhcmVudChzZWwuJGFuY2hvcikgJiZcbiAgICAgICAgICAgICF2aWV3LmNvbXBvc2luZyAmJiAhKHBhcnNlLnNlbCAmJiBwYXJzZS5zZWwuYW5jaG9yICE9IHBhcnNlLnNlbC5oZWFkKSkge1xuICAgICAgICAgICAgY2hhbmdlID0geyBzdGFydDogc2VsLmZyb20sIGVuZEE6IHNlbC50bywgZW5kQjogc2VsLnRvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocGFyc2Uuc2VsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbCA9IHJlc29sdmVTZWxlY3Rpb24odmlldywgdmlldy5zdGF0ZS5kb2MsIHBhcnNlLnNlbCk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbCAmJiAhc2VsLmVxKHZpZXcuc3RhdGUuc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHIgPSB2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbihzZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRpb25JRClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyLnNldE1ldGEoXCJjb21wb3NpdGlvblwiLCBjb21wb3NpdGlvbklEKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kaXNwYXRjaCh0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvdmVyd3JpdGluZyBhIHNlbGVjdGlvbiBieSB0eXBpbmcgbWF0Y2hlc1xuICAgIC8vIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHNlbGVjdGVkIGNvbnRlbnQsIGNyZWF0aW5nIGEgY2hhbmdlXG4gICAgLy8gdGhhdCdzIHNtYWxsZXIgdGhhbiB3aGF0IHdhcyBhY3R1YWxseSBvdmVyd3JpdHRlbi5cbiAgICBpZiAodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSA8IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvICYmXG4gICAgICAgIGNoYW5nZS5zdGFydCA9PSBjaGFuZ2UuZW5kQiAmJlxuICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHtcbiAgICAgICAgaWYgKGNoYW5nZS5zdGFydCA+IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gJiYgY2hhbmdlLnN0YXJ0IDw9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb20gKyAyICYmXG4gICAgICAgICAgICB2aWV3LnN0YXRlLnNlbGVjdGlvbi5mcm9tID49IHBhcnNlLmZyb20pIHtcbiAgICAgICAgICAgIGNoYW5nZS5zdGFydCA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hhbmdlLmVuZEEgPCB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAmJiBjaGFuZ2UuZW5kQSA+PSB2aWV3LnN0YXRlLnNlbGVjdGlvbi50byAtIDIgJiZcbiAgICAgICAgICAgIHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvIDw9IHBhcnNlLnRvKSB7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQiArPSAodmlldy5zdGF0ZS5zZWxlY3Rpb24udG8gLSBjaGFuZ2UuZW5kQSk7XG4gICAgICAgICAgICBjaGFuZ2UuZW5kQSA9IHZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElFMTEgd2lsbCBpbnNlcnQgYSBub24tYnJlYWtpbmcgc3BhY2UgX2FoZWFkXyBvZiB0aGUgc3BhY2UgYWZ0ZXJcbiAgICAvLyB0aGUgY3Vyc29yIHNwYWNlIHdoZW4gYWRkaW5nIGEgc3BhY2UgYmVmb3JlIGFub3RoZXIgc3BhY2UuIFdoZW5cbiAgICAvLyB0aGF0IGhhcHBlbmVkLCBhZGp1c3QgdGhlIGNoYW5nZSB0byBjb3ZlciB0aGUgc3BhY2UgaW5zdGVhZC5cbiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8PSAxMSAmJiBjaGFuZ2UuZW5kQiA9PSBjaGFuZ2Uuc3RhcnQgKyAxICYmXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5zdGFydCAmJiBjaGFuZ2Uuc3RhcnQgPiBwYXJzZS5mcm9tICYmXG4gICAgICAgIHBhcnNlLmRvYy50ZXh0QmV0d2VlbihjaGFuZ2Uuc3RhcnQgLSBwYXJzZS5mcm9tIC0gMSwgY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSArIDEpID09IFwiIFxcdTAwYTBcIikge1xuICAgICAgICBjaGFuZ2Uuc3RhcnQtLTtcbiAgICAgICAgY2hhbmdlLmVuZEEtLTtcbiAgICAgICAgY2hhbmdlLmVuZEItLTtcbiAgICB9XG4gICAgbGV0ICRmcm9tID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5zdGFydCAtIHBhcnNlLmZyb20pO1xuICAgIGxldCAkdG8gPSBwYXJzZS5kb2MucmVzb2x2ZU5vQ2FjaGUoY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKTtcbiAgICBsZXQgJGZyb21BID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KTtcbiAgICBsZXQgaW5saW5lQ2hhbmdlID0gJGZyb20uc2FtZVBhcmVudCgkdG8pICYmICRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50ICYmICRmcm9tQS5lbmQoKSA+PSBjaGFuZ2UuZW5kQTtcbiAgICBsZXQgbmV4dFNlbDtcbiAgICAvLyBJZiB0aGlzIGxvb2tzIGxpa2UgdGhlIGVmZmVjdCBvZiBwcmVzc2luZyBFbnRlciAob3Igd2FzIHJlY29yZGVkXG4gICAgLy8gYXMgYmVpbmcgYW4gaU9TIGVudGVyIHByZXNzKSwganVzdCBkaXNwYXRjaCBhbiBFbnRlciBrZXkgaW5zdGVhZC5cbiAgICBpZiAoKChpb3MgJiYgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPiBEYXRlLm5vdygpIC0gMjI1ICYmXG4gICAgICAgICghaW5saW5lQ2hhbmdlIHx8IGFkZGVkTm9kZXMuc29tZShuID0+IG4ubm9kZU5hbWUgPT0gXCJESVZcIiB8fCBuLm5vZGVOYW1lID09IFwiUFwiKSkpIHx8XG4gICAgICAgICghaW5saW5lQ2hhbmdlICYmICRmcm9tLnBvcyA8IHBhcnNlLmRvYy5jb250ZW50LnNpemUgJiZcbiAgICAgICAgICAgICghJGZyb20uc2FtZVBhcmVudCgkdG8pIHx8ICEkZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkgJiZcbiAgICAgICAgICAgICEvXFxTLy50ZXN0KHBhcnNlLmRvYy50ZXh0QmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MsIFwiXCIsIFwiXCIpKSAmJlxuICAgICAgICAgICAgKG5leHRTZWwgPSBTZWxlY3Rpb24uZmluZEZyb20ocGFyc2UuZG9jLnJlc29sdmUoJGZyb20ucG9zICsgMSksIDEsIHRydWUpKSAmJlxuICAgICAgICAgICAgbmV4dFNlbC5oZWFkID4gJGZyb20ucG9zKSkgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDEzLCBcIkVudGVyXCIpKSkpIHtcbiAgICAgICAgdmlldy5pbnB1dC5sYXN0SU9TRW50ZXIgPSAwO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFNhbWUgZm9yIGJhY2tzcGFjZVxuICAgIGlmICh2aWV3LnN0YXRlLnNlbGVjdGlvbi5hbmNob3IgPiBjaGFuZ2Uuc3RhcnQgJiZcbiAgICAgICAgbG9va3NMaWtlQmFja3NwYWNlKGRvYywgY2hhbmdlLnN0YXJ0LCBjaGFuZ2UuZW5kQSwgJGZyb20sICR0bykgJiZcbiAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZiA9PiBmKHZpZXcsIGtleUV2ZW50KDgsIFwiQmFja3NwYWNlXCIpKSkpIHtcbiAgICAgICAgaWYgKGFuZHJvaWQgJiYgY2hyb21lKVxuICAgICAgICAgICAgdmlldy5kb21PYnNlcnZlci5zdXBwcmVzc1NlbGVjdGlvblVwZGF0ZXMoKTsgLy8gIzgyMFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIENocm9tZSB3aWxsIG9jY2FzaW9uYWxseSwgZHVyaW5nIGNvbXBvc2l0aW9uLCBkZWxldGUgdGhlXG4gICAgLy8gZW50aXJlIGNvbXBvc2l0aW9uIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGluc2VydCBpdCBhZ2Fpbi4gVGhpcyBpc1xuICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHRoYXQgc2l0dWF0aW9uLlxuICAgIGlmIChjaHJvbWUgJiYgY2hhbmdlLmVuZEIgPT0gY2hhbmdlLnN0YXJ0KVxuICAgICAgICB2aWV3LmlucHV0Lmxhc3RDaHJvbWVEZWxldGUgPSBEYXRlLm5vdygpO1xuICAgIC8vIFRoaXMgdHJpZXMgdG8gZGV0ZWN0IEFuZHJvaWQgdmlydHVhbCBrZXlib2FyZFxuICAgIC8vIGVudGVyLWFuZC1waWNrLXN1Z2dlc3Rpb24gYWN0aW9uLiBUaGF0IHNvbWV0aW1lcyAoc2VlIGlzc3VlXG4gICAgLy8gIzEwNTkpIGZpcnN0IGZpcmVzIGEgRE9NIG11dGF0aW9uLCBiZWZvcmUgbW92aW5nIHRoZSBzZWxlY3Rpb24gdG9cbiAgICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBibG9jay4gQW5kIHRoZW4sIGJlY2F1c2UgUHJvc2VNaXJyb3IgY2xlYW5zIHVwXG4gICAgLy8gdGhlIERPTSBzZWxlY3Rpb24sIGl0IGdpdmVzIHVwIG1vdmluZyB0aGUgc2VsZWN0aW9uIGVudGlyZWx5LFxuICAgIC8vIGxlYXZpbmcgdGhlIGN1cnNvciBpbiB0aGUgd3JvbmcgcGxhY2UuIFdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBkcm9wXG4gICAgLy8gdGhlIG5ldyBwYXJhZ3JhcGggZnJvbSB0aGUgaW5pdGlhbCBjaGFuZ2UsIGFuZCBmaXJlIGEgc2ltdWxhdGVkXG4gICAgLy8gZW50ZXIga2V5IGFmdGVyd2FyZHMuXG4gICAgaWYgKGFuZHJvaWQgJiYgIWlubGluZUNoYW5nZSAmJiAkZnJvbS5zdGFydCgpICE9ICR0by5zdGFydCgpICYmICR0by5wYXJlbnRPZmZzZXQgPT0gMCAmJiAkZnJvbS5kZXB0aCA9PSAkdG8uZGVwdGggJiZcbiAgICAgICAgcGFyc2Uuc2VsICYmIHBhcnNlLnNlbC5hbmNob3IgPT0gcGFyc2Uuc2VsLmhlYWQgJiYgcGFyc2Uuc2VsLmhlYWQgPT0gY2hhbmdlLmVuZEEpIHtcbiAgICAgICAgY2hhbmdlLmVuZEIgLT0gMjtcbiAgICAgICAgJHRvID0gcGFyc2UuZG9jLnJlc29sdmVOb0NhY2hlKGNoYW5nZS5lbmRCIC0gcGFyc2UuZnJvbSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdmlldy5zb21lUHJvcChcImhhbmRsZUtleURvd25cIiwgZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYodmlldywga2V5RXZlbnQoMTMsIFwiRW50ZXJcIikpOyB9KTtcbiAgICAgICAgfSwgMjApO1xuICAgIH1cbiAgICBsZXQgY2hGcm9tID0gY2hhbmdlLnN0YXJ0LCBjaFRvID0gY2hhbmdlLmVuZEE7XG4gICAgbGV0IHRyLCBzdG9yZWRNYXJrcywgbWFya0NoYW5nZTtcbiAgICBpZiAoaW5saW5lQ2hhbmdlKSB7XG4gICAgICAgIGlmICgkZnJvbS5wb3MgPT0gJHRvLnBvcykgeyAvLyBEZWxldGlvblxuICAgICAgICAgICAgLy8gSUUxMSBzb21ldGltZXMgd2VpcmRseSBtb3ZlcyB0aGUgRE9NIHNlbGVjdGlvbiBhcm91bmQgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGJhY2tzcGFjaW5nIG91dCB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIHRleHRibG9ja1xuICAgICAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPD0gMTEgJiYgJGZyb20ucGFyZW50T2Zmc2V0ID09IDApIHtcbiAgICAgICAgICAgICAgICB2aWV3LmRvbU9ic2VydmVyLnN1cHByZXNzU2VsZWN0aW9uVXBkYXRlcygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZWN0aW9uVG9ET00odmlldyksIDIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5kZWxldGUoY2hGcm9tLCBjaFRvKTtcbiAgICAgICAgICAgIHN0b3JlZE1hcmtzID0gZG9jLnJlc29sdmUoY2hhbmdlLnN0YXJ0KS5tYXJrc0Fjcm9zcyhkb2MucmVzb2x2ZShjaGFuZ2UuZW5kQSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCAvLyBBZGRpbmcgb3IgcmVtb3ZpbmcgYSBtYXJrXG4gICAgICAgIGNoYW5nZS5lbmRBID09IGNoYW5nZS5lbmRCICYmXG4gICAgICAgICAgICAobWFya0NoYW5nZSA9IGlzTWFya0NoYW5nZSgkZnJvbS5wYXJlbnQuY29udGVudC5jdXQoJGZyb20ucGFyZW50T2Zmc2V0LCAkdG8ucGFyZW50T2Zmc2V0KSwgJGZyb21BLnBhcmVudC5jb250ZW50LmN1dCgkZnJvbUEucGFyZW50T2Zmc2V0LCBjaGFuZ2UuZW5kQSAtICRmcm9tQS5zdGFydCgpKSkpKSB7XG4gICAgICAgICAgICB0ciA9IHZpZXcuc3RhdGUudHI7XG4gICAgICAgICAgICBpZiAobWFya0NoYW5nZS50eXBlID09IFwiYWRkXCIpXG4gICAgICAgICAgICAgICAgdHIuYWRkTWFyayhjaEZyb20sIGNoVG8sIG1hcmtDaGFuZ2UubWFyayk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdHIucmVtb3ZlTWFyayhjaEZyb20sIGNoVG8sIG1hcmtDaGFuZ2UubWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJGZyb20ucGFyZW50LmNoaWxkKCRmcm9tLmluZGV4KCkpLmlzVGV4dCAmJiAkZnJvbS5pbmRleCgpID09ICR0by5pbmRleCgpIC0gKCR0by50ZXh0T2Zmc2V0ID8gMCA6IDEpKSB7XG4gICAgICAgICAgICAvLyBCb3RoIHBvc2l0aW9ucyBpbiB0aGUgc2FtZSB0ZXh0IG5vZGUgLS0gc2ltcGx5IGluc2VydCB0ZXh0XG4gICAgICAgICAgICBsZXQgdGV4dCA9ICRmcm9tLnBhcmVudC50ZXh0QmV0d2VlbigkZnJvbS5wYXJlbnRPZmZzZXQsICR0by5wYXJlbnRPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKHZpZXcuc29tZVByb3AoXCJoYW5kbGVUZXh0SW5wdXRcIiwgZiA9PiBmKHZpZXcsIGNoRnJvbSwgY2hUbywgdGV4dCkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHRyID0gdmlldy5zdGF0ZS50ci5pbnNlcnRUZXh0KHRleHQsIGNoRnJvbSwgY2hUbyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0cilcbiAgICAgICAgdHIgPSB2aWV3LnN0YXRlLnRyLnJlcGxhY2UoY2hGcm9tLCBjaFRvLCBwYXJzZS5kb2Muc2xpY2UoY2hhbmdlLnN0YXJ0IC0gcGFyc2UuZnJvbSwgY2hhbmdlLmVuZEIgLSBwYXJzZS5mcm9tKSk7XG4gICAgaWYgKHBhcnNlLnNlbCkge1xuICAgICAgICBsZXQgc2VsID0gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCB0ci5kb2MsIHBhcnNlLnNlbCk7XG4gICAgICAgIC8vIENocm9tZSB3aWxsIHNvbWV0aW1lcywgZHVyaW5nIGNvbXBvc2l0aW9uLCByZXBvcnQgdGhlXG4gICAgICAgIC8vIHNlbGVjdGlvbiBpbiB0aGUgd3JvbmcgcGxhY2UuIElmIGl0IGxvb2tzIGxpa2UgdGhhdCBpc1xuICAgICAgICAvLyBoYXBwZW5pbmcsIGRvbid0IHVwZGF0ZSB0aGUgc2VsZWN0aW9uLlxuICAgICAgICAvLyBFZGdlIGp1c3QgZG9lc24ndCBtb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCB3aGVuIHlvdSBzdGFydCB0eXBpbmdcbiAgICAgICAgLy8gaW4gYW4gZW1wdHkgYmxvY2sgb3IgYmV0d2VlbiBiciBub2Rlcy5cbiAgICAgICAgaWYgKHNlbCAmJiAhKGNocm9tZSAmJiB2aWV3LmNvbXBvc2luZyAmJiBzZWwuZW1wdHkgJiZcbiAgICAgICAgICAgIChjaGFuZ2Uuc3RhcnQgIT0gY2hhbmdlLmVuZEIgfHwgdmlldy5pbnB1dC5sYXN0Q2hyb21lRGVsZXRlIDwgRGF0ZS5ub3coKSAtIDEwMCkgJiZcbiAgICAgICAgICAgIChzZWwuaGVhZCA9PSBjaEZyb20gfHwgc2VsLmhlYWQgPT0gdHIubWFwcGluZy5tYXAoY2hUbykgLSAxKSB8fFxuICAgICAgICAgICAgaWUgJiYgc2VsLmVtcHR5ICYmIHNlbC5oZWFkID09IGNoRnJvbSkpXG4gICAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICB9XG4gICAgaWYgKHN0b3JlZE1hcmtzKVxuICAgICAgICB0ci5lbnN1cmVNYXJrcyhzdG9yZWRNYXJrcyk7XG4gICAgaWYgKGNvbXBvc2l0aW9uSUQpXG4gICAgICAgIHRyLnNldE1ldGEoXCJjb21wb3NpdGlvblwiLCBjb21wb3NpdGlvbklEKTtcbiAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNlbGVjdGlvbih2aWV3LCBkb2MsIHBhcnNlZFNlbCkge1xuICAgIGlmIChNYXRoLm1heChwYXJzZWRTZWwuYW5jaG9yLCBwYXJzZWRTZWwuaGVhZCkgPiBkb2MuY29udGVudC5zaXplKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gc2VsZWN0aW9uQmV0d2Vlbih2aWV3LCBkb2MucmVzb2x2ZShwYXJzZWRTZWwuYW5jaG9yKSwgZG9jLnJlc29sdmUocGFyc2VkU2VsLmhlYWQpKTtcbn1cbi8vIEdpdmVuIHR3byBzYW1lLWxlbmd0aCwgbm9uLWVtcHR5IGZyYWdtZW50cyBvZiBpbmxpbmUgY29udGVudCxcbi8vIGRldGVybWluZSB3aGV0aGVyIHRoZSBmaXJzdCBjb3VsZCBiZSBjcmVhdGVkIGZyb20gdGhlIHNlY29uZCBieVxuLy8gcmVtb3Zpbmcgb3IgYWRkaW5nIGEgc2luZ2xlIG1hcmsgdHlwZS5cbmZ1bmN0aW9uIGlzTWFya0NoYW5nZShjdXIsIHByZXYpIHtcbiAgICBsZXQgY3VyTWFya3MgPSBjdXIuZmlyc3RDaGlsZC5tYXJrcywgcHJldk1hcmtzID0gcHJldi5maXJzdENoaWxkLm1hcmtzO1xuICAgIGxldCBhZGRlZCA9IGN1ck1hcmtzLCByZW1vdmVkID0gcHJldk1hcmtzLCB0eXBlLCBtYXJrLCB1cGRhdGU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2TWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgIGFkZGVkID0gcHJldk1hcmtzW2ldLnJlbW92ZUZyb21TZXQoYWRkZWQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VyTWFya3MubGVuZ3RoOyBpKyspXG4gICAgICAgIHJlbW92ZWQgPSBjdXJNYXJrc1tpXS5yZW1vdmVGcm9tU2V0KHJlbW92ZWQpO1xuICAgIGlmIChhZGRlZC5sZW5ndGggPT0gMSAmJiByZW1vdmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIG1hcmsgPSBhZGRlZFswXTtcbiAgICAgICAgdHlwZSA9IFwiYWRkXCI7XG4gICAgICAgIHVwZGF0ZSA9IChub2RlKSA9PiBub2RlLm1hcmsobWFyay5hZGRUb1NldChub2RlLm1hcmtzKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFkZGVkLmxlbmd0aCA9PSAwICYmIHJlbW92ZWQubGVuZ3RoID09IDEpIHtcbiAgICAgICAgbWFyayA9IHJlbW92ZWRbMF07XG4gICAgICAgIHR5cGUgPSBcInJlbW92ZVwiO1xuICAgICAgICB1cGRhdGUgPSAobm9kZSkgPT4gbm9kZS5tYXJrKG1hcmsucmVtb3ZlRnJvbVNldChub2RlLm1hcmtzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IHVwZGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYuY2hpbGRDb3VudDsgaSsrKVxuICAgICAgICB1cGRhdGVkLnB1c2godXBkYXRlKHByZXYuY2hpbGQoaSkpKTtcbiAgICBpZiAoRnJhZ21lbnQuZnJvbSh1cGRhdGVkKS5lcShjdXIpKVxuICAgICAgICByZXR1cm4geyBtYXJrLCB0eXBlIH07XG59XG5mdW5jdGlvbiBsb29rc0xpa2VCYWNrc3BhY2Uob2xkLCBzdGFydCwgZW5kLCAkbmV3U3RhcnQsICRuZXdFbmQpIHtcbiAgICBpZiAoIC8vIFRoZSBjb250ZW50IG11c3QgaGF2ZSBzaHJ1bmtcbiAgICBlbmQgLSBzdGFydCA8PSAkbmV3RW5kLnBvcyAtICRuZXdTdGFydC5wb3MgfHxcbiAgICAgICAgLy8gbmV3RW5kIG11c3QgcG9pbnQgZGlyZWN0bHkgYXQgb3IgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYmxvY2sgdGhhdCBuZXdTdGFydCBwb2ludHMgaW50b1xuICAgICAgICBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJG5ld1N0YXJ0LCB0cnVlLCBmYWxzZSkgPCAkbmV3RW5kLnBvcylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCAkc3RhcnQgPSBvbGQucmVzb2x2ZShzdGFydCk7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlLCByYXRoZXIgdGhhbiBqb2luaW5nIGJsb2NrcywgdGhlIGNoYW5nZSBqdXN0IHJlbW92ZWQgYW4gZW50aXJlIGJsb2NrXG4gICAgaWYgKCEkbmV3U3RhcnQucGFyZW50LmlzVGV4dGJsb2NrKSB7XG4gICAgICAgIGxldCBhZnRlciA9ICRzdGFydC5ub2RlQWZ0ZXI7XG4gICAgICAgIHJldHVybiBhZnRlciAhPSBudWxsICYmIGVuZCA9PSBzdGFydCArIGFmdGVyLm5vZGVTaXplO1xuICAgIH1cbiAgICAvLyBTdGFydCBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgYSBibG9ja1xuICAgIGlmICgkc3RhcnQucGFyZW50T2Zmc2V0IDwgJHN0YXJ0LnBhcmVudC5jb250ZW50LnNpemUgfHwgISRzdGFydC5wYXJlbnQuaXNUZXh0YmxvY2spXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgJG5leHQgPSBvbGQucmVzb2x2ZShza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHN0YXJ0LCB0cnVlLCB0cnVlKSk7XG4gICAgLy8gVGhlIG5leHQgdGV4dGJsb2NrIG11c3Qgc3RhcnQgYmVmb3JlIGVuZCBhbmQgZW5kIG5lYXIgaXRcbiAgICBpZiAoISRuZXh0LnBhcmVudC5pc1RleHRibG9jayB8fCAkbmV4dC5wb3MgPiBlbmQgfHxcbiAgICAgICAgc2tpcENsb3NpbmdBbmRPcGVuaW5nKCRuZXh0LCB0cnVlLCBmYWxzZSkgPCBlbmQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBUaGUgZnJhZ21lbnRzIGFmdGVyIHRoZSBqb2luIHBvaW50IG11c3QgbWF0Y2hcbiAgICByZXR1cm4gJG5ld1N0YXJ0LnBhcmVudC5jb250ZW50LmN1dCgkbmV3U3RhcnQucGFyZW50T2Zmc2V0KS5lcSgkbmV4dC5wYXJlbnQuY29udGVudCk7XG59XG5mdW5jdGlvbiBza2lwQ2xvc2luZ0FuZE9wZW5pbmcoJHBvcywgZnJvbUVuZCwgbWF5T3Blbikge1xuICAgIGxldCBkZXB0aCA9ICRwb3MuZGVwdGgsIGVuZCA9IGZyb21FbmQgPyAkcG9zLmVuZCgpIDogJHBvcy5wb3M7XG4gICAgd2hpbGUgKGRlcHRoID4gMCAmJiAoZnJvbUVuZCB8fCAkcG9zLmluZGV4QWZ0ZXIoZGVwdGgpID09ICRwb3Mubm9kZShkZXB0aCkuY2hpbGRDb3VudCkpIHtcbiAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgZW5kKys7XG4gICAgICAgIGZyb21FbmQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1heU9wZW4pIHtcbiAgICAgICAgbGV0IG5leHQgPSAkcG9zLm5vZGUoZGVwdGgpLm1heWJlQ2hpbGQoJHBvcy5pbmRleEFmdGVyKGRlcHRoKSk7XG4gICAgICAgIHdoaWxlIChuZXh0ICYmICFuZXh0LmlzTGVhZikge1xuICAgICAgICAgICAgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIGVuZCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5mdW5jdGlvbiBmaW5kRGlmZihhLCBiLCBwb3MsIHByZWZlcnJlZFBvcywgcHJlZmVycmVkU2lkZSkge1xuICAgIGxldCBzdGFydCA9IGEuZmluZERpZmZTdGFydChiLCBwb3MpO1xuICAgIGlmIChzdGFydCA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBsZXQgeyBhOiBlbmRBLCBiOiBlbmRCIH0gPSBhLmZpbmREaWZmRW5kKGIsIHBvcyArIGEuc2l6ZSwgcG9zICsgYi5zaXplKTtcbiAgICBpZiAocHJlZmVycmVkU2lkZSA9PSBcImVuZFwiKSB7XG4gICAgICAgIGxldCBhZGp1c3QgPSBNYXRoLm1heCgwLCBzdGFydCAtIE1hdGgubWluKGVuZEEsIGVuZEIpKTtcbiAgICAgICAgcHJlZmVycmVkUG9zIC09IGVuZEEgKyBhZGp1c3QgLSBzdGFydDtcbiAgICB9XG4gICAgaWYgKGVuZEEgPCBzdGFydCAmJiBhLnNpemUgPCBiLnNpemUpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEEgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGIuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYi50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0ICsgKGVuZEIgLSBlbmRBKTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0O1xuICAgIH1cbiAgICBlbHNlIGlmIChlbmRCIDwgc3RhcnQpIHtcbiAgICAgICAgbGV0IG1vdmUgPSBwcmVmZXJyZWRQb3MgPD0gc3RhcnQgJiYgcHJlZmVycmVkUG9zID49IGVuZEIgPyBzdGFydCAtIHByZWZlcnJlZFBvcyA6IDA7XG4gICAgICAgIHN0YXJ0IC09IG1vdmU7XG4gICAgICAgIGlmIChzdGFydCAmJiBzdGFydCA8IGEuc2l6ZSAmJiBpc1N1cnJvZ2F0ZVBhaXIoYS50ZXh0QmV0d2VlbihzdGFydCAtIDEsIHN0YXJ0ICsgMSkpKVxuICAgICAgICAgICAgc3RhcnQgKz0gbW92ZSA/IDEgOiAtMTtcbiAgICAgICAgZW5kQSA9IHN0YXJ0ICsgKGVuZEEgLSBlbmRCKTtcbiAgICAgICAgZW5kQiA9IHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kQSwgZW5kQiB9O1xufVxuZnVuY3Rpb24gaXNTdXJyb2dhdGVQYWlyKHN0cikge1xuICAgIGlmIChzdHIubGVuZ3RoICE9IDIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYSA9IHN0ci5jaGFyQ29kZUF0KDApLCBiID0gc3RyLmNoYXJDb2RlQXQoMSk7XG4gICAgcmV0dXJuIGEgPj0gMHhEQzAwICYmIGEgPD0gMHhERkZGICYmIGIgPj0gMHhEODAwICYmIGIgPD0gMHhEQkZGO1xufVxuXG4vKipcbkBpbnRlcm5hbFxuKi9cbmNvbnN0IF9fcGFyc2VGcm9tQ2xpcGJvYXJkID0gcGFyc2VGcm9tQ2xpcGJvYXJkO1xuLyoqXG5AaW50ZXJuYWxcbiovXG5jb25zdCBfX2VuZENvbXBvc2l0aW9uID0gZW5kQ29tcG9zaXRpb247XG4vKipcbkFuIGVkaXRvciB2aWV3IG1hbmFnZXMgdGhlIERPTSBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGFuXG5lZGl0YWJsZSBkb2N1bWVudC4gSXRzIHN0YXRlIGFuZCBiZWhhdmlvciBhcmUgZGV0ZXJtaW5lZCBieSBpdHNcbltwcm9wc10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMpLlxuKi9cbmNsYXNzIEVkaXRvclZpZXcge1xuICAgIC8qKlxuICAgIENyZWF0ZSBhIHZpZXcuIGBwbGFjZWAgbWF5IGJlIGEgRE9NIG5vZGUgdGhhdCB0aGUgZWRpdG9yIHNob3VsZFxuICAgIGJlIGFwcGVuZGVkIHRvLCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwbGFjZSBpdCBpbnRvIHRoZSBkb2N1bWVudCxcbiAgICBvciBhbiBvYmplY3Qgd2hvc2UgYG1vdW50YCBwcm9wZXJ0eSBob2xkcyB0aGUgbm9kZSB0byB1c2UgYXMgdGhlXG4gICAgZG9jdW1lbnQgY29udGFpbmVyLiBJZiBpdCBpcyBgbnVsbGAsIHRoZSBlZGl0b3Igd2lsbCBub3QgYmVcbiAgICBhZGRlZCB0byB0aGUgZG9jdW1lbnQuXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGFjZSwgcHJvcHMpIHtcbiAgICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBLbHVkZ2UgdXNlZCB0byB3b3JrIGFyb3VuZCBhIENocm9tZSBidWcgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMudHJhY2tXcml0ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm1hcmtDdXJzb3IgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY3Vyc29yV3JhcHBlciA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICBAaW50ZXJuYWxcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRWaWV3RGVzYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgIEBpbnRlcm5hbFxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmlucHV0ID0gbmV3IElucHV0U3RhdGU7XG4gICAgICAgIHRoaXMucHJldkRpcmVjdFBsdWdpbnMgPSBbXTtcbiAgICAgICAgdGhpcy5wbHVnaW5WaWV3cyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgSG9sZHMgYHRydWVgIHdoZW4gYSBoYWNrIG5vZGUgaXMgbmVlZGVkIGluIEZpcmVmb3ggdG8gcHJldmVudCB0aGVcbiAgICAgICAgW3NwYWNlIGlzIGVhdGVuIGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzY1MSlcbiAgICAgICAgQGludGVybmFsXG4gICAgICAgICovXG4gICAgICAgIHRoaXMucmVxdWlyZXNHZWNrb0hhY2tOb2RlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICBXaGVuIGVkaXRvciBjb250ZW50IGlzIGJlaW5nIGRyYWdnZWQsIHRoaXMgb2JqZWN0IGNvbnRhaW5zXG4gICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcmFnZ2VkIHNsaWNlIGFuZCB3aGV0aGVyIGl0IGlzIGJlaW5nXG4gICAgICAgIGNvcGllZCBvciBtb3ZlZC4gQXQgYW55IG90aGVyIHRpbWUsIGl0IGlzIG51bGwuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcm9wcyA9IHByb3BzO1xuICAgICAgICB0aGlzLnN0YXRlID0gcHJvcHMuc3RhdGU7XG4gICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucyA9IHByb3BzLnBsdWdpbnMgfHwgW107XG4gICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucy5mb3JFYWNoKGNoZWNrU3RhdGVDb21wb25lbnQpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRvbSA9IChwbGFjZSAmJiBwbGFjZS5tb3VudCkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgaWYgKHBsYWNlKSB7XG4gICAgICAgICAgICBpZiAocGxhY2UuYXBwZW5kQ2hpbGQpXG4gICAgICAgICAgICAgICAgcGxhY2UuYXBwZW5kQ2hpbGQodGhpcy5kb20pO1xuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHBsYWNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICBwbGFjZSh0aGlzLmRvbSk7XG4gICAgICAgICAgICBlbHNlIGlmIChwbGFjZS5tb3VudClcbiAgICAgICAgICAgICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGFibGUgPSBnZXRFZGl0YWJsZSh0aGlzKTtcbiAgICAgICAgdXBkYXRlQ3Vyc29yV3JhcHBlcih0aGlzKTtcbiAgICAgICAgdGhpcy5ub2RlVmlld3MgPSBidWlsZE5vZGVWaWV3cyh0aGlzKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gZG9jVmlld0Rlc2ModGhpcy5zdGF0ZS5kb2MsIGNvbXB1dGVEb2NEZWNvKHRoaXMpLCB2aWV3RGVjb3JhdGlvbnModGhpcyksIHRoaXMuZG9tLCB0aGlzKTtcbiAgICAgICAgdGhpcy5kb21PYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcih0aGlzLCAoZnJvbSwgdG8sIHR5cGVPdmVyLCBhZGRlZCkgPT4gcmVhZERPTUNoYW5nZSh0aGlzLCBmcm9tLCB0bywgdHlwZU92ZXIsIGFkZGVkKSk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICAgICAgaW5pdElucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBsdWdpblZpZXdzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgIEhvbGRzIGB0cnVlYCB3aGVuIGFcbiAgICBbY29tcG9zaXRpb25dKGh0dHBzOi8vdzNjLmdpdGh1Yi5pby91aWV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzKVxuICAgIGlzIGFjdGl2ZS5cbiAgICAqL1xuICAgIGdldCBjb21wb3NpbmcoKSB7IHJldHVybiB0aGlzLmlucHV0LmNvbXBvc2luZzsgfVxuICAgIC8qKlxuICAgIFRoZSB2aWV3J3MgY3VycmVudCBbcHJvcHNdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzKS5cbiAgICAqL1xuICAgIGdldCBwcm9wcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Byb3BzLnN0YXRlICE9IHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5fcHJvcHM7XG4gICAgICAgICAgICB0aGlzLl9wcm9wcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcmV2KVxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BzW25hbWVdID0gcHJldltuYW1lXTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BzLnN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcHM7XG4gICAgfVxuICAgIC8qKlxuICAgIFVwZGF0ZSB0aGUgdmlldydzIHByb3BzLiBXaWxsIGltbWVkaWF0ZWx5IGNhdXNlIGFuIHVwZGF0ZSB0b1xuICAgIHRoZSBET00uXG4gICAgKi9cbiAgICB1cGRhdGUocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzLmhhbmRsZURPTUV2ZW50cyAhPSB0aGlzLl9wcm9wcy5oYW5kbGVET01FdmVudHMpXG4gICAgICAgICAgICBlbnN1cmVMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGxldCBwcmV2UHJvcHMgPSB0aGlzLl9wcm9wcztcbiAgICAgICAgdGhpcy5fcHJvcHMgPSBwcm9wcztcbiAgICAgICAgaWYgKHByb3BzLnBsdWdpbnMpIHtcbiAgICAgICAgICAgIHByb3BzLnBsdWdpbnMuZm9yRWFjaChjaGVja1N0YXRlQ29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0UGx1Z2lucyA9IHByb3BzLnBsdWdpbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUlubmVyKHByb3BzLnN0YXRlLCBwcmV2UHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIHZpZXcgYnkgdXBkYXRpbmcgZXhpc3RpbmcgcHJvcHMgb2JqZWN0IHdpdGggdGhlIG9iamVjdFxuICAgIGdpdmVuIGFzIGFyZ3VtZW50LiBFcXVpdmFsZW50IHRvIGB2aWV3LnVwZGF0ZShPYmplY3QuYXNzaWduKHt9LFxuICAgIHZpZXcucHJvcHMsIHByb3BzKSlgLlxuICAgICovXG4gICAgc2V0UHJvcHMocHJvcHMpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLl9wcm9wcylcbiAgICAgICAgICAgIHVwZGF0ZWRbbmFtZV0gPSB0aGlzLl9wcm9wc1tuYW1lXTtcbiAgICAgICAgdXBkYXRlZC5zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gcHJvcHMpXG4gICAgICAgICAgICB1cGRhdGVkW25hbWVdID0gcHJvcHNbbmFtZV07XG4gICAgICAgIHRoaXMudXBkYXRlKHVwZGF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICBVcGRhdGUgdGhlIGVkaXRvcidzIGBzdGF0ZWAgcHJvcCwgd2l0aG91dCB0b3VjaGluZyBhbnkgb2YgdGhlXG4gICAgb3RoZXIgcHJvcHMuXG4gICAgKi9cbiAgICB1cGRhdGVTdGF0ZShzdGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5uZXIoc3RhdGUsIHRoaXMuX3Byb3BzKTtcbiAgICB9XG4gICAgdXBkYXRlU3RhdGVJbm5lcihzdGF0ZSwgcHJldlByb3BzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnN0YXRlLCByZWRyYXcgPSBmYWxzZSwgdXBkYXRlU2VsID0gZmFsc2U7XG4gICAgICAgIC8vIFdoZW4gc3RvcmVkIG1hcmtzIGFyZSBhZGRlZCwgc3RvcCBjb21wb3NpdGlvbiwgc28gdGhhdCB0aGV5IGNhblxuICAgICAgICAvLyBiZSBkaXNwbGF5ZWQuXG4gICAgICAgIGlmIChzdGF0ZS5zdG9yZWRNYXJrcyAmJiB0aGlzLmNvbXBvc2luZykge1xuICAgICAgICAgICAgY2xlYXJDb21wb3NpdGlvbih0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZVNlbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICBsZXQgcGx1Z2luc0NoYW5nZWQgPSBwcmV2LnBsdWdpbnMgIT0gc3RhdGUucGx1Z2lucyB8fCB0aGlzLl9wcm9wcy5wbHVnaW5zICE9IHByZXZQcm9wcy5wbHVnaW5zO1xuICAgICAgICBpZiAocGx1Z2luc0NoYW5nZWQgfHwgdGhpcy5fcHJvcHMucGx1Z2lucyAhPSBwcmV2UHJvcHMucGx1Z2lucyB8fCB0aGlzLl9wcm9wcy5ub2RlVmlld3MgIT0gcHJldlByb3BzLm5vZGVWaWV3cykge1xuICAgICAgICAgICAgbGV0IG5vZGVWaWV3cyA9IGJ1aWxkTm9kZVZpZXdzKHRoaXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWROb2RlVmlld3Mobm9kZVZpZXdzLCB0aGlzLm5vZGVWaWV3cykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGVWaWV3cyA9IG5vZGVWaWV3cztcbiAgICAgICAgICAgICAgICByZWRyYXcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwbHVnaW5zQ2hhbmdlZCB8fCBwcmV2UHJvcHMuaGFuZGxlRE9NRXZlbnRzICE9IHRoaXMuX3Byb3BzLmhhbmRsZURPTUV2ZW50cykge1xuICAgICAgICAgICAgZW5zdXJlTGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGFibGUgPSBnZXRFZGl0YWJsZSh0aGlzKTtcbiAgICAgICAgdXBkYXRlQ3Vyc29yV3JhcHBlcih0aGlzKTtcbiAgICAgICAgbGV0IGlubmVyRGVjbyA9IHZpZXdEZWNvcmF0aW9ucyh0aGlzKSwgb3V0ZXJEZWNvID0gY29tcHV0ZURvY0RlY28odGhpcyk7XG4gICAgICAgIGxldCBzY3JvbGwgPSBwcmV2LnBsdWdpbnMgIT0gc3RhdGUucGx1Z2lucyAmJiAhcHJldi5kb2MuZXEoc3RhdGUuZG9jKSA/IFwicmVzZXRcIlxuICAgICAgICAgICAgOiBzdGF0ZS5zY3JvbGxUb1NlbGVjdGlvbiA+IHByZXYuc2Nyb2xsVG9TZWxlY3Rpb24gPyBcInRvIHNlbGVjdGlvblwiIDogXCJwcmVzZXJ2ZVwiO1xuICAgICAgICBsZXQgdXBkYXRlRG9jID0gcmVkcmF3IHx8ICF0aGlzLmRvY1ZpZXcubWF0Y2hlc05vZGUoc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbyk7XG4gICAgICAgIGlmICh1cGRhdGVEb2MgfHwgIXN0YXRlLnNlbGVjdGlvbi5lcShwcmV2LnNlbGVjdGlvbikpXG4gICAgICAgICAgICB1cGRhdGVTZWwgPSB0cnVlO1xuICAgICAgICBsZXQgb2xkU2Nyb2xsUG9zID0gc2Nyb2xsID09IFwicHJlc2VydmVcIiAmJiB1cGRhdGVTZWwgJiYgdGhpcy5kb20uc3R5bGUub3ZlcmZsb3dBbmNob3IgPT0gbnVsbCAmJiBzdG9yZVNjcm9sbFBvcyh0aGlzKTtcbiAgICAgICAgaWYgKHVwZGF0ZVNlbCkge1xuICAgICAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBhbiBpc3N1ZSBpbiBDaHJvbWUsIElFLCBhbmQgRWRnZSB3aGVyZSBjaGFuZ2luZ1xuICAgICAgICAgICAgLy8gdGhlIERPTSBhcm91bmQgYW4gYWN0aXZlIHNlbGVjdGlvbiBwdXRzIGl0IGludG8gYSBicm9rZW5cbiAgICAgICAgICAgIC8vIHN0YXRlIHdoZXJlIHRoZSB0aGluZyB0aGUgdXNlciBzZWVzIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiByZXBvcnRlZCBieSB0aGUgU2VsZWN0aW9uIG9iamVjdCAoIzcxMCwgIzk3MyxcbiAgICAgICAgICAgIC8vICMxMDExLCAjMTAxMywgIzEwMzUpLlxuICAgICAgICAgICAgbGV0IGZvcmNlU2VsVXBkYXRlID0gdXBkYXRlRG9jICYmIChpZSB8fCBjaHJvbWUpICYmICF0aGlzLmNvbXBvc2luZyAmJlxuICAgICAgICAgICAgICAgICFwcmV2LnNlbGVjdGlvbi5lbXB0eSAmJiAhc3RhdGUuc2VsZWN0aW9uLmVtcHR5ICYmIHNlbGVjdGlvbkNvbnRleHRDaGFuZ2VkKHByZXYuc2VsZWN0aW9uLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZURvYykge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIHRoYXQgdGhlIHNlbGVjdGlvbiBwb2ludHMgaW50byBpcyB3cml0dGVuIHRvLFxuICAgICAgICAgICAgICAgIC8vIENocm9tZSBzb21ldGltZXMgc3RhcnRzIG1pc3JlcG9ydGluZyB0aGUgc2VsZWN0aW9uLCBzbyB0aGlzXG4gICAgICAgICAgICAgICAgLy8gdHJhY2tzIHRoYXQgYW5kIGZvcmNlcyBhIHNlbGVjdGlvbiByZXNldCB3aGVuIG91ciB1cGRhdGVcbiAgICAgICAgICAgICAgICAvLyBkaWQgd3JpdGUgdG8gdGhlIG5vZGUuXG4gICAgICAgICAgICAgICAgbGV0IGNocm9tZUtsdWRnZSA9IGNocm9tZSA/ICh0aGlzLnRyYWNrV3JpdGVzID0gdGhpcy5kb21TZWxlY3Rpb25SYW5nZSgpLmZvY3VzTm9kZSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvc2luZylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5jb21wb3NpdGlvbk5vZGUgPSBmaW5kQ29tcG9zaXRpb25Ob2RlKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmIChyZWRyYXcgfHwgIXRoaXMuZG9jVmlldy51cGRhdGUoc3RhdGUuZG9jLCBvdXRlckRlY28sIGlubmVyRGVjbywgdGhpcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZU91dGVyRGVjbyhvdXRlckRlY28pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY1ZpZXcgPSBkb2NWaWV3RGVzYyhzdGF0ZS5kb2MsIG91dGVyRGVjbywgaW5uZXJEZWNvLCB0aGlzLmRvbSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaHJvbWVLbHVkZ2UgJiYgIXRoaXMudHJhY2tXcml0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU2VsVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdvcmsgYXJvdW5kIGZvciBhbiBpc3N1ZSB3aGVyZSBhbiB1cGRhdGUgYXJyaXZpbmcgcmlnaHQgYmV0d2VlblxuICAgICAgICAgICAgLy8gYSBET00gc2VsZWN0aW9uIGNoYW5nZSBhbmQgdGhlIFwic2VsZWN0aW9uY2hhbmdlXCIgZXZlbnQgZm9yIGl0XG4gICAgICAgICAgICAvLyBjYW4gY2F1c2UgYSBzcHVyaW91cyBET00gc2VsZWN0aW9uIHVwZGF0ZSwgZGlzcnVwdGluZyBtb3VzZVxuICAgICAgICAgICAgLy8gZHJhZyBzZWxlY3Rpb24uXG4gICAgICAgICAgICBpZiAoZm9yY2VTZWxVcGRhdGUgfHxcbiAgICAgICAgICAgICAgICAhKHRoaXMuaW5wdXQubW91c2VEb3duICYmIHRoaXMuZG9tT2JzZXJ2ZXIuY3VycmVudFNlbGVjdGlvbi5lcSh0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkpICYmXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvckluUmlnaHRQbGFjZSh0aGlzKSkpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ub0RPTSh0aGlzLCBmb3JjZVNlbFVwZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzeW5jTm9kZVNlbGVjdGlvbih0aGlzLCBzdGF0ZS5zZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc2V0Q3VyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRvbU9ic2VydmVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQbHVnaW5WaWV3cyhwcmV2KTtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmRyYWdnaW5nKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eubm9kZSkgJiYgIXByZXYuZG9jLmVxKHN0YXRlLmRvYykpXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURyYWdnZWROb2RlKHRoaXMuZHJhZ2dpbmcsIHByZXYpO1xuICAgICAgICBpZiAoc2Nyb2xsID09IFwicmVzZXRcIikge1xuICAgICAgICAgICAgdGhpcy5kb20uc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY3JvbGwgPT0gXCJ0byBzZWxlY3Rpb25cIikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFNjcm9sbFBvcykge1xuICAgICAgICAgICAgcmVzZXRTY3JvbGxQb3Mob2xkU2Nyb2xsUG9zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICBAaW50ZXJuYWxcbiAgICAqL1xuICAgIHNjcm9sbFRvU2VsZWN0aW9uKCkge1xuICAgICAgICBsZXQgc3RhcnRET00gPSB0aGlzLmRvbVNlbGVjdGlvblJhbmdlKCkuZm9jdXNOb2RlO1xuICAgICAgICBpZiAoIXN0YXJ0RE9NIHx8ICF0aGlzLmRvbS5jb250YWlucyhzdGFydERPTS5ub2RlVHlwZSA9PSAxID8gc3RhcnRET00gOiBzdGFydERPTS5wYXJlbnROb2RlKSkgO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnNvbWVQcm9wKFwiaGFuZGxlU2Nyb2xsVG9TZWxlY3Rpb25cIiwgZiA9PiBmKHRoaXMpKSkgO1xuICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlLnNlbGVjdGlvbiBpbnN0YW5jZW9mIE5vZGVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLmRvY1ZpZXcuZG9tQWZ0ZXJQb3ModGhpcy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSk7XG4gICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVUeXBlID09IDEpXG4gICAgICAgICAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMsIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgc3RhcnRET00pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2Nyb2xsUmVjdEludG9WaWV3KHRoaXMsIHRoaXMuY29vcmRzQXRQb3ModGhpcy5zdGF0ZS5zZWxlY3Rpb24uaGVhZCwgMSksIHN0YXJ0RE9NKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95UGx1Z2luVmlld3MoKSB7XG4gICAgICAgIGxldCB2aWV3O1xuICAgICAgICB3aGlsZSAodmlldyA9IHRoaXMucGx1Z2luVmlld3MucG9wKCkpXG4gICAgICAgICAgICBpZiAodmlldy5kZXN0cm95KVxuICAgICAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpO1xuICAgIH1cbiAgICB1cGRhdGVQbHVnaW5WaWV3cyhwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKCFwcmV2U3RhdGUgfHwgcHJldlN0YXRlLnBsdWdpbnMgIT0gdGhpcy5zdGF0ZS5wbHVnaW5zIHx8IHRoaXMuZGlyZWN0UGx1Z2lucyAhPSB0aGlzLnByZXZEaXJlY3RQbHVnaW5zKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZEaXJlY3RQbHVnaW5zID0gdGhpcy5kaXJlY3RQbHVnaW5zO1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95UGx1Z2luVmlld3MoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RQbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHRoaXMuZGlyZWN0UGx1Z2luc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnNwZWMudmlldylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5WaWV3cy5wdXNoKHBsdWdpbi5zcGVjLnZpZXcodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN0YXRlLnBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luID0gdGhpcy5zdGF0ZS5wbHVnaW5zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwbHVnaW4uc3BlYy52aWV3KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpblZpZXdzLnB1c2gocGx1Z2luLnNwZWMudmlldyh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luVmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGx1Z2luVmlldyA9IHRoaXMucGx1Z2luVmlld3NbaV07XG4gICAgICAgICAgICAgICAgaWYgKHBsdWdpblZpZXcudXBkYXRlKVxuICAgICAgICAgICAgICAgICAgICBwbHVnaW5WaWV3LnVwZGF0ZSh0aGlzLCBwcmV2U3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZURyYWdnZWROb2RlKGRyYWdnaW5nLCBwcmV2KSB7XG4gICAgICAgIGxldCBzZWwgPSBkcmFnZ2luZy5ub2RlLCBmb3VuZCA9IC0xO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5kb2Mubm9kZUF0KHNlbC5mcm9tKSA9PSBzZWwubm9kZSkge1xuICAgICAgICAgICAgZm91bmQgPSBzZWwuZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtb3ZlZFBvcyA9IHNlbC5mcm9tICsgKHRoaXMuc3RhdGUuZG9jLmNvbnRlbnQuc2l6ZSAtIHByZXYuZG9jLmNvbnRlbnQuc2l6ZSk7XG4gICAgICAgICAgICBsZXQgbW92ZWQgPSBtb3ZlZFBvcyA+IDAgJiYgdGhpcy5zdGF0ZS5kb2Mubm9kZUF0KG1vdmVkUG9zKTtcbiAgICAgICAgICAgIGlmIChtb3ZlZCA9PSBzZWwubm9kZSlcbiAgICAgICAgICAgICAgICBmb3VuZCA9IG1vdmVkUG9zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBuZXcgRHJhZ2dpbmcoZHJhZ2dpbmcuc2xpY2UsIGRyYWdnaW5nLm1vdmUsIGZvdW5kIDwgMCA/IHVuZGVmaW5lZCA6IE5vZGVTZWxlY3Rpb24uY3JlYXRlKHRoaXMuc3RhdGUuZG9jLCBmb3VuZCkpO1xuICAgIH1cbiAgICBzb21lUHJvcChwcm9wTmFtZSwgZikge1xuICAgICAgICBsZXQgcHJvcCA9IHRoaXMuX3Byb3BzICYmIHRoaXMuX3Byb3BzW3Byb3BOYW1lXSwgdmFsdWU7XG4gICAgICAgIGlmIChwcm9wICE9IG51bGwgJiYgKHZhbHVlID0gZiA/IGYocHJvcCkgOiBwcm9wKSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRpcmVjdFBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwcm9wID0gdGhpcy5kaXJlY3RQbHVnaW5zW2ldLnByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwgJiYgKHZhbHVlID0gZiA/IGYocHJvcCkgOiBwcm9wKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBsdWdpbnMgPSB0aGlzLnN0YXRlLnBsdWdpbnM7XG4gICAgICAgIGlmIChwbHVnaW5zKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByb3AgPSBwbHVnaW5zW2ldLnByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsICYmICh2YWx1ZSA9IGYgPyBmKHByb3ApIDogcHJvcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgUXVlcnkgd2hldGhlciB0aGUgdmlldyBoYXMgZm9jdXMuXG4gICAgKi9cbiAgICBoYXNGb2N1cygpIHtcbiAgICAgICAgLy8gV29yayBhcm91bmQgSUUgbm90IGhhbmRsaW5nIGZvY3VzIGNvcnJlY3RseSBpZiByZXNpemUgaGFuZGxlcyBhcmUgc2hvd24uXG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCByZXNpemUgaGFuZGxlcywgYWN0aXZlRWxlbWVudFxuICAgICAgICAvLyB3aWxsIGJlIHRoYXQgZWxlbWVudCBpbnN0ZWFkIG9mIHRoaXMuZG9tLlxuICAgICAgICBpZiAoaWUpIHtcbiAgICAgICAgICAgIC8vIElmIGFjdGl2ZUVsZW1lbnQgaXMgd2l0aGluIHRoaXMuZG9tLCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAvLyBzZXR0aW5nIGBjb250ZW50ZWRpdGFibGVgIHRvIGZhbHNlIGluIGJldHdlZW4sIHRyZWF0IGl0IGFzIGZvY3VzZWQuXG4gICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMucm9vdC5hY3RpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcy5kb20pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBpZiAoIW5vZGUgfHwgIXRoaXMuZG9tLmNvbnRhaW5zKG5vZGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICYmIHRoaXMuZG9tICE9IG5vZGUgJiYgdGhpcy5kb20uY29udGFpbnMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5jb250ZW50RWRpdGFibGUgPT0gJ2ZhbHNlJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb290LmFjdGl2ZUVsZW1lbnQgPT0gdGhpcy5kb207XG4gICAgfVxuICAgIC8qKlxuICAgIEZvY3VzIHRoZSBlZGl0b3IuXG4gICAgKi9cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5kb21PYnNlcnZlci5zdG9wKCk7XG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKVxuICAgICAgICAgICAgZm9jdXNQcmV2ZW50U2Nyb2xsKHRoaXMuZG9tKTtcbiAgICAgICAgc2VsZWN0aW9uVG9ET00odGhpcyk7XG4gICAgICAgIHRoaXMuZG9tT2JzZXJ2ZXIuc3RhcnQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgR2V0IHRoZSBkb2N1bWVudCByb290IGluIHdoaWNoIHRoZSBlZGl0b3IgZXhpc3RzLiBUaGlzIHdpbGxcbiAgICB1c3VhbGx5IGJlIHRoZSB0b3AtbGV2ZWwgYGRvY3VtZW50YCwgYnV0IG1pZ2h0IGJlIGEgW3NoYWRvd1xuICAgIERPTV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvV2ViX0NvbXBvbmVudHMvU2hhZG93X0RPTSlcbiAgICByb290IGlmIHRoZSBlZGl0b3IgaXMgaW5zaWRlIG9uZS5cbiAgICAqL1xuICAgIGdldCByb290KCkge1xuICAgICAgICBsZXQgY2FjaGVkID0gdGhpcy5fcm9vdDtcbiAgICAgICAgaWYgKGNhY2hlZCA9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChsZXQgc2VhcmNoID0gdGhpcy5kb20ucGFyZW50Tm9kZTsgc2VhcmNoOyBzZWFyY2ggPSBzZWFyY2gucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWFyY2gubm9kZVR5cGUgPT0gOSB8fCAoc2VhcmNoLm5vZGVUeXBlID09IDExICYmIHNlYXJjaC5ob3N0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaC5nZXRTZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc2VhcmNoKS5nZXRTZWxlY3Rpb24gPSAoKSA9PiBzZWFyY2gub3duZXJEb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QgPSBzZWFyY2g7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVkIHx8IGRvY3VtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICBXaGVuIGFuIGV4aXN0aW5nIGVkaXRvciB2aWV3IGlzIG1vdmVkIHRvIGEgbmV3IGRvY3VtZW50IG9yXG4gICAgc2hhZG93IHRyZWUsIGNhbGwgdGhpcyB0byBtYWtlIGl0IHJlY29tcHV0ZSBpdHMgcm9vdC5cbiAgICAqL1xuICAgIHVwZGF0ZVJvb3QoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICBHaXZlbiBhIHBhaXIgb2Ygdmlld3BvcnQgY29vcmRpbmF0ZXMsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgICBwb3NpdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZW0uIE1heSByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW5cbiAgICBjb29yZGluYXRlcyBhcmVuJ3QgaW5zaWRlIG9mIHRoZSBlZGl0b3IuIFdoZW4gYW4gb2JqZWN0IGlzXG4gICAgcmV0dXJuZWQsIGl0cyBgcG9zYCBwcm9wZXJ0eSBpcyB0aGUgcG9zaXRpb24gbmVhcmVzdCB0byB0aGVcbiAgICBjb29yZGluYXRlcywgYW5kIGl0cyBgaW5zaWRlYCBwcm9wZXJ0eSBob2xkcyB0aGUgcG9zaXRpb24gb2YgdGhlXG4gICAgaW5uZXIgbm9kZSB0aGF0IHRoZSBwb3NpdGlvbiBmYWxscyBpbnNpZGUgb2YsIG9yIC0xIGlmIGl0IGlzIGF0XG4gICAgdGhlIHRvcCBsZXZlbCwgbm90IGluIGFueSBub2RlLlxuICAgICovXG4gICAgcG9zQXRDb29yZHMoY29vcmRzKSB7XG4gICAgICAgIHJldHVybiBwb3NBdENvb3Jkcyh0aGlzLCBjb29yZHMpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZXR1cm5zIHRoZSB2aWV3cG9ydCByZWN0YW5nbGUgYXQgYSBnaXZlbiBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICBgbGVmdGAgYW5kIGByaWdodGAgd2lsbCBiZSB0aGUgc2FtZSBudW1iZXIsIGFzIHRoaXMgcmV0dXJucyBhXG4gICAgZmxhdCBjdXJzb3ItaXNoIHJlY3RhbmdsZS4gSWYgdGhlIHBvc2l0aW9uIGlzIGJldHdlZW4gdHdvIHRoaW5nc1xuICAgIHRoYXQgYXJlbid0IGRpcmVjdGx5IGFkamFjZW50LCBgc2lkZWAgZGV0ZXJtaW5lcyB3aGljaCBlbGVtZW50XG4gICAgaXMgdXNlZC4gV2hlbiA8IDAsIHRoZSBlbGVtZW50IGJlZm9yZSB0aGUgcG9zaXRpb24gaXMgdXNlZCxcbiAgICBvdGhlcndpc2UgdGhlIGVsZW1lbnQgYWZ0ZXIuXG4gICAgKi9cbiAgICBjb29yZHNBdFBvcyhwb3MsIHNpZGUgPSAxKSB7XG4gICAgICAgIHJldHVybiBjb29yZHNBdFBvcyh0aGlzLCBwb3MsIHNpZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIHRoZSBET00gcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gZG9jdW1lbnRcbiAgICBwb3NpdGlvbi4gV2hlbiBgc2lkZWAgaXMgbmVnYXRpdmUsIGZpbmQgdGhlIHBvc2l0aW9uIGFzIGNsb3NlIGFzXG4gICAgcG9zc2libGUgdG8gdGhlIGNvbnRlbnQgYmVmb3JlIHRoZSBwb3NpdGlvbi4gV2hlbiBwb3NpdGl2ZSxcbiAgICBwcmVmZXIgcG9zaXRpb25zIGNsb3NlIHRvIHRoZSBjb250ZW50IGFmdGVyIHRoZSBwb3NpdGlvbi4gV2hlblxuICAgIHplcm8sIHByZWZlciBhcyBzaGFsbG93IGEgcG9zaXRpb24gYXMgcG9zc2libGUuXG4gICAgXG4gICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgKipub3QqKiBtdXRhdGUgdGhlIGVkaXRvcidzIGludGVybmFsIERPTSxcbiAgICBvbmx5IGluc3BlY3QgaXQgKGFuZCBldmVuIHRoYXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5KS5cbiAgICAqL1xuICAgIGRvbUF0UG9zKHBvcywgc2lkZSA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jVmlldy5kb21Gcm9tUG9zKHBvcywgc2lkZSk7XG4gICAgfVxuICAgIC8qKlxuICAgIEZpbmQgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZG9jdW1lbnQgbm9kZSBhZnRlciB0aGVcbiAgICBnaXZlbiBwb3NpdGlvbi4gTWF5IHJldHVybiBgbnVsbGAgd2hlbiB0aGUgcG9zaXRpb24gZG9lc24ndCBwb2ludFxuICAgIGluIGZyb250IG9mIGEgbm9kZSBvciBpZiB0aGUgbm9kZSBpcyBpbnNpZGUgYW4gb3BhcXVlIG5vZGUgdmlldy5cbiAgICBcbiAgICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGFibGUgdG8gY2FsbCB0aGluZ3MgbGlrZVxuICAgIGBnZXRCb3VuZGluZ0NsaWVudFJlY3RgIG9uIHRoYXQgRE9NIG5vZGUuIERvICoqbm90KiogbXV0YXRlIHRoZVxuICAgIGVkaXRvciBET00gZGlyZWN0bHksIG9yIGFkZCBzdHlsaW5nIHRoaXMgd2F5LCBzaW5jZSB0aGF0IHdpbGwgYmVcbiAgICBpbW1lZGlhdGVseSBvdmVycmlkZW4gYnkgdGhlIGVkaXRvciBhcyBpdCByZWRyYXdzIHRoZSBub2RlLlxuICAgICovXG4gICAgbm9kZURPTShwb3MpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmRvY1ZpZXcuZGVzY0F0KHBvcyk7XG4gICAgICAgIHJldHVybiBkZXNjID8gZGVzYy5ub2RlRE9NIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgRmluZCB0aGUgZG9jdW1lbnQgcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIERPTVxuICAgIHBvc2l0aW9uLiAoV2hlbmV2ZXIgcG9zc2libGUsIGl0IGlzIHByZWZlcmFibGUgdG8gaW5zcGVjdCB0aGVcbiAgICBkb2N1bWVudCBzdHJ1Y3R1cmUgZGlyZWN0bHksIHJhdGhlciB0aGFuIHBva2luZyBhcm91bmQgaW4gdGhlXG4gICAgRE9NLCBidXQgc29tZXRpbWVz4oCUZm9yIGV4YW1wbGUgd2hlbiBpbnRlcnByZXRpbmcgYW4gZXZlbnRcbiAgICB0YXJnZXTigJR5b3UgZG9uJ3QgaGF2ZSBhIGNob2ljZS4pXG4gICAgXG4gICAgVGhlIGBiaWFzYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHdoaWNoIHNpZGUgb2YgYSBET01cbiAgICBub2RlIHRvIHVzZSB3aGVuIHRoZSBwb3NpdGlvbiBpcyBpbnNpZGUgYSBsZWFmIG5vZGUuXG4gICAgKi9cbiAgICBwb3NBdERPTShub2RlLCBvZmZzZXQsIGJpYXMgPSAtMSkge1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5kb2NWaWV3LnBvc0Zyb21ET00obm9kZSwgb2Zmc2V0LCBiaWFzKTtcbiAgICAgICAgaWYgKHBvcyA9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJET00gcG9zaXRpb24gbm90IGluc2lkZSB0aGUgZWRpdG9yXCIpO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbiAgICAvKipcbiAgICBGaW5kIG91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgYXQgdGhlIGVuZCBvZiBhIHRleHRibG9jayB3aGVuXG4gICAgbW92aW5nIGluIGEgZ2l2ZW4gZGlyZWN0aW9uLiBXaGVuLCBmb3IgZXhhbXBsZSwgZ2l2ZW4gYFwibGVmdFwiYCxcbiAgICBpdCB3aWxsIHJldHVybiB0cnVlIGlmIG1vdmluZyBsZWZ0IGZyb20gdGhlIGN1cnJlbnQgY3Vyc29yXG4gICAgcG9zaXRpb24gd291bGQgbGVhdmUgdGhhdCBwb3NpdGlvbidzIHBhcmVudCB0ZXh0YmxvY2suIFdpbGwgYXBwbHlcbiAgICB0byB0aGUgdmlldydzIGN1cnJlbnQgc3RhdGUgYnkgZGVmYXVsdCwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvXG4gICAgcGFzcyBhIGRpZmZlcmVudCBzdGF0ZS5cbiAgICAqL1xuICAgIGVuZE9mVGV4dGJsb2NrKGRpciwgc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGVuZE9mVGV4dGJsb2NrKHRoaXMsIHN0YXRlIHx8IHRoaXMuc3RhdGUsIGRpcik7XG4gICAgfVxuICAgIC8qKlxuICAgIFJ1biB0aGUgZWRpdG9yJ3MgcGFzdGUgbG9naWMgd2l0aCB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmcuIFRoZVxuICAgIGBldmVudGAsIGlmIGdpdmVuLCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICBbYGhhbmRsZVBhc3RlYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRWRpdG9yUHJvcHMuaGFuZGxlUGFzdGUpIGhvb2suXG4gICAgKi9cbiAgICBwYXN0ZUhUTUwoaHRtbCwgZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIGRvUGFzdGUodGhpcywgXCJcIiwgaHRtbCwgZmFsc2UsIGV2ZW50IHx8IG5ldyBDbGlwYm9hcmRFdmVudChcInBhc3RlXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgUnVuIHRoZSBlZGl0b3IncyBwYXN0ZSBsb2dpYyB3aXRoIHRoZSBnaXZlbiBwbGFpbi10ZXh0IGlucHV0LlxuICAgICovXG4gICAgcGFzdGVUZXh0KHRleHQsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkb1Bhc3RlKHRoaXMsIHRleHQsIG51bGwsIHRydWUsIGV2ZW50IHx8IG5ldyBDbGlwYm9hcmRFdmVudChcInBhc3RlXCIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgU2VyaWFsaXplIHRoZSBnaXZlbiBzbGljZSBhcyBpdCB3b3VsZCBiZSBpZiBpdCB3YXMgY29waWVkIGZyb21cbiAgICB0aGlzIGVkaXRvci4gUmV0dXJucyBhIERPTSBlbGVtZW50IHRoYXQgY29udGFpbnMgYVxuICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzbGljZSBhcyBpdHMgY2hpbGRyZW4sIGEgdGV4dHVhbFxuICAgIHJlcHJlc2VudGF0aW9uLCBhbmQgdGhlIHRyYW5zZm9ybWVkIHNsaWNlICh3aGljaCBjYW4gYmVcbiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgZHVlIHRvIGhvb2tzIGxpa2VcbiAgICBbYHRyYW5zZm9ybUNvcGllZGBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclByb3BzLnRyYW5zZm9ybUNvcGllZCkpLlxuICAgICovXG4gICAgc2VyaWFsaXplRm9yQ2xpcGJvYXJkKHNsaWNlKSB7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVGb3JDbGlwYm9hcmQodGhpcywgc2xpY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICBSZW1vdmVzIHRoZSBlZGl0b3IgZnJvbSB0aGUgRE9NIGFuZCBkZXN0cm95cyBhbGwgW25vZGVcbiAgICB2aWV3c10oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuTm9kZVZpZXcpLlxuICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY1ZpZXcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGRlc3Ryb3lJbnB1dCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXN0cm95UGx1Z2luVmlld3MoKTtcbiAgICAgICAgaWYgKHRoaXMubW91bnRlZCkge1xuICAgICAgICAgICAgdGhpcy5kb2NWaWV3LnVwZGF0ZSh0aGlzLnN0YXRlLmRvYywgW10sIHZpZXdEZWNvcmF0aW9ucyh0aGlzKSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kb20ucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2NWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kb2NWaWV3ID0gbnVsbDtcbiAgICAgICAgY2xlYXJSZXVzZWRSYW5nZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICBUaGlzIGlzIHRydWUgd2hlbiB0aGUgdmlldyBoYXMgYmVlblxuICAgIFtkZXN0cm95ZWRdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcuZGVzdHJveSkgKGFuZCB0aHVzIHNob3VsZCBub3QgYmVcbiAgICB1c2VkIGFueW1vcmUpLlxuICAgICovXG4gICAgZ2V0IGlzRGVzdHJveWVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2NWaWV3ID09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgIFVzZWQgZm9yIHRlc3RpbmcuXG4gICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgRGlzcGF0Y2ggYSB0cmFuc2FjdGlvbi4gV2lsbCBjYWxsXG4gICAgW2BkaXNwYXRjaFRyYW5zYWN0aW9uYF0oaHR0cHM6Ly9wcm9zZW1pcnJvci5uZXQvZG9jcy9yZWYvI3ZpZXcuRGlyZWN0RWRpdG9yUHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbilcbiAgICB3aGVuIGdpdmVuLCBhbmQgb3RoZXJ3aXNlIGRlZmF1bHRzIHRvIGFwcGx5aW5nIHRoZSB0cmFuc2FjdGlvbiB0b1xuICAgIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBjYWxsaW5nXG4gICAgW2B1cGRhdGVTdGF0ZWBdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0L2RvY3MvcmVmLyN2aWV3LkVkaXRvclZpZXcudXBkYXRlU3RhdGUpIHdpdGggdGhlIHJlc3VsdC5cbiAgICBUaGlzIG1ldGhvZCBpcyBib3VuZCB0byB0aGUgdmlldyBpbnN0YW5jZSwgc28gdGhhdCBpdCBjYW4gYmVcbiAgICBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAqL1xuICAgIGRpc3BhdGNoKHRyKSB7XG4gICAgICAgIGxldCBkaXNwYXRjaFRyYW5zYWN0aW9uID0gdGhpcy5fcHJvcHMuZGlzcGF0Y2hUcmFuc2FjdGlvbjtcbiAgICAgICAgaWYgKGRpc3BhdGNoVHJhbnNhY3Rpb24pXG4gICAgICAgICAgICBkaXNwYXRjaFRyYW5zYWN0aW9uLmNhbGwodGhpcywgdHIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlKHRoaXMuc3RhdGUuYXBwbHkodHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgQGludGVybmFsXG4gICAgKi9cbiAgICBkb21TZWxlY3Rpb25SYW5nZSgpIHtcbiAgICAgICAgbGV0IHNlbCA9IHRoaXMuZG9tU2VsZWN0aW9uKCk7XG4gICAgICAgIGlmICghc2VsKVxuICAgICAgICAgICAgcmV0dXJuIHsgZm9jdXNOb2RlOiBudWxsLCBmb2N1c09mZnNldDogMCwgYW5jaG9yTm9kZTogbnVsbCwgYW5jaG9yT2Zmc2V0OiAwIH07XG4gICAgICAgIHJldHVybiBzYWZhcmkgJiYgdGhpcy5yb290Lm5vZGVUeXBlID09PSAxMSAmJlxuICAgICAgICAgICAgZGVlcEFjdGl2ZUVsZW1lbnQodGhpcy5kb20ub3duZXJEb2N1bWVudCkgPT0gdGhpcy5kb20gJiYgc2FmYXJpU2hhZG93U2VsZWN0aW9uUmFuZ2UodGhpcywgc2VsKSB8fCBzZWw7XG4gICAgfVxuICAgIC8qKlxuICAgIEBpbnRlcm5hbFxuICAgICovXG4gICAgZG9tU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb290LmdldFNlbGVjdGlvbigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVEb2NEZWNvKHZpZXcpIHtcbiAgICBsZXQgYXR0cnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGF0dHJzLmNsYXNzID0gXCJQcm9zZU1pcnJvclwiO1xuICAgIGF0dHJzLmNvbnRlbnRlZGl0YWJsZSA9IFN0cmluZyh2aWV3LmVkaXRhYmxlKTtcbiAgICB2aWV3LnNvbWVQcm9wKFwiYXR0cmlidXRlc1wiLCB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSh2aWV3LnN0YXRlKTtcbiAgICAgICAgaWYgKHZhbHVlKVxuICAgICAgICAgICAgZm9yIChsZXQgYXR0ciBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyID09IFwiY2xhc3NcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMuY2xhc3MgKz0gXCIgXCIgKyB2YWx1ZVthdHRyXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhdHRyID09IFwic3R5bGVcIilcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMuc3R5bGUgPSAoYXR0cnMuc3R5bGUgPyBhdHRycy5zdHlsZSArIFwiO1wiIDogXCJcIikgKyB2YWx1ZVthdHRyXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghYXR0cnNbYXR0cl0gJiYgYXR0ciAhPSBcImNvbnRlbnRlZGl0YWJsZVwiICYmIGF0dHIgIT0gXCJub2RlTmFtZVwiKVxuICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHRyXSA9IFN0cmluZyh2YWx1ZVthdHRyXSk7XG4gICAgICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFhdHRycy50cmFuc2xhdGUpXG4gICAgICAgIGF0dHJzLnRyYW5zbGF0ZSA9IFwibm9cIjtcbiAgICByZXR1cm4gW0RlY29yYXRpb24ubm9kZSgwLCB2aWV3LnN0YXRlLmRvYy5jb250ZW50LnNpemUsIGF0dHJzKV07XG59XG5mdW5jdGlvbiB1cGRhdGVDdXJzb3JXcmFwcGVyKHZpZXcpIHtcbiAgICBpZiAodmlldy5tYXJrQ3Vyc29yKSB7XG4gICAgICAgIGxldCBkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuICAgICAgICBkb20uY2xhc3NOYW1lID0gXCJQcm9zZU1pcnJvci1zZXBhcmF0b3JcIjtcbiAgICAgICAgZG9tLnNldEF0dHJpYnV0ZShcIm1hcmstcGxhY2Vob2xkZXJcIiwgXCJ0cnVlXCIpO1xuICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYWx0XCIsIFwiXCIpO1xuICAgICAgICB2aWV3LmN1cnNvcldyYXBwZXIgPSB7IGRvbSwgZGVjbzogRGVjb3JhdGlvbi53aWRnZXQodmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSwgZG9tLCB7IHJhdzogdHJ1ZSwgbWFya3M6IHZpZXcubWFya0N1cnNvciB9KSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmlldy5jdXJzb3JXcmFwcGVyID0gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFZGl0YWJsZSh2aWV3KSB7XG4gICAgcmV0dXJuICF2aWV3LnNvbWVQcm9wKFwiZWRpdGFibGVcIiwgdmFsdWUgPT4gdmFsdWUodmlldy5zdGF0ZSkgPT09IGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNlbGVjdGlvbkNvbnRleHRDaGFuZ2VkKHNlbDEsIHNlbDIpIHtcbiAgICBsZXQgZGVwdGggPSBNYXRoLm1pbihzZWwxLiRhbmNob3Iuc2hhcmVkRGVwdGgoc2VsMS5oZWFkKSwgc2VsMi4kYW5jaG9yLnNoYXJlZERlcHRoKHNlbDIuaGVhZCkpO1xuICAgIHJldHVybiBzZWwxLiRhbmNob3Iuc3RhcnQoZGVwdGgpICE9IHNlbDIuJGFuY2hvci5zdGFydChkZXB0aCk7XG59XG5mdW5jdGlvbiBidWlsZE5vZGVWaWV3cyh2aWV3KSB7XG4gICAgbGV0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZnVuY3Rpb24gYWRkKG9iaikge1xuICAgICAgICBmb3IgKGxldCBwcm9wIGluIG9iailcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgcHJvcCkpXG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgICB2aWV3LnNvbWVQcm9wKFwibm9kZVZpZXdzXCIsIGFkZCk7XG4gICAgdmlldy5zb21lUHJvcChcIm1hcmtWaWV3c1wiLCBhZGQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjaGFuZ2VkTm9kZVZpZXdzKGEsIGIpIHtcbiAgICBsZXQgbkEgPSAwLCBuQiA9IDA7XG4gICAgZm9yIChsZXQgcHJvcCBpbiBhKSB7XG4gICAgICAgIGlmIChhW3Byb3BdICE9IGJbcHJvcF0pXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbkErKztcbiAgICB9XG4gICAgZm9yIChsZXQgXyBpbiBiKVxuICAgICAgICBuQisrO1xuICAgIHJldHVybiBuQSAhPSBuQjtcbn1cbmZ1bmN0aW9uIGNoZWNrU3RhdGVDb21wb25lbnQocGx1Z2luKSB7XG4gICAgaWYgKHBsdWdpbi5zcGVjLnN0YXRlIHx8IHBsdWdpbi5zcGVjLmZpbHRlclRyYW5zYWN0aW9uIHx8IHBsdWdpbi5zcGVjLmFwcGVuZFRyYW5zYWN0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlBsdWdpbnMgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSB2aWV3IG11c3Qgbm90IGhhdmUgYSBzdGF0ZSBjb21wb25lbnRcIik7XG59XG5cbmV4cG9ydCB7IERlY29yYXRpb24sIERlY29yYXRpb25TZXQsIEVkaXRvclZpZXcsIF9fZW5kQ29tcG9zaXRpb24sIF9fcGFyc2VGcm9tQ2xpcGJvYXJkIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cbmNvbnN0IG1heEludCA9IDIxNDc0ODM2NDc7IC8vIGFrYS4gMHg3RkZGRkZGRiBvciAyXjMxLTFcblxuLyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuY29uc3QgYmFzZSA9IDM2O1xuY29uc3QgdE1pbiA9IDE7XG5jb25zdCB0TWF4ID0gMjY7XG5jb25zdCBza2V3ID0gMzg7XG5jb25zdCBkYW1wID0gNzAwO1xuY29uc3QgaW5pdGlhbEJpYXMgPSA3MjtcbmNvbnN0IGluaXRpYWxOID0gMTI4OyAvLyAweDgwXG5jb25zdCBkZWxpbWl0ZXIgPSAnLSc7IC8vICdcXHgyRCdcblxuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cbmNvbnN0IHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vO1xuY29uc3QgcmVnZXhOb25BU0NJSSA9IC9bXlxcMC1cXHg3Rl0vOyAvLyBOb3RlOiBVKzAwN0YgREVMIGlzIGV4Y2x1ZGVkIHRvby5cbmNvbnN0IHJlZ2V4U2VwYXJhdG9ycyA9IC9bXFx4MkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2c7IC8vIFJGQyAzNDkwIHNlcGFyYXRvcnNcblxuLyoqIEVycm9yIG1lc3NhZ2VzICovXG5jb25zdCBlcnJvcnMgPSB7XG5cdCdvdmVyZmxvdyc6ICdPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2VzcycsXG5cdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG59O1xuXG4vKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5jb25zdCBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG5jb25zdCBmbG9vciA9IE1hdGguZmxvb3I7XG5jb25zdCBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqXG4gKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuXHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xufVxuXG4vKipcbiAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcbiAqIGl0ZW0uXG4gKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IGFycmF5IG9mIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG1hcChhcnJheSwgY2FsbGJhY2spIHtcblx0Y29uc3QgcmVzdWx0ID0gW107XG5cdGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdHJlc3VsdFtsZW5ndGhdID0gY2FsbGJhY2soYXJyYXlbbGVuZ3RoXSk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcbiAqIGFkZHJlc3Nlcy5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG4gKiBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcbiAqIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBtYXBEb21haW4oZG9tYWluLCBjYWxsYmFjaykge1xuXHRjb25zdCBwYXJ0cyA9IGRvbWFpbi5zcGxpdCgnQCcpO1xuXHRsZXQgcmVzdWx0ID0gJyc7XG5cdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG5cdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0ZG9tYWluID0gcGFydHNbMV07XG5cdH1cblx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRkb21haW4gPSBkb21haW4ucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRjb25zdCBsYWJlbHMgPSBkb21haW4uc3BsaXQoJy4nKTtcblx0Y29uc3QgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGNhbGxiYWNrKS5qb2luKCcuJyk7XG5cdHJldHVybiByZXN1bHQgKyBlbmNvZGVkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtZXJpYyBjb2RlIHBvaW50cyBvZiBlYWNoIFVuaWNvZGVcbiAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG4gKiBVQ1MtMiBleHBvc2VzIGFzIHNlcGFyYXRlIGNoYXJhY3RlcnMpIGludG8gYSBzaW5nbGUgY29kZSBwb2ludCxcbiAqIG1hdGNoaW5nIFVURi0xNi5cbiAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG4gKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuICogQG5hbWUgZGVjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFRoZSBVbmljb2RlIGlucHV0IHN0cmluZyAoVUNTLTIpLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuICovXG5mdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRjb25zdCBvdXRwdXQgPSBbXTtcblx0bGV0IGNvdW50ZXIgPSAwO1xuXHRjb25zdCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdGNvbnN0IHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHQvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuXHRcdFx0Y29uc3QgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIExvdyBzdXJyb2dhdGUuXG5cdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuXHRcdFx0XHQvLyBuZXh0IGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpci5cblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcbiAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG4gKiBAbmFtZSBlbmNvZGVcbiAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG4gKi9cbmNvbnN0IHVjczJlbmNvZGUgPSBjb2RlUG9pbnRzID0+IFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbmNvbnN0IGJhc2ljVG9EaWdpdCA9IGZ1bmN0aW9uKGNvZGVQb2ludCkge1xuXHRpZiAoY29kZVBvaW50ID49IDB4MzAgJiYgY29kZVBvaW50IDwgMHgzQSkge1xuXHRcdHJldHVybiAyNiArIChjb2RlUG9pbnQgLSAweDMwKTtcblx0fVxuXHRpZiAoY29kZVBvaW50ID49IDB4NDEgJiYgY29kZVBvaW50IDwgMHg1Qikge1xuXHRcdHJldHVybiBjb2RlUG9pbnQgLSAweDQxO1xuXHR9XG5cdGlmIChjb2RlUG9pbnQgPj0gMHg2MSAmJiBjb2RlUG9pbnQgPCAweDdCKSB7XG5cdFx0cmV0dXJuIGNvZGVQb2ludCAtIDB4NjE7XG5cdH1cblx0cmV0dXJuIGJhc2U7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2VcbiAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcbiAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG4gKi9cbmNvbnN0IGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uKGRpZ2l0LCBmbGFnKSB7XG5cdC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG5cdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xufTtcblxuLyoqXG4gKiBCaWFzIGFkYXB0YXRpb24gZnVuY3Rpb24gYXMgcGVyIHNlY3Rpb24gMy40IG9mIFJGQyAzNDkyLlxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFkYXB0ID0gZnVuY3Rpb24oZGVsdGEsIG51bVBvaW50cywgZmlyc3RUaW1lKSB7XG5cdGxldCBrID0gMDtcblx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0ZGVsdGEgKz0gZmxvb3IoZGVsdGEgLyBudW1Qb2ludHMpO1xuXHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0fVxuXHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcbiAqIHN5bWJvbHMuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAqL1xuY29uc3QgZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0Ly8gRG9uJ3QgdXNlIFVDUy0yLlxuXHRjb25zdCBvdXRwdXQgPSBbXTtcblx0Y29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cdGxldCBpID0gMDtcblx0bGV0IG4gPSBpbml0aWFsTjtcblx0bGV0IGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0Ly8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cblx0bGV0IGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0aWYgKGJhc2ljIDwgMCkge1xuXHRcdGJhc2ljID0gMDtcblx0fVxuXG5cdGZvciAobGV0IGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdGlmIChpbnB1dC5jaGFyQ29kZUF0KGopID49IDB4ODApIHtcblx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHR9XG5cdFx0b3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7XG5cdH1cblxuXHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdC8vIHBvaW50cyB3ZXJlIGNvcGllZDsgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvdGhlcndpc2UuXG5cblx0Zm9yIChsZXQgaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHQvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG5cdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0Ly8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcblx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdGNvbnN0IG9sZGkgPSBpO1xuXHRcdGZvciAobGV0IHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0aWYgKGluZGV4ID49IGlucHV0TGVuZ3RoKSB7XG5cdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRpZ2l0ID0gYmFzaWNUb0RpZ2l0KGlucHV0LmNoYXJDb2RlQXQoaW5kZXgrKykpO1xuXG5cdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSkge1xuXHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGkgKz0gZGlnaXQgKiB3O1xuXHRcdFx0Y29uc3QgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdGlmICh3ID4gZmxvb3IobWF4SW50IC8gYmFzZU1pbnVzVCkpIHtcblx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdHcgKj0gYmFzZU1pbnVzVDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdGJpYXMgPSBhZGFwdChpIC0gb2xkaSwgb3V0LCBvbGRpID09IDApO1xuXG5cdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdGlmIChmbG9vcihpIC8gb3V0KSA+IG1heEludCAtIG4pIHtcblx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdH1cblxuXHRcdG4gKz0gZmxvb3IoaSAvIG91dCk7XG5cdFx0aSAlPSBvdXQ7XG5cblx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0LlxuXHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHR9XG5cblx0cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLm91dHB1dCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbmNvbnN0IGVuY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG5cdGNvbnN0IG91dHB1dCA9IFtdO1xuXG5cdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIGFuIGFycmF5IG9mIFVuaWNvZGUgY29kZSBwb2ludHMuXG5cdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0Ly8gQ2FjaGUgdGhlIGxlbmd0aC5cblx0Y29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGUuXG5cdGxldCBuID0gaW5pdGlhbE47XG5cdGxldCBkZWx0YSA9IDA7XG5cdGxldCBiaWFzID0gaW5pdGlhbEJpYXM7XG5cblx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy5cblx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblx0bGV0IGhhbmRsZWRDUENvdW50ID0gYmFzaWNMZW5ndGg7XG5cblx0Ly8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG5cdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyB3aXRoIGEgZGVsaW1pdGVyIHVubGVzcyBpdCdzIGVtcHR5LlxuXHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRvdXRwdXQucHVzaChkZWxpbWl0ZXIpO1xuXHR9XG5cblx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHR3aGlsZSAoaGFuZGxlZENQQ291bnQgPCBpbnB1dExlbmd0aCkge1xuXG5cdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0bGV0IG0gPSBtYXhJbnQ7XG5cdFx0Zm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG5cdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93LlxuXHRcdGNvbnN0IGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0fVxuXG5cdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRuID0gbTtcblxuXHRcdGZvciAoY29uc3QgY3VycmVudFZhbHVlIG9mIGlucHV0KSB7XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA9PT0gbikge1xuXHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cblx0XHRcdFx0bGV0IHEgPSBkZWx0YTtcblx0XHRcdFx0Zm9yIChsZXQgayA9IGJhc2U7IC8qIG5vIGNvbmRpdGlvbiAqLzsgayArPSBiYXNlKSB7XG5cdFx0XHRcdFx0Y29uc3QgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdGNvbnN0IGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHEsIDApKSk7XG5cdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRkZWx0YSA9IDA7XG5cdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0KytkZWx0YTtcblx0XHQrK247XG5cblx0fVxuXHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG4gKiB0byBVbmljb2RlLiBPbmx5IHRoZSBQdW55Y29kZWQgcGFydHMgb2YgdGhlIGlucHV0IHdpbGwgYmUgY29udmVydGVkLCBpLmUuXG4gKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cbiAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG4gKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gUHVueWNvZGVcbiAqIHN0cmluZy5cbiAqL1xuY29uc3QgdG9Vbmljb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcblx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG4gKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcbiAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuICogQVNDSUkuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG4gKiBVbmljb2RlIHN0cmluZy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3JcbiAqIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmNvbnN0IHRvQVNDSUkgPSBmdW5jdGlvbihpbnB1dCkge1xuXHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdDogc3RyaW5nO1xuXHR9KTtcbn07XG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4vKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5jb25zdCBwdW55Y29kZSA9IHtcblx0LyoqXG5cdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEB0eXBlIFN0cmluZ1xuXHQgKi9cblx0J3ZlcnNpb24nOiAnMi4zLjEnLFxuXHQvKipcblx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0ICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cblx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAdHlwZSBPYmplY3Rcblx0ICovXG5cdCd1Y3MyJzoge1xuXHRcdCdkZWNvZGUnOiB1Y3MyZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdH0sXG5cdCdkZWNvZGUnOiBkZWNvZGUsXG5cdCdlbmNvZGUnOiBlbmNvZGUsXG5cdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0J3RvVW5pY29kZSc6IHRvVW5pY29kZVxufTtcblxuZXhwb3J0IHsgdWNzMmRlY29kZSwgdWNzMmVuY29kZSwgZGVjb2RlLCBlbmNvZGUsIHRvQVNDSUksIHRvVW5pY29kZSB9O1xuZXhwb3J0IGRlZmF1bHQgcHVueWNvZGU7XG4iLCJ2YXIgR09PRF9MRUFGX1NJWkUgPSAyMDA7XG5cbi8vIDo6IGNsYXNzPFQ+IEEgcm9wZSBzZXF1ZW5jZSBpcyBhIHBlcnNpc3RlbnQgc2VxdWVuY2UgZGF0YSBzdHJ1Y3R1cmVcbi8vIHRoYXQgc3VwcG9ydHMgYXBwZW5kaW5nLCBwcmVwZW5kaW5nLCBhbmQgc2xpY2luZyB3aXRob3V0IGRvaW5nIGFcbi8vIGZ1bGwgY29weS4gSXQgaXMgcmVwcmVzZW50ZWQgYXMgYSBtb3N0bHktYmFsYW5jZWQgdHJlZS5cbnZhciBSb3BlU2VxdWVuY2UgPSBmdW5jdGlvbiBSb3BlU2VxdWVuY2UgKCkge307XG5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kIChvdGhlcikge1xuICBpZiAoIW90aGVyLmxlbmd0aCkgeyByZXR1cm4gdGhpcyB9XG4gIG90aGVyID0gUm9wZVNlcXVlbmNlLmZyb20ob3RoZXIpO1xuXG4gIHJldHVybiAoIXRoaXMubGVuZ3RoICYmIG90aGVyKSB8fFxuICAgIChvdGhlci5sZW5ndGggPCBHT09EX0xFQUZfU0laRSAmJiB0aGlzLmxlYWZBcHBlbmQob3RoZXIpKSB8fFxuICAgICh0aGlzLmxlbmd0aCA8IEdPT0RfTEVBRl9TSVpFICYmIG90aGVyLmxlYWZQcmVwZW5kKHRoaXMpKSB8fFxuICAgIHRoaXMuYXBwZW5kSW5uZXIob3RoZXIpXG59O1xuXG4vLyA6OiAodW5pb248W1RdLCBSb3BlU2VxdWVuY2U8VD4+KSDihpIgUm9wZVNlcXVlbmNlPFQ+XG4vLyBQcmVwZW5kIGFuIGFycmF5IG9yIG90aGVyIHJvcGUgdG8gdGhpcyBvbmUsIHJldHVybmluZyBhIG5ldyByb3BlLlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gcHJlcGVuZCAob3RoZXIpIHtcbiAgaWYgKCFvdGhlci5sZW5ndGgpIHsgcmV0dXJuIHRoaXMgfVxuICByZXR1cm4gUm9wZVNlcXVlbmNlLmZyb20ob3RoZXIpLmFwcGVuZCh0aGlzKVxufTtcblxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5hcHBlbmRJbm5lciA9IGZ1bmN0aW9uIGFwcGVuZElubmVyIChvdGhlcikge1xuICByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLCBvdGhlcilcbn07XG5cbi8vIDo6ICg/bnVtYmVyLCA/bnVtYmVyKSDihpIgUm9wZVNlcXVlbmNlPFQ+XG4vLyBDcmVhdGUgYSByb3BlIHJlcGVzZW50aW5nIGEgc3ViLXNlcXVlbmNlIG9mIHRoaXMgcm9wZS5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoZnJvbSwgdG8pIHtcbiAgICBpZiAoIGZyb20gPT09IHZvaWQgMCApIGZyb20gPSAwO1xuICAgIGlmICggdG8gPT09IHZvaWQgMCApIHRvID0gdGhpcy5sZW5ndGg7XG5cbiAgaWYgKGZyb20gPj0gdG8pIHsgcmV0dXJuIFJvcGVTZXF1ZW5jZS5lbXB0eSB9XG4gIHJldHVybiB0aGlzLnNsaWNlSW5uZXIoTWF0aC5tYXgoMCwgZnJvbSksIE1hdGgubWluKHRoaXMubGVuZ3RoLCB0bykpXG59O1xuXG4vLyA6OiAobnVtYmVyKSDihpIgVFxuLy8gUmV0cmlldmUgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGZyb20gdGhpcyByb3BlLlxuUm9wZVNlcXVlbmNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5sZW5ndGgpIHsgcmV0dXJuIHVuZGVmaW5lZCB9XG4gIHJldHVybiB0aGlzLmdldElubmVyKGkpXG59O1xuXG4vLyA6OiAoKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIpIOKGkiA/Ym9vbCwgP251bWJlciwgP251bWJlcilcbi8vIENhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoIGVsZW1lbnQgYmV0d2VlbiB0aGUgZ2l2ZW5cbi8vIGluZGljZXMuIFRoaXMgdGVuZHMgdG8gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBsb29waW5nIG92ZXIgdGhlXG4vLyBpbmRpY2VzIGFuZCBjYWxsaW5nIGBnZXRgLCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSB0byBkZXNjZW5kIHRoZVxuLy8gdHJlZSBmb3IgZXZlcnkgZWxlbWVudC5cblJvcGVTZXF1ZW5jZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2ggKGYsIGZyb20sIHRvKSB7XG4gICAgaWYgKCBmcm9tID09PSB2b2lkIDAgKSBmcm9tID0gMDtcbiAgICBpZiAoIHRvID09PSB2b2lkIDAgKSB0byA9IHRoaXMubGVuZ3RoO1xuXG4gIGlmIChmcm9tIDw9IHRvKVxuICAgIHsgdGhpcy5mb3JFYWNoSW5uZXIoZiwgZnJvbSwgdG8sIDApOyB9XG4gIGVsc2VcbiAgICB7IHRoaXMuZm9yRWFjaEludmVydGVkSW5uZXIoZiwgZnJvbSwgdG8sIDApOyB9XG59O1xuXG4vLyA6OiAoKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIpIOKGkiBVLCA/bnVtYmVyLCA/bnVtYmVyKSDihpIgW1VdXG4vLyBNYXAgdGhlIGdpdmVuIGZ1bmN0aW9ucyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUgcm9wZSwgcHJvZHVjaW5nXG4vLyBhIGZsYXQgYXJyYXkuXG5Sb3BlU2VxdWVuY2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIG1hcCAoZiwgZnJvbSwgdG8pIHtcbiAgICBpZiAoIGZyb20gPT09IHZvaWQgMCApIGZyb20gPSAwO1xuICAgIGlmICggdG8gPT09IHZvaWQgMCApIHRvID0gdGhpcy5sZW5ndGg7XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsdCwgaSkgeyByZXR1cm4gcmVzdWx0LnB1c2goZihlbHQsIGkpKTsgfSwgZnJvbSwgdG8pO1xuICByZXR1cm4gcmVzdWx0XG59O1xuXG4vLyA6OiAoP3VuaW9uPFtUXSwgUm9wZVNlcXVlbmNlPFQ+Pikg4oaSIFJvcGVTZXF1ZW5jZTxUPlxuLy8gQ3JlYXRlIGEgcm9wZSByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGFycmF5LCBvciByZXR1cm4gdGhlIHJvcGVcbi8vIGl0c2VsZiBpZiBhIHJvcGUgd2FzIGdpdmVuLlxuUm9wZVNlcXVlbmNlLmZyb20gPSBmdW5jdGlvbiBmcm9tICh2YWx1ZXMpIHtcbiAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIFJvcGVTZXF1ZW5jZSkgeyByZXR1cm4gdmFsdWVzIH1cbiAgcmV0dXJuIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID8gbmV3IExlYWYodmFsdWVzKSA6IFJvcGVTZXF1ZW5jZS5lbXB0eVxufTtcblxudmFyIExlYWYgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChSb3BlU2VxdWVuY2UpIHtcbiAgZnVuY3Rpb24gTGVhZih2YWx1ZXMpIHtcbiAgICBSb3BlU2VxdWVuY2UuY2FsbCh0aGlzKTtcbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgfVxuXG4gIGlmICggUm9wZVNlcXVlbmNlICkgTGVhZi5fX3Byb3RvX18gPSBSb3BlU2VxdWVuY2U7XG4gIExlYWYucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUm9wZVNlcXVlbmNlICYmIFJvcGVTZXF1ZW5jZS5wcm90b3R5cGUgKTtcbiAgTGVhZi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMZWFmO1xuXG4gIHZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGxlbmd0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSxkZXB0aDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG4gIExlYWYucHJvdG90eXBlLmZsYXR0ZW4gPSBmdW5jdGlvbiBmbGF0dGVuICgpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNcbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5zbGljZUlubmVyID0gZnVuY3Rpb24gc2xpY2VJbm5lciAoZnJvbSwgdG8pIHtcbiAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgICByZXR1cm4gbmV3IExlYWYodGhpcy52YWx1ZXMuc2xpY2UoZnJvbSwgdG8pKVxuICB9O1xuXG4gIExlYWYucHJvdG90eXBlLmdldElubmVyID0gZnVuY3Rpb24gZ2V0SW5uZXIgKGkpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXNbaV1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5mb3JFYWNoSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW5uZXIgKGYsIGZyb20sIHRvLCBzdGFydCkge1xuICAgIGZvciAodmFyIGkgPSBmcm9tOyBpIDwgdG87IGkrKylcbiAgICAgIHsgaWYgKGYodGhpcy52YWx1ZXNbaV0sIHN0YXJ0ICsgaSkgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5mb3JFYWNoSW52ZXJ0ZWRJbm5lciA9IGZ1bmN0aW9uIGZvckVhY2hJbnZlcnRlZElubmVyIChmLCBmcm9tLCB0bywgc3RhcnQpIHtcbiAgICBmb3IgKHZhciBpID0gZnJvbSAtIDE7IGkgPj0gdG87IGktLSlcbiAgICAgIHsgaWYgKGYodGhpcy52YWx1ZXNbaV0sIHN0YXJ0ICsgaSkgPT09IGZhbHNlKSB7IHJldHVybiBmYWxzZSB9IH1cbiAgfTtcblxuICBMZWFmLnByb3RvdHlwZS5sZWFmQXBwZW5kID0gZnVuY3Rpb24gbGVhZkFwcGVuZCAob3RoZXIpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggKyBvdGhlci5sZW5ndGggPD0gR09PRF9MRUFGX1NJWkUpXG4gICAgICB7IHJldHVybiBuZXcgTGVhZih0aGlzLnZhbHVlcy5jb25jYXQob3RoZXIuZmxhdHRlbigpKSkgfVxuICB9O1xuXG4gIExlYWYucHJvdG90eXBlLmxlYWZQcmVwZW5kID0gZnVuY3Rpb24gbGVhZlByZXBlbmQgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICsgb3RoZXIubGVuZ3RoIDw9IEdPT0RfTEVBRl9TSVpFKVxuICAgICAgeyByZXR1cm4gbmV3IExlYWYob3RoZXIuZmxhdHRlbigpLmNvbmNhdCh0aGlzLnZhbHVlcykpIH1cbiAgfTtcblxuICBwcm90b3R5cGVBY2Nlc3NvcnMubGVuZ3RoLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCB9O1xuXG4gIHByb3RvdHlwZUFjY2Vzc29ycy5kZXB0aC5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAwIH07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExlYWYucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuICByZXR1cm4gTGVhZjtcbn0oUm9wZVNlcXVlbmNlKSk7XG5cbi8vIDo6IFJvcGVTZXF1ZW5jZVxuLy8gVGhlIGVtcHR5IHJvcGUgc2VxdWVuY2UuXG5Sb3BlU2VxdWVuY2UuZW1wdHkgPSBuZXcgTGVhZihbXSk7XG5cbnZhciBBcHBlbmQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChSb3BlU2VxdWVuY2UpIHtcbiAgZnVuY3Rpb24gQXBwZW5kKGxlZnQsIHJpZ2h0KSB7XG4gICAgUm9wZVNlcXVlbmNlLmNhbGwodGhpcyk7XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgdGhpcy5sZW5ndGggPSBsZWZ0Lmxlbmd0aCArIHJpZ2h0Lmxlbmd0aDtcbiAgICB0aGlzLmRlcHRoID0gTWF0aC5tYXgobGVmdC5kZXB0aCwgcmlnaHQuZGVwdGgpICsgMTtcbiAgfVxuXG4gIGlmICggUm9wZVNlcXVlbmNlICkgQXBwZW5kLl9fcHJvdG9fXyA9IFJvcGVTZXF1ZW5jZTtcbiAgQXBwZW5kLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFJvcGVTZXF1ZW5jZSAmJiBSb3BlU2VxdWVuY2UucHJvdG90eXBlICk7XG4gIEFwcGVuZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcHBlbmQ7XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5mbGF0dGVuID0gZnVuY3Rpb24gZmxhdHRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVmdC5mbGF0dGVuKCkuY29uY2F0KHRoaXMucmlnaHQuZmxhdHRlbigpKVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZ2V0SW5uZXIgPSBmdW5jdGlvbiBnZXRJbm5lciAoaSkge1xuICAgIHJldHVybiBpIDwgdGhpcy5sZWZ0Lmxlbmd0aCA/IHRoaXMubGVmdC5nZXQoaSkgOiB0aGlzLnJpZ2h0LmdldChpIC0gdGhpcy5sZWZ0Lmxlbmd0aClcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmZvckVhY2hJbm5lciA9IGZ1bmN0aW9uIGZvckVhY2hJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmIChmcm9tIDwgbGVmdExlbiAmJlxuICAgICAgICB0aGlzLmxlZnQuZm9yRWFjaElubmVyKGYsIGZyb20sIE1hdGgubWluKHRvLCBsZWZ0TGVuKSwgc3RhcnQpID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAodG8gPiBsZWZ0TGVuICYmXG4gICAgICAgIHRoaXMucmlnaHQuZm9yRWFjaElubmVyKGYsIE1hdGgubWF4KGZyb20gLSBsZWZ0TGVuLCAwKSwgTWF0aC5taW4odGhpcy5sZW5ndGgsIHRvKSAtIGxlZnRMZW4sIHN0YXJ0ICsgbGVmdExlbikgPT09IGZhbHNlKVxuICAgICAgeyByZXR1cm4gZmFsc2UgfVxuICB9O1xuXG4gIEFwcGVuZC5wcm90b3R5cGUuZm9yRWFjaEludmVydGVkSW5uZXIgPSBmdW5jdGlvbiBmb3JFYWNoSW52ZXJ0ZWRJbm5lciAoZiwgZnJvbSwgdG8sIHN0YXJ0KSB7XG4gICAgdmFyIGxlZnRMZW4gPSB0aGlzLmxlZnQubGVuZ3RoO1xuICAgIGlmIChmcm9tID4gbGVmdExlbiAmJlxuICAgICAgICB0aGlzLnJpZ2h0LmZvckVhY2hJbnZlcnRlZElubmVyKGYsIGZyb20gLSBsZWZ0TGVuLCBNYXRoLm1heCh0bywgbGVmdExlbikgLSBsZWZ0TGVuLCBzdGFydCArIGxlZnRMZW4pID09PSBmYWxzZSlcbiAgICAgIHsgcmV0dXJuIGZhbHNlIH1cbiAgICBpZiAodG8gPCBsZWZ0TGVuICYmXG4gICAgICAgIHRoaXMubGVmdC5mb3JFYWNoSW52ZXJ0ZWRJbm5lcihmLCBNYXRoLm1pbihmcm9tLCBsZWZ0TGVuKSwgdG8sIHN0YXJ0KSA9PT0gZmFsc2UpXG4gICAgICB7IHJldHVybiBmYWxzZSB9XG4gIH07XG5cbiAgQXBwZW5kLnByb3RvdHlwZS5zbGljZUlubmVyID0gZnVuY3Rpb24gc2xpY2VJbm5lciAoZnJvbSwgdG8pIHtcbiAgICBpZiAoZnJvbSA9PSAwICYmIHRvID09IHRoaXMubGVuZ3RoKSB7IHJldHVybiB0aGlzIH1cbiAgICB2YXIgbGVmdExlbiA9IHRoaXMubGVmdC5sZW5ndGg7XG4gICAgaWYgKHRvIDw9IGxlZnRMZW4pIHsgcmV0dXJuIHRoaXMubGVmdC5zbGljZShmcm9tLCB0bykgfVxuICAgIGlmIChmcm9tID49IGxlZnRMZW4pIHsgcmV0dXJuIHRoaXMucmlnaHQuc2xpY2UoZnJvbSAtIGxlZnRMZW4sIHRvIC0gbGVmdExlbikgfVxuICAgIHJldHVybiB0aGlzLmxlZnQuc2xpY2UoZnJvbSwgbGVmdExlbikuYXBwZW5kKHRoaXMucmlnaHQuc2xpY2UoMCwgdG8gLSBsZWZ0TGVuKSlcbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmxlYWZBcHBlbmQgPSBmdW5jdGlvbiBsZWFmQXBwZW5kIChvdGhlcikge1xuICAgIHZhciBpbm5lciA9IHRoaXMucmlnaHQubGVhZkFwcGVuZChvdGhlcik7XG4gICAgaWYgKGlubmVyKSB7IHJldHVybiBuZXcgQXBwZW5kKHRoaXMubGVmdCwgaW5uZXIpIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmxlYWZQcmVwZW5kID0gZnVuY3Rpb24gbGVhZlByZXBlbmQgKG90aGVyKSB7XG4gICAgdmFyIGlubmVyID0gdGhpcy5sZWZ0LmxlYWZQcmVwZW5kKG90aGVyKTtcbiAgICBpZiAoaW5uZXIpIHsgcmV0dXJuIG5ldyBBcHBlbmQoaW5uZXIsIHRoaXMucmlnaHQpIH1cbiAgfTtcblxuICBBcHBlbmQucHJvdG90eXBlLmFwcGVuZElubmVyID0gZnVuY3Rpb24gYXBwZW5kSW5uZXIgKG90aGVyKSB7XG4gICAgaWYgKHRoaXMubGVmdC5kZXB0aCA+PSBNYXRoLm1heCh0aGlzLnJpZ2h0LmRlcHRoLCBvdGhlci5kZXB0aCkgKyAxKVxuICAgICAgeyByZXR1cm4gbmV3IEFwcGVuZCh0aGlzLmxlZnQsIG5ldyBBcHBlbmQodGhpcy5yaWdodCwgb3RoZXIpKSB9XG4gICAgcmV0dXJuIG5ldyBBcHBlbmQodGhpcywgb3RoZXIpXG4gIH07XG5cbiAgcmV0dXJuIEFwcGVuZDtcbn0oUm9wZVNlcXVlbmNlKSk7XG5cbmV4cG9ydCBkZWZhdWx0IFJvcGVTZXF1ZW5jZTtcbiIsImV4cG9ydCBkZWZhdWx0IC9bXFwwLVxceDFGXFx4N0YtXFx4OUZdLyIsImV4cG9ydCBkZWZhdWx0IC9bXFx4QURcXHUwNjAwLVxcdTA2MDVcXHUwNjFDXFx1MDZERFxcdTA3MEZcXHUwODkwXFx1MDg5MVxcdTA4RTJcXHUxODBFXFx1MjAwQi1cXHUyMDBGXFx1MjAyQS1cXHUyMDJFXFx1MjA2MC1cXHUyMDY0XFx1MjA2Ni1cXHUyMDZGXFx1RkVGRlxcdUZGRjktXFx1RkZGQl18XFx1RDgwNFtcXHVEQ0JEXFx1RENDRF18XFx1RDgwRFtcXHVEQzMwLVxcdURDM0ZdfFxcdUQ4MkZbXFx1RENBMC1cXHVEQ0EzXXxcXHVEODM0W1xcdURENzMtXFx1REQ3QV18XFx1REI0MFtcXHVEQzAxXFx1REMyMC1cXHVEQzdGXS8iLCJleHBvcnQgZGVmYXVsdCAvWyEtIyUtXFwqLC1cXC86O1xcP0BcXFstXFxdX1xce1xcfVxceEExXFx4QTdcXHhBQlxceEI2XFx4QjdcXHhCQlxceEJGXFx1MDM3RVxcdTAzODdcXHUwNTVBLVxcdTA1NUZcXHUwNTg5XFx1MDU4QVxcdTA1QkVcXHUwNUMwXFx1MDVDM1xcdTA1QzZcXHUwNUYzXFx1MDVGNFxcdTA2MDlcXHUwNjBBXFx1MDYwQ1xcdTA2MERcXHUwNjFCXFx1MDYxRC1cXHUwNjFGXFx1MDY2QS1cXHUwNjZEXFx1MDZENFxcdTA3MDAtXFx1MDcwRFxcdTA3RjctXFx1MDdGOVxcdTA4MzAtXFx1MDgzRVxcdTA4NUVcXHUwOTY0XFx1MDk2NVxcdTA5NzBcXHUwOUZEXFx1MEE3NlxcdTBBRjBcXHUwQzc3XFx1MEM4NFxcdTBERjRcXHUwRTRGXFx1MEU1QVxcdTBFNUJcXHUwRjA0LVxcdTBGMTJcXHUwRjE0XFx1MEYzQS1cXHUwRjNEXFx1MEY4NVxcdTBGRDAtXFx1MEZENFxcdTBGRDlcXHUwRkRBXFx1MTA0QS1cXHUxMDRGXFx1MTBGQlxcdTEzNjAtXFx1MTM2OFxcdTE0MDBcXHUxNjZFXFx1MTY5QlxcdTE2OUNcXHUxNkVCLVxcdTE2RURcXHUxNzM1XFx1MTczNlxcdTE3RDQtXFx1MTdENlxcdTE3RDgtXFx1MTdEQVxcdTE4MDAtXFx1MTgwQVxcdTE5NDRcXHUxOTQ1XFx1MUExRVxcdTFBMUZcXHUxQUEwLVxcdTFBQTZcXHUxQUE4LVxcdTFBQURcXHUxQjVBLVxcdTFCNjBcXHUxQjdEXFx1MUI3RVxcdTFCRkMtXFx1MUJGRlxcdTFDM0ItXFx1MUMzRlxcdTFDN0VcXHUxQzdGXFx1MUNDMC1cXHUxQ0M3XFx1MUNEM1xcdTIwMTAtXFx1MjAyN1xcdTIwMzAtXFx1MjA0M1xcdTIwNDUtXFx1MjA1MVxcdTIwNTMtXFx1MjA1RVxcdTIwN0RcXHUyMDdFXFx1MjA4RFxcdTIwOEVcXHUyMzA4LVxcdTIzMEJcXHUyMzI5XFx1MjMyQVxcdTI3NjgtXFx1Mjc3NVxcdTI3QzVcXHUyN0M2XFx1MjdFNi1cXHUyN0VGXFx1Mjk4My1cXHUyOTk4XFx1MjlEOC1cXHUyOURCXFx1MjlGQ1xcdTI5RkRcXHUyQ0Y5LVxcdTJDRkNcXHUyQ0ZFXFx1MkNGRlxcdTJENzBcXHUyRTAwLVxcdTJFMkVcXHUyRTMwLVxcdTJFNEZcXHUyRTUyLVxcdTJFNURcXHUzMDAxLVxcdTMwMDNcXHUzMDA4LVxcdTMwMTFcXHUzMDE0LVxcdTMwMUZcXHUzMDMwXFx1MzAzRFxcdTMwQTBcXHUzMEZCXFx1QTRGRVxcdUE0RkZcXHVBNjBELVxcdUE2MEZcXHVBNjczXFx1QTY3RVxcdUE2RjItXFx1QTZGN1xcdUE4NzQtXFx1QTg3N1xcdUE4Q0VcXHVBOENGXFx1QThGOC1cXHVBOEZBXFx1QThGQ1xcdUE5MkVcXHVBOTJGXFx1QTk1RlxcdUE5QzEtXFx1QTlDRFxcdUE5REVcXHVBOURGXFx1QUE1Qy1cXHVBQTVGXFx1QUFERVxcdUFBREZcXHVBQUYwXFx1QUFGMVxcdUFCRUJcXHVGRDNFXFx1RkQzRlxcdUZFMTAtXFx1RkUxOVxcdUZFMzAtXFx1RkU1MlxcdUZFNTQtXFx1RkU2MVxcdUZFNjNcXHVGRTY4XFx1RkU2QVxcdUZFNkJcXHVGRjAxLVxcdUZGMDNcXHVGRjA1LVxcdUZGMEFcXHVGRjBDLVxcdUZGMEZcXHVGRjFBXFx1RkYxQlxcdUZGMUZcXHVGRjIwXFx1RkYzQi1cXHVGRjNEXFx1RkYzRlxcdUZGNUJcXHVGRjVEXFx1RkY1Ri1cXHVGRjY1XXxcXHVEODAwW1xcdUREMDAtXFx1REQwMlxcdURGOUZcXHVERkQwXXxcXHVEODAxXFx1REQ2RnxcXHVEODAyW1xcdURDNTdcXHVERDFGXFx1REQzRlxcdURFNTAtXFx1REU1OFxcdURFN0ZcXHVERUYwLVxcdURFRjZcXHVERjM5LVxcdURGM0ZcXHVERjk5LVxcdURGOUNdfFxcdUQ4MDNbXFx1REVBRFxcdURGNTUtXFx1REY1OVxcdURGODYtXFx1REY4OV18XFx1RDgwNFtcXHVEQzQ3LVxcdURDNERcXHVEQ0JCXFx1RENCQ1xcdURDQkUtXFx1RENDMVxcdURENDAtXFx1REQ0M1xcdURENzRcXHVERDc1XFx1RERDNS1cXHVEREM4XFx1RERDRFxcdUREREJcXHVERERELVxcdUREREZcXHVERTM4LVxcdURFM0RcXHVERUE5XXxcXHVEODA1W1xcdURDNEItXFx1REM0RlxcdURDNUFcXHVEQzVCXFx1REM1RFxcdURDQzZcXHVEREMxLVxcdURERDdcXHVERTQxLVxcdURFNDNcXHVERTYwLVxcdURFNkNcXHVERUI5XFx1REYzQy1cXHVERjNFXXxcXHVEODA2W1xcdURDM0JcXHVERDQ0LVxcdURENDZcXHVEREUyXFx1REUzRi1cXHVERTQ2XFx1REU5QS1cXHVERTlDXFx1REU5RS1cXHVERUEyXFx1REYwMC1cXHVERjA5XXxcXHVEODA3W1xcdURDNDEtXFx1REM0NVxcdURDNzBcXHVEQzcxXFx1REVGN1xcdURFRjhcXHVERjQzLVxcdURGNEZcXHVERkZGXXxcXHVEODA5W1xcdURDNzAtXFx1REM3NF18XFx1RDgwQltcXHVERkYxXFx1REZGMl18XFx1RDgxQVtcXHVERTZFXFx1REU2RlxcdURFRjVcXHVERjM3LVxcdURGM0JcXHVERjQ0XXxcXHVEODFCW1xcdURFOTctXFx1REU5QVxcdURGRTJdfFxcdUQ4MkZcXHVEQzlGfFxcdUQ4MzZbXFx1REU4Ny1cXHVERThCXXxcXHVEODNBW1xcdURENUVcXHVERDVGXS8iLCJleHBvcnQgZGVmYXVsdCAvW1xcJFxcKzwtPlxcXmBcXHx+XFx4QTItXFx4QTZcXHhBOFxceEE5XFx4QUNcXHhBRS1cXHhCMVxceEI0XFx4QjhcXHhEN1xceEY3XFx1MDJDMi1cXHUwMkM1XFx1MDJEMi1cXHUwMkRGXFx1MDJFNS1cXHUwMkVCXFx1MDJFRFxcdTAyRUYtXFx1MDJGRlxcdTAzNzVcXHUwMzg0XFx1MDM4NVxcdTAzRjZcXHUwNDgyXFx1MDU4RC1cXHUwNThGXFx1MDYwNi1cXHUwNjA4XFx1MDYwQlxcdTA2MEVcXHUwNjBGXFx1MDZERVxcdTA2RTlcXHUwNkZEXFx1MDZGRVxcdTA3RjZcXHUwN0ZFXFx1MDdGRlxcdTA4ODhcXHUwOUYyXFx1MDlGM1xcdTA5RkFcXHUwOUZCXFx1MEFGMVxcdTBCNzBcXHUwQkYzLVxcdTBCRkFcXHUwQzdGXFx1MEQ0RlxcdTBENzlcXHUwRTNGXFx1MEYwMS1cXHUwRjAzXFx1MEYxM1xcdTBGMTUtXFx1MEYxN1xcdTBGMUEtXFx1MEYxRlxcdTBGMzRcXHUwRjM2XFx1MEYzOFxcdTBGQkUtXFx1MEZDNVxcdTBGQzctXFx1MEZDQ1xcdTBGQ0VcXHUwRkNGXFx1MEZENS1cXHUwRkQ4XFx1MTA5RVxcdTEwOUZcXHUxMzkwLVxcdTEzOTlcXHUxNjZEXFx1MTdEQlxcdTE5NDBcXHUxOURFLVxcdTE5RkZcXHUxQjYxLVxcdTFCNkFcXHUxQjc0LVxcdTFCN0NcXHUxRkJEXFx1MUZCRi1cXHUxRkMxXFx1MUZDRC1cXHUxRkNGXFx1MUZERC1cXHUxRkRGXFx1MUZFRC1cXHUxRkVGXFx1MUZGRFxcdTFGRkVcXHUyMDQ0XFx1MjA1MlxcdTIwN0EtXFx1MjA3Q1xcdTIwOEEtXFx1MjA4Q1xcdTIwQTAtXFx1MjBDMFxcdTIxMDBcXHUyMTAxXFx1MjEwMy1cXHUyMTA2XFx1MjEwOFxcdTIxMDlcXHUyMTE0XFx1MjExNi1cXHUyMTE4XFx1MjExRS1cXHUyMTIzXFx1MjEyNVxcdTIxMjdcXHUyMTI5XFx1MjEyRVxcdTIxM0FcXHUyMTNCXFx1MjE0MC1cXHUyMTQ0XFx1MjE0QS1cXHUyMTREXFx1MjE0RlxcdTIxOEFcXHUyMThCXFx1MjE5MC1cXHUyMzA3XFx1MjMwQy1cXHUyMzI4XFx1MjMyQi1cXHUyNDI2XFx1MjQ0MC1cXHUyNDRBXFx1MjQ5Qy1cXHUyNEU5XFx1MjUwMC1cXHUyNzY3XFx1Mjc5NC1cXHUyN0M0XFx1MjdDNy1cXHUyN0U1XFx1MjdGMC1cXHUyOTgyXFx1Mjk5OS1cXHUyOUQ3XFx1MjlEQy1cXHUyOUZCXFx1MjlGRS1cXHUyQjczXFx1MkI3Ni1cXHUyQjk1XFx1MkI5Ny1cXHUyQkZGXFx1MkNFNS1cXHUyQ0VBXFx1MkU1MFxcdTJFNTFcXHUyRTgwLVxcdTJFOTlcXHUyRTlCLVxcdTJFRjNcXHUyRjAwLVxcdTJGRDVcXHUyRkYwLVxcdTJGRkZcXHUzMDA0XFx1MzAxMlxcdTMwMTNcXHUzMDIwXFx1MzAzNlxcdTMwMzdcXHUzMDNFXFx1MzAzRlxcdTMwOUJcXHUzMDlDXFx1MzE5MFxcdTMxOTFcXHUzMTk2LVxcdTMxOUZcXHUzMUMwLVxcdTMxRTNcXHUzMUVGXFx1MzIwMC1cXHUzMjFFXFx1MzIyQS1cXHUzMjQ3XFx1MzI1MFxcdTMyNjAtXFx1MzI3RlxcdTMyOEEtXFx1MzJCMFxcdTMyQzAtXFx1MzNGRlxcdTREQzAtXFx1NERGRlxcdUE0OTAtXFx1QTRDNlxcdUE3MDAtXFx1QTcxNlxcdUE3MjBcXHVBNzIxXFx1QTc4OVxcdUE3OEFcXHVBODI4LVxcdUE4MkJcXHVBODM2LVxcdUE4MzlcXHVBQTc3LVxcdUFBNzlcXHVBQjVCXFx1QUI2QVxcdUFCNkJcXHVGQjI5XFx1RkJCMi1cXHVGQkMyXFx1RkQ0MC1cXHVGRDRGXFx1RkRDRlxcdUZERkMtXFx1RkRGRlxcdUZFNjJcXHVGRTY0LVxcdUZFNjZcXHVGRTY5XFx1RkYwNFxcdUZGMEJcXHVGRjFDLVxcdUZGMUVcXHVGRjNFXFx1RkY0MFxcdUZGNUNcXHVGRjVFXFx1RkZFMC1cXHVGRkU2XFx1RkZFOC1cXHVGRkVFXFx1RkZGQ1xcdUZGRkRdfFxcdUQ4MDBbXFx1REQzNy1cXHVERDNGXFx1REQ3OS1cXHVERDg5XFx1REQ4Qy1cXHVERDhFXFx1REQ5MC1cXHVERDlDXFx1RERBMFxcdURERDAtXFx1RERGQ118XFx1RDgwMltcXHVEQzc3XFx1REM3OFxcdURFQzhdfFxcdUQ4MDVcXHVERjNGfFxcdUQ4MDdbXFx1REZENS1cXHVERkYxXXxcXHVEODFBW1xcdURGM0MtXFx1REYzRlxcdURGNDVdfFxcdUQ4MkZcXHVEQzlDfFxcdUQ4MzNbXFx1REY1MC1cXHVERkMzXXxcXHVEODM0W1xcdURDMDAtXFx1RENGNVxcdUREMDAtXFx1REQyNlxcdUREMjktXFx1REQ2NFxcdURENkEtXFx1REQ2Q1xcdUREODNcXHVERDg0XFx1REQ4Qy1cXHVEREE5XFx1RERBRS1cXHVEREVBXFx1REUwMC1cXHVERTQxXFx1REU0NVxcdURGMDAtXFx1REY1Nl18XFx1RDgzNVtcXHVERUMxXFx1REVEQlxcdURFRkJcXHVERjE1XFx1REYzNVxcdURGNEZcXHVERjZGXFx1REY4OVxcdURGQTlcXHVERkMzXXxcXHVEODM2W1xcdURDMDAtXFx1RERGRlxcdURFMzctXFx1REUzQVxcdURFNkQtXFx1REU3NFxcdURFNzYtXFx1REU4M1xcdURFODVcXHVERTg2XXxcXHVEODM4W1xcdURENEZcXHVERUZGXXxcXHVEODNCW1xcdURDQUNcXHVEQ0IwXFx1REQyRVxcdURFRjBcXHVERUYxXXxcXHVEODNDW1xcdURDMDAtXFx1REMyQlxcdURDMzAtXFx1REM5M1xcdURDQTAtXFx1RENBRVxcdURDQjEtXFx1RENCRlxcdURDQzEtXFx1RENDRlxcdURDRDEtXFx1RENGNVxcdUREMEQtXFx1RERBRFxcdURERTYtXFx1REUwMlxcdURFMTAtXFx1REUzQlxcdURFNDAtXFx1REU0OFxcdURFNTBcXHVERTUxXFx1REU2MC1cXHVERTY1XFx1REYwMC1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1REVEN1xcdURFREMtXFx1REVFQ1xcdURFRjAtXFx1REVGQ1xcdURGMDAtXFx1REY3NlxcdURGN0ItXFx1REZEOVxcdURGRTAtXFx1REZFQlxcdURGRjBdfFxcdUQ4M0VbXFx1REMwMC1cXHVEQzBCXFx1REMxMC1cXHVEQzQ3XFx1REM1MC1cXHVEQzU5XFx1REM2MC1cXHVEQzg3XFx1REM5MC1cXHVEQ0FEXFx1RENCMFxcdURDQjFcXHVERDAwLVxcdURFNTNcXHVERTYwLVxcdURFNkRcXHVERTcwLVxcdURFN0NcXHVERTgwLVxcdURFODhcXHVERTkwLVxcdURFQkRcXHVERUJGLVxcdURFQzVcXHVERUNFLVxcdURFREJcXHVERUUwLVxcdURFRThcXHVERUYwLVxcdURFRjhcXHVERjAwLVxcdURGOTJcXHVERjk0LVxcdURGQ0FdLyIsImV4cG9ydCBkZWZhdWx0IC9bIFxceEEwXFx1MTY4MFxcdTIwMDAtXFx1MjAwQVxcdTIwMjhcXHUyMDI5XFx1MjAyRlxcdTIwNUZcXHUzMDAwXS8iLCJpbXBvcnQgQW55IGZyb20gJy4vcHJvcGVydGllcy9BbnkvcmVnZXgubWpzJztcbmltcG9ydCBDYyAgZnJvbSAnLi9jYXRlZ29yaWVzL0NjL3JlZ2V4Lm1qcyc7XG5pbXBvcnQgQ2YgIGZyb20gJy4vY2F0ZWdvcmllcy9DZi9yZWdleC5tanMnO1xuaW1wb3J0IFAgICBmcm9tICcuL2NhdGVnb3JpZXMvUC9yZWdleC5tanMnO1xuaW1wb3J0IFMgICBmcm9tICcuL2NhdGVnb3JpZXMvUy9yZWdleC5tanMnO1xuaW1wb3J0IFogICBmcm9tICcuL2NhdGVnb3JpZXMvWi9yZWdleC5tanMnO1xuXG5leHBvcnQgeyBBbnksIENjLCBDZiwgUCwgUywgWiB9O1xuIiwiZXhwb3J0IGRlZmF1bHQgL1tcXDAtXFx1RDdGRlxcdUUwMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxbXFx1RDgwMC1cXHVEQkZGXSg/IVtcXHVEQzAwLVxcdURGRkZdKXwoPzpbXlxcdUQ4MDAtXFx1REJGRl18XilbXFx1REMwMC1cXHVERkZGXS8iLCJleHBvcnQgdmFyIGJhc2UgPSB7XG4gIDg6IFwiQmFja3NwYWNlXCIsXG4gIDk6IFwiVGFiXCIsXG4gIDEwOiBcIkVudGVyXCIsXG4gIDEyOiBcIk51bUxvY2tcIixcbiAgMTM6IFwiRW50ZXJcIixcbiAgMTY6IFwiU2hpZnRcIixcbiAgMTc6IFwiQ29udHJvbFwiLFxuICAxODogXCJBbHRcIixcbiAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgMjc6IFwiRXNjYXBlXCIsXG4gIDMyOiBcIiBcIixcbiAgMzM6IFwiUGFnZVVwXCIsXG4gIDM0OiBcIlBhZ2VEb3duXCIsXG4gIDM1OiBcIkVuZFwiLFxuICAzNjogXCJIb21lXCIsXG4gIDM3OiBcIkFycm93TGVmdFwiLFxuICAzODogXCJBcnJvd1VwXCIsXG4gIDM5OiBcIkFycm93UmlnaHRcIixcbiAgNDA6IFwiQXJyb3dEb3duXCIsXG4gIDQ0OiBcIlByaW50U2NyZWVuXCIsXG4gIDQ1OiBcIkluc2VydFwiLFxuICA0NjogXCJEZWxldGVcIixcbiAgNTk6IFwiO1wiLFxuICA2MTogXCI9XCIsXG4gIDkxOiBcIk1ldGFcIixcbiAgOTI6IFwiTWV0YVwiLFxuICAxMDY6IFwiKlwiLFxuICAxMDc6IFwiK1wiLFxuICAxMDg6IFwiLFwiLFxuICAxMDk6IFwiLVwiLFxuICAxMTA6IFwiLlwiLFxuICAxMTE6IFwiL1wiLFxuICAxNDQ6IFwiTnVtTG9ja1wiLFxuICAxNDU6IFwiU2Nyb2xsTG9ja1wiLFxuICAxNjA6IFwiU2hpZnRcIixcbiAgMTYxOiBcIlNoaWZ0XCIsXG4gIDE2MjogXCJDb250cm9sXCIsXG4gIDE2MzogXCJDb250cm9sXCIsXG4gIDE2NDogXCJBbHRcIixcbiAgMTY1OiBcIkFsdFwiLFxuICAxNzM6IFwiLVwiLFxuICAxODY6IFwiO1wiLFxuICAxODc6IFwiPVwiLFxuICAxODg6IFwiLFwiLFxuICAxODk6IFwiLVwiLFxuICAxOTA6IFwiLlwiLFxuICAxOTE6IFwiL1wiLFxuICAxOTI6IFwiYFwiLFxuICAyMTk6IFwiW1wiLFxuICAyMjA6IFwiXFxcXFwiLFxuICAyMjE6IFwiXVwiLFxuICAyMjI6IFwiJ1wiXG59XG5cbmV4cG9ydCB2YXIgc2hpZnQgPSB7XG4gIDQ4OiBcIilcIixcbiAgNDk6IFwiIVwiLFxuICA1MDogXCJAXCIsXG4gIDUxOiBcIiNcIixcbiAgNTI6IFwiJFwiLFxuICA1MzogXCIlXCIsXG4gIDU0OiBcIl5cIixcbiAgNTU6IFwiJlwiLFxuICA1NjogXCIqXCIsXG4gIDU3OiBcIihcIixcbiAgNTk6IFwiOlwiLFxuICA2MTogXCIrXCIsXG4gIDE3MzogXCJfXCIsXG4gIDE4NjogXCI6XCIsXG4gIDE4NzogXCIrXCIsXG4gIDE4ODogXCI8XCIsXG4gIDE4OTogXCJfXCIsXG4gIDE5MDogXCI+XCIsXG4gIDE5MTogXCI/XCIsXG4gIDE5MjogXCJ+XCIsXG4gIDIxOTogXCJ7XCIsXG4gIDIyMDogXCJ8XCIsXG4gIDIyMTogXCJ9XCIsXG4gIDIyMjogXCJcXFwiXCJcbn1cblxudmFyIG1hYyA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTWFjLy50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSlcbnZhciBpZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT0gXCJ1bmRlZmluZWRcIiAmJiAvTVNJRSBcXGR8VHJpZGVudFxcLyg/Ols3LTldfFxcZHsyLH0pXFwuLipydjooXFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClcblxuLy8gRmlsbCBpbiB0aGUgZGlnaXQga2V5c1xuZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSBiYXNlWzQ4ICsgaV0gPSBiYXNlWzk2ICsgaV0gPSBTdHJpbmcoaSlcblxuLy8gVGhlIGZ1bmN0aW9uIGtleXNcbmZvciAodmFyIGkgPSAxOyBpIDw9IDI0OyBpKyspIGJhc2VbaSArIDExMV0gPSBcIkZcIiArIGlcblxuLy8gQW5kIHRoZSBhbHBoYWJldGljIGtleXNcbmZvciAodmFyIGkgPSA2NTsgaSA8PSA5MDsgaSsrKSB7XG4gIGJhc2VbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAzMilcbiAgc2hpZnRbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXG59XG5cbi8vIEZvciBlYWNoIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgYSBzaGlmdC1lcXVpdmFsZW50LCBjb3B5IHRoZSBiYXNlIG5hbWVcbmZvciAodmFyIGNvZGUgaW4gYmFzZSkgaWYgKCFzaGlmdC5oYXNPd25Qcm9wZXJ0eShjb2RlKSkgc2hpZnRbY29kZV0gPSBiYXNlW2NvZGVdXG5cbmV4cG9ydCBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50KSB7XG4gIC8vIE9uIG1hY09TLCBrZXlzIGhlbGQgd2l0aCBTaGlmdCBhbmQgQ21kIGRvbid0IHJlZmxlY3QgdGhlIGVmZmVjdCBvZiBTaGlmdCBpbiBgLmtleWAuXG4gIC8vIE9uIElFLCBzaGlmdCBlZmZlY3QgaXMgbmV2ZXIgaW5jbHVkZWQgaW4gYC5rZXlgLlxuICB2YXIgaWdub3JlS2V5ID0gbWFjICYmIGV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSB8fFxuICAgICAgaWUgJiYgZXZlbnQuc2hpZnRLZXkgJiYgZXZlbnQua2V5ICYmIGV2ZW50LmtleS5sZW5ndGggPT0gMSB8fFxuICAgICAgZXZlbnQua2V5ID09IFwiVW5pZGVudGlmaWVkXCJcbiAgdmFyIG5hbWUgPSAoIWlnbm9yZUtleSAmJiBldmVudC5rZXkpIHx8XG4gICAgKGV2ZW50LnNoaWZ0S2V5ID8gc2hpZnQgOiBiYXNlKVtldmVudC5rZXlDb2RlXSB8fFxuICAgIGV2ZW50LmtleSB8fCBcIlVuaWRlbnRpZmllZFwiXG4gIC8vIEVkZ2Ugc29tZXRpbWVzIHByb2R1Y2VzIHdyb25nIG5hbWVzIChJc3N1ZSAjMylcbiAgaWYgKG5hbWUgPT0gXCJFc2NcIikgbmFtZSA9IFwiRXNjYXBlXCJcbiAgaWYgKG5hbWUgPT0gXCJEZWxcIikgbmFtZSA9IFwiRGVsZXRlXCJcbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODg2MDU3MS9cbiAgaWYgKG5hbWUgPT0gXCJMZWZ0XCIpIG5hbWUgPSBcIkFycm93TGVmdFwiXG4gIGlmIChuYW1lID09IFwiVXBcIikgbmFtZSA9IFwiQXJyb3dVcFwiXG4gIGlmIChuYW1lID09IFwiUmlnaHRcIikgbmFtZSA9IFwiQXJyb3dSaWdodFwiXG4gIGlmIChuYW1lID09IFwiRG93blwiKSBuYW1lID0gXCJBcnJvd0Rvd25cIlxuICByZXR1cm4gbmFtZVxufVxuIiwiaW1wb3J0IHsgUGx1Z2luLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JFeHRlbmRlclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSBlbDogSFRNTERpdkVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoZXh0ZW5kZXJFbDogSFRNTERpdkVsZW1lbnQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2aWV3OiAodmlld0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXdJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5lbCA9IGV4dGVuZGVyRWw7XG5cbiAgICAgICAgdGhpcy5lbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2sgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHsgZG9jLCB0ciB9ID0gc3RhdGU7XG4gICAgY29uc3QgbGFzdFBvcyA9IGRvYy5ub2RlU2l6ZSAtIDI7XG4gICAgY29uc3QgbGFzdE5vZGVUeXBlID0gc3RhdGUuZG9jLmxhc3RDaGlsZC50eXBlO1xuICAgIGlmIChsYXN0Tm9kZVR5cGUgPT09IHNjaGVtYS5ub2Rlcy5jb2RlX2Jsb2NrIHx8IGxhc3ROb2RlVHlwZS5pc0xlYWYpIHtcbiAgICAgIHRyLmluc2VydChsYXN0UG9zLCBzY2hlbWEubm9kZXMucGFyYWdyYXBoLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgfVxuICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24uYXRFbmQodHIuZG9jKSk7XG4gICAgdGhpcy52aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFBsdWdpbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBBVVRPX0xJTktfQVRUUiwgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IExpbmtpZnlJdCBmcm9tICdsaW5raWZ5LWl0JztcblxuY29uc3QgbGlua2lmeSA9IG5ldyBMaW5raWZ5SXQoKTtcblxuZXhwb3J0IGNvbnN0IGZpbmRBbmRJbnNlcnRJbmxpbmVMaW5rcyA9IChzdGF0ZSk6IFRyYW5zYWN0aW9uID0+IHtcbiAgY29uc3QgeyB0ciB9ID0gc3RhdGU7XG5cbiAgdHIuZG9jLmRlc2NlbmRhbnRzKChub2RlLCBwb3MsIHBhcmVudCkgPT4ge1xuICAgIGlmICghbm9kZS5pc1RleHRibG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpcnN0LCBmaW5kIGFuZCB2YWxpZGF0ZSBhbGwgZXhpc3RpbmcgYXV0b2xpbmtzLiBJZiBhbiBhdXRvbGluayBjb250YWlucyB0ZXh0IHRoYXQgaXMgbm90IGEgdmFsaWQgVVJMLCByZW1vdmUgdGhlIGxpbmsuXG4gICAgY29uc3Qgc3RhcnRpbmdQb3NpdGlvbkluc2lkZU5vZGUgPSBwb3MgKyAxO1xuICAgIGNvbnN0IGF1dG9MaW5rTWFwczogeyBzdGFydFBvczogbnVtYmVyOyBlbmRQb3M6IG51bWJlciB9W10gPSBbXTtcbiAgICBub2RlLmZvckVhY2goKGNoaWxkLCBvZmZzZXQsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIWNoaWxkLmlzVGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgY2hpbGRMaW5rTWFyayA9IGNoaWxkLm1hcmtzLmZpbmQoXG4gICAgICAgIChtYXJrKSA9PiBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rLFxuICAgICAgKTtcbiAgICAgIGlmIChjaGlsZExpbmtNYXJrICYmIGNoaWxkTGlua01hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdID09PSB0cnVlKSB7XG4gICAgICAgIGlmIChhdXRvTGlua01hcHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGFzdE1hcCA9IGF1dG9MaW5rTWFwc1thdXRvTGlua01hcHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3RNYXAuZW5kUG9zID09PSBzdGFydGluZ1Bvc2l0aW9uSW5zaWRlTm9kZSArIG9mZnNldCkge1xuICAgICAgICAgICAgbGFzdE1hcC5lbmRQb3MgPSBwb3MgKyBvZmZzZXQgKyBjaGlsZC5ub2RlU2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXV0b0xpbmtNYXBzLnB1c2goe1xuICAgICAgICAgICAgc3RhcnRQb3M6IHN0YXJ0aW5nUG9zaXRpb25JbnNpZGVOb2RlICsgb2Zmc2V0LFxuICAgICAgICAgICAgZW5kUG9zOiBzdGFydGluZ1Bvc2l0aW9uSW5zaWRlTm9kZSArIG9mZnNldCArIGNoaWxkLm5vZGVTaXplLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGF1dG9MaW5rTWFwIG9mIGF1dG9MaW5rTWFwcykge1xuICAgICAgY29uc3QgbGlua1RleHQgPSB0ci5kb2MudGV4dEJldHdlZW4oXG4gICAgICAgIGF1dG9MaW5rTWFwLnN0YXJ0UG9zLFxuICAgICAgICBhdXRvTGlua01hcC5lbmRQb3MsXG4gICAgICApO1xuICAgICAgaWYgKCFsaW5raWZ5LnRlc3QobGlua1RleHQpKSB7XG4gICAgICAgIHRyLnJlbW92ZU1hcmsoXG4gICAgICAgICAgYXV0b0xpbmtNYXAuc3RhcnRQb3MsXG4gICAgICAgICAgYXV0b0xpbmtNYXAuZW5kUG9zLFxuICAgICAgICAgIHNjaGVtYS5tYXJrcy5saW5rLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBlbHNlIHN0YXRlbWVudCBlbnN1cmVzIHRoYXQgZXhpc3RpbmcgYXV0b2xpbmtzIHdpbGwgY29udGludWUgdG8gdXBkYXRlIGV2ZW4gaWYgdGhleSBhcmVcbiAgICAgICAgLy8gYWRqYWNlbnQgdG8gb3RoZXIgdGV4dDsgdGhlIHJlZ2V4IFVSTCB0ZXN0IHdpbGwgc3RvcCBmaW5kaW5nIHRoZW0gaW4gdGhpcyBjYXNlLlxuICAgICAgICB0ci5hZGRNYXJrKFxuICAgICAgICAgIGF1dG9MaW5rTWFwLnN0YXJ0UG9zLFxuICAgICAgICAgIGF1dG9MaW5rTWFwLmVuZFBvcyxcbiAgICAgICAgICBzY2hlbWEubWFya3MubGluay5jcmVhdGUoeyBocmVmOiBsaW5rVGV4dCwgW0FVVE9fTElOS19BVFRSXTogdHJ1ZSB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVuLCBmaW5kIGFuZCBpbnNlcnQgbmV3IGF1dG9saW5rcyBiYXNlZCBvbiB0aGUgc2FtZSB0ZXN0LlxuICAgIGNvbnN0IG1hdGNoZXMgPSBsaW5raWZ5Lm1hdGNoKG5vZGUudGV4dENvbnRlbnQpO1xuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgY29uc3Qgc3RhcnQgPSBwb3MgKyAxICsgbWF0Y2guaW5kZXg7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIG1hdGNoLnRleHQubGVuZ3RoO1xuXG4gICAgICBpZiAodHIuZG9jLnJhbmdlSGFzTWFyayhzdGFydCwgZW5kLCBzY2hlbWEubWFya3MuY29kZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ci5kb2MucmFuZ2VIYXNNYXJrKHN0YXJ0LCBlbmQsIHNjaGVtYS5tYXJrcy5saW5rKSkge1xuICAgICAgICBsZXQgbGlua01hcmtzID0gW107XG4gICAgICAgIHRyLmRvYy5ub2Rlc0JldHdlZW4oc3RhcnQsIGVuZCwgKG5vZGUpID0+IHtcbiAgICAgICAgICBpZiAobm9kZS5pc1RleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtNYXJrID0gbm9kZS5tYXJrcy5maW5kKFxuICAgICAgICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobGlua01hcmsgJiYgbGlua01hcmsuYXR0cnNbQVVUT19MSU5LX0FUVFJdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBsaW5rTWFya3MucHVzaChsaW5rTWFyayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGxpbmtNYXJrcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ci5hZGRNYXJrKFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZW5kLFxuICAgICAgICBzY2hlbWEubWFya3MubGluay5jcmVhdGUoeyBocmVmOiBtYXRjaC51cmwsIFtBVVRPX0xJTktfQVRUUl06IHRydWUgfSksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHRyO1xufTtcblxuZXhwb3J0IGNsYXNzIElubGluZUxpbmtQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBhcHBlbmRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbnMsIG9sZFN0YXRlLCBuZXdTdGF0ZSkge1xuICAgICAgICByZXR1cm4gZmluZEFuZEluc2VydElubGluZUxpbmtzKG5ld1N0YXRlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBsdWdpbiwgRWRpdG9yU3RhdGUsIFRleHRTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQge1xuICBsaWZ0TGlzdEl0ZW0sXG4gIHNpbmtMaXN0SXRlbSxcbiAgd3JhcEluTGlzdCxcbn0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWxpc3QnO1xuaW1wb3J0IHsgTWFya1R5cGUsIE5vZGVSYW5nZSwgTm9kZVR5cGUsIFJlc29sdmVkUG9zIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgUmVtb3ZlTWFya1N0ZXAgfSBmcm9tICdwcm9zZW1pcnJvci10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgdW5kbywgcmVkbyB9IGZyb20gJ3Byb3NlbWlycm9yLWhpc3RvcnknO1xuaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBzZWxlY3RQYXJlbnROb2RlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsgQ2hlY2tib3hTdGF0dXMgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBpc0xpc3RCbG9jayB9IGZyb20gJy4vc2NoZW1hSGVscGVycyc7XG5cbmNvbnN0IEFQUExZX0ZPUk1BVF9BVFRSID0gJ2RhdGEtZm9ybWF0JztcblxudHlwZSBDb21tYW5kID0gdHlwZW9mIHNlbGVjdFBhcmVudE5vZGU7XG5cbi8qKlxuICogU3dhcCB0ZXh0IGJsb2NrcyB0byBhIGdpdmVuIG5vZGUgdHlwZVxuICogVGhpcyBoYW5kbGVzIGxpZnRpbmcgbGlzdCBpdGVtcyBpZiBuZWVkZWQgYmVmb3JlIGNvbnZlcnRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN3YXBUZXh0QmxvY2sodmlldzogRWRpdG9yVmlldywgbm9kZVR5cGU6IE5vZGVUeXBlKTogdm9pZCB7XG4gIGxldCB7IGRpc3BhdGNoLCBzdGF0ZSB9ID0gdmlldztcbiAgbGV0IHsgdHIgfSA9IHN0YXRlO1xuICBsZXQge1xuICAgIHNlbGVjdGlvbjogeyAkZnJvbSwgJHRvIH0sXG4gIH0gPSBzdGF0ZTtcblxuICBjb25zdCBsaXN0QmxvY2tSYW5nZSA9IGdldExpc3RCbG9ja1JhbmdlKCRmcm9tLCAkdG8pO1xuICBpZiAoY29udGFpbnNOZXN0ZWRMaXN0KCRmcm9tLCAkdG8sIGxpc3RCbG9ja1JhbmdlKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNXaXRoaW5OZXN0ZWRMaXN0KCRmcm9tLCAkdG8sIGxpc3RCbG9ja1JhbmdlKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgbm9kZVR5cGUgIT09IHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCAmJlxuICAgIG5vZGVUeXBlICE9PSBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0XG4gICkge1xuICAgIGxpZnRMaXN0SXRlbShzY2hlbWEubm9kZXMubGlzdF9pdGVtKShzdGF0ZSwgZGlzcGF0Y2gpO1xuICB9XG5cbiAgKHsgZGlzcGF0Y2gsIHN0YXRlIH0gPSB2aWV3KTtcbiAgKHsgdHIgfSA9IHN0YXRlKTtcbiAgY29uc3Qge1xuICAgIHNlbGVjdGlvbjogeyBmcm9tLCB0byB9LFxuICB9ID0gc3RhdGU7XG4gIHRyLnNldEJsb2NrVHlwZShmcm9tLCB0bywgbm9kZVR5cGUpO1xuICBkaXNwYXRjaCh0cik7XG59XG5cbmV4cG9ydCBjb25zdCBpbmRlbnRMaXN0U2VsZWN0aW9uOiBDb21tYW5kID0gZnVuY3Rpb24gKFxuICBzdGF0ZTogRWRpdG9yU3RhdGUsXG4gIGRpc3BhdGNoOiBFZGl0b3JWaWV3WydkaXNwYXRjaCddIHwgdW5kZWZpbmVkLFxuKSB7XG4gIHJldHVybiAoXG4gICAgc2lua0xpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pKHN0YXRlLCBkaXNwYXRjaCkgfHxcbiAgICB3cmFwSW5MaXN0KHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCkoc3RhdGUsIGRpc3BhdGNoKVxuICApO1xufTtcblxuZnVuY3Rpb24gZ2V0TGlzdEJsb2NrUmFuZ2UoXG4gICRmcm9tOiBSZXNvbHZlZFBvcyxcbiAgJHRvOiBSZXNvbHZlZFBvcyxcbiAgbGlzdFR5cGVzID0gW3NjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdF0sXG4pOiBOb2RlUmFuZ2UgfCBmYWxzZSB7XG4gIGNvbnN0IGxpc3RCbG9ja1JhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8sIChub2RlKSA9PlxuICAgIGlzTGlzdEJsb2NrKG5vZGUsIGxpc3RUeXBlcyksXG4gICk7XG4gIHJldHVybiBsaXN0QmxvY2tSYW5nZSB8fCBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNOZXN0ZWRMaXN0KFxuICAkZnJvbTogUmVzb2x2ZWRQb3MsXG4gICR0bzogUmVzb2x2ZWRQb3MsXG4gIGxpc3RCbG9ja1JhbmdlID0gZ2V0TGlzdEJsb2NrUmFuZ2UoJGZyb20sICR0byksXG4pOiBib29sZWFuIHtcbiAgaWYgKCFsaXN0QmxvY2tSYW5nZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBsZXQgY29udGFpbnNOZXN0ZWRMaXN0ID0gZmFsc2U7XG4gIGNvbnN0IHsgZG9jIH0gPSAkZnJvbTtcbiAgY29uc3QgJHJhbmdlU3RhcnQgPSBkb2MucmVzb2x2ZShsaXN0QmxvY2tSYW5nZS5zdGFydCk7XG4gIGNvbnN0ICRyYW5nZUVuZCA9IGRvYy5yZXNvbHZlKGxpc3RCbG9ja1JhbmdlLmVuZCk7XG4gIGxpc3RCbG9ja1JhbmdlLnBhcmVudC5ub2Rlc0JldHdlZW4oXG4gICAgJHJhbmdlU3RhcnQucGFyZW50T2Zmc2V0LFxuICAgICRyYW5nZUVuZC5wYXJlbnRPZmZzZXQsXG4gICAgKG5vZGUpID0+IHtcbiAgICAgIGlmIChjb250YWluc05lc3RlZExpc3QgfHwgbm9kZS5pc1RleHRibG9jaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNMaXN0QmxvY2sobm9kZSkpIHtcbiAgICAgICAgY29udGFpbnNOZXN0ZWRMaXN0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG4gIHJldHVybiBjb250YWluc05lc3RlZExpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzV2l0aGluTmVzdGVkTGlzdChcbiAgJGZyb206IFJlc29sdmVkUG9zLFxuICAkdG86IFJlc29sdmVkUG9zLFxuICBsaXN0QmxvY2tSYW5nZSA9IGdldExpc3RCbG9ja1JhbmdlKCRmcm9tLCAkdG8pLFxuKTogYm9vbGVhbiB7XG4gIGlmICghbGlzdEJsb2NrUmFuZ2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIGRlcHRoIG9mIHRoZSBsaXN0IGl0ZW0gbm9kZXMgd2l0aGluIHRoZSBsaXN0QmxvY2tSYW5nZSB3aWxsIGJlIDEgaWZcbiAgLy8gdGhleSBhcmUgaW4gYSB0b3AgbGV2ZWwgbGlzdC5cbiAgcmV0dXJuIGxpc3RCbG9ja1JhbmdlLmRlcHRoID4gMTtcbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudCBzZWxlY3Rpb24gY2FuIGJlIG91dGRlbnRlZCBpZjogT25lLCBpdCBpcyB3aXRoaW4gYSBsaXN0LiBBbmQgdHdvLFxuICogdGhlIGJlZ2lubmluZyAoaWUsIHRoZSB0b3ApIG9mIHRoZSBzZWxlY3Rpb24gcG9pbnRzIGludG8gdGhlIHNhbWUgbGlzdCBpdGVtXG4gKiBhcyB0aGUgb25lIHRoYXQgd2lsbCBiZSBvdXRkZW50ZWQgYnkgdGhlIG91dGRlbnQgY29tbWFuZC4gVGhpcyBpcyBpbXBvcnRhbnRcbiAqIGJlY2F1c2UgaWYgdGhlIHNlbGVjdGlvbiBpcyB3aXRoaW4gYSBzdWJsaXN0IG9mIHdoYXQgZ2V0cyBvdXRkZW50ZWQsIGl0IGZlZWxzXG4gKiB1bmV4cGVjdGVkOyBsaXN0IGl0ZW1zIG1hbnkgbGV2ZWxzIHVwIGFuZCBhYm92ZSB0aGUgc2VsZWN0aW9uIGNhbiBiZSBjaGFuZ2VkXG4gKiBhcyBhIHJlc3VsdC4gQ2hhbmdpbmcgbGlzdCBpdGVtcyBiZWxvdyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXNuJ3QgaWRlYWxcbiAqIGVpdGhlciwgYnV0IGl0IG1ha2VzIG1vcmUgaW50dWl0aXZlIHNlbnNlIHRoYW4gdGhlIGludmVyc2UuXG4gKlxuICogSWYgdGhlIHNlbGVjdGlvbiBjYW5ub3QgYmUgb3V0ZGVudGVkLCByZXR1cm4gZmFsc2UuIElmIGl0IGNhbiBiZSBvdXRkZW50ZWQsXG4gKiByZXR1cm4gdGhlIG5vZGUgcmFuZ2UgdGhhdCBzdXJyb3VuZHMgdGhlIHNlbGVjdGVkIGxpc3QgaXRlbXMuXG4gKi9cbmZ1bmN0aW9uIGNhbk91dGRlbnRMaXN0U2VsZWN0aW9uKHN0YXRlOiBFZGl0b3JTdGF0ZSk6IE5vZGVSYW5nZSB8IGZhbHNlIHtcbiAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gIGNvbnN0IGxpc3RCbG9ja1JhbmdlID0gZ2V0TGlzdEJsb2NrUmFuZ2UoJGZyb20sICR0byk7XG4gIGlmICghbGlzdEJsb2NrUmFuZ2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSAkZnJvbSBwb3NpdGlvbiBwb2ludHMgaW50byBhIHN1Ymxpc3Qgb3IgaWYgaXRzXG4gIC8vIHBhcmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIHRoZSBub2RlIHJhbmdlLiBBZGQgMiB0b1xuICAvLyAkZnJvbS5wYXJlbnRPZmZzZXQgdG8gYWNjb3VudCBmb3IgdGhlIG9wZW5pbmcgdG9rZW4gb2YgYm90aCB0aGUgbGlzdCBpdGVtXG4gIC8vIGFuZCB0aGUgcGFyYWdyYXBoLlxuICBpZiAoJGZyb20ucG9zICE9PSBsaXN0QmxvY2tSYW5nZS5zdGFydCArICRmcm9tLnBhcmVudE9mZnNldCArIDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGxpc3RCbG9ja1JhbmdlO1xufVxuXG5leHBvcnQgY29uc3Qgb3V0ZGVudExpc3RTZWxlY3Rpb246IENvbW1hbmQgPSBmdW5jdGlvbiAoXG4gIHN0YXRlOiBFZGl0b3JTdGF0ZSxcbiAgZGlzcGF0Y2g6IEVkaXRvclZpZXdbJ2Rpc3BhdGNoJ10gfCB1bmRlZmluZWQsXG4pIHtcbiAgaWYgKCFjYW5PdXRkZW50TGlzdFNlbGVjdGlvbihzdGF0ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGxpZnRMaXN0SXRlbShzY2hlbWEubm9kZXMubGlzdF9pdGVtKShzdGF0ZSwgZGlzcGF0Y2gpO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgdGhlIGxpc3QgdHlwZSBvZiB0aGUgc2VsZWN0aW9uLlxuICogLSBJZiB0aGUgc2VsZWN0aW9uIG92ZXJsYXBzIHdpdGggbGlzdCBub2RlcyBhbmQgbm9uLWxpc3Qgbm9kZXMsIG9yIGlmIGl0XG4gKiAgIGluY2x1ZGVzIGFueSBwb3J0aW9uIG9mIGEgbmVzdGVkIGxpc3QsIGRvIG5vdGhpbmdcbiAqIC0gSWYgdGhlIHNlbGVjdGlvbiBpcyBub3QgYSBsaXN0LCBjaGFuZ2UgaXQgaW50byBvbmVcbiAqIC0gSWYgdGhlIHNlbGVjdGlvbiBpcyBhIGxpc3QgYnV0IG5vdCB0aGUgZGVzaXJlZCBsaXN0IHR5cGUsIGNoYW5nZSBpdCBpbnRvXG4gKiAgIHRoZSBkZXNpcmVkIGxpc3QgdHlwZVxuICogLSBJZiB0aGUgc2VsZWN0aW9uIGlzIHRoZSBwYXNzZWQgaW4gbGlzdCB0eXBlLCBjaGFuZ2UgaXQgaW50byBhIHBhcmFncmFwaFxuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGlzdCA9IGZ1bmN0aW9uIChcbiAgdmlldzogRWRpdG9yVmlldyxcbiAgbGlzdFR5cGU6IE5vZGVUeXBlLFxuICBpdGVtVHlwZTogTm9kZVR5cGUsXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7XG4gICAgICBzZWxlY3Rpb246IHsgJGZyb20sICR0byB9LFxuICAgIH0sXG4gIH0gPSB2aWV3O1xuXG4gIGNvbnN0IGxpc3RCbG9ja1JhbmdlID0gZ2V0TGlzdEJsb2NrUmFuZ2UoJGZyb20sICR0bywgW2xpc3RUeXBlXSk7XG4gIGlmIChjb250YWluc05lc3RlZExpc3QoJGZyb20sICR0bywgbGlzdEJsb2NrUmFuZ2UpKSB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBvdmVybGFwcyB3aXRoIGEgbmVzdGVkIGxpc3QsIGRvIG5vdGhpbmcuXG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc1dpdGhpbk5lc3RlZExpc3QoJGZyb20sICR0bywgbGlzdEJsb2NrUmFuZ2UpKSB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyB3aXRoaW4gYSBuZXN0ZWQgbGlzdCwgZG8gbm90aGluZy5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGxpc3RCbG9ja1JhbmdlKSB7XG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBzcGFucyBleGNsdXNpdmVseSBhIGxpc3QgYXQgZGVwdGggMSBsaWZ0IHRoZSBzZWxlY3RlZFxuICAgIC8vIGl0ZW1zIG91dCBhbmQgYmUgZG9uZS5cbiAgICBsaWZ0TGlzdEl0ZW0oaXRlbVR5cGUpKHZpZXcuc3RhdGUsIHZpZXcuZGlzcGF0Y2gpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIG91dHNpZGUgb2YgYSBsaXN0LCBjaGVjayBpZiBpdCBpcyBwYXJ0aWFsbHkgaW5zaWRlIGEgbGlzdC5cbiAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcbiAgZm9yIChcbiAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXg7XG4gICAgaW5kZXggPCBibG9ja1JhbmdlLmVuZEluZGV4O1xuICAgIGluZGV4ICs9IDFcbiAgKSB7XG4gICAgaWYgKGlzTGlzdEJsb2NrKGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KSwgW2xpc3RUeXBlXSkpIHtcbiAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgcGFydGlhbGx5IGluc2lkZSBhIGxpc3QsIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBlbnRpcmVseSBvdXRzaWRlIGEgbGlzdCwgY29udmVydCBldmVyeXRoaW5nIHRvIGEgcGFyYWdyYXBoXG4gIC8vIHNvIGl0IGNhbiBzdWJzZXF1ZW50bHkgYmVjb21lIGEgbGlzdFxuICBzd2FwVGV4dEJsb2NrKHZpZXcsIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpO1xuICB3cmFwSW5MaXN0KGxpc3RUeXBlKSh2aWV3LnN0YXRlLCB2aWV3LmRpc3BhdGNoKTtcbn07XG5cbmNvbnN0IHRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZTogQ29tbWFuZCA9IGZ1bmN0aW9uIChcbiAgc3RhdGU6IEVkaXRvclN0YXRlLFxuICBkaXNwYXRjaDogRWRpdG9yVmlld1snZGlzcGF0Y2gnXSB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcblxuICBjb25zdCBibG9ja1JhbmdlID0gJGZyb20uYmxvY2tSYW5nZSgkdG8pO1xuXG4gIGxldCBoYXNDaGVja2VkID0gZmFsc2U7XG4gIGZvciAoXG4gICAgbGV0IGluZGV4ID0gYmxvY2tSYW5nZS5zdGFydEluZGV4LCBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgaW5kZXggKz0gMVxuICApIHtcbiAgICBpZiAoY2hpbGQudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmNoZWNrbGlzdF9pdGVtKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGlsZC5hdHRycy5zdGF0dXMgPT09IENoZWNrYm94U3RhdHVzLkRPTkUpIHtcbiAgICAgIGhhc0NoZWNrZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaXNwYXRjaCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgeyB0ciB9ID0gc3RhdGU7XG4gIGZvciAoXG4gICAgbGV0IGluZGV4ID0gYmxvY2tSYW5nZS5zdGFydEluZGV4LFxuICAgICAgY2hpbGQgPSBibG9ja1JhbmdlLnBhcmVudC5jaGlsZChpbmRleCksXG4gICAgICBwb3MgPSBibG9ja1JhbmdlLnN0YXJ0O1xuICAgIGluZGV4IDwgYmxvY2tSYW5nZS5lbmRJbmRleDtcbiAgICBpbmRleCArPSAxXG4gICkge1xuICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCB1bmRlZmluZWQsIHtcbiAgICAgIHN0YXR1czogaGFzQ2hlY2tlZCA/IENoZWNrYm94U3RhdHVzLkVNUFRZIDogQ2hlY2tib3hTdGF0dXMuRE9ORSxcbiAgICB9KTtcbiAgICBwb3MgKz0gY2hpbGQubm9kZVNpemU7XG4gIH1cblxuICBkaXNwYXRjaCh0cik7XG4gIHJldHVybiB0cnVlO1xufTtcblxudHlwZSBtb2RhbENvbmZpcm1IYW5kbGVyID0gKHBhcmFtczogeyB0ZXh0OiBzdHJpbmc7IHVybDogc3RyaW5nIH0pID0+IHZvaWQ7XG5cbmNsYXNzIExpbmtNb2RhbCB7XG4gIHByaXZhdGUgZWw6IEVsZW1lbnQ7XG4gIHByaXZhdGUgZnJhbWVFbDogRWxlbWVudDtcbiAgcHJpdmF0ZSB0ZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgdXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgb25Db25maXJtOiBtb2RhbENvbmZpcm1IYW5kbGVyO1xuICBwcml2YXRlIG9uQ2xlYXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHNob3dDbHMgPSAnYWN0aXZlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbDogRWxlbWVudCxcbiAgICB7XG4gICAgICBvbkNvbmZpcm0sXG4gICAgICBvbkNsZWFyLFxuICAgICAgdGV4dCxcbiAgICAgIHVybCxcbiAgICB9OiB7XG4gICAgICBvbkNsZWFyPzogKCkgPT4gdm9pZDtcbiAgICAgIG9uQ29uZmlybTogbW9kYWxDb25maXJtSGFuZGxlcjtcbiAgICAgIHRleHQ6IHN0cmluZztcbiAgICAgIHVybDogc3RyaW5nO1xuICAgIH0sXG4gICkge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLnRleHRJbnB1dC52YWx1ZSA9IHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy51cmxJbnB1dC52YWx1ZSA9IHRoaXMudXJsID0gdXJsO1xuICAgIHRoaXMub25Db25maXJtID0gb25Db25maXJtO1xuICAgIHRoaXMub25DbGVhciA9IG9uQ2xlYXI7XG4gICAgdGhpcy5mcmFtZUVsID0gZWwucXVlcnlTZWxlY3RvcignI2ZyYW1lJyk7XG5cbiAgICBpZiAob25DbGVhcikge1xuICAgICAgdGhpcy5jbGVhckJ0bi5jbGFzc0xpc3QuYWRkKHRoaXMuc2hvd0Nscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJCdG4uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNob3dDbHMpO1xuICAgIH1cblxuICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCh0aGlzLnNob3dDbHMpO1xuICAgIHRoaXMuY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ29uZmlybSk7XG4gICAgdGhpcy5jYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNhbmNlbCk7XG4gICAgdGhpcy5jbGVhckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xlYXIpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUdsb2JhbEtleWRvd24pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVHbG9iYWxDbGljayk7XG4gICAgdGhpcy51cmxJbnB1dC5mb2N1cygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgdGhpcy5jb25maXJtQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDb25maXJtKTtcbiAgICB0aGlzLmNhbmNlbEJ0bi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2FuY2VsKTtcbiAgICB0aGlzLmNsZWFyQnRuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGVhcik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlR2xvYmFsS2V5ZG93bik7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2hvd0Nscyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb25maXJtID0gKCkgPT4ge1xuICAgIHRoaXMub25Db25maXJtKHtcbiAgICAgIHRleHQ6IHRoaXMudGV4dElucHV0LnZhbHVlLFxuICAgICAgdXJsOiB0aGlzLnVybElucHV0LnZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbGVhciA9ICgpID0+IHtcbiAgICB0aGlzLm9uQ2xlYXIoKTtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNhbmNlbCA9ICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUdsb2JhbEtleWRvd24gPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRW50ZXIgPSBlLmtleSA9PT0gJ0VudGVyJztcbiAgICBpZiAoXG4gICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRleHRJbnB1dCB8fFxuICAgICAgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudXJsSW5wdXQgJiYgaXNFbnRlcilcbiAgICApIHtcbiAgICAgIHRoaXMuaGFuZGxlQ29uZmlybSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0VzYyA9IGUua2V5ID09PSAnRXNjYXBlJztcbiAgICBpZiAoaXNFc2MpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2FuY2VsKCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgaGFuZGxlR2xvYmFsQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLmZyYW1lRWwuY29udGFpbnMoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9O1xuXG4gIGdldCB0ZXh0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignaW5wdXQjdGV4dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBnZXQgdXJsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWwucXVlcnlTZWxlY3RvcignaW5wdXQjdXJsJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgfVxuXG4gIGdldCBjb25maXJtQnRuKCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiNjb25maXJtJyk7XG4gIH1cblxuICBnZXQgY2FuY2VsQnRuKCkge1xuICAgIHJldHVybiB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbiNjYW5jZWwnKTtcbiAgfVxuXG4gIGdldCBjbGVhckJ0bigpIHtcbiAgICByZXR1cm4gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCdidXR0b24jY2xlYXInKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVG9vbGJhclBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSBtb2RhbEVsOiBFbGVtZW50O1xuICBwcml2YXRlIHRvb2xiYXJFbDogRWxlbWVudDtcbiAgcHJpdmF0ZSBtb2RhbDogTGlua01vZGFsO1xuXG4gIHByaXZhdGUgc3dhcFRleHRCbG9jayA9IChub2RlVHlwZTogTm9kZVR5cGUpID0+IHtcbiAgICBzd2FwVGV4dEJsb2NrKHRoaXMudmlldywgbm9kZVR5cGUpO1xuICAgIHRoaXMudmlldy5mb2N1cygpO1xuICB9O1xuXG4gIHByaXZhdGUgcHJvbW90ZUhlYWRpbmcgPSAoc3RhdGU6IEVkaXRvclN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICBpZiAoIXNlbGVjdGlvbi5lbXB0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICAkZnJvbToge1xuICAgICAgICBwYXJlbnQ6IHsgdHlwZSB9LFxuICAgICAgfSxcbiAgICB9ID0gc2VsZWN0aW9uO1xuICAgIGxldCBuZXh0VHlwZTogTm9kZVR5cGU7XG4gICAgaWYgKHR5cGUgPT09IHNjaGVtYS5ub2Rlcy5oZWFkaW5nMikge1xuICAgICAgbmV4dFR5cGUgPSBzY2hlbWEubm9kZXMuaGVhZGluZzE7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBzY2hlbWEubm9kZXMuaGVhZGluZzMpIHtcbiAgICAgIG5leHRUeXBlID0gc2NoZW1hLm5vZGVzLmhlYWRpbmcyO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gc2NoZW1hLm5vZGVzLmhlYWRpbmcxKSB7XG4gICAgICBuZXh0VHlwZSA9IHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRUeXBlID0gc2NoZW1hLm5vZGVzLmhlYWRpbmczO1xuICAgIH1cbiAgICB0aGlzLnN3YXBUZXh0QmxvY2sobmV4dFR5cGUpO1xuICB9O1xuXG4gIHByaXZhdGUgdG9nZ2xlTGlzdCA9IChsaXN0VHlwZTogTm9kZVR5cGUsIGl0ZW1UeXBlOiBOb2RlVHlwZSkgPT4ge1xuICAgIHRvZ2dsZUxpc3QodGhpcy52aWV3LCBsaXN0VHlwZSwgaXRlbVR5cGUpO1xuICB9O1xuXG4gIHByaXZhdGUgdG9nZ2xlQ2hlY2tsaXN0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzLnZpZXc7XG4gICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoJHRvKTtcblxuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgICBpbmRleCArPSAxXG4gICAgKSB7XG4gICAgICBpZiAoYmxvY2tSYW5nZS5wYXJlbnQuY2hpbGQoaW5kZXgpLnR5cGUgPT09IHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbSkge1xuICAgICAgICB0aGlzLnN3YXBUZXh0QmxvY2soc2NoZW1hLm5vZGVzLnBhcmFncmFwaCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZUxpbmtNb2RhbDogQ29tbWFuZCA9IChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcbiAgICBjb25zdCB7IGRvYywgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHNlbGVjdGlvbjtcbiAgICBjb25zdCBsaW5rTWFya0F0U3RhcnQgPSAkZnJvbVxuICAgICAgLm1hcmtzKClcbiAgICAgIC5maW5kKFxuICAgICAgICAobWFyaykgPT5cbiAgICAgICAgICBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rICYmICFtYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSxcbiAgICAgICk7XG4gICAgY29uc3QgbGlua01hcmtBdEVuZCA9ICR0b1xuICAgICAgLm1hcmtzKClcbiAgICAgIC5maW5kKFxuICAgICAgICAobWFyaykgPT5cbiAgICAgICAgICBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rICYmICFtYXJrLmF0dHJzW0FVVE9fTElOS19BVFRSXSxcbiAgICAgICk7XG4gICAgY29uc3Qgc2VsZWN0aW9uSXNJbnNpZGVMaW5rID0gbGlua01hcmtBdFN0YXJ0ICYmIGxpbmtNYXJrQXRFbmQ7XG5cbiAgICBpZiAoc2VsZWN0aW9uLmVtcHR5ICYmICFzZWxlY3Rpb25Jc0luc2lkZUxpbmspIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxpbmtNYXJrQXRTdGFydCAhPT0gbGlua01hcmtBdEVuZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWRpc3BhdGNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXJrID0gbGlua01hcmtBdFN0YXJ0O1xuICAgIGxldCBlbmQsIHN0YXJ0LCB0ZXh0LCB1cmw7XG4gICAgaWYgKG1hcmspIHtcbiAgICAgIGNvbnN0IHRleHROb2RlID0gJGZyb20ucGFyZW50Lm5vZGVBdChcbiAgICAgICAgJGZyb20ucGFyZW50T2Zmc2V0IC0gJGZyb20udGV4dE9mZnNldCxcbiAgICAgICk7XG4gICAgICBzdGFydCA9ICRmcm9tLnBvcyAtICRmcm9tLnRleHRPZmZzZXQ7XG4gICAgICBlbmQgPSBzdGFydCArIHRleHROb2RlLm5vZGVTaXplO1xuICAgICAgdGV4dCA9IHRleHROb2RlLnRleHQ7XG4gICAgICB1cmwgPSBtYXJrLmF0dHJzLmhyZWY7XG4gICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihcbiAgICAgICAgZG9jLnJlc29sdmUoc3RhcnQpLFxuICAgICAgICBkb2MucmVzb2x2ZShlbmQpLFxuICAgICAgKTtcbiAgICAgIGRpc3BhdGNoKHN0YXRlLnRyLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gJHRvLnBvcztcbiAgICAgIHN0YXJ0ID0gJGZyb20ucG9zO1xuICAgICAgdGV4dCA9IHN0YXRlLmRvYy50ZXh0QmV0d2VlbigkZnJvbS5wb3MsICR0by5wb3MpO1xuICAgICAgdXJsID0gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgb25DbGVhciA9XG4gICAgICBtYXJrICYmXG4gICAgICAoKCkgPT5cbiAgICAgICAgdGhpcy52aWV3LmRpc3BhdGNoKFxuICAgICAgICAgIHRoaXMudmlldy5zdGF0ZS50ci5zdGVwKG5ldyBSZW1vdmVNYXJrU3RlcChzdGFydCwgZW5kLCBtYXJrKSksXG4gICAgICAgICkpO1xuXG4gICAgdGhpcy5tb2RhbCA9IG5ldyBMaW5rTW9kYWwodGhpcy5tb2RhbEVsLCB7XG4gICAgICBvbkNsZWFyLFxuICAgICAgb25Db25maXJtOiAoeyB0ZXh0LCB1cmwgfSkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrID0gc2NoZW1hLm1hcmtzLmxpbmsuY3JlYXRlKHsgaHJlZjogdXJsIH0pO1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHNjaGVtYS50ZXh0KHRleHQsIFttYXJrXSk7XG4gICAgICAgIHRoaXMudmlldy5kaXNwYXRjaChcbiAgICAgICAgICB0aGlzLnZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgodGV4dE5vZGUsIGZhbHNlKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB0ZXh0LFxuICAgICAgdXJsLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgcHJpdmF0ZSB0b2dnbGVNYXJrID0gKG1hcms6IE1hcmtUeXBlKSA9PiB7XG4gICAgdG9nZ2xlTWFyayhtYXJrKSh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IodG9vbGJhckVsOiBFbGVtZW50LCBtb2RhbEVsOiBFbGVtZW50KSB7XG4gICAgc3VwZXIoe1xuICAgICAgdmlldzogKHZpZXdJbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3SW5zdGFuY2U7XG4gICAgICAgIHRoaXMubW9kYWxFbCA9IG1vZGFsRWw7XG4gICAgICAgIHRoaXMudG9vbGJhckVsID0gdG9vbGJhckVsO1xuXG4gICAgICAgIHRvb2xiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlVG9vbGJhckNsaWNrKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgIHRvb2xiYXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlVG9vbGJhckNsaWNrKTtcbiAgICAgICAgICAgIHRoaXMudW5oaWdobGlnaHRTZWxlY3RlZEF0dHJzKCk7XG4gICAgICAgICAgICB0aGlzLm1vZGFsPy5kZXN0cm95KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGU6ICh2aWV3LCBfcHJldmlvdXNTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUb29sYmFyRm9yU2VsZWN0aW9uKHZpZXcuc3RhdGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgaGFuZGxlS2V5RG93bjogKF92aWV3LCBlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzQ3RybCA9IGUuY3RybEtleTtcbiAgICAgICAgICBjb25zdCBoYXNNb2QgPSBlLm1ldGFLZXk7XG4gICAgICAgICAgY29uc3QgaGFzU2hpZnQgPSBlLnNoaWZ0S2V5O1xuXG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICcuJykge1xuICAgICAgICAgICAgaW5kZW50TGlzdFNlbGVjdGlvbih0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhc0N0cmwgJiYgZS5rZXkgPT09ICcsJykge1xuICAgICAgICAgICAgb3V0ZGVudExpc3RTZWxlY3Rpb24odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlLmtleSA9PT0gJ1RhYicgJiYgIWhhc0N0cmwgJiYgIWhhc01vZCkge1xuICAgICAgICAgICAgaWYgKGhhc1NoaWZ0KSB7XG4gICAgICAgICAgICAgIG91dGRlbnRMaXN0U2VsZWN0aW9uKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGluZGVudExpc3RTZWxlY3Rpb24odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAndCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hlY2tsaXN0SXRlbSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc01vZCAmJiBlLmtleSA9PT0gJzcnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ3UnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3QoXG4gICAgICAgICAgICAgIHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCxcbiAgICAgICAgICAgICAgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJ28nKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3Qoc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzQ3RybCAmJiBlLmtleSA9PT0gJz0nKSB7XG4gICAgICAgICAgICB0aGlzLnByb21vdGVIZWFkaW5nKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSAnaicpIHtcbiAgICAgICAgICAgIHRoaXMuc3dhcFRleHRCbG9jayhzY2hlbWEubm9kZXMucGFyYWdyYXBoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZUNoZWNrbGlzdEl0ZW1TdGF0ZShcbiAgICAgICAgICAgICAgdGhpcy52aWV3LnN0YXRlLFxuICAgICAgICAgICAgICB0aGlzLnZpZXcuZGlzcGF0Y2gsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd6Jykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICd5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHJlZG8odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdpJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5lbSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaGFzTW9kICYmIGUua2V5ID09PSAnYicpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWFyayhzY2hlbWEubWFya3Muc3Ryb25nKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNDdHJsICYmIGUua2V5ID09PSBcIidcIikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVNYXJrKHNjaGVtYS5tYXJrcy5jb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChoYXNNb2QgJiYgZS5rZXkgPT09ICdrJykge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZUxpbmtNb2RhbCh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlVG9vbGJhckZvclNlbGVjdGlvbiA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICB0aGlzLnVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycygpO1xuICAgIGNvbnN0IHNlbGVjdGVkQXR0cnMgPSB0aGlzLmdldFNlbGVjdGVkRm9ybWF0QXR0cnMoc3RhdGUpO1xuICAgIGlmIChzZWxlY3RlZEF0dHJzKSB7XG4gICAgICBzZWxlY3RlZEF0dHJzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgY29uc3QgYnRuID0gdGhpcy50b29sYmFyRWwucXVlcnlTZWxlY3RvcihgW2RhdGEtZm9ybWF0PSR7YXR0cn1dYCk7XG4gICAgICAgIGlmIChidG4pIHtcbiAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHVuaGlnaGxpZ2h0U2VsZWN0ZWRBdHRycyA9ICgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEJ0bnMgPSB0aGlzLnRvb2xiYXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VsZWN0ZWQnKTtcbiAgICBzZWxlY3RlZEJ0bnMuZm9yRWFjaCgoYnRuKSA9PiB7XG4gICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtcbiAgICB9KTtcbiAgfTtcbiAgZ2V0U2VsZWN0ZWRGb3JtYXRBbmRNYXJrcyA9IChzdGF0ZTogRWRpdG9yU3RhdGUpID0+IHtcbiAgICBpZiAoIXN0YXRlLnNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgY29uc3QgeyAkZnJvbSwgJHRvIH0gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgY29uc3QgYmxvY2tSYW5nZSA9ICRmcm9tLmJsb2NrUmFuZ2UoXG4gICAgICAkdG8sXG4gICAgICAobm9kZSkgPT4gbm9kZS50eXBlICE9PSBzY2hlbWEubm9kZXMubGlzdF9pdGVtLFxuICAgICk7XG5cbiAgICBsZXQgc2VsZWN0ZWQgPSBudWxsO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSBibG9ja1JhbmdlLnN0YXJ0SW5kZXg7XG4gICAgICBpbmRleCA8IGJsb2NrUmFuZ2UuZW5kSW5kZXg7XG4gICAgICBpbmRleCArPSAxXG4gICAgKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGJsb2NrUmFuZ2UucGFyZW50LmNoaWxkKGluZGV4KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUeXBlID1cbiAgICAgICAgY2hpbGQudHlwZSA9PT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbVxuICAgICAgICAgID8gYmxvY2tSYW5nZS5wYXJlbnQudHlwZVxuICAgICAgICAgIDogY2hpbGQudHlwZTtcblxuICAgICAgaWYgKHNlbGVjdGVkID09PSBudWxsKSB7XG4gICAgICAgIHNlbGVjdGVkID0gY3VycmVudFR5cGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGVkICE9PSBjdXJyZW50VHlwZSkge1xuICAgICAgICBzZWxlY3RlZCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucHVzaChzZWxlY3RlZCk7XG5cbiAgICBsZXQgbWFya3MgPSAkZnJvbS5wb3MgPT09ICR0by5wb3MgPyAkZnJvbS5tYXJrcygpIDogJGZyb20ubWFya3NBY3Jvc3MoJHRvKTtcbiAgICBpZiAoc3RhdGUuc2VsZWN0aW9uLmVtcHR5ICYmIHN0YXRlLnN0b3JlZE1hcmtzKSB7XG4gICAgICBtYXJrcyA9IHN0YXRlLnN0b3JlZE1hcmtzO1xuICAgIH1cblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmVzdWx0LnB1c2goLi4ubWFya3MubWFwKChtYXJrKSA9PiBtYXJrLnR5cGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGdldFNlbGVjdGVkRm9ybWF0QXR0cnMgPSAoc3RhdGU6IEVkaXRvclN0YXRlKSA9PiB7XG4gICAgY29uc3QgW25vZGVUeXBlLCAuLi5tYXJrVHlwZXNdID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEFuZE1hcmtzKHN0YXRlKTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLmhlYWRpbmcxOlxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMuaGVhZGluZzI6XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5oZWFkaW5nMzoge1xuICAgICAgICByZXN1bHQucHVzaCgnaGVhZGluZycpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2Ugc2NoZW1hLm5vZGVzLnBhcmFncmFwaDoge1xuICAgICAgICByZXN1bHQucHVzaCgncGFyYWdyYXBoJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3Q6IHtcbiAgICAgICAgcmVzdWx0LnB1c2goJ3Vub3JkZXJlZF9saXN0Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBzY2hlbWEubm9kZXMub3JkZXJlZF9saXN0OiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCdvcmRlcmVkX2xpc3QnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbToge1xuICAgICAgICByZXN1bHQucHVzaCgnY2hlY2tsaXN0X2l0ZW0nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBtYXJrVHlwZXMuZm9yRWFjaCgobWFya1R5cGUpID0+IHtcbiAgICAgIHN3aXRjaCAobWFya1R5cGUpIHtcbiAgICAgICAgY2FzZSBzY2hlbWEubWFya3MubGluazoge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKCdsaW5rJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBzY2hlbWEubWFya3MuaW5saW5lX2xpbms6IHtcbiAgICAgICAgICByZXN1bHQucHVzaCgnbGluaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmVtOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ2VtJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBzY2hlbWEubWFya3Muc3Ryb25nOiB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goJ3N0cm9uZycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2Ugc2NoZW1hLm1hcmtzLmNvZGU6IHtcbiAgICAgICAgICByZXN1bHQucHVzaCgnY29kZScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGhhbmRsZVRvb2xiYXJDbGljayA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgYnV0dG9uID0gdGFyZ2V0LmNsb3Nlc3QoYFske0FQUExZX0ZPUk1BVF9BVFRSfV1gKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5hcHBseUZvcm1hdChidXR0b24uZ2V0QXR0cmlidXRlKEFQUExZX0ZPUk1BVF9BVFRSKSk7XG4gICAgfVxuICB9O1xuXG4gIGFwcGx5Rm9ybWF0ID0gKGRhdGFGb3JtYXRTdHI6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaCAoZGF0YUZvcm1hdFN0cikge1xuICAgICAgY2FzZSAndW5kbyc6IHtcbiAgICAgICAgdW5kbyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVkbyc6IHtcbiAgICAgICAgcmVkbyh0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncGFyYWdyYXBoJzoge1xuICAgICAgICB0aGlzLnN3YXBUZXh0QmxvY2soc2NoZW1hLm5vZGVzLnBhcmFncmFwaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29kZV9ibG9jayc6IHtcbiAgICAgICAgdGhpcy5zd2FwVGV4dEJsb2NrKHNjaGVtYS5ub2Rlcy5jb2RlX2Jsb2NrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkaW5nJzoge1xuICAgICAgICB0aGlzLnByb21vdGVIZWFkaW5nKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd1bm9yZGVyZWRfbGlzdCc6IHtcbiAgICAgICAgdGhpcy50b2dnbGVMaXN0KHNjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnb3JkZXJlZF9saXN0Jzoge1xuICAgICAgICB0aGlzLnRvZ2dsZUxpc3Qoc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY2hlY2tsaXN0X2l0ZW0nOiB7XG4gICAgICAgIHRoaXMudG9nZ2xlQ2hlY2tsaXN0SXRlbSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cm9uZyc6XG4gICAgICBjYXNlICdlbSc6XG4gICAgICBjYXNlICdjb2RlJzoge1xuICAgICAgICB0aGlzLnRvZ2dsZU1hcmsoc2NoZW1hLm1hcmtzW2RhdGFGb3JtYXRTdHJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaW5rJzoge1xuICAgICAgICB0aGlzLmFjdGl2YXRlTGlua01vZGFsKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdpbmRlbnQnOiB7XG4gICAgICAgIGluZGVudExpc3RTZWxlY3Rpb24odGhpcy52aWV3LnN0YXRlLCB0aGlzLnZpZXcuZGlzcGF0Y2gpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ291dGRlbnQnOiB7XG4gICAgICAgIG91dGRlbnRMaXN0U2VsZWN0aW9uKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSZXNvbHZlZFBvcyB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7XG4gIFBsdWdpbixcbiAgRWRpdG9yU3RhdGUsXG4gIFNlbGVjdGlvbixcbiAgVGV4dFNlbGVjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IEFVVE9fTElOS19BVFRSLCBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmNvbnN0IFNIT1dfQ0xTID0gJ3Nob3cnO1xuXG5jb25zdCBIVFRQX0xJTksgPSBuZXcgUmVnRXhwKCdeaHR0cHM/Oi8vJyk7XG5cbmNvbnN0IE1BSUxUT19MSU5LID0gbmV3IFJlZ0V4cCgnXm1haWx0bzonKTtcblxuZXhwb3J0IGNsYXNzIFRvb2x0aXBQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICBwcml2YXRlIHRvb2x0aXBFbDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgdmlldzogRWRpdG9yVmlldztcblxuICBzdGF0aWMgbm9kZVRvQW5jaG9ySHJlZih1cmw6IHN0cmluZykge1xuICAgIGlmIChIVFRQX0xJTksudGVzdCh1cmwpIHx8IE1BSUxUT19MSU5LLnRlc3QodXJsKSkge1xuICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG4gICAgcmV0dXJuIGBodHRwOi8vJHt1cmx9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGVsOiBIVE1MRGl2RWxlbWVudCkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZpZXc6ICh2aWV3SW5zdGFuY2UpID0+IHtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlld0luc3RhbmNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlOiAodmlldywgcHJldmlvdXNTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1NlbGVjdGlvbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy50b29sdGlwRWwgPSBlbDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTZWxlY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgJGN1cnNvciB9ID0gc2VsZWN0aW9uO1xuXG4gICAgY29uc3Qgd2l0aGluTGluayA9IEJvb2xlYW4oXG4gICAgICAkY3Vyc29yICYmXG4gICAgICAgICRjdXJzb3Iubm9kZUJlZm9yZSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlciAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVCZWZvcmUubWFya3Muc29tZShcbiAgICAgICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICAgICAgKSAmJlxuICAgICAgICAkY3Vyc29yLm5vZGVBZnRlci5tYXJrcy5zb21lKChtYXJrKSA9PiBtYXJrLnR5cGUgPT09IHNjaGVtYS5tYXJrcy5saW5rKSxcbiAgICApO1xuXG4gICAgaWYgKHdpdGhpbkxpbmsgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXJrID0gJGN1cnNvci5ub2RlQmVmb3JlLm1hcmtzLmZpbmQoXG4gICAgICAobWFyaykgPT4gbWFyay50eXBlID09PSBzY2hlbWEubWFya3MubGluayxcbiAgICApO1xuXG4gICAgdGhpcy5zaG93KCRjdXJzb3IsIG1hcmsuYXR0cnMuaHJlZiwgbWFyay5hdHRyc1tBVVRPX0xJTktfQVRUUl0pO1xuICB9O1xuXG4gIHByaXZhdGUgaGlkZSA9ICgpID0+IHtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QucmVtb3ZlKFNIT1dfQ0xTKTtcbiAgfTtcblxuICBwcml2YXRlIHNob3cgPSAoJHBvczogUmVzb2x2ZWRQb3MsIHVybDogc3RyaW5nLCBpc0F1dG9MaW5rOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5saW5rVGV4dEVsLmlubmVyVGV4dCA9IHVybDtcbiAgICB0aGlzLmFuY2hvckVsLmhyZWYgPSBUb29sdGlwUGx1Z2luLm5vZGVUb0FuY2hvckhyZWYodXJsKTtcbiAgICB0aGlzLnRvb2x0aXBFbC5jbGFzc0xpc3QudG9nZ2xlKCd5ZXMtYXV0by1saW5rJywgaXNBdXRvTGluayk7XG4gICAgdGhpcy50b29sdGlwRWwuY2xhc3NMaXN0LmFkZChTSE9XX0NMUyk7XG5cbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gdGhpcy52aWV3LmNvb3Jkc0F0UG9zKCRwb3MucG9zKTtcbiAgICBjb25zdCBhY3R1YWxXaWR0aCA9IHRoaXMudG9vbHRpcEVsLm9mZnNldFdpZHRoO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIC8vIHRvb2x0aXAgbWF4LXdpZHRoIGlzIDEwMCUgLSAxMCwgZm9yIDVweCBvZiBzcGFjZSBmcm9tIGVhY2ggd2luZG93IGVkZ2VcbiAgICBpZiAobGVmdCArIGFjdHVhbFdpZHRoID4gYXZhaWxhYmxlV2lkdGgpIHtcbiAgICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCg1LCBsZWZ0IC0gYWN0dWFsV2lkdGgpfXB4YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b29sdGlwRWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDUsIGxlZnQpfXB4YDtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsZWQgPSAodGhpcy52aWV3LnJvb3QgYXMgRG9jdW1lbnQpLmJvZHk7XG4gICAgLy8gUHVsbCB0b3AgdXAgYnkgcHJlc3VtZWQgaGVpZ2h0IG9mIHRvb2x0aXAgcGx1cyBzb21lIG1hcmdpblxuICAgIHRoaXMudG9vbHRpcEVsLnN0eWxlLnRvcCA9IGAke3RvcCAtIDM2ICsgc2Nyb2xsZWQuc2Nyb2xsVG9wfXB4YDtcbiAgfTtcblxuICBnZXQgbGlua1RleHRFbCgpOiBIVE1MU3BhbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRvb2x0aXBFbC5xdWVyeVNlbGVjdG9yKCdkaXYudGV4dCcpO1xuICB9XG5cbiAgZ2V0IGFuY2hvckVsKCk6IEhUTUxBbmNob3JFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy50b29sdGlwRWwucXVlcnlTZWxlY3RvcignYS5saW5rLWFuY2hvcicpO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjxwYXRoIGQ9XFxcIk0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS05IDE0bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6XFxcIj48L3BhdGg+PC9zdmc+XCIiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNCAyNFxcXCI+PHBhdGggZD1cXFwiTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6XFxcIj48L3BhdGg+PHBhdGggZD1cXFwiTTAgMGgyNHYyNEgwelxcXCIgZmlsbD1cXFwibm9uZVxcXCI+PC9wYXRoPjwvc3ZnPlwiIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGVja2JveCB9IGZyb20gJy4vY2hlY2tfYm94LTI0cHguc3ZnJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tib3hPdXRsaW5lIH0gZnJvbSAnLi9jaGVja19ib3hfb3V0bGluZV9ibGFuay0yNHB4LnN2Zyc7XG4iLCIvLyBJbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIFN0YW5kYXJkIE5vdGVzIGNsaWVudCBoYXMgbm8gZWZmZWN0LFxuLy8gdGhpcyBtb2R1bGUgd2lsbCBiZSBzd2FwcGVkIGluIGZvciBjbGllbnQudHMuXG5cbmltcG9ydCB7IERPTVBhcnNlciB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCBkZW1vTWFya2Rvd24gZnJvbSAnLi9kZW1vRG9jcy5tZCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBtYXJrZG93blNlcmlhbGl6ZXIgfSBmcm9tICcuL21hcmtkb3duJztcblxuY2xhc3MgRGVtb0NsaWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgZ2V0IGxhdGVzdFRleHQoKSB7XG4gICAgcmV0dXJuIGRlbW9NYXJrZG93bjtcbiAgfVxuICByZWFkeSgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgb25VcGRhdGUoKSB7fVxuICBzYXZlTm90ZShqc29uRG9jOiB7fSwgbWREb2M6IHN0cmluZywgdGV4dFByZXZpZXc6IHN0cmluZykge1xuICAgICh3aW5kb3cgYXMgYW55KS5zYXZlTm90ZUFyZ3MgPSB7IGpzb25Eb2MsIG1kRG9jLCB0ZXh0UHJldmlldyB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjbGllbnQgPSBuZXcgRGVtb0NsaWVudCgpO1xuIiwiZXhwb3J0IGRlZmF1bHQgXCIjIFNjcmF0Y2gsIGEgU3RhbmRhcmQgTm90ZXMgZWRpdG9yIGV4dGVuc2lvblxcblxcblNjcmF0Y2ggaXMgYW4gZWRpdG9yIGV4dGVuc2lvbiBmb3IgW1N0YW5kYXJkIE5vdGVzXShodHRwczovL3N0YW5kYXJkbm90ZXMub3JnLyksIGEgbm90ZS10YWtpbmcgYXBwIHRoYXQgZW1waGFzaXplcyBwcml2YWN5LCBzZWN1cml0eSwgYW5kIHN1c3RhaW5hYmlsaXR5LiBJZiB5b3UgZG9u4oCZdCBrbm93IHdoYXQgU3RhbmRhcmQgTm90ZXMgaXMsIHlvdSBhcmUgcHJvYmFibHkgaW4gdGhlIHdyb25nIHBsYWNlLlxcblxcblNjcmF0Y2ggaW5jbHVkZXMgbW9zdCBvZiB0aGUgdGV4dCBlZGl0aW5nIGZlYXR1cmVzIHlvdSB3b3VsZCBleHBlY3QgZm9yIHRha2luZyBub3RlcywgbGlrZSBsaXN0cywgY2hlY2tib3hlcywgYmFzaWMgdGV4dCBmb3JtYXR0aW5nLCBzbWFydCBjb3B5L3Bhc3RlLCBhbmQgaG90a2V5cy4gSXQgdXNlcyB0aGUgbGlicmFyeSBbUHJvc2VNaXJyb3JdKGh0dHBzOi8vcHJvc2VtaXJyb3IubmV0LykgdG8gbWFrZSB0aG9zZSBmZWF0dXJlcyBwb3NzaWJsZS4gVGhpcyBwYWdlIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBlZGl0b3IuIEdpdmUgaXQgYSB0cnkhXFxuXFxuIyMgSW5zdGFsbGF0aW9uXFxuXFxuVG8gdXNlIHRoZSBTY3JhdGNoIGVkaXRvciBpbiBTdGFuZGFyZCBOb3RlcywgY2xpY2sgRXh0ZW5zaW9ucyBpbiB0aGUgbG93ZXIgbGVmdCBoYW5kIGNvcm5lciBvZiB0aGUgZGVza3RvcCBhcHAuIENsaWNrIOKAnEltcG9ydCBFeHRlbnNpb27igJ0gYW5kIHBhc3RlIGluIHRoZSBmb2xsb3dpbmcgdXJsOiA8aHR0cHM6Ly9zY3JhdGNoLWVkaXRvci5jb20vZXh0Lmpzb24+LiBZb3Ugd2lsbCB0aGVuIGhhdmUgYWNjZXNzIHRvIHRoZSBlZGl0b3Igb24gYWxsIHRoZSBTdGFuZGFyZCBOb3RlcyBhcHBzIGFuZCB3aWxsIHJlY2VpdmUgdXBkYXRlcyB0byB0aGUgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkuXFxuXFxuIyMgRm9ybWF0dGluZyB5b3VyIG5vdGVzXFxuXFxuU2NyYXRjaCBpbmNsdWRlcyBhIG51bWJlciBvZiB3YXlzIHRvIGZvcm1hdCB5b3VyIG5vdGVzLiBJdCBoYXMgKipib2xkKiosIF9pdGFsaWNfLCBhbmQgYG1vbm9zcGFjZWAgdGV4dCwgYW5kIGl0IGxldHMgeW91IGFkZCBbbGlua3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9keWxhbm9uZWxzb24vc24tc2NyYXRjaC1lZGl0b3IpLiBJdCBpbmNsdWRlcyB0aHJlZSBsZXZlbHMgb2YgaGVhZHMsIHR3byB0eXBlcyBvZiBsaXN0cywgYW5kIHRvZG8gaXRlbXMgdGhhdCBoYXZlIGEgY2hlY2tib3guIFNjcmF0Y2ggdHJpZXMgdG8gYmUgc21hcnQgYWJvdXQgc3BhY2luZyBzbyB0aGF0IHlvdSBkb27igJl0IGhhdmUgdG8gaW5zZXJ0IGVtcHR5IGxpbmVzLlxcblxcbiMjIEhvdyB0byB1c2UgdGhpcyBlZGl0b3JcXG5cXG5bIF1bZG93bmxvYWQgdGhlIGRlc2t0b3AgY2xpZW50XShodHRwczovL3N0YW5kYXJkbm90ZXMub3JnLykgb3IgZ28gdG8gdGhlIFt3ZWIgYXBwXShodHRwczovL2FwcC5zdGFuZGFyZG5vdGVzLm9yZy8pXFxuXFxuWyBdIE9wZW4gdGhlIGV4dGVuc2lvbnMgbWVudSBpbiB0aGUgbG93ZXIgbGVmdC1oYW5kIGNvcm5lclxcblxcblsgXSBJbnN0YWxsIHRoZSBTY3JhdGNoIGV4dGVuc2lvbiBieSBjbGlja2luZyDigJxJbXBvcnQgRXh0ZW5zaW9u4oCdIGFuZCBwYXN0aW5nIHRoZSBkb3dubG9hZCBsaW5rOiBgaHR0cHM6Ly9zY3JhdGNoLWVkaXRvci5jb20vZXh0Lmpzb25gXFxuXFxuIyMgSG90a2V5c1xcblxcbllvdSBjYW4gYWxzbyBzZWUgYSBsZWdlbmQgZm9yIG1hbnkgb2YgdGhlc2UgaG90a2V5cyBpbiB0aGUgYWx0IHRleHQgb2YgdGhlIHRvb2xiYXIgYnV0dG9ucy5cXG5cXG4tIGBjdHJsICsgPWAgY3ljbGVzIHRocm91Z2ggdGhlIGxldmVscyBvZiBoZWFkaW5ncyAodGhlcmUgYXJlIHRocmVlKVxcblxcbi0gYGN0cmwgKyBqYCB0dXJucyB0aGUgY3VycmVudCB0ZXh0IGNodW5rIGludG8gYSBwbGFpbiBwYXJhZ3JhcGhcXG5cXG4tIGBjdHJsICsgdWAgd3JhcHMgdGhlIGN1cnJlbnQgdGV4dCBjaHVuayBpbiBhIGJ1bGxldGVkIGxpc3RcXG5cXG4tIGBjdHJsICsgb2Agd3JhcHMgdGhlIGN1cnJlbnQgdGV4dCBjaHVuayBpbiBhIG51bWJlcmVkIGxpc3RcXG5cXG4tIGBjdHJsICsgdGAgY3JlYXRlcyBhIGNoZWNrbGlzdCBpdGVtIGZyb20gdGhlIGN1cnJlbnQgdGV4dCBjaHVua1xcblxcbi0gYGNtZCArIGJgIC8gYGN0cmwgKyBiYCB0b2dnbGVzIGJvbGQgZm9ybWF0dGluZyBvbiBhbmQgb2ZmXFxuXFxuLSBgY21kICsgaWAgLyBgY3RybCArIGlgIHRvZ2dsZXMgaXRhbGljIGZvcm1hdHRpbmcgb24gYW5kIG9mZlxcblxcbi0gYGNtZCArICdgIC8gYGN0cmwgKyAnYCB0b2dnbGVzIG1vbm9zcGFjZSBmb3JtYXR0aW5nIG9uIGFuZCBvZmZcXG5cXG4tIGBjbWQgKyBzcGFjZWAgLyBgY3RybCArIHNwYWNlYCBjaGVja3Mgb3IgdW5jaGVja3MgYSBjaGVja2JveCBpZiB5b3VyIGN1cnNvciBpcyBpbnNpZGUgaXRzIGF0dGFjaGVkIHRleHRcXG5cXG4tIGBjbWQgKyBrYCAvIGBjdHJsICsga2Agb3BlbnMgYSBsaW5rIGVkaXRpbmcgZGlhbG9nXFxuXFxuLSBgY21kICsgemAgLyBgY3RybCArIHpgIGlzIHVuZG9cXG5cXG4tIGBjbWQgKyB5YCAvIGBjdHJsICsgeWAgaXMgcmVkb1xcblxcbi0gYGN0cmwgKyAuYCBpcyBpbmRlbnRcXG5cXG4tIGBjdHJsICsgLGAgaXMgb3V0ZGVudFxcblxcbiMjIEZvcm1hdHRpbmcgbWFjcm9zXFxuXFxuLSBzbWFydCBjdXJseSBxdW90ZSBhbmQgYXBvc3Ryb3BoZSBzdWJzdGl0dXRpb25cXG5cXG4tIGluc2VydCBoZWFkaW5ncyBieSB0eXBpbmcgYCNgIG9yIGAjI2Agb3IgYCMjI2BcXG5cXG4tIGluc2VydCBidWxsZXRlZCBsaXN0cyBieSB0eXBpbmcgYC1gXFxuXFxuLSBpbnNlcnQgbnVtYmVyZWQgbGlzdHMgYnkgdHlwaW5nIGAxLmBcXG5cXG4tIGluc2VydCBib2xkIHRleHQgYnkgd3JhcHBpbmcgaXQgaW4gYCpgXFxuXFxuLSBpbnNlcnQgaXRhbGljIHRleHQgYnkgd3JhcHBpbmcgaXQgaW4gYF9gXFxuXFxuLSBpbnNlcnQgYSBjb2RlIGJsb2NrIGJ5IHR5cGluZyB0aHJlZSBiYWNrdGlja3MgYCBgYGAgYFxcblxcbiMjIE1hcmtkb3duIGludGVncmF0aW9uXFxuXFxuU2NyYXRjaCBzYXZlcyB5b3VyIG5vdGUgYXMgbWFya2Rvd24gdGV4dC4gVGhhdCBtZWFucyB0aGF0IGlmIHlvdSB3cml0ZSB5b3VyIG5vdGVzIGluIFNjcmF0Y2gsIHlvdSBjYW4gYWxzbyBlZGl0IHRoZW0gaW4gdGhlIG90aGVyIG1hcmtkb3duIGVkaXRvcnMgdGhhdCBjb21lIHdpdGggU3RhbmRhcmQgTm90ZXMuIEl0IGFsc28gbWVhbnMgdGhhdCBpZiB5b3Ugd2FudCB0byBzdG9wIHVzaW5nIFNjcmF0Y2gsIHlvdSBjYW4gc2ltcGx5IHVuaW5zdGFsbCBpdCBhbmQgZm9yZ2V0IHRoYXQgaXQgZXZlciBleGlzdGVkLiBZb3UgY2FuIHNlZSB3aGF0IHRoaXMgdGV4dCBsb29rcyBsaWtlIGluIG1hcmtkb3duIGJ5IHZpZXdpbmcgW3RoZSBzb3VyY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9keWxhbm9uZWxzb24vc24tc2NyYXRjaC1lZGl0b3IvYmxvYi9tYXN0ZXIvc3JjL2RlbW9Eb2NzLm1kKS5cXG5cXG5JZiB5b3UgZWRpdCBhIG5vdGUgaW4gYSBkaWZmZXJlbnQgZWRpdG9yLCBhbmQgdGhlbiBvcGVuIGl0IGluIFNjcmF0Y2gsIFNjcmF0Y2ggd2lsbCBwaWNrIHVwIHlvdXIgY2hhbmdlcyAoYXNzdW1pbmcgdGhvc2UgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbWFya2Rvd24gdGV4dCBvZiB0aGUgbm90ZSwgYW5kIG5vdCB1c2luZyBzb21lIG90aGVyIGN1c3RvbSBmb3JtYXQpLiBIb3dldmVyLCB0aGVyZSBhcmUgY2VydGFpbiBraW5kcyBvZiBmb3JtYXR0aW5nIHRoYXQgbWFya2Rvd24gc3VwcG9ydHMgdGhhdCBTY3JhdGNoIGRvZXMgbm90LCBhdCBsZWFzdCBub3QgeWV0LiBJZiB5b3UgYWRkIHNvbWUgdGV4dCBvZiB0aGlzIGtpbmQsIGxpa2UgZm9yIGV4YW1wbGUgYSBibG9jayBxdW90ZSwgU2NyYXRjaCB3aWxsIHJlbmRlciBpdCBhcyBhIHNwZWNpYWwgdHlwZSBvZiDigJxlc2NhcGVk4oCdIGNvZGUgYmxvY2suIFRoZXNlIGJsb2NrcyBhcmUgc2F2ZWQgYmFjayB0byB0aGUgdW5kZXJseWluZyBtYXJrZG93biBub3RlIGFzIHB1cmUgbWFya2Rvd24sIG5vdCBhcyBhIGNvZGUgYmxvY2suIElmIHlvdSB3aW5kIHVwIHdpdGggb25lIG9mIHRoZXNlIHNwZWNpYWwgY29kZSBibG9ja3MgaW4geW91ciBub3RlLCB5b3Ugd2lsbCBzZWUgYW4gYWxlcnQgdG8gdGhhdCBlZmZlY3QgaW4gdGhlIHVwcGVyIHJpZ2h0LWhhbmQgY29ybmVyIG9mIHRoZSBjb2RlIGJsb2NrLlxcblxcblNjcmF0Y2ggbWFya2Rvd24gaXMgW0NvbW1vbk1hcmtdKGh0dHBzOi8vY29tbW9ubWFyay5vcmcvKSBtYXJrZG93biwgd2l0aCBvbmUgZXhjZXB0aW9uLiBTY3JhdGNoIGFkZHMgY2hlY2tsaXN0IGl0ZW1zIGluIHRoZSBmb2xsb3dpbmcgZm9ybTpcXG5cXG5gYGBcXG5bIF0gQW4gdW5jaGVja2VkIGl0ZW1cXG5beF0gQSBjaGVja2VkIGl0ZW1cXG5bWF0gQW5vdGhlciBjaGVja2VkIGl0ZW1cXG5gYGBcXG5cXG5JZiB5b3UgY3JlYXRlLCBlZGl0LCBhbmQgdmlldyB5b3VyIGNoZWNrbGlzdHMgaW4gU2NyYXRjaCwgeW91IGRvbuKAmXQgaGF2ZSB0byB3b3JyeSBhYm91dCBob3cgdGhleSBsb29rIGluIG1hcmtkb3duLiBCdXQgaWYgeW914oCZZCBsaWtlIHRvIGVkaXQgeW91ciBub3RlcyBpbiBtYXJrZG93biBlZGl0b3JzLCB0b28sIHRoZW4ga25vdyB0aGF0IHRoaXMgaXMgd2hhdCBTY3JhdGNoIHRoaW5rcyBvZiBhcyBhIG1hcmtkb3duIGNoZWNrbGlzdC5cXG5cXG4jIyBDb21pbmcgc29vblxcblxcblNjcmF0Y2ggaXMgYSB3b3JrIGluIHByb2dyZXNzLiBJIGhhdmUgYSBydW5uaW5nIGxpc3Qgb2YgdGhpbmdzIEnigJlkIGxpa2UgdG8gYWRkLCBwcm92aWRlZCBJIGNhbiBmaW5kIHRoZSB0aW1lIGFuZCBtb3RpdmF0aW9uLiBZb3UgY2FuIHRoaW5rIG9mIHRoZSBmb2xsb3dpbmcgYXMgYSBsaXN0IG9mIHRoaW5ncyB0aGF0IFNjcmF0Y2ggX2RvZXNu4oCZdF8gaGF2ZSwgYXQgbGVhc3Qgbm90IHlldC5cXG5cXG4xLiB0YWJsZXMsIG9yIHNvbWV0aGluZyBsaWtlIHRoZW1cXG5cXG4xLiBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBvbmUtY2xpY2sgY29weS10by1jbGlwYm9hcmQgZm9yIGNvZGUgYmxvY2tzXFxuXCI7IiwiaW1wb3J0IHtcbiAgaW5wdXRSdWxlcyxcbiAgc21hcnRRdW90ZXMsXG4gIGVsbGlwc2lzLFxuICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlLFxuICBJbnB1dFJ1bGUsXG59IGZyb20gJ3Byb3NlbWlycm9yLWlucHV0cnVsZXMnO1xuaW1wb3J0IHsgUGx1Z2luLCBTZWxlY3Rpb24gfSBmcm9tICdwcm9zZW1pcnJvci1zdGF0ZSc7XG5pbXBvcnQgeyBNYXJrVHlwZSwgTm9kZVR5cGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmZ1bmN0aW9uIG1hcmtXcmFwcGluZ1J1bGUoXG4gIGM6IHN0cmluZyxcbiAgbWFya1R5cGU6IE1hcmtUeXBlLFxuICBpc1ZhbGlkSW5zaWRlQ29kZU1hcms6IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIG5ldyBJbnB1dFJ1bGUoXG4gICAgbmV3IFJlZ0V4cChgJHtjfShcXFxcUysoXFxcXHMrXFxcXFMrKSo/KSR7Y30kYCksXG4gICAgKHN0YXRlLCBtYXRjaCwgc3RhcnQsIGVuZCkgPT4ge1xuICAgICAgY29uc3QgW18sIHRleHRdID0gbWF0Y2g7XG4gICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nTWFya3MgPSBzdGF0ZS5kb2NcbiAgICAgICAgLnJlc29sdmUoc3RhcnQpXG4gICAgICAgIC5tYXJrc0Fjcm9zcyhzdGF0ZS5kb2MucmVzb2x2ZShlbmQpKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHJcbiAgICAgICAgICAucmVwbGFjZVJhbmdlV2l0aChcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2NoZW1hLnRleHQodGV4dCwgWy4uLmV4aXN0aW5nTWFya3MsIG1hcmtUeXBlLmNyZWF0ZSgpXSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIEFkZCBhIHNwYWNlIGFmdGVyIHRoZSB0ZXh0IHNvIHRoZSBpbmNsdXNpdmUgbWFyayBydWxlIGRvZXNuJ3QgYWZmZWN0IHRoZSBlbnN1aW5nIGlucHV0XG4gICAgICAgICAgLmluc2VydCh0ci5zZWxlY3Rpb24uZnJvbSwgc2NoZW1hLnRleHQoJyAnLCBbLi4uZXhpc3RpbmdNYXJrc10pKVxuICAgICAgICAgIC5zZXRNZXRhKCdoYXMtZm9yY2VkLXNwYWNlLWZyb20taW5wdXQtcnVsZScsIHtcbiAgICAgICAgICAgIGVuZFBvczogdHIuc2VsZWN0aW9uLmZyb20sXG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSxcbiAgICB7XG4gICAgICBpbkNvZGVNYXJrOiBpc1ZhbGlkSW5zaWRlQ29kZU1hcmssXG4gICAgfSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gbGlzdFR5cGVSdWxlKHByZWZpeDogc3RyaW5nLCBsaXN0VHlwZTogTm9kZVR5cGUpOiBJbnB1dFJ1bGUge1xuICByZXR1cm4gbmV3IElucHV0UnVsZShcbiAgICBuZXcgUmVnRXhwKGBeJHtwcmVmaXh9JGApLFxuICAgIChzdGF0ZSwgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXksIHN0YXJ0LCBlbmQpID0+IHtcbiAgICAgIGNvbnN0ICRlbmQgPSBzdGF0ZS5kb2MucmVzb2x2ZShlbmQpO1xuICAgICAgaWYgKCRlbmQuZGVwdGggPiAxKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSBsaXN0OyBhbGwgb3RoZXIgcG9zaXRpb25zIHNob3VsZCBiZVxuICAgICAgICAvLyBkZXB0aCAxLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdWJ0cmFjdCAyIGhlcmUsIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbm9kZS5cbiAgICAgIGNvbnN0IHJhbmdlQWZ0ZXJQcmVmaXg6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAgIGVuZCxcbiAgICAgICAgc3RhcnQgKyAkZW5kLnBhcmVudC5ub2RlU2l6ZSAtIDIsXG4gICAgICBdO1xuICAgICAgY29uc3Qgc2xpY2VBZnRlclByZWZpeCA9IHN0YXRlLmRvYy5zbGljZSguLi5yYW5nZUFmdGVyUHJlZml4KTtcbiAgICAgIGNvbnN0IHsgdHIgfSA9IHN0YXRlO1xuICAgICAgdHIuZGVsZXRlUmFuZ2UoLi4ucmFuZ2VBZnRlclByZWZpeCk7XG4gICAgICB0ci5yZXBsYWNlUmFuZ2VXaXRoKHN0YXJ0LCBlbmQsIGxpc3RUeXBlLmNyZWF0ZUFuZEZpbGwoKSk7XG4gICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc3RhcnQpKSk7XG4gICAgICB0ci5pbnNlcnQodHIuc2VsZWN0aW9uLmZyb20sIHNsaWNlQWZ0ZXJQcmVmaXguY29udGVudCk7XG4gICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUoc3RhcnQpKSk7XG4gICAgICByZXR1cm4gdHI7XG4gICAgfSxcbiAgKTtcbn1cblxuY29uc3QgYXJyb3dDaGFycyA9IFtcbiAgbmV3IElucHV0UnVsZShuZXcgUmVnRXhwKCc8XFxcXC0+JCcpLCAn4oaUJywgeyBpbkNvZGVNYXJrOiBmYWxzZSB9KSxcbiAgbmV3IElucHV0UnVsZShuZXcgUmVnRXhwKCdcXFxcLT4kJyksICfihpInLCB7IGluQ29kZU1hcms6IGZhbHNlIH0pLFxuXTtcblxuZXhwb3J0IGNvbnN0IGlucHV0UnVsZXNQbHVnaW4gPSBpbnB1dFJ1bGVzKHtcbiAgcnVsZXM6IFtcbiAgICAuLi5zbWFydFF1b3RlcyxcbiAgICBlbGxpcHNpcyxcbiAgICAuLi5hcnJvd0NoYXJzLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL14jICQvLCBzY2hlbWEubm9kZXMuaGVhZGluZzEpLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL14jIyAkLywgc2NoZW1hLm5vZGVzLmhlYWRpbmcyKSxcbiAgICB0ZXh0YmxvY2tUeXBlSW5wdXRSdWxlKC9eIyMjICQvLCBzY2hlbWEubm9kZXMuaGVhZGluZzMpLFxuICAgIHRleHRibG9ja1R5cGVJbnB1dFJ1bGUoL15gYGAkLywgc2NoZW1hLm5vZGVzLmNvZGVfYmxvY2spLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ2AnLCBzY2hlbWEubWFya3MuY29kZSwgZmFsc2UpLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ1xcXFwqJywgc2NoZW1hLm1hcmtzLnN0cm9uZywgZmFsc2UpLFxuICAgIG1hcmtXcmFwcGluZ1J1bGUoJ18nLCBzY2hlbWEubWFya3MuZW0sIGZhbHNlKSxcbiAgICBsaXN0VHlwZVJ1bGUoJzEuICcsIHNjaGVtYS5ub2Rlcy5vcmRlcmVkX2xpc3QpLFxuICAgIGxpc3RUeXBlUnVsZSgnLSAnLCBzY2hlbWEubm9kZXMudW5vcmRlcmVkX2xpc3QpLFxuICBdLFxufSk7XG5cbmNvbnN0IFJFU0VUX0hBU19GT1JDRURfU1BBQ0VfTUVUQSA9ICdyZXNldC1oYXMtZm9yY2VkLXNwYWNlLW1ldGEnO1xuXG4vLyBDcmVhdGUgYSBwbHVnaW4gdGhhdCBzd2FsbG93cyBhIHNwYWNlIHR5cGVkIGJ5IHRoZSB1c2VyIHdoZW4gdGhleSd2ZSBqdXN0XG4vLyBpbnZva2VkIGFuIGlucHV0IHJ1bGUgdGhhdCBpbnNlcnRlZCBhIHNwYWNlIGZvciB0aGVtLCB0byBhdm9pZCB1bmludGVudGlvbmFsXG4vLyBkb3VibGUgc3BhY2VzLlxuZXhwb3J0IGNvbnN0IGlucHV0UnVsZXNGb3JjZWRTcGFjZVBsdWdpbiA9IG5ldyBQbHVnaW48XG4gIHsgaGFzRm9yY2VkU3BhY2U6IGZhbHNlIH0gfCB7IGhhc0ZvcmNlZFNwYWNlOiB0cnVlOyBmb3JjZWRTcGFjZVBvczogbnVtYmVyIH1cbj4oe1xuICBzdGF0ZToge1xuICAgIGluaXQoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYXNGb3JjZWRTcGFjZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXBwbHkodHIsIHByZXZpb3VzKSB7XG4gICAgICBpZiAodHIuZ2V0TWV0YShSRVNFVF9IQVNfRk9SQ0VEX1NQQUNFX01FVEEpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzRm9yY2VkU3BhY2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzLmhhc0ZvcmNlZFNwYWNlKSB7XG4gICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgc2NlbmFyaW8sIHRoaXMgbG9naWMgY291bGQgYmUgaW5zdWZmaWNpZW50LCBidXQgaXRcbiAgICAgICAgLy8gc2hvdWxkIHdvcmsgZmluZSBmb3IgYWxsIGN1cnJlbnQgdXNlIGNhc2VzLiBXZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0XG4gICAgICAgIC8vIF9vbmx5XyB3aGVuIHRoZSB1c2VyIHR5cGVzIGEgc3BhY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdHlwaW5nIHRoZVxuICAgICAgICAvLyBjbG9zaW5nIHdyYXBwaW5nIG1hcmsgY2hhcmFjdGVyIGRvIHdlIHN1cHByZXNzIHRoYXQgc3BhY2UgY2hhcmFjdGVyLlxuICAgICAgICAvLyBTbyBpZiB0aGV5IGRvIGFueXRoaW5nIGVsc2UsIGxpa2UgZ28gc29tZXdoZXJlIGVsc2UgaW4gdGhlIGRvY3VtZW50XG4gICAgICAgIC8vIG9yIHR5cGUgYSBkaWZmZXJlbnQgY2hhcmFjdGVyLCB3ZSBzaG91bGQgY2xlYXIgdGhlIHBsdWdpbiBzdGF0ZS4gVGhpc1xuICAgICAgICAvLyBjb3VsZCBmYWlsIGluIGEgY29sbGFib3JhdGl2ZSBzY2VuYXJpbywgd2hlcmUgb3RoZXJzIGNvdWxkIGNoYW5nZSB0aGVcbiAgICAgICAgLy8gZG9jdW1lbnQsIG9yIHdpdGggcGx1Z2lucyB0aGF0IG1vZGlmeSB0aGUgZG9jdW1lbnQgd2l0aG91dCBkaXJlY3RcbiAgICAgICAgLy8gaW5wdXQgZnJvbSB0aGUgdXNlci5cbiAgICAgICAgaWYgKHRyLnNlbGVjdGlvblNldCB8fCB0ci5kb2NDaGFuZ2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhc0ZvcmNlZFNwYWNlOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsdWdpbk1ldGEgPSB0ci5nZXRNZXRhKCdoYXMtZm9yY2VkLXNwYWNlLWZyb20taW5wdXQtcnVsZScpO1xuICAgICAgaWYgKHBsdWdpbk1ldGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNGb3JjZWRTcGFjZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZWRTcGFjZVBvczogcGx1Z2luTWV0YS5lbmRQb3MsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9LFxuICB9LFxuICBwcm9wczoge1xuICAgIGhhbmRsZVRleHRJbnB1dCh2aWV3LCBfZnJvbSwgX3RvLCB0ZXh0KSB7XG4gICAgICBpZiAodGhpcy5nZXRTdGF0ZSh2aWV3LnN0YXRlKS5oYXNGb3JjZWRTcGFjZSAmJiB0ZXh0ID09PSAnICcpIHtcbiAgICAgICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnNldE1ldGEoUkVTRVRfSEFTX0ZPUkNFRF9TUEFDRV9NRVRBLCB0cnVlKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59KTtcbiIsImltcG9ydCB7XG4gIEVkaXRvclN0YXRlLFxuICBQbHVnaW4sXG4gIFNlbGVjdGlvbixcbiAgVGV4dFNlbGVjdGlvbixcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7IFJlc29sdmVkUG9zIH0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHsgYmFzZUtleW1hcCwgc2V0QmxvY2tUeXBlIH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7IHNwbGl0TGlzdEl0ZW0gfSBmcm9tICdwcm9zZW1pcnJvci1zY2hlbWEtbGlzdCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZURlbGV0ZUVtcHR5KHRyOiBUcmFuc2FjdGlvbiwgJHBvczogUmVzb2x2ZWRQb3MpOiBUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSAkcG9zLnBhcmVudDtcbiAgaWYgKHBhcmVudE5vZGUubm9kZVNpemUgPT09IDIpIHtcbiAgICBjb25zdCB7IHBvcyB9ID0gJHBvcztcbiAgICByZXR1cm4gcmVjdXJzaXZlRGVsZXRlRW1wdHkoXG4gICAgICB0ci5kZWxldGVSYW5nZShwb3MgLSAxLCBwb3MgKyAxKSxcbiAgICAgIHRyLmRvYy5yZXNvbHZlKHRyLm1hcHBpbmcubWFwKHBvcykpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRyO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUZXh0U2VsZWN0aW9uSW5FbXB0eU5vZGUoc3RhdGU6IEVkaXRvclN0YXRlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgJGN1cnNvciB9ID0gc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb247XG4gIHJldHVybiBCb29sZWFuKCRjdXJzb3IgJiYgJGN1cnNvci5wYXJlbnQubm9kZVNpemUgPT09IDIpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVDaGVja2xpc3RJdGVtVGV4dFNlbGVjdGlvbihzdGF0ZTogRWRpdG9yU3RhdGUpIHtcbiAgY29uc3QgeyAkY3Vyc29yIH0gPSBzdGF0ZS5zZWxlY3Rpb24gYXMgVGV4dFNlbGVjdGlvbjtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgJGN1cnNvciAmJiAkY3Vyc29yLnBhcmVudC50eXBlID09PSBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0sXG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBrZXltYXBQbHVnaW5zOiBQbHVnaW5bXSA9IFtcbiAgLy8gY2hlY2tsaXN0IGl0ZW0gaGFuZGxlcnNcbiAga2V5bWFwKHtcbiAgICBCYWNrc3BhY2Uoc3RhdGUsIGRpc3BhdGNoLCB2aWV3KSB7XG4gICAgICBpZiAoZW5zdXJlQ2hlY2tsaXN0SXRlbVRleHRTZWxlY3Rpb24oc3RhdGUpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodmlldy5lbmRPZlRleHRibG9jaygnbGVmdCcpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RhdGUuc2VsZWN0aW9uIGFzIFRleHRTZWxlY3Rpb24pLiRjdXJzb3IuaW5kZXgoMCkgPT09IDApIHtcbiAgICAgICAgc2V0QmxvY2tUeXBlKHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGgpKHN0YXRlLCBkaXNwYXRjaCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBFbnRlcihzdGF0ZSwgZGlzcGF0Y2gpIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0aW9uLCB0ciB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7ICRmcm9tLCBmcm9tIH0gPSBzZWxlY3Rpb247XG4gICAgICBpZiAoJGZyb20ucGFyZW50LnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5jaGVja2xpc3RfaXRlbSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0ci5kZWxldGVTZWxlY3Rpb24oKTtcbiAgICAgIGNvbnN0IG5leHQkRnJvbSA9IHRyLmRvYy5yZXNvbHZlKGZyb20pO1xuICAgICAgaWYgKG5leHQkRnJvbS5wYXJlbnQubm9kZVNpemUgPT09IDIpIHtcbiAgICAgICAgY29uc3QgbmV4dEZyb20gPSBuZXh0JEZyb20ucG9zO1xuICAgICAgICAvLyBUaGUgbm9kZSBpcyBlbXB0eVxuICAgICAgICB0ci5yZXBsYWNlV2l0aChcbiAgICAgICAgICBuZXh0RnJvbSAtIDEsXG4gICAgICAgICAgbmV4dEZyb20gKyAxLFxuICAgICAgICAgIHNjaGVtYS5ub2Rlcy5wYXJhZ3JhcGguY3JlYXRlQW5kRmlsbCgpLFxuICAgICAgICApO1xuICAgICAgICB0ci5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uLm5lYXIodHIuZG9jLnJlc29sdmUobmV4dEZyb20gLSAxKSkpO1xuICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdHIuc3BsaXQoZnJvbSwgdW5kZWZpbmVkLCBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBzY2hlbWEubm9kZXMuY2hlY2tsaXN0X2l0ZW0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pLFxuICAvLyBsaXN0IGl0ZW0gaGFuZGxlcnNcbiAga2V5bWFwKHtcbiAgICBCYWNrc3BhY2Uoc3RhdGUsIGRpc3BhdGNoKSB7XG4gICAgICBpZiAoZW5zdXJlVGV4dFNlbGVjdGlvbkluRW1wdHlOb2RlKHN0YXRlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247XG4gICAgICBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCB7ICRjdXJzb3IgfSA9IHNlbGVjdGlvbjtcbiAgICAgIGNvbnN0IHBvc3NpYmxlU2VsZWN0aW9uID0gU2VsZWN0aW9uLmZpbmRGcm9tKFxuICAgICAgICBzdGF0ZS5kb2MucmVzb2x2ZSgkY3Vyc29yLmJlZm9yZSgpKSxcbiAgICAgICAgLTEsXG4gICAgICAgIHRydWUsXG4gICAgICAgIC8vIFdlIGNhbiBhc3NlcnQgdGhpcyBoZXJlIGJjIG9mIHRoZSB0ZXh0T25seSBhcmcgYWJvdmVcbiAgICAgICkgYXMgVGV4dFNlbGVjdGlvbjtcbiAgICAgIGlmICghcG9zc2libGVTZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHBvc3NpYmxlU2VsZWN0aW9uLiRjdXJzb3Iubm9kZSgtMSkudHlwZSAhPT0gc2NoZW1hLm5vZGVzLmxpc3RfaXRlbSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgdHIgPSBzdGF0ZS50ci5zZXRTZWxlY3Rpb24ocG9zc2libGVTZWxlY3Rpb24pO1xuICAgICAgdHIgPSByZWN1cnNpdmVEZWxldGVFbXB0eSh0ciwgJGN1cnNvcik7XG4gICAgICBkaXNwYXRjaCh0cik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIEVudGVyOiBzcGxpdExpc3RJdGVtKHNjaGVtYS5ub2Rlcy5saXN0X2l0ZW0pLFxuICB9KSxcbiAga2V5bWFwKGJhc2VLZXltYXApLFxuXTtcbiIsImltcG9ydCBtYXJrZG93bml0IGZyb20gJ21hcmtkb3duLWl0JztcbmltcG9ydCB7XG4gIE1hcmtkb3duUGFyc2VyLFxuICBNYXJrZG93blNlcmlhbGl6ZXIsXG4gIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIsXG59IGZyb20gJ3Byb3NlbWlycm9yLW1hcmtkb3duJztcbmltcG9ydCB7XG4gIEFVVE9fTElOS19BVFRSLFxuICBNQVJLRE9XTl9FU0NBUEVEX0FUVFIsXG4gIENoZWNrYm94U3RhdHVzLFxuICBzY2hlbWEsXG59IGZyb20gJy4vc2NoZW1hJztcblxuZXhwb3J0IGNvbnN0IG1hcmtkb3duU2VyaWFsaXplciA9IG5ldyBNYXJrZG93blNlcmlhbGl6ZXIoXG4gIHtcbiAgICBoZWFkaW5nMShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgc3RhdGUud3JpdGUoJyMgJyk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgaGVhZGluZzIoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIHN0YXRlLndyaXRlKCcjIyAnKTtcbiAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBoZWFkaW5nMyhzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgc3RhdGUud3JpdGUoJyMjIyAnKTtcbiAgICAgIHN0YXRlLnJlbmRlcklubGluZShub2RlKTtcbiAgICAgIHN0YXRlLmNsb3NlQmxvY2sobm9kZSk7XG4gICAgfSxcbiAgICBjaGVja2xpc3RfaXRlbShzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgY29uc3QgYm94VGV4dCA9XG4gICAgICAgIG5vZGUuYXR0cnMuc3RhdHVzID09PSBDaGVja2JveFN0YXR1cy5ET05FID8gJ1t4XSAnIDogJ1sgXSAnO1xuICAgICAgc3RhdGUud3JpdGUoYm94VGV4dCk7XG4gICAgICBzdGF0ZS5yZW5kZXJJbmxpbmUobm9kZSk7XG4gICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgIH0sXG4gICAgcGFyYWdyYXBoKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KSB7XG4gICAgICBpZiAobm9kZS5ub2RlU2l6ZSA9PT0gMikge1xuICAgICAgICAvLyBXcml0ZSBhIG5vbi1icmVha2luZyBlbXB0eSBzcGFjZSBzbyBtYXJrZG93biByZXRhaW5zIHRoZSBsaW5lIGFzIGFuIGVtcHR5IHBhcmFncmFwaFxuICAgICAgICBzdGF0ZS53cml0ZSgnXFx1MDBBMCcpO1xuICAgICAgICBzdGF0ZS5jbG9zZUJsb2NrKG5vZGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZWZhdWx0TWFya2Rvd25TZXJpYWxpemVyLm5vZGVzLnBhcmFncmFwaChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgfSxcbiAgICBsaXN0X2l0ZW0oc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMubGlzdF9pdGVtKHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIG9yZGVyZWRfbGlzdChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy5vcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgdW5vcmRlcmVkX2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMuYnVsbGV0X2xpc3Qoc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpO1xuICAgIH0sXG4gICAgdGV4dChzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCkge1xuICAgICAgZGVmYXVsdE1hcmtkb3duU2VyaWFsaXplci5ub2Rlcy50ZXh0KHN0YXRlLCBub2RlLCBwYXJlbnQsIGluZGV4KTtcbiAgICB9LFxuICAgIGNvZGVfYmxvY2soc3RhdGUsIG5vZGUsIHBhcmVudCwgaW5kZXgpIHtcbiAgICAgIGlmIChub2RlLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl0pIHtcbiAgICAgICAgc3RhdGUud3JpdGUobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgIHN0YXRlLmVuc3VyZU5ld0xpbmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubm9kZXMuY29kZV9ibG9jayhzdGF0ZSwgbm9kZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIC4uLmRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubWFya3MsXG4gICAgaW5saW5lX2xpbms6IGRlZmF1bHRNYXJrZG93blNlcmlhbGl6ZXIubWFya3MubGluayxcbiAgICBjb2RlOiB7XG4gICAgICBjbG9zZShzdGF0ZSwgbWFyaykge1xuICAgICAgICByZXR1cm4gbWFyay5hdHRyc1tNQVJLRE9XTl9FU0NBUEVEX0FUVFJdID8gJycgOiAnYCc7XG4gICAgICB9LFxuICAgICAgZXNjYXBlOiBmYWxzZSxcbiAgICAgIG9wZW4oc3RhdGUsIG1hcmspIHtcbiAgICAgICAgcmV0dXJuIG1hcmsuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSA/ICcnIDogJ2AnO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxuKTtcblxuY29uc3QgbWFya2Rvd25JdFBhcnNlciA9IG1hcmtkb3duaXQoKTtcbmNvbnN0IFRva2VuID0gbWFya2Rvd25JdFBhcnNlci5jb3JlLlN0YXRlLnByb3RvdHlwZS5Ub2tlbjtcbi8vIFdlIG5lZWQgdG8gYWNjZXNzIHRoZSBkZWZhdWx0IGltYWdlIHBhcnNlciBydWxlIHNvIHdlIGNhbiB3cmFwIGl0IGluIGN1c3RvbVxuLy8gbG9naWMuIFRoZXNlIG1ldGhvZHMgYW5kIG9iamVjdHMgYXJlIG1lYW50IHRvIGJlIGludGVybmFsIGJ1dCB0aGVyZSBzZWVtcyB0b1xuLy8gYmUgbm8gb3RoZXIgd2F5IHRvIGdldCBhdCB0aGUgZGVmYXVsdCBydWxlcy5cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IGltYWdlUnVsZUluZGV4ID0gbWFya2Rvd25JdFBhcnNlci5pbmxpbmUucnVsZXIuX19maW5kX18oJ2ltYWdlJyk7XG5jb25zdCBkZWZhdWx0SW1hZ2VSdWxlID1cbiAgLy8gQHRzLWlnbm9yZVxuICBtYXJrZG93bkl0UGFyc2VyLmlubGluZS5ydWxlci5fX3J1bGVzX19baW1hZ2VSdWxlSW5kZXhdLmZuO1xuXG5jb25zdCBDSEVDS0xJU1RfSVRFTV9PUEVOX01BUktFUlMgPSBbJ1t4XScsICdbWF0nLCAnWyBdJ107XG5cbm1hcmtkb3duSXRQYXJzZXIudXNlKChtZCkgPT4ge1xuICBtZC5jb3JlLnJ1bGVyLmFmdGVyKCdibG9jaycsICdjaGVja2xpc3RfaXRlbScsIChjb3JlU3RhdGUpID0+IHtcbiAgICBjb25zdCBzcmNMaW5lcyA9IGNvcmVTdGF0ZS5zcmMuc3BsaXQoJ1xcbicpO1xuICAgIGxldCBpc0NoZWNrbGlzdE9wZW4gPSBmYWxzZTtcbiAgICBsZXQgaGFzQ2hlY2tsaXN0ID0gZmFsc2U7XG5cbiAgICBjb3JlU3RhdGUudG9rZW5zID0gY29yZVN0YXRlLnRva2Vucy5tYXAoKHRva2VuKSA9PiB7XG4gICAgICBpZiAoaXNDaGVja2xpc3RPcGVuICYmIHRva2VuLnR5cGUgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRva2VuLmNvbnRlbnQgPSB0b2tlbi5jb250ZW50LnNsaWNlKDMpLnRyaW1MZWZ0KCk7XG4gICAgICB9XG4gICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3BhcmFncmFwaF9vcGVuJykge1xuICAgICAgICBjb25zdCBbc3RhcnRMaW5lLCBlbmRMaW5lXSA9IHRva2VuLm1hcDtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHNyY0xpbmVzW3N0YXJ0TGluZV07XG4gICAgICAgIGlmIChDSEVDS0xJU1RfSVRFTV9PUEVOX01BUktFUlMuaW5jbHVkZXMoY29udGVudC5zbGljZSgwLCAzKSkpIHtcbiAgICAgICAgICBoYXNDaGVja2xpc3QgPSB0cnVlO1xuICAgICAgICAgIGlzQ2hlY2tsaXN0T3BlbiA9IHRydWU7XG4gICAgICAgICAgY29uc3QgeyBUb2tlbiB9ID0gY29yZVN0YXRlO1xuICAgICAgICAgIGNvbnN0IHRva2VuID0gbmV3IFRva2VuKCdjaGVja2xpc3RfaXRlbV9vcGVuJywgJ2RpdicsIDEpO1xuICAgICAgICAgIHRva2VuLmF0dHJQdXNoKFtcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgY29udGVudFsxXS50b0xvd2VyQ2FzZSgpID09PSAneCdcbiAgICAgICAgICAgICAgPyBDaGVja2JveFN0YXR1cy5ET05FLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgOiBDaGVja2JveFN0YXR1cy5FTVBUWS50b1N0cmluZygpLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0NoZWNrbGlzdE9wZW4gJiYgdG9rZW4udHlwZSA9PT0gJ3BhcmFncmFwaF9jbG9zZScpIHtcbiAgICAgICAgaXNDaGVja2xpc3RPcGVuID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBuZXcgY29yZVN0YXRlLlRva2VuKCdjaGVja2xpc3RfaXRlbV9jbG9zZScsICdkaXYnLCAtMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9KTtcblxuICAgIHJldHVybiBoYXNDaGVja2xpc3Q7XG4gIH0pO1xuXG4gIG1kLmlubGluZS5ydWxlci5hdCgnaW1hZ2UnLCAoaW5saW5lU3RhdGUpID0+IHtcbiAgICBjb25zdCB7IHBvczogb3JpZ2luYWxQb3MgfSA9IGlubGluZVN0YXRlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGRlZmF1bHRJbWFnZVJ1bGUoaW5saW5lU3RhdGUpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IGNvZGVUb2tlbiA9IG5ldyBpbmxpbmVTdGF0ZS5Ub2tlbignY29kZV9pbmxpbmUnLCAnY29kZScsIDApO1xuICAgICAgY29kZVRva2VuLm1hcmt1cCA9ICdgJztcbiAgICAgIGNvZGVUb2tlbi5jb250ZW50ID0gaW5saW5lU3RhdGUuc3JjLnNsaWNlKG9yaWdpbmFsUG9zLCBpbmxpbmVTdGF0ZS5wb3MpO1xuICAgICAgY29kZVRva2VuLmF0dHJTZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSLCAndHJ1ZScpO1xuICAgICAgaW5saW5lU3RhdGUudG9rZW5zW2lubGluZVN0YXRlLnRva2Vucy5sZW5ndGggLSAxXSA9IGNvZGVUb2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcblxuY2xhc3MgU2NyYXRjaFRva2VuUGFyc2VyIHtcbiAgcHJpdmF0ZSBmdWxsVG9rZW5MaXN0OiBtYXJrZG93bml0LlRva2VuW107XG4gIHByaXZhdGUgdG9rZW5TdGFjazogbWFya2Rvd25pdC5Ub2tlbltdO1xuICBwcml2YXRlIHBhcnNlYWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzcmM6IHN0cmluZztcblxuICBzdGF0aWMgRE9DVU1FTlRfTUFQID0gbmV3IE1hcChbXG4gICAgWydoZWFkaW5nMScsIFsnaW5saW5lJ11dLFxuICAgIFsnaGVhZGluZzInLCBbJ2lubGluZSddXSxcbiAgICBbJ2hlYWRpbmczJywgWydpbmxpbmUnXV0sXG4gICAgWydwYXJhZ3JhcGgnLCBbJ2lubGluZSddXSxcbiAgICBbJ2ZlbmNlJywgWydpbmxpbmUnXV0sXG4gICAgWydidWxsZXRfbGlzdCcsIFsnbGlzdF9pdGVtJywgJ2lubGluZSddXSxcbiAgICBbJ29yZGVyZWRfbGlzdCcsIFsnbGlzdF9pdGVtJywgJ2lubGluZSddXSxcbiAgICBbJ2xpc3RfaXRlbScsIFsncGFyYWdyYXBoJywgJ29yZGVyZWRfbGlzdCcsICdidWxsZXRfbGlzdCddXSxcbiAgICBbJ2NoZWNrbGlzdF9pdGVtJywgWydpbmxpbmUnXV0sXG4gICAgWydpbmxpbmUnLCBbXV0sXG4gIF0pO1xuXG4gIHN0YXRpYyBnZXRUeXBlTmFtZSh0b2tlblR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0b2tlblR5cGUucmVwbGFjZSgnX29wZW4nLCAnJykucmVwbGFjZSgnX2Nsb3NlJywgJycpO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc3JjOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgIHRoaXMuc3JjID0gc3JjO1xuICB9XG5cbiAgdGFrZSh0b2tlbjogbWFya2Rvd25pdC5Ub2tlbik6IG51bGwgfCBtYXJrZG93bml0LlRva2VuW10ge1xuICAgIGNvbnN0IHsgbmVzdGluZyB9ID0gdG9rZW47XG4gICAgbGV0IHsgdHlwZSB9ID0gdG9rZW47XG4gICAgdHlwZSA9IFNjcmF0Y2hUb2tlblBhcnNlci5nZXRUeXBlTmFtZSh0eXBlKTtcblxuICAgIHRoaXMuZnVsbFRva2VuTGlzdC5wdXNoKHRva2VuKTtcblxuICAgIGlmIChcbiAgICAgIFNjcmF0Y2hUb2tlblBhcnNlci5ET0NVTUVOVF9NQVAuaGFzKHR5cGUpID09PSBmYWxzZSAmJlxuICAgICAgdHlwZSAhPT0gJ2lubGluZSdcbiAgICApIHtcbiAgICAgIHRoaXMucGFyc2VhYmxlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyc2VhYmxlICYmIHRoaXMudG9rZW5TdGFjay5sZW5ndGggJiYgbmVzdGluZyA+PSAwKSB7XG4gICAgICBjb25zdCBwYXJlbnRUeXBlID0gU2NyYXRjaFRva2VuUGFyc2VyLmdldFR5cGVOYW1lKFxuICAgICAgICB0aGlzLnRva2VuU3RhY2tbdGhpcy50b2tlblN0YWNrLmxlbmd0aCAtIDFdLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBpZiAoXG4gICAgICAgIFNjcmF0Y2hUb2tlblBhcnNlci5ET0NVTUVOVF9NQVAuZ2V0KHBhcmVudFR5cGUpLmluY2x1ZGVzKHR5cGUpID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMucGFyc2VhYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lc3RpbmcgPiAwKSB7XG4gICAgICB0aGlzLnRva2VuU3RhY2sucHVzaCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKG5lc3RpbmcgPCAwKSB7XG4gICAgICB0aGlzLnRva2VuU3RhY2sucG9wKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9rZW5TdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IG91dCA9IHRoaXMuZ2V0VG9rZW5zKCk7XG4gICAgICB0aGlzLnJlc2V0SW50ZXJuYWxTdGF0ZSgpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5zID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZnVsbFRva2VuTGlzdCwgcGFyc2VhYmxlIH0gPSB0aGlzO1xuXG4gICAgaWYgKHBhcnNlYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFwOiBbZW5kTGluZSwgc3RhcnRMaW5lXSxcbiAgICAgIH0gPSBmdWxsVG9rZW5MaXN0WzBdO1xuICAgICAgY29uc3QgY29kZVRva2VuID0gbmV3IFRva2VuKCdmZW5jZScsICdjb2RlJywgMCk7XG4gICAgICBjb2RlVG9rZW4uY29udGVudCA9IHRoaXMuc3JjXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLnNsaWNlKGVuZExpbmUsIHN0YXJ0TGluZSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29kZVRva2VuLmF0dHJQdXNoKFtNQVJLRE9XTl9FU0NBUEVEX0FUVFIsICd0cnVlJ10pO1xuICAgICAgcmV0dXJuIFtjb2RlVG9rZW5dO1xuICAgIH1cblxuICAgIHJldHVybiBmdWxsVG9rZW5MaXN0O1xuICB9O1xuXG4gIHByaXZhdGUgcmVzZXRJbnRlcm5hbFN0YXRlID0gKCkgPT4ge1xuICAgIHRoaXMuZnVsbFRva2VuTGlzdCA9IFtdO1xuICAgIHRoaXMudG9rZW5TdGFjayA9IFtdO1xuICAgIHRoaXMucGFyc2VhYmxlID0gdHJ1ZTtcbiAgfTtcbn1cblxuY29uc3QgcGFyc2VyU2hpbSA9ICgpID0+ICh7XG4gIHBhcnNlKC4uLmFyZ3MpIHtcbiAgICAod2luZG93IGFzIGFueSkubWlwID0gbWFya2Rvd25JdFBhcnNlcjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW5pdGlhbCA9IG1hcmtkb3duSXRQYXJzZXIucGFyc2UoLi4uYXJncyk7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgY29uc3QgdG9rZW5QYXJzZXIgPSBuZXcgU2NyYXRjaFRva2VuUGFyc2VyKGFyZ3NbMF0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0aWFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGluaXRpYWxbaV07XG4gICAgICBjb25zdCB7IG5lc3RpbmcsIHRhZywgdHlwZSB9ID0gdG9rZW47XG5cbiAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ2hlYWRpbmcnKSAmJiB0YWcgPT09ICdoMScpIHtcbiAgICAgICAgdG9rZW4udHlwZSA9IHRva2VuLnR5cGUucmVwbGFjZSgnaGVhZGluZycsICdoZWFkaW5nMScpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgnaGVhZGluZycpICYmIHRhZyA9PT0gJ2gyJykge1xuICAgICAgICB0b2tlbi50eXBlID0gdHlwZS5yZXBsYWNlKCdoZWFkaW5nJywgJ2hlYWRpbmcyJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCdoZWFkaW5nJykgJiYgdGFnID09PSAnaDMnKSB7XG4gICAgICAgIHRva2VuLnR5cGUgPSB0eXBlLnJlcGxhY2UoJ2hlYWRpbmcnLCAnaGVhZGluZzMnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAnbGluaycgJiYgdG9rZW4uYXR0ckdldCgnaHJlZicpID09PSB0b2tlbi5jb250ZW50KSB7XG4gICAgICAgIHRva2VuLmF0dHJTZXQoQVVUT19MSU5LX0FUVFIsICd0cnVlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHRva2VuUGFyc2VyLnRha2UodG9rZW4pO1xuXG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIG91dC5wdXNoKC4uLm91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgbWFya2Rvd25QYXJzZXIgPSBuZXcgTWFya2Rvd25QYXJzZXIoXG4gIHNjaGVtYSxcbiAgLy8gQHRzLWlnbm9yZVxuICBwYXJzZXJTaGltKCksXG4gIHtcbiAgICBibG9ja3F1b3RlOiB7IGJsb2NrOiAnY29kZV9ibG9jaycgfSxcbiAgICBidWxsZXRfbGlzdDogeyBibG9jazogJ3Vub3JkZXJlZF9saXN0JyB9LFxuICAgIGZlbmNlOiB7XG4gICAgICBibG9jazogJ2NvZGVfYmxvY2snLFxuICAgICAgZ2V0QXR0cnModG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmF0dHJHZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSKSA9PT0gJ3RydWUnXG4gICAgICAgICAgPyB7IFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB0cnVlIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIGhlYWRpbmcxOiB7IGJsb2NrOiAnaGVhZGluZzEnIH0sXG4gICAgaGVhZGluZzI6IHsgYmxvY2s6ICdoZWFkaW5nMicgfSxcbiAgICBoZWFkaW5nMzogeyBibG9jazogJ2hlYWRpbmczJyB9LFxuICAgIGxpc3RfaXRlbTogeyBibG9jazogJ2xpc3RfaXRlbScgfSxcbiAgICBvcmRlcmVkX2xpc3Q6IHsgYmxvY2s6ICdvcmRlcmVkX2xpc3QnIH0sXG4gICAgcGFyYWdyYXBoOiB7IGJsb2NrOiAncGFyYWdyYXBoJyB9LFxuICAgIGNoZWNrbGlzdF9pdGVtOiB7XG4gICAgICBibG9jazogJ2NoZWNrbGlzdF9pdGVtJyxcbiAgICAgIGdldEF0dHJzKHRvaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czpcbiAgICAgICAgICAgIHRvay5hdHRyR2V0KCdzdGF0dXMnKSA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORS50b1N0cmluZygpXG4gICAgICAgICAgICAgID8gQ2hlY2tib3hTdGF0dXMuRE9ORVxuICAgICAgICAgICAgICA6IENoZWNrYm94U3RhdHVzLkVNUFRZLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICAgIGVtOiB7IG1hcms6ICdlbScgfSxcbiAgICBzdHJvbmc6IHsgbWFyazogJ3N0cm9uZycgfSxcbiAgICBjb2RlX2lubGluZToge1xuICAgICAgZ2V0QXR0cnModG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHRva2VuLmF0dHJHZXQoTUFSS0RPV05fRVNDQVBFRF9BVFRSKSA9PT0gJ3RydWUnXG4gICAgICAgICAgPyB7IFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB0cnVlIH1cbiAgICAgICAgICA6IHt9O1xuICAgICAgfSxcbiAgICAgIG1hcms6ICdjb2RlJyxcbiAgICAgIG5vQ2xvc2VUb2tlbjogdHJ1ZSxcbiAgICB9LFxuICAgIGxpbms6IHtcbiAgICAgIG1hcms6ICdsaW5rJyxcbiAgICAgIGdldEF0dHJzKHRvaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHRvay5hdHRyR2V0KCdocmVmJyksXG4gICAgICAgICAgdGl0bGU6IHRvay5hdHRyR2V0KCd0aXRsZScpIHx8IG51bGwsXG4gICAgICAgICAgLi4uKHRvay5pbmZvID09PSAnYXV0bycgJiYge1xuICAgICAgICAgICAgW0FVVE9fTElOS19BVFRSXTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbik7XG4iLCJpbXBvcnQgeyBDaGVja2JveFN0YXR1cywgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgRWRpdG9yUHJvcHMgfSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7IENoZWNrYm94T3V0bGluZSwgQ2hlY2tib3ggfSBmcm9tICcuL2Fzc2V0cyc7XG5cbmNvbnN0IENIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FID0gJ2lzLWNoZWNrZWQnO1xuY29uc3QgQ0xJQ0tfVEFSR0VUX0NMQVNTTkFNRSA9ICdjbGljay10YXJnZXQnO1xuXG5leHBvcnQgY29uc3Qgbm9kZVZpZXdzOiBFZGl0b3JQcm9wczx0eXBlb2Ygc2NoZW1hPlsnbm9kZVZpZXdzJ10gPSB7XG4gIGNoZWNrbGlzdF9pdGVtKG5vZGUsIHZpZXcsIGdldFBvcykge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdjaGVja2xpc3QtaXRlbScpO1xuXG4gICAgY29uc3QgaW5wdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbnB1dERpdi5jbGFzc0xpc3QuYWRkKCdjaGVja2JveCcpO1xuICAgIGlmIChub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSkge1xuICAgICAgaW5wdXREaXYuY2xhc3NMaXN0LmFkZChDSEVDS0JPWF9DSEVDS0VEX0NMQVNTTkFNRSk7XG4gICAgICBpbnB1dERpdi5pbm5lckhUTUwgPSBDaGVja2JveDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXREaXYuaW5uZXJIVE1MID0gQ2hlY2tib3hPdXRsaW5lO1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWNrVGFyZ2V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY2xpY2tUYXJnZXREaXYuY2xhc3NMaXN0LmFkZChDTElDS19UQVJHRVRfQ0xBU1NOQU1FKTtcbiAgICBjbGlja1RhcmdldERpdi5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnO1xuICAgIGNsaWNrVGFyZ2V0RGl2LnRhYkluZGV4ID0gMDtcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG5cbiAgICBjbGlja1RhcmdldERpdi5hcHBlbmRDaGlsZChpbnB1dERpdik7XG4gICAgZGl2LmFwcGVuZENoaWxkKGNsaWNrVGFyZ2V0RGl2KTtcbiAgICBkaXYuYXBwZW5kQ2hpbGQocCk7XG5cbiAgICBjb25zdCBmb2N1c0hhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVsYXRlZFRhcmdldCwgdGFyZ2V0IH0gPSBldmVudDtcbiAgICAgIGlmIChjbGlja1RhcmdldERpdi5jb250YWlucyhyZWxhdGVkVGFyZ2V0IGFzIE5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAvLyBJbnB1dCBpcyB0YWtpbmcgZm9jdXNcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2aWV3SGFzRm9jdXMgPSB0YXJnZXQgPT09IHZpZXcuZG9tO1xuICAgICAgaWYgKHZpZXdIYXNGb2N1cykge1xuICAgICAgICAvLyBUaGUgdmlldyB3YXMgZm9jdXNlZCBiZWZvcmUgdGhlIGlucHV0XG4gICAgICAgIHZpZXcuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xpY2tIYW5kbGVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoY2xpY2tUYXJnZXREaXYuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja2VkID0gaW5wdXREaXYuY2xhc3NMaXN0LmNvbnRhaW5zKENIRUNLQk9YX0NIRUNLRURfQ0xBU1NOQU1FKTtcbiAgICAgIGNvbnN0IHsgdHIgfSA9IHZpZXcuc3RhdGU7XG4gICAgICBjb25zdCBwb3MgPSAoZ2V0UG9zIGFzICgpID0+IG51bWJlcikoKTtcbiAgICAgIHRyLnNldE5vZGVNYXJrdXAocG9zLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc3RhdHVzOiBjaGVja2VkID8gQ2hlY2tib3hTdGF0dXMuRU1QVFkgOiBDaGVja2JveFN0YXR1cy5ET05FLFxuICAgICAgfSk7XG4gICAgICB2aWV3LmRpc3BhdGNoKHRyKTtcbiAgICB9O1xuXG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGZvY3VzSGFuZGxlcik7XG4gICAgdmlldy5kb20uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbTogZGl2LFxuICAgICAgY29udGVudERPTTogcCxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHZpZXcuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmb2N1c0hhbmRsZXIpO1xuICAgICAgICB2aWV3LmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrSGFuZGxlcik7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgYnVsbGV0TGlzdCwgbGlzdEl0ZW0sIG9yZGVyZWRMaXN0IH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWxpc3QnO1xuaW1wb3J0IHsgbWFya3MsIG5vZGVzIH0gZnJvbSAncHJvc2VtaXJyb3Itc2NoZW1hLWJhc2ljJztcbmltcG9ydCB7IE5vZGVTcGVjLCBTY2hlbWEsIFNjaGVtYVNwZWMgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5cbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9FU0NBUEVEX0FUVFIgPSAnbWFya2Rvd25fZXNjYXBlZCc7XG5leHBvcnQgY29uc3QgQVVUT19MSU5LX0FUVFIgPSAnYXV0b19saW5rJzsgLy8gTGlua3MgYXV0by1kZXRlY3RlZCBmcm9tIHVzZXIgaW5wdXQsIGFzIG9wcG9zZWQgdG8gbGlua3MgYWRkZWQgYXMgbWV0YWRhdGEgYnkgdGhlIHVzZXJcblxuY29uc3QgRURJVE9SX0NMUyA9ICdzbi1lZGl0b3InO1xuXG5jb25zdCBkb2NTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2Jsb2NrKycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydtYWluJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFtcbiAgICB7XG4gICAgICB0YWc6ICdtYWluJyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3QgaGVhZGluZzFTcGVjOiBOb2RlU3BlYyA9IHtcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydoMScsIHsgY2xhc3M6IEVESVRPUl9DTFMgfSwgMF07XG4gIH0sXG4gIHBhcnNlRE9NOiBbXG4gICAge1xuICAgICAgdGFnOiAnaDEnLFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBoZWFkaW5nMlNwZWM6IE5vZGVTcGVjID0ge1xuICBjb250ZW50OiAnaW5saW5lKicsXG4gIGRlZmluaW5nOiB0cnVlLFxuICBncm91cDogJ2Jsb2NrJyxcbiAgdG9ET00obm9kZSkge1xuICAgIHJldHVybiBbJ2gyJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFt7IHRhZzogJ2gyJyB9XSxcbn07XG5cbmNvbnN0IGhlYWRpbmczU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZGVmaW5pbmc6IHRydWUsXG4gIGdyb3VwOiAnYmxvY2snLFxuICB0b0RPTShub2RlKSB7XG4gICAgcmV0dXJuIFsnaDMnLCB7IGNsYXNzOiBFRElUT1JfQ0xTIH0sIDBdO1xuICB9LFxuICBwYXJzZURPTTogW3sgdGFnOiAnaDMnIH1dLFxufTtcblxuY29uc3QgcGFyYWdyYXBoU3BlYzogTm9kZVNwZWMgPSB7XG4gIGNvbnRlbnQ6ICdpbmxpbmUqJyxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIG1hcmtzOiAnXycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gWydwJywgeyBjbGFzczogRURJVE9SX0NMUyB9LCAwXTtcbiAgfSxcbiAgcGFyc2VET006IFt7IHRhZzogJ3AnIH1dLFxufTtcblxuZXhwb3J0IGVudW0gQ2hlY2tib3hTdGF0dXMge1xuICBET05FLFxuICBFTVBUWSxcbn1cblxuY29uc3QgY2hlY2tsaXN0SXRlbVNwZWM6IE5vZGVTcGVjID0ge1xuICBhdHRyczoge1xuICAgIHN0YXR1czoge1xuICAgICAgZGVmYXVsdDogQ2hlY2tib3hTdGF0dXMuRU1QVFksXG4gICAgfSxcbiAgfSxcbiAgY29udGVudDogJ2lubGluZSonLFxuICBkZWZpbmluZzogdHJ1ZSxcbiAgZ3JvdXA6ICdibG9jaycsXG4gIG1hcmtzOiAnXycsXG4gIHRvRE9NKG5vZGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzOiAnY2hlY2tsaXN0LWl0ZW0nIH0sXG4gICAgICBbXG4gICAgICAgICdpbnB1dCcsXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgIC4uLihub2RlLmF0dHJzLnN0YXR1cyA9PT0gQ2hlY2tib3hTdGF0dXMuRE9ORSAmJiB7IGNoZWNrZWQ6ICd0cnVlJyB9KSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBbJ3AnLCAwXSxcbiAgICBdO1xuICB9LFxuICBwYXJzZURPTTogW1xuICAgIHtcbiAgICAgIGNvbnRlbnRFbGVtZW50OiAncCcsXG4gICAgICB0YWc6ICdkaXYuY2hlY2tsaXN0LWl0ZW0nLFxuICAgICAgZ2V0QXR0cnMobm9kZSkge1xuICAgICAgICAvLyBXaWxsIGJlIHR5cGUgTm9kZSB3aGVuIHBhcnNlRE9NIHN1cHBsaWVzIGEgJ3RhZycgcnVsZVxuICAgICAgICBjb25zdCBpbnB1dCA9IChub2RlIGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXR1czogISEoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZFxuICAgICAgICAgICAgPyBDaGVja2JveFN0YXR1cy5ET05FXG4gICAgICAgICAgICA6IENoZWNrYm94U3RhdHVzLkVNUFRZLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3QgdGV4dFNwZWM6IE5vZGVTcGVjID0ge1xuICBncm91cDogJ2lubGluZScsXG59O1xuXG5jb25zdCBjb2RlQmxvY2tTcGVjOiBOb2RlU3BlYyA9IHtcbiAgLi4ubm9kZXMuY29kZV9ibG9jayxcbiAgYXR0cnM6IHtcbiAgICAuLi5ub2Rlcy5jb2RlX2Jsb2NrLmF0dHJzLFxuICAgIFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB7XG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9LFxuICB9LFxuICB0b0RPTShub2RlKSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBbYGRhdGEtJHtNQVJLRE9XTl9FU0NBUEVEX0FUVFJ9YF06IG5vZGUuYXR0cnNbTUFSS0RPV05fRVNDQVBFRF9BVFRSXSxcbiAgICB9O1xuICAgIHJldHVybiBub2RlLmF0dHJzW01BUktET1dOX0VTQ0FQRURfQVRUUl1cbiAgICAgID8gWydwcmUnLCBhdHRycywgWydkaXYnLCB7IGNsYXNzOiAnaW5mbycgfSwgJ2knXSwgWydjb2RlJywgMF1dXG4gICAgICA6IFsncHJlJywgYXR0cnMsIFsnY29kZScsIDBdXTtcbiAgfSxcbn07XG5cbmNvbnN0IHNwZWM6IFNjaGVtYVNwZWMgPSB7XG4gIG5vZGVzOiB7XG4gICAgZG9jOiBkb2NTcGVjLFxuICAgIC8vIE9yZGVyIG1hdHRlcnMgaGVyZS4gcG0gYXBwYXJlbnRseSBpbnNlcnRzIHRoZSBmaXJzdCB2YWxpZCBub2RlIG9uIGVudGVyLlxuICAgIHBhcmFncmFwaDogcGFyYWdyYXBoU3BlYyxcbiAgICBjaGVja2xpc3RfaXRlbTogY2hlY2tsaXN0SXRlbVNwZWMsXG4gICAgdW5vcmRlcmVkX2xpc3Q6IHtcbiAgICAgIC4uLmJ1bGxldExpc3QsXG4gICAgICBjb250ZW50OiAnbGlzdF9pdGVtKycsXG4gICAgICBncm91cDogJ2Jsb2NrJyxcbiAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgb3JkZXJlZF9saXN0OiB7XG4gICAgICAuLi5vcmRlcmVkTGlzdCxcbiAgICAgIGNvbnRlbnQ6ICdsaXN0X2l0ZW0rJyxcbiAgICAgIGdyb3VwOiAnYmxvY2snLFxuICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICBsaXN0X2l0ZW06IHtcbiAgICAgIC4uLmxpc3RJdGVtLFxuICAgICAgY29udGVudDogJ3BhcmFncmFwaCAocGFyYWdyYXBoIHwgb3JkZXJlZF9saXN0IHwgdW5vcmRlcmVkX2xpc3QpKicsXG4gICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIGhlYWRpbmcxOiBoZWFkaW5nMVNwZWMsXG4gICAgaGVhZGluZzI6IGhlYWRpbmcyU3BlYyxcbiAgICBoZWFkaW5nMzogaGVhZGluZzNTcGVjLFxuICAgIHRleHQ6IHRleHRTcGVjLFxuICAgIGNvZGVfYmxvY2s6IGNvZGVCbG9ja1NwZWMsXG4gIH0sXG4gIG1hcmtzOiB7XG4gICAgbGluazoge1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgaHJlZjogeyBkZWZhdWx0OiAnJyB9LFxuICAgICAgICB0aXRsZTogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICAgIFtBVVRPX0xJTktfQVRUUl06IHsgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAgIH0sXG4gICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgcGFyc2VET006IFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2FbaHJlZl0nLFxuICAgICAgICAgIGdldEF0dHJzKGRvbTogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGhyZWY6IGRvbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxcbiAgICAgICAgICAgICAgdGl0bGU6IGRvbS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyksXG4gICAgICAgICAgICAgIFtgZGF0YS0ke0FVVE9fTElOS19BVFRSfWBdOiBkb20uZ2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIGBkYXRhLSR7QVVUT19MSU5LX0FUVFJ9YCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0b0RPTShub2RlKSB7XG4gICAgICAgIGxldCB7IGhyZWYsIHRpdGxlIH0gPSBub2RlLmF0dHJzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICdhJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBbYGRhdGEtJHtBVVRPX0xJTktfQVRUUn1gXTogbm9kZS5hdHRyc1tBVVRPX0xJTktfQVRUUl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAwLFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGVtOiB7XG4gICAgICAuLi5tYXJrcy5lbSxcbiAgICB9LFxuICAgIHN0cm9uZzoge1xuICAgICAgLi4ubWFya3Muc3Ryb25nLFxuICAgIH0sXG4gICAgY29kZToge1xuICAgICAgLi4ubWFya3MuY29kZSxcbiAgICAgIGF0dHJzOiB7XG4gICAgICAgIC4uLm1hcmtzLmNvZGUuYXR0cnMsXG4gICAgICAgIFtNQVJLRE9XTl9FU0NBUEVEX0FUVFJdOiB7XG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2NoZW1hID0gbmV3IFNjaGVtYShzcGVjKTtcbiIsImltcG9ydCB7IE5vZGUgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RCbG9jayhcbiAgbm9kZTogTm9kZSxcbiAgbGlzdFR5cGVzID0gW3NjaGVtYS5ub2Rlcy51bm9yZGVyZWRfbGlzdCwgc2NoZW1hLm5vZGVzLm9yZGVyZWRfbGlzdF0sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGxpc3RUeXBlcy5pbmNsdWRlcyhub2RlLnR5cGUpO1xufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IENvbXBvbmVudE1hbmFnZXIgZnJvbSAnQHN0YW5kYXJkbm90ZXMvY29tcG9uZW50LXJlbGF5JztcbmltcG9ydCB7IGJhc2VLZXltYXAgfSBmcm9tICdwcm9zZW1pcnJvci1jb21tYW5kcyc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3IH0gZnJvbSAncHJvc2VtaXJyb3Itdmlldyc7XG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSwgUGx1Z2luIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgaGlzdG9yeSB9IGZyb20gJ3Byb3NlbWlycm9yLWhpc3RvcnknO1xuaW1wb3J0IHsgaW5wdXRSdWxlc0ZvcmNlZFNwYWNlUGx1Z2luLCBpbnB1dFJ1bGVzUGx1Z2luIH0gZnJvbSAnLi9pbnB1dFJ1bGVzJztcbmltcG9ydCB7IFRvb2xiYXJQbHVnaW4gfSBmcm9tICcuL1Rvb2xiYXJQbHVnaW4nO1xuaW1wb3J0IHsgVG9vbHRpcFBsdWdpbiB9IGZyb20gJy4vVG9vbHRpcFBsdWdpbic7XG5pbXBvcnQgeyBFZGl0b3JFeHRlbmRlclBsdWdpbiB9IGZyb20gJy4vRWRpdG9yRXh0ZW5kZXJQbHVnaW4nO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgbm9kZVZpZXdzIH0gZnJvbSAnLi9ub2RlVmlld3MnO1xuaW1wb3J0IHsga2V5bWFwUGx1Z2lucyB9IGZyb20gJy4va2V5bWFwcyc7XG5pbXBvcnQgeyBtYXJrZG93blBhcnNlciwgbWFya2Rvd25TZXJpYWxpemVyIH0gZnJvbSAnLi9tYXJrZG93bic7XG5pbXBvcnQgeyBJbmxpbmVMaW5rUGx1Z2luIH0gZnJvbSAnLi9JbmxpbmVMaW5rUGx1Z2luJztcblxuaW50ZXJmYWNlIEFwcFdpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIHZpZXc6IEVkaXRvclZpZXc7XG59XG5cbmRlY2xhcmUgY29uc3Qgd2luZG93OiBBcHBXaW5kb3c7XG5cbmZ1bmN0aW9uIGdldERvY0Zvck5ld0VkaXRvclN0YXRlKCkge1xuICByZXR1cm4gY2xpZW50LmxhdGVzdFRleHRcbiAgICA/IG1hcmtkb3duUGFyc2VyLnBhcnNlKGNsaWVudC5sYXRlc3RUZXh0KVxuICAgIDogY2xpZW50LmxhdGVzdERvY1xuICAgICAgPyBzY2hlbWEubm9kZUZyb21KU09OKGNsaWVudC5sYXRlc3REb2MpXG4gICAgICA6IHNjaGVtYS50b3BOb2RlVHlwZS5jcmVhdGVBbmRGaWxsKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7XG4gIGF3YWl0IGNsaWVudC5yZWFkeSgpO1xuXG4gIGNvbnN0IHZpZXcgPSAod2luZG93LnZpZXcgPSBuZXcgRWRpdG9yVmlldyhcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZWRpdG9yJyksXG4gICAge1xuICAgICAgc3RhdGU6IEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgIGRvYzogZ2V0RG9jRm9yTmV3RWRpdG9yU3RhdGUoKSxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIC4uLmtleW1hcFBsdWdpbnMsXG4gICAgICAgICAgbmV3IFRvb2xiYXJQbHVnaW4oXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdG9vbGJhcicpLFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2xpbmstbW9kYWwnKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBUb29sdGlwUGx1Z2luKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaW5rLXRvb2x0aXAnKSksXG4gICAgICAgICAgbmV3IEVkaXRvckV4dGVuZGVyUGx1Z2luKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNleHRlbmRlcicpKSxcbiAgICAgICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIG5vZGVWaWV3cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IElubGluZUxpbmtQbHVnaW4oKSxcbiAgICAgICAgICBpbnB1dFJ1bGVzUGx1Z2luLFxuICAgICAgICAgIGlucHV0UnVsZXNGb3JjZWRTcGFjZVBsdWdpbixcbiAgICAgICAgICBoaXN0b3J5KCksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICAgIGRpc3BhdGNoVHJhbnNhY3Rpb24odHIpIHtcbiAgICAgICAgY29uc3QgbmV4dCA9IHZpZXcuc3RhdGUuYXBwbHkodHIpO1xuICAgICAgICB2aWV3LnVwZGF0ZVN0YXRlKG5leHQpO1xuICAgICAgICBpZiAodHIuZG9jQ2hhbmdlZCkge1xuICAgICAgICAgIGNsaWVudC5zYXZlTm90ZShcbiAgICAgICAgICAgIG5leHQuZG9jLnRvSlNPTigpLFxuICAgICAgICAgICAgbWFya2Rvd25TZXJpYWxpemVyLnNlcmlhbGl6ZShuZXh0LmRvYyksXG4gICAgICAgICAgICBuZXh0LmRvYy50ZXh0QmV0d2VlbigwLCBuZXh0LmRvYy5ub2RlU2l6ZSAtIDIsICcgJyksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICApKTtcblxuICBjbGllbnQub25VcGRhdGUoKGRvYykgPT4ge1xuICAgIC8vIFdoZW4gdGhlIHVzZXIgb3BlbnMgYSBuZXcgbm90ZSwga2VlcCBhbGwgdGhlIHBsdWdpbiBpbnN0YW5jZXMgZXhjZXB0IHRoZSB0b29sYmFyXG4gICAgY29uc3QgcGx1Z2lucyA9IHZpZXcuc3RhdGUucGx1Z2lucy5maWx0ZXIoXG4gICAgICAocGx1Z2luKSA9PiBwbHVnaW4gaW5zdGFuY2VvZiBUb29sYmFyUGx1Z2luID09PSBmYWxzZSxcbiAgICApO1xuXG4gICAgdmlldy5zZXRQcm9wcyh7XG4gICAgICBzdGF0ZTogRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgZG9jOiBnZXREb2NGb3JOZXdFZGl0b3JTdGF0ZSgpLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgLi4ucGx1Z2lucyxcbiAgICAgICAgICBuZXcgVG9vbGJhclBsdWdpbihcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0b29sYmFyJyksXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbGluay1tb2RhbCcpLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmluaXQoKTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/docs/main.css b/docs/main.css index 4b8f6b0..9e4e51a 100644 --- a/docs/main.css +++ b/docs/main.css @@ -76,10 +76,12 @@ body { --default-item-gap: 5px; --default-checkbox-gap: 8px; --text-color: rgba(0, 0, 0, 0.9); - --h3-text-color: rgba(0, 0, 0, 0.7); - color: var(--sn-stylekit-foreground-color, var(--text-color)); + --h3-text-color: var(--sn-stylekit-paragraph-text-color, rgba(0, 0, 0, 0.7)); + color: var(--sn-stylekit-paragraph-text-color, var(--text-color)); font-size: var(--base-font-size); font-family: var(--ff-serif), serif; + scrollbar-color: var(--sn-stylekit-scrollbar-color, #ccc) + var(--sn-stylekit-background-color, white); } @media only screen and (max-width: 720px) { @@ -548,4 +550,4 @@ div#link-tooltip.yes-auto-link div.auto-link-indicator { } -/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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V0FBVztBQUNiOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGNBQWM7RUFDZCx5QkFBeUI7RUFDekIsZUFBZTtFQUNmLGtCQUFrQjtBQUNwQjs7QUFFQTtFQUNFLHFCQUFxQjtFQUNyQixZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLFFBQVE7RUFDUixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxtQkFBbUI7RUFDbkIsV0FBVztBQUNiOztBQUVBO0VBQ0UsbUJBQW1CO0VBQ25CLGFBQWE7RUFDYix5QkFBeUI7RUFDekIsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixRQUFRO0VBQ1IsV0FBVztBQUNiOztBQUVBO0VBQ0UsaUJBQWlCO0VBQ2pCLGdCQUFnQjtFQUNoQix5QkFBeUI7RUFDekIsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSwwREFBMEQ7QUFDNUQ7O0FBRUE7RUFDRSxzREFBc0Q7RUFDdEQsdURBQXVEO0VBQ3ZELHdDQUF3QztFQUN4QyxzQkFBc0I7RUFDdEIsYUFBYTtFQUNiLDRCQUE0QjtFQUM1QixpQkFBaUI7RUFDakIsa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsYUFBYTtFQUNiLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLGFBQWE7RUFDYix1QkFBdUI7RUFDdkIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsY0FBYztFQUNkLGlCQUFpQjtFQUNqQixnQkFBZ0I7RUFDaEIsbUJBQW1CO0VBQ25CLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLGNBQWM7RUFDZCxjQUFjO0VBQ2QsWUFBWTtFQUNaLFdBQVc7QUFDYjs7QUFFQTtFQUNFLHlCQUF5QjtFQUN6QixzQ0FBc0M7RUFDdEMsZUFBZTtFQUNmLGFBQWE7RUFDYixrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9ub2RlX21vZHVsZXMvcHJvc2VtaXJyb3Itdmlldy9zdHlsZS9wcm9zZW1pcnJvci5jc3MiLCJ3ZWJwYWNrOi8vc24tc2NyYXRjaHBhZC1lZGl0b3IvLi9zcmMvc3R5bGVzLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIuUHJvc2VNaXJyb3Ige1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5Qcm9zZU1pcnJvciB7XG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB3aGl0ZS1zcGFjZTogYnJlYWstc3BhY2VzO1xuICAtd2Via2l0LWZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7XG4gIGZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7XG4gIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogXCJsaWdhXCIgMDsgLyogdGhlIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIEVkZ2UgKi9cbn1cblxuLlByb3NlTWlycm9yIHByZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbn1cblxuLlByb3NlTWlycm9yIGxpIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uUHJvc2VNaXJyb3ItaGlkZXNlbGVjdGlvbiAqOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24geyBjYXJldC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cblxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Qcm9zZU1pcnJvci9wcm9zZW1pcnJvci9pc3N1ZXMvMTQyMSNpc3N1ZWNvbW1lbnQtMTc1OTMyMDE5MSAqL1xuLlByb3NlTWlycm9yIFtkcmFnZ2FibGVdW2NvbnRlbnRlZGl0YWJsZT1mYWxzZV0geyB1c2VyLXNlbGVjdDogdGV4dCB9XG5cbi5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xuICBvdXRsaW5lOiAycHggc29saWQgIzhjZjtcbn1cblxuLyogTWFrZSBzdXJlIGxpIHNlbGVjdGlvbnMgd3JhcCBhcm91bmQgbWFya2VycyAqL1xuXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGUge1xuICBvdXRsaW5lOiBub25lO1xufVxuXG5saS5Qcm9zZU1pcnJvci1zZWxlY3RlZG5vZGU6YWZ0ZXIge1xuICBjb250ZW50OiBcIlwiO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0zMnB4O1xuICByaWdodDogLTJweDsgdG9wOiAtMnB4OyBib3R0b206IC0ycHg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICM4Y2Y7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4vKiBQcm90ZWN0IGFnYWluc3QgZ2VuZXJpYyBpbWcgcnVsZXMgKi9cblxuaW1nLlByb3NlTWlycm9yLXNlcGFyYXRvciB7XG4gIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xuICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG59XG4iLCIvKiogZ2xvYmFsICovXG5AaW1wb3J0IHVybCgnfnByb3NlbWlycm9yLXZpZXcvc3R5bGUvcHJvc2VtaXJyb3IuY3NzJyk7XG5cbmJvZHkge1xuICAtLWJhc2UtZm9udC1zaXplOiAxNXB4O1xuICAtLWJvcmRlci1jb2xvcjogMXB4IHNvbGlkICNjY2M7XG4gIC0taDItZm9udC1zaXplOiAxNnB4O1xuICAtLWgxLWZvbnQtc2l6ZTogMjBweDtcbiAgLS1oMy1mb250LXNpemU6IDE1cHg7XG4gIC0tZmYtc2FuczogJ1JvYm90bycsIHNhbnMtc2VyaWY7XG4gIC0tZmYtc2VyaWY6ICdSb2JvdG8gU2xhYicsIHNlcmlmO1xuICAtLWZmLW1vbm86ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgLS1jb2xvci1wcmltYXJ5OiByZ2IoOCwgMTA5LCAyMTQpO1xuICAtLWRlZmF1bHQtZ2FwOiAxNHB4O1xuICAtLWgzLWdhcDogMTFweDtcbiAgLS1kZWZhdWx0LWl0ZW0tZ2FwOiA1cHg7XG4gIC0tZGVmYXVsdC1jaGVja2JveC1nYXA6IDhweDtcbiAgLS10ZXh0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOSk7XG4gIC0taDMtdGV4dC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtZm9yZWdyb3VuZC1jb2xvciwgdmFyKC0tdGV4dC1jb2xvcikpO1xuICBmb250LXNpemU6IHZhcigtLWJhc2UtZm9udC1zaXplKTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZmLXNlcmlmKSwgc2VyaWY7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgYm9keSB7XG4gICAgLS1iYXNlLWZvbnQtc2l6ZTogMTZweDtcbiAgICAtLWgyLWZvbnQtc2l6ZTogMTdweDtcbiAgICAtLWgzLWZvbnQtc2l6ZTogMTdweDtcbiAgfVxufVxuXG4qIHtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgYm9yZGVyOiAwO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udDogaW5oZXJpdDtcbiAgbWFyZ2luOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4qOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbi8qIFJlc3RvcmUgcG9zaXRpb246IGZpeGVkIGJlaGF2aW9yIHdoZW4gaU9TIGtleWJvYXJkIGlzIG9wZW4gKi9cbmh0bWwsXG5ib2R5IHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGhlaWdodDogMTAwJTtcbn1cblxuYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuXG5lbSB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLyoqIGFwcGxpY2F0aW9uICovXG5cbmRpdi5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLyogODBweCB0b3AgcGFkZGluZyB0byBhY2NvdW50IGZvciA0MXB4IHRvb2xiYXIgKi9cbiAgcGFkZGluZzogODBweCAxNXB4IDAgMTVweDtcbn1cblxuZGl2I2V4dGVuZGVyIHtcbiAgY3Vyc29yOiB0ZXh0O1xuICBoZWlnaHQ6IDEyMHB4O1xufVxuXG5oMS5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgxLWZvbnQtc2l6ZSk7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqICsgaDEuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMzJweDtcbn1cblxuaDIuc24tZWRpdG9yIHtcbiAgZm9udC1zaXplOiB2YXIoLS1oMi1mb250LXNpemUpO1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMSArIGgyLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSkgKyBoMi5zbi1lZGl0b3Ige1xuICBtYXJnaW4tdG9wOiAyOHB4O1xufVxuXG5oMy5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgzLWZvbnQtc2l6ZSk7XG4gIGNvbG9yOiB2YXIoLS1oMy10ZXh0LWNvbG9yKTtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWgzLWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMiArIGgzLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSwgaDIpICsgaDMuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMjJweDtcbn1cblxuZGl2LlByb3NlTWlycm9yID4gcC5zbi1lZGl0b3Ige1xuICBsaW5lLWhlaWdodDogMS40O1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgdWwge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgb2wge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbnVsLFxub2wge1xuICBtYXJnaW4tbGVmdDogMjVweDtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xufVxuXG5saSB7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWRlZmF1bHQtaXRlbS1nYXApO1xufVxuXG5saSB1bCxcbmxpIG9sIHtcbiAgbWFyZ2luLXRvcDogdmFyKC0tZGVmYXVsdC1pdGVtLWdhcCk7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmNvZGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtY29udHJhc3QtYmFja2dyb3VuZC1jb2xvciwgI2VmZWZlZik7XG59XG5cbmEge1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtaW5mby1jb2xvciwgYmx1ZSk7XG59XG5cbnByZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWNvbnRyYXN0LWJhY2tncm91bmQtY29sb3IsICNlZmVmZWYpO1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xuICBwYWRkaW5nOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHJpZ2h0OiA2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdG9wOiA2cHg7XG4gIHdpZHRoOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvOmhvdmVyOmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWluZm8tY29sb3IsIHZhcigtLWNvbG9yLXByaW1hcnkpKTtcbiAgY29udGVudDogXCJUaGlzIGJsb2NrIG9mIGNvZGUgd2FzIGVkaXRlZCBpbiBhbm90aGVyIGVkaXRvciBhbmQgY29udGFpbnMgbWFya2Rvd24gZm9ybWF0dGluZyB0aGF0IFNjcmF0Y2ggZG9lc24ndCBzdXBwb3J0IHlldC4gSXQgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gbWFya2Rvd24gbm90IGFzIGEgY29kZSBibG9jayBidXQgYXMgYSBub3JtYWwgcGllY2Ugb2YgbWFya2Rvd24gdGV4dC5cIjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nOiA1cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHRvcDogMjRweDtcbiAgd2lkdGg6IDI1MHB4O1xuICB6LWluZGV4OiAyO1xufVxuXG5wcmUgY29kZSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0ge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jaGVja2xpc3QtaXRlbSArIC5jaGVja2xpc3QtaXRlbSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtY2hlY2tib3gtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtICsgKjpub3QoLmNoZWNrbGlzdC1pdGVtKSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIC5jbGljay10YXJnZXQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDMycHg7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNHB4O1xuICB3aWR0aDogMzJweDtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIGRpdi5jaGVja2JveCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogMjRweDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gIG1pbi13aWR0aDogMjRweDtcbiAgcGFkZGluZzogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0gcCB7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xufVxuXG4jdG9vbGJhci13cmFwcGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc24tc3R5bGVraXQtYm9yZGVyLWNvbG9yLCAjY2NjKTtcbiAgbGVmdDogMDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4jdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoXG4gICAgLS1zbi1zdHlsZWtpdC1zZWNvbmRhcnktY29udHJhc3QtYmFja2dyb3VuZC1jb2xvcixcbiAgICAjZWVlXG4gICk7XG59XG5cbmJ1dHRvbi5zZWxlY3RlZDphZnRlciB7XG4gIGJhY2tncm91bmQ6ICNhYWE7XG4gIGJvdHRvbTogMDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDNweDtcbiAgbGVmdDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0XSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDY1cHg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF0gaSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xufVxuXG5idXR0b25bZGF0YS1mb3JtYXQ9J2xpbmsnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J2hlYWRpbmcnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J291dGRlbnQnXTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjY2NjKTtcbiAgYm90dG9tOiA3cHg7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLyogaGFsZiB0aGUgMTBweCBtYXJnaW4gKi9cbiAgbGVmdDogLTVweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDdweDtcbiAgd2lkdGg6IDFweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTNweDtcbiAgYm90dG9tOiA4cHg7XG4gIGxlZnQ6IDIzcHg7XG4gIHJpZ2h0OiAyM3B4O1xuICBib3JkZXI6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ10gaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdD0nY29kZV9ibG9jayddIGkgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDE4cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMHB4O1xuICB0b3A6IDBweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgei1pbmRleDogMjtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106aG92ZXIgc3BhbiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcihcbiAgICAtLXNuLXN0eWxla2l0LXNlY29uZGFyeS1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLFxuICAgICNlZWVcbiAgKTtcbn1cblxuc3ZnIHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4vKiBtb2RhbCAqL1xuZGl2I2xpbmstbW9kYWwge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3R0b206IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zYW5zKTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIHRvcDogMDtcbn1cblxuZGl2I2xpbmstbW9kYWwuYWN0aXZlIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuZGl2I2ZyYW1lIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJveC1zaGFkb3c6XG4gICAgMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSxcbiAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAyMzBweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMzVweDtcbiAgd2lkdGg6IDM1MHB4O1xufVxuXG5kaXYjbGluay1tb2RhbCBpbnB1dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjODtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogNXB4IDhweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGJ1dHRvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuZGl2I2xpbmstbW9kYWwgbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGxhYmVsIGEgaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMnB4O1xuICB3aWR0aDogMTRweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LnRleHQtaW5wdXQge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LmJ1dHRvbnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyLmFjdGl2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5kaXYjbGluay1tb2RhbCBidXR0b24jY29uZmlybSB7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWJvcmRlci1jb2xvciwgI2NjYyk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTBweCk7XG4gIHBhZGRpbmc6IDZweCAxMHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAuc2hvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAgYSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5kaXYjbGluay10b29sdGlwIGRpdi50ZXh0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuZGl2I2xpbmstdG9vbHRpcCBpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsZXg6IDAgMCAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHdpZHRoOiAxNHB4O1xufVxuXG5kaXYuYXV0by1saW5rLWluZGljYXRvciB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1tb25vKSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuZGl2I2xpbmstdG9vbHRpcC55ZXMtYXV0by1saW5rIGRpdi5hdXRvLWxpbmstaW5kaWNhdG9yIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,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cm9yLXZpZXcvc3R5bGUvcHJvc2VtaXJyb3IuY3NzIiwid2VicGFjazovL3NuLXNjcmF0Y2hwYWQtZWRpdG9yLy4vc3JjL3N0eWxlcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLlByb3NlTWlycm9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uUHJvc2VNaXJyb3Ige1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgd2hpdGUtc3BhY2U6IGJyZWFrLXNwYWNlcztcbiAgLXdlYmtpdC1mb250LXZhcmlhbnQtbGlnYXR1cmVzOiBub25lO1xuICBmb250LXZhcmlhbnQtbGlnYXR1cmVzOiBub25lO1xuICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IFwibGlnYVwiIDA7IC8qIHRoZSBhYm92ZSBkb2Vzbid0IHNlZW0gdG8gd29yayBpbiBFZGdlICovXG59XG5cbi5Qcm9zZU1pcnJvciBwcmUge1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5Qcm9zZU1pcnJvciBsaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLlByb3NlTWlycm9yLWhpZGVzZWxlY3Rpb24gKjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbi5Qcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uICo6Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbi5Qcm9zZU1pcnJvci1oaWRlc2VsZWN0aW9uIHsgY2FyZXQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG5cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHJvc2VNaXJyb3IvcHJvc2VtaXJyb3IvaXNzdWVzLzE0MjEjaXNzdWVjb21tZW50LTE3NTkzMjAxOTEgKi9cbi5Qcm9zZU1pcnJvciBbZHJhZ2dhYmxlXVtjb250ZW50ZWRpdGFibGU9ZmFsc2VdIHsgdXNlci1zZWxlY3Q6IHRleHQgfVxuXG4uUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkICM4Y2Y7XG59XG5cbi8qIE1ha2Ugc3VyZSBsaSBzZWxlY3Rpb25zIHdyYXAgYXJvdW5kIG1hcmtlcnMgKi9cblxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxubGkuUHJvc2VNaXJyb3Itc2VsZWN0ZWRub2RlOmFmdGVyIHtcbiAgY29udGVudDogXCJcIjtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAtMzJweDtcbiAgcmlnaHQ6IC0ycHg7IHRvcDogLTJweDsgYm90dG9tOiAtMnB4O1xuICBib3JkZXI6IDJweCBzb2xpZCAjOGNmO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyogUHJvdGVjdCBhZ2FpbnN0IGdlbmVyaWMgaW1nIHJ1bGVzICovXG5cbmltZy5Qcm9zZU1pcnJvci1zZXBhcmF0b3Ige1xuICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XG4gIG1hcmdpbjogMCAhaW1wb3J0YW50O1xufVxuIiwiLyoqIGdsb2JhbCAqL1xuQGltcG9ydCB1cmwoJ35wcm9zZW1pcnJvci12aWV3L3N0eWxlL3Byb3NlbWlycm9yLmNzcycpO1xuXG5ib2R5IHtcbiAgLS1iYXNlLWZvbnQtc2l6ZTogMTVweDtcbiAgLS1ib3JkZXItY29sb3I6IDFweCBzb2xpZCAjY2NjO1xuICAtLWgyLWZvbnQtc2l6ZTogMTZweDtcbiAgLS1oMS1mb250LXNpemU6IDIwcHg7XG4gIC0taDMtZm9udC1zaXplOiAxNXB4O1xuICAtLWZmLXNhbnM6ICdSb2JvdG8nLCBzYW5zLXNlcmlmO1xuICAtLWZmLXNlcmlmOiAnUm9ib3RvIFNsYWInLCBzZXJpZjtcbiAgLS1mZi1tb25vOiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIC0tY29sb3ItcHJpbWFyeTogcmdiKDgsIDEwOSwgMjE0KTtcbiAgLS1kZWZhdWx0LWdhcDogMTRweDtcbiAgLS1oMy1nYXA6IDExcHg7XG4gIC0tZGVmYXVsdC1pdGVtLWdhcDogNXB4O1xuICAtLWRlZmF1bHQtY2hlY2tib3gtZ2FwOiA4cHg7XG4gIC0tdGV4dC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjkpO1xuICAtLWgzLXRleHQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LXBhcmFncmFwaC10ZXh0LWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuNykpO1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtcGFyYWdyYXBoLXRleHQtY29sb3IsIHZhcigtLXRleHQtY29sb3IpKTtcbiAgZm9udC1zaXplOiB2YXIoLS1iYXNlLWZvbnQtc2l6ZSk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zZXJpZiksIHNlcmlmO1xuICBzY3JvbGxiYXItY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LXNjcm9sbGJhci1jb2xvciwgI2NjYylcbiAgICB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgYm9keSB7XG4gICAgLS1iYXNlLWZvbnQtc2l6ZTogMTZweDtcbiAgICAtLWgyLWZvbnQtc2l6ZTogMTdweDtcbiAgICAtLWgzLWZvbnQtc2l6ZTogMTdweDtcbiAgfVxufVxuXG4qIHtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgYm9yZGVyOiAwO1xuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udDogaW5oZXJpdDtcbiAgbWFyZ2luOiAwO1xuICBvdXRsaW5lOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4qOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbi8qIFJlc3RvcmUgcG9zaXRpb246IGZpeGVkIGJlaGF2aW9yIHdoZW4gaU9TIGtleWJvYXJkIGlzIG9wZW4gKi9cbmh0bWwsXG5ib2R5IHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIGhlaWdodDogMTAwJTtcbn1cblxuYm9keSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuYnV0dG9uIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuXG5lbSB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLyoqIGFwcGxpY2F0aW9uICovXG5cbmRpdi5Qcm9zZU1pcnJvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLyogODBweCB0b3AgcGFkZGluZyB0byBhY2NvdW50IGZvciA0MXB4IHRvb2xiYXIgKi9cbiAgcGFkZGluZzogODBweCAxNXB4IDAgMTVweDtcbn1cblxuZGl2I2V4dGVuZGVyIHtcbiAgY3Vyc29yOiB0ZXh0O1xuICBoZWlnaHQ6IDEyMHB4O1xufVxuXG5oMS5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgxLWZvbnQtc2l6ZSk7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbi1ib3R0b206IDEycHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqICsgaDEuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMzJweDtcbn1cblxuaDIuc24tZWRpdG9yIHtcbiAgZm9udC1zaXplOiB2YXIoLS1oMi1mb250LXNpemUpO1xuICBmb250LXdlaWdodDogNzAwO1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMSArIGgyLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSkgKyBoMi5zbi1lZGl0b3Ige1xuICBtYXJnaW4tdG9wOiAyOHB4O1xufVxuXG5oMy5zbi1lZGl0b3Ige1xuICBmb250LXNpemU6IHZhcigtLWgzLWZvbnQtc2l6ZSk7XG4gIGNvbG9yOiB2YXIoLS1oMy10ZXh0LWNvbG9yKTtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWgzLWdhcCk7XG59XG5cbi5Qcm9zZU1pcnJvciBoMiArIGgzLnNuLWVkaXRvciB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi5Qcm9zZU1pcnJvciAqOm5vdChoMSwgaDIpICsgaDMuc24tZWRpdG9yIHtcbiAgbWFyZ2luLXRvcDogMjJweDtcbn1cblxuZGl2LlByb3NlTWlycm9yID4gcC5zbi1lZGl0b3Ige1xuICBsaW5lLWhlaWdodDogMS40O1xuICBtYXJnaW4tYm90dG9tOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgdWwge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbio6bm90KHVsLCBvbCwgaDMpICsgb2wge1xuICBtYXJnaW4tdG9wOiB2YXIoLS1kZWZhdWx0LWdhcCk7XG59XG5cbnVsLFxub2wge1xuICBtYXJnaW4tbGVmdDogMjVweDtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xufVxuXG5saSB7XG4gIG1hcmdpbi1ib3R0b206IHZhcigtLWRlZmF1bHQtaXRlbS1nYXApO1xufVxuXG5saSB1bCxcbmxpIG9sIHtcbiAgbWFyZ2luLXRvcDogdmFyKC0tZGVmYXVsdC1pdGVtLWdhcCk7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmNvZGUge1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtY29udHJhc3QtYmFja2dyb3VuZC1jb2xvciwgI2VmZWZlZik7XG59XG5cbmEge1xuICBjb2xvcjogdmFyKC0tc24tc3R5bGVraXQtaW5mby1jb2xvciwgYmx1ZSk7XG59XG5cbnByZSB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWNvbnRyYXN0LWJhY2tncm91bmQtY29sb3IsICNlZmVmZWYpO1xuICBmb250LWZhbWlseTogdmFyKC0tZmYtbW9ubyksIG1vbm9zcGFjZTtcbiAgbWFyZ2luLWJvdHRvbTogdmFyKC0tZGVmYXVsdC1nYXApO1xuICBwYWRkaW5nOiA0cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvIHtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsb2F0OiByaWdodDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHJpZ2h0OiA2cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdG9wOiA2cHg7XG4gIHdpZHRoOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cblxucHJlW2RhdGEtbWFya2Rvd25fZXNjYXBlZD0ndHJ1ZSddIGRpdi5pbmZvOmhvdmVyOmFmdGVyIHtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWluZm8tY29sb3IsIHZhcigtLWNvbG9yLXByaW1hcnkpKTtcbiAgY29udGVudDogXCJUaGlzIGJsb2NrIG9mIGNvZGUgd2FzIGVkaXRlZCBpbiBhbm90aGVyIGVkaXRvciBhbmQgY29udGFpbnMgbWFya2Rvd24gZm9ybWF0dGluZyB0aGF0IFNjcmF0Y2ggZG9lc24ndCBzdXBwb3J0IHlldC4gSXQgd2lsbCBiZSBzZXJpYWxpemVkIGludG8gbWFya2Rvd24gbm90IGFzIGEgY29kZSBibG9jayBidXQgYXMgYSBub3JtYWwgcGllY2Ugb2YgbWFya2Rvd24gdGV4dC5cIjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBwYWRkaW5nOiA1cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHRvcDogMjRweDtcbiAgd2lkdGg6IDI1MHB4O1xuICB6LWluZGV4OiAyO1xufVxuXG5wcmUgY29kZSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0ge1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgZGlzcGxheTogZmxleDtcbiAgcGFkZGluZy1sZWZ0OiAzMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5jaGVja2xpc3QtaXRlbSArIC5jaGVja2xpc3QtaXRlbSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtY2hlY2tib3gtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtICsgKjpub3QoLmNoZWNrbGlzdC1pdGVtKSB7XG4gIG1hcmdpbi10b3A6IHZhcigtLWRlZmF1bHQtZ2FwKTtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIC5jbGljay10YXJnZXQge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDMycHg7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNHB4O1xuICB3aWR0aDogMzJweDtcbn1cblxuLmNoZWNrbGlzdC1pdGVtIGRpdi5jaGVja2JveCB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGhlaWdodDogMjRweDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gIG1pbi13aWR0aDogMjRweDtcbiAgcGFkZGluZzogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xufVxuXG4uY2hlY2tsaXN0LWl0ZW0gcCB7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xufVxuXG4jdG9vbGJhci13cmFwcGVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tc24tc3R5bGVraXQtYm9yZGVyLWNvbG9yLCAjY2NjKTtcbiAgbGVmdDogMDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcG9zaXRpb246IGZpeGVkO1xuICByaWdodDogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAxO1xufVxuXG4jdG9vbGJhciB7XG4gIGRpc3BsYXk6IGZsZXg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoXG4gICAgLS1zbi1zdHlsZWtpdC1zZWNvbmRhcnktY29udHJhc3QtYmFja2dyb3VuZC1jb2xvcixcbiAgICAjZWVlXG4gICk7XG59XG5cbmJ1dHRvbi5zZWxlY3RlZDphZnRlciB7XG4gIGJhY2tncm91bmQ6ICNhYWE7XG4gIGJvdHRvbTogMDtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDNweDtcbiAgbGVmdDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0XSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICBwYWRkaW5nOiAxMHB4IDIwcHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDY1cHg7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdF0gaSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xufVxuXG5idXR0b25bZGF0YS1mb3JtYXQ9J2xpbmsnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J2hlYWRpbmcnXTpiZWZvcmUsXG5idXR0b25bZGF0YS1mb3JtYXQ9J291dGRlbnQnXTpiZWZvcmUge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjY2NjKTtcbiAgYm90dG9tOiA3cHg7XG4gIGNvbnRlbnQ6ICcnO1xuICBkaXNwbGF5OiBibG9jaztcbiAgLyogaGFsZiB0aGUgMTBweCBtYXJnaW4gKi9cbiAgbGVmdDogLTVweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDdweDtcbiAgd2lkdGg6IDFweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106YmVmb3JlIHtcbiAgY29udGVudDogJyc7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTNweDtcbiAgYm90dG9tOiA4cHg7XG4gIGxlZnQ6IDIzcHg7XG4gIHJpZ2h0OiAyM3B4O1xuICBib3JkZXI6IDJweCBzb2xpZCBjdXJyZW50Q29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ10gaSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG59XG5cbmJ1dHRvbltkYXRhLWZvcm1hdD0nY29kZV9ibG9jayddIGkgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDE4cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMHB4O1xuICB0b3A6IDBweDtcbiAgd2lkdGg6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgei1pbmRleDogMjtcbn1cblxuYnV0dG9uW2RhdGEtZm9ybWF0PSdjb2RlX2Jsb2NrJ106aG92ZXIgc3BhbiB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcihcbiAgICAtLXNuLXN0eWxla2l0LXNlY29uZGFyeS1jb250cmFzdC1iYWNrZ3JvdW5kLWNvbG9yLFxuICAgICNlZWVcbiAgKTtcbn1cblxuc3ZnIHtcbiAgZmlsbDogY3VycmVudENvbG9yO1xufVxuXG4vKiBtb2RhbCAqL1xuZGl2I2xpbmstbW9kYWwge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICBib3R0b206IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1zYW5zKTtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIHRvcDogMDtcbn1cblxuZGl2I2xpbmstbW9kYWwuYWN0aXZlIHtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuZGl2I2ZyYW1lIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc24tc3R5bGVraXQtYmFja2dyb3VuZC1jb2xvciwgd2hpdGUpO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJveC1zaGFkb3c6XG4gICAgMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSxcbiAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLFxuICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAyMzBweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHBhZGRpbmc6IDAgMzVweDtcbiAgd2lkdGg6IDM1MHB4O1xufVxuXG5kaXYjbGluay1tb2RhbCBpbnB1dCB7XG4gIGJhY2tncm91bmQ6IHZhcigtLXNuLXN0eWxla2l0LWJhY2tncm91bmQtY29sb3IsIHdoaXRlKTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjODtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogNXB4IDhweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGJ1dHRvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuZGl2I2xpbmstbW9kYWwgbGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiA0cHg7XG59XG5cbmRpdiNsaW5rLW1vZGFsIGxhYmVsIGEgaSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxNHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogMnB4O1xuICB3aWR0aDogMTRweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LnRleHQtaW5wdXQge1xuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgZGl2LmJ1dHRvbnMge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogNnB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uIHtcbiAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmc6IDRweCA4cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuZGl2I2xpbmstbW9kYWwgYnV0dG9uI2NsZWFyLmFjdGl2ZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG5kaXYjbGluay1tb2RhbCBidXR0b24jY29uZmlybSB7XG4gIGNvbG9yOiB2YXIoLS1zbi1zdHlsZWtpdC1pbmZvLWNvbG9yLCB2YXIoLS1jb2xvci1wcmltYXJ5KSk7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zbi1zdHlsZWtpdC1iYWNrZ3JvdW5kLWNvbG9yLCB3aGl0ZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXNuLXN0eWxla2l0LWJvcmRlci1jb2xvciwgI2NjYyk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIG1heC13aWR0aDogY2FsYygxMDAlIC0gMTBweCk7XG4gIHBhZGRpbmc6IDZweCAxMHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAuc2hvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbmRpdiNsaW5rLXRvb2x0aXAgYSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG5kaXYjbGluay10b29sdGlwIGRpdi50ZXh0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbn1cblxuZGl2I2xpbmstdG9vbHRpcCBpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZsZXg6IDAgMCAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIHdpZHRoOiAxNHB4O1xufVxuXG5kaXYuYXV0by1saW5rLWluZGljYXRvciB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mZi1tb25vKSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cblxuZGl2I2xpbmstdG9vbHRpcC55ZXMtYXV0by1saW5rIGRpdi5hdXRvLWxpbmstaW5kaWNhdG9yIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=*/ \ No newline at end of file diff --git a/src/ToolbarPlugin.ts b/src/ToolbarPlugin.ts index f97960f..fe48578 100644 --- a/src/ToolbarPlugin.ts +++ b/src/ToolbarPlugin.ts @@ -524,7 +524,6 @@ export class ToolbarPlugin extends Plugin { const hasMod = e.metaKey; const hasShift = e.shiftKey; - console.log('e.key', e.key); if (hasCtrl && e.key === '.') { indentListSelection(this.view.state, this.view.dispatch); return true; diff --git a/src/styles.css b/src/styles.css index 8240f17..8bb7625 100644 --- a/src/styles.css +++ b/src/styles.css @@ -16,10 +16,12 @@ body { --default-item-gap: 5px; --default-checkbox-gap: 8px; --text-color: rgba(0, 0, 0, 0.9); - --h3-text-color: rgba(0, 0, 0, 0.7); - color: var(--sn-stylekit-foreground-color, var(--text-color)); + --h3-text-color: var(--sn-stylekit-paragraph-text-color, rgba(0, 0, 0, 0.7)); + color: var(--sn-stylekit-paragraph-text-color, var(--text-color)); font-size: var(--base-font-size); font-family: var(--ff-serif), serif; + scrollbar-color: var(--sn-stylekit-scrollbar-color, #ccc) + var(--sn-stylekit-background-color, white); } @media only screen and (max-width: 720px) { From 1a1b87cad21c67632a1403b04ee32e3455577b15 Mon Sep 17 00:00:00 2001 From: Dylan Nelson Date: Mon, 20 Oct 2025 14:40:01 -0400 Subject: [PATCH 2/4] Add deployment README --- scripts/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 scripts/README.md diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..42e0fbe --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,9 @@ +To deploy the Standard Notes extension: + +1. check out a new branch in the format release-x.x.x +1. run `npm version ` so the committed version matches the branch name +1. update the fields in ext.json to point to the new version +1. run `npm run build` +1. push to GitHub and merge the branch +1. create a new release and tag matching the x.x.x version number from above +1. pull master and run scripts/deploy.sh \ No newline at end of file From 56f0d13e98447073050e24278974524009e7e6b6 Mon Sep 17 00:00:00 2001 From: Dylan Nelson Date: Mon, 20 Oct 2025 14:40:08 -0400 Subject: [PATCH 3/4] 0.0.47 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 959806e..7537198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sn-scratchpad-editor", - "version": "0.0.46", + "version": "0.0.47", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sn-scratchpad-editor", - "version": "0.0.46", + "version": "0.0.47", "license": "ISC", "dependencies": { "@standardnotes/component-relay": "^2.2.2", diff --git a/package.json b/package.json index 62a325f..d322e82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sn-scratchpad-editor", - "version": "0.0.46", + "version": "0.0.47", "description": "", "scripts": { "analyze": "npm run build:dist -- --env.analyzer", From 54bed8c98f1141e899cb5b27ec584fd20a99772f Mon Sep 17 00:00:00 2001 From: Dylan Nelson Date: Mon, 20 Oct 2025 14:42:26 -0400 Subject: [PATCH 4/4] Update manifest version --- dist/ext.json | 4 ++-- docs/ext.json | 4 ++-- scripts/README.md | 3 ++- src/ext.json | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/dist/ext.json b/dist/ext.json index 358a93a..c58fa49 100644 --- a/dist/ext.json +++ b/dist/ext.json @@ -3,11 +3,11 @@ "name": "Scratch Editor", "content_type": "SN|Component", "area": "editor-editor", - "version": "0.0.46", + "version": "0.0.47", "description": "An editor for writing things down.", "url": "https://scratch-editor.com", "hosted_url": "https://scratch-editor.com", - "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.46.zip", + "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.47.zip", "latest_url": "https://scratch-editor.com/ext.json", "marketing_url": "https://dylanonelson.github.io/sn-scratch-editor" } diff --git a/docs/ext.json b/docs/ext.json index 358a93a..c58fa49 100644 --- a/docs/ext.json +++ b/docs/ext.json @@ -3,11 +3,11 @@ "name": "Scratch Editor", "content_type": "SN|Component", "area": "editor-editor", - "version": "0.0.46", + "version": "0.0.47", "description": "An editor for writing things down.", "url": "https://scratch-editor.com", "hosted_url": "https://scratch-editor.com", - "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.46.zip", + "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.47.zip", "latest_url": "https://scratch-editor.com/ext.json", "marketing_url": "https://dylanonelson.github.io/sn-scratch-editor" } diff --git a/scripts/README.md b/scripts/README.md index 42e0fbe..b518104 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -2,8 +2,9 @@ To deploy the Standard Notes extension: 1. check out a new branch in the format release-x.x.x 1. run `npm version ` so the committed version matches the branch name -1. update the fields in ext.json to point to the new version +1. update the fields in ext.json to point to the new version, specifically the `version` and `download_url` 1. run `npm run build` +1. commit these changes as "Update manifest version" 1. push to GitHub and merge the branch 1. create a new release and tag matching the x.x.x version number from above 1. pull master and run scripts/deploy.sh \ No newline at end of file diff --git a/src/ext.json b/src/ext.json index 358a93a..c58fa49 100644 --- a/src/ext.json +++ b/src/ext.json @@ -3,11 +3,11 @@ "name": "Scratch Editor", "content_type": "SN|Component", "area": "editor-editor", - "version": "0.0.46", + "version": "0.0.47", "description": "An editor for writing things down.", "url": "https://scratch-editor.com", "hosted_url": "https://scratch-editor.com", - "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.46.zip", + "download_url": "https://github.com/dylanonelson/sn-scratch-editor/archive/0.0.47.zip", "latest_url": "https://scratch-editor.com/ext.json", "marketing_url": "https://dylanonelson.github.io/sn-scratch-editor" }