From edf346c06b3d44cfe9248b7689f24bd1729074be Mon Sep 17 00:00:00 2001 From: "michelle@shelltr.me" Date: Tue, 3 Feb 2026 10:23:07 -0800 Subject: [PATCH 1/2] [civicpatch] Add name chips --- civicpatch/src/frontend/build/bundle.js | 431 ++++++++++-------- .../src/frontend/components/basic/chip.js | 106 +++++ .../frontend/components/{ => basic}/modal.js | 0 .../src/frontend/components/hooks/index.js | 0 .../src/frontend/components/hooks/useModal.js | 63 --- .../jurisdiction-page/jurisdiction-page.js | 30 +- .../scrape-modal/name-config-form.js | 142 ++---- .../scrape-modal/scrape-modal.js | 200 ++++---- .../scrape-history/scrape-history-list.js | 2 +- 9 files changed, 522 insertions(+), 452 deletions(-) create mode 100644 civicpatch/src/frontend/components/basic/chip.js rename civicpatch/src/frontend/components/{ => basic}/modal.js (100%) delete mode 100644 civicpatch/src/frontend/components/hooks/index.js delete mode 100644 civicpatch/src/frontend/components/hooks/useModal.js diff --git a/civicpatch/src/frontend/build/bundle.js b/civicpatch/src/frontend/build/bundle.js index e2ba6b7de..20ddf6780 100644 --- a/civicpatch/src/frontend/build/bundle.js +++ b/civicpatch/src/frontend/build/bundle.js @@ -4,12 +4,12 @@ import{registerCivMap as e}from'@components'; * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const t=globalThis,i=e=>{t.emitLitDebugLogEvents&&t.dispatchEvent(new CustomEvent('lit-debug',{detail:e}))};let s,n=0;t.litIssuedWarnings??=new Set,s=(e,i)=>{i+=e?` See https://lit.dev/msg/${e} for more information.`:'',t.litIssuedWarnings.has(i)||t.litIssuedWarnings.has(e)||(console.warn(i),t.litIssuedWarnings.add(i))},queueMicrotask(()=>{s('dev-mode','Lit is in dev mode. Not recommended for production!')});const o=t.ShadyDOM?.inUse&&!0===t.ShadyDOM?.noPatch?t.ShadyDOM.wrap:e=>e,r=t.trustedTypes,a=r?r.createPolicy('lit-html',{createHTML:e=>e}):void 0,l=e=>e,c=(e,t,i)=>l,d=e=>{if(R!==c)throw new Error('Attempted to overwrite existing lit-html security policy. setSanitizeDOMValueFactory should be called at most once.');R=e},u=()=>{R=c},p=(e,t,i)=>R(e,t,i),h='$lit$',m=`lit$${Math.random().toFixed(9).slice(2)}$`,f='?'+m,g=`<${f}>`,b=document,_=()=>b.createComment(''),v=e=>null===e||'object'!=typeof e&&'function'!=typeof e,y=Array.isArray,$='[ \t\n\f\r]',w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,S=/-->/g,x=/>/g,C=new RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,'g'),k=/'/g,P=/"/g,E=/^(?:script|style|textarea|title)$/i,N=(T=1,(e,...t)=>(e.some(e=>void 0===e)&&console.warn('Some template strings are undefined.\nThis is probably caused by illegal octal escape sequences.'),t.some(e=>e?._$litStatic$)&&s('','Static values \'literal\' or \'unsafeStatic\' cannot be used as values to non-static templates.\nPlease use the static \'html\' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions'),{_$litType$:T,strings:e,values:t}));var T;const O=Symbol.for('lit-noChange'),M=Symbol.for('lit-nothing'),U=new WeakMap,j=b.createTreeWalker(b,129);let R=c;function V(e,t){if(!y(e)||!e.hasOwnProperty('raw')){let e='invalid template strings array';throw e='\n Internal Error: expected template strings to be an array\n with a \'raw\' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you\'re using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n '.trim().replace(/\n */g,'\n'),new Error(e)}return void 0!==a?a.createHTML(t):t}class D{constructor({strings:e,_$litType$:t},n){let o;this.parts=[];let a=0,l=0;const c=e.length-1,d=this.parts,[u,p]=((e,t)=>{const i=e.length-1,s=[];let n,o=2===t?'':3===t?'':'',r=w;for(let t=0;t'===l[0]?(r=n??w,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?C:'"'===l[3]?P:k):r===P||r===k?r=C:r===S||r===x?r=w:(r=C,n=void 0);console.assert(-1===c||r===C||r===k||r===P,'unexpected parse state B');const u=r===C&&e[t+1].startsWith('/>')?' ':'';o+=r===w?i+g:c>=0?(s.push(a),i.slice(0,c)+h+i.slice(c)+m+u):i+m+(-2===c?t:u)}return[V(e,o+(e[i]||'')+(2===t?'':3===t?'':'')),s]})(e,t);if(this.el=D.createElement(u,n),j.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(o=j.nextNode())&&d.length0){o.textContent=r?r.emptyScript:'';for(let i=0;i" contains a duplicate "disabled" attribute. The error was detected in the following template: \n`'+e.join('${...}')+'`');i&&i({kind:'template prep',template:this,clonableTemplate:this.el,parts:this.parts,strings:e})}static createElement(e,t){const i=b.createElement('template');return i.innerHTML=e,i}}function z(e,t,i=e,s){if(t===O)return t;let n=void 0!==s?i.__directives?.[s]:i.__directive;const o=v(t)?void 0:t._$litDirective$;return n?.constructor!==o&&(n?._$notifyDirectiveConnectionChanged?.(!1),void 0===o?n=void 0:(n=new o(e),n._$initialize(e,i,s)),void 0!==s?(i.__directives??=[])[s]=n:i.__directive=n),void 0!==n&&(t=z(e,n._$resolve(e,t.values),n,s)),t}class A{constructor(e,t){this._$parts=[],this._$disconnectableChildren=void 0,this._$template=e,this._$parent=t}get parentNode(){return this._$parent.parentNode}get _$isConnected(){return this._$parent._$isConnected}_clone(e){const{el:{content:t},parts:i}=this._$template,s=(e?.creationScope??b).importNode(t,!0);j.currentNode=s;let n=j.nextNode(),o=0,r=0,a=i[0];for(;void 0!==a;){if(o===a.index){let t;2===a.type?t=new L(n,n.nextSibling,this,e):1===a.type?t=new a.ctor(n,a.name,a.strings,this,e):6===a.type&&(t=new F(n,this,e)),this._$parts.push(t),a=i[++r]}o!==a?.index&&(n=j.nextNode(),o++)}return j.currentNode=b,s}_update(e){let t=0;for(const s of this._$parts)void 0!==s&&(i&&i({kind:'set part',part:s,value:e[t],valueIndex:t,values:e,templateInstance:this}),void 0!==s.strings?(s._$setValue(e,s,t),t+=s.strings.length-2):s._$setValue(e[t])),t++}}class L{get _$isConnected(){return this._$parent?._$isConnected??this.__isConnected}constructor(e,t,i,s){this.type=2,this._$committedValue=M,this._$disconnectableChildren=void 0,this._$startNode=e,this._$endNode=t,this._$parent=i,this.options=s,this.__isConnected=s?.isConnected??!0,this._textSanitizer=void 0}get parentNode(){let e=o(this._$startNode).parentNode;const t=this._$parent;return void 0!==t&&11===e?.nodeType&&(e=t.parentNode),e}get startNode(){return this._$startNode}get endNode(){return this._$endNode}_$setValue(e,t=this){if(null===this.parentNode)throw new Error('This `ChildPart` has no `parentNode` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit\'s control such that the part\'s marker nodes were ejected from DOM. For example, setting the element\'s `innerHTML` or `textContent` can do this.');if(e=z(this,e,t),v(e))e===M||null==e||''===e?(this._$committedValue!==M&&(i&&i({kind:'commit nothing to child',start:this._$startNode,end:this._$endNode,parent:this._$parent,options:this.options}),this._$clear()),this._$committedValue=M):e!==this._$committedValue&&e!==O&&this._commitText(e);else if(void 0!==e._$litType$)this._commitTemplateResult(e);else if(void 0!==e.nodeType){if(this.options?.host===e)return this._commitText('[probable mistake: rendered a template\'s host in itself (commonly caused by writing ${this} in a template]'),void console.warn('Attempted to render the template host',e,'inside itself. This is almost always a mistake, and in dev mode ','we render some warning text. In production however, we\'ll ','render it, which will usually result in an error, and sometimes ','in the element disappearing from the DOM.');this._commitNode(e)}else(e=>y(e)||'function'==typeof e?.[Symbol.iterator])(e)?this._commitIterable(e):this._commitText(e)}_insert(e){return o(o(this._$startNode).parentNode).insertBefore(e,this._$endNode)}_commitNode(e){if(this._$committedValue!==e){if(this._$clear(),R!==c){const e=this._$startNode.parentNode?.nodeName;if('STYLE'===e||'SCRIPT'===e){let t='Forbidden';throw t='STYLE'===e?'Lit does not support binding inside style nodes. This is a security risk, as style injection attacks can exfiltrate data and spoof UIs. Consider instead using css`...` literals to compose styles, and do dynamic styling with css custom properties, ::parts, s, and by mutating the DOM rather than stylesheets.':'Lit does not support binding inside script nodes. This is a security risk, as it could allow arbitrary code execution.',new Error(t)}}i&&i({kind:'commit node',start:this._$startNode,parent:this._$parent,value:e,options:this.options}),this._$committedValue=this._insert(e)}}_commitText(e){if(this._$committedValue!==M&&v(this._$committedValue)){const t=o(this._$startNode).nextSibling;void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}else{const t=b.createTextNode('');this._commitNode(t),void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}this._$committedValue=e}_commitTemplateResult(e){const{values:t,_$litType$:s}=e,n='number'==typeof s?this._$getTemplate(e):(void 0===s.el&&(s.el=D.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$committedValue?._$template===n)i&&i({kind:'template updating',template:n,instance:this._$committedValue,parts:this._$committedValue._$parts,options:this.options,values:t}),this._$committedValue._update(t);else{const e=new A(n,this),s=e._clone(this.options);i&&i({kind:'template instantiated',template:n,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),e._update(t),i&&i({kind:'template instantiated and updated',template:n,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),this._commitNode(s),this._$committedValue=e}}_$getTemplate(e){let t=U.get(e.strings);return void 0===t&&U.set(e.strings,t=new D(e)),t}_commitIterable(e){y(this._$committedValue)||(this._$committedValue=[],this._$clear());const t=this._$committedValue;let i,s=0;for(const n of e)s===t.length?t.push(i=new L(this._insert(_()),this._insert(_()),this,this.options)):i=t[s],i._$setValue(n),s++;s2||''!==i[0]||''!==i[1]?(this._$committedValue=new Array(i.length-1).fill(new String),this.strings=i):this._$committedValue=M,this._sanitizer=void 0}_$setValue(e,t=this,i,s){const n=this.strings;let o=!1;if(void 0===n)e=z(this,e,t,0),o=!v(e)||e!==this._$committedValue&&e!==O,o&&(this._$committedValue=e);else{const s=e;let r,a;for(e=n[0],r=0;r\` has a \`@${t}=...\` listener with invalid content. Event listeners in templates must have exactly one expression and no surrounding text.`)}_$setValue(e,t=this){if((e=z(this,e,t,0)??M)===O)return;const s=this._$committedValue,n=e===M&&s!==M||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,o=e!==M&&(s===M||n);i&&i({kind:'commit event listener',element:this.element,name:this.name,value:e,options:this.options,removeListener:n,addListener:o,oldListener:s}),n&&this.element.removeEventListener(this.name,this,s),o&&this.element.addEventListener(this.name,this,e),this._$committedValue=e}handleEvent(e){'function'==typeof this._$committedValue?this._$committedValue.call(this.options?.host??this.element,e):this._$committedValue.handleEvent(e)}}class F{constructor(e,t,i){this.element=e,this.type=6,this._$disconnectableChildren=void 0,this._$parent=t,this.options=i}get _$isConnected(){return this._$parent._$isConnected}_$setValue(e){i&&i({kind:'commit to element binding',element:this.element,value:e,options:this.options}),z(this,e)}}const H=t.litHtmlPolyfillSupportDevMode;H?.(D,L),(t.litHtmlVersions??=[]).push('3.3.1'),t.litHtmlVersions.length>1&&queueMicrotask(()=>{s('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')});const J=(e,t,s)=>{if(null==t)throw new TypeError(`The container to render into may not be ${t}`);const o=n++,r=s?.renderBefore??t;let a=r._$litPart$;if(i&&i({kind:'begin render',id:o,value:e,container:t,options:s,part:a}),void 0===a){const e=s?.renderBefore??null;r._$litPart$=a=new L(t.insertBefore(_(),e),e,void 0,s??{})}return a._$setValue(e),i&&i({kind:'end render',id:o,value:e,container:t,options:s,part:a}),a};let Q;J.setSanitizer=d,J.createSanitizer=p,J._testOnlyClearSanitizerFactoryDoNotCallOrElse=u;let Z=0;function Y(e){Q=e}function G(){Q=null,Z=0}const X=Symbol('haunted.phase'),K=Symbol('haunted.hook'),ee=Symbol('haunted.update'),te=Symbol('haunted.commit'),ie=Symbol('haunted.effects'),se=Symbol('haunted.layoutEffects'),ne='haunted.context';class oe{update;host;virtual;[K];[ie];[se];constructor(e,t){this.update=e,this.host=t,this[K]=new Map,this[ie]=[],this[se]=[]}run(e){Y(this);let t=e();return G(),t}_runEffects(e){let t=this[e];Y(this);for(let e of t)e.call(this);G()}runEffects(){this._runEffects(ie)}runLayoutEffects(){this._runEffects(se)}teardown(){this[K].forEach(e=>{'function'==typeof e.teardown&&e.teardown()})}}const re=Promise.resolve().then.bind(Promise.resolve());function ae(){let e,t=[];function i(){e=null;let i=t;t=[];for(var s=0,n=i.length;s{t.push(s),null==e&&(e=re(i))}}const le=ae(),ce=ae();class de{renderer;host;state;[X];_updateQueued;constructor(e,t){this.renderer=e,this.host=t,this.state=new oe(this.update.bind(this),t),this[X]=null,this._updateQueued=!1}update(){this._updateQueued||(le(()=>{let e=this.handlePhase(ee);ce(()=>{this.handlePhase(te,e),ce(()=>{this.handlePhase(ie)})}),this._updateQueued=!1}),this._updateQueued=!0)}handlePhase(e,t){switch(this[X]=e,e){case te:return this.commit(t),void this.runEffects(se);case ee:return this.render();case ie:return this.runEffects(ie)}}render(){return this.state.run(()=>this.renderer.call(this.host,this.host))}runEffects(e){this.state._runEffects(e)}teardown(){this.state.teardown()}}function ue(e){class t extends de{frag;constructor(e,t,i){super(e,i||t),this.frag=t}commit(t){e(t,this.frag)}}return function(e,i,s){const n=(s||i||{}).baseElement||HTMLElement,{observedAttributes:o=[],useShadowDOM:r=!0,shadowRootInit:a={}}=s||i||{};class l extends n{_scheduler;static get observedAttributes(){return e.observedAttributes||o||[]}constructor(){super(),!1===r?this._scheduler=new t(e,this):(this.attachShadow({mode:'open',...a}),this._scheduler=new t(e,this.shadowRoot,this))}connectedCallback(){this._scheduler.update()}disconnectedCallback(){this._scheduler.teardown()}attributeChangedCallback(e,t,i){if(t===i)return;let s=''===i||i;Reflect.set(this,((e='')=>e.replace(/-+([a-z])?/g,(e,t)=>t?t.toUpperCase():''))(e),s)}}const c=new Proxy(n.prototype,{getPrototypeOf:e=>e,set(e,t,i,s){let n;return t in e?(n=Object.getOwnPropertyDescriptor(e,t),n&&n.set?(n.set.call(s,i),!0):(Reflect.set(e,t,i,s),!0)):(n='symbol'==typeof t||'_'===t[0]?{enumerable:!0,configurable:!0,writable:!0,value:i}:function(e){let t=e,i=!1;return Object.freeze({enumerable:!0,configurable:!0,get:()=>t,set(e){i&&t===e||(i=!0,t=e,this._scheduler&&this._scheduler.update())}})}(i),Object.defineProperty(s,t,n),n.set&&n.set.call(s,i),!0)}});return Object.setPrototypeOf(l.prototype,c),l}}class pe{id;state;constructor(e,t){this.id=e,this.state=t}}function he(e,...t){let i=Z++,s=Q[K],n=s.get(i);return n||(n=new e(i,Q,...t),s.set(i,n)),n.update(...t)}function me(e){return he.bind(null,e)}function fe(e){return me(class extends pe{callback;lastValues;values;_teardown;constructor(t,i,s,n){super(t,i),e(i,this)}update(e,t){this.callback=e,this.values=t}call(){const e=!this.values||this.hasChanged();this.lastValues=this.values,e&&this.run()}run(){this.teardown(),this._teardown=this.callback.call(this.state)}teardown(){'function'==typeof this._teardown&&this._teardown()}hasChanged(){return!this.lastValues||this.values.some((e,t)=>this.lastValues[t]!==e)}})}function ge(e,t){e[ie].push(t)}const be=fe(ge),_e=me(class extends pe{Context;value;_ranEffect;_unsubscribe;constructor(e,t,i){super(e,t),this._updater=this._updater.bind(this),this._ranEffect=!1,this._unsubscribe=null,ge(t,this)}update(e){if(this.state.virtual)throw new Error('can\'t be used with virtual components');return this.Context!==e&&(this._subscribe(e),this.Context=e),this.value}call(){this._ranEffect||(this._ranEffect=!0,this._unsubscribe&&this._unsubscribe(),this._subscribe(this.Context),this.state.update())}_updater(e){this.value=e,this.state.update()}_subscribe(e){const t={Context:e,callback:this._updater};this.state.host.dispatchEvent(new CustomEvent(ne,{detail:t,bubbles:!0,cancelable:!0,composed:!0}));const{unsubscribe:i=null,value:s}=t;this.value=i?s:e.defaultValue,this._unsubscribe=i}teardown(){this._unsubscribe&&this._unsubscribe()}});const ve=me(class extends pe{value;values;constructor(e,t,i,s){super(e,t),this.value=i(),this.values=s}update(e,t){return this.hasChanged(t)&&(this.values=t,this.value=e()),this.value}hasChanged(e=[]){return e.some((e,t)=>this.values[t]!==e)}}),ye=(e,t)=>ve(()=>e,t);fe(function(e,t){e[se].push(t)});const $e=me(class extends pe{args;constructor(e,t,i){if(super(e,t),this.updater=this.updater.bind(this),'function'==typeof i){i=i()}this.makeArgs(i)}update(){return this.args}updater(e){const[t]=this.args;if('function'==typeof e){e=e(t)}Object.is(t,e)||(this.makeArgs(e),this.state.update())}makeArgs(e){this.args=Object.freeze([e,this.updater])}}); +const t=globalThis,i=e=>{t.emitLitDebugLogEvents&&t.dispatchEvent(new CustomEvent('lit-debug',{detail:e}))};let s,o=0;t.litIssuedWarnings??=new Set,s=(e,i)=>{i+=e?` See https://lit.dev/msg/${e} for more information.`:'',t.litIssuedWarnings.has(i)||t.litIssuedWarnings.has(e)||(console.warn(i),t.litIssuedWarnings.add(i))},queueMicrotask(()=>{s('dev-mode','Lit is in dev mode. Not recommended for production!')});const n=t.ShadyDOM?.inUse&&!0===t.ShadyDOM?.noPatch?t.ShadyDOM.wrap:e=>e,r=t.trustedTypes,a=r?r.createPolicy('lit-html',{createHTML:e=>e}):void 0,l=e=>e,c=(e,t,i)=>l,d=e=>{if(D!==c)throw new Error('Attempted to overwrite existing lit-html security policy. setSanitizeDOMValueFactory should be called at most once.');D=e},u=()=>{D=c},p=(e,t,i)=>D(e,t,i),h='$lit$',m=`lit$${Math.random().toFixed(9).slice(2)}$`,f='?'+m,g=`<${f}>`,b=document,_=()=>b.createComment(''),v=e=>null===e||'object'!=typeof e&&'function'!=typeof e,y=Array.isArray,$='[ \t\n\f\r]',w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,S=/-->/g,x=/>/g,C=new RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,'g'),k=/'/g,P=/"/g,E=/^(?:script|style|textarea|title)$/i,T=(O=1,(e,...t)=>(e.some(e=>void 0===e)&&console.warn('Some template strings are undefined.\nThis is probably caused by illegal octal escape sequences.'),t.some(e=>e?._$litStatic$)&&s('','Static values \'literal\' or \'unsafeStatic\' cannot be used as values to non-static templates.\nPlease use the static \'html\' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions'),{_$litType$:O,strings:e,values:t}));var O;const N=Symbol.for('lit-noChange'),M=Symbol.for('lit-nothing'),U=new WeakMap,j=b.createTreeWalker(b,129);let D=c;function V(e,t){if(!y(e)||!e.hasOwnProperty('raw')){let e='invalid template strings array';throw e='\n Internal Error: expected template strings to be an array\n with a \'raw\' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you\'re using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n '.trim().replace(/\n */g,'\n'),new Error(e)}return void 0!==a?a.createHTML(t):t}class R{constructor({strings:e,_$litType$:t},o){let n;this.parts=[];let a=0,l=0;const c=e.length-1,d=this.parts,[u,p]=((e,t)=>{const i=e.length-1,s=[];let o,n=2===t?'':3===t?'':'',r=w;for(let t=0;t'===l[0]?(r=o??w,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?C:'"'===l[3]?P:k):r===P||r===k?r=C:r===S||r===x?r=w:(r=C,o=void 0);console.assert(-1===c||r===C||r===k||r===P,'unexpected parse state B');const u=r===C&&e[t+1].startsWith('/>')?' ':'';n+=r===w?i+g:c>=0?(s.push(a),i.slice(0,c)+h+i.slice(c)+m+u):i+m+(-2===c?t:u)}return[V(e,n+(e[i]||'')+(2===t?'':3===t?'':'')),s]})(e,t);if(this.el=R.createElement(u,o),j.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=j.nextNode())&&d.length0){n.textContent=r?r.emptyScript:'';for(let i=0;i" contains a duplicate "disabled" attribute. The error was detected in the following template: \n`'+e.join('${...}')+'`');i&&i({kind:'template prep',template:this,clonableTemplate:this.el,parts:this.parts,strings:e})}static createElement(e,t){const i=b.createElement('template');return i.innerHTML=e,i}}function z(e,t,i=e,s){if(t===N)return t;let o=void 0!==s?i.__directives?.[s]:i.__directive;const n=v(t)?void 0:t._$litDirective$;return o?.constructor!==n&&(o?._$notifyDirectiveConnectionChanged?.(!1),void 0===n?o=void 0:(o=new n(e),o._$initialize(e,i,s)),void 0!==s?(i.__directives??=[])[s]=o:i.__directive=o),void 0!==o&&(t=z(e,o._$resolve(e,t.values),o,s)),t}class A{constructor(e,t){this._$parts=[],this._$disconnectableChildren=void 0,this._$template=e,this._$parent=t}get parentNode(){return this._$parent.parentNode}get _$isConnected(){return this._$parent._$isConnected}_clone(e){const{el:{content:t},parts:i}=this._$template,s=(e?.creationScope??b).importNode(t,!0);j.currentNode=s;let o=j.nextNode(),n=0,r=0,a=i[0];for(;void 0!==a;){if(n===a.index){let t;2===a.type?t=new L(o,o.nextSibling,this,e):1===a.type?t=new a.ctor(o,a.name,a.strings,this,e):6===a.type&&(t=new B(o,this,e)),this._$parts.push(t),a=i[++r]}n!==a?.index&&(o=j.nextNode(),n++)}return j.currentNode=b,s}_update(e){let t=0;for(const s of this._$parts)void 0!==s&&(i&&i({kind:'set part',part:s,value:e[t],valueIndex:t,values:e,templateInstance:this}),void 0!==s.strings?(s._$setValue(e,s,t),t+=s.strings.length-2):s._$setValue(e[t])),t++}}class L{get _$isConnected(){return this._$parent?._$isConnected??this.__isConnected}constructor(e,t,i,s){this.type=2,this._$committedValue=M,this._$disconnectableChildren=void 0,this._$startNode=e,this._$endNode=t,this._$parent=i,this.options=s,this.__isConnected=s?.isConnected??!0,this._textSanitizer=void 0}get parentNode(){let e=n(this._$startNode).parentNode;const t=this._$parent;return void 0!==t&&11===e?.nodeType&&(e=t.parentNode),e}get startNode(){return this._$startNode}get endNode(){return this._$endNode}_$setValue(e,t=this){if(null===this.parentNode)throw new Error('This `ChildPart` has no `parentNode` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit\'s control such that the part\'s marker nodes were ejected from DOM. For example, setting the element\'s `innerHTML` or `textContent` can do this.');if(e=z(this,e,t),v(e))e===M||null==e||''===e?(this._$committedValue!==M&&(i&&i({kind:'commit nothing to child',start:this._$startNode,end:this._$endNode,parent:this._$parent,options:this.options}),this._$clear()),this._$committedValue=M):e!==this._$committedValue&&e!==N&&this._commitText(e);else if(void 0!==e._$litType$)this._commitTemplateResult(e);else if(void 0!==e.nodeType){if(this.options?.host===e)return this._commitText('[probable mistake: rendered a template\'s host in itself (commonly caused by writing ${this} in a template]'),void console.warn('Attempted to render the template host',e,'inside itself. This is almost always a mistake, and in dev mode ','we render some warning text. In production however, we\'ll ','render it, which will usually result in an error, and sometimes ','in the element disappearing from the DOM.');this._commitNode(e)}else(e=>y(e)||'function'==typeof e?.[Symbol.iterator])(e)?this._commitIterable(e):this._commitText(e)}_insert(e){return n(n(this._$startNode).parentNode).insertBefore(e,this._$endNode)}_commitNode(e){if(this._$committedValue!==e){if(this._$clear(),D!==c){const e=this._$startNode.parentNode?.nodeName;if('STYLE'===e||'SCRIPT'===e){let t='Forbidden';throw t='STYLE'===e?'Lit does not support binding inside style nodes. This is a security risk, as style injection attacks can exfiltrate data and spoof UIs. Consider instead using css`...` literals to compose styles, and do dynamic styling with css custom properties, ::parts, s, and by mutating the DOM rather than stylesheets.':'Lit does not support binding inside script nodes. This is a security risk, as it could allow arbitrary code execution.',new Error(t)}}i&&i({kind:'commit node',start:this._$startNode,parent:this._$parent,value:e,options:this.options}),this._$committedValue=this._insert(e)}}_commitText(e){if(this._$committedValue!==M&&v(this._$committedValue)){const t=n(this._$startNode).nextSibling;void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}else{const t=b.createTextNode('');this._commitNode(t),void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}this._$committedValue=e}_commitTemplateResult(e){const{values:t,_$litType$:s}=e,o='number'==typeof s?this._$getTemplate(e):(void 0===s.el&&(s.el=R.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$committedValue?._$template===o)i&&i({kind:'template updating',template:o,instance:this._$committedValue,parts:this._$committedValue._$parts,options:this.options,values:t}),this._$committedValue._update(t);else{const e=new A(o,this),s=e._clone(this.options);i&&i({kind:'template instantiated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),e._update(t),i&&i({kind:'template instantiated and updated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),this._commitNode(s),this._$committedValue=e}}_$getTemplate(e){let t=U.get(e.strings);return void 0===t&&U.set(e.strings,t=new R(e)),t}_commitIterable(e){y(this._$committedValue)||(this._$committedValue=[],this._$clear());const t=this._$committedValue;let i,s=0;for(const o of e)s===t.length?t.push(i=new L(this._insert(_()),this._insert(_()),this,this.options)):i=t[s],i._$setValue(o),s++;s2||''!==i[0]||''!==i[1]?(this._$committedValue=new Array(i.length-1).fill(new String),this.strings=i):this._$committedValue=M,this._sanitizer=void 0}_$setValue(e,t=this,i,s){const o=this.strings;let n=!1;if(void 0===o)e=z(this,e,t,0),n=!v(e)||e!==this._$committedValue&&e!==N,n&&(this._$committedValue=e);else{const s=e;let r,a;for(e=o[0],r=0;r\` has a \`@${t}=...\` listener with invalid content. Event listeners in templates must have exactly one expression and no surrounding text.`)}_$setValue(e,t=this){if((e=z(this,e,t,0)??M)===N)return;const s=this._$committedValue,o=e===M&&s!==M||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,n=e!==M&&(s===M||o);i&&i({kind:'commit event listener',element:this.element,name:this.name,value:e,options:this.options,removeListener:o,addListener:n,oldListener:s}),o&&this.element.removeEventListener(this.name,this,s),n&&this.element.addEventListener(this.name,this,e),this._$committedValue=e}handleEvent(e){'function'==typeof this._$committedValue?this._$committedValue.call(this.options?.host??this.element,e):this._$committedValue.handleEvent(e)}}class B{constructor(e,t,i){this.element=e,this.type=6,this._$disconnectableChildren=void 0,this._$parent=t,this.options=i}get _$isConnected(){return this._$parent._$isConnected}_$setValue(e){i&&i({kind:'commit to element binding',element:this.element,value:e,options:this.options}),z(this,e)}}const H=t.litHtmlPolyfillSupportDevMode;H?.(R,L),(t.litHtmlVersions??=[]).push('3.3.1'),t.litHtmlVersions.length>1&&queueMicrotask(()=>{s('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')});const J=(e,t,s)=>{if(null==t)throw new TypeError(`The container to render into may not be ${t}`);const n=o++,r=s?.renderBefore??t;let a=r._$litPart$;if(i&&i({kind:'begin render',id:n,value:e,container:t,options:s,part:a}),void 0===a){const e=s?.renderBefore??null;r._$litPart$=a=new L(t.insertBefore(_(),e),e,void 0,s??{})}return a._$setValue(e),i&&i({kind:'end render',id:n,value:e,container:t,options:s,part:a}),a};let Q;J.setSanitizer=d,J.createSanitizer=p,J._testOnlyClearSanitizerFactoryDoNotCallOrElse=u;let Z=0;function Y(e){Q=e}function G(){Q=null,Z=0}const X=Symbol('haunted.phase'),K=Symbol('haunted.hook'),ee=Symbol('haunted.update'),te=Symbol('haunted.commit'),ie=Symbol('haunted.effects'),se=Symbol('haunted.layoutEffects'),oe='haunted.context';class ne{update;host;virtual;[K];[ie];[se];constructor(e,t){this.update=e,this.host=t,this[K]=new Map,this[ie]=[],this[se]=[]}run(e){Y(this);let t=e();return G(),t}_runEffects(e){let t=this[e];Y(this);for(let e of t)e.call(this);G()}runEffects(){this._runEffects(ie)}runLayoutEffects(){this._runEffects(se)}teardown(){this[K].forEach(e=>{'function'==typeof e.teardown&&e.teardown()})}}const re=Promise.resolve().then.bind(Promise.resolve());function ae(){let e,t=[];function i(){e=null;let i=t;t=[];for(var s=0,o=i.length;s{t.push(s),null==e&&(e=re(i))}}const le=ae(),ce=ae();class de{renderer;host;state;[X];_updateQueued;constructor(e,t){this.renderer=e,this.host=t,this.state=new ne(this.update.bind(this),t),this[X]=null,this._updateQueued=!1}update(){this._updateQueued||(le(()=>{let e=this.handlePhase(ee);ce(()=>{this.handlePhase(te,e),ce(()=>{this.handlePhase(ie)})}),this._updateQueued=!1}),this._updateQueued=!0)}handlePhase(e,t){switch(this[X]=e,e){case te:return this.commit(t),void this.runEffects(se);case ee:return this.render();case ie:return this.runEffects(ie)}}render(){return this.state.run(()=>this.renderer.call(this.host,this.host))}runEffects(e){this.state._runEffects(e)}teardown(){this.state.teardown()}}function ue(e){class t extends de{frag;constructor(e,t,i){super(e,i||t),this.frag=t}commit(t){e(t,this.frag)}}return function(e,i,s){const o=(s||i||{}).baseElement||HTMLElement,{observedAttributes:n=[],useShadowDOM:r=!0,shadowRootInit:a={}}=s||i||{};class l extends o{_scheduler;static get observedAttributes(){return e.observedAttributes||n||[]}constructor(){super(),!1===r?this._scheduler=new t(e,this):(this.attachShadow({mode:'open',...a}),this._scheduler=new t(e,this.shadowRoot,this))}connectedCallback(){this._scheduler.update()}disconnectedCallback(){this._scheduler.teardown()}attributeChangedCallback(e,t,i){if(t===i)return;let s=''===i||i;Reflect.set(this,((e='')=>e.replace(/-+([a-z])?/g,(e,t)=>t?t.toUpperCase():''))(e),s)}}const c=new Proxy(o.prototype,{getPrototypeOf:e=>e,set(e,t,i,s){let o;return t in e?(o=Object.getOwnPropertyDescriptor(e,t),o&&o.set?(o.set.call(s,i),!0):(Reflect.set(e,t,i,s),!0)):(o='symbol'==typeof t||'_'===t[0]?{enumerable:!0,configurable:!0,writable:!0,value:i}:function(e){let t=e,i=!1;return Object.freeze({enumerable:!0,configurable:!0,get:()=>t,set(e){i&&t===e||(i=!0,t=e,this._scheduler&&this._scheduler.update())}})}(i),Object.defineProperty(s,t,o),o.set&&o.set.call(s,i),!0)}});return Object.setPrototypeOf(l.prototype,c),l}}class pe{id;state;constructor(e,t){this.id=e,this.state=t}}function he(e,...t){let i=Z++,s=Q[K],o=s.get(i);return o||(o=new e(i,Q,...t),s.set(i,o)),o.update(...t)}function me(e){return he.bind(null,e)}function fe(e){return me(class extends pe{callback;lastValues;values;_teardown;constructor(t,i,s,o){super(t,i),e(i,this)}update(e,t){this.callback=e,this.values=t}call(){const e=!this.values||this.hasChanged();this.lastValues=this.values,e&&this.run()}run(){this.teardown(),this._teardown=this.callback.call(this.state)}teardown(){'function'==typeof this._teardown&&this._teardown()}hasChanged(){return!this.lastValues||this.values.some((e,t)=>this.lastValues[t]!==e)}})}function ge(e,t){e[ie].push(t)}const be=fe(ge),_e=me(class extends pe{Context;value;_ranEffect;_unsubscribe;constructor(e,t,i){super(e,t),this._updater=this._updater.bind(this),this._ranEffect=!1,this._unsubscribe=null,ge(t,this)}update(e){if(this.state.virtual)throw new Error('can\'t be used with virtual components');return this.Context!==e&&(this._subscribe(e),this.Context=e),this.value}call(){this._ranEffect||(this._ranEffect=!0,this._unsubscribe&&this._unsubscribe(),this._subscribe(this.Context),this.state.update())}_updater(e){this.value=e,this.state.update()}_subscribe(e){const t={Context:e,callback:this._updater};this.state.host.dispatchEvent(new CustomEvent(oe,{detail:t,bubbles:!0,cancelable:!0,composed:!0}));const{unsubscribe:i=null,value:s}=t;this.value=i?s:e.defaultValue,this._unsubscribe=i}teardown(){this._unsubscribe&&this._unsubscribe()}});const ve=me(class extends pe{value;values;constructor(e,t,i,s){super(e,t),this.value=i(),this.values=s}update(e,t){return this.hasChanged(t)&&(this.values=t,this.value=e()),this.value}hasChanged(e=[]){return e.some((e,t)=>this.values[t]!==e)}}),ye=(e,t)=>ve(()=>e,t);fe(function(e,t){e[se].push(t)});const $e=me(class extends pe{args;constructor(e,t,i){if(super(e,t),this.updater=this.updater.bind(this),'function'==typeof i){i=i()}this.makeArgs(i)}update(){return this.args}updater(e){const[t]=this.args;if('function'==typeof e){e=e(t)}Object.is(t,e)||(this.makeArgs(e),this.state.update())}makeArgs(e){this.args=Object.freeze([e,this.updater])}}); /** * @license * Portions Copyright 2021 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */Promise.resolve(),me(class extends pe{reducer;currentState;constructor(e,t,i,s,n){super(e,t),this.dispatch=this.dispatch.bind(this),this.currentState=void 0!==n?n(s):s}update(e){return this.reducer=e,[this.currentState,this.dispatch]}dispatch(e){this.currentState=this.reducer(this.currentState,e),this.state.update()}}); + */Promise.resolve(),me(class extends pe{reducer;currentState;constructor(e,t,i,s,o){super(e,t),this.dispatch=this.dispatch.bind(this),this.currentState=void 0!==o?o(s):s}update(e){return this.reducer=e,[this.currentState,this.dispatch]}dispatch(e){this.currentState=this.reducer(this.currentState,e),this.state.update()}}); /** * @license * Copyright 2017 Google LLC @@ -20,12 +20,12 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i * @license * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const xe=globalThis,Ce=xe.ShadowRoot&&(void 0===xe.ShadyCSS||xe.ShadyCSS.nativeShadow)&&'adoptedStyleSheets'in Document.prototype&&'replace'in CSSStyleSheet.prototype,ke=Symbol(),Pe=new WeakMap;class Ee{constructor(e,t,i){if(this._$cssResult$=!0,i!==ke)throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');this.cssText=e,this._strings=t}get styleSheet(){let e=this._styleSheet;const t=this._strings;if(Ce&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=Pe.get(t)),void 0===e&&((this._styleSheet=e=new CSSStyleSheet).replaceSync(this.cssText),i&&Pe.set(t,e))}return e}toString(){return this.cssText}}const Ne=e=>{let t='';for(const i of e.cssRules)t+=i.cssText;return new Ee('string'==typeof(i=t)?i:String(i),void 0,ke);var i},Te=Ce?e=>e:e=>e instanceof CSSStyleSheet?Ne(e):e,{is:Oe,defineProperty:Me,getOwnPropertyDescriptor:Ue,getOwnPropertyNames:je,getOwnPropertySymbols:Re,getPrototypeOf:Ve}=Object,De=globalThis;let ze;const Ae=De.trustedTypes,Le=Ae?Ae.emptyScript:'',Ie=De.reactiveElementPolyfillSupportDevMode;De.litIssuedWarnings??=new Set,ze=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,De.litIssuedWarnings.has(t)||De.litIssuedWarnings.has(e)||(console.warn(t),De.litIssuedWarnings.add(t))},queueMicrotask(()=>{ze('dev-mode','Lit is in dev mode. Not recommended for production!'),De.ShadyDOM?.inUse&&void 0===Ie&&ze('polyfill-support-missing','Shadow DOM is being polyfilled via `ShadyDOM` but the `polyfill-support` module has not been loaded.')});const We=(e,t)=>e,qe={toAttribute(e,t){switch(t){case Boolean:e=e?Le:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},Be=(e,t)=>!Oe(e,t),Fe={attribute:!0,type:String,converter:qe,reflect:!1,useDefault:!1,hasChanged:Be};Symbol.metadata??=Symbol('metadata'),De.litPropertyMetadata??=new WeakMap;class He extends HTMLElement{static addInitializer(e){this.__prepare(),(this._initializers??=[]).push(e)}static get observedAttributes(){return this.finalize(),this.__attributeToPropertyMap&&[...this.__attributeToPropertyMap.keys()]}static createProperty(e,t=Fe){if(t.state&&(t.attribute=!1),this.__prepare(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol.for(`${String(e)} (@property() cache)`),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&Me(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:n}=Ue(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};if(null==s){if('value'in(Ue(this.prototype,e)??{}))throw new Error(`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it's actually declared as a value on the prototype. Usually this is due to using @property or @state on a method.`);ze('reactive-property-without-getter',`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it does not have a getter. This will be an error in a future version of Lit.`)}return{get:s,set(t){const o=s?.call(this);n?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Fe}static __prepare(){if(this.hasOwnProperty(We('elementProperties')))return;const e=Ve(this);e.finalize(),void 0!==e._initializers&&(this._initializers=[...e._initializers]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(We('finalized')))return;if(this.finalized=!0,this.__prepare(),this.hasOwnProperty(We('properties'))){const e=this.properties,t=[...je(e),...Re(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this.__attributeToPropertyMap=new Map;for(const[e,t]of this.elementProperties){const i=this.__attributeNameForProperty(e,t);void 0!==i&&this.__attributeToPropertyMap.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles),this.hasOwnProperty('createProperty')&&ze('no-override-create-property','Overriding ReactiveElement.createProperty() is deprecated. The override will not be called with standard decorators'),this.hasOwnProperty('getPropertyDescriptor')&&ze('no-override-get-property-descriptor','Overriding ReactiveElement.getPropertyDescriptor() is deprecated. The override will not be called with standard decorators')}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(Te(e))}else void 0!==e&&t.push(Te(e));return t}static __attributeNameForProperty(e,t){const i=t.attribute;return!1===i?void 0:'string'==typeof i?i:'string'==typeof e?e.toLowerCase():void 0}constructor(){super(),this.__instanceProperties=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.__reflectingProperty=null,this.__initialize()}__initialize(){this.__updatePromise=new Promise(e=>this.enableUpdating=e),this._$changedProperties=new Map,this.__saveInstanceProperties(),this.requestUpdate(),this.constructor._initializers?.forEach(e=>e(this))}addController(e){(this.__controllers??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this.__controllers?.delete(e)}__saveInstanceProperties(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this.__instanceProperties=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((e,t)=>{if(Ce)e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const i of t){const t=document.createElement('style'),s=xe.litNonce;void 0!==s&&t.setAttribute('nonce',s),t.textContent=i.cssText,e.appendChild(t)}})(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.__controllers?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this.__controllers?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$attributeToProperty(e,i)}__propertyToAttribute(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor.__attributeNameForProperty(e,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:qe).toAttribute(t,i.type);this.constructor.enabledWarnings.includes('migration')&&void 0===n&&ze('undefined-attribute-value',`The attribute value for the ${e} property is undefined on element ${this.localName}. The attribute will be removed, but in the previous version of \`ReactiveElement\`, the attribute would not have changed.`),this.__reflectingProperty=e,null==n?this.removeAttribute(s):this.setAttribute(s,n),this.__reflectingProperty=null}}_$attributeToProperty(e,t){const i=this.constructor,s=i.__attributeToPropertyMap.get(e);if(void 0!==s&&this.__reflectingProperty!==s){const e=i.getPropertyOptions(s),n='function'==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:qe;this.__reflectingProperty=s;const o=n.fromAttribute(t,e.type);this[s]=o??this.__defaultValues?.get(s)??o,this.__reflectingProperty=null}}requestUpdate(e,t,i){if(void 0!==e){e instanceof Event&&ze('','The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()');const s=this.constructor,n=this[e];i??=s.getPropertyOptions(e);if(!((i.hasChanged??Be)(n,t)||i.useDefault&&i.reflect&&n===this.__defaultValues?.get(e)&&!this.hasAttribute(s.__attributeNameForProperty(e,i))))return;this._$changeProperty(e,t,i)}!1===this.isUpdatePending&&(this.__updatePromise=this.__enqueueUpdate())}_$changeProperty(e,t,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this.__defaultValues??=new Map).has(e)&&(this.__defaultValues.set(e,o??t??this[e]),!0!==n||void 0!==o)||(this._$changedProperties.has(e)||(this.hasUpdated||i||(t=void 0),this._$changedProperties.set(e,t)),!0===s&&this.__reflectingProperty!==e&&(this.__reflectingProperties??=new Set).add(e))}async __enqueueUpdate(){this.isUpdatePending=!0;try{await this.__updatePromise}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){const e=this.performUpdate();return this.constructor.enabledWarnings.includes('async-perform-update')&&'function'==typeof e?.then&&ze('async-perform-update',`Element ${this.localName} returned a Promise from performUpdate(). This behavior is deprecated and will be removed in a future version of ReactiveElement.`),e}performUpdate(){if(!this.isUpdatePending)return;var e;if(e={kind:'update'},De.emitLitDebugLogEvents&&De.dispatchEvent(new CustomEvent('lit-debug',{detail:e})),!this.hasUpdated){this.renderRoot??=this.createRenderRoot();{const e=[...this.constructor.elementProperties.keys()].filter(e=>this.hasOwnProperty(e)&&e in Ve(this));if(e.length)throw new Error(`The following properties on element ${this.localName} will not trigger updates as expected because they are set using class fields: ${e.join(', ')}. Native class fields and some compiled output will overwrite accessors used for detecting changes. See https://lit.dev/msg/class-field-shadowing for more information.`)}if(this.__instanceProperties){for(const[e,t]of this.__instanceProperties)this[e]=t;this.__instanceProperties=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$changedProperties.has(t)||void 0===s||this._$changeProperty(t,void 0,i,s)}}let t=!1;const i=this._$changedProperties;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),this.__controllers?.forEach(e=>e.hostUpdate?.()),this.update(i)):this.__markUpdated()}catch(e){throw t=!1,this.__markUpdated(),e}t&&this._$didUpdate(i)}willUpdate(e){}_$didUpdate(e){this.__controllers?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e),this.isUpdatePending&&this.constructor.enabledWarnings.includes('change-in-update')&&ze('change-in-update',`Element ${this.localName} scheduled an update (generally because a property was set) after an update completed, causing a new update to be scheduled. This is inefficient and should be avoided unless the next update can only be scheduled as a side effect of the previous update.`)}__markUpdated(){this._$changedProperties=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.__updatePromise}shouldUpdate(e){return!0}update(e){this.__reflectingProperties&&=this.__reflectingProperties.forEach(e=>this.__propertyToAttribute(e,this[e])),this.__markUpdated()}updated(e){}firstUpdated(e){}}He.elementStyles=[],He.shadowRootOptions={mode:'open'},He[We('elementProperties')]=new Map,He[We('finalized')]=new Map,Ie?.({ReactiveElement:He});{He.enabledWarnings=['change-in-update','async-perform-update'];const e=e=>{e.hasOwnProperty(We('enabledWarnings'))||(e.enabledWarnings=e.enabledWarnings.slice())};He.enableWarning=function(t){e(this),this.enabledWarnings.includes(t)||this.enabledWarnings.push(t)},He.disableWarning=function(t){e(this);const i=this.enabledWarnings.indexOf(t);i>=0&&this.enabledWarnings.splice(i,1)}}(De.reactiveElementVersions??=[]).push('2.1.1'),De.reactiveElementVersions.length>1&&queueMicrotask(()=>{ze('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) + */const xe=globalThis,Ce=xe.ShadowRoot&&(void 0===xe.ShadyCSS||xe.ShadyCSS.nativeShadow)&&'adoptedStyleSheets'in Document.prototype&&'replace'in CSSStyleSheet.prototype,ke=Symbol(),Pe=new WeakMap;class Ee{constructor(e,t,i){if(this._$cssResult$=!0,i!==ke)throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');this.cssText=e,this._strings=t}get styleSheet(){let e=this._styleSheet;const t=this._strings;if(Ce&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=Pe.get(t)),void 0===e&&((this._styleSheet=e=new CSSStyleSheet).replaceSync(this.cssText),i&&Pe.set(t,e))}return e}toString(){return this.cssText}}const Te=e=>{let t='';for(const i of e.cssRules)t+=i.cssText;return new Ee('string'==typeof(i=t)?i:String(i),void 0,ke);var i},Oe=Ce?e=>e:e=>e instanceof CSSStyleSheet?Te(e):e,{is:Ne,defineProperty:Me,getOwnPropertyDescriptor:Ue,getOwnPropertyNames:je,getOwnPropertySymbols:De,getPrototypeOf:Ve}=Object,Re=globalThis;let ze;const Ae=Re.trustedTypes,Le=Ae?Ae.emptyScript:'',Ie=Re.reactiveElementPolyfillSupportDevMode;Re.litIssuedWarnings??=new Set,ze=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Re.litIssuedWarnings.has(t)||Re.litIssuedWarnings.has(e)||(console.warn(t),Re.litIssuedWarnings.add(t))},queueMicrotask(()=>{ze('dev-mode','Lit is in dev mode. Not recommended for production!'),Re.ShadyDOM?.inUse&&void 0===Ie&&ze('polyfill-support-missing','Shadow DOM is being polyfilled via `ShadyDOM` but the `polyfill-support` module has not been loaded.')});const We=(e,t)=>e,qe={toAttribute(e,t){switch(t){case Boolean:e=e?Le:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},Fe=(e,t)=>!Ne(e,t),Be={attribute:!0,type:String,converter:qe,reflect:!1,useDefault:!1,hasChanged:Fe};Symbol.metadata??=Symbol('metadata'),Re.litPropertyMetadata??=new WeakMap;class He extends HTMLElement{static addInitializer(e){this.__prepare(),(this._initializers??=[]).push(e)}static get observedAttributes(){return this.finalize(),this.__attributeToPropertyMap&&[...this.__attributeToPropertyMap.keys()]}static createProperty(e,t=Be){if(t.state&&(t.attribute=!1),this.__prepare(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol.for(`${String(e)} (@property() cache)`),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&Me(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:o}=Ue(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};if(null==s){if('value'in(Ue(this.prototype,e)??{}))throw new Error(`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it's actually declared as a value on the prototype. Usually this is due to using @property or @state on a method.`);ze('reactive-property-without-getter',`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it does not have a getter. This will be an error in a future version of Lit.`)}return{get:s,set(t){const n=s?.call(this);o?.call(this,t),this.requestUpdate(e,n,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Be}static __prepare(){if(this.hasOwnProperty(We('elementProperties')))return;const e=Ve(this);e.finalize(),void 0!==e._initializers&&(this._initializers=[...e._initializers]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(We('finalized')))return;if(this.finalized=!0,this.__prepare(),this.hasOwnProperty(We('properties'))){const e=this.properties,t=[...je(e),...De(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this.__attributeToPropertyMap=new Map;for(const[e,t]of this.elementProperties){const i=this.__attributeNameForProperty(e,t);void 0!==i&&this.__attributeToPropertyMap.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles),this.hasOwnProperty('createProperty')&&ze('no-override-create-property','Overriding ReactiveElement.createProperty() is deprecated. The override will not be called with standard decorators'),this.hasOwnProperty('getPropertyDescriptor')&&ze('no-override-get-property-descriptor','Overriding ReactiveElement.getPropertyDescriptor() is deprecated. The override will not be called with standard decorators')}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(Oe(e))}else void 0!==e&&t.push(Oe(e));return t}static __attributeNameForProperty(e,t){const i=t.attribute;return!1===i?void 0:'string'==typeof i?i:'string'==typeof e?e.toLowerCase():void 0}constructor(){super(),this.__instanceProperties=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.__reflectingProperty=null,this.__initialize()}__initialize(){this.__updatePromise=new Promise(e=>this.enableUpdating=e),this._$changedProperties=new Map,this.__saveInstanceProperties(),this.requestUpdate(),this.constructor._initializers?.forEach(e=>e(this))}addController(e){(this.__controllers??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this.__controllers?.delete(e)}__saveInstanceProperties(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this.__instanceProperties=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((e,t)=>{if(Ce)e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const i of t){const t=document.createElement('style'),s=xe.litNonce;void 0!==s&&t.setAttribute('nonce',s),t.textContent=i.cssText,e.appendChild(t)}})(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.__controllers?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this.__controllers?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$attributeToProperty(e,i)}__propertyToAttribute(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor.__attributeNameForProperty(e,i);if(void 0!==s&&!0===i.reflect){const o=(void 0!==i.converter?.toAttribute?i.converter:qe).toAttribute(t,i.type);this.constructor.enabledWarnings.includes('migration')&&void 0===o&&ze('undefined-attribute-value',`The attribute value for the ${e} property is undefined on element ${this.localName}. The attribute will be removed, but in the previous version of \`ReactiveElement\`, the attribute would not have changed.`),this.__reflectingProperty=e,null==o?this.removeAttribute(s):this.setAttribute(s,o),this.__reflectingProperty=null}}_$attributeToProperty(e,t){const i=this.constructor,s=i.__attributeToPropertyMap.get(e);if(void 0!==s&&this.__reflectingProperty!==s){const e=i.getPropertyOptions(s),o='function'==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:qe;this.__reflectingProperty=s;const n=o.fromAttribute(t,e.type);this[s]=n??this.__defaultValues?.get(s)??n,this.__reflectingProperty=null}}requestUpdate(e,t,i){if(void 0!==e){e instanceof Event&&ze('','The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()');const s=this.constructor,o=this[e];i??=s.getPropertyOptions(e);if(!((i.hasChanged??Fe)(o,t)||i.useDefault&&i.reflect&&o===this.__defaultValues?.get(e)&&!this.hasAttribute(s.__attributeNameForProperty(e,i))))return;this._$changeProperty(e,t,i)}!1===this.isUpdatePending&&(this.__updatePromise=this.__enqueueUpdate())}_$changeProperty(e,t,{useDefault:i,reflect:s,wrapped:o},n){i&&!(this.__defaultValues??=new Map).has(e)&&(this.__defaultValues.set(e,n??t??this[e]),!0!==o||void 0!==n)||(this._$changedProperties.has(e)||(this.hasUpdated||i||(t=void 0),this._$changedProperties.set(e,t)),!0===s&&this.__reflectingProperty!==e&&(this.__reflectingProperties??=new Set).add(e))}async __enqueueUpdate(){this.isUpdatePending=!0;try{await this.__updatePromise}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){const e=this.performUpdate();return this.constructor.enabledWarnings.includes('async-perform-update')&&'function'==typeof e?.then&&ze('async-perform-update',`Element ${this.localName} returned a Promise from performUpdate(). This behavior is deprecated and will be removed in a future version of ReactiveElement.`),e}performUpdate(){if(!this.isUpdatePending)return;var e;if(e={kind:'update'},Re.emitLitDebugLogEvents&&Re.dispatchEvent(new CustomEvent('lit-debug',{detail:e})),!this.hasUpdated){this.renderRoot??=this.createRenderRoot();{const e=[...this.constructor.elementProperties.keys()].filter(e=>this.hasOwnProperty(e)&&e in Ve(this));if(e.length)throw new Error(`The following properties on element ${this.localName} will not trigger updates as expected because they are set using class fields: ${e.join(', ')}. Native class fields and some compiled output will overwrite accessors used for detecting changes. See https://lit.dev/msg/class-field-shadowing for more information.`)}if(this.__instanceProperties){for(const[e,t]of this.__instanceProperties)this[e]=t;this.__instanceProperties=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$changedProperties.has(t)||void 0===s||this._$changeProperty(t,void 0,i,s)}}let t=!1;const i=this._$changedProperties;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),this.__controllers?.forEach(e=>e.hostUpdate?.()),this.update(i)):this.__markUpdated()}catch(e){throw t=!1,this.__markUpdated(),e}t&&this._$didUpdate(i)}willUpdate(e){}_$didUpdate(e){this.__controllers?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e),this.isUpdatePending&&this.constructor.enabledWarnings.includes('change-in-update')&&ze('change-in-update',`Element ${this.localName} scheduled an update (generally because a property was set) after an update completed, causing a new update to be scheduled. This is inefficient and should be avoided unless the next update can only be scheduled as a side effect of the previous update.`)}__markUpdated(){this._$changedProperties=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.__updatePromise}shouldUpdate(e){return!0}update(e){this.__reflectingProperties&&=this.__reflectingProperties.forEach(e=>this.__propertyToAttribute(e,this[e])),this.__markUpdated()}updated(e){}firstUpdated(e){}}He.elementStyles=[],He.shadowRootOptions={mode:'open'},He[We('elementProperties')]=new Map,He[We('finalized')]=new Map,Ie?.({ReactiveElement:He});{He.enabledWarnings=['change-in-update','async-perform-update'];const e=e=>{e.hasOwnProperty(We('enabledWarnings'))||(e.enabledWarnings=e.enabledWarnings.slice())};He.enableWarning=function(t){e(this),this.enabledWarnings.includes(t)||this.enabledWarnings.push(t)},He.disableWarning=function(t){e(this);const i=this.enabledWarnings.indexOf(t);i>=0&&this.enabledWarnings.splice(i,1)}}(Re.reactiveElementVersions??=[]).push('2.1.1'),Re.reactiveElementVersions.length>1&&queueMicrotask(()=>{ze('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */;const Je=globalThis;let Qe;Je.litIssuedWarnings??=new Set,Qe=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Je.litIssuedWarnings.has(t)||Je.litIssuedWarnings.has(e)||(console.warn(t),Je.litIssuedWarnings.add(t))};class Ze extends He{constructor(){super(...arguments),this.renderOptions={host:this},this.__childPart=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this.__childPart=J(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.__childPart?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.__childPart?.setConnected(!1)}render(){return O}}var Ye;Ze._$litElement$=!0,Ze[(Ye='finalized',Ye)]=!0,Je.litElementHydrateSupport?.({LitElement:Ze});const Ge=Je.litElementPolyfillSupportDevMode;Ge?.({LitElement:Ze}),(Je.litElementVersions??=[]).push('4.2.1'),Je.litElementVersions.length>1&&queueMicrotask(()=>{Qe('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) + */;const Je=globalThis;let Qe;Je.litIssuedWarnings??=new Set,Qe=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Je.litIssuedWarnings.has(t)||Je.litIssuedWarnings.has(e)||(console.warn(t),Je.litIssuedWarnings.add(t))};class Ze extends He{constructor(){super(...arguments),this.renderOptions={host:this},this.__childPart=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this.__childPart=J(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.__childPart?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.__childPart?.setConnected(!1)}render(){return N}}var Ye;Ze._$litElement$=!0,Ze[(Ye='finalized',Ye)]=!0,Je.litElementHydrateSupport?.({LitElement:Ze});const Ge=Je.litElementPolyfillSupportDevMode;Ge?.({LitElement:Ze}),(Je.litElementVersions??=[]).push('4.2.1'),Je.litElementVersions.length>1&&queueMicrotask(()=>{Qe('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) /** * @license * Copyright 2020 Google LLC @@ -35,12 +35,12 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */function tt(e){void 0!==this._$disconnectableChildren?(Ke(this),this._$parent=e,et(this)):this._$parent=e}function it(e,t=!1,i=0){const s=this._$committedValue,n=this._$disconnectableChildren;if(void 0!==n&&0!==n.size)if(t)if(Array.isArray(s))for(let e=i;e{e.type==we&&(e._$notifyConnectionChanged??=it,e._$reparentDisconnectables??=tt)};class nt extends Se{constructor(){super(...arguments),this._$disconnectableChildren=void 0}_$initialize(e,t,i){super._$initialize(e,t,i),et(this),this.isConnected=e._$isConnected}_$notifyDirectiveConnectionChanged(e,t=!0){e!==this.isConnected&&(this.isConnected=e,e?this.reconnected?.():this.disconnected?.()),t&&(Xe(this,e),Ke(this))}setValue(e){if(void 0===this.__part.strings)this.__part._$setValue(e,this);else{if(void 0===this.__attributeIndex)throw new Error('Expected this.__attributeIndex to be a number');const t=[...this.__part._$committedValue];t[this.__attributeIndex]=e,this.__part._$setValue(t,this,0)}}disconnected(){}reconnected(){}}const{component:ot}=function({render:e}){const t=ue(e),i=function(e){return t=>{const i={Provider:class extends HTMLElement{listeners;_value;constructor(){super(),this.listeners=new Set,this.addEventListener(ne,this)}disconnectedCallback(){this.removeEventListener(ne,this)}handleEvent(e){const{detail:t}=e;t.Context===i&&(t.value=this.value,t.unsubscribe=this.unsubscribe.bind(this,t.callback),this.listeners.add(t.callback),e.stopPropagation())}unsubscribe(e){this.listeners.delete(e)}set value(e){this._value=e;for(let t of this.listeners)t(e)}get value(){return this._value}},Consumer:e(({render:e})=>e(_e(i)),{useShadowDOM:!1}),defaultValue:t};return i}}(t);return{component:t,createContext:i}}({render:J}); + */function tt(e){void 0!==this._$disconnectableChildren?(Ke(this),this._$parent=e,et(this)):this._$parent=e}function it(e,t=!1,i=0){const s=this._$committedValue,o=this._$disconnectableChildren;if(void 0!==o&&0!==o.size)if(t)if(Array.isArray(s))for(let e=i;e{e.type==we&&(e._$notifyConnectionChanged??=it,e._$reparentDisconnectables??=tt)};class ot extends Se{constructor(){super(...arguments),this._$disconnectableChildren=void 0}_$initialize(e,t,i){super._$initialize(e,t,i),et(this),this.isConnected=e._$isConnected}_$notifyDirectiveConnectionChanged(e,t=!0){e!==this.isConnected&&(this.isConnected=e,e?this.reconnected?.():this.disconnected?.()),t&&(Xe(this,e),Ke(this))}setValue(e){if(void 0===this.__part.strings)this.__part._$setValue(e,this);else{if(void 0===this.__attributeIndex)throw new Error('Expected this.__attributeIndex to be a number');const t=[...this.__part._$committedValue];t[this.__attributeIndex]=e,this.__part._$setValue(t,this,0)}}disconnected(){}reconnected(){}}const{component:nt}=function({render:e}){const t=ue(e),i=function(e){return t=>{const i={Provider:class extends HTMLElement{listeners;_value;constructor(){super(),this.listeners=new Set,this.addEventListener(oe,this)}disconnectedCallback(){this.removeEventListener(oe,this)}handleEvent(e){const{detail:t}=e;t.Context===i&&(t.value=this.value,t.unsubscribe=this.unsubscribe.bind(this,t.callback),this.listeners.add(t.callback),e.stopPropagation())}unsubscribe(e){this.listeners.delete(e)}set value(e){this._value=e;for(let t of this.listeners)t(e)}get value(){return this._value}},Consumer:e(({render:e})=>e(_e(i)),{useShadowDOM:!1}),defaultValue:t};return i}}(t);return{component:t,createContext:i}}({render:J}),rt=new WeakMap; /** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */class rt{}const at=new WeakMap;const lt=(ct=class extends nt{render(e){return M}update(e,[t]){const i=t!==this._ref;return i&&void 0!==this._ref&&this._updateRefValue(void 0),(i||this._lastElementForRef!==this._element)&&(this._ref=t,this._context=e.options?.host,this._updateRefValue(this._element=e.element)),M}_updateRefValue(e){if(this.isConnected||(e=void 0),'function'==typeof this._ref){const t=this._context??globalThis;let i=at.get(t);void 0===i&&(i=new WeakMap,at.set(t,i)),void 0!==i.get(this._ref)&&this._ref.call(this._context,void 0),i.set(this._ref,e),void 0!==e&&this._ref.call(this._context,e)}else this._ref.value=e}get _lastElementForRef(){return'function'==typeof this._ref?at.get(this._context??globalThis)?.get(this._ref):this._ref?.value}disconnected(){this._lastElementForRef===this._element&&this._updateRefValue(void 0)}reconnected(){this._updateRefValue(this._element)}},(...e)=>({_$litDirective$:ct,values:e}));var ct;customElements.define('civ-autocomplete-select',ot(function({disabled:e,optionsMetadata:t={},options:i=[],label:s='Search',inputValue:n='',pageSize:o=25}){const[r,a]=$e(null),[l,c]=$e(-1),[d,u]=$e(!1),[p,h]=$e(null),[m,f]=$e(1);be(()=>{n||a(null)},[n]),be(()=>{l>=0&&$()},[l]);const g=(e,t=1)=>{const i=e||'';this.dispatchEvent(new CustomEvent('fetch-suggestions',{detail:{query:i,page:t,pageSize:o},bubbles:!0,composed:!0})),c(-1),f(t)},b=ve(()=>((e,t)=>{let i;return(...s)=>{i&&clearTimeout(i),i=setTimeout(()=>{e.apply(null,s)},t)}})(g,300),[]),_=e=>{a(e),u(!1),f(1),p&&p.focus(),this.dispatchEvent(new CustomEvent('item-selected',{detail:e,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent('input-change',{detail:{value:e.label,item:e},bubbles:!0,composed:!0}))},v=t?.links?.prev,y=t?.links?.next,$=e=>{setTimeout(()=>{const e=this.querySelector('.autocomplete-option[aria-selected="true"]');e&&e.scrollIntoView({behavior:'smooth',block:'nearest'})},0)};return N` + */const at=(lt=class extends ot{render(e){return M}update(e,[t]){const i=t!==this._ref;return i&&void 0!==this._ref&&this._updateRefValue(void 0),(i||this._lastElementForRef!==this._element)&&(this._ref=t,this._context=e.options?.host,this._updateRefValue(this._element=e.element)),M}_updateRefValue(e){if(this.isConnected||(e=void 0),'function'==typeof this._ref){const t=this._context??globalThis;let i=rt.get(t);void 0===i&&(i=new WeakMap,rt.set(t,i)),void 0!==i.get(this._ref)&&this._ref.call(this._context,void 0),i.set(this._ref,e),void 0!==e&&this._ref.call(this._context,e)}else this._ref.value=e}get _lastElementForRef(){return'function'==typeof this._ref?rt.get(this._context??globalThis)?.get(this._ref):this._ref?.value}disconnected(){this._lastElementForRef===this._element&&this._updateRefValue(void 0)}reconnected(){this._updateRefValue(this._element)}},(...e)=>({_$litDirective$:lt,values:e}));var lt;customElements.define('civ-autocomplete-select',nt(function({disabled:e,optionsMetadata:t={},options:i=[],label:s='Search',inputValue:o='',pageSize:n=25}){const[r,a]=$e(null),[l,c]=$e(-1),[d,u]=$e(!1),[p,h]=$e(null),[m,f]=$e(1);be(()=>{o||a(null)},[o]),be(()=>{l>=0&&$()},[l]);const g=(e,t=1)=>{const i=e||'';this.dispatchEvent(new CustomEvent('fetch-suggestions',{detail:{query:i,page:t,pageSize:n},bubbles:!0,composed:!0})),c(-1),f(t)},b=ve(()=>((e,t)=>{let i;return(...s)=>{i&&clearTimeout(i),i=setTimeout(()=>{e.apply(null,s)},t)}})(g,300),[]),_=e=>{a(e),u(!1),f(1),p&&p.focus(),this.dispatchEvent(new CustomEvent('item-selected',{detail:e,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent('input-change',{detail:{value:e.label,item:e},bubbles:!0,composed:!0}))},v=t?.links?.prev,y=t?.links?.next,$=e=>{setTimeout(()=>{const e=this.querySelector('.autocomplete-option[aria-selected="true"]');e&&e.scrollIntoView({behavior:'smooth',block:'nearest'})},0)};return T`
    - ${i.map(e=>{const t=e.status?e.status.toLowerCase().replace(/\s+/g,'-'):'';return N` + ${i.map(e=>{const t=e.status?e.status.toLowerCase().replace(/\s+/g,'-'):'';return T`
  • -
    ${e.status}
    - ${i=e.progress,100===i?null:N` + ${i=e.progress,100===i?null:T`
    ${i??0}% @@ -367,9 +367,9 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i {n(!1),r(null)},closeOnBackdropClick:!0}} + .modalProps=${{open:s,onClose:()=>{o(!1),r(null)},closeOnBackdropClick:!0}} > - `:N`

    No scrape history available.

    `},{useShadowDOM:!1}));const dt={created_at:'2024-06-01T12:00:00Z',status:'Accepted',duration_in_s:360,source_urls:['https://example.com','https://example.org']};function ut(e=!1){const[t,i]=$e(e),s=new rt,n=()=>i(!1);return be(()=>{t&&s.value&&s.value.focus()},[t]),be(()=>{const e=e=>{'Escape'===e.key&&t&&n()};if(t)return document.addEventListener('keydown',e),()=>{document.removeEventListener('keydown',e)}},[t,n]),be(()=>{const e=e=>{s.value&&!s.value.contains(e.target)&&t&&n()};if(t)return document.addEventListener('mousedown',e),()=>{document.removeEventListener('mousedown',e)}},[t,n]),{isOpen:t,openModal:()=>i(!0),closeModal:n,modalProps:{open:t,onClose:n,modalRef:s}}}customElements.define('scrape-details',ot(function({detail:e=dt}){const t=e?.created_at?new Date(e.created_at):null,i=t?t.toLocaleString():'',s=function(e){if(null==e)return'';const t=Math.floor(e/3600),i=Math.floor(e%3600/60);return[t?`${t}h`:null,i?`${i}m`:null,e%60+'s'].filter(Boolean).join(' ')}(e?.duration_in_s),n=e?.source_urls||[];return N` + `:T`

    No scrape history available.

    `},{useShadowDOM:!1}));const ct={created_at:'2024-06-01T12:00:00Z',status:'Accepted',duration_in_s:360,source_urls:['https://example.com','https://example.org']};customElements.define('scrape-details',nt(function({detail:e=ct}){const t=e?.created_at?new Date(e.created_at):null,i=t?t.toLocaleString():'',s=function(e){if(null==e)return'';const t=Math.floor(e/3600),i=Math.floor(e%3600/60);return[t?`${t}h`:null,i?`${i}m`:null,e%60+'s'].filter(Boolean).join(' ')}(e?.duration_in_s),o=e?.source_urls||[];return T`
    @@ -391,13 +391,13 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i

    URLs scraped

    - ${n.length?N`
      - ${n.map(e=>N`
    • ${e}
    • `)} -
    `:N`

    No source URLs

    `} + ${o.length?T`
      + ${o.map(e=>T`
    • ${e}
    • `)} +
    `:T`

    No source URLs

    `}
    - `})),customElements.define('civ-select-jurisdiction',ot(function(){const[e,t]=$e([]),[i,s]=$e([]),[n,o]=$e({}),[r,a]=$e(''),[l,c]=$e(''),[d,u]=$e(''),p=(h=!0,ve(()=>({current:h}),[]));var h;be(()=>{p.current?p.current=!1:m(r,l)},[r,l]),be(()=>{fetch('/api/api_proxy/jurisdictions/states').then(e=>e.json()).then(e=>t(e.data||[]))},[]),be(()=>{s([]),o({}),c(''),u(''),r&&f('')},[r]);const m=(e,t)=>{this.dispatchEvent(new CustomEvent('select-jurisdiction-change',{detail:{state:e,jurisdiction_ocdid:t},bubbles:!0,composed:!0}))},f=e=>{const t=e.query||'',i=e.page||1,n=e.pageSize||25;fetch(`/api/api_proxy/jurisdictions/${r}/search?search_string=${encodeURIComponent(t)}&limit=${n}&page=${i}`).then(e=>e.json()).then(e=>{s(e.data||[]),o({total_items:e.total_items,total_pages:e.total_pages,page:e.page,limit:e.limit,links:e.links})})};return N` + `})),customElements.define('civ-select-jurisdiction',nt(function(){const[e,t]=$e([]),[i,s]=$e([]),[o,n]=$e({}),[r,a]=$e(''),[l,c]=$e(''),[d,u]=$e(''),p=(h=!0,ve(()=>({current:h}),[]));var h;be(()=>{p.current?p.current=!1:m(r,l)},[r,l]),be(()=>{fetch('/api/api_proxy/jurisdictions/states').then(e=>e.json()).then(e=>t(e.data||[]))},[]),be(()=>{s([]),n({}),c(''),u(''),r&&f('')},[r]);const m=(e,t)=>{this.dispatchEvent(new CustomEvent('select-jurisdiction-change',{detail:{state:e,jurisdiction_ocdid:t},bubbles:!0,composed:!0}))},f=e=>{const t=e.query||'',i=e.page||1,o=e.pageSize||25;fetch(`/api/api_proxy/jurisdictions/${r}/search?search_string=${encodeURIComponent(t)}&limit=${o}&page=${i}`).then(e=>e.json()).then(e=>{s(e.data||[]),n({total_items:e.total_items,total_pages:e.total_pages,page:e.page,limit:e.limit,links:e.links})})};return T`
    - ${e.map(e=>N``)} + ${e.map(e=>T``)} ({label:e.name,value:e.id}))} - .optionsMetadata=${n} + .optionsMetadata=${o} .pageSize=${25} @fetch-suggestions=${e=>{const t=e.detail;f(t)}} @input-change=${e=>{const{value:t,item:i}=e.detail;u(t),c(i?i.value:'')}} @@ -434,7 +434,7 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i Go to jurisdiction page - `},{useShadowDOM:!1,observedAttributes:[]})),customElements.define('civ-search-jurisdictions',ot(function(){const[e,t]=$e(null),[i,s]=$e(null),[n,o]=$e([]),[r,a]=$e([]);be(()=>{if(!i)return;const e=encodeURIComponent(i);fetch(`/api/api_proxy/people?jurisdiction_ocdid=${e}`).then(e=>e.json()).then(e=>{o(e.data)})},[i]);const l=e=>{const{state:i,jurisdiction_ocdid:n}=e.detail;console.log('Selected State:',i),t(i),console.log('Selected Jurisdiction:',n),s(n)};return N` + `},{useShadowDOM:!1,observedAttributes:[]})),customElements.define('civ-search-jurisdictions',nt(function(){const[e,t]=$e(null),[i,s]=$e(null),[o,n]=$e([]),[r,a]=$e([]);be(()=>{if(!i)return;const e=encodeURIComponent(i);fetch(`/api/api_proxy/people?jurisdiction_ocdid=${e}`).then(e=>e.json()).then(e=>{n(e.data)})},[i]);const l=e=>{const{state:i,jurisdiction_ocdid:o}=e.detail;console.log('Selected State:',i),t(i),console.log('Selected Jurisdiction:',o),s(o)};return T`
    @@ -448,152 +448,202 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i @select-jurisdiction-change=${l} >
    - +
    - `},{useShadowDOM:!1,observedAttributes:[]})),customElements.define('name-config-form',ot(function({onChange:e,existingNameConfigs:t={}}){const[i,s]=$e(Object.entries(t).map(([e,t])=>({canonical:e,alternates:t}))),[n,o]=$e(''),[r,a]=$e('');return be(()=>{const t={};i.forEach(({canonical:e,alternates:i})=>{e.trim()&&(t[e.trim()]=i.filter(e=>e.trim()))}),e(t)},[i]),N` -
    -
    - `},{useShadowDOM:!1})),customElements.define('civ-scrape-modal',ot(function({onStartScrape:e,url:t='',sourceUrls:i=[],modalProps:s={}}){const[n,o]=$e('top-level-url'),[r,a]=$e(t),[l,c]=$e(i),[d,u]=$e({}),p=e=>{o(e.target.value)},h=e=>{if(!e||''===e.trim())return!1;try{return new URL(e),!0}catch{return!1}},m='top-level-url'===n?h(r):l.length>0&&l.every(e=>h(e));return N` - -
    e.stopPropagation()} ${lt(s.modalRef)}> -
    -

    URLs to Scrape

    -
    - -
    - - - - - -
    - - ${'top-level-url'===n?N` + +
    + `},{useShadowDOM:!1})),customElements.define('name-config-form',nt(function({onChange:e,identities:t={}}){const[i,s]=$e({...t}),[o,n]=$e('');return be(()=>{s({...t})},[t]),be(()=>{e(i)},[i,e]),T` +
    + ${Object.keys(i).map(e=>T` +
    + + {s(i=>({...i,[e]:t}))}} + placeholder="Add alternate name..." + > +
    + `)} +
    {e.preventDefault();const t=o.trim();t&&!i[t]&&(s(e=>({...e,[t]:[]})),n(''))}} style="margin-top: 1em; display: flex; gap: 0.5em;"> + n(e.target.value)} + placeholder="Add identity name..." + style="flex: 1;" + /> + +
    +
    + `},{useShadowDOM:!1})),customElements.define('civ-scrape-modal',nt(function({onStartScrape:e,url:t='',sourceUrls:i=[],modalProps:s={},identities:o={}}){const[n,r]=$e('top-level-url'),[a,l]=$e(t),[c,d]=$e(i),[u,p]=$e({}),h=e=>{r(e.target.value)},m=e=>{if(!e||''===e.trim())return!1;try{return new URL(e),!0}catch{return!1}},f='top-level-url'===n?m(a):c.length>0&&c.every(e=>m(e)),g=T` +
    + + + + + +
    + + ${'top-level-url'===n?T` +
    + {l(e.target.value)}} + /> +
    +
    + +
    + `:T` + ${c.map((e,t)=>T`
    {a(e.target.value)}} + @input=${e=>((e,t)=>{const i=[...c];i[e]=t.target.value,d(i)})(t,e)} /> -
    -
    -
    - `:N` - ${l.map((e,t)=>N` -
    - ((e,t)=>{const i=[...l];i[e]=t.target.value,c(i)})(t,e)} - /> - -
    - `)} - - `} - -
    - Name Configs -

    - Some people go by multiple names that aren't easily guessable to be - the same identity. Specify alternate names for identities to improve - matching. -

    - {u(e)}} - .existingNameConfigs=${d} - > -
    - -
    - - -
    - - - `},{useShadowDOM:!1}));customElements.define('civ-jurisdiction-page',ot(function({jurisdiction_ocdid:e,history:t}){const[i,s]=$e(null),[n,o]=$e([]),r=ut(!1),a=e?['http://localhost:8001/api/v1/sse/jobs/status',`?jurisdiction_ocdid=${encodeURIComponent(e)}`,'&job_type=people'].join(''):null,{data:l,isConnected:c,error:d}=function(e,t={}){const[i,s]=$e(null),[n,o]=$e(!1),[r,a]=$e(null),[l,c]=$e(null),d=ye(()=>'function'==typeof e?e():e,[e]),u=ye(()=>{if(l)return;const e=d();try{const t=new EventSource(e);c(t),a(null),t.onopen=()=>o(!0),t.onmessage=e=>{try{s(JSON.parse(e.data))}catch(e){a('Error parsing SSE data.')}},t.onerror=e=>{console.error('SSE error:',e),o(!1),a('SSE connection error.')}}catch(e){a('Failed to initialize SSE.')}},[l,d]),p=ye(()=>{l&&(l.close(),c(null),o(!1))},[l]);return be(()=>(t.autoConnect&&u(),()=>{l&&l.close()}),[t.autoConnect,u,l]),{data:i,isConnected:n,error:r,connect:u,disconnect:p}}(a,{autoConnect:!!a});be(()=>{e&&u()},[]);const u=async()=>{const[t,i]=await Promise.all([p(e),h(e)]);s(t),o(i)},p=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/jurisdictions?jurisdiction_ocdid=${t}&with_geom=true`),s=await i.json();return{data:s.data,geo_center:s.geo_center}},h=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/people?jurisdiction_ocdid=${t}`);return(await i.json()).data},m=i?.data?.updated_at?'Scraped':'Unscraped';return N` + + `)} + + `} + +
    + + Name Configs + +
    +

    + Some people go by multiple names that aren't easily guessable to be + the same identity. Specify alternate names for identities to improve + matching. +

    + {p(e)}} + .identities=${o} + > +
    +
    + `,b=T` + + + `;return T` + + `},{useShadowDOM:!1}));customElements.define('civ-jurisdiction-page',nt(function({jurisdiction_ocdid:e,history:t}){const[i,s]=$e(null),[o,n]=$e([]),[r,a]=$e(!1);console.log('data',i);const l=o?.reduce((e,t)=>(e[t.name]?e[t.name]=[...new Set([...e[t.name],...t.other_names||[]])]:e[t.name]=[...new Set(t.other_names||[])],e),{});console.log({people:o,identities:l});const c=e?['http://localhost:8001/api/v1/sse/jobs/status',`?jurisdiction_ocdid=${encodeURIComponent(e)}`,'&job_type=people'].join(''):null,{data:d,isConnected:u,error:p}=function(e,t={}){const[i,s]=$e(null),[o,n]=$e(!1),[r,a]=$e(null),[l,c]=$e(null),d=ye(()=>'function'==typeof e?e():e,[e]),u=ye(()=>{if(l)return;const e=d();try{const t=new EventSource(e);c(t),a(null),t.onopen=()=>n(!0),t.onmessage=e=>{try{s(JSON.parse(e.data))}catch(e){a('Error parsing SSE data.')}},t.onerror=e=>{console.error('SSE error:',e),n(!1),a('SSE connection error.')}}catch(e){a('Failed to initialize SSE.')}},[l,d]),p=ye(()=>{l&&(l.close(),c(null),n(!1))},[l]);return be(()=>(t.autoConnect&&u(),()=>{l&&l.close()}),[t.autoConnect,u,l]),{data:i,isConnected:o,error:r,connect:u,disconnect:p}}(c,{autoConnect:!!c});be(()=>{e&&h()},[]);const h=async()=>{const[t,i]=await Promise.all([m(e),f(e)]);s(t),n(i)},m=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/jurisdictions?jurisdiction_ocdid=${t}&with_geom=true`),s=await i.json();return{data:s.data,geo_center:s.geo_center}},f=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/people?jurisdiction_ocdid=${t}`);return(await i.json()).data},g=i?.data?.updated_at?'Scraped':'Unscraped';return T`
    @@ -604,14 +654,14 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i
    - ${i?N` + ${i?T`

    ${i.data.name}

    Status: ${m}Status: ${g}
    @@ -629,30 +679,31 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i
    {const t={jurisdiction_ocdid:i.data.id,config:{url:e.data.url||i.data.url,name:i.data.name,source_urls:e.data.sourceUrls,identities:e.data.identities}};await fetch('/api/pipelines',{headers:{'Content-Type':'application/json'},method:'POST',body:JSON.stringify(t)})}} + .onStartScrape=${async e=>{a(!1);const t={jurisdiction_ocdid:i.data.id,config:{url:e.data.url||i.data.url,name:i.data.name,source_urls:e.data.sourceUrls,identities:e.data.identities}};await fetch('/api/pipelines',{headers:{'Content-Type':'application/json'},method:'POST',body:JSON.stringify(t)})}} .url=${i.data.url} - .modalProps=${r.modalProps} - > + .modalProps=${{open:r,onClose:()=>a(!1),closeOnBackdropClick:!1}} + .identities=${l} + > - `:N`

    Loading jurisdiction data...

    `} + `:T`

    Loading jurisdiction data...

    `}

    Elected Representatives

    - +
    `},{useShadowDOM:!1,observedAttributes:['jurisdiction_ocdid','history']})),e(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGV2ZWxvcG1lbnQvbGl0LWh0bWwuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvaW50ZXJmYWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3N5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc3RhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc2NoZWR1bGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9ob29rLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NyZWF0ZS1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWVmZmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtbWVtby5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY2FsbGJhY2suanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWxheW91dC1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLXN0YXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1jb250cm9sbGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWR1Y2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RldmVsb3BtZW50L2RpcmVjdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvY3NzLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9kZXZlbG9wbWVudC9saXQtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmUtaGVscGVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9hc3luYy1kaXJlY3RpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvbGl0LWhhdW50ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvY29yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9jcmVhdGUtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmVzL3JlZi5qcyIsIi4uL2NvbXBvbmVudHMvaW5wdXRzL2F1dG8tY29tcGxldGUtc2VsZWN0LmpzIiwiLi4vY29tcG9uZW50cy9wZW9wbGUtbGlzdC5qcyIsIi4uL2NvbXBvbmVudHMvbW9kYWwuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1oaXN0b3J5LWxpc3QuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1kZXRhaWxzLmpzIiwiLi4vY29tcG9uZW50cy9ob29rcy91c2VNb2RhbC5qcyIsIi4uL2NvbXBvbmVudHMvc2VhcmNoLWp1cmlzZGljdGlvbnMvc2VsZWN0LWp1cmlzZGljdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtcmVmLmpzIiwiLi4vY29tcG9uZW50cy9zZWFyY2gtanVyaXNkaWN0aW9ucy9zZWFyY2gtanVyaXNkaWN0aW9ucy5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2Uvc2NyYXBlLW1vZGFsL25hbWUtY29uZmlnLWZvcm0uanMiLCIuLi9jb21wb25lbnRzL2p1cmlzZGljdGlvbi1wYWdlL3NjcmFwZS1tb2RhbC9zY3JhcGUtbW9kYWwuanMiLCIuLi9jb21wb25lbnRzL2p1cmlzZGljdGlvbi1wYWdlL2p1cmlzZGljdGlvbi1wYWdlLmpzIiwiLi4vY29tcG9uZW50cy9ob29rcy91c2VTc2UuanMiLCIuLi9jb21wb25lbnRzL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5jb25zdCBFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MgPSB0cnVlO1xuY29uc3QgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggPSB0cnVlO1xuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgICA/IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzaG91bGRFbWl0ID0gZ2xvYmFsXG4gICAgICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgICBpZiAoIXNob3VsZEVtaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICAgIGRldGFpbDogZXZlbnQsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgOiB1bmRlZmluZWQ7XG4vLyBVc2VkIGZvciBjb25uZWN0aW5nIGJlZ2luUmVuZGVyIGFuZCBlbmRSZW5kZXIgZXZlbnRzIHdoZW4gdGhlcmUgYXJlIG5lc3RlZFxuLy8gcmVuZGVycyB3aGVuIGVycm9ycyBhcmUgdGhyb3duIHByZXZlbnRpbmcgYW4gZW5kUmVuZGVyIGV2ZW50IGZyb20gYmVpbmdcbi8vIGNhbGxlZC5cbmxldCBkZWJ1Z0xvZ1JlbmRlcklkID0gMDtcbmxldCBpc3N1ZVdhcm5pbmc7XG5pZiAoREVWX01PREUpIHtcbiAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICAgKi9cbiAgICBpc3N1ZVdhcm5pbmcgPSAoY29kZSwgd2FybmluZykgPT4ge1xuICAgICAgICB3YXJuaW5nICs9IGNvZGVcbiAgICAgICAgICAgID8gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMoY29kZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5hZGQod2FybmluZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdkZXYtbW9kZScsIGBMaXQgaXMgaW4gZGV2IG1vZGUuIE5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiFgKTtcbiAgICB9KTtcbn1cbmNvbnN0IHdyYXAgPSBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCAmJlxuICAgIGdsb2JhbC5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgICBnbG9iYWwuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IGdsb2JhbC5TaGFkeURPTS53cmFwXG4gICAgOiAobm9kZSkgPT4gbm9kZTtcbmNvbnN0IHRydXN0ZWRUeXBlcyA9IGdsb2JhbC50cnVzdGVkVHlwZXM7XG4vKipcbiAqIE91ciBUcnVzdGVkVHlwZVBvbGljeSBmb3IgSFRNTCB3aGljaCBpcyBkZWNsYXJlZCB1c2luZyB0aGUgaHRtbCB0ZW1wbGF0ZVxuICogdGFnIGZ1bmN0aW9uLlxuICpcbiAqIFRoYXQgSFRNTCBpcyBhIGRldmVsb3Blci1hdXRob3JlZCBjb25zdGFudCwgYW5kIGlzIHBhcnNlZCB3aXRoIGlubmVySFRNTFxuICogYmVmb3JlIGFueSB1bnRydXN0ZWQgZXhwcmVzc2lvbnMgaGF2ZSBiZWVuIG1peGVkIGluLiBUaGVyZWZvciBpdCBpc1xuICogY29uc2lkZXJlZCBzYWZlIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuY29uc3QgcG9saWN5ID0gdHJ1c3RlZFR5cGVzXG4gICAgPyB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdsaXQtaHRtbCcsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogKHMpID0+IHMsXG4gICAgfSlcbiAgICA6IHVuZGVmaW5lZDtcbmNvbnN0IGlkZW50aXR5RnVuY3Rpb24gPSAodmFsdWUpID0+IHZhbHVlO1xuY29uc3Qgbm9vcFNhbml0aXplciA9IChfbm9kZSwgX25hbWUsIF90eXBlKSA9PiBpZGVudGl0eUZ1bmN0aW9uO1xuLyoqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZXIgZmFjdG9yeS4gKi9cbmNvbnN0IHNldFNhbml0aXplciA9IChuZXdTYW5pdGl6ZXIpID0+IHtcbiAgICBpZiAoIUVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgIT09IG5vb3BTYW5pdGl6ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0ZWQgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGxpdC1odG1sIHNlY3VyaXR5IHBvbGljeS5gICtcbiAgICAgICAgICAgIGAgc2V0U2FuaXRpemVET01WYWx1ZUZhY3Rvcnkgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UuYCk7XG4gICAgfVxuICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5ld1Nhbml0aXplcjtcbn07XG4vKipcbiAqIE9ubHkgdXNlZCBpbiBpbnRlcm5hbCB0ZXN0cywgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFQSS5cbiAqL1xuY29uc3QgX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlID0gKCkgPT4ge1xuICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG59O1xuY29uc3QgY3JlYXRlU2FuaXRpemVyID0gKG5vZGUsIG5hbWUsIHR5cGUpID0+IHtcbiAgICByZXR1cm4gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKG5vZGUsIG5hbWUsIHR5cGUpO1xufTtcbi8vIEFkZGVkIHRvIGFuIGF0dHJpYnV0ZSBuYW1lIHRvIG1hcmsgdGhlIGF0dHJpYnV0ZSBhcyBib3VuZCBzbyB3ZSBjYW4gZmluZFxuLy8gaXQgZWFzaWx5LlxuY29uc3QgYm91bmRBdHRyaWJ1dGVTdWZmaXggPSAnJGxpdCQnO1xuLy8gVGhpcyBtYXJrZXIgaXMgdXNlZCBpbiBtYW55IHN5bnRhY3RpYyBwb3NpdGlvbnMgaW4gSFRNTCwgc28gaXQgbXVzdCBiZVxuLy8gYSB2YWxpZCBlbGVtZW50IG5hbWUgYW5kIGF0dHJpYnV0ZSBuYW1lLiBXZSBkb24ndCBzdXBwb3J0IGR5bmFtaWMgbmFtZXMgKHlldClcbi8vIGJ1dCB0aGlzIGF0IGxlYXN0IGVuc3VyZXMgdGhhdCB0aGUgcGFyc2UgdHJlZSBpcyBjbG9zZXIgdG8gdGhlIHRlbXBsYXRlXG4vLyBpbnRlbnRpb24uXG5jb25zdCBtYXJrZXIgPSBgbGl0JCR7TWF0aC5yYW5kb20oKS50b0ZpeGVkKDkpLnNsaWNlKDIpfSRgO1xuLy8gU3RyaW5nIHVzZWQgdG8gdGVsbCBpZiBhIGNvbW1lbnQgaXMgYSBtYXJrZXIgY29tbWVudFxuY29uc3QgbWFya2VyTWF0Y2ggPSAnPycgKyBtYXJrZXI7XG4vLyBUZXh0IHVzZWQgdG8gaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIgbm9kZS4gV2UgdXNlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25cbi8vIHN5bnRheCBiZWNhdXNlIGl0J3Mgc2xpZ2h0bHkgc21hbGxlciwgYnV0IHBhcnNlcyBhcyBhIGNvbW1lbnQgbm9kZS5cbmNvbnN0IG5vZGVNYXJrZXIgPSBgPCR7bWFya2VyTWF0Y2h9PmA7XG5jb25zdCBkID0gTk9ERV9NT0RFICYmIGdsb2JhbC5kb2N1bWVudCA9PT0gdW5kZWZpbmVkXG4gICAgPyB7XG4gICAgICAgIGNyZWF0ZVRyZWVXYWxrZXIoKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0sXG4gICAgfVxuICAgIDogZG9jdW1lbnQ7XG4vLyBDcmVhdGVzIGEgZHluYW1pYyBtYXJrZXIuIFdlIG5ldmVyIGhhdmUgdG8gc2VhcmNoIGZvciB0aGVzZSBpbiB0aGUgRE9NLlxuY29uc3QgY3JlYXRlTWFya2VyID0gKCkgPT4gZC5jcmVhdGVDb21tZW50KCcnKTtcbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPSAnZnVuY3Rpb24nKTtcbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuY29uc3QgaXNJdGVyYWJsZSA9ICh2YWx1ZSkgPT4gaXNBcnJheSh2YWx1ZSkgfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHR5cGVvZiB2YWx1ZT8uW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG5jb25zdCBTUEFDRV9DSEFSID0gYFsgXFx0XFxuXFxmXFxyXWA7XG5jb25zdCBBVFRSX1ZBTFVFX0NIQVIgPSBgW14gXFx0XFxuXFxmXFxyXCInXFxgPD49XWA7XG5jb25zdCBOQU1FX0NIQVIgPSBgW15cXFxcc1wiJz49L11gO1xuLy8gVGhlc2UgcmVnZXhlcyByZXByZXNlbnQgdGhlIGZpdmUgcGFyc2luZyBzdGF0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRoZVxuLy8gVGVtcGxhdGUncyBIVE1MIHNjYW5uZXIuIFRoZXkgbWF0Y2ggdGhlICplbmQqIG9mIHRoZSBzdGF0ZSB0aGV5J3JlIG5hbWVkXG4vLyBhZnRlci5cbi8vIERlcGVuZGluZyBvbiB0aGUgbWF0Y2gsIHdlIHRyYW5zaXRpb24gdG8gYSBuZXcgc3RhdGUuIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsXG4vLyB3ZSBzdGF5IGluIHRoZSBzYW1lIHN0YXRlLlxuLy8gTm90ZSB0aGF0IHRoZSByZWdleGVzIGFyZSBzdGF0ZWZ1bC4gV2UgdXRpbGl6ZSBsYXN0SW5kZXggYW5kIHN5bmMgaXRcbi8vIGFjcm9zcyB0aGUgbXVsdGlwbGUgcmVnZXhlcyB1c2VkLiBJbiBhZGRpdGlvbiB0byB0aGUgZml2ZSByZWdleGVzIGJlbG93XG4vLyB3ZSBhbHNvIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHJlZ2V4IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVuZCB0YWdzIGZvciByYXdcbi8vIHRleHQgZWxlbWVudHMuXG4vKipcbiAqIEVuZCBvZiB0ZXh0IGlzOiBgPGAgZm9sbG93ZWQgYnk6XG4gKiAgIChjb21tZW50IHN0YXJ0KSBvciAodGFnKSBvciAoZHluYW1pYyB0YWcgYmluZGluZylcbiAqL1xuY29uc3QgdGV4dEVuZFJlZ2V4ID0gLzwoPzooIS0tfFxcL1teYS16QS1aXSl8KFxcLz9bYS16QS1aXVtePlxcc10qKXwoXFwvPyQpKS9nO1xuY29uc3QgQ09NTUVOVF9TVEFSVCA9IDE7XG5jb25zdCBUQUdfTkFNRSA9IDI7XG5jb25zdCBEWU5BTUlDX1RBR19OQU1FID0gMztcbmNvbnN0IGNvbW1lbnRFbmRSZWdleCA9IC8tLT4vZztcbi8qKlxuICogQ29tbWVudHMgbm90IHN0YXJ0ZWQgd2l0aCA8IS0tLCBsaWtlIDwveywgY2FuIGJlIGVuZGVkIGJ5IGEgc2luZ2xlIGA+YFxuICovXG5jb25zdCBjb21tZW50MkVuZFJlZ2V4ID0gLz4vZztcbi8qKlxuICogVGhlIHRhZ0VuZCByZWdleCBtYXRjaGVzIHRoZSBlbmQgb2YgdGhlIFwiaW5zaWRlIGFuIG9wZW5pbmdcIiB0YWcgc3ludGF4XG4gKiBwb3NpdGlvbi4gSXQgZWl0aGVyIG1hdGNoZXMgYSBgPmAsIGFuIGF0dHJpYnV0ZS1saWtlIHNlcXVlbmNlLCBvciB0aGUgZW5kXG4gKiBvZiB0aGUgc3RyaW5nIGFmdGVyIGEgc3BhY2UgKGF0dHJpYnV0ZS1uYW1lIHBvc2l0aW9uIGVuZGluZykuXG4gKlxuICogU2VlIGF0dHJpYnV0ZXMgaW4gdGhlIEhUTUwgc3BlYzpcbiAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50cy1hdHRyaWJ1dGVzXG4gKlxuICogXCIgXFx0XFxuXFxmXFxyXCIgYXJlIEhUTUwgc3BhY2UgY2hhcmFjdGVyczpcbiAqIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKlxuICogU28gYW4gYXR0cmlidXRlIGlzOlxuICogICogVGhlIG5hbWU6IGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIChcIiksICgnKSwgXCI+XCIsXG4gKiAgICBcIj1cIiwgb3IgXCIvXCIuIE5vdGU6IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIEhUTUwgc3BlYyB3aGljaCBhbHNvIGV4Y2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycy5cbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieSBcIj1cIlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5OlxuICogICAgKiBBbnkgY2hhcmFjdGVyIGV4Y2VwdCBzcGFjZSwgKCcpLCAoXCIpLCBcIjxcIiwgXCI+XCIsIFwiPVwiLCAoYCksIG9yXG4gKiAgICAqIChcIikgdGhlbiBhbnkgbm9uLShcIiksIG9yXG4gKiAgICAqICgnKSB0aGVuIGFueSBub24tKCcpXG4gKi9cbmNvbnN0IHRhZ0VuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPnwke1NQQUNFX0NIQVJ9KD86KCR7TkFNRV9DSEFSfSspKCR7U1BBQ0VfQ0hBUn0qPSR7U1BBQ0VfQ0hBUn0qKD86JHtBVFRSX1ZBTFVFX0NIQVJ9fChcInwnKXwpKXwkKWAsICdnJyk7XG5jb25zdCBFTlRJUkVfTUFUQ0ggPSAwO1xuY29uc3QgQVRUUklCVVRFX05BTUUgPSAxO1xuY29uc3QgU1BBQ0VTX0FORF9FUVVBTFMgPSAyO1xuY29uc3QgUVVPVEVfQ0hBUiA9IDM7XG5jb25zdCBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCA9IC8nL2c7XG5jb25zdCBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCA9IC9cIi9nO1xuLyoqXG4gKiBNYXRjaGVzIHRoZSByYXcgdGV4dCBlbGVtZW50cy5cbiAqXG4gKiBDb21tZW50cyBhcmUgbm90IHBhcnNlZCB3aXRoaW4gcmF3IHRleHQgZWxlbWVudHMsIHNvIHdlIG5lZWQgdG8gc2VhcmNoIHRoZWlyXG4gKiB0ZXh0IGNvbnRlbnQgZm9yIG1hcmtlciBzdHJpbmdzLlxuICovXG5jb25zdCByYXdUZXh0RWxlbWVudCA9IC9eKD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlKSQvaTtcbi8qKiBUZW1wbGF0ZVJlc3VsdCB0eXBlcyAqL1xuY29uc3QgSFRNTF9SRVNVTFQgPSAxO1xuY29uc3QgU1ZHX1JFU1VMVCA9IDI7XG5jb25zdCBNQVRITUxfUkVTVUxUID0gMztcbi8vIFRlbXBsYXRlUGFydCB0eXBlc1xuLy8gSU1QT1JUQU5UOiB0aGVzZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZXMgaW4gUGFydFR5cGVcbmNvbnN0IEFUVFJJQlVURV9QQVJUID0gMTtcbmNvbnN0IENISUxEX1BBUlQgPSAyO1xuY29uc3QgUFJPUEVSVFlfUEFSVCA9IDM7XG5jb25zdCBCT09MRUFOX0FUVFJJQlVURV9QQVJUID0gNDtcbmNvbnN0IEVWRU5UX1BBUlQgPSA1O1xuY29uc3QgRUxFTUVOVF9QQVJUID0gNjtcbmNvbnN0IENPTU1FTlRfUEFSVCA9IDc7XG4vKipcbiAqIEdlbmVyYXRlcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFRlbXBsYXRlUmVzdWx0IHdpdGhcbiAqIHRoZSBnaXZlbiByZXN1bHQgdHlwZS5cbiAqL1xuY29uc3QgdGFnID0gKHR5cGUpID0+IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IHtcbiAgICAvLyBXYXJuIGFnYWluc3QgdGVtcGxhdGVzIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAvLyBXZSBkbyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gcmVuZGVyIHNvIHRoYXQgdGhlIHdhcm5pbmcgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHRlbXBsYXRlIGRlZmluaXRpb24uXG4gICAgaWYgKERFVl9NT0RFICYmIHN0cmluZ3Muc29tZSgocykgPT4gcyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1NvbWUgdGVtcGxhdGUgc3RyaW5ncyBhcmUgdW5kZWZpbmVkLlxcbicgK1xuICAgICAgICAgICAgJ1RoaXMgaXMgcHJvYmFibHkgY2F1c2VkIGJ5IGlsbGVnYWwgb2N0YWwgZXNjYXBlIHNlcXVlbmNlcy4nKTtcbiAgICB9XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIEltcG9ydCBzdGF0aWMtaHRtbC5qcyByZXN1bHRzIGluIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aGljaCBnMyBkb2Vzbid0XG4gICAgICAgIC8vIGhhbmRsZS4gSW5zdGVhZCB3ZSBrbm93IHRoYXQgc3RhdGljIHZhbHVlcyBtdXN0IGhhdmUgdGhlIGZpZWxkXG4gICAgICAgIC8vIGBfJGxpdFN0YXRpYyRgLlxuICAgICAgICBpZiAodmFsdWVzLnNvbWUoKHZhbCkgPT4gdmFsPy5bJ18kbGl0U3RhdGljJCddKSkge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCcnLCBgU3RhdGljIHZhbHVlcyAnbGl0ZXJhbCcgb3IgJ3Vuc2FmZVN0YXRpYycgY2Fubm90IGJlIHVzZWQgYXMgdmFsdWVzIHRvIG5vbi1zdGF0aWMgdGVtcGxhdGVzLlxcbmAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgdXNlIHRoZSBzdGF0aWMgJ2h0bWwnIHRhZyBmdW5jdGlvbi4gU2VlIGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jc3RhdGljLWV4cHJlc3Npb25zYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgWydfJGxpdFR5cGUkJ106IHR5cGUsXG4gICAgICAgIHN0cmluZ3MsXG4gICAgICAgIHZhbHVlcyxcbiAgICB9O1xufTtcbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gSFRNTCB0ZW1wbGF0ZSB0aGF0IGNhbiBlZmZpY2llbnRseVxuICogcmVuZGVyIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGhlYWRlciA9ICh0aXRsZTogc3RyaW5nKSA9PiBodG1sYDxoMT4ke3RpdGxlfTwvaDE+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgaHRtbGAgdGFnIHJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRE9NIHRvIHJlbmRlciBhcyBhIHZhbHVlLiBJdCBpc1xuICogbGF6eSwgbWVhbmluZyBubyB3b3JrIGlzIGRvbmUgdW50aWwgdGhlIHRlbXBsYXRlIGlzIHJlbmRlcmVkLiBXaGVuIHJlbmRlcmluZyxcbiAqIGlmIGEgdGVtcGxhdGUgY29tZXMgZnJvbSB0aGUgc2FtZSBleHByZXNzaW9uIGFzIGEgcHJldmlvdXNseSByZW5kZXJlZCByZXN1bHQsXG4gKiBpdCdzIGVmZmljaWVudGx5IHVwZGF0ZWQgaW5zdGVhZCBvZiByZXBsYWNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGh0bWwgPSB0YWcoSFRNTF9SRVNVTFQpO1xuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBTVkcgZnJhZ21lbnQgdGhhdCBjYW4gZWZmaWNpZW50bHkgcmVuZGVyXG4gKiB0byBhbmQgdXBkYXRlIGEgY29udGFpbmVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCByZWN0ID0gc3ZnYDxyZWN0IHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiPjwvcmVjdD5gO1xuICpcbiAqIGNvbnN0IG15SW1hZ2UgPSBodG1sYFxuICogICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gKiAgICAgJHtyZWN0fVxuICogICA8L3N2Zz5gO1xuICogYGBgXG4gKlxuICogVGhlIGBzdmdgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIFNWRyBmcmFnbWVudHMsIG9yIGVsZW1lbnRzXG4gKiB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGFuIGA8c3ZnPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vbiBlcnJvciBpc1xuICogcGxhY2luZyBhbiBgPHN2Zz5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgc3ZnYCB0YWdcbiAqIGZ1bmN0aW9uLiBUaGUgYDxzdmc+YCBlbGVtZW50IGlzIGFuIEhUTUwgZWxlbWVudCBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aGluIGFcbiAqIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSB7QGxpbmtjb2RlIGh0bWx9IHRhZyBmdW5jdGlvbi5cbiAqXG4gKiBJbiBMaXRFbGVtZW50IHVzYWdlLCBpdCdzIGludmFsaWQgdG8gcmV0dXJuIGFuIFNWRyBmcmFnbWVudCBmcm9tIHRoZVxuICogYHJlbmRlcigpYCBtZXRob2QsIGFzIHRoZSBTVkcgZnJhZ21lbnQgd2lsbCBiZSBjb250YWluZWQgd2l0aGluIHRoZSBlbGVtZW50J3NcbiAqIHNoYWRvdyByb290IGFuZCB0aHVzIG5vdCBiZSBwcm9wZXJseSBjb250YWluZWQgd2l0aGluIGFuIGA8c3ZnPmAgSFRNTFxuICogZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN2ZyA9IHRhZyhTVkdfUkVTVUxUKTtcbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgTWF0aE1MIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgbnVtID0gbWF0aG1sYDxtbj4xPC9tbj5gO1xuICpcbiAqIGNvbnN0IGVxID0gaHRtbGBcbiAqICAgPG1hdGg+XG4gKiAgICAgJHtudW19XG4gKiAgIDwvbWF0aD5gO1xuICogYGBgXG4gKlxuICogVGhlIGBtYXRobWxgICp0YWcgZnVuY3Rpb24qIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIE1hdGhNTCBmcmFnbWVudHMsIG9yXG4gKiBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGNvbnRhaW5lZCAqKmluc2lkZSoqIGEgYDxtYXRoPmAgSFRNTCBlbGVtZW50LiBBIGNvbW1vblxuICogZXJyb3IgaXMgcGxhY2luZyBhIGA8bWF0aD5gICplbGVtZW50KiBpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSBgbWF0aG1sYFxuICogdGFnIGZ1bmN0aW9uLiBUaGUgYDxtYXRoPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkXG4gKiB3aXRoaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBNYXRoTUwgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgTWF0aE1MIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGVcbiAqIGVsZW1lbnQncyBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhIGA8bWF0aD5gXG4gKiBIVE1MIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXRobWwgPSB0YWcoTUFUSE1MX1JFU1VMVCk7XG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIHRoYXQgYSB2YWx1ZSB3YXMgaGFuZGxlZCBieSBhIGRpcmVjdGl2ZSBhbmRcbiAqIHNob3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxuICovXG5leHBvcnQgY29uc3Qgbm9DaGFuZ2UgPSBTeW1ib2wuZm9yKCdsaXQtbm9DaGFuZ2UnKTtcbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgYSBDaGlsZFBhcnQgdG8gZnVsbHkgY2xlYXIgaXRzIGNvbnRlbnQuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGJ1dHRvbiA9IGh0bWxgJHtcbiAqICB1c2VyLmlzQWRtaW5cbiAqICAgID8gaHRtbGA8YnV0dG9uPkRFTEVURTwvYnV0dG9uPmBcbiAqICAgIDogbm90aGluZ1xuICogfWA7XG4gKiBgYGBcbiAqXG4gKiBQcmVmZXIgdXNpbmcgYG5vdGhpbmdgIG92ZXIgb3RoZXIgZmFsc3kgdmFsdWVzIGFzIGl0IHByb3ZpZGVzIGEgY29uc2lzdGVudFxuICogYmVoYXZpb3IgYmV0d2VlbiB2YXJpb3VzIGV4cHJlc3Npb24gYmluZGluZyBjb250ZXh0cy5cbiAqXG4gKiBJbiBjaGlsZCBleHByZXNzaW9ucywgYHVuZGVmaW5lZGAsIGBudWxsYCwgYCcnYCwgYW5kIGBub3RoaW5nYCBhbGwgYmVoYXZlIHRoZVxuICogc2FtZSBhbmQgcmVuZGVyIG5vIG5vZGVzLiBJbiBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMsIGBub3RoaW5nYCBfcmVtb3Zlc18gdGhlXG4gKiBhdHRyaWJ1dGUsIHdoaWxlIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgd2lsbCByZW5kZXIgYW4gZW1wdHkgc3RyaW5nLiBJblxuICogcHJvcGVydHkgZXhwcmVzc2lvbnMgYG5vdGhpbmdgIGJlY29tZXMgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBub3RoaW5nID0gU3ltYm9sLmZvcignbGl0LW5vdGhpbmcnKTtcbi8qKlxuICogVGhlIGNhY2hlIG9mIHByZXBhcmVkIHRlbXBsYXRlcywga2V5ZWQgYnkgdGhlIHRhZ2dlZCBUZW1wbGF0ZVN0cmluZ3NBcnJheVxuICogYW5kIF9ub3RfIGFjY291bnRpbmcgZm9yIHRoZSBzcGVjaWZpYyB0ZW1wbGF0ZSB0YWcgdXNlZC4gVGhpcyBtZWFucyB0aGF0XG4gKiB0ZW1wbGF0ZSB0YWdzIGNhbm5vdCBiZSBkeW5hbWljIC0gdGhleSBtdXN0IHN0YXRpY2FsbHkgYmUgb25lIG9mIGh0bWwsIHN2ZyxcbiAqIG9yIGF0dHIuIFRoaXMgcmVzdHJpY3Rpb24gc2ltcGxpZmllcyB0aGUgY2FjaGUgbG9va3VwLCB3aGljaCBpcyBvbiB0aGUgaG90XG4gKiBwYXRoIGZvciByZW5kZXJpbmcuXG4gKi9cbmNvbnN0IHRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuY29uc3Qgd2Fsa2VyID0gZC5jcmVhdGVUcmVlV2Fsa2VyKGQsIDEyOSAvKiBOb2RlRmlsdGVyLlNIT1dfe0VMRU1FTlR8Q09NTUVOVH0gKi8pO1xubGV0IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCA9IG5vb3BTYW5pdGl6ZXI7XG5mdW5jdGlvbiB0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyh0c2EsIHN0cmluZ0Zyb21UU0EpIHtcbiAgICAvLyBBIHNlY3VyaXR5IGNoZWNrIHRvIHByZXZlbnQgc3Bvb2Zpbmcgb2YgTGl0IHRlbXBsYXRlIHJlc3VsdHMuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSwgd2UgbWF5IGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIHdpdGggQXJyYXkuaXNUZW1wbGF0ZU9iamVjdCxcbiAgICAvLyB0aG91Z2ggd2UgbWlnaHQgbmVlZCB0byBtYWtlIHRoYXQgY2hlY2sgaW5zaWRlIG9mIHRoZSBodG1sIGFuZCBzdmdcbiAgICAvLyBmdW5jdGlvbnMsIGJlY2F1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzIGRvbid0IGNvbWUgaW4gYXNcbiAgICAvLyBUZW1wbGF0ZVN0cmluZ0FycmF5IG9iamVjdHMuXG4gICAgaWYgKCFpc0FycmF5KHRzYSkgfHwgIXRzYS5oYXNPd25Qcm9wZXJ0eSgncmF3JykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSAnaW52YWxpZCB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5JztcbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYFxuICAgICAgICAgIEludGVybmFsIEVycm9yOiBleHBlY3RlZCB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGJlIGFuIGFycmF5XG4gICAgICAgICAgd2l0aCBhICdyYXcnIGZpZWxkLiBGYWtpbmcgYSB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5IGJ5XG4gICAgICAgICAgY2FsbGluZyBodG1sIG9yIHN2ZyBsaWtlIGFuIG9yZGluYXJ5IGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5XG4gICAgICAgICAgdGhlIHNhbWUgYXMgY2FsbGluZyB1bnNhZmVIdG1sIGFuZCBjYW4gbGVhZCB0byBtYWpvciBzZWN1cml0eVxuICAgICAgICAgIGlzc3VlcywgZS5nLiBvcGVuaW5nIHlvdXIgY29kZSB1cCB0byBYU1MgYXR0YWNrcy5cbiAgICAgICAgICBJZiB5b3UncmUgdXNpbmcgdGhlIGh0bWwgb3Igc3ZnIHRhZ2dlZCB0ZW1wbGF0ZSBmdW5jdGlvbnMgbm9ybWFsbHlcbiAgICAgICAgICBhbmQgc3RpbGwgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGEgYnVnIGF0XG4gICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzL25ldz90ZW1wbGF0ZT1idWdfcmVwb3J0Lm1kXG4gICAgICAgICAgYW5kIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBidWlsZCB0b29saW5nLCBpZiBhbnkuXG4gICAgICAgIGBcbiAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbiAqL2csICdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBwb2xpY3kgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHBvbGljeS5jcmVhdGVIVE1MKHN0cmluZ0Zyb21UU0EpXG4gICAgICAgIDogc3RyaW5nRnJvbVRTQTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBIVE1MIHN0cmluZyBmb3IgdGhlIGdpdmVuIFRlbXBsYXRlU3RyaW5nc0FycmF5IGFuZCByZXN1bHQgdHlwZVxuICogKEhUTUwgb3IgU1ZHKSwgYWxvbmcgd2l0aCB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluXG4gKiB0ZW1wbGF0ZSBvcmRlci4gVGhlIEhUTUwgY29udGFpbnMgY29tbWVudCBtYXJrZXJzIGRlbm90aW5nIHRoZSBgQ2hpbGRQYXJ0YHNcbiAqIGFuZCBzdWZmaXhlcyBvbiBib3VuZCBhdHRyaWJ1dGVzIGRlbm90aW5nIHRoZSBgQXR0cmlidXRlUGFydHNgLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcbiAqIEBwYXJhbSB0eXBlIEhUTUwgb3IgU1ZHXG4gKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgYFtodG1sLCBhdHRyTmFtZXNdYCAoYXJyYXkgcmV0dXJuZWQgZm9yIHRlcnNlbmVzcyxcbiAqICAgICB0byBhdm9pZCBvYmplY3QgZmllbGRzIHNpbmNlIHRoaXMgY29kZSBpcyBzaGFyZWQgd2l0aCBub24tbWluaWZpZWQgU1NSXG4gKiAgICAgY29kZSlcbiAqL1xuY29uc3QgZ2V0VGVtcGxhdGVIdG1sID0gKHN0cmluZ3MsIHR5cGUpID0+IHtcbiAgICAvLyBJbnNlcnQgbWFrZXJzIGludG8gdGhlIHRlbXBsYXRlIEhUTUwgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGlvbiBvZlxuICAgIC8vIGJpbmRpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgc2NhbnMgdGhlIHRlbXBsYXRlIHN0cmluZ3MgdG8gZGV0ZXJtaW5lIHRoZVxuICAgIC8vIHN5bnRhY3RpYyBwb3NpdGlvbiBvZiB0aGUgYmluZGluZ3MuIFRoZXkgY2FuIGJlIGluIHRleHQgcG9zaXRpb24sIHdoZXJlXG4gICAgLy8gd2UgaW5zZXJ0IGFuIEhUTUwgY29tbWVudCwgYXR0cmlidXRlIHZhbHVlIHBvc2l0aW9uLCB3aGVyZSB3ZSBpbnNlcnQgYVxuICAgIC8vIHNlbnRpbmVsIHN0cmluZyBhbmQgcmUtd3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBvciBpbnNpZGUgYSB0YWcgd2hlcmVcbiAgICAvLyB3ZSBpbnNlcnQgdGhlIHNlbnRpbmVsIHN0cmluZy5cbiAgICBjb25zdCBsID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIC8vIFN0b3JlcyB0aGUgY2FzZS1zZW5zaXRpdmUgYm91bmQgYXR0cmlidXRlIG5hbWVzIGluIHRoZSBvcmRlciBvZiB0aGVpclxuICAgIC8vIHBhcnRzLiBFbGVtZW50UGFydHMgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoaXMgYXJyYXkgYXMgdW5kZWZpbmVkXG4gICAgLy8gcmF0aGVyIHRoYW4gYSBzdHJpbmcsIHRvIGRpc2FtYmlndWF0ZSBmcm9tIGF0dHJpYnV0ZSBiaW5kaW5ncy5cbiAgICBjb25zdCBhdHRyTmFtZXMgPSBbXTtcbiAgICBsZXQgaHRtbCA9IHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPHN2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8bWF0aD4nIDogJyc7XG4gICAgLy8gV2hlbiB3ZSdyZSBpbnNpZGUgYSByYXcgdGV4dCB0YWcgKG5vdCBpdCdzIHRleHQgY29udGVudCksIHRoZSByZWdleFxuICAgIC8vIHdpbGwgc3RpbGwgYmUgdGFnUmVnZXggc28gd2UgY2FuIGZpbmQgYXR0cmlidXRlcywgYnV0IHdpbGwgc3dpdGNoIHRvXG4gICAgLy8gdGhpcyByZWdleCB3aGVuIHRoZSB0YWcgZW5kcy5cbiAgICBsZXQgcmF3VGV4dEVuZFJlZ2V4O1xuICAgIC8vIFRoZSBjdXJyZW50IHBhcnNpbmcgc3RhdGUsIHJlcHJlc2VudGVkIGFzIGEgcmVmZXJlbmNlIHRvIG9uZSBvZiB0aGVcbiAgICAvLyByZWdleGVzXG4gICAgbGV0IHJlZ2V4ID0gdGV4dEVuZFJlZ2V4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHMgPSBzdHJpbmdzW2ldO1xuICAgICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbmFtZS4gV2hlbiB0aGlzIGlzXG4gICAgICAgIC8vIHBvc2l0aXZlIGF0IGVuZCBvZiBhIHN0cmluZywgaXQgbWVhbnMgd2UncmUgaW4gYW4gYXR0cmlidXRlIHZhbHVlXG4gICAgICAgIC8vIHBvc2l0aW9uIGFuZCBuZWVkIHRvIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAgICAvLyBXZSBhbHNvIHVzZSBhIHNwZWNpYWwgdmFsdWUgb2YgLTIgdG8gaW5kaWNhdGUgdGhhdCB3ZSBlbmNvdW50ZXJlZFxuICAgICAgICAvLyB0aGUgZW5kIG9mIGEgc3RyaW5nIGluIGF0dHJpYnV0ZSBuYW1lIHBvc2l0aW9uLlxuICAgICAgICBsZXQgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgICAgICBsZXQgYXR0ck5hbWU7XG4gICAgICAgIGxldCBsYXN0SW5kZXggPSAwO1xuICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgIC8vIFRoZSBjb25kaXRpb25zIGluIHRoaXMgbG9vcCBoYW5kbGUgdGhlIGN1cnJlbnQgcGFyc2Ugc3RhdGUsIGFuZCB0aGVcbiAgICAgICAgLy8gYXNzaWdubWVudHMgdG8gdGhlIGByZWdleGAgdmFyaWFibGUgYXJlIHRoZSBzdGF0ZSB0cmFuc2l0aW9ucy5cbiAgICAgICAgd2hpbGUgKGxhc3RJbmRleCA8IHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgcHJldmlvdXNseSBsZWZ0IG9mZlxuICAgICAgICAgICAgcmVnZXgubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5leGVjKHMpO1xuICAgICAgICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0SW5kZXggPSByZWdleC5sYXN0SW5kZXg7XG4gICAgICAgICAgICBpZiAocmVnZXggPT09IHRleHRFbmRSZWdleCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFtDT01NRU5UX1NUQVJUXSA9PT0gJyEtLScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjb21tZW50RW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoW0NPTU1FTlRfU1RBUlRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc3RhcnRlZCBhIHdlaXJkIGNvbW1lbnQsIGxpa2UgPC97XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gY29tbWVudDJFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3QobWF0Y2hbVEFHX05BTUVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3JkIGlmIHdlIGVuY291bnRlciBhIHJhdy10ZXh0IGVsZW1lbnQuIFdlJ2xsIHN3aXRjaCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZWdleCBhdCB0aGUgZW5kIG9mIHRoZSB0YWcuXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdUZXh0RW5kUmVnZXggPSBuZXcgUmVnRXhwKGA8LyR7bWF0Y2hbVEFHX05BTUVdfWAsICdnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbRFlOQU1JQ19UQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmluZGluZ3MgaW4gdGFnIG5hbWVzIGFyZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHN0YXRpYyB0ZW1wbGF0ZXMgaW5zdGVhZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9ucycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVnZXggPT09IHRhZ0VuZFJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoW0VOVElSRV9NQVRDSF0gPT09ICc+Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgYSB0YWcuIElmIHdlIGhhZCBzdGFydGVkIGEgcmF3LXRleHQgZWxlbWVudCwgdXNlIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVnZXhcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSByYXdUZXh0RW5kUmVnZXggPz8gdGV4dEVuZFJlZ2V4O1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgYmUgZW5kaW5nIGFuIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZSwgc28gbWFrZSBzdXJlIHdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIGFueSBwZW5kaW5nIGF0dHJOYW1lRW5kSW5kZXhcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtBVFRSSUJVVEVfTkFNRV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdHRyaWJ1dGUgbmFtZSBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gcmVnZXgubGFzdEluZGV4IC0gbWF0Y2hbU1BBQ0VTX0FORF9FUVVBTFNdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBtYXRjaFtBVFRSSUJVVEVfTkFNRV07XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoW1FVT1RFX0NIQVJdID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ0VuZFJlZ2V4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXRjaFtRVU9URV9DSEFSXSA9PT0gJ1wiJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2luZ2xlUXVvdGVBdHRyRW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2V4ID09PSBjb21tZW50RW5kUmVnZXggfHwgcmVnZXggPT09IGNvbW1lbnQyRW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdCBvbmUgb2YgdGhlIGZpdmUgc3RhdGUgcmVnZXhlcywgc28gaXQgbXVzdCBiZSB0aGUgZHluYW1pY2FsbHlcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHJhdyB0ZXh0IHJlZ2V4IGFuZCB3ZSdyZSBhdCB0aGUgY2xvc2Ugb2YgdGhhdCBlbGVtZW50LlxuICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGF0dHJOYW1lRW5kSW5kZXgsIHdoaWNoIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAgICAgICAgICAgLy8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIGFzc2VydCB0aGF0IHdlJ3JlIGluIGEgdmFsaWQgYXR0cmlidXRlXG4gICAgICAgICAgICAvLyBwb3NpdGlvbiAtIGVpdGhlciBpbiBhIHRhZywgb3IgYSBxdW90ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTEgfHxcbiAgICAgICAgICAgICAgICByZWdleCA9PT0gdGFnRW5kUmVnZXggfHxcbiAgICAgICAgICAgICAgICByZWdleCA9PT0gc2luZ2xlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgICAgICAgICByZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXgsICd1bmV4cGVjdGVkIHBhcnNlIHN0YXRlIEInKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIGZvdXIgY2FzZXM6XG4gICAgICAgIC8vICAxLiBXZSdyZSBpbiB0ZXh0IHBvc2l0aW9uLCBhbmQgbm90IGluIGEgcmF3IHRleHQgZWxlbWVudFxuICAgICAgICAvLyAgICAgKHJlZ2V4ID09PSB0ZXh0RW5kUmVnZXgpOiBpbnNlcnQgYSBjb21tZW50IG1hcmtlci5cbiAgICAgICAgLy8gIDIuIFdlIGhhdmUgYSBub24tbmVnYXRpdmUgYXR0ck5hbWVFbmRJbmRleCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvXG4gICAgICAgIC8vICAgICByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBhZGQgYSBib3VuZCBhdHRyaWJ1dGUgc3VmZml4LlxuICAgICAgICAvLyAgMy4gV2UncmUgYXQgdGhlIG5vbi1maXJzdCBiaW5kaW5nIGluIGEgbXVsdGktYmluZGluZyBhdHRyaWJ1dGUsIHVzZSBhXG4gICAgICAgIC8vICAgICBwbGFpbiBtYXJrZXIuXG4gICAgICAgIC8vICA0LiBXZSdyZSBzb21ld2hlcmUgZWxzZSBpbnNpZGUgdGhlIHRhZy4gSWYgd2UncmUgaW4gYXR0cmlidXRlIG5hbWVcbiAgICAgICAgLy8gICAgIHBvc2l0aW9uIChhdHRyTmFtZUVuZEluZGV4ID09PSAtMiksIGFkZCBhIHNlcXVlbnRpYWwgc3VmZml4IHRvXG4gICAgICAgIC8vICAgICBnZW5lcmF0ZSBhIHVuaXF1ZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgICAgLy8gRGV0ZWN0IGEgYmluZGluZyBuZXh0IHRvIHNlbGYtY2xvc2luZyB0YWcgZW5kIGFuZCBpbnNlcnQgYSBzcGFjZSB0b1xuICAgICAgICAvLyBzZXBhcmF0ZSB0aGUgbWFya2VyIGZyb20gdGhlIHRhZyBlbmQ6XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlZ2V4ID09PSB0YWdFbmRSZWdleCAmJiBzdHJpbmdzW2kgKyAxXS5zdGFydHNXaXRoKCcvPicpID8gJyAnIDogJyc7XG4gICAgICAgIGh0bWwgKz1cbiAgICAgICAgICAgIHJlZ2V4ID09PSB0ZXh0RW5kUmVnZXhcbiAgICAgICAgICAgICAgICA/IHMgKyBub2RlTWFya2VyXG4gICAgICAgICAgICAgICAgOiBhdHRyTmFtZUVuZEluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAgICAgPyAoYXR0ck5hbWVzLnB1c2goYXR0ck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcy5zbGljZSgwLCBhdHRyTmFtZUVuZEluZGV4KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRBdHRyaWJ1dGVTdWZmaXggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2xpY2UoYXR0ck5hbWVFbmRJbmRleCkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICAgICAgICAgICAgOiBzICsgbWFya2VyICsgKGF0dHJOYW1lRW5kSW5kZXggPT09IC0yID8gaSA6IGVuZCk7XG4gICAgfVxuICAgIGNvbnN0IGh0bWxSZXN1bHQgPSBodG1sICtcbiAgICAgICAgKHN0cmluZ3NbbF0gfHwgJzw/PicpICtcbiAgICAgICAgKHR5cGUgPT09IFNWR19SRVNVTFQgPyAnPC9zdmc+JyA6IHR5cGUgPT09IE1BVEhNTF9SRVNVTFQgPyAnPC9tYXRoPicgOiAnJyk7XG4gICAgLy8gUmV0dXJuZWQgYXMgYW4gYXJyYXkgZm9yIHRlcnNlbmVzc1xuICAgIHJldHVybiBbdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoc3RyaW5ncywgaHRtbFJlc3VsdCksIGF0dHJOYW1lc107XG59O1xuY2xhc3MgVGVtcGxhdGUge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgeyBzdHJpbmdzLCBbJ18kbGl0VHlwZSQnXTogdHlwZSB9LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGFydHMgPSBbXTtcbiAgICAgICAgbGV0IG5vZGU7XG4gICAgICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgICAgICBsZXQgYXR0ck5hbWVJbmRleCA9IDA7XG4gICAgICAgIGNvbnN0IHBhcnRDb3VudCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzO1xuICAgICAgICAvLyBDcmVhdGUgdGVtcGxhdGUgZWxlbWVudFxuICAgICAgICBjb25zdCBbaHRtbCwgYXR0ck5hbWVzXSA9IGdldFRlbXBsYXRlSHRtbChzdHJpbmdzLCB0eXBlKTtcbiAgICAgICAgdGhpcy5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IHRoaXMuZWwuY29udGVudDtcbiAgICAgICAgLy8gUmUtcGFyZW50IFNWRyBvciBNYXRoTUwgbm9kZXMgaW50byB0ZW1wbGF0ZSByb290XG4gICAgICAgIGlmICh0eXBlID09PSBTVkdfUkVTVUxUIHx8IHR5cGUgPT09IE1BVEhNTF9SRVNVTFQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmVsLmNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdyYXBwZXIucmVwbGFjZVdpdGgoLi4ud3JhcHBlci5jaGlsZE5vZGVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWxrIHRoZSB0ZW1wbGF0ZSB0byBmaW5kIGJpbmRpbmcgbWFya2VycyBhbmQgY3JlYXRlIFRlbXBsYXRlUGFydHNcbiAgICAgICAgd2hpbGUgKChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpICE9PSBudWxsICYmIHBhcnRzLmxlbmd0aCA8IHBhcnRDb3VudCkge1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnID0gbm9kZS5sb2NhbE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdhcm4gaWYgYHRleHRhcmVhYCBpbmNsdWRlcyBhbiBleHByZXNzaW9uIGFuZCB0aHJvdyBpZiBgdGVtcGxhdGVgXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc2luY2UgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQuIFdlIGRvIHRoaXMgYnkgY2hlY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5uZXJIVE1MIGZvciBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBtYXJrZXIuIFRoaXMgY2F0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAvLyBjYXNlcyBsaWtlIGJpbmRpbmdzIGluIHRleHRhcmVhIHRoZXJlIG1hcmtlcnMgdHVybiBpbnRvIHRleHQgbm9kZXMuXG4gICAgICAgICAgICAgICAgICAgIGlmICgvXig/OnRleHRhcmVhfHRlbXBsYXRlKSQvaS50ZXN0KHRhZykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuaW5uZXJIVE1MLmluY2x1ZGVzKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBgRXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIFxcYCR7dGFnfVxcYCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZWxlbWVudHMuIFNlZSBodHRwczovL2xpdC5kZXYvbXNnL2V4cHJlc3Npb24taW4tJHt0YWd9IGZvciBtb3JlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBpbmZvcm1hdGlvbi5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ3RlbXBsYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJycsIG0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBmb3IgYXR0ZW1wdGVkIGR5bmFtaWMgdGFnIG5hbWVzLCB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCB0aGUgYmluZGluZ0luZGV4LCBhbmQgaXQnbGwgYmUgb2ZmIGJ5IDEgaW4gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAvLyBhbmQgb2ZmIGJ5IHR3byBhZnRlciBpdC5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5vZGUuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoYm91bmRBdHRyaWJ1dGVTdWZmaXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbE5hbWUgPSBhdHRyTmFtZXNbYXR0ck5hbWVJbmRleCsrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpY3MgPSB2YWx1ZS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSAvKFsuP0BdKT8oLiopLy5leGVjKHJlYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQVRUUklCVVRFX1BBUlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1bMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3M6IHN0YXRpY3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0b3I6IG1bMV0gPT09ICcuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQcm9wZXJ0eVBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVsxXSA9PT0gJz8nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCb29sZWFuQXR0cmlidXRlUGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVsxXSA9PT0gJ0AnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRXZlbnRQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQXR0cmlidXRlUGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChtYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEVMRU1FTlRfUEFSVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG5vZGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogYmVuY2htYXJrIHRoZSByZWdleCBhZ2FpbnN0IHRlc3RpbmcgZm9yIGVhY2hcbiAgICAgICAgICAgICAgICAvLyBvZiB0aGUgMyByYXcgdGV4dCBlbGVtZW50IG5hbWVzLlxuICAgICAgICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG5vZGUudGFnTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHJhdyB0ZXh0IGVsZW1lbnRzIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHRleHQgY29udGVudCBvblxuICAgICAgICAgICAgICAgICAgICAvLyBtYXJrZXJzLCBjcmVhdGUgYSBUZXh0IG5vZGUgZm9yIGVhY2ggc2VnbWVudCwgYW5kIGNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIFRlbXBsYXRlUGFydCBmb3IgZWFjaCBtYXJrZXIuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ3MgPSBub2RlLnRleHRDb250ZW50LnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSB0cnVzdGVkVHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydXN0ZWRUeXBlcy5lbXB0eVNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIGVhY2ggbGl0ZXJhbCBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBub2RlcyBhcmUgYWxzbyB1c2VkIGFzIHRoZSBtYXJrZXJzIGZvciBjaGlsZCBwYXJ0c1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXN0SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKHN0cmluZ3NbaV0sIGNyZWF0ZU1hcmtlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHBhc3QgdGhlIG1hcmtlciBub2RlIHdlIGp1c3QgYWRkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgdHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6ICsrbm9kZUluZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBiZWNhdXNlIHRoaXMgbWFya2VyIGlzIGFkZGVkIGFmdGVyIHRoZSB3YWxrZXIncyBjdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub2RlLCBpdCB3aWxsIGJlIHdhbGtlZCB0byBpbiB0aGUgb3V0ZXIgbG9vcCAoYW5kIGlnbm9yZWQpLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBhZGp1c3Qgbm9kZUluZGV4IGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kKHN0cmluZ3NbbGFzdEluZGV4XSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub2RlLmRhdGE7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IG1hcmtlck1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyB0eXBlOiBDSElMRF9QQVJULCBpbmRleDogbm9kZUluZGV4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpID0gbm9kZS5kYXRhLmluZGV4T2YobWFya2VyLCBpICsgMSkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBub2RlIGhhcyBhIGJpbmRpbmcgbWFya2VyIGluc2lkZSwgbWFrZSBhbiBpbmFjdGl2ZSBwYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmluZGluZyB3b24ndCB3b3JrLCBidXQgc3Vic2VxdWVudCBiaW5kaW5ncyB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgdHlwZTogQ09NTUVOVF9QQVJULCBpbmRleDogbm9kZUluZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBtYXJrZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgZHVwbGljYXRlIGF0dHJpYnV0ZSBvbiBhIHRhZywgdGhlbiB3aGVuIHRoZSB0YWcgaXNcbiAgICAgICAgICAgIC8vIHBhcnNlZCBpbnRvIGFuIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSBnZXRzIGRlLWR1cGxpY2F0ZWQuIFdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoaXMgbWlzbWF0Y2ggaWYgd2UgaGF2ZW4ndCBwcmVjaXNlbHkgY29uc3VtZWQgZXZlcnkgYXR0cmlidXRlIG5hbWVcbiAgICAgICAgICAgIC8vIHdoZW4gcHJlcGFyaW5nIHRoZSB0ZW1wbGF0ZS4gVGhpcyB3b3JrcyBiZWNhdXNlIGBhdHRyTmFtZXNgIGlzIGJ1aWx0XG4gICAgICAgICAgICAvLyBmcm9tIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgYW5kIGBhdHRyTmFtZUluZGV4YCBjb21lcyBmcm9tIHByb2Nlc3NpbmcgdGhlXG4gICAgICAgICAgICAvLyByZXN1bHRpbmcgRE9NLlxuICAgICAgICAgICAgaWYgKGF0dHJOYW1lcy5sZW5ndGggIT09IGF0dHJOYW1lSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERldGVjdGVkIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgYmluZGluZ3MuIFRoaXMgb2NjdXJzIGlmIHlvdXIgdGVtcGxhdGUgYCArXG4gICAgICAgICAgICAgICAgICAgIGBoYXMgZHVwbGljYXRlIGF0dHJpYnV0ZXMgb24gYW4gZWxlbWVudCB0YWcuIEZvciBleGFtcGxlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgXCI8aW5wdXQgP2Rpc2FibGVkPVxcJHt0cnVlfSA/ZGlzYWJsZWQ9XFwke2ZhbHNlfT5cIiBjb250YWlucyBhIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZHVwbGljYXRlIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUuIFRoZSBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiBcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgJ2AnICtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5qb2luKCckey4uLn0nKSArXG4gICAgICAgICAgICAgICAgICAgICdgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgY291bGQgc2V0IHdhbGtlci5jdXJyZW50Tm9kZSB0byBhbm90aGVyIG5vZGUgaGVyZSB0byBwcmV2ZW50IGEgbWVtb3J5XG4gICAgICAgIC8vIGxlYWssIGJ1dCBldmVyeSB0aW1lIHdlIHByZXBhcmUgYSB0ZW1wbGF0ZSwgd2UgaW1tZWRpYXRlbHkgcmVuZGVyIGl0XG4gICAgICAgIC8vIGFuZCByZS11c2UgdGhlIHdhbGtlciBpbiBuZXcgVGVtcGxhdGVJbnN0YW5jZS5fY2xvbmUoKS5cbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ3RlbXBsYXRlIHByZXAnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0aGlzLFxuICAgICAgICAgICAgICAgIGNsb25hYmxlVGVtcGxhdGU6IHRoaXMuZWwsXG4gICAgICAgICAgICAgICAgcGFydHM6IHRoaXMucGFydHMsXG4gICAgICAgICAgICAgICAgc3RyaW5ncyxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAgIC8qKiBAbm9jb2xsYXBzZSAqL1xuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIF9vcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICBlbC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICByZXR1cm4gZWw7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdGl2ZShwYXJ0LCB2YWx1ZSwgcGFyZW50ID0gcGFydCwgYXR0cmlidXRlSW5kZXgpIHtcbiAgICAvLyBCYWlsIGVhcmx5IGlmIHRoZSB2YWx1ZSBpcyBleHBsaWNpdGx5IG5vQ2hhbmdlLiBOb3RlLCB0aGlzIG1lYW5zIGFueVxuICAgIC8vIG5lc3RlZCBkaXJlY3RpdmUgaXMgc3RpbGwgYXR0YWNoZWQgYW5kIGlzIG5vdCBydW4uXG4gICAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGxldCBjdXJyZW50RGlyZWN0aXZlID0gYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHBhcmVudC5fX2RpcmVjdGl2ZXM/LlthdHRyaWJ1dGVJbmRleF1cbiAgICAgICAgOiBwYXJlbnQuX19kaXJlY3RpdmU7XG4gICAgY29uc3QgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID0gaXNQcmltaXRpdmUodmFsdWUpXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgICAgIHZhbHVlWydfJGxpdERpcmVjdGl2ZSQnXTtcbiAgICBpZiAoY3VycmVudERpcmVjdGl2ZT8uY29uc3RydWN0b3IgIT09IG5leHREaXJlY3RpdmVDb25zdHJ1Y3Rvcikge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBjdXJyZW50RGlyZWN0aXZlPy5bJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGZhbHNlKTtcbiAgICAgICAgaWYgKG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZSA9IG5ldyBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IocGFydCk7XG4gICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlLl8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0cmlidXRlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgKHBhcmVudC5fX2RpcmVjdGl2ZXMgPz89IFtdKVthdHRyaWJ1dGVJbmRleF0gPVxuICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnQuX19kaXJlY3RpdmUgPSBjdXJyZW50RGlyZWN0aXZlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50RGlyZWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHBhcnQsIGN1cnJlbnREaXJlY3RpdmUuXyRyZXNvbHZlKHBhcnQsIHZhbHVlLnZhbHVlcyksIGN1cnJlbnREaXJlY3RpdmUsIGF0dHJpYnV0ZUluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBBbiB1cGRhdGVhYmxlIGluc3RhbmNlIG9mIGEgVGVtcGxhdGUuIEhvbGRzIHJlZmVyZW5jZXMgdG8gdGhlIFBhcnRzIHVzZWQgdG9cbiAqIHVwZGF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmNsYXNzIFRlbXBsYXRlSW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5fJHBhcnRzID0gW107XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuXyR0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICAvLyBDYWxsZWQgYnkgQ2hpbGRQYXJ0IHBhcmVudE5vZGUgZ2V0dGVyXG4gICAgZ2V0IHBhcmVudE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgc2VwYXJhdGUgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhXG4gICAgLy8gRG9jdW1lbnRGcmFnbWVudCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBob2xkIG9udG8gaXQgd2l0aCBhbiBpbnN0YW5jZSBmaWVsZC5cbiAgICBfY2xvbmUob3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGVsOiB7IGNvbnRlbnQgfSwgcGFydHM6IHBhcnRzLCB9ID0gdGhpcy5fJHRlbXBsYXRlO1xuICAgICAgICBjb25zdCBmcmFnbWVudCA9IChvcHRpb25zPy5jcmVhdGlvblNjb3BlID8/IGQpLmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSk7XG4gICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGZyYWdtZW50O1xuICAgICAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICBsZXQgbm9kZUluZGV4ID0gMDtcbiAgICAgICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgICAgIGxldCB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1swXTtcbiAgICAgICAgd2hpbGUgKHRlbXBsYXRlUGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobm9kZUluZGV4ID09PSB0ZW1wbGF0ZVBhcnQuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFydDtcbiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IENISUxEX1BBUlQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5ldyBDaGlsZFBhcnQobm9kZSwgbm9kZS5uZXh0U2libGluZywgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBBVFRSSUJVVEVfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IHRlbXBsYXRlUGFydC5jdG9yKG5vZGUsIHRlbXBsYXRlUGFydC5uYW1lLCB0ZW1wbGF0ZVBhcnQuc3RyaW5ncywgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBFTEVNRU5UX1BBUlQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5ldyBFbGVtZW50UGFydChub2RlLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fJHBhcnRzLnB1c2gocGFydCk7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQYXJ0ID0gcGFydHNbKytwYXJ0SW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVJbmRleCAhPT0gdGVtcGxhdGVQYXJ0Py5pbmRleCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgY3VycmVudE5vZGUgYXdheSBmcm9tIHRoZSBjbG9uZWQgdHJlZSBzbyB0aGF0IHdlXG4gICAgICAgIC8vIGRvbid0IGhvbGQgb250byB0aGUgdHJlZSBldmVuIGlmIHRoZSB0cmVlIGlzIGRldGFjaGVkIGFuZCBzaG91bGQgYmVcbiAgICAgICAgLy8gZnJlZWQuXG4gICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGQ7XG4gICAgICAgIHJldHVybiBmcmFnbWVudDtcbiAgICB9XG4gICAgX3VwZGF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgdGhpcy5fJHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdzZXQgcGFydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluc3RhbmNlOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocGFydC5zdHJpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlcywgcGFydCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRoZSBwYXJ0IGNvbnN1bWVzIGlzIHBhcnQuc3RyaW5ncy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHZhbHVlcyBhcmUgaW4gYmV0d2VlbiB0ZW1wbGF0ZSBzcGFucy4gV2UgaW5jcmVtZW50IGkgYnkgMVxuICAgICAgICAgICAgICAgICAgICAvLyBsYXRlciBpbiB0aGUgbG9vcCwgc28gaW5jcmVtZW50IGl0IGJ5IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgaSArPSBwYXJ0LnN0cmluZ3MubGVuZ3RoIC0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIENoaWxkUGFydCB7XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICAvLyBDaGlsZFBhcnRzIHRoYXQgYXJlIG5vdCBhdCB0aGUgcm9vdCBzaG91bGQgYWx3YXlzIGJlIGNyZWF0ZWQgd2l0aCBhXG4gICAgICAgIC8vIHBhcmVudDsgb25seSBSb290Q2hpbGROb2RlJ3Mgd29uJ3QsIHNvIHRoZXkgcmV0dXJuIHRoZSBsb2NhbCBpc0Nvbm5lY3RlZFxuICAgICAgICAvLyBzdGF0ZVxuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudD8uXyRpc0Nvbm5lY3RlZCA/PyB0aGlzLl9faXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHN0YXJ0Tm9kZSwgZW5kTm9kZSwgcGFyZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENISUxEX1BBUlQ7XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydHMgd2hlbiByZXF1aXJlZCBieVxuICAgICAgICAvLyBBc3luY0RpcmVjdGl2ZVxuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl8kc3RhcnROb2RlID0gc3RhcnROb2RlO1xuICAgICAgICB0aGlzLl8kZW5kTm9kZSA9IGVuZE5vZGU7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIC8vIE5vdGUgX19pc0Nvbm5lY3RlZCBpcyBvbmx5IGV2ZXIgYWNjZXNzZWQgb24gUm9vdFBhcnRzIChpLmUuIHdoZW4gdGhlcmUgaXNcbiAgICAgICAgLy8gbm8gXyRwYXJlbnQpOyB0aGUgdmFsdWUgb24gYSBub24tcm9vdC1wYXJ0IGlzIFwiZG9uJ3QgY2FyZVwiLCBidXQgY2hlY2tpbmdcbiAgICAgICAgLy8gZm9yIHBhcmVudCB3b3VsZCBiZSBtb3JlIGNvZGVcbiAgICAgICAgdGhpcy5fX2lzQ29ubmVjdGVkID0gb3B0aW9ucz8uaXNDb25uZWN0ZWQgPz8gdHJ1ZTtcbiAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgLy8gRXhwbGljaXRseSBpbml0aWFsaXplIGZvciBjb25zaXN0ZW50IGNsYXNzIHNoYXBlLlxuICAgICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IG5vZGUgaW50byB3aGljaCB0aGUgcGFydCByZW5kZXJzIGl0cyBjb250ZW50LlxuICAgICAqXG4gICAgICogQSBDaGlsZFBhcnQncyBjb250ZW50IGNvbnNpc3RzIG9mIGEgcmFuZ2Ugb2YgYWRqYWNlbnQgY2hpbGQgbm9kZXMgb2ZcbiAgICAgKiBgLnBhcmVudE5vZGVgLCBwb3NzaWJseSBib3JkZXJlZCBieSAnbWFya2VyIG5vZGVzJyAoYC5zdGFydE5vZGVgIGFuZFxuICAgICAqIGAuZW5kTm9kZWApLlxuICAgICAqXG4gICAgICogLSBJZiBib3RoIGAuc3RhcnROb2RlYCBhbmQgYC5lbmROb2RlYCBhcmUgbm9uLW51bGwsIHRoZW4gdGhlIHBhcnQncyBjb250ZW50XG4gICAgICogY29uc2lzdHMgb2YgYWxsIHNpYmxpbmdzIGJldHdlZW4gYC5zdGFydE5vZGVgIGFuZCBgLmVuZE5vZGVgLCBleGNsdXNpdmVseS5cbiAgICAgKlxuICAgICAqIC0gSWYgYC5zdGFydE5vZGVgIGlzIG5vbi1udWxsIGJ1dCBgLmVuZE5vZGVgIGlzIG51bGwsIHRoZW4gdGhlIHBhcnQnc1xuICAgICAqIGNvbnRlbnQgY29uc2lzdHMgb2YgYWxsIHNpYmxpbmdzIGZvbGxvd2luZyBgLnN0YXJ0Tm9kZWAsIHVwIHRvIGFuZFxuICAgICAqIGluY2x1ZGluZyB0aGUgbGFzdCBjaGlsZCBvZiBgLnBhcmVudE5vZGVgLiBJZiBgLmVuZE5vZGVgIGlzIG5vbi1udWxsLCB0aGVuXG4gICAgICogYC5zdGFydE5vZGVgIHdpbGwgYWx3YXlzIGJlIG5vbi1udWxsLlxuICAgICAqXG4gICAgICogLSBJZiBib3RoIGAuZW5kTm9kZWAgYW5kIGAuc3RhcnROb2RlYCBhcmUgbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICAgKiBjb25zaXN0cyBvZiBhbGwgY2hpbGQgbm9kZXMgb2YgYC5wYXJlbnROb2RlYC5cbiAgICAgKi9cbiAgICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuXyRwYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgcGFyZW50Tm9kZT8ubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlQgKi8pIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnROb2RlIGlzIGEgRG9jdW1lbnRGcmFnbWVudCwgaXQgbWF5IGJlIGJlY2F1c2UgdGhlIERPTSBpc1xuICAgICAgICAgICAgLy8gc3RpbGwgaW4gdGhlIGNsb25lZCBmcmFnbWVudCBkdXJpbmcgaW5pdGlhbCByZW5kZXI7IGlmIHNvLCBnZXQgdGhlIHJlYWxcbiAgICAgICAgICAgIC8vIHBhcmVudE5vZGUgdGhlIHBhcnQgd2lsbCBiZSBjb21taXR0ZWQgaW50byBieSBhc2tpbmcgdGhlIHBhcmVudC5cbiAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnQncyBsZWFkaW5nIG1hcmtlciBub2RlLCBpZiBhbnkuIFNlZSBgLnBhcmVudE5vZGVgIGZvciBtb3JlXG4gICAgICogaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHN0YXJ0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRzdGFydE5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0J3MgdHJhaWxpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBnZXQgZW5kTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRlbmROb2RlO1xuICAgIH1cbiAgICBfJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQgPSB0aGlzKSB7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBcXGBDaGlsZFBhcnRcXGAgaGFzIG5vIFxcYHBhcmVudE5vZGVcXGAgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYWNjZXB0IGEgdmFsdWUuIFRoaXMgbGlrZWx5IG1lYW5zIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIHBhcnQgd2FzIG1hbmlwdWxhdGVkIGluIGFuIHVuc3VwcG9ydGVkIHdheSBvdXRzaWRlIG9mIExpdCdzIGNvbnRyb2wgc3VjaCB0aGF0IHRoZSBwYXJ0J3MgbWFya2VyIG5vZGVzIHdlcmUgZWplY3RlZCBmcm9tIERPTS4gRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGVsZW1lbnQncyBcXGBpbm5lckhUTUxcXGAgb3IgXFxgdGV4dENvbnRlbnRcXGAgY2FuIGRvIHRoaXMuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgICAgICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBOb24tcmVuZGVyaW5nIGNoaWxkIHZhbHVlcy4gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGVzZSBkbyBub3QgcmVuZGVyXG4gICAgICAgICAgICAvLyBlbXB0eSB0ZXh0IG5vZGVzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIHByZXZlbnRpbmcgZGVmYXVsdCA8c2xvdD5cbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIGNvbnRlbnQuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcgfHwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm90aGluZyB0byBjaGlsZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuXyRzdGFydE5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLl8kZW5kTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWVbJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jb21taXRUZW1wbGF0ZVJlc3VsdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMub3B0aW9ucz8uaG9zdCA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21taXRUZXh0KGBbcHJvYmFibGUgbWlzdGFrZTogcmVuZGVyZWQgYSB0ZW1wbGF0ZSdzIGhvc3QgaW4gaXRzZWxmIGAgK1xuICAgICAgICAgICAgICAgICAgICBgKGNvbW1vbmx5IGNhdXNlZCBieSB3cml0aW5nIFxcJHt0aGlzfSBpbiBhIHRlbXBsYXRlXWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQXR0ZW1wdGVkIHRvIHJlbmRlciB0aGUgdGVtcGxhdGUgaG9zdGAsIHZhbHVlLCBgaW5zaWRlIGl0c2VsZi4gVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGEgbWlzdGFrZSwgYW5kIGluIGRldiBtb2RlIGAsIGB3ZSByZW5kZXIgc29tZSB3YXJuaW5nIHRleHQuIEluIHByb2R1Y3Rpb24gaG93ZXZlciwgd2UnbGwgYCwgYHJlbmRlciBpdCwgd2hpY2ggd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhbiBlcnJvciwgYW5kIHNvbWV0aW1lcyBgLCBgaW4gdGhlIGVsZW1lbnQgZGlzYXBwZWFyaW5nIGZyb20gdGhlIERPTS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jb21taXROb2RlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fY29tbWl0SXRlcmFibGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2ssIHdpbGwgcmVuZGVyIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9pbnNlcnQobm9kZSkge1xuICAgICAgICByZXR1cm4gd3JhcCh3cmFwKHRoaXMuXyRzdGFydE5vZGUpLnBhcmVudE5vZGUpLmluc2VydEJlZm9yZShub2RlLCB0aGlzLl8kZW5kTm9kZSk7XG4gICAgfVxuICAgIF9jb21taXROb2RlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MgJiZcbiAgICAgICAgICAgICAgICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgIT09IG5vb3BTYW5pdGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlTmFtZSA9IHRoaXMuXyRzdGFydE5vZGUucGFyZW50Tm9kZT8ubm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnIHx8IHBhcmVudE5vZGVOYW1lID09PSAnU0NSSVBUJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9ICdGb3JiaWRkZW4nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlTmFtZSA9PT0gJ1NUWUxFJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTGl0IGRvZXMgbm90IHN1cHBvcnQgYmluZGluZyBpbnNpZGUgc3R5bGUgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgaXMgYSBzZWN1cml0eSByaXNrLCBhcyBzdHlsZSBpbmplY3Rpb24gYXR0YWNrcyBjYW4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZXhmaWx0cmF0ZSBkYXRhIGFuZCBzcG9vZiBVSXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbnNpZGVyIGluc3RlYWQgdXNpbmcgY3NzXFxgLi4uXFxgIGxpdGVyYWxzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHRvIGNvbXBvc2Ugc3R5bGVzLCBhbmQgZG8gZHluYW1pYyBzdHlsaW5nIHdpdGggYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgY3NzIGN1c3RvbSBwcm9wZXJ0aWVzLCA6OnBhcnRzLCA8c2xvdD5zLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhbmQgYnkgbXV0YXRpbmcgdGhlIERPTSByYXRoZXIgdGhhbiBzdHlsZXNoZWV0cy5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzY3JpcHQgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgaXMgYSBzZWN1cml0eSByaXNrLCBhcyBpdCBjb3VsZCBhbGxvdyBhcmJpdHJhcnkgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgY29kZSBleGVjdXRpb24uYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IG5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLl8kcGFyZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHRoaXMuX2luc2VydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2NvbW1pdFRleHQodmFsdWUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGNvbW1pdHRlZCB2YWx1ZSBpcyBhIHByaW1pdGl2ZSBpdCBtZWFucyB3ZSBjYWxsZWQgX2NvbW1pdFRleHQgb25cbiAgICAgICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciwgYW5kIHdlIGtub3cgdGhhdCB0aGlzLl8kc3RhcnROb2RlLm5leHRTaWJsaW5nIGlzIGFcbiAgICAgICAgLy8gVGV4dCBub2RlLiBXZSBjYW4gbm93IGp1c3QgcmVwbGFjZSB0aGUgdGV4dCBjb250ZW50ICguZGF0YSkgb2YgdGhlIG5vZGUuXG4gICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IG5vdGhpbmcgJiZcbiAgICAgICAgICAgIGlzUHJpbWl0aXZlKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcihub2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3RleHRTYW5pdGl6ZXIodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkLmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21taXROb2RlKHRleHROb2RlKTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNldHRpbmcgdGV4dCBjb250ZW50LCBmb3Igc2VjdXJpdHkgcHVycG9zZXMgaXQgbWF0dGVycyBhIGxvdFxuICAgICAgICAgICAgICAgIC8vIHdoYXQgdGhlIHBhcmVudCBpcy4gRm9yIGV4YW1wbGUsIDxzdHlsZT4gYW5kIDxzY3JpcHQ+IG5lZWQgdG8gYmVcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIHdpdGggY2FyZSwgd2hpbGUgPHNwYW4+IGRvZXMgbm90LiBTbyBmaXJzdCB3ZSBuZWVkIHRvIHB1dCBhXG4gICAgICAgICAgICAgICAgLy8gdGV4dCBub2RlIGludG8gdGhlIGRvY3VtZW50LCB0aGVuIHdlIGNhbiBzYW5pdGl6ZSBpdHMgY29udGVudC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXIodGV4dE5vZGUsICdkYXRhJywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlOiB0ZXh0Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21taXROb2RlKGQuY3JlYXRlVGV4dE5vZGUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIF9jb21taXRUZW1wbGF0ZVJlc3VsdChyZXN1bHQpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgY29uc3QgeyB2YWx1ZXMsIFsnXyRsaXRUeXBlJCddOiB0eXBlIH0gPSByZXN1bHQ7XG4gICAgICAgIC8vIElmICRsaXRUeXBlJCBpcyBhIG51bWJlciwgcmVzdWx0IGlzIGEgcGxhaW4gVGVtcGxhdGVSZXN1bHQgYW5kIHdlIGdldFxuICAgICAgICAvLyB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgdGVtcGxhdGUgY2FjaGUuIElmIG5vdCwgcmVzdWx0IGlzIGFcbiAgICAgICAgLy8gQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCBhbmQgXyRsaXRUeXBlJCBpcyBhIENvbXBpbGVkVGVtcGxhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgLy8gdG8gY3JlYXRlIHRoZSA8dGVtcGxhdGU+IGVsZW1lbnQgdGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGl0LlxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHR5cGVvZiB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyB0aGlzLl8kZ2V0VGVtcGxhdGUocmVzdWx0KVxuICAgICAgICAgICAgOiAodHlwZS5lbCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgKHR5cGUuZWwgPSBUZW1wbGF0ZS5jcmVhdGVFbGVtZW50KHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHR5cGUuaCwgdHlwZS5oWzBdKSwgdGhpcy5vcHRpb25zKSksXG4gICAgICAgICAgICAgICAgdHlwZSk7XG4gICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWU/Ll8kdGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSB1cGRhdGluZycsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogdGhpcy5fJGNvbW1pdHRlZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0czogdGhpcy5fJGNvbW1pdHRlZFZhbHVlLl8kcGFydHMsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLl91cGRhdGUodmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFRlbXBsYXRlSW5zdGFuY2UodGVtcGxhdGUsIHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBpbnN0YW5jZS5fY2xvbmUodGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlLl91cGRhdGUodmFsdWVzKTtcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCBhbmQgdXBkYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUoZnJhZ21lbnQpO1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gaW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRnZXRUZW1wbGF0ZShyZXN1bHQpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGVtcGxhdGVDYWNoZS5nZXQocmVzdWx0LnN0cmluZ3MpO1xuICAgICAgICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGVtcGxhdGVDYWNoZS5zZXQocmVzdWx0LnN0cmluZ3MsICh0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXN1bHQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cbiAgICBfY29tbWl0SXRlcmFibGUodmFsdWUpIHtcbiAgICAgICAgLy8gRm9yIGFuIEl0ZXJhYmxlLCB3ZSBjcmVhdGUgYSBuZXcgSW5zdGFuY2VQYXJ0IHBlciBpdGVtLCB0aGVuIHNldCBpdHNcbiAgICAgICAgLy8gdmFsdWUgdG8gdGhlIGl0ZW0uIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIG92ZXJoZWFkIGZvciBldmVyeSBpdGVtIGluXG4gICAgICAgIC8vIGFuIEl0ZXJhYmxlLCBidXQgaXQgbGV0cyB1cyByZWN1cnNlIGVhc2lseSBhbmQgZWZmaWNpZW50bHkgdXBkYXRlIEFycmF5c1xuICAgICAgICAvLyBvZiBUZW1wbGF0ZVJlc3VsdHMgdGhhdCB3aWxsIGJlIGNvbW1vbmx5IHJldHVybmVkIGZyb20gZXhwcmVzc2lvbnMgbGlrZTpcbiAgICAgICAgLy8gYXJyYXkubWFwKChpKSA9PiBodG1sYCR7aX1gKSwgYnkgcmV1c2luZyBleGlzdGluZyBUZW1wbGF0ZUluc3RhbmNlcy5cbiAgICAgICAgLy8gSWYgdmFsdWUgaXMgYW4gYXJyYXksIHRoZW4gdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgb2YgYW5cbiAgICAgICAgLy8gaXRlcmFibGUgYW5kIHZhbHVlIHdpbGwgY29udGFpbiB0aGUgQ2hpbGRQYXJ0cyBmcm9tIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyByZW5kZXIuIElmIHZhbHVlIGlzIG5vdCBhbiBhcnJheSwgY2xlYXIgdGhpcyBwYXJ0IGFuZCBtYWtlIGEgbmV3XG4gICAgICAgIC8vIGFycmF5IGZvciBDaGlsZFBhcnRzLlxuICAgICAgICBpZiAoIWlzQXJyYXkodGhpcy5fJGNvbW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gW107XG4gICAgICAgICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBMZXRzIHVzIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgaXRlbXMgd2Ugc3RhbXBlZCBzbyB3ZSBjYW4gY2xlYXIgbGVmdG92ZXJcbiAgICAgICAgLy8gaXRlbXMgZnJvbSBhIHByZXZpb3VzIHJlbmRlclxuICAgICAgICBjb25zdCBpdGVtUGFydHMgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gICAgICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgICAgICBsZXQgaXRlbVBhcnQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHBhcnRJbmRleCA9PT0gaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIElmIG5vIGV4aXN0aW5nIHBhcnQsIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogdGVzdCBwZXJmIGltcGFjdCBvZiBhbHdheXMgY3JlYXRpbmcgdHdvIHBhcnRzXG4gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzaGFyaW5nIHBhcnRzIGJldHdlZW4gbm9kZXNcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9pc3N1ZXMvMTI2NlxuICAgICAgICAgICAgICAgIGl0ZW1QYXJ0cy5wdXNoKChpdGVtUGFydCA9IG5ldyBDaGlsZFBhcnQodGhpcy5faW5zZXJ0KGNyZWF0ZU1hcmtlcigpKSwgdGhpcy5faW5zZXJ0KGNyZWF0ZU1hcmtlcigpKSwgdGhpcywgdGhpcy5vcHRpb25zKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmV1c2UgYW4gZXhpc3RpbmcgcGFydFxuICAgICAgICAgICAgICAgIGl0ZW1QYXJ0ID0gaXRlbVBhcnRzW3BhcnRJbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtUGFydC5fJHNldFZhbHVlKGl0ZW0pO1xuICAgICAgICAgICAgcGFydEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRJbmRleCA8IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGl0ZW1QYXJ0cyBhbHdheXMgaGF2ZSBlbmQgbm9kZXNcbiAgICAgICAgICAgIHRoaXMuXyRjbGVhcihpdGVtUGFydCAmJiB3cmFwKGl0ZW1QYXJ0Ll8kZW5kTm9kZSkubmV4dFNpYmxpbmcsIHBhcnRJbmRleCk7XG4gICAgICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgcGFydHMgYXJyYXkgc28gX3ZhbHVlIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICAgICAgICBpdGVtUGFydHMubGVuZ3RoID0gcGFydEluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG5vZGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBQYXJ0IGZyb20gdGhlIERPTS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFydCBTdGFydCBub2RlIHRvIGNsZWFyIGZyb20sIGZvciBjbGVhcmluZyBhIHN1YnNldCBvZiB0aGUgcGFydCdzXG4gICAgICogICAgIERPTSAodXNlZCB3aGVuIHRydW5jYXRpbmcgaXRlcmFibGVzKVxuICAgICAqIEBwYXJhbSBmcm9tICBXaGVuIGBzdGFydGAgaXMgc3BlY2lmaWVkLCB0aGUgaW5kZXggd2l0aGluIHRoZSBpdGVyYWJsZSBmcm9tXG4gICAgICogICAgIHdoaWNoIENoaWxkUGFydHMgYXJlIGJlaW5nIHJlbW92ZWQsIHVzZWQgZm9yIGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlc1xuICAgICAqICAgICBpbiB0aG9zZSBQYXJ0cy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF8kY2xlYXIoc3RhcnQgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLCBmcm9tKSB7XG4gICAgICAgIHRoaXMuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGZhbHNlLCB0cnVlLCBmcm9tKTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0ICE9PSB0aGlzLl8kZW5kTm9kZSkge1xuICAgICAgICAgICAgLy8gVGhlIG5vbi1udWxsIGFzc2VydGlvbiBpcyBzYWZlIGJlY2F1c2UgaWYgXyRzdGFydE5vZGUubmV4dFNpYmxpbmcgaXNcbiAgICAgICAgICAgIC8vIG51bGwsIHRoZW4gXyRlbmROb2RlIGlzIGFsc28gbnVsbCwgYW5kIHdlIHdvdWxkIG5vdCBoYXZlIGVudGVyZWQgdGhpc1xuICAgICAgICAgICAgLy8gbG9vcC5cbiAgICAgICAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0KS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHdyYXAoc3RhcnQpLnJlbW92ZSgpO1xuICAgICAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIFJvb3RQYXJ0J3MgYGlzQ29ubmVjdGVkYC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kXG4gICAgICogc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGBSb290UGFydGBzICh0aGUgYENoaWxkUGFydGAgcmV0dXJuZWQgZnJvbSBhXG4gICAgICogdG9wLWxldmVsIGByZW5kZXIoKWAgY2FsbCkuIEl0IGhhcyBubyBlZmZlY3Qgb24gbm9uLXJvb3QgQ2hpbGRQYXJ0cy5cbiAgICAgKiBAcGFyYW0gaXNDb25uZWN0ZWQgV2hldGhlciB0byBzZXRcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzZXRDb25uZWN0ZWQoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuXyRwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fX2lzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICAgICAgICB0aGlzLl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/Lihpc0Nvbm5lY3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGFydC5zZXRDb25uZWN0ZWQoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gYSAnICtcbiAgICAgICAgICAgICAgICAnUm9vdFBhcnQgcmV0dXJuZWQgZnJvbSByZW5kZXIoKS4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGdldCB0YWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnRhZ05hbWU7XG4gICAgfVxuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEFUVFJJQlVURV9QQVJUO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+IDIgfHwgc3RyaW5nc1swXSAhPT0gJycgfHwgc3RyaW5nc1sxXSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5ldyBBcnJheShzdHJpbmdzLmxlbmd0aCAtIDEpLmZpbGwobmV3IFN0cmluZygpKTtcbiAgICAgICAgICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHBhcnQgYnkgcmVzb2x2aW5nIHRoZSB2YWx1ZSBmcm9tIHBvc3NpYmx5IG11bHRpcGxlXG4gICAgICogdmFsdWVzIGFuZCBzdGF0aWMgc3RyaW5ncyBhbmQgY29tbWl0dGluZyBpdCB0byB0aGUgRE9NLlxuICAgICAqIElmIHRoaXMgcGFydCBpcyBzaW5nbGUtdmFsdWVkLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSB1bmRlZmluZWQsIGFuZCB0aGVcbiAgICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhcmd1bWVudC4gSWYgdGhpcyBwYXJ0IGlzXG4gICAgICogbXVsdGktdmFsdWUsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIGRlZmluZWQsIGFuZCB0aGUgbWV0aG9kIGlzIGNhbGxlZFxuICAgICAqIHdpdGggdGhlIHZhbHVlIGFycmF5IG9mIHRoZSBwYXJ0J3Mgb3duaW5nIFRlbXBsYXRlSW5zdGFuY2UsIGFuZCBhbiBvZmZzZXRcbiAgICAgKiBpbnRvIHRoZSB2YWx1ZSBhcnJheSBmcm9tIHdoaWNoIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHJlYWQuXG4gICAgICogVGhpcyBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIHdheSB0byBlbGltaW5hdGUgc2hvcnQtbGl2ZWQgYXJyYXkgc2xpY2VzXG4gICAgICogb2YgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHZhbHVlcywgYW5kIGFsbG93IGEgZmFzdC1wYXRoIGZvciBzaW5nbGUtdmFsdWVkXG4gICAgICogcGFydHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHBhcnQgdmFsdWUsIG9yIGFuIGFycmF5IG9mIHZhbHVlcyBmb3IgbXVsdGktdmFsdWVkIHBhcnRzXG4gICAgICogQHBhcmFtIHZhbHVlSW5kZXggdGhlIGluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgdmFsdWVzIGZyb20uIGB1bmRlZmluZWRgIGZvclxuICAgICAqICAgc2luZ2xlLXZhbHVlZCBwYXJ0c1xuICAgICAqIEBwYXJhbSBub0NvbW1pdCBjYXVzZXMgdGhlIHBhcnQgdG8gbm90IGNvbW1pdCBpdHMgdmFsdWUgdG8gdGhlIERPTS4gVXNlZFxuICAgICAqICAgaW4gaHlkcmF0aW9uIHRvIHByaW1lIGF0dHJpYnV0ZSBwYXJ0cyB3aXRoIHRoZWlyIGZpcnN0LXJlbmRlcmVkIHZhbHVlLFxuICAgICAqICAgYnV0IG5vdCBzZXQgdGhlIGF0dHJpYnV0ZSwgYW5kIGluIFNTUiB0byBuby1vcCB0aGUgRE9NIG9wZXJhdGlvbiBhbmRcbiAgICAgKiAgIGNhcHR1cmUgdGhlIHZhbHVlIGZvciBzZXJpYWxpemF0aW9uLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgXyRzZXRWYWx1ZSh2YWx1ZSwgZGlyZWN0aXZlUGFyZW50ID0gdGhpcywgdmFsdWVJbmRleCwgbm9Db21taXQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IHRoaXMuc3RyaW5ncztcbiAgICAgICAgLy8gV2hldGhlciBhbnkgb2YgdGhlIHZhbHVlcyBoYXMgY2hhbmdlZCwgZm9yIGRpcnR5LWNoZWNraW5nXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgaWYgKHN0cmluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gU2luZ2xlLXZhbHVlIGJpbmRpbmcgY2FzZVxuICAgICAgICAgICAgdmFsdWUgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQsIDApO1xuICAgICAgICAgICAgY2hhbmdlID1cbiAgICAgICAgICAgICAgICAhaXNQcmltaXRpdmUodmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZSAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlICYmIHZhbHVlICE9PSBub0NoYW5nZSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJbnRlcnBvbGF0aW9uIGNhc2VcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSBzdHJpbmdzWzBdO1xuICAgICAgICAgICAgbGV0IGksIHY7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZXNbdmFsdWVJbmRleCArIGldLCBkaXJlY3RpdmVQYXJlbnQsIGkpO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSBub0NoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlci1wcm92aWRlZCB2YWx1ZSBpcyBgbm9DaGFuZ2VgLCB1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHYgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoYW5nZSB8fD1cbiAgICAgICAgICAgICAgICAgICAgIWlzUHJpbWl0aXZlKHYpIHx8IHYgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZVtpXTtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gbm90aGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9ICh2ID8/ICcnKSArIHN0cmluZ3NbaSArIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXZSBhbHdheXMgcmVjb3JkIGVhY2ggdmFsdWUsIGV2ZW4gaWYgb25lIGlzIGBub3RoaW5nYCwgZm9yIGZ1dHVyZVxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlW2ldID0gdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlICYmICFub0NvbW1pdCkge1xuICAgICAgICAgICAgdGhpcy5fY29tbWl0VmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tbWl0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBub3RoaW5nKSB7XG4gICAgICAgICAgICB3cmFwKHRoaXMuZWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKHRoaXMubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZSwgJ2F0dHJpYnV0ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplcih2YWx1ZSA/PyAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cmFwKHRoaXMuZWxlbWVudCkuc2V0QXR0cmlidXRlKHRoaXMubmFtZSwgKHZhbHVlID8/ICcnKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBQcm9wZXJ0eVBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gUFJPUEVSVFlfUEFSVDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21taXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwodGhpcy5lbGVtZW50LCB0aGlzLm5hbWUsICdwcm9wZXJ0eScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgcHJvcGVydHknLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHRoaXMuZWxlbWVudFt0aGlzLm5hbWVdID0gdmFsdWUgPT09IG5vdGhpbmcgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG59XG5jbGFzcyBCb29sZWFuQXR0cmlidXRlUGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBCT09MRUFOX0FUVFJJQlVURV9QQVJUO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbW1pdFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgYm9vbGVhbiBhdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICEhKHZhbHVlICYmIHZhbHVlICE9PSBub3RoaW5nKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgd3JhcCh0aGlzLmVsZW1lbnQpLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLm5hbWUsICEhdmFsdWUgJiYgdmFsdWUgIT09IG5vdGhpbmcpO1xuICAgIH1cbn1cbmNsYXNzIEV2ZW50UGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG5hbWUsIHN0cmluZ3MsIHBhcmVudCwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihlbGVtZW50LCBuYW1lLCBzdHJpbmdzLCBwYXJlbnQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBFVkVOVF9QQVJUO1xuICAgICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5zdHJpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBcXGA8JHtlbGVtZW50LmxvY2FsTmFtZX0+XFxgIGhhcyBhIFxcYEAke25hbWV9PS4uLlxcYCBsaXN0ZW5lciB3aXRoIGAgK1xuICAgICAgICAgICAgICAgICdpbnZhbGlkIGNvbnRlbnQuIEV2ZW50IGxpc3RlbmVycyBpbiB0ZW1wbGF0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgJyArXG4gICAgICAgICAgICAgICAgJ29uZSBleHByZXNzaW9uIGFuZCBubyBzdXJyb3VuZGluZyB0ZXh0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEV2ZW50UGFydCBkb2VzIG5vdCB1c2UgdGhlIGJhc2UgXyRzZXRWYWx1ZS9fcmVzb2x2ZVZhbHVlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gc2luY2UgdGhlIGRpcnR5IGNoZWNraW5nIGlzIG1vcmUgY29tcGxleFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJHNldFZhbHVlKG5ld0xpc3RlbmVyLCBkaXJlY3RpdmVQYXJlbnQgPSB0aGlzKSB7XG4gICAgICAgIG5ld0xpc3RlbmVyID1cbiAgICAgICAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgbmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCwgMCkgPz8gbm90aGluZztcbiAgICAgICAgaWYgKG5ld0xpc3RlbmVyID09PSBub0NoYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZExpc3RlbmVyID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdGhpbmcgb3IgYW55IG9wdGlvbnMgY2hhbmdlIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZVxuICAgICAgICAvLyBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZUxpc3RlbmVyID0gKG5ld0xpc3RlbmVyID09PSBub3RoaW5nICYmIG9sZExpc3RlbmVyICE9PSBub3RoaW5nKSB8fFxuICAgICAgICAgICAgbmV3TGlzdGVuZXIuY2FwdHVyZSAhPT1cbiAgICAgICAgICAgICAgICBvbGRMaXN0ZW5lci5jYXB0dXJlIHx8XG4gICAgICAgICAgICBuZXdMaXN0ZW5lci5vbmNlICE9PVxuICAgICAgICAgICAgICAgIG9sZExpc3RlbmVyLm9uY2UgfHxcbiAgICAgICAgICAgIG5ld0xpc3RlbmVyLnBhc3NpdmUgIT09XG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIucGFzc2l2ZTtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3Qgbm90aGluZyBhbmQgd2UgcmVtb3ZlZCB0aGUgbGlzdGVuZXIsIHdlIGhhdmVcbiAgICAgICAgLy8gdG8gYWRkIHRoZSBwYXJ0IGFzIGEgbGlzdGVuZXIuXG4gICAgICAgIGNvbnN0IHNob3VsZEFkZExpc3RlbmVyID0gbmV3TGlzdGVuZXIgIT09IG5vdGhpbmcgJiZcbiAgICAgICAgICAgIChvbGRMaXN0ZW5lciA9PT0gbm90aGluZyB8fCBzaG91bGRSZW1vdmVMaXN0ZW5lcik7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IG5ld0xpc3RlbmVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcjogc2hvdWxkUmVtb3ZlTGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgYWRkTGlzdGVuZXI6IHNob3VsZEFkZExpc3RlbmVyLFxuICAgICAgICAgICAgICAgIG9sZExpc3RlbmVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBvbGRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLm5hbWUsIHRoaXMsIG5ld0xpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBuZXdMaXN0ZW5lcjtcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZS5jYWxsKHRoaXMub3B0aW9ucz8uaG9zdCA/PyB0aGlzLmVsZW1lbnQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZS5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBFbGVtZW50UGFydCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgcGFyZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMudHlwZSA9IEVMRU1FTlRfUEFSVDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICBfJHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdG8gZWxlbWVudCBiaW5kaW5nJyxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUpO1xuICAgIH1cbn1cbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExIIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWVsZW1lbnQsIHdoaWNoIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExIID0ge1xuICAgIC8vIFVzZWQgaW4gbGl0LXNzclxuICAgIF9ib3VuZEF0dHJpYnV0ZVN1ZmZpeDogYm91bmRBdHRyaWJ1dGVTdWZmaXgsXG4gICAgX21hcmtlcjogbWFya2VyLFxuICAgIF9tYXJrZXJNYXRjaDogbWFya2VyTWF0Y2gsXG4gICAgX0hUTUxfUkVTVUxUOiBIVE1MX1JFU1VMVCxcbiAgICBfZ2V0VGVtcGxhdGVIdG1sOiBnZXRUZW1wbGF0ZUh0bWwsXG4gICAgLy8gVXNlZCBpbiB0ZXN0cyBhbmQgcHJpdmF0ZS1zc3Itc3VwcG9ydFxuICAgIF9UZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlLFxuICAgIF9pc0l0ZXJhYmxlOiBpc0l0ZXJhYmxlLFxuICAgIF9yZXNvbHZlRGlyZWN0aXZlOiByZXNvbHZlRGlyZWN0aXZlLFxuICAgIF9DaGlsZFBhcnQ6IENoaWxkUGFydCxcbiAgICBfQXR0cmlidXRlUGFydDogQXR0cmlidXRlUGFydCxcbiAgICBfQm9vbGVhbkF0dHJpYnV0ZVBhcnQ6IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0LFxuICAgIF9FdmVudFBhcnQ6IEV2ZW50UGFydCxcbiAgICBfUHJvcGVydHlQYXJ0OiBQcm9wZXJ0eVBhcnQsXG4gICAgX0VsZW1lbnRQYXJ0OiBFbGVtZW50UGFydCxcbn07XG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICAgID8gZ2xvYmFsLmxpdEh0bWxQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gICAgOiBnbG9iYWwubGl0SHRtbFBvbHlmaWxsU3VwcG9ydDtcbnBvbHlmaWxsU3VwcG9ydD8uKFRlbXBsYXRlLCBDaGlsZFBhcnQpO1xuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBsaXQtaHRtbCB1c2FnZS5cbihnbG9iYWwubGl0SHRtbFZlcnNpb25zID8/PSBbXSkucHVzaCgnMy4zLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWwubGl0SHRtbFZlcnNpb25zLmxlbmd0aCA+IDEpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnbXVsdGlwbGUtdmVyc2lvbnMnLCBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICAgICAgICBgTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQuYCk7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbmRlcnMgYSB2YWx1ZSwgdXN1YWxseSBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0LCB0byB0aGUgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgZXhhbXBsZSByZW5kZXJzIHRoZSB0ZXh0IFwiSGVsbG8sIFpvZSFcIiBpbnNpZGUgYSBwYXJhZ3JhcGggdGFnLCBhcHBlbmRpbmdcbiAqIGl0IHRvIHRoZSBjb250YWluZXIgYGRvY3VtZW50LmJvZHlgLlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQge2h0bWwsIHJlbmRlcn0gZnJvbSAnbGl0JztcbiAqXG4gKiBjb25zdCBuYW1lID0gXCJab2VcIjtcbiAqIHJlbmRlcihodG1sYDxwPkhlbGxvLCAke25hbWV9ITwvcD5gLCBkb2N1bWVudC5ib2R5KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSBBbnkgW3JlbmRlcmFibGVcbiAqICAgdmFsdWVdKGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jY2hpbGQtZXhwcmVzc2lvbnMpLFxuICogICB0eXBpY2FsbHkgYSB7QGxpbmtjb2RlIFRlbXBsYXRlUmVzdWx0fSBjcmVhdGVkIGJ5IGV2YWx1YXRpbmcgYSB0ZW1wbGF0ZSB0YWdcbiAqICAgbGlrZSB7QGxpbmtjb2RlIGh0bWx9IG9yIHtAbGlua2NvZGUgc3ZnfS5cbiAqIEBwYXJhbSBjb250YWluZXIgQSBET00gY29udGFpbmVyIHRvIHJlbmRlciB0by4gVGhlIGZpcnN0IHJlbmRlciB3aWxsIGFwcGVuZFxuICogICB0aGUgcmVuZGVyZWQgdmFsdWUgdG8gdGhlIGNvbnRhaW5lciwgYW5kIHN1YnNlcXVlbnQgcmVuZGVycyB3aWxsXG4gKiAgIGVmZmljaWVudGx5IHVwZGF0ZSB0aGUgcmVuZGVyZWQgdmFsdWUgaWYgdGhlIHNhbWUgcmVzdWx0IHR5cGUgd2FzXG4gKiAgIHByZXZpb3VzbHkgcmVuZGVyZWQgdGhlcmUuXG4gKiBAcGFyYW0gb3B0aW9ucyBTZWUge0BsaW5rY29kZSBSZW5kZXJPcHRpb25zfSBmb3Igb3B0aW9ucyBkb2N1bWVudGF0aW9uLlxuICogQHNlZVxuICoge0BsaW5rIGh0dHBzOi8vbGl0LmRldi9kb2NzL2xpYnJhcmllcy9zdGFuZGFsb25lLXRlbXBsYXRlcy8jcmVuZGVyaW5nLWxpdC1odG1sLXRlbXBsYXRlc3wgUmVuZGVyaW5nIExpdCBIVE1MIFRlbXBsYXRlc31cbiAqL1xuZXhwb3J0IGNvbnN0IHJlbmRlciA9ICh2YWx1ZSwgY29udGFpbmVyLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKERFVl9NT0RFICYmIGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICAgIC8vIEdpdmUgYSBjbGVhcmVyIGVycm9yIG1lc3NhZ2UgdGhhblxuICAgICAgICAvLyAgICAgVW5jYXVnaHQgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIG51bGwgKHJlYWRpbmdcbiAgICAgICAgLy8gICAgICdfJGxpdFBhcnQkJylcbiAgICAgICAgLy8gd2hpY2ggcmVhZHMgbGlrZSBhbiBpbnRlcm5hbCBMaXQgZXJyb3IuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRoZSBjb250YWluZXIgdG8gcmVuZGVyIGludG8gbWF5IG5vdCBiZSAke2NvbnRhaW5lcn1gKTtcbiAgICB9XG4gICAgY29uc3QgcmVuZGVySWQgPSBERVZfTU9ERSA/IGRlYnVnTG9nUmVuZGVySWQrKyA6IDA7XG4gICAgY29uc3QgcGFydE93bmVyTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBjb250YWluZXI7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCBwYXJ0ID0gcGFydE93bmVyTm9kZVsnXyRsaXRQYXJ0JCddO1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJyxcbiAgICAgICAgICAgIGlkOiByZW5kZXJJZCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHBhcnQsXG4gICAgICAgIH0pO1xuICAgIGlmIChwYXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZW5kTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBudWxsO1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBwYXJ0T3duZXJOb2RlWydfJGxpdFBhcnQkJ10gPSBwYXJ0ID0gbmV3IENoaWxkUGFydChjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCBlbmROb2RlKSwgZW5kTm9kZSwgdW5kZWZpbmVkLCBvcHRpb25zID8/IHt9KTtcbiAgICB9XG4gICAgcGFydC5fJHNldFZhbHVlKHZhbHVlKTtcbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ2VuZCByZW5kZXInLFxuICAgICAgICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIHBhcnQ7XG59O1xuaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgIHJlbmRlci5zZXRTYW5pdGl6ZXIgPSBzZXRTYW5pdGl6ZXI7XG4gICAgcmVuZGVyLmNyZWF0ZVNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcjtcbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgcmVuZGVyLl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9XG4gICAgICAgICAgICBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGl0LWh0bWwuanMubWFwIiwibGV0IGN1cnJlbnQ7XG5sZXQgY3VycmVudElkID0gMDtcbmZ1bmN0aW9uIHNldEN1cnJlbnQoc3RhdGUpIHtcbiAgICBjdXJyZW50ID0gc3RhdGU7XG59XG5mdW5jdGlvbiBjbGVhcigpIHtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBjdXJyZW50SWQgPSAwO1xufVxuZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgIHJldHVybiBjdXJyZW50SWQrKztcbn1cbmV4cG9ydCB7IGNsZWFyLCBjdXJyZW50LCBzZXRDdXJyZW50LCBub3RpZnkgfTtcbiIsImNvbnN0IHBoYXNlU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5waGFzZVwiKTtcbmNvbnN0IGhvb2tTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLmhvb2tcIik7XG5jb25zdCB1cGRhdGVTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLnVwZGF0ZVwiKTtcbmNvbnN0IGNvbW1pdFN5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQuY29tbWl0XCIpO1xuY29uc3QgZWZmZWN0c1N5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQuZWZmZWN0c1wiKTtcbmNvbnN0IGxheW91dEVmZmVjdHNTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLmxheW91dEVmZmVjdHNcIik7XG5jb25zdCBjb250ZXh0RXZlbnQgPSBcImhhdW50ZWQuY29udGV4dFwiO1xuZXhwb3J0IHsgcGhhc2VTeW1ib2wsIGhvb2tTeW1ib2wsIHVwZGF0ZVN5bWJvbCwgY29tbWl0U3ltYm9sLCBlZmZlY3RzU3ltYm9sLCBsYXlvdXRFZmZlY3RzU3ltYm9sLCBjb250ZXh0RXZlbnQsIH07XG4iLCJpbXBvcnQgeyBzZXRDdXJyZW50LCBjbGVhciB9IGZyb20gXCIuL2ludGVyZmFjZVwiO1xuaW1wb3J0IHsgaG9va1N5bWJvbCwgZWZmZWN0c1N5bWJvbCwgbGF5b3V0RWZmZWN0c1N5bWJvbCwgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5jbGFzcyBTdGF0ZSB7XG4gICAgdXBkYXRlO1xuICAgIGhvc3Q7XG4gICAgdmlydHVhbDtcbiAgICBbaG9va1N5bWJvbF07XG4gICAgW2VmZmVjdHNTeW1ib2xdO1xuICAgIFtsYXlvdXRFZmZlY3RzU3ltYm9sXTtcbiAgICBjb25zdHJ1Y3Rvcih1cGRhdGUsIGhvc3QpIHtcbiAgICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXNbaG9va1N5bWJvbF0gPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXNbZWZmZWN0c1N5bWJvbF0gPSBbXTtcbiAgICAgICAgdGhpc1tsYXlvdXRFZmZlY3RzU3ltYm9sXSA9IFtdO1xuICAgIH1cbiAgICBydW4oY2IpIHtcbiAgICAgICAgc2V0Q3VycmVudCh0aGlzKTtcbiAgICAgICAgbGV0IHJlcyA9IGNiKCk7XG4gICAgICAgIGNsZWFyKCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIF9ydW5FZmZlY3RzKHBoYXNlKSB7XG4gICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1twaGFzZV07XG4gICAgICAgIHNldEN1cnJlbnQodGhpcyk7XG4gICAgICAgIGZvciAobGV0IGVmZmVjdCBvZiBlZmZlY3RzKSB7XG4gICAgICAgICAgICBlZmZlY3QuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhcigpO1xuICAgIH1cbiAgICBydW5FZmZlY3RzKCkge1xuICAgICAgICB0aGlzLl9ydW5FZmZlY3RzKGVmZmVjdHNTeW1ib2wpO1xuICAgIH1cbiAgICBydW5MYXlvdXRFZmZlY3RzKCkge1xuICAgICAgICB0aGlzLl9ydW5FZmZlY3RzKGxheW91dEVmZmVjdHNTeW1ib2wpO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgbGV0IGhvb2tzID0gdGhpc1tob29rU3ltYm9sXTtcbiAgICAgICAgaG9va3MuZm9yRWFjaCgoaG9vaykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBob29rLnRlYXJkb3duID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBob29rLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCB7IFN0YXRlIH07XG4iLCJpbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIuL3N0YXRlXCI7XG5pbXBvcnQgeyBjb21taXRTeW1ib2wsIHBoYXNlU3ltYm9sLCB1cGRhdGVTeW1ib2wsIGVmZmVjdHNTeW1ib2wsIGxheW91dEVmZmVjdHNTeW1ib2wsIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuY29uc3QgZGVmZXIgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpO1xuZnVuY3Rpb24gcnVubmVyKCkge1xuICAgIGxldCB0YXNrcyA9IFtdO1xuICAgIGxldCBpZDtcbiAgICBmdW5jdGlvbiBydW5UYXNrcygpIHtcbiAgICAgICAgaWQgPSBudWxsO1xuICAgICAgICBsZXQgdCA9IHRhc2tzO1xuICAgICAgICB0YXNrcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdFtpXSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB0YXNrcy5wdXNoKHRhc2spO1xuICAgICAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWQgPSBkZWZlcihydW5UYXNrcyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuY29uc3QgcmVhZCA9IHJ1bm5lcigpO1xuY29uc3Qgd3JpdGUgPSBydW5uZXIoKTtcbmNsYXNzIEJhc2VTY2hlZHVsZXIge1xuICAgIHJlbmRlcmVyO1xuICAgIGhvc3Q7XG4gICAgc3RhdGU7XG4gICAgW3BoYXNlU3ltYm9sXTtcbiAgICBfdXBkYXRlUXVldWVkO1xuICAgIGNvbnN0cnVjdG9yKHJlbmRlcmVyLCBob3N0KSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLCBob3N0KTtcbiAgICAgICAgdGhpc1twaGFzZVN5bWJvbF0gPSBudWxsO1xuICAgICAgICB0aGlzLl91cGRhdGVRdWV1ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdXBkYXRlKCkge1xuICAgICAgICBpZiAodGhpcy5fdXBkYXRlUXVldWVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICByZWFkKCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmhhbmRsZVBoYXNlKHVwZGF0ZVN5bWJvbCk7XG4gICAgICAgICAgICB3cml0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQaGFzZShjb21taXRTeW1ib2wsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgd3JpdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBoYXNlKGVmZmVjdHNTeW1ib2wpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVF1ZXVlZCA9IHRydWU7XG4gICAgfVxuICAgIGhhbmRsZVBoYXNlKHBoYXNlLCBhcmcpIHtcbiAgICAgICAgdGhpc1twaGFzZVN5bWJvbF0gPSBwaGFzZTtcbiAgICAgICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgICAgICAgY2FzZSBjb21taXRTeW1ib2w6XG4gICAgICAgICAgICAgICAgdGhpcy5jb21taXQoYXJnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bkVmZmVjdHMobGF5b3V0RWZmZWN0c1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSB1cGRhdGVTeW1ib2w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKCk7XG4gICAgICAgICAgICBjYXNlIGVmZmVjdHNTeW1ib2w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuRWZmZWN0cyhlZmZlY3RzU3ltYm9sKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnJ1bigoKSA9PiB0aGlzLnJlbmRlcmVyLmNhbGwodGhpcy5ob3N0LCB0aGlzLmhvc3QpKTtcbiAgICB9XG4gICAgcnVuRWZmZWN0cyhwaGFzZSkge1xuICAgICAgICB0aGlzLnN0YXRlLl9ydW5FZmZlY3RzKHBoYXNlKTtcbiAgICB9XG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIHRoaXMuc3RhdGUudGVhcmRvd24oKTtcbiAgICB9XG59XG5leHBvcnQgeyBCYXNlU2NoZWR1bGVyIH07XG4iLCJpbXBvcnQgeyBCYXNlU2NoZWR1bGVyIH0gZnJvbSBcIi4vc2NoZWR1bGVyXCI7XG5jb25zdCB0b0NhbWVsQ2FzZSA9ICh2YWwgPSBcIlwiKSA9PiB2YWwucmVwbGFjZSgvLSsoW2Etel0pPy9nLCAoXywgY2hhcikgPT4gKGNoYXIgPyBjaGFyLnRvVXBwZXJDYXNlKCkgOiBcIlwiKSk7XG5mdW5jdGlvbiBtYWtlQ29tcG9uZW50KHJlbmRlcikge1xuICAgIGNsYXNzIFNjaGVkdWxlciBleHRlbmRzIEJhc2VTY2hlZHVsZXIge1xuICAgICAgICBmcmFnO1xuICAgICAgICBjb25zdHJ1Y3RvcihyZW5kZXJlciwgZnJhZywgaG9zdCkge1xuICAgICAgICAgICAgc3VwZXIocmVuZGVyZXIsIChob3N0IHx8IGZyYWcpKTtcbiAgICAgICAgICAgIHRoaXMuZnJhZyA9IGZyYWc7XG4gICAgICAgIH1cbiAgICAgICAgY29tbWl0KHJlc3VsdCkge1xuICAgICAgICAgICAgcmVuZGVyKHJlc3VsdCwgdGhpcy5mcmFnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wb25lbnQocmVuZGVyZXIsIGJhc2VFbGVtZW50T3JPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IEJhc2VFbGVtZW50ID0gKG9wdGlvbnMgfHwgYmFzZUVsZW1lbnRPck9wdGlvbnMgfHwge30pLmJhc2VFbGVtZW50IHx8XG4gICAgICAgICAgICBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgeyBvYnNlcnZlZEF0dHJpYnV0ZXMgPSBbXSwgdXNlU2hhZG93RE9NID0gdHJ1ZSwgc2hhZG93Um9vdEluaXQgPSB7fSwgfSA9IG9wdGlvbnMgfHwgYmFzZUVsZW1lbnRPck9wdGlvbnMgfHwge307XG4gICAgICAgIGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG4gICAgICAgICAgICBfc2NoZWR1bGVyO1xuICAgICAgICAgICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcmVyLm9ic2VydmVkQXR0cmlidXRlcyB8fCBvYnNlcnZlZEF0dHJpYnV0ZXMgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VTaGFkb3dET00gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXIocmVuZGVyZXIsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiwgLi4uc2hhZG93Um9vdEluaXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXIocmVuZGVyZXIsIHRoaXMuc2hhZG93Um9vdCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB2YWwgPSBuZXdWYWx1ZSA9PT0gXCJcIiA/IHRydWUgOiBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0aGlzLCB0b0NhbWVsQ2FzZShuYW1lKSwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiByZWZsZWN0aXZlUHJvcChpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgIGxldCBpc1NldHVwID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyB1cGRhdGUgd2hlbiBwcm9wIHZhbHVlIGhhc24ndCBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1NldHVwICYmIHZhbHVlID09PSBuZXdWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaXNTZXR1cCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlci51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm90byA9IG5ldyBQcm94eShCYXNlRWxlbWVudC5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVzYztcbiAgICAgICAgICAgICAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2Muc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHJlY2VpdmVyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiIHx8IGtleVswXSA9PT0gXCJfXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHJlZmxlY3RpdmVQcm9wKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBrZXksIGRlc2MpO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHJlY2VpdmVyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihFbGVtZW50LnByb3RvdHlwZSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gRWxlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydCB7IG1ha2VDb21wb25lbnQsIH07XG4iLCJpbXBvcnQgeyBjdXJyZW50LCBub3RpZnkgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGhvb2tTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5jbGFzcyBIb29rIHtcbiAgICBpZDtcbiAgICBzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfVxufVxuZnVuY3Rpb24gdXNlKEhvb2ssIC4uLmFyZ3MpIHtcbiAgICBsZXQgaWQgPSBub3RpZnkoKTtcbiAgICBsZXQgaG9va3MgPSBjdXJyZW50W2hvb2tTeW1ib2xdO1xuICAgIGxldCBob29rID0gaG9va3MuZ2V0KGlkKTtcbiAgICBpZiAoIWhvb2spIHtcbiAgICAgICAgaG9vayA9IG5ldyBIb29rKGlkLCBjdXJyZW50LCAuLi5hcmdzKTtcbiAgICAgICAgaG9va3Muc2V0KGlkLCBob29rKTtcbiAgICB9XG4gICAgcmV0dXJuIGhvb2sudXBkYXRlKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gaG9vayhIb29rKSB7XG4gICAgcmV0dXJuIHVzZS5iaW5kKG51bGwsIEhvb2spO1xufVxuZXhwb3J0IHsgaG9vaywgSG9vayB9O1xuIiwiaW1wb3J0IHsgSG9vaywgaG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbmZ1bmN0aW9uIGNyZWF0ZUVmZmVjdChzZXRFZmZlY3RzKSB7XG4gICAgcmV0dXJuIGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICAgICAgY2FsbGJhY2s7XG4gICAgICAgIGxhc3RWYWx1ZXM7XG4gICAgICAgIHZhbHVlcztcbiAgICAgICAgX3RlYXJkb3duO1xuICAgICAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIGlnbm9yZWQxLCBpZ25vcmVkMikge1xuICAgICAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgICAgIHNldEVmZmVjdHMoc3RhdGUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZShjYWxsYmFjaywgdmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBjYWxsKCkge1xuICAgICAgICAgICAgY29uc3QgaGFzQ2hhbmdlZCA9ICF0aGlzLnZhbHVlcyB8fCB0aGlzLmhhc0NoYW5nZWQoKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgICAgICAgICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJ1bigpIHtcbiAgICAgICAgICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuX3RlYXJkb3duID0gdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRlYXJkb3duKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl90ZWFyZG93biA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoYXNDaGFuZ2VkKCkge1xuICAgICAgICAgICAgcmV0dXJuICghdGhpcy5sYXN0VmFsdWVzIHx8XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc29tZSgodmFsdWUsIGkpID0+IHRoaXMubGFzdFZhbHVlc1tpXSAhPT0gdmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IHsgY3JlYXRlRWZmZWN0IH07XG4iLCJpbXBvcnQgeyBlZmZlY3RzU3ltYm9sIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuaW1wb3J0IHsgY3JlYXRlRWZmZWN0IH0gZnJvbSBcIi4vY3JlYXRlLWVmZmVjdFwiO1xuZnVuY3Rpb24gc2V0RWZmZWN0cyhzdGF0ZSwgY2IpIHtcbiAgICBzdGF0ZVtlZmZlY3RzU3ltYm9sXS5wdXNoKGNiKTtcbn1cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGVmZmVjdCAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcnVucyBlYWNoIHRpbWUgZGVwZW5kZW5jaWVzIGNoYW5nZVxuICogQHBhcmFtIHt1bmtub3duW119IFtkZXBlbmRlbmNpZXNdIC0gbGlzdCBvZiBkZXBlbmRlbmNpZXMgdG8gdGhlIGVmZmVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuY29uc3QgdXNlRWZmZWN0ID0gY3JlYXRlRWZmZWN0KHNldEVmZmVjdHMpO1xuZXhwb3J0IHsgc2V0RWZmZWN0cywgdXNlRWZmZWN0IH07XG4iLCJpbXBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuaW1wb3J0IHsgY29udGV4dEV2ZW50IH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuaW1wb3J0IHsgc2V0RWZmZWN0cyB9IGZyb20gXCIuL3VzZS1lZmZlY3RcIjtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtICAgIHtDb250ZXh0PFQ+fSBjb250ZXh0XG4gKiBAcmV0dXJuICAge1R9XG4gKi9cbmNvbnN0IHVzZUNvbnRleHQgPSBob29rKGNsYXNzIGV4dGVuZHMgSG9vayB7XG4gICAgQ29udGV4dDtcbiAgICB2YWx1ZTtcbiAgICBfcmFuRWZmZWN0O1xuICAgIF91bnN1YnNjcmliZTtcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIF8pIHtcbiAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlciA9IHRoaXMuX3VwZGF0ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fcmFuRWZmZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gbnVsbDtcbiAgICAgICAgc2V0RWZmZWN0cyhzdGF0ZSwgdGhpcyk7XG4gICAgfVxuICAgIHVwZGF0ZShDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnZpcnR1YWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbid0IGJlIHVzZWQgd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuQ29udGV4dCAhPT0gQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKENvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5Db250ZXh0ID0gQ29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgY2FsbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yYW5FZmZlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3JhbkVmZmVjdCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fdW5zdWJzY3JpYmUpXG4gICAgICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSh0aGlzLkNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfdXBkYXRlcih2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKCk7XG4gICAgfVxuICAgIF9zdWJzY3JpYmUoQ29udGV4dCkge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSB7IENvbnRleHQsIGNhbGxiYWNrOiB0aGlzLl91cGRhdGVyIH07XG4gICAgICAgIHRoaXMuc3RhdGUuaG9zdC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChjb250ZXh0RXZlbnQsIHtcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsIC8vIHRvIHBhc3MgU2hhZG93RE9NIGJvdW5kYXJpZXNcbiAgICAgICAgfSkpO1xuICAgICAgICBjb25zdCB7IHVuc3Vic2NyaWJlID0gbnVsbCwgdmFsdWUgfSA9IGRldGFpbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuc3Vic2NyaWJlID8gdmFsdWUgOiBDb250ZXh0LmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgICB9XG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIGlmICh0aGlzLl91bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuZXhwb3J0IHsgdXNlQ29udGV4dCB9O1xuIiwiaW1wb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtICB7KCkgPT4gVH0gZm4gZnVuY3Rpb24gdG8gbWVtb2l6ZVxuICogQHBhcmFtICB7dW5rbm93bltdfSB2YWx1ZXMgZGVwZW5kZW5jaWVzIHRvIHRoZSBtZW1vaXplZCBjb21wdXRhdGlvblxuICogQHJldHVybiB7VH0gVGhlIG5leHQgY29tcHV0ZWQgdmFsdWVcbiAqL1xuY29uc3QgdXNlTWVtbyA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICB2YWx1ZTtcbiAgICB2YWx1ZXM7XG4gICAgY29uc3RydWN0b3IoaWQsIHN0YXRlLCBmbiwgdmFsdWVzKSB7XG4gICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmbigpO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG4gICAgdXBkYXRlKGZuLCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ2hhbmdlZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBmbigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICBoYXNDaGFuZ2VkKHZhbHVlcyA9IFtdKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMuc29tZSgodmFsdWUsIGkpID0+IHRoaXMudmFsdWVzW2ldICE9PSB2YWx1ZSk7XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VNZW1vIH07XG4iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcIi4vdXNlLW1lbW9cIjtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge0Z1bmN0aW9ufSBUXG4gKiBAcGFyYW0gICAge1R9IGZuIC0gY2FsbGJhY2sgdG8gbWVtb2l6ZVxuICogQHBhcmFtICAgIHt1bmtub3duW119IGlucHV0cyAtIGRlcGVuZGVuY2llcyB0byBjYWxsYmFjayBtZW1vaXphdGlvblxuICogQHJldHVybiAgIHtUfVxuICovXG5jb25zdCB1c2VDYWxsYmFjayA9IChmbiwgaW5wdXRzKSA9PiB1c2VNZW1vKCgpID0+IGZuLCBpbnB1dHMpO1xuZXhwb3J0IHsgdXNlQ2FsbGJhY2sgfTtcbiIsImltcG9ydCB7IGxheW91dEVmZmVjdHNTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVFZmZlY3QgfSBmcm9tIFwiLi9jcmVhdGUtZWZmZWN0XCI7XG5mdW5jdGlvbiBzZXRMYXlvdXRFZmZlY3RzKHN0YXRlLCBjYikge1xuICAgIHN0YXRlW2xheW91dEVmZmVjdHNTeW1ib2xdLnB1c2goY2IpO1xufVxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSAge0VmZmVjdH0gY2FsbGJhY2sgZWZmZWN0aW5nIGNhbGxiYWNrXG4gKiBAcGFyYW0gIHt1bmtub3duW119IFt2YWx1ZXNdIGRlcGVuZGVuY2llcyB0byB0aGUgZWZmZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5jb25zdCB1c2VMYXlvdXRFZmZlY3QgPSBjcmVhdGVFZmZlY3Qoc2V0TGF5b3V0RWZmZWN0cyk7XG5leHBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfTtcbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHRlbXBsYXRlIHsqfSBUXG4gKiBAcGFyYW0ge1R9IFtpbml0aWFsU3RhdGVdIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZVxuICogQHJldHVybiB7U3RhdGVUdXBsZTxUPn0gc3RhdGVUdXBsZSAtIFR1cGxlIG9mIGN1cnJlbnQgc3RhdGUgYW5kIHN0YXRlIHVwZGF0ZXIgZnVuY3Rpb25cbiAqL1xuY29uc3QgdXNlU3RhdGUgPSBob29rKGNsYXNzIGV4dGVuZHMgSG9vayB7XG4gICAgYXJncztcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLnVwZGF0ZXIgPSB0aGlzLnVwZGF0ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbml0aWFsVmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgaW5pdEZuID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gaW5pdEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYWtlQXJncyhpbml0aWFsVmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3M7XG4gICAgfVxuICAgIHVwZGF0ZXIodmFsdWUpIHtcbiAgICAgICAgY29uc3QgW3ByZXZpb3VzVmFsdWVdID0gdGhpcy5hcmdzO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZXJGbiA9IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSB1cGRhdGVyRm4ocHJldmlvdXNWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ha2VBcmdzKHZhbHVlKTtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKTtcbiAgICB9XG4gICAgbWFrZUFyZ3ModmFsdWUpIHtcbiAgICAgICAgdGhpcy5hcmdzID0gT2JqZWN0LmZyZWV6ZShbdmFsdWUsIHRoaXMudXBkYXRlcl0pO1xuICAgIH1cbn0pO1xuZXhwb3J0IHsgdXNlU3RhdGUgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIFBvcnRpb25zIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIi4vdXNlLWxheW91dC1lZmZlY3RcIjtcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcIi4vdXNlLXN0YXRlXCI7XG5jb25zdCBtaWNyb3Rhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgUmVhY3RpdmVDb250cm9sbGVySG9zdCB0aGF0IGlzIGRyaXZlbiBieSBIYXVudGVkIGhvb2tzXG4gKiBhbmQgYHVzZUNvbnRyb2xsZXIoKWAuXG4gKi9cbmNsYXNzIEhhdW50ZWRDb250cm9sbGVySG9zdCB7XG4gICAgY291bnQ7XG4gICAga2ljaztcbiAgICBfY29udHJvbGxlcnMgPSBbXTtcbiAgICBfdXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZTtcbiAgICBfcmVzb2x2ZVVwZGF0ZTtcbiAgICBjb25zdHJ1Y3Rvcihjb3VudCwga2ljaykge1xuICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgICAgIHRoaXMua2ljayA9IGtpY2s7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVVcGRhdGUgPSByZXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhZGRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMucHVzaChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcmVtb3ZlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgICAgIC8vIE5vdGUsIGlmIHRoZSBpbmRleE9mIGlzIC0xLCB0aGUgPj4+IHdpbGwgZmxpcCB0aGUgc2lnbiB3aGljaCBtYWtlcyB0aGVcbiAgICAgICAgLy8gc3BsaWNlIGRvIG5vdGhpbmcuXG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzICYmXG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVycy5zcGxpY2UodGhpcy5fY29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSA+Pj4gMCwgMSk7XG4gICAgfVxuICAgIHJlcXVlc3RVcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdXBkYXRlUGVuZGluZykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgICBtaWNyb3Rhc2sudGhlbigoKSA9PiB0aGlzLmtpY2soKHRoaXMuY291bnQgKz0gMSkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgdXBkYXRlQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVDb21wbGV0ZVByb21pc2U7XG4gICAgfVxuICAgIGNvbm5lY3RlZCgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkICYmIGMuaG9zdENvbm5lY3RlZCgpKTtcbiAgICB9XG4gICAgZGlzY29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQgJiYgYy5ob3N0RGlzY29ubmVjdGVkKCkpO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZSAmJiBjLmhvc3RVcGRhdGUoKSk7XG4gICAgfVxuICAgIHVwZGF0ZWQoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IHRoaXMuX3Jlc29sdmVVcGRhdGU7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB1cGRhdGVDb21wbGV0ZSBQcm9taXNlIGZvciB0aGUgbmV4dCB1cGRhdGUsXG4gICAgICAgIC8vIGJlZm9yZSByZXNvbHZpbmcgdGhlIGN1cnJlbnQgb25lLlxuICAgICAgICB0aGlzLl91cGRhdGVDb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlVXBkYXRlID0gcmVzO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZCAmJiBjLmhvc3RVcGRhdGVkKCkpO1xuICAgICAgICByZXNvbHZlKHRoaXMuX3VwZGF0ZVBlbmRpbmcpO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhbmQgc3RvcmVzIGEgc3RhdGVmdWwgUmVhY3RpdmVDb250cm9sbGVyIGluc3RhbmNlIGFuZCBwcm92aWRlcyBpdFxuICogd2l0aCBhIFJlYWN0aXZlQ29udHJvbGxlckhvc3QgdGhhdCBkcml2ZXMgdGhlIGNvbnRyb2xsZXIgbGlmZWN5Y2xlLlxuICpcbiAqIFVzZSB0aGlzIGhvb2sgdG8gY29udmVydCBhIFJlYWN0aXZlQ29udHJvbGxlciBpbnRvIGEgSGF1bnRlZCBob29rLlxuICpcbiAqIEBwYXJhbSB7PEMgZXh0ZW5kcyBSZWFjdGl2ZUNvbnRyb2xsZXI+KGhvc3Q6IFJlYWN0aXZlQ29udHJvbGxlckhvc3QpID0+IEN9IGNyZWF0ZUNvbnRyb2xsZXIgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBjb250cm9sbGVyIGluc3RhbmNlLlxuICogVGhpcyBmdW5jdGlvbiBpcyBnaXZlbiBhIEhhdW50ZWRDb250cm9sbGVySG9zdCB0byBwYXNzIHRvIHRoZSBjb250cm9sbGVyLiBUaGVcbiAqIGNyZWF0ZSBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBjb21wb25lbnQuXG4gKiBAcmV0dXJuIHtSZWFjdGl2ZUNvbnRyb2xsZXJ9IHRoZSBjb250cm9sbGVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250cm9sbGVyKGNyZWF0ZUNvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBbY291bnQsIGtpY2tdID0gdXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW2hvc3RdID0gdXNlU3RhdGUoKCkgPT4ge1xuICAgICAgICBjb25zdCBob3N0ID0gbmV3IEhhdW50ZWRDb250cm9sbGVySG9zdChjb3VudCwga2ljayk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBjcmVhdGVDb250cm9sbGVyKGhvc3QpO1xuICAgICAgICBob3N0LnByaW1hcnlDb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgaG9zdC5jb25uZWN0ZWQoKTtcbiAgICAgICAgcmV0dXJuIGhvc3Q7XG4gICAgfSk7XG4gICAgLy8gV2UgdXNlIHVzZUxheW91dEVmZmVjdCBiZWNhdXNlIHdlIG5lZWQgdXBkYXRlZCgpIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gYWZ0ZXIgcmVuZGVyaW5nLlxuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiBob3N0LnVwZGF0ZWQoKSk7XG4gICAgLy8gUmV0dXJuaW5nIGEgY2xlYW51cCBmdW5jdGlvbiBzaW11bGF0ZXMgaG9zdERpc2Nvbm5lY3RlZCB0aW1pbmcuIEFuIGVtcHR5XG4gICAgLy8gZGVwcyBhcnJheSB0ZWxscyBIYXVudGVkIHRvIG9ubHkgY2FsbCB0aGlzIG9uY2U6IG9uIG1vdW50IHdpdGggdGhlIGNsZWFudXBcbiAgICAvLyBjYWxsZWQgb24gdW5tb3VudC5cbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4gKCkgPT4gaG9zdC5kaXNjb25uZWN0ZWQoKSwgW10pO1xuICAgIGhvc3QudXBkYXRlKCk7XG4gICAgcmV0dXJuIGhvc3QucHJpbWFyeUNvbnRyb2xsZXI7XG59XG4iLCJpbXBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuLyoqXG4gKiBHaXZlbiBhIHJlZHVjZXIgZnVuY3Rpb24sIGluaXRpYWwgc3RhdGUsIGFuZCBvcHRpb25hbCBzdGF0ZSBpbml0aWFsaXplciBmdW5jdGlvbiwgcmV0dXJucyBhIHR1cGxlIG9mIHN0YXRlIGFuZCBkaXNwYXRjaCBmdW5jdGlvbi5cbiAqIEBmdW5jdGlvblxuICogQHRlbXBsYXRlIFMgU3RhdGVcbiAqIEB0ZW1wbGF0ZSBJIEluaXRpYWwgU3RhdGVcbiAqIEB0ZW1wbGF0ZSBBIEFjdGlvblxuICogQHBhcmFtIHtSZWR1Y2VyPFMsIEE+fSByZWR1Y2VyIC0gcmVkdWNlciBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBuZXh0IHN0YXRlIGdpdmVuIHRoZSBwcmV2aW91cyBzdGF0ZSBhbmQgdGhlIGFjdGlvblxuICogQHBhcmFtIHtJfSBpbml0aWFsU3RhdGUgLSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgcmVkdWNlclxuICogQHBhcmFtIHsoaW5pdDogSSkgPT4gU30gW2luaXQ9dW5kZWZpbmVkXSAtIE9wdGlvbmFsIGluaXRpYWxpemVyIGZ1bmN0aW9uLCBjYWxsZWQgb24gaW5pdGlhbFN0YXRlIGlmIHByb3ZpZGVkXG4gKiBAcmV0dXJuIHtyZWFkb25seSBbUywgKGFjdGlvbjogQSkgPT4gdm9pZF19XG4gKi9cbmNvbnN0IHVzZVJlZHVjZXIgPSBob29rKGNsYXNzIGV4dGVuZHMgSG9vayB7XG4gICAgcmVkdWNlcjtcbiAgICBjdXJyZW50U3RhdGU7XG4gICAgY29uc3RydWN0b3IoaWQsIHN0YXRlLCBfLCBpbml0aWFsU3RhdGUsIGluaXQpIHtcbiAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPVxuICAgICAgICAgICAgaW5pdCAhPT0gdW5kZWZpbmVkID8gaW5pdChpbml0aWFsU3RhdGUpIDogaW5pdGlhbFN0YXRlO1xuICAgIH1cbiAgICB1cGRhdGUocmVkdWNlcikge1xuICAgICAgICB0aGlzLnJlZHVjZXIgPSByZWR1Y2VyO1xuICAgICAgICByZXR1cm4gW3RoaXMuY3VycmVudFN0YXRlLCB0aGlzLmRpc3BhdGNoXTtcbiAgICB9XG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5yZWR1Y2VyKHRoaXMuY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgIH1cbn0pO1xuZXhwb3J0IHsgdXNlUmVkdWNlciB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5leHBvcnQgY29uc3QgUGFydFR5cGUgPSB7XG4gICAgQVRUUklCVVRFOiAxLFxuICAgIENISUxEOiAyLFxuICAgIFBST1BFUlRZOiAzLFxuICAgIEJPT0xFQU5fQVRUUklCVVRFOiA0LFxuICAgIEVWRU5UOiA1LFxuICAgIEVMRU1FTlQ6IDYsXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgdXNlci1mYWNpbmcgZGlyZWN0aXZlIGZ1bmN0aW9uIGZyb20gYSBEaXJlY3RpdmUgY2xhc3MuIFRoaXNcbiAqIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBkaXJlY3RpdmUncyByZW5kZXIoKSBtZXRob2QuXG4gKi9cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmUgPSAoYykgPT4gKC4uLnZhbHVlcykgPT4gKHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIFsnXyRsaXREaXJlY3RpdmUkJ106IGMsXG4gICAgdmFsdWVzLFxufSk7XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIGN1c3RvbSBkaXJlY3RpdmVzLiBVc2VycyBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MsXG4gKiBpbXBsZW1lbnQgYHJlbmRlcmAgYW5kL29yIGB1cGRhdGVgLCBhbmQgdGhlbiBwYXNzIHRoZWlyIHN1YmNsYXNzIHRvXG4gKiBgZGlyZWN0aXZlYC5cbiAqL1xuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoX3BhcnRJbmZvKSB7IH1cbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCkge1xuICAgICAgICB0aGlzLl9fcGFydCA9IHBhcnQ7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9IGF0dHJpYnV0ZUluZGV4O1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRyZXNvbHZlKHBhcnQsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShwYXJ0LCBwcm9wcyk7XG4gICAgfVxuICAgIHVwZGF0ZShfcGFydCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKC4uLnByb3BzKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJlY3RpdmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcbi8vIEFsbG93cyBtaW5pZmllcnMgdG8gcmVuYW1lIHJlZmVyZW5jZXMgdG8gZ2xvYmFsVGhpc1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8qKlxuICogV2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIHN1cHBvcnRzIGBhZG9wdGVkU3R5bGVTaGVldHNgLlxuICovXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzID0gZ2xvYmFsLlNoYWRvd1Jvb3QgJiZcbiAgICAoZ2xvYmFsLlNoYWR5Q1NTID09PSB1bmRlZmluZWQgfHwgZ2xvYmFsLlNoYWR5Q1NTLm5hdGl2ZVNoYWRvdykgJiZcbiAgICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgICAncmVwbGFjZScgaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGU7XG5jb25zdCBjb25zdHJ1Y3Rpb25Ub2tlbiA9IFN5bWJvbCgpO1xuY29uc3QgY3NzVGFnQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgYSBzdHJpbmcgb2YgQ1NTIHRleHQsIHRoYXQgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGEgQ1NTU3R5bGVTaGVldC5cbiAqXG4gKiBDU1NSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiBgY3NzYC10YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbHMgYW5kXG4gKiBgdW5zYWZlQ1NTKClgLiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCBDU1NSZXN1bHRzIGFyZSBvbmx5IGNyZWF0ZWQgdmlhIHRoZVxuICogYGNzc2AgdGFnIGFuZCBgdW5zYWZlQ1NTKClgLCBDU1NSZXN1bHQgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgQ1NTUmVzdWx0IHtcbiAgICBjb25zdHJ1Y3Rvcihjc3NUZXh0LCBzdHJpbmdzLCBzYWZlVG9rZW4pIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgdGhpc1snXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICAgICAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3NzVGV4dCA9IGNzc1RleHQ7XG4gICAgICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICAgIH1cbiAgICAvLyBUaGlzIGlzIGEgZ2V0dGVyIHNvIHRoYXQgaXQncyBsYXp5LiBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyBzdHlsZXNoZWV0c1xuICAgIC8vIGFyZSBub3QgY3JlYXRlZCB1bnRpbCB0aGUgZmlyc3QgZWxlbWVudCBpbnN0YW5jZSBpcyBtYWRlLlxuICAgIGdldCBzdHlsZVNoZWV0KCkge1xuICAgICAgICAvLyBJZiBgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzYCBpcyB0cnVlIHRoZW4gd2UgYXNzdW1lIENTU1N0eWxlU2hlZXQgaXNcbiAgICAgICAgLy8gY29uc3RydWN0YWJsZS5cbiAgICAgICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgICAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5fc3RyaW5ncztcbiAgICAgICAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyAmJiBzdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlYWJsZSA9IHN0cmluZ3MgIT09IHVuZGVmaW5lZCAmJiBzdHJpbmdzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZVNoZWV0ID0gY3NzVGFnQ2FjaGUuZ2V0KHN0cmluZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0eWxlU2hlZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKHRoaXMuY3NzVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBjc3NUYWdDYWNoZS5zZXQoc3RyaW5ncywgc3R5bGVTaGVldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3NzVGV4dDtcbiAgICB9XG59XG5jb25zdCB0ZXh0RnJvbUNTU1Jlc3VsdCA9ICh2YWx1ZSkgPT4ge1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgaWYgKHZhbHVlWydfJGNzc1Jlc3VsdCQnXSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuY3NzVGV4dDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIHBhc3NlZCB0byAnY3NzJyBmdW5jdGlvbiBtdXN0IGJlIGEgJ2NzcycgZnVuY3Rpb24gcmVzdWx0OiBgICtcbiAgICAgICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICAgICAgYHRvIGVuc3VyZSBwYWdlIHNlY3VyaXR5LmApO1xuICAgIH1cbn07XG4vKipcbiAqIFdyYXAgYSB2YWx1ZSBmb3IgaW50ZXJwb2xhdGlvbiBpbiBhIHtAbGlua2NvZGUgY3NzfSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbC5cbiAqXG4gKiBUaGlzIGlzIHVuc2FmZSBiZWNhdXNlIHVudHJ1c3RlZCBDU1MgdGV4dCBjYW4gYmUgdXNlZCB0byBwaG9uZSBob21lXG4gKiBvciBleGZpbHRyYXRlIGRhdGEgdG8gYW4gYXR0YWNrZXIgY29udHJvbGxlZCBzaXRlLiBUYWtlIGNhcmUgdG8gb25seSB1c2VcbiAqIHRoaXMgd2l0aCB0cnVzdGVkIGlucHV0LlxuICovXG5leHBvcnQgY29uc3QgdW5zYWZlQ1NTID0gKHZhbHVlKSA9PiBuZXcgQ1NTUmVzdWx0KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksIHVuZGVmaW5lZCwgY29uc3RydWN0aW9uVG9rZW4pO1xuLyoqXG4gKiBBIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggTGl0RWxlbWVudCdzXG4gKiB7QGxpbmtjb2RlIExpdEVsZW1lbnQuc3R5bGVzfSBwcm9wZXJ0eSB0byBzZXQgZWxlbWVudCBzdHlsZXMuXG4gKlxuICogRm9yIHNlY3VyaXR5IHJlYXNvbnMsIG9ubHkgbGl0ZXJhbCBzdHJpbmcgdmFsdWVzIGFuZCBudW1iZXIgbWF5IGJlIHVzZWQgaW5cbiAqIGVtYmVkZGVkIGV4cHJlc3Npb25zLiBUbyBpbmNvcnBvcmF0ZSBub24tbGl0ZXJhbCB2YWx1ZXMge0BsaW5rY29kZSB1bnNhZmVDU1N9XG4gKiBtYXkgYmUgdXNlZCBpbnNpZGUgYW4gZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGNzcyA9IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IHtcbiAgICBjb25zdCBjc3NUZXh0ID0gc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgICAgPyBzdHJpbmdzWzBdXG4gICAgICAgIDogdmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+IGFjYyArIHRleHRGcm9tQ1NTUmVzdWx0KHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7XG4gICAgcmV0dXJuIG5ldyBDU1NSZXN1bHQoY3NzVGV4dCwgc3RyaW5ncywgY29uc3RydWN0aW9uVG9rZW4pO1xufTtcbi8qKlxuICogQXBwbGllcyB0aGUgZ2l2ZW4gc3R5bGVzIHRvIGEgYHNoYWRvd1Jvb3RgLiBXaGVuIFNoYWRvdyBET00gaXNcbiAqIGF2YWlsYWJsZSBidXQgYGFkb3B0ZWRTdHlsZVNoZWV0c2AgaXMgbm90LCBzdHlsZXMgYXJlIGFwcGVuZGVkIHRvIHRoZVxuICogYHNoYWRvd1Jvb3RgIHRvIFttaW1pYyB0aGUgbmF0aXZlIGZlYXR1cmVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TaGFkb3dSb290L2Fkb3B0ZWRTdHlsZVNoZWV0cykuXG4gKiBOb3RlLCB3aGVuIHNoaW1taW5nIGlzIHVzZWQsIGFueSBzdHlsZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IHBsYWNlZCBpbnRvXG4gKiB0aGUgc2hhZG93Um9vdCBzaG91bGQgYmUgcGxhY2VkICpiZWZvcmUqIGFueSBzaGltbWVkIGFkb3B0ZWQgc3R5bGVzLiBUaGlzXG4gKiB3aWxsIG1hdGNoIHNwZWMgYmVoYXZpb3IgdGhhdCBnaXZlcyBhZG9wdGVkIHNoZWV0cyBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gKiBzaGFkb3dSb290LlxuICovXG5leHBvcnQgY29uc3QgYWRvcHRTdHlsZXMgPSAocmVuZGVyUm9vdCwgc3R5bGVzKSA9PiB7XG4gICAgaWYgKHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cykge1xuICAgICAgICByZW5kZXJSb290LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IHN0eWxlcy5tYXAoKHMpID0+IHMgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0ID8gcyA6IHMuc3R5bGVTaGVldCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc3R5bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgY29uc3Qgbm9uY2UgPSBnbG9iYWxbJ2xpdE5vbmNlJ107XG4gICAgICAgICAgICBpZiAobm9uY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBub25jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHMuY3NzVGV4dDtcbiAgICAgICAgICAgIHJlbmRlclJvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxufTtcbmNvbnN0IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0ID0gKHNoZWV0KSA9PiB7XG4gICAgbGV0IGNzc1RleHQgPSAnJztcbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2Ygc2hlZXQuY3NzUnVsZXMpIHtcbiAgICAgICAgY3NzVGV4dCArPSBydWxlLmNzc1RleHQ7XG4gICAgfVxuICAgIHJldHVybiB1bnNhZmVDU1MoY3NzVGV4dCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldENvbXBhdGlibGVTdHlsZSA9IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyB8fFxuICAgIChOT0RFX01PREUgJiYgZ2xvYmFsLkNTU1N0eWxlU2hlZXQgPT09IHVuZGVmaW5lZClcbiAgICA/IChzKSA9PiBzXG4gICAgOiAocykgPT4gcyBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyBjc3NSZXN1bHRGcm9tU3R5bGVTaGVldChzKSA6IHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3MtdGFnLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuLyoqXG4gKiBVc2UgdGhpcyBtb2R1bGUgaWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIGJhc2UgY2xhc3MgZXh0ZW5kaW5nXG4gKiB7QGxpbmsgUmVhY3RpdmVFbGVtZW50fS5cbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQgeyBnZXRDb21wYXRpYmxlU3R5bGUsIGFkb3B0U3R5bGVzLCB9IGZyb20gJy4vY3NzLXRhZy5qcyc7XG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBpbXBvcnQgd2lsbCBiZSBpbmplY3RlZCBieSBSb2xsdXA6XG4vLyBpbXBvcnQge0hUTUxFbGVtZW50LCBjdXN0b21FbGVtZW50c30gZnJvbSAnQGxpdC1sYWJzL3Nzci1kb20tc2hpbSc7XG5leHBvcnQgKiBmcm9tICcuL2Nzcy10YWcuanMnO1xuLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IEFkZCBgaGFzT3duYCBoZXJlIHdoZW4gd2Ugc2hpcCBFUzIwMjJcbmNvbnN0IHsgaXMsIGRlZmluZVByb3BlcnR5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGdldE93blByb3BlcnR5TmFtZXMsIGdldE93blByb3BlcnR5U3ltYm9scywgZ2V0UHJvdG90eXBlT2YsIH0gPSBPYmplY3Q7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcbi8vIExldHMgYSBtaW5pZmllciByZXBsYWNlIGdsb2JhbFRoaXMgcmVmZXJlbmNlcyB3aXRoIGEgbWluaWZpZWQgbmFtZVxuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbmlmIChOT0RFX01PREUpIHtcbiAgICBnbG9iYWwuY3VzdG9tRWxlbWVudHMgPz89IGN1c3RvbUVsZW1lbnRzO1xufVxuY29uc3QgREVWX01PREUgPSB0cnVlO1xubGV0IGlzc3VlV2FybmluZztcbmNvbnN0IHRydXN0ZWRUeXBlcyA9IGdsb2JhbFxuICAgIC50cnVzdGVkVHlwZXM7XG4vLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9jcmJ1Zy5jb20vOTkzMjY4XG4vLyBDdXJyZW50bHksIGFueSBhdHRyaWJ1dGUgc3RhcnRpbmcgd2l0aCBcIm9uXCIgaXMgY29uc2lkZXJlZCB0byBiZSBhXG4vLyBUcnVzdGVkU2NyaXB0IHNvdXJjZS4gU3VjaCBib29sZWFuIGF0dHJpYnV0ZXMgbXVzdCBiZSBzZXQgdG8gdGhlIGVxdWl2YWxlbnRcbi8vIHRydXN0ZWQgZW1wdHlTY3JpcHQgdmFsdWUuXG5jb25zdCBlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUgPSB0cnVzdGVkVHlwZXNcbiAgICA/IHRydXN0ZWRUeXBlcy5lbXB0eVNjcmlwdFxuICAgIDogJyc7XG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICAgID8gZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgICA6IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5pZiAoREVWX01PREUpIHtcbiAgICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAgIC8vIGFyZSBsb2FkZWQuXG4gICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAgICogV2FybmluZ3MgYXJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgb25seSBieSBgd2FybmluZ2A7IGRpc2FibGluZyB2aWEgYGNvZGVgXG4gICAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAgICovXG4gICAgaXNzdWVXYXJuaW5nID0gKGNvZGUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICAgICAgaWYgKCFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKHdhcm5pbmcpICYmXG4gICAgICAgICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyhjb2RlKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ2Rldi1tb2RlJywgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWApO1xuICAgICAgICAvLyBJc3N1ZSBwb2x5ZmlsbCBzdXBwb3J0IHdhcm5pbmcuXG4gICAgICAgIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ3BvbHlmaWxsLXN1cHBvcnQtbWlzc2luZycsIGBTaGFkb3cgRE9NIGlzIGJlaW5nIHBvbHlmaWxsZWQgdmlhIFxcYFNoYWR5RE9NXFxgIGJ1dCBgICtcbiAgICAgICAgICAgICAgICBgdGhlIFxcYHBvbHlmaWxsLXN1cHBvcnRcXGAgbW9kdWxlIGhhcyBub3QgYmVlbiBsb2FkZWQuYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICAgID8gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSBnbG9iYWxcbiAgICAgICAgICAgIC5lbWl0TGl0RGVidWdMb2dFdmVudHM7XG4gICAgICAgIGlmICghc2hvdWxkRW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbGl0LWRlYnVnJywge1xuICAgICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICA6IHVuZGVmaW5lZDtcbi8qXG4gKiBXaGVuIHVzaW5nIENsb3N1cmUgQ29tcGlsZXIsIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkocHJvcGVydHksIG9iamVjdCkgaXNcbiAqIHJlcGxhY2VkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgbXVuZ2VkIG5hbWUgZm9yIG9iamVjdFtwcm9wZXJ0eV0uIFdlIGNhbm5vdFxuICogYWxpYXMgdGhpcyBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0byB1c2UgYSBzbWFsbCBzaGltIHRoYXQgaGFzIHRoZSBzYW1lXG4gKiBiZWhhdmlvciB3aGVuIG5vdCBjb21waWxpbmcuXG4gKi9cbi8qQF9fSU5MSU5FX18qL1xuY29uc3QgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSA9IChwcm9wLCBfb2JqKSA9PiBwcm9wO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb252ZXJ0ZXIgPSB7XG4gICAgdG9BdHRyaWJ1dGUodmFsdWUsIHR5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEJvb2xlYW46XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE9iamVjdDpcbiAgICAgICAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBwYXNzIHRoaXMgdGhyb3VnaFxuICAgICAgICAgICAgICAgIC8vIHRvIGFsbG93IHJlbW92aW5nL25vIGNoYW5nZSBiZWhhdmlvci5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBmcm9tQXR0cmlidXRlKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgIGxldCBmcm9tVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEJvb2xlYW46XG4gICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgIT09IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE51bWJlcjpcbiAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICAgICAgICBjYXNlIEFycmF5OlxuICAgICAgICAgICAgICAgIC8vIERvICpub3QqIGdlbmVyYXRlIGV4Y2VwdGlvbiB3aGVuIGludmFsaWQgSlNPTiBpcyBzZXQgYXMgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjb21wbGFpbiBvbiBiZWluZyBtaXMtY29uZmlndXJlZC5cbiAgICAgICAgICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBEbyBnZW5lcmF0ZSBleGNlcHRpb24gaW4gKmRldiBtb2RlKi5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBc3NlcnQgdG8gYWRoZXJlIHRvIEJhemVsJ3MgXCJtdXN0IHR5cGUgYXNzZXJ0IEpTT04gcGFyc2VcIiBydWxlLlxuICAgICAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb21WYWx1ZTtcbiAgICB9LFxufTtcbi8qKlxuICogQ2hhbmdlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgZGlmZmVyZW50IGZyb20gYG9sZFZhbHVlYC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvcGVydHkncyBgaGFzQ2hhbmdlZGAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBub3RFcXVhbCA9ICh2YWx1ZSwgb2xkKSA9PiAhaXModmFsdWUsIG9sZCk7XG5jb25zdCBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbiA9IHtcbiAgICBhdHRyaWJ1dGU6IHRydWUsXG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGNvbnZlcnRlcjogZGVmYXVsdENvbnZlcnRlcixcbiAgICByZWZsZWN0OiBmYWxzZSxcbiAgICB1c2VEZWZhdWx0OiBmYWxzZSxcbiAgICBoYXNDaGFuZ2VkOiBub3RFcXVhbCxcbn07XG4vLyBFbnN1cmUgbWV0YWRhdGEgaXMgZW5hYmxlZC4gVHlwZVNjcmlwdCBkb2VzIG5vdCBwb2x5ZmlsbFxuLy8gU3ltYm9sLm1ldGFkYXRhLCBzbyB3ZSBtdXN0IGVuc3VyZSB0aGF0IGl0IGV4aXN0cy5cblN5bWJvbC5tZXRhZGF0YSA/Pz0gU3ltYm9sKCdtZXRhZGF0YScpO1xuLy8gTWFwIGZyb20gYSBjbGFzcydzIG1ldGFkYXRhIG9iamVjdCB0byBwcm9wZXJ0eSBvcHRpb25zXG4vLyBOb3RlIHRoYXQgd2UgbXVzdCB1c2UgbnVsbGlzaC1jb2FsZXNjaW5nIGFzc2lnbm1lbnQgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmVcbi8vIG1hcCBldmVuIGlmIHdlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS5cbmdsb2JhbC5saXRQcm9wZXJ0eU1ldGFkYXRhID8/PSBuZXcgV2Vha01hcCgpO1xuLyoqXG4gKiBCYXNlIGVsZW1lbnQgY2xhc3Mgd2hpY2ggbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuIFdoZW5cbiAqIHByb3BlcnRpZXMgY2hhbmdlLCB0aGUgYHVwZGF0ZWAgbWV0aG9kIGlzIGFzeW5jaHJvbm91c2x5IGNhbGxlZC4gVGhpcyBtZXRob2RcbiAqIHNob3VsZCBiZSBzdXBwbGllZCBieSBzdWJjbGFzc2VzIHRvIHJlbmRlciB1cGRhdGVzIGFzIGRlc2lyZWQuXG4gKiBAbm9Jbmhlcml0RG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFjdGl2ZUVsZW1lbnRcbi8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGBleHRlbmRzYCBjbGF1c2Ugd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoXG4vLyBgKGdsb2JhbFRoaXMuSFRNTEVsZW1lbnQgPz8gSFRNTEVsZW1lbnQpYC5cbi8vXG4vLyBUaGlzIHdheSwgd2Ugd2lsbCBmaXJzdCBwcmVmZXIgYW55IGdsb2JhbCBgSFRNTEVsZW1lbnRgIHBvbHlmaWxsIHRoYXQgdGhlXG4vLyB1c2VyIGhhcyBhc3NpZ25lZCwgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIHRoZSBgSFRNTEVsZW1lbnRgIHNoaW0gd2hpY2ggaGFzXG4vLyBiZWVuIGltcG9ydGVkIChzZWUgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBhYm91dCBob3cgdGhpcyBpbXBvcnQgaXNcbi8vIGdlbmVyYXRlZCBieSBSb2xsdXApLiBOb3RlIHRoYXQgdGhlIGBIVE1MRWxlbWVudGAgdmFyaWFibGUgaGFzIGJlZW5cbi8vIHNoYWRvd2VkIGJ5IHRoaXMgaW1wb3J0LCBzbyBpdCBubyBsb25nZXIgcmVmZXJzIHRvIHRoZSBnbG9iYWwuXG4gZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBpbml0aWFsaXplciBmdW5jdGlvbiB0byB0aGUgY2xhc3MgdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGluc3RhbmNlXG4gICAgICogY29uc3RydWN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBydW5zIGFnYWluc3QgYSBgUmVhY3RpdmVFbGVtZW50YFxuICAgICAqIHN1YmNsYXNzLCBzdWNoIGFzIGEgZGVjb3JhdG9yLCB0aGF0IG5lZWRzIHRvIGRvIHdvcmsgZm9yIGVhY2hcbiAgICAgKiBpbnN0YW5jZSwgc3VjaCBhcyBzZXR0aW5nIHVwIGEgYFJlYWN0aXZlQ29udHJvbGxlcmAuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IG15RGVjb3JhdG9yID0gKHRhcmdldDogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgKiAgIHRhcmdldC5hZGRJbml0aWFsaXplcigoaW5zdGFuY2U6IFJlYWN0aXZlRWxlbWVudCkgPT4ge1xuICAgICAqICAgICAvLyBUaGlzIGlzIHJ1biBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAgICogICAgIG5ldyBNeUNvbnRyb2xsZXIoaW5zdGFuY2UpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRGVjb3JhdGluZyBhIGZpZWxkIHdpbGwgdGhlbiBjYXVzZSBlYWNoIGluc3RhbmNlIHRvIHJ1biBhbiBpbml0aWFsaXplclxuICAgICAqIHRoYXQgYWRkcyBhIGNvbnRyb2xsZXI6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgICAqICAgQG15RGVjb3JhdG9yIGZvbztcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbml0aWFsaXplcnMgYXJlIHN0b3JlZCBwZXItY29uc3RydWN0b3IuIEFkZGluZyBhbiBpbml0aWFsaXplciB0byBhXG4gICAgICogc3ViY2xhc3MgZG9lcyBub3QgYWRkIGl0IHRvIGEgc3VwZXJjbGFzcy4gU2luY2UgaW5pdGlhbGl6ZXJzIGFyZSBydW4gaW5cbiAgICAgKiBjb25zdHJ1Y3RvcnMsIGluaXRpYWxpemVycyB3aWxsIHJ1biBpbiBvcmRlciBvZiB0aGUgY2xhc3MgaGllcmFyY2h5LFxuICAgICAqIHN0YXJ0aW5nIHdpdGggc3VwZXJjbGFzc2VzIGFuZCBwcm9ncmVzc2luZyB0byB0aGUgaW5zdGFuY2UncyBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgc3RhdGljIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7XG4gICAgICAgIHRoaXMuX19wcmVwYXJlKCk7XG4gICAgICAgICh0aGlzLl9pbml0aWFsaXplcnMgPz89IFtdKS5wdXNoKGluaXRpYWxpemVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWdpc3RlcmVkIHByb3BlcnRpZXMuXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgICAgICAvLyBFbnN1cmUgd2UndmUgY3JlYXRlZCBhbGwgcHJvcGVydGllc1xuICAgICAgICB0aGlzLmZpbmFsaXplKCk7XG4gICAgICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIGlzIG9ubHkgdW5kZWZpbmVkIGFmdGVyIGZpbmFsaXplKCkgaW5cbiAgICAgICAgLy8gUmVhY3RpdmVFbGVtZW50IGl0c2VsZi4gUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBpcyBvbmx5XG4gICAgICAgIC8vIGFjY2Vzc2VkIHdpdGggUmVhY3RpdmVFbGVtZW50IGFzIHRoZSByZWNlaXZlciB3aGVuIGEgc3ViY2xhc3Mgb3IgbWl4aW5cbiAgICAgICAgLy8gY2FsbHMgc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzXG4gICAgICAgIHJldHVybiAodGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgJiYgWy4uLnRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLmtleXMoKV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcHJvcGVydHkgYWNjZXNzb3Igb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlIGlmIG9uZSBkb2VzIG5vdCBleGlzdFxuICAgICAqIGFuZCBzdG9yZXMgYSB7QGxpbmtjb2RlIFByb3BlcnR5RGVjbGFyYXRpb259IGZvciB0aGUgcHJvcGVydHkgd2l0aCB0aGVcbiAgICAgKiBnaXZlbiBvcHRpb25zLiBUaGUgcHJvcGVydHkgc2V0dGVyIGNhbGxzIHRoZSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYFxuICAgICAqIHByb3BlcnR5IG9wdGlvbiBvciB1c2VzIGEgc3RyaWN0IGlkZW50aXR5IGNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgICAqIHRvIHJlcXVlc3QgYW4gdXBkYXRlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gY3VzdG9taXplIHByb3BlcnRpZXM7IGhvd2V2ZXIsXG4gICAgICogd2hlbiBkb2luZyBzbywgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgc3VwZXIuY3JlYXRlUHJvcGVydHlgIHRvIGVuc3VyZVxuICAgICAqIHRoZSBwcm9wZXJ0eSBpcyBzZXR1cCBjb3JyZWN0bHkuIFRoaXMgbWV0aG9kIGNhbGxzXG4gICAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAgaW50ZXJuYWxseSB0byBnZXQgYSBkZXNjcmlwdG9yIHRvIGluc3RhbGwuXG4gICAgICogVG8gY3VzdG9taXplIHdoYXQgcHJvcGVydGllcyBkbyB3aGVuIHRoZXkgYXJlIGdldCBvciBzZXQsIG92ZXJyaWRlXG4gICAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAuIFRvIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSxcbiAgICAgKiBpbXBsZW1lbnQgYGNyZWF0ZVByb3BlcnR5YCBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSB7XG4gICAgICogICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihvcHRpb25zLCB7bXlPcHRpb246IHRydWV9KTtcbiAgICAgKiAgIHN1cGVyLmNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucyA9IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdGF0ZSBwcm9wZXJ0eSwgZm9yY2UgdGhlIGF0dHJpYnV0ZSB0byBmYWxzZS5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYXR0cmlidXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAgICAgLy8gV2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHdyYXBwaW5nIGFjY2Vzc29ycy5cbiAgICAgICAgLy8gSGVscHMgY29udHJvbCB0aGUgaW5pdGlhbCB2YWx1ZSBjaGFuZ2UgYW5kIHJlZmxlY3Rpb24gbG9naWMuXG4gICAgICAgIGlmICh0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUob3B0aW9ucyk7XG4gICAgICAgICAgICBvcHRpb25zLndyYXBwZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIW9wdGlvbnMubm9BY2Nlc3Nvcikge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gREVWX01PREVcbiAgICAgICAgICAgICAgICA/IC8vIFVzZSBTeW1ib2wuZm9yIGluIGRldiBtb2RlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIG1haW50YWluIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gZG9pbmcgSE1SLlxuICAgICAgICAgICAgICAgICAgICBTeW1ib2wuZm9yKGAke1N0cmluZyhuYW1lKX0gKEBwcm9wZXJ0eSgpIGNhY2hlKWApXG4gICAgICAgICAgICAgICAgOiBTeW1ib2woKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBuYW1lLCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgZGVzY3JpcHRvciB0byBiZSBkZWZpbmVkIG9uIHRoZSBnaXZlbiBuYW1lZCBwcm9wZXJ0eS5cbiAgICAgKiBJZiBubyBkZXNjcmlwdG9yIGlzIHJldHVybmVkLCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmVjb21lIGFuIGFjY2Vzc29yLlxuICAgICAqIEZvciBleGFtcGxlLFxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICAgKiAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKSB7XG4gICAgICogICAgIGNvbnN0IGRlZmF1bHREZXNjcmlwdG9yID1cbiAgICAgKiAgICAgICAgIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgICAqICAgICBjb25zdCBzZXR0ZXIgPSBkZWZhdWx0RGVzY3JpcHRvci5zZXQ7XG4gICAgICogICAgIHJldHVybiB7XG4gICAgICogICAgICAgZ2V0OiBkZWZhdWx0RGVzY3JpcHRvci5nZXQsXG4gICAgICogICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICogICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICogICAgICAgICAvLyBjdXN0b20gYWN0aW9uLlxuICAgICAqICAgICAgIH0sXG4gICAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAqICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGdldCwgc2V0IH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHtcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1trZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh2KSB7XG4gICAgICAgICAgICAgICAgdGhpc1trZXldID0gdjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChERVZfTU9ERSAmJiBnZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCd2YWx1ZScgaW4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWVsZCAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhuYW1lKSl9IG9uIGAgK1xuICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgICAgICAgICAgICBgYnV0IGl0J3MgYWN0dWFsbHkgZGVjbGFyZWQgYXMgYSB2YWx1ZSBvbiB0aGUgcHJvdG90eXBlLiBgICtcbiAgICAgICAgICAgICAgICAgICAgYFVzdWFsbHkgdGhpcyBpcyBkdWUgdG8gdXNpbmcgQHByb3BlcnR5IG9yIEBzdGF0ZSBvbiBhIG1ldGhvZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlV2FybmluZygncmVhY3RpdmUtcHJvcGVydHktd2l0aG91dC1nZXR0ZXInLCBgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgICAgICBgJHt0aGlzLm5hbWV9IHdhcyBkZWNsYXJlZCBhcyBhIHJlYWN0aXZlIHByb3BlcnR5IGAgK1xuICAgICAgICAgICAgICAgIGBidXQgaXQgZG9lcyBub3QgaGF2ZSBhIGdldHRlci4gVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGEgYCArXG4gICAgICAgICAgICAgICAgYGZ1dHVyZSB2ZXJzaW9uIG9mIExpdC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2V0LFxuICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBnZXQ/LmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgc2V0Py5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG9wdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAgICAgKiBUaGVzZSBvcHRpb25zIGFyZSBkZWZpbmVkIHdpdGggYSBgUHJvcGVydHlEZWNsYXJhdGlvbmAgdmlhIHRoZSBgcHJvcGVydGllc2BcbiAgICAgKiBvYmplY3Qgb3IgdGhlIGBAcHJvcGVydHlgIGRlY29yYXRvciBhbmQgYXJlIHJlZ2lzdGVyZWQgaW5cbiAgICAgKiBgY3JlYXRlUHJvcGVydHkoLi4uKWAuXG4gICAgICpcbiAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBcImZpbmFsXCIgYW5kIG5vdCBvdmVycmlkZGVuLiBUb1xuICAgICAqIGN1c3RvbWl6ZSB0aGUgb3B0aW9ucyBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgb3ZlcnJpZGVcbiAgICAgKiB7QGxpbmtjb2RlIGNyZWF0ZVByb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICogQGZpbmFsXG4gICAgICogQGNhdGVnb3J5IHByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuZ2V0KG5hbWUpID8/IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBzdGF0aWMgb3duIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzIHVzZWQgaW4gYm9va2tlZXBpbmdcbiAgICAgKiBmb3IgZWxlbWVudCBwcm9wZXJ0aWVzLCBpbml0aWFsaXplcnMsIGV0Yy5cbiAgICAgKlxuICAgICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYnkgY29kZSB0aGF0IG5lZWRzIHRvIGVuc3VyZSB0aGVzZVxuICAgICAqIHByb3BlcnRpZXMgZXhpc3QgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdXBlcmNsYXNzIGlzIGZpbmFsaXplZCBzbyB0aGF0IGluaGVyaXRlZFxuICAgICAqIHByb3BlcnR5IG1ldGFkYXRhIGNhbiBiZSBjb3BpZWQgZG93bi5cbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIHN0YXRpYyBfX3ByZXBhcmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgdGhpcykpKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IHByZXBhcmVkXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluYWxpemUgYW55IHN1cGVyY2xhc3Nlc1xuICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBnZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgICAgICAgc3VwZXJDdG9yLmZpbmFsaXplKCk7XG4gICAgICAgIC8vIENyZWF0ZSBvd24gc2V0IG9mIGluaXRpYWxpemVycyBmb3IgdGhpcyBjbGFzcyBpZiBhbnkgZXhpc3Qgb24gdGhlXG4gICAgICAgIC8vIHN1cGVyY2xhc3MgYW5kIGNvcHkgdGhlbSBkb3duLiBOb3RlLCBmb3IgYSBzbWFsbCBwZXJmIGJvb3N0LCBhdm9pZFxuICAgICAgICAvLyBjcmVhdGluZyBpbml0aWFsaXplcnMgdW5sZXNzIG5lZWRlZC5cbiAgICAgICAgaWYgKHN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVycyA9IFsuLi5zdXBlckN0b3IuX2luaXRpYWxpemVyc107XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50UHJvcGVydGllcyBmcm9tIHRoZSBzdXBlcmNsYXNzXG4gICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHN1cGVyQ3Rvci5lbGVtZW50UHJvcGVydGllcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmlzaGVzIHNldHRpbmcgdXAgdGhlIGNsYXNzIHNvIHRoYXQgaXQncyByZWFkeSB0byBiZSByZWdpc3RlcmVkXG4gICAgICogYXMgYSBjdXN0b20gZWxlbWVudCBhbmQgaW5zdGFudGlhdGVkLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlci5cbiAgICAgKiBJZiB5b3Ugb3ZlcnJpZGUgdGhlIG9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIsIHlvdSBtdXN0IGVpdGhlciBjYWxsXG4gICAgICogc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHRvIHRyaWdnZXIgZmluYWxpemF0aW9uLCBvciBjYWxsIGZpbmFsaXplKClcbiAgICAgKiB5b3Vyc2VsZi5cbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgc3RhdGljIGZpbmFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCB0aGlzKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX19wcmVwYXJlKCk7XG4gICAgICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHN0YXRpYyBwcm9wZXJ0aWVzIGJsb2NrOlxuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdwcm9wZXJ0aWVzJywgdGhpcykpKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IHByb3BLZXlzID0gW1xuICAgICAgICAgICAgICAgIC4uLmdldE93blByb3BlcnR5TmFtZXMocHJvcHMpLFxuICAgICAgICAgICAgICAgIC4uLmdldE93blByb3BlcnR5U3ltYm9scyhwcm9wcyksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHByb3BLZXlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0eShwLCBwcm9wc1twXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHByb3BlcnRpZXMgZnJvbSBzdGFuZGFyZCBkZWNvcmF0b3IgbWV0YWRhdGE6XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpc1tTeW1ib2wubWV0YWRhdGFdO1xuICAgICAgICBpZiAobWV0YWRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBsaXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChwLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUtdG8tcHJvcGVydHkgbWFwXG4gICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5zZXQoYXR0ciwgcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50U3R5bGVzID0gdGhpcy5maW5hbGl6ZVN0eWxlcyh0aGlzLnN0eWxlcyk7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZVByb3BlcnR5JykpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ25vLW92ZXJyaWRlLWNyZWF0ZS1wcm9wZXJ0eScsICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5jcmVhdGVQcm9wZXJ0eSgpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIGRlY29yYXRvcnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdnZXRQcm9wZXJ0eURlc2NyaXB0b3InKSkge1xuICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygnbm8tb3ZlcnJpZGUtZ2V0LXByb3BlcnR5LWRlc2NyaXB0b3InLCAnT3ZlcnJpZGluZyBSZWFjdGl2ZUVsZW1lbnQuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkgaXMgZGVwcmVjYXRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRha2VzIHRoZSBzdHlsZXMgdGhlIHVzZXIgc3VwcGxpZWQgdmlhIHRoZSBgc3RhdGljIHN0eWxlc2AgcHJvcGVydHkgYW5kXG4gICAgICogcmV0dXJucyB0aGUgYXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LlxuICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGludGVncmF0ZSBpbnRvIGEgc3R5bGUgbWFuYWdlbWVudCBzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBTdHlsZXMgYXJlIGRlZHVwbGljYXRlZCBwcmVzZXJ2aW5nIHRoZSBfbGFzdF8gaW5zdGFuY2UgaW4gdGhlIGxpc3QuIFRoaXNcbiAgICAgKiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0byBhdm9pZCBkdXBsaWNhdGVkIHN0eWxlcyB0aGF0IGNhbiBvY2N1clxuICAgICAqIGVzcGVjaWFsbHkgd2hlbiBjb21wb3NpbmcgdmlhIHN1YmNsYXNzaW5nLiBUaGUgbGFzdCBpdGVtIGlzIGtlcHQgdG8gdHJ5XG4gICAgICogdG8gcHJlc2VydmUgdGhlIGNhc2NhZGUgb3JkZXIgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0J3MgbW9zdCBpbXBvcnRhbnRcbiAgICAgKiB0aGF0IGxhc3QgYWRkZWQgc3R5bGVzIG92ZXJyaWRlIHByZXZpb3VzIHN0eWxlcy5cbiAgICAgKlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICogQGNhdGVnb3J5IHN0eWxlc1xuICAgICAqL1xuICAgIHN0YXRpYyBmaW5hbGl6ZVN0eWxlcyhzdHlsZXMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0eWxlcyA9IFtdO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZXMpKSB7XG4gICAgICAgICAgICAvLyBEZWR1cGUgdGhlIGZsYXR0ZW5lZCBhcnJheSBpbiByZXZlcnNlIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBsYXN0IGl0ZW1zLlxuICAgICAgICAgICAgLy8gQ2FzdGluZyB0byBBcnJheTx1bmtub3duPiB3b3JrcyBhcm91bmQgVFMgZXJyb3IgdGhhdFxuICAgICAgICAgICAgLy8gYXBwZWFycyB0byBjb21lIGZyb20gdHJ5aW5nIHRvIGZsYXR0ZW4gYSB0eXBlIENTU1Jlc3VsdEFycmF5LlxuICAgICAgICAgICAgY29uc3Qgc2V0ID0gbmV3IFNldChzdHlsZXMuZmxhdChJbmZpbml0eSkucmV2ZXJzZSgpKTtcbiAgICAgICAgICAgIC8vIFRoZW4gcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgYnkgYWRkaW5nIHRoZSBzZXQgaXRlbXMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcyBvZiBzZXQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50U3R5bGVzLnVuc2hpZnQoZ2V0Q29tcGF0aWJsZVN0eWxlKHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdHlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWxlbWVudFN0eWxlcy5wdXNoKGdldENvbXBhdGlibGVTdHlsZShzdHlsZXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFN0eWxlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBgbmFtZWAuXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvcHRpb25zLmF0dHJpYnV0ZTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHR5cGVvZiBhdHRyaWJ1dGUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICA6IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnVlIGlmIHRoZXJlIGlzIGEgcGVuZGluZyB1cGRhdGUgYXMgYSByZXN1bHQgb2YgY2FsbGluZyBgcmVxdWVzdFVwZGF0ZSgpYC5cbiAgICAgICAgICogU2hvdWxkIG9ubHkgYmUgcmVhZC5cbiAgICAgICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyBzZXQgdG8gYHRydWVgIGFmdGVyIHRoZSBmaXJzdCB1cGRhdGUuIFRoZSBlbGVtZW50IGNvZGUgY2Fubm90IGFzc3VtZVxuICAgICAgICAgKiB0aGF0IGByZW5kZXJSb290YCBleGlzdHMgYmVmb3JlIHRoZSBlbGVtZW50IGBoYXNVcGRhdGVkYC5cbiAgICAgICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaGFzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogTmFtZSBvZiBjdXJyZW50bHkgcmVmbGVjdGluZyBwcm9wZXJ0eVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG9ubHkgb3ZlcnJpZGUgcG9pbnQgZm9yIGN1c3RvbWl6aW5nIHdvcmsgZG9uZSB3aGVuIGVsZW1lbnRzXG4gICAgICogYXJlIGNvbnN0cnVjdGVkLlxuICAgICAqL1xuICAgIF9faW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5fX3VwZGF0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiAodGhpcy5lbmFibGVVcGRhdGluZyA9IHJlcykpO1xuICAgICAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIFRoaXMgZW5xdWV1ZXMgYSBtaWNyb3Rhc2sgdGhhdCBtdXN0IHJ1biBiZWZvcmUgdGhlIGZpcnN0IHVwZGF0ZSwgc28gaXRcbiAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgICAgICB0aGlzLl9fc2F2ZUluc3RhbmNlUHJvcGVydGllcygpO1xuICAgICAgICAvLyBlbnN1cmVzIGZpcnN0IHVwZGF0ZSB3aWxsIGJlIGNhdWdodCBieSBhbiBlYXJseSBhY2Nlc3Mgb2ZcbiAgICAgICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5faW5pdGlhbGl6ZXJzPy5mb3JFYWNoKChpKSA9PiBpKHRoaXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgYFJlYWN0aXZlQ29udHJvbGxlcmAgdG8gcGFydGljaXBhdGUgaW4gdGhlIGVsZW1lbnQncyByZWFjdGl2ZVxuICAgICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAgICogY29udHJvbGxlcnMgZHVyaW5nIGl0cyBsaWZlY3ljbGUgY2FsbGJhY2tzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICAgKiBjb250cm9sbGVyJ3MgYGhvc3RDb25uZWN0ZWQoKWAgY2FsbGJhY2sgd2lsbCBiZSBpbW1lZGlhdGVseSBjYWxsZWQuXG4gICAgICogQGNhdGVnb3J5IGNvbnRyb2xsZXJzXG4gICAgICovXG4gICAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgICAgICh0aGlzLl9fY29udHJvbGxlcnMgPz89IG5ldyBTZXQoKSkuYWRkKGNvbnRyb2xsZXIpO1xuICAgICAgICAvLyBJZiBhIGNvbnRyb2xsZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY29ubmVjdGVkLFxuICAgICAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgICAgICAvLyAod2hpY2ggaXMgc2V0IGluIGNvbm5lY3RlZENhbGxiYWNrKSB0byBhdm9pZCB0aGUgbmVlZCB0byB0cmFjayBhXG4gICAgICAgIC8vIGZpcnN0IGNvbm5lY3RlZCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgIGZyb20gdGhlIGVsZW1lbnQuXG4gICAgICogQGNhdGVnb3J5IGNvbnRyb2xsZXJzXG4gICAgICovXG4gICAgcmVtb3ZlQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZGVsZXRlKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaXhlcyBhbnkgcHJvcGVydGllcyBzZXQgb24gdGhlIGluc3RhbmNlIGJlZm9yZSB1cGdyYWRlIHRpbWUuXG4gICAgICogT3RoZXJ3aXNlIHRoZXNlIHdvdWxkIHNoYWRvdyB0aGUgYWNjZXNzb3IgYW5kIGJyZWFrIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICAgKiBjb25zdHJ1Y3RvciBydW5zLlxuICAgICAqL1xuICAgIF9fc2F2ZUluc3RhbmNlUHJvcGVydGllcygpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2VQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9IHRoaXMuY29uc3RydWN0b3JcbiAgICAgICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIGVsZW1lbnRQcm9wZXJ0aWVzLmtleXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVByb3BlcnRpZXMuc2V0KHAsIHRoaXNbcF0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbm9kZSBpbnRvIHdoaWNoIHRoZSBlbGVtZW50IHNob3VsZCByZW5kZXIgYW5kIGJ5IGRlZmF1bHRcbiAgICAgKiBjcmVhdGVzIGFuZCByZXR1cm5zIGFuIG9wZW4gc2hhZG93Um9vdC4gSW1wbGVtZW50IHRvIGN1c3RvbWl6ZSB3aGVyZSB0aGVcbiAgICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgICAqIGNoaWxkTm9kZXMsIHJldHVybiBgdGhpc2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICAgKi9cbiAgICBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgICAgICBjb25zdCByZW5kZXJSb290ID0gdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh0aGlzLmNvbnN0cnVjdG9yLnNoYWRvd1Jvb3RPcHRpb25zKTtcbiAgICAgICAgYWRvcHRTdHlsZXMocmVuZGVyUm9vdCwgdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50U3R5bGVzKTtcbiAgICAgICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uIGZpcnN0IGNvbm5lY3Rpb24sIGNyZWF0ZXMgdGhlIGVsZW1lbnQncyByZW5kZXJSb290LCBzZXRzIHVwXG4gICAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAgICovXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBjb250cm9sbGVycyBgaG9zdENvbm5lY3RlZGBcbiAgICAgICAgdGhpcy5yZW5kZXJSb290ID8/PVxuICAgICAgICAgICAgdGhpcy5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgICAgIHRoaXMuZW5hYmxlVXBkYXRpbmcodHJ1ZSk7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdGUsIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpbmFsIGFuZCBub3Qgb3ZlcnJpZGRlbi4gSXQgaXNcbiAgICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgICAqIHVwZGF0ZS5cbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIGVuYWJsZVVwZGF0aW5nKF9yZXF1ZXN0ZWRVcGRhdGUpIHsgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBmb3IgYHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIGluIGV4dGVuc2lvbnMgd2hpbGVcbiAgICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICAgKiB3aGVuIGRpc2Nvbm5lY3RpbmcgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLlxuICAgICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3luY2hyb25pemVzIHByb3BlcnR5IHZhbHVlcyB3aGVuIGF0dHJpYnV0ZXMgY2hhbmdlLlxuICAgICAqXG4gICAgICogU3BlY2lmaWNhbGx5LCB3aGVuIGFuIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGlzIHNldC5cbiAgICAgKiBZb3Ugc2hvdWxkIHJhcmVseSBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGNhbGxiYWNrLiBJZiB0aGlzIG1ldGhvZCBpc1xuICAgICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAgICogY2FsbGVkLlxuICAgICAqXG4gICAgICogU2VlIFtyZXNwb25kaW5nIHRvIGF0dHJpYnV0ZSBjaGFuZ2VzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViX2NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3Jlc3BvbmRpbmdfdG9fYXR0cmlidXRlX2NoYW5nZXMpXG4gICAgICogb24gTUROIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC5cbiAgICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBfb2xkLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIF9fcHJvcGVydHlUb0F0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBlbGVtUHJvcGVydGllcyA9IHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBlbGVtUHJvcGVydGllcy5nZXQobmFtZSk7XG4gICAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMucmVmbGVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gb3B0aW9ucy5jb252ZXJ0ZXI/LnRvQXR0cmlidXRlICE9PVxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5jb252ZXJ0ZXJcbiAgICAgICAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBjb252ZXJ0ZXIudG9BdHRyaWJ1dGUodmFsdWUsIG9wdGlvbnMudHlwZSk7XG4gICAgICAgICAgICBpZiAoREVWX01PREUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmVuYWJsZWRXYXJuaW5ncy5pbmNsdWRlcygnbWlncmF0aW9uJykgJiZcbiAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygndW5kZWZpbmVkLWF0dHJpYnV0ZS12YWx1ZScsIGBUaGUgYXR0cmlidXRlIHZhbHVlIGZvciB0aGUgJHtuYW1lfSBwcm9wZXJ0eSBpcyBgICtcbiAgICAgICAgICAgICAgICAgICAgYHVuZGVmaW5lZCBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9LiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYCArXG4gICAgICAgICAgICAgICAgICAgIGByZW1vdmVkLCBidXQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgXFxgUmVhY3RpdmVFbGVtZW50XFxgLCBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBhdHRyaWJ1dGUgd291bGQgbm90IGhhdmUgY2hhbmdlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyYWNrIGlmIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyByZWZsZWN0ZWQgdG8gYXZvaWRcbiAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIHByb3BlcnR5IGFnYWluIHZpYSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC4gTm90ZTpcbiAgICAgICAgICAgIC8vIDEuIHRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGNhbGxiYWNrIGlzIHN5bmNocm9ub3VzLlxuICAgICAgICAgICAgLy8gMi4gd2lsbCBiZWhhdmUgaW5jb3JyZWN0bHkgaWYgbXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgaW4gdGhlIHJlYWN0aW9uXG4gICAgICAgICAgICAvLyBzdGFjayBhdCB0aW1lIG9mIGNhbGxpbmcuIEhvd2V2ZXIsIHNpbmNlIHdlIHByb2Nlc3MgYXR0cmlidXRlc1xuICAgICAgICAgICAgLy8gaW4gYHVwZGF0ZWAgdGhpcyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIChvciBhbiBleHRyZW1lIGNvcm5lciBjYXNlXG4gICAgICAgICAgICAvLyB0aGF0IHdlJ2QgbGlrZSB0byBkaXNjb3ZlcikuXG4gICAgICAgICAgICAvLyBtYXJrIHN0YXRlIHJlZmxlY3RpbmdcbiAgICAgICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbWFyayBzdGF0ZSBub3QgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgLy8gTm90ZSwgaGludCB0aGlzIGFzIGFuIGBBdHRyaWJ1dGVNYXBgIHNvIGNsb3N1cmUgY2xlYXJseSB1bmRlcnN0YW5kc1xuICAgICAgICAvLyB0aGUgdHlwZTsgaXQgaGFzIGlzc3VlcyB3aXRoIHRyYWNraW5nIHR5cGVzIHRocm91Z2ggc3RhdGljc1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IGN0b3IuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLmdldChuYW1lKTtcbiAgICAgICAgLy8gVXNlIHRyYWNraW5nIGluZm8gdG8gYXZvaWQgcmVmbGVjdGluZyBhIHByb3BlcnR5IHZhbHVlIHRvIGFuIGF0dHJpYnV0ZVxuICAgICAgICAvLyBpZiBpdCB3YXMganVzdCBzZXQgYmVjYXVzZSB0aGUgYXR0cmlidXRlIGNoYW5nZWQuXG4gICAgICAgIGlmIChwcm9wTmFtZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IHByb3BOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gY3Rvci5nZXRQcm9wZXJ0eU9wdGlvbnMocHJvcE5hbWUpO1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gdHlwZW9mIG9wdGlvbnMuY29udmVydGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyB7IGZyb21BdHRyaWJ1dGU6IG9wdGlvbnMuY29udmVydGVyIH1cbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuY29udmVydGVyPy5mcm9tQXR0cmlidXRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLmNvbnZlcnRlclxuICAgICAgICAgICAgICAgICAgICA6IGRlZmF1bHRDb252ZXJ0ZXI7XG4gICAgICAgICAgICAvLyBtYXJrIHN0YXRlIHJlZmxlY3RpbmdcbiAgICAgICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBwcm9wTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydGVyLmZyb21BdHRyaWJ1dGUodmFsdWUsIG9wdGlvbnMudHlwZSk7XG4gICAgICAgICAgICB0aGlzW3Byb3BOYW1lXSA9XG4gICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUgPz9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2RlZmF1bHRWYWx1ZXM/LmdldChwcm9wTmFtZSkgPz9cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWU7XG4gICAgICAgICAgICAvLyBtYXJrIHN0YXRlIG5vdCByZWZsZWN0aW5nXG4gICAgICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0cyBhbiB1cGRhdGUgd2hpY2ggaXMgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LiBUaGlzIHNob3VsZCBiZSBjYWxsZWRcbiAgICAgKiB3aGVuIGFuIGVsZW1lbnQgc2hvdWxkIHVwZGF0ZSBiYXNlZCBvbiBzb21lIHN0YXRlIG5vdCB0cmlnZ2VyZWQgYnkgc2V0dGluZ1xuICAgICAqIGEgcmVhY3RpdmUgcHJvcGVydHkuIEluIHRoaXMgY2FzZSwgcGFzcyBubyBhcmd1bWVudHMuIEl0IHNob3VsZCBhbHNvIGJlXG4gICAgICogY2FsbGVkIHdoZW4gbWFudWFsbHkgaW1wbGVtZW50aW5nIGEgcHJvcGVydHkgc2V0dGVyLiBJbiB0aGlzIGNhc2UsIHBhc3MgdGhlXG4gICAgICogcHJvcGVydHkgYG5hbWVgIGFuZCBgb2xkVmFsdWVgIHRvIGVuc3VyZSB0aGF0IGFueSBjb25maWd1cmVkIHByb3BlcnR5XG4gICAgICogb3B0aW9ucyBhcmUgaG9ub3JlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgcmVxdWVzdGluZyBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSBvbGRWYWx1ZSBvbGQgdmFsdWUgb2YgcmVxdWVzdGluZyBwcm9wZXJ0eVxuICAgICAqIEBwYXJhbSBvcHRpb25zIHByb3BlcnR5IG9wdGlvbnMgdG8gdXNlIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzbHlcbiAgICAgKiAgICAgY29uZmlndXJlZCBvcHRpb25zXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICByZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBwcm9wZXJ0eSBrZXksIHBlcmZvcm0gcHJvcGVydHkgdXBkYXRlIHN0ZXBzLlxuICAgICAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoREVWX01PREUgJiYgbmFtZSBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKGBgLCBgVGhlIHJlcXVlc3RVcGRhdGUoKSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGFuIEV2ZW50IGFzIHRoZSBwcm9wZXJ0eSBuYW1lLiBUaGlzIGlzIHByb2JhYmx5IGEgbWlzdGFrZSBjYXVzZWQgYnkgYmluZGluZyB0aGlzLnJlcXVlc3RVcGRhdGUgYXMgYW4gZXZlbnQgbGlzdGVuZXIuIEluc3RlYWQgYmluZCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGl0IHdpdGggbm8gYXJndW1lbnRzOiAoKSA9PiB0aGlzLnJlcXVlc3RVcGRhdGUoKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXNbbmFtZV07XG4gICAgICAgICAgICBvcHRpb25zID8/PSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAob3B0aW9ucy5oYXNDaGFuZ2VkID8/IG5vdEVxdWFsKShuZXdWYWx1ZSwgb2xkVmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBjaGFuZ2UsIGNoZWNrIGEgY29ybmVyIGNhc2UgdGhhdCBjYW4gb2NjdXIgd2hlblxuICAgICAgICAgICAgICAgIC8vIDEuIHRoZXJlJ3MgYSBpbml0aWFsIHZhbHVlIHdoaWNoIHdhcyBub3QgcmVmbGVjdGVkXG4gICAgICAgICAgICAgICAgLy8gMi4gdGhlIHByb3BlcnR5IGlzIHN1YnNlcXVlbnRseSBzZXQgdG8gdGhpcyB2YWx1ZS5cbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYHByb3A6IHt1c2VEZWZhdWx0OiB0cnVlLCByZWZsZWN0OiB0cnVlfWBcbiAgICAgICAgICAgICAgICAvLyBhbmQgZWwucHJvcCA9ICdmb28nLiBUaGlzIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBpcyBub3Qgc2V0IGJlY2F1c2Ugd2Ugd2lsbCBub3cgcmVmbGVjdCB0aGUgcHJvcGVydHkgdG8gdGhlIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgICAgICAob3B0aW9ucy51c2VEZWZhdWx0ICYmXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmbGVjdCAmJlxuICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9PT0gdGhpcy5fX2RlZmF1bHRWYWx1ZXM/LmdldChuYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5oYXNBdHRyaWJ1dGUoY3Rvci5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSkpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIHJlcXVlc3QgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBjaGFuZ2VkLlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1VwZGF0ZVBlbmRpbmcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IHRoaXMuX19lbnF1ZXVlVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgXyRjaGFuZ2VQcm9wZXJ0eShuYW1lLCBvbGRWYWx1ZSwgeyB1c2VEZWZhdWx0LCByZWZsZWN0LCB3cmFwcGVkIH0sIGluaXRpYWxpemVWYWx1ZSkge1xuICAgICAgICAvLyBSZWNvcmQgZGVmYXVsdCB2YWx1ZSB3aGVuIHVzZURlZmF1bHQgaXMgdXNlZC4gVGhpcyBhbGxvd3MgdXMgdG9cbiAgICAgICAgLy8gcmVzdG9yZSB0aGlzIHZhbHVlIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkLlxuICAgICAgICBpZiAodXNlRGVmYXVsdCAmJiAhKHRoaXMuX19kZWZhdWx0VmFsdWVzID8/PSBuZXcgTWFwKCkpLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fX2RlZmF1bHRWYWx1ZXMuc2V0KG5hbWUsIGluaXRpYWxpemVWYWx1ZSA/PyBvbGRWYWx1ZSA/PyB0aGlzW25hbWVdKTtcbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IHdyYXBwaW5nIGFuIGFjY2Vzc29yLCBpdCBtdXN0IGJlIGFuIGluaXRpYWwgc2V0dGluZ1xuICAgICAgICAgICAgLy8gYW5kIGluIHRoaXMgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byByZWNvcmQgdGhlIGNoYW5nZSBvciByZWZsZWN0LlxuICAgICAgICAgICAgaWYgKHdyYXBwZWQgIT09IHRydWUgfHwgaW5pdGlhbGl6ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IENyZWF0ZSBhIGJlbmNobWFyayBvZiBNYXAuaGFzKCkgKyBNYXAuc2V0KFxuICAgICAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgICAgICBpZiAoIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIC8vIE9uIHRoZSBpbml0aWFsIGNoYW5nZSwgdGhlIG9sZCB2YWx1ZSBzaG91bGQgYmUgYHVuZGVmaW5lZGAsIGV4Y2VwdFxuICAgICAgICAgICAgLy8gd2l0aCBgdXNlRGVmYXVsdGBcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkICYmICF1c2VEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuc2V0KG5hbWUsIG9sZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgdG8gcmVmbGVjdGluZyBwcm9wZXJ0aWVzIHNldC5cbiAgICAgICAgLy8gTm90ZSwgaXQncyBpbXBvcnRhbnQgdGhhdCBldmVyeSBjaGFuZ2UgaGFzIGEgY2hhbmNlIHRvIGFkZCB0aGVcbiAgICAgICAgLy8gcHJvcGVydHkgdG8gYF9fcmVmbGVjdGluZ1Byb3BlcnRpZXNgLiBUaGlzIGVuc3VyZXMgc2V0dGluZ1xuICAgICAgICAvLyBhdHRyaWJ1dGUgKyBwcm9wZXJ0eSByZWZsZWN0cyBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChyZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQoKSkuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIGVsZW1lbnQgdG8gYXN5bmNocm9ub3VzbHkgdXBkYXRlLlxuICAgICAqL1xuICAgIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyB1cGRhdGUgaGFzIHJlc29sdmVkIGJlZm9yZSB1cGRhdGluZy5cbiAgICAgICAgICAgIC8vIFRoaXMgYGF3YWl0YCBhbHNvIGVuc3VyZXMgdGhhdCBwcm9wZXJ0eSBjaGFuZ2VzIGFyZSBiYXRjaGVkLlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fX3VwZGF0ZVByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAgICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgICAgICAvLyBlbmFibGUgY29vcmRpbmF0aW5nIHVwZGF0ZXMgd2l0aCBhIHNjaGVkdWxlci4gTm90ZSwgdGhlIHJlc3VsdCBpc1xuICAgICAgICAvLyBjaGVja2VkIHRvIGF2b2lkIGRlbGF5aW5nIGFuIGFkZGl0aW9uYWwgbWljcm90YXNrIHVubGVzcyB3ZSBuZWVkIHRvLlxuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXRoaXMuaXNVcGRhdGVQZW5kaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgICAqIHRpbWluZyBvZiB1cGRhdGVzIGJ5IHJldHVybmluZyBhIFByb21pc2UuIFRoZSB1cGRhdGUgd2lsbCBhd2FpdCB0aGVcbiAgICAgKiByZXR1cm5lZCBQcm9taXNlLCBhbmQgeW91IHNob3VsZCByZXNvbHZlIHRoZSBQcm9taXNlIHRvIGFsbG93IHRoZSB1cGRhdGVcbiAgICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICAgKiBtdXN0IGJlIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAqICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICAgKiAgIHN1cGVyLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgc2NoZWR1bGVVcGRhdGUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgICBpZiAoREVWX01PREUgJiZcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKCdhc3luYy1wZXJmb3JtLXVwZGF0ZScpICYmXG4gICAgICAgICAgICB0eXBlb2YgcmVzdWx0Py50aGVuID09PVxuICAgICAgICAgICAgICAgICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlzc3VlV2FybmluZygnYXN5bmMtcGVyZm9ybS11cGRhdGUnLCBgRWxlbWVudCAke3RoaXMubG9jYWxOYW1lfSByZXR1cm5lZCBhIFByb21pc2UgZnJvbSBwZXJmb3JtVXBkYXRlKCkuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBgICtcbiAgICAgICAgICAgICAgICBgdmVyc2lvbiBvZiBSZWFjdGl2ZUVsZW1lbnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgICAqIHVwZGF0ZSwgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCB3aWxsIG5vdCBiZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICAgKiBnZW5lcmFsbHkgbm90IGJlIG5lZWRlZCwgYnV0IGl0IGNhbiBiZSBkb25lIGluIHJhcmUgY2FzZXMgd2hlbiB5b3UgbmVlZCB0b1xuICAgICAqIHVwZGF0ZSBzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBwZXJmb3JtVXBkYXRlKCkge1xuICAgICAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYHBlcmZvcm1VcGRhdGVgIGlzIGNhbGxlZCBlYXJseSB0byBcImZsdXNoXCJcbiAgICAgICAgLy8gdGhlIHVwZGF0ZS5cbiAgICAgICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYnVnTG9nRXZlbnQ/Lih7IGtpbmQ6ICd1cGRhdGUnIH0pO1xuICAgICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGZpcnN0IHVwZGF0ZS4gVGhpcyBvY2N1cnMgaW4gYGNvbm5lY3RlZENhbGxiYWNrYFxuICAgICAgICAgICAgLy8gYnV0IGlzIGRvbmUgaGVyZSB0byBzdXBwb3J0IG91dCBvZiB0cmVlIGNhbGxzIHRvIGBlbmFibGVVcGRhdGluZ2AvYHBlcmZvcm1VcGRhdGVgLlxuICAgICAgICAgICAgdGhpcy5yZW5kZXJSb290ID8/PVxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvZHVjZSB3YXJuaW5nIGlmIGFueSByZWFjdGl2ZSBwcm9wZXJ0aWVzIG9uIHRoZSBwcm90b3R5cGUgYXJlXG4gICAgICAgICAgICAgICAgLy8gc2hhZG93ZWQgYnkgY2xhc3MgZmllbGRzLiBJbnN0YW5jZSBmaWVsZHMgc2V0IGJlZm9yZSB1cGdyYWRlIGFyZVxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAgICAgY29uc3QgY3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhZG93ZWRQcm9wZXJ0aWVzID0gWy4uLmN0b3IuZWxlbWVudFByb3BlcnRpZXMua2V5cygpXS5maWx0ZXIoKHApID0+IHRoaXMuaGFzT3duUHJvcGVydHkocCkgJiYgcCBpbiBnZXRQcm90b3R5cGVPZih0aGlzKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNoYWRvd2VkUHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb24gZWxlbWVudCAke3RoaXMubG9jYWxOYW1lfSB3aWxsIG5vdCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGB0cmlnZ2VyIHVwZGF0ZXMgYXMgZXhwZWN0ZWQgYmVjYXVzZSB0aGV5IGFyZSBzZXQgdXNpbmcgY2xhc3MgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgTmF0aXZlIGNsYXNzIGZpZWxkcyBhbmQgc29tZSBjb21waWxlZCBvdXRwdXQgd2lsbCBvdmVyd3JpdGUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgYWNjZXNzb3JzIHVzZWQgZm9yIGRldGVjdGluZyBjaGFuZ2VzLiBTZWUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgZm9yIG1vcmUgaW5mb3JtYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogc2hvdWxkIHdlIHVzZSB0aGUgc3RvcmVkIHZhbHVlPyBDb3VsZCBhIG5ldyB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBzZXQgc2luY2Ugd2Ugc3RvcmVkIHRoZSBvd24gcHJvcGVydHkgdmFsdWU/XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9faW5zdGFuY2VQcm9wZXJ0aWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJpZ2dlciBpbml0aWFsIHZhbHVlIHJlZmxlY3Rpb24gYW5kIHBvcHVsYXRlIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBgY2hhbmdlZFByb3BlcnRpZXNgIG1hcCwgYnV0IG9ubHkgZm9yIHRoZSBjYXNlIG9mIHByb3BlcnRpZXMgY3JlYXRlZFxuICAgICAgICAgICAgLy8gdmlhIGBjcmVhdGVQcm9wZXJ0eWAgb24gYWNjZXNzb3JzLCB3aGljaCB3aWxsIG5vdCBoYXZlIGFscmVhZHlcbiAgICAgICAgICAgIC8vIHBvcHVsYXRlZCB0aGUgYGNoYW5nZWRQcm9wZXJ0aWVzYCBtYXAgc2luY2UgdGhleSBhcmUgbm90IHNldC5cbiAgICAgICAgICAgIC8vIFdlIGNhbid0IGtub3cgaWYgdGhlc2UgYWNjZXNzb3JzIGhhZCBpbml0aWFsaXplcnMsIHNvIHdlIGp1c3Qgc2V0XG4gICAgICAgICAgICAvLyB0aGVtIGFueXdheSAtIGEgZGlmZmVyZW5jZSBmcm9tIGV4cGVyaW1lbnRhbCBkZWNvcmF0b3JzIG9uIGZpZWxkcyBhbmRcbiAgICAgICAgICAgIC8vIHN0YW5kYXJkIGRlY29yYXRvcnMgb24gYXV0by1hY2Nlc3NvcnMuXG4gICAgICAgICAgICAvLyBGb3IgY29udGV4dCBzZWU6XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9wdWxsLzQxODMjaXNzdWVjb21tZW50LTE3MTE5NTk2MzVcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgICAgIC5lbGVtZW50UHJvcGVydGllcztcbiAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIGVsZW1lbnRQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd3JhcHBlZCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW3BdO1xuICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5oYXMocCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VQcm9wZXJ0eShwLCB1bmRlZmluZWQsIG9wdGlvbnMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRQcm9wZXJ0aWVzID0gdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gdGhpcy5zaG91bGRVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMud2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3RVcGRhdGU/LigpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gUHJldmVudCBgZmlyc3RVcGRhdGVkYCBhbmQgYHVwZGF0ZWRgIGZyb20gcnVubmluZyB3aGVuIHRoZXJlJ3MgYW5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBleGNlcHRpb24uXG4gICAgICAgICAgICBzaG91bGRVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBlbGVtZW50IGNhbiBhY2NlcHQgYWRkaXRpb25hbCB1cGRhdGVzIGFmdGVyIGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgdXBkYXRlIGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIHBlbmRpbmcgYW5kIGZ1cnRoZXIgdXBkYXRlcyBhcmUgbm93IGFsbG93ZWQuXG4gICAgICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuXyRkaWRVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgYmVmb3JlIGB1cGRhdGUoKWAgdG8gY29tcHV0ZSB2YWx1ZXMgbmVlZGVkIGR1cmluZyB0aGUgdXBkYXRlLlxuICAgICAqXG4gICAgICogSW1wbGVtZW50IGB3aWxsVXBkYXRlYCB0byBjb21wdXRlIHByb3BlcnR5IHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBvdGhlclxuICAgICAqIHByb3BlcnRpZXMgYW5kIGFyZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSB1cGRhdGUgcHJvY2Vzcy5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAqICAgLy8gb25seSBuZWVkIHRvIGNoZWNrIGNoYW5nZWQgcHJvcGVydGllcyBmb3IgYW4gZXhwZW5zaXZlIGNvbXB1dGF0aW9uLlxuICAgICAqICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnZmlyc3ROYW1lJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdsYXN0TmFtZScpKSB7XG4gICAgICogICAgIHRoaXMuc2hhID0gY29tcHV0ZVNIQShgJHt0aGlzLmZpcnN0TmFtZX0gJHt0aGlzLmxhc3ROYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHJlbmRlcigpIHtcbiAgICAgKiAgIHJldHVybiBodG1sYFNIQTogJHt0aGlzLnNoYX1gO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgd2lsbFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXMpIHsgfVxuICAgIC8vIE5vdGUsIHRoaXMgaXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBvbHlmaWxsLXN1cHBvcnQuXG4gICAgLy8gQGludGVybmFsXG4gICAgXyRkaWRVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3RVcGRhdGVkPy4oKSk7XG4gICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhhc1VwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJlxuICAgICAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgJiZcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKCdjaGFuZ2UtaW4tdXBkYXRlJykpIHtcbiAgICAgICAgICAgIGlzc3VlV2FybmluZygnY2hhbmdlLWluLXVwZGF0ZScsIGBFbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHNjaGVkdWxlZCBhbiB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgYChnZW5lcmFsbHkgYmVjYXVzZSBhIHByb3BlcnR5IHdhcyBzZXQpIGAgK1xuICAgICAgICAgICAgICAgIGBhZnRlciBhbiB1cGRhdGUgY29tcGxldGVkLCBjYXVzaW5nIGEgbmV3IHVwZGF0ZSB0byBiZSBzY2hlZHVsZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGluZWZmaWNpZW50IGFuZCBzaG91bGQgYmUgYXZvaWRlZCB1bmxlc3MgdGhlIG5leHQgdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgIGBjYW4gb25seSBiZSBzY2hlZHVsZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgcHJldmlvdXMgdXBkYXRlLmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9fbWFya1VwZGF0ZWQoKSB7XG4gICAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IGhhcyBjb21wbGV0ZWQgdXBkYXRpbmcuXG4gICAgICogVGhlIFByb21pc2UgdmFsdWUgaXMgYSBib29sZWFuIHRoYXQgaXMgYHRydWVgIGlmIHRoZSBlbGVtZW50IGNvbXBsZXRlZCB0aGVcbiAgICAgKiB1cGRhdGUgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLiBUaGUgUHJvbWlzZSByZXN1bHQgaXMgYGZhbHNlYCBpZlxuICAgICAqIGEgcHJvcGVydHkgd2FzIHNldCBpbnNpZGUgYHVwZGF0ZWQoKWAuIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBhblxuICAgICAqIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGR1cmluZyB0aGUgdXBkYXRlLlxuICAgICAqXG4gICAgICogVG8gYXdhaXQgYWRkaXRpb25hbCBhc3luY2hyb25vdXMgd29yaywgb3ZlcnJpZGUgdGhlIGBnZXRVcGRhdGVDb21wbGV0ZWBcbiAgICAgKiBtZXRob2QuIEZvciBleGFtcGxlLCBpdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGF3YWl0IGEgcmVuZGVyZWQgZWxlbWVudFxuICAgICAqIGJlZm9yZSBmdWxmaWxsaW5nIHRoaXMgUHJvbWlzZS4gVG8gZG8gdGhpcywgZmlyc3QgYXdhaXRcbiAgICAgKiBgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKWAsIHRoZW4gYW55IHN1YnNlcXVlbnQgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcHJvbWlzZSBvZiBhIGJvb2xlYW4gdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB1cGRhdGUgY29tcGxldGVkXG4gICAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIGdldCB1cGRhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIHRoZSBgdXBkYXRlQ29tcGxldGVgIHByb21pc2UuXG4gICAgICpcbiAgICAgKiBJdCBpcyBub3Qgc2FmZSB0byBvdmVycmlkZSB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBnZXR0ZXIgZGlyZWN0bHkgZHVlIHRvIGFcbiAgICAgKiBsaW1pdGF0aW9uIGluIFR5cGVTY3JpcHQgd2hpY2ggbWVhbnMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbGwgYVxuICAgICAqIHN1cGVyY2xhc3MgZ2V0dGVyIChlLmcuIGBzdXBlci51cGRhdGVDb21wbGV0ZS50aGVuKC4uLilgKSB3aGVuIHRoZSB0YXJnZXRcbiAgICAgKiBsYW5ndWFnZSBpcyBFUzUgKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzM4KS5cbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbnN0ZWFkLiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAgICogICBvdmVycmlkZSBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICAgKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICAgKiAgICAgYXdhaXQgdGhpcy5fbXlDaGlsZC51cGRhdGVDb21wbGV0ZTtcbiAgICAgKiAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIEEgcHJvbWlzZSBvZiBhIGJvb2xlYW4gdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB1cGRhdGUgY29tcGxldGVkXG4gICAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZVByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IGB1cGRhdGUoKWAgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IHJlcXVlc3RzXG4gICAgICogYW4gdXBkYXRlLiBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAsIGJ1dCB0aGlzIGNhbiBiZVxuICAgICAqIGN1c3RvbWl6ZWQgdG8gY29udHJvbCB3aGVuIHRvIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHNob3VsZFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzLlxuICAgICAqIEl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHJlbmRlciBhbmQga2VlcCB1cGRhdGVkIGVsZW1lbnQgRE9NLlxuICAgICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCAqbm90KiB0cmlnZ2VyXG4gICAgICogYW5vdGhlciB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB1cGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIFRoZSBmb3JFYWNoKCkgZXhwcmVzc2lvbiB3aWxsIG9ubHkgcnVuIHdoZW4gX19yZWZsZWN0aW5nUHJvcGVydGllcyBpc1xuICAgICAgICAvLyBkZWZpbmVkLCBhbmQgaXQgcmV0dXJucyB1bmRlZmluZWQsIHNldHRpbmcgX19yZWZsZWN0aW5nUHJvcGVydGllcyB0b1xuICAgICAgICAvLyB1bmRlZmluZWRcbiAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzICYmPSB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMuZm9yRWFjaCgocCkgPT4gdGhpcy5fX3Byb3BlcnR5VG9BdHRyaWJ1dGUocCwgdGhpc1twXSkpO1xuICAgICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuZXZlciB0aGUgZWxlbWVudCBpcyB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybVxuICAgICAqIHBvc3QtdXBkYXRpbmcgdGFza3MgdmlhIERPTSBBUElzLCBmb3IgZXhhbXBsZSwgZm9jdXNpbmcgYW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7IH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGVsZW1lbnQgaXMgZmlyc3QgdXBkYXRlZC4gSW1wbGVtZW50IHRvIHBlcmZvcm0gb25lIHRpbWVcbiAgICAgKiB3b3JrIG9uIHRoZSBlbGVtZW50IGFmdGVyIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZmlyc3RVcGRhdGVkKCkge1xuICAgICAqICAgdGhpcy5yZW5kZXJSb290LmdldEVsZW1lbnRCeUlkKCdteS10ZXh0LWFyZWEnKS5mb2N1cygpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCB0cmlnZ2VyIHRoZSBlbGVtZW50IHRvIHVwZGF0ZVxuICAgICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsgfVxufVxuLyoqXG4gKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHN0eWxlcy5cbiAqIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICogQG5vY29sbGFwc2VcbiAqIEBjYXRlZ29yeSBzdHlsZXNcbiAqL1xuUmVhY3RpdmVFbGVtZW50LmVsZW1lbnRTdHlsZXMgPSBbXTtcbi8qKlxuICogT3B0aW9ucyB1c2VkIHdoZW4gY2FsbGluZyBgYXR0YWNoU2hhZG93YC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gY3VzdG9taXplXG4gKiB0aGUgb3B0aW9ucyBmb3IgdGhlIHNoYWRvd1Jvb3Q7IGZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBjbG9zZWRcbiAqIHNoYWRvd1Jvb3Q6IGB7bW9kZTogJ2Nsb3NlZCd9YC5cbiAqXG4gKiBOb3RlLCB0aGVzZSBvcHRpb25zIGFyZSB1c2VkIGluIGBjcmVhdGVSZW5kZXJSb290YC4gSWYgdGhpcyBtZXRob2RcbiAqIGlzIGN1c3RvbWl6ZWQsIG9wdGlvbnMgc2hvdWxkIGJlIHJlc3BlY3RlZCBpZiBwb3NzaWJsZS5cbiAqIEBub2NvbGxhcHNlXG4gKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gKi9cblJlYWN0aXZlRWxlbWVudC5zaGFkb3dSb290T3B0aW9ucyA9IHsgbW9kZTogJ29wZW4nIH07XG4vLyBBc3NpZ25lZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEganNjb21waWxlciBidWcgd2l0aCBzdGF0aWMgZmllbGRzXG4vLyB3aGVuIGNvbXBpbGluZyB0byBFUzUuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzMxNzdcblJlYWN0aXZlRWxlbWVudFtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIFJlYWN0aXZlRWxlbWVudCldID0gbmV3IE1hcCgpO1xuUmVhY3RpdmVFbGVtZW50W0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIFJlYWN0aXZlRWxlbWVudCldID0gbmV3IE1hcCgpO1xuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxucG9seWZpbGxTdXBwb3J0Py4oeyBSZWFjdGl2ZUVsZW1lbnQgfSk7XG4vLyBEZXYgbW9kZSB3YXJuaW5ncy4uLlxuaWYgKERFVl9NT0RFKSB7XG4gICAgLy8gRGVmYXVsdCB3YXJuaW5nIHNldC5cbiAgICBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlZFdhcm5pbmdzID0gW1xuICAgICAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZScsXG4gICAgXTtcbiAgICBjb25zdCBlbnN1cmVPd25XYXJuaW5ncyA9IGZ1bmN0aW9uIChjdG9yKSB7XG4gICAgICAgIGlmICghY3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbmFibGVkV2FybmluZ3MnLCBjdG9yKSkpIHtcbiAgICAgICAgICAgIGN0b3IuZW5hYmxlZFdhcm5pbmdzID0gY3Rvci5lbmFibGVkV2FybmluZ3Muc2xpY2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmcgPSBmdW5jdGlvbiAod2FybmluZykge1xuICAgICAgICBlbnN1cmVPd25XYXJuaW5ncyh0aGlzKTtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWRXYXJuaW5ncy5pbmNsdWRlcyh3YXJuaW5nKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVkV2FybmluZ3MucHVzaCh3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3RpdmVFbGVtZW50LmRpc2FibGVXYXJuaW5nID0gZnVuY3Rpb24gKHdhcm5pbmcpIHtcbiAgICAgICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmVuYWJsZWRXYXJuaW5ncy5pbmRleE9mKHdhcm5pbmcpO1xuICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRXYXJuaW5ncy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBSZWFjdGl2ZUVsZW1lbnQgdXNhZ2UuXG4oZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnMi4xLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdtdWx0aXBsZS12ZXJzaW9ucycsIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGAgK1xuICAgICAgICAgICAgYGlzIG5vdCByZWNvbW1lbmRlZC5gKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlYWN0aXZlLWVsZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG4vKipcbiAqIFRoZSBtYWluIExpdEVsZW1lbnQgbW9kdWxlLCB3aGljaCBkZWZpbmVzIHRoZSB7QGxpbmtjb2RlIExpdEVsZW1lbnR9IGJhc2VcbiAqIGNsYXNzIGFuZCByZWxhdGVkIEFQSXMuXG4gKlxuICogTGl0RWxlbWVudCBjb21wb25lbnRzIGNhbiBkZWZpbmUgYSB0ZW1wbGF0ZSBhbmQgYSBzZXQgb2Ygb2JzZXJ2ZWRcbiAqIHByb3BlcnRpZXMuIENoYW5naW5nIGFuIG9ic2VydmVkIHByb3BlcnR5IHRyaWdnZXJzIGEgcmUtcmVuZGVyIG9mIHRoZVxuICogZWxlbWVudC5cbiAqXG4gKiBJbXBvcnQge0BsaW5rY29kZSBMaXRFbGVtZW50fSBhbmQge0BsaW5rY29kZSBodG1sfSBmcm9tIHRoaXMgbW9kdWxlIHRvXG4gKiBjcmVhdGUgYSBjb21wb25lbnQ6XG4gKlxuICogIGBgYGpzXG4gKiBpbXBvcnQge0xpdEVsZW1lbnQsIGh0bWx9IGZyb20gJ2xpdC1lbGVtZW50JztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqXG4gKiAgIC8vIERlY2xhcmUgb2JzZXJ2ZWQgcHJvcGVydGllc1xuICogICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIGFkamVjdGl2ZToge31cbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHRoaXMuYWRqZWN0aXZlID0gJ2F3ZXNvbWUnO1xuICogICB9XG4gKlxuICogICAvLyBEZWZpbmUgdGhlIGVsZW1lbnQncyB0ZW1wbGF0ZVxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgPHA+eW91ciAke2FkamVjdGl2ZX0gdGVtcGxhdGUgaGVyZTwvcD5gO1xuICogICB9XG4gKiB9XG4gKlxuICogY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdteS1lbGVtZW50JywgTXlFbGVtZW50KTtcbiAqIGBgYFxuICpcbiAqIGBMaXRFbGVtZW50YCBleHRlbmRzIHtAbGlua2NvZGUgUmVhY3RpdmVFbGVtZW50fSBhbmQgYWRkcyBsaXQtaHRtbFxuICogdGVtcGxhdGluZy4gVGhlIGBSZWFjdGl2ZUVsZW1lbnRgIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB1c2VycyB0aGF0IHdhbnQgdG9cbiAqIGJ1aWxkIHRoZWlyIG93biBjdXN0b20gZWxlbWVudCBiYXNlIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UgbGl0LWh0bWwuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cbmltcG9ydCB7IFJlYWN0aXZlRWxlbWVudCB9IGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5pbXBvcnQgeyByZW5kZXIsIG5vQ2hhbmdlIH0gZnJvbSAnbGl0LWh0bWwnO1xuZXhwb3J0ICogZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcbmV4cG9ydCAqIGZyb20gJ2xpdC1odG1sJztcbi8qXG4gKiBXaGVuIHVzaW5nIENsb3N1cmUgQ29tcGlsZXIsIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkocHJvcGVydHksIG9iamVjdCkgaXNcbiAqIHJlcGxhY2VkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgbXVuZ2VkIG5hbWUgZm9yIG9iamVjdFtwcm9wZXJ0eV0uIFdlIGNhbm5vdFxuICogYWxpYXMgdGhpcyBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0byB1c2UgYSBzbWFsbCBzaGltIHRoYXQgaGFzIHRoZSBzYW1lXG4gKiBiZWhhdmlvciB3aGVuIG5vdCBjb21waWxpbmcuXG4gKi9cbi8qQF9fSU5MSU5FX18qL1xuY29uc3QgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSA9IChwcm9wLCBfb2JqKSA9PiBwcm9wO1xuY29uc3QgREVWX01PREUgPSB0cnVlO1xuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xubGV0IGlzc3VlV2FybmluZztcbmlmIChERVZfTU9ERSkge1xuICAgIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gICAgLy8gYXJlIGxvYWRlZC5cbiAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICAgKi9cbiAgICBpc3N1ZVdhcm5pbmcgPSAoY29kZSwgd2FybmluZykgPT4ge1xuICAgICAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgICAgICBpZiAoIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykgJiZcbiAgICAgICAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKGNvZGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbmRlck9wdGlvbnMgPSB7IGhvc3Q6IHRoaXMgfTtcbiAgICAgICAgdGhpcy5fX2NoaWxkUGFydCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgICAqL1xuICAgIGNyZWF0ZVJlbmRlclJvb3QoKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgICAgIC8vIFdoZW4gYWRvcHRlZFN0eWxlU2hlZXRzIGFyZSBzaGltbWVkLCB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICAvLyBzaGFkb3dSb290IGJ5IGNyZWF0ZVJlbmRlclJvb3QuIEFkanVzdCB0aGUgcmVuZGVyQmVmb3JlIG5vZGUgc28gdGhhdFxuICAgICAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgICAgIC8vIGltcG9ydGFudCBzbyB0aGF0IGFkb3B0ZWRTdHlsZVNoZWV0cyBoYXZlIHByZWNlZGVuY2Ugb3ZlciBzdHlsZXMgaW5cbiAgICAgICAgLy8gdGhlIHNoYWRvd1Jvb3QuXG4gICAgICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QuZmlyc3RDaGlsZDtcbiAgICAgICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAgICogYW5kIGNhbGxzIGByZW5kZXJgIHRvIHJlbmRlciBET00gdmlhIGxpdC1odG1sLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlXG4gICAgICogdGhpcyBtZXRob2Qgd2lsbCAqbm90KiB0cmlnZ2VyIGFub3RoZXIgdXBkYXRlLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgdXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgIC8vIFNldHRpbmcgcHJvcGVydGllcyBpbiBgcmVuZGVyYCBzaG91bGQgbm90IHRyaWdnZXIgYW4gdXBkYXRlLiBTaW5jZVxuICAgICAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgICAgICAvLyBiZWZvcmUgdGhhdC5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbmRlcigpO1xuICAgICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFkZGVkIHRvIHRoZSBkb2N1bWVudCdzIERPTS5cbiAgICAgKlxuICAgICAqIEluIGBjb25uZWN0ZWRDYWxsYmFjaygpYCB5b3Ugc2hvdWxkIHNldHVwIHRhc2tzIHRoYXQgc2hvdWxkIG9ubHkgb2NjdXIgd2hlblxuICAgICAqIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgZG9jdW1lbnQuIFRoZSBtb3N0IGNvbW1vbiBvZiB0aGVzZSBpc1xuICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAgICogZXZlbnQgaGFuZGxlciBhZGRlZCB0byB0aGUgd2luZG93LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgKiAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVHlwaWNhbGx5LCBhbnl0aGluZyBkb25lIGluIGBjb25uZWN0ZWRDYWxsYmFjaygpYCBzaG91bGQgYmUgdW5kb25lIHdoZW4gdGhlXG4gICAgICogZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQsIGluIGBkaXNjb25uZWN0ZWRDYWxsYmFjaygpYC5cbiAgICAgKlxuICAgICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgICAqXG4gICAgICogVGhpcyBjYWxsYmFjayBpcyB0aGUgbWFpbiBzaWduYWwgdG8gdGhlIGVsZW1lbnQgdGhhdCBpdCBtYXkgbm8gbG9uZ2VyIGJlXG4gICAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgICAqIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCAoc3VjaCBhcyBldmVudCBsaXN0ZW5lcnMgYWRkZWQgdG8gbm9kZXMgZXh0ZXJuYWxcbiAgICAgKiB0byB0aGUgZWxlbWVudCksIHNvIHRoYXQgaXQgaXMgZnJlZSB0byBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAqICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbiBlbGVtZW50IG1heSBiZSByZS1jb25uZWN0ZWQgYWZ0ZXIgYmVpbmcgZGlzY29ubmVjdGVkLlxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0Py5zZXRDb25uZWN0ZWQoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAgICogYW55IHZhbHVlIHJlbmRlcmFibGUgYnkgbGl0LWh0bWwncyBgQ2hpbGRQYXJ0YCAtIHR5cGljYWxseSBhXG4gICAgICogYFRlbXBsYXRlUmVzdWx0YC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgICAqL1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIG5vQ2hhbmdlO1xuICAgIH1cbn1cbi8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG5MaXRFbGVtZW50WydfJGxpdEVsZW1lbnQkJ10gPSB0cnVlO1xuLyoqXG4gKiBFbnN1cmUgdGhpcyBjbGFzcyBpcyBtYXJrZWQgYXMgYGZpbmFsaXplZGAgYXMgYW4gb3B0aW1pemF0aW9uIGVuc3VyaW5nXG4gKiBpdCB3aWxsIG5vdCBuZWVkbGVzc2x5IHRyeSB0byBgZmluYWxpemVgLlxuICpcbiAqIE5vdGUgdGhpcyBwcm9wZXJ0eSBuYW1lIGlzIGEgc3RyaW5nIHRvIHByZXZlbnQgYnJlYWtpbmcgQ2xvc3VyZSBKUyBDb21waWxlclxuICogb3B0aW1pemF0aW9ucy4gU2VlIEBsaXQvcmVhY3RpdmUtZWxlbWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqL1xuTGl0RWxlbWVudFtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KV0gPSB0cnVlO1xuLy8gSW5zdGFsbCBoeWRyYXRpb24gaWYgYXZhaWxhYmxlXG5nbG9iYWwubGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0Py4oeyBMaXRFbGVtZW50IH0pO1xuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgICA/IGdsb2JhbC5saXRFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICAgIDogZ2xvYmFsLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7IExpdEVsZW1lbnQgfSk7XG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gICAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5OiAoZWwsIG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBlbC5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgIH0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsKSA9PiBlbC5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgTGl0RWxlbWVudCB1c2FnZS5cbihnbG9iYWwubGl0RWxlbWVudFZlcnNpb25zID8/PSBbXSkucHVzaCgnNC4yLjEnKTtcbmlmIChERVZfTU9ERSAmJiBnbG9iYWwubGl0RWxlbWVudFZlcnNpb25zLmxlbmd0aCA+IDEpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnbXVsdGlwbGUtdmVyc2lvbnMnLCBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgICAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXQtZWxlbWVudC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmltcG9ydCB7IF8kTEgsIH0gZnJvbSAnLi9saXQtaHRtbC5qcyc7XG5jb25zdCB7IF9DaGlsZFBhcnQ6IENoaWxkUGFydCB9ID0gXyRMSDtcbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcbmNvbnN0IHdyYXAgPSBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCAmJlxuICAgIHdpbmRvdy5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgICB3aW5kb3cuU2hhZHlET00/Lm5vUGF0Y2ggPT09IHRydWVcbiAgICA/IHdpbmRvdy5TaGFkeURPTS53cmFwXG4gICAgOiAobm9kZSkgPT4gbm9kZTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIHByaW1pdGl2ZSB2YWx1ZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZW9mLW9wZXJhdG9yXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT0gJ2Z1bmN0aW9uJyk7XG5leHBvcnQgY29uc3QgVGVtcGxhdGVSZXN1bHRUeXBlID0ge1xuICAgIEhUTUw6IDEsXG4gICAgU1ZHOiAyLFxuICAgIE1BVEhNTDogMyxcbn07XG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBUZW1wbGF0ZVJlc3VsdCBvciBhIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1RlbXBsYXRlUmVzdWx0ID0gKHZhbHVlLCB0eXBlKSA9PiB0eXBlID09PSB1bmRlZmluZWRcbiAgICA/IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIHZhbHVlPy5bJ18kbGl0VHlwZSQnXSAhPT0gdW5kZWZpbmVkXG4gICAgOiB2YWx1ZT8uWydfJGxpdFR5cGUkJ10gPT09IHR5cGU7XG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBDb21waWxlZFRlbXBsYXRlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNDb21waWxlZFRlbXBsYXRlUmVzdWx0ID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlPy5bJ18kbGl0VHlwZSQnXT8uaCAhPSBudWxsO1xufTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIERpcmVjdGl2ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGlyZWN0aXZlUmVzdWx0ID0gKHZhbHVlKSA9PiBcbi8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG52YWx1ZT8uWydfJGxpdERpcmVjdGl2ZSQnXSAhPT0gdW5kZWZpbmVkO1xuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIERpcmVjdGl2ZSBjbGFzcyBmb3IgYSBEaXJlY3RpdmVSZXN1bHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERpcmVjdGl2ZUNsYXNzID0gKHZhbHVlKSA9PiBcbi8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG52YWx1ZT8uWydfJGxpdERpcmVjdGl2ZSQnXTtcbi8qKlxuICogVGVzdHMgd2hldGhlciBhIHBhcnQgaGFzIG9ubHkgYSBzaW5nbGUtZXhwcmVzc2lvbiB3aXRoIG5vIHN0cmluZ3MgdG9cbiAqIGludGVycG9sYXRlIGJldHdlZW4uXG4gKlxuICogT25seSBBdHRyaWJ1dGVQYXJ0IGFuZCBQcm9wZXJ0eVBhcnQgY2FuIGhhdmUgbXVsdGlwbGUgZXhwcmVzc2lvbnMuXG4gKiBNdWx0aS1leHByZXNzaW9uIHBhcnRzIGhhdmUgYSBgc3RyaW5nc2AgcHJvcGVydHkgYW5kIHNpbmdsZS1leHByZXNzaW9uXG4gKiBwYXJ0cyBkbyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1NpbmdsZUV4cHJlc3Npb24gPSAocGFydCkgPT4gcGFydC5zdHJpbmdzID09PSB1bmRlZmluZWQ7XG5jb25zdCBjcmVhdGVNYXJrZXIgPSAoKSA9PiBkb2N1bWVudC5jcmVhdGVDb21tZW50KCcnKTtcbi8qKlxuICogSW5zZXJ0cyBhIENoaWxkUGFydCBpbnRvIHRoZSBnaXZlbiBjb250YWluZXIgQ2hpbGRQYXJ0J3MgRE9NLCBlaXRoZXIgYXQgdGhlXG4gKiBlbmQgb2YgdGhlIGNvbnRhaW5lciBDaGlsZFBhcnQsIG9yIGJlZm9yZSB0aGUgb3B0aW9uYWwgYHJlZlBhcnRgLlxuICpcbiAqIFRoaXMgZG9lcyBub3QgYWRkIHRoZSBwYXJ0IHRvIHRoZSBjb250YWluZXJQYXJ0J3MgY29tbWl0dGVkIHZhbHVlLiBUaGF0IG11c3RcbiAqIGJlIGRvbmUgYnkgY2FsbGVycy5cbiAqXG4gKiBAcGFyYW0gY29udGFpbmVyUGFydCBQYXJ0IHdpdGhpbiB3aGljaCB0byBhZGQgdGhlIG5ldyBDaGlsZFBhcnRcbiAqIEBwYXJhbSByZWZQYXJ0IFBhcnQgYmVmb3JlIHdoaWNoIHRvIGFkZCB0aGUgbmV3IENoaWxkUGFydDsgd2hlbiBvbWl0dGVkIHRoZVxuICogICAgIHBhcnQgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgYGNvbnRhaW5lclBhcnRgXG4gKiBAcGFyYW0gcGFydCBQYXJ0IHRvIGluc2VydCwgb3IgdW5kZWZpbmVkIHRvIGNyZWF0ZSBhIG5ldyBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRQYXJ0ID0gKGNvbnRhaW5lclBhcnQsIHJlZlBhcnQsIHBhcnQpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB3cmFwKGNvbnRhaW5lclBhcnQuXyRzdGFydE5vZGUpLnBhcmVudE5vZGU7XG4gICAgY29uc3QgcmVmTm9kZSA9IHJlZlBhcnQgPT09IHVuZGVmaW5lZCA/IGNvbnRhaW5lclBhcnQuXyRlbmROb2RlIDogcmVmUGFydC5fJHN0YXJ0Tm9kZTtcbiAgICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgICAgICBjb25zdCBlbmROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KHN0YXJ0Tm9kZSwgZW5kTm9kZSwgY29udGFpbmVyUGFydCwgY29udGFpbmVyUGFydC5vcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKHBhcnQuXyRlbmROb2RlKS5uZXh0U2libGluZztcbiAgICAgICAgY29uc3Qgb2xkUGFyZW50ID0gcGFydC5fJHBhcmVudDtcbiAgICAgICAgY29uc3QgcGFyZW50Q2hhbmdlZCA9IG9sZFBhcmVudCAhPT0gY29udGFpbmVyUGFydDtcbiAgICAgICAgaWYgKHBhcmVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIHBhcnQuXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcz8uKGNvbnRhaW5lclBhcnQpO1xuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGFsdGhvdWdoIGBfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzYCB1cGRhdGVzIHRoZSBwYXJ0J3NcbiAgICAgICAgICAgIC8vIGBfJHBhcmVudGAgcmVmZXJlbmNlIGFmdGVyIHVubGlua2luZyBmcm9tIGl0cyBjdXJyZW50IHBhcmVudCwgdGhhdFxuICAgICAgICAgICAgLy8gbWV0aG9kIG9ubHkgZXhpc3RzIGlmIERpc2Nvbm5lY3RhYmxlcyBhcmUgcHJlc2VudCwgc28gd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IHNldCBpdCBoZXJlXG4gICAgICAgICAgICBwYXJ0Ll8kcGFyZW50ID0gY29udGFpbmVyUGFydDtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBfJGlzQ29ubmVjdGVkIGdldHRlciBpcyBzb21ld2hhdCBjb3N0bHksIG9ubHlcbiAgICAgICAgICAgIC8vIHJlYWQgaXQgb25jZSB3ZSBrbm93IHRoZSBzdWJ0cmVlIGhhcyBkaXJlY3RpdmVzIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgbm90aWZpZWRcbiAgICAgICAgICAgIGxldCBuZXdDb25uZWN0aW9uU3RhdGU7XG4gICAgICAgICAgICBpZiAocGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAobmV3Q29ubmVjdGlvblN0YXRlID0gY29udGFpbmVyUGFydC5fJGlzQ29ubmVjdGVkKSAhPT1cbiAgICAgICAgICAgICAgICAgICAgb2xkUGFyZW50Ll8kaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQobmV3Q29ubmVjdGlvblN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kTm9kZSAhPT0gcmVmTm9kZSB8fCBwYXJlbnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBwYXJ0Ll8kc3RhcnROb2RlO1xuICAgICAgICAgICAgd2hpbGUgKHN0YXJ0ICE9PSBlbmROb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbiA9IHdyYXAoc3RhcnQpLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoc3RhcnQsIHJlZk5vZGUpO1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFydDtcbn07XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgUGFydC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHRvIHNldC91cGRhdGUgdGhlIHZhbHVlIG9mIHVzZXItY3JlYXRlZFxuICogcGFydHMgKGkuZS4gdGhvc2UgY3JlYXRlZCB1c2luZyBgaW5zZXJ0UGFydGApOyBpdCBzaG91bGQgbm90IGJlIHVzZWRcbiAqIGJ5IGRpcmVjdGl2ZXMgdG8gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZGlyZWN0aXZlJ3MgY29udGFpbmVyIHBhcnQuIERpcmVjdGl2ZXNcbiAqIHNob3VsZCByZXR1cm4gYSB2YWx1ZSBmcm9tIGB1cGRhdGVgL2ByZW5kZXJgIHRvIHVwZGF0ZSB0aGVpciBwYXJ0IHN0YXRlLlxuICpcbiAqIEZvciBkaXJlY3RpdmVzIHRoYXQgcmVxdWlyZSBzZXR0aW5nIHRoZWlyIHBhcnQgdmFsdWUgYXN5bmNocm9ub3VzbHksIHRoZXlcbiAqIHNob3VsZCBleHRlbmQgYEFzeW5jRGlyZWN0aXZlYCBhbmQgY2FsbCBgdGhpcy5zZXRWYWx1ZSgpYC5cbiAqXG4gKiBAcGFyYW0gcGFydCBQYXJ0IHRvIHNldFxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHNldFxuICogQHBhcmFtIGluZGV4IEZvciBgQXR0cmlidXRlUGFydGBzLCB0aGUgaW5kZXggdG8gc2V0XG4gKiBAcGFyYW0gZGlyZWN0aXZlUGFyZW50IFVzZWQgaW50ZXJuYWxseTsgc2hvdWxkIG5vdCBiZSBzZXQgYnkgdXNlclxuICovXG5leHBvcnQgY29uc3Qgc2V0Q2hpbGRQYXJ0VmFsdWUgPSAocGFydCwgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCA9IHBhcnQpID0+IHtcbiAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUsIGRpcmVjdGl2ZVBhcmVudCk7XG4gICAgcmV0dXJuIHBhcnQ7XG59O1xuLy8gQSBzZW50aW5lbCB2YWx1ZSB0aGF0IGNhbiBuZXZlciBhcHBlYXIgYXMgYSBwYXJ0IHZhbHVlIGV4Y2VwdCB3aGVuIHNldCBieVxuLy8gbGl2ZSgpLiBVc2VkIHRvIGZvcmNlIGEgZGlydHktY2hlY2sgdG8gZmFpbCBhbmQgY2F1c2UgYSByZS1yZW5kZXIuXG5jb25zdCBSRVNFVF9WQUxVRSA9IHt9O1xuLyoqXG4gKiBTZXRzIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQgZGlyZWN0bHkgd2l0aG91dCB0cmlnZ2VyaW5nIHRoZVxuICogY29tbWl0IHN0YWdlIG9mIHRoZSBwYXJ0LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIGEgZGlyZWN0aXZlIG5lZWRzIHRvIHVwZGF0ZSB0aGUgcGFydCBzdWNoXG4gKiB0aGF0IHRoZSBuZXh0IHVwZGF0ZSBkZXRlY3RzIGEgdmFsdWUgY2hhbmdlIG9yIG5vdC4gV2hlbiB2YWx1ZSBpcyBvbWl0dGVkLFxuICogdGhlIG5leHQgdXBkYXRlIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBiZSBkZXRlY3RlZCBhcyBhIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0LCB2YWx1ZSA9IFJFU0VUX1ZBTFVFKSA9PiAocGFydC5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWUpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21taXR0ZWQgdmFsdWUgb2YgYSBDaGlsZFBhcnQuXG4gKlxuICogVGhlIGNvbW1pdHRlZCB2YWx1ZSBpcyB1c2VkIGZvciBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBlZmZpY2llbnQgdXBkYXRlcyBvZlxuICogdGhlIHBhcnQuIEl0IGNhbiBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB0ZW1wbGF0ZSBvciBkaXJlY3RpdmUgaW5cbiAqIGNhc2VzIHdoZXJlIHRoZSB0ZW1wbGF0ZSB2YWx1ZSBpcyB0cmFuc2Zvcm1lZCBiZWZvcmUgYmVpbmcgY29tbWl0dGVkLlxuICpcbiAqIC0gYFRlbXBsYXRlUmVzdWx0YHMgYXJlIGNvbW1pdHRlZCBhcyBhIGBUZW1wbGF0ZUluc3RhbmNlYFxuICogLSBJdGVyYWJsZXMgYXJlIGNvbW1pdHRlZCBhcyBgQXJyYXk8Q2hpbGRQYXJ0PmBcbiAqIC0gQWxsIG90aGVyIHR5cGVzIGFyZSBjb21taXR0ZWQgYXMgdGhlIHRlbXBsYXRlIHZhbHVlIG9yIHZhbHVlIHJldHVybmVkIG9yXG4gKiAgIHNldCBieSBhIGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0gcGFydFxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29tbWl0dGVkVmFsdWUgPSAocGFydCkgPT4gcGFydC5fJGNvbW1pdHRlZFZhbHVlO1xuLyoqXG4gKiBSZW1vdmVzIGEgQ2hpbGRQYXJ0IGZyb20gdGhlIERPTSwgaW5jbHVkaW5nIGFueSBvZiBpdHMgY29udGVudCBhbmQgbWFya2Vycy5cbiAqXG4gKiBOb3RlOiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgY2xlYXJQYXJ0KCkgaXMgdGhhdCB0aGlzIGFsc29cbiAqIHJlbW92ZXMgdGhlIHBhcnQncyBzdGFydCBub2RlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIENoaWxkUGFydCBtdXN0IG93biBpdHNcbiAqIHN0YXJ0IG5vZGUsIGllIGl0IG11c3QgYmUgYSBtYXJrZXIgbm9kZSBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgcGFydCBhbmQgbm90IGFuXG4gKiBhbmNob3IgZnJvbSBzdXJyb3VuZGluZyBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJ0IFRoZSBQYXJ0IHRvIHJlbW92ZVxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlUGFydCA9IChwYXJ0KSA9PiB7XG4gICAgcGFydC5fJGNsZWFyKCk7XG4gICAgcGFydC5fJHN0YXJ0Tm9kZS5yZW1vdmUoKTtcbn07XG5leHBvcnQgY29uc3QgY2xlYXJQYXJ0ID0gKHBhcnQpID0+IHtcbiAgICBwYXJ0Ll8kY2xlYXIoKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXJlY3RpdmUtaGVscGVycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmltcG9ydCB7IGlzU2luZ2xlRXhwcmVzc2lvbiB9IGZyb20gJy4vZGlyZWN0aXZlLWhlbHBlcnMuanMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBQYXJ0VHlwZSB9IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbi8qKlxuICogUmVjdXJzaXZlbHkgd2Fsa3MgZG93biB0aGUgdHJlZSBvZiBQYXJ0cy9UZW1wbGF0ZUluc3RhbmNlcy9EaXJlY3RpdmVzIHRvIHNldFxuICogdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiBkaXJlY3RpdmVzIGFuZCBydW4gYGRpc2Nvbm5lY3RlZGAvIGByZWNvbm5lY3RlZGBcbiAqIGNhbGxiYWNrcy5cbiAqXG4gKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgd2VyZSBjaGlsZHJlbiB0byBkaXNjb25uZWN0OyBmYWxzZSBvdGhlcndpc2VcbiAqL1xuY29uc3Qgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkID0gKHBhcmVudCwgaXNDb25uZWN0ZWQpID0+IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBjaGlsZHJlbikge1xuICAgICAgICAvLyBUaGUgZXhpc3RlbmNlIG9mIGBfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkYCBpcyB1c2VkIGFzIGEgXCJicmFuZFwiIHRvXG4gICAgICAgIC8vIGRpc2FtYmlndWF0ZSBBc3luY0RpcmVjdGl2ZXMgZnJvbSBvdGhlciBEaXNjb25uZWN0YWJsZUNoaWxkcmVuXG4gICAgICAgIC8vIChhcyBvcHBvc2VkIHRvIHVzaW5nIGFuIGluc3RhbmNlb2YgY2hlY2sgdG8ga25vdyB3aGVuIHRvIGNhbGwgaXQpOyB0aGVcbiAgICAgICAgLy8gcmVkdW5kYW5jeSBvZiBcIkRpcmVjdGl2ZVwiIGluIHRoZSBBUEkgbmFtZSBpcyB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoXG4gICAgICAgIC8vIGBfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkYCwgd2hpY2ggZXhpc3RzIGBDaGlsZFBhcnRzYCB3aGljaCBhcmUgYWxzbyBpblxuICAgICAgICAvLyB0aGlzIGxpc3RcbiAgICAgICAgLy8gRGlzY29ubmVjdCBEaXJlY3RpdmUgKGFuZCBhbnkgbmVzdGVkIGRpcmVjdGl2ZXMgY29udGFpbmVkIHdpdGhpbilcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgb2JqWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/Lihpc0Nvbm5lY3RlZCwgZmFsc2UpO1xuICAgICAgICAvLyBEaXNjb25uZWN0IFBhcnQvVGVtcGxhdGVJbnN0YW5jZVxuICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQob2JqLCBpc0Nvbm5lY3RlZCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbi8qKlxuICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2hpbGQgZnJvbSBpdHMgcGFyZW50IGxpc3Qgb2YgZGlzY29ubmVjdGFibGUgY2hpbGRyZW4sIGFuZFxuICogaWYgdGhlIHBhcmVudCBsaXN0IGJlY29tZXMgZW1wdHkgYXMgYSByZXN1bHQsIHJlbW92ZXMgdGhlIHBhcmVudCBmcm9tIGl0c1xuICogcGFyZW50LCBhbmQgc28gZm9ydGggdXAgdGhlIHRyZWUgd2hlbiB0aGF0IGNhdXNlcyBzdWJzZXF1ZW50IHBhcmVudCBsaXN0cyB0b1xuICogYmVjb21lIGVtcHR5LlxuICovXG5jb25zdCByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQgPSAob2JqKSA9PiB7XG4gICAgbGV0IHBhcmVudCwgY2hpbGRyZW47XG4gICAgZG8ge1xuICAgICAgICBpZiAoKHBhcmVudCA9IG9iai5fJHBhcmVudCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuO1xuICAgICAgICBjaGlsZHJlbi5kZWxldGUob2JqKTtcbiAgICAgICAgb2JqID0gcGFyZW50O1xuICAgIH0gd2hpbGUgKGNoaWxkcmVuPy5zaXplID09PSAwKTtcbn07XG5jb25zdCBhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50ID0gKG9iaikgPT4ge1xuICAgIC8vIENsaW1iIHRoZSBwYXJlbnQgdHJlZSwgY3JlYXRpbmcgYSBzcGFyc2UgdHJlZSBvZiBjaGlsZHJlbiBuZWVkaW5nXG4gICAgLy8gZGlzY29ubmVjdGlvblxuICAgIGZvciAobGV0IHBhcmVudDsgKHBhcmVudCA9IG9iai5fJHBhcmVudCk7IG9iaiA9IHBhcmVudCkge1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuO1xuICAgICAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAvLyBPbmNlIHdlJ3ZlIHJlYWNoZWQgYSBwYXJlbnQgdGhhdCBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgY2hpbGQsIHdlXG4gICAgICAgICAgICAvLyBjYW4gc2hvcnQtY2lyY3VpdFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4uYWRkKG9iaik7XG4gICAgICAgIGluc3RhbGxEaXNjb25uZWN0QVBJKHBhcmVudCk7XG4gICAgfVxufTtcbi8qKlxuICogQ2hhbmdlcyB0aGUgcGFyZW50IHJlZmVyZW5jZSBvZiB0aGUgQ2hpbGRQYXJ0LCBhbmQgdXBkYXRlcyB0aGUgc3BhcnNlIHRyZWUgb2ZcbiAqIERpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuIGFjY29yZGluZ2x5LlxuICpcbiAqIE5vdGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydCBpbnN0YW5jZXMgYW5kIGNhbGxlZCBmcm9tXG4gKiB0aGUgY29yZSBjb2RlIHdoZW4gcGFydHMgYXJlIG1vdmVkIGJldHdlZW4gZGlmZmVyZW50IHBhcmVudHMuXG4gKi9cbmZ1bmN0aW9uIHJlcGFyZW50RGlzY29ubmVjdGFibGVzKG5ld1BhcmVudCkge1xuICAgIGlmICh0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IG5ld1BhcmVudDtcbiAgICAgICAgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCh0aGlzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSBjb25uZWN0ZWQgc3RhdGUgb24gYW55IGRpcmVjdGl2ZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY29tbWl0dGVkXG4gKiB2YWx1ZSBvZiB0aGlzIHBhcnQgKGkuZS4gd2l0aGluIGEgVGVtcGxhdGVJbnN0YW5jZSBvciBpdGVyYWJsZSBvZlxuICogQ2hpbGRQYXJ0cykgYW5kIHJ1bnMgdGhlaXIgYGRpc2Nvbm5lY3RlZGAvYHJlY29ubmVjdGVkYHMsIGFzIHdlbGwgYXMgd2l0aGluXG4gKiBhbnkgZGlyZWN0aXZlcyBzdG9yZWQgb24gdGhlIENoaWxkUGFydCAod2hlbiBgdmFsdWVPbmx5YCBpcyBmYWxzZSkuXG4gKlxuICogYGlzQ2xlYXJpbmdWYWx1ZWAgc2hvdWxkIGJlIHBhc3NlZCBhcyBgdHJ1ZWAgb24gYSB0b3AtbGV2ZWwgcGFydCB0aGF0IGlzXG4gKiBjbGVhcmluZyBpdHNlbGYsIGFuZCBub3QgYXMgYSByZXN1bHQgb2YgcmVjdXJzaXZlbHkgZGlzY29ubmVjdGluZyBkaXJlY3RpdmVzXG4gKiBhcyBwYXJ0IG9mIGEgYGNsZWFyYCBvcGVyYXRpb24gaGlnaGVyIHVwIHRoZSB0cmVlLiBUaGlzIGJvdGggZW5zdXJlcyB0aGF0IGFueVxuICogZGlyZWN0aXZlIG9uIHRoaXMgQ2hpbGRQYXJ0IHRoYXQgcHJvZHVjZWQgYSB2YWx1ZSB0aGF0IGNhdXNlZCB0aGUgY2xlYXJcbiAqIG9wZXJhdGlvbiBpcyBub3QgZGlzY29ubmVjdGVkLCBhbmQgYWxzbyBzZXJ2ZXMgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAqIHRvIGF2b2lkIG5lZWRsZXNzIGJvb2trZWVwaW5nIHdoZW4gYSBzdWJ0cmVlIGlzIGdvaW5nIGF3YXk7IHdoZW4gY2xlYXJpbmcgYVxuICogc3VidHJlZSwgb25seSB0aGUgdG9wLW1vc3QgcGFydCBuZWVkIHRvIHJlbW92ZSBpdHNlbGYgZnJvbSB0aGUgcGFyZW50LlxuICpcbiAqIGBmcm9tUGFydEluZGV4YCBpcyBwYXNzZWQgb25seSBpbiB0aGUgY2FzZSBvZiBhIHBhcnRpYWwgYF9jbGVhcmAgcnVubmluZyBhcyBhXG4gKiByZXN1bHQgb2YgdHJ1bmNhdGluZyBhbiBpdGVyYWJsZS5cbiAqXG4gKiBOb3RlLCB0aGlzIG1ldGhvZCB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnQgaW5zdGFuY2VzIGFuZCBjYWxsZWQgZnJvbSB0aGVcbiAqIGNvcmUgY29kZSB3aGVuIHBhcnRzIGFyZSBjbGVhcmVkIG9yIHRoZSBjb25uZWN0aW9uIHN0YXRlIGlzIGNoYW5nZWQgYnkgdGhlXG4gKiB1c2VyLlxuICovXG5mdW5jdGlvbiBub3RpZnlDaGlsZFBhcnRDb25uZWN0ZWRDaGFuZ2VkKGlzQ29ubmVjdGVkLCBpc0NsZWFyaW5nVmFsdWUgPSBmYWxzZSwgZnJvbVBhcnRJbmRleCA9IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkcmVuLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNDbGVhcmluZ1ZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gSXRlcmFibGUgY2FzZTogQW55IENoaWxkUGFydHMgY3JlYXRlZCBieSB0aGUgaXRlcmFibGUgc2hvdWxkIGJlXG4gICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlXG4gICAgICAgICAgICAvLyBjaGlsZHJlbiAoc3RhcnRpbmcgYXQgYGZyb21QYXJ0SW5kZXhgIGluIHRoZSBjYXNlIG9mIHRydW5jYXRpb24pXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZnJvbVBhcnRJbmRleDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHZhbHVlW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUZW1wbGF0ZUluc3RhbmNlIGNhc2U6IElmIHRoZSB2YWx1ZSBoYXMgZGlzY29ubmVjdGFibGUgY2hpbGRyZW4gKHdpbGxcbiAgICAgICAgICAgIC8vIG9ubHkgYmUgaW4gdGhlIGNhc2UgdGhhdCBpdCBpcyBhIFRlbXBsYXRlSW5zdGFuY2UpLCB3ZSBkaXNjb25uZWN0IGl0XG4gICAgICAgICAgICAvLyBhbmQgcmVtb3ZlIGl0IGZyb20gdGhpcyBDaGlsZFBhcnQncyBkaXNjb25uZWN0YWJsZSBjaGlsZHJlblxuICAgICAgICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgIH1cbn1cbi8qKlxuICogUGF0Y2hlcyBkaXNjb25uZWN0aW9uIEFQSSBvbnRvIENoaWxkUGFydHMuXG4gKi9cbmNvbnN0IGluc3RhbGxEaXNjb25uZWN0QVBJID0gKG9iaikgPT4ge1xuICAgIGlmIChvYmoudHlwZSA9PSBQYXJ0VHlwZS5DSElMRCkge1xuICAgICAgICBvYmouXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCA/Pz1cbiAgICAgICAgICAgIG5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQ7XG4gICAgICAgIG9iai5fJHJlcGFyZW50RGlzY29ubmVjdGFibGVzID8/PSByZXBhcmVudERpc2Nvbm5lY3RhYmxlcztcbiAgICB9XG59O1xuLyoqXG4gKiBBbiBhYnN0cmFjdCBgRGlyZWN0aXZlYCBiYXNlIGNsYXNzIHdob3NlIGBkaXNjb25uZWN0ZWRgIG1ldGhvZCB3aWxsIGJlXG4gKiBjYWxsZWQgd2hlbiB0aGUgcGFydCBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgaXMgY2xlYXJlZCBhcyBhIHJlc3VsdCBvZlxuICogcmUtcmVuZGVyaW5nLCBvciB3aGVuIHRoZSB1c2VyIGNhbGxzIGBwYXJ0LnNldENvbm5lY3RlZChmYWxzZSlgIG9uXG4gKiBhIHBhcnQgdGhhdCB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgKGFzIGhhcHBlbnNcbiAqIHdoZW4gZS5nLiBhIExpdEVsZW1lbnQgZGlzY29ubmVjdHMgZnJvbSB0aGUgRE9NKS5cbiAqXG4gKiBJZiBgcGFydC5zZXRDb25uZWN0ZWQodHJ1ZSlgIGlzIHN1YnNlcXVlbnRseSBjYWxsZWQgb24gYVxuICogY29udGFpbmluZyBwYXJ0LCB0aGUgZGlyZWN0aXZlJ3MgYHJlY29ubmVjdGVkYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgcHJpb3JcbiAqIHRvIGl0cyBuZXh0IGB1cGRhdGVgL2ByZW5kZXJgIGNhbGxiYWNrcy4gV2hlbiBpbXBsZW1lbnRpbmcgYGRpc2Nvbm5lY3RlZGAsXG4gKiBgcmVjb25uZWN0ZWRgIHNob3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCByZWNvbm5lY3Rpb24uXG4gKlxuICogTm90ZSB0aGF0IHVwZGF0ZXMgbWF5IG9jY3VyIHdoaWxlIHRoZSBkaXJlY3RpdmUgaXMgZGlzY29ubmVjdGVkLiBBcyBzdWNoLFxuICogZGlyZWN0aXZlcyBzaG91bGQgZ2VuZXJhbGx5IGNoZWNrIHRoZSBgdGhpcy5pc0Nvbm5lY3RlZGAgZmxhZyBkdXJpbmdcbiAqIHJlbmRlci91cGRhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgc2FmZSB0byBzdWJzY3JpYmUgdG8gcmVzb3VyY2VzXG4gKiB0aGF0IG1heSBwcmV2ZW50IGdhcmJhZ2UgY29sbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jRGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gQGludGVybmFsXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBwYXJ0IHdpdGggaW50ZXJuYWwgZmllbGRzXG4gICAgICogQHBhcmFtIHBhcnRcbiAgICAgKiBAcGFyYW0gcGFyZW50XG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZUluZGV4XG4gICAgICovXG4gICAgXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpIHtcbiAgICAgICAgc3VwZXIuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgICAgICBhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gcGFydC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8qKlxuICAgICAqIENhbGxlZCBmcm9tIHRoZSBjb3JlIGNvZGUgd2hlbiBhIGRpcmVjdGl2ZSBpcyBnb2luZyBhd2F5IGZyb20gYSBwYXJ0IChpblxuICAgICAqIHdoaWNoIGNhc2UgYHNob3VsZFJlbW92ZUZyb21QYXJlbnRgIHNob3VsZCBiZSB0cnVlKSwgYW5kIGZyb20gdGhlXG4gICAgICogYHNldENoaWxkcmVuQ29ubmVjdGVkYCBoZWxwZXIgZnVuY3Rpb24gd2hlbiByZWN1cnNpdmVseSBjaGFuZ2luZyB0aGVcbiAgICAgKiBjb25uZWN0aW9uIHN0YXRlIG9mIGEgdHJlZSAoaW4gd2hpY2ggY2FzZSBgc2hvdWxkUmVtb3ZlRnJvbVBhcmVudGAgc2hvdWxkXG4gICAgICogYmUgZmFsc2UpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzQ29ubmVjdGVkXG4gICAgICogQHBhcmFtIGlzQ2xlYXJpbmdEaXJlY3RpdmUgLSBUcnVlIHdoZW4gdGhlIGRpcmVjdGl2ZSBpdHNlbGYgaXMgYmVpbmdcbiAgICAgKiAgICAgcmVtb3ZlZDsgZmFsc2Ugd2hlbiB0aGUgdHJlZSBpcyBiZWluZyBkaXNjb25uZWN0ZWRcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBbJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXShpc0Nvbm5lY3RlZCwgaXNDbGVhcmluZ0RpcmVjdGl2ZSA9IHRydWUpIHtcbiAgICAgICAgaWYgKGlzQ29ubmVjdGVkICE9PSB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdGVkPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdGVkPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDbGVhcmluZ0RpcmVjdGl2ZSkge1xuICAgICAgICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgICAgICAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlyZWN0aXZlJ3MgUGFydCBvdXRzaWRlIHRoZSBub3JtYWwgYHVwZGF0ZWAvYHJlbmRlcmBcbiAgICAgKiBsaWZlY3ljbGUgb2YgYSBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gYSBkaXJlY3RpdmUncyBgdXBkYXRlYFxuICAgICAqIG9yIGByZW5kZXJgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpcmVjdGl2ZSBUaGUgZGlyZWN0aXZlIHRvIHVwZGF0ZVxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0XG4gICAgICovXG4gICAgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKGlzU2luZ2xlRXhwcmVzc2lvbih0aGlzLl9fcGFydCkpIHtcbiAgICAgICAgICAgIHRoaXMuX19wYXJ0Ll8kc2V0VmFsdWUodmFsdWUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHdpbGwgYmUgZGVmaW5lZCBpbiB0aGlzIGNhc2UsIGJ1dFxuICAgICAgICAgICAgLy8gYXNzZXJ0IGl0IGluIGRldiBtb2RlXG4gICAgICAgICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRoaXMuX19hdHRyaWJ1dGVJbmRleCB0byBiZSBhIG51bWJlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gWy4uLnRoaXMuX19wYXJ0Ll8kY29tbWl0dGVkVmFsdWVdO1xuICAgICAgICAgICAgbmV3VmFsdWVzW3RoaXMuX19hdHRyaWJ1dGVJbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX19wYXJ0Ll8kc2V0VmFsdWUobmV3VmFsdWVzLCB0aGlzLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VyIGNhbGxiYWNrcyBmb3IgaW1wbGVtZW50aW5nIGxvZ2ljIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcy9zdWJzY3JpcHRpb25zXG4gICAgICogdGhhdCBtYXkgaGF2ZSBiZWVuIHJldGFpbmVkIGJ5IHRoaXMgZGlyZWN0aXZlLiBTaW5jZSBkaXJlY3RpdmVzIG1heSBhbHNvIGJlXG4gICAgICogcmUtY29ubmVjdGVkLCBgcmVjb25uZWN0ZWRgIHNob3VsZCBhbHNvIGJlIGltcGxlbWVudGVkIHRvIHJlc3RvcmUgdGhlXG4gICAgICogd29ya2luZyBzdGF0ZSBvZiB0aGUgZGlyZWN0aXZlIHByaW9yIHRvIHRoZSBuZXh0IHJlbmRlci5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0ZWQoKSB7IH1cbiAgICByZWNvbm5lY3RlZCgpIHsgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMtZGlyZWN0aXZlLmpzLm1hcCIsImltcG9ydCB7IGh0bWwsIHJlbmRlciB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IGhhdW50ZWQgZnJvbSBcIi4vY29yZVwiO1xuaW1wb3J0IHsgbWFrZVZpcnR1YWwgfSBmcm9tIFwiLi92aXJ0dWFsXCI7XG5jb25zdCB7IGNvbXBvbmVudCwgY3JlYXRlQ29udGV4dCB9ID0gaGF1bnRlZCh7IHJlbmRlciB9KTtcbmNvbnN0IHZpcnR1YWwgPSBtYWtlVmlydHVhbCgpO1xuZXhwb3J0IHsgY29tcG9uZW50LCBjcmVhdGVDb250ZXh0LCB2aXJ0dWFsLCBodG1sLCByZW5kZXIgfTtcbiIsImltcG9ydCB7IG1ha2VDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IG1ha2VDb250ZXh0IH0gZnJvbSBcIi4vY3JlYXRlLWNvbnRleHRcIjtcbmZ1bmN0aW9uIGhhdW50ZWQoeyByZW5kZXIgfSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IG1ha2VDb21wb25lbnQocmVuZGVyKTtcbiAgICBjb25zdCBjcmVhdGVDb250ZXh0ID0gbWFrZUNvbnRleHQoY29tcG9uZW50KTtcbiAgICByZXR1cm4geyBjb21wb25lbnQsIGNyZWF0ZUNvbnRleHQgfTtcbn1cbmV4cG9ydCB7IGhhdW50ZWQgYXMgZGVmYXVsdCwgfTtcbmV4cG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSBcIi4vdXNlLWNhbGxiYWNrXCI7XG5leHBvcnQgeyB1c2VDb250cm9sbGVyIH0gZnJvbSBcIi4vdXNlLWNvbnRyb2xsZXJcIjtcbmV4cG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gXCIuL3VzZS1lZmZlY3RcIjtcbmV4cG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCIuL3VzZS1sYXlvdXQtZWZmZWN0XCI7XG5leHBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCIuL3VzZS1zdGF0ZVwiO1xuZXhwb3J0IHsgdXNlUmVkdWNlciB9IGZyb20gXCIuL3VzZS1yZWR1Y2VyXCI7XG5leHBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcIi4vdXNlLW1lbW9cIjtcbmV4cG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tIFwiLi91c2UtY29udGV4dFwiO1xuZXhwb3J0IHsgdXNlUmVmIH0gZnJvbSBcIi4vdXNlLXJlZlwiO1xuZXhwb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbmV4cG9ydCB7IEJhc2VTY2hlZHVsZXIgfSBmcm9tIFwiLi9zY2hlZHVsZXJcIjtcbmV4cG9ydCB7IFN0YXRlIH0gZnJvbSBcIi4vc3RhdGVcIjtcbiIsImltcG9ydCB7IGNvbnRleHRFdmVudCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmltcG9ydCB7IHVzZUNvbnRleHQgfSBmcm9tIFwiLi91c2UtY29udGV4dFwiO1xuZnVuY3Rpb24gbWFrZUNvbnRleHQoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIChkZWZhdWx0VmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgQ29udGV4dCA9IHtcbiAgICAgICAgICAgIFByb3ZpZGVyOiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnM7XG4gICAgICAgICAgICAgICAgX3ZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGNvbnRleHRFdmVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoY29udGV4dEV2ZW50LCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsLkNvbnRleHQgPT09IENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbC52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwudW5zdWJzY3JpYmUgPSB0aGlzLnVuc3Vic2NyaWJlLmJpbmQodGhpcywgZGV0YWlsLmNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZChkZXRhaWwuY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENvbnN1bWVyOiBjb21wb25lbnQoZnVuY3Rpb24gKHsgcmVuZGVyIH0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDb250ZXh0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyKGNvbnRleHQpO1xuICAgICAgICAgICAgfSwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gQ29udGV4dDtcbiAgICB9O1xufVxuZXhwb3J0IHsgbWFrZUNvbnRleHQgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgbm90aGluZyB9IGZyb20gJy4uL2xpdC1odG1sLmpzJztcbmltcG9ydCB7IGRpcmVjdGl2ZSwgQXN5bmNEaXJlY3RpdmUgfSBmcm9tICcuLi9hc3luYy1kaXJlY3RpdmUuanMnO1xuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFJlZiBvYmplY3QsIHdoaWNoIGlzIGNvbnRhaW5lciBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZiA9ICgpID0+IG5ldyBSZWYoKTtcbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgaG9sZHMgYSByZWYgdmFsdWUuXG4gKi9cbmNsYXNzIFJlZiB7XG59XG4vLyBXaGVuIGNhbGxiYWNrcyBhcmUgdXNlZCBmb3IgcmVmcywgdGhpcyBtYXAgdHJhY2tzIHRoZSBsYXN0IHZhbHVlIHRoZSBjYWxsYmFja1xuLy8gd2FzIGNhbGxlZCB3aXRoLCBmb3IgZW5zdXJpbmcgYSBkaXJlY3RpdmUgZG9lc24ndCBjbGVhciB0aGUgcmVmIGlmIHRoZSByZWZcbi8vIGhhcyBhbHJlYWR5IGJlZW4gcmVuZGVyZWQgdG8gYSBuZXcgc3BvdC4gSXQgaXMgZG91YmxlLWtleWVkIG9uIGJvdGggdGhlXG4vLyBjb250ZXh0IChgb3B0aW9ucy5ob3N0YCkgYW5kIHRoZSBjYWxsYmFjaywgc2luY2Ugd2UgYXV0by1iaW5kIGNsYXNzIG1ldGhvZHNcbi8vIHRvIGBvcHRpb25zLmhvc3RgLlxuY29uc3QgbGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2sgPSBuZXcgV2Vha01hcCgpO1xuY2xhc3MgUmVmRGlyZWN0aXZlIGV4dGVuZHMgQXN5bmNEaXJlY3RpdmUge1xuICAgIHJlbmRlcihfcmVmKSB7XG4gICAgICAgIHJldHVybiBub3RoaW5nO1xuICAgIH1cbiAgICB1cGRhdGUocGFydCwgW3JlZl0pIHtcbiAgICAgICAgY29uc3QgcmVmQ2hhbmdlZCA9IHJlZiAhPT0gdGhpcy5fcmVmO1xuICAgICAgICBpZiAocmVmQ2hhbmdlZCAmJiB0aGlzLl9yZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gVGhlIHJlZiBwYXNzZWQgdG8gdGhlIGRpcmVjdGl2ZSBoYXMgY2hhbmdlZDtcbiAgICAgICAgICAgIC8vIHVuc2V0IHRoZSBwcmV2aW91cyByZWYncyB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmQ2hhbmdlZCB8fCB0aGlzLl9sYXN0RWxlbWVudEZvclJlZiAhPT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gV2UgZWl0aGVyIGdvdCBhIG5ldyByZWYgb3IgdGhpcyBpcyB0aGUgZmlyc3QgcmVuZGVyO1xuICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHJlZi9lbGVtZW50ICYgdXBkYXRlIHRoZSByZWYgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuX3JlZiA9IHJlZjtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSBwYXJ0Lm9wdGlvbnM/Lmhvc3Q7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSgodGhpcy5fZWxlbWVudCA9IHBhcnQuZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub3RoaW5nO1xuICAgIH1cbiAgICBfdXBkYXRlUmVmVmFsdWUoZWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IHJlZiB3YXMgY2FsbGVkIHdpdGggYSBwcmV2aW91cyB2YWx1ZSwgY2FsbCB3aXRoXG4gICAgICAgICAgICAvLyBgdW5kZWZpbmVkYDsgV2UgZG8gdGhpcyB0byBlbnN1cmUgY2FsbGJhY2tzIGFyZSBjYWxsZWQgaW4gYSBjb25zaXN0ZW50XG4gICAgICAgICAgICAvLyB3YXkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgcmVmIG1pZ2h0IGJlIG1vdmluZyB1cCBpbiB0aGUgdHJlZSAoaW5cbiAgICAgICAgICAgIC8vIHdoaWNoIGNhc2UgaXQgd291bGQgb3RoZXJ3aXNlIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gcHJldmlvdXMgb25lIHVuc2V0cyBpdCkgYW5kIGRvd24gaW4gdGhlIHRyZWUgKHdoZXJlIGl0IHdvdWxkIGJlIHVuc2V0XG4gICAgICAgICAgICAvLyBiZWZvcmUgYmVpbmcgc2V0KS4gTm90ZSB0aGF0IGVsZW1lbnQgbG9va3VwIGlzIGtleWVkIGJ5XG4gICAgICAgICAgICAvLyBib3RoIHRoZSBjb250ZXh0IGFuZCB0aGUgY2FsbGJhY2ssIHNpbmNlIHdlIGFsbG93IHBhc3NpbmcgdW5ib3VuZFxuICAgICAgICAgICAgLy8gZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCBvbiBvcHRpb25zLmhvc3QsIGFuZCB3ZSB3YW50IHRvIHRyZWF0XG4gICAgICAgICAgICAvLyB0aGVzZSBhcyB1bmlxdWUgXCJpbnN0YW5jZXNcIiBvZiBhIGZ1bmN0aW9uLlxuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2NvbnRleHQgPz8gZ2xvYmFsVGhpcztcbiAgICAgICAgICAgIGxldCBsYXN0RWxlbWVudEZvckNhbGxiYWNrID0gbGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2suZ2V0KGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLnNldChjb250ZXh0LCBsYXN0RWxlbWVudEZvckNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrLmdldCh0aGlzLl9yZWYpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYuY2FsbCh0aGlzLl9jb250ZXh0LCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjay5zZXQodGhpcy5fcmVmLCBlbGVtZW50KTtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlZiB3aXRoIHRoZSBuZXcgZWxlbWVudCB2YWx1ZVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZi5jYWxsKHRoaXMuX2NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVmLnZhbHVlID0gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgX2xhc3RFbGVtZW50Rm9yUmVmKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX3JlZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFja1xuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5fY29udGV4dCA/PyBnbG9iYWxUaGlzKVxuICAgICAgICAgICAgICAgID8uZ2V0KHRoaXMuX3JlZilcbiAgICAgICAgICAgIDogdGhpcy5fcmVmPy52YWx1ZTtcbiAgICB9XG4gICAgZGlzY29ubmVjdGVkKCkge1xuICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBib3ggaWYgb3VyIGVsZW1lbnQgaXMgc3RpbGwgdGhlIG9uZSBpbiBpdCAoaS5lLiBhbm90aGVyXG4gICAgICAgIC8vIGRpcmVjdGl2ZSBpbnN0YW5jZSBoYXNuJ3QgcmVuZGVyZWQgaXRzIGVsZW1lbnQgdG8gaXQgYmVmb3JlIHVzKTsgdGhhdFxuICAgICAgICAvLyBvbmx5IGhhcHBlbnMgaW4gdGhlIGV2ZW50IG9mIHRoZSBkaXJlY3RpdmUgYmVpbmcgY2xlYXJlZCAobm90IHZpYSBtYW51YWxcbiAgICAgICAgLy8gZGlzY29ubmVjdGlvbilcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RFbGVtZW50Rm9yUmVmID09PSB0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlY29ubmVjdGVkKCkge1xuICAgICAgICAvLyBJZiB3ZSB3ZXJlIG1hbnVhbGx5IGRpc2Nvbm5lY3RlZCwgd2UgY2FuIHNhZmVseSBwdXQgb3VyIGVsZW1lbnQgYmFjayBpblxuICAgICAgICAvLyB0aGUgYm94LCBzaW5jZSBubyByZW5kZXJpbmcgY291bGQgaGF2ZSBvY2N1cnJlZCB0byBjaGFuZ2UgaXRzIHN0YXRlXG4gICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKHRoaXMuX2VsZW1lbnQpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBSZWYgb2JqZWN0IG9yIGNhbGxzIGEgcmVmIGNhbGxiYWNrIHdpdGggdGhlIGVsZW1lbnQgaXQnc1xuICogYm91bmQgdG8uXG4gKlxuICogQSBSZWYgb2JqZWN0IGFjdHMgYXMgYSBjb250YWluZXIgZm9yIGEgcmVmZXJlbmNlIHRvIGFuIGVsZW1lbnQuIEEgcmVmXG4gKiBjYWxsYmFjayBpcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gZWxlbWVudCBhcyBpdHMgb25seSBhcmd1bWVudC5cbiAqXG4gKiBUaGUgcmVmIGRpcmVjdGl2ZSBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgUmVmIG9iamVjdCBvciBjYWxscyB0aGUgcmVmIGNhbGxiYWNrXG4gKiBkdXJpbmcgcmVuZGVyaW5nLCBpZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGNoYW5nZWQuXG4gKlxuICogTm90ZTogSWYgYSByZWYgY2FsbGJhY2sgaXMgcmVuZGVyZWQgdG8gYSBkaWZmZXJlbnQgZWxlbWVudCBwb3NpdGlvbiBvciBpc1xuICogcmVtb3ZlZCBpbiBhIHN1YnNlcXVlbnQgcmVuZGVyLCBpdCB3aWxsIGZpcnN0IGJlIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLFxuICogZm9sbG93ZWQgYnkgYW5vdGhlciBjYWxsIHdpdGggdGhlIG5ldyBlbGVtZW50IGl0IHdhcyByZW5kZXJlZCB0byAoaWYgYW55KS5cbiAqXG4gKiBgYGBqc1xuICogLy8gVXNpbmcgUmVmIG9iamVjdFxuICogY29uc3QgaW5wdXRSZWYgPSBjcmVhdGVSZWYoKTtcbiAqIHJlbmRlcihodG1sYDxpbnB1dCAke3JlZihpbnB1dFJlZil9PmAsIGNvbnRhaW5lcik7XG4gKiBpbnB1dFJlZi52YWx1ZS5mb2N1cygpO1xuICpcbiAqIC8vIFVzaW5nIGNhbGxiYWNrXG4gKiBjb25zdCBjYWxsYmFjayA9IChpbnB1dEVsZW1lbnQpID0+IGlucHV0RWxlbWVudC5mb2N1cygpO1xuICogcmVuZGVyKGh0bWxgPGlucHV0ICR7cmVmKGNhbGxiYWNrKX0+YCwgY29udGFpbmVyKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgcmVmID0gZGlyZWN0aXZlKFJlZkRpcmVjdGl2ZSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWYuanMubWFwIiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSAnaGF1bnRlZCc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0LWh0bWwnO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSBcImxpdC1odG1sL2RpcmVjdGl2ZXMvcmVmLmpzXCI7XG5cbi8vIERlYm91bmNlIFV0aWxpdHlcbmNvbnN0IGRlYm91bmNlID0gKGZ1bmMsIGRlbGF5KSA9PiB7XG4gIGxldCB0aW1lb3V0SWQ7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGZ1bmMuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSwgZGVsYXkpO1xuICB9O1xufTtcblxuLy8gLS0tIENvbXBvbmVudCBEZWZpbml0aW9uIC0tLVxuZnVuY3Rpb24gQXV0b2NvbXBsZXRlU2VsZWN0KHsgXG4gIGRpc2FibGVkLCBcbiAgb3B0aW9uc01ldGFkYXRhID0ge30sXG4gIG9wdGlvbnMgPSBbXSwgXG4gIGxhYmVsID0gJ1NlYXJjaCcsIGlucHV0VmFsdWUgPSAnJyxcbiAgcGFnZVNpemUgPSAyNSxcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkSXRlbSwgc2V0U2VsZWN0ZWRJdGVtXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbYWN0aXZlSW5kZXgsIHNldEFjdGl2ZUluZGV4XSA9IHVzZVN0YXRlKC0xKTtcbiAgY29uc3QgW2lzTGlzdE9wZW4sIHNldElzTGlzdE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaW5wdXRFbGVtZW50LCBzZXRJbnB1dEVsZW1lbnRdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtjdXJyZW50UGFnZSwgc2V0Q3VycmVudFBhZ2VdID0gdXNlU3RhdGUoMSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlucHV0VmFsdWUpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbShudWxsKTtcbiAgICB9XG4gIH0sIFtpbnB1dFZhbHVlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChhY3RpdmVJbmRleCA+PSAwKSB7XG4gICAgICBzY3JvbGxUb0FjdGl2ZUl0ZW0oYWN0aXZlSW5kZXgpO1xuICAgIH1cbiAgfSwgW2FjdGl2ZUluZGV4XSlcblxuICBjb25zdCB0cmlnZ2VyUGFyZW50RmV0Y2ggPSAoaW5wdXQsIHBhZ2UgPSAxKSA9PiB7XG4gICAgY29uc3QgcXVlcnkgPSBpbnB1dCB8fCAnJztcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdmZXRjaC1zdWdnZXN0aW9ucycsIHsgXG4gICAgICBkZXRhaWw6IHsgcXVlcnksIHBhZ2UsIHBhZ2VTaXplIH0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gICAgc2V0QWN0aXZlSW5kZXgoLTEpO1xuICAgIHNldEN1cnJlbnRQYWdlKHBhZ2UpO1xuICB9O1xuXG4gIGNvbnN0IGRlYm91bmNlZEZldGNoID0gdXNlTWVtbygoKSA9PiBkZWJvdW5jZSh0cmlnZ2VyUGFyZW50RmV0Y2gsIDMwMCksIFtdKTtcblxuICAvLyAtLS0gU2VsZWN0aW9uIExvZ2ljIC0tLVxuICBjb25zdCBzZWxlY3RJdGVtID0gKGl0ZW0pID0+IHtcbiAgICBzZXRTZWxlY3RlZEl0ZW0oaXRlbSk7XG4gICAgc2V0SXNMaXN0T3BlbihmYWxzZSk7XG4gICAgc2V0Q3VycmVudFBhZ2UoMSk7XG4gICAgaWYgKGlucHV0RWxlbWVudCkgaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaXRlbS1zZWxlY3RlZCcsIHsgXG4gICAgICBkZXRhaWw6IGl0ZW0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gICAgXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnaW5wdXQtY2hhbmdlJywgeyBcbiAgICAgIGRldGFpbDogeyB2YWx1ZTogaXRlbS5sYWJlbCwgaXRlbSB9LCBcbiAgICAgIGJ1YmJsZXM6IHRydWUsIFxuICAgICAgY29tcG9zZWQ6IHRydWUgXG4gICAgfSkpO1xuICB9O1xuXG4gIGNvbnN0IGhhc1ByZXZQYWdlID0gb3B0aW9uc01ldGFkYXRhPy5saW5rcz8ucHJldjtcbiAgY29uc3QgaGFzTmV4dFBhZ2UgPSBvcHRpb25zTWV0YWRhdGE/LmxpbmtzPy5uZXh0O1xuXG4gIGNvbnN0IGhhbmRsZVByZXZQYWdlID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAoaGFzUHJldlBhZ2UpIHtcbiAgICAgIHRyaWdnZXJQYXJlbnRGZXRjaChpbnB1dFZhbHVlLCBjdXJyZW50UGFnZSAtIDEpO1xuICAgIH1cbiAgfVxuXG5cbiAgY29uc3QgaGFuZGxlTmV4dFBhZ2UgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChoYXNOZXh0UGFnZSkge1xuICAgICAgdHJpZ2dlclBhcmVudEZldGNoKGlucHV0VmFsdWUsIGN1cnJlbnRQYWdlICsgMSk7XG4gICAgfVxuICB9XG5cblxuICAvLyAtLS0gSGFuZGxlcnMgLS0tXG4gIGNvbnN0IGhhbmRsZUlucHV0ID0gKGUpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHNldFNlbGVjdGVkSXRlbShudWxsKTtcbiAgICBzZXRDdXJyZW50UGFnZSgxKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dC1jaGFuZ2UnLCB7IFxuICAgICAgZGV0YWlsOiB7IHZhbHVlLCBpdGVtOiBudWxsIH0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gICAgXG4gICAgZGVib3VuY2VkRmV0Y2godmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZSkgPT4ge1xuICAgIGlmIChvcHRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIFxuICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0SXNMaXN0T3Blbih0cnVlKTtcbiAgICAgICAgc2V0QWN0aXZlSW5kZXgoaW5kZXggPT4gKGluZGV4ICsgMSkgJSBvcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0SXNMaXN0T3Blbih0cnVlKTtcbiAgICAgICAgc2V0QWN0aXZlSW5kZXgoaW5kZXggPT4gKGluZGV4IC0gMSArIG9wdGlvbnMubGVuZ3RoKSAlIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA+PSAwICYmIGlzTGlzdE9wZW4pIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgc2VsZWN0SXRlbShvcHRpb25zW2FjdGl2ZUluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBzZXRJc0xpc3RPcGVuKGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gICAgLy8gU2Nyb2xsIGFjdGl2ZSBpdGVtIGludG8gdmlld1xuICBjb25zdCBzY3JvbGxUb0FjdGl2ZUl0ZW0gPSAoaW5kZXgpID0+IHtcbiAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBlbnN1cmUgRE9NIGhhcyB1cGRhdGVkXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5xdWVyeVNlbGVjdG9yKGAuYXV0b2NvbXBsZXRlLW9wdGlvblthcmlhLXNlbGVjdGVkPVwidHJ1ZVwiXWApO1xuICAgICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgYWN0aXZlSXRlbS5zY3JvbGxJbnRvVmlldyh7IFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJywgXG4gICAgICAgICAgYmxvY2s6ICduZWFyZXN0JyBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQnV0dG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSAhaXNMaXN0T3BlbjtcbiAgICBzZXRJc0xpc3RPcGVuKG5ld1N0YXRlKTtcbiAgICBpZiAobmV3U3RhdGUgJiYgaW5wdXRFbGVtZW50KSB7XG4gICAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrID0gKGl0ZW0pID0+IHtcbiAgICBzZWxlY3RJdGVtKGl0ZW0pO1xuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIC5hdXRvY29tcGxldGUtd3JhcHBlciB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtd3JhcHBlciBmaWVsZHNldC5ncmlkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgICAgZ2FwOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLWlucHV0IHtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXRvZ2dsZSB7XG4gICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgIHBhZGRpbmc6IDAuNXJlbSAwLjc1cmVtO1xuICAgICAgICBtaW4td2lkdGg6IDNyZW07XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLWRyb3Bkb3duIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDEwMCU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgICBib3JkZXI6IHZhcigtLXBpY28tYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXBpY28tYm9yZGVyLXJhZGl1cyk7XG4gICAgICAgIG1hcmdpbi10b3A6IDAuMjVyZW07XG4gICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4O1xuICAgICAgICB6LWluZGV4OiA5OTtcbiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tcGljby1ib3gtc2hhZG93KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb25zIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW0gMXJlbTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IpO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMXMgZWFzZTtcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb246bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtb3B0aW9uOmhvdmVyLFxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb24uYWN0aXZlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGljby1zZWNvbmRhcnktYmFja2dyb3VuZCk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtb3B0aW9uW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGljby1wcmltYXJ5LWJhY2tncm91bmQpO1xuICAgICAgICBjb2xvcjogdmFyKC0tcGljby1wcmltYXJ5LWludmVyc2UpO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24ge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IpO1xuICAgICAgICBwYWRkaW5nOiAwLjc1cmVtIDFyZW07XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGljby1jYXJkLWJhY2tncm91bmQtY29sb3IpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tcGljby1ib3JkZXItcmFkaXVzKSB2YXIoLS1waWNvLWJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24taW5mbyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1waWNvLW11dGVkLWNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uLWNvbnRyb2xzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbiBidXR0b24ge1xuICAgICAgICBwYWRkaW5nOiAwLjI1cmVtIDAuNzVyZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uIGJ1dHRvbjpkaXNhYmxlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1zZWxlY3RlZCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tdG9wOiAwLjVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1waWNvLW11dGVkLWNvbG9yKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPiBcblxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj4ke2xhYmVsfTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS13cmFwcGVyXCI+XG4gICAgICA8ZmllbGRzZXQgY2xhc3M9XCJncmlkXCIgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgIDxpbnB1dCBcbiAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1pbnB1dFwiIFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXG4gICAgICAgICAgcm9sZT1cImNvbWJvYm94XCIgXG4gICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJib3RoXCIgXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD0ke2lzTGlzdE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgICAgIGFyaWEtbGFiZWw9JHtsYWJlbH1cbiAgICAgICAgICAudmFsdWU9JHtpbnB1dFZhbHVlfVxuICAgICAgICAgIEBpbnB1dD0ke2hhbmRsZUlucHV0fVxuICAgICAgICAgIEBrZXlkb3duPSR7aGFuZGxlS2V5RG93bn1cbiAgICAgICAgICBAYmx1cj0keygpID0+IHNldElzTGlzdE9wZW4oZmFsc2UpfVxuICAgICAgICAgIEBmb2N1cz0keygpID0+IHNldElzTGlzdE9wZW4odHJ1ZSl9XG4gICAgICAgICAgJHtyZWYoc2V0SW5wdXRFbGVtZW50KX1cbiAgICAgICAgPlxuICAgICAgICBcbiAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtdG9nZ2xlXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiVG9nZ2xlIHN1Z2dlc3Rpb25zIGxpc3RcIiBcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPSR7aXNMaXN0T3BlbiA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgQGNsaWNrPSR7aGFuZGxlQnV0dG9uQ2xpY2t9XG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICAgICAgICA8cG9seWdvbiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJhcnJvd1wiIFxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwXCIgXG4gICAgICAgICAgICAgIGZpbGwtb3BhY2l0eT1cIjAuNzVcIiBcbiAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRjb2xvclwiIFxuICAgICAgICAgICAgICBwb2ludHM9XCIzLDYgMTUsNiA5LDE0XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgke2lzTGlzdE9wZW4gPyAnMTgwZGVnJyA6ICcwZGVnJ30pOyB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlOyB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycztcIlxuICAgICAgICAgICAgPjwvcG9seWdvbj5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICAgXG4gICAgICAke2lzTGlzdE9wZW4gJiYgb3B0aW9ucy5sZW5ndGggPiAwID8gaHRtbGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1kcm9wZG93blwiPlxuICAgICAgICAgIDx1bCBcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCIgXG4gICAgICAgICAgICBhcmlhLWxhYmVsPSR7bGFiZWx9XG4gICAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1vcHRpb25zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAke29wdGlvbnMubWFwKChpdGVtLCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPGxpIFxuICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgIGFyaWEtc2VsZWN0ZWQ9JHtpbmRleCA9PT0gYWN0aXZlSW5kZXggPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHsoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGhhbmRsZVN1Z2dlc3Rpb25DbGljayhpdGVtKTsgfX1cbiAgICAgICAgICAgICAgICBAbW91c2VvdmVyPSR7KCkgPT4gc2V0QWN0aXZlSW5kZXgoaW5kZXgpfVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLW9wdGlvbiAke2luZGV4ID09PSBhY3RpdmVJbmRleCA/ICdhY3RpdmUnIDogJyd9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICR7aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIGApfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgXG4gICAgICAgICAgJHtvcHRpb25zTWV0YWRhdGE/LnRvdGFsX2l0ZW1zID4gcGFnZVNpemUgPyBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24taW5mb1wiPlxuICAgICAgICAgICAgICAgIFNob3dpbmcgJHtvcHRpb25zTWV0YWRhdGE/LnBhZ2V9LSR7b3B0aW9uc01ldGFkYXRhPy50b3RhbF9wYWdlc30gb2YgJHtvcHRpb25zTWV0YWRhdGE/LnRvdGFsX2l0ZW1zfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdXRvY29tcGxldGUtcGFnaW5hdGlvbi1jb250cm9sc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHtoYW5kbGVQcmV2UGFnZX1cbiAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0keyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBwYWdlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBQcmV2aW91c1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIEBtb3VzZWRvd249JHtoYW5kbGVOZXh0UGFnZX1cbiAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0keyFoYXNOZXh0UGFnZX1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IHBhZ2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIE5leHRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYCA6ICcnfVxuICAgICAgXG4gICAgICAke3NlbGVjdGVkSXRlbSA/IGh0bWxgPHNtYWxsIGNsYXNzPVwiYXV0b2NvbXBsZXRlLXNlbGVjdGVkXCI+U2VsZWN0ZWQ6ICR7c2VsZWN0ZWRJdGVtLmxhYmVsfTwvc21hbGw+YCA6ICcnfVxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICdjaXYtYXV0b2NvbXBsZXRlLXNlbGVjdCcsXG4gIGNvbXBvbmVudChBdXRvY29tcGxldGVTZWxlY3QsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KVxuKTsiLCJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBQZW9wbGVMaXN0KHsgbG9jYWwgPSBbXSB9KSB7XG4gICAgY29uc3QgcGVvcGxlID0gbG9jYWw7XG5cbiAgICBjb25zdCBoYXNTdWJkaXZpc2lvbiA9IChwZXJzb24pID0+IHtcbiAgICAgICAgY29uc3QgZGl2aXNpb25PY2RpZCA9IHBlcnNvbi5vZmZpY2UuZGl2aXNpb25fb2NkaWQgfHwgXCJcIjtcbiAgICAgICAgaWYgKGRpdmlzaW9uT2NkaWQuaW5jbHVkZXMoXCJkaXN0cmljdFwiKSB8fCBkaXZpc2lvbk9jZGlkLmluY2x1ZGVzKFwid2FyZFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFN1YmRpdmlzaW9uTGFiZWwgPSAocGVyc29uKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpdmlzaW9uT2NkaWQgPSBwZXJzb24ub2ZmaWNlLmRpdmlzaW9uX29jZGlkIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gZGl2aXNpb25PY2RpZC5zcGxpdChcIi9cIik7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKHBhcnQuc3RhcnRzV2l0aChcImNvdW5jaWxfZGlzdHJpY3Q6XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBEaXN0cmljdCAke3BhcnQuc3BsaXQoXCI6XCIpWzFdfWA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQuc3RhcnRzV2l0aChcIndhcmQ6XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBXYXJkICR7cGFydC5zcGxpdChcIjpcIilbMV19YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBcblxuICAgIGNvbnN0IHN1YkRpdmlzaW9uID0gKHBlcnNvbikgPT4ge1xuICAgICAgICBpZiAoaGFzU3ViZGl2aXNpb24ocGVyc29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2dldFN1YmRpdmlzaW9uTGFiZWwocGVyc29uKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFNvdXJjZXMgPSAoc291cmNlcykgPT4ge1xuICAgICAgICBpZiAoIXNvdXJjZXMgfHwgc291cmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sYDxzbWFsbD5ObyBTb3VyY2VzPC9zbWFsbD5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJsaW5lLWhlaWdodDogMS4yOyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgICAke3NvdXJjZXMubWFwKChzb3VyY2UsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICA8YSBcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIke3NvdXJjZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCIke3NvdXJjZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwLjI1cmVtO1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFske2luZGV4ICsgMX1dXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICBgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgIH07XG5cbiAgICBpZiAoIXBlb3BsZSB8fCBwZW9wbGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBodG1sYDxwIHJvbGU9XCJhbGVydFwiPk5vIHBlb3BsZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhpcyBqdXJpc2RpY3Rpb24uPC9wPmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPGZpZ3VyZT5cbiAgICAgICAgPHRhYmxlIHJvbGU9XCJncmlkXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMSU7XCI+UGhvdG88L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTUlO1wiPk9mZmljaWFsPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDE1JVwiPkNvbnRhY3Q8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICR7cGVvcGxlLm1hcChwZXJzb24gPT4gaHRtbGBcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtbGFiZWw9XCJQaG90b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGVyc29uLmNkbl9pbWFnZSB8fCBwZXJzb24uaW1hZ2UgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiJHtwZXJzb24uY2RuX2ltYWdlIHx8IHBlcnNvbi5pbWFnZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIlBob3RvIG9mICR7cGVyc29uLm5hbWV9XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcj1cInRoaXMub25lcnJvcj1udWxsOyB0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnOyB0aGlzLmNsb3Nlc3QoJ3RkJykucXVlcnlTZWxlY3RvcignLmZhbGxiYWNrLWljb24nKS5zdHlsZS5kaXNwbGF5PSdpbmxpbmUtYmxvY2snO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWxsYmFjay1pY29uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyB3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4OyBsaW5lLWhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTsgY29sb3I6IHZhcigtLXBpY28tc2Vjb25kYXJ5LWhvdmVyLWNvbG9yKTtcIj7wn5GkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgOiBodG1sYDxzcGFuIGNsYXNzPVwiZmFsbGJhY2staWNvblwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgbGluZS1oZWlnaHQ6IDUwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyLXJhZGl1czogNTAlOyBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7IGNvbG9yOiB2YXIoLS1waWNvLXNlY29uZGFyeS1ob3Zlci1jb2xvcik7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIj7wn5GkPC9zcGFuPmB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1sYWJlbD1cIk9mZmljaWFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz4ke3BlcnNvbi5uYW1lfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPiR7cGVyc29uLm9mZmljZSAmJiBwZXJzb24ub2ZmaWNlLm5hbWV9PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3N1YkRpdmlzaW9uKHBlcnNvbil9PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWxhYmVsPVwiQ29udGFjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGVyc29uLmVtYWlscyA/IGh0bWxgPGEgaHJlZj1cIm1haWx0bzoke3BlcnNvbi5lbWFpbHMuam9pbignLCcpfVwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+JHtwZXJzb24uZW1haWxzLmpvaW4oJywnKX08L2E+YCA6ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGVyc29uLnBob25lcyA/IGh0bWxgPGEgaHJlZj1cInRlbDoke3BlcnNvbi5waG9uZXMuam9pbignLCcpfVwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+JHtwZXJzb24ucGhvbmVzLmpvaW4oJywnKX08L2E+YCA6ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGVyc29uLnVybHMgPyBodG1sYDxhIGhyZWY9XCIke3BlcnNvbi51cmxzLmpvaW4oJywnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInNlY29uZGFyeVwiPkxpbms8L2E+YCA6ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICBgKX1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgPC9maWd1cmU+XG4gICAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1wZW9wbGUtbGlzdFwiLFxuICBjb21wb25lbnQoUGVvcGxlTGlzdCwgeyB1c2VTaGFkb3dET006IGZhbHNlLCBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtdIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcblxuZnVuY3Rpb24gTW9kYWwoe1xuICB0aXRsZSA9IFwiXCIsXG4gIGNvbnRlbnQgPSBudWxsLCAvLyBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0IG9yIG51bGxcbiAgZm9vdGVyID0gbnVsbCwgLy8gYSBsaXQtaHRtbCBUZW1wbGF0ZVJlc3VsdCBvciBudWxsXG4gIG1vZGFsUHJvcHMgPSB7fSwgLy8geyBvcGVuLCBvbkNsb3NlLCBtb2RhbFJlZiwgY2xvc2VPbkJhY2tkcm9wQ2xpY2sgPSB0cnVlLCBhcmlhTGFiZWwgfVxufSkge1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShCb29sZWFuKG1vZGFsUHJvcHMub3BlbikpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldE9wZW4oQm9vbGVhbihtb2RhbFByb3BzLm9wZW4pKTtcbiAgfSwgW21vZGFsUHJvcHMub3Blbl0pO1xuXG4gIGxldCBkaWFsb2dFbCA9IG51bGw7XG4gIGNvbnN0IHNldERpYWxvZ1JlZiA9IChlbCkgPT4ge1xuICAgIGRpYWxvZ0VsID0gZWw7XG4gICAgLy8gcHJvcGFnYXRlIHRvIGFueSByZWYgcGFzc2VkIGluIG1vZGFsUHJvcHMgKHN1cHBvcnRzIGNhbGxiYWNrIG9yIG9iamVjdCByZWYpXG4gICAgaWYgKCFtb2RhbFByb3BzLm1vZGFsUmVmKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBtb2RhbFByb3BzLm1vZGFsUmVmID09PSBcImZ1bmN0aW9uXCIpIG1vZGFsUHJvcHMubW9kYWxSZWYoZWwpO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBtb2RhbFByb3BzLm1vZGFsUmVmID09PSBcIm9iamVjdFwiKSBtb2RhbFByb3BzLm1vZGFsUmVmLnZhbHVlID0gZWw7XG4gIH07XG5cbiAgY29uc3Qgb25LZXkgPSAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgbW9kYWxQcm9wcy5vbkNsb3NlICYmIG1vZGFsUHJvcHMub25DbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIGZvY3VzIHRoZSBkaWFsb2cgc28gaXQgcmVjZWl2ZXMga2V5IGV2ZW50cyB3aGVuIG9wZW5lZFxuICAgIGlmIChvcGVuICYmIGRpYWxvZ0VsICYmIHR5cGVvZiBkaWFsb2dFbC5mb2N1cyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBkaWFsb2dFbC5mb2N1cygpO1xuICAgIH1cbiAgfSwgW29wZW5dKTtcblxuICBjb25zdCBiYWNrZHJvcENsaWNrID0gKGUpID0+IHtcbiAgICBpZiAoIW1vZGFsUHJvcHMuY2xvc2VPbkJhY2tkcm9wQ2xpY2sgJiYgbW9kYWxQcm9wcy5jbG9zZU9uQmFja2Ryb3BDbGljayAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gY2xpY2sgb24gZGlhbG9nIChjaGlsZCkgc2hvdWxkbid0IGNsb3NlOyBjbGljayBvbiBiYWNrZHJvcCAoZGlhbG9nIGVsZW1lbnQpIHNob3VsZFxuICAgIGlmIChlLnRhcmdldCAmJiBlLnRhcmdldC50YWdOYW1lICYmIGUudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJkaWFsb2dcIikge1xuICAgICAgbW9kYWxQcm9wcy5vbkNsb3NlICYmIG1vZGFsUHJvcHMub25DbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8ZGlhbG9nXG4gICAgICA/b3Blbj0ke29wZW59XG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgIGFyaWEtbGFiZWw9JHttb2RhbFByb3BzLmFyaWFMYWJlbCB8fCB0aXRsZSB8fCBcIk1vZGFsXCJ9XG4gICAgICBAY2xpY2s9JHtiYWNrZHJvcENsaWNrfVxuICAgICAgQGtleWRvd249JHtvbktleX1cbiAgICAgICR7cmVmKHNldERpYWxvZ1JlZil9XG4gICAgPlxuICAgICAgPGFydGljbGUgQGNsaWNrPSR7KGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9PlxuICAgICAgICAke3RpdGxlXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8aGVhZGVyPlxuICAgICAgICAgICAgICAgIDxoMj4ke3RpdGxlfTwvaDI+XG4gICAgICAgICAgICAgIDwvaGVhZGVyPlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogbnVsbH1cblxuICAgICAgICA8c2VjdGlvbj5cbiAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAke2Zvb3RlclxuICAgICAgICAgID8gaHRtbGAgPGZvb3Rlcj4ke2Zvb3Rlcn08L2Zvb3Rlcj4gYFxuICAgICAgICAgIDogaHRtbGBcbiAgICAgICAgICAgICAgPGZvb3Rlcj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIEBjbGljaz0ke21vZGFsUHJvcHMub25DbG9zZX0gY2xhc3M9XCJzZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgIGB9XG4gICAgICA8L2FydGljbGU+XG4gICAgPC9kaWFsb2c+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJjaXYtbW9kYWxcIixcbiAgY29tcG9uZW50KE1vZGFsLCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSksXG4pO1xuIiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCBcIi4uL21vZGFsLmpzXCI7XG5cbmNvbnN0IERVTU1ZX0RBVEEgPSBbXG4gIHsgaWQ6IDEsIG5hbWU6IFwiU2NyYXBlIEpvYiAxXCIsIHN0YXR1czogXCJDb21wbGV0ZWRcIiwgc3RhcnRfZGF0ZTogXCIyMDI0LTAxLTAxXCIsIGR1cmF0aW9uX2luX3M6IDEyMCwgXG4gICAgICAgIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS8yXCJdLCBwcm9ncmVzczogMTAwIH0sXG4gIHsgaWQ6IDIsIG5hbWU6IFwiU2NyYXBlIEpvYiAyXCIsIHN0YXR1czogXCJJbiBQcm9ncmVzc1wiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDJcIiwgZHVyYXRpb25faW5fczogMTUwLCBzb3VyY2VfdXJsczogW1wiaHR0cHM6Ly9leGFtcGxlLm9yZ1wiXSwgcHJvZ3Jlc3M6IDUwIH0sXG4gIHsgaWQ6IDMsIG5hbWU6IFwiU2NyYXBlIEpvYiAzXCIsIHN0YXR1czogXCJGYWlsZWRcIiwgc3RhcnRfZGF0ZTogXCIyMDI0LTAxLTAzXCIsIGR1cmF0aW9uX2luX3M6IDkwLCBzb3VyY2VfdXJsczogW10sIHByb2dyZXNzOiAwIH0sXG5dO1xuXG5mdW5jdGlvbiByZW5kZXJQcm9ncmVzc0Jhcihwcm9ncmVzcykge1xuICBpZiAocHJvZ3Jlc3MgPT09IDEwMCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBodG1sYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICA8cHJvZ3Jlc3MgdmFsdWU9JHtwcm9ncmVzcyA/PyAwfSBtYXg9XCIxMDBcIj5cbiAgICAgICAgJHtwcm9ncmVzcyA/PyAwfSVcbiAgICAgIDwvcHJvZ3Jlc3M+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmZ1bmN0aW9uIFNjcmFwZUhpc3RvcnlMaXN0KHsgaGlzdG9yeSwgam9iU3RhdHVzIH0pIHtcbiAgLy8gVXNlIGhpc3RvcnkgYXMgYW4gb2JqZWN0L2FycmF5IGRpcmVjdGx5IChubyBwYXJzaW5nIGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSlcbiAgY29uc3QgaGlzdG9yeURhdGEgPSBKU09OLnBhcnNlKGhpc3RvcnkpXG4gIGxldCBwYXJzZWRIaXN0b3J5ID0gaGlzdG9yeURhdGFbXCJkYXRhXCJdXG5cbiAgLy8gSWYgam9iU3RhdHVzIGlzIHByZXNlbnQgYW5kIG1hdGNoZXMgYSBqb2IsIHVwZGF0ZSB0aGF0IGpvYidzIHByb2dyZXNzL3N0YXR1c1xuICBpZiAoam9iU3RhdHVzICYmIGpvYlN0YXR1cy5yZXF1ZXN0X2lkKSB7XG4gICAgcGFyc2VkSGlzdG9yeSA9IHBhcnNlZEhpc3RvcnkubWFwKGpvYiA9PlxuICAgICAgam9iLnJlcXVlc3RfaWQgPT09IGpvYlN0YXR1cy5yZXF1ZXN0X2lkXG4gICAgICAgID8geyAuLi5qb2IsIHByb2dyZXNzOiBqb2JTdGF0dXMucHJvZ3Jlc3MsIHN0YXR1czogam9iU3RhdHVzLnN0YXR1cyB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZEpvYiwgc2V0U2VsZWN0ZWRKb2JdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgY29uc3Qgb3BlbkZvciA9IChqb2IpID0+IHtcbiAgICBzZXRTZWxlY3RlZEpvYihqb2IpO1xuICAgIHNldE1vZGFsT3Blbih0cnVlKTtcbiAgfTtcbiAgY29uc3QgY2xvc2VNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRNb2RhbE9wZW4oZmFsc2UpO1xuICAgIHNldFNlbGVjdGVkSm9iKG51bGwpO1xuICB9O1xuXG4gIGNvbnN0IGZtdERhdGUgPSAoZCkgPT4ge1xuICAgIGlmICghZCkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcCA9IG5ldyBEYXRlKGQpO1xuICAgIGlmIChpc05hTihwKSkgcmV0dXJuIFN0cmluZyhkKTtcbiAgICByZXR1cm4gYCR7U3RyaW5nKHAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtTdHJpbmcocC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtwLmdldEZ1bGxZZWFyKCl9YDtcbiAgfTtcblxuICBjb25zdCBnZXREdXJhdGlvblN0cmluZyA9IChjcmVhdGVkX2F0LCB1cGRhdGVkX2F0KSA9PiB7XG4gICAgY29uc3QgZHVyYXRpb24gPSAobmV3IERhdGUodXBkYXRlZF9hdCkgLSBuZXcgRGF0ZShjcmVhdGVkX2F0KSkgLyAxMDAwO1xuICAgIC8vIEZyaWVuZGx5IGZvcm1hdHRpbmcgdG8gbWludXRlcywgc2Vjb25kcyByb3VuZGVkXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZHVyYXRpb24gLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IE1hdGgucm91bmQoZHVyYXRpb24gJSA2MCk7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHN9c2A7XG4gIH1cblxuICBjb25zdCBtb2RhbENvbnRlbnQgPSBzZWxlY3RlZEpvYlxuICAgID8gaHRtbGA8ZGl2PlxuICAgICAgICA8cD48c3Ryb25nPkRhdGUgLyBUaW1lOjwvc3Ryb25nPiAke2ZtdERhdGUoc2VsZWN0ZWRKb2IuY3JlYXRlZF9hdCl9PC9wPlxuICAgICAgICA8cD48c3Ryb25nPlN0YXR1czo8L3N0cm9uZz4gJHtzZWxlY3RlZEpvYi5zdGF0dXN9PC9wPlxuICAgICAgICA8cD48c3Ryb25nPlByb2dyZXNzOjwvc3Ryb25nPiAke3NlbGVjdGVkSm9iLnByb2dyZXNzID8/IFwiP1wifSU8L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+VGltZSB0byBzY3JhcGU6PC9zdHJvbmc+ICR7Z2V0RHVyYXRpb25TdHJpbmcoc2VsZWN0ZWRKb2IuY3JlYXRlZF9hdCwgc2VsZWN0ZWRKb2IudXBkYXRlZF9hdCl9PC9wPlxuICAgICAgICA8cD48c3Ryb25nPlVSTHMgc2NyYXBlZDo8L3N0cm9uZz48L3A+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICAke3NlbGVjdGVkSm9iLnNvdXJjZV91cmxzICYmIHNlbGVjdGVkSm9iLnNvdXJjZV91cmxzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gc2VsZWN0ZWRKb2Iuc291cmNlX3VybHMubWFwKCh1cmwpID0+IGh0bWxgPGxpPjxhIGhyZWY9XCIke3VybH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPiR7dXJsfTwvYT48L2xpPmApXG4gICAgICAgICAgICA6IGh0bWxgPGxpPjxlbT5ObyBzb3VyY2UgVVJMczwvZW0+PC9saT5gfVxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+YFxuICAgIDogbnVsbDtcblxuICBpZiAoIXBhcnNlZEhpc3RvcnkgfHwgcGFyc2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaHRtbGA8cD5ObyBzY3JhcGUgaGlzdG9yeSBhdmFpbGFibGUuPC9wPmA7XG4gIH1cblxuICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGU+XG4gICAgICB1bC5saXN0IHsgXG4gICAgICAgIHBhZGRpbmc6IDA7IFxuICAgICAgICBtYXJnaW46IDA7IFxuICAgICAgICBtYXgtaGVpZ2h0OiAzMDBweDsgLyogU2V0IHlvdXIgZGVzaXJlZCBtYXggaGVpZ2h0ICovXG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87ICAvKiBFbmFibGUgdmVydGljYWwgc2Nyb2xsaW5nICovXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDFyZW07IC8qIEFkZCBzcGFjZSBiZXR3ZWVuIHNjcm9sbGJhciBhbmQgY29udGVudCAqL1xuICAgICAgfVxuICAgICAgdWwgbGkgeyBsaXN0LXN0eWxlOiBub25lOyBtYXJnaW46IDA7IH1cbiAgICAgIC5pdGVtIHsgcGFkZGluZzogMC41cmVtIDA7IH1cbiAgICAgIC5yb3cgeyBkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciBhdXRvOyBnYXA6IDAuNzVyZW07IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH1cbiAgICAgIC5idG4geyBhbGw6IHVuc2V0OyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH1cbiAgICAgIC5waWxsIHsgZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogMC4yNXJlbSAwLjVyZW07IGJvcmRlci1yYWRpdXM6IDk5OXB4OyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMDQpOyBmb250LXNpemU6IDAuOXJlbTsgfVxuICAgICAgLnBpbGwuY29tcGxldGVkIHsgYmFja2dyb3VuZDogI2U2ZjllYTsgY29sb3I6ICMxMTdhMmQ7IH1cbiAgICAgIC5waWxsLmluLXByb2dyZXNzIHsgYmFja2dyb3VuZDogI2ZmZjdlNjsgY29sb3I6ICM5OTY2MGI7IH1cbiAgICAgIC5waWxsLmZhaWxlZCB7IGJhY2tncm91bmQ6ICNmZmVjZWM7IGNvbG9yOiAjOWIxZjFmOyB9XG4gICAgICAucHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciB7IG1hcmdpbi10b3A6IDAuNXJlbTsgfVxuICAgICAgcHJvZ3Jlc3MgeyB3aWR0aDogMTAwJTsgfVxuICAgIDwvc3R5bGU+XG5cbiAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAke3BhcnNlZEhpc3RvcnkubWFwKFxuICAgICAgICAoam9iKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzQ2xhc3MgPSBqb2Iuc3RhdHVzID8gam9iLnN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgXCItXCIpIDogXCJcIjtcbiAgICAgICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgQGNsaWNrPSR7KCkgPT4gb3BlbkZvcihqb2IpfT5cbiAgICAgICAgICAgICAgICAgICR7Zm10RGF0ZShqb2IuY3JlYXRlZF9hdCl9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz1cInBpbGwgJHtzdGF0dXNDbGFzc31cIj4ke2pvYi5zdGF0dXN9PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgJHtyZW5kZXJQcm9ncmVzc0Jhcihqb2IucHJvZ3Jlc3MpfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICApfVxuICAgIDwvdWw+XG5cbiAgICA8aHIgLz5cblxuICAgIDxjaXYtbW9kYWxcbiAgICAgIC50aXRsZT0ke1wiU2NyYXBlIERldGFpbHNcIn1cbiAgICAgIC5jb250ZW50PSR7bW9kYWxDb250ZW50fVxuICAgICAgLm1vZGFsUHJvcHM9JHt7IG9wZW46IG1vZGFsT3Blbiwgb25DbG9zZTogY2xvc2VNb2RhbCwgY2xvc2VPbkJhY2tkcm9wQ2xpY2s6IHRydWUgfX1cbiAgICA+PC9jaXYtbW9kYWw+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcImNpdi1zY3JhcGUtaGlzdG9yeS1saXN0XCIsIGNvbXBvbmVudChTY3JhcGVIaXN0b3J5TGlzdCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pKTsiLCJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5jb25zdCBEdW1teVNjcmFwZUpvYkluZm8gPSB7XG4gICAgY3JlYXRlZF9hdDogXCIyMDI0LTA2LTAxVDEyOjAwOjAwWlwiLFxuICAgIHN0YXR1czogXCJBY2NlcHRlZFwiLFxuICAgIGR1cmF0aW9uX2luX3M6IDM2MCxcbiAgICBzb3VyY2VfdXJsczogW1wiaHR0cHM6Ly9leGFtcGxlLmNvbVwiLCBcImh0dHBzOi8vZXhhbXBsZS5vcmdcIl0sXG59XG5cbmZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKHNlY29uZHMpIHtcbiAgICBpZiAoc2Vjb25kcyA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gMzYwMCk7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKHNlY29uZHMgJSAzNjAwKSAvIDYwKTtcbiAgICBjb25zdCBzID0gc2Vjb25kcyAlIDYwO1xuICAgIHJldHVybiBbXG4gICAgICAgIGggPyBgJHtofWhgIDogbnVsbCxcbiAgICAgICAgbSA/IGAke219bWAgOiBudWxsLFxuICAgICAgICBgJHtzfXNgXG4gICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG59XG5cbmZ1bmN0aW9uIFNjcmFwZURldGFpbHMoeyBkZXRhaWwgPSBEdW1teVNjcmFwZUpvYkluZm8gfSkge1xuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGRldGFpbD8uY3JlYXRlZF9hdCA/IG5ldyBEYXRlKGRldGFpbC5jcmVhdGVkX2F0KSA6IG51bGw7XG4gICAgY29uc3QgZm9ybWF0dGVkQ3JlYXRlZEF0ID0gY3JlYXRlZEF0ID8gY3JlYXRlZEF0LnRvTG9jYWxlU3RyaW5nKCkgOiBcIlwiO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gZm9ybWF0RHVyYXRpb24oZGV0YWlsPy5kdXJhdGlvbl9pbl9zKTtcbiAgICBjb25zdCB1cmxzID0gZGV0YWlsPy5zb3VyY2VfdXJscyB8fCBbXTtcblxuICAgIHJldHVybiBodG1sYFxuICAgIDxhcnRpY2xlIGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICA8Zm9ybT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8c3Bhbj5EYXRlIC8gVGltZTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtmb3JtYXR0ZWRDcmVhdGVkQXR9XCIgcmVhZG9ubHkgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPHNwYW4+U3RhdHVzPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2RldGFpbD8uc3RhdHVzIHx8IFwiXCJ9XCIgcmVhZG9ubHkgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgPHNwYW4+VGltZSB0byBzY3JhcGU8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZHVyYXRpb259JHtkZXRhaWw/LmR1cmF0aW9uX2luX3MgIT0gbnVsbCA/IGAgKCR7ZGV0YWlsLmR1cmF0aW9uX2luX3N9cylgIDogXCJcIn1cIiByZWFkb25seSAvPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgIDxoND5VUkxzIHNjcmFwZWQ8L2g0PlxuICAgICAgICAgICR7dXJscy5sZW5ndGhcbiAgICAgICAgICAgID8gaHRtbGA8dWw+XG4gICAgICAgICAgICAgICAgJHt1cmxzLm1hcChcbiAgICAgICAgICAgICAgICAgIHUgPT4gaHRtbGA8bGk+PGEgaHJlZj1cIiR7dX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPiR7dX08L2E+PC9saT5gXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5gXG4gICAgICAgICAgICA6IGh0bWxgPHA+PGVtPk5vIHNvdXJjZSBVUkxzPC9lbT48L3A+YH1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9mb3JtPlxuICAgIDwvYXJ0aWNsZT5cbiAgICBgXG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnc2NyYXBlLWRldGFpbHMnLCBjb21wb25lbnQoU2NyYXBlRGV0YWlscykpOyIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSBcImxpdC1odG1sL2RpcmVjdGl2ZXMvcmVmLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VNb2RhbChpbml0aWFsT3BlbiA9IGZhbHNlKSB7XG4gIGNvbnN0IFtpc09wZW4sIHNldElzT3Blbl0gPSB1c2VTdGF0ZShpbml0aWFsT3Blbik7XG4gIGNvbnN0IG1vZGFsUmVmID0gY3JlYXRlUmVmKCk7XG5cbiAgY29uc3Qgb3Blbk1vZGFsID0gKCkgPT4gc2V0SXNPcGVuKHRydWUpO1xuICBjb25zdCBjbG9zZU1vZGFsID0gKCkgPT4gc2V0SXNPcGVuKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc09wZW4gJiYgbW9kYWxSZWYudmFsdWUpIHtcbiAgICAgIC8vIEZvY3VzIHRoZSBtb2RhbCB3aGVuIGl0IG9wZW5zXG4gICAgICBtb2RhbFJlZi52YWx1ZS5mb2N1cygpO1xuICAgIH1cbiAgfSwgW2lzT3Blbl0pO1xuXG4gIC8vIEhhbmRsZSBlc2NhcGUga2V5IHdpdGggZG9jdW1lbnQgbGlzdGVuZXJcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiBpc09wZW4pIHtcbiAgICAgICAgY2xvc2VNb2RhbCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICBcbiAgICAgIC8vIENsZWFudXAgZnVuY3Rpb24gLSBydW5zIHdoZW4gaXNPcGVuIGNoYW5nZXMgdG8gZmFsc2Ugb3IgY29tcG9uZW50IHVubW91bnRzXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2lzT3BlbiwgY2xvc2VNb2RhbF0pO1xuXG4gIC8vIEhhbmRsZSBjbGljayBvdXRzaWRlIG1vZGFsXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAobW9kYWxSZWYudmFsdWUgJiYgIW1vZGFsUmVmLnZhbHVlLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiYgaXNPcGVuKSB7XG4gICAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGlzT3Blbikge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2tPdXRzaWRlKTtcbiAgICAgIFxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2tPdXRzaWRlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbaXNPcGVuLCBjbG9zZU1vZGFsXSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpc09wZW4sXG4gICAgb3Blbk1vZGFsLFxuICAgIGNsb3NlTW9kYWwsXG4gICAgbW9kYWxQcm9wczoge1xuICAgICAgb3BlbjogaXNPcGVuLFxuICAgICAgb25DbG9zZTogY2xvc2VNb2RhbCxcbiAgICAgIG1vZGFsUmVmOiBtb2RhbFJlZlxuICAgIH1cbiAgfTtcbn0iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZVJlZn0gIGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIENpdlNlbGVjdEp1cmlzZGljdGlvbigpIHtcbiAgY29uc3QgW3N0YXRlcywgc2V0U3RhdGVzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2p1cmlzZGljdGlvbnMsIHNldEp1cmlzZGljdGlvbnNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbanVyaXNkaWN0aW9uc01ldGFkYXRhLCBzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGFdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBbc2VsZWN0ZWRTdGF0ZSwgc2V0U2VsZWN0ZWRTdGF0ZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3NlbGVjdGVkSnVyaXNkaWN0aW9uLCBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW2p1cmlzZGljdGlvbklucHV0VmFsdWUsIHNldEp1cmlzZGljdGlvbklucHV0VmFsdWVdID0gdXNlU3RhdGUoXCJcIik7XG5cbiAgY29uc3QgaXNJbml0aWFsTW91bnQgPSB1c2VSZWYodHJ1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNJbml0aWFsTW91bnQuY3VycmVudCkge1xuICAgICAgaXNJbml0aWFsTW91bnQuY3VycmVudCA9IGZhbHNlO1xuICAgICAgcmV0dXJuOyBcbiAgICB9XG4gICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbnNcbiAgICBoYW5kbGVJbnB1dENoYW5nZShzZWxlY3RlZFN0YXRlLCBzZWxlY3RlZEp1cmlzZGljdGlvbik7XG4gIH0sIFtzZWxlY3RlZFN0YXRlLCBzZWxlY3RlZEp1cmlzZGljdGlvbl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBGZXRjaCBzdGF0ZXMgZnJvbSBiYWNrZW5kIHByb3h5IChubyBhdXRoIGhlYWRlciBuZWVkZWQpXG4gICAgZmV0Y2goXCIvYXBpL2FwaV9wcm94eS9qdXJpc2RpY3Rpb25zL3N0YXRlc1wiKVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiBzZXRTdGF0ZXMoZGF0YS5kYXRhIHx8IFtdKSk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldEp1cmlzZGljdGlvbnMoW10pO1xuICAgIHNldEp1cmlzZGljdGlvbnNNZXRhZGF0YSh7fSk7XG4gICAgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24oXCJcIik7XG4gICAgc2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZShcIlwiKTtcblxuICAgIGlmICghc2VsZWN0ZWRTdGF0ZSkgcmV0dXJuO1xuICAgIFxuICAgIC8vIEZldGNoIGp1cmlzZGljdGlvbnMgZm9yIHNlbGVjdGVkIHN0YXRlIChubyBhdXRoIGhlYWRlciBuZWVkZWQpXG4gICAgaGFuZGxlSnVyaXNkaWN0aW9uU3VnZ2VzdGlvbnMoXCJcIik7XG4gIH0sIFtzZWxlY3RlZFN0YXRlXSk7XG5cbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoc3RhdGUsIGp1cmlzZGljdGlvbk9jZGlkKSA9PiB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KFwic2VsZWN0LWp1cmlzZGljdGlvbi1jaGFuZ2VcIiwge1xuICAgICAgICBkZXRhaWw6IHsgc3RhdGUsIGp1cmlzZGljdGlvbl9vY2RpZDoganVyaXNkaWN0aW9uT2NkaWQgfSxcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyA9IChkZXRhaWwpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IGRldGFpbC5xdWVyeSB8fCBcIlwiO1xuICAgIGNvbnN0IHBhZ2UgPSBkZXRhaWwucGFnZSB8fCAxO1xuICAgIGNvbnN0IHBhZ2VTaXplID0gZGV0YWlsLnBhZ2VTaXplIHx8IDI1O1xuICAgIGZldGNoKGAvYXBpL2FwaV9wcm94eS9qdXJpc2RpY3Rpb25zLyR7c2VsZWN0ZWRTdGF0ZX0vc2VhcmNoP3NlYXJjaF9zdHJpbmc9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZsaW1pdD0ke3BhZ2VTaXplfSZwYWdlPSR7cGFnZX1gKVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIHNldEp1cmlzZGljdGlvbnMoZGF0YS5kYXRhIHx8IFtdKTtcbiAgICAgICAgc2V0SnVyaXNkaWN0aW9uc01ldGFkYXRhKHtcbiAgICAgICAgICB0b3RhbF9pdGVtczogZGF0YS50b3RhbF9pdGVtcyxcbiAgICAgICAgICB0b3RhbF9wYWdlczogZGF0YS50b3RhbF9wYWdlcyxcbiAgICAgICAgICBwYWdlOiBkYXRhLnBhZ2UsXG4gICAgICAgICAgbGltaXQ6IGRhdGEubGltaXQsXG4gICAgICAgICAgbGlua3M6IGRhdGEubGlua3NcbiAgICAgICAgfSlcbiAgICAgIH0pOyBcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdENsaWNrID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBqdXJpc2RpY3Rpb25fZGF0YSA9IGp1cmlzZGljdGlvbnMuZmluZChqdXIgPT4ganVyLmlkID09PSBzZWxlY3RlZEp1cmlzZGljdGlvbik7XG4gICAgY29uc3QganVyaXNkaWN0aW9uX29jZGlkX3NsdWcgPSBqdXJpc2RpY3Rpb25fZGF0YVtcImp1cmlzZGljdGlvbl9vY2RpZF9zbHVnXCJdO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYC9qdXJpc2RpY3Rpb25zLyR7anVyaXNkaWN0aW9uX29jZGlkX3NsdWd9YDtcbiAgfVxuXG4gIGNvbnN0IGp1cmlzZGljdGlvbkxpbmsgPSAoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZEp1cmlzZGljdGlvbikgcmV0dXJuIFwiXCI7XG4gICAgaWYgKCFqdXJpc2RpY3Rpb25zKSByZXR1cm4gXCJcIjtcblxuICAgIGNvbnN0IGp1cmlzZGljdGlvbk9jZGlkRm9ybWF0dGVkID0gZW5jb2RlVVJJQ29tcG9uZW50KHNlbGVjdGVkSnVyaXNkaWN0aW9uKVxuICAgIHJldHVybiBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA/IGAvanVyaXNkaWN0aW9ucz9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZH1gIDogXCJcIjtcbiAgfVxuXG4gIHJldHVybiBodG1sYFxuICAgIDxmb3JtIFxuICAgICAgY2xhc3M9XCJncmlkXCIgXG4gICAgICBzdHlsZT1cImdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyOyBnYXA6IDFyZW07XCJcbiAgICAgIG9uc3VibWl0PVwicmV0dXJuIGZhbHNlO1wiXG4gICAgPlxuICAgICAgPGxhYmVsIGZvcj1cInN0YXRlLXNlbGVjdFwiIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+U3RhdGU6PC9sYWJlbD5cbiAgICAgIDxzZWxlY3RcbiAgICAgICAgaWQ9XCJzdGF0ZS1zZWxlY3RcIlxuICAgICAgICAudmFsdWU9JHtzZWxlY3RlZFN0YXRlfVxuICAgICAgICBAY2hhbmdlPSR7KGUpID0+IHNldFNlbGVjdGVkU3RhdGUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICByZXF1aXJlZFxuICAgICAgPlxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGEgc3RhdGU8L29wdGlvbj5cbiAgICAgICAgJHtzdGF0ZXMubWFwKFxuICAgICAgICAgIChzdGF0ZSkgPT4gaHRtbGA8b3B0aW9uIHZhbHVlPSR7c3RhdGV9PiR7c3RhdGV9PC9vcHRpb24+YFxuICAgICAgICApfVxuICAgICAgPC9zZWxlY3Q+XG4gICAgICA8Y2l2LWF1dG9jb21wbGV0ZS1zZWxlY3RcbiAgICAgICAgaWQ9XCJqdXJpc2RpY3Rpb24tYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgLmRpc2FibGVkPSR7IXNlbGVjdGVkU3RhdGV9XG4gICAgICAgIC5pbnB1dFZhbHVlPSR7anVyaXNkaWN0aW9uSW5wdXRWYWx1ZX1cbiAgICAgICAgLm9wdGlvbnM9JHtqdXJpc2RpY3Rpb25zLm1hcChqdXIgPT4gKHsgbGFiZWw6IGp1ci5uYW1lLCB2YWx1ZToganVyLmlkIH0pKX1cbiAgICAgICAgLm9wdGlvbnNNZXRhZGF0YT0ke2p1cmlzZGljdGlvbnNNZXRhZGF0YX1cbiAgICAgICAgLnBhZ2VTaXplPSR7MjV9XG4gICAgICAgIEBmZXRjaC1zdWdnZXN0aW9ucz0keyhlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gZS5kZXRhaWw7XG4gICAgICAgICAgaGFuZGxlSnVyaXNkaWN0aW9uU3VnZ2VzdGlvbnMoZGV0YWlsKTtcbiAgICAgICAgfX1cbiAgICAgICAgQGlucHV0LWNoYW5nZT0keyhlKSA9PiB7XG4gICAgICAgICAgY29uc3Qge3ZhbHVlLCBpdGVtfSA9IGUuZGV0YWlsO1xuICAgICAgICAgIHNldEp1cmlzZGljdGlvbklucHV0VmFsdWUodmFsdWUpXG4gICAgICAgICAgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24oaXRlbSA/IGl0ZW0udmFsdWUgOiBcIlwiKTtcbiAgICAgICAgfX1cbiAgICAgICAgQGl0ZW0tc2VsZWN0ZWQ9JHsoZSkgPT4gc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24oZS5kZXRhaWwudmFsdWUpfVxuICAgICAgPjwvY2l2LWF1dG9jb21wbGV0ZS1zZWxlY3Q+XG4gICAgICA8IS0tIGNvbW1lbnQgb3V0IHN1Ym1pdCBidXR0b24gZm9yIG5vdy5cbiAgICAgIDxidXR0b24gXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIiBcbiAgICAgICAgQGNsaWNrPSR7aGFuZGxlU3VibWl0Q2xpY2t9IFxuICAgICAgICA/ZGlzYWJsZWQ9JHshc2VsZWN0ZWRKdXJpc2RpY3Rpb259PlN1Ym1pdDwvYnV0dG9uPlxuICAgICAgLS0+XG4gICAgICA8YSBocmVmPVwiJHtqdXJpc2RpY3Rpb25MaW5rKCl9XCIgP2hpZGRlbj0keyFzZWxlY3RlZEp1cmlzZGljdGlvbn0+XG4gICAgICAgIEdvIHRvIGp1cmlzZGljdGlvbiBwYWdlXG4gICAgICA8L2E+XG4gICAgPC9mb3JtPlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNlbGVjdC1qdXJpc2RpY3Rpb25cIixcbiAgY29tcG9uZW50KENpdlNlbGVjdEp1cmlzZGljdGlvbiwgeyB1c2VTaGFkb3dET006IGZhbHNlLCBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtdIH0pXG4pO1xuXG5cbiIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwiLi91c2UtbWVtb1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gdXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWUsXG4gICAgfSksIFtdKTtcbn1cbiIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIFNlYXJjaEp1cmlzZGljdGlvbnMoKSB7XG4gIGNvbnN0IFtzZWxlY3RlZFN0YXRlLCBzZXRTZWxlY3RlZFN0YXRlXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbc2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCwgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZF0gPVxuICAgIHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcGVvcGxlLCBzZXRQZW9wbGVdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbZ2VvanNvbiwgc2V0R2VvanNvbl0gPSB1c2VTdGF0ZShbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQpIHJldHVybjtcblxuICAgIGNvbnN0IHNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRFbmNvZGVkID0gZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgc2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCxcbiAgICApO1xuXG4gICAgZmV0Y2goXG4gICAgICBgL2FwaS9hcGlfcHJveHkvcGVvcGxlP2p1cmlzZGljdGlvbl9vY2RpZD0ke3NlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRFbmNvZGVkfWAsXG4gICAgKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRQZW9wbGUoZGF0YS5kYXRhKTtcbiAgICAgIH0pO1xuICB9LCBbc2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZF0pO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgc3RhdGUsIGp1cmlzZGljdGlvbl9vY2RpZCB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgU3RhdGU6XCIsIHN0YXRlKTtcbiAgICBzZXRTZWxlY3RlZFN0YXRlKHN0YXRlKTtcbiAgICAvLyBUT0RPOiBwYW4gdGhlIG1hcCBpZiBzdGF0ZSBidXQgbm8ganVyaXNkaWN0aW9uXG4gICAgY29uc29sZS5sb2coXCJTZWxlY3RlZCBKdXJpc2RpY3Rpb246XCIsIGp1cmlzZGljdGlvbl9vY2RpZCk7XG4gICAgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZChqdXJpc2RpY3Rpb25fb2NkaWQpO1xuICAgIC8vIFRPRE86IHBhbiB0aGUgbWFwICYgem9vbSBpZiBzdGF0ZSBhbmQganVyaXNkaWN0aW9uXG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWFwQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBsYXRsbmcsIHpvb20gfSA9IGV2ZW50LmRldGFpbDtcbiAgICBpZiAoIWxhdGxuZyB8fCAhem9vbSkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiTWFwIENoYW5nZSAtIExhdExuZzpcIiwgbGF0bG5nLCBcIlpvb206XCIsIHpvb20pO1xuICAgIGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnMvZ2VvanNvbj9sYXQ9JHtsYXRsbmcubGF0fSZsb25nPSR7bGF0bG5nLmxuZ30mem9vbT0ke3pvb219YCxcbiAgICApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIHNldEdlb2pzb24oZGF0YSk7XG4gICAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAycmVtO1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Y2l2LW1hcFxuICAgICAgICAgICAgQG9uLW1hcC1jaGFuZ2U9JHtoYW5kbGVNYXBDaGFuZ2V9XG4gICAgICAgICAgICBAb24tanVyaXNkaWN0aW9uLWNoYW5nZT0ke2hhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZX1cbiAgICAgICAgICAgIC5nZW9qc29uPSR7Z2VvanNvbn1cbiAgICAgICAgICA+PC9jaXYtbWFwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGNpdi1zZWxlY3QtanVyaXNkaWN0aW9uXG4gICAgICAgICAgQHNlbGVjdC1qdXJpc2RpY3Rpb24tY2hhbmdlPSR7aGFuZGxlU2VsZWN0SnVyaXNkaWN0aW9uQ2hhbmdlfVxuICAgICAgICA+PC9jaXYtc2VsZWN0LWp1cmlzZGljdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNpdi1wZW9wbGUtbGlzdCAubG9jYWw9JHtwZW9wbGV9PjwvY2l2LXBlb3BsZS1saXN0PlxuICAgIDwvZGl2PlxuXG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJjaXYtc2VhcmNoLWp1cmlzZGljdGlvbnNcIixcbiAgY29tcG9uZW50KFNlYXJjaEp1cmlzZGljdGlvbnMsIHtcbiAgICB1c2VTaGFkb3dET006IGZhbHNlLFxuICAgIG9ic2VydmVkQXR0cmlidXRlczogW10sXG4gIH0pLFxuKTtcbiIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIE5hbWVDb25maWdGb3JtKHsgb25DaGFuZ2UsIGV4aXN0aW5nTmFtZUNvbmZpZ3MgPSB7fSB9KSB7XG4gIC8vIG5hbWVDb25maWdzOiBbeyBjYW5vbmljYWw6IHN0cmluZywgYWx0ZXJuYXRlczogW3N0cmluZywgLi4uXSB9XVxuICBjb25zdCBbbmFtZUNvbmZpZ3MsIHNldE5hbWVDb25maWdzXSA9IHVzZVN0YXRlKFxuICAgIE9iamVjdC5lbnRyaWVzKGV4aXN0aW5nTmFtZUNvbmZpZ3MpLm1hcCgoW2Nhbm9uaWNhbCwgYWx0ZXJuYXRlc10pID0+ICh7XG4gICAgICBjYW5vbmljYWwsXG4gICAgICBhbHRlcm5hdGVzLFxuICAgIH0pKVxuICApO1xuICBjb25zdCBbbmV3Q2Fub25pY2FsLCBzZXROZXdDYW5vbmljYWxdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtuZXdBbHRlcm5hdGUsIHNldE5ld0FsdGVybmF0ZV0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIENvbnZlcnQgdG8geyBjYW5vbmljYWw6IFthbHRlcm5hdGVzXSB9IGZvciBwYXJlbnRcbiAgICBjb25zdCBvYmogPSB7fTtcbiAgICBuYW1lQ29uZmlncy5mb3JFYWNoKCh7IGNhbm9uaWNhbCwgYWx0ZXJuYXRlcyB9KSA9PiB7XG4gICAgICBpZiAoY2Fub25pY2FsLnRyaW0oKSkgb2JqW2Nhbm9uaWNhbC50cmltKCldID0gYWx0ZXJuYXRlcy5maWx0ZXIoKGEpID0+IGEudHJpbSgpKTtcbiAgICB9KTtcbiAgICBvbkNoYW5nZShvYmopO1xuICB9LCBbbmFtZUNvbmZpZ3NdKTtcblxuICBjb25zdCBhZGRJZGVudGl0eSA9ICgpID0+IHtcbiAgICBpZiAobmV3Q2Fub25pY2FsLnRyaW0oKSkge1xuICAgICAgc2V0TmFtZUNvbmZpZ3MoW1xuICAgICAgICAuLi5uYW1lQ29uZmlncyxcbiAgICAgICAgeyBjYW5vbmljYWw6IG5ld0Nhbm9uaWNhbC50cmltKCksIGFsdGVybmF0ZXM6IFtdIH0sXG4gICAgICBdKTtcbiAgICAgIHNldE5ld0Nhbm9uaWNhbChcIlwiKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlSWRlbnRpdHkgPSAoaWR4KSA9PiB7XG4gICAgc2V0TmFtZUNvbmZpZ3MobmFtZUNvbmZpZ3MuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpZHgpKTtcbiAgfTtcblxuICBjb25zdCBhZGRBbHRlcm5hdGUgPSAoaWR4KSA9PiB7XG4gICAgaWYgKG5ld0FsdGVybmF0ZS50cmltKCkpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4ubmFtZUNvbmZpZ3NdO1xuICAgICAgdXBkYXRlZFtpZHhdLmFsdGVybmF0ZXMucHVzaChuZXdBbHRlcm5hdGUudHJpbSgpKTtcbiAgICAgIHNldE5hbWVDb25maWdzKHVwZGF0ZWQpO1xuICAgICAgc2V0TmV3QWx0ZXJuYXRlKFwiXCIpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmVBbHRlcm5hdGUgPSAoaWR4LCBhbHRJZHgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkID0gWy4uLm5hbWVDb25maWdzXTtcbiAgICB1cGRhdGVkW2lkeF0uYWx0ZXJuYXRlcyA9IHVwZGF0ZWRbaWR4XS5hbHRlcm5hdGVzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gYWx0SWR4KTtcbiAgICBzZXROYW1lQ29uZmlncyh1cGRhdGVkKTtcbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8c2VjdGlvbiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgPGxhYmVsPlxuICAgICAgICA8c3Bhbj5OZXcgSWRlbnRpdHkgTmFtZTwvc3Bhbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICAgIC52YWx1ZT0ke25ld0Nhbm9uaWNhbH1cbiAgICAgICAgICBAaW5wdXQ9JHsoZSkgPT4gc2V0TmV3Q2Fub25pY2FsKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gQm9iIEFcIlxuICAgICAgICAvPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnV0dG9uXCIgQGNsaWNrPSR7YWRkSWRlbnRpdHl9PlxuICAgICAgICBBZGQgSWRlbnRpdHlcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHVsIGNsYXNzPVwibGlzdFwiIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZTtcIj5cbiAgICAgICAgJHtuYW1lQ29uZmlncy5tYXAoXG4gICAgICAgICAgKGNmZywgaWR4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiY2FyZFwiIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPiR7Y2ZnLmNhbm9uaWNhbH08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvbiBvdXRsaW5lXCIgQGNsaWNrPSR7KCkgPT4gcmVtb3ZlSWRlbnRpdHkoaWR4KX0+XG4gICAgICAgICAgICAgICAgICBSZW1vdmUgSWRlbnRpdHlcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3RcIiBzdHlsZT1cImxpc3Qtc3R5bGU6IG5vbmU7XCI+XG4gICAgICAgICAgICAgICAgJHtjZmcuYWx0ZXJuYXRlcy5tYXAoXG4gICAgICAgICAgICAgICAgICAoYWx0LCBhbHRJZHgpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke2FsdH08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24gb3V0bGluZVwiIEBjbGljaz0keygpID0+IHJlbW92ZUFsdGVybmF0ZShpZHgsIGFsdElkeCl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgIC52YWx1ZT0ke2lkeCA9PT0gbmFtZUNvbmZpZ3MubGVuZ3RoIC0gMSA/IG5ld0FsdGVybmF0ZSA6IFwiXCJ9XG4gICAgICAgICAgICAgICAgQGlucHV0PSR7KGUpID0+IHNldE5ld0FsdGVybmF0ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBZGQgYWx0ZXJuYXRlIG5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvblwiIEBjbGljaz0keygpID0+IGFkZEFsdGVybmF0ZShpZHgpfT5cbiAgICAgICAgICAgICAgICBBZGQgQWx0ZXJuYXRlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3VsPlxuICAgICAgPHNtYWxsPlxuICAgICAgICBBZGQgaWRlbnRpdGllcyBhbmQgdGhlaXIgYWx0ZXJuYXRlIG5hbWVzLjxicj5cbiAgICAgICAgRXhhbXBsZTogSWRlbnRpdHkgXCJSb2JlcnQgQWxsZW5cIiB3aXRoIGFsdGVybmF0ZXMgXCJCb2IgQVwiLCBcIkJvYiBCXCIsIGV0Yy5cbiAgICAgIDwvc21hbGw+XG4gICAgPC9zZWN0aW9uPlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXCJuYW1lLWNvbmZpZy1mb3JtXCIsIGNvbXBvbmVudChOYW1lQ29uZmlnRm9ybSwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pKTsiLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlIH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHJlZiB9IGZyb20gXCJsaXQtaHRtbC9kaXJlY3RpdmVzL3JlZi5qc1wiO1xuXG5mdW5jdGlvbiBTY3JhcGVNb2RhbCh7XG4gIG9uU3RhcnRTY3JhcGUsXG4gIHVybCA9IFwiXCIsXG4gIHNvdXJjZVVybHMgPSBbXSxcbiAgbW9kYWxQcm9wcyA9IHt9LFxufSkge1xuICBjb25zdCBbc2NyYXBlU2NvcGUsIHNldFNjcmFwZVNjb3BlXSA9IHVzZVN0YXRlKFwidG9wLWxldmVsLXVybFwiKTtcbiAgY29uc3QgW2N1cnJlbnRVcmwsIHNldEN1cnJlbnRVcmxdID0gdXNlU3RhdGUodXJsKTtcbiAgY29uc3QgW2N1cnJlbnRTb3VyY2VVcmxzLCBzZXRDdXJyZW50U291cmNlVXJsc10gPSB1c2VTdGF0ZShzb3VyY2VVcmxzKTtcbiAgY29uc3QgW25hbWVDb25maWdzLCBzZXROYW1lQ29uZmlnc10gPSB1c2VTdGF0ZSh7fSk7XG5cbiAgY29uc3QgaGFuZGxlTmFtZUNvbmZpZ3NDaGFuZ2UgPSAoY29uZmlncykgPT4ge1xuICAgIHNldE5hbWVDb25maWdzKGNvbmZpZ3MpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjb3BlQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0U2NyYXBlU2NvcGUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCByZXNldFVybCA9ICgpID0+IHtcbiAgICBzZXRDdXJyZW50VXJsKHVybCk7XG4gIH07XG5cbiAgY29uc3QgYWRkU291cmNlVXJsID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRTb3VyY2VVcmxzKFsuLi5jdXJyZW50U291cmNlVXJscywgXCJcIl0pO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZVNvdXJjZVVybCA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRVcmxzID0gY3VycmVudFNvdXJjZVVybHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgc2V0Q3VycmVudFNvdXJjZVVybHModXBkYXRlZFVybHMpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVVybENoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIHNldEN1cnJlbnRVcmwoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTb3VyY2VVcmxDaGFuZ2UgPSAoaW5kZXgsIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFVybHMgPSBbLi4uY3VycmVudFNvdXJjZVVybHNdO1xuICAgIHVwZGF0ZWRVcmxzW2luZGV4XSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBzZXRDdXJyZW50U291cmNlVXJscyh1cGRhdGVkVXJscyk7XG4gIH07XG5cbiAgY29uc3QgaXNWYWxpZFVybCA9ICh1cmxTdHJpbmcpID0+IHtcbiAgICBpZiAoIXVybFN0cmluZyB8fCB1cmxTdHJpbmcudHJpbSgpID09PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsU3RyaW5nKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjdXJyZW50VXJsSXNWYWxpZCA9ICgpID0+IHtcbiAgICByZXR1cm4gaXNWYWxpZFVybChjdXJyZW50VXJsKTtcbiAgfTtcblxuICBjb25zdCBjdXJyZW50U291cmNlVXJsc1ZhbGlkID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjdXJyZW50U291cmNlVXJscy5sZW5ndGggPiAwICYmXG4gICAgICBjdXJyZW50U291cmNlVXJscy5ldmVyeSgodXJsKSA9PiBpc1ZhbGlkVXJsKHVybCkpXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBjYW5TdGFydFNjcmFwZSA9XG4gICAgc2NyYXBlU2NvcGUgPT09IFwidG9wLWxldmVsLXVybFwiXG4gICAgICA/IGN1cnJlbnRVcmxJc1ZhbGlkKClcbiAgICAgIDogY3VycmVudFNvdXJjZVVybHNWYWxpZCgpO1xuXG4gIGNvbnN0IHN1Ym1pdFNjcmFwZSA9ICgpID0+IHtcbiAgICBsZXQgZGF0YSA9IHt9O1xuICAgIGlmIChzY3JhcGVTY29wZSA9PSBcInRvcC1sZXZlbC11cmxcIikge1xuICAgICAgZGF0YSA9IHtcbiAgICAgICAgc2NyYXBlU2NvcGUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB1cmw6IGN1cnJlbnRVcmwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICBzY3JhcGVTY29wZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHNvdXJjZVVybHM6IGN1cnJlbnRTb3VyY2VVcmxzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgZGF0YS5pZGVudGl0aWVzID0gbmFtZUNvbmZpZ3M7XG4gICAgb25TdGFydFNjcmFwZShkYXRhKTtcbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8ZGlhbG9nID9vcGVuPSR7bW9kYWxQcm9wcy5vcGVufSB0YWJpbmRleD1cIi0xXCI+XG4gICAgICA8YXJ0aWNsZSBAY2xpY2s9JHsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0gJHtyZWYobW9kYWxQcm9wcy5tb2RhbFJlZil9PlxuICAgICAgICA8aGVhZGVyPlxuICAgICAgICAgIDxwPjxzdHJvbmc+VVJMcyB0byBTY3JhcGU8L3N0cm9uZz48L3A+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBpZD1cInRvcC1sZXZlbC11cmxcIlxuICAgICAgICAgICAgbmFtZT1cInNjcmFwZS1zY29wZVwiXG4gICAgICAgICAgICB2YWx1ZT1cInRvcC1sZXZlbC11cmxcIlxuICAgICAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJ9XG4gICAgICAgICAgICBAY2hhbmdlPSR7aGFuZGxlU2NvcGVDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwidG9wLWxldmVsLXVybFwiPlRvcC1sZXZlbCBVUkwgb25seTwvbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICBpZD1cInNwZWNpZmljLXVybHNcIlxuICAgICAgICAgICAgbmFtZT1cInNjcmFwZS1zY29wZVwiXG4gICAgICAgICAgICB2YWx1ZT1cInNwZWNpZmljLXVybHNcIlxuICAgICAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJzcGVjaWZpYy11cmxzXCJ9XG4gICAgICAgICAgICBAY2hhbmdlPSR7aGFuZGxlU2NvcGVDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3BlY2lmaWMtdXJsc1wiPlNwZWNpZmljIFVSTHM8L2xhYmVsPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuXG4gICAgICAgICR7c2NyYXBlU2NvcGUgPT09IFwidG9wLWxldmVsLXVybFwiXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8ZmllbGRzZXQgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIC52YWx1ZT1cIiR7Y3VycmVudFVybH1cIlxuICAgICAgICAgICAgICAgICAgQGlucHV0PSR7aGFuZGxlVXJsQ2hhbmdlfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vjb25kYXJ5IG91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bztcIlxuICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7cmVzZXRVcmx9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgUmVzZXQgVVJMXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogaHRtbGBcbiAgICAgICAgICAgICAgJHtjdXJyZW50U291cmNlVXJscy5tYXAoXG4gICAgICAgICAgICAgICAgKHVybCwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ1cmxcIlxuICAgICAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlKSA9PiBoYW5kbGVTb3VyY2VVcmxDaGFuZ2UoaW5kZXgsIGUpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWNvbmRhcnkgb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7KCkgPT4gcmVtb3ZlU291cmNlVXJsKGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgYCxcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHthZGRTb3VyY2VVcmx9PkFkZCBVUkw8L2J1dHRvbj5cbiAgICAgICAgICAgIGB9XG5cbiAgICAgICAgPGRldGFpbHMgbmFtZT1cIm92ZXJyaWRlLW5hbWVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxZW07XCI+XG4gICAgICAgICAgPHN1bW1hcnk+TmFtZSBDb25maWdzPC9zdW1tYXJ5PlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgU29tZSBwZW9wbGUgZ28gYnkgbXVsdGlwbGUgbmFtZXMgdGhhdCBhcmVuJ3QgZWFzaWx5IGd1ZXNzYWJsZSB0byBiZVxuICAgICAgICAgICAgdGhlIHNhbWUgaWRlbnRpdHkuIFNwZWNpZnkgYWx0ZXJuYXRlIG5hbWVzIGZvciBpZGVudGl0aWVzIHRvIGltcHJvdmVcbiAgICAgICAgICAgIG1hdGNoaW5nLlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8bmFtZS1jb25maWctZm9ybVxuICAgICAgICAgICAgLm9uQ2hhbmdlPSR7aGFuZGxlTmFtZUNvbmZpZ3NDaGFuZ2V9XG4gICAgICAgICAgICAuZXhpc3RpbmdOYW1lQ29uZmlncz0ke25hbWVDb25maWdzfVxuICAgICAgICAgID48L25hbWUtY29uZmlnLWZvcm0+XG4gICAgICAgIDwvZGV0YWlscz5cblxuICAgICAgICA8Zm9vdGVyPlxuICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7bW9kYWxQcm9wcy5vbkNsb3NlfSBjbGFzcz1cInNlY29uZGFyeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IHtcbiAgICAgICAgICAgICAgc3VibWl0U2NyYXBlKCk7XG4gICAgICAgICAgICAgIG1vZGFsUHJvcHMub25DbG9zZSgpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIGNsYXNzPVwicHJpbWFyeVwiXG4gICAgICAgICAgICA/ZGlzYWJsZWQ9JHshY2FuU3RhcnRTY3JhcGV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgU3RhcnQgU2NyYXBlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZm9vdGVyPlxuICAgICAgPC9hcnRpY2xlPlxuICAgIDwvZGlhbG9nPlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNjcmFwZS1tb2RhbFwiLFxuICBjb21wb25lbnQoU2NyYXBlTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrIH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHVzZU1vZGFsIH0gZnJvbSBcIi4uL2hvb2tzL3VzZU1vZGFsLmpzXCI7XG5pbXBvcnQgeyB1c2VTU0UgfSBmcm9tIFwiLi4vaG9va3MvdXNlU3NlLmpzXCI7IC8vIDwtLSBJbXBvcnQgdGhlIGhvb2tcbmltcG9ydCBcIi4uL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1oaXN0b3J5LWxpc3QuanNcIjtcblxuY29uc3QgREVGQVVMVF9DRU5URVIgPSBcIjMwLjI0MTcxLC05MS45OTEwNDRcIjtcbmNvbnN0IEFQSV9VUkwgPSBfX0FQSV9VUkxfXztcblxuZnVuY3Rpb24gSnVyaXNkaWN0aW9uUGFnZSh7IFxuICBqdXJpc2RpY3Rpb25fb2NkaWQsIFxuICBoaXN0b3J5XG59KSB7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcGVvcGxlLCBzZXRQZW9wbGVdID0gdXNlU3RhdGUoW10pO1xuXG4gIGNvbnN0IHNjcmFwZU1vZGFsID0gdXNlTW9kYWwoZmFsc2UpO1xuXG4gIGNvbnN0IHNzZVVybCA9IGp1cmlzZGljdGlvbl9vY2RpZFxuICAgID8gW2Ake0FQSV9VUkx9L2FwaS92MS9zc2Uvam9icy9zdGF0dXNgLFxuICAgICAgYD9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoanVyaXNkaWN0aW9uX29jZGlkKX1gLFxuICAgICAgYCZqb2JfdHlwZT1wZW9wbGVgXS5qb2luKFwiXCIpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IHtcbiAgICBkYXRhOiBqb2JTdGF0dXMsXG4gICAgaXNDb25uZWN0ZWQsXG4gICAgZXJyb3I6IHNzZUVycm9yLFxuICAgIC8vIGNvbm5lY3Q6IGNvbm5lY3RTdHJlYW0sXG4gICAgLy8gZGlzY29ubmVjdDogZGlzY29ubmVjdFN0cmVhbSxcbiAgfSA9IHVzZVNTRShzc2VVcmwsIHsgYXV0b0Nvbm5lY3Q6ICEhc3NlVXJsIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFqdXJpc2RpY3Rpb25fb2NkaWQpIHJldHVybjtcbiAgICBmZXRjaERhdGEoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbanVyaXNkaWN0aW9uRGF0YSwgcGVvcGxlRGF0YV0gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaEp1cmlzZGljdGlvbkRhdGEoanVyaXNkaWN0aW9uX29jZGlkKSxcbiAgICAgICAgZmV0Y2hQZW9wbGVEYXRhKGp1cmlzZGljdGlvbl9vY2RpZCksXG4gICAgICBdKTtcbiAgICBzZXREYXRhKGp1cmlzZGljdGlvbkRhdGEpO1xuICAgIHNldFBlb3BsZShwZW9wbGVEYXRhKTtcbiAgfTtcblxuICBjb25zdCBmZXRjaEp1cmlzZGljdGlvbkRhdGEgPSBhc3luYyAob2NkaWQpID0+IHtcbiAgICBjb25zdCBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnM/anVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWR9JndpdGhfZ2VvbT10cnVlYCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICBnZW9fY2VudGVyOiByZXN1bHQuZ2VvX2NlbnRlcixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGZldGNoUGVvcGxlRGF0YSA9IGFzeW5jIChvY2RpZCkgPT4ge1xuICAgIGNvbnN0IGVuY29kZWRPY2RpZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9wZW9wbGU/anVyaXNkaWN0aW9uX29jZGlkPSR7ZW5jb2RlZE9jZGlkfWAsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjcmFwZU1vZGFsQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICBzY3JhcGVNb2RhbC5vcGVuTW9kYWwoKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTY3JhcGVTdGFydENsaWNrID0gYXN5bmMgKGRldGFpbHMpID0+IHtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAganVyaXNkaWN0aW9uX29jZGlkOiBkYXRhLmRhdGEuaWQsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdXJsOiBkZXRhaWxzLmRhdGEudXJsIHx8IGRhdGEuZGF0YS51cmwsXG4gICAgICAgIG5hbWU6IGRhdGEuZGF0YS5uYW1lLFxuICAgICAgICBzb3VyY2VfdXJsczogZGV0YWlscy5kYXRhLnNvdXJjZVVybHMsXG4gICAgICAgIGlkZW50aXRpZXM6IGRldGFpbHMuZGF0YS5pZGVudGl0aWVzXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9waXBlbGluZXNgLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2FuU3RhcnRTY3JhcGUgPSB0cnVlO1xuICBjb25zdCBzY3JhcGVTdGF0dXMgPSBkYXRhPy5kYXRhPy51cGRhdGVkX2F0ID8gYFNjcmFwZWRgIDogYFVuc2NyYXBlZGA7XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMnJlbTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGNpdi1tYXBcbiAgICAgICAgICAgIGNhbm1vdmU9XCJmYWxzZVwiXG4gICAgICAgICAgICAubGF0bG5nPSR7ZGF0YSAmJiBkYXRhLmdlb19jZW50ZXJcbiAgICAgICAgICAgICAgPyB7IGxhdDogZGF0YS5nZW9fY2VudGVyLmxhdCwgbG5nOiBkYXRhLmdlb19jZW50ZXIubG5nIH1cbiAgICAgICAgICAgICAgOiBudWxsfVxuICAgICAgICAgID48L2Npdi1tYXA+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgJHtkYXRhXG4gICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPGhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMFwiPiR7ZGF0YS5kYXRhLm5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuNzVyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgID5TdGF0dXM6ICR7c2NyYXBlU3RhdHVzfTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICAgICAgICA8aHIgLz5cblxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5KdXJpc2RpY3Rpb24gT0NESUQ6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLmlkfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+V2Vic2l0ZTo8L3N0cm9uZz4gJHtkYXRhLmRhdGEudXJsfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+R2VvaWQ6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLmdlb2lkfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+UG9wdWxhdGlvbjo8L3N0cm9uZz4gJHtkYXRhLmRhdGEucG9wdWxhdGlvbi50b0xvY2FsZVN0cmluZygpfVxuICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgICAgPGgzPlNjcmFwZSBIaXN0b3J5PC9oMz5cbiAgICAgICAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICAgICAgICA8Y2l2LXNjcmFwZS1oaXN0b3J5LWxpc3RcbiAgICAgICAgICAgICAgICAgIC5oaXN0b3J5PSR7aGlzdG9yeX1cbiAgICAgICAgICAgICAgICAgIC5qb2JTdGF0dXM9JHtqb2JTdGF0dXN9XG4gICAgICAgICAgICAgICAgICAuaXNDb25uZWN0ZWQ9JHtpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIC5zc2VFcnJvcj0ke3NzZUVycm9yfVxuICAgICAgICAgICAgICAgID48L2Npdi1zY3JhcGUtaGlzdG9yeS1saXN0PlxuXG4gICAgICAgICAgICAgICAgPGNpdi1zY3JhcGUtbW9kYWxcbiAgICAgICAgICAgICAgICAgIC5vblN0YXJ0U2NyYXBlPSR7aGFuZGxlU2NyYXBlU3RhcnRDbGlja31cbiAgICAgICAgICAgICAgICAgIC51cmw9JHtkYXRhLmRhdGEudXJsfVxuICAgICAgICAgICAgICAgICAgLm1vZGFsUHJvcHM9JHtzY3JhcGVNb2RhbC5tb2RhbFByb3BzfVxuICAgICAgICAgICAgICAgID48L2Npdi1zY3JhcGUtbW9kYWw+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9JHtoYW5kbGVTY3JhcGVNb2RhbENsaWNrfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWNhblN0YXJ0U2NyYXBlfVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBTY3JhcGUgRGF0YSBmb3IgSnVyaXNkaWN0aW9uXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIGBcbiAgICAgICAgICAgIDogaHRtbGAgPHA+TG9hZGluZyBqdXJpc2RpY3Rpb24gZGF0YS4uLjwvcD4gYH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGgyPkVsZWN0ZWQgUmVwcmVzZW50YXRpdmVzPC9oMj5cbiAgICAgIDxjaXYtcGVvcGxlLWxpc3QgLmxvY2FsPSR7cGVvcGxlfT48L2Npdi1wZW9wbGUtbGlzdD5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1qdXJpc2RpY3Rpb24tcGFnZVwiLFxuICBjb21wb25lbnQoSnVyaXNkaWN0aW9uUGFnZSwge1xuICAgIHVzZVNoYWRvd0RPTTogZmFsc2UsXG4gICAgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBbXG4gICAgICBcImp1cmlzZGljdGlvbl9vY2RpZFwiLCBcbiAgICAgIFwiaGlzdG9yeVwiXG4gICAgXSxcbiAgfSksXG4pO1xuIiwiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tIFwiaGF1bnRlZFwiO1xuXG4vKipcbiAqIHVzZVNTRSAtIEdlbmVyYWxpemVkIFNlcnZlci1TZW50IEV2ZW50cyBob29rXG4gKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbn0gZW5kcG9pbnQgLSBTU0UgZW5kcG9pbnQgVVJMIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIFVSTFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZyAoZS5nLiwgYXV0b0Nvbm5lY3QpXG4gKiBAcmV0dXJucyB7b2JqZWN0fSB7IGRhdGEsIGlzQ29ubmVjdGVkLCBlcnJvciwgY29ubmVjdCwgZGlzY29ubmVjdCB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTU0UoZW5kcG9pbnQsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2lzQ29ubmVjdGVkLCBzZXRJc0Nvbm5lY3RlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtldmVudFNvdXJjZSwgc2V0RXZlbnRTb3VyY2VdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgY29uc3QgZ2V0VXJsID0gdXNlQ2FsbGJhY2soXG4gICAgKCkgPT4gKHR5cGVvZiBlbmRwb2ludCA9PT0gXCJmdW5jdGlvblwiID8gZW5kcG9pbnQoKSA6IGVuZHBvaW50KSxcbiAgICBbZW5kcG9pbnRdXG4gICk7XG5cbiAgY29uc3QgY29ubmVjdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHJldHVybjtcbiAgICBjb25zdCB1cmwgPSBnZXRVcmwoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXMgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcbiAgICAgIHNldEV2ZW50U291cmNlKGVzKTtcbiAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICBlcy5vbm9wZW4gPSAoKSA9PiBzZXRJc0Nvbm5lY3RlZCh0cnVlKTtcblxuICAgICAgZXMub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0RGF0YShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHNldEVycm9yKFwiRXJyb3IgcGFyc2luZyBTU0UgZGF0YS5cIik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGVzLm9uZXJyb3IgPSAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU1NFIGVycm9yOlwiLCBlKTtcbiAgICAgICAgc2V0SXNDb25uZWN0ZWQoZmFsc2UpO1xuICAgICAgICBzZXRFcnJvcihcIlNTRSBjb25uZWN0aW9uIGVycm9yLlwiKTtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0RXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBTU0UuXCIpO1xuICAgIH1cbiAgfSwgW2V2ZW50U291cmNlLCBnZXRVcmxdKTtcblxuICBjb25zdCBkaXNjb25uZWN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICAgIHNldEV2ZW50U291cmNlKG51bGwpO1xuICAgICAgc2V0SXNDb25uZWN0ZWQoZmFsc2UpO1xuICAgIH1cbiAgfSwgW2V2ZW50U291cmNlXSk7XG5cbiAgLy8gQXV0by1jb25uZWN0IGlmIG9wdGlvbnMuYXV0b0Nvbm5lY3QgaXMgdHJ1ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvcHRpb25zLmF1dG9Db25uZWN0KSB7XG4gICAgICBjb25uZWN0KCk7XG4gICAgfVxuICAgIC8vIENsZWFudXAgb24gdW5tb3VudFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoZXZlbnRTb3VyY2UpIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgfTtcbiAgfSwgW29wdGlvbnMuYXV0b0Nvbm5lY3QsIGNvbm5lY3QsIGV2ZW50U291cmNlXSk7XG5cbiAgcmV0dXJuIHsgZGF0YSwgaXNDb25uZWN0ZWQsIGVycm9yLCBjb25uZWN0LCBkaXNjb25uZWN0IH07XG59IiwiaW1wb3J0IFwiLi9pbnB1dHMvaW5kZXguanNcIjtcbmltcG9ydCBcIi4vcGVvcGxlLWxpc3QuanNcIlxuaW1wb3J0IFwiLi9zY3JhcGUtaGlzdG9yeS9pbmRleC5qc1wiXG5pbXBvcnQgXCIuL3NlYXJjaC1qdXJpc2RpY3Rpb25zL2luZGV4LmpzXCI7XG5pbXBvcnQgXCIuL2p1cmlzZGljdGlvbi1wYWdlL2luZGV4LmpzXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyQ2l2TWFwIH0gZnJvbSBcIkBjb21wb25lbnRzXCI7XG5yZWdpc3RlckNpdk1hcCgpOyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJnbG9iYWxUaGlzIiwiZGVidWdMb2dFdmVudCIsImV2ZW50IiwiZW1pdExpdERlYnVnTG9nRXZlbnRzIiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiaXNzdWVXYXJuaW5nIiwiZGVidWdMb2dSZW5kZXJJZCIsImxpdElzc3VlZFdhcm5pbmdzIiwiU2V0IiwiY29kZSIsIndhcm5pbmciLCJoYXMiLCJjb25zb2xlIiwid2FybiIsImFkZCIsInF1ZXVlTWljcm90YXNrIiwid3JhcCIsIlNoYWR5RE9NIiwiaW5Vc2UiLCJub1BhdGNoIiwibm9kZSIsInRydXN0ZWRUeXBlcyIsInBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJzIiwidW5kZWZpbmVkIiwiaWRlbnRpdHlGdW5jdGlvbiIsInZhbHVlIiwibm9vcFNhbml0aXplciIsIl9ub2RlIiwiX25hbWUiLCJfdHlwZSIsInNldFNhbml0aXplciIsIm5ld1Nhbml0aXplciIsInNhbml0aXplckZhY3RvcnlJbnRlcm5hbCIsIkVycm9yIiwiX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlIiwiY3JlYXRlU2FuaXRpemVyIiwibmFtZSIsInR5cGUiLCJib3VuZEF0dHJpYnV0ZVN1ZmZpeCIsIm1hcmtlciIsIk1hdGgiLCJyYW5kb20iLCJ0b0ZpeGVkIiwic2xpY2UiLCJtYXJrZXJNYXRjaCIsIm5vZGVNYXJrZXIiLCJkIiwiZG9jdW1lbnQiLCJjcmVhdGVNYXJrZXIiLCJjcmVhdGVDb21tZW50IiwiaXNQcmltaXRpdmUiLCJpc0FycmF5IiwiQXJyYXkiLCJTUEFDRV9DSEFSIiwidGV4dEVuZFJlZ2V4IiwiY29tbWVudEVuZFJlZ2V4IiwiY29tbWVudDJFbmRSZWdleCIsInRhZ0VuZFJlZ2V4IiwiUmVnRXhwIiwic2luZ2xlUXVvdGVBdHRyRW5kUmVnZXgiLCJkb3VibGVRdW90ZUF0dHJFbmRSZWdleCIsInJhd1RleHRFbGVtZW50IiwiaHRtbCIsInN0cmluZ3MiLCJ2YWx1ZXMiLCJzb21lIiwidmFsIiwiXyRsaXRUeXBlJCIsIm5vQ2hhbmdlIiwiU3ltYm9sIiwiZm9yIiwibm90aGluZyIsInRlbXBsYXRlQ2FjaGUiLCJXZWFrTWFwIiwid2Fsa2VyIiwiY3JlYXRlVHJlZVdhbGtlciIsInRydXN0RnJvbVRlbXBsYXRlU3RyaW5nIiwidHNhIiwic3RyaW5nRnJvbVRTQSIsImhhc093blByb3BlcnR5IiwibWVzc2FnZSIsInRyaW0iLCJyZXBsYWNlIiwiVGVtcGxhdGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJ0aGlzIiwicGFydHMiLCJub2RlSW5kZXgiLCJhdHRyTmFtZUluZGV4IiwicGFydENvdW50IiwibGVuZ3RoIiwiYXR0ck5hbWVzIiwibCIsInJhd1RleHRFbmRSZWdleCIsInJlZ2V4IiwiaSIsImF0dHJOYW1lIiwibWF0Y2giLCJhdHRyTmFtZUVuZEluZGV4IiwibGFzdEluZGV4IiwiZXhlYyIsInRlc3QiLCJhc3NlcnQiLCJlbmQiLCJzdGFydHNXaXRoIiwicHVzaCIsImdldFRlbXBsYXRlSHRtbCIsImVsIiwiY3JlYXRlRWxlbWVudCIsImN1cnJlbnROb2RlIiwiY29udGVudCIsIndyYXBwZXIiLCJmaXJzdENoaWxkIiwicmVwbGFjZVdpdGgiLCJjaGlsZE5vZGVzIiwibmV4dE5vZGUiLCJub2RlVHlwZSIsInRhZyIsImxvY2FsTmFtZSIsImlubmVySFRNTCIsImluY2x1ZGVzIiwibSIsImhhc0F0dHJpYnV0ZXMiLCJnZXRBdHRyaWJ1dGVOYW1lcyIsImVuZHNXaXRoIiwicmVhbE5hbWUiLCJzdGF0aWNzIiwiZ2V0QXR0cmlidXRlIiwic3BsaXQiLCJpbmRleCIsImN0b3IiLCJQcm9wZXJ0eVBhcnQiLCJCb29sZWFuQXR0cmlidXRlUGFydCIsIkV2ZW50UGFydCIsIkF0dHJpYnV0ZVBhcnQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ0YWdOYW1lIiwidGV4dENvbnRlbnQiLCJlbXB0eVNjcmlwdCIsImFwcGVuZCIsImRhdGEiLCJpbmRleE9mIiwiam9pbiIsImtpbmQiLCJ0ZW1wbGF0ZSIsImNsb25hYmxlVGVtcGxhdGUiLCJfb3B0aW9ucyIsInJlc29sdmVEaXJlY3RpdmUiLCJwYXJ0IiwicGFyZW50IiwiYXR0cmlidXRlSW5kZXgiLCJjdXJyZW50RGlyZWN0aXZlIiwiX19kaXJlY3RpdmVzIiwiX19kaXJlY3RpdmUiLCJuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IiLCJfJGluaXRpYWxpemUiLCJfJHJlc29sdmUiLCJUZW1wbGF0ZUluc3RhbmNlIiwiXyRwYXJ0cyIsIl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiIsIl8kdGVtcGxhdGUiLCJfJHBhcmVudCIsInBhcmVudE5vZGUiLCJfJGlzQ29ubmVjdGVkIiwiX2Nsb25lIiwiZnJhZ21lbnQiLCJjcmVhdGlvblNjb3BlIiwiaW1wb3J0Tm9kZSIsInBhcnRJbmRleCIsInRlbXBsYXRlUGFydCIsIkNoaWxkUGFydCIsIm5leHRTaWJsaW5nIiwiRWxlbWVudFBhcnQiLCJfdXBkYXRlIiwidmFsdWVJbmRleCIsInRlbXBsYXRlSW5zdGFuY2UiLCJfJHNldFZhbHVlIiwiX19pc0Nvbm5lY3RlZCIsInN0YXJ0Tm9kZSIsImVuZE5vZGUiLCJfJGNvbW1pdHRlZFZhbHVlIiwiXyRzdGFydE5vZGUiLCJfJGVuZE5vZGUiLCJpc0Nvbm5lY3RlZCIsIl90ZXh0U2FuaXRpemVyIiwiZGlyZWN0aXZlUGFyZW50Iiwic3RhcnQiLCJfJGNsZWFyIiwiX2NvbW1pdFRleHQiLCJfY29tbWl0VGVtcGxhdGVSZXN1bHQiLCJob3N0IiwiX2NvbW1pdE5vZGUiLCJpdGVyYXRvciIsImlzSXRlcmFibGUiLCJfY29tbWl0SXRlcmFibGUiLCJfaW5zZXJ0IiwiaW5zZXJ0QmVmb3JlIiwicGFyZW50Tm9kZU5hbWUiLCJub2RlTmFtZSIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXN1bHQiLCJfJGdldFRlbXBsYXRlIiwiaCIsImluc3RhbmNlIiwiZ2V0Iiwic2V0IiwiaXRlbVBhcnRzIiwiaXRlbVBhcnQiLCJpdGVtIiwiZnJvbSIsIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCJuIiwicmVtb3ZlIiwic2V0Q29ubmVjdGVkIiwiZWxlbWVudCIsImZpbGwiLCJTdHJpbmciLCJfc2FuaXRpemVyIiwibm9Db21taXQiLCJjaGFuZ2UiLCJ2IiwiX2NvbW1pdFZhbHVlIiwic2V0QXR0cmlidXRlIiwic3VwZXIiLCJhcmd1bWVudHMiLCJ0b2dnbGVBdHRyaWJ1dGUiLCJuZXdMaXN0ZW5lciIsIm9sZExpc3RlbmVyIiwic2hvdWxkUmVtb3ZlTGlzdGVuZXIiLCJjYXB0dXJlIiwib25jZSIsInBhc3NpdmUiLCJzaG91bGRBZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiYWRkTGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZUV2ZW50IiwiY2FsbCIsInBvbHlmaWxsU3VwcG9ydCIsImxpdEh0bWxQb2x5ZmlsbFN1cHBvcnREZXZNb2RlIiwibGl0SHRtbFZlcnNpb25zIiwicmVuZGVyIiwiY29udGFpbmVyIiwiVHlwZUVycm9yIiwicmVuZGVySWQiLCJwYXJ0T3duZXJOb2RlIiwicmVuZGVyQmVmb3JlIiwiaWQiLCJjdXJyZW50IiwiY3VycmVudElkIiwic2V0Q3VycmVudCIsInN0YXRlIiwiY2xlYXIiLCJwaGFzZVN5bWJvbCIsImhvb2tTeW1ib2wiLCJ1cGRhdGVTeW1ib2wiLCJjb21taXRTeW1ib2wiLCJlZmZlY3RzU3ltYm9sIiwibGF5b3V0RWZmZWN0c1N5bWJvbCIsImNvbnRleHRFdmVudCIsIlN0YXRlIiwidXBkYXRlIiwidmlydHVhbCIsIk1hcCIsInJ1biIsImNiIiwicmVzIiwiX3J1bkVmZmVjdHMiLCJwaGFzZSIsImVmZmVjdHMiLCJlZmZlY3QiLCJydW5FZmZlY3RzIiwicnVuTGF5b3V0RWZmZWN0cyIsInRlYXJkb3duIiwiZm9yRWFjaCIsImhvb2siLCJkZWZlciIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImJpbmQiLCJydW5uZXIiLCJ0YXNrcyIsInJ1blRhc2tzIiwidCIsImxlbiIsInRhc2siLCJyZWFkIiwid3JpdGUiLCJCYXNlU2NoZWR1bGVyIiwicmVuZGVyZXIiLCJfdXBkYXRlUXVldWVkIiwiaGFuZGxlUGhhc2UiLCJhcmciLCJjb21taXQiLCJtYWtlQ29tcG9uZW50IiwiU2NoZWR1bGVyIiwiZnJhZyIsImJhc2VFbGVtZW50T3JPcHRpb25zIiwiQmFzZUVsZW1lbnQiLCJiYXNlRWxlbWVudCIsIkhUTUxFbGVtZW50Iiwib2JzZXJ2ZWRBdHRyaWJ1dGVzIiwidXNlU2hhZG93RE9NIiwic2hhZG93Um9vdEluaXQiLCJFbGVtZW50IiwiX3NjaGVkdWxlciIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzaGFkb3dSb290IiwiY29ubmVjdGVkQ2FsbGJhY2siLCJkaXNjb25uZWN0ZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJSZWZsZWN0IiwiXyIsImNoYXIiLCJ0b1VwcGVyQ2FzZSIsInRvQ2FtZWxDYXNlIiwicHJvdG8iLCJQcm94eSIsInByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwidGFyZ2V0Iiwia2V5IiwicmVjZWl2ZXIiLCJkZXNjIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaW5pdGlhbFZhbHVlIiwiaXNTZXR1cCIsImZyZWV6ZSIsInJlZmxlY3RpdmVQcm9wIiwiZGVmaW5lUHJvcGVydHkiLCJzZXRQcm90b3R5cGVPZiIsIkhvb2siLCJ1c2UiLCJhcmdzIiwiaG9va3MiLCJjcmVhdGVFZmZlY3QiLCJzZXRFZmZlY3RzIiwiY2FsbGJhY2siLCJsYXN0VmFsdWVzIiwiX3RlYXJkb3duIiwiaWdub3JlZDEiLCJpZ25vcmVkMiIsImhhc0NoYW5nZWQiLCJ1c2VFZmZlY3QiLCJ1c2VDb250ZXh0IiwiQ29udGV4dCIsIl9yYW5FZmZlY3QiLCJfdW5zdWJzY3JpYmUiLCJfdXBkYXRlciIsIl9zdWJzY3JpYmUiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwidW5zdWJzY3JpYmUiLCJkZWZhdWx0VmFsdWUiLCJ1c2VNZW1vIiwiZm4iLCJ1c2VDYWxsYmFjayIsImlucHV0cyIsInVzZVN0YXRlIiwidXBkYXRlciIsIm1ha2VBcmdzIiwicHJldmlvdXNWYWx1ZSIsImlzIiwicmVkdWNlciIsImN1cnJlbnRTdGF0ZSIsImluaXRpYWxTdGF0ZSIsImluaXQiLCJkaXNwYXRjaCIsImFjdGlvbiIsIlBhcnRUeXBlIiwiRGlyZWN0aXZlIiwiX3BhcnRJbmZvIiwiX19wYXJ0IiwiX19hdHRyaWJ1dGVJbmRleCIsInByb3BzIiwiX3BhcnQiLCJzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMiLCJTaGFkb3dSb290IiwiU2hhZHlDU1MiLCJuYXRpdmVTaGFkb3ciLCJEb2N1bWVudCIsIkNTU1N0eWxlU2hlZXQiLCJjb25zdHJ1Y3Rpb25Ub2tlbiIsImNzc1RhZ0NhY2hlIiwiQ1NTUmVzdWx0IiwiY3NzVGV4dCIsInNhZmVUb2tlbiIsIl9zdHJpbmdzIiwic3R5bGVTaGVldCIsIl9zdHlsZVNoZWV0IiwiY2FjaGVhYmxlIiwicmVwbGFjZVN5bmMiLCJ0b1N0cmluZyIsImNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0Iiwic2hlZXQiLCJydWxlIiwiY3NzUnVsZXMiLCJnZXRDb21wYXRpYmxlU3R5bGUiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIiwicmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZSIsIkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkiLCJwcm9wIiwiX29iaiIsImRlZmF1bHRDb252ZXJ0ZXIiLCJ0b0F0dHJpYnV0ZSIsIkJvb2xlYW4iLCJKU09OIiwic3RyaW5naWZ5IiwiZnJvbUF0dHJpYnV0ZSIsImZyb21WYWx1ZSIsIk51bWJlciIsInBhcnNlIiwiZSIsIm5vdEVxdWFsIiwib2xkIiwiZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24iLCJhdHRyaWJ1dGUiLCJjb252ZXJ0ZXIiLCJyZWZsZWN0IiwidXNlRGVmYXVsdCIsIm1ldGFkYXRhIiwibGl0UHJvcGVydHlNZXRhZGF0YSIsIlJlYWN0aXZlRWxlbWVudCIsImFkZEluaXRpYWxpemVyIiwiaW5pdGlhbGl6ZXIiLCJfX3ByZXBhcmUiLCJfaW5pdGlhbGl6ZXJzIiwiZmluYWxpemUiLCJfX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAiLCJrZXlzIiwiY3JlYXRlUHJvcGVydHkiLCJjcmVhdGUiLCJ3cmFwcGVkIiwiZWxlbWVudFByb3BlcnRpZXMiLCJub0FjY2Vzc29yIiwiZGVzY3JpcHRvciIsImdldFByb3BlcnR5RGVzY3JpcHRvciIsInJlcXVlc3RVcGRhdGUiLCJnZXRQcm9wZXJ0eU9wdGlvbnMiLCJzdXBlckN0b3IiLCJmaW5hbGl6ZWQiLCJwcm9wZXJ0aWVzIiwicHJvcEtleXMiLCJwIiwiYXR0ciIsIl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5IiwiZWxlbWVudFN0eWxlcyIsImZpbmFsaXplU3R5bGVzIiwic3R5bGVzIiwiZmxhdCIsIkluZmluaXR5IiwicmV2ZXJzZSIsInVuc2hpZnQiLCJ0b0xvd2VyQ2FzZSIsIl9faW5zdGFuY2VQcm9wZXJ0aWVzIiwiaXNVcGRhdGVQZW5kaW5nIiwiaGFzVXBkYXRlZCIsIl9fcmVmbGVjdGluZ1Byb3BlcnR5IiwiX19pbml0aWFsaXplIiwiX191cGRhdGVQcm9taXNlIiwiZW5hYmxlVXBkYXRpbmciLCJfJGNoYW5nZWRQcm9wZXJ0aWVzIiwiX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzIiwiYWRkQ29udHJvbGxlciIsImNvbnRyb2xsZXIiLCJfX2NvbnRyb2xsZXJzIiwicmVuZGVyUm9vdCIsImhvc3RDb25uZWN0ZWQiLCJyZW1vdmVDb250cm9sbGVyIiwiZGVsZXRlIiwiaW5zdGFuY2VQcm9wZXJ0aWVzIiwic2l6ZSIsImNyZWF0ZVJlbmRlclJvb3QiLCJzaGFkb3dSb290T3B0aW9ucyIsImFkb3B0ZWRTdHlsZVNoZWV0cyIsIm1hcCIsInN0eWxlIiwibm9uY2UiLCJhcHBlbmRDaGlsZCIsImFkb3B0U3R5bGVzIiwiYyIsIl9yZXF1ZXN0ZWRVcGRhdGUiLCJob3N0RGlzY29ubmVjdGVkIiwiX29sZCIsIl8kYXR0cmlidXRlVG9Qcm9wZXJ0eSIsIl9fcHJvcGVydHlUb0F0dHJpYnV0ZSIsImF0dHJWYWx1ZSIsImVuYWJsZWRXYXJuaW5ncyIsInByb3BOYW1lIiwiY29udmVydGVkVmFsdWUiLCJfX2RlZmF1bHRWYWx1ZXMiLCJFdmVudCIsImhhc0F0dHJpYnV0ZSIsIl8kY2hhbmdlUHJvcGVydHkiLCJfX2VucXVldWVVcGRhdGUiLCJpbml0aWFsaXplVmFsdWUiLCJfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIiwicmVqZWN0Iiwic2NoZWR1bGVVcGRhdGUiLCJwZXJmb3JtVXBkYXRlIiwic2hhZG93ZWRQcm9wZXJ0aWVzIiwiZmlsdGVyIiwic2hvdWxkVXBkYXRlIiwiY2hhbmdlZFByb3BlcnRpZXMiLCJ3aWxsVXBkYXRlIiwiaG9zdFVwZGF0ZSIsIl9fbWFya1VwZGF0ZWQiLCJfJGRpZFVwZGF0ZSIsIl9jaGFuZ2VkUHJvcGVydGllcyIsImhvc3RVcGRhdGVkIiwiZmlyc3RVcGRhdGVkIiwidXBkYXRlZCIsInVwZGF0ZUNvbXBsZXRlIiwiZ2V0VXBkYXRlQ29tcGxldGUiLCJlbnN1cmVPd25XYXJuaW5ncyIsImVuYWJsZVdhcm5pbmciLCJkaXNhYmxlV2FybmluZyIsInNwbGljZSIsInJlYWN0aXZlRWxlbWVudFZlcnNpb25zIiwiTGl0RWxlbWVudCIsInJlbmRlck9wdGlvbnMiLCJfX2NoaWxkUGFydCIsImxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydCIsImxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlIiwibGl0RWxlbWVudFZlcnNpb25zIiwid2luZG93Iiwibm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkIiwiY2hpbGRyZW4iLCJvYmoiLCJyZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQiLCJhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50IiwiaW5zdGFsbERpc2Nvbm5lY3RBUEkiLCJyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyIsIm5ld1BhcmVudCIsIm5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQiLCJpc0NsZWFyaW5nVmFsdWUiLCJmcm9tUGFydEluZGV4IiwiXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyIsIkFzeW5jRGlyZWN0aXZlIiwiaXNDbGVhcmluZ0RpcmVjdGl2ZSIsInJlY29ubmVjdGVkIiwiZGlzY29ubmVjdGVkIiwic2V0VmFsdWUiLCJuZXdWYWx1ZXMiLCJjb21wb25lbnQiLCJjcmVhdGVDb250ZXh0IiwiUHJvdmlkZXIiLCJsaXN0ZW5lcnMiLCJfdmFsdWUiLCJzdG9wUHJvcGFnYXRpb24iLCJDb25zdW1lciIsIm1ha2VDb250ZXh0IiwiaGF1bnRlZCIsIlJlZiIsImxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrIiwicmVmIiwiX3JlZiIsInJlZkNoYW5nZWQiLCJfdXBkYXRlUmVmVmFsdWUiLCJfbGFzdEVsZW1lbnRGb3JSZWYiLCJfZWxlbWVudCIsIl9jb250ZXh0IiwiY29udGV4dCIsImxhc3RFbGVtZW50Rm9yQ2FsbGJhY2siLCJfJGxpdERpcmVjdGl2ZSQiLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSIsImRpc2FibGVkIiwib3B0aW9uc01ldGFkYXRhIiwibGFiZWwiLCJpbnB1dFZhbHVlIiwicGFnZVNpemUiLCJzZWxlY3RlZEl0ZW0iLCJzZXRTZWxlY3RlZEl0ZW0iLCJhY3RpdmVJbmRleCIsInNldEFjdGl2ZUluZGV4IiwiaXNMaXN0T3BlbiIsInNldElzTGlzdE9wZW4iLCJpbnB1dEVsZW1lbnQiLCJzZXRJbnB1dEVsZW1lbnQiLCJjdXJyZW50UGFnZSIsInNldEN1cnJlbnRQYWdlIiwic2Nyb2xsVG9BY3RpdmVJdGVtIiwidHJpZ2dlclBhcmVudEZldGNoIiwiaW5wdXQiLCJwYWdlIiwicXVlcnkiLCJkZWJvdW5jZWRGZXRjaCIsImZ1bmMiLCJkZWxheSIsInRpbWVvdXRJZCIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJhcHBseSIsImRlYm91bmNlIiwic2VsZWN0SXRlbSIsImZvY3VzIiwiaGFzUHJldlBhZ2UiLCJsaW5rcyIsInByZXYiLCJoYXNOZXh0UGFnZSIsIm5leHQiLCJhY3RpdmVJdGVtIiwicXVlcnlTZWxlY3RvciIsInNjcm9sbEludG9WaWV3IiwiYmVoYXZpb3IiLCJibG9jayIsInByZXZlbnREZWZhdWx0IiwibmV3U3RhdGUiLCJoYW5kbGVTdWdnZXN0aW9uQ2xpY2siLCJ0b3RhbF9pdGVtcyIsInRvdGFsX3BhZ2VzIiwibG9jYWwiLCJwZW9wbGUiLCJwZXJzb24iLCJjZG5faW1hZ2UiLCJpbWFnZSIsIm9mZmljZSIsImRpdmlzaW9uT2NkaWQiLCJkaXZpc2lvbl9vY2RpZCIsImhhc1N1YmRpdmlzaW9uIiwiZ2V0U3ViZGl2aXNpb25MYWJlbCIsInN1YkRpdmlzaW9uIiwiZW1haWxzIiwicGhvbmVzIiwidXJscyIsInRpdGxlIiwiZm9vdGVyIiwibW9kYWxQcm9wcyIsIm9wZW4iLCJzZXRPcGVuIiwiZGlhbG9nRWwiLCJhcmlhTGFiZWwiLCJjbG9zZU9uQmFja2Ryb3BDbGljayIsIm9uQ2xvc2UiLCJtb2RhbFJlZiIsImhpc3RvcnkiLCJqb2JTdGF0dXMiLCJwYXJzZWRIaXN0b3J5IiwicmVxdWVzdF9pZCIsImpvYiIsInByb2dyZXNzIiwic3RhdHVzIiwibW9kYWxPcGVuIiwic2V0TW9kYWxPcGVuIiwic2VsZWN0ZWRKb2IiLCJzZXRTZWxlY3RlZEpvYiIsImZtdERhdGUiLCJEYXRlIiwiaXNOYU4iLCJnZXRNb250aCIsInBhZFN0YXJ0IiwiZ2V0RGF0ZSIsImdldEZ1bGxZZWFyIiwibW9kYWxDb250ZW50IiwiY3JlYXRlZF9hdCIsInVwZGF0ZWRfYXQiLCJkdXJhdGlvbiIsImZsb29yIiwicm91bmQiLCJnZXREdXJhdGlvblN0cmluZyIsInNvdXJjZV91cmxzIiwidXJsIiwic3RhdHVzQ2xhc3MiLCJvcGVuRm9yIiwiRHVtbXlTY3JhcGVKb2JJbmZvIiwiZHVyYXRpb25faW5fcyIsInVzZU1vZGFsIiwiaW5pdGlhbE9wZW4iLCJpc09wZW4iLCJzZXRJc09wZW4iLCJjbG9zZU1vZGFsIiwiaGFuZGxlS2V5RG93biIsImhhbmRsZUNsaWNrT3V0c2lkZSIsImNvbnRhaW5zIiwib3Blbk1vZGFsIiwiY3JlYXRlZEF0IiwiZm9ybWF0dGVkQ3JlYXRlZEF0IiwidG9Mb2NhbGVTdHJpbmciLCJzZWNvbmRzIiwiZm9ybWF0RHVyYXRpb24iLCJ1Iiwic3RhdGVzIiwic2V0U3RhdGVzIiwianVyaXNkaWN0aW9ucyIsInNldEp1cmlzZGljdGlvbnMiLCJqdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZWxlY3RlZFN0YXRlIiwic2V0U2VsZWN0ZWRTdGF0ZSIsInNlbGVjdGVkSnVyaXNkaWN0aW9uIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24iLCJqdXJpc2RpY3Rpb25JbnB1dFZhbHVlIiwic2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZSIsImlzSW5pdGlhbE1vdW50IiwiaGFuZGxlSW5wdXRDaGFuZ2UiLCJmZXRjaCIsImpzb24iLCJoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyIsImp1cmlzZGljdGlvbk9jZGlkIiwianVyaXNkaWN0aW9uX29jZGlkIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGltaXQiLCJqdXIiLCJqdXJpc2RpY3Rpb25fb2NkaWRfc2x1ZyIsImZpbmQiLCJsb2NhdGlvbiIsImhyZWYiLCJqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCIsImp1cmlzZGljdGlvbkxpbmsiLCJzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCIsInNldFBlb3BsZSIsImdlb2pzb24iLCJzZXRHZW9qc29uIiwic2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZEVuY29kZWQiLCJyZXNwb25zZSIsImhhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZSIsImxvZyIsImxhdGxuZyIsInpvb20iLCJsYXQiLCJsbmciLCJvbkNoYW5nZSIsImV4aXN0aW5nTmFtZUNvbmZpZ3MiLCJuYW1lQ29uZmlncyIsInNldE5hbWVDb25maWdzIiwiZW50cmllcyIsImNhbm9uaWNhbCIsImFsdGVybmF0ZXMiLCJuZXdDYW5vbmljYWwiLCJzZXROZXdDYW5vbmljYWwiLCJuZXdBbHRlcm5hdGUiLCJzZXROZXdBbHRlcm5hdGUiLCJhIiwiY2ZnIiwiaWR4IiwicmVtb3ZlSWRlbnRpdHkiLCJhbHQiLCJhbHRJZHgiLCJyZW1vdmVBbHRlcm5hdGUiLCJhZGRBbHRlcm5hdGUiLCJvblN0YXJ0U2NyYXBlIiwic291cmNlVXJscyIsInNjcmFwZVNjb3BlIiwic2V0U2NyYXBlU2NvcGUiLCJjdXJyZW50VXJsIiwic2V0Q3VycmVudFVybCIsImN1cnJlbnRTb3VyY2VVcmxzIiwic2V0Q3VycmVudFNvdXJjZVVybHMiLCJoYW5kbGVTY29wZUNoYW5nZSIsImlzVmFsaWRVcmwiLCJ1cmxTdHJpbmciLCJVUkwiLCJjYW5TdGFydFNjcmFwZSIsImV2ZXJ5IiwidXBkYXRlZFVybHMiLCJoYW5kbGVTb3VyY2VVcmxDaGFuZ2UiLCJyZW1vdmVTb3VyY2VVcmwiLCJjb25maWdzIiwiaWRlbnRpdGllcyIsInN1Ym1pdFNjcmFwZSIsInNldERhdGEiLCJzY3JhcGVNb2RhbCIsInNzZVVybCIsImVycm9yIiwic3NlRXJyb3IiLCJlbmRwb2ludCIsInNldElzQ29ubmVjdGVkIiwic2V0RXJyb3IiLCJldmVudFNvdXJjZSIsInNldEV2ZW50U291cmNlIiwiZ2V0VXJsIiwiY29ubmVjdCIsImVzIiwiRXZlbnRTb3VyY2UiLCJvbm9wZW4iLCJvbm1lc3NhZ2UiLCJvbmVycm9yIiwiZGlzY29ubmVjdCIsImNsb3NlIiwiYXV0b0Nvbm5lY3QiLCJ1c2VTU0UiLCJmZXRjaERhdGEiLCJhc3luYyIsImp1cmlzZGljdGlvbkRhdGEiLCJwZW9wbGVEYXRhIiwiYWxsIiwiZmV0Y2hKdXJpc2RpY3Rpb25EYXRhIiwiZmV0Y2hQZW9wbGVEYXRhIiwib2NkaWQiLCJnZW9fY2VudGVyIiwiZW5jb2RlZE9jZGlkIiwic2NyYXBlU3RhdHVzIiwiZ2VvaWQiLCJwb3B1bGF0aW9uIiwiZGV0YWlscyIsImJvZHkiLCJjb25maWciLCJoZWFkZXJzIiwibWV0aG9kIiwicmVnaXN0ZXJDaXZNYXAiXSwibWFwcGluZ3MiOiI7Ozs7OztBQVVBLE1BQU1BLEVBQVNDLFdBTVRDLEVBQ0NDLElBQ29CSCxFQUNkSSx1QkFJTEosRUFBT0ssY0FBYyxJQUFJQyxZQUFZLFlBQWEsQ0FDOUNDLE9BQVFKLE1BT3BCLElBQ0lLLEVBREFDLEVBQW1CLEVBR25CVCxFQUFPVSxvQkFBc0IsSUFBSUMsSUFNakNILEVBQWUsQ0FBQ0ksRUFBTUMsS0FDbEJBLEdBQVdELEVBQ0wsNEJBQTRCQSwwQkFDNUIsR0FDRFosRUFBT1Usa0JBQWtCSSxJQUFJRCxJQUM3QmIsRUFBT1Usa0JBQWtCSSxJQUFJRixLQUM5QkcsUUFBUUMsS0FBS0gsR0FDYmIsRUFBT1Usa0JBQWtCTyxJQUFJSixLQUdyQ0ssZUFBZSxLQUNYVixFQUFhLFdBQVkseURBR2pDLE1BQU1XLEVBQ0ZuQixFQUFPb0IsVUFBVUMsUUFDWSxJQUE3QnJCLEVBQU9vQixVQUFVRSxRQUNmdEIsRUFBT29CLFNBQVNELEtBQ2ZJLEdBQVNBLEVBQ1ZDLEVBQWV4QixFQUFPd0IsYUFTdEJDLEVBQVNELEVBQ1RBLEVBQWFFLGFBQWEsV0FBWSxDQUNwQ0MsV0FBYUMsR0FBTUEsU0FFckJDLEVBQ0FDLEVBQW9CQyxHQUFVQSxFQUM5QkMsRUFBZ0IsQ0FBQ0MsRUFBT0MsRUFBT0MsSUFBVUwsRUFFekNNLEVBQWdCQyxJQUlsQixHQUFJQyxJQUE2Qk4sRUFDN0IsTUFBTSxJQUFJTyxNQUFNLHVIQUdwQkQsRUFBMkJELEdBS3pCRyxFQUFnRCxLQUNsREYsRUFBMkJOLEdBRXpCUyxFQUFrQixDQUFDbEIsRUFBTW1CLEVBQU1DLElBQzFCTCxFQUF5QmYsRUFBTW1CLEVBQU1DLEdBSTFDQyxFQUF1QixRQUt2QkMsRUFBUyxPQUFPQyxLQUFLQyxTQUFTQyxRQUFRLEdBQUdDLE1BQU0sTUFFL0NDLEVBQWMsSUFBTUwsRUFHcEJNLEVBQWEsSUFBSUQsS0FDakJFLEVBTUFDLFNBRUFDLEVBQWUsSUFBTUYsRUFBRUcsY0FBYyxJQUNyQ0MsRUFBZXpCLEdBQW9CLE9BQVZBLEdBQW1DLGlCQUFUQSxHQUFxQyxtQkFBVEEsRUFDL0UwQixFQUFVQyxNQUFNRCxRQUloQkUsRUFBYSxjQWdCYkMsRUFBZSxzREFJZkMsRUFBa0IsT0FJbEJDLEVBQW1CLEtBdUJuQkMsRUFBYyxJQUFJQyxPQUFPLEtBQUtMLHNCQUFnQ0EsTUFBZUEsdUNBQWdELEtBSzdITSxFQUEwQixLQUMxQkMsRUFBMEIsS0FPMUJDLEVBQWlCLHFDQXVEVkMsR0FyQ0F6QixFQWhCTyxFQWdCRSxDQUFDMEIsS0FBWUMsS0FJZkQsRUFBUUUsS0FBTTNDLFFBQVlDLElBQU5ELElBQ2hDYixRQUFRQyxLQUFLLG9HQU9Uc0QsRUFBT0MsS0FBTUMsR0FBUUEsR0FBb0IsZUFDekNoRSxFQUFhLEdBQUksb05BSWxCLENBRUhpRSxXQUFnQjlCLEVBQ2hCMEIsVUFDQUMsWUFyQkksSUFBQzNCLEVBNEZOLE1BQU0rQixFQUFXQyxPQUFPQyxJQUFJLGdCQW9CdEJDLEVBQVVGLE9BQU9DLElBQUksZUFRNUJFLEVBQWdCLElBQUlDLFFBQ3BCQyxFQUFTNUIsRUFBRTZCLGlCQUFpQjdCLEVBQUcsS0FDckMsSUFBSWQsRUFBMkJOLEVBQy9CLFNBQVNrRCxFQUF3QkMsRUFBS0MsR0FNbEMsSUFBSzNCLEVBQVEwQixLQUFTQSxFQUFJRSxlQUFlLE9BQVEsQ0FDN0MsSUFBSUMsRUFBVSxpQ0FnQmQsTUFkSUEsRUFBVSw0bkJBV0xDLE9BQ0FDLFFBQVEsUUFBUyxNQUVwQixJQUFJakQsTUFBTStDLEVBQ3BCLENBQ0EsWUFBa0J6RCxJQUFYSixFQUNEQSxFQUFPRSxXQUFXeUQsR0FDbEJBLENBQ1YsQ0E0SkEsTUFBTUssRUFDRixXQUFBQyxFQUVBckIsUUFBRUEsRUFBU0ksV0FBZ0I5QixHQUFRZ0QsR0FFL0IsSUFBSXBFLEVBREpxRSxLQUFLQyxNQUFRLEdBRWIsSUFBSUMsRUFBWSxFQUNaQyxFQUFnQixFQUNwQixNQUFNQyxFQUFZM0IsRUFBUTRCLE9BQVMsRUFDN0JKLEVBQVFELEtBQUtDLE9BRVp6QixFQUFNOEIsR0ExSkcsRUFBQzdCLEVBQVMxQixLQU85QixNQUFNd0QsRUFBSTlCLEVBQVE0QixPQUFTLEVBSXJCQyxFQUFZLEdBQ2xCLElBSUlFLEVBSkFoQyxFQS9MVyxJQStMSnpCLEVBQXNCLFFBOUxmLElBOEx5QkEsRUFBeUIsU0FBVyxHQU8zRTBELEVBQVF6QyxFQUNaLElBQUssSUFBSTBDLEVBQUksRUFBR0EsRUFBSUgsRUFBR0csSUFBSyxDQUN4QixNQUFNMUUsRUFBSXlDLEVBQVFpQyxHQU1sQixJQUNJQyxFQUVBQyxFQUhBQyxHQUFtQixFQUVuQkMsRUFBWSxFQUloQixLQUFPQSxFQUFZOUUsRUFBRXFFLFNBRWpCSSxFQUFNSyxVQUFZQSxFQUNsQkYsRUFBUUgsRUFBTU0sS0FBSy9FLEdBQ0wsT0FBVjRFLElBSUosR0FEQUUsRUFBWUwsRUFBTUssVUFDZEwsSUFBVXpDLEdBQ1YsR0FBNkIsUUFBekI0QyxFQTNRRSxHQTRRRkgsRUFBUXhDLE9BRVAsUUFBNkJoQyxJQUF6QjJFLEVBOVFILEdBZ1JGSCxFQUFRdkMsT0FFUCxRQUF3QmpDLElBQXBCMkUsRUFqUlIsR0FrUk9yQyxFQUFleUMsS0FBS0osRUFsUjNCLE1BcVJPSixFQUFrQixJQUFJcEMsT0FBTyxLQUFLd0MsRUFyUnpDLEtBcVI0RCxNQUV6REgsRUFBUXRDLE9BRVAsUUFBZ0NsQyxJQUE1QjJFLEVBeFJBLEdBMFJELE1BQU0sSUFBSWpFLE1BQU0seUpBTW5COEQsSUFBVXRDLEVBQ2EsTUFBeEJ5QyxFQXBRQyxJQXVRREgsRUFBUUQsR0FBbUJ4QyxFQUczQjZDLEdBQW1CLFFBRVk1RSxJQUExQjJFLEVBM1FGLEdBNlFIQyxHQUFtQixHQUduQkEsRUFBbUJKLEVBQU1LLFVBQVlGLEVBL1EvQixHQStRd0RQLE9BQzlETSxFQUFXQyxFQWpSUixHQWtSSEgsT0FDMEJ4RSxJQUF0QjJFLEVBalJMLEdBa1JXekMsRUFDc0IsTUFBdEJ5QyxFQW5SWCxHQW9SZXRDLEVBQ0FELEdBR2JvQyxJQUFVbkMsR0FDZm1DLElBQVVwQyxFQUNWb0MsRUFBUXRDLEVBRUhzQyxJQUFVeEMsR0FBbUJ3QyxJQUFVdkMsRUFDNUN1QyxFQUFRekMsR0FLUnlDLEVBQVF0QyxFQUNScUMsT0FBa0J2RSxHQU90QmQsUUFBUThGLFFBQTRCLElBQXJCSixHQUNYSixJQUFVdEMsR0FDVnNDLElBQVVwQyxHQUNWb0MsSUFBVW5DLEVBQXlCLDRCQWMzQyxNQUFNNEMsRUFBTVQsSUFBVXRDLEdBQWVNLEVBQVFpQyxFQUFJLEdBQUdTLFdBQVcsTUFBUSxJQUFNLEdBQzdFM0MsR0FDSWlDLElBQVV6QyxFQUNKaEMsRUFBSXVCLEVBQ0pzRCxHQUFvQixHQUNmUCxFQUFVYyxLQUFLVCxHQUNkM0UsRUFBRXFCLE1BQU0sRUFBR3dELEdBQ1A3RCxFQUNBaEIsRUFBRXFCLE1BQU13RCxHQUNaNUQsRUFDQWlFLEdBQ0ZsRixFQUFJaUIsSUFBK0IsSUFBckI0RCxFQUEwQkgsRUFBSVEsRUFDOUQsQ0FLQSxNQUFPLENBQUM1QixFQUF3QmIsRUFKYkQsR0FDZEMsRUFBUThCLElBQU0sUUE3VEosSUE4VFZ4RCxFQUFzQixTQTdUVCxJQTZUb0JBLEVBQXlCLFVBQVksS0FFckJ1RCxJQWF4QmUsQ0FBZ0I1QyxFQUFTMUIsR0FJbkQsR0FIQWlELEtBQUtzQixHQUFLekIsRUFBUzBCLGNBQWMvQyxFQUFNdUIsR0FDdkNYLEVBQU9vQyxZQUFjeEIsS0FBS3NCLEdBQUdHLFFBL1VsQixJQWlWUDFFLEdBaFZVLElBZ1ZhQSxFQUF3QixDQUMvQyxNQUFNMkUsRUFBVTFCLEtBQUtzQixHQUFHRyxRQUFRRSxXQUNoQ0QsRUFBUUUsZUFBZUYsRUFBUUcsV0FDbkMsQ0FFQSxLQUFzQyxRQUE5QmxHLEVBQU95RCxFQUFPMEMsYUFBd0I3QixFQUFNSSxPQUFTRCxHQUFXLENBQ3BFLEdBQXNCLElBQWxCekUsRUFBS29HLFNBQWdCLENBQ1AsQ0FDVixNQUFNQyxFQUFNckcsRUFBS3NHLFVBS2pCLEdBQUksMkJBQTJCakIsS0FBS2dCLElBQ2hDckcsRUFBS3VHLFVBQVVDLFNBQVNsRixHQUFTLENBQ2pDLE1BQU1tRixFQUFJLDBDQUEwQ0osdURBQ0dBLDBCQUV2RCxHQUFZLGFBQVJBLEVBQ0EsTUFBTSxJQUFJckYsTUFBTXlGLEdBR2hCeEgsRUFBYSxHQUFJd0gsRUFDekIsQ0FDSixDQUlBLEdBQUl6RyxFQUFLMEcsZ0JBQ0wsSUFBSyxNQUFNdkYsS0FBUW5CLEVBQUsyRyxvQkFDcEIsR0FBSXhGLEVBQUt5RixTQUFTdkYsR0FBdUIsQ0FDckMsTUFBTXdGLEVBQVdsQyxFQUFVSCxLQUVyQnNDLEVBRFE5RyxFQUFLK0csYUFBYTVGLEdBQ1Y2RixNQUFNMUYsR0FDdEJtRixFQUFJLGVBQWVyQixLQUFLeUIsR0FDOUJ2QyxFQUFNbUIsS0FBSyxDQUNQckUsS0FqWFQsRUFrWFM2RixNQUFPMUMsRUFDUHBELEtBQU1zRixFQUFFLEdBQ1IzRCxRQUFTZ0UsRUFDVEksS0FBZSxNQUFUVCxFQUFFLEdBQ0ZVLEVBQ1MsTUFBVFYsRUFBRSxHQUNFVyxFQUNTLE1BQVRYLEVBQUUsR0FDRVksRUFDQUMsSUFFbEJ0SCxFQUFLdUgsZ0JBQWdCcEcsRUFDekIsTUFDU0EsRUFBS3FFLFdBQVdsRSxLQUNyQmdELEVBQU1tQixLQUFLLENBQ1ByRSxLQTVYWCxFQTZYVzZGLE1BQU8xQyxJQUVYdkUsRUFBS3VILGdCQUFnQnBHLElBTWpDLEdBQUl5QixFQUFleUMsS0FBS3JGLEVBQUt3SCxTQUFVLENBSW5DLE1BQU0xRSxFQUFVOUMsRUFBS3lILFlBQVlULE1BQU0xRixHQUNqQzZELEVBQVlyQyxFQUFRNEIsT0FBUyxFQUNuQyxHQUFJUyxFQUFZLEVBQUcsQ0FDZm5GLEVBQUt5SCxZQUFjeEgsRUFDYkEsRUFBYXlILFlBQ2IsR0FHTixJQUFLLElBQUkzQyxFQUFJLEVBQUdBLEVBQUlJLEVBQVdKLElBQzNCL0UsRUFBSzJILE9BQU83RSxFQUFRaUMsR0FBSWhELEtBRXhCMEIsRUFBTzBDLFdBQ1A3QixFQUFNbUIsS0FBSyxDQUFFckUsS0F6WnRCLEVBeVp3QzZGLFFBQVMxQyxJQUs1Q3ZFLEVBQUsySCxPQUFPN0UsRUFBUXFDLEdBQVlwRCxJQUNwQyxDQUNKLENBQ0osTUFDSyxHQUFzQixJQUFsQi9CLEVBQUtvRyxTQUFnQixDQUUxQixHQURhcEcsRUFBSzRILE9BQ0xqRyxFQUNUMkMsRUFBTW1CLEtBQUssQ0FBRXJFLEtBcmFkLEVBcWFnQzZGLE1BQU8xQyxRQUVyQyxDQUNELElBQUlRLEdBQUksRUFDUixXQUFRQSxFQUFJL0UsRUFBSzRILEtBQUtDLFFBQVF2RyxFQUFReUQsRUFBSSxLQUd0Q1QsRUFBTW1CLEtBQUssQ0FBRXJFLEtBdmFoQixFQXVhb0M2RixNQUFPMUMsSUFFeENRLEdBQUt6RCxFQUFPb0QsT0FBUyxDQUU3QixDQUNKLENBQ0FILEdBQ0osQ0FRSSxHQUFJSSxFQUFVRCxTQUFXRixFQUNyQixNQUFNLElBQUl4RCxNQUFNLDhRQU1aOEIsRUFBUWdGLEtBQUssVUFDYixLQU1abkosR0FDSUEsRUFBYyxDQUNWb0osS0FBTSxnQkFDTkMsU0FBVTNELEtBQ1Y0RCxpQkFBa0I1RCxLQUFLc0IsR0FDdkJyQixNQUFPRCxLQUFLQyxNQUNaeEIsV0FFWixDQUdBLG9CQUFPOEMsQ0FBYy9DLEVBQU1xRixHQUN2QixNQUFNdkMsRUFBSzlELEVBQUUrRCxjQUFjLFlBRTNCLE9BREFELEVBQUdZLFVBQVkxRCxFQUNSOEMsQ0FDWCxFQUVKLFNBQVN3QyxFQUFpQkMsRUFBTTVILEVBQU82SCxFQUFTRCxFQUFNRSxHQUdsRCxHQUFJOUgsSUFBVTJDLEVBQ1YsT0FBTzNDLEVBRVgsSUFBSStILE9BQXNDakksSUFBbkJnSSxFQUNqQkQsRUFBT0csZUFBZUYsR0FDdEJELEVBQU9JLFlBQ2IsTUFBTUMsRUFBMkJ6RyxFQUFZekIsUUFDdkNGLEVBRUVFLEVBQXVCLGdCQXNCL0IsT0FyQkkrSCxHQUFrQnBFLGNBQWdCdUUsSUFFbENILEdBQXVELHNDQUFJLFFBQzFCakksSUFBN0JvSSxFQUNBSCxPQUFtQmpJLEdBR25CaUksRUFBbUIsSUFBSUcsRUFBeUJOLEdBQ2hERyxFQUFpQkksYUFBYVAsRUFBTUMsRUFBUUMsU0FFekJoSSxJQUFuQmdJLEdBQ0NELEVBQU9HLGVBQWlCLElBQUlGLEdBQ3pCQyxFQUdKRixFQUFPSSxZQUFjRixRQUdKakksSUFBckJpSSxJQUNBL0gsRUFBUTJILEVBQWlCQyxFQUFNRyxFQUFpQkssVUFBVVIsRUFBTTVILEVBQU11QyxRQUFTd0YsRUFBa0JELElBRTlGOUgsQ0FDWCxDQUtBLE1BQU1xSSxFQUNGLFdBQUExRSxDQUFZNkQsRUFBVUssR0FDbEJoRSxLQUFLeUUsUUFBVSxHQUVmekUsS0FBSzBFLDhCQUEyQnpJLEVBQ2hDK0QsS0FBSzJFLFdBQWFoQixFQUNsQjNELEtBQUs0RSxTQUFXWixDQUNwQixDQUVBLGNBQUlhLEdBQ0EsT0FBTzdFLEtBQUs0RSxTQUFTQyxVQUN6QixDQUVBLGlCQUFJQyxHQUNBLE9BQU85RSxLQUFLNEUsU0FBU0UsYUFDekIsQ0FHQSxNQUFBQyxDQUFPaEYsR0FDSCxNQUFRdUIsSUFBSUcsUUFBRUEsR0FBV3hCLE1BQU9BLEdBQVdELEtBQUsyRSxXQUMxQ0ssR0FBWWpGLEdBQVNrRixlQUFpQnpILEdBQUcwSCxXQUFXekQsR0FBUyxHQUNuRXJDLEVBQU9vQyxZQUFjd0QsRUFDckIsSUFBSXJKLEVBQU95RCxFQUFPMEMsV0FDZDVCLEVBQVksRUFDWmlGLEVBQVksRUFDWkMsRUFBZW5GLEVBQU0sR0FDekIsVUFBd0JoRSxJQUFqQm1KLEdBQTRCLENBQy9CLEdBQUlsRixJQUFja0YsRUFBYXhDLE1BQU8sQ0FDbEMsSUFBSW1CLEVBOWhCRCxJQStoQkNxQixFQUFhckksS0FDYmdILEVBQU8sSUFBSXNCLEVBQVUxSixFQUFNQSxFQUFLMkosWUFBYXRGLEtBQU1ELEdBamlCaEQsSUFtaUJFcUYsRUFBYXJJLEtBQ2xCZ0gsRUFBTyxJQUFJcUIsRUFBYXZDLEtBQUtsSCxFQUFNeUosRUFBYXRJLEtBQU1zSSxFQUFhM0csUUFBU3VCLEtBQU1ELEdBL2hCakYsSUFpaUJJcUYsRUFBYXJJLE9BQ2xCZ0gsRUFBTyxJQUFJd0IsRUFBWTVKLEVBQU1xRSxLQUFNRCxJQUV2Q0MsS0FBS3lFLFFBQVFyRCxLQUFLMkMsR0FDbEJxQixFQUFlbkYsSUFBUWtGLEVBQzNCLENBQ0lqRixJQUFja0YsR0FBY3hDLFFBQzVCakgsRUFBT3lELEVBQU8wQyxXQUNkNUIsSUFFUixDQUtBLE9BREFkLEVBQU9vQyxZQUFjaEUsRUFDZHdILENBQ1gsQ0FDQSxPQUFBUSxDQUFROUcsR0FDSixJQUFJZ0MsRUFBSSxFQUNSLElBQUssTUFBTXFELEtBQVEvRCxLQUFLeUUsYUFDUHhJLElBQVQ4SCxJQUNBekosR0FDSUEsRUFBYyxDQUNWb0osS0FBTSxXQUNOSyxPQUNBNUgsTUFBT3VDLEVBQU9nQyxHQUNkK0UsV0FBWS9FLEVBQ1poQyxTQUNBZ0gsaUJBQWtCMUYsWUFFTC9ELElBQWpCOEgsRUFBS3RGLFNBQ0xzRixFQUFLNEIsV0FBV2pILEVBQVFxRixFQUFNckQsR0FJOUJBLEdBQUtxRCxFQUFLdEYsUUFBUTRCLE9BQVMsR0FHM0IwRCxFQUFLNEIsV0FBV2pILEVBQU9nQyxLQUcvQkEsR0FFUixFQUVKLE1BQU0yRSxFQUVGLGlCQUFJUCxHQUlBLE9BQU85RSxLQUFLNEUsVUFBVUUsZUFBaUI5RSxLQUFLNEYsYUFDaEQsQ0FDQSxXQUFBOUYsQ0FBWStGLEVBQVdDLEVBQVM5QixFQUFRakUsR0FDcENDLEtBQUtqRCxLQTNsQk0sRUE0bEJYaUQsS0FBSytGLGlCQUFtQjlHLEVBSXhCZSxLQUFLMEUsOEJBQTJCekksRUFDaEMrRCxLQUFLZ0csWUFBY0gsRUFDbkI3RixLQUFLaUcsVUFBWUgsRUFDakI5RixLQUFLNEUsU0FBV1osRUFDaEJoRSxLQUFLRCxRQUFVQSxFQUlmQyxLQUFLNEYsY0FBZ0I3RixHQUFTbUcsY0FBZSxFQUd6Q2xHLEtBQUttRyxvQkFBaUJsSyxDQUU5QixDQW1CQSxjQUFJNEksR0FDQSxJQUFJQSxFQUFhdEosRUFBS3lFLEtBQUtnRyxhQUFhbkIsV0FDeEMsTUFBTWIsRUFBU2hFLEtBQUs0RSxTQVFwQixZQVBlM0ksSUFBWCtILEdBQ3lCLEtBQXpCYSxHQUFZOUMsV0FJWjhDLEVBQWFiLEVBQU9hLFlBRWpCQSxDQUNYLENBS0EsYUFBSWdCLEdBQ0EsT0FBTzdGLEtBQUtnRyxXQUNoQixDQUtBLFdBQUlGLEdBQ0EsT0FBTzlGLEtBQUtpRyxTQUNoQixDQUNBLFVBQUFOLENBQVd4SixFQUFPaUssRUFBa0JwRyxNQUNoQyxHQUFvQyxPQUFwQkEsS0FBSzZFLFdBQ2pCLE1BQU0sSUFBSWxJLE1BQU0sdVVBR3BCLEdBREFSLEVBQVEySCxFQUFpQjlELEtBQU03RCxFQUFPaUssR0FDbEN4SSxFQUFZekIsR0FJUkEsSUFBVThDLEdBQW9CLE1BQVQ5QyxHQUEyQixLQUFWQSxHQUNsQzZELEtBQUsrRixtQkFBcUI5RyxJQUMxQjNFLEdBQ0lBLEVBQWMsQ0FDVm9KLEtBQU0sMEJBQ04yQyxNQUFPckcsS0FBS2dHLFlBQ1o5RSxJQUFLbEIsS0FBS2lHLFVBQ1ZqQyxPQUFRaEUsS0FBSzRFLFNBQ2I3RSxRQUFTQyxLQUFLRCxVQUV0QkMsS0FBS3NHLFdBRVR0RyxLQUFLK0YsaUJBQW1COUcsR0FFbkI5QyxJQUFVNkQsS0FBSytGLGtCQUFvQjVKLElBQVUyQyxHQUNsRGtCLEtBQUt1RyxZQUFZcEssUUFJcEIsUUFBNEJGLElBQXhCRSxFQUFrQixXQUN2QjZELEtBQUt3RyxzQkFBc0JySyxRQUUxQixRQUF1QkYsSUFBbkJFLEVBQU00RixTQUF3QixDQUNuQyxHQUFnQi9CLEtBQUtELFNBQVMwRyxPQUFTdEssRUFJbkMsT0FIQTZELEtBQUt1RyxZQUFZLG9IQUVqQnBMLFFBQVFDLEtBQUssd0NBQXlDZSxFQUFPLG1FQUFvRSw4REFBOEQsbUVBQW9FLDZDQUd2UTZELEtBQUswRyxZQUFZdkssRUFDckIsS0F4d0JXLENBQUNBLEdBQVUwQixFQUFRMUIsSUFFRSxtQkFBN0JBLElBQVE0QyxPQUFPNEgsVUF1d0JUQyxDQUFXekssR0FDaEI2RCxLQUFLNkcsZ0JBQWdCMUssR0FJckI2RCxLQUFLdUcsWUFBWXBLLEVBRXpCLENBQ0EsT0FBQTJLLENBQVFuTCxHQUNKLE9BQU9KLEVBQUtBLEVBQUt5RSxLQUFLZ0csYUFBYW5CLFlBQVlrQyxhQUFhcEwsRUFBTXFFLEtBQUtpRyxVQUMzRSxDQUNBLFdBQUFTLENBQVl2SyxHQUNSLEdBQUk2RCxLQUFLK0YsbUJBQXFCNUosRUFBTyxDQUVqQyxHQURBNkQsS0FBS3NHLFVBRUQ1SixJQUE2Qk4sRUFBZSxDQUM1QyxNQUFNNEssRUFBaUJoSCxLQUFLZ0csWUFBWW5CLFlBQVlvQyxTQUNwRCxHQUF1QixVQUFuQkQsR0FBaUQsV0FBbkJBLEVBQTZCLENBQzNELElBQUl0SCxFQUFVLFlBbUJkLE1BaEJRQSxFQURtQixVQUFuQnNILEVBRUksNFRBVUEseUhBS04sSUFBSXJLLE1BQU0rQyxFQUNwQixDQUNKLENBQ0FwRixHQUNJQSxFQUFjLENBQ1ZvSixLQUFNLGNBQ04yQyxNQUFPckcsS0FBS2dHLFlBQ1poQyxPQUFRaEUsS0FBSzRFLFNBQ2J6SSxNQUFPQSxFQUNQNEQsUUFBU0MsS0FBS0QsVUFFdEJDLEtBQUsrRixpQkFBbUIvRixLQUFLOEcsUUFBUTNLLEVBQ3pDLENBQ0osQ0FDQSxXQUFBb0ssQ0FBWXBLLEdBSVIsR0FBSTZELEtBQUsrRixtQkFBcUI5RyxHQUMxQnJCLEVBQVlvQyxLQUFLK0Ysa0JBQW1CLENBQ3BDLE1BQU1wSyxFQUFPSixFQUFLeUUsS0FBS2dHLGFBQWFWLGlCQUVKckosSUFBeEIrRCxLQUFLbUcsaUJBQ0xuRyxLQUFLbUcsZUFBaUJ0SixFQUFnQmxCLEVBQU0sT0FBUSxhQUV4RFEsRUFBUTZELEtBQUttRyxlQUFlaEssR0FFaEM3QixHQUNJQSxFQUFjLENBQ1ZvSixLQUFNLGNBQ04vSCxPQUNBUSxRQUNBNEQsUUFBU0MsS0FBS0QsVUFFdEJwRSxFQUFLNEgsS0FBT3BILENBQ2hCLEtBRXFDLENBQzdCLE1BQU0rSyxFQUFXMUosRUFBRTJKLGVBQWUsSUFDbENuSCxLQUFLMEcsWUFBWVEsUUFLV2pMLElBQXhCK0QsS0FBS21HLGlCQUNMbkcsS0FBS21HLGVBQWlCdEosRUFBZ0JxSyxFQUFVLE9BQVEsYUFFNUQvSyxFQUFRNkQsS0FBS21HLGVBQWVoSyxHQUM1QjdCLEdBQ0lBLEVBQWMsQ0FDVm9KLEtBQU0sY0FDTi9ILEtBQU11TCxFQUNOL0ssUUFDQTRELFFBQVNDLEtBQUtELFVBRXRCbUgsRUFBUzNELEtBQU9wSCxDQUNwQixDQVlKNkQsS0FBSytGLGlCQUFtQjVKLENBQzVCLENBQ0EscUJBQUFxSyxDQUFzQlksR0FFbEIsTUFBTTFJLE9BQUVBLEVBQVFHLFdBQWdCOUIsR0FBU3FLLEVBS25DekQsRUFBMkIsaUJBQVQ1RyxFQUNsQmlELEtBQUtxSCxjQUFjRCxTQUNObkwsSUFBWmMsRUFBS3VFLEtBQ0h2RSxFQUFLdUUsR0FBS3pCLEVBQVMwQixjQUFjakMsRUFBd0J2QyxFQUFLdUssRUFBR3ZLLEVBQUt1SyxFQUFFLElBQUt0SCxLQUFLRCxVQUNuRmhELEdBQ1IsR0FBSWlELEtBQUsrRixrQkFBa0JwQixhQUFlaEIsRUFDdENySixHQUNJQSxFQUFjLENBQ1ZvSixLQUFNLG9CQUNOQyxXQUNBNEQsU0FBVXZILEtBQUsrRixpQkFDZjlGLE1BQU9ELEtBQUsrRixpQkFBaUJ0QixRQUM3QjFFLFFBQVNDLEtBQUtELFFBQ2RyQixXQUVSc0IsS0FBSytGLGlCQUFpQlAsUUFBUTlHLE9BRTdCLENBQ0QsTUFBTTZJLEVBQVcsSUFBSS9DLEVBQWlCYixFQUFVM0QsTUFDMUNnRixFQUFXdUMsRUFBU3hDLE9BQU8vRSxLQUFLRCxTQUN0Q3pGLEdBQ0lBLEVBQWMsQ0FDVm9KLEtBQU0sd0JBQ05DLFdBQ0E0RCxXQUNBdEgsTUFBT3NILEVBQVM5QyxRQUNoQjFFLFFBQVNDLEtBQUtELFFBQ2RpRixXQUNBdEcsV0FFUjZJLEVBQVMvQixRQUFROUcsR0FDakJwRSxHQUNJQSxFQUFjLENBQ1ZvSixLQUFNLG9DQUNOQyxXQUNBNEQsV0FDQXRILE1BQU9zSCxFQUFTOUMsUUFDaEIxRSxRQUFTQyxLQUFLRCxRQUNkaUYsV0FDQXRHLFdBRVJzQixLQUFLMEcsWUFBWTFCLEdBQ2pCaEYsS0FBSytGLGlCQUFtQndCLENBQzVCLENBQ0osQ0FHQSxhQUFBRixDQUFjRCxHQUNWLElBQUl6RCxFQUFXekUsRUFBY3NJLElBQUlKLEVBQU8zSSxTQUl4QyxZQUhpQnhDLElBQWIwSCxHQUNBekUsRUFBY3VJLElBQUlMLEVBQU8zSSxRQUFVa0YsRUFBVyxJQUFJOUQsRUFBU3VILElBRXhEekQsQ0FDWCxDQUNBLGVBQUFrRCxDQUFnQjFLLEdBVVAwQixFQUFRbUMsS0FBSytGLG9CQUNkL0YsS0FBSytGLGlCQUFtQixHQUN4Qi9GLEtBQUtzRyxXQUlULE1BQU1vQixFQUFZMUgsS0FBSytGLGlCQUN2QixJQUNJNEIsRUFEQXhDLEVBQVksRUFFaEIsSUFBSyxNQUFNeUMsS0FBUXpMLEVBQ1hnSixJQUFjdUMsRUFBVXJILE9BS3hCcUgsRUFBVXRHLEtBQU11RyxFQUFXLElBQUl0QyxFQUFVckYsS0FBSzhHLFFBQVFwSixLQUFpQnNDLEtBQUs4RyxRQUFRcEosS0FBaUJzQyxLQUFNQSxLQUFLRCxVQUloSDRILEVBQVdELEVBQVV2QyxHQUV6QndDLEVBQVNoQyxXQUFXaUMsR0FDcEJ6QyxJQUVBQSxFQUFZdUMsRUFBVXJILFNBRXRCTCxLQUFLc0csUUFBUXFCLEdBQVlwTSxFQUFLb00sRUFBUzFCLFdBQVdYLFlBQWFILEdBRS9EdUMsRUFBVXJILE9BQVM4RSxFQUUzQixDQVlBLE9BQUFtQixDQUFRRCxFQUFROUssRUFBS3lFLEtBQUtnRyxhQUFhVixZQUFhdUMsR0FFaEQsSUFEQTdILEtBQUs4SCw2QkFBNEIsR0FBTyxFQUFNRCxHQUN2Q3hCLElBQVVyRyxLQUFLaUcsV0FBVyxDQUk3QixNQUFNOEIsRUFBSXhNLEVBQUs4SyxHQUFPZixZQUN0Qi9KLEVBQUs4SyxHQUFPMkIsU0FDWjNCLEVBQVEwQixDQUNaLENBQ0osQ0FRQSxZQUFBRSxDQUFhL0IsR0FDVCxRQUFzQmpLLElBQWxCK0QsS0FBSzRFLFNBS0wsTUFBTSxJQUFJakksTUFBTSxnRkFKaEJxRCxLQUFLNEYsY0FBZ0JNLEVBQ3JCbEcsS0FBSzhILDRCQUE0QjVCLEVBTXpDLEVBRUosTUFBTWpELEVBQ0YsV0FBSUUsR0FDQSxPQUFPbkQsS0FBS2tJLFFBQVEvRSxPQUN4QixDQUVBLGlCQUFJMkIsR0FDQSxPQUFPOUUsS0FBSzRFLFNBQVNFLGFBQ3pCLENBQ0EsV0FBQWhGLENBQVlvSSxFQUFTcEwsRUFBTTJCLEVBQVN1RixFQUFRakUsR0FDeENDLEtBQUtqRCxLQXI4QlUsRUF1OEJmaUQsS0FBSytGLGlCQUFtQjlHLEVBRXhCZSxLQUFLMEUsOEJBQTJCekksRUFDaEMrRCxLQUFLa0ksUUFBVUEsRUFDZmxJLEtBQUtsRCxLQUFPQSxFQUNaa0QsS0FBSzRFLFNBQVdaLEVBQ2hCaEUsS0FBS0QsUUFBVUEsRUFDWHRCLEVBQVE0QixPQUFTLEdBQW9CLEtBQWY1QixFQUFRLElBQTRCLEtBQWZBLEVBQVEsSUFDbkR1QixLQUFLK0YsaUJBQW1CLElBQUlqSSxNQUFNVyxFQUFRNEIsT0FBUyxHQUFHOEgsS0FBSyxJQUFJQyxRQUMvRHBJLEtBQUt2QixRQUFVQSxHQUdmdUIsS0FBSytGLGlCQUFtQjlHLEVBR3hCZSxLQUFLcUksZ0JBQWFwTSxDQUUxQixDQXVCQSxVQUFBMEosQ0FBV3hKLEVBQU9pSyxFQUFrQnBHLEtBQU15RixFQUFZNkMsR0FDbEQsTUFBTTdKLEVBQVV1QixLQUFLdkIsUUFFckIsSUFBSThKLEdBQVMsRUFDYixRQUFnQnRNLElBQVp3QyxFQUVBdEMsRUFBUTJILEVBQWlCOUQsS0FBTTdELEVBQU9pSyxFQUFpQixHQUN2RG1DLEdBQ0szSyxFQUFZekIsSUFDUkEsSUFBVTZELEtBQUsrRixrQkFBb0I1SixJQUFVMkMsRUFDbER5SixJQUNBdkksS0FBSytGLGlCQUFtQjVKLE9BRzNCLENBRUQsTUFBTXVDLEVBQVN2QyxFQUVmLElBQUl1RSxFQUFHOEgsRUFDUCxJQUZBck0sRUFBUXNDLEVBQVEsR0FFWGlDLEVBQUksRUFBR0EsRUFBSWpDLEVBQVE0QixPQUFTLEVBQUdLLElBQ2hDOEgsRUFBSTFFLEVBQWlCOUQsS0FBTXRCLEVBQU8rRyxFQUFhL0UsR0FBSTBGLEVBQWlCMUYsR0FDaEU4SCxJQUFNMUosSUFFTjBKLEVBQUl4SSxLQUFLK0YsaUJBQWlCckYsSUFFOUI2SCxLQUNLM0ssRUFBWTRLLElBQU1BLElBQU14SSxLQUFLK0YsaUJBQWlCckYsR0FDL0M4SCxJQUFNdkosRUFDTjlDLEVBQVE4QyxFQUVIOUMsSUFBVThDLElBQ2Y5QyxJQUFVcU0sR0FBSyxJQUFNL0osRUFBUWlDLEVBQUksSUFJckNWLEtBQUsrRixpQkFBaUJyRixHQUFLOEgsQ0FFbkMsQ0FDSUQsSUFBV0QsR0FDWHRJLEtBQUt5SSxhQUFhdE0sRUFFMUIsQ0FFQSxZQUFBc00sQ0FBYXRNLEdBQ0xBLElBQVU4QyxFQUNWMUQsRUFBS3lFLEtBQUtrSSxTQUFTaEYsZ0JBQWdCbEQsS0FBS2xELFlBSVpiLElBQXBCK0QsS0FBS3FJLGFBQ0xySSxLQUFLcUksV0FBYTNMLEVBQXlCc0QsS0FBS2tJLFFBQVNsSSxLQUFLbEQsS0FBTSxjQUV4RVgsRUFBUTZELEtBQUtxSSxXQUFXbE0sR0FBUyxJQUVyQzdCLEdBQ0lBLEVBQWMsQ0FDVm9KLEtBQU0sbUJBQ053RSxRQUFTbEksS0FBS2tJLFFBQ2RwTCxLQUFNa0QsS0FBS2xELEtBQ1hYLFFBQ0E0RCxRQUFTQyxLQUFLRCxVQUV0QnhFLEVBQUt5RSxLQUFLa0ksU0FBU1EsYUFBYTFJLEtBQUtsRCxLQUFPWCxHQUFTLElBRTdELEVBRUosTUFBTTJHLFVBQXFCRyxFQUN2QixXQUFBbkQsR0FDSTZJLFNBQVNDLFdBQ1Q1SSxLQUFLakQsS0FsakNTLENBbWpDbEIsQ0FFQSxZQUFBMEwsQ0FBYXRNLFFBRW1CRixJQUFwQitELEtBQUtxSSxhQUNMckksS0FBS3FJLFdBQWEzTCxFQUF5QnNELEtBQUtrSSxRQUFTbEksS0FBS2xELEtBQU0sYUFFeEVYLEVBQVE2RCxLQUFLcUksV0FBV2xNLEdBRTVCN0IsR0FDSUEsRUFBYyxDQUNWb0osS0FBTSxrQkFDTndFLFFBQVNsSSxLQUFLa0ksUUFDZHBMLEtBQU1rRCxLQUFLbEQsS0FDWFgsUUFDQTRELFFBQVNDLEtBQUtELFVBR3RCQyxLQUFLa0ksUUFBUWxJLEtBQUtsRCxNQUFRWCxJQUFVOEMsT0FBVWhELEVBQVlFLENBQzlELEVBRUosTUFBTTRHLFVBQTZCRSxFQUMvQixXQUFBbkQsR0FDSTZJLFNBQVNDLFdBQ1Q1SSxLQUFLakQsS0Exa0NrQixDQTJrQzNCLENBRUEsWUFBQTBMLENBQWF0TSxHQUNUN0IsR0FDSUEsRUFBYyxDQUNWb0osS0FBTSwyQkFDTndFLFFBQVNsSSxLQUFLa0ksUUFDZHBMLEtBQU1rRCxLQUFLbEQsS0FDWFgsU0FBVUEsR0FBU0EsSUFBVThDLEdBQzdCYyxRQUFTQyxLQUFLRCxVQUV0QnhFLEVBQUt5RSxLQUFLa0ksU0FBU1csZ0JBQWdCN0ksS0FBS2xELE9BQVFYLEdBQVNBLElBQVU4QyxFQUN2RSxFQUVKLE1BQU0rRCxVQUFrQkMsRUFDcEIsV0FBQW5ELENBQVlvSSxFQUFTcEwsRUFBTTJCLEVBQVN1RixFQUFRakUsR0FHeEMsR0FGQTRJLE1BQU1ULEVBQVNwTCxFQUFNMkIsRUFBU3VGLEVBQVFqRSxHQUN0Q0MsS0FBS2pELEtBM2xDTSxPQTRsQ3NCZCxJQUFqQitELEtBQUt2QixRQUNqQixNQUFNLElBQUk5QixNQUFNLFFBQVF1TCxFQUFRakcseUJBQXlCbkYsZ0lBSWpFLENBSUEsVUFBQTZJLENBQVdtRCxFQUFhMUMsRUFBa0JwRyxNQUd0QyxJQUZBOEksRUFDSWhGLEVBQWlCOUQsS0FBTThJLEVBQWExQyxFQUFpQixJQUFNbkgsS0FDM0NILEVBQ2hCLE9BRUosTUFBTWlLLEVBQWMvSSxLQUFLK0YsaUJBR25CaUQsRUFBd0JGLElBQWdCN0osR0FBVzhKLElBQWdCOUosR0FDckU2SixFQUFZRyxVQUNSRixFQUFZRSxTQUNoQkgsRUFBWUksT0FDUkgsRUFBWUcsTUFDaEJKLEVBQVlLLFVBQ1JKLEVBQVlJLFFBR2RDLEVBQW9CTixJQUFnQjdKLElBQ3JDOEosSUFBZ0I5SixHQUFXK0osR0FDaEMxTyxHQUNJQSxFQUFjLENBQ1ZvSixLQUFNLHdCQUNOd0UsUUFBU2xJLEtBQUtrSSxRQUNkcEwsS0FBTWtELEtBQUtsRCxLQUNYWCxNQUFPMk0sRUFDUC9JLFFBQVNDLEtBQUtELFFBQ2RzSixlQUFnQkwsRUFDaEJNLFlBQWFGLEVBQ2JMLGdCQUVKQyxHQUNBaEosS0FBS2tJLFFBQVFxQixvQkFBb0J2SixLQUFLbEQsS0FBTWtELEtBQU0rSSxHQUVsREssR0FDQXBKLEtBQUtrSSxRQUFRc0IsaUJBQWlCeEosS0FBS2xELEtBQU1rRCxLQUFNOEksR0FFbkQ5SSxLQUFLK0YsaUJBQW1CK0MsQ0FDNUIsQ0FDQSxXQUFBVyxDQUFZbFAsR0FDNkIsbUJBQTFCeUYsS0FBSytGLGlCQUNaL0YsS0FBSytGLGlCQUFpQjJELEtBQUsxSixLQUFLRCxTQUFTMEcsTUFBUXpHLEtBQUtrSSxRQUFTM04sR0FHL0R5RixLQUFLK0YsaUJBQWlCMEQsWUFBWWxQLEVBRTFDLEVBRUosTUFBTWdMLEVBQ0YsV0FBQXpGLENBQVlvSSxFQUFTbEUsRUFBUWpFLEdBQ3pCQyxLQUFLa0ksUUFBVUEsRUFDZmxJLEtBQUtqRCxLQXZwQ1EsRUF5cENiaUQsS0FBSzBFLDhCQUEyQnpJLEVBQ2hDK0QsS0FBSzRFLFNBQVdaLEVBQ2hCaEUsS0FBS0QsUUFBVUEsQ0FDbkIsQ0FFQSxpQkFBSStFLEdBQ0EsT0FBTzlFLEtBQUs0RSxTQUFTRSxhQUN6QixDQUNBLFVBQUFhLENBQVd4SixHQUNQN0IsR0FDSUEsRUFBYyxDQUNWb0osS0FBTSw0QkFDTndFLFFBQVNsSSxLQUFLa0ksUUFDZC9MLFFBQ0E0RCxRQUFTQyxLQUFLRCxVQUV0QitELEVBQWlCOUQsS0FBTTdELEVBQzNCLEVBdUNKLE1BQU13TixFQUNBdlAsRUFBT3dQLDhCQUViRCxJQUFrQjlKLEVBQVV3RixJQUczQmpMLEVBQU95UCxrQkFBb0IsSUFBSXpJLEtBQUssU0FDckJoSCxFQUFPeVAsZ0JBQWdCeEosT0FBUyxHQUM1Qy9FLGVBQWUsS0FDWFYsRUFBYSxvQkFBcUIsb0ZBNkJuQyxNQUFNa1AsRUFBUyxDQUFDM04sRUFBTzROLEVBQVdoSyxLQUNyQyxHQUE2QixNQUFiZ0ssRUFLWixNQUFNLElBQUlDLFVBQVUsMkNBQTJDRCxLQUVuRSxNQUFNRSxFQUFzQnBQLElBQ3RCcVAsRUFBZ0JuSyxHQUFTb0ssY0FBZ0JKLEVBRy9DLElBQUloRyxFQUFPbUcsRUFBMEIsV0FVckMsR0FUQTVQLEdBQ0lBLEVBQWMsQ0FDVm9KLEtBQU0sZUFDTjBHLEdBQUlILEVBQ0o5TixRQUNBNE4sWUFDQWhLLFVBQ0FnRSxjQUVLOUgsSUFBVDhILEVBQW9CLENBQ3BCLE1BQU0rQixFQUFVL0YsR0FBU29LLGNBQWdCLEtBR3pDRCxFQUEwQixXQUFJbkcsRUFBTyxJQUFJc0IsRUFBVTBFLEVBQVVoRCxhQUFhckosSUFBZ0JvSSxHQUFVQSxPQUFTN0osRUFBVzhELEdBQVcsQ0FBQSxFQUN2SSxDQVdBLE9BVkFnRSxFQUFLNEIsV0FBV3hKLEdBQ2hCN0IsR0FDSUEsRUFBYyxDQUNWb0osS0FBTSxhQUNOMEcsR0FBSUgsRUFDSjlOLFFBQ0E0TixZQUNBaEssVUFDQWdFLFNBRURBLEdDLzlDWCxJQUFJc0csRURrK0NBUCxFQUFPdE4sYUFBZUEsRUFDdEJzTixFQUFPak4sZ0JBQWtCQSxFQUVyQmlOLEVBQU9sTiw4Q0FDSEEsRUNyK0NaLElBQUkwTixFQUFZLEVBQ2hCLFNBQVNDLEVBQVdDLEdBQ2hCSCxFQUFVRyxDQUNkLENBQ0EsU0FBU0MsSUFDTEosRUFBVSxLQUNWQyxFQUFZLENBQ2hCLENDUkEsTUFBTUksRUFBYzNMLE9BQU8saUJBQ3JCNEwsRUFBYTVMLE9BQU8sZ0JBQ3BCNkwsR0FBZTdMLE9BQU8sa0JBQ3RCOEwsR0FBZTlMLE9BQU8sa0JBQ3RCK0wsR0FBZ0IvTCxPQUFPLG1CQUN2QmdNLEdBQXNCaE0sT0FBTyx5QkFDN0JpTSxHQUFlLGtCQ0pyQixNQUFNQyxHQUNGQyxPQUNBekUsS0FDQTBFLFFBQ0FSLENBQUNBLEdBQ0RHLENBQUNBLElBQ0RDLENBQUNBLElBQ0QsV0FBQWpMLENBQVlvTCxFQUFRekUsR0FDaEJ6RyxLQUFLa0wsT0FBU0EsRUFDZGxMLEtBQUt5RyxLQUFPQSxFQUNaekcsS0FBSzJLLEdBQWMsSUFBSVMsSUFDdkJwTCxLQUFLOEssSUFBaUIsR0FDdEI5SyxLQUFLK0ssSUFBdUIsRUFDaEMsQ0FDQSxHQUFBTSxDQUFJQyxHQUNBZixFQUFXdkssTUFDWCxJQUFJdUwsRUFBTUQsSUFFVixPQURBYixJQUNPYyxDQUNYLENBQ0EsV0FBQUMsQ0FBWUMsR0FDUixJQUFJQyxFQUFVMUwsS0FBS3lMLEdBQ25CbEIsRUFBV3ZLLE1BQ1gsSUFBSyxJQUFJMkwsS0FBVUQsRUFDZkMsRUFBT2pDLEtBQUsxSixNQUVoQnlLLEdBQ0osQ0FDQSxVQUFBbUIsR0FDSTVMLEtBQUt3TCxZQUFZVixHQUNyQixDQUNBLGdCQUFBZSxHQUNJN0wsS0FBS3dMLFlBQVlULEdBQ3JCLENBQ0EsUUFBQWUsR0FDZ0I5TCxLQUFLMkssR0FDWG9CLFFBQVNDLElBQ2tCLG1CQUFsQkEsRUFBS0YsVUFDWkUsRUFBS0YsWUFHakIsRUN6Q0osTUFBTUcsR0FBUUMsUUFBUUMsVUFBVUMsS0FBS0MsS0FBS0gsUUFBUUMsV0FDbEQsU0FBU0csS0FDTCxJQUNJbEMsRUFEQW1DLEVBQVEsR0FFWixTQUFTQyxJQUNMcEMsRUFBSyxLQUNMLElBQUlxQyxFQUFJRixFQUNSQSxFQUFRLEdBQ1IsSUFBSyxJQUFJN0wsRUFBSSxFQUFHZ00sRUFBTUQsRUFBRXBNLE9BQVFLLEVBQUlnTSxFQUFLaE0sSUFDckMrTCxFQUFFL0wsSUFFVixDQUNBLE9BQWlCaU0sSUFDYkosRUFBTW5MLEtBQUt1TCxHQUNELE1BQU52QyxJQUNBQSxFQUFLNkIsR0FBTU8sR0FFbkIsQ0FDSixDQUNBLE1BQU1JLEdBQU9OLEtBQ1BPLEdBQVFQLEtBQ2QsTUFBTVEsR0FDRkMsU0FDQXRHLEtBQ0ErRCxNQUNBRSxDQUFDQSxHQUNEc0MsY0FDQSxXQUFBbE4sQ0FBWWlOLEVBQVV0RyxHQUNsQnpHLEtBQUsrTSxTQUFXQSxFQUNoQi9NLEtBQUt5RyxLQUFPQSxFQUNaekcsS0FBS3dLLE1BQVEsSUFBSVMsR0FBTWpMLEtBQUtrTCxPQUFPbUIsS0FBS3JNLE1BQU95RyxHQUMvQ3pHLEtBQUswSyxHQUFlLEtBQ3BCMUssS0FBS2dOLGVBQWdCLENBQ3pCLENBQ0EsTUFBQTlCLEdBQ1FsTCxLQUFLZ04sZ0JBRVRKLEdBQUssS0FDRCxJQUFJeEYsRUFBU3BILEtBQUtpTixZQUFZckMsSUFDOUJpQyxHQUFNLEtBQ0Y3TSxLQUFLaU4sWUFBWXBDLEdBQWN6RCxHQUMvQnlGLEdBQU0sS0FDRjdNLEtBQUtpTixZQUFZbkMsUUFHekI5SyxLQUFLZ04sZUFBZ0IsSUFFekJoTixLQUFLZ04sZUFBZ0IsRUFDekIsQ0FDQSxXQUFBQyxDQUFZeEIsRUFBT3lCLEdBRWYsT0FEQWxOLEtBQUswSyxHQUFlZSxFQUNaQSxHQUNKLEtBQUtaLEdBR0QsT0FGQTdLLEtBQUttTixPQUFPRCxRQUNabE4sS0FBSzRMLFdBQVdiLElBRXBCLEtBQUtILEdBQ0QsT0FBTzVLLEtBQUs4SixTQUNoQixLQUFLZ0IsR0FDRCxPQUFPOUssS0FBSzRMLFdBQVdkLElBRW5DLENBQ0EsTUFBQWhCLEdBQ0ksT0FBTzlKLEtBQUt3SyxNQUFNYSxJQUFJLElBQU1yTCxLQUFLK00sU0FBU3JELEtBQUsxSixLQUFLeUcsS0FBTXpHLEtBQUt5RyxNQUNuRSxDQUNBLFVBQUFtRixDQUFXSCxHQUNQekwsS0FBS3dLLE1BQU1nQixZQUFZQyxFQUMzQixDQUNBLFFBQUFLLEdBQ0k5TCxLQUFLd0ssTUFBTXNCLFVBQ2YsRUN0RUosU0FBU3NCLEdBQWN0RCxHQUNuQixNQUFNdUQsVUFBa0JQLEdBQ3BCUSxLQUNBLFdBQUF4TixDQUFZaU4sRUFBVU8sRUFBTTdHLEdBQ3hCa0MsTUFBTW9FLEVBQVd0RyxHQUFRNkcsR0FDekJ0TixLQUFLc04sS0FBT0EsQ0FDaEIsQ0FDQSxNQUFBSCxDQUFPL0YsR0FDSDBDLEVBQU8xQyxFQUFRcEgsS0FBS3NOLEtBQ3hCLEVBNEZKLE9BMUZBLFNBQW1CUCxFQUFVUSxFQUFzQnhOLEdBQy9DLE1BQU15TixHQUFlek4sR0FBV3dOLEdBQXdCLENBQUEsR0FBSUUsYUFDeERDLGFBQ0VDLG1CQUFFQSxFQUFxQixHQUFFQyxhQUFFQSxHQUFlLEVBQUlDLGVBQUVBLEVBQWlCLElBQVE5TixHQUFXd04sR0FBd0IsQ0FBQSxFQUNsSCxNQUFNTyxVQUFnQk4sRUFDbEJPLFdBQ0EsNkJBQVdKLEdBQ1AsT0FBT1osRUFBU1ksb0JBQXNCQSxHQUFzQixFQUNoRSxDQUNBLFdBQUE3TixHQUNJNkksU0FDcUIsSUFBakJpRixFQUNBNU4sS0FBSytOLFdBQWEsSUFBSVYsRUFBVU4sRUFBVS9NLE9BRzFDQSxLQUFLZ08sYUFBYSxDQUFFQyxLQUFNLFVBQVdKLElBQ3JDN04sS0FBSytOLFdBQWEsSUFBSVYsRUFBVU4sRUFBVS9NLEtBQUtrTyxXQUFZbE8sTUFFbkUsQ0FDQSxpQkFBQW1PLEdBQ0luTyxLQUFLK04sV0FBVzdDLFFBQ3BCLENBQ0Esb0JBQUFrRCxHQUNJcE8sS0FBSytOLFdBQVdqQyxVQUNwQixDQUNBLHdCQUFBdUMsQ0FBeUJ2UixFQUFNd1IsRUFBVUMsR0FDckMsR0FBSUQsSUFBYUMsRUFDYixPQUVKLElBQUkzUCxFQUFtQixLQUFiMlAsR0FBeUJBLEVBQ25DQyxRQUFRL0csSUFBSXpILEtBMUNSLEVBQUNwQixFQUFNLEtBQU9BLEVBQUlnQixRQUFRLGNBQWUsQ0FBQzZPLEVBQUdDLElBQVVBLEVBQU9BLEVBQUtDLGNBQWdCLElBMENyRUMsQ0FBWTlSLEdBQU84QixFQUN6QyxFQXVCSixNQUFNaVEsRUFBUSxJQUFJQyxNQUFNdEIsRUFBWXVCLFVBQVcsQ0FDM0NDLGVBQWVDLEdBQ0pBLEVBRVgsR0FBQXhILENBQUl3SCxFQUFRQyxFQUFLL1MsRUFBT2dULEdBQ3BCLElBQUlDLEVBQ0osT0FBSUYsS0FBT0QsR0FDUEcsRUFBT0MsT0FBT0MseUJBQXlCTCxFQUFRQyxHQUMzQ0UsR0FBUUEsRUFBSzNILEtBQ2IySCxFQUFLM0gsSUFBSWlDLEtBQUt5RixFQUFVaFQsSUFDakIsSUFFWHFTLFFBQVEvRyxJQUFJd0gsRUFBUUMsRUFBSy9TLEVBQU9nVCxJQUN6QixLQUdQQyxFQURlLGlCQUFSRixHQUErQixNQUFYQSxFQUFJLEdBQ3hCLENBQ0hLLFlBQVksRUFDWkMsY0FBYyxFQUNkQyxVQUFVLEVBQ1Z0VCxTQXpDaEIsU0FBd0J1VCxHQUNwQixJQUFJdlQsRUFBUXVULEVBQ1JDLEdBQVUsRUFDZCxPQUFPTixPQUFPTyxPQUFPLENBQ2pCTCxZQUFZLEVBQ1pDLGNBQWMsRUFDZGhJLElBQUcsSUFDUXJMLEVBRVgsR0FBQXNMLENBQUk4RyxHQUVJb0IsR0FBV3hULElBQVVvUyxJQUV6Qm9CLEdBQVUsRUFDVnhULEVBQVFvUyxFQUNKdk8sS0FBSytOLFlBQ0wvTixLQUFLK04sV0FBVzdDLFNBRXhCLEdBRVIsQ0F5Qm1CMkUsQ0FBZTFULEdBRTFCa1QsT0FBT1MsZUFBZVgsRUFBVUQsRUFBS0UsR0FDakNBLEVBQUszSCxLQUNMMkgsRUFBSzNILElBQUlpQyxLQUFLeUYsRUFBVWhULElBRXJCLEVBQ1gsSUFHSixPQURBa1QsT0FBT1UsZUFBZWpDLEVBQVFpQixVQUFXRixHQUNsQ2YsQ0FDWCxDQUVKLENDdEdBLE1BQU1rQyxHQUNGNUYsR0FDQUksTUFDQSxXQUFBMUssQ0FBWXNLLEVBQUlJLEdBQ1p4SyxLQUFLb0ssR0FBS0EsRUFDVnBLLEtBQUt3SyxNQUFRQSxDQUNqQixFQUVKLFNBQVN5RixHQUFJRCxLQUFTRSxHQUNsQixJQUFJOUYsRUxER0UsSUtFSDZGLEVBQVE5RixFQUFRTSxHQUNoQnFCLEVBQU9tRSxFQUFNM0ksSUFBSTRDLEdBS3JCLE9BSks0QixJQUNEQSxFQUFPLElBQUlnRSxFQUFLNUYsRUFBSUMsS0FBWTZGLEdBQ2hDQyxFQUFNMUksSUFBSTJDLEVBQUk0QixJQUVYQSxFQUFLZCxVQUFVZ0YsRUFDMUIsQ0FDQSxTQUFTbEUsR0FBS2dFLEdBQ1YsT0FBT0MsR0FBSTVELEtBQUssS0FBTTJELEVBQzFCLENDckJBLFNBQVNJLEdBQWFDLEdBQ2xCLE9BQU9yRSxHQUFLLGNBQWNnRSxHQUN0Qk0sU0FDQUMsV0FDQTdSLE9BQ0E4UixVQUNBLFdBQUExUSxDQUFZc0ssRUFBSUksRUFBT2lHLEVBQVVDLEdBQzdCL0gsTUFBTXlCLEVBQUlJLEdBQ1Y2RixFQUFXN0YsRUFBT3hLLEtBQ3RCLENBQ0EsTUFBQWtMLENBQU9vRixFQUFVNVIsR0FDYnNCLEtBQUtzUSxTQUFXQSxFQUNoQnRRLEtBQUt0QixPQUFTQSxDQUNsQixDQUNBLElBQUFnTCxHQUNJLE1BQU1pSCxHQUFjM1EsS0FBS3RCLFFBQVVzQixLQUFLMlEsYUFDeEMzUSxLQUFLdVEsV0FBYXZRLEtBQUt0QixPQUNuQmlTLEdBQ0EzUSxLQUFLcUwsS0FFYixDQUNBLEdBQUFBLEdBQ0lyTCxLQUFLOEwsV0FDTDlMLEtBQUt3USxVQUFZeFEsS0FBS3NRLFNBQVM1RyxLQUFLMUosS0FBS3dLLE1BQzdDLENBQ0EsUUFBQXNCLEdBQ2tDLG1CQUFuQjlMLEtBQUt3USxXQUNaeFEsS0FBS3dRLFdBRWIsQ0FDQSxVQUFBRyxHQUNJLE9BQVMzUSxLQUFLdVEsWUFDVnZRLEtBQUt0QixPQUFPQyxLQUFLLENBQUN4QyxFQUFPdUUsSUFBTVYsS0FBS3VRLFdBQVc3UCxLQUFPdkUsRUFDOUQsR0FFUixDQ2xDQSxTQUFTa1UsR0FBVzdGLEVBQU9jLEdBQ3ZCZCxFQUFNTSxJQUFlMUosS0FBS2tLLEVBQzlCLENBT0EsTUFBTXNGLEdBQVlSLEdBQWFDLElDRnpCUSxHQUFhN0UsR0FBSyxjQUFjZ0UsR0FDbENjLFFBQ0EzVSxNQUNBNFUsV0FDQUMsYUFDQSxXQUFBbFIsQ0FBWXNLLEVBQUlJLEVBQU9pRSxHQUNuQjlGLE1BQU15QixFQUFJSSxHQUNWeEssS0FBS2lSLFNBQVdqUixLQUFLaVIsU0FBUzVFLEtBQUtyTSxNQUNuQ0EsS0FBSytRLFlBQWEsRUFDbEIvUSxLQUFLZ1IsYUFBZSxLQUNwQlgsR0FBVzdGLEVBQU94SyxLQUN0QixDQUNBLE1BQUFrTCxDQUFPNEYsR0FDSCxHQUFJOVEsS0FBS3dLLE1BQU1XLFFBQ1gsTUFBTSxJQUFJeE8sTUFBTSwwQ0FNcEIsT0FKSXFELEtBQUs4USxVQUFZQSxJQUNqQjlRLEtBQUtrUixXQUFXSixHQUNoQjlRLEtBQUs4USxRQUFVQSxHQUVaOVEsS0FBSzdELEtBQ2hCLENBQ0EsSUFBQXVOLEdBQ1MxSixLQUFLK1EsYUFDTi9RLEtBQUsrUSxZQUFhLEVBQ2QvUSxLQUFLZ1IsY0FDTGhSLEtBQUtnUixlQUNUaFIsS0FBS2tSLFdBQVdsUixLQUFLOFEsU0FDckI5USxLQUFLd0ssTUFBTVUsU0FFbkIsQ0FDQSxRQUFBK0YsQ0FBUzlVLEdBQ0w2RCxLQUFLN0QsTUFBUUEsRUFDYjZELEtBQUt3SyxNQUFNVSxRQUNmLENBQ0EsVUFBQWdHLENBQVdKLEdBQ1AsTUFBTW5XLEVBQVMsQ0FBRW1XLFVBQVNSLFNBQVV0USxLQUFLaVIsVUFDekNqUixLQUFLd0ssTUFBTS9ELEtBQUtoTSxjQUFjLElBQUlDLFlBQVlzUSxHQUFjLENBQ3hEclEsU0FDQXdXLFNBQVMsRUFDVEMsWUFBWSxFQUNaQyxVQUFVLEtBRWQsTUFBTUMsWUFBRUEsRUFBYyxLQUFJblYsTUFBRUEsR0FBVXhCLEVBQ3RDcUYsS0FBSzdELE1BQVFtVixFQUFjblYsRUFBUTJVLEVBQVFTLGFBQzNDdlIsS0FBS2dSLGFBQWVNLENBQ3hCLENBQ0EsUUFBQXhGLEdBQ1E5TCxLQUFLZ1IsY0FDTGhSLEtBQUtnUixjQUViLElDcERKLE1BQU1RLEdBQVV4RixHQUFLLGNBQWNnRSxHQUMvQjdULE1BQ0F1QyxPQUNBLFdBQUFvQixDQUFZc0ssRUFBSUksRUFBT2lILEVBQUkvUyxHQUN2QmlLLE1BQU15QixFQUFJSSxHQUNWeEssS0FBSzdELE1BQVFzVixJQUNielIsS0FBS3RCLE9BQVNBLENBQ2xCLENBQ0EsTUFBQXdNLENBQU91RyxFQUFJL1MsR0FLUCxPQUpJc0IsS0FBSzJRLFdBQVdqUyxLQUNoQnNCLEtBQUt0QixPQUFTQSxFQUNkc0IsS0FBSzdELE1BQVFzVixLQUVWelIsS0FBSzdELEtBQ2hCLENBQ0EsVUFBQXdVLENBQVdqUyxFQUFTLElBQ2hCLE9BQU9BLEVBQU9DLEtBQUssQ0FBQ3hDLEVBQU91RSxJQUFNVixLQUFLdEIsT0FBT2dDLEtBQU92RSxFQUN4RCxJQ2pCRXVWLEdBQWMsQ0FBQ0QsRUFBSUUsSUFBV0gsR0FBUSxJQUFNQyxFQUFJRSxHQ0c5QnZCLEdBVHhCLFNBQTBCNUYsRUFBT2MsR0FDN0JkLEVBQU1PLElBQXFCM0osS0FBS2tLLEVBQ3BDLEdDR0EsTUFBTXNHLEdBQVc1RixHQUFLLGNBQWNnRSxHQUNoQ0UsS0FDQSxXQUFBcFEsQ0FBWXNLLEVBQUlJLEVBQU9rRixHQUduQixHQUZBL0csTUFBTXlCLEVBQUlJLEdBQ1Z4SyxLQUFLNlIsUUFBVTdSLEtBQUs2UixRQUFReEYsS0FBS3JNLE1BQ0wsbUJBQWpCMFAsRUFBNkIsQ0FFcENBLEVBRGVBLEdBRW5CLENBQ0ExUCxLQUFLOFIsU0FBU3BDLEVBQ2xCLENBQ0EsTUFBQXhFLEdBQ0ksT0FBT2xMLEtBQUtrUSxJQUNoQixDQUNBLE9BQUEyQixDQUFRMVYsR0FDSixNQUFPNFYsR0FBaUIvUixLQUFLa1EsS0FDN0IsR0FBcUIsbUJBQVYvVCxFQUFzQixDQUU3QkEsRUFEa0JBLEVBQ0E0VixFQUN0QixDQUNJMUMsT0FBTzJDLEdBQUdELEVBQWU1VixLQUc3QjZELEtBQUs4UixTQUFTM1YsR0FDZDZELEtBQUt3SyxNQUFNVSxTQUNmLENBQ0EsUUFBQTRHLENBQVMzVixHQUNMNkQsS0FBS2tRLEtBQU9iLE9BQU9PLE9BQU8sQ0FBQ3pULEVBQU82RCxLQUFLNlIsU0FDM0M7Ozs7O0dDNUJjM0YsUUFBUUMsVUNLUEgsR0FBSyxjQUFjZ0UsR0FDbENpQyxRQUNBQyxhQUNBLFdBQUFwUyxDQUFZc0ssRUFBSUksRUFBT2lFLEVBQUcwRCxFQUFjQyxHQUNwQ3pKLE1BQU15QixFQUFJSSxHQUNWeEssS0FBS3FTLFNBQVdyUyxLQUFLcVMsU0FBU2hHLEtBQUtyTSxNQUNuQ0EsS0FBS2tTLGtCQUNRalcsSUFBVG1XLEVBQXFCQSxFQUFLRCxHQUFnQkEsQ0FDbEQsQ0FDQSxNQUFBakgsQ0FBTytHLEdBRUgsT0FEQWpTLEtBQUtpUyxRQUFVQSxFQUNSLENBQUNqUyxLQUFLa1MsYUFBY2xTLEtBQUtxUyxTQUNwQyxDQUNBLFFBQUFBLENBQVNDLEdBQ0x0UyxLQUFLa1MsYUFBZWxTLEtBQUtpUyxRQUFRalMsS0FBS2tTLGFBQWNJLEdBQ3BEdFMsS0FBS3dLLE1BQU1VLFFBQ2Y7Ozs7OztBQ3ZCRyxNQUFNcUgsR0FFRixFQW9CSixNQUFNQyxHQUNULFdBQUExUyxDQUFZMlMsR0FBYSxDQUV6QixpQkFBSTNOLEdBQ0EsT0FBTzlFLEtBQUs0RSxTQUFTRSxhQUN6QixDQUVBLFlBQUFSLENBQWFQLEVBQU1DLEVBQVFDLEdBQ3ZCakUsS0FBSzBTLE9BQVMzTyxFQUNkL0QsS0FBSzRFLFNBQVdaLEVBQ2hCaEUsS0FBSzJTLGlCQUFtQjFPLENBQzVCLENBRUEsU0FBQU0sQ0FBVVIsRUFBTTZPLEdBQ1osT0FBTzVTLEtBQUtrTCxPQUFPbkgsRUFBTTZPLEVBQzdCLENBQ0EsTUFBQTFILENBQU8ySCxFQUFPRCxHQUNWLE9BQU81UyxLQUFLOEosVUFBVThJLEVBQzFCOzs7OztHQ3hDSixNQUVNeFksR0FBU0MsV0FJRnlZLEdBQThCMVksR0FBTzJZLGtCQUN6QjlXLElBQXBCN0IsR0FBTzRZLFVBQTBCNVksR0FBTzRZLFNBQVNDLGVBQ2xELHVCQUF3QkMsU0FBU25FLFdBQ2pDLFlBQWFvRSxjQUFjcEUsVUFDekJxRSxHQUFvQnJVLFNBQ3BCc1UsR0FBYyxJQUFJbFUsUUFRakIsTUFBTW1VLEdBQ1QsV0FBQXhULENBQVl5VCxFQUFTOVUsRUFBUytVLEdBRzFCLEdBREF4VCxLQUFtQixjQUFJLEVBQ25Cd1QsSUFBY0osR0FDZCxNQUFNLElBQUl6VyxNQUFNLHFFQUVwQnFELEtBQUt1VCxRQUFVQSxFQUNmdlQsS0FBS3lULFNBQVdoVixDQUNwQixDQUdBLGNBQUlpVixHQUdBLElBQUlBLEVBQWExVCxLQUFLMlQsWUFDdEIsTUFBTWxWLEVBQVV1QixLQUFLeVQsU0FDckIsR0FBSVgsU0FBOEM3VyxJQUFmeVgsRUFBMEIsQ0FDekQsTUFBTUUsT0FBd0IzWCxJQUFad0MsR0FBNEMsSUFBbkJBLEVBQVE0QixPQUMvQ3VULElBQ0FGLEVBQWFMLEdBQVk3TCxJQUFJL0ksU0FFZHhDLElBQWZ5WCxLQUNDMVQsS0FBSzJULFlBQWNELEVBQWEsSUFBSVAsZUFBaUJVLFlBQVk3VCxLQUFLdVQsU0FDbkVLLEdBQ0FQLEdBQVk1TCxJQUFJaEosRUFBU2lWLEdBR3JDLENBQ0EsT0FBT0EsQ0FDWCxDQUNBLFFBQUFJLEdBQ0ksT0FBTzlULEtBQUt1VCxPQUNoQixFQXVCRyxNQXlDRFEsR0FBMkJDLElBQzdCLElBQUlULEVBQVUsR0FDZCxJQUFLLE1BQU1VLEtBQVFELEVBQU1FLFNBQ3JCWCxHQUFXVSxFQUFLVixRQUVwQixPQTlDZ0MsSUFBSUQsR0FBMkIsaUJBQXpDblgsRUE4Q0xvWCxHQTlDeURwWCxFQUFRaU0sT0FBT2pNLFFBQVFGLEVBQVdtWCxJQUF2RixJQUFDalgsR0FnRGJnWSxHQUFxQnJCLEdBRTNCOVcsR0FBTUEsRUFDTkEsR0FBTUEsYUFBYW1YLGNBQWdCWSxHQUF3Qi9YLEdBQUtBLEdDcEhqRWdXLEdBQUVBLEdBQUVsQyxlQUFFQSxHQUFjUix5QkFBRUEsR0FBd0I4RSxvQkFBRUEsR0FBbUJDLHNCQUFFQSxHQUFxQnJGLGVBQUVBLElBQW9CSyxPQUdoSGpWLEdBQVNDLFdBS2YsSUFBSU8sR0FDSixNQUFNZ0IsR0FBZXhCLEdBQ2hCd0IsYUFLQzBZLEdBQWlDMVksR0FDakNBLEdBQWF5SCxZQUNiLEdBQ0FzRyxHQUNBdlAsR0FBT21hLHNDQUtUbmEsR0FBT1Usb0JBQXNCLElBQUlDLElBTWpDSCxHQUFlLENBQUNJLEVBQU1DLEtBQ2xCQSxHQUFXLDRCQUE0QkQsMEJBQ2xDWixHQUFPVSxrQkFBa0JJLElBQUlELElBQzdCYixHQUFPVSxrQkFBa0JJLElBQUlGLEtBQzlCRyxRQUFRQyxLQUFLSCxHQUNiYixHQUFPVSxrQkFBa0JPLElBQUlKLEtBR3JDSyxlQUFlLEtBQ1hWLEdBQWEsV0FBWSx1REFFckJSLEdBQU9vQixVQUFVQyxZQUE2QlEsSUFBcEIwTixJQUMxQi9PLEdBQWEsMkJBQTRCLDBHQVVyRCxNQW1CTTRaLEdBQTRCLENBQUNDLEVBQU1DLElBQVNELEVBQ3JDRSxHQUFtQixDQUM1QixXQUFBQyxDQUFZelksRUFBT1ksR0FDZixPQUFRQSxHQUNKLEtBQUs4WCxRQUNEMVksRUFBUUEsRUFBUW1ZLEdBQWlDLEtBQ2pELE1BQ0osS0FBS2pGLE9BQ0wsS0FBS3ZSLE1BR0QzQixFQUFpQixNQUFUQSxFQUFnQkEsRUFBUTJZLEtBQUtDLFVBQVU1WSxHQUd2RCxPQUFPQSxDQUNYLEVBQ0EsYUFBQTZZLENBQWM3WSxFQUFPWSxHQUNqQixJQUFJa1ksRUFBWTlZLEVBQ2hCLE9BQVFZLEdBQ0osS0FBSzhYLFFBQ0RJLEVBQXNCLE9BQVY5WSxFQUNaLE1BQ0osS0FBSytZLE9BQ0RELEVBQXNCLE9BQVY5WSxFQUFpQixLQUFPK1ksT0FBTy9ZLEdBQzNDLE1BQ0osS0FBS2tULE9BQ0wsS0FBS3ZSLE1BSUQsSUFFSW1YLEVBQVlILEtBQUtLLE1BQU1oWixFQUMzQixDQUNBLE1BQU9pWixHQUNISCxFQUFZLElBQ2hCLEVBR1IsT0FBT0EsQ0FDWCxHQU1TSSxHQUFXLENBQUNsWixFQUFPbVosS0FBU3RELEdBQUc3VixFQUFPbVosR0FDN0NDLEdBQTZCLENBQy9CQyxXQUFXLEVBQ1h6WSxLQUFNcUwsT0FDTnFOLFVBQVdkLEdBQ1hlLFNBQVMsRUFDVEMsWUFBWSxFQUNaaEYsV0FBWTBFLElBSWhCdFcsT0FBTzZXLFdBQWE3VyxPQUFPLFlBSTNCM0UsR0FBT3liLHNCQUF3QixJQUFJMVcsUUFPNUIsTUFBTTJXLFdBU0pwSSxZQWtDTCxxQkFBT3FJLENBQWVDLEdBQ2xCaFcsS0FBS2lXLGFBQ0pqVyxLQUFLa1csZ0JBQWtCLElBQUk5VSxLQUFLNFUsRUFDckMsQ0FNQSw2QkFBV3JJLEdBT1AsT0FMQTNOLEtBQUttVyxXQUtHblcsS0FBS29XLDBCQUE0QixJQUFJcFcsS0FBS29XLHlCQUF5QkMsT0FDL0UsQ0EwQkEscUJBQU9DLENBQWV4WixFQUFNaUQsRUFBVXdWLElBYWxDLEdBWEl4VixFQUFReUssUUFDUnpLLEVBQVF5VixXQUFZLEdBRXhCeFYsS0FBS2lXLFlBR0RqVyxLQUFLK08sVUFBVXRQLGVBQWUzQyxNQUM5QmlELEVBQVVzUCxPQUFPa0gsT0FBT3hXLElBQ2hCeVcsU0FBVSxHQUV0QnhXLEtBQUt5VyxrQkFBa0JoUCxJQUFJM0ssRUFBTWlELElBQzVCQSxFQUFRMlcsV0FBWSxDQUNyQixNQUFNeEgsRUFHRW5RLE9BQU9DLElBQUksR0FBR29KLE9BQU90TCwwQkFFdkI2WixFQUFhM1csS0FBSzRXLHNCQUFzQjlaLEVBQU1vUyxFQUFLblAsUUFDdEM5RCxJQUFmMGEsR0FDQTdHLEdBQWU5UCxLQUFLK08sVUFBV2pTLEVBQU02WixFQUU3QyxDQUNKLENBNEJBLDRCQUFPQyxDQUFzQjlaLEVBQU1vUyxFQUFLblAsR0FDcEMsTUFBTXlILElBQUVBLEVBQUdDLElBQUVBLEdBQVE2SCxHQUF5QnRQLEtBQUsrTyxVQUFXalMsSUFBUyxDQUNuRSxHQUFBMEssR0FDSSxPQUFPeEgsS0FBS2tQLEVBQ2hCLEVBQ0EsR0FBQXpILENBQUllLEdBQ0F4SSxLQUFLa1AsR0FBTzFHLENBQ2hCLEdBRUosR0FBdUIsTUFBUGhCLEVBQWEsQ0FDekIsR0FBSSxVQUFZOEgsR0FBeUJ0UCxLQUFLK08sVUFBV2pTLElBQVMsQ0FBQSxHQUM5RCxNQUFNLElBQUlILE1BQU0sU0FBU21ZLEtBQUtDLFVBQVUzTSxPQUFPdEwsVUFDeENrRCxLQUFLbEQsa0tBSWhCbEMsR0FBYSxtQ0FBb0MsU0FBU2thLEtBQUtDLFVBQVUzTSxPQUFPdEwsVUFDekVrRCxLQUFLbEQsNEhBR2hCLENBQ0EsTUFBTyxDQUNIMEssTUFDQSxHQUFBQyxDQUFJdEwsR0FDQSxNQUFNbVMsRUFBVzlHLEdBQUtrQyxLQUFLMUosTUFDM0J5SCxHQUFLaUMsS0FBSzFKLEtBQU03RCxHQUNoQjZELEtBQUs2VyxjQUFjL1osRUFBTXdSLEVBQVV2TyxFQUN2QyxFQUNBeVAsY0FBYyxFQUNkRCxZQUFZLEVBRXBCLENBZUEseUJBQU91SCxDQUFtQmhhLEdBQ3RCLE9BQU9rRCxLQUFLeVcsa0JBQWtCalAsSUFBSTFLLElBQVN5WSxFQUMvQyxDQVlBLGdCQUFPVSxHQUNILEdBQUlqVyxLQUFLUCxlQUFlK1UsR0FBMEIsc0JBRTlDLE9BR0osTUFBTXVDLEVBQVkvSCxHQUFlaFAsTUFDakMrVyxFQUFVWixnQkFJc0JsYSxJQUE1QjhhLEVBQVViLGdCQUNWbFcsS0FBS2tXLGNBQWdCLElBQUlhLEVBQVViLGdCQUd2Q2xXLEtBQUt5VyxrQkFBb0IsSUFBSXJMLElBQUkyTCxFQUFVTixrQkFDL0MsQ0FZQSxlQUFPTixHQUNILEdBQUluVyxLQUFLUCxlQUFlK1UsR0FBMEIsY0FDOUMsT0FLSixHQUhBeFUsS0FBS2dYLFdBQVksRUFDakJoWCxLQUFLaVcsWUFFRGpXLEtBQUtQLGVBQWUrVSxHQUEwQixlQUFzQixDQUNwRSxNQUFNNUIsRUFBUTVTLEtBQUtpWCxXQUNiQyxFQUFXLElBQ1Y5QyxHQUFvQnhCLE1BQ3BCeUIsR0FBc0J6QixJQUU3QixJQUFLLE1BQU11RSxLQUFLRCxFQUNabFgsS0FBS3NXLGVBQWVhLEVBQUd2RSxFQUFNdUUsR0FFckMsQ0FFQSxNQUFNdkIsRUFBVzVWLEtBQUtqQixPQUFPNlcsVUFDN0IsR0FBaUIsT0FBYkEsRUFBbUIsQ0FDbkIsTUFBTXFCLEVBQWFwQixvQkFBb0JyTyxJQUFJb08sR0FDM0MsUUFBbUIzWixJQUFmZ2IsRUFDQSxJQUFLLE1BQU9FLEVBQUdwWCxLQUFZa1gsRUFDdkJqWCxLQUFLeVcsa0JBQWtCaFAsSUFBSTBQLEVBQUdwWCxFQUcxQyxDQUVBQyxLQUFLb1cseUJBQTJCLElBQUloTCxJQUNwQyxJQUFLLE1BQU8rTCxFQUFHcFgsS0FBWUMsS0FBS3lXLGtCQUFtQixDQUMvQyxNQUFNVyxFQUFPcFgsS0FBS3FYLDJCQUEyQkYsRUFBR3BYLFFBQ25DOUQsSUFBVG1iLEdBQ0FwWCxLQUFLb1cseUJBQXlCM08sSUFBSTJQLEVBQU1ELEVBRWhELENBQ0FuWCxLQUFLc1gsY0FBZ0J0WCxLQUFLdVgsZUFBZXZYLEtBQUt3WCxRQUV0Q3hYLEtBQUtQLGVBQWUsbUJBQ3BCN0UsR0FBYSw4QkFBK0IsdUhBRzVDb0YsS0FBS1AsZUFBZSwwQkFDcEI3RSxHQUFhLHNDQUF1Qyw2SEFJaEUsQ0FlQSxxQkFBTzJjLENBQWVDLEdBQ2xCLE1BQU1GLEVBQWdCLEdBQ3RCLEdBQUl4WixNQUFNRCxRQUFRMlosR0FBUyxDQUl2QixNQUFNL1AsRUFBTSxJQUFJMU0sSUFBSXljLEVBQU9DLEtBQUtDLEtBQVVDLFdBRTFDLElBQUssTUFBTTNiLEtBQUt5TCxFQUNaNlAsRUFBY00sUUFBUXpELEdBQW1CblksR0FFakQsV0FDb0JDLElBQVh1YixHQUNMRixFQUFjbFcsS0FBSytTLEdBQW1CcUQsSUFFMUMsT0FBT0YsQ0FDWCxDQUtBLGlDQUFPRCxDQUEyQnZhLEVBQU1pRCxHQUNwQyxNQUFNeVYsRUFBWXpWLEVBQVF5VixVQUMxQixPQUFxQixJQUFkQSxPQUNEdlosRUFDcUIsaUJBQWR1WixFQUNIQSxFQUNnQixpQkFBVDFZLEVBQ0hBLEVBQUsrYSxtQkFDTDViLENBQ2xCLENBQ0EsV0FBQTZELEdBQ0k2SSxRQUNBM0ksS0FBSzhYLDBCQUF1QjdiLEVBTTVCK0QsS0FBSytYLGlCQUFrQixFQU12Qi9YLEtBQUtnWSxZQUFhLEVBSWxCaFksS0FBS2lZLHFCQUF1QixLQUM1QmpZLEtBQUtrWSxjQUNULENBS0EsWUFBQUEsR0FDSWxZLEtBQUttWSxnQkFBa0IsSUFBSWpNLFFBQVNYLEdBQVN2TCxLQUFLb1ksZUFBaUI3TSxHQUNuRXZMLEtBQUtxWSxvQkFBc0IsSUFBSWpOLElBRy9CcEwsS0FBS3NZLDJCQUdMdFksS0FBSzZXLGdCQUNMN1csS0FBS0YsWUFBWW9XLGVBQWVuSyxRQUFTckwsR0FBTUEsRUFBRVYsTUFDckQsQ0FVQSxhQUFBdVksQ0FBY0MsSUFDVHhZLEtBQUt5WSxnQkFBa0IsSUFBSTFkLEtBQU9NLElBQUltZCxRQUtmdmMsSUFBcEIrRCxLQUFLMFksWUFBNEIxWSxLQUFLa0csYUFDdENzUyxFQUFXRyxpQkFFbkIsQ0FLQSxnQkFBQUMsQ0FBaUJKLEdBQ2J4WSxLQUFLeVksZUFBZUksT0FBT0wsRUFDL0IsQ0FPQSx3QkFBQUYsR0FDSSxNQUFNUSxFQUFxQixJQUFJMU4sSUFDekJxTCxFQUFvQnpXLEtBQUtGLFlBQzFCMlcsa0JBQ0wsSUFBSyxNQUFNVSxLQUFLVixFQUFrQkosT0FDMUJyVyxLQUFLUCxlQUFlMFgsS0FDcEIyQixFQUFtQnJSLElBQUkwUCxFQUFHblgsS0FBS21YLFdBQ3hCblgsS0FBS21YLElBR2hCMkIsRUFBbUJDLEtBQU8sSUFDMUIvWSxLQUFLOFgscUJBQXVCZ0IsRUFFcEMsQ0FVQSxnQkFBQUUsR0FDSSxNQUFNTixFQUFhMVksS0FBS2tPLFlBQ3BCbE8sS0FBS2dPLGFBQWFoTyxLQUFLRixZQUFZbVosbUJBRXZDLE1EL2NtQixFQUFDUCxFQUFZbEIsS0FDcEMsR0FBSTFFLEdBQ0E0RixFQUFXUSxtQkFBcUIxQixFQUFPMkIsSUFBS25kLEdBQU1BLGFBQWFtWCxjQUFnQm5YLEVBQUlBLEVBQUUwWCxpQkFHckYsSUFBSyxNQUFNMVgsS0FBS3diLEVBQVEsQ0FDcEIsTUFBTTRCLEVBQVEzYixTQUFTOEQsY0FBYyxTQUUvQjhYLEVBQVFqZixHQUFpQixjQUNqQjZCLElBQVZvZCxHQUNBRCxFQUFNMVEsYUFBYSxRQUFTMlEsR0FFaENELEVBQU1oVyxZQUFjcEgsRUFBRXVYLFFBQ3RCbUYsRUFBV1ksWUFBWUYsRUFDM0IsR0NnY0FHLENBQVliLEVBQVkxWSxLQUFLRixZQUFZd1gsZUFDbENvQixDQUNYLENBTUEsaUJBQUF2SyxHQUVJbk8sS0FBSzBZLGFBQ0QxWSxLQUFLZ1osbUJBQ1RoWixLQUFLb1ksZ0JBQWUsR0FDcEJwWSxLQUFLeVksZUFBZTFNLFFBQVN5TixHQUFNQSxFQUFFYixrQkFDekMsQ0FPQSxjQUFBUCxDQUFlcUIsR0FBb0IsQ0FPbkMsb0JBQUFyTCxHQUNJcE8sS0FBS3lZLGVBQWUxTSxRQUFTeU4sR0FBTUEsRUFBRUUscUJBQ3pDLENBYUEsd0JBQUFyTCxDQUF5QnZSLEVBQU02YyxFQUFNeGQsR0FDakM2RCxLQUFLNFosc0JBQXNCOWMsRUFBTVgsRUFDckMsQ0FDQSxxQkFBQTBkLENBQXNCL2MsRUFBTVgsR0FDeEIsTUFDTTRELEVBRGlCQyxLQUFLRixZQUFZMlcsa0JBQ1RqUCxJQUFJMUssR0FDN0JzYSxFQUFPcFgsS0FBS0YsWUFBWXVYLDJCQUEyQnZhLEVBQU1pRCxHQUMvRCxRQUFhOUQsSUFBVG1iLElBQTBDLElBQXBCclgsRUFBUTJWLFFBQWtCLENBQ2hELE1BSU1vRSxRQUhGN2QsSUFEYzhELEVBQVEwVixXQUFXYixZQUUvQjdVLEVBQVEwVixVQUNSZCxJQUNzQkMsWUFBWXpZLEVBQU80RCxFQUFRaEQsTUFFbkRpRCxLQUFLRixZQUFZaWEsZ0JBQWdCNVgsU0FBUyxtQkFDNUJsRyxJQUFkNmQsR0FDQWxmLEdBQWEsNEJBQTZCLCtCQUErQmtDLHNDQUM3Q2tELEtBQUtpQyx1SUFZckNqQyxLQUFLaVkscUJBQXVCbmIsRUFDWCxNQUFiZ2QsRUFDQTlaLEtBQUtrRCxnQkFBZ0JrVSxHQUdyQnBYLEtBQUswSSxhQUFhME8sRUFBTTBDLEdBRzVCOVosS0FBS2lZLHFCQUF1QixJQUNoQyxDQUNKLENBRUEscUJBQUEyQixDQUFzQjljLEVBQU1YLEdBQ3hCLE1BQU0wRyxFQUFPN0MsS0FBS0YsWUFHWmthLEVBQVduWCxFQUFLdVQseUJBQXlCNU8sSUFBSTFLLEdBR25ELFFBQWlCYixJQUFiK2QsR0FBMEJoYSxLQUFLaVksdUJBQXlCK0IsRUFBVSxDQUNsRSxNQUFNamEsRUFBVThDLEVBQUtpVSxtQkFBbUJrRCxHQUNsQ3ZFLEVBQXlDLG1CQUF0QjFWLEVBQVEwVixVQUMzQixDQUFFVCxjQUFlalYsRUFBUTBWLGdCQUNZeFosSUFBckM4RCxFQUFRMFYsV0FBV1QsY0FDZmpWLEVBQVEwVixVQUNSZCxHQUVWM1UsS0FBS2lZLHFCQUF1QitCLEVBQzVCLE1BQU1DLEVBQWlCeEUsRUFBVVQsY0FBYzdZLEVBQU80RCxFQUFRaEQsTUFDOURpRCxLQUFLZ2EsR0FDREMsR0FDSWphLEtBQUtrYSxpQkFBaUIxUyxJQUFJd1MsSUFFMUJDLEVBRVJqYSxLQUFLaVkscUJBQXVCLElBQ2hDLENBQ0osQ0FlQSxhQUFBcEIsQ0FBYy9aLEVBQU13UixFQUFVdk8sR0FFMUIsUUFBYTlELElBQVRhLEVBQW9CLENBQ0pBLGFBQWdCcWQsT0FDNUJ2ZixHQUFhLEdBQUksMlBBRXJCLE1BQU1pSSxFQUFPN0MsS0FBS0YsWUFDWnlPLEVBQVd2TyxLQUFLbEQsR0FDdEJpRCxJQUFZOEMsRUFBS2lVLG1CQUFtQmhhLEdBWXBDLE1BWGlCaUQsRUFBUTRRLFlBQWMwRSxJQUFVOUcsRUFBVUQsSUFPdER2TyxFQUFRNFYsWUFDTDVWLEVBQVEyVixTQUNSbkgsSUFBYXZPLEtBQUtrYSxpQkFBaUIxUyxJQUFJMUssS0FDdENrRCxLQUFLb2EsYUFBYXZYLEVBQUt3VSwyQkFBMkJ2YSxFQUFNaUQsS0FNN0QsT0FKQUMsS0FBS3FhLGlCQUFpQnZkLEVBQU13UixFQUFVdk8sRUFNOUMsRUFDNkIsSUFBekJDLEtBQUsrWCxrQkFDTC9YLEtBQUttWSxnQkFBa0JuWSxLQUFLc2Esa0JBRXBDLENBSUEsZ0JBQUFELENBQWlCdmQsRUFBTXdSLEdBQVVxSCxXQUFFQSxFQUFVRCxRQUFFQSxFQUFPYyxRQUFFQSxHQUFXK0QsR0FHM0Q1RSxLQUFnQjNWLEtBQUtrYSxrQkFBb0IsSUFBSTlPLEtBQU9sUSxJQUFJNEIsS0FDeERrRCxLQUFLa2EsZ0JBQWdCelMsSUFBSTNLLEVBQU15ZCxHQUFtQmpNLEdBQVl0TyxLQUFLbEQsS0FHbkQsSUFBWjBaLFFBQXdDdmEsSUFBcEJzZSxLQU12QnZhLEtBQUtxWSxvQkFBb0JuZCxJQUFJNEIsS0FHekJrRCxLQUFLZ1ksWUFBZXJDLElBQ3JCckgsT0FBV3JTLEdBRWYrRCxLQUFLcVksb0JBQW9CNVEsSUFBSTNLLEVBQU13UixLQU12QixJQUFab0gsR0FBb0IxVixLQUFLaVksdUJBQXlCbmIsSUFDakRrRCxLQUFLd2EseUJBQTJCLElBQUl6ZixLQUFPTSxJQUFJeUIsR0FFeEQsQ0FJQSxxQkFBTXdkLEdBQ0Z0YSxLQUFLK1gsaUJBQWtCLEVBQ3ZCLFVBR1UvWCxLQUFLbVksZUFDZixDQUNBLE1BQU8vQyxHQUtIbEosUUFBUXVPLE9BQU9yRixFQUNuQixDQUNBLE1BQU1oTyxFQUFTcEgsS0FBSzBhLGlCQU9wQixPQUhjLE1BQVZ0VCxTQUNNQSxHQUVGcEgsS0FBSytYLGVBQ2pCLENBa0JBLGNBQUEyQyxHQUNJLE1BQU10VCxFQUFTcEgsS0FBSzJhLGdCQVNwQixPQVBJM2EsS0FBS0YsWUFBWWlhLGdCQUFnQjVYLFNBQVMseUJBRXRDLG1CQURHaUYsR0FBUWdGLE1BRWZ4UixHQUFhLHVCQUF3QixXQUFXb0YsS0FBS2lDLDhJQUlsRG1GLENBQ1gsQ0FXQSxhQUFBdVQsR0FJSSxJQUFLM2EsS0FBSytYLGdCQUNOLE9BcHZCTixJQUFDeGQsRUF1dkJDLEdBdnZCREEsRUFzdkJpQixDQUFFbUosS0FBTSxVQXJ2Qkx0SixHQUNkSSx1QkFJTEosR0FBT0ssY0FBYyxJQUFJQyxZQUFZLFlBQWEsQ0FDOUNDLE9BQVFKLE1BZ3ZCUHlGLEtBQUtnWSxXQUFZLENBR2xCaFksS0FBSzBZLGFBQ0QxWSxLQUFLZ1osbUJBQ0ssQ0FLVixNQUNNNEIsRUFBcUIsSUFEZDVhLEtBQUtGLFlBQ2tCMlcsa0JBQWtCSixRQUFRd0UsT0FBUTFELEdBQU1uWCxLQUFLUCxlQUFlMFgsSUFBTUEsS0FBS25JLEdBQWVoUCxPQUMxSCxHQUFJNGEsRUFBbUJ2YSxPQUNuQixNQUFNLElBQUkxRCxNQUFNLHVDQUF1Q3FELEtBQUtpQywyRkFFN0MyWSxFQUFtQm5YLEtBQUssK0tBTS9DLENBRUEsR0FBSXpELEtBQUs4WCxxQkFBc0IsQ0FHM0IsSUFBSyxNQUFPWCxFQUFHaGIsS0FBVTZELEtBQUs4WCxxQkFDMUI5WCxLQUFLbVgsR0FBS2hiLEVBRWQ2RCxLQUFLOFgsMEJBQXVCN2IsQ0FDaEMsQ0FVQSxNQUFNd2EsRUFBb0J6VyxLQUFLRixZQUMxQjJXLGtCQUNMLEdBQUlBLEVBQWtCc0MsS0FBTyxFQUN6QixJQUFLLE1BQU81QixFQUFHcFgsS0FBWTBXLEVBQW1CLENBQzFDLE1BQU1ELFFBQUVBLEdBQVl6VyxFQUNkNUQsRUFBUTZELEtBQUttWCxJQUNILElBQVpYLEdBQ0N4VyxLQUFLcVksb0JBQW9CbmQsSUFBSWljLFNBQ3BCbGIsSUFBVkUsR0FDQTZELEtBQUtxYSxpQkFBaUJsRCxPQUFHbGIsRUFBVzhELEVBQVM1RCxFQUVyRCxDQUVSLENBQ0EsSUFBSTJlLEdBQWUsRUFDbkIsTUFBTUMsRUFBb0IvYSxLQUFLcVksb0JBQy9CLElBQ0l5QyxFQUFlOWEsS0FBSzhhLGFBQWFDLEdBQzdCRCxHQUNBOWEsS0FBS2diLFdBQVdELEdBQ2hCL2EsS0FBS3lZLGVBQWUxTSxRQUFTeU4sR0FBTUEsRUFBRXlCLGdCQUNyQ2piLEtBQUtrTCxPQUFPNlAsSUFHWi9hLEtBQUtrYixlQUViLENBQ0EsTUFBTzlGLEdBTUgsTUFIQTBGLEdBQWUsRUFFZjlhLEtBQUtrYixnQkFDQzlGLENBQ1YsQ0FFSTBGLEdBQ0E5YSxLQUFLbWIsWUFBWUosRUFFekIsQ0FzQkEsVUFBQUMsQ0FBV0ksR0FBc0IsQ0FHakMsV0FBQUQsQ0FBWUosR0FDUi9hLEtBQUt5WSxlQUFlMU0sUUFBU3lOLEdBQU1BLEVBQUU2QixpQkFDaENyYixLQUFLZ1ksYUFDTmhZLEtBQUtnWSxZQUFhLEVBQ2xCaFksS0FBS3NiLGFBQWFQLElBRXRCL2EsS0FBS3ViLFFBQVFSLEdBRVQvYSxLQUFLK1gsaUJBQ0wvWCxLQUFLRixZQUFZaWEsZ0JBQWdCNVgsU0FBUyxxQkFDMUN2SCxHQUFhLG1CQUFvQixXQUFXb0YsS0FBS2lDLHdRQU16RCxDQUNBLGFBQUFpWixHQUNJbGIsS0FBS3FZLG9CQUFzQixJQUFJak4sSUFDL0JwTCxLQUFLK1gsaUJBQWtCLENBQzNCLENBaUJBLGtCQUFJeUQsR0FDQSxPQUFPeGIsS0FBS3liLG1CQUNoQixDQXdCQSxpQkFBQUEsR0FDSSxPQUFPemIsS0FBS21ZLGVBQ2hCLENBU0EsWUFBQTJDLENBQWFNLEdBQ1QsT0FBTyxDQUNYLENBVUEsTUFBQWxRLENBQU9rUSxHQUlIcGIsS0FBS3dhLHlCQUEyQnhhLEtBQUt3YSx1QkFBdUJ6TyxRQUFTb0wsR0FBTW5YLEtBQUs2WixzQkFBc0IxQyxFQUFHblgsS0FBS21YLEtBQzlHblgsS0FBS2tiLGVBQ1QsQ0FXQSxPQUFBSyxDQUFRSCxHQUFzQixDQWlCOUIsWUFBQUUsQ0FBYUYsR0FBc0IsRUFRdkN0RixHQUFnQndCLGNBQWdCLEdBV2hDeEIsR0FBZ0JtRCxrQkFBb0IsQ0FBRWhMLEtBQU0sUUFJNUM2SCxHQUFnQnRCLEdBQTBCLHNCQUF5QyxJQUFJcEosSUFDdkYwSyxHQUFnQnRCLEdBQTBCLGNBQWlDLElBQUlwSixJQUUvRXpCLEtBQWtCLENBQUVtTSxxQkFFTixDQUVWQSxHQUFnQmlFLGdCQUFrQixDQUM5QixtQkFDQSx3QkFFSixNQUFNMkIsRUFBOEI3WSxJQUMzQkEsRUFBS3BELGVBQWUrVSxHQUEwQixzQkFDL0MzUixFQUFLa1gsZ0JBQWtCbFgsRUFBS2tYLGdCQUFnQjFjLFFBRXBELEVBQ0F5WSxHQUFnQjZGLGNBQWdCLFNBQVUxZ0IsR0FDdEN5Z0IsRUFBa0IxYixNQUNiQSxLQUFLK1osZ0JBQWdCNVgsU0FBU2xILElBQy9CK0UsS0FBSytaLGdCQUFnQjNZLEtBQUtuRyxFQUVsQyxFQUNBNmEsR0FBZ0I4RixlQUFpQixTQUFVM2dCLEdBQ3ZDeWdCLEVBQWtCMWIsTUFDbEIsTUFBTVUsRUFBSVYsS0FBSytaLGdCQUFnQnZXLFFBQVF2SSxHQUNuQ3lGLEdBQUssR0FDTFYsS0FBSytaLGdCQUFnQjhCLE9BQU9uYixFQUFHLEVBRXZDLENBQ0osRUFHQ3RHLEdBQU8waEIsMEJBQTRCLElBQUkxYSxLQUFLLFNBQzdCaEgsR0FBTzBoQix3QkFBd0J6YixPQUFTLEdBQ3BEL0UsZUFBZSxLQUNYVixHQUFhLG9CQUFxQjs7Ozs7SUMzaEMxQyxNQUdNUixHQUFTQyxXQUNmLElBQUlPLEdBSUFSLEdBQU9VLG9CQUFzQixJQUFJQyxJQU1qQ0gsR0FBZSxDQUFDSSxFQUFNQyxLQUNsQkEsR0FBVyw0QkFBNEJELDBCQUNsQ1osR0FBT1Usa0JBQWtCSSxJQUFJRCxJQUM3QmIsR0FBT1Usa0JBQWtCSSxJQUFJRixLQUM5QkcsUUFBUUMsS0FBS0gsR0FDYmIsR0FBT1Usa0JBQWtCTyxJQUFJSixLQWFsQyxNQUFNOGdCLFdBQW1CakcsR0FDNUIsV0FBQWhXLEdBQ0k2SSxTQUFTQyxXQUlUNUksS0FBS2djLGNBQWdCLENBQUV2VixLQUFNekcsTUFDN0JBLEtBQUtpYyxpQkFBY2hnQixDQUN2QixDQUlBLGdCQUFBK2MsR0FDSSxNQUFNTixFQUFhL1AsTUFBTXFRLG1CQU96QixPQURBaFosS0FBS2djLGNBQWM3UixlQUFpQnVPLEVBQVcvVyxXQUN4QytXLENBQ1gsQ0FRQSxNQUFBeE4sQ0FBTzZQLEdBSUgsTUFBTTVlLEVBQVE2RCxLQUFLOEosU0FDZDlKLEtBQUtnWSxhQUNOaFksS0FBS2djLGNBQWM5VixZQUFjbEcsS0FBS2tHLGFBRTFDeUMsTUFBTXVDLE9BQU82UCxHQUNiL2EsS0FBS2ljLFlBQWNuUyxFQUFPM04sRUFBTzZELEtBQUswWSxXQUFZMVksS0FBS2djLGNBQzNELENBcUJBLGlCQUFBN04sR0FDSXhGLE1BQU13RixvQkFDTm5PLEtBQUtpYyxhQUFhaFUsY0FBYSxFQUNuQyxDQW9CQSxvQkFBQW1HLEdBQ0l6RixNQUFNeUYsdUJBQ05wTyxLQUFLaWMsYUFBYWhVLGNBQWEsRUFDbkMsQ0FRQSxNQUFBNkIsR0FDSSxPQUFPaEwsQ0FDWCxFQWhJOEIsSUFBQzJWLEdBbUluQ3NILEdBQTBCLGVBQUksRUFROUJBLElBM0ltQ3RILEdBMklFLFlBM0lhQSxNQTJJZSxFQUVqRXJhLEdBQU84aEIsMkJBQTJCLENBQUVILGdCQUVwQyxNQUFNcFMsR0FDQXZQLEdBQU8raEIsaUNBRWJ4UyxLQUFrQixDQUFFb1MsaUJBNkJuQjNoQixHQUFPZ2lCLHFCQUF1QixJQUFJaGIsS0FBSyxTQUN4QmhILEdBQU9naUIsbUJBQW1CL2IsT0FBUyxHQUMvQy9FLGVBQWUsS0FDWFYsR0FBYSxvQkFBcUI7Ozs7O0lDbk90Q3loQixPQUFPN2dCLFVBQVVDLFFBQ1ksSUFBN0I0Z0IsT0FBTzdnQixVQUFVRSxTQUNmMmdCLE9BQU83Z0IsU0FBU0QsS0E4Q2YsTUN6Q0QrZ0IsR0FBaUMsQ0FBQ3RZLEVBQVFrQyxLQUM1QyxNQUFNcVcsRUFBV3ZZLEVBQU9VLHlCQUN4QixRQUFpQnpJLElBQWJzZ0IsRUFDQSxPQUFPLEVBRVgsSUFBSyxNQUFNQyxLQUFPRCxFQVNkQyxFQUF3QyxxQ0FBSXRXLEdBQWEsR0FFekRvVyxHQUErQkUsRUFBS3RXLEdBRXhDLE9BQU8sR0FRTHVXLEdBQWtDRCxJQUNwQyxJQUFJeFksRUFBUXVZLEVBQ1osRUFBRyxDQUNDLFFBQWdDdGdCLEtBQTNCK0gsRUFBU3dZLEVBQUk1WCxVQUNkLE1BRUoyWCxFQUFXdlksRUFBT1UseUJBQ2xCNlgsRUFBUzFELE9BQU8yRCxHQUNoQkEsRUFBTXhZLENBQ1YsT0FBNEIsSUFBbkJ1WSxHQUFVeEQsT0FFakIyRCxHQUE2QkYsSUFHL0IsSUFBSyxJQUFJeFksRUFBU0EsRUFBU3dZLEVBQUk1WCxTQUFXNFgsRUFBTXhZLEVBQVEsQ0FDcEQsSUFBSXVZLEVBQVd2WSxFQUFPVSx5QkFDdEIsUUFBaUJ6SSxJQUFic2dCLEVBQ0F2WSxFQUFPVSx5QkFBMkI2WCxFQUFXLElBQUl4aEIsU0FFaEQsR0FBSXdoQixFQUFTcmhCLElBQUlzaEIsR0FHbEIsTUFFSkQsRUFBU2xoQixJQUFJbWhCLEdBQ2JHLEdBQXFCM1ksRUFDekI7Ozs7O0dBU0osU0FBUzRZLEdBQXdCQyxRQUNTNWdCLElBQWxDK0QsS0FBSzBFLDBCQUNMK1gsR0FBK0J6YyxNQUMvQkEsS0FBSzRFLFNBQVdpWSxFQUNoQkgsR0FBMEIxYyxPQUcxQkEsS0FBSzRFLFNBQVdpWSxDQUV4QixDQXNCQSxTQUFTQyxHQUFnQzVXLEVBQWE2VyxHQUFrQixFQUFPQyxFQUFnQixHQUMzRixNQUFNN2dCLEVBQVE2RCxLQUFLK0YsaUJBQ2J3VyxFQUFXdmMsS0FBSzBFLHlCQUN0QixRQUFpQnpJLElBQWJzZ0IsR0FBNEMsSUFBbEJBLEVBQVN4RCxLQUd2QyxHQUFJZ0UsRUFDQSxHQUFJamYsTUFBTUQsUUFBUTFCLEdBSWQsSUFBSyxJQUFJdUUsRUFBSXNjLEVBQWV0YyxFQUFJdkUsRUFBTWtFLE9BQVFLLElBQzFDNGIsR0FBK0JuZ0IsRUFBTXVFLElBQUksR0FDekMrYixHQUErQnRnQixFQUFNdUUsU0FHM0IsTUFBVHZFLElBSUxtZ0IsR0FBK0JuZ0IsR0FBTyxHQUN0Q3NnQixHQUErQnRnQixTQUluQ21nQixHQUErQnRjLEtBQU1rRyxFQUU3QyxDQUlBLE1BQU15VyxHQUF3QkgsSUFDdEJBLEVBQUl6ZixNQUFRd1YsS0FDWmlLLEVBQUkxVSw0QkFDQWdWLEdBQ0pOLEVBQUlTLDRCQUE4QkwsS0FvQm5DLE1BQU1NLFdBQXVCMUssR0FDaEMsV0FBQTFTLEdBQ0k2SSxTQUFTQyxXQUVUNUksS0FBSzBFLDhCQUEyQnpJLENBQ3BDLENBT0EsWUFBQXFJLENBQWFQLEVBQU1DLEVBQVFDLEdBQ3ZCMEUsTUFBTXJFLGFBQWFQLEVBQU1DLEVBQVFDLEdBQ2pDeVksR0FBMEIxYyxNQUMxQkEsS0FBS2tHLFlBQWNuQyxFQUFLZSxhQUM1QixDQWNBLGtDQUFDLENBQXNDb0IsRUFBYWlYLEdBQXNCLEdBQ2xFalgsSUFBZ0JsRyxLQUFLa0csY0FDckJsRyxLQUFLa0csWUFBY0EsRUFDZkEsRUFDQWxHLEtBQUtvZCxnQkFHTHBkLEtBQUtxZCxrQkFHVEYsSUFDQWIsR0FBK0J0YyxLQUFNa0csR0FDckN1VyxHQUErQnpjLE1BRXZDLENBV0EsUUFBQXNkLENBQVNuaEIsR0FDTCxRRGxLcURGLElDa0s5QitELEtBQUswUyxPRGxLYWpVLFFDbUtyQ3VCLEtBQUswUyxPQUFPL00sV0FBV3hKLEVBQU82RCxVQUU3QixDQUdELFFBQTBDL0QsSUFBMUIrRCxLQUFLMlMsaUJBQ2pCLE1BQU0sSUFBSWhXLE1BQU0saURBRXBCLE1BQU00Z0IsRUFBWSxJQUFJdmQsS0FBSzBTLE9BQU8zTSxrQkFDbEN3WCxFQUFVdmQsS0FBSzJTLGtCQUFvQnhXLEVBQ25DNkQsS0FBSzBTLE9BQU8vTSxXQUFXNFgsRUFBV3ZkLEtBQU0sRUFDNUMsQ0FDSixDQU9BLFlBQUFxZCxHQUFpQixDQUNqQixXQUFBRCxHQUFnQixFQzdPcEIsTUFBTUksVUFBRUEsSUNEUixVQUFpQjFULE9BQUVBLElBQ2YsTUFBTTBULEVBQVlwUSxHQUFjdEQsR0FDMUIyVCxFQ0ZWLFNBQXFCRCxHQUNqQixPQUFRak0sSUFDSixNQUFNVCxFQUFVLENBQ1o0TSxTQUFVLGNBQWNoUSxZQUNwQmlRLFVBQ0FDLE9BQ0EsV0FBQTlkLEdBQ0k2SSxRQUNBM0ksS0FBSzJkLFVBQVksSUFBSTVpQixJQUNyQmlGLEtBQUt3SixpQkFBaUJ3QixHQUFjaEwsS0FDeEMsQ0FDQSxvQkFBQW9PLEdBQ0lwTyxLQUFLdUosb0JBQW9CeUIsR0FBY2hMLEtBQzNDLENBQ0EsV0FBQXlKLENBQVlsUCxHQUNSLE1BQU1JLE9BQUVBLEdBQVdKLEVBQ2ZJLEVBQU9tVyxVQUFZQSxJQUNuQm5XLEVBQU93QixNQUFRNkQsS0FBSzdELE1BQ3BCeEIsRUFBTzJXLFlBQWN0UixLQUFLc1IsWUFBWWpGLEtBQUtyTSxLQUFNckYsRUFBTzJWLFVBQ3hEdFEsS0FBSzJkLFVBQVV0aUIsSUFBSVYsRUFBTzJWLFVBQzFCL1YsRUFBTXNqQixrQkFFZCxDQUNBLFdBQUF2TSxDQUFZaEIsR0FDUnRRLEtBQUsyZCxVQUFVOUUsT0FBT3ZJLEVBQzFCLENBQ0EsU0FBSW5VLENBQU1BLEdBQ042RCxLQUFLNGQsT0FBU3poQixFQUNkLElBQUssSUFBSW1VLEtBQVl0USxLQUFLMmQsVUFDdEJyTixFQUFTblUsRUFFakIsQ0FDQSxTQUFJQSxHQUNBLE9BQU82RCxLQUFLNGQsTUFDaEIsR0FFSkUsU0FBVU4sRUFBVSxFQUFVMVQsT0FBRUEsS0FFckJBLEVBRFMrRyxHQUFXQyxJQUU1QixDQUFFbEQsY0FBYyxJQUNuQjJELGdCQUVKLE9BQU9ULEVBRWYsQ0QxQzBCaU4sQ0FBWVAsR0FDbEMsTUFBTyxDQUFFQSxZQUFXQyxnQkFDeEIsQ0RIcUNPLENBQVEsQ0FBRWxVOzs7OztHR1cvQyxNQUFNbVUsSUFPTixNQUFNQyxHQUFtQyxJQUFJL2UsUUFxR3RDLE1BQU1nZixJVHpHYTNFLEdTSzFCLGNBQTJCMEQsR0FDdkIsTUFBQXBULENBQU9zVSxHQUNILE9BQU9uZixDQUNYLENBQ0EsTUFBQWlNLENBQU9uSCxHQUFPb2EsSUFDVixNQUFNRSxFQUFhRixJQUFRbmUsS0FBS29lLEtBYWhDLE9BWklDLFFBQTRCcGlCLElBQWQrRCxLQUFLb2UsTUFHbkJwZSxLQUFLc2UscUJBQWdCcmlCLElBRXJCb2lCLEdBQWNyZSxLQUFLdWUscUJBQXVCdmUsS0FBS3dlLFlBRy9DeGUsS0FBS29lLEtBQU9ELEVBQ1puZSxLQUFLeWUsU0FBVzFhLEVBQUtoRSxTQUFTMEcsS0FDOUJ6RyxLQUFLc2UsZ0JBQWlCdGUsS0FBS3dlLFNBQVd6YSxFQUFLbUUsVUFFeENqSixDQUNYLENBQ0EsZUFBQXFmLENBQWdCcFcsR0FJWixHQUhLbEksS0FBS2tHLGNBQ05nQyxPQUFVak0sR0FFVyxtQkFBZCtELEtBQUtvZSxLQUFxQixDQVVqQyxNQUFNTSxFQUFVMWUsS0FBS3llLFVBQVlwa0IsV0FDakMsSUFBSXNrQixFQUF5QlQsR0FBaUMxVyxJQUFJa1gsUUFDbkN6aUIsSUFBM0IwaUIsSUFDQUEsRUFBeUIsSUFBSXhmLFFBQzdCK2UsR0FBaUN6VyxJQUFJaVgsRUFBU0MsU0FFSjFpQixJQUExQzBpQixFQUF1Qm5YLElBQUl4SCxLQUFLb2UsT0FDaENwZSxLQUFLb2UsS0FBSzFVLEtBQUsxSixLQUFLeWUsY0FBVXhpQixHQUVsQzBpQixFQUF1QmxYLElBQUl6SCxLQUFLb2UsS0FBTWxXLFFBRXRCak0sSUFBWmlNLEdBQ0FsSSxLQUFLb2UsS0FBSzFVLEtBQUsxSixLQUFLeWUsU0FBVXZXLEVBRXRDLE1BRUlsSSxLQUFLb2UsS0FBS2ppQixNQUFRK0wsQ0FFMUIsQ0FDQSxzQkFBSXFXLEdBQ0EsTUFBNEIsbUJBQWR2ZSxLQUFLb2UsS0FDYkYsR0FDRzFXLElBQUl4SCxLQUFLeWUsVUFBWXBrQixhQUNwQm1OLElBQUl4SCxLQUFLb2UsTUFDYnBlLEtBQUtvZSxNQUFNamlCLEtBQ3JCLENBQ0EsWUFBQWtoQixHQUtRcmQsS0FBS3VlLHFCQUF1QnZlLEtBQUt3ZSxVQUNqQ3hlLEtBQUtzZSxxQkFBZ0JyaUIsRUFFN0IsQ0FDQSxXQUFBbWhCLEdBR0lwZCxLQUFLc2UsZ0JBQWdCdGUsS0FBS3dlLFNBQzlCLEdUOUU0QixJQUFJOWYsS0FBTSxDQUV0Q2tnQixnQkFBcUJwRixHQUNyQjlhLFlBSHFCLElBQUM4YSxHVWdXMUJxRixlQUFlQyxPQUNiLDBCQUNBdEIsR0FqV0YsVUFBNEJ1QixTQUMxQkEsRUFBUUMsZ0JBQ1JBLEVBQWtCLENBQUEsRUFBRWpmLFFBQ3BCQSxFQUFVLEdBQUVrZixNQUNaQSxFQUFRLFNBQVFDLFdBQUVBLEVBQWEsR0FBRUMsU0FDakNBLEVBQVcsS0FFWCxNQUFPQyxFQUFjQyxHQUFtQnpOLEdBQVMsT0FDMUMwTixFQUFhQyxHQUFrQjNOLElBQVMsSUFDeEM0TixFQUFZQyxHQUFpQjdOLElBQVMsSUFDdEM4TixFQUFjQyxHQUFtQi9OLEdBQVMsT0FDMUNnTyxFQUFhQyxHQUFrQmpPLEdBQVMsR0FFL0NoQixHQUFVLEtBQ0hzTyxHQUNIRyxFQUFnQixPQUVqQixDQUFDSCxJQUVKdE8sR0FBVSxLQUNKME8sR0FBZSxHQUNqQlEsS0FFRCxDQUFDUixJQUVKLE1BQU1TLEVBQXFCLENBQUNDLEVBQU9DLEVBQU8sS0FDeEMsTUFBTUMsRUFBUUYsR0FBUyxHQUN2QmhnQixLQUFLdkYsY0FBYyxJQUFJQyxZQUFZLG9CQUFxQixDQUN0REMsT0FBUSxDQUFFdWxCLFFBQU9ELE9BQU1kLFlBQ3ZCaE8sU0FBUyxFQUNURSxVQUFVLEtBRVprTyxHQUFlLEdBQ2ZNLEVBQWVJLElBR1hFLEVBQWlCM08sR0FBUSxJQWpEaEIsRUFBQzRPLEVBQU1DLEtBQ3RCLElBQUlDLEVBQ0osTUFBTyxJQUFJcFEsS0FDTG9RLEdBQ0ZDLGFBQWFELEdBRWZBLEVBQVlFLFdBQVcsS0FDckJKLEVBQUtLLE1BQU0sS0FBTXZRLElBQ2hCbVEsS0F5Q2dDSyxDQUFTWCxFQUFvQixLQUFNLElBR2xFWSxFQUFjL1ksSUFDbEJ5WCxFQUFnQnpYLEdBQ2hCNlgsR0FBYyxHQUNkSSxFQUFlLEdBQ1hILEdBQWNBLEVBQWFrQixRQUUvQjVnQixLQUFLdkYsY0FBYyxJQUFJQyxZQUFZLGdCQUFpQixDQUNsREMsT0FBUWlOLEVBQ1J1SixTQUFTLEVBQ1RFLFVBQVUsS0FHWnJSLEtBQUt2RixjQUFjLElBQUlDLFlBQVksZUFBZ0IsQ0FDakRDLE9BQVEsQ0FBRXdCLE1BQU95TCxFQUFLcVgsTUFBT3JYLFFBQzdCdUosU0FBUyxFQUNURSxVQUFVLE1BSVJ3UCxFQUFjN0IsR0FBaUI4QixPQUFPQyxLQUN0Q0MsRUFBY2hDLEdBQWlCOEIsT0FBT0csS0E4RHRDbkIsRUFBc0JsZCxJQUUxQjRkLFdBQVcsS0FDVCxNQUFNVSxFQUFhbGhCLEtBQUttaEIsY0FBYyw4Q0FDbENELEdBQ0ZBLEVBQVdFLGVBQWUsQ0FDeEJDLFNBQVUsU0FDVkMsTUFBTyxhQUdWLElBZUwsT0FBTzlpQixDQUFJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt5Q0FpSDRCeWdCOzs7Ozs7OzswQkFRZk8sRUFBYSxPQUFTO3VCQUN6QlA7bUJBQ0pDO21CQTdMSTlKLElBQ25CLE1BQU1qWixFQUFRaVosRUFBRW5HLE9BQU85UyxNQUN2QmtqQixFQUFnQixNQUNoQlEsRUFBZSxHQUVmN2YsS0FBS3ZGLGNBQWMsSUFBSUMsWUFBWSxlQUFnQixDQUNqREMsT0FBUSxDQUFFd0IsUUFBT3lMLEtBQU0sTUFDdkJ1SixTQUFTLEVBQ1RFLFVBQVUsS0FHWjhPLEVBQWVoa0I7cUJBR01pWixJQUNyQixHQUF1QixJQUFuQnJWLEVBQVFNLE9BRVosT0FBUStVLEVBQUVsRyxLQUNSLElBQUssWUFDSGtHLEVBQUVtTSxpQkFDRjlCLEdBQWMsR0FDZEYsRUFBZTNjLElBQVVBLEVBQVEsR0FBSzdDLEVBQVFNLFFBQzlDLE1BQ0YsSUFBSyxVQUNIK1UsRUFBRW1NLGlCQUNGOUIsR0FBYyxHQUNkRixFQUFlM2MsSUFBVUEsRUFBUSxFQUFJN0MsRUFBUU0sUUFBVU4sRUFBUU0sUUFDL0QsTUFDRixJQUFLLFFBQ0NpZixHQUFlLEdBQUtFLElBQ3RCcEssRUFBRW1NLGlCQUNGWixFQUFXNWdCLEVBQVF1ZixLQUVyQixNQUNGLElBQUssU0FDSEcsR0FBYztrQkE2SkosSUFBTUEsR0FBYzttQkFDbkIsSUFBTUEsR0FBYztZQUMzQnRCLEdBQUl3Qjs7Ozs7OzswQkFPVUgsRUFBYSxPQUFTOzttQkFuSnBCLEtBQ3hCLE1BQU1nQyxHQUFZaEMsRUFDbEJDLEVBQWMrQixHQUNWQSxHQUFZOUIsR0FDZEEsRUFBYWtCOzs7Ozs7Ozs7eUNBMEpzQnBCLEVBQWEsU0FBVzs7Ozs7O1FBTXpEQSxHQUFjemYsRUFBUU0sT0FBUyxFQUFJN0IsQ0FBSTs7Ozt5QkFJdEJ5Z0I7OztjQUdYbGYsRUFBUW9aLElBQUksQ0FBQ3ZSLEVBQU1oRixJQUFVcEUsQ0FBSTs7O2dDQUdmb0UsSUFBVTBjLEVBQWMsT0FBUzs2QkFDbkNsSyxJQUFRQSxFQUFFbU0saUJBdktSLENBQUMzWixJQUM3QitZLEVBQVcvWSxJQXNLMkM2WixDQUFzQjdaOzZCQUNuRCxJQUFNMlgsRUFBZTNjOzZDQUNMQSxJQUFVMGMsRUFBYyxTQUFXOztrQkFFOUQxWCxFQUFLcVg7Ozs7O1lBS1hELEdBQWlCMEMsWUFBY3ZDLEVBQVczZ0IsQ0FBSTs7OzBCQUdoQ3dnQixHQUFpQmlCLFFBQVFqQixHQUFpQjJDLGtCQUFrQjNDLEdBQWlCMEM7Ozs7OytCQXBRN0V0TSxJQUN0QkEsRUFBRW1NLGlCQUVFVixHQUNGZCxFQUFtQmIsRUFBWVUsRUFBYzsrQkFzUXBCaUI7Ozs7Ozs7K0JBalFMekwsSUFDdEJBLEVBQUVtTSxpQkFFRVAsR0FDRmpCLEVBQW1CYixFQUFZVSxFQUFjOytCQXFRcEJvQjs7Ozs7OztZQU9qQjs7UUFFSjs7UUFFRjVCLEVBQWU1Z0IsQ0FBSSxrREFBa0Q0Z0IsRUFBYUgsZ0JBQWtCOztHQUc1RyxFQUlnQyxDQUFFclIsY0FBYyxLQzNRaERpUixlQUFlQyxPQUNiLGtCQUNBdEIsR0F2R0YsVUFBb0JvRSxNQUFFQSxFQUFRLEtBQzFCLE1BQU1DLEVBQVNELEVBbURmLE9BQUtDLEdBQTRCLElBQWxCQSxFQUFPeGhCLE9BSWY3QixDQUFJOzs7Ozs7Ozs7OztrQkFXR3FqQixFQUFPMUksSUFBSTJJLEdBQVV0akIsQ0FBSTs7OzhCQUdic2pCLEVBQU9DLFdBQWFELEVBQU9FLE1BQVF4akIsQ0FBSTs7MkNBRTFCc2pCLEVBQU9DLFdBQWFELEVBQU9FO29EQUNsQkYsRUFBT2hsQjs7Ozs7OzhCQU0zQjBCLENBQUk7Ozs7c0NBSUVzakIsRUFBT2hsQjs2REFDZ0JnbEIsRUFBT0csUUFBVUgsRUFBT0csT0FBT25sQjs2REE1RHBFLENBQUNnbEIsR0FyQkUsQ0FBQ0EsSUFDcEIsTUFBTUksRUFBZ0JKLEVBQU9HLE9BQU9FLGdCQUFrQixHQUN0RCxTQUFJRCxFQUFjL2YsU0FBUyxjQUFlK2YsRUFBYy9mLFNBQVMsVUFvQjdEaWdCLENBQWVOLEdBQ1IsR0FmYSxDQUFDQSxJQUN6QixNQUNNN2hCLEdBRGdCNmhCLEVBQU9HLE9BQU9FLGdCQUFrQixJQUMxQnhmLE1BQU0sS0FDbEMsSUFBSyxNQUFNb0IsS0FBUTlELEVBQU8sQ0FDdEIsR0FBSThELEVBQUs1QyxXQUFXLHFCQUNoQixNQUFPLFlBQVk0QyxFQUFLcEIsTUFBTSxLQUFLLEtBQ2hDLEdBQUlvQixFQUFLNUMsV0FBVyxTQUN2QixNQUFPLFFBQVE0QyxFQUFLcEIsTUFBTSxLQUFLLElBRXZDLEdBTWMwZixDQUFvQlAsS0FFM0IsS0F5RDhDUSxDQUFZUjs7Ozs4QkFJM0NBLEVBQU9TLE9BQVMvakIsQ0FBSSxtQkFBbUJzakIsRUFBT1MsT0FBTzllLEtBQUssaUNBQWlDcWUsRUFBT1MsT0FBTzllLEtBQUssV0FBYTs4QkFDM0hxZSxFQUFPVSxPQUFTaGtCLENBQUksZ0JBQWdCc2pCLEVBQU9VLE9BQU8vZSxLQUFLLGlDQUFpQ3FlLEVBQU9VLE9BQU8vZSxLQUFLLFdBQWE7OEJBQ3hIcWUsRUFBT1csS0FBT2prQixDQUFJLFlBQVlzakIsRUFBT1csS0FBS2hmLEtBQUssbURBQXFEOzs7Ozs7O01BdENuSGpGLENBQUkscUVBOENuQixFQUl3QixDQUFFb1AsY0FBYyxFQUFPRCxtQkFBb0IsTUMzQm5Fa1IsZUFBZUMsT0FDYixZQUNBdEIsR0E3RUYsVUFBZWtGLE1BQ2JBLEVBQVEsR0FBRWpoQixRQUNWQSxFQUFVLEtBQUlraEIsT0FDZEEsRUFBUyxLQUFJQyxXQUNiQSxFQUFhLENBQUEsSUFFYixNQUFPQyxFQUFNQyxHQUFXbFIsR0FBU2lELFFBQVErTixFQUFXQyxPQUNwRGpTLEdBQVUsS0FDUmtTLEVBQVFqTyxRQUFRK04sRUFBV0MsUUFDMUIsQ0FBQ0QsRUFBV0MsT0FFZixJQUFJRSxFQUFXLEtBOEJmLE9BZkFuUyxHQUFVLEtBRUppUyxHQUFRRSxHQUFzQyxtQkFBbkJBLEVBQVNuQyxPQUN0Q21DLEVBQVNuQyxTQUVWLENBQUNpQyxJQVVHcmtCLENBQUk7O2NBRUNxa0I7O21CQUVLRCxFQUFXSSxXQUFhTixHQUFTO2VBWjNCdE4sS0FDaEJ3TixFQUFXSywyQkFBNERobkIsSUFBcEMybUIsRUFBV0ssdUJBRS9DN04sRUFBRW5HLFFBQVVtRyxFQUFFbkcsT0FBTzlMLFNBQThDLFdBQW5DaVMsRUFBRW5HLE9BQU85TCxRQUFRMFUsZUFDbkQrSyxFQUFXTSxTQUFXTixFQUFXTTtpQkFqQnRCOU4sSUFDQyxXQUFWQSxFQUFFbEcsS0FDSjBULEVBQVdNLFNBQVdOLEVBQVdNO1FBMEIvQi9FLEdBcENnQjdjLElBQ3BCeWhCLEVBQVd6aEIsRUFFTnNoQixFQUFXTyxXQUNtQixtQkFBeEJQLEVBQVdPLFNBQXlCUCxFQUFXTyxTQUFTN2hCLEdBQzNCLGlCQUF4QnNoQixFQUFXTyxXQUF1QlAsRUFBV08sU0FBU2huQixNQUFRbUY7O3dCQWlDekQ4VCxHQUFNQSxFQUFFeUk7VUFDdkI2RSxFQUNFbGtCLENBQUk7O3NCQUVNa2tCOztjQUdWOzs7WUFHQWpoQjs7O1VBR0ZraEIsRUFDRW5rQixDQUFJLFlBQVlta0IsY0FDaEJua0IsQ0FBSTs7aUNBRWlCb2tCLEVBQVdNOzs7OztHQU01QyxFQUltQixDQUFFdFYsY0FBYyxLQ29EbkNpUixlQUFlQyxPQUFPLDBCQUEyQnRCLEdBL0dqRCxVQUEyQjRGLFFBQUVBLEVBQU9DLFVBQUVBLElBR3BDLElBQUlDLEVBRGdCeE8sS0FBS0ssTUFBTWlPLEdBQ08sS0FHbENDLEdBQWFBLEVBQVVFLGFBQ3pCRCxFQUFnQkEsRUFBY25LLElBQUlxSyxHQUNoQ0EsRUFBSUQsYUFBZUYsRUFBVUUsV0FDekIsSUFBS0MsRUFBS0MsU0FBVUosRUFBVUksU0FBVUMsT0FBUUwsRUFBVUssUUFDMURGLElBSVIsTUFBT0csRUFBV0MsR0FBZ0JoUyxJQUFTLElBQ3BDaVMsRUFBYUMsR0FBa0JsUyxHQUFTLE1BV3pDbVMsRUFBV3ZtQixJQUNmLElBQUtBLEVBQUcsTUFBTyxHQUNmLE1BQU0yWixFQUFJLElBQUk2TSxLQUFLeG1CLEdBQ25CLE9BQUl5bUIsTUFBTTlNLEdBQVcvTyxPQUFPNUssR0FDckIsR0FBRzRLLE9BQU8rTyxFQUFFK00sV0FBYSxHQUFHQyxTQUFTLEVBQUcsUUFBUS9iLE9BQU8rTyxFQUFFaU4sV0FBV0QsU0FBUyxFQUFHLFFBQVFoTixFQUFFa04saUJBVzdGQyxFQUFlVCxFQUNqQnJsQixDQUFJOzJDQUNpQ3VsQixFQUFRRixFQUFZVTtzQ0FDekJWLEVBQVlIO3dDQUNWRyxFQUFZSixVQUFZOzhDQVpwQyxFQUFDYyxFQUFZQyxLQUNyQyxNQUFNQyxHQUFZLElBQUlULEtBQUtRLEdBQWMsSUFBSVIsS0FBS08sSUFBZSxJQUlqRSxNQUFPLEdBRlNybkIsS0FBS3duQixNQUFNRCxFQUFXLFFBQ3RCdm5CLEtBQUt5bkIsTUFBTUYsRUFBVyxRQVNJRyxDQUFrQmYsRUFBWVUsV0FBWVYsRUFBWVc7OztZQUd4RlgsRUFBWWdCLGFBQWVoQixFQUFZZ0IsWUFBWXhrQixPQUFTLEVBQzFEd2pCLEVBQVlnQixZQUFZMUwsSUFBSzJMLEdBQVF0bUIsQ0FBSSxnQkFBZ0JzbUIscUNBQXVDQSxjQUNoR3RtQixDQUFJOztjQUdaLEtBRUosT0FBSzhrQixHQUEwQyxJQUF6QkEsRUFBY2pqQixPQUk3QjdCLENBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFzQkw4a0IsRUFBY25LLElBQ2JxSyxJQUNDLE1BQU11QixFQUFjdkIsRUFBSUUsT0FBU0YsRUFBSUUsT0FBTzdMLGNBQWNqWSxRQUFRLE9BQVEsS0FBTyxHQUNqRixPQUFPcEIsQ0FBSTs7Ozs2Q0FJd0IsSUF4RTNCLENBQUNnbEIsSUFDZk0sRUFBZU4sR0FDZkksR0FBYSxJQXNFa0NvQixDQUFReEI7b0JBQ3ZDTyxFQUFRUCxFQUFJZTs7eUNBRVNRLE1BQWdCdkIsRUFBSUU7O2dCQXZHbENELEVBeUdPRCxFQUFJQyxTQXhHbkIsTUFBYkEsRUFBeUIsS0FDdEJqbEIsQ0FBSTs7d0JBRVdpbEIsR0FBWTtVQUMxQkEsR0FBWTs7Ozs7WUFMdEIsSUFBMkJBOzs7Ozs7ZUFtSFo7aUJBQ0VhO29CQUNHLENBQUV6QixLQUFNYyxFQUFXVCxRQXJGbEIsS0FDakJVLEdBQWEsR0FDYkUsRUFBZSxPQW1GeUNiLHNCQUFzQjs7SUFqRHZFemtCLENBQUkscUNBb0RmLEVBRThFLENBQUVvUCxjQUFjLEtDbEk5RixNQUFNcVgsR0FBcUIsQ0FDdkJWLFdBQVksdUJBQ1piLE9BQVEsV0FDUndCLGNBQWUsSUFDZkwsWUFBYSxDQUFDLHNCQUF1Qix3QkNKbEMsU0FBU00sR0FBU0MsR0FBYyxHQUNyQyxNQUFPQyxFQUFRQyxHQUFhMVQsR0FBU3dULEdBQy9CakMsRU5LdUIsSUFBSWxGLEdNRjNCc0gsRUFBYSxJQUFNRCxHQUFVLEdBNENuQyxPQTFDQTFVLEdBQVUsS0FDSnlVLEdBQVVsQyxFQUFTaG5CLE9BRXJCZ25CLEVBQVNobkIsTUFBTXlrQixTQUVoQixDQUFDeUUsSUFHSnpVLEdBQVUsS0FDUixNQUFNNFUsRUFBaUJqckIsSUFDSCxXQUFkQSxFQUFNMlUsS0FBb0JtVyxHQUM1QkUsS0FJSixHQUFJRixFQUlGLE9BSEE1bkIsU0FBUytMLGlCQUFpQixVQUFXZ2MsR0FHOUIsS0FDTC9uQixTQUFTOEwsb0JBQW9CLFVBQVdpYyxLQUczQyxDQUFDSCxFQUFRRSxJQUdaM1UsR0FBVSxLQUNSLE1BQU02VSxFQUFzQmxyQixJQUN0QjRvQixFQUFTaG5CLFFBQVVnbkIsRUFBU2huQixNQUFNdXBCLFNBQVNuckIsRUFBTTBVLFNBQVdvVyxHQUM5REUsS0FJSixHQUFJRixFQUdGLE9BRkE1bkIsU0FBUytMLGlCQUFpQixZQUFhaWMsR0FFaEMsS0FDTGhvQixTQUFTOEwsb0JBQW9CLFlBQWFrYyxLQUc3QyxDQUFDSixFQUFRRSxJQUVMLENBQ0xGLFNBQ0FNLFVBL0NnQixJQUFNTCxHQUFVLEdBZ0RoQ0MsYUFDQTNDLFdBQVksQ0FDVkMsS0FBTXdDLEVBQ05uQyxRQUFTcUMsRUFDVHBDLFNBQVVBLEdBR2hCLENEQ0F0RSxlQUFlQyxPQUFPLGlCQUFrQnRCLEdBekN4QyxVQUF1QjdpQixPQUFFQSxFQUFTc3FCLEtBQzlCLE1BQU1XLEVBQVlqckIsR0FBUTRwQixXQUFhLElBQUlQLEtBQUtycEIsRUFBTzRwQixZQUFjLEtBQy9Ec0IsRUFBcUJELEVBQVlBLEVBQVVFLGlCQUFtQixHQUM5RHJCLEVBZlYsU0FBd0JzQixHQUNwQixHQUFlLE1BQVhBLEVBQWlCLE1BQU8sR0FDNUIsTUFBTXplLEVBQUlwSyxLQUFLd25CLE1BQU1xQixFQUFVLE1BQ3pCM2pCLEVBQUlsRixLQUFLd25CLE1BQU9xQixFQUFVLEtBQVEsSUFFeEMsTUFBTyxDQUNIemUsRUFBSSxHQUFHQSxLQUFPLEtBQ2RsRixFQUFJLEdBQUdBLEtBQU8sS0FIUjJqQixFQUFVLEdBSWhCLEtBQ0ZsTCxPQUFPaEcsU0FBU3BSLEtBQUssSUFDM0IsQ0FLcUJ1aUIsQ0FBZXJyQixHQUFRdXFCLGVBQ2xDekMsRUFBTzluQixHQUFRa3FCLGFBQWUsR0FFcEMsT0FBT3JtQixDQUFJOzs7Ozs7d0NBTXlCcW5COzs7Ozt3Q0FLQWxyQixHQUFRK29CLFFBQVU7Ozs7O3dDQUtsQmUsSUFBb0MsTUFBekI5cEIsR0FBUXVxQixjQUF3QixLQUFLdnFCLEVBQU91cUIsa0JBQW9COzs7Ozs7WUFNdkd6QyxFQUFLcGlCLE9BQ0g3QixDQUFJO2tCQUNBaWtCLEVBQUt0SixJQUNMOE0sR0FBS3puQixDQUFJLGdCQUFnQnluQixxQ0FBcUNBO3FCQUdsRXpuQixDQUFJOzs7O0tBS2xCLElFeUVBcWdCLGVBQWVDLE9BQ2IsMEJBQ0F0QixHQXJJRixXQUNFLE1BQU8wSSxFQUFRQyxHQUFhdlUsR0FBUyxLQUM5QndVLEVBQWVDLEdBQW9CelUsR0FBUyxLQUM1QzBVLEVBQXVCQyxHQUE0QjNVLEdBQVMsQ0FBQSxJQUM1RDRVLEVBQWVDLEdBQW9CN1UsR0FBUyxLQUM1QzhVLEVBQXNCQyxHQUEyQi9VLEdBQVMsS0FDMURnVixFQUF3QkMsR0FBNkJqVixHQUFTLElBRS9Ea1YsR0NWZXBYLEdEVVMsRUNUckI4QixHQUFRLEtBQUEsQ0FDWG5ILFFBQVNxRixJQUNULEtBSEQsSUFBZ0JBLEVEWXJCa0IsR0FBVSxLQUNKa1csRUFBZXpjLFFBQ2pCeWMsRUFBZXpjLFNBQVUsRUFJM0IwYyxFQUFrQlAsRUFBZUUsSUFDaEMsQ0FBQ0YsRUFBZUUsSUFFbkI5VixHQUFVLEtBRVJvVyxNQUFNLHVDQUNINWEsS0FBTWIsR0FBUUEsRUFBSTBiLFFBQ2xCN2EsS0FBTTdJLEdBQVM0aUIsRUFBVTVpQixFQUFLQSxNQUFRLE1BQ3hDLElBRUhxTixHQUFVLEtBQ1J5VixFQUFpQixJQUNqQkUsRUFBeUIsQ0FBQSxHQUN6QkksRUFBd0IsSUFDeEJFLEVBQTBCLElBRXJCTCxHQUdMVSxFQUE4QixLQUM3QixDQUFDVixJQUVKLE1BQU1PLEVBQW9CLENBQUN2YyxFQUFPMmMsS0FDaENubkIsS0FBS3ZGLGNBQ0gsSUFBSUMsWUFBWSw2QkFBOEIsQ0FDNUNDLE9BQVEsQ0FBRTZQLFFBQU80YyxtQkFBb0JELEdBQ3JDaFcsU0FBUyxFQUNURSxVQUFVLE1BS1Y2VixFQUFpQ3ZzQixJQUNyQyxNQUFNdWxCLEVBQVF2bEIsRUFBT3VsQixPQUFTLEdBQ3hCRCxFQUFPdGxCLEVBQU9zbEIsTUFBUSxFQUN0QmQsRUFBV3hrQixFQUFPd2tCLFVBQVksR0FDcEM2SCxNQUFNLGdDQUFnQ1IsMEJBQXNDYSxtQkFBbUJuSCxZQUFnQmYsVUFBaUJjLEtBQzdIN1QsS0FBTWIsR0FBUUEsRUFBSTBiLFFBQ2xCN2EsS0FBTTdJLElBQ0w4aUIsRUFBaUI5aUIsRUFBS0EsTUFBUSxJQUM5QmdqQixFQUF5QixDQUN2QjdFLFlBQWFuZSxFQUFLbWUsWUFDbEJDLFlBQWFwZSxFQUFLb2UsWUFDbEIxQixLQUFNMWMsRUFBSzBjLEtBQ1hxSCxNQUFPL2pCLEVBQUsrakIsTUFDWnhHLE1BQU92ZCxFQUFLdWQsV0FxQnBCLE9BQU90aUIsQ0FBSTs7Ozs7Ozs7O2lCQVNJZ29CO2tCQUNFcFIsR0FBTXFSLEVBQWlCclIsRUFBRW5HLE9BQU85Uzs7OztVQUl6QytwQixFQUFPL00sSUFDTjNPLEdBQVVoTSxDQUFJLGlCQUFpQmdNLEtBQVNBOzs7O3FCQUs5QmdjO3NCQUNDSTttQkFDSFIsRUFBY2pOLElBQUlvTyxJQUFHLENBQU90SSxNQUFPc0ksRUFBSXpxQixLQUFNWCxNQUFPb3JCLEVBQUluZDsyQkFDaERrYztvQkFDUDs2QkFDVWxSLElBQ3BCLE1BQU16YSxFQUFTeWEsRUFBRXphLE9BQ2pCdXNCLEVBQThCdnNCO3dCQUVmeWEsSUFDZixNQUFNalosTUFBQ0EsRUFBS3lMLEtBQUVBLEdBQVF3TixFQUFFemEsT0FDeEJrc0IsRUFBMEIxcUIsR0FDMUJ3cUIsRUFBd0IvZSxFQUFPQSxFQUFLekwsTUFBUTt5QkFFNUJpWixHQUFNdVIsRUFBd0J2UixFQUFFemEsT0FBT3dCOzs7OztpQkFsRHBDaVosSUFDekJBLEVBQUVtTSxpQkFFRixNQUNNaUcsRUFEb0JwQixFQUFjcUIsS0FBS0YsR0FBT0EsRUFBSW5kLEtBQU9zYyxHQUNZLHdCQUMzRXJLLE9BQU9xTCxTQUFTQyxLQUFPLGtCQUFrQkg7cUJBbUR4QmQ7O2lCQWhETSxNQUN2QixJQUFLQSxFQUFzQixNQUFPLEdBQ2xDLElBQUtOLEVBQWUsTUFBTyxHQUUzQixNQUFNd0IsRUFBNkJQLG1CQUFtQlgsR0FDdEQsT0FBT2tCLEVBQTZCLHFDQUFxQ0EsSUFBK0IsSUE2QzNGQyxnQkFBZ0NuQjs7OztHQUtqRCxFQUltQyxDQUFFOVksY0FBYyxFQUFPRCxtQkFBb0IsTUVuRTlFa1IsZUFBZUMsT0FDYiwyQkFDQXRCLEdBcEVGLFdBQ0UsTUFBT2dKLEVBQWVDLEdBQW9CN1UsR0FBUyxPQUM1Q2tXLEVBQTJCQyxHQUNoQ25XLEdBQVMsT0FDSmlRLEVBQVFtRyxHQUFhcFcsR0FBUyxLQUM5QnFXLEVBQVNDLEdBQWN0VyxHQUFTLElBRXZDaEIsR0FBVSxLQUNSLElBQUtrWCxFQUEyQixPQUVoQyxNQUFNSyxFQUFtQ2QsbUJBQ3ZDUyxHQUdGZCxNQUNFLDRDQUE0Q21CLEtBRTNDL2IsS0FBTWdjLEdBQWFBLEVBQVNuQixRQUM1QjdhLEtBQU03SSxJQUNMeWtCLEVBQVV6a0IsRUFBS0EsU0FFbEIsQ0FBQ3VrQixJQUVKLE1BQU1PLEVBQWtDOXRCLElBQ3RDLE1BQU1pUSxNQUFFQSxFQUFLNGMsbUJBQUVBLEdBQXVCN3NCLEVBQU1JLE9BQzVDUSxRQUFRbXRCLElBQUksa0JBQW1COWQsR0FDL0JpYyxFQUFpQmpjLEdBRWpCclAsUUFBUW10QixJQUFJLHlCQUEwQmxCLEdBQ3RDVyxFQUE2QlgsSUFpQi9CLE9BQU81b0IsQ0FBSTs7Ozs7NkJBYmNqRSxJQUN2QixNQUFNZ3VCLE9BQUVBLEVBQU1DLEtBQUVBLEdBQVNqdUIsRUFBTUksT0FDMUI0dEIsR0FBV0MsSUFDaEJydEIsUUFBUW10QixJQUFJLHVCQUF3QkMsRUFBUSxRQUFTQyxHQUNyRHhCLE1BQ0UsNENBQTRDdUIsRUFBT0UsWUFBWUYsRUFBT0csWUFBWUYsS0FFakZwYyxLQUFNZ2MsR0FBYUEsRUFBU25CLFFBQzVCN2EsS0FBTTdJLElBQ0wya0IsRUFBVzNrQjtzQ0FVbUI4a0I7dUJBQ2ZKOzs7O3dDQUlpQkk7OztnQ0FHUnhHOzs7R0FJaEMsRUFJaUMsQ0FDN0JqVSxjQUFjLEVBQ2RELG1CQUFvQixNQ3NDeEJrUixlQUFlQyxPQUFPLG1CQUFvQnRCLEdBNUcxQyxVQUF3Qm1MLFNBQUVBLEVBQVFDLG9CQUFFQSxFQUFzQixDQUFBLElBRXhELE1BQU9DLEVBQWFDLEdBQWtCbFgsR0FDcEN2QyxPQUFPMFosUUFBUUgsR0FBcUJ6UCxJQUFJLEVBQUU2UCxFQUFXQyxNQUFXLENBQzlERCxZQUNBQyxrQkFHR0MsRUFBY0MsR0FBbUJ2WCxHQUFTLEtBQzFDd1gsRUFBY0MsR0FBbUJ6WCxHQUFTLElBd0NqRCxPQXRDQWhCLEdBQVUsS0FFUixNQUFNNEwsRUFBTSxDQUFBLEVBQ1pxTSxFQUFZOWMsUUFBUSxFQUFHaWQsWUFBV0MsaUJBQzVCRCxFQUFVcnBCLFNBQVE2YyxFQUFJd00sRUFBVXJwQixRQUFVc3BCLEVBQVdwTyxPQUFReU8sR0FBTUEsRUFBRTNwQixXQUUzRWdwQixFQUFTbk0sSUFDUixDQUFDcU0sSUErQkdycUIsQ0FBSTs7Ozs7OzttQkFPTTBxQjttQkFDQzlULEdBQU0rVCxFQUFnQi9ULEVBQUVuRyxPQUFPOVM7Ozs7b0RBckM3QixLQUNkK3NCLEVBQWF2cEIsU0FDZm1wQixFQUFlLElBQ1ZELEVBQ0gsQ0FBRUcsVUFBV0UsRUFBYXZwQixPQUFRc3BCLFdBQVksTUFFaERFLEVBQWdCOzs7O1VBdUNaTixFQUFZMVAsSUFDWixDQUFDb1EsRUFBS0MsSUFBUWhyQixDQUFJOzs7MEJBR0YrcUIsRUFBSVA7c0VBQ3dDLElBeEM3QyxDQUFDUSxJQUN0QlYsRUFBZUQsRUFBWWhPLE9BQU8sQ0FBQ3BNLEVBQUcvTixJQUFNQSxJQUFNOG9CLEtBdUNzQkMsQ0FBZUQ7Ozs7O2tCQUt6RUQsRUFBSU4sV0FBVzlQLElBQ2YsQ0FBQ3VRLEVBQUtDLElBQVduckIsQ0FBSTs7OEJBRVRrckI7NEVBQzhDLElBcENsRCxFQUFDRixFQUFLRyxLQUM1QixNQUFNcE8sRUFBVSxJQUFJc04sR0FDcEJ0TixFQUFRaU8sR0FBS1AsV0FBYTFOLEVBQVFpTyxHQUFLUCxXQUFXcE8sT0FBTyxDQUFDcE0sRUFBRy9OLElBQU1BLElBQU1pcEIsR0FDekViLEVBQWV2TixJQWlDK0RxTyxDQUFnQkosRUFBS0c7Ozs7Ozs7Ozt5QkFVOUVILElBQVFYLEVBQVl4b0IsT0FBUyxFQUFJK29CLEVBQWU7eUJBQy9DaFUsR0FBTWlVLEVBQWdCalUsRUFBRW5HLE9BQU85Uzs7OzREQUdHLElBM0RyQyxDQUFDcXRCLElBQ3BCLEdBQUlKLEVBQWF6cEIsT0FBUSxDQUN2QixNQUFNNGIsRUFBVSxJQUFJc04sR0FDcEJ0TixFQUFRaU8sR0FBS1AsV0FBVzduQixLQUFLZ29CLEVBQWF6cEIsUUFDMUNtcEIsRUFBZXZOLEdBQ2Y4TixFQUFnQixHQUNsQixHQXFEOERRLENBQWFMOzs7Ozs7Ozs7OztHQWEvRSxFQUVvRSxDQUFFNWIsY0FBYyxLQ2tGcEZpUixlQUFlQyxPQUNiLG1CQUNBdEIsR0EvTEYsVUFBcUJzTSxjQUNuQkEsRUFBYWhGLElBQ2JBLEVBQU0sR0FBRWlGLFdBQ1JBLEVBQWEsR0FBRW5ILFdBQ2ZBLEVBQWEsQ0FBQSxJQUViLE1BQU9vSCxFQUFhQyxHQUFrQnJZLEdBQVMsa0JBQ3hDc1ksRUFBWUMsR0FBaUJ2WSxHQUFTa1QsSUFDdENzRixFQUFtQkMsR0FBd0J6WSxHQUFTbVksSUFDcERsQixFQUFhQyxHQUFrQmxYLEdBQVMsQ0FBQSxHQU16QzBZLEVBQXFCL3ZCLElBQ3pCMHZCLEVBQWUxdkIsRUFBTTBVLE9BQU85UyxRQTBCeEJvdUIsRUFBY0MsSUFDbEIsSUFBS0EsR0FBa0MsS0FBckJBLEVBQVU3cUIsT0FBZSxPQUFPLEVBQ2xELElBRUUsT0FEQSxJQUFJOHFCLElBQUlELElBQ0QsQ0FDVCxDQUFFLE1BQ0EsT0FBTyxDQUNULEdBY0lFLEVBQ1ksa0JBQWhCVixFQVhPTyxFQUFXTCxHQUtoQkUsRUFBa0IvcEIsT0FBUyxHQUMzQitwQixFQUFrQk8sTUFBTzdGLEdBQVF5RixFQUFXekYsSUE4QmhELE9BQU90bUIsQ0FBSTtvQkFDT29rQixFQUFXQzt3QkFDTnpOLEdBQU1BLEVBQUV5SSxxQkFBcUJNLEdBQUl5RSxFQUFXTzs7Ozs7Ozs7Ozs7dUJBVzlCLGtCQUFoQjZHO3NCQUNETTs7Ozs7Ozs7O3VCQVNpQixrQkFBaEJOO3NCQUNETTs7Ozs7VUFLSSxrQkFBaEJOLEVBQ0V4ckIsQ0FBSTs7Ozs0QkFJWTByQjsyQkEzRkQzdkIsSUFDdkI0dkIsRUFBYzV2QixFQUFNMFUsT0FBTzlTOzs7Ozs7OzJCQWRaLEtBQ2ZndUIsRUFBY3JGOzs7OztjQXFITnRtQixDQUFJO2dCQUNBNHJCLEVBQWtCalIsSUFDbEIsQ0FBQzJMLEVBQUtsaUIsSUFBVXBFLENBQUk7Ozs7K0JBSUo0VyxHQTNHQSxFQUFDeFMsRUFBT3JJLEtBQ3BDLE1BQU1xd0IsRUFBYyxJQUFJUixHQUN4QlEsRUFBWWhvQixHQUFTckksRUFBTTBVLE9BQU85UyxNQUNsQ2t1QixFQUFxQk8sSUF3R2FDLENBQXNCam9CLEVBQU93Uzs7Ozs7K0JBS3BDLElBekhMLENBQUN4UyxJQUN2QixNQUFNZ29CLEVBQWNSLEVBQWtCdlAsT0FBTyxDQUFDcE0sRUFBRy9OLElBQU1BLElBQU1rQyxHQUM3RHluQixFQUFxQk8sSUF1SFlFLENBQWdCbG9COzs7Ozs7K0JBN0g5QixLQUNuQnluQixFQUFxQixJQUFJRCxFQUFtQjs7Ozs7Ozs7Ozs7d0JBYmJXLElBQy9CakMsRUFBZWlDO21DQTJKZ0JsQzs7Ozs7MkJBS1JqRyxFQUFXTTs7cUJBRWpCLEtBMUdFLE1BQ25CLElBQUkzZixFQUFPLENBQUEsRUFFVEEsRUFEaUIsaUJBQWZ5bUIsRUFDSyxDQUNMQSxjQUNBem1CLEtBQU0sQ0FDSnVoQixJQUFLb0YsSUFJRixDQUNMRixjQUNBem1CLEtBQU0sQ0FDSndtQixXQUFZSyxJQUlsQjdtQixFQUFLeW5CLFdBQWFuQyxFQUNsQmlCLEVBQWN2bUIsSUF5RkowbkIsR0FDQXJJLEVBQVdNOzt5QkFHQXdIOzs7Ozs7O0dBUXpCLEVBSXlCLENBQUU5YyxjQUFjLEtDbkN6Q2lSLGVBQWVDLE9BQ2Isd0JBQ0F0QixHQXpKRixVQUEwQjRKLG1CQUN4QkEsRUFBa0JoRSxRQUNsQkEsSUFFQSxNQUFPN2YsRUFBTTJuQixHQUFXdFosR0FBUyxPQUMxQmlRLEVBQVFtRyxHQUFhcFcsR0FBUyxJQUUvQnVaLEVBQWNoRyxJQUFTLEdBRXZCaUcsRUFBU2hFLEVBQ1gsQ0FBQywrQ0FDRCx1QkFBdUJDLG1CQUFtQkQsS0FDMUMsb0JBQW9CM2pCLEtBQUssSUFDekIsTUFHRkYsS0FBTThmLEVBQVNuZCxZQUNmQSxFQUNBbWxCLE1BQU9DLEdDbkJKLFNBQWdCQyxFQUFVeHJCLEVBQVUsSUFDekMsTUFBT3dELEVBQU0ybkIsR0FBV3RaLEdBQVMsT0FDMUIxTCxFQUFhc2xCLEdBQWtCNVosSUFBUyxJQUN4Q3laLEVBQU9JLEdBQVk3WixHQUFTLE9BQzVCOFosRUFBYUMsR0FBa0IvWixHQUFTLE1BRXpDZ2EsRUFBU2xhLEdBQ2IsSUFBMkIsbUJBQWI2WixFQUEwQkEsSUFBYUEsRUFDckQsQ0FBQ0EsSUFHR00sRUFBVW5hLEdBQVksS0FDMUIsR0FBSWdhLEVBQWEsT0FDakIsTUFBTTVHLEVBQU04RyxJQUNaLElBQ0UsTUFBTUUsRUFBSyxJQUFJQyxZQUFZakgsR0FDM0I2RyxFQUFlRyxHQUNmTCxFQUFTLE1BRVRLLEVBQUdFLE9BQVMsSUFBTVIsR0FBZSxHQUVqQ00sRUFBR0csVUFBYTF4QixJQUNkLElBQ0Uyd0IsRUFBUXBXLEtBQUtLLE1BQU01YSxFQUFNZ0osTUFDM0IsQ0FBRSxNQUFPNlIsR0FDUHFXLEVBQVMsMEJBQ1gsR0FHRkssRUFBR0ksUUFBVzlXLElBQ1pqYSxRQUFRa3dCLE1BQU0sYUFBY2pXLEdBQzVCb1csR0FBZSxHQUNmQyxFQUFTLHlCQUViLENBQUUsTUFBT3JXLEdBQ1BxVyxFQUFTLDRCQUNYLEdBQ0MsQ0FBQ0MsRUFBYUUsSUFFWE8sRUFBYXphLEdBQVksS0FDekJnYSxJQUNGQSxFQUFZVSxRQUNaVCxFQUFlLE1BQ2ZILEdBQWUsS0FFaEIsQ0FBQ0UsSUFhSixPQVZBOWEsR0FBVSxLQUNKN1EsRUFBUXNzQixhQUNWUixJQUdLLEtBQ0RILEdBQWFBLEVBQVlVLFVBRTlCLENBQUNyc0IsRUFBUXNzQixZQUFhUixFQUFTSCxJQUUzQixDQUFFbm9CLE9BQU0yQyxjQUFhbWxCLFFBQU9RLFVBQVNNLGFBQzlDLENEckNNRyxDQUFPbEIsRUFBUSxDQUFFaUIsY0FBZWpCLElBRXBDeGEsR0FBVSxLQUNId1csR0FDTG1GLEtBQ0MsSUFFSCxNQUFNQSxFQUFZQyxVQUNoQixNQUFPQyxFQUFrQkMsU0FDakJ4Z0IsUUFBUXlnQixJQUFJLENBQ2hCQyxFQUFzQnhGLEdBQ3RCeUYsRUFBZ0J6RixLQUVwQjhELEVBQVF1QixHQUNSekUsRUFBVTBFLElBR05FLEVBQXdCSixNQUFPTSxJQUNuQyxNQUFNbEYsRUFBNkJQLG1CQUFtQnlGLEdBQ2hEMUUsUUFBaUJwQixNQUNyQixtREFBbURZLG9CQUUvQ3hnQixRQUFlZ2hCLEVBQVNuQixPQUM5QixNQUFPLENBQ0wxakIsS0FBTTZELEVBQU83RCxLQUNid3BCLFdBQVkzbEIsRUFBTzJsQixhQUlqQkYsRUFBa0JMLE1BQU9NLElBQzdCLE1BQU1FLEVBQWUzRixtQkFBbUJ5RixHQUNsQzFFLFFBQWlCcEIsTUFDckIsNENBQTRDZ0csS0FHOUMsYUFEcUI1RSxFQUFTbkIsUUFDaEIxakIsTUF5QlYwcEIsRUFBZTFwQixHQUFNQSxNQUFNaWhCLFdBQWEsVUFBWSxZQUUxRCxPQUFPaG1CLENBQUk7Ozs7OztzQkFNUytFLEdBQVFBLEVBQUt3cEIsV0FDbkIsQ0FBRXRFLElBQUtsbEIsRUFBS3dwQixXQUFXdEUsSUFBS0MsSUFBS25sQixFQUFLd3BCLFdBQVdyRSxLQUNqRDs7Ozs7WUFLSm5sQixFQUNFL0UsQ0FBSTs7Ozs7bURBS2lDK0UsRUFBS0EsS0FBS3pHOztpQ0FFNUJtd0I7Ozs7Ozs7eURBT3dCMXBCLEVBQUtBLEtBQUs2Rzs4Q0FDckI3RyxFQUFLQSxLQUFLdWhCOzRDQUNadmhCLEVBQUtBLEtBQUsycEI7aURBQ0wzcEIsRUFBS0EsS0FBSzRwQixXQUFXckg7Ozs7Ozs7NkJBT3pDMUM7K0JBQ0VDO2lDQUNFbmQ7OEJBQ0hvbEI7Ozs7bUNBN0RHa0IsTUFBT1ksSUFDcEMsTUFBTUMsRUFBTyxDQUNYakcsbUJBQW9CN2pCLEVBQUtBLEtBQUs2RyxHQUM5QmtqQixPQUFRLENBQ054SSxJQUFLc0ksRUFBUTdwQixLQUFLdWhCLEtBQU92aEIsRUFBS0EsS0FBS3VoQixJQUNuQ2hvQixLQUFNeUcsRUFBS0EsS0FBS3pHLEtBQ2hCK25CLFlBQWF1SSxFQUFRN3BCLEtBQUt3bUIsV0FDMUJpQixXQUFZb0MsRUFBUTdwQixLQUFLeW5CLG1CQUdMaEUsTUFBTSxpQkFBa0IsQ0FDOUN1RyxRQUFTLENBQUUsZUFBZ0Isb0JBQzNCQyxPQUFRLE9BQ1JILEtBQU12WSxLQUFLQyxVQUFVc1k7eUJBcURGOXBCLEVBQUtBLEtBQUt1aEI7Z0NBQ0hxRyxFQUFZdkk7Ozs7MkJBdkVWcm9CLElBQzlCNHdCLEVBQVl4RjsrQkEyRWM7Ozs7O2dCQU1oQm5uQixDQUFJOzs7OztnQ0FLY3FqQjs7R0FHaEMsRUFJOEIsQ0FDMUJqVSxjQUFjLEVBQ2RELG1CQUFvQixDQUNsQixxQkFDQSxjRS9KTjhmIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMzNdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGV2ZWxvcG1lbnQvbGl0LWh0bWwuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvaW50ZXJmYWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3N5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc3RhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc2NoZWR1bGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9ob29rLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NyZWF0ZS1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWVmZmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtbWVtby5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY2FsbGJhY2suanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWxheW91dC1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLXN0YXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1jb250cm9sbGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWR1Y2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RldmVsb3BtZW50L2RpcmVjdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvY3NzLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9kZXZlbG9wbWVudC9saXQtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmUtaGVscGVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9hc3luYy1kaXJlY3RpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvbGl0LWhhdW50ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvY29yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9jcmVhdGUtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmVzL3JlZi5qcyIsIi4uL2NvbXBvbmVudHMvaW5wdXRzL2F1dG8tY29tcGxldGUtc2VsZWN0LmpzIiwiLi4vY29tcG9uZW50cy9wZW9wbGUtbGlzdC5qcyIsIi4uL2NvbXBvbmVudHMvYmFzaWMvbW9kYWwuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1oaXN0b3J5LWxpc3QuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1kZXRhaWxzLmpzIiwiLi4vY29tcG9uZW50cy9zZWFyY2gtanVyaXNkaWN0aW9ucy9zZWxlY3QtanVyaXNkaWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWYuanMiLCIuLi9jb21wb25lbnRzL3NlYXJjaC1qdXJpc2RpY3Rpb25zL3NlYXJjaC1qdXJpc2RpY3Rpb25zLmpzIiwiLi4vY29tcG9uZW50cy9iYXNpYy9jaGlwLmpzIiwiLi4vY29tcG9uZW50cy9qdXJpc2RpY3Rpb24tcGFnZS9zY3JhcGUtbW9kYWwvbmFtZS1jb25maWctZm9ybS5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2Uvc2NyYXBlLW1vZGFsL3NjcmFwZS1tb2RhbC5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2UvanVyaXNkaWN0aW9uLXBhZ2UuanMiLCIuLi9jb21wb25lbnRzL2hvb2tzL3VzZVNzZS5qcyIsIi4uL2NvbXBvbmVudHMvbWFpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcbi8vIEFsbG93cyBtaW5pZmllcnMgdG8gcmVuYW1lIHJlZmVyZW5jZXMgdG8gZ2xvYmFsVGhpc1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICAgID8gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSBnbG9iYWxcbiAgICAgICAgICAgIC5lbWl0TGl0RGVidWdMb2dFdmVudHM7XG4gICAgICAgIGlmICghc2hvdWxkRW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbGl0LWRlYnVnJywge1xuICAgICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xubGV0IGlzc3VlV2FybmluZztcbmlmIChERVZfTU9ERSkge1xuICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuICAgIC8qKlxuICAgICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgICAqL1xuICAgIGlzc3VlV2FybmluZyA9IChjb2RlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgIHdhcm5pbmcgKz0gY29kZVxuICAgICAgICAgICAgPyBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgaWYgKCFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKHdhcm5pbmcpICYmXG4gICAgICAgICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyhjb2RlKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ2Rldi1tb2RlJywgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWApO1xuICAgIH0pO1xufVxuY29uc3Qgd3JhcCA9IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gICAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICAgIGdsb2JhbC5TaGFkeURPTT8ubm9QYXRjaCA9PT0gdHJ1ZVxuICAgID8gZ2xvYmFsLlNoYWR5RE9NLndyYXBcbiAgICA6IChub2RlKSA9PiBub2RlO1xuY29uc3QgdHJ1c3RlZFR5cGVzID0gZ2xvYmFsLnRydXN0ZWRUeXBlcztcbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgICA/IHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2xpdC1odG1sJywge1xuICAgICAgICBjcmVhdGVIVE1MOiAocykgPT4gcyxcbiAgICB9KVxuICAgIDogdW5kZWZpbmVkO1xuY29uc3QgaWRlbnRpdHlGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyID0gKF9ub2RlLCBfbmFtZSwgX3R5cGUpID0+IGlkZW50aXR5RnVuY3Rpb247XG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcikgPT4ge1xuICAgIGlmICghRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICAgICAgYCBzZXRTYW5pdGl6ZURPTVZhbHVlRmFjdG9yeSBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS5gKTtcbiAgICB9XG4gICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbmV3U2FuaXRpemVyO1xufTtcbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbm9vcFNhbml0aXplcjtcbn07XG5jb25zdCBjcmVhdGVTYW5pdGl6ZXIgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICAgIHJldHVybiBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwobm9kZSwgbmFtZSwgdHlwZSk7XG59O1xuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG4vLyBUaGlzIG1hcmtlciBpcyB1c2VkIGluIG1hbnkgc3ludGFjdGljIHBvc2l0aW9ucyBpbiBIVE1MLCBzbyBpdCBtdXN0IGJlXG4vLyBhIHZhbGlkIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlIG5hbWUuIFdlIGRvbid0IHN1cHBvcnQgZHluYW1pYyBuYW1lcyAoeWV0KVxuLy8gYnV0IHRoaXMgYXQgbGVhc3QgZW5zdXJlcyB0aGF0IHRoZSBwYXJzZSB0cmVlIGlzIGNsb3NlciB0byB0aGUgdGVtcGxhdGVcbi8vIGludGVudGlvbi5cbmNvbnN0IG1hcmtlciA9IGBsaXQkJHtNYXRoLnJhbmRvbSgpLnRvRml4ZWQoOSkuc2xpY2UoMil9JGA7XG4vLyBTdHJpbmcgdXNlZCB0byB0ZWxsIGlmIGEgY29tbWVudCBpcyBhIG1hcmtlciBjb21tZW50XG5jb25zdCBtYXJrZXJNYXRjaCA9ICc/JyArIG1hcmtlcjtcbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcbmNvbnN0IGQgPSBOT0RFX01PREUgJiYgZ2xvYmFsLmRvY3VtZW50ID09PSB1bmRlZmluZWRcbiAgICA/IHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSxcbiAgICB9XG4gICAgOiBkb2N1bWVudDtcbi8vIENyZWF0ZXMgYSBkeW5hbWljIG1hcmtlci4gV2UgbmV2ZXIgaGF2ZSB0byBzZWFyY2ggZm9yIHRoZXNlIGluIHRoZSBET00uXG5jb25zdCBjcmVhdGVNYXJrZXIgPSAoKSA9PiBkLmNyZWF0ZUNvbW1lbnQoJycpO1xuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSB8fFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdHlwZW9mIHZhbHVlPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IFNQQUNFX0NIQVIgPSBgWyBcXHRcXG5cXGZcXHJdYDtcbmNvbnN0IEFUVFJfVkFMVUVfQ0hBUiA9IGBbXiBcXHRcXG5cXGZcXHJcIidcXGA8Pj1dYDtcbmNvbnN0IE5BTUVfQ0hBUiA9IGBbXlxcXFxzXCInPj0vXWA7XG4vLyBUaGVzZSByZWdleGVzIHJlcHJlc2VudCB0aGUgZml2ZSBwYXJzaW5nIHN0YXRlcyB0aGF0IHdlIGNhcmUgYWJvdXQgaW4gdGhlXG4vLyBUZW1wbGF0ZSdzIEhUTUwgc2Nhbm5lci4gVGhleSBtYXRjaCB0aGUgKmVuZCogb2YgdGhlIHN0YXRlIHRoZXkncmUgbmFtZWRcbi8vIGFmdGVyLlxuLy8gRGVwZW5kaW5nIG9uIHRoZSBtYXRjaCwgd2UgdHJhbnNpdGlvbiB0byBhIG5ldyBzdGF0ZS4gSWYgdGhlcmUncyBubyBtYXRjaCxcbi8vIHdlIHN0YXkgaW4gdGhlIHNhbWUgc3RhdGUuXG4vLyBOb3RlIHRoYXQgdGhlIHJlZ2V4ZXMgYXJlIHN0YXRlZnVsLiBXZSB1dGlsaXplIGxhc3RJbmRleCBhbmQgc3luYyBpdFxuLy8gYWNyb3NzIHRoZSBtdWx0aXBsZSByZWdleGVzIHVzZWQuIEluIGFkZGl0aW9uIHRvIHRoZSBmaXZlIHJlZ2V4ZXMgYmVsb3dcbi8vIHdlIGFsc28gZHluYW1pY2FsbHkgY3JlYXRlIGEgcmVnZXggdG8gZmluZCB0aGUgbWF0Y2hpbmcgZW5kIHRhZ3MgZm9yIHJhd1xuLy8gdGV4dCBlbGVtZW50cy5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuY29uc3QgY29tbWVudEVuZFJlZ2V4ID0gLy0tPi9nO1xuLyoqXG4gKiBDb21tZW50cyBub3Qgc3RhcnRlZCB3aXRoIDwhLS0sIGxpa2UgPC97LCBjYW4gYmUgZW5kZWQgYnkgYSBzaW5nbGUgYD5gXG4gKi9cbmNvbnN0IGNvbW1lbnQyRW5kUmVnZXggPSAvPi9nO1xuLyoqXG4gKiBUaGUgdGFnRW5kIHJlZ2V4IG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgXCJpbnNpZGUgYW4gb3BlbmluZ1wiIHRhZyBzeW50YXhcbiAqIHBvc2l0aW9uLiBJdCBlaXRoZXIgbWF0Y2hlcyBhIGA+YCwgYW4gYXR0cmlidXRlLWxpa2Ugc2VxdWVuY2UsIG9yIHRoZSBlbmRcbiAqIG9mIHRoZSBzdHJpbmcgYWZ0ZXIgYSBzcGFjZSAoYXR0cmlidXRlLW5hbWUgcG9zaXRpb24gZW5kaW5nKS5cbiAqXG4gKiBTZWUgYXR0cmlidXRlcyBpbiB0aGUgSFRNTCBzcGVjOlxuICogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI2VsZW1lbnRzLWF0dHJpYnV0ZXNcbiAqXG4gKiBcIiBcXHRcXG5cXGZcXHJcIiBhcmUgSFRNTCBzcGFjZSBjaGFyYWN0ZXJzOlxuICogaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2FzY2lpLXdoaXRlc3BhY2VcbiAqXG4gKiBTbyBhbiBhdHRyaWJ1dGUgaXM6XG4gKiAgKiBUaGUgbmFtZTogYW55IGNoYXJhY3RlciBleGNlcHQgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciwgKFwiKSwgKCcpLCBcIj5cIixcbiAqICAgIFwiPVwiLCBvciBcIi9cIi4gTm90ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSFRNTCBzcGVjIHdoaWNoIGFsc28gZXhjbHVkZXMgY29udHJvbCBjaGFyYWN0ZXJzLlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5IFwiPVwiXG4gKiAgKiBGb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVyc1xuICogICogRm9sbG93ZWQgYnk6XG4gKiAgICAqIEFueSBjaGFyYWN0ZXIgZXhjZXB0IHNwYWNlLCAoJyksIChcIiksIFwiPFwiLCBcIj5cIiwgXCI9XCIsIChgKSwgb3JcbiAqICAgICogKFwiKSB0aGVuIGFueSBub24tKFwiKSwgb3JcbiAqICAgICogKCcpIHRoZW4gYW55IG5vbi0oJylcbiAqL1xuY29uc3QgdGFnRW5kUmVnZXggPSBuZXcgUmVnRXhwKGA+fCR7U1BBQ0VfQ0hBUn0oPzooJHtOQU1FX0NIQVJ9KykoJHtTUEFDRV9DSEFSfSo9JHtTUEFDRV9DSEFSfSooPzoke0FUVFJfVkFMVUVfQ0hBUn18KFwifCcpfCkpfCQpYCwgJ2cnKTtcbmNvbnN0IEVOVElSRV9NQVRDSCA9IDA7XG5jb25zdCBBVFRSSUJVVEVfTkFNRSA9IDE7XG5jb25zdCBTUEFDRVNfQU5EX0VRVUFMUyA9IDI7XG5jb25zdCBRVU9URV9DSEFSID0gMztcbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuLyoqIFRlbXBsYXRlUmVzdWx0IHR5cGVzICovXG5jb25zdCBIVE1MX1JFU1VMVCA9IDE7XG5jb25zdCBTVkdfUkVTVUxUID0gMjtcbmNvbnN0IE1BVEhNTF9SRVNVTFQgPSAzO1xuLy8gVGVtcGxhdGVQYXJ0IHR5cGVzXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBQYXJ0VHlwZVxuY29uc3QgQVRUUklCVVRFX1BBUlQgPSAxO1xuY29uc3QgQ0hJTERfUEFSVCA9IDI7XG5jb25zdCBQUk9QRVJUWV9QQVJUID0gMztcbmNvbnN0IEJPT0xFQU5fQVRUUklCVVRFX1BBUlQgPSA0O1xuY29uc3QgRVZFTlRfUEFSVCA9IDU7XG5jb25zdCBFTEVNRU5UX1BBUlQgPSA2O1xuY29uc3QgQ09NTUVOVF9QQVJUID0gNztcbi8qKlxuICogR2VuZXJhdGVzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgVGVtcGxhdGVSZXN1bHQgd2l0aFxuICogdGhlIGdpdmVuIHJlc3VsdCB0eXBlLlxuICovXG5jb25zdCB0YWcgPSAodHlwZSkgPT4gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU29tZSB0ZW1wbGF0ZSBzdHJpbmdzIGFyZSB1bmRlZmluZWQuXFxuJyArXG4gICAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLicpO1xuICAgIH1cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgICAgLy8gaGFuZGxlLiBJbnN0ZWFkIHdlIGtub3cgdGhhdCBzdGF0aWMgdmFsdWVzIG11c3QgaGF2ZSB0aGUgZmllbGRcbiAgICAgICAgLy8gYF8kbGl0U3RhdGljJGAuXG4gICAgICAgIGlmICh2YWx1ZXMuc29tZSgodmFsKSA9PiB2YWw/LlsnXyRsaXRTdGF0aWMkJ10pKSB7XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJycsIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSB1c2UgdGhlIHN0YXRpYyAnaHRtbCcgdGFnIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgICAgdmFsdWVzLFxuICAgIH07XG59O1xuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGFuIFNWRyBmcmFnbWVudCB0aGF0IGNhbiBlZmZpY2llbnRseSByZW5kZXJcbiAqIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlY3QgPSBzdmdgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCI+PC9yZWN0PmA7XG4gKlxuICogY29uc3QgbXlJbWFnZSA9IGh0bWxgXG4gKiAgIDxzdmcgdmlld0JveD1cIjAgMCAxMCAxMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAqICAgICAke3JlY3R9XG4gKiAgIDwvc3ZnPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYHN2Z2AgKnRhZyBmdW5jdGlvbiogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgU1ZHIGZyYWdtZW50cywgb3IgZWxlbWVudHNcbiAqIHRoYXQgd291bGQgYmUgY29udGFpbmVkICoqaW5zaWRlKiogYW4gYDxzdmc+YCBIVE1MIGVsZW1lbnQuIEEgY29tbW9uIGVycm9yIGlzXG4gKiBwbGFjaW5nIGFuIGA8c3ZnPmAgKmVsZW1lbnQqIGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIGBzdmdgIHRhZ1xuICogZnVuY3Rpb24uIFRoZSBgPHN2Zz5gIGVsZW1lbnQgaXMgYW4gSFRNTCBlbGVtZW50IGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoaW4gYVxuICogdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIHtAbGlua2NvZGUgaHRtbH0gdGFnIGZ1bmN0aW9uLlxuICpcbiAqIEluIExpdEVsZW1lbnQgdXNhZ2UsIGl0J3MgaW52YWxpZCB0byByZXR1cm4gYW4gU1ZHIGZyYWdtZW50IGZyb20gdGhlXG4gKiBgcmVuZGVyKClgIG1ldGhvZCwgYXMgdGhlIFNWRyBmcmFnbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGVsZW1lbnQnc1xuICogc2hhZG93IHJvb3QgYW5kIHRodXMgbm90IGJlIHByb3Blcmx5IGNvbnRhaW5lZCB3aXRoaW4gYW4gYDxzdmc+YCBIVE1MXG4gKiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3Qgc3ZnID0gdGFnKFNWR19SRVNVTFQpO1xuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBNYXRoTUwgZnJhZ21lbnQgdGhhdCBjYW4gZWZmaWNpZW50bHkgcmVuZGVyXG4gKiB0byBhbmQgdXBkYXRlIGEgY29udGFpbmVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW0gPSBtYXRobWxgPG1uPjE8L21uPmA7XG4gKlxuICogY29uc3QgZXEgPSBodG1sYFxuICogICA8bWF0aD5cbiAqICAgICAke251bX1cbiAqICAgPC9tYXRoPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYG1hdGhtbGAgKnRhZyBmdW5jdGlvbiogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgTWF0aE1MIGZyYWdtZW50cywgb3JcbiAqIGVsZW1lbnRzIHRoYXQgd291bGQgYmUgY29udGFpbmVkICoqaW5zaWRlKiogYSBgPG1hdGg+YCBIVE1MIGVsZW1lbnQuIEEgY29tbW9uXG4gKiBlcnJvciBpcyBwbGFjaW5nIGEgYDxtYXRoPmAgKmVsZW1lbnQqIGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIGBtYXRobWxgXG4gKiB0YWcgZnVuY3Rpb24uIFRoZSBgPG1hdGg+YCBlbGVtZW50IGlzIGFuIEhUTUwgZWxlbWVudCBhbmQgc2hvdWxkIGJlIHVzZWRcbiAqIHdpdGhpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSB7QGxpbmtjb2RlIGh0bWx9IHRhZyBmdW5jdGlvbi5cbiAqXG4gKiBJbiBMaXRFbGVtZW50IHVzYWdlLCBpdCdzIGludmFsaWQgdG8gcmV0dXJuIGFuIE1hdGhNTCBmcmFnbWVudCBmcm9tIHRoZVxuICogYHJlbmRlcigpYCBtZXRob2QsIGFzIHRoZSBNYXRoTUwgZnJhZ21lbnQgd2lsbCBiZSBjb250YWluZWQgd2l0aGluIHRoZVxuICogZWxlbWVudCdzIHNoYWRvdyByb290IGFuZCB0aHVzIG5vdCBiZSBwcm9wZXJseSBjb250YWluZWQgd2l0aGluIGEgYDxtYXRoPmBcbiAqIEhUTUwgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hdGhtbCA9IHRhZyhNQVRITUxfUkVTVUxUKTtcbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuLyoqXG4gKiBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgc2lnbmFscyBhIENoaWxkUGFydCB0byBmdWxseSBjbGVhciBpdHMgY29udGVudC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgYnV0dG9uID0gaHRtbGAke1xuICogIHVzZXIuaXNBZG1pblxuICogICAgPyBodG1sYDxidXR0b24+REVMRVRFPC9idXR0b24+YFxuICogICAgOiBub3RoaW5nXG4gKiB9YDtcbiAqIGBgYFxuICpcbiAqIFByZWZlciB1c2luZyBgbm90aGluZ2Agb3ZlciBvdGhlciBmYWxzeSB2YWx1ZXMgYXMgaXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBiZXR3ZWVuIHZhcmlvdXMgZXhwcmVzc2lvbiBiaW5kaW5nIGNvbnRleHRzLlxuICpcbiAqIEluIGNoaWxkIGV4cHJlc3Npb25zLCBgdW5kZWZpbmVkYCwgYG51bGxgLCBgJydgLCBhbmQgYG5vdGhpbmdgIGFsbCBiZWhhdmUgdGhlXG4gKiBzYW1lIGFuZCByZW5kZXIgbm8gbm9kZXMuIEluIGF0dHJpYnV0ZSBleHByZXNzaW9ucywgYG5vdGhpbmdgIF9yZW1vdmVzXyB0aGVcbiAqIGF0dHJpYnV0ZSwgd2hpbGUgYHVuZGVmaW5lZGAgYW5kIGBudWxsYCB3aWxsIHJlbmRlciBhbiBlbXB0eSBzdHJpbmcuIEluXG4gKiBwcm9wZXJ0eSBleHByZXNzaW9ucyBgbm90aGluZ2AgYmVjb21lcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSBTeW1ib2wuZm9yKCdsaXQtbm90aGluZycpO1xuLyoqXG4gKiBUaGUgY2FjaGUgb2YgcHJlcGFyZWQgdGVtcGxhdGVzLCBrZXllZCBieSB0aGUgdGFnZ2VkIFRlbXBsYXRlU3RyaW5nc0FycmF5XG4gKiBhbmQgX25vdF8gYWNjb3VudGluZyBmb3IgdGhlIHNwZWNpZmljIHRlbXBsYXRlIHRhZyB1c2VkLiBUaGlzIG1lYW5zIHRoYXRcbiAqIHRlbXBsYXRlIHRhZ3MgY2Fubm90IGJlIGR5bmFtaWMgLSB0aGV5IG11c3Qgc3RhdGljYWxseSBiZSBvbmUgb2YgaHRtbCwgc3ZnLFxuICogb3IgYXR0ci4gVGhpcyByZXN0cmljdGlvbiBzaW1wbGlmaWVzIHRoZSBjYWNoZSBsb29rdXAsIHdoaWNoIGlzIG9uIHRoZSBob3RcbiAqIHBhdGggZm9yIHJlbmRlcmluZy5cbiAqL1xuY29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoZCwgMTI5IC8qIE5vZGVGaWx0ZXIuU0hPV197RUxFTUVOVHxDT01NRU5UfSAqLyk7XG5sZXQgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbm9vcFNhbml0aXplcjtcbmZ1bmN0aW9uIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHRzYSwgc3RyaW5nRnJvbVRTQSkge1xuICAgIC8vIEEgc2VjdXJpdHkgY2hlY2sgdG8gcHJldmVudCBzcG9vZmluZyBvZiBMaXQgdGVtcGxhdGUgcmVzdWx0cy5cbiAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgd2l0aCBBcnJheS5pc1RlbXBsYXRlT2JqZWN0LFxuICAgIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAgIC8vIGZ1bmN0aW9ucywgYmVjYXVzZSBwcmVjb21waWxlZCB0ZW1wbGF0ZXMgZG9uJ3QgY29tZSBpbiBhc1xuICAgIC8vIFRlbXBsYXRlU3RyaW5nQXJyYXkgb2JqZWN0cy5cbiAgICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICdpbnZhbGlkIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXknO1xuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgXG4gICAgICAgICAgSW50ZXJuYWwgRXJyb3I6IGV4cGVjdGVkIHRlbXBsYXRlIHN0cmluZ3MgdG8gYmUgYW4gYXJyYXlcbiAgICAgICAgICB3aXRoIGEgJ3JhdycgZmllbGQuIEZha2luZyBhIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXkgYnlcbiAgICAgICAgICBjYWxsaW5nIGh0bWwgb3Igc3ZnIGxpa2UgYW4gb3JkaW5hcnkgZnVuY3Rpb24gaXMgZWZmZWN0aXZlbHlcbiAgICAgICAgICB0aGUgc2FtZSBhcyBjYWxsaW5nIHVuc2FmZUh0bWwgYW5kIGNhbiBsZWFkIHRvIG1ham9yIHNlY3VyaXR5XG4gICAgICAgICAgaXNzdWVzLCBlLmcuIG9wZW5pbmcgeW91ciBjb2RlIHVwIHRvIFhTUyBhdHRhY2tzLlxuICAgICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgaHRtbCBvciBzdmcgdGFnZ2VkIHRlbXBsYXRlIGZ1bmN0aW9ucyBub3JtYWxseVxuICAgICAgICAgIGFuZCBzdGlsbCBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIGZpbGUgYSBidWcgYXRcbiAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9pc3N1ZXMvbmV3P3RlbXBsYXRlPWJ1Z19yZXBvcnQubWRcbiAgICAgICAgICBhbmQgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIGJ1aWxkIHRvb2xpbmcsIGlmIGFueS5cbiAgICAgICAgYFxuICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gcG9saWN5LmNyZWF0ZUhUTUwoc3RyaW5nRnJvbVRTQSlcbiAgICAgICAgOiBzdHJpbmdGcm9tVFNBO1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIEhUTUwgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gVGVtcGxhdGVTdHJpbmdzQXJyYXkgYW5kIHJlc3VsdCB0eXBlXG4gKiAoSFRNTCBvciBTVkcpLCBhbG9uZyB3aXRoIHRoZSBjYXNlLXNlbnNpdGl2ZSBib3VuZCBhdHRyaWJ1dGUgbmFtZXMgaW5cbiAqIHRlbXBsYXRlIG9yZGVyLiBUaGUgSFRNTCBjb250YWlucyBjb21tZW50IG1hcmtlcnMgZGVub3RpbmcgdGhlIGBDaGlsZFBhcnRgc1xuICogYW5kIHN1ZmZpeGVzIG9uIGJvdW5kIGF0dHJpYnV0ZXMgZGVub3RpbmcgdGhlIGBBdHRyaWJ1dGVQYXJ0c2AuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgdGVtcGxhdGUgc3RyaW5ncyBhcnJheVxuICogQHBhcmFtIHR5cGUgSFRNTCBvciBTVkdcbiAqIEByZXR1cm4gQXJyYXkgY29udGFpbmluZyBgW2h0bWwsIGF0dHJOYW1lc11gIChhcnJheSByZXR1cm5lZCBmb3IgdGVyc2VuZXNzLFxuICogICAgIHRvIGF2b2lkIG9iamVjdCBmaWVsZHMgc2luY2UgdGhpcyBjb2RlIGlzIHNoYXJlZCB3aXRoIG5vbi1taW5pZmllZCBTU1JcbiAqICAgICBjb2RlKVxuICovXG5jb25zdCBnZXRUZW1wbGF0ZUh0bWwgPSAoc3RyaW5ncywgdHlwZSkgPT4ge1xuICAgIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gICAgLy8gYmluZGluZ3MuIFRoZSBmb2xsb3dpbmcgY29kZSBzY2FucyB0aGUgdGVtcGxhdGUgc3RyaW5ncyB0byBkZXRlcm1pbmUgdGhlXG4gICAgLy8gc3ludGFjdGljIHBvc2l0aW9uIG9mIHRoZSBiaW5kaW5ncy4gVGhleSBjYW4gYmUgaW4gdGV4dCBwb3NpdGlvbiwgd2hlcmVcbiAgICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gICAgLy8gc2VudGluZWwgc3RyaW5nIGFuZCByZS13cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIG9yIGluc2lkZSBhIHRhZyB3aGVyZVxuICAgIC8vIHdlIGluc2VydCB0aGUgc2VudGluZWwgc3RyaW5nLlxuICAgIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgLy8gU3RvcmVzIHRoZSBjYXNlLXNlbnNpdGl2ZSBib3VuZCBhdHRyaWJ1dGUgbmFtZXMgaW4gdGhlIG9yZGVyIG9mIHRoZWlyXG4gICAgLy8gcGFydHMuIEVsZW1lbnRQYXJ0cyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhpcyBhcnJheSBhcyB1bmRlZmluZWRcbiAgICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICAgIGNvbnN0IGF0dHJOYW1lcyA9IFtdO1xuICAgIGxldCBodG1sID0gdHlwZSA9PT0gU1ZHX1JFU1VMVCA/ICc8c3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzxtYXRoPicgOiAnJztcbiAgICAvLyBXaGVuIHdlJ3JlIGluc2lkZSBhIHJhdyB0ZXh0IHRhZyAobm90IGl0J3MgdGV4dCBjb250ZW50KSwgdGhlIHJlZ2V4XG4gICAgLy8gd2lsbCBzdGlsbCBiZSB0YWdSZWdleCBzbyB3ZSBjYW4gZmluZCBhdHRyaWJ1dGVzLCBidXQgd2lsbCBzd2l0Y2ggdG9cbiAgICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICAgIGxldCByYXdUZXh0RW5kUmVnZXg7XG4gICAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAgIC8vIHJlZ2V4ZXNcbiAgICBsZXQgcmVnZXggPSB0ZXh0RW5kUmVnZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcyA9IHN0cmluZ3NbaV07XG4gICAgICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAgICAgLy8gcG9zaXRpdmUgYXQgZW5kIG9mIGEgc3RyaW5nLCBpdCBtZWFucyB3ZSdyZSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgLy8gcG9zaXRpb24gYW5kIG5lZWQgdG8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUuXG4gICAgICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICAgIC8vIHRoZSBlbmQgb2YgYSBzdHJpbmcgaW4gYXR0cmlidXRlIG5hbWUgcG9zaXRpb24uXG4gICAgICAgIGxldCBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIGxldCBhdHRyTmFtZTtcbiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgLy8gVGhlIGNvbmRpdGlvbnMgaW4gdGhpcyBsb29wIGhhbmRsZSB0aGUgY3VycmVudCBwYXJzZSBzdGF0ZSwgYW5kIHRoZVxuICAgICAgICAvLyBhc3NpZ25tZW50cyB0byB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBhcmUgdGhlIHN0YXRlIHRyYW5zaXRpb25zLlxuICAgICAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICAgICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RJbmRleCA9IHJlZ2V4Lmxhc3RJbmRleDtcbiAgICAgICAgICAgIGlmIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoW0NPTU1FTlRfU1RBUlRdID09PSAnIS0tJykge1xuICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNvbW1lbnRFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBzdGFydGVkIGEgd2VpcmQgY29tbWVudCwgbGlrZSA8L3tcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjb21tZW50MkVuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3VGV4dEVsZW1lbnQudGVzdChtYXRjaFtUQUdfTkFNRV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaWYgd2UgZW5jb3VudGVyIGEgcmF3LXRleHQgZWxlbWVudC4gV2UnbGwgc3dpdGNoIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlZ2V4IGF0IHRoZSBlbmQgb2YgdGhlIHRhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1RleHRFbmRSZWdleCA9IG5ldyBSZWdFeHAoYDwvJHttYXRjaFtUQUdfTkFNRV19YCwgJ2cnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtEWU5BTUlDX1RBR19OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaW5kaW5ncyBpbiB0YWcgbmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2Ugc3RhdGljIHRlbXBsYXRlcyBpbnN0ZWFkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jc3RhdGljLWV4cHJlc3Npb25zJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdleCA9PT0gdGFnRW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBhIHRhZy4gSWYgd2UgaGFkIHN0YXJ0ZWQgYSByYXctdGV4dCBlbGVtZW50LCB1c2UgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyByZWdleFxuICAgICAgICAgICAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBiZSBlbmRpbmcgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLCBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYW55IHBlbmRpbmcgYXR0ck5hbWVFbmRJbmRleFxuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoW0FUVFJJQlVURV9OQU1FXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBuYW1lIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSByZWdleC5sYXN0SW5kZXggLSBtYXRjaFtTUEFDRVNfQU5EX0VRVUFMU10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbUVVPVEVfQ0hBUl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1hdGNoW1FVT1RFX0NIQVJdID09PSAnXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgICAgICAgICByZWdleCA9PT0gc2luZ2xlUXVvdGVBdHRyRW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGV4dEVuZFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IG9uZSBvZiB0aGUgZml2ZSBzdGF0ZSByZWdleGVzLCBzbyBpdCBtdXN0IGJlIHRoZSBkeW5hbWljYWxseVxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQgcmF3IHRleHQgcmVnZXggYW5kIHdlJ3JlIGF0IHRoZSBjbG9zZSBvZiB0aGF0IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgICAgICByYXdUZXh0RW5kUmVnZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgYXR0ck5hbWVFbmRJbmRleCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSwgYXNzZXJ0IHRoYXQgd2UncmUgaW4gYSB2YWxpZCBhdHRyaWJ1dGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIC0gZWl0aGVyIGluIGEgdGFnLCBvciBhIHF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICAgICAgICBjb25zb2xlLmFzc2VydChhdHRyTmFtZUVuZEluZGV4ID09PSAtMSB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCwgJ3VuZXhwZWN0ZWQgcGFyc2Ugc3RhdGUgQicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgZm91ciBjYXNlczpcbiAgICAgICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgICAgIC8vICAgICAocmVnZXggPT09IHRleHRFbmRSZWdleCk6IGluc2VydCBhIGNvbW1lbnQgbWFya2VyLlxuICAgICAgICAvLyAgMi4gV2UgaGF2ZSBhIG5vbi1uZWdhdGl2ZSBhdHRyTmFtZUVuZEluZGV4IHdoaWNoIG1lYW5zIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgICAgIC8vICAzLiBXZSdyZSBhdCB0aGUgbm9uLWZpcnN0IGJpbmRpbmcgaW4gYSBtdWx0aS1iaW5kaW5nIGF0dHJpYnV0ZSwgdXNlIGFcbiAgICAgICAgLy8gICAgIHBsYWluIG1hcmtlci5cbiAgICAgICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAvLyAgICAgcG9zaXRpb24gKGF0dHJOYW1lRW5kSW5kZXggPT09IC0yKSwgYWRkIGEgc2VxdWVudGlhbCBzdWZmaXggdG9cbiAgICAgICAgLy8gICAgIGdlbmVyYXRlIGEgdW5pcXVlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAgICAvLyBEZXRlY3QgYSBiaW5kaW5nIG5leHQgdG8gc2VsZi1jbG9zaW5nIHRhZyBlbmQgYW5kIGluc2VydCBhIHNwYWNlIHRvXG4gICAgICAgIC8vIHNlcGFyYXRlIHRoZSBtYXJrZXIgZnJvbSB0aGUgdGFnIGVuZDpcbiAgICAgICAgY29uc3QgZW5kID0gcmVnZXggPT09IHRhZ0VuZFJlZ2V4ICYmIHN0cmluZ3NbaSArIDFdLnN0YXJ0c1dpdGgoJy8+JykgPyAnICcgOiAnJztcbiAgICAgICAgaHRtbCArPVxuICAgICAgICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICAgICAgICAgID8gcyArIG5vZGVNYXJrZXJcbiAgICAgICAgICAgICAgICA6IGF0dHJOYW1lRW5kSW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICAgICA/IChhdHRyTmFtZXMucHVzaChhdHRyTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNsaWNlKDAsIGF0dHJOYW1lRW5kSW5kZXgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zbGljZShhdHRyTmFtZUVuZEluZGV4KSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICAgICAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgICB9XG4gICAgY29uc3QgaHRtbFJlc3VsdCA9IGh0bWwgK1xuICAgICAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICAgICAodHlwZSA9PT0gU1ZHX1JFU1VMVCA/ICc8L3N2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8L21hdGg+JyA6ICcnKTtcbiAgICAvLyBSZXR1cm5lZCBhcyBhbiBhcnJheSBmb3IgdGVyc2VuZXNzXG4gICAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7IHN0cmluZ3MsIFsnXyRsaXRUeXBlJCddOiB0eXBlIH0sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgbGV0IG5vZGVJbmRleCA9IDA7XG4gICAgICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgcGFydENvdW50ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucGFydHM7XG4gICAgICAgIC8vIENyZWF0ZSB0ZW1wbGF0ZSBlbGVtZW50XG4gICAgICAgIGNvbnN0IFtodG1sLCBhdHRyTmFtZXNdID0gZ2V0VGVtcGxhdGVIdG1sKHN0cmluZ3MsIHR5cGUpO1xuICAgICAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50O1xuICAgICAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICAgICAgaWYgKHR5cGUgPT09IFNWR19SRVNVTFQgfHwgdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCkge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgICAgICB3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkgIT09IG51bGwgJiYgcGFydHMubGVuZ3RoIDwgcGFydENvdW50KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBub2RlLmxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FybiBpZiBgdGV4dGFyZWFgIGluY2x1ZGVzIGFuIGV4cHJlc3Npb24gYW5kIHRocm93IGlmIGB0ZW1wbGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzaW5jZSB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZC4gV2UgZG8gdGhpcyBieSBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2VzIGxpa2UgYmluZGluZ3MgaW4gdGV4dGFyZWEgdGhlcmUgbWFya2VycyB0dXJuIGludG8gdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pLnRlc3QodGFnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbm5lckhUTUwuaW5jbHVkZXMobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IGBFeHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgXFxgJHt0YWd9XFxgIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluZm9ybWF0aW9uLmA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygnJywgbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBiaW5kaW5nSW5kZXgsIGFuZCBpdCdsbCBiZSBvZmYgYnkgMSBpbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIC8vIGFuZCBvZmYgYnkgdHdvIGFmdGVyIGl0LlxuICAgICAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygbm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChib3VuZEF0dHJpYnV0ZVN1ZmZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsTmFtZSA9IGF0dHJOYW1lc1thdHRyTmFtZUluZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IC8oWy4/QF0pPyguKikvLmV4ZWMocmVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBVFRSSUJVVEVfUEFSVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG5vZGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczogc3RhdGljcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RvcjogbVsxXSA9PT0gJy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BlcnR5UGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBFdmVudFBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBdHRyaWJ1dGVQYXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRUxFTUVOVF9QQVJULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBiZW5jaG1hcmsgdGhlIHJlZ2V4IGFnYWluc3QgdGVzdGluZyBmb3IgZWFjaFxuICAgICAgICAgICAgICAgIC8vIG9mIHRoZSAzIHJhdyB0ZXh0IGVsZW1lbnQgbmFtZXMuXG4gICAgICAgICAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3Qobm9kZS50YWdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hcmtlcnMsIGNyZWF0ZSBhIFRleHQgbm9kZSBmb3IgZWFjaCBzZWdtZW50LCBhbmQgY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgVGVtcGxhdGVQYXJ0IGZvciBlYWNoIG1hcmtlci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IG5vZGUudGV4dENvbnRlbnQuc3BsaXQobWFya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRydXN0ZWRUeXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHRleHQgbm9kZSBmb3IgZWFjaCBsaXRlcmFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIG5vZGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIG1hcmtlcnMgZm9yIGNoaWxkIHBhcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoc3RyaW5nc1tpXSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyB0eXBlOiBDSElMRF9QQVJULCBpbmRleDogKytub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoc3RyaW5nc1tsYXN0SW5kZXhdLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IHR5cGU6IENISUxEX1BBUlQsIGluZGV4OiBub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGkgPSBub2RlLmRhdGEuaW5kZXhPZihtYXJrZXIsIGkgKyAxKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21tZW50IG5vZGUgaGFzIGEgYmluZGluZyBtYXJrZXIgaW5zaWRlLCBtYWtlIGFuIGluYWN0aXZlIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiaW5kaW5nIHdvbid0IHdvcmssIGJ1dCBzdWJzZXF1ZW50IGJpbmRpbmdzIHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyB0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IG1hcmtlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBkdXBsaWNhdGUgYXR0cmlidXRlIG9uIGEgdGFnLCB0aGVuIHdoZW4gdGhlIHRhZyBpc1xuICAgICAgICAgICAgLy8gcGFyc2VkIGludG8gYW4gZWxlbWVudCB0aGUgYXR0cmlidXRlIGdldHMgZGUtZHVwbGljYXRlZC4gV2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhpcyBtaXNtYXRjaCBpZiB3ZSBoYXZlbid0IHByZWNpc2VseSBjb25zdW1lZCBldmVyeSBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgLy8gd2hlbiBwcmVwYXJpbmcgdGhlIHRlbXBsYXRlLiBUaGlzIHdvcmtzIGJlY2F1c2UgYGF0dHJOYW1lc2AgaXMgYnVpbHRcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHRlbXBsYXRlIHN0cmluZyBhbmQgYGF0dHJOYW1lSW5kZXhgIGNvbWVzIGZyb20gcHJvY2Vzc2luZyB0aGVcbiAgICAgICAgICAgIC8vIHJlc3VsdGluZyBET00uXG4gICAgICAgICAgICBpZiAoYXR0ck5hbWVzLmxlbmd0aCAhPT0gYXR0ck5hbWVJbmRleCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYGhhcyBkdXBsaWNhdGUgYXR0cmlidXRlcyBvbiBhbiBlbGVtZW50IHRhZy4gRm9yIGV4YW1wbGUgYCArXG4gICAgICAgICAgICAgICAgICAgIGBcIjxpbnB1dCA/ZGlzYWJsZWQ9XFwke3RydWV9ID9kaXNhYmxlZD1cXCR7ZmFsc2V9PlwiIGNvbnRhaW5zIGEgYCArXG4gICAgICAgICAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6IFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAnYCcgK1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICAgICAgICAgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBjb3VsZCBzZXQgd2Fsa2VyLmN1cnJlbnROb2RlIHRvIGFub3RoZXIgbm9kZSBoZXJlIHRvIHByZXZlbnQgYSBtZW1vcnlcbiAgICAgICAgLy8gbGVhaywgYnV0IGV2ZXJ5IHRpbWUgd2UgcHJlcGFyZSBhIHRlbXBsYXRlLCB3ZSBpbW1lZGlhdGVseSByZW5kZXIgaXRcbiAgICAgICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgY2xvbmFibGVUZW1wbGF0ZTogdGhpcy5lbCxcbiAgICAgICAgICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgICAgICAgICBzdHJpbmdzLFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIE92ZXJyaWRkZW4gdmlhIGBsaXRIdG1sUG9seWZpbGxTdXBwb3J0YCB0byBwcm92aWRlIHBsYXRmb3JtIHN1cHBvcnQuXG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbCwgX29wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKHBhcnQsIHZhbHVlLCBwYXJlbnQgPSBwYXJ0LCBhdHRyaWJ1dGVJbmRleCkge1xuICAgIC8vIEJhaWwgZWFybHkgaWYgdGhlIHZhbHVlIGlzIGV4cGxpY2l0bHkgbm9DaGFuZ2UuIE5vdGUsIHRoaXMgbWVhbnMgYW55XG4gICAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgICBpZiAodmFsdWUgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgbGV0IGN1cnJlbnREaXJlY3RpdmUgPSBhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gcGFyZW50Ll9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgICA6IHBhcmVudC5fX2RpcmVjdGl2ZTtcbiAgICBjb25zdCBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IgPSBpc1ByaW1pdGl2ZSh2YWx1ZSlcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICAgICAgdmFsdWVbJ18kbGl0RGlyZWN0aXZlJCddO1xuICAgIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIGN1cnJlbnREaXJlY3RpdmU/LlsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPy4oZmFsc2UpO1xuICAgICAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlID0gbmV3IG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvcihwYXJ0KTtcbiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAocGFyZW50Ll9fZGlyZWN0aXZlcyA/Pz0gW10pW2F0dHJpYnV0ZUluZGV4XSA9XG4gICAgICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5fX2RpcmVjdGl2ZSA9IGN1cnJlbnREaXJlY3RpdmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnREaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUocGFydCwgY3VycmVudERpcmVjdGl2ZS5fJHJlc29sdmUocGFydCwgdmFsdWUudmFsdWVzKSwgY3VycmVudERpcmVjdGl2ZSwgYXR0cmlidXRlSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIEFuIHVwZGF0ZWFibGUgaW5zdGFuY2Ugb2YgYSBUZW1wbGF0ZS4gSG9sZHMgcmVmZXJlbmNlcyB0byB0aGUgUGFydHMgdXNlZCB0b1xuICogdXBkYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZS5cbiAqL1xuY2xhc3MgVGVtcGxhdGVJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGUsIHBhcmVudCkge1xuICAgICAgICB0aGlzLl8kcGFydHMgPSBbXTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fJHRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIC8vIENhbGxlZCBieSBDaGlsZFBhcnQgcGFyZW50Tm9kZSBnZXR0ZXJcbiAgICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIGFcbiAgICAvLyBEb2N1bWVudEZyYWdtZW50IGFuZCB3ZSBkb24ndCB3YW50IHRvIGhvbGQgb250byBpdCB3aXRoIGFuIGluc3RhbmNlIGZpZWxkLlxuICAgIF9jbG9uZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgZWw6IHsgY29udGVudCB9LCBwYXJ0czogcGFydHMsIH0gPSB0aGlzLl8kdGVtcGxhdGU7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZnJhZ21lbnQ7XG4gICAgICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgICAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICAgICAgbGV0IHRlbXBsYXRlUGFydCA9IHBhcnRzWzBdO1xuICAgICAgICB3aGlsZSAodGVtcGxhdGVQYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT09IHRlbXBsYXRlUGFydC5pbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0O1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gQ0hJTERfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChub2RlLCBub2RlLm5leHRTaWJsaW5nLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEFUVFJJQlVURV9QQVJUKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3Iobm9kZSwgdGVtcGxhdGVQYXJ0Lm5hbWUsIHRlbXBsYXRlUGFydC5zdHJpbmdzLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEVMRU1FTlRfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IEVsZW1lbnRQYXJ0KG5vZGUsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1srK3BhcnRJbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZUluZGV4ICE9PSB0ZW1wbGF0ZVBhcnQ/LmluZGV4KSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICAgIG5vZGVJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyZW50Tm9kZSBhd2F5IGZyb20gdGhlIGNsb25lZCB0cmVlIHNvIHRoYXQgd2VcbiAgICAgICAgLy8gZG9uJ3QgaG9sZCBvbnRvIHRoZSB0cmVlIGV2ZW4gaWYgdGhlIHRyZWUgaXMgZGV0YWNoZWQgYW5kIHNob3VsZCBiZVxuICAgICAgICAvLyBmcmVlZC5cbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZDtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIH1cbiAgICBfdXBkYXRlKHZhbHVlcykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiB0aGlzLl8kcGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ3NldCBwYXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWVzLCBwYXJ0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdmFsdWVzIGFyZSBpbiBiZXR3ZWVuIHRlbXBsYXRlIHNwYW5zLiBXZSBpbmNyZW1lbnQgaSBieSAxXG4gICAgICAgICAgICAgICAgICAgIC8vIGxhdGVyIGluIHRoZSBsb29wLCBzbyBpbmNyZW1lbnQgaXQgYnkgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDIgaGVyZVxuICAgICAgICAgICAgICAgICAgICBpICs9IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgQ2hpbGRQYXJ0IHtcbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIENoaWxkUGFydHMgdGhhdCBhcmUgbm90IGF0IHRoZSByb290IHNob3VsZCBhbHdheXMgYmUgY3JlYXRlZCB3aXRoIGFcbiAgICAgICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Py5fJGlzQ29ubmVjdGVkID8/IHRoaXMuX19pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RhcnROb2RlLCBlbmROb2RlLCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQ0hJTERfUEFSVDtcbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0cyB3aGVuIHJlcXVpcmVkIGJ5XG4gICAgICAgIC8vIEFzeW5jRGlyZWN0aXZlXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuXyRlbmROb2RlID0gZW5kTm9kZTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgLy8gTm90ZSBfX2lzQ29ubmVjdGVkIGlzIG9ubHkgZXZlciBhY2Nlc3NlZCBvbiBSb290UGFydHMgKGkuZS4gd2hlbiB0aGVyZSBpc1xuICAgICAgICAvLyBubyBfJHBhcmVudCk7IHRoZSB2YWx1ZSBvbiBhIG5vbi1yb290LXBhcnQgaXMgXCJkb24ndCBjYXJlXCIsIGJ1dCBjaGVja2luZ1xuICAgICAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBvcHRpb25zPy5pc0Nvbm5lY3RlZCA/PyB0cnVlO1xuICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGluaXRpYWxpemUgZm9yIGNvbnNpc3RlbnQgY2xhc3Mgc2hhcGUuXG4gICAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgbm9kZSBpbnRvIHdoaWNoIHRoZSBwYXJ0IHJlbmRlcnMgaXRzIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBBIENoaWxkUGFydCdzIGNvbnRlbnQgY29uc2lzdHMgb2YgYSByYW5nZSBvZiBhZGphY2VudCBjaGlsZCBub2RlcyBvZlxuICAgICAqIGAucGFyZW50Tm9kZWAsIHBvc3NpYmx5IGJvcmRlcmVkIGJ5ICdtYXJrZXIgbm9kZXMnIChgLnN0YXJ0Tm9kZWAgYW5kXG4gICAgICogYC5lbmROb2RlYCkuXG4gICAgICpcbiAgICAgKiAtIElmIGJvdGggYC5zdGFydE5vZGVgIGFuZCBgLmVuZE5vZGVgIGFyZSBub24tbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgICAqXG4gICAgICogLSBJZiBgLnN0YXJ0Tm9kZWAgaXMgbm9uLW51bGwgYnV0IGAuZW5kTm9kZWAgaXMgbnVsbCwgdGhlbiB0aGUgcGFydCdzXG4gICAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAgICogaW5jbHVkaW5nIHRoZSBsYXN0IGNoaWxkIG9mIGAucGFyZW50Tm9kZWAuIElmIGAuZW5kTm9kZWAgaXMgbm9uLW51bGwsIHRoZW5cbiAgICAgKiBgLnN0YXJ0Tm9kZWAgd2lsbCBhbHdheXMgYmUgbm9uLW51bGwuXG4gICAgICpcbiAgICAgKiAtIElmIGJvdGggYC5lbmROb2RlYCBhbmQgYC5zdGFydE5vZGVgIGFyZSBudWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgICAqIGNvbnNpc3RzIG9mIGFsbCBjaGlsZCBub2RlcyBvZiBgLnBhcmVudE5vZGVgLlxuICAgICAqL1xuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBwYXJlbnROb2RlPy5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVCAqLykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHBhcmVudE5vZGUgaXMgYSBEb2N1bWVudEZyYWdtZW50LCBpdCBtYXkgYmUgYmVjYXVzZSB0aGUgRE9NIGlzXG4gICAgICAgICAgICAvLyBzdGlsbCBpbiB0aGUgY2xvbmVkIGZyYWdtZW50IGR1cmluZyBpbml0aWFsIHJlbmRlcjsgaWYgc28sIGdldCB0aGUgcmVhbFxuICAgICAgICAgICAgLy8gcGFyZW50Tm9kZSB0aGUgcGFydCB3aWxsIGJlIGNvbW1pdHRlZCBpbnRvIGJ5IGFza2luZyB0aGUgcGFyZW50LlxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnROb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcGFydCdzIGxlYWRpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBnZXQgc3RhcnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHN0YXJ0Tm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnQncyB0cmFpbGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgICAqIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGdldCBlbmROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJGVuZE5vZGU7XG4gICAgfVxuICAgIF8kc2V0VmFsdWUodmFsdWUsIGRpcmVjdGl2ZVBhcmVudCA9IHRoaXMpIHtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIFxcYENoaWxkUGFydFxcYCBoYXMgbm8gXFxgcGFyZW50Tm9kZVxcYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBhY2NlcHQgYSB2YWx1ZS4gVGhpcyBsaWtlbHkgbWVhbnMgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgcGFydCB3YXMgbWFuaXB1bGF0ZWQgaW4gYW4gdW5zdXBwb3J0ZWQgd2F5IG91dHNpZGUgb2YgTGl0J3MgY29udHJvbCBzdWNoIHRoYXQgdGhlIHBhcnQncyBtYXJrZXIgbm9kZXMgd2VyZSBlamVjdGVkIGZyb20gRE9NLiBGb3IgZXhhbXBsZSwgc2V0dGluZyB0aGUgZWxlbWVudCdzIFxcYGlubmVySFRNTFxcYCBvciBcXGB0ZXh0Q29udGVudFxcYCBjYW4gZG8gdGhpcy5gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCk7XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgICAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBub3RoaW5nIHRvIGNoaWxkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fJHBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlICYmIHZhbHVlICE9PSBub0NoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZVsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRlbXBsYXRlUmVzdWx0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5vcHRpb25zPy5ob3N0ID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRleHQoYFtwcm9iYWJsZSBtaXN0YWtlOiByZW5kZXJlZCBhIHRlbXBsYXRlJ3MgaG9zdCBpbiBpdHNlbGYgYCArXG4gICAgICAgICAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBBdHRlbXB0ZWQgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZSBob3N0YCwgdmFsdWUsIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCwgYHdlIHJlbmRlciBzb21lIHdhcm5pbmcgdGV4dC4gSW4gcHJvZHVjdGlvbiBob3dldmVyLCB3ZSdsbCBgLCBgcmVuZGVyIGl0LCB3aGljaCB3aWxsIHVzdWFsbHkgcmVzdWx0IGluIGFuIGVycm9yLCBhbmQgc29tZXRpbWVzIGAsIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjaywgd2lsbCByZW5kZXIgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAgICAgICAgdGhpcy5fY29tbWl0VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2luc2VydChub2RlKSB7XG4gICAgICAgIHJldHVybiB3cmFwKHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKG5vZGUsIHRoaXMuXyRlbmROb2RlKTtcbiAgICB9XG4gICAgX2NvbW1pdE5vZGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyAmJlxuICAgICAgICAgICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScgfHwgcGFyZW50Tm9kZU5hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzdHlsZSBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBleGZpbHRyYXRlIGRhdGEgYW5kIHNwb29mIFVJcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29uc2lkZXIgaW5zdGVhZCB1c2luZyBjc3NcXGAuLi5cXGAgbGl0ZXJhbHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjc3MgY3VzdG9tIHByb3BlcnRpZXMsIDo6cGFydHMsIDxzbG90PnMsIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuZCBieSBtdXRhdGluZyB0aGUgRE9NIHJhdGhlciB0aGFuIHN0eWxlc2hlZXRzLmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHNjcmlwdCBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIGl0IGNvdWxkIGFsbG93IGFyYml0cmFyeSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm9kZScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdGhpcy5faW5zZXJ0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfY29tbWl0VGV4dCh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgICAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyLCBhbmQgd2Uga25vdyB0aGF0IHRoaXMuXyRzdGFydE5vZGUubmV4dFNpYmxpbmcgaXMgYVxuICAgICAgICAvLyBUZXh0IG5vZGUuIFdlIGNhbiBub3cganVzdCByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgKC5kYXRhKSBvZiB0aGUgbm9kZS5cbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gbm90aGluZyAmJlxuICAgICAgICAgICAgaXNQcmltaXRpdmUodGhpcy5fJGNvbW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRTYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKG5vZGUsICdkYXRhJywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUodGV4dE5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gc2V0dGluZyB0ZXh0IGNvbnRlbnQsIGZvciBzZWN1cml0eSBwdXJwb3NlcyBpdCBtYXR0ZXJzIGEgbG90XG4gICAgICAgICAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgd2l0aCBjYXJlLCB3aGlsZSA8c3Bhbj4gZG9lcyBub3QuIFNvIGZpcnN0IHdlIG5lZWQgdG8gcHV0IGFcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUgaW50byB0aGUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHNhbml0aXplIGl0cyBjb250ZW50LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcih0ZXh0Tm9kZSwgJ2RhdGEnLCAncHJvcGVydHknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXh0U2FuaXRpemVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHRleHROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRleHROb2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUoZC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgX2NvbW1pdFRlbXBsYXRlUmVzdWx0KHJlc3VsdCkge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBjb25zdCB7IHZhbHVlcywgWydfJGxpdFR5cGUkJ106IHR5cGUgfSA9IHJlc3VsdDtcbiAgICAgICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSBmcm9tIHRoZSB0ZW1wbGF0ZSBjYWNoZS4gSWYgbm90LCByZXN1bHQgaXMgYVxuICAgICAgICAvLyBDb21waWxlZFRlbXBsYXRlUmVzdWx0IGFuZCBfJGxpdFR5cGUkIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdHlwZW9mIHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IHRoaXMuXyRnZXRUZW1wbGF0ZShyZXN1bHQpXG4gICAgICAgICAgICA6ICh0eXBlLmVsID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQodHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcodHlwZS5oLCB0eXBlLmhbMF0pLCB0aGlzLm9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgICB0eXBlKTtcbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZT8uXyR0ZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ3RlbXBsYXRlIHVwZGF0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGVtcGxhdGVJbnN0YW5jZSh0ZW1wbGF0ZSwgdGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGluc3RhbmNlLl9jbG9uZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5zdGFuY2UuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkIGFuZCB1cGRhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJGdldFRlbXBsYXRlKHJlc3VsdCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNhY2hlLnNldChyZXN1bHQuc3RyaW5ncywgKHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlc3VsdCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuICAgIF9jb21taXRJdGVyYWJsZSh2YWx1ZSkge1xuICAgICAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgICAgICAvLyB2YWx1ZSB0byB0aGUgaXRlbS4gVGhpcyBpcyBhIGxpdHRsZSBiaXQgb2Ygb3ZlcmhlYWQgZm9yIGV2ZXJ5IGl0ZW0gaW5cbiAgICAgICAgLy8gYW4gSXRlcmFibGUsIGJ1dCBpdCBsZXRzIHVzIHJlY3Vyc2UgZWFzaWx5IGFuZCBlZmZpY2llbnRseSB1cGRhdGUgQXJyYXlzXG4gICAgICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgICAgICAvLyBhcnJheS5tYXAoKGkpID0+IGh0bWxgJHtpfWApLCBieSByZXVzaW5nIGV4aXN0aW5nIFRlbXBsYXRlSW5zdGFuY2VzLlxuICAgICAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgICAgICAvLyBpdGVyYWJsZSBhbmQgdmFsdWUgd2lsbCBjb250YWluIHRoZSBDaGlsZFBhcnRzIGZyb20gdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSWYgdmFsdWUgaXMgbm90IGFuIGFycmF5LCBjbGVhciB0aGlzIHBhcnQgYW5kIG1ha2UgYSBuZXdcbiAgICAgICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgICAgIGlmICghaXNBcnJheSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIExldHMgdXMga2VlcCB0cmFjayBvZiBob3cgbWFueSBpdGVtcyB3ZSBzdGFtcGVkIHNvIHdlIGNhbiBjbGVhciBsZWZ0b3ZlclxuICAgICAgICAvLyBpdGVtcyBmcm9tIGEgcHJldmlvdXMgcmVuZGVyXG4gICAgICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZTtcbiAgICAgICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgICAgIGxldCBpdGVtUGFydDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocGFydEluZGV4ID09PSBpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gZXhpc3RpbmcgcGFydCwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHNoYXJpbmcgcGFydHMgYmV0d2VlbiBub2Rlc1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy8xMjY2XG4gICAgICAgICAgICAgICAgaXRlbVBhcnRzLnB1c2goKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydCh0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLCB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLCB0aGlzLCB0aGlzLm9wdGlvbnMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgICAgICAgICAgaXRlbVBhcnQgPSBpdGVtUGFydHNbcGFydEluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1QYXJ0Ll8kc2V0VmFsdWUoaXRlbSk7XG4gICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydEluZGV4IDwgaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaXRlbVBhcnRzIGFsd2F5cyBoYXZlIGVuZCBub2Rlc1xuICAgICAgICAgICAgdGhpcy5fJGNsZWFyKGl0ZW1QYXJ0ICYmIHdyYXAoaXRlbVBhcnQuXyRlbmROb2RlKS5uZXh0U2libGluZywgcGFydEluZGV4KTtcbiAgICAgICAgICAgIC8vIFRydW5jYXRlIHRoZSBwYXJ0cyBhcnJheSBzbyBfdmFsdWUgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgICAgIGl0ZW1QYXJ0cy5sZW5ndGggPSBwYXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG5vZGUgdG8gY2xlYXIgZnJvbSwgZm9yIGNsZWFyaW5nIGEgc3Vic2V0IG9mIHRoZSBwYXJ0J3NcbiAgICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAgICogQHBhcmFtIGZyb20gIFdoZW4gYHN0YXJ0YCBpcyBzcGVjaWZpZWQsIHRoZSBpbmRleCB3aXRoaW4gdGhlIGl0ZXJhYmxlIGZyb21cbiAgICAgKiAgICAgd2hpY2ggQ2hpbGRQYXJ0cyBhcmUgYmVpbmcgcmVtb3ZlZCwgdXNlZCBmb3IgZGlzY29ubmVjdGluZyBkaXJlY3RpdmVzXG4gICAgICogICAgIGluIHRob3NlIFBhcnRzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgXyRjbGVhcihzdGFydCA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcsIGZyb20pIHtcbiAgICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgICAgICB3aGlsZSAoc3RhcnQgIT09IHRoaXMuXyRlbmROb2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgbm9uLW51bGwgYXNzZXJ0aW9uIGlzIHNhZmUgYmVjYXVzZSBpZiBfJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpc1xuICAgICAgICAgICAgLy8gbnVsbCwgdGhlbiBfJGVuZE5vZGUgaXMgYWxzbyBudWxsLCBhbmQgd2Ugd291bGQgbm90IGhhdmUgZW50ZXJlZCB0aGlzXG4gICAgICAgICAgICAvLyBsb29wLlxuICAgICAgICAgICAgY29uc3QgbiA9IHdyYXAoc3RhcnQpLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgd3JhcChzdGFydCkucmVtb3ZlKCk7XG4gICAgICAgICAgICBzdGFydCA9IG47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYFJvb3RQYXJ0YHMgKHRoZSBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGFcbiAgICAgKiB0b3AtbGV2ZWwgYHJlbmRlcigpYCBjYWxsKS4gSXQgaGFzIG5vIGVmZmVjdCBvbiBub24tcm9vdCBDaGlsZFBhcnRzLlxuICAgICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZCkge1xuICAgICAgICBpZiAodGhpcy5fJHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBpc0Nvbm5lY3RlZDtcbiAgICAgICAgICAgIHRoaXMuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGlzQ29ubmVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0LnNldENvbm5lY3RlZCgpIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhICcgK1xuICAgICAgICAgICAgICAgICdSb290UGFydCByZXR1cm5lZCBmcm9tIHJlbmRlcigpLicpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgQXR0cmlidXRlUGFydCB7XG4gICAgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgICB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBuYW1lLCBzdHJpbmdzLCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQVRUUklCVVRFX1BBUlQ7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFydCBieSByZXNvbHZpbmcgdGhlIHZhbHVlIGZyb20gcG9zc2libHkgbXVsdGlwbGVcbiAgICAgKiB2YWx1ZXMgYW5kIHN0YXRpYyBzdHJpbmdzIGFuZCBjb21taXR0aW5nIGl0IHRvIHRoZSBET00uXG4gICAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIGFyZ3VtZW50LiBJZiB0aGlzIHBhcnQgaXNcbiAgICAgKiBtdWx0aS12YWx1ZSwgYHRoaXMuX3N0cmluZ3NgIHdpbGwgYmUgZGVmaW5lZCwgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkXG4gICAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgICAqIGludG8gdGhlIHZhbHVlIGFycmF5IGZyb20gd2hpY2ggdGhlIHZhbHVlcyBzaG91bGQgYmUgcmVhZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgd2F5IHRvIGVsaW1pbmF0ZSBzaG9ydC1saXZlZCBhcnJheSBzbGljZXNcbiAgICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICAgKiBwYXJ0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICAgKiBAcGFyYW0gdmFsdWVJbmRleCB0aGUgaW5kZXggdG8gc3RhcnQgcmVhZGluZyB2YWx1ZXMgZnJvbS4gYHVuZGVmaW5lZGAgZm9yXG4gICAgICogICBzaW5nbGUtdmFsdWVkIHBhcnRzXG4gICAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAgICogICBpbiBoeWRyYXRpb24gdG8gcHJpbWUgYXR0cmlidXRlIHBhcnRzIHdpdGggdGhlaXIgZmlyc3QtcmVuZGVyZWQgdmFsdWUsXG4gICAgICogICBidXQgbm90IHNldCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gU1NSIHRvIG5vLW9wIHRoZSBET00gb3BlcmF0aW9uIGFuZFxuICAgICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQgPSB0aGlzLCB2YWx1ZUluZGV4LCBub0NvbW1pdCkge1xuICAgICAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuICAgICAgICAvLyBXaGV0aGVyIGFueSBvZiB0aGUgdmFsdWVzIGhhcyBjaGFuZ2VkLCBmb3IgZGlydHktY2hlY2tpbmdcbiAgICAgICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RyaW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUtdmFsdWUgYmluZGluZyBjYXNlXG4gICAgICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCwgMCk7XG4gICAgICAgICAgICBjaGFuZ2UgPVxuICAgICAgICAgICAgICAgICFpc1ByaW1pdGl2ZSh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEludGVycG9sYXRpb24gY2FzZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHN0cmluZ3NbMF07XG4gICAgICAgICAgICBsZXQgaSwgdjtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIHYgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlc1t2YWx1ZUluZGV4ICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIGlzIGBub0NoYW5nZWAsIHVzZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZVtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hhbmdlIHx8PVxuICAgICAgICAgICAgICAgICAgICAhaXNQcmltaXRpdmUodikgfHwgdiAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSBub3RoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gKHYgPz8gJycpICsgc3RyaW5nc1tpICsgMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWVbaV0gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UgJiYgIW5vQ29tbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb21taXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21taXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgIHdyYXAodGhpcy5lbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKHRoaXMuZWxlbWVudCwgdGhpcy5uYW1lLCAnYXR0cmlidXRlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlID8/ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBhdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdyYXAodGhpcy5lbGVtZW50KS5zZXRBdHRyaWJ1dGUodGhpcy5uYW1lLCAodmFsdWUgPz8gJycpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFByb3BlcnR5UGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbW1pdFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZSwgJ3Byb3BlcnR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eScsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgdGhpcy5lbGVtZW50W3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cbn1cbmNsYXNzIEJvb2xlYW5BdHRyaWJ1dGVQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9IEJPT0xFQU5fQVRUUklCVVRFX1BBUlQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tbWl0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBib29sZWFuIGF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogISEodmFsdWUgJiYgdmFsdWUgIT09IG5vdGhpbmcpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB3cmFwKHRoaXMuZWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKHRoaXMubmFtZSwgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyk7XG4gICAgfVxufVxuY2xhc3MgRXZlbnRQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIG5hbWUsIHN0cmluZ3MsIHBhcmVudCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9IEVWRU5UX1BBUlQ7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIFxcYDwke2VsZW1lbnQubG9jYWxOYW1lfT5cXGAgaGFzIGEgXFxgQCR7bmFtZX09Li4uXFxgIGxpc3RlbmVyIHdpdGggYCArXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgY29udGVudC4gRXZlbnQgbGlzdGVuZXJzIGluIHRlbXBsYXRlcyBtdXN0IGhhdmUgZXhhY3RseSAnICtcbiAgICAgICAgICAgICAgICAnb25lIGV4cHJlc3Npb24gYW5kIG5vIHN1cnJvdW5kaW5nIHRleHQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgICAvLyBzaW5jZSB0aGUgZGlydHkgY2hlY2tpbmcgaXMgbW9yZSBjb21wbGV4XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kc2V0VmFsdWUobmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCA9IHRoaXMpIHtcbiAgICAgICAgbmV3TGlzdGVuZXIgPVxuICAgICAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCBuZXdMaXN0ZW5lciwgZGlyZWN0aXZlUGFyZW50LCAwKSA/PyBub3RoaW5nO1xuICAgICAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkTGlzdGVuZXIgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90aGluZyBvciBhbnkgb3B0aW9ucyBjaGFuZ2Ugd2UgaGF2ZSB0byByZW1vdmUgdGhlXG4gICAgICAgIC8vIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPSAobmV3TGlzdGVuZXIgPT09IG5vdGhpbmcgJiYgb2xkTGlzdGVuZXIgIT09IG5vdGhpbmcpIHx8XG4gICAgICAgICAgICBuZXdMaXN0ZW5lci5jYXB0dXJlICE9PVxuICAgICAgICAgICAgICAgIG9sZExpc3RlbmVyLmNhcHR1cmUgfHxcbiAgICAgICAgICAgIG5ld0xpc3RlbmVyLm9uY2UgIT09XG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIub25jZSB8fFxuICAgICAgICAgICAgbmV3TGlzdGVuZXIucGFzc2l2ZSAhPT1cbiAgICAgICAgICAgICAgICBvbGRMaXN0ZW5lci5wYXNzaXZlO1xuICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCBub3RoaW5nIGFuZCB3ZSByZW1vdmVkIHRoZSBsaXN0ZW5lciwgd2UgaGF2ZVxuICAgICAgICAvLyB0byBhZGQgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICAgICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPSBuZXdMaXN0ZW5lciAhPT0gbm90aGluZyAmJlxuICAgICAgICAgICAgKG9sZExpc3RlbmVyID09PSBub3RoaW5nIHx8IHNob3VsZFJlbW92ZUxpc3RlbmVyKTtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyOiBzaG91bGRSZW1vdmVMaXN0ZW5lcixcbiAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLm5hbWUsIHRoaXMsIG9sZExpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkQWRkTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgbmV3TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5ld0xpc3RlbmVyO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEVsZW1lbnRQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy50eXBlID0gRUxFTUVOVF9QQVJUO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIF8kc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBFTkQgVVNFUlMgU0hPVUxEIE5PVCBSRUxZIE9OIFRISVMgT0JKRUNULlxuICpcbiAqIFByaXZhdGUgZXhwb3J0cyBmb3IgdXNlIGJ5IG90aGVyIExpdCBwYWNrYWdlcywgbm90IGludGVuZGVkIGZvciB1c2UgYnlcbiAqIGV4dGVybmFsIHVzZXJzLlxuICpcbiAqIFdlIGN1cnJlbnRseSBkbyBub3QgbWFrZSBhIG1hbmdsZWQgcm9sbHVwIGJ1aWxkIG9mIHRoZSBsaXQtc3NyIGNvZGUuIEluIG9yZGVyXG4gKiB0byBrZWVwIGEgbnVtYmVyIG9mIChvdGhlcndpc2UgcHJpdmF0ZSkgdG9wLWxldmVsIGV4cG9ydHMgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEggb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtZWxlbWVudCwgd2hpY2ggcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEggPSB7XG4gICAgLy8gVXNlZCBpbiBsaXQtc3NyXG4gICAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgICBfbWFya2VyOiBtYXJrZXIsXG4gICAgX21hcmtlck1hdGNoOiBtYXJrZXJNYXRjaCxcbiAgICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICAgIF9nZXRUZW1wbGF0ZUh0bWw6IGdldFRlbXBsYXRlSHRtbCxcbiAgICAvLyBVc2VkIGluIHRlc3RzIGFuZCBwcml2YXRlLXNzci1zdXBwb3J0XG4gICAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gICAgX2lzSXRlcmFibGU6IGlzSXRlcmFibGUsXG4gICAgX3Jlc29sdmVEaXJlY3RpdmU6IHJlc29sdmVEaXJlY3RpdmUsXG4gICAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICAgIF9BdHRyaWJ1dGVQYXJ0OiBBdHRyaWJ1dGVQYXJ0LFxuICAgIF9Cb29sZWFuQXR0cmlidXRlUGFydDogQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gICAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICAgIF9Qcm9wZXJ0eVBhcnQ6IFByb3BlcnR5UGFydCxcbiAgICBfRWxlbWVudFBhcnQ6IEVsZW1lbnRQYXJ0LFxufTtcbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gICAgPyBnbG9iYWwubGl0SHRtbFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIGxpdC1odG1sIHVzYWdlLlxuKGdsb2JhbC5saXRIdG1sVmVyc2lvbnMgPz89IFtdKS5wdXNoKCczLjMuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRIdG1sVmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdtdWx0aXBsZS12ZXJzaW9ucycsIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBgICtcbiAgICAgICAgICAgIGBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGlzIG5vdCByZWNvbW1lbmRlZC5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmVuZGVycyBhIHZhbHVlLCB1c3VhbGx5IGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQsIHRvIHRoZSBjb250YWluZXIuXG4gKlxuICogVGhpcyBleGFtcGxlIHJlbmRlcnMgdGhlIHRleHQgXCJIZWxsbywgWm9lIVwiIGluc2lkZSBhIHBhcmFncmFwaCB0YWcsIGFwcGVuZGluZ1xuICogaXQgdG8gdGhlIGNvbnRhaW5lciBgZG9jdW1lbnQuYm9keWAuXG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7aHRtbCwgcmVuZGVyfSBmcm9tICdsaXQnO1xuICpcbiAqIGNvbnN0IG5hbWUgPSBcIlpvZVwiO1xuICogcmVuZGVyKGh0bWxgPHA+SGVsbG8sICR7bmFtZX0hPC9wPmAsIGRvY3VtZW50LmJvZHkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIEFueSBbcmVuZGVyYWJsZVxuICogICB2YWx1ZV0oaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNjaGlsZC1leHByZXNzaW9ucyksXG4gKiAgIHR5cGljYWxseSBhIHtAbGlua2NvZGUgVGVtcGxhdGVSZXN1bHR9IGNyZWF0ZWQgYnkgZXZhbHVhdGluZyBhIHRlbXBsYXRlIHRhZ1xuICogICBsaWtlIHtAbGlua2NvZGUgaHRtbH0gb3Ige0BsaW5rY29kZSBzdmd9LlxuICogQHBhcmFtIGNvbnRhaW5lciBBIERPTSBjb250YWluZXIgdG8gcmVuZGVyIHRvLiBUaGUgZmlyc3QgcmVuZGVyIHdpbGwgYXBwZW5kXG4gKiAgIHRoZSByZW5kZXJlZCB2YWx1ZSB0byB0aGUgY29udGFpbmVyLCBhbmQgc3Vic2VxdWVudCByZW5kZXJzIHdpbGxcbiAqICAgZWZmaWNpZW50bHkgdXBkYXRlIHRoZSByZW5kZXJlZCB2YWx1ZSBpZiB0aGUgc2FtZSByZXN1bHQgdHlwZSB3YXNcbiAqICAgcHJldmlvdXNseSByZW5kZXJlZCB0aGVyZS5cbiAqIEBwYXJhbSBvcHRpb25zIFNlZSB7QGxpbmtjb2RlIFJlbmRlck9wdGlvbnN9IGZvciBvcHRpb25zIGRvY3VtZW50YXRpb24uXG4gKiBAc2VlXG4gKiB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvbGlicmFyaWVzL3N0YW5kYWxvbmUtdGVtcGxhdGVzLyNyZW5kZXJpbmctbGl0LWh0bWwtdGVtcGxhdGVzfCBSZW5kZXJpbmcgTGl0IEhUTUwgVGVtcGxhdGVzfVxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyID0gKHZhbHVlLCBjb250YWluZXIsIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgICAgLy8gR2l2ZSBhIGNsZWFyZXIgZXJyb3IgbWVzc2FnZSB0aGFuXG4gICAgICAgIC8vICAgICBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgbnVsbCAocmVhZGluZ1xuICAgICAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgICAgICAvLyB3aGljaCByZWFkcyBsaWtlIGFuIGludGVybmFsIExpdCBlcnJvci5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlIGNvbnRhaW5lciB0byByZW5kZXIgaW50byBtYXkgbm90IGJlICR7Y29udGFpbmVyfWApO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgICBjb25zdCBwYXJ0T3duZXJOb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IGNvbnRhaW5lcjtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IHBhcnQgPSBwYXJ0T3duZXJOb2RlWydfJGxpdFBhcnQkJ107XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgfSk7XG4gICAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlbmROb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IG51bGw7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHBhcnRPd25lck5vZGVbJ18kbGl0UGFydCQnXSA9IHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIGVuZE5vZGUpLCBlbmROb2RlLCB1bmRlZmluZWQsIG9wdGlvbnMgPz8ge30pO1xuICAgIH1cbiAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICAgICAgICBpZDogcmVuZGVySWQsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICB9KTtcbiAgICByZXR1cm4gcGFydDtcbn07XG5pZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgICByZW5kZXIuY3JlYXRlU2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyO1xuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICByZW5kZXIuX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlID1cbiAgICAgICAgICAgIF90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXQtaHRtbC5qcy5tYXAiLCJsZXQgY3VycmVudDtcbmxldCBjdXJyZW50SWQgPSAwO1xuZnVuY3Rpb24gc2V0Q3VycmVudChzdGF0ZSkge1xuICAgIGN1cnJlbnQgPSBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGN1cnJlbnRJZCA9IDA7XG59XG5mdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRJZCsrO1xufVxuZXhwb3J0IHsgY2xlYXIsIGN1cnJlbnQsIHNldEN1cnJlbnQsIG5vdGlmeSB9O1xuIiwiY29uc3QgcGhhc2VTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLnBoYXNlXCIpO1xuY29uc3QgaG9va1N5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQuaG9va1wiKTtcbmNvbnN0IHVwZGF0ZVN5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQudXBkYXRlXCIpO1xuY29uc3QgY29tbWl0U3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5jb21taXRcIik7XG5jb25zdCBlZmZlY3RzU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5lZmZlY3RzXCIpO1xuY29uc3QgbGF5b3V0RWZmZWN0c1N5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQubGF5b3V0RWZmZWN0c1wiKTtcbmNvbnN0IGNvbnRleHRFdmVudCA9IFwiaGF1bnRlZC5jb250ZXh0XCI7XG5leHBvcnQgeyBwaGFzZVN5bWJvbCwgaG9va1N5bWJvbCwgdXBkYXRlU3ltYm9sLCBjb21taXRTeW1ib2wsIGVmZmVjdHNTeW1ib2wsIGxheW91dEVmZmVjdHNTeW1ib2wsIGNvbnRleHRFdmVudCwgfTtcbiIsImltcG9ydCB7IHNldEN1cnJlbnQsIGNsZWFyIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBob29rU3ltYm9sLCBlZmZlY3RzU3ltYm9sLCBsYXlvdXRFZmZlY3RzU3ltYm9sLCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmNsYXNzIFN0YXRlIHtcbiAgICB1cGRhdGU7XG4gICAgaG9zdDtcbiAgICB2aXJ0dWFsO1xuICAgIFtob29rU3ltYm9sXTtcbiAgICBbZWZmZWN0c1N5bWJvbF07XG4gICAgW2xheW91dEVmZmVjdHNTeW1ib2xdO1xuICAgIGNvbnN0cnVjdG9yKHVwZGF0ZSwgaG9zdCkge1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICAgICAgdGhpc1tob29rU3ltYm9sXSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpc1tlZmZlY3RzU3ltYm9sXSA9IFtdO1xuICAgICAgICB0aGlzW2xheW91dEVmZmVjdHNTeW1ib2xdID0gW107XG4gICAgfVxuICAgIHJ1bihjYikge1xuICAgICAgICBzZXRDdXJyZW50KHRoaXMpO1xuICAgICAgICBsZXQgcmVzID0gY2IoKTtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgX3J1bkVmZmVjdHMocGhhc2UpIHtcbiAgICAgICAgbGV0IGVmZmVjdHMgPSB0aGlzW3BoYXNlXTtcbiAgICAgICAgc2V0Q3VycmVudCh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIGVmZmVjdHMpIHtcbiAgICAgICAgICAgIGVmZmVjdC5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCk7XG4gICAgfVxuICAgIHJ1bkVmZmVjdHMoKSB7XG4gICAgICAgIHRoaXMuX3J1bkVmZmVjdHMoZWZmZWN0c1N5bWJvbCk7XG4gICAgfVxuICAgIHJ1bkxheW91dEVmZmVjdHMoKSB7XG4gICAgICAgIHRoaXMuX3J1bkVmZmVjdHMobGF5b3V0RWZmZWN0c1N5bWJvbCk7XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBsZXQgaG9va3MgPSB0aGlzW2hvb2tTeW1ib2xdO1xuICAgICAgICBob29rcy5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhvb2sudGVhcmRvd24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGhvb2sudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IHsgU3RhdGUgfTtcbiIsImltcG9ydCB7IFN0YXRlIH0gZnJvbSBcIi4vc3RhdGVcIjtcbmltcG9ydCB7IGNvbW1pdFN5bWJvbCwgcGhhc2VTeW1ib2wsIHVwZGF0ZVN5bWJvbCwgZWZmZWN0c1N5bWJvbCwgbGF5b3V0RWZmZWN0c1N5bWJvbCwgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5jb25zdCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSk7XG5mdW5jdGlvbiBydW5uZXIoKSB7XG4gICAgbGV0IHRhc2tzID0gW107XG4gICAgbGV0IGlkO1xuICAgIGZ1bmN0aW9uIHJ1blRhc2tzKCkge1xuICAgICAgICBpZCA9IG51bGw7XG4gICAgICAgIGxldCB0ID0gdGFza3M7XG4gICAgICAgIHRhc2tzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0W2ldKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZCA9IGRlZmVyKHJ1blRhc2tzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5jb25zdCByZWFkID0gcnVubmVyKCk7XG5jb25zdCB3cml0ZSA9IHJ1bm5lcigpO1xuY2xhc3MgQmFzZVNjaGVkdWxlciB7XG4gICAgcmVuZGVyZXI7XG4gICAgaG9zdDtcbiAgICBzdGF0ZTtcbiAgICBbcGhhc2VTeW1ib2xdO1xuICAgIF91cGRhdGVRdWV1ZWQ7XG4gICAgY29uc3RydWN0b3IocmVuZGVyZXIsIGhvc3QpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHRoaXMudXBkYXRlLmJpbmQodGhpcyksIGhvc3QpO1xuICAgICAgICB0aGlzW3BoYXNlU3ltYm9sXSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVF1ZXVlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVRdWV1ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJlYWQoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuaGFuZGxlUGhhc2UodXBkYXRlU3ltYm9sKTtcbiAgICAgICAgICAgIHdyaXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBoYXNlKGNvbW1pdFN5bWJvbCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB3cml0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGhhc2UoZWZmZWN0c1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUXVldWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaGFuZGxlUGhhc2UocGhhc2UsIGFyZykge1xuICAgICAgICB0aGlzW3BoYXNlU3ltYm9sXSA9IHBoYXNlO1xuICAgICAgICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgICAgICAgICBjYXNlIGNvbW1pdFN5bWJvbDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdChhcmcpO1xuICAgICAgICAgICAgICAgIHRoaXMucnVuRWZmZWN0cyhsYXlvdXRFZmZlY3RzU3ltYm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIHVwZGF0ZVN5bWJvbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIGNhc2UgZWZmZWN0c1N5bWJvbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5FZmZlY3RzKGVmZmVjdHNTeW1ib2wpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucnVuKCgpID0+IHRoaXMucmVuZGVyZXIuY2FsbCh0aGlzLmhvc3QsIHRoaXMuaG9zdCkpO1xuICAgIH1cbiAgICBydW5FZmZlY3RzKHBoYXNlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuX3J1bkVmZmVjdHMocGhhc2UpO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS50ZWFyZG93bigpO1xuICAgIH1cbn1cbmV4cG9ydCB7IEJhc2VTY2hlZHVsZXIgfTtcbiIsImltcG9ydCB7IEJhc2VTY2hlZHVsZXIgfSBmcm9tIFwiLi9zY2hlZHVsZXJcIjtcbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHZhbCA9IFwiXCIpID0+IHZhbC5yZXBsYWNlKC8tKyhbYS16XSk/L2csIChfLCBjaGFyKSA9PiAoY2hhciA/IGNoYXIudG9VcHBlckNhc2UoKSA6IFwiXCIpKTtcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQocmVuZGVyKSB7XG4gICAgY2xhc3MgU2NoZWR1bGVyIGV4dGVuZHMgQmFzZVNjaGVkdWxlciB7XG4gICAgICAgIGZyYWc7XG4gICAgICAgIGNvbnN0cnVjdG9yKHJlbmRlcmVyLCBmcmFnLCBob3N0KSB7XG4gICAgICAgICAgICBzdXBlcihyZW5kZXJlciwgKGhvc3QgfHwgZnJhZykpO1xuICAgICAgICAgICAgdGhpcy5mcmFnID0gZnJhZztcbiAgICAgICAgfVxuICAgICAgICBjb21taXQocmVzdWx0KSB7XG4gICAgICAgICAgICByZW5kZXIocmVzdWx0LCB0aGlzLmZyYWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudChyZW5kZXJlciwgYmFzZUVsZW1lbnRPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgQmFzZUVsZW1lbnQgPSAob3B0aW9ucyB8fCBiYXNlRWxlbWVudE9yT3B0aW9ucyB8fCB7fSkuYmFzZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCB7IG9ic2VydmVkQXR0cmlidXRlcyA9IFtdLCB1c2VTaGFkb3dET00gPSB0cnVlLCBzaGFkb3dSb290SW5pdCA9IHt9LCB9ID0gb3B0aW9ucyB8fCBiYXNlRWxlbWVudE9yT3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY2xhc3MgRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcbiAgICAgICAgICAgIF9zY2hlZHVsZXI7XG4gICAgICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHx8IG9ic2VydmVkQXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZVNoYWRvd0RPTSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcihyZW5kZXJlciwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiLCAuLi5zaGFkb3dSb290SW5pdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcihyZW5kZXJlciwgdGhpcy5zaGFkb3dSb290LCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IG5ld1ZhbHVlID09PSBcIlwiID8gdHJ1ZSA6IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIHRvQ2FtZWxDYXNlKG5hbWUpLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlZmxlY3RpdmVQcm9wKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgbGV0IGlzU2V0dXAgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIHVwZGF0ZSB3aGVuIHByb3AgdmFsdWUgaGFzbid0IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0dXAgJiYgdmFsdWUgPT09IG5ld1ZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpc1NldHVwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3RvID0gbmV3IFByb3h5KEJhc2VFbGVtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgIGxldCBkZXNjO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgfHwga2V5WzBdID09PSBcIl9cIikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0gcmVmbGVjdGl2ZVByb3AodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVjZWl2ZXIsIGtleSwgZGVzYyk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEVsZW1lbnQucHJvdG90eXBlLCBwcm90byk7XG4gICAgICAgIHJldHVybiBFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZXhwb3J0IHsgbWFrZUNvbXBvbmVudCwgfTtcbiIsImltcG9ydCB7IGN1cnJlbnQsIG5vdGlmeSB9IGZyb20gXCIuL2ludGVyZmFjZVwiO1xuaW1wb3J0IHsgaG9va1N5bWJvbCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmNsYXNzIEhvb2sge1xuICAgIGlkO1xuICAgIHN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiB1c2UoSG9vaywgLi4uYXJncykge1xuICAgIGxldCBpZCA9IG5vdGlmeSgpO1xuICAgIGxldCBob29rcyA9IGN1cnJlbnRbaG9va1N5bWJvbF07XG4gICAgbGV0IGhvb2sgPSBob29rcy5nZXQoaWQpO1xuICAgIGlmICghaG9vaykge1xuICAgICAgICBob29rID0gbmV3IEhvb2soaWQsIGN1cnJlbnQsIC4uLmFyZ3MpO1xuICAgICAgICBob29rcy5zZXQoaWQsIGhvb2spO1xuICAgIH1cbiAgICByZXR1cm4gaG9vay51cGRhdGUoLi4uYXJncyk7XG59XG5mdW5jdGlvbiBob29rKEhvb2spIHtcbiAgICByZXR1cm4gdXNlLmJpbmQobnVsbCwgSG9vayk7XG59XG5leHBvcnQgeyBob29rLCBIb29rIH07XG4iLCJpbXBvcnQgeyBIb29rLCBob29rIH0gZnJvbSBcIi4vaG9va1wiO1xuZnVuY3Rpb24gY3JlYXRlRWZmZWN0KHNldEVmZmVjdHMpIHtcbiAgICByZXR1cm4gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgICAgICBjYWxsYmFjaztcbiAgICAgICAgbGFzdFZhbHVlcztcbiAgICAgICAgdmFsdWVzO1xuICAgICAgICBfdGVhcmRvd247XG4gICAgICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgaWdub3JlZDEsIGlnbm9yZWQyKSB7XG4gICAgICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICAgICAgc2V0RWZmZWN0cyhzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKGNhbGxiYWNrLCB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGNhbGwoKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNDaGFuZ2VkID0gIXRoaXMudmFsdWVzIHx8IHRoaXMuaGFzQ2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgICAgICAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcnVuKCkge1xuICAgICAgICAgICAgdGhpcy50ZWFyZG93bigpO1xuICAgICAgICAgICAgdGhpcy5fdGVhcmRvd24gPSB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGVhcmRvd24oKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3RlYXJkb3duID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZWFyZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gKCF0aGlzLmxhc3RWYWx1ZXMgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zb21lKCh2YWx1ZSwgaSkgPT4gdGhpcy5sYXN0VmFsdWVzW2ldICE9PSB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgeyBjcmVhdGVFZmZlY3QgfTtcbiIsImltcG9ydCB7IGVmZmVjdHNTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVFZmZlY3QgfSBmcm9tIFwiLi9jcmVhdGUtZWZmZWN0XCI7XG5mdW5jdGlvbiBzZXRFZmZlY3RzKHN0YXRlLCBjYikge1xuICAgIHN0YXRlW2VmZmVjdHNTeW1ib2xdLnB1c2goY2IpO1xufVxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZWZmZWN0IC0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zIGVhY2ggdGltZSBkZXBlbmRlbmNpZXMgY2hhbmdlXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2RlcGVuZGVuY2llc10gLSBsaXN0IG9mIGRlcGVuZGVuY2llcyB0byB0aGUgZWZmZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5jb25zdCB1c2VFZmZlY3QgPSBjcmVhdGVFZmZlY3Qoc2V0RWZmZWN0cyk7XG5leHBvcnQgeyBzZXRFZmZlY3RzLCB1c2VFZmZlY3QgfTtcbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5pbXBvcnQgeyBjb250ZXh0RXZlbnQgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBzZXRFZmZlY3RzIH0gZnJvbSBcIi4vdXNlLWVmZmVjdFwiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gICAge0NvbnRleHQ8VD59IGNvbnRleHRcbiAqIEByZXR1cm4gICB7VH1cbiAqL1xuY29uc3QgdXNlQ29udGV4dCA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICBDb250ZXh0O1xuICAgIHZhbHVlO1xuICAgIF9yYW5FZmZlY3Q7XG4gICAgX3Vuc3Vic2NyaWJlO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgXykge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLl91cGRhdGVyID0gdGhpcy5fdXBkYXRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yYW5FZmZlY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgICBzZXRFZmZlY3RzKHN0YXRlLCB0aGlzKTtcbiAgICB9XG4gICAgdXBkYXRlKENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlydHVhbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgYmUgdXNlZCB3aXRoIHZpcnR1YWwgY29tcG9uZW50c1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5Db250ZXh0ICE9PSBDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUoQ29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLkNvbnRleHQgPSBDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICBjYWxsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3JhbkVmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fcmFuRWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bnN1YnNjcmliZSlcbiAgICAgICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHRoaXMuQ29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF91cGRhdGVyKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKTtcbiAgICB9XG4gICAgX3N1YnNjcmliZShDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IHsgQ29udGV4dCwgY2FsbGJhY2s6IHRoaXMuX3VwZGF0ZXIgfTtcbiAgICAgICAgdGhpcy5zdGF0ZS5ob3N0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGNvbnRleHRFdmVudCwge1xuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwgLy8gdG8gcGFzcyBTaGFkb3dET00gYm91bmRhcmllc1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHsgdW5zdWJzY3JpYmUgPSBudWxsLCB2YWx1ZSB9ID0gZGV0YWlsO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5zdWJzY3JpYmUgPyB2YWx1ZSA6IENvbnRleHQuZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IHVuc3Vic2NyaWJlO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VDb250ZXh0IH07XG4iLCJpbXBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gIHsoKSA9PiBUfSBmbiBmdW5jdGlvbiB0byBtZW1vaXplXG4gKiBAcGFyYW0gIHt1bmtub3duW119IHZhbHVlcyBkZXBlbmRlbmNpZXMgdG8gdGhlIG1lbW9pemVkIGNvbXB1dGF0aW9uXG4gKiBAcmV0dXJuIHtUfSBUaGUgbmV4dCBjb21wdXRlZCB2YWx1ZVxuICovXG5jb25zdCB1c2VNZW1vID0gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgIHZhbHVlO1xuICAgIHZhbHVlcztcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIGZuLCB2YWx1ZXMpIHtcbiAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZuKCk7XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIH1cbiAgICB1cGRhdGUoZm4sIHZhbHVlcykge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkKHZhbHVlcykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQodmFsdWVzID0gW10pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5zb21lKCh2YWx1ZSwgaSkgPT4gdGhpcy52YWx1ZXNbaV0gIT09IHZhbHVlKTtcbiAgICB9XG59KTtcbmV4cG9ydCB7IHVzZU1lbW8gfTtcbiIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwiLi91c2UtbWVtb1wiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IFRcbiAqIEBwYXJhbSAgICB7VH0gZm4gLSBjYWxsYmFjayB0byBtZW1vaXplXG4gKiBAcGFyYW0gICAge3Vua25vd25bXX0gaW5wdXRzIC0gZGVwZW5kZW5jaWVzIHRvIGNhbGxiYWNrIG1lbW9pemF0aW9uXG4gKiBAcmV0dXJuICAge1R9XG4gKi9cbmNvbnN0IHVzZUNhbGxiYWNrID0gKGZuLCBpbnB1dHMpID0+IHVzZU1lbW8oKCkgPT4gZm4sIGlucHV0cyk7XG5leHBvcnQgeyB1c2VDYWxsYmFjayB9O1xuIiwiaW1wb3J0IHsgbGF5b3V0RWZmZWN0c1N5bWJvbCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUVmZmVjdCB9IGZyb20gXCIuL2NyZWF0ZS1lZmZlY3RcIjtcbmZ1bmN0aW9uIHNldExheW91dEVmZmVjdHMoc3RhdGUsIGNiKSB7XG4gICAgc3RhdGVbbGF5b3V0RWZmZWN0c1N5bWJvbF0ucHVzaChjYik7XG59XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7RWZmZWN0fSBjYWxsYmFjayBlZmZlY3RpbmcgY2FsbGJhY2tcbiAqIEBwYXJhbSAge3Vua25vd25bXX0gW3ZhbHVlc10gZGVwZW5kZW5jaWVzIHRvIHRoZSBlZmZlY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmNvbnN0IHVzZUxheW91dEVmZmVjdCA9IGNyZWF0ZUVmZmVjdChzZXRMYXlvdXRFZmZlY3RzKTtcbmV4cG9ydCB7IHVzZUxheW91dEVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgeyp9IFRcbiAqIEBwYXJhbSB7VH0gW2luaXRpYWxTdGF0ZV0gLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlXG4gKiBAcmV0dXJuIHtTdGF0ZVR1cGxlPFQ+fSBzdGF0ZVR1cGxlIC0gVHVwbGUgb2YgY3VycmVudCBzdGF0ZSBhbmQgc3RhdGUgdXBkYXRlciBmdW5jdGlvblxuICovXG5jb25zdCB1c2VTdGF0ZSA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICBhcmdzO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlciA9IHRoaXMudXBkYXRlci5iaW5kKHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0Rm4gPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0Rm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ha2VBcmdzKGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncztcbiAgICB9XG4gICAgdXBkYXRlcih2YWx1ZSkge1xuICAgICAgICBjb25zdCBbcHJldmlvdXNWYWx1ZV0gPSB0aGlzLmFyZ3M7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlckZuID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHVwZGF0ZXJGbihwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFrZUFyZ3ModmFsdWUpO1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBtYWtlQXJncyh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFyZ3MgPSBPYmplY3QuZnJlZXplKFt2YWx1ZSwgdGhpcy51cGRhdGVyXSk7XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VTdGF0ZSB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiLi91c2UtbGF5b3V0LWVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwiLi91c2Utc3RhdGVcIjtcbmNvbnN0IG1pY3JvdGFzayA9IFByb21pc2UucmVzb2x2ZSgpO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0IHRoYXQgaXMgZHJpdmVuIGJ5IEhhdW50ZWQgaG9va3NcbiAqIGFuZCBgdXNlQ29udHJvbGxlcigpYC5cbiAqL1xuY2xhc3MgSGF1bnRlZENvbnRyb2xsZXJIb3N0IHtcbiAgICBjb3VudDtcbiAgICBraWNrO1xuICAgIF9jb250cm9sbGVycyA9IFtdO1xuICAgIF91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICBfdXBkYXRlQ29tcGxldGVQcm9taXNlO1xuICAgIF9yZXNvbHZlVXBkYXRlO1xuICAgIGNvbnN0cnVjdG9yKGNvdW50LCBraWNrKSB7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5raWNrID0ga2ljaztcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVVwZGF0ZSA9IHJlcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICByZW1vdmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gTm90ZSwgaWYgdGhlIGluZGV4T2YgaXMgLTEsIHRoZSA+Pj4gd2lsbCBmbGlwIHRoZSBzaWduIHdoaWNoIG1ha2VzIHRoZVxuICAgICAgICAvLyBzcGxpY2UgZG8gbm90aGluZy5cbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMgJiZcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLnNwbGljZSh0aGlzLl9jb250cm9sbGVycy5pbmRleE9mKGNvbnRyb2xsZXIpID4+PiAwLCAxKTtcbiAgICB9XG4gICAgcmVxdWVzdFVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl91cGRhdGVQZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIG1pY3JvdGFzay50aGVuKCgpID0+IHRoaXMua2ljaygodGhpcy5jb3VudCArPSAxKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB1cGRhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZTtcbiAgICB9XG4gICAgY29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3RDb25uZWN0ZWQgJiYgYy5ob3N0Q29ubmVjdGVkKCkpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLmZvckVhY2goKGMpID0+IGMuaG9zdERpc2Nvbm5lY3RlZCAmJiBjLmhvc3REaXNjb25uZWN0ZWQoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlICYmIGMuaG9zdFVwZGF0ZSgpKTtcbiAgICB9XG4gICAgdXBkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXNvbHZlID0gdGhpcy5fcmVzb2x2ZVVwZGF0ZTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHVwZGF0ZUNvbXBsZXRlIFByb21pc2UgZm9yIHRoZSBuZXh0IHVwZGF0ZSxcbiAgICAgICAgLy8gYmVmb3JlIHJlc29sdmluZyB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVVcGRhdGUgPSByZXM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3RVcGRhdGVkICYmIGMuaG9zdFVwZGF0ZWQoKSk7XG4gICAgICAgIHJlc29sdmUodGhpcy5fdXBkYXRlUGVuZGluZyk7XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuZCBzdG9yZXMgYSBzdGF0ZWZ1bCBSZWFjdGl2ZUNvbnRyb2xsZXIgaW5zdGFuY2UgYW5kIHByb3ZpZGVzIGl0XG4gKiB3aXRoIGEgUmVhY3RpdmVDb250cm9sbGVySG9zdCB0aGF0IGRyaXZlcyB0aGUgY29udHJvbGxlciBsaWZlY3ljbGUuXG4gKlxuICogVXNlIHRoaXMgaG9vayB0byBjb252ZXJ0IGEgUmVhY3RpdmVDb250cm9sbGVyIGludG8gYSBIYXVudGVkIGhvb2suXG4gKlxuICogQHBhcmFtIHs8QyBleHRlbmRzIFJlYWN0aXZlQ29udHJvbGxlcj4oaG9zdDogUmVhY3RpdmVDb250cm9sbGVySG9zdCkgPT4gQ30gY3JlYXRlQ29udHJvbGxlciBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2UuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIGEgSGF1bnRlZENvbnRyb2xsZXJIb3N0IHRvIHBhc3MgdG8gdGhlIGNvbnRyb2xsZXIuIFRoZVxuICogY3JlYXRlIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAqIEByZXR1cm4ge1JlYWN0aXZlQ29udHJvbGxlcn0gdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRyb2xsZXIoY3JlYXRlQ29udHJvbGxlcikge1xuICAgIGNvbnN0IFtjb3VudCwga2lja10gPSB1c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbaG9zdF0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBuZXcgSGF1bnRlZENvbnRyb2xsZXJIb3N0KGNvdW50LCBraWNrKTtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IGNyZWF0ZUNvbnRyb2xsZXIoaG9zdCk7XG4gICAgICAgIGhvc3QucHJpbWFyeUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBob3N0LmNvbm5lY3RlZCgpO1xuICAgICAgICByZXR1cm4gaG9zdDtcbiAgICB9KTtcbiAgICAvLyBXZSB1c2UgdXNlTGF5b3V0RWZmZWN0IGJlY2F1c2Ugd2UgbmVlZCB1cGRhdGVkKCkgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyBhZnRlciByZW5kZXJpbmcuXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IGhvc3QudXBkYXRlZCgpKTtcbiAgICAvLyBSZXR1cm5pbmcgYSBjbGVhbnVwIGZ1bmN0aW9uIHNpbXVsYXRlcyBob3N0RGlzY29ubmVjdGVkIHRpbWluZy4gQW4gZW1wdHlcbiAgICAvLyBkZXBzIGFycmF5IHRlbGxzIEhhdW50ZWQgdG8gb25seSBjYWxsIHRoaXMgb25jZTogb24gbW91bnQgd2l0aCB0aGUgY2xlYW51cFxuICAgIC8vIGNhbGxlZCBvbiB1bm1vdW50LlxuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiAoKSA9PiBob3N0LmRpc2Nvbm5lY3RlZCgpLCBbXSk7XG4gICAgaG9zdC51cGRhdGUoKTtcbiAgICByZXR1cm4gaG9zdC5wcmltYXJ5Q29udHJvbGxlcjtcbn1cbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG4vKipcbiAqIEdpdmVuIGEgcmVkdWNlciBmdW5jdGlvbiwgaW5pdGlhbCBzdGF0ZSwgYW5kIG9wdGlvbmFsIHN0YXRlIGluaXRpYWxpemVyIGZ1bmN0aW9uLCByZXR1cm5zIGEgdHVwbGUgb2Ygc3RhdGUgYW5kIGRpc3BhdGNoIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgUyBTdGF0ZVxuICogQHRlbXBsYXRlIEkgSW5pdGlhbCBTdGF0ZVxuICogQHRlbXBsYXRlIEEgQWN0aW9uXG4gKiBAcGFyYW0ge1JlZHVjZXI8UywgQT59IHJlZHVjZXIgLSByZWR1Y2VyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIG5leHQgc3RhdGUgZ2l2ZW4gdGhlIHByZXZpb3VzIHN0YXRlIGFuZCB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge0l9IGluaXRpYWxTdGF0ZSAtIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSByZWR1Y2VyXG4gKiBAcGFyYW0geyhpbml0OiBJKSA9PiBTfSBbaW5pdD11bmRlZmluZWRdIC0gT3B0aW9uYWwgaW5pdGlhbGl6ZXIgZnVuY3Rpb24sIGNhbGxlZCBvbiBpbml0aWFsU3RhdGUgaWYgcHJvdmlkZWRcbiAqIEByZXR1cm4ge3JlYWRvbmx5IFtTLCAoYWN0aW9uOiBBKSA9PiB2b2lkXX1cbiAqL1xuY29uc3QgdXNlUmVkdWNlciA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICByZWR1Y2VyO1xuICAgIGN1cnJlbnRTdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIF8sIGluaXRpYWxTdGF0ZSwgaW5pdCkge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9XG4gICAgICAgICAgICBpbml0ICE9PSB1bmRlZmluZWQgPyBpbml0KGluaXRpYWxTdGF0ZSkgOiBpbml0aWFsU3RhdGU7XG4gICAgfVxuICAgIHVwZGF0ZShyZWR1Y2VyKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IHJlZHVjZXI7XG4gICAgICAgIHJldHVybiBbdGhpcy5jdXJyZW50U3RhdGUsIHRoaXMuZGlzcGF0Y2hdO1xuICAgIH1cbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLnJlZHVjZXIodGhpcy5jdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKCk7XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VSZWR1Y2VyIH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0VHlwZSA9IHtcbiAgICBBVFRSSUJVVEU6IDEsXG4gICAgQ0hJTEQ6IDIsXG4gICAgUFJPUEVSVFk6IDMsXG4gICAgQk9PTEVBTl9BVFRSSUJVVEU6IDQsXG4gICAgRVZFTlQ6IDUsXG4gICAgRUxFTUVOVDogNixcbn07XG4vKipcbiAqIENyZWF0ZXMgYSB1c2VyLWZhY2luZyBkaXJlY3RpdmUgZnVuY3Rpb24gZnJvbSBhIERpcmVjdGl2ZSBjbGFzcy4gVGhpc1xuICogZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIGRpcmVjdGl2ZSdzIHJlbmRlcigpIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZSA9IChjKSA9PiAoLi4udmFsdWVzKSA9PiAoe1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgWydfJGxpdERpcmVjdGl2ZSQnXTogYyxcbiAgICB2YWx1ZXMsXG59KTtcbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgY3VzdG9tIGRpcmVjdGl2ZXMuIFVzZXJzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyxcbiAqIGltcGxlbWVudCBgcmVuZGVyYCBhbmQvb3IgYHVwZGF0ZWAsIGFuZCB0aGVuIHBhc3MgdGhlaXIgc3ViY2xhc3MgdG9cbiAqIGBkaXJlY3RpdmVgLlxuICovXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihfcGFydEluZm8pIHsgfVxuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KSB7XG4gICAgICAgIHRoaXMuX19wYXJ0ID0gcGFydDtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID0gYXR0cmlidXRlSW5kZXg7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJHJlc29sdmUocGFydCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHBhcnQsIHByb3BzKTtcbiAgICB9XG4gICAgdXBkYXRlKF9wYXJ0LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoLi4ucHJvcHMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcmVjdGl2ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgYGFkb3B0ZWRTdHlsZVNoZWV0c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgPSBnbG9iYWwuU2hhZG93Um9vdCAmJlxuICAgIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAgICdhZG9wdGVkU3R5bGVTaGVldHMnIGluIERvY3VtZW50LnByb3RvdHlwZSAmJlxuICAgICdyZXBsYWNlJyBpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZTtcbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5jb25zdCBjc3NUYWdDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBhIHN0cmluZyBvZiBDU1MgdGV4dCwgdGhhdCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIENTU1Jlc3VsdCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBjc3NgLXRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFscyBhbmRcbiAqIGB1bnNhZmVDU1MoKWAuIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IENTU1Jlc3VsdHMgYXJlIG9ubHkgY3JlYXRlZCB2aWEgdGhlXG4gKiBgY3NzYCB0YWcgYW5kIGB1bnNhZmVDU1MoKWAsIENTU1Jlc3VsdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDU1NSZXN1bHQge1xuICAgIGNvbnN0cnVjdG9yKGNzc1RleHQsIHN0cmluZ3MsIHNhZmVUb2tlbikge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICB0aGlzWydfJGNzc1Jlc3VsdCQnXSA9IHRydWU7XG4gICAgICAgIGlmIChzYWZlVG9rZW4gIT09IGNvbnN0cnVjdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NTU1Jlc3VsdCBpcyBub3QgY29uc3RydWN0YWJsZS4gVXNlIGB1bnNhZmVDU1NgIG9yIGBjc3NgIGluc3RlYWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jc3NUZXh0ID0gY3NzVGV4dDtcbiAgICAgICAgdGhpcy5fc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgYSBnZXR0ZXIgc28gdGhhdCBpdCdzIGxhenkuIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHN0eWxlc2hlZXRzXG4gICAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gICAgZ2V0IHN0eWxlU2hlZXQoKSB7XG4gICAgICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgICAgICAvLyBjb25zdHJ1Y3RhYmxlLlxuICAgICAgICBsZXQgc3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlU2hlZXQ7XG4gICAgICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgICAgICBpZiAoc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzICYmIHN0eWxlU2hlZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlID0gc3RyaW5ncyAhPT0gdW5kZWZpbmVkICYmIHN0cmluZ3MubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgaWYgKGNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuX3N0eWxlU2hlZXQgPSBzdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKSkucmVwbGFjZVN5bmModGhpcy5jc3NUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNzc1RhZ0NhY2hlLnNldChzdHJpbmdzLCBzdHlsZVNoZWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0eWxlU2hlZXQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICAgIH1cbn1cbmNvbnN0IHRleHRGcm9tQ1NTUmVzdWx0ID0gKHZhbHVlKSA9PiB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBpZiAodmFsdWVbJ18kY3NzUmVzdWx0JCddID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5jc3NUZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6IGAgK1xuICAgICAgICAgICAgYCR7dmFsdWV9LiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dCB0YWtlIGNhcmUgYCArXG4gICAgICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYCk7XG4gICAgfVxufTtcbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWUpID0+IG5ldyBDU1NSZXN1bHQodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKSwgdW5kZWZpbmVkLCBjb25zdHJ1Y3Rpb25Ub2tlbik7XG4vKipcbiAqIEEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMaXRFbGVtZW50J3NcbiAqIHtAbGlua2NvZGUgTGl0RWxlbWVudC5zdHlsZXN9IHByb3BlcnR5IHRvIHNldCBlbGVtZW50IHN0eWxlcy5cbiAqXG4gKiBGb3Igc2VjdXJpdHkgcmVhc29ucywgb25seSBsaXRlcmFsIHN0cmluZyB2YWx1ZXMgYW5kIG51bWJlciBtYXkgYmUgdXNlZCBpblxuICogZW1iZWRkZWQgZXhwcmVzc2lvbnMuIFRvIGluY29ycG9yYXRlIG5vbi1saXRlcmFsIHZhbHVlcyB7QGxpbmtjb2RlIHVuc2FmZUNTU31cbiAqIG1heSBiZSB1c2VkIGluc2lkZSBhbiBleHByZXNzaW9uLlxuICovXG5leHBvcnQgY29uc3QgY3NzID0gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4ge1xuICAgIGNvbnN0IGNzc1RleHQgPSBzdHJpbmdzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHN0cmluZ3NbMF1cbiAgICAgICAgOiB2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKTtcbiAgICByZXR1cm4gbmV3IENTU1Jlc3VsdChjc3NUZXh0LCBzdHJpbmdzLCBjb25zdHJ1Y3Rpb25Ub2tlbik7XG59O1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHRoZSBuYXRpdmUgZmVhdHVyZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NoYWRvd1Jvb3QvYWRvcHRlZFN0eWxlU2hlZXRzKS5cbiAqIE5vdGUsIHdoZW4gc2hpbW1pbmcgaXMgdXNlZCwgYW55IHN0eWxlcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgcGxhY2VkIGludG9cbiAqIHRoZSBzaGFkb3dSb290IHNob3VsZCBiZSBwbGFjZWQgKmJlZm9yZSogYW55IHNoaW1tZWQgYWRvcHRlZCBzdHlsZXMuIFRoaXNcbiAqIHdpbGwgbWF0Y2ggc3BlYyBiZWhhdmlvciB0aGF0IGdpdmVzIGFkb3B0ZWQgc2hlZXRzIHByZWNlZGVuY2Ugb3ZlciBzdHlsZXMgaW5cbiAqIHNoYWRvd1Jvb3QuXG4gKi9cbmV4cG9ydCBjb25zdCBhZG9wdFN0eWxlcyA9IChyZW5kZXJSb290LCBzdHlsZXMpID0+IHtcbiAgICBpZiAoc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzKSB7XG4gICAgICAgIHJlbmRlclJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gc3R5bGVzLm1hcCgocykgPT4gcyBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyBzIDogcy5zdHlsZVNoZWV0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCBub25jZSA9IGdsb2JhbFsnbGl0Tm9uY2UnXTtcbiAgICAgICAgICAgIGlmIChub25jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gcy5jc3NUZXh0O1xuICAgICAgICAgICAgcmVuZGVyUm9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3QgY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQgPSAoc2hlZXQpID0+IHtcbiAgICBsZXQgY3NzVGV4dCA9ICcnO1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICBjc3NUZXh0ICs9IHJ1bGUuY3NzVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHVuc2FmZUNTUyhjc3NUZXh0KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID0gc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gICAgKE5PREVfTU9ERSAmJiBnbG9iYWwuQ1NTU3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKVxuICAgID8gKHMpID0+IHNcbiAgICA6IChzKSA9PiBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNzcy10YWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG4vKipcbiAqIFVzZSB0aGlzIG1vZHVsZSBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gYmFzZSBjbGFzcyBleHRlbmRpbmdcbiAqIHtAbGluayBSZWFjdGl2ZUVsZW1lbnR9LlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cbmltcG9ydCB7IGdldENvbXBhdGlibGVTdHlsZSwgYWRvcHRTdHlsZXMsIH0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbi8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGltcG9ydCB3aWxsIGJlIGluamVjdGVkIGJ5IFJvbGx1cDpcbi8vIGltcG9ydCB7SFRNTEVsZW1lbnQsIGN1c3RvbUVsZW1lbnRzfSBmcm9tICdAbGl0LWxhYnMvc3NyLWRvbS1zaGltJztcbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG4vLyBUT0RPIChqdXN0aW5mYWduYW5pKTogQWRkIGBoYXNPd25gIGhlcmUgd2hlbiB3ZSBzaGlwIEVTMjAyMlxuY29uc3QgeyBpcywgZGVmaW5lUHJvcGVydHksIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgZ2V0T3duUHJvcGVydHlOYW1lcywgZ2V0T3duUHJvcGVydHlTeW1ib2xzLCBnZXRQcm90b3R5cGVPZiwgfSA9IE9iamVjdDtcbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuLy8gTGV0cyBhIG1pbmlmaWVyIHJlcGxhY2UgZ2xvYmFsVGhpcyByZWZlcmVuY2VzIHdpdGggYSBtaW5pZmllZCBuYW1lXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuaWYgKE5PREVfTU9ERSkge1xuICAgIGdsb2JhbC5jdXN0b21FbGVtZW50cyA/Pz0gY3VzdG9tRWxlbWVudHM7XG59XG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5sZXQgaXNzdWVXYXJuaW5nO1xuY29uc3QgdHJ1c3RlZFR5cGVzID0gZ2xvYmFsXG4gICAgLnRydXN0ZWRUeXBlcztcbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICAgID8gdHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0XG4gICAgOiAnJztcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gICAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICAgIDogZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcbmlmIChERVZfTU9ERSkge1xuICAgIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gICAgLy8gYXJlIGxvYWRlZC5cbiAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICAgKi9cbiAgICBpc3N1ZVdhcm5pbmcgPSAoY29kZSwgd2FybmluZykgPT4ge1xuICAgICAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgICAgICBpZiAoIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykgJiZcbiAgICAgICAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKGNvZGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnZGV2LW1vZGUnLCBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYCk7XG4gICAgICAgIC8vIElzc3VlIHBvbHlmaWxsIHN1cHBvcnQgd2FybmluZy5cbiAgICAgICAgaWYgKGdsb2JhbC5TaGFkeURPTT8uaW5Vc2UgJiYgcG9seWZpbGxTdXBwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlzc3VlV2FybmluZygncG9seWZpbGwtc3VwcG9ydC1taXNzaW5nJywgYFNoYWRvdyBET00gaXMgYmVpbmcgcG9seWZpbGxlZCB2aWEgXFxgU2hhZHlET01cXGAgYnV0IGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBVc2VmdWwgZm9yIHZpc3VhbGl6aW5nIGFuZCBsb2dnaW5nIGluc2lnaHRzIGludG8gd2hhdCB0aGUgTGl0IHRlbXBsYXRlIHN5c3RlbSBpcyBkb2luZy5cbiAqXG4gKiBDb21waWxlZCBvdXQgb2YgcHJvZCBtb2RlIGJ1aWxkcy5cbiAqL1xuY29uc3QgZGVidWdMb2dFdmVudCA9IERFVl9NT0RFXG4gICAgPyAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IGdsb2JhbFxuICAgICAgICAgICAgLmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cztcbiAgICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIDogdW5kZWZpbmVkO1xuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gKHByb3AsIF9vYmopID0+IHByb3A7XG5leHBvcnQgY29uc3QgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICB0b0F0dHJpYnV0ZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICAgICAgY2FzZSBBcnJheTpcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIHBhc3MgdGhpcyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIGZyb21BdHRyaWJ1dGUodmFsdWUsIHR5cGUpIHtcbiAgICAgICAgbGV0IGZyb21WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTnVtYmVyOlxuICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE9iamVjdDpcbiAgICAgICAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgICAgICAgICAgLy8gRG8gKm5vdCogZ2VuZXJhdGUgZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBKU09OIGlzIHNldCBhcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAgICAgICAgIC8vIFRPRE8oc29ydmVsbCk6IERvIGdlbmVyYXRlIGV4Y2VwdGlvbiBpbiAqZGV2IG1vZGUqLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCB0byBhZGhlcmUgdG8gQmF6ZWwncyBcIm11c3QgdHlwZSBhc3NlcnQgSlNPTiBwYXJzZVwiIHJ1bGUuXG4gICAgICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbVZhbHVlO1xuICAgIH0sXG59O1xuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gKHZhbHVlLCBvbGQpID0+ICFpcyh2YWx1ZSwgb2xkKTtcbmNvbnN0IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uID0ge1xuICAgIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgY29udmVydGVyOiBkZWZhdWx0Q29udmVydGVyLFxuICAgIHJlZmxlY3Q6IGZhbHNlLFxuICAgIHVzZURlZmF1bHQ6IGZhbHNlLFxuICAgIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcbi8vIEVuc3VyZSBtZXRhZGF0YSBpcyBlbmFibGVkLiBUeXBlU2NyaXB0IGRvZXMgbm90IHBvbHlmaWxsXG4vLyBTeW1ib2wubWV0YWRhdGEsIHNvIHdlIG11c3QgZW5zdXJlIHRoYXQgaXQgZXhpc3RzLlxuU3ltYm9sLm1ldGFkYXRhID8/PSBTeW1ib2woJ21ldGFkYXRhJyk7XG4vLyBNYXAgZnJvbSBhIGNsYXNzJ3MgbWV0YWRhdGEgb2JqZWN0IHRvIHByb3BlcnR5IG9wdGlvbnNcbi8vIE5vdGUgdGhhdCB3ZSBtdXN0IHVzZSBudWxsaXNoLWNvYWxlc2NpbmcgYXNzaWdubWVudCBzbyB0aGF0IHdlIG9ubHkgdXNlIG9uZVxuLy8gbWFwIGV2ZW4gaWYgd2UgbG9hZCBtdWx0aXBsZSB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLlxuZ2xvYmFsLmxpdFByb3BlcnR5TWV0YWRhdGEgPz89IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEJhc2UgZWxlbWVudCBjbGFzcyB3aGljaCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gV2hlblxuICogcHJvcGVydGllcyBjaGFuZ2UsIHRoZSBgdXBkYXRlYCBtZXRob2QgaXMgYXN5bmNocm9ub3VzbHkgY2FsbGVkLiBUaGlzIG1ldGhvZFxuICogc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHN1YmNsYXNzZXMgdG8gcmVuZGVyIHVwZGF0ZXMgYXMgZGVzaXJlZC5cbiAqIEBub0luaGVyaXREb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlYWN0aXZlRWxlbWVudFxuLy8gSW4gdGhlIE5vZGUgYnVpbGQsIHRoaXMgYGV4dGVuZHNgIGNsYXVzZSB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGhcbi8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuLy9cbi8vIFRoaXMgd2F5LCB3ZSB3aWxsIGZpcnN0IHByZWZlciBhbnkgZ2xvYmFsIGBIVE1MRWxlbWVudGAgcG9seWZpbGwgdGhhdCB0aGVcbi8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbi8vIGJlZW4gaW1wb3J0ZWQgKHNlZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlIGFib3V0IGhvdyB0aGlzIGltcG9ydCBpc1xuLy8gZ2VuZXJhdGVkIGJ5IFJvbGx1cCkuIE5vdGUgdGhhdCB0aGUgYEhUTUxFbGVtZW50YCB2YXJpYWJsZSBoYXMgYmVlblxuLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHRoZSBjbGFzcyB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgaW5zdGFuY2VcbiAgICAgKiBjb25zdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHJ1bnMgYWdhaW5zdCBhIGBSZWFjdGl2ZUVsZW1lbnRgXG4gICAgICogc3ViY2xhc3MsIHN1Y2ggYXMgYSBkZWNvcmF0b3IsIHRoYXQgbmVlZHMgdG8gZG8gd29yayBmb3IgZWFjaFxuICAgICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAqICAgdGFyZ2V0LmFkZEluaXRpYWxpemVyKChpbnN0YW5jZTogUmVhY3RpdmVFbGVtZW50KSA9PiB7XG4gICAgICogICAgIC8vIFRoaXMgaXMgcnVuIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIGVsZW1lbnRcbiAgICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBEZWNvcmF0aW5nIGEgZmllbGQgd2lsbCB0aGVuIGNhdXNlIGVhY2ggaW5zdGFuY2UgdG8gcnVuIGFuIGluaXRpYWxpemVyXG4gICAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAgICogICBAbXlEZWNvcmF0b3IgZm9vO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluaXRpYWxpemVycyBhcmUgc3RvcmVkIHBlci1jb25zdHJ1Y3Rvci4gQWRkaW5nIGFuIGluaXRpYWxpemVyIHRvIGFcbiAgICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgICAqIGNvbnN0cnVjdG9ycywgaW5pdGlhbGl6ZXJzIHdpbGwgcnVuIGluIG9yZGVyIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHksXG4gICAgICogc3RhcnRpbmcgd2l0aCBzdXBlcmNsYXNzZXMgYW5kIHByb2dyZXNzaW5nIHRvIHRoZSBpbnN0YW5jZSdzIGNsYXNzLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAgICAgKHRoaXMuX2luaXRpYWxpemVycyA/Pz0gW10pLnB1c2goaW5pdGlhbGl6ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgaXMgb25seSB1bmRlZmluZWQgYWZ0ZXIgZmluYWxpemUoKSBpblxuICAgICAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAgICAgLy8gYWNjZXNzZWQgd2l0aCBSZWFjdGl2ZUVsZW1lbnQgYXMgdGhlIHJlY2VpdmVyIHdoZW4gYSBzdWJjbGFzcyBvciBtaXhpblxuICAgICAgICAvLyBjYWxscyBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgICAgcmV0dXJuICh0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCAmJiBbLi4udGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAua2V5cygpXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUgaWYgb25lIGRvZXMgbm90IGV4aXN0XG4gICAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgICAqIGdpdmVuIG9wdGlvbnMuIFRoZSBwcm9wZXJ0eSBzZXR0ZXIgY2FsbHMgdGhlIHByb3BlcnR5J3MgYGhhc0NoYW5nZWRgXG4gICAgICogcHJvcGVydHkgb3B0aW9uIG9yIHVzZXMgYSBzdHJpY3QgaWRlbnRpdHkgY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemUgcHJvcGVydGllczsgaG93ZXZlcixcbiAgICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAgICogdGhlIHByb3BlcnR5IGlzIHNldHVwIGNvcnJlY3RseS4gVGhpcyBtZXRob2QgY2FsbHNcbiAgICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYCBpbnRlcm5hbGx5IHRvIGdldCBhIGRlc2NyaXB0b3IgdG8gaW5zdGFsbC5cbiAgICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYC4gVG8gY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIHByb3BlcnR5LFxuICAgICAqIGltcGxlbWVudCBgY3JlYXRlUHJvcGVydHlgIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogc3RhdGljIGNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgICAqICAgc3VwZXIuY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zID0gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXRlIHByb3BlcnR5LCBmb3JjZSB0aGUgYXR0cmlidXRlIHRvIGZhbHNlLlxuICAgICAgICBpZiAob3B0aW9ucy5zdGF0ZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgICAgICAvLyBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLlxuICAgICAgICAvLyBIZWxwcyBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICAgICAgaWYgKHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmNyZWF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcy5zZXQobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucy5ub0FjY2Vzc29yKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gLy8gVXNlIFN5bWJvbC5mb3IgaW4gZGV2IG1vZGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkb2luZyBITVIuXG4gICAgICAgICAgICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgICAgICAgICA6IFN5bWJvbCgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgICAqIElmIG5vIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQsIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBiZWNvbWUgYW4gYWNjZXNzb3IuXG4gICAgICogRm9yIGV4YW1wbGUsXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICAgKiAgICAgY29uc3QgZGVmYXVsdERlc2NyaXB0b3IgPVxuICAgICAqICAgICAgICAgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBnZXQ6IGRlZmF1bHREZXNjcmlwdG9yLmdldCxcbiAgICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgKiAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgKiAgICAgICAgIC8vIGN1c3RvbSBhY3Rpb24uXG4gICAgICogICAgICAgfSxcbiAgICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgZ2V0LCBzZXQgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge1xuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSB2O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmIGdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMucHJvdG90eXBlLCBuYW1lKSA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gb24gYCArXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgaXQncyBhY3R1YWxseSBkZWNsYXJlZCBhcyBhIHZhbHVlIG9uIHRoZSBwcm90b3R5cGUuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgVXN1YWxseSB0aGlzIGlzIGR1ZSB0byB1c2luZyBAcHJvcGVydHkgb3IgQHN0YXRlIG9uIGEgbWV0aG9kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdyZWFjdGl2ZS1wcm9wZXJ0eS13aXRob3V0LWdldHRlcicsIGBGaWVsZCAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhuYW1lKSl9IG9uIGAgK1xuICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICAgICAgYGJ1dCBpdCBkb2VzIG5vdCBoYXZlIGEgZ2V0dGVyLiBUaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gYSBgICtcbiAgICAgICAgICAgICAgICBgZnV0dXJlIHZlcnNpb24gb2YgTGl0LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGdldD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBzZXQ/LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgICAqIG9iamVjdCBvciB0aGUgYEBwcm9wZXJ0eWAgZGVjb3JhdG9yIGFuZCBhcmUgcmVnaXN0ZXJlZCBpblxuICAgICAqIGBjcmVhdGVQcm9wZXJ0eSguLi4pYC5cbiAgICAgKlxuICAgICAqIE5vdGUsIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjb25zaWRlcmVkIFwiZmluYWxcIiBhbmQgbm90IG92ZXJyaWRkZW4uIFRvXG4gICAgICogY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIGdpdmVuIHByb3BlcnR5LCBvdmVycmlkZVxuICAgICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAZmluYWxcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgICAqIGZvciBlbGVtZW50IHByb3BlcnRpZXMsIGluaXRpYWxpemVycywgZXRjLlxuICAgICAqXG4gICAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAgICogcHJvcGVydGllcyBleGlzdCBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAgICogcHJvcGVydHkgbWV0YWRhdGEgY2FuIGJlIGNvcGllZCBkb3duLlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZWxlbWVudFByb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgcHJlcGFyZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5hbGl6ZSBhbnkgc3VwZXJjbGFzc2VzXG4gICAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IGdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgICAgICBzdXBlckN0b3IuZmluYWxpemUoKTtcbiAgICAgICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAgICAgLy8gc3VwZXJjbGFzcyBhbmQgY29weSB0aGVtIGRvd24uIE5vdGUsIGZvciBhIHNtYWxsIHBlcmYgYm9vc3QsIGF2b2lkXG4gICAgICAgIC8vIGNyZWF0aW5nIGluaXRpYWxpemVycyB1bmxlc3MgbmVlZGVkLlxuICAgICAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIGVsZW1lbnRQcm9wZXJ0aWVzIGZyb20gdGhlIHN1cGVyY2xhc3NcbiAgICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgc2V0dGluZyB1cCB0aGUgY2xhc3Mgc28gdGhhdCBpdCdzIHJlYWR5IHRvIGJlIHJlZ2lzdGVyZWRcbiAgICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFJlYWN0aXZlRWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXMgZ2V0dGVyLlxuICAgICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICAgKiBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMgdG8gdHJpZ2dlciBmaW5hbGl6YXRpb24sIG9yIGNhbGwgZmluYWxpemUoKVxuICAgICAqIHlvdXJzZWxmLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZmluYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAgICAgLy8gQ3JlYXRlIHByb3BlcnRpZXMgZnJvbSB0aGUgc3RhdGljIHByb3BlcnRpZXMgYmxvY2s6XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgICAgICAgICAgLi4uZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcyksXG4gICAgICAgICAgICAgICAgLi4uZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BzKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvcEtleXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnR5KHAsIHByb3BzW3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmcm9tIHN0YW5kYXJkIGRlY29yYXRvciBtZXRhZGF0YTpcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzW1N5bWJvbC5tZXRhZGF0YV07XG4gICAgICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIGF0dHJpYnV0ZS10by1wcm9wZXJ0eSBtYXBcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlUHJvcGVydHknKSkge1xuICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygnbm8tb3ZlcnJpZGUtY3JlYXRlLXByb3BlcnR5JywgJ092ZXJyaWRpbmcgUmVhY3RpdmVFbGVtZW50LmNyZWF0ZVByb3BlcnR5KCkgaXMgZGVwcmVjYXRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCduby1vdmVycmlkZS1nZXQtcHJvcGVydHktZGVzY3JpcHRvcicsICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICAgKiByZXR1cm5zIHRoZSBhcnJheSBvZiBzdHlsZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnQuXG4gICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW50ZWdyYXRlIGludG8gYSBzdHlsZSBtYW5hZ2VtZW50IHN5c3RlbS5cbiAgICAgKlxuICAgICAqIFN0eWxlcyBhcmUgZGVkdXBsaWNhdGVkIHByZXNlcnZpbmcgdGhlIF9sYXN0XyBpbnN0YW5jZSBpbiB0aGUgbGlzdC4gVGhpc1xuICAgICAqIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZWQgc3R5bGVzIHRoYXQgY2FuIG9jY3VyXG4gICAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICAgKiB0byBwcmVzZXJ2ZSB0aGUgY2FzY2FkZSBvcmRlciB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQncyBtb3N0IGltcG9ydGFudFxuICAgICAqIHRoYXQgbGFzdCBhZGRlZCBzdHlsZXMgb3ZlcnJpZGUgcHJldmlvdXMgc3R5bGVzLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAgICovXG4gICAgc3RhdGljIGZpbmFsaXplU3R5bGVzKHN0eWxlcykge1xuICAgICAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHtcbiAgICAgICAgICAgIC8vIERlZHVwZSB0aGUgZmxhdHRlbmVkIGFycmF5IGluIHJldmVyc2Ugb3JkZXIgdG8gcHJlc2VydmUgdGhlIGxhc3QgaXRlbXMuXG4gICAgICAgICAgICAvLyBDYXN0aW5nIHRvIEFycmF5PHVua25vd24+IHdvcmtzIGFyb3VuZCBUUyBlcnJvciB0aGF0XG4gICAgICAgICAgICAvLyBhcHBlYXJzIHRvIGNvbWUgZnJvbSB0cnlpbmcgdG8gZmxhdHRlbiBhIHR5cGUgQ1NTUmVzdWx0QXJyYXkuXG4gICAgICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KHN0eWxlcy5mbGF0KEluZmluaXR5KS5yZXZlcnNlKCkpO1xuICAgICAgICAgICAgLy8gVGhlbiBwcmVzZXJ2ZSBvcmlnaW5hbCBvcmRlciBieSBhZGRpbmcgdGhlIHNldCBpdGVtcyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHNldCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRTdHlsZXMudW5zaGlmdChnZXRDb21wYXRpYmxlU3R5bGUocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0eWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbGVtZW50U3R5bGVzLnB1c2goZ2V0Q29tcGF0aWJsZVN0eWxlKHN0eWxlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50U3R5bGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGBuYW1lYC5cbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIHN0YXRpYyBfX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIHVwZGF0ZSBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGByZXF1ZXN0VXBkYXRlKClgLlxuICAgICAgICAgKiBTaG91bGQgb25seSBiZSByZWFkLlxuICAgICAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHNldCB0byBgdHJ1ZWAgYWZ0ZXIgdGhlIGZpcnN0IHVwZGF0ZS4gVGhlIGVsZW1lbnQgY29kZSBjYW5ub3QgYXNzdW1lXG4gICAgICAgICAqIHRoYXQgYHJlbmRlclJvb3RgIGV4aXN0cyBiZWZvcmUgdGhlIGVsZW1lbnQgYGhhc1VwZGF0ZWRgLlxuICAgICAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lIG9mIGN1cnJlbnRseSByZWZsZWN0aW5nIHByb3BlcnR5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgb25seSBvdmVycmlkZSBwb2ludCBmb3IgY3VzdG9taXppbmcgd29yayBkb25lIHdoZW4gZWxlbWVudHNcbiAgICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAgICovXG4gICAgX19pbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+ICh0aGlzLmVuYWJsZVVwZGF0aW5nID0gcmVzKSk7XG4gICAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IG11c3QgcnVuIGJlZm9yZSB0aGUgZmlyc3QgdXBkYXRlLCBzbyBpdFxuICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcmVxdWVzdFVwZGF0ZSgpXG4gICAgICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgICAgIC8vIGVuc3VyZXMgZmlyc3QgdXBkYXRlIHdpbGwgYmUgY2F1Z2h0IGJ5IGFuIGVhcmx5IGFjY2VzcyBvZlxuICAgICAgICAvLyBgdXBkYXRlQ29tcGxldGVgXG4gICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+IGkodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAgICogdXBkYXRlIGN5Y2xlLiBUaGUgZWxlbWVudCBhdXRvbWF0aWNhbGx5IGNhbGxzIGludG8gYW55IHJlZ2lzdGVyZWRcbiAgICAgKiBjb250cm9sbGVycyBkdXJpbmcgaXRzIGxpZmVjeWNsZSBjYWxsYmFja3MuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgd2hlbiBgYWRkQ29udHJvbGxlcigpYCBpcyBjYWxsZWQsIHRoZVxuICAgICAqIGNvbnRyb2xsZXIncyBgaG9zdENvbm5lY3RlZCgpYCBjYWxsYmFjayB3aWxsIGJlIGltbWVkaWF0ZWx5IGNhbGxlZC5cbiAgICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICAgKi9cbiAgICBhZGRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgICAgIC8vIElmIGEgY29udHJvbGxlciBpcyBhZGRlZCBhZnRlciB0aGUgZWxlbWVudCBoYXMgYmVlbiBjb25uZWN0ZWQsXG4gICAgICAgIC8vIGNhbGwgaG9zdENvbm5lY3RlZC4gTm90ZSwgcmUtdXNpbmcgZXhpc3RlbmNlIG9mIGByZW5kZXJSb290YCBoZXJlXG4gICAgICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAgICAgLy8gZmlyc3QgY29ubmVjdGVkIHN0YXRlLlxuICAgICAgICBpZiAodGhpcy5yZW5kZXJSb290ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5ob3N0Q29ubmVjdGVkPy4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgYFJlYWN0aXZlQ29udHJvbGxlcmAgZnJvbSB0aGUgZWxlbWVudC5cbiAgICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpeGVzIGFueSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgaW5zdGFuY2UgYmVmb3JlIHVwZ3JhZGUgdGltZS5cbiAgICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKiBUaGUgcHJvcGVydGllcyBhcmUgc3RvcmVkIGluIGEgTWFwIHdoaWNoIGlzIHBsYXllZCBiYWNrIGFmdGVyIHRoZVxuICAgICAqIGNvbnN0cnVjdG9yIHJ1bnMuXG4gICAgICovXG4gICAgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZVByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgZWxlbWVudFByb3BlcnRpZXMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlUHJvcGVydGllcy5zZXQocCwgdGhpc1twXSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlUHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IGluc3RhbmNlUHJvcGVydGllcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub2RlIGludG8gd2hpY2ggdGhlIGVsZW1lbnQgc2hvdWxkIHJlbmRlciBhbmQgYnkgZGVmYXVsdFxuICAgICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgICAqIGVsZW1lbnQncyBET00gaXMgcmVuZGVyZWQuIEZvciBleGFtcGxlLCB0byByZW5kZXIgaW50byB0aGUgZWxlbWVudCdzXG4gICAgICogY2hpbGROb2RlcywgcmV0dXJuIGB0aGlzYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5vZGUgaW50byB3aGljaCB0byByZW5kZXIuXG4gICAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgICAqL1xuICAgIGNyZWF0ZVJlbmRlclJvb3QoKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlclJvb3QgPSB0aGlzLnNoYWRvd1Jvb3QgPz9cbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO1xuICAgICAgICBhZG9wdFN0eWxlcyhyZW5kZXJSb290LCB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRTdHlsZXMpO1xuICAgICAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICAgKiBlbGVtZW50IHN0eWxpbmcsIGFuZCBlbmFibGVzIHVwZGF0aW5nLlxuICAgICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICAgICB0aGlzLnJlbmRlclJvb3QgPz89XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAgICAgdGhpcy5lbmFibGVVcGRhdGluZyh0cnVlKTtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3RDb25uZWN0ZWQ/LigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgICAqIG92ZXJyaWRkZW4gb24gdGhlIGVsZW1lbnQgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgdGhlIGZpcnN0XG4gICAgICogdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZSkgeyB9XG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgICAqIHJlc2VydmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbWFraW5nIG5vbi1icmVha2luZyBmZWF0dXJlIGFkZGl0aW9uc1xuICAgICAqIHdoZW4gZGlzY29ubmVjdGluZyBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdERpc2Nvbm5lY3RlZD8uKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBTcGVjaWZpY2FsbHksIHdoZW4gYW4gYXR0cmlidXRlIGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAgICogb3ZlcnJpZGRlbiwgYHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBfb2xkLCB2YWx1ZSlgIG11c3QgYmVcbiAgICAgKiBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBTZWUgW3Jlc3BvbmRpbmcgdG8gYXR0cmlidXRlIGNoYW5nZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfY29tcG9uZW50cy9Vc2luZ19jdXN0b21fZWxlbWVudHMjcmVzcG9uZGluZ190b19hdHRyaWJ1dGVfY2hhbmdlcylcbiAgICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIF9vbGQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllcztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVsZW1Qcm9wZXJ0aWVzLmdldChuYW1lKTtcbiAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29uc3RydWN0b3IuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBvcHRpb25zLmNvbnZlcnRlcj8udG9BdHRyaWJ1dGUgIT09XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmNvbnZlcnRlclxuICAgICAgICAgICAgICAgIDogZGVmYXVsdENvbnZlcnRlcjtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNvbnZlcnRlci50b0F0dHJpYnV0ZSh2YWx1ZSwgb3B0aW9ucy50eXBlKTtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKCdtaWdyYXRpb24nKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCd1bmRlZmluZWQtYXR0cmlidXRlLXZhbHVlJywgYFRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSAke25hbWV9IHByb3BlcnR5IGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYHJlbW92ZWQsIGJ1dCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiBcXGBSZWFjdGl2ZUVsZW1lbnRcXGAsIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGhlIGF0dHJpYnV0ZSB3b3VsZCBub3QgaGF2ZSBjaGFuZ2VkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAgICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgICAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgICAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYXJrIHN0YXRlIG5vdCByZWZsZWN0aW5nXG4gICAgICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAvLyBOb3RlLCBoaW50IHRoaXMgYXMgYW4gYEF0dHJpYnV0ZU1hcGAgc28gY2xvc3VyZSBjbGVhcmx5IHVuZGVyc3RhbmRzXG4gICAgICAgIC8vIHRoZSB0eXBlOyBpdCBoYXMgaXNzdWVzIHdpdGggdHJhY2tpbmcgdHlwZXMgdGhyb3VnaCBzdGF0aWNzXG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gY3Rvci5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAuZ2V0KG5hbWUpO1xuICAgICAgICAvLyBVc2UgdHJhY2tpbmcgaW5mbyB0byBhdm9pZCByZWZsZWN0aW5nIGEgcHJvcGVydHkgdmFsdWUgdG8gYW4gYXR0cmlidXRlXG4gICAgICAgIC8vIGlmIGl0IHdhcyBqdXN0IHNldCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGUgY2hhbmdlZC5cbiAgICAgICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHsgZnJvbUF0dHJpYnV0ZTogb3B0aW9ucy5jb252ZXJ0ZXIgfVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5jb252ZXJ0ZXI/LmZyb21BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdENvbnZlcnRlcjtcbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IHByb3BOYW1lO1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZXIuZnJvbUF0dHJpYnV0ZSh2YWx1ZSwgb3B0aW9ucy50eXBlKTtcbiAgICAgICAgICAgIHRoaXNbcHJvcE5hbWVdID1cbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fZGVmYXVsdFZhbHVlcz8uZ2V0KHByb3BOYW1lKSA/P1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIGFuIHVwZGF0ZSB3aGljaCBpcyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBzaG91bGQgdXBkYXRlIGJhc2VkIG9uIHNvbWUgc3RhdGUgbm90IHRyaWdnZXJlZCBieSBzZXR0aW5nXG4gICAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICAgKiBjYWxsZWQgd2hlbiBtYW51YWxseSBpbXBsZW1lbnRpbmcgYSBwcm9wZXJ0eSBzZXR0ZXIuIEluIHRoaXMgY2FzZSwgcGFzcyB0aGVcbiAgICAgKiBwcm9wZXJ0eSBgbmFtZWAgYW5kIGBvbGRWYWx1ZWAgdG8gZW5zdXJlIHRoYXQgYW55IGNvbmZpZ3VyZWQgcHJvcGVydHlcbiAgICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgcHJvcGVydHkgb3B0aW9ucyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXNseVxuICAgICAqICAgICBjb25maWd1cmVkIG9wdGlvbnNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByb3BlcnR5IGtleSwgcGVyZm9ybSBwcm9wZXJ0eSB1cGRhdGUgc3RlcHMuXG4gICAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJiBuYW1lIGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoYGAsIGBUaGUgcmVxdWVzdFVwZGF0ZSgpIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYW4gRXZlbnQgYXMgdGhlIHByb3BlcnR5IG5hbWUuIFRoaXMgaXMgcHJvYmFibHkgYSBtaXN0YWtlIGNhdXNlZCBieSBiaW5kaW5nIHRoaXMucmVxdWVzdFVwZGF0ZSBhcyBhbiBldmVudCBsaXN0ZW5lci4gSW5zdGVhZCBiaW5kIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNhbGwgaXQgd2l0aCBubyBhcmd1bWVudHM6ICgpID0+IHRoaXMucmVxdWVzdFVwZGF0ZSgpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1tuYW1lXTtcbiAgICAgICAgICAgIG9wdGlvbnMgPz89IGN0b3IuZ2V0UHJvcGVydHlPcHRpb25zKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZCA9IChvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWwpKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGNoYW5nZSwgY2hlY2sgYSBjb3JuZXIgY2FzZSB0aGF0IGNhbiBvY2N1ciB3aGVuXG4gICAgICAgICAgICAgICAgLy8gMS4gdGhlcmUncyBhIGluaXRpYWwgdmFsdWUgd2hpY2ggd2FzIG5vdCByZWZsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyAyLiB0aGUgcHJvcGVydHkgaXMgc3Vic2VxdWVudGx5IHNldCB0byB0aGlzIHZhbHVlLlxuICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBgcHJvcDoge3VzZURlZmF1bHQ6IHRydWUsIHJlZmxlY3Q6IHRydWV9YFxuICAgICAgICAgICAgICAgIC8vIGFuZCBlbC5wcm9wID0gJ2ZvbycuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIGlzIG5vdCBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5vdyByZWZsZWN0IHRoZSBwcm9wZXJ0eSB0byB0aGUgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgIChvcHRpb25zLnVzZURlZmF1bHQgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZWZsZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID09PSB0aGlzLl9fZGVmYXVsdFZhbHVlcz8uZ2V0KG5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmhhc0F0dHJpYnV0ZShjdG9yLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KG5hbWUsIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VQcm9wZXJ0eShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgcmVxdWVzdCBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzVXBkYXRlUGVuZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX191cGRhdGVQcm9taXNlID0gdGhpcy5fX2VucXVldWVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCB7IHVzZURlZmF1bHQsIHJlZmxlY3QsIHdyYXBwZWQgfSwgaW5pdGlhbGl6ZVZhbHVlKSB7XG4gICAgICAgIC8vIFJlY29yZCBkZWZhdWx0IHZhbHVlIHdoZW4gdXNlRGVmYXVsdCBpcyB1c2VkLiBUaGlzIGFsbG93cyB1cyB0b1xuICAgICAgICAvLyByZXN0b3JlIHRoaXMgdmFsdWUgd2hlbiB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQuXG4gICAgICAgIGlmICh1c2VEZWZhdWx0ICYmICEodGhpcy5fX2RlZmF1bHRWYWx1ZXMgPz89IG5ldyBNYXAoKSkuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9fZGVmYXVsdFZhbHVlcy5zZXQobmFtZSwgaW5pdGlhbGl6ZVZhbHVlID8/IG9sZFZhbHVlID8/IHRoaXNbbmFtZV0pO1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3Qgd3JhcHBpbmcgYW4gYWNjZXNzb3IsIGl0IG11c3QgYmUgYW4gaW5pdGlhbCBzZXR0aW5nXG4gICAgICAgICAgICAvLyBhbmQgaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIHJlY29yZCB0aGUgY2hhbmdlIG9yIHJlZmxlY3QuXG4gICAgICAgICAgICBpZiAod3JhcHBlZCAhPT0gdHJ1ZSB8fCBpbml0aWFsaXplVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogQ3JlYXRlIGEgYmVuY2htYXJrIG9mIE1hcC5oYXMoKSArIE1hcC5zZXQoXG4gICAgICAgIC8vIHZzIGp1c3QgTWFwLnNldCgpXG4gICAgICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gT24gdGhlIGluaXRpYWwgY2hhbmdlLCB0aGUgb2xkIHZhbHVlIHNob3VsZCBiZSBgdW5kZWZpbmVkYCwgZXhjZXB0XG4gICAgICAgICAgICAvLyB3aXRoIGB1c2VEZWZhdWx0YFxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQgJiYgIXVzZURlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5zZXQobmFtZSwgb2xkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgICAgICAvLyBOb3RlLCBpdCdzIGltcG9ydGFudCB0aGF0IGV2ZXJ5IGNoYW5nZSBoYXMgYSBjaGFuY2UgdG8gYWRkIHRoZVxuICAgICAgICAvLyBwcm9wZXJ0eSB0byBgX19yZWZsZWN0aW5nUHJvcGVydGllc2AuIFRoaXMgZW5zdXJlcyBzZXR0aW5nXG4gICAgICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKHJlZmxlY3QgPT09IHRydWUgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gbmFtZSkge1xuICAgICAgICAgICAgKHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyA/Pz0gbmV3IFNldCgpKS5hZGQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAgICovXG4gICAgYXN5bmMgX19lbnF1ZXVlVXBkYXRlKCkge1xuICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgYW55IHByZXZpb3VzIHVwZGF0ZSBoYXMgcmVzb2x2ZWQgYmVmb3JlIHVwZGF0aW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBgYXdhaXRgIGFsc28gZW5zdXJlcyB0aGF0IHByb3BlcnR5IGNoYW5nZXMgYXJlIGJhdGNoZWQuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gUmVmaXJlIGFueSBwcmV2aW91cyBlcnJvcnMgYXN5bmMgc28gdGhleSBkbyBub3QgZGlzcnVwdCB0aGUgdXBkYXRlXG4gICAgICAgICAgICAvLyBjeWNsZS4gRXJyb3JzIGFyZSByZWZpcmVkIHNvIGRldmVsb3BlcnMgaGF2ZSBhIGNoYW5jZSB0byBvYnNlcnZlXG4gICAgICAgICAgICAvLyB0aGVtLCBhbmQgdGhpcyBjYW4gYmUgZG9uZSBieSBpbXBsZW1lbnRpbmdcbiAgICAgICAgICAgIC8vIGB3aW5kb3cub251bmhhbmRsZWRyZWplY3Rpb25gLlxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICAvLyBJZiBgc2NoZWR1bGVVcGRhdGVgIHJldHVybnMgYSBQcm9taXNlLCB3ZSBhd2FpdCBpdC4gVGhpcyBpcyBkb25lIHRvXG4gICAgICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgICAgIC8vIGNoZWNrZWQgdG8gYXZvaWQgZGVsYXlpbmcgYW4gYWRkaXRpb25hbCBtaWNyb3Rhc2sgdW5sZXNzIHdlIG5lZWQgdG8uXG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5pc1VwZGF0ZVBlbmRpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiBlbGVtZW50IHVwZGF0ZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhlXG4gICAgICogdGltaW5nIG9mIHVwZGF0ZXMgYnkgcmV0dXJuaW5nIGEgUHJvbWlzZS4gVGhlIHVwZGF0ZSB3aWxsIGF3YWl0IHRoZVxuICAgICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgICAqIHRvIHByb2NlZWQuIElmIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIGBzdXBlci5zY2hlZHVsZVVwZGF0ZSgpYFxuICAgICAqIG11c3QgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogRm9yIGluc3RhbmNlLCB0byBzY2hlZHVsZSB1cGRhdGVzIHRvIG9jY3VyIGp1c3QgYmVmb3JlIHRoZSBuZXh0IGZyYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBvdmVycmlkZSBwcm90ZWN0ZWQgYXN5bmMgc2NoZWR1bGVVcGRhdGUoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICogICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSkpO1xuICAgICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBzY2hlZHVsZVVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJlxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMoJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJykgJiZcbiAgICAgICAgICAgIHR5cGVvZiByZXN1bHQ/LnRoZW4gPT09XG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdhc3luYy1wZXJmb3JtLXVwZGF0ZScsIGBFbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHJldHVybmVkIGEgUHJvbWlzZSBmcm9tIHBlcmZvcm1VcGRhdGUoKS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgYmVoYXZpb3IgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGAgK1xuICAgICAgICAgICAgICAgIGB2ZXJzaW9uIG9mIFJlYWN0aXZlRWxlbWVudC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbiBlbGVtZW50IHVwZGF0ZS4gTm90ZSwgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlXG4gICAgICogdXBkYXRlLCBgZmlyc3RVcGRhdGVkYCBhbmQgYHVwZGF0ZWRgIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIENhbGwgYHBlcmZvcm1VcGRhdGUoKWAgdG8gaW1tZWRpYXRlbHkgcHJvY2VzcyBhIHBlbmRpbmcgdXBkYXRlLiBUaGlzIHNob3VsZFxuICAgICAqIGdlbmVyYWxseSBub3QgYmUgbmVlZGVkLCBidXQgaXQgY2FuIGJlIGRvbmUgaW4gcmFyZSBjYXNlcyB3aGVuIHlvdSBuZWVkIHRvXG4gICAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHBlcmZvcm1VcGRhdGUoKSB7XG4gICAgICAgIC8vIEFib3J0IGFueSB1cGRhdGUgaWYgb25lIGlzIG5vdCBwZW5kaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuXG4gICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgICAgICAvLyB0aGUgdXBkYXRlLlxuICAgICAgICBpZiAoIXRoaXMuaXNVcGRhdGVQZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdMb2dFdmVudD8uKHsga2luZDogJ3VwZGF0ZScgfSk7XG4gICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgcmVuZGVyUm9vdCBiZWZvcmUgZmlyc3QgdXBkYXRlLiBUaGlzIG9jY3VycyBpbiBgY29ubmVjdGVkQ2FsbGJhY2tgXG4gICAgICAgICAgICAvLyBidXQgaXMgZG9uZSBoZXJlIHRvIHN1cHBvcnQgb3V0IG9mIHRyZWUgY2FsbHMgdG8gYGVuYWJsZVVwZGF0aW5nYC9gcGVyZm9ybVVwZGF0ZWAuXG4gICAgICAgICAgICB0aGlzLnJlbmRlclJvb3QgPz89XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBQcm9kdWNlIHdhcm5pbmcgaWYgYW55IHJlYWN0aXZlIHByb3BlcnRpZXMgb24gdGhlIHByb3RvdHlwZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZCBieSB0aGlzIHBvaW50LCBzbyBhbnkgb3duIHByb3BlcnR5IGlzIGNhdXNlZCBieSBjbGFzcyBmaWVsZFxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcigocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hhZG93ZWRQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHRyaWdnZXIgdXBkYXRlcyBhcyBleHBlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIHNldCB1c2luZyBjbGFzcyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBmaWVsZHM6ICR7c2hhZG93ZWRQcm9wZXJ0aWVzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhY2Nlc3NvcnMgdXNlZCBmb3IgZGV0ZWN0aW5nIGNoYW5nZXMuIFNlZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBodHRwczovL2xpdC5kZXYvbXNnL2NsYXNzLWZpZWxkLXNoYWRvd2luZyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNaXhpbiBpbnN0YW5jZSBwcm9wZXJ0aWVzIG9uY2UsIGlmIHRoZXkgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBzaG91bGQgd2UgdXNlIHRoZSBzdG9yZWQgdmFsdWU/IENvdWxkIGEgbmV3IHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwLCB2YWx1ZV0gb2YgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgICAgICAgIC8vIGBjaGFuZ2VkUHJvcGVydGllc2AgbWFwLCBidXQgb25seSBmb3IgdGhlIGNhc2Ugb2YgcHJvcGVydGllcyBjcmVhdGVkXG4gICAgICAgICAgICAvLyB2aWEgYGNyZWF0ZVByb3BlcnR5YCBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeVxuICAgICAgICAgICAgLy8gcG9wdWxhdGVkIHRoZSBgY2hhbmdlZFByb3BlcnRpZXNgIG1hcCBzaW5jZSB0aGV5IGFyZSBub3Qgc2V0LlxuICAgICAgICAgICAgLy8gV2UgY2FuJ3Qga25vdyBpZiB0aGVzZSBhY2Nlc3NvcnMgaGFkIGluaXRpYWxpemVycywgc28gd2UganVzdCBzZXRcbiAgICAgICAgICAgIC8vIHRoZW0gYW55d2F5IC0gYSBkaWZmZXJlbmNlIGZyb20gZXhwZXJpbWVudGFsIGRlY29yYXRvcnMgb24gZmllbGRzIGFuZFxuICAgICAgICAgICAgLy8gc3RhbmRhcmQgZGVjb3JhdG9ycyBvbiBhdXRvLWFjY2Vzc29ycy5cbiAgICAgICAgICAgIC8vIEZvciBjb250ZXh0IHNlZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L3B1bGwvNDE4MyNpc3N1ZWNvbW1lbnQtMTcxMTk1OTYzNVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRQcm9wZXJ0aWVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cmFwcGVkIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3cmFwcGVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KHAsIHVuZGVmaW5lZCwgb3B0aW9ucywgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzaG91bGRVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnRpZXMgPSB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZT8uKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgZnJvbSBydW5uaW5nIHdoZW4gdGhlcmUncyBhblxuICAgICAgICAgICAgLy8gdXBkYXRlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gRW5zdXJlIGVsZW1lbnQgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIHVwZGF0ZXMgYWZ0ZXIgYW4gZXhjZXB0aW9uLlxuICAgICAgICAgICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBJbXBsZW1lbnQgYHdpbGxVcGRhdGVgIHRvIGNvbXB1dGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIG90aGVyXG4gICAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICogICAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgY2hhbmdlZCBwcm9wZXJ0aWVzIGZvciBhbiBleHBlbnNpdmUgY29tcHV0YXRpb24uXG4gICAgICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdmaXJzdE5hbWUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xhc3ROYW1lJykpIHtcbiAgICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogcmVuZGVyKCkge1xuICAgICAqICAgcmV0dXJuIGh0bWxgU0hBOiAke3RoaXMuc2hhfWA7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllcykgeyB9XG4gICAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgICAvLyBAaW50ZXJuYWxcbiAgICBfJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZWQ/LigpKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmXG4gICAgICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMoJ2NoYW5nZS1pbi11cGRhdGUnKSkge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdjaGFuZ2UtaW4tdXBkYXRlJywgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19tYXJrVXBkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCB1cGRhdGluZy5cbiAgICAgKiBUaGUgUHJvbWlzZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgY29tcGxldGVkIHRoZVxuICAgICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAgICogYSBwcm9wZXJ0eSB3YXMgc2V0IGluc2lkZSBgdXBkYXRlZCgpYC4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGFuXG4gICAgICogZXhjZXB0aW9uIHdhcyB0aHJvd24gZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBUbyBhd2FpdCBhZGRpdGlvbmFsIGFzeW5jaHJvbm91cyB3b3JrLCBvdmVycmlkZSB0aGUgYGdldFVwZGF0ZUNvbXBsZXRlYFxuICAgICAqIG1ldGhvZC4gRm9yIGV4YW1wbGUsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYXdhaXQgYSByZW5kZXJlZCBlbGVtZW50XG4gICAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgICAqIGBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpYCwgdGhlbiBhbnkgc3Vic2VxdWVudCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZ2V0IHVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBwb2ludCBmb3IgdGhlIGB1cGRhdGVDb21wbGV0ZWAgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCBzYWZlIHRvIG92ZXJyaWRlIHRoZSBgdXBkYXRlQ29tcGxldGVgIGdldHRlciBkaXJlY3RseSBkdWUgdG8gYVxuICAgICAqIGxpbWl0YXRpb24gaW4gVHlwZVNjcmlwdCB3aGljaCBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCBhXG4gICAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgICAqIGxhbmd1YWdlIGlzIEVTNSAoaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMzgpLlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGluc3RlYWQuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgICAqICAgICBhd2FpdCB0aGlzLl9teUNoaWxkLnVwZGF0ZUNvbXBsZXRlO1xuICAgICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZ2V0VXBkYXRlQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciBvciBub3QgYHVwZGF0ZSgpYCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgcmVxdWVzdHNcbiAgICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAgICogY3VzdG9taXplZCB0byBjb250cm9sIHdoZW4gdG8gdXBkYXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgc2hvdWxkVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8gcmVuZGVyIGFuZCBrZWVwIHVwZGF0ZWQgZWxlbWVudCBET00uXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXJcbiAgICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIGlzXG4gICAgICAgIC8vIGRlZmluZWQsIGFuZCBpdCByZXR1cm5zIHVuZGVmaW5lZCwgc2V0dGluZyBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIHRvXG4gICAgICAgIC8vIHVuZGVmaW5lZFxuICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgJiY9IHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcy5mb3JFYWNoKChwKSA9PiB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3BdKSk7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW5ldmVyIHRoZSBlbGVtZW50IGlzIHVwZGF0ZWQuIEltcGxlbWVudCB0byBwZXJmb3JtXG4gICAgICogcG9zdC11cGRhdGluZyB0YXNrcyB2aWEgRE9NIEFQSXMsIGZvciBleGFtcGxlLCBmb2N1c2luZyBhbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgICAqIHdvcmsgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgdXBkYXRlLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBmaXJzdFVwZGF0ZWQoKSB7XG4gICAgICogICB0aGlzLnJlbmRlclJvb3QuZ2V0RWxlbWVudEJ5SWQoJ215LXRleHQtYXJlYScpLmZvY3VzKCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgeyB9XG59XG4vKipcbiAqIE1lbW9pemVkIGxpc3Qgb2YgYWxsIGVsZW1lbnQgc3R5bGVzLlxuICogQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGUgY2xhc3MuXG4gKiBAbm9jb2xsYXBzZVxuICogQGNhdGVnb3J5IHN0eWxlc1xuICovXG5SZWFjdGl2ZUVsZW1lbnQuZWxlbWVudFN0eWxlcyA9IFtdO1xuLyoqXG4gKiBPcHRpb25zIHVzZWQgd2hlbiBjYWxsaW5nIGBhdHRhY2hTaGFkb3dgLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBjdXN0b21pemVcbiAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICogc2hhZG93Um9vdDogYHttb2RlOiAnY2xvc2VkJ31gLlxuICpcbiAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICogaXMgY3VzdG9taXplZCwgb3B0aW9ucyBzaG91bGQgYmUgcmVzcGVjdGVkIGlmIHBvc3NpYmxlLlxuICogQG5vY29sbGFwc2VcbiAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAqL1xuUmVhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zID0geyBtb2RlOiAnb3BlbicgfTtcbi8vIEFzc2lnbmVkIGhlcmUgdG8gd29yayBhcm91bmQgYSBqc2NvbXBpbGVyIGJ1ZyB3aXRoIHN0YXRpYyBmaWVsZHNcbi8vIHdoZW4gY29tcGlsaW5nIHRvIEVTNS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMzE3N1xuUmVhY3RpdmVFbGVtZW50W0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgUmVhY3RpdmVFbGVtZW50KV0gPSBuZXcgTWFwKCk7XG5SZWFjdGl2ZUVsZW1lbnRbSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZmluYWxpemVkJywgUmVhY3RpdmVFbGVtZW50KV0gPSBuZXcgTWFwKCk7XG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7IFJlYWN0aXZlRWxlbWVudCB9KTtcbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgICAvLyBEZWZhdWx0IHdhcm5pbmcgc2V0LlxuICAgIFJlYWN0aXZlRWxlbWVudC5lbmFibGVkV2FybmluZ3MgPSBbXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICBdO1xuICAgIGNvbnN0IGVuc3VyZU93bldhcm5pbmdzID0gZnVuY3Rpb24gKGN0b3IpIHtcbiAgICAgICAgaWYgKCFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKSkge1xuICAgICAgICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncy5zbGljZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlV2FybmluZyA9IGZ1bmN0aW9uICh3YXJuaW5nKSB7XG4gICAgICAgIGVuc3VyZU93bldhcm5pbmdzKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKHdhcm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRXYXJuaW5ncy5wdXNoKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmcgPSBmdW5jdGlvbiAod2FybmluZykge1xuICAgICAgICBlbnN1cmVPd25XYXJuaW5ncyh0aGlzKTtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzLmluZGV4T2Yod2FybmluZyk7XG4gICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjEuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ211bHRpcGxlLXZlcnNpb25zJywgYE11bHRpcGxlIHZlcnNpb25zIG9mIExpdCBsb2FkZWQuIExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgYCArXG4gICAgICAgICAgICBgaXMgbm90IHJlY29tbWVuZGVkLmApO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3RpdmUtZWxlbWVudC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbi8qKlxuICogVGhlIG1haW4gTGl0RWxlbWVudCBtb2R1bGUsIHdoaWNoIGRlZmluZXMgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYmFzZVxuICogY2xhc3MgYW5kIHJlbGF0ZWQgQVBJcy5cbiAqXG4gKiBMaXRFbGVtZW50IGNvbXBvbmVudHMgY2FuIGRlZmluZSBhIHRlbXBsYXRlIGFuZCBhIHNldCBvZiBvYnNlcnZlZFxuICogcHJvcGVydGllcy4gQ2hhbmdpbmcgYW4gb2JzZXJ2ZWQgcHJvcGVydHkgdHJpZ2dlcnMgYSByZS1yZW5kZXIgb2YgdGhlXG4gKiBlbGVtZW50LlxuICpcbiAqIEltcG9ydCB7QGxpbmtjb2RlIExpdEVsZW1lbnR9IGFuZCB7QGxpbmtjb2RlIGh0bWx9IGZyb20gdGhpcyBtb2R1bGUgdG9cbiAqIGNyZWF0ZSBhIGNvbXBvbmVudDpcbiAqXG4gKiAgYGBganNcbiAqIGltcG9ydCB7TGl0RWxlbWVudCwgaHRtbH0gZnJvbSAnbGl0LWVsZW1lbnQnO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICpcbiAqICAgLy8gRGVjbGFyZSBvYnNlcnZlZCBwcm9wZXJ0aWVzXG4gKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgYWRqZWN0aXZlOiB7fVxuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5hZGplY3RpdmUgPSAnYXdlc29tZSc7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIERlZmluZSB0aGUgZWxlbWVudCdzIHRlbXBsYXRlXG4gKiAgIHJlbmRlcigpIHtcbiAqICAgICByZXR1cm4gaHRtbGA8cD55b3VyICR7YWRqZWN0aXZlfSB0ZW1wbGF0ZSBoZXJlPC9wPmA7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWVsZW1lbnQnLCBNeUVsZW1lbnQpO1xuICogYGBgXG4gKlxuICogYExpdEVsZW1lbnRgIGV4dGVuZHMge0BsaW5rY29kZSBSZWFjdGl2ZUVsZW1lbnR9IGFuZCBhZGRzIGxpdC1odG1sXG4gKiB0ZW1wbGF0aW5nLiBUaGUgYFJlYWN0aXZlRWxlbWVudGAgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHVzZXJzIHRoYXQgd2FudCB0b1xuICogYnVpbGQgdGhlaXIgb3duIGN1c3RvbSBlbGVtZW50IGJhc2UgY2xhc3NlcyB0aGF0IGRvbid0IHVzZSBsaXQtaHRtbC5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuaW1wb3J0IHsgUmVhY3RpdmVFbGVtZW50IH0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcbmltcG9ydCB7IHJlbmRlciwgbm9DaGFuZ2UgfSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gKHByb3AsIF9vYmopID0+IHByb3A7XG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5sZXQgaXNzdWVXYXJuaW5nO1xuaWYgKERFVl9NT0RFKSB7XG4gICAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgICAvLyBhcmUgbG9hZGVkLlxuICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuICAgIC8qKlxuICAgICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgICAqL1xuICAgIGlzc3VlV2FybmluZyA9IChjb2RlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMoY29kZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5hZGQod2FybmluZyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlIGVsZW1lbnQgY2xhc3MgdGhhdCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcywgYW5kXG4gKiByZW5kZXJzIGEgbGl0LWh0bWwgdGVtcGxhdGUuXG4gKlxuICogVG8gZGVmaW5lIGEgY29tcG9uZW50LCBzdWJjbGFzcyBgTGl0RWxlbWVudGAgYW5kIGltcGxlbWVudCBhXG4gKiBgcmVuZGVyYCBtZXRob2QgdG8gcHJvdmlkZSB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGUuIERlZmluZSBwcm9wZXJ0aWVzXG4gKiB1c2luZyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50LnByb3BlcnRpZXMgcHJvcGVydGllc30gcHJvcGVydHkgb3IgdGhlXG4gKiB7QGxpbmtjb2RlIHByb3BlcnR5fSBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXRFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVuZGVyT3B0aW9ucyA9IHsgaG9zdDogdGhpcyB9O1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICovXG4gICAgY3JlYXRlUmVuZGVyUm9vdCgpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyUm9vdCA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAgICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgIC8vIHNoYWRvd1Jvb3QgYnkgY3JlYXRlUmVuZGVyUm9vdC4gQWRqdXN0IHRoZSByZW5kZXJCZWZvcmUgbm9kZSBzbyB0aGF0XG4gICAgICAgIC8vIGFueSBzdHlsZXMgaW4gTGl0IGNvbnRlbnQgcmVuZGVyIGJlZm9yZSBhZG9wdGVkU3R5bGVTaGVldHMuIFRoaXMgaXNcbiAgICAgICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgICAgICAvLyB0aGUgc2hhZG93Um9vdC5cbiAgICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLnJlbmRlckJlZm9yZSA/Pz0gcmVuZGVyUm9vdC5maXJzdENoaWxkO1xuICAgICAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXNcbiAgICAgKiBhbmQgY2FsbHMgYHJlbmRlcmAgdG8gcmVuZGVyIERPTSB2aWEgbGl0LWh0bWwuIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGVcbiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAgICogQHBhcmFtIGNoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB1cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gU2V0dGluZyBwcm9wZXJ0aWVzIGluIGByZW5kZXJgIHNob3VsZCBub3QgdHJpZ2dlciBhbiB1cGRhdGUuIFNpbmNlXG4gICAgICAgIC8vIHVwZGF0ZXMgYXJlIGFsbG93ZWQgYWZ0ZXIgc3VwZXIudXBkYXRlLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGByZW5kZXJgXG4gICAgICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLnVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQgPSByZW5kZXIodmFsdWUsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgICAqXG4gICAgICogSW4gYGNvbm5lY3RlZENhbGxiYWNrKClgIHlvdSBzaG91bGQgc2V0dXAgdGFza3MgdGhhdCBzaG91bGQgb25seSBvY2N1ciB3aGVuXG4gICAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAgICogYWRkaW5nIGV2ZW50IGxpc3RlbmVycyB0byBub2RlcyBleHRlcm5hbCB0byB0aGUgZWxlbWVudCwgbGlrZSBhIGtleWRvd25cbiAgICAgKiBldmVudCBoYW5kbGVyIGFkZGVkIHRvIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgKiAgIGFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUeXBpY2FsbHksIGFueXRoaW5nIGRvbmUgaW4gYGNvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBiZSB1bmRvbmUgd2hlbiB0aGVcbiAgICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0Py5zZXRDb25uZWN0ZWQodHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQncyBET00uXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICAgKiB1c2VkLiBgZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGVuc3VyZSB0aGF0IG5vdGhpbmcgaXMgaG9sZGluZyBhXG4gICAgICogcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IChzdWNoIGFzIGV2ZW50IGxpc3RlbmVycyBhZGRlZCB0byBub2RlcyBleHRlcm5hbFxuICAgICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgKiAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICogICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2hhbmRsZUtleWRvd24pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZChmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgb24gZWFjaCB1cGRhdGUgdG8gcGVyZm9ybSByZW5kZXJpbmcgdGFza3MuIFRoaXMgbWV0aG9kIG1heSByZXR1cm5cbiAgICAgKiBhbnkgdmFsdWUgcmVuZGVyYWJsZSBieSBsaXQtaHRtbCdzIGBDaGlsZFBhcnRgIC0gdHlwaWNhbGx5IGFcbiAgICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgICAqIHRoZSBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gbm9DaGFuZ2U7XG4gICAgfVxufVxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbkxpdEVsZW1lbnRbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG4vKipcbiAqIEVuc3VyZSB0aGlzIGNsYXNzIGlzIG1hcmtlZCBhcyBgZmluYWxpemVkYCBhcyBhbiBvcHRpbWl6YXRpb24gZW5zdXJpbmdcbiAqIGl0IHdpbGwgbm90IG5lZWRsZXNzbHkgdHJ5IHRvIGBmaW5hbGl6ZWAuXG4gKlxuICogTm90ZSB0aGlzIHByb3BlcnR5IG5hbWUgaXMgYSBzdHJpbmcgdG8gcHJldmVudCBicmVha2luZyBDbG9zdXJlIEpTIENvbXBpbGVyXG4gKiBvcHRpbWl6YXRpb25zLiBTZWUgQGxpdC9yZWFjdGl2ZS1lbGVtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5MaXRFbGVtZW50W0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIExpdEVsZW1lbnQpXSA9IHRydWU7XG4vLyBJbnN0YWxsIGh5ZHJhdGlvbiBpZiBhdmFpbGFibGVcbmdsb2JhbC5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7IExpdEVsZW1lbnQgfSk7XG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICAgID8gZ2xvYmFsLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gICAgOiBnbG9iYWwubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcbnBvbHlmaWxsU3VwcG9ydD8uKHsgTGl0RWxlbWVudCB9KTtcbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzICBtYW5nbGVkIGluIHRoZVxuICogY2xpZW50IHNpZGUgY29kZSwgd2UgZXhwb3J0IGEgXyRMRSBvYmplY3QgY29udGFpbmluZyB0aG9zZSBtZW1iZXJzIChvclxuICogaGVscGVyIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBwcml2YXRlIGZpZWxkcyBvZiB0aG9zZSBtZW1iZXJzKSwgYW5kIHRoZW5cbiAqIHJlLWV4cG9ydCB0aGVtIGZvciB1c2UgaW4gbGl0LXNzci4gVGhpcyBrZWVwcyBsaXQtc3NyIGFnbm9zdGljIHRvIHdoZXRoZXIgdGhlXG4gKiBjbGllbnQtc2lkZSBjb2RlIGlzIGJlaW5nIHVzZWQgaW4gYGRldmAgbW9kZSBvciBgcHJvZGAgbW9kZS5cbiAqXG4gKiBUaGlzIGhhcyBhIHVuaXF1ZSBuYW1lLCB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBwcml2YXRlIGV4cG9ydHMgaW5cbiAqIGxpdC1odG1sLCBzaW5jZSB0aGlzIG1vZHVsZSByZS1leHBvcnRzIGFsbCBvZiBsaXQtaHRtbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgXyRMRSA9IHtcbiAgICBfJGF0dHJpYnV0ZVRvUHJvcGVydHk6IChlbCwgbmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIGVsLl8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBfJGNoYW5nZWRQcm9wZXJ0aWVzOiAoZWwpID0+IGVsLl8kY2hhbmdlZFByb3BlcnRpZXMsXG59O1xuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCc0LjIuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdtdWx0aXBsZS12ZXJzaW9ucycsIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGAgK1xuICAgICAgICAgICAgYGlzIG5vdCByZWNvbW1lbmRlZC5gKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpdC1lbGVtZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgXyRMSCwgfSBmcm9tICcuL2xpdC1odG1sLmpzJztcbmNvbnN0IHsgX0NoaWxkUGFydDogQ2hpbGRQYXJ0IH0gPSBfJExIO1xuY29uc3QgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggPSB0cnVlO1xuY29uc3Qgd3JhcCA9IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gICAgd2luZG93LlNoYWR5RE9NPy5pblVzZSAmJlxuICAgIHdpbmRvdy5TaGFkeURPTT8ubm9QYXRjaCA9PT0gdHJ1ZVxuICAgID8gd2luZG93LlNoYWR5RE9NLndyYXBcbiAgICA6IChub2RlKSA9PiBub2RlO1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHZhbHVlLlxuICpcbiAqIFNlZSBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlb2Ytb3BlcmF0b3JcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPSAnZnVuY3Rpb24nKTtcbmV4cG9ydCBjb25zdCBUZW1wbGF0ZVJlc3VsdFR5cGUgPSB7XG4gICAgSFRNTDogMSxcbiAgICBTVkc6IDIsXG4gICAgTUFUSE1MOiAzLFxufTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVzdWx0IG9yIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVSZXN1bHQgPSAodmFsdWUsIHR5cGUpID0+IHR5cGUgPT09IHVuZGVmaW5lZFxuICAgID8gLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgdmFsdWU/LlsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWRcbiAgICA6IHZhbHVlPy5bJ18kbGl0VHlwZSQnXSA9PT0gdHlwZTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWU/LlsnXyRsaXRUeXBlJCddPy5oICE9IG51bGw7XG59O1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgRGlyZWN0aXZlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RpdmVSZXN1bHQgPSAodmFsdWUpID0+IFxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbnZhbHVlPy5bJ18kbGl0RGlyZWN0aXZlJCddICE9PSB1bmRlZmluZWQ7XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgRGlyZWN0aXZlIGNsYXNzIGZvciBhIERpcmVjdGl2ZVJlc3VsdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0aXZlQ2xhc3MgPSAodmFsdWUpID0+IFxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbnZhbHVlPy5bJ18kbGl0RGlyZWN0aXZlJCddO1xuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgcGFydCBoYXMgb25seSBhIHNpbmdsZS1leHByZXNzaW9uIHdpdGggbm8gc3RyaW5ncyB0b1xuICogaW50ZXJwb2xhdGUgYmV0d2Vlbi5cbiAqXG4gKiBPbmx5IEF0dHJpYnV0ZVBhcnQgYW5kIFByb3BlcnR5UGFydCBjYW4gaGF2ZSBtdWx0aXBsZSBleHByZXNzaW9ucy5cbiAqIE11bHRpLWV4cHJlc3Npb24gcGFydHMgaGF2ZSBhIGBzdHJpbmdzYCBwcm9wZXJ0eSBhbmQgc2luZ2xlLWV4cHJlc3Npb25cbiAqIHBhcnRzIGRvIG5vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2luZ2xlRXhwcmVzc2lvbiA9IChwYXJ0KSA9PiBwYXJ0LnN0cmluZ3MgPT09IHVuZGVmaW5lZDtcbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuLyoqXG4gKiBJbnNlcnRzIGEgQ2hpbGRQYXJ0IGludG8gdGhlIGdpdmVuIGNvbnRhaW5lciBDaGlsZFBhcnQncyBET00sIGVpdGhlciBhdCB0aGVcbiAqIGVuZCBvZiB0aGUgY29udGFpbmVyIENoaWxkUGFydCwgb3IgYmVmb3JlIHRoZSBvcHRpb25hbCBgcmVmUGFydGAuXG4gKlxuICogVGhpcyBkb2VzIG5vdCBhZGQgdGhlIHBhcnQgdG8gdGhlIGNvbnRhaW5lclBhcnQncyBjb21taXR0ZWQgdmFsdWUuIFRoYXQgbXVzdFxuICogYmUgZG9uZSBieSBjYWxsZXJzLlxuICpcbiAqIEBwYXJhbSBjb250YWluZXJQYXJ0IFBhcnQgd2l0aGluIHdoaWNoIHRvIGFkZCB0aGUgbmV3IENoaWxkUGFydFxuICogQHBhcmFtIHJlZlBhcnQgUGFydCBiZWZvcmUgd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0OyB3aGVuIG9taXR0ZWQgdGhlXG4gKiAgICAgcGFydCBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBgY29udGFpbmVyUGFydGBcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gaW5zZXJ0LCBvciB1bmRlZmluZWQgdG8gY3JlYXRlIGEgbmV3IHBhcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGluc2VydFBhcnQgPSAoY29udGFpbmVyUGFydCwgcmVmUGFydCwgcGFydCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHdyYXAoY29udGFpbmVyUGFydC5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZTtcbiAgICBjb25zdCByZWZOb2RlID0gcmVmUGFydCA9PT0gdW5kZWZpbmVkID8gY29udGFpbmVyUGFydC5fJGVuZE5vZGUgOiByZWZQYXJ0Ll8kc3RhcnROb2RlO1xuICAgIGlmIChwYXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCByZWZOb2RlKTtcbiAgICAgICAgcGFydCA9IG5ldyBDaGlsZFBhcnQoc3RhcnROb2RlLCBlbmROb2RlLCBjb250YWluZXJQYXJ0LCBjb250YWluZXJQYXJ0Lm9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZW5kTm9kZSA9IHdyYXAocGFydC5fJGVuZE5vZGUpLm5leHRTaWJsaW5nO1xuICAgICAgICBjb25zdCBvbGRQYXJlbnQgPSBwYXJ0Ll8kcGFyZW50O1xuICAgICAgICBjb25zdCBwYXJlbnRDaGFuZ2VkID0gb2xkUGFyZW50ICE9PSBjb250YWluZXJQYXJ0O1xuICAgICAgICBpZiAocGFyZW50Q2hhbmdlZCkge1xuICAgICAgICAgICAgcGFydC5fJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPy4oY29udGFpbmVyUGFydCk7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggYF8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXNgIHVwZGF0ZXMgdGhlIHBhcnQnc1xuICAgICAgICAgICAgLy8gYF8kcGFyZW50YCByZWZlcmVuY2UgYWZ0ZXIgdW5saW5raW5nIGZyb20gaXRzIGN1cnJlbnQgcGFyZW50LCB0aGF0XG4gICAgICAgICAgICAvLyBtZXRob2Qgb25seSBleGlzdHMgaWYgRGlzY29ubmVjdGFibGVzIGFyZSBwcmVzZW50LCBzbyB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0IGl0IGhlcmVcbiAgICAgICAgICAgIHBhcnQuXyRwYXJlbnQgPSBjb250YWluZXJQYXJ0O1xuICAgICAgICAgICAgLy8gU2luY2UgdGhlIF8kaXNDb25uZWN0ZWQgZ2V0dGVyIGlzIHNvbWV3aGF0IGNvc3RseSwgb25seVxuICAgICAgICAgICAgLy8gcmVhZCBpdCBvbmNlIHdlIGtub3cgdGhlIHN1YnRyZWUgaGFzIGRpcmVjdGl2ZXMgdGhhdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBiZSBub3RpZmllZFxuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb25TdGF0ZTtcbiAgICAgICAgICAgIGlmIChwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIChuZXdDb25uZWN0aW9uU3RhdGUgPSBjb250YWluZXJQYXJ0Ll8kaXNDb25uZWN0ZWQpICE9PVxuICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnQuXyRpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZChuZXdDb25uZWN0aW9uU3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmROb2RlICE9PSByZWZOb2RlIHx8IHBhcmVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gICAgICAgICAgICB3aGlsZSAoc3RhcnQgIT09IGVuZE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gd3JhcChzdGFydCkubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShzdGFydCwgcmVmTm9kZSk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0O1xufTtcbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBQYXJ0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gc2V0L3VwZGF0ZSB0aGUgdmFsdWUgb2YgdXNlci1jcmVhdGVkXG4gKiBwYXJ0cyAoaS5lLiB0aG9zZSBjcmVhdGVkIHVzaW5nIGBpbnNlcnRQYXJ0YCk7IGl0IHNob3VsZCBub3QgYmUgdXNlZFxuICogYnkgZGlyZWN0aXZlcyB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBkaXJlY3RpdmUncyBjb250YWluZXIgcGFydC4gRGlyZWN0aXZlc1xuICogc2hvdWxkIHJldHVybiBhIHZhbHVlIGZyb20gYHVwZGF0ZWAvYHJlbmRlcmAgdG8gdXBkYXRlIHRoZWlyIHBhcnQgc3RhdGUuXG4gKlxuICogRm9yIGRpcmVjdGl2ZXMgdGhhdCByZXF1aXJlIHNldHRpbmcgdGhlaXIgcGFydCB2YWx1ZSBhc3luY2hyb25vdXNseSwgdGhleVxuICogc2hvdWxkIGV4dGVuZCBgQXN5bmNEaXJlY3RpdmVgIGFuZCBjYWxsIGB0aGlzLnNldFZhbHVlKClgLlxuICpcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gc2V0XG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0XG4gKiBAcGFyYW0gaW5kZXggRm9yIGBBdHRyaWJ1dGVQYXJ0YHMsIHRoZSBpbmRleCB0byBzZXRcbiAqIEBwYXJhbSBkaXJlY3RpdmVQYXJlbnQgVXNlZCBpbnRlcm5hbGx5OyBzaG91bGQgbm90IGJlIHNldCBieSB1c2VyXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDaGlsZFBhcnRWYWx1ZSA9IChwYXJ0LCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50ID0gcGFydCkgPT4ge1xuICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgZGlyZWN0aXZlUGFyZW50KTtcbiAgICByZXR1cm4gcGFydDtcbn07XG4vLyBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgY2FuIG5ldmVyIGFwcGVhciBhcyBhIHBhcnQgdmFsdWUgZXhjZXB0IHdoZW4gc2V0IGJ5XG4vLyBsaXZlKCkuIFVzZWQgdG8gZm9yY2UgYSBkaXJ0eS1jaGVjayB0byBmYWlsIGFuZCBjYXVzZSBhIHJlLXJlbmRlci5cbmNvbnN0IFJFU0VUX1ZBTFVFID0ge307XG4vKipcbiAqIFNldHMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydCBkaXJlY3RseSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlXG4gKiBjb21taXQgc3RhZ2Ugb2YgdGhlIHBhcnQuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgYSBkaXJlY3RpdmUgbmVlZHMgdG8gdXBkYXRlIHRoZSBwYXJ0IHN1Y2hcbiAqIHRoYXQgdGhlIG5leHQgdXBkYXRlIGRldGVjdHMgYSB2YWx1ZSBjaGFuZ2Ugb3Igbm90LiBXaGVuIHZhbHVlIGlzIG9taXR0ZWQsXG4gKiB0aGUgbmV4dCB1cGRhdGUgd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIGRldGVjdGVkIGFzIGEgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENvbW1pdHRlZFZhbHVlID0gKHBhcnQsIHZhbHVlID0gUkVTRVRfVkFMVUUpID0+IChwYXJ0Ll8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydC5cbiAqXG4gKiBUaGUgY29tbWl0dGVkIHZhbHVlIGlzIHVzZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGVmZmljaWVudCB1cGRhdGVzIG9mXG4gKiB0aGUgcGFydC4gSXQgY2FuIGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHRlbXBsYXRlIG9yIGRpcmVjdGl2ZSBpblxuICogY2FzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIHZhbHVlIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21taXR0ZWQuXG4gKlxuICogLSBgVGVtcGxhdGVSZXN1bHRgcyBhcmUgY29tbWl0dGVkIGFzIGEgYFRlbXBsYXRlSW5zdGFuY2VgXG4gKiAtIEl0ZXJhYmxlcyBhcmUgY29tbWl0dGVkIGFzIGBBcnJheTxDaGlsZFBhcnQ+YFxuICogLSBBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbW1pdHRlZCBhcyB0aGUgdGVtcGxhdGUgdmFsdWUgb3IgdmFsdWUgcmV0dXJuZWQgb3JcbiAqICAgc2V0IGJ5IGEgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0KSA9PiBwYXJ0Ll8kY29tbWl0dGVkVmFsdWU7XG4vKipcbiAqIFJlbW92ZXMgYSBDaGlsZFBhcnQgZnJvbSB0aGUgRE9NLCBpbmNsdWRpbmcgYW55IG9mIGl0cyBjb250ZW50IGFuZCBtYXJrZXJzLlxuICpcbiAqIE5vdGU6IFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBjbGVhclBhcnQoKSBpcyB0aGF0IHRoaXMgYWxzb1xuICogcmVtb3ZlcyB0aGUgcGFydCdzIHN0YXJ0IG5vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgQ2hpbGRQYXJ0IG11c3Qgb3duIGl0c1xuICogc3RhcnQgbm9kZSwgaWUgaXQgbXVzdCBiZSBhIG1hcmtlciBub2RlIHNwZWNpZmljYWxseSBmb3IgdGhpcyBwYXJ0IGFuZCBub3QgYW5cbiAqIGFuY2hvciBmcm9tIHN1cnJvdW5kaW5nIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcnQgVGhlIFBhcnQgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQYXJ0ID0gKHBhcnQpID0+IHtcbiAgICBwYXJ0Ll8kY2xlYXIoKTtcbiAgICBwYXJ0Ll8kc3RhcnROb2RlLnJlbW92ZSgpO1xufTtcbmV4cG9ydCBjb25zdCBjbGVhclBhcnQgPSAocGFydCkgPT4ge1xuICAgIHBhcnQuXyRjbGVhcigpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcmVjdGl2ZS1oZWxwZXJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgaXNTaW5nbGVFeHByZXNzaW9uIH0gZnJvbSAnLi9kaXJlY3RpdmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIFBhcnRUeXBlIH0gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuY29uc3QgREVWX01PREUgPSB0cnVlO1xuLyoqXG4gKiBSZWN1cnNpdmVseSB3YWxrcyBkb3duIHRoZSB0cmVlIG9mIFBhcnRzL1RlbXBsYXRlSW5zdGFuY2VzL0RpcmVjdGl2ZXMgdG8gc2V0XG4gKiB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIGRpcmVjdGl2ZXMgYW5kIHJ1biBgZGlzY29ubmVjdGVkYC8gYHJlY29ubmVjdGVkYFxuICogY2FsbGJhY2tzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSB3ZXJlIGNoaWxkcmVuIHRvIGRpc2Nvbm5lY3Q7IGZhbHNlIG90aGVyd2lzZVxuICovXG5jb25zdCBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQgPSAocGFyZW50LCBpc0Nvbm5lY3RlZCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb2JqIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIC8vIFRoZSBleGlzdGVuY2Ugb2YgYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgIGlzIHVzZWQgYXMgYSBcImJyYW5kXCIgdG9cbiAgICAgICAgLy8gZGlzYW1iaWd1YXRlIEFzeW5jRGlyZWN0aXZlcyBmcm9tIG90aGVyIERpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5cbiAgICAgICAgLy8gKGFzIG9wcG9zZWQgdG8gdXNpbmcgYW4gaW5zdGFuY2VvZiBjaGVjayB0byBrbm93IHdoZW4gdG8gY2FsbCBpdCk7IHRoZVxuICAgICAgICAvLyByZWR1bmRhbmN5IG9mIFwiRGlyZWN0aXZlXCIgaW4gdGhlIEFQSSBuYW1lIGlzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGhcbiAgICAgICAgLy8gYF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWRgLCB3aGljaCBleGlzdHMgYENoaWxkUGFydHNgIHdoaWNoIGFyZSBhbHNvIGluXG4gICAgICAgIC8vIHRoaXMgbGlzdFxuICAgICAgICAvLyBEaXNjb25uZWN0IERpcmVjdGl2ZSAoYW5kIGFueSBuZXN0ZWQgZGlyZWN0aXZlcyBjb250YWluZWQgd2l0aGluKVxuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBvYmpbJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGlzQ29ubmVjdGVkLCBmYWxzZSk7XG4gICAgICAgIC8vIERpc2Nvbm5lY3QgUGFydC9UZW1wbGF0ZUluc3RhbmNlXG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZChvYmosIGlzQ29ubmVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIGl0cyBwYXJlbnQgbGlzdCBvZiBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiwgYW5kXG4gKiBpZiB0aGUgcGFyZW50IGxpc3QgYmVjb21lcyBlbXB0eSBhcyBhIHJlc3VsdCwgcmVtb3ZlcyB0aGUgcGFyZW50IGZyb20gaXRzXG4gKiBwYXJlbnQsIGFuZCBzbyBmb3J0aCB1cCB0aGUgdHJlZSB3aGVuIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgcGFyZW50IGxpc3RzIHRvXG4gKiBiZWNvbWUgZW1wdHkuXG4gKi9cbmNvbnN0IHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCA9IChvYmopID0+IHtcbiAgICBsZXQgcGFyZW50LCBjaGlsZHJlbjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgocGFyZW50ID0gb2JqLl8kcGFyZW50KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgICAgIGNoaWxkcmVuLmRlbGV0ZShvYmopO1xuICAgICAgICBvYmogPSBwYXJlbnQ7XG4gICAgfSB3aGlsZSAoY2hpbGRyZW4/LnNpemUgPT09IDApO1xufTtcbmNvbnN0IGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQgPSAob2JqKSA9PiB7XG4gICAgLy8gQ2xpbWIgdGhlIHBhcmVudCB0cmVlLCBjcmVhdGluZyBhIHNwYXJzZSB0cmVlIG9mIGNoaWxkcmVuIG5lZWRpbmdcbiAgICAvLyBkaXNjb25uZWN0aW9uXG4gICAgZm9yIChsZXQgcGFyZW50OyAocGFyZW50ID0gb2JqLl8kcGFyZW50KTsgb2JqID0gcGFyZW50KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgcmVhY2hlZCBhIHBhcmVudCB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhpcyBjaGlsZCwgd2VcbiAgICAgICAgICAgIC8vIGNhbiBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5hZGQob2JqKTtcbiAgICAgICAgaW5zdGFsbERpc2Nvbm5lY3RBUEkocGFyZW50KTtcbiAgICB9XG59O1xuLyoqXG4gKiBDaGFuZ2VzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBDaGlsZFBhcnQsIGFuZCB1cGRhdGVzIHRoZSBzcGFyc2UgdHJlZSBvZlxuICogRGlzY29ubmVjdGFibGUgY2hpbGRyZW4gYWNjb3JkaW5nbHkuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb21cbiAqIHRoZSBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgbW92ZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy5cbiAqL1xuZnVuY3Rpb24gcmVwYXJlbnREaXNjb25uZWN0YWJsZXMobmV3UGFyZW50KSB7XG4gICAgaWYgKHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICAgICAgICBhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IG5ld1BhcmVudDtcbiAgICB9XG59XG4vKipcbiAqIFNldHMgdGhlIGNvbm5lY3RlZCBzdGF0ZSBvbiBhbnkgZGlyZWN0aXZlcyBjb250YWluZWQgd2l0aGluIHRoZSBjb21taXR0ZWRcbiAqIHZhbHVlIG9mIHRoaXMgcGFydCAoaS5lLiB3aXRoaW4gYSBUZW1wbGF0ZUluc3RhbmNlIG9yIGl0ZXJhYmxlIG9mXG4gKiBDaGlsZFBhcnRzKSBhbmQgcnVucyB0aGVpciBgZGlzY29ubmVjdGVkYC9gcmVjb25uZWN0ZWRgcywgYXMgd2VsbCBhcyB3aXRoaW5cbiAqIGFueSBkaXJlY3RpdmVzIHN0b3JlZCBvbiB0aGUgQ2hpbGRQYXJ0ICh3aGVuIGB2YWx1ZU9ubHlgIGlzIGZhbHNlKS5cbiAqXG4gKiBgaXNDbGVhcmluZ1ZhbHVlYCBzaG91bGQgYmUgcGFzc2VkIGFzIGB0cnVlYCBvbiBhIHRvcC1sZXZlbCBwYXJ0IHRoYXQgaXNcbiAqIGNsZWFyaW5nIGl0c2VsZiwgYW5kIG5vdCBhcyBhIHJlc3VsdCBvZiByZWN1cnNpdmVseSBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXNcbiAqIGFzIHBhcnQgb2YgYSBgY2xlYXJgIG9wZXJhdGlvbiBoaWdoZXIgdXAgdGhlIHRyZWUuIFRoaXMgYm90aCBlbnN1cmVzIHRoYXQgYW55XG4gKiBkaXJlY3RpdmUgb24gdGhpcyBDaGlsZFBhcnQgdGhhdCBwcm9kdWNlZCBhIHZhbHVlIHRoYXQgY2F1c2VkIHRoZSBjbGVhclxuICogb3BlcmF0aW9uIGlzIG5vdCBkaXNjb25uZWN0ZWQsIGFuZCBhbHNvIHNlcnZlcyBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICogdG8gYXZvaWQgbmVlZGxlc3MgYm9va2tlZXBpbmcgd2hlbiBhIHN1YnRyZWUgaXMgZ29pbmcgYXdheTsgd2hlbiBjbGVhcmluZyBhXG4gKiBzdWJ0cmVlLCBvbmx5IHRoZSB0b3AtbW9zdCBwYXJ0IG5lZWQgdG8gcmVtb3ZlIGl0c2VsZiBmcm9tIHRoZSBwYXJlbnQuXG4gKlxuICogYGZyb21QYXJ0SW5kZXhgIGlzIHBhc3NlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgcGFydGlhbCBgX2NsZWFyYCBydW5uaW5nIGFzIGFcbiAqIHJlc3VsdCBvZiB0cnVuY2F0aW5nIGFuIGl0ZXJhYmxlLlxuICpcbiAqIE5vdGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydCBpbnN0YW5jZXMgYW5kIGNhbGxlZCBmcm9tIHRoZVxuICogY29yZSBjb2RlIHdoZW4gcGFydHMgYXJlIGNsZWFyZWQgb3IgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaXMgY2hhbmdlZCBieSB0aGVcbiAqIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIG5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQoaXNDb25uZWN0ZWQsIGlzQ2xlYXJpbmdWYWx1ZSA9IGZhbHNlLCBmcm9tUGFydEluZGV4ID0gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4uc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0NsZWFyaW5nVmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBJdGVyYWJsZSBjYXNlOiBBbnkgQ2hpbGRQYXJ0cyBjcmVhdGVkIGJ5IHRoZSBpdGVyYWJsZSBzaG91bGQgYmVcbiAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGVcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIChzdGFydGluZyBhdCBgZnJvbVBhcnRJbmRleGAgaW4gdGhlIGNhc2Ugb2YgdHJ1bmNhdGlvbilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBmcm9tUGFydEluZGV4OyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWVbaV0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRlbXBsYXRlSW5zdGFuY2UgY2FzZTogSWYgdGhlIHZhbHVlIGhhcyBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiAod2lsbFxuICAgICAgICAgICAgLy8gb25seSBiZSBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgVGVtcGxhdGVJbnN0YW5jZSksIHdlIGRpc2Nvbm5lY3QgaXRcbiAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgaXQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuXG4gICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh0aGlzLCBpc0Nvbm5lY3RlZCk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXRjaGVzIGRpc2Nvbm5lY3Rpb24gQVBJIG9udG8gQ2hpbGRQYXJ0cy5cbiAqL1xuY29uc3QgaW5zdGFsbERpc2Nvbm5lY3RBUEkgPSAob2JqKSA9PiB7XG4gICAgaWYgKG9iai50eXBlID09IFBhcnRUeXBlLkNISUxEKSB7XG4gICAgICAgIG9iai5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkID8/PVxuICAgICAgICAgICAgbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZDtcbiAgICAgICAgb2JqLl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMgPz89IHJlcGFyZW50RGlzY29ubmVjdGFibGVzO1xuICAgIH1cbn07XG4vKipcbiAqIEFuIGFic3RyYWN0IGBEaXJlY3RpdmVgIGJhc2UgY2xhc3Mgd2hvc2UgYGRpc2Nvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmVcbiAqIGNhbGxlZCB3aGVuIHRoZSBwYXJ0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSBpcyBjbGVhcmVkIGFzIGEgcmVzdWx0IG9mXG4gKiByZS1yZW5kZXJpbmcsIG9yIHdoZW4gdGhlIHVzZXIgY2FsbHMgYHBhcnQuc2V0Q29ubmVjdGVkKGZhbHNlKWAgb25cbiAqIGEgcGFydCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSAoYXMgaGFwcGVuc1xuICogd2hlbiBlLmcuIGEgTGl0RWxlbWVudCBkaXNjb25uZWN0cyBmcm9tIHRoZSBET00pLlxuICpcbiAqIElmIGBwYXJ0LnNldENvbm5lY3RlZCh0cnVlKWAgaXMgc3Vic2VxdWVudGx5IGNhbGxlZCBvbiBhXG4gKiBjb250YWluaW5nIHBhcnQsIHRoZSBkaXJlY3RpdmUncyBgcmVjb25uZWN0ZWRgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBwcmlvclxuICogdG8gaXRzIG5leHQgYHVwZGF0ZWAvYHJlbmRlcmAgY2FsbGJhY2tzLiBXaGVuIGltcGxlbWVudGluZyBgZGlzY29ubmVjdGVkYCxcbiAqIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHJlY29ubmVjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgdXBkYXRlcyBtYXkgb2NjdXIgd2hpbGUgdGhlIGRpcmVjdGl2ZSBpcyBkaXNjb25uZWN0ZWQuIEFzIHN1Y2gsXG4gKiBkaXJlY3RpdmVzIHNob3VsZCBnZW5lcmFsbHkgY2hlY2sgdGhlIGB0aGlzLmlzQ29ubmVjdGVkYCBmbGFnIGR1cmluZ1xuICogcmVuZGVyL3VwZGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzYWZlIHRvIHN1YnNjcmliZSB0byByZXNvdXJjZXNcbiAqIHRoYXQgbWF5IHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyBAaW50ZXJuYWxcbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHBhcnQgd2l0aCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgKiBAcGFyYW0gcGFydFxuICAgICAqIEBwYXJhbSBwYXJlbnRcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlSW5kZXhcbiAgICAgKi9cbiAgICBfJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCkge1xuICAgICAgICBzdXBlci5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBwYXJ0Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGZyb20gdGhlIGNvcmUgY29kZSB3aGVuIGEgZGlyZWN0aXZlIGlzIGdvaW5nIGF3YXkgZnJvbSBhIHBhcnQgKGluXG4gICAgICogd2hpY2ggY2FzZSBgc2hvdWxkUmVtb3ZlRnJvbVBhcmVudGAgc2hvdWxkIGJlIHRydWUpLCBhbmQgZnJvbSB0aGVcbiAgICAgKiBgc2V0Q2hpbGRyZW5Db25uZWN0ZWRgIGhlbHBlciBmdW5jdGlvbiB3aGVuIHJlY3Vyc2l2ZWx5IGNoYW5naW5nIHRoZVxuICAgICAqIGNvbm5lY3Rpb24gc3RhdGUgb2YgYSB0cmVlIChpbiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGRcbiAgICAgKiBiZSBmYWxzZSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNDb25uZWN0ZWRcbiAgICAgKiBAcGFyYW0gaXNDbGVhcmluZ0RpcmVjdGl2ZSAtIFRydWUgd2hlbiB0aGUgZGlyZWN0aXZlIGl0c2VsZiBpcyBiZWluZ1xuICAgICAqICAgICByZW1vdmVkOyBmYWxzZSB3aGVuIHRoZSB0cmVlIGlzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddKGlzQ29ubmVjdGVkLCBpc0NsZWFyaW5nRGlyZWN0aXZlID0gdHJ1ZSkge1xuICAgICAgICBpZiAoaXNDb25uZWN0ZWQgIT09IHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBpc0Nvbm5lY3RlZDtcbiAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0ZWQ/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQ/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NsZWFyaW5nRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgICAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBkaXJlY3RpdmUncyBQYXJ0IG91dHNpZGUgdGhlIG5vcm1hbCBgdXBkYXRlYC9gcmVuZGVyYFxuICAgICAqIGxpZmVjeWNsZSBvZiBhIGRpcmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgZnJvbSBhIGRpcmVjdGl2ZSdzIGB1cGRhdGVgXG4gICAgICogb3IgYHJlbmRlcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyZWN0aXZlIFRoZSBkaXJlY3RpdmUgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXRcbiAgICAgKi9cbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTaW5nbGVFeHByZXNzaW9uKHRoaXMuX19wYXJ0KSkge1xuICAgICAgICAgICAgdGhpcy5fX3BhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9fYXR0cmlidXRlSW5kZXggd2lsbCBiZSBkZWZpbmVkIGluIHRoaXMgY2FzZSwgYnV0XG4gICAgICAgICAgICAvLyBhc3NlcnQgaXQgaW4gZGV2IG1vZGVcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLl9fYXR0cmlidXRlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHRvIGJlIGEgbnVtYmVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBbLi4udGhpcy5fX3BhcnQuXyRjb21taXR0ZWRWYWx1ZV07XG4gICAgICAgICAgICBuZXdWYWx1ZXNbdGhpcy5fX2F0dHJpYnV0ZUluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fX3BhcnQuXyRzZXRWYWx1ZShuZXdWYWx1ZXMsIHRoaXMsIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXIgY2FsbGJhY2tzIGZvciBpbXBsZW1lbnRpbmcgbG9naWMgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzL3N1YnNjcmlwdGlvbnNcbiAgICAgKiB0aGF0IG1heSBoYXZlIGJlZW4gcmV0YWluZWQgYnkgdGhpcyBkaXJlY3RpdmUuIFNpbmNlIGRpcmVjdGl2ZXMgbWF5IGFsc28gYmVcbiAgICAgKiByZS1jb25uZWN0ZWQsIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcmVzdG9yZSB0aGVcbiAgICAgKiB3b3JraW5nIHN0YXRlIG9mIHRoZSBkaXJlY3RpdmUgcHJpb3IgdG8gdGhlIG5leHQgcmVuZGVyLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZCgpIHsgfVxuICAgIHJlY29ubmVjdGVkKCkgeyB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3luYy1kaXJlY3RpdmUuanMubWFwIiwiaW1wb3J0IHsgaHRtbCwgcmVuZGVyIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgaGF1bnRlZCBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgeyBtYWtlVmlydHVhbCB9IGZyb20gXCIuL3ZpcnR1YWxcIjtcbmNvbnN0IHsgY29tcG9uZW50LCBjcmVhdGVDb250ZXh0IH0gPSBoYXVudGVkKHsgcmVuZGVyIH0pO1xuY29uc3QgdmlydHVhbCA9IG1ha2VWaXJ0dWFsKCk7XG5leHBvcnQgeyBjb21wb25lbnQsIGNyZWF0ZUNvbnRleHQsIHZpcnR1YWwsIGh0bWwsIHJlbmRlciB9O1xuIiwiaW1wb3J0IHsgbWFrZUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgbWFrZUNvbnRleHQgfSBmcm9tIFwiLi9jcmVhdGUtY29udGV4dFwiO1xuZnVuY3Rpb24gaGF1bnRlZCh7IHJlbmRlciB9KSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbWFrZUNvbXBvbmVudChyZW5kZXIpO1xuICAgIGNvbnN0IGNyZWF0ZUNvbnRleHQgPSBtYWtlQ29udGV4dChjb21wb25lbnQpO1xuICAgIHJldHVybiB7IGNvbXBvbmVudCwgY3JlYXRlQ29udGV4dCB9O1xufVxuZXhwb3J0IHsgaGF1bnRlZCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tIFwiLi91c2UtY2FsbGJhY2tcIjtcbmV4cG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi91c2UtY29udHJvbGxlclwiO1xuZXhwb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcIi4vdXNlLWVmZmVjdFwiO1xuZXhwb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIi4vdXNlLWxheW91dC1lZmZlY3RcIjtcbmV4cG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcIi4vdXNlLXN0YXRlXCI7XG5leHBvcnQgeyB1c2VSZWR1Y2VyIH0gZnJvbSBcIi4vdXNlLXJlZHVjZXJcIjtcbmV4cG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwiLi91c2UtbWVtb1wiO1xuZXhwb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCIuL3VzZS1jb250ZXh0XCI7XG5leHBvcnQgeyB1c2VSZWYgfSBmcm9tIFwiLi91c2UtcmVmXCI7XG5leHBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuZXhwb3J0IHsgQmFzZVNjaGVkdWxlciB9IGZyb20gXCIuL3NjaGVkdWxlclwiO1xuZXhwb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuIiwiaW1wb3J0IHsgY29udGV4dEV2ZW50IH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCIuL3VzZS1jb250ZXh0XCI7XG5mdW5jdGlvbiBtYWtlQ29udGV4dChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gKGRlZmF1bHRWYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBDb250ZXh0ID0ge1xuICAgICAgICAgICAgUHJvdmlkZXI6IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycztcbiAgICAgICAgICAgICAgICBfdmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoY29udGV4dEV2ZW50LCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjb250ZXh0RXZlbnQsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWwuQ29udGV4dCA9PT0gQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbC51bnN1YnNjcmliZSA9IHRoaXMudW5zdWJzY3JpYmUuYmluZCh0aGlzLCBkZXRhaWwuY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGRldGFpbC5jYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQ29uc3VtZXI6IGNvbXBvbmVudChmdW5jdGlvbiAoeyByZW5kZXIgfSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbnRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBDb250ZXh0O1xuICAgIH07XG59XG5leHBvcnQgeyBtYWtlQ29udGV4dCB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyBub3RoaW5nIH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHsgZGlyZWN0aXZlLCBBc3luY0RpcmVjdGl2ZSB9IGZyb20gJy4uL2FzeW5jLWRpcmVjdGl2ZS5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVmIG9iamVjdCwgd2hpY2ggaXMgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmID0gKCkgPT4gbmV3IFJlZigpO1xuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHJlZiB2YWx1ZS5cbiAqL1xuY2xhc3MgUmVmIHtcbn1cbi8vIFdoZW4gY2FsbGJhY2tzIGFyZSB1c2VkIGZvciByZWZzLCB0aGlzIG1hcCB0cmFja3MgdGhlIGxhc3QgdmFsdWUgdGhlIGNhbGxiYWNrXG4vLyB3YXMgY2FsbGVkIHdpdGgsIGZvciBlbnN1cmluZyBhIGRpcmVjdGl2ZSBkb2Vzbid0IGNsZWFyIHRoZSByZWYgaWYgdGhlIHJlZlxuLy8gaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZCB0byBhIG5ldyBzcG90LiBJdCBpcyBkb3VibGUta2V5ZWQgb24gYm90aCB0aGVcbi8vIGNvbnRleHQgKGBvcHRpb25zLmhvc3RgKSBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhdXRvLWJpbmQgY2xhc3MgbWV0aG9kc1xuLy8gdG8gYG9wdGlvbnMuaG9zdGAuXG5jb25zdCBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG5jbGFzcyBSZWZEaXJlY3RpdmUgZXh0ZW5kcyBBc3luY0RpcmVjdGl2ZSB7XG4gICAgcmVuZGVyKF9yZWYpIHtcbiAgICAgICAgcmV0dXJuIG5vdGhpbmc7XG4gICAgfVxuICAgIHVwZGF0ZShwYXJ0LCBbcmVmXSkge1xuICAgICAgICBjb25zdCByZWZDaGFuZ2VkID0gcmVmICE9PSB0aGlzLl9yZWY7XG4gICAgICAgIGlmIChyZWZDaGFuZ2VkICYmIHRoaXMuX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBUaGUgcmVmIHBhc3NlZCB0byB0aGUgZGlyZWN0aXZlIGhhcyBjaGFuZ2VkO1xuICAgICAgICAgICAgLy8gdW5zZXQgdGhlIHByZXZpb3VzIHJlZidzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWZDaGFuZ2VkIHx8IHRoaXMuX2xhc3RFbGVtZW50Rm9yUmVmICE9PSB0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBXZSBlaXRoZXIgZ290IGEgbmV3IHJlZiBvciB0aGlzIGlzIHRoZSBmaXJzdCByZW5kZXI7XG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgcmVmL2VsZW1lbnQgJiB1cGRhdGUgdGhlIHJlZiB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5fcmVmID0gcmVmO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IHBhcnQub3B0aW9ucz8uaG9zdDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKCh0aGlzLl9lbGVtZW50ID0gcGFydC5lbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vdGhpbmc7XG4gICAgfVxuICAgIF91cGRhdGVSZWZWYWx1ZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3JlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcmVmIHdhcyBjYWxsZWQgd2l0aCBhIHByZXZpb3VzIHZhbHVlLCBjYWxsIHdpdGhcbiAgICAgICAgICAgIC8vIGB1bmRlZmluZWRgOyBXZSBkbyB0aGlzIHRvIGVuc3VyZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiBhIGNvbnNpc3RlbnRcbiAgICAgICAgICAgIC8vIHdheSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSByZWYgbWlnaHQgYmUgbW92aW5nIHVwIGluIHRoZSB0cmVlIChpblxuICAgICAgICAgICAgLy8gd2hpY2ggY2FzZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyB2YWx1ZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUgdW5zZXRzIGl0KSBhbmQgZG93biBpbiB0aGUgdHJlZSAod2hlcmUgaXQgd291bGQgYmUgdW5zZXRcbiAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyBzZXQpLiBOb3RlIHRoYXQgZWxlbWVudCBsb29rdXAgaXMga2V5ZWQgYnlcbiAgICAgICAgICAgIC8vIGJvdGggdGhlIGNvbnRleHQgYW5kIHRoZSBjYWxsYmFjaywgc2luY2Ugd2UgYWxsb3cgcGFzc2luZyB1bmJvdW5kXG4gICAgICAgICAgICAvLyBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIG9uIG9wdGlvbnMuaG9zdCwgYW5kIHdlIHdhbnQgdG8gdHJlYXRcbiAgICAgICAgICAgIC8vIHRoZXNlIGFzIHVuaXF1ZSBcImluc3RhbmNlc1wiIG9mIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fY29udGV4dCA/PyBnbG9iYWxUaGlzO1xuICAgICAgICAgICAgbGV0IGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPSBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjay5nZXQoY29udGV4dCk7XG4gICAgICAgICAgICBpZiAobGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2suc2V0KGNvbnRleHQsIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suZ2V0KHRoaXMuX3JlZikgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZi5jYWxsKHRoaXMuX2NvbnRleHQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0RWxlbWVudEZvckNhbGxiYWNrLnNldCh0aGlzLl9yZWYsIGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVmIHdpdGggdGhlIG5ldyBlbGVtZW50IHZhbHVlXG4gICAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYudmFsdWUgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBfbGFzdEVsZW1lbnRGb3JSZWYoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrXG4gICAgICAgICAgICAgICAgLmdldCh0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXMpXG4gICAgICAgICAgICAgICAgPy5nZXQodGhpcy5fcmVmKVxuICAgICAgICAgICAgOiB0aGlzLl9yZWY/LnZhbHVlO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGJveCBpZiBvdXIgZWxlbWVudCBpcyBzdGlsbCB0aGUgb25lIGluIGl0IChpLmUuIGFub3RoZXJcbiAgICAgICAgLy8gZGlyZWN0aXZlIGluc3RhbmNlIGhhc24ndCByZW5kZXJlZCBpdHMgZWxlbWVudCB0byBpdCBiZWZvcmUgdXMpOyB0aGF0XG4gICAgICAgIC8vIG9ubHkgaGFwcGVucyBpbiB0aGUgZXZlbnQgb2YgdGhlIGRpcmVjdGl2ZSBiZWluZyBjbGVhcmVkIChub3QgdmlhIG1hbnVhbFxuICAgICAgICAvLyBkaXNjb25uZWN0aW9uKVxuICAgICAgICBpZiAodGhpcy5fbGFzdEVsZW1lbnRGb3JSZWYgPT09IHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVjb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIElmIHdlIHdlcmUgbWFudWFsbHkgZGlzY29ubmVjdGVkLCB3ZSBjYW4gc2FmZWx5IHB1dCBvdXIgZWxlbWVudCBiYWNrIGluXG4gICAgICAgIC8vIHRoZSBib3gsIHNpbmNlIG5vIHJlbmRlcmluZyBjb3VsZCBoYXZlIG9jY3VycmVkIHRvIGNoYW5nZSBpdHMgc3RhdGVcbiAgICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodGhpcy5fZWxlbWVudCk7XG4gICAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFJlZiBvYmplY3Qgb3IgY2FsbHMgYSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgZWxlbWVudCBpdCdzXG4gKiBib3VuZCB0by5cbiAqXG4gKiBBIFJlZiBvYmplY3QgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC4gQSByZWZcbiAqIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlbGVtZW50IGFzIGl0cyBvbmx5IGFyZ3VtZW50LlxuICpcbiAqIFRoZSByZWYgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBSZWYgb2JqZWN0IG9yIGNhbGxzIHRoZSByZWYgY2FsbGJhY2tcbiAqIGR1cmluZyByZW5kZXJpbmcsIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgY2hhbmdlZC5cbiAqXG4gKiBOb3RlOiBJZiBhIHJlZiBjYWxsYmFjayBpcyByZW5kZXJlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50IHBvc2l0aW9uIG9yIGlzXG4gKiByZW1vdmVkIGluIGEgc3Vic2VxdWVudCByZW5kZXIsIGl0IHdpbGwgZmlyc3QgYmUgY2FsbGVkIHdpdGggYHVuZGVmaW5lZGAsXG4gKiBmb2xsb3dlZCBieSBhbm90aGVyIGNhbGwgd2l0aCB0aGUgbmV3IGVsZW1lbnQgaXQgd2FzIHJlbmRlcmVkIHRvIChpZiBhbnkpLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBVc2luZyBSZWYgb2JqZWN0XG4gKiBjb25zdCBpbnB1dFJlZiA9IGNyZWF0ZVJlZigpO1xuICogcmVuZGVyKGh0bWxgPGlucHV0ICR7cmVmKGlucHV0UmVmKX0+YCwgY29udGFpbmVyKTtcbiAqIGlucHV0UmVmLnZhbHVlLmZvY3VzKCk7XG4gKlxuICogLy8gVXNpbmcgY2FsbGJhY2tcbiAqIGNvbnN0IGNhbGxiYWNrID0gKGlucHV0RWxlbWVudCkgPT4gaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoY2FsbGJhY2spfT5gLCBjb250YWluZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCByZWYgPSBkaXJlY3RpdmUoUmVmRGlyZWN0aXZlKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZi5qcy5tYXAiLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdoYXVudGVkJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcblxuLy8gRGVib3VuY2UgVXRpbGl0eVxuY29uc3QgZGVib3VuY2UgPSAoZnVuYywgZGVsYXkpID0+IHtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCBkZWxheSk7XG4gIH07XG59O1xuXG4vLyAtLS0gQ29tcG9uZW50IERlZmluaXRpb24gLS0tXG5mdW5jdGlvbiBBdXRvY29tcGxldGVTZWxlY3QoeyBcbiAgZGlzYWJsZWQsIFxuICBvcHRpb25zTWV0YWRhdGEgPSB7fSxcbiAgb3B0aW9ucyA9IFtdLCBcbiAgbGFiZWwgPSAnU2VhcmNoJywgaW5wdXRWYWx1ZSA9ICcnLFxuICBwYWdlU2l6ZSA9IDI1LFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRJdGVtLCBzZXRTZWxlY3RlZEl0ZW1dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFthY3RpdmVJbmRleCwgc2V0QWN0aXZlSW5kZXhdID0gdXNlU3RhdGUoLTEpO1xuICBjb25zdCBbaXNMaXN0T3Blbiwgc2V0SXNMaXN0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpbnB1dEVsZW1lbnQsIHNldElucHV0RWxlbWVudF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5wdXRWYWx1ZSkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIH1cbiAgfSwgW2lucHV0VmFsdWVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgIHNjcm9sbFRvQWN0aXZlSXRlbShhY3RpdmVJbmRleCk7XG4gICAgfVxuICB9LCBbYWN0aXZlSW5kZXhdKVxuXG4gIGNvbnN0IHRyaWdnZXJQYXJlbnRGZXRjaCA9IChpbnB1dCwgcGFnZSA9IDEpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IGlucHV0IHx8ICcnO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2ZldGNoLXN1Z2dlc3Rpb25zJywgeyBcbiAgICAgIGRldGFpbDogeyBxdWVyeSwgcGFnZSwgcGFnZVNpemUgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBzZXRBY3RpdmVJbmRleCgtMSk7XG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSk7XG4gIH07XG5cbiAgY29uc3QgZGVib3VuY2VkRmV0Y2ggPSB1c2VNZW1vKCgpID0+IGRlYm91bmNlKHRyaWdnZXJQYXJlbnRGZXRjaCwgMzAwKSwgW10pO1xuXG4gIC8vIC0tLSBTZWxlY3Rpb24gTG9naWMgLS0tXG4gIGNvbnN0IHNlbGVjdEl0ZW0gPSAoaXRlbSkgPT4ge1xuICAgIHNldFNlbGVjdGVkSXRlbShpdGVtKTtcbiAgICBzZXRJc0xpc3RPcGVuKGZhbHNlKTtcbiAgICBzZXRDdXJyZW50UGFnZSgxKTtcbiAgICBpZiAoaW5wdXRFbGVtZW50KSBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpdGVtLXNlbGVjdGVkJywgeyBcbiAgICAgIGRldGFpbDogaXRlbSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dC1jaGFuZ2UnLCB7IFxuICAgICAgZGV0YWlsOiB7IHZhbHVlOiBpdGVtLmxhYmVsLCBpdGVtIH0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gIH07XG5cbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBvcHRpb25zTWV0YWRhdGE/LmxpbmtzPy5wcmV2O1xuICBjb25zdCBoYXNOZXh0UGFnZSA9IG9wdGlvbnNNZXRhZGF0YT8ubGlua3M/Lm5leHQ7XG5cbiAgY29uc3QgaGFuZGxlUHJldlBhZ2UgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChoYXNQcmV2UGFnZSkge1xuICAgICAgdHJpZ2dlclBhcmVudEZldGNoKGlucHV0VmFsdWUsIGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdCBoYW5kbGVOZXh0UGFnZSA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGhhc05leHRQYWdlKSB7XG4gICAgICB0cmlnZ2VyUGFyZW50RmV0Y2goaW5wdXRWYWx1ZSwgY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIC0tLSBIYW5kbGVycyAtLS1cbiAgY29uc3QgaGFuZGxlSW5wdXQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIHNldEN1cnJlbnRQYWdlKDEpO1xuICAgIFxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0LWNoYW5nZScsIHsgXG4gICAgICBkZXRhaWw6IHsgdmFsdWUsIGl0ZW06IG51bGwgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICBkZWJvdW5jZWRGZXRjaCh2YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggKyAxKSAlIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggLSAxICsgb3B0aW9ucy5sZW5ndGgpICUgb3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID49IDAgJiYgaXNMaXN0T3Blbikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZWxlY3RJdGVtKG9wdGlvbnNbYWN0aXZlSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHNldElzTGlzdE9wZW4oZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG5cbiAgICAvLyBTY3JvbGwgYWN0aXZlIGl0ZW0gaW50byB2aWV3XG4gIGNvbnN0IHNjcm9sbFRvQWN0aXZlSXRlbSA9IChpbmRleCkgPT4ge1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBET00gaGFzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC5hdXRvY29tcGxldGUtb3B0aW9uW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdYCk7XG4gICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICBhY3RpdmVJdGVtLnNjcm9sbEludG9WaWV3KHsgXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLCBcbiAgICAgICAgICBibG9jazogJ25lYXJlc3QnIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVCdXR0b25DbGljayA9ICgpID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFpc0xpc3RPcGVuO1xuICAgIHNldElzTGlzdE9wZW4obmV3U3RhdGUpO1xuICAgIGlmIChuZXdTdGF0ZSAmJiBpbnB1dEVsZW1lbnQpIHtcbiAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWdnZXN0aW9uQ2xpY2sgPSAoaXRlbSkgPT4ge1xuICAgIHNlbGVjdEl0ZW0oaXRlbSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIGZpZWxkc2V0LmdyaWQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICBnYXA6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtaW5wdXQge1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtdG9nZ2xlIHtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgcGFkZGluZzogMC41cmVtIDAuNzVyZW07XG4gICAgICAgIG1pbi13aWR0aDogM3JlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtZHJvcGRvd24ge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMTAwJTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBpY28tYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlcjogdmFyKC0tcGljby1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcGljby1ib3JkZXItcmFkaXVzKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMC4yNXJlbTtcbiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7XG4gICAgICAgIHotaW5kZXg6IDk5O1xuICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1waWNvLWJveC1zaGFkb3cpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbnMge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtb3B0aW9uIHtcbiAgICAgICAgcGFkZGluZzogMC43NXJlbSAxcmVtO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xcyBlYXNlO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb246aG92ZXIsXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXNlY29uZGFyeS1iYWNrZ3JvdW5kKTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb25bYXJpYS1zZWxlY3RlZD1cInRydWVcIl0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktYmFja2dyb3VuZCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktaW52ZXJzZSk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW0gMXJlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLWNhcmQtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS1waWNvLWJvcmRlci1yYWRpdXMpIHZhcigtLXBpY28tYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24tY29udHJvbHMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uIGJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC43NXJlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24gYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXNlbGVjdGVkIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+IFxuXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPiR7bGFiZWx9PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXdyYXBwZXJcIj5cbiAgICAgIDxmaWVsZHNldCBjbGFzcz1cImdyaWRcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWlucHV0XCIgXG4gICAgICAgICAgdHlwZT1cInRleHRcIiBcbiAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIiBcbiAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImJvdGhcIiBcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPSR7aXNMaXN0T3BlbiA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgYXJpYS1sYWJlbD0ke2xhYmVsfVxuICAgICAgICAgIC52YWx1ZT0ke2lucHV0VmFsdWV9XG4gICAgICAgICAgQGlucHV0PSR7aGFuZGxlSW5wdXR9XG4gICAgICAgICAgQGtleWRvd249JHtoYW5kbGVLZXlEb3dufVxuICAgICAgICAgIEBibHVyPSR7KCkgPT4gc2V0SXNMaXN0T3BlbihmYWxzZSl9XG4gICAgICAgICAgQGZvY3VzPSR7KCkgPT4gc2V0SXNMaXN0T3Blbih0cnVlKX1cbiAgICAgICAgICAke3JlZihzZXRJbnB1dEVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgIFxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS10b2dnbGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJUb2dnbGUgc3VnZ2VzdGlvbnMgbGlzdFwiIFxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9JHtpc0xpc3RPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ31cbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICBAY2xpY2s9JHtoYW5kbGVCdXR0b25DbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgIDxwb2x5Z29uIFxuICAgICAgICAgICAgICBjbGFzcz1cImFycm93XCIgXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIiBcbiAgICAgICAgICAgICAgZmlsbC1vcGFjaXR5PVwiMC43NVwiIFxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudGNvbG9yXCIgXG4gICAgICAgICAgICAgIHBvaW50cz1cIjMsNiAxNSw2IDksMTRcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKCR7aXNMaXN0T3BlbiA/ICcxODBkZWcnIDogJzBkZWcnfSk7IHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzO1wiXG4gICAgICAgICAgICA+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgICBcbiAgICAgICR7aXNMaXN0T3BlbiAmJiBvcHRpb25zLmxlbmd0aCA+IDAgPyBodG1sYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLWRyb3Bkb3duXCI+XG4gICAgICAgICAgPHVsIFxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIiBcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtsYWJlbH1cbiAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLW9wdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7b3B0aW9ucy5tYXAoKGl0ZW0sIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICA8bGkgXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD0ke2luZGV4ID09PSBhY3RpdmVJbmRleCA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgICAgICAgQG1vdXNlZG93bj0keyhlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGl0ZW0pOyB9fVxuICAgICAgICAgICAgICAgIEBtb3VzZW92ZXI9JHsoKSA9PiBzZXRBY3RpdmVJbmRleChpbmRleCl9XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtb3B0aW9uICR7aW5kZXggPT09IGFjdGl2ZUluZGV4ID8gJ2FjdGl2ZScgOiAnJ31cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgYCl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICBcbiAgICAgICAgICAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXMgPiBwYWdlU2l6ZSA/IGh0bWxgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZyAke29wdGlvbnNNZXRhZGF0YT8ucGFnZX0tJHtvcHRpb25zTWV0YWRhdGE/LnRvdGFsX3BhZ2VzfSBvZiAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXN9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZVByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc1ByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFByZXZpb3VzXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZU5leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc05leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgcGFnZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTmV4dFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICBgIDogJyd9XG4gICAgICBcbiAgICAgICR7c2VsZWN0ZWRJdGVtID8gaHRtbGA8c21hbGwgY2xhc3M9XCJhdXRvY29tcGxldGUtc2VsZWN0ZWRcIj5TZWxlY3RlZDogJHtzZWxlY3RlZEl0ZW0ubGFiZWx9PC9zbWFsbD5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgJ2Npdi1hdXRvY29tcGxldGUtc2VsZWN0JyxcbiAgY29tcG9uZW50KEF1dG9jb21wbGV0ZVNlbGVjdCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIFBlb3BsZUxpc3QoeyBsb2NhbCA9IFtdIH0pIHtcbiAgICBjb25zdCBwZW9wbGUgPSBsb2NhbDtcblxuICAgIGNvbnN0IGhhc1N1YmRpdmlzaW9uID0gKHBlcnNvbikgPT4ge1xuICAgICAgICBjb25zdCBkaXZpc2lvbk9jZGlkID0gcGVyc29uLm9mZmljZS5kaXZpc2lvbl9vY2RpZCB8fCBcIlwiO1xuICAgICAgICBpZiAoZGl2aXNpb25PY2RpZC5pbmNsdWRlcyhcImRpc3RyaWN0XCIpIHx8IGRpdmlzaW9uT2NkaWQuaW5jbHVkZXMoXCJ3YXJkXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3ViZGl2aXNpb25MYWJlbCA9IChwZXJzb24pID0+IHtcbiAgICAgICAgY29uc3QgZGl2aXNpb25PY2RpZCA9IHBlcnNvbi5vZmZpY2UuZGl2aXNpb25fb2NkaWQgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgcGFydHMgPSBkaXZpc2lvbk9jZGlkLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKFwiY291bmNpbF9kaXN0cmljdDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYERpc3RyaWN0ICR7cGFydC5zcGxpdChcIjpcIilbMV19YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5zdGFydHNXaXRoKFwid2FyZDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFdhcmQgJHtwYXJ0LnNwbGl0KFwiOlwiKVsxXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgY29uc3Qgc3ViRGl2aXNpb24gPSAocGVyc29uKSA9PiB7XG4gICAgICAgIGlmIChoYXNTdWJkaXZpc2lvbihwZXJzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0U3ViZGl2aXNpb25MYWJlbChwZXJzb24pfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0U291cmNlcyA9IChzb3VyY2VzKSA9PiB7XG4gICAgICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHNtYWxsPk5vIFNvdXJjZXM8L3NtYWxsPmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICAgICR7c291cmNlcy5tYXAoKHNvdXJjZSwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgIDxhIFxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgWyR7aW5kZXggKyAxfV1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfTtcblxuICAgIGlmICghcGVvcGxlIHx8IHBlb3BsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgPHAgcm9sZT1cImFsZXJ0XCI+Tm8gcGVvcGxlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGlzIGp1cmlzZGljdGlvbi48L3A+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICA8ZmlndXJlPlxuICAgICAgICA8dGFibGUgcm9sZT1cImdyaWRcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxJTtcIj5QaG90bzwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxNSU7XCI+T2ZmaWNpYWw8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTUlXCI+Q29udGFjdDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgJHtwZW9wbGUubWFwKHBlcnNvbiA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1sYWJlbD1cIlBob3RvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uY2RuX2ltYWdlIHx8IHBlcnNvbi5pbWFnZSA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIke3BlcnNvbi5jZG5faW1hZ2UgfHwgcGVyc29uLmltYWdlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiUGhvdG8gb2YgJHtwZXJzb24ubmFtZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgYm9yZGVyLXJhZGl1czogNTAlOyBvYmplY3QtZml0OiBjb3ZlcjtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yPVwidGhpcy5vbmVycm9yPW51bGw7IHRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xvc2VzdCgndGQnKS5xdWVyeVNlbGVjdG9yKCcuZmFsbGJhY2staWNvbicpLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhbGxiYWNrLWljb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHdpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7IGxpbmUtaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IpOyBjb2xvcjogdmFyKC0tcGljby1zZWNvbmRhcnktaG92ZXItY29sb3IpO1wiPvCfkaQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGh0bWxgPHNwYW4gY2xhc3M9XCJmYWxsYmFjay1pY29uXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4OyBsaW5lLWhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTsgY29sb3I6IHZhcigtLXBpY28tc2Vjb25kYXJ5LWhvdmVyLWNvbG9yKTsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPvCfkaQ8L3NwYW4+YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWxhYmVsPVwiT2ZmaWNpYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiR7cGVyc29uLm5hbWV9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+JHtwZXJzb24ub2ZmaWNlICYmIHBlcnNvbi5vZmZpY2UubmFtZX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPiR7c3ViRGl2aXNpb24ocGVyc29uKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtbGFiZWw9XCJDb250YWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uZW1haWxzID8gaHRtbGA8YSBocmVmPVwibWFpbHRvOiR7cGVyc29uLmVtYWlscy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5lbWFpbHMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24ucGhvbmVzID8gaHRtbGA8YSBocmVmPVwidGVsOiR7cGVyc29uLnBob25lcy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5waG9uZXMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24udXJscyA/IGh0bWxgPGEgaHJlZj1cIiR7cGVyc29uLnVybHMuam9pbignLCcpfVwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwic2Vjb25kYXJ5XCI+TGluazwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2ZpZ3VyZT5cbiAgICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXBlb3BsZS1saXN0XCIsXG4gIGNvbXBvbmVudChQZW9wbGVMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UsIG9ic2VydmVkQXR0cmlidXRlczogW10gfSlcbik7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHJlZiB9IGZyb20gXCJsaXQtaHRtbC9kaXJlY3RpdmVzL3JlZi5qc1wiO1xuXG5mdW5jdGlvbiBNb2RhbCh7XG4gIHRpdGxlID0gXCJcIixcbiAgY29udGVudCA9IG51bGwsIC8vIGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQgb3IgbnVsbFxuICBmb290ZXIgPSBudWxsLCAvLyBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0IG9yIG51bGxcbiAgbW9kYWxQcm9wcyA9IHt9LCAvLyB7IG9wZW4sIG9uQ2xvc2UsIG1vZGFsUmVmLCBjbG9zZU9uQmFja2Ryb3BDbGljayA9IHRydWUsIGFyaWFMYWJlbCB9XG59KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKEJvb2xlYW4obW9kYWxQcm9wcy5vcGVuKSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0T3BlbihCb29sZWFuKG1vZGFsUHJvcHMub3BlbikpO1xuICB9LCBbbW9kYWxQcm9wcy5vcGVuXSk7XG5cbiAgbGV0IGRpYWxvZ0VsID0gbnVsbDtcbiAgY29uc3Qgc2V0RGlhbG9nUmVmID0gKGVsKSA9PiB7XG4gICAgZGlhbG9nRWwgPSBlbDtcbiAgICAvLyBwcm9wYWdhdGUgdG8gYW55IHJlZiBwYXNzZWQgaW4gbW9kYWxQcm9wcyAoc3VwcG9ydHMgY2FsbGJhY2sgb3Igb2JqZWN0IHJlZilcbiAgICBpZiAoIW1vZGFsUHJvcHMubW9kYWxSZWYpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwiZnVuY3Rpb25cIikgbW9kYWxQcm9wcy5tb2RhbFJlZihlbCk7XG4gICAgZWxzZSBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwib2JqZWN0XCIpIG1vZGFsUHJvcHMubW9kYWxSZWYudmFsdWUgPSBlbDtcbiAgfTtcblxuICBjb25zdCBvbktleSA9IChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gZm9jdXMgdGhlIGRpYWxvZyBzbyBpdCByZWNlaXZlcyBrZXkgZXZlbnRzIHdoZW4gb3BlbmVkXG4gICAgaWYgKG9wZW4gJiYgZGlhbG9nRWwgJiYgdHlwZW9mIGRpYWxvZ0VsLmZvY3VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRpYWxvZ0VsLmZvY3VzKCk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuXG4gIGNvbnN0IGJhY2tkcm9wQ2xpY2sgPSAoZSkgPT4ge1xuICAgIGlmICghbW9kYWxQcm9wcy5jbG9zZU9uQmFja2Ryb3BDbGljayAmJiBtb2RhbFByb3BzLmNsb3NlT25CYWNrZHJvcENsaWNrICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBjbGljayBvbiBkaWFsb2cgKGNoaWxkKSBzaG91bGRuJ3QgY2xvc2U7IGNsaWNrIG9uIGJhY2tkcm9wIChkaWFsb2cgZWxlbWVudCkgc2hvdWxkXG4gICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LnRhZ05hbWUgJiYgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxkaWFsb2dcbiAgICAgID9vcGVuPSR7b3Blbn1cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgYXJpYS1sYWJlbD0ke21vZGFsUHJvcHMuYXJpYUxhYmVsIHx8IHRpdGxlIHx8IFwiTW9kYWxcIn1cbiAgICAgIEBjbGljaz0ke2JhY2tkcm9wQ2xpY2t9XG4gICAgICBAa2V5ZG93bj0ke29uS2V5fVxuICAgICAgJHtyZWYoc2V0RGlhbG9nUmVmKX1cbiAgICA+XG4gICAgICA8YXJ0aWNsZSBAY2xpY2s9JHsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0+XG4gICAgICAgICR7dGl0bGVcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxoZWFkZXI+XG4gICAgICAgICAgICAgICAgPGgyPiR7dGl0bGV9PC9oMj5cbiAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiBudWxsfVxuXG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICR7Zm9vdGVyXG4gICAgICAgICAgPyBodG1sYCA8Zm9vdGVyPiR7Zm9vdGVyfTwvZm9vdGVyPiBgXG4gICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICA8Zm9vdGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7bW9kYWxQcm9wcy5vbkNsb3NlfSBjbGFzcz1cInNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgYH1cbiAgICAgIDwvYXJ0aWNsZT5cbiAgICA8L2RpYWxvZz5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1tb2RhbFwiLFxuICBjb21wb25lbnQoTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IFwiLi4vYmFzaWMvbW9kYWwuanNcIjtcblxuY29uc3QgRFVNTVlfREFUQSA9IFtcbiAgeyBpZDogMSwgbmFtZTogXCJTY3JhcGUgSm9iIDFcIiwgc3RhdHVzOiBcIkNvbXBsZXRlZFwiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDFcIiwgZHVyYXRpb25faW5fczogMTIwLCBcbiAgICAgICAgc291cmNlX3VybHM6IFtcImh0dHBzOi8vZXhhbXBsZS5jb21cIiwgXCJodHRwczovL2V4YW1wbGUuY29tLzJcIl0sIHByb2dyZXNzOiAxMDAgfSxcbiAgeyBpZDogMiwgbmFtZTogXCJTY3JhcGUgSm9iIDJcIiwgc3RhdHVzOiBcIkluIFByb2dyZXNzXCIsIHN0YXJ0X2RhdGU6IFwiMjAyNC0wMS0wMlwiLCBkdXJhdGlvbl9pbl9zOiAxNTAsIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUub3JnXCJdLCBwcm9ncmVzczogNTAgfSxcbiAgeyBpZDogMywgbmFtZTogXCJTY3JhcGUgSm9iIDNcIiwgc3RhdHVzOiBcIkZhaWxlZFwiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDNcIiwgZHVyYXRpb25faW5fczogOTAsIHNvdXJjZV91cmxzOiBbXSwgcHJvZ3Jlc3M6IDAgfSxcbl07XG5cbmZ1bmN0aW9uIHJlbmRlclByb2dyZXNzQmFyKHByb2dyZXNzKSB7XG4gIGlmIChwcm9ncmVzcyA9PT0gMTAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgIDxwcm9ncmVzcyB2YWx1ZT0ke3Byb2dyZXNzID8/IDB9IG1heD1cIjEwMFwiPlxuICAgICAgICAke3Byb2dyZXNzID8/IDB9JVxuICAgICAgPC9wcm9ncmVzcz5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuZnVuY3Rpb24gU2NyYXBlSGlzdG9yeUxpc3QoeyBoaXN0b3J5LCBqb2JTdGF0dXMgfSkge1xuICAvLyBVc2UgaGlzdG9yeSBhcyBhbiBvYmplY3QvYXJyYXkgZGlyZWN0bHkgKG5vIHBhcnNpbmcgaWYgcGFzc2VkIGFzIHByb3BlcnR5KVxuICBjb25zdCBoaXN0b3J5RGF0YSA9IEpTT04ucGFyc2UoaGlzdG9yeSlcbiAgbGV0IHBhcnNlZEhpc3RvcnkgPSBoaXN0b3J5RGF0YVtcImRhdGFcIl1cblxuICAvLyBJZiBqb2JTdGF0dXMgaXMgcHJlc2VudCBhbmQgbWF0Y2hlcyBhIGpvYiwgdXBkYXRlIHRoYXQgam9iJ3MgcHJvZ3Jlc3Mvc3RhdHVzXG4gIGlmIChqb2JTdGF0dXMgJiYgam9iU3RhdHVzLnJlcXVlc3RfaWQpIHtcbiAgICBwYXJzZWRIaXN0b3J5ID0gcGFyc2VkSGlzdG9yeS5tYXAoam9iID0+XG4gICAgICBqb2IucmVxdWVzdF9pZCA9PT0gam9iU3RhdHVzLnJlcXVlc3RfaWRcbiAgICAgICAgPyB7IC4uLmpvYiwgcHJvZ3Jlc3M6IGpvYlN0YXR1cy5wcm9ncmVzcywgc3RhdHVzOiBqb2JTdGF0dXMuc3RhdHVzIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW21vZGFsT3Blbiwgc2V0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkSm9iLCBzZXRTZWxlY3RlZEpvYl0gPSB1c2VTdGF0ZShudWxsKTtcblxuICBjb25zdCBvcGVuRm9yID0gKGpvYikgPT4ge1xuICAgIHNldFNlbGVjdGVkSm9iKGpvYik7XG4gICAgc2V0TW9kYWxPcGVuKHRydWUpO1xuICB9O1xuICBjb25zdCBjbG9zZU1vZGFsID0gKCkgPT4ge1xuICAgIHNldE1vZGFsT3BlbihmYWxzZSk7XG4gICAgc2V0U2VsZWN0ZWRKb2IobnVsbCk7XG4gIH07XG5cbiAgY29uc3QgZm10RGF0ZSA9IChkKSA9PiB7XG4gICAgaWYgKCFkKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwID0gbmV3IERhdGUoZCk7XG4gICAgaWYgKGlzTmFOKHApKSByZXR1cm4gU3RyaW5nKGQpO1xuICAgIHJldHVybiBgJHtTdHJpbmcocC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpfS8ke1N0cmluZyhwLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpfS8ke3AuZ2V0RnVsbFllYXIoKX1gO1xuICB9O1xuXG4gIGNvbnN0IGdldER1cmF0aW9uU3RyaW5nID0gKGNyZWF0ZWRfYXQsIHVwZGF0ZWRfYXQpID0+IHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IChuZXcgRGF0ZSh1cGRhdGVkX2F0KSAtIG5ldyBEYXRlKGNyZWF0ZWRfYXQpKSAvIDEwMDA7XG4gICAgLy8gRnJpZW5kbHkgZm9ybWF0dGluZyB0byBtaW51dGVzLCBzZWNvbmRzIHJvdW5kZWRcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChkdXJhdGlvbiAlIDYwKTtcbiAgICByZXR1cm4gYCR7bWludXRlc31tICR7c2Vjb25kc31zYDtcbiAgfVxuXG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IHNlbGVjdGVkSm9iXG4gICAgPyBodG1sYDxkaXY+XG4gICAgICAgIDxwPjxzdHJvbmc+RGF0ZSAvIFRpbWU6PC9zdHJvbmc+ICR7Zm10RGF0ZShzZWxlY3RlZEpvYi5jcmVhdGVkX2F0KX08L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiAke3NlbGVjdGVkSm9iLnN0YXR1c308L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+UHJvZ3Jlc3M6PC9zdHJvbmc+ICR7c2VsZWN0ZWRKb2IucHJvZ3Jlc3MgPz8gXCI/XCJ9JTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5UaW1lIHRvIHNjcmFwZTo8L3N0cm9uZz4gJHtnZXREdXJhdGlvblN0cmluZyhzZWxlY3RlZEpvYi5jcmVhdGVkX2F0LCBzZWxlY3RlZEpvYi51cGRhdGVkX2F0KX08L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+VVJMcyBzY3JhcGVkOjwvc3Ryb25nPjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgICR7c2VsZWN0ZWRKb2Iuc291cmNlX3VybHMgJiYgc2VsZWN0ZWRKb2Iuc291cmNlX3VybHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEpvYi5zb3VyY2VfdXJscy5tYXAoKHVybCkgPT4gaHRtbGA8bGk+PGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHt1cmx9PC9hPjwvbGk+YClcbiAgICAgICAgICAgIDogaHRtbGA8bGk+PGVtPk5vIHNvdXJjZSBVUkxzPC9lbT48L2xpPmB9XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5gXG4gICAgOiBudWxsO1xuXG4gIGlmICghcGFyc2VkSGlzdG9yeSB8fCBwYXJzZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBodG1sYDxwPk5vIHNjcmFwZSBoaXN0b3J5IGF2YWlsYWJsZS48L3A+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIHVsLmxpc3QgeyBcbiAgICAgICAgcGFkZGluZzogMDsgXG4gICAgICAgIG1hcmdpbjogMDsgXG4gICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OyAvKiBTZXQgeW91ciBkZXNpcmVkIG1heCBoZWlnaHQgKi9cbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsgIC8qIEVuYWJsZSB2ZXJ0aWNhbCBzY3JvbGxpbmcgKi9cbiAgICAgICAgcGFkZGluZy1yaWdodDogMXJlbTsgLyogQWRkIHNwYWNlIGJldHdlZW4gc2Nyb2xsYmFyIGFuZCBjb250ZW50ICovXG4gICAgICB9XG4gICAgICB1bCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgfVxuICAgICAgLml0ZW0geyBwYWRkaW5nOiAwLjVyZW0gMDsgfVxuICAgICAgLnJvdyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGdhcDogMC43NXJlbTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuICAgICAgLmJ0biB7IGFsbDogdW5zZXQ7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuICAgICAgLnBpbGwgeyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTsgYm9yZGVyLXJhZGl1czogOTk5cHg7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4wNCk7IGZvbnQtc2l6ZTogMC45cmVtOyB9XG4gICAgICAucGlsbC5jb21wbGV0ZWQgeyBiYWNrZ3JvdW5kOiAjZTZmOWVhOyBjb2xvcjogIzExN2EyZDsgfVxuICAgICAgLnBpbGwuaW4tcHJvZ3Jlc3MgeyBiYWNrZ3JvdW5kOiAjZmZmN2U2OyBjb2xvcjogIzk5NjYwYjsgfVxuICAgICAgLnBpbGwuZmFpbGVkIHsgYmFja2dyb3VuZDogI2ZmZWNlYzsgY29sb3I6ICM5YjFmMWY7IH1cbiAgICAgIC5wcm9ncmVzcy1iYXItY29udGFpbmVyIHsgbWFyZ2luLXRvcDogMC41cmVtOyB9XG4gICAgICBwcm9ncmVzcyB7IHdpZHRoOiAxMDAlOyB9XG4gICAgPC9zdHlsZT5cblxuICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICR7cGFyc2VkSGlzdG9yeS5tYXAoXG4gICAgICAgIChqb2IpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDbGFzcyA9IGpvYi5zdGF0dXMgPyBqb2Iuc3RhdHVzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIi1cIikgOiBcIlwiO1xuICAgICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiaXRlbVwiPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBAY2xpY2s9JHsoKSA9PiBvcGVuRm9yKGpvYil9PlxuICAgICAgICAgICAgICAgICAgJHtmbXREYXRlKGpvYi5jcmVhdGVkX2F0KX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPVwicGlsbCAke3N0YXR1c0NsYXNzfVwiPiR7am9iLnN0YXR1c308L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAke3JlbmRlclByb2dyZXNzQmFyKGpvYi5wcm9ncmVzcyl9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICl9XG4gICAgPC91bD5cblxuICAgIDxociAvPlxuXG4gICAgPGNpdi1tb2RhbFxuICAgICAgLnRpdGxlPSR7XCJTY3JhcGUgRGV0YWlsc1wifVxuICAgICAgLmNvbnRlbnQ9JHttb2RhbENvbnRlbnR9XG4gICAgICAubW9kYWxQcm9wcz0ke3sgb3BlbjogbW9kYWxPcGVuLCBvbkNsb3NlOiBjbG9zZU1vZGFsLCBjbG9zZU9uQmFja2Ryb3BDbGljazogdHJ1ZSB9fVxuICAgID48L2Npdi1tb2RhbD5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwiY2l2LXNjcmFwZS1oaXN0b3J5LWxpc3RcIiwgY29tcG9uZW50KFNjcmFwZUhpc3RvcnlMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSkpOyIsImltcG9ydCB7IGNvbXBvbmVudCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmNvbnN0IER1bW15U2NyYXBlSm9iSW5mbyA9IHtcbiAgICBjcmVhdGVkX2F0OiBcIjIwMjQtMDYtMDFUMTI6MDA6MDBaXCIsXG4gICAgc3RhdHVzOiBcIkFjY2VwdGVkXCIsXG4gICAgZHVyYXRpb25faW5fczogMzYwLFxuICAgIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiaHR0cHM6Ly9leGFtcGxlLm9yZ1wiXSxcbn1cblxuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oc2Vjb25kcykge1xuICAgIGlmIChzZWNvbmRzID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xuICAgIGNvbnN0IHMgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaCA/IGAke2h9aGAgOiBudWxsLFxuICAgICAgICBtID8gYCR7bX1tYCA6IG51bGwsXG4gICAgICAgIGAke3N9c2BcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbn1cblxuZnVuY3Rpb24gU2NyYXBlRGV0YWlscyh7IGRldGFpbCA9IER1bW15U2NyYXBlSm9iSW5mbyB9KSB7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gZGV0YWlsPy5jcmVhdGVkX2F0ID8gbmV3IERhdGUoZGV0YWlsLmNyZWF0ZWRfYXQpIDogbnVsbDtcbiAgICBjb25zdCBmb3JtYXR0ZWRDcmVhdGVkQXQgPSBjcmVhdGVkQXQgPyBjcmVhdGVkQXQudG9Mb2NhbGVTdHJpbmcoKSA6IFwiXCI7XG4gICAgY29uc3QgZHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbihkZXRhaWw/LmR1cmF0aW9uX2luX3MpO1xuICAgIGNvbnN0IHVybHMgPSBkZXRhaWw/LnNvdXJjZV91cmxzIHx8IFtdO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPGFydGljbGUgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgIDxmb3JtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxzcGFuPkRhdGUgLyBUaW1lPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2Zvcm1hdHRlZENyZWF0ZWRBdH1cIiByZWFkb25seSAvPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZGV0YWlsPy5zdGF0dXMgfHwgXCJcIn1cIiByZWFkb25seSAvPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8c3Bhbj5UaW1lIHRvIHNjcmFwZTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtkdXJhdGlvbn0ke2RldGFpbD8uZHVyYXRpb25faW5fcyAhPSBudWxsID8gYCAoJHtkZXRhaWwuZHVyYXRpb25faW5fc31zKWAgOiBcIlwifVwiIHJlYWRvbmx5IC8+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgPGg0PlVSTHMgc2NyYXBlZDwvaDQ+XG4gICAgICAgICAgJHt1cmxzLmxlbmd0aFxuICAgICAgICAgICAgPyBodG1sYDx1bD5cbiAgICAgICAgICAgICAgICAke3VybHMubWFwKFxuICAgICAgICAgICAgICAgICAgdSA9PiBodG1sYDxsaT48YSBocmVmPVwiJHt1fVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHt1fTwvYT48L2xpPmBcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPmBcbiAgICAgICAgICAgIDogaHRtbGA8cD48ZW0+Tm8gc291cmNlIFVSTHM8L2VtPjwvcD5gfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9hcnRpY2xlPlxuICAgIGBcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzY3JhcGUtZGV0YWlscycsIGNvbXBvbmVudChTY3JhcGVEZXRhaWxzKSk7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VSZWZ9ICBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBDaXZTZWxlY3RKdXJpc2RpY3Rpb24oKSB7XG4gIGNvbnN0IFtzdGF0ZXMsIHNldFN0YXRlc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtqdXJpc2RpY3Rpb25zLCBzZXRKdXJpc2RpY3Rpb25zXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2p1cmlzZGljdGlvbnNNZXRhZGF0YSwgc2V0SnVyaXNkaWN0aW9uc01ldGFkYXRhXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW3NlbGVjdGVkU3RhdGUsIHNldFNlbGVjdGVkU3RhdGVdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtzZWxlY3RlZEp1cmlzZGljdGlvbiwgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25dID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtqdXJpc2RpY3Rpb25JbnB1dFZhbHVlLCBzZXRKdXJpc2RpY3Rpb25JbnB1dFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIGNvbnN0IGlzSW5pdGlhbE1vdW50ID0gdXNlUmVmKHRydWUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzSW5pdGlhbE1vdW50LmN1cnJlbnQpIHtcbiAgICAgIGlzSW5pdGlhbE1vdW50LmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjsgXG4gICAgfVxuICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgd2l0aCB0aGUgY3VycmVudCBzZWxlY3Rpb25zXG4gICAgaGFuZGxlSW5wdXRDaGFuZ2Uoc2VsZWN0ZWRTdGF0ZSwgc2VsZWN0ZWRKdXJpc2RpY3Rpb24pO1xuICB9LCBbc2VsZWN0ZWRTdGF0ZSwgc2VsZWN0ZWRKdXJpc2RpY3Rpb25dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gRmV0Y2ggc3RhdGVzIGZyb20gYmFja2VuZCBwcm94eSAobm8gYXV0aCBoZWFkZXIgbmVlZGVkKVxuICAgIGZldGNoKFwiL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucy9zdGF0ZXNcIilcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4gc2V0U3RhdGVzKGRhdGEuZGF0YSB8fCBbXSkpO1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRKdXJpc2RpY3Rpb25zKFtdKTtcbiAgICBzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEoe30pO1xuICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKFwiXCIpO1xuICAgIHNldEp1cmlzZGljdGlvbklucHV0VmFsdWUoXCJcIik7XG5cbiAgICBpZiAoIXNlbGVjdGVkU3RhdGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBGZXRjaCBqdXJpc2RpY3Rpb25zIGZvciBzZWxlY3RlZCBzdGF0ZSAobm8gYXV0aCBoZWFkZXIgbmVlZGVkKVxuICAgIGhhbmRsZUp1cmlzZGljdGlvblN1Z2dlc3Rpb25zKFwiXCIpO1xuICB9LCBbc2VsZWN0ZWRTdGF0ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKHN0YXRlLCBqdXJpc2RpY3Rpb25PY2RpZCkgPT4ge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudChcInNlbGVjdC1qdXJpc2RpY3Rpb24tY2hhbmdlXCIsIHtcbiAgICAgICAgZGV0YWlsOiB7IHN0YXRlLCBqdXJpc2RpY3Rpb25fb2NkaWQ6IGp1cmlzZGljdGlvbk9jZGlkIH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlSnVyaXNkaWN0aW9uU3VnZ2VzdGlvbnMgPSAoZGV0YWlsKSA9PiB7XG4gICAgY29uc3QgcXVlcnkgPSBkZXRhaWwucXVlcnkgfHwgXCJcIjtcbiAgICBjb25zdCBwYWdlID0gZGV0YWlsLnBhZ2UgfHwgMTtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IGRldGFpbC5wYWdlU2l6ZSB8fCAyNTtcbiAgICBmZXRjaChgL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucy8ke3NlbGVjdGVkU3RhdGV9L3NlYXJjaD9zZWFyY2hfc3RyaW5nPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0mbGltaXQ9JHtwYWdlU2l6ZX0mcGFnZT0ke3BhZ2V9YClcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRKdXJpc2RpY3Rpb25zKGRhdGEuZGF0YSB8fCBbXSk7XG4gICAgICAgIHNldEp1cmlzZGljdGlvbnNNZXRhZGF0YSh7XG4gICAgICAgICAgdG90YWxfaXRlbXM6IGRhdGEudG90YWxfaXRlbXMsXG4gICAgICAgICAgdG90YWxfcGFnZXM6IGRhdGEudG90YWxfcGFnZXMsXG4gICAgICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgICAgIGxpbWl0OiBkYXRhLmxpbWl0LFxuICAgICAgICAgIGxpbmtzOiBkYXRhLmxpbmtzXG4gICAgICAgIH0pXG4gICAgICB9KTsgXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdWJtaXRDbGljayA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QganVyaXNkaWN0aW9uX2RhdGEgPSBqdXJpc2RpY3Rpb25zLmZpbmQoanVyID0+IGp1ci5pZCA9PT0gc2VsZWN0ZWRKdXJpc2RpY3Rpb24pO1xuICAgIGNvbnN0IGp1cmlzZGljdGlvbl9vY2RpZF9zbHVnID0ganVyaXNkaWN0aW9uX2RhdGFbXCJqdXJpc2RpY3Rpb25fb2NkaWRfc2x1Z1wiXTtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvanVyaXNkaWN0aW9ucy8ke2p1cmlzZGljdGlvbl9vY2RpZF9zbHVnfWA7XG4gIH1cblxuICBjb25zdCBqdXJpc2RpY3Rpb25MaW5rID0gKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRKdXJpc2RpY3Rpb24pIHJldHVybiBcIlwiO1xuICAgIGlmICghanVyaXNkaWN0aW9ucykgcmV0dXJuIFwiXCI7XG5cbiAgICBjb25zdCBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA9IGVuY29kZVVSSUNvbXBvbmVudChzZWxlY3RlZEp1cmlzZGljdGlvbilcbiAgICByZXR1cm4ganVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWQgPyBgL2p1cmlzZGljdGlvbnM/anVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWR9YCA6IFwiXCI7XG4gIH1cblxuICByZXR1cm4gaHRtbGBcbiAgICA8Zm9ybSBcbiAgICAgIGNsYXNzPVwiZ3JpZFwiIFxuICAgICAgc3R5bGU9XCJncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmcjsgZ2FwOiAxcmVtO1wiXG4gICAgICBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIlxuICAgID5cbiAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZS1zZWxlY3RcIiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlN0YXRlOjwvbGFiZWw+XG4gICAgICA8c2VsZWN0XG4gICAgICAgIGlkPVwic3RhdGUtc2VsZWN0XCJcbiAgICAgICAgLnZhbHVlPSR7c2VsZWN0ZWRTdGF0ZX1cbiAgICAgICAgQGNoYW5nZT0keyhlKSA9PiBzZXRTZWxlY3RlZFN0YXRlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgcmVxdWlyZWRcbiAgICAgID5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBhIHN0YXRlPC9vcHRpb24+XG4gICAgICAgICR7c3RhdGVzLm1hcChcbiAgICAgICAgICAoc3RhdGUpID0+IGh0bWxgPG9wdGlvbiB2YWx1ZT0ke3N0YXRlfT4ke3N0YXRlfTwvb3B0aW9uPmBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuICAgICAgPGNpdi1hdXRvY29tcGxldGUtc2VsZWN0XG4gICAgICAgIGlkPVwianVyaXNkaWN0aW9uLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgIC5kaXNhYmxlZD0keyFzZWxlY3RlZFN0YXRlfVxuICAgICAgICAuaW5wdXRWYWx1ZT0ke2p1cmlzZGljdGlvbklucHV0VmFsdWV9XG4gICAgICAgIC5vcHRpb25zPSR7anVyaXNkaWN0aW9ucy5tYXAoanVyID0+ICh7IGxhYmVsOiBqdXIubmFtZSwgdmFsdWU6IGp1ci5pZCB9KSl9XG4gICAgICAgIC5vcHRpb25zTWV0YWRhdGE9JHtqdXJpc2RpY3Rpb25zTWV0YWRhdGF9XG4gICAgICAgIC5wYWdlU2l6ZT0kezI1fVxuICAgICAgICBAZmV0Y2gtc3VnZ2VzdGlvbnM9JHsoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGUuZGV0YWlsO1xuICAgICAgICAgIGhhbmRsZUp1cmlzZGljdGlvblN1Z2dlc3Rpb25zKGRldGFpbCk7XG4gICAgICAgIH19XG4gICAgICAgIEBpbnB1dC1jaGFuZ2U9JHsoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHt2YWx1ZSwgaXRlbX0gPSBlLmRldGFpbDtcbiAgICAgICAgICBzZXRKdXJpc2RpY3Rpb25JbnB1dFZhbHVlKHZhbHVlKVxuICAgICAgICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKGl0ZW0gPyBpdGVtLnZhbHVlIDogXCJcIik7XG4gICAgICAgIH19XG4gICAgICAgIEBpdGVtLXNlbGVjdGVkPSR7KGUpID0+IHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKGUuZGV0YWlsLnZhbHVlKX1cbiAgICAgID48L2Npdi1hdXRvY29tcGxldGUtc2VsZWN0PlxuICAgICAgPCEtLSBjb21tZW50IG91dCBzdWJtaXQgYnV0dG9uIGZvciBub3cuXG4gICAgICA8YnV0dG9uIFxuICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgIEBjbGljaz0ke2hhbmRsZVN1Ym1pdENsaWNrfSBcbiAgICAgICAgP2Rpc2FibGVkPSR7IXNlbGVjdGVkSnVyaXNkaWN0aW9ufT5TdWJtaXQ8L2J1dHRvbj5cbiAgICAgIC0tPlxuICAgICAgPGEgaHJlZj1cIiR7anVyaXNkaWN0aW9uTGluaygpfVwiID9oaWRkZW49JHshc2VsZWN0ZWRKdXJpc2RpY3Rpb259PlxuICAgICAgICBHbyB0byBqdXJpc2RpY3Rpb24gcGFnZVxuICAgICAgPC9hPlxuICAgIDwvZm9ybT5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1zZWxlY3QtanVyaXNkaWN0aW9uXCIsXG4gIGNvbXBvbmVudChDaXZTZWxlY3RKdXJpc2RpY3Rpb24sIHsgdXNlU2hhZG93RE9NOiBmYWxzZSwgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBbXSB9KVxuKTtcblxuXG4iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcIi4vdXNlLW1lbW9cIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gICAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlLFxuICAgIH0pLCBbXSk7XG59XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBTZWFyY2hKdXJpc2RpY3Rpb25zKCkge1xuICBjb25zdCBbc2VsZWN0ZWRTdGF0ZSwgc2V0U2VsZWN0ZWRTdGF0ZV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3NlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQsIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRdID1cbiAgICB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3Blb3BsZSwgc2V0UGVvcGxlXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2dlb2pzb24sIHNldEdlb2pzb25dID0gdXNlU3RhdGUoW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkRW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIHNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQsXG4gICAgKTtcblxuICAgIGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L3Blb3BsZT9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkRW5jb2RlZH1gLFxuICAgIClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgc2V0UGVvcGxlKGRhdGEuZGF0YSk7XG4gICAgICB9KTtcbiAgfSwgW3NlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRdKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlLCBqdXJpc2RpY3Rpb25fb2NkaWQgfSA9IGV2ZW50LmRldGFpbDtcbiAgICBjb25zb2xlLmxvZyhcIlNlbGVjdGVkIFN0YXRlOlwiLCBzdGF0ZSk7XG4gICAgc2V0U2VsZWN0ZWRTdGF0ZShzdGF0ZSk7XG4gICAgLy8gVE9ETzogcGFuIHRoZSBtYXAgaWYgc3RhdGUgYnV0IG5vIGp1cmlzZGljdGlvblxuICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgSnVyaXNkaWN0aW9uOlwiLCBqdXJpc2RpY3Rpb25fb2NkaWQpO1xuICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQoanVyaXNkaWN0aW9uX29jZGlkKTtcbiAgICAvLyBUT0RPOiBwYW4gdGhlIG1hcCAmIHpvb20gaWYgc3RhdGUgYW5kIGp1cmlzZGljdGlvblxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1hcENoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgbGF0bG5nLCB6b29tIH0gPSBldmVudC5kZXRhaWw7XG4gICAgaWYgKCFsYXRsbmcgfHwgIXpvb20pIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyhcIk1hcCBDaGFuZ2UgLSBMYXRMbmc6XCIsIGxhdGxuZywgXCJab29tOlwiLCB6b29tKTtcbiAgICBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9qdXJpc2RpY3Rpb25zL2dlb2pzb24/bGF0PSR7bGF0bG5nLmxhdH0mbG9uZz0ke2xhdGxuZy5sbmd9Jnpvb209JHt6b29tfWAsXG4gICAgKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRHZW9qc29uKGRhdGEpO1xuICAgICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMnJlbTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGNpdi1tYXBcbiAgICAgICAgICAgIEBvbi1tYXAtY2hhbmdlPSR7aGFuZGxlTWFwQ2hhbmdlfVxuICAgICAgICAgICAgQG9uLWp1cmlzZGljdGlvbi1jaGFuZ2U9JHtoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2V9XG4gICAgICAgICAgICAuZ2VvanNvbj0ke2dlb2pzb259XG4gICAgICAgICAgPjwvY2l2LW1hcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjaXYtc2VsZWN0LWp1cmlzZGljdGlvblxuICAgICAgICAgIEBzZWxlY3QtanVyaXNkaWN0aW9uLWNoYW5nZT0ke2hhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZX1cbiAgICAgICAgPjwvY2l2LXNlbGVjdC1qdXJpc2RpY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjaXYtcGVvcGxlLWxpc3QgLmxvY2FsPSR7cGVvcGxlfT48L2Npdi1wZW9wbGUtbGlzdD5cbiAgICA8L2Rpdj5cblxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNlYXJjaC1qdXJpc2RpY3Rpb25zXCIsXG4gIGNvbXBvbmVudChTZWFyY2hKdXJpc2RpY3Rpb25zLCB7XG4gICAgdXNlU2hhZG93RE9NOiBmYWxzZSxcbiAgICBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtdLFxuICB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBQaWNvQ2hpcHNJbnB1dCh7IHZhbHVlID0gW10sIG9uQ2hhbmdlLCBwbGFjZWhvbGRlciA9IFwiQWRkLi4uXCIgfSkge1xuICBjb25zdCBbY2hpcHMsIHNldENoaXBzXSA9IHVzZVN0YXRlKHZhbHVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldENoaXBzKHZhbHVlKTtcbiAgfSwgW3ZhbHVlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZShjaGlwcyk7XG4gIH0sIFtjaGlwc10pO1xuXG4gIGNvbnN0IGhhbmRsZUFkZCA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuZWxlbWVudHNbXCJjaGlwLWlucHV0XCJdO1xuICAgIGNvbnN0IHZhbCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAodmFsICYmICFjaGlwcy5pbmNsdWRlcyh2YWwpKSB7XG4gICAgICBzZXRDaGlwcyhbLi4uY2hpcHMsIHZhbF0pO1xuICAgIH1cbiAgICBpbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmVtb3ZlID0gKGlkeCkgPT4ge1xuICAgIHNldENoaXBzKGNoaXBzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaWR4KSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgLnBpY28tY2hpcHMtcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBnYXA6IDAuNWVtO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTtcbiAgICAgIH1cbiAgICAgIC5waWNvLWNoaXAtYnRuIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBpY28tcHJpbWFyeS1iYWNrZ3JvdW5kLCAjZTBlOGYzKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcGljby1wcmltYXJ5LCAjMjY0NDc4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjE4ZW0gMC43ZW0gMC4xOGVtIDAuN2VtO1xuICAgICAgICBmb250LXNpemU6IDAuOTdlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgLnBpY28tY2hpcC1idG4gLmNsb3NlLXgge1xuICAgICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMS4xZW07XG4gICAgICAgIG9wYWNpdHk6IDAuNztcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAucGljby1jaGlwLWJ0biAuY2xvc2UteDpob3ZlciB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG4gICAgICAucGljby1jaGlwcy1yb3cgaW5wdXRbdHlwZT1cInRleHRcIl0ge1xuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvciwgI2UwZTBlMCk7XG4gICAgICAgIHBhZGRpbmc6IDAuMjVlbSAwLjc1ZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMWVtO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXIgMC4ycztcbiAgICAgIH1cbiAgICAgIC5waWNvLWNoaXBzLXJvdyBpbnB1dFt0eXBlPVwidGV4dFwiXTpmb2N1cyB7XG4gICAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0tcGljby1wcmltYXJ5LCAjMGQ2ZWZkKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJwaWNvLWNoaXBzLXJvd1wiPlxuICAgICAgJHtjaGlwcy5tYXAoXG4gICAgICAgIChjaGlwLCBpKSA9PiBodG1sYFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwaWNvLWNoaXAtYnRuXCJcbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IGhhbmRsZVJlbW92ZShpKX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtjaGlwfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+JHtjaGlwfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2UteFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIGBcbiAgICAgICl9XG4gICAgICA8Zm9ybSBAc3VibWl0PSR7aGFuZGxlQWRkfSBzdHlsZT1cImRpc3BsYXk6IGlubGluZTtcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbmFtZT1cImNoaXAtaW5wdXRcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIC8+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJwaWNvLWNoaXBzLWlucHV0XCIsXG4gIGNvbXBvbmVudChQaWNvQ2hpcHNJbnB1dCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgXCIuLi8uLi9iYXNpYy9jaGlwLmpzXCJcblxuZnVuY3Rpb24gTmFtZUNvbmZpZ0Zvcm0oeyBvbkNoYW5nZSwgaWRlbnRpdGllcyA9IHt9IH0pIHtcbiAgY29uc3QgW2NvbmZpZ3MsIHNldENvbmZpZ3NdID0gdXNlU3RhdGUoeyAuLi5pZGVudGl0aWVzIH0pO1xuICBjb25zdCBbbmV3SWRlbnRpdHksIHNldE5ld0lkZW50aXR5XSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q29uZmlncyh7IC4uLmlkZW50aXRpZXMgfSk7XG4gIH0sIFtpZGVudGl0aWVzXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkNoYW5nZShjb25maWdzKTtcbiAgfSwgW2NvbmZpZ3MsIG9uQ2hhbmdlXSk7XG5cbiAgY29uc3QgaGFuZGxlQWRkSWRlbnRpdHkgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBuYW1lID0gbmV3SWRlbnRpdHkudHJpbSgpO1xuICAgIGlmIChuYW1lICYmICFjb25maWdzW25hbWVdKSB7XG4gICAgICBzZXRDb25maWdzKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbbmFtZV06IFtdIH0pKTtcbiAgICAgIHNldE5ld0lkZW50aXR5KFwiXCIpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8ZGl2PlxuICAgICAgJHtPYmplY3Qua2V5cyhjb25maWdzKS5tYXAoXG4gICAgICAgIChpZGVudGl0eSkgPT4gaHRtbGBcbiAgICAgICAgICA8ZmllbGRzZXQgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxZW07XCI+XG4gICAgICAgICAgICA8bGFiZWw+JHtpZGVudGl0eX08L2xhYmVsPlxuICAgICAgICAgICAgPHBpY28tY2hpcHMtaW5wdXRcbiAgICAgICAgICAgICAgLnZhbHVlPSR7Y29uZmlnc1tpZGVudGl0eV0gfHwgW119XG4gICAgICAgICAgICAgIC5vbkNoYW5nZT0keyhjaGlwcykgPT4ge1xuICAgICAgICAgICAgICAgIHNldENvbmZpZ3MoKHByZXYpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XTogY2hpcHMsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhbHRlcm5hdGUgbmFtZS4uLlwiXG4gICAgICAgICAgICA+PC9waWNvLWNoaXBzLWlucHV0PlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIGBcbiAgICAgICl9XG4gICAgICA8Zm9ybSBAc3VibWl0PSR7aGFuZGxlQWRkSWRlbnRpdHl9IHN0eWxlPVwibWFyZ2luLXRvcDogMWVtOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDAuNWVtO1wiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgLnZhbHVlPSR7bmV3SWRlbnRpdHl9XG4gICAgICAgICAgQGlucHV0PSR7KGUpID0+IHNldE5ld0lkZW50aXR5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBpZGVudGl0eSBuYW1lLi4uXCJcbiAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7XCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZWNvbmRhcnlcIj5BZGQgSWRlbnRpdHk8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcIm5hbWUtY29uZmlnLWZvcm1cIixcbiAgY29tcG9uZW50KE5hbWVDb25maWdGb3JtLCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSlcbik7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcbmltcG9ydCBcIi4uLy4uL2Jhc2ljL21vZGFsLmpzXCI7XG5cbmZ1bmN0aW9uIFNjcmFwZU1vZGFsKHsgb25TdGFydFNjcmFwZSwgdXJsID0gXCJcIiwgc291cmNlVXJscyA9IFtdLCBtb2RhbFByb3BzID0ge30sIGlkZW50aXRpZXMgPSB7fSB9KSB7XG4gIGNvbnN0IFtzY3JhcGVTY29wZSwgc2V0U2NyYXBlU2NvcGVdID0gdXNlU3RhdGUoXCJ0b3AtbGV2ZWwtdXJsXCIpO1xuICBjb25zdCBbY3VycmVudFVybCwgc2V0Q3VycmVudFVybF0gPSB1c2VTdGF0ZSh1cmwpO1xuICBjb25zdCBbY3VycmVudFNvdXJjZVVybHMsIHNldEN1cnJlbnRTb3VyY2VVcmxzXSA9IHVzZVN0YXRlKHNvdXJjZVVybHMpO1xuICBjb25zdCBbbmFtZUNvbmZpZ3MsIHNldE5hbWVDb25maWdzXSA9IHVzZVN0YXRlKHt9KTtcblxuICBjb25zdCBoYW5kbGVOYW1lQ29uZmlnc0NoYW5nZSA9IChjb25maWdzKSA9PiB7XG4gICAgc2V0TmFtZUNvbmZpZ3MoY29uZmlncyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2NvcGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBzZXRTY3JhcGVTY29wZShldmVudC50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0VXJsID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRVcmwodXJsKTtcbiAgfTtcblxuICBjb25zdCBhZGRTb3VyY2VVcmwgPSAoKSA9PiB7XG4gICAgc2V0Q3VycmVudFNvdXJjZVVybHMoWy4uLmN1cnJlbnRTb3VyY2VVcmxzLCBcIlwiXSk7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlU291cmNlVXJsID0gKGluZGV4KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFVybHMgPSBjdXJyZW50U291cmNlVXJscy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICBzZXRDdXJyZW50U291cmNlVXJscyh1cGRhdGVkVXJscyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVXJsQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudFVybChldmVudC50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNvdXJjZVVybENoYW5nZSA9IChpbmRleCwgZXZlbnQpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVXJscyA9IFsuLi5jdXJyZW50U291cmNlVXJsc107XG4gICAgdXBkYXRlZFVybHNbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHNldEN1cnJlbnRTb3VyY2VVcmxzKHVwZGF0ZWRVcmxzKTtcbiAgfTtcblxuICBjb25zdCBpc1ZhbGlkVXJsID0gKHVybFN0cmluZykgPT4ge1xuICAgIGlmICghdXJsU3RyaW5nIHx8IHVybFN0cmluZy50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgbmV3IFVSTCh1cmxTdHJpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRVcmxJc1ZhbGlkID0gKCkgPT4ge1xuICAgIHJldHVybiBpc1ZhbGlkVXJsKGN1cnJlbnRVcmwpO1xuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRTb3VyY2VVcmxzVmFsaWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGN1cnJlbnRTb3VyY2VVcmxzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGN1cnJlbnRTb3VyY2VVcmxzLmV2ZXJ5KCh1cmwpID0+IGlzVmFsaWRVcmwodXJsKSlcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGNhblN0YXJ0U2NyYXBlID1cbiAgICBzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgID8gY3VycmVudFVybElzVmFsaWQoKVxuICAgICAgOiBjdXJyZW50U291cmNlVXJsc1ZhbGlkKCk7XG5cbiAgY29uc3Qgc3VibWl0U2NyYXBlID0gKCkgPT4ge1xuICAgIGxldCBkYXRhID0ge307XG4gICAgaWYgKHNjcmFwZVNjb3BlID09IFwidG9wLWxldmVsLXVybFwiKSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICBzY3JhcGVTY29wZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHVybDogY3VycmVudFVybCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIHNjcmFwZVNjb3BlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc291cmNlVXJsczogY3VycmVudFNvdXJjZVVybHMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBkYXRhLmlkZW50aXRpZXMgPSBuYW1lQ29uZmlncztcbiAgICBvblN0YXJ0U2NyYXBlKGRhdGEpO1xuICB9O1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBodG1sYFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICBpZD1cInRvcC1sZXZlbC11cmxcIlxuICAgICAgICBuYW1lPVwic2NyYXBlLXNjb3BlXCJcbiAgICAgICAgdmFsdWU9XCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJ9XG4gICAgICAgIEBjaGFuZ2U9JHtoYW5kbGVTY29wZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8bGFiZWwgZm9yPVwidG9wLWxldmVsLXVybFwiPlRvcC1sZXZlbCBVUkwgb25seTwvbGFiZWw+XG5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICBpZD1cInNwZWNpZmljLXVybHNcIlxuICAgICAgICBuYW1lPVwic2NyYXBlLXNjb3BlXCJcbiAgICAgICAgdmFsdWU9XCJzcGVjaWZpYy11cmxzXCJcbiAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJzcGVjaWZpYy11cmxzXCJ9XG4gICAgICAgIEBjaGFuZ2U9JHtoYW5kbGVTY29wZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8bGFiZWwgZm9yPVwic3BlY2lmaWMtdXJsc1wiPlNwZWNpZmljIFVSTHM8L2xhYmVsPlxuICAgIDwvZmllbGRzZXQ+XG5cbiAgICAke3NjcmFwZVNjb3BlID09PSBcInRvcC1sZXZlbC11cmxcIlxuICAgICAgPyBodG1sYFxuICAgICAgICAgIDxmaWVsZHNldCByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgLnZhbHVlPVwiJHtjdXJyZW50VXJsfVwiXG4gICAgICAgICAgICAgIEBpbnB1dD0ke2hhbmRsZVVybENoYW5nZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWNvbmRhcnkgb3V0bGluZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7cmVzZXRVcmx9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJlc2V0IFVSTFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGBcbiAgICAgIDogaHRtbGBcbiAgICAgICAgICAke2N1cnJlbnRTb3VyY2VVcmxzLm1hcChcbiAgICAgICAgICAgICh1cmwsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICA8ZmllbGRzZXQgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlKSA9PiBoYW5kbGVTb3VyY2VVcmxDaGFuZ2UoaW5kZXgsIGUpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlY29uZGFyeSBvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHJlbW92ZVNvdXJjZVVybChpbmRleCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICl9XG4gICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHthZGRTb3VyY2VVcmx9PkFkZCBVUkw8L2J1dHRvbj5cbiAgICAgICAgYH1cblxuICAgIDxkZXRhaWxzIG5hbWU9XCJvdmVycmlkZS1uYW1lc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMS41ZW07XCI+XG4gICAgICA8c3VtbWFyeT5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEuMWVtO1wiPk5hbWUgQ29uZmlnczwvc3Bhbj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvciwgI2Y2ZjhmYSk7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IsICNlMGUwZTApO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVlbTtcbiAgICAgICAgICBwYWRkaW5nOiAxLjI1ZW0gMWVtIDFlbSAxZW07XG4gICAgICAgICAgbWFyZ2luLXRvcDogMWVtO1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwwLDAsMC4wMyk7XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IsICM2NjYpOyBtYXJnaW4tYm90dG9tOiAxZW07XCI+XG4gICAgICAgICAgU29tZSBwZW9wbGUgZ28gYnkgbXVsdGlwbGUgbmFtZXMgdGhhdCBhcmVuJ3QgZWFzaWx5IGd1ZXNzYWJsZSB0byBiZVxuICAgICAgICAgIHRoZSBzYW1lIGlkZW50aXR5LiBTcGVjaWZ5IGFsdGVybmF0ZSBuYW1lcyBmb3IgaWRlbnRpdGllcyB0byBpbXByb3ZlXG4gICAgICAgICAgbWF0Y2hpbmcuXG4gICAgICAgIDwvcD5cbiAgICAgICAgPG5hbWUtY29uZmlnLWZvcm1cbiAgICAgICAgICAub25DaGFuZ2U9JHtoYW5kbGVOYW1lQ29uZmlnc0NoYW5nZX1cbiAgICAgICAgICAuaWRlbnRpdGllcz0ke2lkZW50aXRpZXN9XG4gICAgICAgID48L25hbWUtY29uZmlnLWZvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2RldGFpbHM+XG4gIGA7XG5cbiAgY29uc3QgZm9vdGVyID0gaHRtbGBcbiAgICA8YnV0dG9uIEBjbGljaz0ke21vZGFsUHJvcHMub25DbG9zZX0gY2xhc3M9XCJzZWNvbmRhcnlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBAY2xpY2s9JHsoKSA9PiB7XG4gICAgICAgIHN1Ym1pdFNjcmFwZSgpO1xuICAgICAgICBtb2RhbFByb3BzLm9uQ2xvc2UoKTtcbiAgICAgIH19XG4gICAgICBjbGFzcz1cInByaW1hcnlcIlxuICAgICAgP2Rpc2FibGVkPSR7IWNhblN0YXJ0U2NyYXBlfVxuICAgID5cbiAgICAgIFN0YXJ0IFNjcmFwZVxuICAgIDwvYnV0dG9uPlxuICBgO1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxjaXYtbW9kYWxcbiAgICAgIC50aXRsZT0ke1wiVVJMcyB0byBTY3JhcGVcIn1cbiAgICAgIC5jb250ZW50PSR7Y29udGVudH1cbiAgICAgIC5mb290ZXI9JHtmb290ZXJ9XG4gICAgICAubW9kYWxQcm9wcz0ke21vZGFsUHJvcHN9XG4gICAgPjwvY2l2LW1vZGFsPlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNjcmFwZS1tb2RhbFwiLFxuICBjb21wb25lbnQoU2NyYXBlTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrIH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHVzZVNTRSB9IGZyb20gXCIuLi9ob29rcy91c2VTc2UuanNcIjsgLy8gPC0tIEltcG9ydCB0aGUgaG9va1xuaW1wb3J0IFwiLi4vc2NyYXBlLWhpc3Rvcnkvc2NyYXBlLWhpc3RvcnktbGlzdC5qc1wiO1xuXG5jb25zdCBERUZBVUxUX0NFTlRFUiA9IFwiMzAuMjQxNzEsLTkxLjk5MTA0NFwiO1xuY29uc3QgQVBJX1VSTCA9IF9fQVBJX1VSTF9fO1xuXG5mdW5jdGlvbiBKdXJpc2RpY3Rpb25QYWdlKHsgXG4gIGp1cmlzZGljdGlvbl9vY2RpZCwgXG4gIGhpc3Rvcnlcbn0pIHtcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwZW9wbGUsIHNldFBlb3BsZV0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzY3JhcGVNb2RhbE9wZW4sIHNldFNjcmFwZU1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7IFxuICBjb25zb2xlLmxvZyhcImRhdGFcIiwgZGF0YSk7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBwZW9wbGU/LnJlZHVjZSgoYWNjLCBwZXJzb24pID0+IHtcbiAgICBpZiAoYWNjW3BlcnNvbi5uYW1lXSkge1xuICAgICAgYWNjW3BlcnNvbi5uYW1lXSA9IFsuLi5uZXcgU2V0KFsuLi5hY2NbcGVyc29uLm5hbWVdLCAuLi4ocGVyc29uLm90aGVyX25hbWVzIHx8IFtdKV0pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW3BlcnNvbi5uYW1lXSA9IFsuLi5uZXcgU2V0KHBlcnNvbi5vdGhlcl9uYW1lcyB8fCBbXSldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG5cbiAgfSwge30pO1xuXG4gIGNvbnNvbGUubG9nKHtwZW9wbGUsIGlkZW50aXRpZXN9KVxuXG4gIGNvbnN0IHNzZVVybCA9IGp1cmlzZGljdGlvbl9vY2RpZFxuICAgID8gW2Ake0FQSV9VUkx9L2FwaS92MS9zc2Uvam9icy9zdGF0dXNgLFxuICAgICAgYD9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoanVyaXNkaWN0aW9uX29jZGlkKX1gLFxuICAgICAgYCZqb2JfdHlwZT1wZW9wbGVgXS5qb2luKFwiXCIpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IHtcbiAgICBkYXRhOiBqb2JTdGF0dXMsXG4gICAgaXNDb25uZWN0ZWQsXG4gICAgZXJyb3I6IHNzZUVycm9yLFxuICAgIC8vIGNvbm5lY3Q6IGNvbm5lY3RTdHJlYW0sXG4gICAgLy8gZGlzY29ubmVjdDogZGlzY29ubmVjdFN0cmVhbSxcbiAgfSA9IHVzZVNTRShzc2VVcmwsIHsgYXV0b0Nvbm5lY3Q6ICEhc3NlVXJsIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFqdXJpc2RpY3Rpb25fb2NkaWQpIHJldHVybjtcbiAgICBmZXRjaERhdGEoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbanVyaXNkaWN0aW9uRGF0YSwgcGVvcGxlRGF0YV0gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaEp1cmlzZGljdGlvbkRhdGEoanVyaXNkaWN0aW9uX29jZGlkKSxcbiAgICAgICAgZmV0Y2hQZW9wbGVEYXRhKGp1cmlzZGljdGlvbl9vY2RpZCksXG4gICAgICBdKTtcbiAgICBzZXREYXRhKGp1cmlzZGljdGlvbkRhdGEpO1xuICAgIHNldFBlb3BsZShwZW9wbGVEYXRhKTtcbiAgfTtcblxuICBjb25zdCBmZXRjaEp1cmlzZGljdGlvbkRhdGEgPSBhc3luYyAob2NkaWQpID0+IHtcbiAgICBjb25zdCBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnM/anVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWR9JndpdGhfZ2VvbT10cnVlYCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICBnZW9fY2VudGVyOiByZXN1bHQuZ2VvX2NlbnRlcixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGZldGNoUGVvcGxlRGF0YSA9IGFzeW5jIChvY2RpZCkgPT4ge1xuICAgIGNvbnN0IGVuY29kZWRPY2RpZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9wZW9wbGU/anVyaXNkaWN0aW9uX29jZGlkPSR7ZW5jb2RlZE9jZGlkfWAsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjcmFwZU1vZGFsQ2xpY2sgPSAoKSA9PiBzZXRTY3JhcGVNb2RhbE9wZW4odHJ1ZSk7XG4gIGNvbnN0IGhhbmRsZVNjcmFwZU1vZGFsQ2xvc2UgPSAoKSA9PiBzZXRTY3JhcGVNb2RhbE9wZW4oZmFsc2UpO1xuXG4gIGNvbnN0IGhhbmRsZVNjcmFwZVN0YXJ0Q2xpY2sgPSBhc3luYyAoZGV0YWlscykgPT4ge1xuICAgIHNldFNjcmFwZU1vZGFsT3BlbihmYWxzZSk7IC8vIE9wdGlvbmFsbHkgY2xvc2UgbW9kYWwgb24gc3VibWl0XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGp1cmlzZGljdGlvbl9vY2RpZDogZGF0YS5kYXRhLmlkLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHVybDogZGV0YWlscy5kYXRhLnVybCB8fCBkYXRhLmRhdGEudXJsLFxuICAgICAgICBuYW1lOiBkYXRhLmRhdGEubmFtZSxcbiAgICAgICAgc291cmNlX3VybHM6IGRldGFpbHMuZGF0YS5zb3VyY2VVcmxzLFxuICAgICAgICBpZGVudGl0aWVzOiBkZXRhaWxzLmRhdGEuaWRlbnRpdGllc1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvcGlwZWxpbmVzYCwge1xuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNhblN0YXJ0U2NyYXBlID0gdHJ1ZTtcbiAgY29uc3Qgc2NyYXBlU3RhdHVzID0gZGF0YT8uZGF0YT8udXBkYXRlZF9hdCA/IGBTY3JhcGVkYCA6IGBVbnNjcmFwZWRgO1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJyZW07XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxjaXYtbWFwXG4gICAgICAgICAgICBjYW5tb3ZlPVwiZmFsc2VcIlxuICAgICAgICAgICAgLmxhdGxuZz0ke2RhdGEgJiYgZGF0YS5nZW9fY2VudGVyXG4gICAgICAgICAgICAgID8geyBsYXQ6IGRhdGEuZ2VvX2NlbnRlci5sYXQsIGxuZzogZGF0YS5nZW9fY2VudGVyLmxuZyB9XG4gICAgICAgICAgICAgIDogbnVsbH1cbiAgICAgICAgICA+PC9jaXYtbWFwPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICR7ZGF0YVxuICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgIDxoZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyO1wiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDBcIj4ke2RhdGEuZGF0YS5uYW1lfTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjc1cmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA+U3RhdHVzOiAke3NjcmFwZVN0YXR1c308L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+SnVyaXNkaWN0aW9uIE9DRElEOjwvc3Ryb25nPiAke2RhdGEuZGF0YS5pZH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPldlYnNpdGU6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLnVybH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkdlb2lkOjwvc3Ryb25nPiAke2RhdGEuZGF0YS5nZW9pZH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlBvcHVsYXRpb246PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLnBvcHVsYXRpb24udG9Mb2NhbGVTdHJpbmcoKX1cbiAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgIDxoMz5TY3JhcGUgSGlzdG9yeTwvaDM+XG4gICAgICAgICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgICAgICAgPGNpdi1zY3JhcGUtaGlzdG9yeS1saXN0XG4gICAgICAgICAgICAgICAgICAuaGlzdG9yeT0ke2hpc3Rvcnl9XG4gICAgICAgICAgICAgICAgICAuam9iU3RhdHVzPSR7am9iU3RhdHVzfVxuICAgICAgICAgICAgICAgICAgLmlzQ29ubmVjdGVkPSR7aXNDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAuc3NlRXJyb3I9JHtzc2VFcnJvcn1cbiAgICAgICAgICAgICAgICA+PC9jaXYtc2NyYXBlLWhpc3RvcnktbGlzdD5cblxuICAgICAgICAgICAgICAgIDxjaXYtc2NyYXBlLW1vZGFsXG4gICAgICAgICAgICAgICAgICAub25TdGFydFNjcmFwZT0ke2hhbmRsZVNjcmFwZVN0YXJ0Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAudXJsPSR7ZGF0YS5kYXRhLnVybH1cbiAgICAgICAgICAgICAgICAgIC5tb2RhbFByb3BzPSR7e1xuICAgICAgICAgICAgICAgICAgICBvcGVuOiBzY3JhcGVNb2RhbE9wZW4sXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGhhbmRsZVNjcmFwZU1vZGFsQ2xvc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlT25CYWNrZHJvcENsaWNrOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIC5pZGVudGl0aWVzPSR7aWRlbnRpdGllc31cbiAgICAgICAgICAgICAgICA+PC9jaXYtc2NyYXBlLW1vZGFsPiBcblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIEBjbGljaz0ke2hhbmRsZVNjcmFwZU1vZGFsQ2xpY2t9XG4gICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshY2FuU3RhcnRTY3JhcGV9XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFNjcmFwZSBEYXRhIGZvciBKdXJpc2RpY3Rpb25cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiBodG1sYCA8cD5Mb2FkaW5nIGp1cmlzZGljdGlvbiBkYXRhLi4uPC9wPiBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aDI+RWxlY3RlZCBSZXByZXNlbnRhdGl2ZXM8L2gyPlxuICAgICAgPGNpdi1wZW9wbGUtbGlzdCAubG9jYWw9JHtwZW9wbGV9PjwvY2l2LXBlb3BsZS1saXN0PlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LWp1cmlzZGljdGlvbi1wYWdlXCIsXG4gIGNvbXBvbmVudChKdXJpc2RpY3Rpb25QYWdlLCB7XG4gICAgdXNlU2hhZG93RE9NOiBmYWxzZSxcbiAgICBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtcbiAgICAgIFwianVyaXNkaWN0aW9uX29jZGlkXCIsIFxuICAgICAgXCJoaXN0b3J5XCJcbiAgICBdLFxuICB9KSxcbik7XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gXCJoYXVudGVkXCI7XG5cbi8qKlxuICogdXNlU1NFIC0gR2VuZXJhbGl6ZWQgU2VydmVyLVNlbnQgRXZlbnRzIGhvb2tcbiAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSBlbmRwb2ludCAtIFNTRSBlbmRwb2ludCBVUkwgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgVVJMXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlnIChlLmcuLCBhdXRvQ29ubmVjdClcbiAqIEByZXR1cm5zIHtvYmplY3R9IHsgZGF0YSwgaXNDb25uZWN0ZWQsIGVycm9yLCBjb25uZWN0LCBkaXNjb25uZWN0IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNTRShlbmRwb2ludCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbaXNDb25uZWN0ZWQsIHNldElzQ29ubmVjdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2V2ZW50U291cmNlLCBzZXRFdmVudFNvdXJjZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICBjb25zdCBnZXRVcmwgPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiAodHlwZW9mIGVuZHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBlbmRwb2ludCgpIDogZW5kcG9pbnQpLFxuICAgIFtlbmRwb2ludF1cbiAgKTtcblxuICBjb25zdCBjb25uZWN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChldmVudFNvdXJjZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IGdldFVybCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuICAgICAgc2V0RXZlbnRTb3VyY2UoZXMpO1xuICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgIGVzLm9ub3BlbiA9ICgpID0+IHNldElzQ29ubmVjdGVkKHRydWUpO1xuXG4gICAgICBlcy5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXREYXRhKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc2V0RXJyb3IoXCJFcnJvciBwYXJzaW5nIFNTRSBkYXRhLlwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZXMub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTU0UgZXJyb3I6XCIsIGUpO1xuICAgICAgICBzZXRJc0Nvbm5lY3RlZChmYWxzZSk7XG4gICAgICAgIHNldEVycm9yKFwiU1NFIGNvbm5lY3Rpb24gZXJyb3IuXCIpO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFNTRS5cIik7XG4gICAgfVxuICB9LCBbZXZlbnRTb3VyY2UsIGdldFVybF0pO1xuXG4gIGNvbnN0IGRpc2Nvbm5lY3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgc2V0RXZlbnRTb3VyY2UobnVsbCk7XG4gICAgICBzZXRJc0Nvbm5lY3RlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbZXZlbnRTb3VyY2VdKTtcblxuICAvLyBBdXRvLWNvbm5lY3QgaWYgb3B0aW9ucy5hdXRvQ29ubmVjdCBpcyB0cnVlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuYXV0b0Nvbm5lY3QpIHtcbiAgICAgIGNvbm5lY3QoKTtcbiAgICB9XG4gICAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChldmVudFNvdXJjZSkgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICB9O1xuICB9LCBbb3B0aW9ucy5hdXRvQ29ubmVjdCwgY29ubmVjdCwgZXZlbnRTb3VyY2VdKTtcblxuICByZXR1cm4geyBkYXRhLCBpc0Nvbm5lY3RlZCwgZXJyb3IsIGNvbm5lY3QsIGRpc2Nvbm5lY3QgfTtcbn0iLCJpbXBvcnQgXCIuL2lucHV0cy9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9wZW9wbGUtbGlzdC5qc1wiXG5pbXBvcnQgXCIuL3NjcmFwZS1oaXN0b3J5L2luZGV4LmpzXCJcbmltcG9ydCBcIi4vc2VhcmNoLWp1cmlzZGljdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCBcIi4vanVyaXNkaWN0aW9uLXBhZ2UvaW5kZXguanNcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJDaXZNYXAgfSBmcm9tIFwiQGNvbXBvbmVudHNcIjtcbnJlZ2lzdGVyQ2l2TWFwKCk7Il0sIm5hbWVzIjpbImdsb2JhbCIsImdsb2JhbFRoaXMiLCJkZWJ1Z0xvZ0V2ZW50IiwiZXZlbnQiLCJlbWl0TGl0RGVidWdMb2dFdmVudHMiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJpc3N1ZVdhcm5pbmciLCJkZWJ1Z0xvZ1JlbmRlcklkIiwibGl0SXNzdWVkV2FybmluZ3MiLCJTZXQiLCJjb2RlIiwid2FybmluZyIsImhhcyIsImNvbnNvbGUiLCJ3YXJuIiwiYWRkIiwicXVldWVNaWNyb3Rhc2siLCJ3cmFwIiwiU2hhZHlET00iLCJpblVzZSIsIm5vUGF0Y2giLCJub2RlIiwidHJ1c3RlZFR5cGVzIiwicG9saWN5IiwiY3JlYXRlUG9saWN5IiwiY3JlYXRlSFRNTCIsInMiLCJ1bmRlZmluZWQiLCJpZGVudGl0eUZ1bmN0aW9uIiwidmFsdWUiLCJub29wU2FuaXRpemVyIiwiX25vZGUiLCJfbmFtZSIsIl90eXBlIiwic2V0U2FuaXRpemVyIiwibmV3U2FuaXRpemVyIiwic2FuaXRpemVyRmFjdG9yeUludGVybmFsIiwiRXJyb3IiLCJfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UiLCJjcmVhdGVTYW5pdGl6ZXIiLCJuYW1lIiwidHlwZSIsImJvdW5kQXR0cmlidXRlU3VmZml4IiwibWFya2VyIiwiTWF0aCIsInJhbmRvbSIsInRvRml4ZWQiLCJzbGljZSIsIm1hcmtlck1hdGNoIiwibm9kZU1hcmtlciIsImQiLCJkb2N1bWVudCIsImNyZWF0ZU1hcmtlciIsImNyZWF0ZUNvbW1lbnQiLCJpc1ByaW1pdGl2ZSIsImlzQXJyYXkiLCJBcnJheSIsIlNQQUNFX0NIQVIiLCJ0ZXh0RW5kUmVnZXgiLCJjb21tZW50RW5kUmVnZXgiLCJjb21tZW50MkVuZFJlZ2V4IiwidGFnRW5kUmVnZXgiLCJSZWdFeHAiLCJzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCIsImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwicmF3VGV4dEVsZW1lbnQiLCJodG1sIiwic3RyaW5ncyIsInZhbHVlcyIsInNvbWUiLCJ2YWwiLCJfJGxpdFR5cGUkIiwibm9DaGFuZ2UiLCJTeW1ib2wiLCJmb3IiLCJub3RoaW5nIiwidGVtcGxhdGVDYWNoZSIsIldlYWtNYXAiLCJ3YWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCJ0c2EiLCJzdHJpbmdGcm9tVFNBIiwiaGFzT3duUHJvcGVydHkiLCJtZXNzYWdlIiwidHJpbSIsInJlcGxhY2UiLCJUZW1wbGF0ZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInRoaXMiLCJwYXJ0cyIsIm5vZGVJbmRleCIsImF0dHJOYW1lSW5kZXgiLCJwYXJ0Q291bnQiLCJsZW5ndGgiLCJhdHRyTmFtZXMiLCJsIiwicmF3VGV4dEVuZFJlZ2V4IiwicmVnZXgiLCJpIiwiYXR0ck5hbWUiLCJtYXRjaCIsImF0dHJOYW1lRW5kSW5kZXgiLCJsYXN0SW5kZXgiLCJleGVjIiwidGVzdCIsImFzc2VydCIsImVuZCIsInN0YXJ0c1dpdGgiLCJwdXNoIiwiZ2V0VGVtcGxhdGVIdG1sIiwiZWwiLCJjcmVhdGVFbGVtZW50IiwiY3VycmVudE5vZGUiLCJjb250ZW50Iiwid3JhcHBlciIsImZpcnN0Q2hpbGQiLCJyZXBsYWNlV2l0aCIsImNoaWxkTm9kZXMiLCJuZXh0Tm9kZSIsIm5vZGVUeXBlIiwidGFnIiwibG9jYWxOYW1lIiwiaW5uZXJIVE1MIiwiaW5jbHVkZXMiLCJtIiwiaGFzQXR0cmlidXRlcyIsImdldEF0dHJpYnV0ZU5hbWVzIiwiZW5kc1dpdGgiLCJyZWFsTmFtZSIsInN0YXRpY3MiLCJnZXRBdHRyaWJ1dGUiLCJzcGxpdCIsImluZGV4IiwiY3RvciIsIlByb3BlcnR5UGFydCIsIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwiRXZlbnRQYXJ0IiwiQXR0cmlidXRlUGFydCIsInJlbW92ZUF0dHJpYnV0ZSIsInRhZ05hbWUiLCJ0ZXh0Q29udGVudCIsImVtcHR5U2NyaXB0IiwiYXBwZW5kIiwiZGF0YSIsImluZGV4T2YiLCJqb2luIiwia2luZCIsInRlbXBsYXRlIiwiY2xvbmFibGVUZW1wbGF0ZSIsIl9vcHRpb25zIiwicmVzb2x2ZURpcmVjdGl2ZSIsInBhcnQiLCJwYXJlbnQiLCJhdHRyaWJ1dGVJbmRleCIsImN1cnJlbnREaXJlY3RpdmUiLCJfX2RpcmVjdGl2ZXMiLCJfX2RpcmVjdGl2ZSIsIm5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciIsIl8kaW5pdGlhbGl6ZSIsIl8kcmVzb2x2ZSIsIlRlbXBsYXRlSW5zdGFuY2UiLCJfJHBhcnRzIiwiXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuIiwiXyR0ZW1wbGF0ZSIsIl8kcGFyZW50IiwicGFyZW50Tm9kZSIsIl8kaXNDb25uZWN0ZWQiLCJfY2xvbmUiLCJmcmFnbWVudCIsImNyZWF0aW9uU2NvcGUiLCJpbXBvcnROb2RlIiwicGFydEluZGV4IiwidGVtcGxhdGVQYXJ0IiwiQ2hpbGRQYXJ0IiwibmV4dFNpYmxpbmciLCJFbGVtZW50UGFydCIsIl91cGRhdGUiLCJ2YWx1ZUluZGV4IiwidGVtcGxhdGVJbnN0YW5jZSIsIl8kc2V0VmFsdWUiLCJfX2lzQ29ubmVjdGVkIiwic3RhcnROb2RlIiwiZW5kTm9kZSIsIl8kY29tbWl0dGVkVmFsdWUiLCJfJHN0YXJ0Tm9kZSIsIl8kZW5kTm9kZSIsImlzQ29ubmVjdGVkIiwiX3RleHRTYW5pdGl6ZXIiLCJkaXJlY3RpdmVQYXJlbnQiLCJzdGFydCIsIl8kY2xlYXIiLCJfY29tbWl0VGV4dCIsIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsImhvc3QiLCJfY29tbWl0Tm9kZSIsIml0ZXJhdG9yIiwiaXNJdGVyYWJsZSIsIl9jb21taXRJdGVyYWJsZSIsIl9pbnNlcnQiLCJpbnNlcnRCZWZvcmUiLCJwYXJlbnROb2RlTmFtZSIsIm5vZGVOYW1lIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInJlc3VsdCIsIl8kZ2V0VGVtcGxhdGUiLCJoIiwiaW5zdGFuY2UiLCJnZXQiLCJzZXQiLCJpdGVtUGFydHMiLCJpdGVtUGFydCIsIml0ZW0iLCJmcm9tIiwiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsIm4iLCJyZW1vdmUiLCJzZXRDb25uZWN0ZWQiLCJlbGVtZW50IiwiZmlsbCIsIlN0cmluZyIsIl9zYW5pdGl6ZXIiLCJub0NvbW1pdCIsImNoYW5nZSIsInYiLCJfY29tbWl0VmFsdWUiLCJzZXRBdHRyaWJ1dGUiLCJzdXBlciIsImFyZ3VtZW50cyIsInRvZ2dsZUF0dHJpYnV0ZSIsIm5ld0xpc3RlbmVyIiwib2xkTGlzdGVuZXIiLCJzaG91bGRSZW1vdmVMaXN0ZW5lciIsImNhcHR1cmUiLCJvbmNlIiwicGFzc2l2ZSIsInNob3VsZEFkZExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwiaGFuZGxlRXZlbnQiLCJjYWxsIiwicG9seWZpbGxTdXBwb3J0IiwibGl0SHRtbFBvbHlmaWxsU3VwcG9ydERldk1vZGUiLCJsaXRIdG1sVmVyc2lvbnMiLCJyZW5kZXIiLCJjb250YWluZXIiLCJUeXBlRXJyb3IiLCJyZW5kZXJJZCIsInBhcnRPd25lck5vZGUiLCJyZW5kZXJCZWZvcmUiLCJpZCIsImN1cnJlbnQiLCJjdXJyZW50SWQiLCJzZXRDdXJyZW50Iiwic3RhdGUiLCJjbGVhciIsInBoYXNlU3ltYm9sIiwiaG9va1N5bWJvbCIsInVwZGF0ZVN5bWJvbCIsImNvbW1pdFN5bWJvbCIsImVmZmVjdHNTeW1ib2wiLCJsYXlvdXRFZmZlY3RzU3ltYm9sIiwiY29udGV4dEV2ZW50IiwiU3RhdGUiLCJ1cGRhdGUiLCJ2aXJ0dWFsIiwiTWFwIiwicnVuIiwiY2IiLCJyZXMiLCJfcnVuRWZmZWN0cyIsInBoYXNlIiwiZWZmZWN0cyIsImVmZmVjdCIsInJ1bkVmZmVjdHMiLCJydW5MYXlvdXRFZmZlY3RzIiwidGVhcmRvd24iLCJmb3JFYWNoIiwiaG9vayIsImRlZmVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiYmluZCIsInJ1bm5lciIsInRhc2tzIiwicnVuVGFza3MiLCJ0IiwibGVuIiwidGFzayIsInJlYWQiLCJ3cml0ZSIsIkJhc2VTY2hlZHVsZXIiLCJyZW5kZXJlciIsIl91cGRhdGVRdWV1ZWQiLCJoYW5kbGVQaGFzZSIsImFyZyIsImNvbW1pdCIsIm1ha2VDb21wb25lbnQiLCJTY2hlZHVsZXIiLCJmcmFnIiwiYmFzZUVsZW1lbnRPck9wdGlvbnMiLCJCYXNlRWxlbWVudCIsImJhc2VFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJ1c2VTaGFkb3dET00iLCJzaGFkb3dSb290SW5pdCIsIkVsZW1lbnQiLCJfc2NoZWR1bGVyIiwiYXR0YWNoU2hhZG93IiwibW9kZSIsInNoYWRvd1Jvb3QiLCJjb25uZWN0ZWRDYWxsYmFjayIsImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIlJlZmxlY3QiLCJfIiwiY2hhciIsInRvVXBwZXJDYXNlIiwidG9DYW1lbENhc2UiLCJwcm90byIsIlByb3h5IiwicHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJ0YXJnZXQiLCJrZXkiLCJyZWNlaXZlciIsImRlc2MiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsVmFsdWUiLCJpc1NldHVwIiwiZnJlZXplIiwicmVmbGVjdGl2ZVByb3AiLCJkZWZpbmVQcm9wZXJ0eSIsInNldFByb3RvdHlwZU9mIiwiSG9vayIsInVzZSIsImFyZ3MiLCJob29rcyIsImNyZWF0ZUVmZmVjdCIsInNldEVmZmVjdHMiLCJjYWxsYmFjayIsImxhc3RWYWx1ZXMiLCJfdGVhcmRvd24iLCJpZ25vcmVkMSIsImlnbm9yZWQyIiwiaGFzQ2hhbmdlZCIsInVzZUVmZmVjdCIsInVzZUNvbnRleHQiLCJDb250ZXh0IiwiX3JhbkVmZmVjdCIsIl91bnN1YnNjcmliZSIsIl91cGRhdGVyIiwiX3N1YnNjcmliZSIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJ1bnN1YnNjcmliZSIsImRlZmF1bHRWYWx1ZSIsInVzZU1lbW8iLCJmbiIsInVzZUNhbGxiYWNrIiwiaW5wdXRzIiwidXNlU3RhdGUiLCJ1cGRhdGVyIiwibWFrZUFyZ3MiLCJwcmV2aW91c1ZhbHVlIiwiaXMiLCJyZWR1Y2VyIiwiY3VycmVudFN0YXRlIiwiaW5pdGlhbFN0YXRlIiwiaW5pdCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiUGFydFR5cGUiLCJEaXJlY3RpdmUiLCJfcGFydEluZm8iLCJfX3BhcnQiLCJfX2F0dHJpYnV0ZUluZGV4IiwicHJvcHMiLCJfcGFydCIsInN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyIsIlNoYWRvd1Jvb3QiLCJTaGFkeUNTUyIsIm5hdGl2ZVNoYWRvdyIsIkRvY3VtZW50IiwiQ1NTU3R5bGVTaGVldCIsImNvbnN0cnVjdGlvblRva2VuIiwiY3NzVGFnQ2FjaGUiLCJDU1NSZXN1bHQiLCJjc3NUZXh0Iiwic2FmZVRva2VuIiwiX3N0cmluZ3MiLCJzdHlsZVNoZWV0IiwiX3N0eWxlU2hlZXQiLCJjYWNoZWFibGUiLCJyZXBsYWNlU3luYyIsInRvU3RyaW5nIiwiY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQiLCJzaGVldCIsInJ1bGUiLCJjc3NSdWxlcyIsImdldENvbXBhdGlibGVTdHlsZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUiLCJyZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlIiwiSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSIsInByb3AiLCJfb2JqIiwiZGVmYXVsdENvbnZlcnRlciIsInRvQXR0cmlidXRlIiwiQm9vbGVhbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcm9tQXR0cmlidXRlIiwiZnJvbVZhbHVlIiwiTnVtYmVyIiwicGFyc2UiLCJlIiwibm90RXF1YWwiLCJvbGQiLCJkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbiIsImF0dHJpYnV0ZSIsImNvbnZlcnRlciIsInJlZmxlY3QiLCJ1c2VEZWZhdWx0IiwibWV0YWRhdGEiLCJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwiUmVhY3RpdmVFbGVtZW50IiwiYWRkSW5pdGlhbGl6ZXIiLCJpbml0aWFsaXplciIsIl9fcHJlcGFyZSIsIl9pbml0aWFsaXplcnMiLCJmaW5hbGl6ZSIsIl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCIsImtleXMiLCJjcmVhdGVQcm9wZXJ0eSIsImNyZWF0ZSIsIndyYXBwZWQiLCJlbGVtZW50UHJvcGVydGllcyIsIm5vQWNjZXNzb3IiLCJkZXNjcmlwdG9yIiwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiwicmVxdWVzdFVwZGF0ZSIsImdldFByb3BlcnR5T3B0aW9ucyIsInN1cGVyQ3RvciIsImZpbmFsaXplZCIsInByb3BlcnRpZXMiLCJwcm9wS2V5cyIsInAiLCJhdHRyIiwiX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkiLCJlbGVtZW50U3R5bGVzIiwiZmluYWxpemVTdHlsZXMiLCJzdHlsZXMiLCJmbGF0IiwiSW5maW5pdHkiLCJyZXZlcnNlIiwidW5zaGlmdCIsInRvTG93ZXJDYXNlIiwiX19pbnN0YW5jZVByb3BlcnRpZXMiLCJpc1VwZGF0ZVBlbmRpbmciLCJoYXNVcGRhdGVkIiwiX19yZWZsZWN0aW5nUHJvcGVydHkiLCJfX2luaXRpYWxpemUiLCJfX3VwZGF0ZVByb21pc2UiLCJlbmFibGVVcGRhdGluZyIsIl8kY2hhbmdlZFByb3BlcnRpZXMiLCJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCJhZGRDb250cm9sbGVyIiwiY29udHJvbGxlciIsIl9fY29udHJvbGxlcnMiLCJyZW5kZXJSb290IiwiaG9zdENvbm5lY3RlZCIsInJlbW92ZUNvbnRyb2xsZXIiLCJkZWxldGUiLCJpbnN0YW5jZVByb3BlcnRpZXMiLCJzaXplIiwiY3JlYXRlUmVuZGVyUm9vdCIsInNoYWRvd1Jvb3RPcHRpb25zIiwiYWRvcHRlZFN0eWxlU2hlZXRzIiwibWFwIiwic3R5bGUiLCJub25jZSIsImFwcGVuZENoaWxkIiwiYWRvcHRTdHlsZXMiLCJjIiwiX3JlcXVlc3RlZFVwZGF0ZSIsImhvc3REaXNjb25uZWN0ZWQiLCJfb2xkIiwiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwiYXR0clZhbHVlIiwiZW5hYmxlZFdhcm5pbmdzIiwicHJvcE5hbWUiLCJjb252ZXJ0ZWRWYWx1ZSIsIl9fZGVmYXVsdFZhbHVlcyIsIkV2ZW50IiwiaGFzQXR0cmlidXRlIiwiXyRjaGFuZ2VQcm9wZXJ0eSIsIl9fZW5xdWV1ZVVwZGF0ZSIsImluaXRpYWxpemVWYWx1ZSIsIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCJyZWplY3QiLCJzY2hlZHVsZVVwZGF0ZSIsInBlcmZvcm1VcGRhdGUiLCJzaGFkb3dlZFByb3BlcnRpZXMiLCJmaWx0ZXIiLCJzaG91bGRVcGRhdGUiLCJjaGFuZ2VkUHJvcGVydGllcyIsIndpbGxVcGRhdGUiLCJob3N0VXBkYXRlIiwiX19tYXJrVXBkYXRlZCIsIl8kZGlkVXBkYXRlIiwiX2NoYW5nZWRQcm9wZXJ0aWVzIiwiaG9zdFVwZGF0ZWQiLCJmaXJzdFVwZGF0ZWQiLCJ1cGRhdGVkIiwidXBkYXRlQ29tcGxldGUiLCJnZXRVcGRhdGVDb21wbGV0ZSIsImVuc3VyZU93bldhcm5pbmdzIiwiZW5hYmxlV2FybmluZyIsImRpc2FibGVXYXJuaW5nIiwic3BsaWNlIiwicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCJMaXRFbGVtZW50IiwicmVuZGVyT3B0aW9ucyIsIl9fY2hpbGRQYXJ0IiwibGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0IiwibGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGUiLCJsaXRFbGVtZW50VmVyc2lvbnMiLCJ3aW5kb3ciLCJub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQiLCJjaGlsZHJlbiIsIm9iaiIsInJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCIsImFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQiLCJpbnN0YWxsRGlzY29ubmVjdEFQSSIsInJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwibmV3UGFyZW50Iiwibm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZCIsImlzQ2xlYXJpbmdWYWx1ZSIsImZyb21QYXJ0SW5kZXgiLCJfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwiQXN5bmNEaXJlY3RpdmUiLCJpc0NsZWFyaW5nRGlyZWN0aXZlIiwicmVjb25uZWN0ZWQiLCJkaXNjb25uZWN0ZWQiLCJzZXRWYWx1ZSIsIm5ld1ZhbHVlcyIsImNvbXBvbmVudCIsImNyZWF0ZUNvbnRleHQiLCJQcm92aWRlciIsImxpc3RlbmVycyIsIl92YWx1ZSIsInN0b3BQcm9wYWdhdGlvbiIsIkNvbnN1bWVyIiwibWFrZUNvbnRleHQiLCJoYXVudGVkIiwibGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2siLCJyZWYiLCJfcmVmIiwicmVmQ2hhbmdlZCIsIl91cGRhdGVSZWZWYWx1ZSIsIl9sYXN0RWxlbWVudEZvclJlZiIsIl9lbGVtZW50IiwiX2NvbnRleHQiLCJjb250ZXh0IiwibGFzdEVsZW1lbnRGb3JDYWxsYmFjayIsIl8kbGl0RGlyZWN0aXZlJCIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIiwiZGlzYWJsZWQiLCJvcHRpb25zTWV0YWRhdGEiLCJsYWJlbCIsImlucHV0VmFsdWUiLCJwYWdlU2l6ZSIsInNlbGVjdGVkSXRlbSIsInNldFNlbGVjdGVkSXRlbSIsImFjdGl2ZUluZGV4Iiwic2V0QWN0aXZlSW5kZXgiLCJpc0xpc3RPcGVuIiwic2V0SXNMaXN0T3BlbiIsImlucHV0RWxlbWVudCIsInNldElucHV0RWxlbWVudCIsImN1cnJlbnRQYWdlIiwic2V0Q3VycmVudFBhZ2UiLCJzY3JvbGxUb0FjdGl2ZUl0ZW0iLCJ0cmlnZ2VyUGFyZW50RmV0Y2giLCJpbnB1dCIsInBhZ2UiLCJxdWVyeSIsImRlYm91bmNlZEZldGNoIiwiZnVuYyIsImRlbGF5IiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImFwcGx5IiwiZGVib3VuY2UiLCJzZWxlY3RJdGVtIiwiZm9jdXMiLCJoYXNQcmV2UGFnZSIsImxpbmtzIiwicHJldiIsImhhc05leHRQYWdlIiwibmV4dCIsImFjdGl2ZUl0ZW0iLCJxdWVyeVNlbGVjdG9yIiwic2Nyb2xsSW50b1ZpZXciLCJiZWhhdmlvciIsImJsb2NrIiwicHJldmVudERlZmF1bHQiLCJuZXdTdGF0ZSIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsInRvdGFsX2l0ZW1zIiwidG90YWxfcGFnZXMiLCJsb2NhbCIsInBlb3BsZSIsInBlcnNvbiIsImNkbl9pbWFnZSIsImltYWdlIiwib2ZmaWNlIiwiZGl2aXNpb25PY2RpZCIsImRpdmlzaW9uX29jZGlkIiwiaGFzU3ViZGl2aXNpb24iLCJnZXRTdWJkaXZpc2lvbkxhYmVsIiwic3ViRGl2aXNpb24iLCJlbWFpbHMiLCJwaG9uZXMiLCJ1cmxzIiwidGl0bGUiLCJmb290ZXIiLCJtb2RhbFByb3BzIiwib3BlbiIsInNldE9wZW4iLCJkaWFsb2dFbCIsImFyaWFMYWJlbCIsImNsb3NlT25CYWNrZHJvcENsaWNrIiwib25DbG9zZSIsIm1vZGFsUmVmIiwiaGlzdG9yeSIsImpvYlN0YXR1cyIsInBhcnNlZEhpc3RvcnkiLCJyZXF1ZXN0X2lkIiwiam9iIiwicHJvZ3Jlc3MiLCJzdGF0dXMiLCJtb2RhbE9wZW4iLCJzZXRNb2RhbE9wZW4iLCJzZWxlY3RlZEpvYiIsInNldFNlbGVjdGVkSm9iIiwiZm10RGF0ZSIsIkRhdGUiLCJpc05hTiIsImdldE1vbnRoIiwicGFkU3RhcnQiLCJnZXREYXRlIiwiZ2V0RnVsbFllYXIiLCJtb2RhbENvbnRlbnQiLCJjcmVhdGVkX2F0IiwidXBkYXRlZF9hdCIsImR1cmF0aW9uIiwiZmxvb3IiLCJyb3VuZCIsImdldER1cmF0aW9uU3RyaW5nIiwic291cmNlX3VybHMiLCJ1cmwiLCJzdGF0dXNDbGFzcyIsIm9wZW5Gb3IiLCJEdW1teVNjcmFwZUpvYkluZm8iLCJkdXJhdGlvbl9pbl9zIiwiY3JlYXRlZEF0IiwiZm9ybWF0dGVkQ3JlYXRlZEF0IiwidG9Mb2NhbGVTdHJpbmciLCJzZWNvbmRzIiwiZm9ybWF0RHVyYXRpb24iLCJ1Iiwic3RhdGVzIiwic2V0U3RhdGVzIiwianVyaXNkaWN0aW9ucyIsInNldEp1cmlzZGljdGlvbnMiLCJqdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZWxlY3RlZFN0YXRlIiwic2V0U2VsZWN0ZWRTdGF0ZSIsInNlbGVjdGVkSnVyaXNkaWN0aW9uIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24iLCJqdXJpc2RpY3Rpb25JbnB1dFZhbHVlIiwic2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZSIsImlzSW5pdGlhbE1vdW50IiwiaGFuZGxlSW5wdXRDaGFuZ2UiLCJmZXRjaCIsImpzb24iLCJoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyIsImp1cmlzZGljdGlvbk9jZGlkIiwianVyaXNkaWN0aW9uX29jZGlkIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGltaXQiLCJqdXIiLCJqdXJpc2RpY3Rpb25fb2NkaWRfc2x1ZyIsImZpbmQiLCJsb2NhdGlvbiIsImhyZWYiLCJqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCIsImp1cmlzZGljdGlvbkxpbmsiLCJzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCIsInNldFBlb3BsZSIsImdlb2pzb24iLCJzZXRHZW9qc29uIiwic2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZEVuY29kZWQiLCJyZXNwb25zZSIsImhhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZSIsImxvZyIsImxhdGxuZyIsInpvb20iLCJsYXQiLCJsbmciLCJvbkNoYW5nZSIsInBsYWNlaG9sZGVyIiwiY2hpcHMiLCJzZXRDaGlwcyIsImNoaXAiLCJoYW5kbGVSZW1vdmUiLCJpZHgiLCJlbGVtZW50cyIsImlkZW50aXRpZXMiLCJjb25maWdzIiwic2V0Q29uZmlncyIsIm5ld0lkZW50aXR5Iiwic2V0TmV3SWRlbnRpdHkiLCJpZGVudGl0eSIsIm9uU3RhcnRTY3JhcGUiLCJzb3VyY2VVcmxzIiwic2NyYXBlU2NvcGUiLCJzZXRTY3JhcGVTY29wZSIsImN1cnJlbnRVcmwiLCJzZXRDdXJyZW50VXJsIiwiY3VycmVudFNvdXJjZVVybHMiLCJzZXRDdXJyZW50U291cmNlVXJscyIsIm5hbWVDb25maWdzIiwic2V0TmFtZUNvbmZpZ3MiLCJoYW5kbGVTY29wZUNoYW5nZSIsImlzVmFsaWRVcmwiLCJ1cmxTdHJpbmciLCJVUkwiLCJjYW5TdGFydFNjcmFwZSIsImV2ZXJ5IiwidXBkYXRlZFVybHMiLCJoYW5kbGVTb3VyY2VVcmxDaGFuZ2UiLCJyZW1vdmVTb3VyY2VVcmwiLCJzdWJtaXRTY3JhcGUiLCJzZXREYXRhIiwic2NyYXBlTW9kYWxPcGVuIiwic2V0U2NyYXBlTW9kYWxPcGVuIiwicmVkdWNlIiwiYWNjIiwib3RoZXJfbmFtZXMiLCJzc2VVcmwiLCJlcnJvciIsInNzZUVycm9yIiwiZW5kcG9pbnQiLCJzZXRJc0Nvbm5lY3RlZCIsInNldEVycm9yIiwiZXZlbnRTb3VyY2UiLCJzZXRFdmVudFNvdXJjZSIsImdldFVybCIsImNvbm5lY3QiLCJlcyIsIkV2ZW50U291cmNlIiwib25vcGVuIiwib25tZXNzYWdlIiwib25lcnJvciIsImRpc2Nvbm5lY3QiLCJjbG9zZSIsImF1dG9Db25uZWN0IiwidXNlU1NFIiwiZmV0Y2hEYXRhIiwiYXN5bmMiLCJqdXJpc2RpY3Rpb25EYXRhIiwicGVvcGxlRGF0YSIsImFsbCIsImZldGNoSnVyaXNkaWN0aW9uRGF0YSIsImZldGNoUGVvcGxlRGF0YSIsIm9jZGlkIiwiZ2VvX2NlbnRlciIsImVuY29kZWRPY2RpZCIsInNjcmFwZVN0YXR1cyIsImdlb2lkIiwicG9wdWxhdGlvbiIsImRldGFpbHMiLCJib2R5IiwiY29uZmlnIiwiaGVhZGVycyIsIm1ldGhvZCIsInJlZ2lzdGVyQ2l2TWFwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFVQSxNQUFNQSxFQUFTQyxXQU1UQyxFQUNDQyxJQUNvQkgsRUFDZEksdUJBSUxKLEVBQU9LLGNBQWMsSUFBSUMsWUFBWSxZQUFhLENBQzlDQyxPQUFRSixNQU9wQixJQUNJSyxFQURBQyxFQUFtQixFQUduQlQsRUFBT1Usb0JBQXNCLElBQUlDLElBTWpDSCxFQUFlLENBQUNJLEVBQU1DLEtBQ2xCQSxHQUFXRCxFQUNMLDRCQUE0QkEsMEJBQzVCLEdBQ0RaLEVBQU9VLGtCQUFrQkksSUFBSUQsSUFDN0JiLEVBQU9VLGtCQUFrQkksSUFBSUYsS0FDOUJHLFFBQVFDLEtBQUtILEdBQ2JiLEVBQU9VLGtCQUFrQk8sSUFBSUosS0FHckNLLGVBQWUsS0FDWFYsRUFBYSxXQUFZLHlEQUdqQyxNQUFNVyxFQUNGbkIsRUFBT29CLFVBQVVDLFFBQ1ksSUFBN0JyQixFQUFPb0IsVUFBVUUsUUFDZnRCLEVBQU9vQixTQUFTRCxLQUNmSSxHQUFTQSxFQUNWQyxFQUFleEIsRUFBT3dCLGFBU3RCQyxFQUFTRCxFQUNUQSxFQUFhRSxhQUFhLFdBQVksQ0FDcENDLFdBQWFDLEdBQU1BLFNBRXJCQyxFQUNBQyxFQUFvQkMsR0FBVUEsRUFDOUJDLEVBQWdCLENBQUNDLEVBQU9DLEVBQU9DLElBQVVMLEVBRXpDTSxFQUFnQkMsSUFJbEIsR0FBSUMsSUFBNkJOLEVBQzdCLE1BQU0sSUFBSU8sTUFBTSx1SEFHcEJELEVBQTJCRCxHQUt6QkcsRUFBZ0QsS0FDbERGLEVBQTJCTixHQUV6QlMsRUFBa0IsQ0FBQ2xCLEVBQU1tQixFQUFNQyxJQUMxQkwsRUFBeUJmLEVBQU1tQixFQUFNQyxH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REFBbURZLG9CQUUvQzlmLFFBQWVzZ0IsRUFBU25CLE9BQzlCLE1BQU8sQ0FDTGhqQixLQUFNNkQsRUFBTzdELEtBQ2I2b0IsV0FBWWhsQixFQUFPZ2xCLGFBSWpCRixFQUFrQkwsTUFBT00sSUFDN0IsTUFBTUUsRUFBZTFGLG1CQUFtQndGLEdBQ2xDekUsUUFBaUJwQixNQUNyQiw0Q0FBNEMrRixLQUc5QyxhQURxQjNFLEVBQVNuQixRQUNoQmhqQixNQXlCVitvQixFQUFlL29CLEdBQU1BLE1BQU1naEIsV0FBYSxVQUFZLFlBRTFELE9BQU8vbEIsQ0FBSTs7Ozs7O3NCQU1TK0UsR0FBUUEsRUFBSzZvQixXQUNuQixDQUFFckUsSUFBS3hrQixFQUFLNm9CLFdBQVdyRSxJQUFLQyxJQUFLemtCLEVBQUs2b0IsV0FBV3BFLEtBQ2pEOzs7OztZQUtKemtCLEVBQ0UvRSxDQUFJOzs7OzttREFLaUMrRSxFQUFLQSxLQUFLekc7O2lDQUU1Qnd2Qjs7Ozs7Ozt5REFPd0Ivb0IsRUFBS0EsS0FBSzZHOzhDQUNyQjdHLEVBQUtBLEtBQUtzaEI7NENBQ1p0aEIsRUFBS0EsS0FBS2dwQjtpREFDTGhwQixFQUFLQSxLQUFLaXBCLFdBQVdwSDs7Ozs7Ozs2QkFPekNqQzsrQkFDRUM7aUNBQ0VsZDs4QkFDSHlrQjs7OzttQ0E5REdrQixNQUFPWSxJQUNwQ3BDLEdBQW1CLEdBQ25CLE1BQU1xQyxFQUFPLENBQ1hoRyxtQkFBb0JuakIsRUFBS0EsS0FBSzZHLEdBQzlCdWlCLE9BQVEsQ0FDTjlILElBQUs0SCxFQUFRbHBCLEtBQUtzaEIsS0FBT3RoQixFQUFLQSxLQUFLc2hCLElBQ25DL25CLEtBQU15RyxFQUFLQSxLQUFLekcsS0FDaEI4bkIsWUFBYTZILEVBQVFscEIsS0FBS3lsQixXQUMxQlAsV0FBWWdFLEVBQVFscEIsS0FBS2tsQixtQkFHTG5DLE1BQU0saUJBQWtCLENBQzlDc0csUUFBUyxDQUFFLGVBQWdCLG9CQUMzQkMsT0FBUSxPQUNSSCxLQUFNNVgsS0FBS0MsVUFBVTJYO3lCQXFERm5wQixFQUFLQSxLQUFLc2hCO2dDQUNILENBQ1pqQyxLQUFNd0gsRUFDTm5ILFFBeEVhLElBQU1vSCxHQUFtQixHQXlFdENySCxzQkFBc0I7Z0NBRVZ5Rjs7OzsyQkE1RUMsSUFBTTRCLEdBQW1COytCQWlGNUI7Ozs7O2dCQU1oQjdyQixDQUFJOzs7OztnQ0FLY29qQjs7R0FHaEMsRUFJOEIsQ0FDMUJoVSxjQUFjLEVBQ2RELG1CQUFvQixDQUNsQixxQkFDQSxjRS9LTm1mIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMzJdfQ== diff --git a/civicpatch/src/frontend/components/basic/chip.js b/civicpatch/src/frontend/components/basic/chip.js new file mode 100644 index 000000000..1324e5502 --- /dev/null +++ b/civicpatch/src/frontend/components/basic/chip.js @@ -0,0 +1,106 @@ +import { component, useState, useEffect } from "haunted"; +import { html } from "lit-html"; + +function PicoChipsInput({ value = [], onChange, placeholder = "Add..." }) { + const [chips, setChips] = useState(value); + + useEffect(() => { + setChips(value); + }, [value]); + + useEffect(() => { + onChange && onChange(chips); + }, [chips]); + + const handleAdd = (e) => { + e.preventDefault(); + const input = e.target.elements["chip-input"]; + const val = input.value.trim(); + if (val && !chips.includes(val)) { + setChips([...chips, val]); + } + input.value = ""; + }; + + const handleRemove = (idx) => { + setChips(chips.filter((_, i) => i !== idx)); + }; + + return html` + +
    + ${chips.map( + (chip, i) => html` + + ` + )} +
    + +
    +
    + `; +} + +customElements.define( + "pico-chips-input", + component(PicoChipsInput, { useShadowDOM: false }) +); \ No newline at end of file diff --git a/civicpatch/src/frontend/components/modal.js b/civicpatch/src/frontend/components/basic/modal.js similarity index 100% rename from civicpatch/src/frontend/components/modal.js rename to civicpatch/src/frontend/components/basic/modal.js diff --git a/civicpatch/src/frontend/components/hooks/index.js b/civicpatch/src/frontend/components/hooks/index.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/civicpatch/src/frontend/components/hooks/useModal.js b/civicpatch/src/frontend/components/hooks/useModal.js deleted file mode 100644 index 075511355..000000000 --- a/civicpatch/src/frontend/components/hooks/useModal.js +++ /dev/null @@ -1,63 +0,0 @@ -import { useState, useEffect } from "haunted"; -import { createRef } from "lit-html/directives/ref.js"; - -export function useModal(initialOpen = false) { - const [isOpen, setIsOpen] = useState(initialOpen); - const modalRef = createRef(); - - const openModal = () => setIsOpen(true); - const closeModal = () => setIsOpen(false); - - useEffect(() => { - if (isOpen && modalRef.value) { - // Focus the modal when it opens - modalRef.value.focus(); - } - }, [isOpen]); - - // Handle escape key with document listener - useEffect(() => { - const handleKeyDown = (event) => { - if (event.key === 'Escape' && isOpen) { - closeModal(); - } - }; - - if (isOpen) { - document.addEventListener('keydown', handleKeyDown); - - // Cleanup function - runs when isOpen changes to false or component unmounts - return () => { - document.removeEventListener('keydown', handleKeyDown); - }; - } - }, [isOpen, closeModal]); - - // Handle click outside modal - useEffect(() => { - const handleClickOutside = (event) => { - if (modalRef.value && !modalRef.value.contains(event.target) && isOpen) { - closeModal(); - } - }; - - if (isOpen) { - document.addEventListener('mousedown', handleClickOutside); - - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - } - }, [isOpen, closeModal]); - - return { - isOpen, - openModal, - closeModal, - modalProps: { - open: isOpen, - onClose: closeModal, - modalRef: modalRef - } - }; -} \ No newline at end of file diff --git a/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js b/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js index f1ff28240..e3af67a15 100644 --- a/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js +++ b/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js @@ -1,6 +1,5 @@ import { component, useEffect, useState, useCallback } from "haunted"; import { html } from "lit-html"; -import { useModal } from "../hooks/useModal.js"; import { useSSE } from "../hooks/useSse.js"; // <-- Import the hook import "../scrape-history/scrape-history-list.js"; @@ -13,8 +12,20 @@ function JurisdictionPage({ }) { const [data, setData] = useState(null); const [people, setPeople] = useState([]); + const [scrapeModalOpen, setScrapeModalOpen] = useState(false); + console.log("data", data); + const identities = people?.reduce((acc, person) => { + if (acc[person.name]) { + acc[person.name] = [...new Set([...acc[person.name], ...(person.other_names || [])])]; + } else { + acc[person.name] = [...new Set(person.other_names || [])]; + } - const scrapeModal = useModal(false); + return acc; + + }, {}); + + console.log({people, identities}) const sseUrl = jurisdiction_ocdid ? [`${API_URL}/api/v1/sse/jobs/status`, @@ -66,11 +77,11 @@ function JurisdictionPage({ return result.data; }; - const handleScrapeModalClick = (event) => { - scrapeModal.openModal(); - }; + const handleScrapeModalClick = () => setScrapeModalOpen(true); + const handleScrapeModalClose = () => setScrapeModalOpen(false); const handleScrapeStartClick = async (details) => { + setScrapeModalOpen(false); // Optionally close modal on submit const body = { jurisdiction_ocdid: data.data.id, config: { @@ -137,8 +148,13 @@ function JurisdictionPage({ + .modalProps=${{ + open: scrapeModalOpen, + onClose: handleScrapeModalClose, + closeOnBackdropClick: false + }} + .identities=${identities} + > -
      - ${nameConfigs.map( - (cfg, idx) => html` -
    • -
      - ${cfg.canonical} - -
      -
        - ${cfg.alternates.map( - (alt, altIdx) => html` -
      • - ${alt} - -
      • - ` - )} -
      - setNewAlternate(e.target.value)} - placeholder="Add alternate name" - /> - -
    • - ` - )} -
    - - Add identities and their alternate names.
    - Example: Identity "Robert Allen" with alternates "Bob A", "Bob B", etc. -
    - + + +
    `; } -customElements.define("name-config-form", component(NameConfigForm, { useShadowDOM: false })); \ No newline at end of file +customElements.define( + "name-config-form", + component(NameConfigForm, { useShadowDOM: false }) +); \ No newline at end of file diff --git a/civicpatch/src/frontend/components/jurisdiction-page/scrape-modal/scrape-modal.js b/civicpatch/src/frontend/components/jurisdiction-page/scrape-modal/scrape-modal.js index 0f9a4f9d2..e9378772f 100644 --- a/civicpatch/src/frontend/components/jurisdiction-page/scrape-modal/scrape-modal.js +++ b/civicpatch/src/frontend/components/jurisdiction-page/scrape-modal/scrape-modal.js @@ -1,13 +1,9 @@ import { component, useState } from "haunted"; import { html } from "lit-html"; import { ref } from "lit-html/directives/ref.js"; +import "../../basic/modal.js"; -function ScrapeModal({ - onStartScrape, - url = "", - sourceUrls = [], - modalProps = {}, -}) { +function ScrapeModal({ onStartScrape, url = "", sourceUrls = [], modalProps = {}, identities = {} }) { const [scrapeScope, setScrapeScope] = useState("top-level-url"); const [currentUrl, setCurrentUrl] = useState(url); const [currentSourceUrls, setCurrentSourceUrls] = useState(sourceUrls); @@ -91,103 +87,117 @@ function ScrapeModal({ onStartScrape(data); }; - return html` - -
    e.stopPropagation()} ${ref(modalProps.modalRef)}> -
    -

    URLs to Scrape

    -
    - -
    - - - - - -
    - - ${scrapeScope === "top-level-url" - ? html` + const content = html` +
    + + + + + +
    + + ${scrapeScope === "top-level-url" + ? html` +
    + +
    +
    + +
    + ` + : html` + ${currentSourceUrls.map( + (url, index) => html`
    handleSourceUrlChange(index, e)} /> -
    -
    -
    - ` - : html` - ${currentSourceUrls.map( - (url, index) => html` -
    - handleSourceUrlChange(index, e)} - /> - -
    - `, - )} - - `} - -
    - Name Configs -

    - Some people go by multiple names that aren't easily guessable to be - the same identity. Specify alternate names for identities to improve - matching. -

    - -
    - -
    - - -
    -
    -
    + + `, + )} + + `} + +
    + + Name Configs + +
    +

    + Some people go by multiple names that aren't easily guessable to be + the same identity. Specify alternate names for identities to improve + matching. +

    + +
    +
    + `; + + const footer = html` + + + `; + + return html` + `; } diff --git a/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js b/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js index 8f602dcf6..b72a05d97 100644 --- a/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js +++ b/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js @@ -1,6 +1,6 @@ import { component, useState, useEffect } from "haunted"; import { html } from "lit-html"; -import "../modal.js"; +import "../basic/modal.js"; const DUMMY_DATA = [ { id: 1, name: "Scrape Job 1", status: "Completed", start_date: "2024-01-01", duration_in_s: 120, From daee22232843e62e0cfc1441938957bb0b0781a5 Mon Sep 17 00:00:00 2001 From: "michelle@shelltr.me" Date: Tue, 3 Feb 2026 15:28:50 -0800 Subject: [PATCH 2/2] [civicpatch] Scaffold out merge/edit UI --- api.civicpatch.org/src/database.py | 20 +- api.civicpatch.org/src/github_service.py | 63 +- api.civicpatch.org/src/routers/api/jobs.py | 69 +++ .../src/routers/api/jurisdictions.py | 4 +- civicpatch/src/frontend/build/bundle.js | 575 ++++++++++++++---- .../src/frontend/components/basic/modal.js | 10 + .../frontend/components/basic/person-card.js | 377 ++++++++++++ .../components/editable-people-list.js | 126 ++++ .../jurisdiction-page/jurisdiction-page.js | 36 +- .../components/scrape-history/index.js | 3 +- .../scrape-history/scrape-details.js | 64 -- .../scrape-history/scrape-history-list.js | 36 +- .../scrape-history/scrape-history-modal.js | 46 ++ .../src/frontend/hooks/useRovingFocus.js | 28 + .../templates/pages/jurisdiction.html | 1 - shared/utils/data_path_utils.py | 3 - 16 files changed, 1246 insertions(+), 215 deletions(-) create mode 100644 civicpatch/src/frontend/components/basic/person-card.js create mode 100644 civicpatch/src/frontend/components/editable-people-list.js delete mode 100644 civicpatch/src/frontend/components/scrape-history/scrape-details.js create mode 100644 civicpatch/src/frontend/components/scrape-history/scrape-history-modal.js create mode 100644 civicpatch/src/frontend/hooks/useRovingFocus.js diff --git a/api.civicpatch.org/src/database.py b/api.civicpatch.org/src/database.py index fe12fc812..0f99d2d0b 100644 --- a/api.civicpatch.org/src/database.py +++ b/api.civicpatch.org/src/database.py @@ -612,7 +612,7 @@ async def get_job(request_id: str): async with pool.connection() as conn, conn.cursor() as cur: await cur.execute( """ - SELECT status, progress, arguments_json, result_json, created_at, updated_at FROM jobs + SELECT status, progress, arguments_json, result_json, created_at, updated_at, pull_request_url FROM jobs WHERE request_id = %s; """, (request_id,), @@ -625,9 +625,9 @@ async def get_job(request_id: str): "progress": row[1], "arguments_json": row[2], "result_json": row[3], - "pull_request_url": None, # TODO: implement "created_at": to_iso(row[4]), "updated_at": to_iso(row[5]), + "pull_request_url": row[6], } return None @@ -696,6 +696,7 @@ async def update_job_result(request_id: str, result_json: Any): async def update_job_pull_request_url(request_id: str, pull_request_url: str = None): async with pool.connection() as conn: + # Update jobs table result = await conn.execute( """ UPDATE jobs @@ -706,7 +707,20 @@ async def update_job_pull_request_url(request_id: str, pull_request_url: str = N ( pull_request_url, request_id - ), + ), + ) + # Update status table + await conn.execute( + """ + UPDATE status + SET status = %s, + updated_at = CURRENT_TIMESTAMP + WHERE request_id = %s; + """, + ( + "OPEN_PULL_REQUEST", + request_id + ), ) if result.rowcount == 0: return False diff --git a/api.civicpatch.org/src/github_service.py b/api.civicpatch.org/src/github_service.py index 80c58be51..729905a1a 100644 --- a/api.civicpatch.org/src/github_service.py +++ b/api.civicpatch.org/src/github_service.py @@ -1,9 +1,14 @@ import os -from typing import List +from typing import List, Optional +import json +import yaml +import base64 +import httpx import requests from schemas import PullRequest +timeout = httpx.Timeout(60.0) GITHUB_WORKFLOW_TOKEN = os.getenv("GITHUB_WORKFLOW_TOKEN") @@ -91,17 +96,24 @@ def trigger_github_data_intake_workflow( return True -def get_github_file_contents(github_file_path: str) -> str | None: +async def get_github_file_contents( + github_file_path: str, + ref: Optional[str] = None, + ) -> str | None: headers = { "Authorization": f"Bearer {GITHUB_WORKFLOW_TOKEN}", "Accept": "application/vnd.github.raw", "X-GitHub-Api-Version": "2022-11-28", } + print("Fetching GitHub file:", github_file_path, "ref:", ref) url = ( f"https://api.github.com/repos/CivicPatch/open-data/contents/{github_file_path}" ) - response = requests.get(url, headers=headers) + if ref: + url += f"?ref={ref}" + async with httpx.AsyncClient(timeout=timeout) as client: + response = await client.get(url, headers=headers) if response.status_code == 200: file_content = response.text @@ -118,7 +130,7 @@ def get_open_pull_requests(github_workflow_token: str) -> List[PullRequest]: "X-GitHub-Api-Version": "2022-11-28", } - params = "state=open&per_page=100" + params = "state=open&per_page=100&sort=created&direction=desc" url = f"https://api.github.com/repos/CivicPatch/open-data/pulls?{params}" response = requests.get(url, headers=headers) @@ -131,3 +143,46 @@ def get_open_pull_requests(github_workflow_token: str) -> List[PullRequest]: else: print("Error fetching pull requests:", response.status_code, response.text) return [] + +def get_open_pull_request_by_branch_suffix(suffix: str) -> List[PullRequest]: + pull_requests = get_open_pull_requests(GITHUB_WORKFLOW_TOKEN) + matching_prs = [pr for pr in pull_requests if pr.branch_name.endswith(suffix)] + return matching_prs + +async def update_pull_request_file( + branch_name: str, + file_path: str, + new_data: str, + commit_message: str = "Automated update via API" +) -> bool: + headers = { + "Authorization": f"Bearer {GITHUB_WORKFLOW_TOKEN}", + "Accept": "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", + } + + # Get file SHA + contents_url = f"https://api.github.com/repos/{repo}/contents/{file_path}?ref={branch_name}" + contents_response = await httpx.get(contents_url, headers=headers) + if contents_response.status_code != 200: + print("Error fetching file contents:", contents_response.status_code, contents_response.text) + return False + sha = contents_response.json()["sha"] + + # Prepare new content (base64 encoded) + encoded_content = base64.b64encode(new_data.encode("utf-8")).decode("utf-8") + data = { + "message": commit_message, + "content": encoded_content, + "sha": sha, + "branch": branch_name + } + + # Update file + update_response = await httpx.put(contents_url, headers=headers, json=data) + if update_response.status_code in [200, 201]: + print("File updated successfully.") + return True + else: + print("Error updating file:", update_response.status_code, update_response.text) + return False \ No newline at end of file diff --git a/api.civicpatch.org/src/routers/api/jobs.py b/api.civicpatch.org/src/routers/api/jobs.py index 40ccfe66d..bfc51b07a 100644 --- a/api.civicpatch.org/src/routers/api/jobs.py +++ b/api.civicpatch.org/src/routers/api/jobs.py @@ -4,6 +4,7 @@ from pydantic import BaseModel from schemas import Identity from github_service import trigger_people_job_workflow +import github_service as github_service from services.api_service import can_make_api_request, can_call_request_id from database import ( get_job, @@ -13,9 +14,12 @@ update_job_result, update_job_pull_request_url ) +import database as database from utils.auth import get_user +import shared.utils.data_path_utils as data_path_utils import shared.utils.id_utils import json +import yaml from services.memory_pub_sub_service import memory_pubsub class GetJobResponse(BaseModel): @@ -63,6 +67,11 @@ class PostJobResultRequest(BaseModel): class ErrorResponse(BaseModel): error: str +class PostJobPullRequestDataRequest(BaseModel): + branch_name: str + file_path: str + data: str + def get_router(api_key_header): router = APIRouter() @@ -247,6 +256,66 @@ async def post_job_result_endpoint( response = {"request_id": request_id, "errors": errors} return response + @router.get( + "/people/pull_request/open", + include_in_schema=False + ) + async def get_open_people_pull_requests_endpoint( + jurisdiction_ocdid: Optional[str] = None + ): + branch_name_suffix = shared.utils.id_utils.jurisdiction_ocdid_to_git_branch(jurisdiction_ocdid) + print("branch_name_suffix:", branch_name_suffix) + open_pull_requests = await github_service.get_open_pull_request_by_branch_suffix("people", branch_name_suffix) + return {"data": open_pull_requests} + + @router.get( + "/people/{request_id}/pull_request/data", + include_in_schema=False + ) + async def get_job_pull_request_data_endpoint(request_id: str): + # Get the pull request url from the job + job = await database.get_job(request_id) + if not job: + return JSONResponse( + content=ErrorResponse(error="Job not found").model_dump(), + status_code=404 + ) + jurisdiction_ocdid = job['arguments_json'].get('jurisdiction_ocdid') + print("jurisdiction_ocdid:", jurisdiction_ocdid) + file_path = data_path_utils.get_data_file_path(jurisdiction_ocdid) + # Chop off leading "/app/" from file_path + if file_path.startswith("/app/"): + file_path = file_path[len("/app/"):] + branch_name = shared.utils.id_utils.jurisdiction_ocdid_to_git_branch( + jurisdiction_ocdid, + request_id + ) + print("branch_name:", branch_name) + github_response = await github_service.get_github_file_contents( + github_file_path=file_path, + ref=branch_name + ) + response = yaml.safe_load(github_response) if github_response else None + + return {"request_id": request_id, "data": response} + + @router.post( + "/people/{request_id}/pull_request/data", + include_in_schema=False + ) + async def post_job_pull_request_data_endpoint( + request_id: str, + request: PostJobPullRequestDataRequest, + user: Identity = Depends(get_user) + ): + user_name = user.email + _github_response = await github_service.update_pull_request_file( + branch_name=request.branch_name, + file_path=request.file_path, + new_data=request.data, + commit_message=f"Data update by {user_name}" + ) + return {"request_id": request_id, "status": "success"} @router.delete( "/people/{request_id}", diff --git a/api.civicpatch.org/src/routers/api/jurisdictions.py b/api.civicpatch.org/src/routers/api/jurisdictions.py index b07f1d0c1..1d1cbcca3 100644 --- a/api.civicpatch.org/src/routers/api/jurisdictions.py +++ b/api.civicpatch.org/src/routers/api/jurisdictions.py @@ -92,7 +92,7 @@ async def list_available_jurisdictions_endpoint( state: str, num_jurisdictions: int = 10, ): - jurisdictions_file_content = github_service.get_github_file_contents( + jurisdictions_file_content = await github_service.get_github_file_contents( f"data_source/{state}/jurisdictions_metadata.yml" ) if jurisdictions_file_content is None: @@ -100,7 +100,7 @@ async def list_available_jurisdictions_endpoint( status_code=404, detail="Could not find jurisdictions file" ) - open_pull_requests = github_service.get_open_pull_requests( + open_pull_requests = await github_service.get_open_pull_requests( GITHUB_WORKFLOW_TOKEN ) jurisdictions_data = yaml.safe_load(jurisdictions_file_content) diff --git a/civicpatch/src/frontend/build/bundle.js b/civicpatch/src/frontend/build/bundle.js index 20ddf6780..42dab88a5 100644 --- a/civicpatch/src/frontend/build/bundle.js +++ b/civicpatch/src/frontend/build/bundle.js @@ -4,43 +4,43 @@ import{registerCivMap as e}from'@components'; * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const t=globalThis,i=e=>{t.emitLitDebugLogEvents&&t.dispatchEvent(new CustomEvent('lit-debug',{detail:e}))};let s,o=0;t.litIssuedWarnings??=new Set,s=(e,i)=>{i+=e?` See https://lit.dev/msg/${e} for more information.`:'',t.litIssuedWarnings.has(i)||t.litIssuedWarnings.has(e)||(console.warn(i),t.litIssuedWarnings.add(i))},queueMicrotask(()=>{s('dev-mode','Lit is in dev mode. Not recommended for production!')});const n=t.ShadyDOM?.inUse&&!0===t.ShadyDOM?.noPatch?t.ShadyDOM.wrap:e=>e,r=t.trustedTypes,a=r?r.createPolicy('lit-html',{createHTML:e=>e}):void 0,l=e=>e,c=(e,t,i)=>l,d=e=>{if(D!==c)throw new Error('Attempted to overwrite existing lit-html security policy. setSanitizeDOMValueFactory should be called at most once.');D=e},u=()=>{D=c},p=(e,t,i)=>D(e,t,i),h='$lit$',m=`lit$${Math.random().toFixed(9).slice(2)}$`,f='?'+m,g=`<${f}>`,b=document,_=()=>b.createComment(''),v=e=>null===e||'object'!=typeof e&&'function'!=typeof e,y=Array.isArray,$='[ \t\n\f\r]',w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,S=/-->/g,x=/>/g,C=new RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,'g'),k=/'/g,P=/"/g,E=/^(?:script|style|textarea|title)$/i,T=(O=1,(e,...t)=>(e.some(e=>void 0===e)&&console.warn('Some template strings are undefined.\nThis is probably caused by illegal octal escape sequences.'),t.some(e=>e?._$litStatic$)&&s('','Static values \'literal\' or \'unsafeStatic\' cannot be used as values to non-static templates.\nPlease use the static \'html\' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions'),{_$litType$:O,strings:e,values:t}));var O;const N=Symbol.for('lit-noChange'),M=Symbol.for('lit-nothing'),U=new WeakMap,j=b.createTreeWalker(b,129);let D=c;function V(e,t){if(!y(e)||!e.hasOwnProperty('raw')){let e='invalid template strings array';throw e='\n Internal Error: expected template strings to be an array\n with a \'raw\' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you\'re using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n '.trim().replace(/\n */g,'\n'),new Error(e)}return void 0!==a?a.createHTML(t):t}class R{constructor({strings:e,_$litType$:t},o){let n;this.parts=[];let a=0,l=0;const c=e.length-1,d=this.parts,[u,p]=((e,t)=>{const i=e.length-1,s=[];let o,n=2===t?'':3===t?'':'',r=w;for(let t=0;t'===l[0]?(r=o??w,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?C:'"'===l[3]?P:k):r===P||r===k?r=C:r===S||r===x?r=w:(r=C,o=void 0);console.assert(-1===c||r===C||r===k||r===P,'unexpected parse state B');const u=r===C&&e[t+1].startsWith('/>')?' ':'';n+=r===w?i+g:c>=0?(s.push(a),i.slice(0,c)+h+i.slice(c)+m+u):i+m+(-2===c?t:u)}return[V(e,n+(e[i]||'')+(2===t?'':3===t?'':'')),s]})(e,t);if(this.el=R.createElement(u,o),j.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=j.nextNode())&&d.length0){n.textContent=r?r.emptyScript:'';for(let i=0;i" contains a duplicate "disabled" attribute. The error was detected in the following template: \n`'+e.join('${...}')+'`');i&&i({kind:'template prep',template:this,clonableTemplate:this.el,parts:this.parts,strings:e})}static createElement(e,t){const i=b.createElement('template');return i.innerHTML=e,i}}function z(e,t,i=e,s){if(t===N)return t;let o=void 0!==s?i.__directives?.[s]:i.__directive;const n=v(t)?void 0:t._$litDirective$;return o?.constructor!==n&&(o?._$notifyDirectiveConnectionChanged?.(!1),void 0===n?o=void 0:(o=new n(e),o._$initialize(e,i,s)),void 0!==s?(i.__directives??=[])[s]=o:i.__directive=o),void 0!==o&&(t=z(e,o._$resolve(e,t.values),o,s)),t}class A{constructor(e,t){this._$parts=[],this._$disconnectableChildren=void 0,this._$template=e,this._$parent=t}get parentNode(){return this._$parent.parentNode}get _$isConnected(){return this._$parent._$isConnected}_clone(e){const{el:{content:t},parts:i}=this._$template,s=(e?.creationScope??b).importNode(t,!0);j.currentNode=s;let o=j.nextNode(),n=0,r=0,a=i[0];for(;void 0!==a;){if(n===a.index){let t;2===a.type?t=new L(o,o.nextSibling,this,e):1===a.type?t=new a.ctor(o,a.name,a.strings,this,e):6===a.type&&(t=new B(o,this,e)),this._$parts.push(t),a=i[++r]}n!==a?.index&&(o=j.nextNode(),n++)}return j.currentNode=b,s}_update(e){let t=0;for(const s of this._$parts)void 0!==s&&(i&&i({kind:'set part',part:s,value:e[t],valueIndex:t,values:e,templateInstance:this}),void 0!==s.strings?(s._$setValue(e,s,t),t+=s.strings.length-2):s._$setValue(e[t])),t++}}class L{get _$isConnected(){return this._$parent?._$isConnected??this.__isConnected}constructor(e,t,i,s){this.type=2,this._$committedValue=M,this._$disconnectableChildren=void 0,this._$startNode=e,this._$endNode=t,this._$parent=i,this.options=s,this.__isConnected=s?.isConnected??!0,this._textSanitizer=void 0}get parentNode(){let e=n(this._$startNode).parentNode;const t=this._$parent;return void 0!==t&&11===e?.nodeType&&(e=t.parentNode),e}get startNode(){return this._$startNode}get endNode(){return this._$endNode}_$setValue(e,t=this){if(null===this.parentNode)throw new Error('This `ChildPart` has no `parentNode` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit\'s control such that the part\'s marker nodes were ejected from DOM. For example, setting the element\'s `innerHTML` or `textContent` can do this.');if(e=z(this,e,t),v(e))e===M||null==e||''===e?(this._$committedValue!==M&&(i&&i({kind:'commit nothing to child',start:this._$startNode,end:this._$endNode,parent:this._$parent,options:this.options}),this._$clear()),this._$committedValue=M):e!==this._$committedValue&&e!==N&&this._commitText(e);else if(void 0!==e._$litType$)this._commitTemplateResult(e);else if(void 0!==e.nodeType){if(this.options?.host===e)return this._commitText('[probable mistake: rendered a template\'s host in itself (commonly caused by writing ${this} in a template]'),void console.warn('Attempted to render the template host',e,'inside itself. This is almost always a mistake, and in dev mode ','we render some warning text. In production however, we\'ll ','render it, which will usually result in an error, and sometimes ','in the element disappearing from the DOM.');this._commitNode(e)}else(e=>y(e)||'function'==typeof e?.[Symbol.iterator])(e)?this._commitIterable(e):this._commitText(e)}_insert(e){return n(n(this._$startNode).parentNode).insertBefore(e,this._$endNode)}_commitNode(e){if(this._$committedValue!==e){if(this._$clear(),D!==c){const e=this._$startNode.parentNode?.nodeName;if('STYLE'===e||'SCRIPT'===e){let t='Forbidden';throw t='STYLE'===e?'Lit does not support binding inside style nodes. This is a security risk, as style injection attacks can exfiltrate data and spoof UIs. Consider instead using css`...` literals to compose styles, and do dynamic styling with css custom properties, ::parts, s, and by mutating the DOM rather than stylesheets.':'Lit does not support binding inside script nodes. This is a security risk, as it could allow arbitrary code execution.',new Error(t)}}i&&i({kind:'commit node',start:this._$startNode,parent:this._$parent,value:e,options:this.options}),this._$committedValue=this._insert(e)}}_commitText(e){if(this._$committedValue!==M&&v(this._$committedValue)){const t=n(this._$startNode).nextSibling;void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}else{const t=b.createTextNode('');this._commitNode(t),void 0===this._textSanitizer&&(this._textSanitizer=p(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}this._$committedValue=e}_commitTemplateResult(e){const{values:t,_$litType$:s}=e,o='number'==typeof s?this._$getTemplate(e):(void 0===s.el&&(s.el=R.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$committedValue?._$template===o)i&&i({kind:'template updating',template:o,instance:this._$committedValue,parts:this._$committedValue._$parts,options:this.options,values:t}),this._$committedValue._update(t);else{const e=new A(o,this),s=e._clone(this.options);i&&i({kind:'template instantiated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),e._update(t),i&&i({kind:'template instantiated and updated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),this._commitNode(s),this._$committedValue=e}}_$getTemplate(e){let t=U.get(e.strings);return void 0===t&&U.set(e.strings,t=new R(e)),t}_commitIterable(e){y(this._$committedValue)||(this._$committedValue=[],this._$clear());const t=this._$committedValue;let i,s=0;for(const o of e)s===t.length?t.push(i=new L(this._insert(_()),this._insert(_()),this,this.options)):i=t[s],i._$setValue(o),s++;s2||''!==i[0]||''!==i[1]?(this._$committedValue=new Array(i.length-1).fill(new String),this.strings=i):this._$committedValue=M,this._sanitizer=void 0}_$setValue(e,t=this,i,s){const o=this.strings;let n=!1;if(void 0===o)e=z(this,e,t,0),n=!v(e)||e!==this._$committedValue&&e!==N,n&&(this._$committedValue=e);else{const s=e;let r,a;for(e=o[0],r=0;r\` has a \`@${t}=...\` listener with invalid content. Event listeners in templates must have exactly one expression and no surrounding text.`)}_$setValue(e,t=this){if((e=z(this,e,t,0)??M)===N)return;const s=this._$committedValue,o=e===M&&s!==M||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,n=e!==M&&(s===M||o);i&&i({kind:'commit event listener',element:this.element,name:this.name,value:e,options:this.options,removeListener:o,addListener:n,oldListener:s}),o&&this.element.removeEventListener(this.name,this,s),n&&this.element.addEventListener(this.name,this,e),this._$committedValue=e}handleEvent(e){'function'==typeof this._$committedValue?this._$committedValue.call(this.options?.host??this.element,e):this._$committedValue.handleEvent(e)}}class B{constructor(e,t,i){this.element=e,this.type=6,this._$disconnectableChildren=void 0,this._$parent=t,this.options=i}get _$isConnected(){return this._$parent._$isConnected}_$setValue(e){i&&i({kind:'commit to element binding',element:this.element,value:e,options:this.options}),z(this,e)}}const H=t.litHtmlPolyfillSupportDevMode;H?.(R,L),(t.litHtmlVersions??=[]).push('3.3.1'),t.litHtmlVersions.length>1&&queueMicrotask(()=>{s('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')});const J=(e,t,s)=>{if(null==t)throw new TypeError(`The container to render into may not be ${t}`);const n=o++,r=s?.renderBefore??t;let a=r._$litPart$;if(i&&i({kind:'begin render',id:n,value:e,container:t,options:s,part:a}),void 0===a){const e=s?.renderBefore??null;r._$litPart$=a=new L(t.insertBefore(_(),e),e,void 0,s??{})}return a._$setValue(e),i&&i({kind:'end render',id:n,value:e,container:t,options:s,part:a}),a};let Q;J.setSanitizer=d,J.createSanitizer=p,J._testOnlyClearSanitizerFactoryDoNotCallOrElse=u;let Z=0;function Y(e){Q=e}function G(){Q=null,Z=0}const X=Symbol('haunted.phase'),K=Symbol('haunted.hook'),ee=Symbol('haunted.update'),te=Symbol('haunted.commit'),ie=Symbol('haunted.effects'),se=Symbol('haunted.layoutEffects'),oe='haunted.context';class ne{update;host;virtual;[K];[ie];[se];constructor(e,t){this.update=e,this.host=t,this[K]=new Map,this[ie]=[],this[se]=[]}run(e){Y(this);let t=e();return G(),t}_runEffects(e){let t=this[e];Y(this);for(let e of t)e.call(this);G()}runEffects(){this._runEffects(ie)}runLayoutEffects(){this._runEffects(se)}teardown(){this[K].forEach(e=>{'function'==typeof e.teardown&&e.teardown()})}}const re=Promise.resolve().then.bind(Promise.resolve());function ae(){let e,t=[];function i(){e=null;let i=t;t=[];for(var s=0,o=i.length;s{t.push(s),null==e&&(e=re(i))}}const le=ae(),ce=ae();class de{renderer;host;state;[X];_updateQueued;constructor(e,t){this.renderer=e,this.host=t,this.state=new ne(this.update.bind(this),t),this[X]=null,this._updateQueued=!1}update(){this._updateQueued||(le(()=>{let e=this.handlePhase(ee);ce(()=>{this.handlePhase(te,e),ce(()=>{this.handlePhase(ie)})}),this._updateQueued=!1}),this._updateQueued=!0)}handlePhase(e,t){switch(this[X]=e,e){case te:return this.commit(t),void this.runEffects(se);case ee:return this.render();case ie:return this.runEffects(ie)}}render(){return this.state.run(()=>this.renderer.call(this.host,this.host))}runEffects(e){this.state._runEffects(e)}teardown(){this.state.teardown()}}function ue(e){class t extends de{frag;constructor(e,t,i){super(e,i||t),this.frag=t}commit(t){e(t,this.frag)}}return function(e,i,s){const o=(s||i||{}).baseElement||HTMLElement,{observedAttributes:n=[],useShadowDOM:r=!0,shadowRootInit:a={}}=s||i||{};class l extends o{_scheduler;static get observedAttributes(){return e.observedAttributes||n||[]}constructor(){super(),!1===r?this._scheduler=new t(e,this):(this.attachShadow({mode:'open',...a}),this._scheduler=new t(e,this.shadowRoot,this))}connectedCallback(){this._scheduler.update()}disconnectedCallback(){this._scheduler.teardown()}attributeChangedCallback(e,t,i){if(t===i)return;let s=''===i||i;Reflect.set(this,((e='')=>e.replace(/-+([a-z])?/g,(e,t)=>t?t.toUpperCase():''))(e),s)}}const c=new Proxy(o.prototype,{getPrototypeOf:e=>e,set(e,t,i,s){let o;return t in e?(o=Object.getOwnPropertyDescriptor(e,t),o&&o.set?(o.set.call(s,i),!0):(Reflect.set(e,t,i,s),!0)):(o='symbol'==typeof t||'_'===t[0]?{enumerable:!0,configurable:!0,writable:!0,value:i}:function(e){let t=e,i=!1;return Object.freeze({enumerable:!0,configurable:!0,get:()=>t,set(e){i&&t===e||(i=!0,t=e,this._scheduler&&this._scheduler.update())}})}(i),Object.defineProperty(s,t,o),o.set&&o.set.call(s,i),!0)}});return Object.setPrototypeOf(l.prototype,c),l}}class pe{id;state;constructor(e,t){this.id=e,this.state=t}}function he(e,...t){let i=Z++,s=Q[K],o=s.get(i);return o||(o=new e(i,Q,...t),s.set(i,o)),o.update(...t)}function me(e){return he.bind(null,e)}function fe(e){return me(class extends pe{callback;lastValues;values;_teardown;constructor(t,i,s,o){super(t,i),e(i,this)}update(e,t){this.callback=e,this.values=t}call(){const e=!this.values||this.hasChanged();this.lastValues=this.values,e&&this.run()}run(){this.teardown(),this._teardown=this.callback.call(this.state)}teardown(){'function'==typeof this._teardown&&this._teardown()}hasChanged(){return!this.lastValues||this.values.some((e,t)=>this.lastValues[t]!==e)}})}function ge(e,t){e[ie].push(t)}const be=fe(ge),_e=me(class extends pe{Context;value;_ranEffect;_unsubscribe;constructor(e,t,i){super(e,t),this._updater=this._updater.bind(this),this._ranEffect=!1,this._unsubscribe=null,ge(t,this)}update(e){if(this.state.virtual)throw new Error('can\'t be used with virtual components');return this.Context!==e&&(this._subscribe(e),this.Context=e),this.value}call(){this._ranEffect||(this._ranEffect=!0,this._unsubscribe&&this._unsubscribe(),this._subscribe(this.Context),this.state.update())}_updater(e){this.value=e,this.state.update()}_subscribe(e){const t={Context:e,callback:this._updater};this.state.host.dispatchEvent(new CustomEvent(oe,{detail:t,bubbles:!0,cancelable:!0,composed:!0}));const{unsubscribe:i=null,value:s}=t;this.value=i?s:e.defaultValue,this._unsubscribe=i}teardown(){this._unsubscribe&&this._unsubscribe()}});const ve=me(class extends pe{value;values;constructor(e,t,i,s){super(e,t),this.value=i(),this.values=s}update(e,t){return this.hasChanged(t)&&(this.values=t,this.value=e()),this.value}hasChanged(e=[]){return e.some((e,t)=>this.values[t]!==e)}}),ye=(e,t)=>ve(()=>e,t);fe(function(e,t){e[se].push(t)});const $e=me(class extends pe{args;constructor(e,t,i){if(super(e,t),this.updater=this.updater.bind(this),'function'==typeof i){i=i()}this.makeArgs(i)}update(){return this.args}updater(e){const[t]=this.args;if('function'==typeof e){e=e(t)}Object.is(t,e)||(this.makeArgs(e),this.state.update())}makeArgs(e){this.args=Object.freeze([e,this.updater])}}); +const t=globalThis,i=e=>{t.emitLitDebugLogEvents&&t.dispatchEvent(new CustomEvent('lit-debug',{detail:e}))};let s,o=0;t.litIssuedWarnings??=new Set,s=(e,i)=>{i+=e?` See https://lit.dev/msg/${e} for more information.`:'',t.litIssuedWarnings.has(i)||t.litIssuedWarnings.has(e)||(console.warn(i),t.litIssuedWarnings.add(i))},queueMicrotask(()=>{s('dev-mode','Lit is in dev mode. Not recommended for production!')});const n=t.ShadyDOM?.inUse&&!0===t.ShadyDOM?.noPatch?t.ShadyDOM.wrap:e=>e,r=t.trustedTypes,a=r?r.createPolicy('lit-html',{createHTML:e=>e}):void 0,l=e=>e,c=(e,t,i)=>l,d=e=>{if(U!==c)throw new Error('Attempted to overwrite existing lit-html security policy. setSanitizeDOMValueFactory should be called at most once.');U=e},p=()=>{U=c},u=(e,t,i)=>U(e,t,i),h='$lit$',m=`lit$${Math.random().toFixed(9).slice(2)}$`,f='?'+m,g=`<${f}>`,b=document,v=()=>b.createComment(''),_=e=>null===e||'object'!=typeof e&&'function'!=typeof e,y=Array.isArray,$='[ \t\n\f\r]',w=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,x=/-->/g,S=/>/g,k=new RegExp(`>|${$}(?:([^\\s"'>=/]+)(${$}*=${$}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,'g'),C=/'/g,P=/"/g,E=/^(?:script|style|textarea|title)$/i,O=(j=1,(e,...t)=>(e.some(e=>void 0===e)&&console.warn('Some template strings are undefined.\nThis is probably caused by illegal octal escape sequences.'),t.some(e=>e?._$litStatic$)&&s('','Static values \'literal\' or \'unsafeStatic\' cannot be used as values to non-static templates.\nPlease use the static \'html\' tag function. See https://lit.dev/docs/templates/expressions/#static-expressions'),{_$litType$:j,strings:e,values:t}));var j;const N=Symbol.for('lit-noChange'),T=Symbol.for('lit-nothing'),M=new WeakMap,D=b.createTreeWalker(b,129);let U=c;function R(e,t){if(!y(e)||!e.hasOwnProperty('raw')){let e='invalid template strings array';throw e='\n Internal Error: expected template strings to be an array\n with a \'raw\' field. Faking a template strings array by\n calling html or svg like an ordinary function is effectively\n the same as calling unsafeHtml and can lead to major security\n issues, e.g. opening your code up to XSS attacks.\n If you\'re using the html or svg tagged template functions normally\n and still seeing this error, please file a bug at\n https://github.com/lit/lit/issues/new?template=bug_report.md\n and include information about your build tooling, if any.\n '.trim().replace(/\n */g,'\n'),new Error(e)}return void 0!==a?a.createHTML(t):t}class z{constructor({strings:e,_$litType$:t},o){let n;this.parts=[];let a=0,l=0;const c=e.length-1,d=this.parts,[p,u]=((e,t)=>{const i=e.length-1,s=[];let o,n=2===t?'':3===t?'':'',r=w;for(let t=0;t'===l[0]?(r=o??w,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?k:'"'===l[3]?P:C):r===P||r===C?r=k:r===x||r===S?r=w:(r=k,o=void 0);console.assert(-1===c||r===k||r===C||r===P,'unexpected parse state B');const p=r===k&&e[t+1].startsWith('/>')?' ':'';n+=r===w?i+g:c>=0?(s.push(a),i.slice(0,c)+h+i.slice(c)+m+p):i+m+(-2===c?t:p)}return[R(e,n+(e[i]||'')+(2===t?'':3===t?'':'')),s]})(e,t);if(this.el=z.createElement(p,o),D.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=D.nextNode())&&d.length0){n.textContent=r?r.emptyScript:'';for(let i=0;i" contains a duplicate "disabled" attribute. The error was detected in the following template: \n`'+e.join('${...}')+'`');i&&i({kind:'template prep',template:this,clonableTemplate:this.el,parts:this.parts,strings:e})}static createElement(e,t){const i=b.createElement('template');return i.innerHTML=e,i}}function V(e,t,i=e,s){if(t===N)return t;let o=void 0!==s?i.__directives?.[s]:i.__directive;const n=_(t)?void 0:t._$litDirective$;return o?.constructor!==n&&(o?._$notifyDirectiveConnectionChanged?.(!1),void 0===n?o=void 0:(o=new n(e),o._$initialize(e,i,s)),void 0!==s?(i.__directives??=[])[s]=o:i.__directive=o),void 0!==o&&(t=V(e,o._$resolve(e,t.values),o,s)),t}class A{constructor(e,t){this._$parts=[],this._$disconnectableChildren=void 0,this._$template=e,this._$parent=t}get parentNode(){return this._$parent.parentNode}get _$isConnected(){return this._$parent._$isConnected}_clone(e){const{el:{content:t},parts:i}=this._$template,s=(e?.creationScope??b).importNode(t,!0);D.currentNode=s;let o=D.nextNode(),n=0,r=0,a=i[0];for(;void 0!==a;){if(n===a.index){let t;2===a.type?t=new L(o,o.nextSibling,this,e):1===a.type?t=new a.ctor(o,a.name,a.strings,this,e):6===a.type&&(t=new H(o,this,e)),this._$parts.push(t),a=i[++r]}n!==a?.index&&(o=D.nextNode(),n++)}return D.currentNode=b,s}_update(e){let t=0;for(const s of this._$parts)void 0!==s&&(i&&i({kind:'set part',part:s,value:e[t],valueIndex:t,values:e,templateInstance:this}),void 0!==s.strings?(s._$setValue(e,s,t),t+=s.strings.length-2):s._$setValue(e[t])),t++}}class L{get _$isConnected(){return this._$parent?._$isConnected??this.__isConnected}constructor(e,t,i,s){this.type=2,this._$committedValue=T,this._$disconnectableChildren=void 0,this._$startNode=e,this._$endNode=t,this._$parent=i,this.options=s,this.__isConnected=s?.isConnected??!0,this._textSanitizer=void 0}get parentNode(){let e=n(this._$startNode).parentNode;const t=this._$parent;return void 0!==t&&11===e?.nodeType&&(e=t.parentNode),e}get startNode(){return this._$startNode}get endNode(){return this._$endNode}_$setValue(e,t=this){if(null===this.parentNode)throw new Error('This `ChildPart` has no `parentNode` and therefore cannot accept a value. This likely means the element containing the part was manipulated in an unsupported way outside of Lit\'s control such that the part\'s marker nodes were ejected from DOM. For example, setting the element\'s `innerHTML` or `textContent` can do this.');if(e=V(this,e,t),_(e))e===T||null==e||''===e?(this._$committedValue!==T&&(i&&i({kind:'commit nothing to child',start:this._$startNode,end:this._$endNode,parent:this._$parent,options:this.options}),this._$clear()),this._$committedValue=T):e!==this._$committedValue&&e!==N&&this._commitText(e);else if(void 0!==e._$litType$)this._commitTemplateResult(e);else if(void 0!==e.nodeType){if(this.options?.host===e)return this._commitText('[probable mistake: rendered a template\'s host in itself (commonly caused by writing ${this} in a template]'),void console.warn('Attempted to render the template host',e,'inside itself. This is almost always a mistake, and in dev mode ','we render some warning text. In production however, we\'ll ','render it, which will usually result in an error, and sometimes ','in the element disappearing from the DOM.');this._commitNode(e)}else(e=>y(e)||'function'==typeof e?.[Symbol.iterator])(e)?this._commitIterable(e):this._commitText(e)}_insert(e){return n(n(this._$startNode).parentNode).insertBefore(e,this._$endNode)}_commitNode(e){if(this._$committedValue!==e){if(this._$clear(),U!==c){const e=this._$startNode.parentNode?.nodeName;if('STYLE'===e||'SCRIPT'===e){let t='Forbidden';throw t='STYLE'===e?'Lit does not support binding inside style nodes. This is a security risk, as style injection attacks can exfiltrate data and spoof UIs. Consider instead using css`...` literals to compose styles, and do dynamic styling with css custom properties, ::parts, s, and by mutating the DOM rather than stylesheets.':'Lit does not support binding inside script nodes. This is a security risk, as it could allow arbitrary code execution.',new Error(t)}}i&&i({kind:'commit node',start:this._$startNode,parent:this._$parent,value:e,options:this.options}),this._$committedValue=this._insert(e)}}_commitText(e){if(this._$committedValue!==T&&_(this._$committedValue)){const t=n(this._$startNode).nextSibling;void 0===this._textSanitizer&&(this._textSanitizer=u(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}else{const t=b.createTextNode('');this._commitNode(t),void 0===this._textSanitizer&&(this._textSanitizer=u(t,'data','property')),e=this._textSanitizer(e),i&&i({kind:'commit text',node:t,value:e,options:this.options}),t.data=e}this._$committedValue=e}_commitTemplateResult(e){const{values:t,_$litType$:s}=e,o='number'==typeof s?this._$getTemplate(e):(void 0===s.el&&(s.el=z.createElement(R(s.h,s.h[0]),this.options)),s);if(this._$committedValue?._$template===o)i&&i({kind:'template updating',template:o,instance:this._$committedValue,parts:this._$committedValue._$parts,options:this.options,values:t}),this._$committedValue._update(t);else{const e=new A(o,this),s=e._clone(this.options);i&&i({kind:'template instantiated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),e._update(t),i&&i({kind:'template instantiated and updated',template:o,instance:e,parts:e._$parts,options:this.options,fragment:s,values:t}),this._commitNode(s),this._$committedValue=e}}_$getTemplate(e){let t=M.get(e.strings);return void 0===t&&M.set(e.strings,t=new z(e)),t}_commitIterable(e){y(this._$committedValue)||(this._$committedValue=[],this._$clear());const t=this._$committedValue;let i,s=0;for(const o of e)s===t.length?t.push(i=new L(this._insert(v()),this._insert(v()),this,this.options)):i=t[s],i._$setValue(o),s++;s2||''!==i[0]||''!==i[1]?(this._$committedValue=new Array(i.length-1).fill(new String),this.strings=i):this._$committedValue=T,this._sanitizer=void 0}_$setValue(e,t=this,i,s){const o=this.strings;let n=!1;if(void 0===o)e=V(this,e,t,0),n=!_(e)||e!==this._$committedValue&&e!==N,n&&(this._$committedValue=e);else{const s=e;let r,a;for(e=o[0],r=0;r\` has a \`@${t}=...\` listener with invalid content. Event listeners in templates must have exactly one expression and no surrounding text.`)}_$setValue(e,t=this){if((e=V(this,e,t,0)??T)===N)return;const s=this._$committedValue,o=e===T&&s!==T||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,n=e!==T&&(s===T||o);i&&i({kind:'commit event listener',element:this.element,name:this.name,value:e,options:this.options,removeListener:o,addListener:n,oldListener:s}),o&&this.element.removeEventListener(this.name,this,s),n&&this.element.addEventListener(this.name,this,e),this._$committedValue=e}handleEvent(e){'function'==typeof this._$committedValue?this._$committedValue.call(this.options?.host??this.element,e):this._$committedValue.handleEvent(e)}}class H{constructor(e,t,i){this.element=e,this.type=6,this._$disconnectableChildren=void 0,this._$parent=t,this.options=i}get _$isConnected(){return this._$parent._$isConnected}_$setValue(e){i&&i({kind:'commit to element binding',element:this.element,value:e,options:this.options}),V(this,e)}}const B=t.litHtmlPolyfillSupportDevMode;B?.(z,L),(t.litHtmlVersions??=[]).push('3.3.1'),t.litHtmlVersions.length>1&&queueMicrotask(()=>{s('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')});const J=(e,t,s)=>{if(null==t)throw new TypeError(`The container to render into may not be ${t}`);const n=o++,r=s?.renderBefore??t;let a=r._$litPart$;if(i&&i({kind:'begin render',id:n,value:e,container:t,options:s,part:a}),void 0===a){const e=s?.renderBefore??null;r._$litPart$=a=new L(t.insertBefore(v(),e),e,void 0,s??{})}return a._$setValue(e),i&&i({kind:'end render',id:n,value:e,container:t,options:s,part:a}),a};let K;J.setSanitizer=d,J.createSanitizer=u,J._testOnlyClearSanitizerFactoryDoNotCallOrElse=p;let Q=0;function Y(e){K=e}function Z(){K=null,Q=0}const G=Symbol('haunted.phase'),X=Symbol('haunted.hook'),ee=Symbol('haunted.update'),te=Symbol('haunted.commit'),ie=Symbol('haunted.effects'),se=Symbol('haunted.layoutEffects'),oe='haunted.context';class ne{update;host;virtual;[X];[ie];[se];constructor(e,t){this.update=e,this.host=t,this[X]=new Map,this[ie]=[],this[se]=[]}run(e){Y(this);let t=e();return Z(),t}_runEffects(e){let t=this[e];Y(this);for(let e of t)e.call(this);Z()}runEffects(){this._runEffects(ie)}runLayoutEffects(){this._runEffects(se)}teardown(){this[X].forEach(e=>{'function'==typeof e.teardown&&e.teardown()})}}const re=Promise.resolve().then.bind(Promise.resolve());function ae(){let e,t=[];function i(){e=null;let i=t;t=[];for(var s=0,o=i.length;s{t.push(s),null==e&&(e=re(i))}}const le=ae(),ce=ae();class de{renderer;host;state;[G];_updateQueued;constructor(e,t){this.renderer=e,this.host=t,this.state=new ne(this.update.bind(this),t),this[G]=null,this._updateQueued=!1}update(){this._updateQueued||(le(()=>{let e=this.handlePhase(ee);ce(()=>{this.handlePhase(te,e),ce(()=>{this.handlePhase(ie)})}),this._updateQueued=!1}),this._updateQueued=!0)}handlePhase(e,t){switch(this[G]=e,e){case te:return this.commit(t),void this.runEffects(se);case ee:return this.render();case ie:return this.runEffects(ie)}}render(){return this.state.run(()=>this.renderer.call(this.host,this.host))}runEffects(e){this.state._runEffects(e)}teardown(){this.state.teardown()}}function pe(e){class t extends de{frag;constructor(e,t,i){super(e,i||t),this.frag=t}commit(t){e(t,this.frag)}}return function(e,i,s){const o=(s||i||{}).baseElement||HTMLElement,{observedAttributes:n=[],useShadowDOM:r=!0,shadowRootInit:a={}}=s||i||{};class l extends o{_scheduler;static get observedAttributes(){return e.observedAttributes||n||[]}constructor(){super(),!1===r?this._scheduler=new t(e,this):(this.attachShadow({mode:'open',...a}),this._scheduler=new t(e,this.shadowRoot,this))}connectedCallback(){this._scheduler.update()}disconnectedCallback(){this._scheduler.teardown()}attributeChangedCallback(e,t,i){if(t===i)return;let s=''===i||i;Reflect.set(this,((e='')=>e.replace(/-+([a-z])?/g,(e,t)=>t?t.toUpperCase():''))(e),s)}}const c=new Proxy(o.prototype,{getPrototypeOf:e=>e,set(e,t,i,s){let o;return t in e?(o=Object.getOwnPropertyDescriptor(e,t),o&&o.set?(o.set.call(s,i),!0):(Reflect.set(e,t,i,s),!0)):(o='symbol'==typeof t||'_'===t[0]?{enumerable:!0,configurable:!0,writable:!0,value:i}:function(e){let t=e,i=!1;return Object.freeze({enumerable:!0,configurable:!0,get:()=>t,set(e){i&&t===e||(i=!0,t=e,this._scheduler&&this._scheduler.update())}})}(i),Object.defineProperty(s,t,o),o.set&&o.set.call(s,i),!0)}});return Object.setPrototypeOf(l.prototype,c),l}}class ue{id;state;constructor(e,t){this.id=e,this.state=t}}function he(e,...t){let i=Q++,s=K[X],o=s.get(i);return o||(o=new e(i,K,...t),s.set(i,o)),o.update(...t)}function me(e){return he.bind(null,e)}function fe(e){return me(class extends ue{callback;lastValues;values;_teardown;constructor(t,i,s,o){super(t,i),e(i,this)}update(e,t){this.callback=e,this.values=t}call(){const e=!this.values||this.hasChanged();this.lastValues=this.values,e&&this.run()}run(){this.teardown(),this._teardown=this.callback.call(this.state)}teardown(){'function'==typeof this._teardown&&this._teardown()}hasChanged(){return!this.lastValues||this.values.some((e,t)=>this.lastValues[t]!==e)}})}function ge(e,t){e[ie].push(t)}const be=fe(ge),ve=me(class extends ue{Context;value;_ranEffect;_unsubscribe;constructor(e,t,i){super(e,t),this._updater=this._updater.bind(this),this._ranEffect=!1,this._unsubscribe=null,ge(t,this)}update(e){if(this.state.virtual)throw new Error('can\'t be used with virtual components');return this.Context!==e&&(this._subscribe(e),this.Context=e),this.value}call(){this._ranEffect||(this._ranEffect=!0,this._unsubscribe&&this._unsubscribe(),this._subscribe(this.Context),this.state.update())}_updater(e){this.value=e,this.state.update()}_subscribe(e){const t={Context:e,callback:this._updater};this.state.host.dispatchEvent(new CustomEvent(oe,{detail:t,bubbles:!0,cancelable:!0,composed:!0}));const{unsubscribe:i=null,value:s}=t;this.value=i?s:e.defaultValue,this._unsubscribe=i}teardown(){this._unsubscribe&&this._unsubscribe()}});const _e=me(class extends ue{value;values;constructor(e,t,i,s){super(e,t),this.value=i(),this.values=s}update(e,t){return this.hasChanged(t)&&(this.values=t,this.value=e()),this.value}hasChanged(e=[]){return e.some((e,t)=>this.values[t]!==e)}}),ye=(e,t)=>_e(()=>e,t);fe(function(e,t){e[se].push(t)});const $e=me(class extends ue{args;constructor(e,t,i){if(super(e,t),this.updater=this.updater.bind(this),'function'==typeof i){i=i()}this.makeArgs(i)}update(){return this.args}updater(e){const[t]=this.args;if('function'==typeof e){e=e(t)}Object.is(t,e)||(this.makeArgs(e),this.state.update())}makeArgs(e){this.args=Object.freeze([e,this.updater])}}); /** * @license * Portions Copyright 2021 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */Promise.resolve(),me(class extends pe{reducer;currentState;constructor(e,t,i,s,o){super(e,t),this.dispatch=this.dispatch.bind(this),this.currentState=void 0!==o?o(s):s}update(e){return this.reducer=e,[this.currentState,this.dispatch]}dispatch(e){this.currentState=this.reducer(this.currentState,e),this.state.update()}}); + */Promise.resolve(),me(class extends ue{reducer;currentState;constructor(e,t,i,s,o){super(e,t),this.dispatch=this.dispatch.bind(this),this.currentState=void 0!==o?o(s):s}update(e){return this.reducer=e,[this.currentState,this.dispatch]}dispatch(e){this.currentState=this.reducer(this.currentState,e),this.state.update()}}); /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ -const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$isConnected}_$initialize(e,t,i){this.__part=e,this._$parent=t,this.__attributeIndex=i}_$resolve(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}} +const we=2;class xe{constructor(e){}get _$isConnected(){return this._$parent._$isConnected}_$initialize(e,t,i){this.__part=e,this._$parent=t,this.__attributeIndex=i}_$resolve(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}} /** * @license * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const xe=globalThis,Ce=xe.ShadowRoot&&(void 0===xe.ShadyCSS||xe.ShadyCSS.nativeShadow)&&'adoptedStyleSheets'in Document.prototype&&'replace'in CSSStyleSheet.prototype,ke=Symbol(),Pe=new WeakMap;class Ee{constructor(e,t,i){if(this._$cssResult$=!0,i!==ke)throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');this.cssText=e,this._strings=t}get styleSheet(){let e=this._styleSheet;const t=this._strings;if(Ce&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=Pe.get(t)),void 0===e&&((this._styleSheet=e=new CSSStyleSheet).replaceSync(this.cssText),i&&Pe.set(t,e))}return e}toString(){return this.cssText}}const Te=e=>{let t='';for(const i of e.cssRules)t+=i.cssText;return new Ee('string'==typeof(i=t)?i:String(i),void 0,ke);var i},Oe=Ce?e=>e:e=>e instanceof CSSStyleSheet?Te(e):e,{is:Ne,defineProperty:Me,getOwnPropertyDescriptor:Ue,getOwnPropertyNames:je,getOwnPropertySymbols:De,getPrototypeOf:Ve}=Object,Re=globalThis;let ze;const Ae=Re.trustedTypes,Le=Ae?Ae.emptyScript:'',Ie=Re.reactiveElementPolyfillSupportDevMode;Re.litIssuedWarnings??=new Set,ze=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Re.litIssuedWarnings.has(t)||Re.litIssuedWarnings.has(e)||(console.warn(t),Re.litIssuedWarnings.add(t))},queueMicrotask(()=>{ze('dev-mode','Lit is in dev mode. Not recommended for production!'),Re.ShadyDOM?.inUse&&void 0===Ie&&ze('polyfill-support-missing','Shadow DOM is being polyfilled via `ShadyDOM` but the `polyfill-support` module has not been loaded.')});const We=(e,t)=>e,qe={toAttribute(e,t){switch(t){case Boolean:e=e?Le:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},Fe=(e,t)=>!Ne(e,t),Be={attribute:!0,type:String,converter:qe,reflect:!1,useDefault:!1,hasChanged:Fe};Symbol.metadata??=Symbol('metadata'),Re.litPropertyMetadata??=new WeakMap;class He extends HTMLElement{static addInitializer(e){this.__prepare(),(this._initializers??=[]).push(e)}static get observedAttributes(){return this.finalize(),this.__attributeToPropertyMap&&[...this.__attributeToPropertyMap.keys()]}static createProperty(e,t=Be){if(t.state&&(t.attribute=!1),this.__prepare(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol.for(`${String(e)} (@property() cache)`),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&Me(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:o}=Ue(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};if(null==s){if('value'in(Ue(this.prototype,e)??{}))throw new Error(`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it's actually declared as a value on the prototype. Usually this is due to using @property or @state on a method.`);ze('reactive-property-without-getter',`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it does not have a getter. This will be an error in a future version of Lit.`)}return{get:s,set(t){const n=s?.call(this);o?.call(this,t),this.requestUpdate(e,n,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Be}static __prepare(){if(this.hasOwnProperty(We('elementProperties')))return;const e=Ve(this);e.finalize(),void 0!==e._initializers&&(this._initializers=[...e._initializers]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(We('finalized')))return;if(this.finalized=!0,this.__prepare(),this.hasOwnProperty(We('properties'))){const e=this.properties,t=[...je(e),...De(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this.__attributeToPropertyMap=new Map;for(const[e,t]of this.elementProperties){const i=this.__attributeNameForProperty(e,t);void 0!==i&&this.__attributeToPropertyMap.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles),this.hasOwnProperty('createProperty')&&ze('no-override-create-property','Overriding ReactiveElement.createProperty() is deprecated. The override will not be called with standard decorators'),this.hasOwnProperty('getPropertyDescriptor')&&ze('no-override-get-property-descriptor','Overriding ReactiveElement.getPropertyDescriptor() is deprecated. The override will not be called with standard decorators')}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(Oe(e))}else void 0!==e&&t.push(Oe(e));return t}static __attributeNameForProperty(e,t){const i=t.attribute;return!1===i?void 0:'string'==typeof i?i:'string'==typeof e?e.toLowerCase():void 0}constructor(){super(),this.__instanceProperties=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.__reflectingProperty=null,this.__initialize()}__initialize(){this.__updatePromise=new Promise(e=>this.enableUpdating=e),this._$changedProperties=new Map,this.__saveInstanceProperties(),this.requestUpdate(),this.constructor._initializers?.forEach(e=>e(this))}addController(e){(this.__controllers??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this.__controllers?.delete(e)}__saveInstanceProperties(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this.__instanceProperties=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((e,t)=>{if(Ce)e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const i of t){const t=document.createElement('style'),s=xe.litNonce;void 0!==s&&t.setAttribute('nonce',s),t.textContent=i.cssText,e.appendChild(t)}})(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.__controllers?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this.__controllers?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$attributeToProperty(e,i)}__propertyToAttribute(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor.__attributeNameForProperty(e,i);if(void 0!==s&&!0===i.reflect){const o=(void 0!==i.converter?.toAttribute?i.converter:qe).toAttribute(t,i.type);this.constructor.enabledWarnings.includes('migration')&&void 0===o&&ze('undefined-attribute-value',`The attribute value for the ${e} property is undefined on element ${this.localName}. The attribute will be removed, but in the previous version of \`ReactiveElement\`, the attribute would not have changed.`),this.__reflectingProperty=e,null==o?this.removeAttribute(s):this.setAttribute(s,o),this.__reflectingProperty=null}}_$attributeToProperty(e,t){const i=this.constructor,s=i.__attributeToPropertyMap.get(e);if(void 0!==s&&this.__reflectingProperty!==s){const e=i.getPropertyOptions(s),o='function'==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:qe;this.__reflectingProperty=s;const n=o.fromAttribute(t,e.type);this[s]=n??this.__defaultValues?.get(s)??n,this.__reflectingProperty=null}}requestUpdate(e,t,i){if(void 0!==e){e instanceof Event&&ze('','The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()');const s=this.constructor,o=this[e];i??=s.getPropertyOptions(e);if(!((i.hasChanged??Fe)(o,t)||i.useDefault&&i.reflect&&o===this.__defaultValues?.get(e)&&!this.hasAttribute(s.__attributeNameForProperty(e,i))))return;this._$changeProperty(e,t,i)}!1===this.isUpdatePending&&(this.__updatePromise=this.__enqueueUpdate())}_$changeProperty(e,t,{useDefault:i,reflect:s,wrapped:o},n){i&&!(this.__defaultValues??=new Map).has(e)&&(this.__defaultValues.set(e,n??t??this[e]),!0!==o||void 0!==n)||(this._$changedProperties.has(e)||(this.hasUpdated||i||(t=void 0),this._$changedProperties.set(e,t)),!0===s&&this.__reflectingProperty!==e&&(this.__reflectingProperties??=new Set).add(e))}async __enqueueUpdate(){this.isUpdatePending=!0;try{await this.__updatePromise}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){const e=this.performUpdate();return this.constructor.enabledWarnings.includes('async-perform-update')&&'function'==typeof e?.then&&ze('async-perform-update',`Element ${this.localName} returned a Promise from performUpdate(). This behavior is deprecated and will be removed in a future version of ReactiveElement.`),e}performUpdate(){if(!this.isUpdatePending)return;var e;if(e={kind:'update'},Re.emitLitDebugLogEvents&&Re.dispatchEvent(new CustomEvent('lit-debug',{detail:e})),!this.hasUpdated){this.renderRoot??=this.createRenderRoot();{const e=[...this.constructor.elementProperties.keys()].filter(e=>this.hasOwnProperty(e)&&e in Ve(this));if(e.length)throw new Error(`The following properties on element ${this.localName} will not trigger updates as expected because they are set using class fields: ${e.join(', ')}. Native class fields and some compiled output will overwrite accessors used for detecting changes. See https://lit.dev/msg/class-field-shadowing for more information.`)}if(this.__instanceProperties){for(const[e,t]of this.__instanceProperties)this[e]=t;this.__instanceProperties=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$changedProperties.has(t)||void 0===s||this._$changeProperty(t,void 0,i,s)}}let t=!1;const i=this._$changedProperties;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),this.__controllers?.forEach(e=>e.hostUpdate?.()),this.update(i)):this.__markUpdated()}catch(e){throw t=!1,this.__markUpdated(),e}t&&this._$didUpdate(i)}willUpdate(e){}_$didUpdate(e){this.__controllers?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e),this.isUpdatePending&&this.constructor.enabledWarnings.includes('change-in-update')&&ze('change-in-update',`Element ${this.localName} scheduled an update (generally because a property was set) after an update completed, causing a new update to be scheduled. This is inefficient and should be avoided unless the next update can only be scheduled as a side effect of the previous update.`)}__markUpdated(){this._$changedProperties=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.__updatePromise}shouldUpdate(e){return!0}update(e){this.__reflectingProperties&&=this.__reflectingProperties.forEach(e=>this.__propertyToAttribute(e,this[e])),this.__markUpdated()}updated(e){}firstUpdated(e){}}He.elementStyles=[],He.shadowRootOptions={mode:'open'},He[We('elementProperties')]=new Map,He[We('finalized')]=new Map,Ie?.({ReactiveElement:He});{He.enabledWarnings=['change-in-update','async-perform-update'];const e=e=>{e.hasOwnProperty(We('enabledWarnings'))||(e.enabledWarnings=e.enabledWarnings.slice())};He.enableWarning=function(t){e(this),this.enabledWarnings.includes(t)||this.enabledWarnings.push(t)},He.disableWarning=function(t){e(this);const i=this.enabledWarnings.indexOf(t);i>=0&&this.enabledWarnings.splice(i,1)}}(Re.reactiveElementVersions??=[]).push('2.1.1'),Re.reactiveElementVersions.length>1&&queueMicrotask(()=>{ze('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) + */const Se=globalThis,ke=Se.ShadowRoot&&(void 0===Se.ShadyCSS||Se.ShadyCSS.nativeShadow)&&'adoptedStyleSheets'in Document.prototype&&'replace'in CSSStyleSheet.prototype,Ce=Symbol(),Pe=new WeakMap;class Ee{constructor(e,t,i){if(this._$cssResult$=!0,i!==Ce)throw new Error('CSSResult is not constructable. Use `unsafeCSS` or `css` instead.');this.cssText=e,this._strings=t}get styleSheet(){let e=this._styleSheet;const t=this._strings;if(ke&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=Pe.get(t)),void 0===e&&((this._styleSheet=e=new CSSStyleSheet).replaceSync(this.cssText),i&&Pe.set(t,e))}return e}toString(){return this.cssText}}const Oe=e=>{let t='';for(const i of e.cssRules)t+=i.cssText;return new Ee('string'==typeof(i=t)?i:String(i),void 0,Ce);var i},je=ke?e=>e:e=>e instanceof CSSStyleSheet?Oe(e):e,{is:Ne,defineProperty:Te,getOwnPropertyDescriptor:Me,getOwnPropertyNames:De,getOwnPropertySymbols:Ue,getPrototypeOf:Re}=Object,ze=globalThis;let Ve;const Ae=ze.trustedTypes,Le=Ae?Ae.emptyScript:'',Ie=ze.reactiveElementPolyfillSupportDevMode;ze.litIssuedWarnings??=new Set,Ve=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,ze.litIssuedWarnings.has(t)||ze.litIssuedWarnings.has(e)||(console.warn(t),ze.litIssuedWarnings.add(t))},queueMicrotask(()=>{Ve('dev-mode','Lit is in dev mode. Not recommended for production!'),ze.ShadyDOM?.inUse&&void 0===Ie&&Ve('polyfill-support-missing','Shadow DOM is being polyfilled via `ShadyDOM` but the `polyfill-support` module has not been loaded.')});const We=(e,t)=>e,qe={toAttribute(e,t){switch(t){case Boolean:e=e?Le:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},Fe=(e,t)=>!Ne(e,t),He={attribute:!0,type:String,converter:qe,reflect:!1,useDefault:!1,hasChanged:Fe};Symbol.metadata??=Symbol('metadata'),ze.litPropertyMetadata??=new WeakMap;class Be extends HTMLElement{static addInitializer(e){this.__prepare(),(this._initializers??=[]).push(e)}static get observedAttributes(){return this.finalize(),this.__attributeToPropertyMap&&[...this.__attributeToPropertyMap.keys()]}static createProperty(e,t=He){if(t.state&&(t.attribute=!1),this.__prepare(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol.for(`${String(e)} (@property() cache)`),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&Te(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:o}=Me(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};if(null==s){if('value'in(Me(this.prototype,e)??{}))throw new Error(`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it's actually declared as a value on the prototype. Usually this is due to using @property or @state on a method.`);Ve('reactive-property-without-getter',`Field ${JSON.stringify(String(e))} on ${this.name} was declared as a reactive property but it does not have a getter. This will be an error in a future version of Lit.`)}return{get:s,set(t){const n=s?.call(this);o?.call(this,t),this.requestUpdate(e,n,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??He}static __prepare(){if(this.hasOwnProperty(We('elementProperties')))return;const e=Re(this);e.finalize(),void 0!==e._initializers&&(this._initializers=[...e._initializers]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(We('finalized')))return;if(this.finalized=!0,this.__prepare(),this.hasOwnProperty(We('properties'))){const e=this.properties,t=[...De(e),...Ue(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this.__attributeToPropertyMap=new Map;for(const[e,t]of this.elementProperties){const i=this.__attributeNameForProperty(e,t);void 0!==i&&this.__attributeToPropertyMap.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles),this.hasOwnProperty('createProperty')&&Ve('no-override-create-property','Overriding ReactiveElement.createProperty() is deprecated. The override will not be called with standard decorators'),this.hasOwnProperty('getPropertyDescriptor')&&Ve('no-override-get-property-descriptor','Overriding ReactiveElement.getPropertyDescriptor() is deprecated. The override will not be called with standard decorators')}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(je(e))}else void 0!==e&&t.push(je(e));return t}static __attributeNameForProperty(e,t){const i=t.attribute;return!1===i?void 0:'string'==typeof i?i:'string'==typeof e?e.toLowerCase():void 0}constructor(){super(),this.__instanceProperties=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.__reflectingProperty=null,this.__initialize()}__initialize(){this.__updatePromise=new Promise(e=>this.enableUpdating=e),this._$changedProperties=new Map,this.__saveInstanceProperties(),this.requestUpdate(),this.constructor._initializers?.forEach(e=>e(this))}addController(e){(this.__controllers??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this.__controllers?.delete(e)}__saveInstanceProperties(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this.__instanceProperties=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((e,t)=>{if(ke)e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const i of t){const t=document.createElement('style'),s=Se.litNonce;void 0!==s&&t.setAttribute('nonce',s),t.textContent=i.cssText,e.appendChild(t)}})(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this.__controllers?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this.__controllers?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$attributeToProperty(e,i)}__propertyToAttribute(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor.__attributeNameForProperty(e,i);if(void 0!==s&&!0===i.reflect){const o=(void 0!==i.converter?.toAttribute?i.converter:qe).toAttribute(t,i.type);this.constructor.enabledWarnings.includes('migration')&&void 0===o&&Ve('undefined-attribute-value',`The attribute value for the ${e} property is undefined on element ${this.localName}. The attribute will be removed, but in the previous version of \`ReactiveElement\`, the attribute would not have changed.`),this.__reflectingProperty=e,null==o?this.removeAttribute(s):this.setAttribute(s,o),this.__reflectingProperty=null}}_$attributeToProperty(e,t){const i=this.constructor,s=i.__attributeToPropertyMap.get(e);if(void 0!==s&&this.__reflectingProperty!==s){const e=i.getPropertyOptions(s),o='function'==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:qe;this.__reflectingProperty=s;const n=o.fromAttribute(t,e.type);this[s]=n??this.__defaultValues?.get(s)??n,this.__reflectingProperty=null}}requestUpdate(e,t,i){if(void 0!==e){e instanceof Event&&Ve('','The requestUpdate() method was called with an Event as the property name. This is probably a mistake caused by binding this.requestUpdate as an event listener. Instead bind a function that will call it with no arguments: () => this.requestUpdate()');const s=this.constructor,o=this[e];i??=s.getPropertyOptions(e);if(!((i.hasChanged??Fe)(o,t)||i.useDefault&&i.reflect&&o===this.__defaultValues?.get(e)&&!this.hasAttribute(s.__attributeNameForProperty(e,i))))return;this._$changeProperty(e,t,i)}!1===this.isUpdatePending&&(this.__updatePromise=this.__enqueueUpdate())}_$changeProperty(e,t,{useDefault:i,reflect:s,wrapped:o},n){i&&!(this.__defaultValues??=new Map).has(e)&&(this.__defaultValues.set(e,n??t??this[e]),!0!==o||void 0!==n)||(this._$changedProperties.has(e)||(this.hasUpdated||i||(t=void 0),this._$changedProperties.set(e,t)),!0===s&&this.__reflectingProperty!==e&&(this.__reflectingProperties??=new Set).add(e))}async __enqueueUpdate(){this.isUpdatePending=!0;try{await this.__updatePromise}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){const e=this.performUpdate();return this.constructor.enabledWarnings.includes('async-perform-update')&&'function'==typeof e?.then&&Ve('async-perform-update',`Element ${this.localName} returned a Promise from performUpdate(). This behavior is deprecated and will be removed in a future version of ReactiveElement.`),e}performUpdate(){if(!this.isUpdatePending)return;var e;if(e={kind:'update'},ze.emitLitDebugLogEvents&&ze.dispatchEvent(new CustomEvent('lit-debug',{detail:e})),!this.hasUpdated){this.renderRoot??=this.createRenderRoot();{const e=[...this.constructor.elementProperties.keys()].filter(e=>this.hasOwnProperty(e)&&e in Re(this));if(e.length)throw new Error(`The following properties on element ${this.localName} will not trigger updates as expected because they are set using class fields: ${e.join(', ')}. Native class fields and some compiled output will overwrite accessors used for detecting changes. See https://lit.dev/msg/class-field-shadowing for more information.`)}if(this.__instanceProperties){for(const[e,t]of this.__instanceProperties)this[e]=t;this.__instanceProperties=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$changedProperties.has(t)||void 0===s||this._$changeProperty(t,void 0,i,s)}}let t=!1;const i=this._$changedProperties;try{t=this.shouldUpdate(i),t?(this.willUpdate(i),this.__controllers?.forEach(e=>e.hostUpdate?.()),this.update(i)):this.__markUpdated()}catch(e){throw t=!1,this.__markUpdated(),e}t&&this._$didUpdate(i)}willUpdate(e){}_$didUpdate(e){this.__controllers?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e),this.isUpdatePending&&this.constructor.enabledWarnings.includes('change-in-update')&&Ve('change-in-update',`Element ${this.localName} scheduled an update (generally because a property was set) after an update completed, causing a new update to be scheduled. This is inefficient and should be avoided unless the next update can only be scheduled as a side effect of the previous update.`)}__markUpdated(){this._$changedProperties=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.__updatePromise}shouldUpdate(e){return!0}update(e){this.__reflectingProperties&&=this.__reflectingProperties.forEach(e=>this.__propertyToAttribute(e,this[e])),this.__markUpdated()}updated(e){}firstUpdated(e){}}Be.elementStyles=[],Be.shadowRootOptions={mode:'open'},Be[We('elementProperties')]=new Map,Be[We('finalized')]=new Map,Ie?.({ReactiveElement:Be});{Be.enabledWarnings=['change-in-update','async-perform-update'];const e=e=>{e.hasOwnProperty(We('enabledWarnings'))||(e.enabledWarnings=e.enabledWarnings.slice())};Be.enableWarning=function(t){e(this),this.enabledWarnings.includes(t)||this.enabledWarnings.push(t)},Be.disableWarning=function(t){e(this);const i=this.enabledWarnings.indexOf(t);i>=0&&this.enabledWarnings.splice(i,1)}}(ze.reactiveElementVersions??=[]).push('2.1.1'),ze.reactiveElementVersions.length>1&&queueMicrotask(()=>{Ve('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */;const Je=globalThis;let Qe;Je.litIssuedWarnings??=new Set,Qe=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Je.litIssuedWarnings.has(t)||Je.litIssuedWarnings.has(e)||(console.warn(t),Je.litIssuedWarnings.add(t))};class Ze extends He{constructor(){super(...arguments),this.renderOptions={host:this},this.__childPart=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this.__childPart=J(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.__childPart?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.__childPart?.setConnected(!1)}render(){return N}}var Ye;Ze._$litElement$=!0,Ze[(Ye='finalized',Ye)]=!0,Je.litElementHydrateSupport?.({LitElement:Ze});const Ge=Je.litElementPolyfillSupportDevMode;Ge?.({LitElement:Ze}),(Je.litElementVersions??=[]).push('4.2.1'),Je.litElementVersions.length>1&&queueMicrotask(()=>{Qe('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) + */;const Je=globalThis;let Ke;Je.litIssuedWarnings??=new Set,Ke=(e,t)=>{t+=` See https://lit.dev/msg/${e} for more information.`,Je.litIssuedWarnings.has(t)||Je.litIssuedWarnings.has(e)||(console.warn(t),Je.litIssuedWarnings.add(t))};class Qe extends Be{constructor(){super(...arguments),this.renderOptions={host:this},this.__childPart=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this.__childPart=J(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this.__childPart?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this.__childPart?.setConnected(!1)}render(){return N}}var Ye;Qe._$litElement$=!0,Qe[(Ye='finalized',Ye)]=!0,Je.litElementHydrateSupport?.({LitElement:Qe});const Ze=Je.litElementPolyfillSupportDevMode;Ze?.({LitElement:Qe}),(Je.litElementVersions??=[]).push('4.2.1'),Je.litElementVersions.length>1&&queueMicrotask(()=>{Ke('multiple-versions','Multiple versions of Lit loaded. Loading multiple versions is not recommended.')}) /** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */,window.ShadyDOM?.inUse&&!0===window.ShadyDOM?.noPatch&&window.ShadyDOM.wrap;const Xe=(e,t)=>{const i=e._$disconnectableChildren;if(void 0===i)return!1;for(const e of i)e._$notifyDirectiveConnectionChanged?.(t,!1),Xe(e,t);return!0},Ke=e=>{let t,i;do{if(void 0===(t=e._$parent))break;i=t._$disconnectableChildren,i.delete(e),e=t}while(0===i?.size)},et=e=>{for(let t;t=e._$parent;e=t){let i=t._$disconnectableChildren;if(void 0===i)t._$disconnectableChildren=i=new Set;else if(i.has(e))break;i.add(e),st(t)}}; + */,window.ShadyDOM?.inUse&&!0===window.ShadyDOM?.noPatch&&window.ShadyDOM.wrap;const Ge=(e,t)=>{const i=e._$disconnectableChildren;if(void 0===i)return!1;for(const e of i)e._$notifyDirectiveConnectionChanged?.(t,!1),Ge(e,t);return!0},Xe=e=>{let t,i;do{if(void 0===(t=e._$parent))break;i=t._$disconnectableChildren,i.delete(e),e=t}while(0===i?.size)},et=e=>{for(let t;t=e._$parent;e=t){let i=t._$disconnectableChildren;if(void 0===i)t._$disconnectableChildren=i=new Set;else if(i.has(e))break;i.add(e),st(t)}}; /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */function tt(e){void 0!==this._$disconnectableChildren?(Ke(this),this._$parent=e,et(this)):this._$parent=e}function it(e,t=!1,i=0){const s=this._$committedValue,o=this._$disconnectableChildren;if(void 0!==o&&0!==o.size)if(t)if(Array.isArray(s))for(let e=i;e{e.type==we&&(e._$notifyConnectionChanged??=it,e._$reparentDisconnectables??=tt)};class ot extends Se{constructor(){super(...arguments),this._$disconnectableChildren=void 0}_$initialize(e,t,i){super._$initialize(e,t,i),et(this),this.isConnected=e._$isConnected}_$notifyDirectiveConnectionChanged(e,t=!0){e!==this.isConnected&&(this.isConnected=e,e?this.reconnected?.():this.disconnected?.()),t&&(Xe(this,e),Ke(this))}setValue(e){if(void 0===this.__part.strings)this.__part._$setValue(e,this);else{if(void 0===this.__attributeIndex)throw new Error('Expected this.__attributeIndex to be a number');const t=[...this.__part._$committedValue];t[this.__attributeIndex]=e,this.__part._$setValue(t,this,0)}}disconnected(){}reconnected(){}}const{component:nt}=function({render:e}){const t=ue(e),i=function(e){return t=>{const i={Provider:class extends HTMLElement{listeners;_value;constructor(){super(),this.listeners=new Set,this.addEventListener(oe,this)}disconnectedCallback(){this.removeEventListener(oe,this)}handleEvent(e){const{detail:t}=e;t.Context===i&&(t.value=this.value,t.unsubscribe=this.unsubscribe.bind(this,t.callback),this.listeners.add(t.callback),e.stopPropagation())}unsubscribe(e){this.listeners.delete(e)}set value(e){this._value=e;for(let t of this.listeners)t(e)}get value(){return this._value}},Consumer:e(({render:e})=>e(_e(i)),{useShadowDOM:!1}),defaultValue:t};return i}}(t);return{component:t,createContext:i}}({render:J}),rt=new WeakMap; + */function tt(e){void 0!==this._$disconnectableChildren?(Xe(this),this._$parent=e,et(this)):this._$parent=e}function it(e,t=!1,i=0){const s=this._$committedValue,o=this._$disconnectableChildren;if(void 0!==o&&0!==o.size)if(t)if(Array.isArray(s))for(let e=i;e{e.type==we&&(e._$notifyConnectionChanged??=it,e._$reparentDisconnectables??=tt)};class ot extends xe{constructor(){super(...arguments),this._$disconnectableChildren=void 0}_$initialize(e,t,i){super._$initialize(e,t,i),et(this),this.isConnected=e._$isConnected}_$notifyDirectiveConnectionChanged(e,t=!0){e!==this.isConnected&&(this.isConnected=e,e?this.reconnected?.():this.disconnected?.()),t&&(Ge(this,e),Xe(this))}setValue(e){if(void 0===this.__part.strings)this.__part._$setValue(e,this);else{if(void 0===this.__attributeIndex)throw new Error('Expected this.__attributeIndex to be a number');const t=[...this.__part._$committedValue];t[this.__attributeIndex]=e,this.__part._$setValue(t,this,0)}}disconnected(){}reconnected(){}}const{component:nt}=function({render:e}){const t=pe(e),i=function(e){return t=>{const i={Provider:class extends HTMLElement{listeners;_value;constructor(){super(),this.listeners=new Set,this.addEventListener(oe,this)}disconnectedCallback(){this.removeEventListener(oe,this)}handleEvent(e){const{detail:t}=e;t.Context===i&&(t.value=this.value,t.unsubscribe=this.unsubscribe.bind(this,t.callback),this.listeners.add(t.callback),e.stopPropagation())}unsubscribe(e){this.listeners.delete(e)}set value(e){this._value=e;for(let t of this.listeners)t(e)}get value(){return this._value}},Consumer:e(({render:e})=>e(ve(i)),{useShadowDOM:!1}),defaultValue:t};return i}}(t);return{component:t,createContext:i}}({render:J}),rt=new WeakMap; /** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: BSD-3-Clause - */const at=(lt=class extends ot{render(e){return M}update(e,[t]){const i=t!==this._ref;return i&&void 0!==this._ref&&this._updateRefValue(void 0),(i||this._lastElementForRef!==this._element)&&(this._ref=t,this._context=e.options?.host,this._updateRefValue(this._element=e.element)),M}_updateRefValue(e){if(this.isConnected||(e=void 0),'function'==typeof this._ref){const t=this._context??globalThis;let i=rt.get(t);void 0===i&&(i=new WeakMap,rt.set(t,i)),void 0!==i.get(this._ref)&&this._ref.call(this._context,void 0),i.set(this._ref,e),void 0!==e&&this._ref.call(this._context,e)}else this._ref.value=e}get _lastElementForRef(){return'function'==typeof this._ref?rt.get(this._context??globalThis)?.get(this._ref):this._ref?.value}disconnected(){this._lastElementForRef===this._element&&this._updateRefValue(void 0)}reconnected(){this._updateRefValue(this._element)}},(...e)=>({_$litDirective$:lt,values:e}));var lt;customElements.define('civ-autocomplete-select',nt(function({disabled:e,optionsMetadata:t={},options:i=[],label:s='Search',inputValue:o='',pageSize:n=25}){const[r,a]=$e(null),[l,c]=$e(-1),[d,u]=$e(!1),[p,h]=$e(null),[m,f]=$e(1);be(()=>{o||a(null)},[o]),be(()=>{l>=0&&$()},[l]);const g=(e,t=1)=>{const i=e||'';this.dispatchEvent(new CustomEvent('fetch-suggestions',{detail:{query:i,page:t,pageSize:n},bubbles:!0,composed:!0})),c(-1),f(t)},b=ve(()=>((e,t)=>{let i;return(...s)=>{i&&clearTimeout(i),i=setTimeout(()=>{e.apply(null,s)},t)}})(g,300),[]),_=e=>{a(e),u(!1),f(1),p&&p.focus(),this.dispatchEvent(new CustomEvent('item-selected',{detail:e,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent('input-change',{detail:{value:e.label,item:e},bubbles:!0,composed:!0}))},v=t?.links?.prev,y=t?.links?.next,$=e=>{setTimeout(()=>{const e=this.querySelector('.autocomplete-option[aria-selected="true"]');e&&e.scrollIntoView({behavior:'smooth',block:'nearest'})},0)};return T` + */const at=(lt=class extends ot{render(e){return T}update(e,[t]){const i=t!==this._ref;return i&&void 0!==this._ref&&this._updateRefValue(void 0),(i||this._lastElementForRef!==this._element)&&(this._ref=t,this._context=e.options?.host,this._updateRefValue(this._element=e.element)),T}_updateRefValue(e){if(this.isConnected||(e=void 0),'function'==typeof this._ref){const t=this._context??globalThis;let i=rt.get(t);void 0===i&&(i=new WeakMap,rt.set(t,i)),void 0!==i.get(this._ref)&&this._ref.call(this._context,void 0),i.set(this._ref,e),void 0!==e&&this._ref.call(this._context,e)}else this._ref.value=e}get _lastElementForRef(){return'function'==typeof this._ref?rt.get(this._context??globalThis)?.get(this._ref):this._ref?.value}disconnected(){this._lastElementForRef===this._element&&this._updateRefValue(void 0)}reconnected(){this._updateRefValue(this._element)}},(...e)=>({_$litDirective$:lt,values:e}));var lt;function ct(){return Math.random().toString(36).substr(2,9)+Date.now()}customElements.define('civ-autocomplete-select',nt(function({disabled:e,optionsMetadata:t={},options:i=[],label:s='Search',inputValue:o='',pageSize:n=25}){const[r,a]=$e(null),[l,c]=$e(-1),[d,p]=$e(!1),[u,h]=$e(null),[m,f]=$e(1);be(()=>{o||a(null)},[o]),be(()=>{l>=0&&$()},[l]);const g=(e,t=1)=>{const i=e||'';this.dispatchEvent(new CustomEvent('fetch-suggestions',{detail:{query:i,page:t,pageSize:n},bubbles:!0,composed:!0})),c(-1),f(t)},b=_e(()=>((e,t)=>{let i;return(...s)=>{i&&clearTimeout(i),i=setTimeout(()=>{e.apply(null,s)},t)}})(g,300),[]),v=e=>{a(e),p(!1),f(1),u&&u.focus(),this.dispatchEvent(new CustomEvent('item-selected',{detail:e,bubbles:!0,composed:!0})),this.dispatchEvent(new CustomEvent('input-change',{detail:{value:e.label,item:e},bubbles:!0,composed:!0}))},_=t?.links?.prev,y=t?.links?.next,$=e=>{setTimeout(()=>{const e=this.querySelector('.autocomplete-option[aria-selected="true"]');e&&e.scrollIntoView({behavior:'smooth',block:'nearest'})},0)};return O` {r=e,s.modalRef&&('function'==typeof s.modalRef?s.modalRef(e):'object'==typeof s.modalRef&&(s.modalRef.value=e))})} >
    e.stopPropagation()}> - ${e?T` + ${e?O`

    ${e}

    @@ -304,30 +314,40 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i ${t} - ${i?T`
    ${i}
    `:T` + ${i?O`
    ${i}
    `:O`
    `}
    - `},{useShadowDOM:!1})),customElements.define('civ-scrape-history-list',nt(function({history:e,jobStatus:t}){let i=JSON.parse(e).data;t&&t.request_id&&(i=i.map(e=>e.request_id===t.request_id?{...e,progress:t.progress,status:t.status}:e));const[s,o]=$e(!1),[n,r]=$e(null),a=e=>{if(!e)return'';const t=new Date(e);return isNaN(t)?String(e):`${String(t.getMonth()+1).padStart(2,'0')}/${String(t.getDate()).padStart(2,'0')}/${t.getFullYear()}`},l=n?T`
    -

    Date / Time: ${a(n.created_at)}

    -

    Status: ${n.status}

    -

    Progress: ${n.progress??'?'}%

    -

    Time to scrape: ${((e,t)=>{const i=(new Date(t)-new Date(e))/1e3;return`${Math.floor(i/60)}m ${Math.round(i%60)}s`})(n.created_at,n.updated_at)}

    -

    URLs scraped:

    -
      - ${n.source_urls&&n.source_urls.length>0?n.source_urls.map(e=>T`
    • ${e}
    • `):T`
    • No source URLs
    • `} -
    -
    `:null;return i&&0!==i.length?T` + `},{useShadowDOM:!1})),customElements.define('civ-scrape-history-modal',nt(function({open:e,job:t,onClose:i}){return t?O` + +

    Date / Time: ${function(e){if(!e)return'';const t=new Date(e);return isNaN(t)?String(e):`${String(t.getMonth()+1).padStart(2,'0')}/${String(t.getDate()).padStart(2,'0')}/${t.getFullYear()}`}(t.created_at)}

    +

    Status: ${t.status}

    +

    Progress: ${t.progress??'?'}%

    +

    Time to scrape: ${function(e,t){const i=(new Date(t)-new Date(e))/1e3;return`${Math.floor(i/60)}m ${Math.round(i%60)}s`}(t.created_at,t.updated_at)}

    +

    URLs scraped:

    +
      + ${t.source_urls&&t.source_urls.length>0?t.source_urls.map(e=>O`
    • ${e}
    • `):O`
    • No source URLs
    • `} +
    + + + + `} + .modalProps=${{open:e,onClose:i,closeOnBackdropClick:!0}} + >
    + `:null},{useShadowDOM:!1})),customElements.define('civ-scrape-history-list',nt(function({history:e,jobStatus:t}){let i=JSON.parse(e).data;t&&t.request_id&&(i=i.map(e=>e.request_id===t.request_id?{...e,progress:t.progress,status:t.status}:e));const[s,o]=$e(!1),[n,r]=$e(null);return i&&0!==i.length?O`
      - ${i.map(e=>{const t=e.status?e.status.toLowerCase().replace(/\s+/g,'-'):'';return T` + ${i.map(e=>{const t=e.status?e.status.toLowerCase().replace(/\s+/g,'-'):'';return O`
    • -
      ${e.status}
      - ${i=e.progress,100===i?null:T` + ${i=e.progress,100===i?null:O`
      ${i??0}% @@ -364,40 +383,12 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i
      - {o(!1),r(null)},closeOnBackdropClick:!0}} - > - `:T`

      No scrape history available.

      `},{useShadowDOM:!1}));const ct={created_at:'2024-06-01T12:00:00Z',status:'Accepted',duration_in_s:360,source_urls:['https://example.com','https://example.org']};customElements.define('scrape-details',nt(function({detail:e=ct}){const t=e?.created_at?new Date(e.created_at):null,i=t?t.toLocaleString():'',s=function(e){if(null==e)return'';const t=Math.floor(e/3600),i=Math.floor(e%3600/60);return[t?`${t}h`:null,i?`${i}m`:null,e%60+'s'].filter(Boolean).join(' ')}(e?.duration_in_s),o=e?.source_urls||[];return T` -
      -
      -
      - - - - - -
      - -
      -

      URLs scraped

      - ${o.length?T`
        - ${o.map(e=>T`
      • ${e}
      • `)} -
      `:T`

      No source URLs

      `} -
      -
      -
      - `})),customElements.define('civ-select-jurisdiction',nt(function(){const[e,t]=$e([]),[i,s]=$e([]),[o,n]=$e({}),[r,a]=$e(''),[l,c]=$e(''),[d,u]=$e(''),p=(h=!0,ve(()=>({current:h}),[]));var h;be(()=>{p.current?p.current=!1:m(r,l)},[r,l]),be(()=>{fetch('/api/api_proxy/jurisdictions/states').then(e=>e.json()).then(e=>t(e.data||[]))},[]),be(()=>{s([]),n({}),c(''),u(''),r&&f('')},[r]);const m=(e,t)=>{this.dispatchEvent(new CustomEvent('select-jurisdiction-change',{detail:{state:e,jurisdiction_ocdid:t},bubbles:!0,composed:!0}))},f=e=>{const t=e.query||'',i=e.page||1,o=e.pageSize||25;fetch(`/api/api_proxy/jurisdictions/${r}/search?search_string=${encodeURIComponent(t)}&limit=${o}&page=${i}`).then(e=>e.json()).then(e=>{s(e.data||[]),n({total_items:e.total_items,total_pages:e.total_pages,page:e.page,limit:e.limit,links:e.links})})};return T` + {o(!1),r(null)}} + > + `:O`

      No scrape history available.

      `},{useShadowDOM:!1})),customElements.define('civ-select-jurisdiction',nt(function(){const[e,t]=$e([]),[i,s]=$e([]),[o,n]=$e({}),[r,a]=$e(''),[l,c]=$e(''),[d,p]=$e(''),u=(h=!0,_e(()=>({current:h}),[]));var h;be(()=>{u.current?u.current=!1:m(r,l)},[r,l]),be(()=>{fetch('/api/api_proxy/jurisdictions/states').then(e=>e.json()).then(e=>t(e.data||[]))},[]),be(()=>{s([]),n({}),c(''),p(''),r&&f('')},[r]);const m=(e,t)=>{this.dispatchEvent(new CustomEvent('select-jurisdiction-change',{detail:{state:e,jurisdiction_ocdid:t},bubbles:!0,composed:!0}))},f=e=>{const t=e.query||'',i=e.page||1,o=e.pageSize||25;fetch(`/api/api_proxy/jurisdictions/${r}/search?search_string=${encodeURIComponent(t)}&limit=${o}&page=${i}`).then(e=>e.json()).then(e=>{s(e.data||[]),n({total_items:e.total_items,total_pages:e.total_pages,page:e.page,limit:e.limit,links:e.links})})};return O`
      - ${e.map(e=>T``)} + ${e.map(e=>O``)} {const t=e.detail;f(t)}} - @input-change=${e=>{const{value:t,item:i}=e.detail;u(t),c(i?i.value:'')}} + @input-change=${e=>{const{value:t,item:i}=e.detail;p(t),c(i?i.value:'')}} @item-selected=${e=>c(e.detail.value)} > +
      + +
      + {e.stopPropagation(),r(e.target.checked),i&&i(e.target.checked)}} + aria-label="Select ${a.name}" + /> +
      +
      + + +
      + +
      + + +
      +
      + ${h?O`Avatar of ${a.name}`:O`${a.name?a.name.charAt(0).toUpperCase():'?'}`} +
      + u('name',e.target.value)} + placeholder="Full Name" + /> +
      + + +
      + +
      + {l({...a,office:{...a.office||{},name:e.target.value}}),s&&s({...a,office:{...a.office||{},name:e.target.value}})}} + placeholder="Office" + /> + u('start_date',e.target.value)} + placeholder="Start" + /> + u('end_date',e.target.value)} + placeholder="End" + /> +
      +
      + + +
      + +
      + ${(a.phones||[]).map((e,t)=>O` +
      + c('phones',t,e.target.value)} + placeholder="(555) 123-4567" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(a.emails||[]).map((e,t)=>O` +
      + c('emails',t,e.target.value)} + placeholder="email@example.com" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(a.urls||[]).map((e,t)=>O` +
      + c('urls',t,e.target.value)} + placeholder="https://example.com" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(a.source_urls||[]).map((e,t)=>O` +
      + c('source_urls',t,e.target.value)} + placeholder="https://source.com" + /> + +
      + `)} + +
      +
      + + `},{observedAttributes:['person'],useShadowDOM:!1})),customElements.define('civ-editable-people-list',nt(function({jurisdiction_ocdid:e}){const[t,i]=$e([]),[s,o]=$e(!0),[n,r]=$e(null),[a,l]=$e([]);return be(()=>{e&&(o(!0),fetch(`/api/api_proxy/people?jurisdiction_ocdid=${encodeURIComponent(e)}`).then(e=>e.json()).then(e=>{const t=(e.data||[]).map(e=>({...e,_tempKey:ct()}));i(t),o(!1)}).catch(e=>{r(e),o(!1)}))},[e]),s?O`

      Loading people...

      `:n?O`

      Error loading people.

      `:O` + +
      + + ${a.length>1?O``:''} +
      +
      + ${t.map(e=>O` + {return t=e._tempKey,console.log('toggling',t),void l(e=>e.includes(t)?e.filter(e=>e!==t):[...e,t]);var t}} + .onDelete=${()=>{return t=e._tempKey,void(confirm('Delete this person?')&&i(e=>e.filter(e=>e._tempKey!==t)));var t}} + > + `)} +
      + `},{useShadowDOM:!1,observedAttributes:['jurisdiction_ocdid']}));customElements.define('civ-jurisdiction-page',nt(function({jurisdiction_ocdid:e,history:t}){const[i,s]=$e(null),[o,n]=$e([]),[r,a]=$e([]),[l,c]=$e(!1),[d,p]=$e('read');console.log('data',i);const u=o?.reduce((e,t)=>(e[t.name]?e[t.name]=[...new Set([...e[t.name],...t.other_names||[]])]:e[t.name]=[...new Set(t.other_names||[])],e),{});console.log({people:o,identities:u});const h=e?['http://localhost:8001/api/v1/sse/jobs/status',`?jurisdiction_ocdid=${encodeURIComponent(e)}`,'&job_type=people'].join(''):null,{data:m,isConnected:f,error:g}=function(e,t={}){const[i,s]=$e(null),[o,n]=$e(!1),[r,a]=$e(null),[l,c]=$e(null),d=ye(()=>'function'==typeof e?e():e,[e]),p=ye(()=>{if(l)return;const e=d();try{const t=new EventSource(e);c(t),a(null),t.onopen=()=>n(!0),t.onmessage=e=>{try{s(JSON.parse(e.data))}catch(e){a('Error parsing SSE data.')}},t.onerror=e=>{console.error('SSE error:',e),n(!1),a('SSE connection error.')}}catch(e){a('Failed to initialize SSE.')}},[l,d]),u=ye(()=>{l&&(l.close(),c(null),n(!1))},[l]);return be(()=>(t.autoConnect&&p(),()=>{l&&l.close()}),[t.autoConnect,p,l]),{data:i,isConnected:o,error:r,connect:p,disconnect:u}}(h,{autoConnect:!!h});be(()=>{e&&b()},[]);const b=async()=>{const[t,i]=await Promise.all([v(e),_(e)]);s(t),n(i)},v=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/jurisdictions?jurisdiction_ocdid=${t}&with_geom=true`),s=await i.json();return{data:s.data,geo_center:s.geo_center}},_=async e=>{const t=encodeURIComponent(e),i=await fetch(`/api/api_proxy/people?jurisdiction_ocdid=${t}`);return(await i.json()).data},y=i?.data?.updated_at?'Scraped':'Unscraped';return O`
      @@ -654,14 +988,14 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i
      - ${i?T` + ${i?O`

      ${i.data.name}

      Status: ${g}Status: ${y}
      @@ -679,31 +1013,56 @@ const we=2;class Se{constructor(e){}get _$isConnected(){return this._$parent._$i
      {a(!1);const t={jurisdiction_ocdid:i.data.id,config:{url:e.data.url||i.data.url,name:i.data.name,source_urls:e.data.sourceUrls,identities:e.data.identities}};await fetch('/api/pipelines',{headers:{'Content-Type':'application/json'},method:'POST',body:JSON.stringify(t)})}} + .onStartScrape=${async e=>{c(!1);const t={jurisdiction_ocdid:i.data.id,config:{url:e.data.url||i.data.url,name:i.data.name,source_urls:e.data.sourceUrls,identities:e.data.identities}};await fetch('/api/pipelines',{headers:{'Content-Type':'application/json'},method:'POST',body:JSON.stringify(t)})}} .url=${i.data.url} - .modalProps=${{open:r,onClose:()=>a(!1),closeOnBackdropClick:!1}} - .identities=${l} + .modalProps=${{open:l,onClose:()=>c(!1),closeOnBackdropClick:!1}} + .identities=${u} > - `:T`

      Loading jurisdiction data...

      `} + `:O`

      Loading jurisdiction data...

      `}

      Elected Representatives

      - +
      + + + Mode: ${d.charAt(0).toUpperCase()+d.slice(1)} + +
      + ${'read'===d?O``:O` +
      + +
      + `}
      `},{useShadowDOM:!1,observedAttributes:['jurisdiction_ocdid','history']})),e(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGV2ZWxvcG1lbnQvbGl0LWh0bWwuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvaW50ZXJmYWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3N5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc3RhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc2NoZWR1bGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9ob29rLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NyZWF0ZS1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWVmZmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtbWVtby5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY2FsbGJhY2suanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWxheW91dC1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLXN0YXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1jb250cm9sbGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWR1Y2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RldmVsb3BtZW50L2RpcmVjdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvY3NzLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9kZXZlbG9wbWVudC9saXQtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmUtaGVscGVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9hc3luYy1kaXJlY3RpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvbGl0LWhhdW50ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvY29yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9jcmVhdGUtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmVzL3JlZi5qcyIsIi4uL2NvbXBvbmVudHMvaW5wdXRzL2F1dG8tY29tcGxldGUtc2VsZWN0LmpzIiwiLi4vY29tcG9uZW50cy9wZW9wbGUtbGlzdC5qcyIsIi4uL2NvbXBvbmVudHMvYmFzaWMvbW9kYWwuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1oaXN0b3J5LWxpc3QuanMiLCIuLi9jb21wb25lbnRzL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1kZXRhaWxzLmpzIiwiLi4vY29tcG9uZW50cy9zZWFyY2gtanVyaXNkaWN0aW9ucy9zZWxlY3QtanVyaXNkaWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWYuanMiLCIuLi9jb21wb25lbnRzL3NlYXJjaC1qdXJpc2RpY3Rpb25zL3NlYXJjaC1qdXJpc2RpY3Rpb25zLmpzIiwiLi4vY29tcG9uZW50cy9iYXNpYy9jaGlwLmpzIiwiLi4vY29tcG9uZW50cy9qdXJpc2RpY3Rpb24tcGFnZS9zY3JhcGUtbW9kYWwvbmFtZS1jb25maWctZm9ybS5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2Uvc2NyYXBlLW1vZGFsL3NjcmFwZS1tb2RhbC5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2UvanVyaXNkaWN0aW9uLXBhZ2UuanMiLCIuLi9jb21wb25lbnRzL2hvb2tzL3VzZVNzZS5qcyIsIi4uL2NvbXBvbmVudHMvbWFpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcbi8vIEFsbG93cyBtaW5pZmllcnMgdG8gcmVuYW1lIHJlZmVyZW5jZXMgdG8gZ2xvYmFsVGhpc1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICAgID8gKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSBnbG9iYWxcbiAgICAgICAgICAgIC5lbWl0TGl0RGVidWdMb2dFdmVudHM7XG4gICAgICAgIGlmICghc2hvdWxkRW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbGl0LWRlYnVnJywge1xuICAgICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xubGV0IGlzc3VlV2FybmluZztcbmlmIChERVZfTU9ERSkge1xuICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuICAgIC8qKlxuICAgICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgICAqL1xuICAgIGlzc3VlV2FybmluZyA9IChjb2RlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgIHdhcm5pbmcgKz0gY29kZVxuICAgICAgICAgICAgPyBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgaWYgKCFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKHdhcm5pbmcpICYmXG4gICAgICAgICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyhjb2RlKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ2Rldi1tb2RlJywgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWApO1xuICAgIH0pO1xufVxuY29uc3Qgd3JhcCA9IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gICAgZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJlxuICAgIGdsb2JhbC5TaGFkeURPTT8ubm9QYXRjaCA9PT0gdHJ1ZVxuICAgID8gZ2xvYmFsLlNoYWR5RE9NLndyYXBcbiAgICA6IChub2RlKSA9PiBub2RlO1xuY29uc3QgdHJ1c3RlZFR5cGVzID0gZ2xvYmFsLnRydXN0ZWRUeXBlcztcbi8qKlxuICogT3VyIFRydXN0ZWRUeXBlUG9saWN5IGZvciBIVE1MIHdoaWNoIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBodG1sIHRlbXBsYXRlXG4gKiB0YWcgZnVuY3Rpb24uXG4gKlxuICogVGhhdCBIVE1MIGlzIGEgZGV2ZWxvcGVyLWF1dGhvcmVkIGNvbnN0YW50LCBhbmQgaXMgcGFyc2VkIHdpdGggaW5uZXJIVE1MXG4gKiBiZWZvcmUgYW55IHVudHJ1c3RlZCBleHByZXNzaW9ucyBoYXZlIGJlZW4gbWl4ZWQgaW4uIFRoZXJlZm9yIGl0IGlzXG4gKiBjb25zaWRlcmVkIHNhZmUgYnkgY29uc3RydWN0aW9uLlxuICovXG5jb25zdCBwb2xpY3kgPSB0cnVzdGVkVHlwZXNcbiAgICA/IHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2xpdC1odG1sJywge1xuICAgICAgICBjcmVhdGVIVE1MOiAocykgPT4gcyxcbiAgICB9KVxuICAgIDogdW5kZWZpbmVkO1xuY29uc3QgaWRlbnRpdHlGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBub29wU2FuaXRpemVyID0gKF9ub2RlLCBfbmFtZSwgX3R5cGUpID0+IGlkZW50aXR5RnVuY3Rpb247XG4vKiogU2V0cyB0aGUgZ2xvYmFsIHNhbml0aXplciBmYWN0b3J5LiAqL1xuY29uc3Qgc2V0U2FuaXRpemVyID0gKG5ld1Nhbml0aXplcikgPT4ge1xuICAgIGlmICghRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgbGl0LWh0bWwgc2VjdXJpdHkgcG9saWN5LmAgK1xuICAgICAgICAgICAgYCBzZXRTYW5pdGl6ZURPTVZhbHVlRmFjdG9yeSBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS5gKTtcbiAgICB9XG4gICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbmV3U2FuaXRpemVyO1xufTtcbi8qKlxuICogT25seSB1c2VkIGluIGludGVybmFsIHRlc3RzLCBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuICovXG5jb25zdCBfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPSAoKSA9PiB7XG4gICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbm9vcFNhbml0aXplcjtcbn07XG5jb25zdCBjcmVhdGVTYW5pdGl6ZXIgPSAobm9kZSwgbmFtZSwgdHlwZSkgPT4ge1xuICAgIHJldHVybiBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwobm9kZSwgbmFtZSwgdHlwZSk7XG59O1xuLy8gQWRkZWQgdG8gYW4gYXR0cmlidXRlIG5hbWUgdG8gbWFyayB0aGUgYXR0cmlidXRlIGFzIGJvdW5kIHNvIHdlIGNhbiBmaW5kXG4vLyBpdCBlYXNpbHkuXG5jb25zdCBib3VuZEF0dHJpYnV0ZVN1ZmZpeCA9ICckbGl0JCc7XG4vLyBUaGlzIG1hcmtlciBpcyB1c2VkIGluIG1hbnkgc3ludGFjdGljIHBvc2l0aW9ucyBpbiBIVE1MLCBzbyBpdCBtdXN0IGJlXG4vLyBhIHZhbGlkIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlIG5hbWUuIFdlIGRvbid0IHN1cHBvcnQgZHluYW1pYyBuYW1lcyAoeWV0KVxuLy8gYnV0IHRoaXMgYXQgbGVhc3QgZW5zdXJlcyB0aGF0IHRoZSBwYXJzZSB0cmVlIGlzIGNsb3NlciB0byB0aGUgdGVtcGxhdGVcbi8vIGludGVudGlvbi5cbmNvbnN0IG1hcmtlciA9IGBsaXQkJHtNYXRoLnJhbmRvbSgpLnRvRml4ZWQoOSkuc2xpY2UoMil9JGA7XG4vLyBTdHJpbmcgdXNlZCB0byB0ZWxsIGlmIGEgY29tbWVudCBpcyBhIG1hcmtlciBjb21tZW50XG5jb25zdCBtYXJrZXJNYXRjaCA9ICc/JyArIG1hcmtlcjtcbi8vIFRleHQgdXNlZCB0byBpbnNlcnQgYSBjb21tZW50IG1hcmtlciBub2RlLiBXZSB1c2UgcHJvY2Vzc2luZyBpbnN0cnVjdGlvblxuLy8gc3ludGF4IGJlY2F1c2UgaXQncyBzbGlnaHRseSBzbWFsbGVyLCBidXQgcGFyc2VzIGFzIGEgY29tbWVudCBub2RlLlxuY29uc3Qgbm9kZU1hcmtlciA9IGA8JHttYXJrZXJNYXRjaH0+YDtcbmNvbnN0IGQgPSBOT0RFX01PREUgJiYgZ2xvYmFsLmRvY3VtZW50ID09PSB1bmRlZmluZWRcbiAgICA/IHtcbiAgICAgICAgY3JlYXRlVHJlZVdhbGtlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSxcbiAgICB9XG4gICAgOiBkb2N1bWVudDtcbi8vIENyZWF0ZXMgYSBkeW5hbWljIG1hcmtlci4gV2UgbmV2ZXIgaGF2ZSB0byBzZWFyY2ggZm9yIHRoZXNlIGluIHRoZSBET00uXG5jb25zdCBjcmVhdGVNYXJrZXIgPSAoKSA9PiBkLmNyZWF0ZUNvbW1lbnQoJycpO1xuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5jb25zdCBpc0l0ZXJhYmxlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSB8fFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdHlwZW9mIHZhbHVlPy5bU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IFNQQUNFX0NIQVIgPSBgWyBcXHRcXG5cXGZcXHJdYDtcbmNvbnN0IEFUVFJfVkFMVUVfQ0hBUiA9IGBbXiBcXHRcXG5cXGZcXHJcIidcXGA8Pj1dYDtcbmNvbnN0IE5BTUVfQ0hBUiA9IGBbXlxcXFxzXCInPj0vXWA7XG4vLyBUaGVzZSByZWdleGVzIHJlcHJlc2VudCB0aGUgZml2ZSBwYXJzaW5nIHN0YXRlcyB0aGF0IHdlIGNhcmUgYWJvdXQgaW4gdGhlXG4vLyBUZW1wbGF0ZSdzIEhUTUwgc2Nhbm5lci4gVGhleSBtYXRjaCB0aGUgKmVuZCogb2YgdGhlIHN0YXRlIHRoZXkncmUgbmFtZWRcbi8vIGFmdGVyLlxuLy8gRGVwZW5kaW5nIG9uIHRoZSBtYXRjaCwgd2UgdHJhbnNpdGlvbiB0byBhIG5ldyBzdGF0ZS4gSWYgdGhlcmUncyBubyBtYXRjaCxcbi8vIHdlIHN0YXkgaW4gdGhlIHNhbWUgc3RhdGUuXG4vLyBOb3RlIHRoYXQgdGhlIHJlZ2V4ZXMgYXJlIHN0YXRlZnVsLiBXZSB1dGlsaXplIGxhc3RJbmRleCBhbmQgc3luYyBpdFxuLy8gYWNyb3NzIHRoZSBtdWx0aXBsZSByZWdleGVzIHVzZWQuIEluIGFkZGl0aW9uIHRvIHRoZSBmaXZlIHJlZ2V4ZXMgYmVsb3dcbi8vIHdlIGFsc28gZHluYW1pY2FsbHkgY3JlYXRlIGEgcmVnZXggdG8gZmluZCB0aGUgbWF0Y2hpbmcgZW5kIHRhZ3MgZm9yIHJhd1xuLy8gdGV4dCBlbGVtZW50cy5cbi8qKlxuICogRW5kIG9mIHRleHQgaXM6IGA8YCBmb2xsb3dlZCBieTpcbiAqICAgKGNvbW1lbnQgc3RhcnQpIG9yICh0YWcpIG9yIChkeW5hbWljIHRhZyBiaW5kaW5nKVxuICovXG5jb25zdCB0ZXh0RW5kUmVnZXggPSAvPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2c7XG5jb25zdCBDT01NRU5UX1NUQVJUID0gMTtcbmNvbnN0IFRBR19OQU1FID0gMjtcbmNvbnN0IERZTkFNSUNfVEFHX05BTUUgPSAzO1xuY29uc3QgY29tbWVudEVuZFJlZ2V4ID0gLy0tPi9nO1xuLyoqXG4gKiBDb21tZW50cyBub3Qgc3RhcnRlZCB3aXRoIDwhLS0sIGxpa2UgPC97LCBjYW4gYmUgZW5kZWQgYnkgYSBzaW5nbGUgYD5gXG4gKi9cbmNvbnN0IGNvbW1lbnQyRW5kUmVnZXggPSAvPi9nO1xuLyoqXG4gKiBUaGUgdGFnRW5kIHJlZ2V4IG1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgXCJpbnNpZGUgYW4gb3BlbmluZ1wiIHRhZyBzeW50YXhcbiAqIHBvc2l0aW9uLiBJdCBlaXRoZXIgbWF0Y2hlcyBhIGA+YCwgYW4gYXR0cmlidXRlLWxpa2Ugc2VxdWVuY2UsIG9yIHRoZSBlbmRcbiAqIG9mIHRoZSBzdHJpbmcgYWZ0ZXIgYSBzcGFjZSAoYXR0cmlidXRlLW5hbWUgcG9zaXRpb24gZW5kaW5nKS5cbiAqXG4gKiBTZWUgYXR0cmlidXRlcyBpbiB0aGUgSFRNTCBzcGVjOlxuICogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI2VsZW1lbnRzLWF0dHJpYnV0ZXNcbiAqXG4gKiBcIiBcXHRcXG5cXGZcXHJcIiBhcmUgSFRNTCBzcGFjZSBjaGFyYWN0ZXJzOlxuICogaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2FzY2lpLXdoaXRlc3BhY2VcbiAqXG4gKiBTbyBhbiBhdHRyaWJ1dGUgaXM6XG4gKiAgKiBUaGUgbmFtZTogYW55IGNoYXJhY3RlciBleGNlcHQgYSB3aGl0ZXNwYWNlIGNoYXJhY3RlciwgKFwiKSwgKCcpLCBcIj5cIixcbiAqICAgIFwiPVwiLCBvciBcIi9cIi4gTm90ZTogdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSFRNTCBzcGVjIHdoaWNoIGFsc28gZXhjbHVkZXMgY29udHJvbCBjaGFyYWN0ZXJzLlxuICogICogRm9sbG93ZWQgYnkgemVybyBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnNcbiAqICAqIEZvbGxvd2VkIGJ5IFwiPVwiXG4gKiAgKiBGb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVyc1xuICogICogRm9sbG93ZWQgYnk6XG4gKiAgICAqIEFueSBjaGFyYWN0ZXIgZXhjZXB0IHNwYWNlLCAoJyksIChcIiksIFwiPFwiLCBcIj5cIiwgXCI9XCIsIChgKSwgb3JcbiAqICAgICogKFwiKSB0aGVuIGFueSBub24tKFwiKSwgb3JcbiAqICAgICogKCcpIHRoZW4gYW55IG5vbi0oJylcbiAqL1xuY29uc3QgdGFnRW5kUmVnZXggPSBuZXcgUmVnRXhwKGA+fCR7U1BBQ0VfQ0hBUn0oPzooJHtOQU1FX0NIQVJ9KykoJHtTUEFDRV9DSEFSfSo9JHtTUEFDRV9DSEFSfSooPzoke0FUVFJfVkFMVUVfQ0hBUn18KFwifCcpfCkpfCQpYCwgJ2cnKTtcbmNvbnN0IEVOVElSRV9NQVRDSCA9IDA7XG5jb25zdCBBVFRSSUJVVEVfTkFNRSA9IDE7XG5jb25zdCBTUEFDRVNfQU5EX0VRVUFMUyA9IDI7XG5jb25zdCBRVU9URV9DSEFSID0gMztcbmNvbnN0IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gLycvZztcbmNvbnN0IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4ID0gL1wiL2c7XG4vKipcbiAqIE1hdGNoZXMgdGhlIHJhdyB0ZXh0IGVsZW1lbnRzLlxuICpcbiAqIENvbW1lbnRzIGFyZSBub3QgcGFyc2VkIHdpdGhpbiByYXcgdGV4dCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBzZWFyY2ggdGhlaXJcbiAqIHRleHQgY29udGVudCBmb3IgbWFya2VyIHN0cmluZ3MuXG4gKi9cbmNvbnN0IHJhd1RleHRFbGVtZW50ID0gL14oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGUpJC9pO1xuLyoqIFRlbXBsYXRlUmVzdWx0IHR5cGVzICovXG5jb25zdCBIVE1MX1JFU1VMVCA9IDE7XG5jb25zdCBTVkdfUkVTVUxUID0gMjtcbmNvbnN0IE1BVEhNTF9SRVNVTFQgPSAzO1xuLy8gVGVtcGxhdGVQYXJ0IHR5cGVzXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIG11c3QgbWF0Y2ggdGhlIHZhbHVlcyBpbiBQYXJ0VHlwZVxuY29uc3QgQVRUUklCVVRFX1BBUlQgPSAxO1xuY29uc3QgQ0hJTERfUEFSVCA9IDI7XG5jb25zdCBQUk9QRVJUWV9QQVJUID0gMztcbmNvbnN0IEJPT0xFQU5fQVRUUklCVVRFX1BBUlQgPSA0O1xuY29uc3QgRVZFTlRfUEFSVCA9IDU7XG5jb25zdCBFTEVNRU5UX1BBUlQgPSA2O1xuY29uc3QgQ09NTUVOVF9QQVJUID0gNztcbi8qKlxuICogR2VuZXJhdGVzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgVGVtcGxhdGVSZXN1bHQgd2l0aFxuICogdGhlIGdpdmVuIHJlc3VsdCB0eXBlLlxuICovXG5jb25zdCB0YWcgPSAodHlwZSkgPT4gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4ge1xuICAgIC8vIFdhcm4gYWdhaW5zdCB0ZW1wbGF0ZXMgb2N0YWwgZXNjYXBlIHNlcXVlbmNlc1xuICAgIC8vIFdlIGRvIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiByZW5kZXIgc28gdGhhdCB0aGUgd2FybmluZyBpcyBjbG9zZXIgdG8gdGhlXG4gICAgLy8gdGVtcGxhdGUgZGVmaW5pdGlvbi5cbiAgICBpZiAoREVWX01PREUgJiYgc3RyaW5ncy5zb21lKChzKSA9PiBzID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU29tZSB0ZW1wbGF0ZSBzdHJpbmdzIGFyZSB1bmRlZmluZWQuXFxuJyArXG4gICAgICAgICAgICAnVGhpcyBpcyBwcm9iYWJseSBjYXVzZWQgYnkgaWxsZWdhbCBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzLicpO1xuICAgIH1cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgLy8gSW1wb3J0IHN0YXRpYy1odG1sLmpzIHJlc3VsdHMgaW4gYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIGczIGRvZXNuJ3RcbiAgICAgICAgLy8gaGFuZGxlLiBJbnN0ZWFkIHdlIGtub3cgdGhhdCBzdGF0aWMgdmFsdWVzIG11c3QgaGF2ZSB0aGUgZmllbGRcbiAgICAgICAgLy8gYF8kbGl0U3RhdGljJGAuXG4gICAgICAgIGlmICh2YWx1ZXMuc29tZSgodmFsKSA9PiB2YWw/LlsnXyRsaXRTdGF0aWMkJ10pKSB7XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJycsIGBTdGF0aWMgdmFsdWVzICdsaXRlcmFsJyBvciAndW5zYWZlU3RhdGljJyBjYW5ub3QgYmUgdXNlZCBhcyB2YWx1ZXMgdG8gbm9uLXN0YXRpYyB0ZW1wbGF0ZXMuXFxuYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSB1c2UgdGhlIHN0YXRpYyAnaHRtbCcgdGFnIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBbJ18kbGl0VHlwZSQnXTogdHlwZSxcbiAgICAgICAgc3RyaW5ncyxcbiAgICAgICAgdmFsdWVzLFxuICAgIH07XG59O1xuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBhbiBIVE1MIHRlbXBsYXRlIHRoYXQgY2FuIGVmZmljaWVudGx5XG4gKiByZW5kZXIgdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgaGVhZGVyID0gKHRpdGxlOiBzdHJpbmcpID0+IGh0bWxgPGgxPiR7dGl0bGV9PC9oMT5gO1xuICogYGBgXG4gKlxuICogVGhlIGBodG1sYCB0YWcgcmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBET00gdG8gcmVuZGVyIGFzIGEgdmFsdWUuIEl0IGlzXG4gKiBsYXp5LCBtZWFuaW5nIG5vIHdvcmsgaXMgZG9uZSB1bnRpbCB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQuIFdoZW4gcmVuZGVyaW5nLFxuICogaWYgYSB0ZW1wbGF0ZSBjb21lcyBmcm9tIHRoZSBzYW1lIGV4cHJlc3Npb24gYXMgYSBwcmV2aW91c2x5IHJlbmRlcmVkIHJlc3VsdCxcbiAqIGl0J3MgZWZmaWNpZW50bHkgdXBkYXRlZCBpbnN0ZWFkIG9mIHJlcGxhY2VkLlxuICovXG5leHBvcnQgY29uc3QgaHRtbCA9IHRhZyhIVE1MX1JFU1VMVCk7XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGFuIFNWRyBmcmFnbWVudCB0aGF0IGNhbiBlZmZpY2llbnRseSByZW5kZXJcbiAqIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlY3QgPSBzdmdgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCI+PC9yZWN0PmA7XG4gKlxuICogY29uc3QgbXlJbWFnZSA9IGh0bWxgXG4gKiAgIDxzdmcgdmlld0JveD1cIjAgMCAxMCAxMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAqICAgICAke3JlY3R9XG4gKiAgIDwvc3ZnPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYHN2Z2AgKnRhZyBmdW5jdGlvbiogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgU1ZHIGZyYWdtZW50cywgb3IgZWxlbWVudHNcbiAqIHRoYXQgd291bGQgYmUgY29udGFpbmVkICoqaW5zaWRlKiogYW4gYDxzdmc+YCBIVE1MIGVsZW1lbnQuIEEgY29tbW9uIGVycm9yIGlzXG4gKiBwbGFjaW5nIGFuIGA8c3ZnPmAgKmVsZW1lbnQqIGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIGBzdmdgIHRhZ1xuICogZnVuY3Rpb24uIFRoZSBgPHN2Zz5gIGVsZW1lbnQgaXMgYW4gSFRNTCBlbGVtZW50IGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoaW4gYVxuICogdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIHtAbGlua2NvZGUgaHRtbH0gdGFnIGZ1bmN0aW9uLlxuICpcbiAqIEluIExpdEVsZW1lbnQgdXNhZ2UsIGl0J3MgaW52YWxpZCB0byByZXR1cm4gYW4gU1ZHIGZyYWdtZW50IGZyb20gdGhlXG4gKiBgcmVuZGVyKClgIG1ldGhvZCwgYXMgdGhlIFNWRyBmcmFnbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGVsZW1lbnQnc1xuICogc2hhZG93IHJvb3QgYW5kIHRodXMgbm90IGJlIHByb3Blcmx5IGNvbnRhaW5lZCB3aXRoaW4gYW4gYDxzdmc+YCBIVE1MXG4gKiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3Qgc3ZnID0gdGFnKFNWR19SRVNVTFQpO1xuLyoqXG4gKiBJbnRlcnByZXRzIGEgdGVtcGxhdGUgbGl0ZXJhbCBhcyBNYXRoTUwgZnJhZ21lbnQgdGhhdCBjYW4gZWZmaWNpZW50bHkgcmVuZGVyXG4gKiB0byBhbmQgdXBkYXRlIGEgY29udGFpbmVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBudW0gPSBtYXRobWxgPG1uPjE8L21uPmA7XG4gKlxuICogY29uc3QgZXEgPSBodG1sYFxuICogICA8bWF0aD5cbiAqICAgICAke251bX1cbiAqICAgPC9tYXRoPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYG1hdGhtbGAgKnRhZyBmdW5jdGlvbiogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgTWF0aE1MIGZyYWdtZW50cywgb3JcbiAqIGVsZW1lbnRzIHRoYXQgd291bGQgYmUgY29udGFpbmVkICoqaW5zaWRlKiogYSBgPG1hdGg+YCBIVE1MIGVsZW1lbnQuIEEgY29tbW9uXG4gKiBlcnJvciBpcyBwbGFjaW5nIGEgYDxtYXRoPmAgKmVsZW1lbnQqIGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIGBtYXRobWxgXG4gKiB0YWcgZnVuY3Rpb24uIFRoZSBgPG1hdGg+YCBlbGVtZW50IGlzIGFuIEhUTUwgZWxlbWVudCBhbmQgc2hvdWxkIGJlIHVzZWRcbiAqIHdpdGhpbiBhIHRlbXBsYXRlIHRhZ2dlZCB3aXRoIHRoZSB7QGxpbmtjb2RlIGh0bWx9IHRhZyBmdW5jdGlvbi5cbiAqXG4gKiBJbiBMaXRFbGVtZW50IHVzYWdlLCBpdCdzIGludmFsaWQgdG8gcmV0dXJuIGFuIE1hdGhNTCBmcmFnbWVudCBmcm9tIHRoZVxuICogYHJlbmRlcigpYCBtZXRob2QsIGFzIHRoZSBNYXRoTUwgZnJhZ21lbnQgd2lsbCBiZSBjb250YWluZWQgd2l0aGluIHRoZVxuICogZWxlbWVudCdzIHNoYWRvdyByb290IGFuZCB0aHVzIG5vdCBiZSBwcm9wZXJseSBjb250YWluZWQgd2l0aGluIGEgYDxtYXRoPmBcbiAqIEhUTUwgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hdGhtbCA9IHRhZyhNQVRITUxfUkVTVUxUKTtcbi8qKlxuICogQSBzZW50aW5lbCB2YWx1ZSB0aGF0IHNpZ25hbHMgdGhhdCBhIHZhbHVlIHdhcyBoYW5kbGVkIGJ5IGEgZGlyZWN0aXZlIGFuZFxuICogc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBET00uXG4gKi9cbmV4cG9ydCBjb25zdCBub0NoYW5nZSA9IFN5bWJvbC5mb3IoJ2xpdC1ub0NoYW5nZScpO1xuLyoqXG4gKiBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgc2lnbmFscyBhIENoaWxkUGFydCB0byBmdWxseSBjbGVhciBpdHMgY29udGVudC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgYnV0dG9uID0gaHRtbGAke1xuICogIHVzZXIuaXNBZG1pblxuICogICAgPyBodG1sYDxidXR0b24+REVMRVRFPC9idXR0b24+YFxuICogICAgOiBub3RoaW5nXG4gKiB9YDtcbiAqIGBgYFxuICpcbiAqIFByZWZlciB1c2luZyBgbm90aGluZ2Agb3ZlciBvdGhlciBmYWxzeSB2YWx1ZXMgYXMgaXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBiZXR3ZWVuIHZhcmlvdXMgZXhwcmVzc2lvbiBiaW5kaW5nIGNvbnRleHRzLlxuICpcbiAqIEluIGNoaWxkIGV4cHJlc3Npb25zLCBgdW5kZWZpbmVkYCwgYG51bGxgLCBgJydgLCBhbmQgYG5vdGhpbmdgIGFsbCBiZWhhdmUgdGhlXG4gKiBzYW1lIGFuZCByZW5kZXIgbm8gbm9kZXMuIEluIGF0dHJpYnV0ZSBleHByZXNzaW9ucywgYG5vdGhpbmdgIF9yZW1vdmVzXyB0aGVcbiAqIGF0dHJpYnV0ZSwgd2hpbGUgYHVuZGVmaW5lZGAgYW5kIGBudWxsYCB3aWxsIHJlbmRlciBhbiBlbXB0eSBzdHJpbmcuIEluXG4gKiBwcm9wZXJ0eSBleHByZXNzaW9ucyBgbm90aGluZ2AgYmVjb21lcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSBTeW1ib2wuZm9yKCdsaXQtbm90aGluZycpO1xuLyoqXG4gKiBUaGUgY2FjaGUgb2YgcHJlcGFyZWQgdGVtcGxhdGVzLCBrZXllZCBieSB0aGUgdGFnZ2VkIFRlbXBsYXRlU3RyaW5nc0FycmF5XG4gKiBhbmQgX25vdF8gYWNjb3VudGluZyBmb3IgdGhlIHNwZWNpZmljIHRlbXBsYXRlIHRhZyB1c2VkLiBUaGlzIG1lYW5zIHRoYXRcbiAqIHRlbXBsYXRlIHRhZ3MgY2Fubm90IGJlIGR5bmFtaWMgLSB0aGV5IG11c3Qgc3RhdGljYWxseSBiZSBvbmUgb2YgaHRtbCwgc3ZnLFxuICogb3IgYXR0ci4gVGhpcyByZXN0cmljdGlvbiBzaW1wbGlmaWVzIHRoZSBjYWNoZSBsb29rdXAsIHdoaWNoIGlzIG9uIHRoZSBob3RcbiAqIHBhdGggZm9yIHJlbmRlcmluZy5cbiAqL1xuY29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB3YWxrZXIgPSBkLmNyZWF0ZVRyZWVXYWxrZXIoZCwgMTI5IC8qIE5vZGVGaWx0ZXIuU0hPV197RUxFTUVOVHxDT01NRU5UfSAqLyk7XG5sZXQgc2FuaXRpemVyRmFjdG9yeUludGVybmFsID0gbm9vcFNhbml0aXplcjtcbmZ1bmN0aW9uIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHRzYSwgc3RyaW5nRnJvbVRTQSkge1xuICAgIC8vIEEgc2VjdXJpdHkgY2hlY2sgdG8gcHJldmVudCBzcG9vZmluZyBvZiBMaXQgdGVtcGxhdGUgcmVzdWx0cy5cbiAgICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgd2l0aCBBcnJheS5pc1RlbXBsYXRlT2JqZWN0LFxuICAgIC8vIHRob3VnaCB3ZSBtaWdodCBuZWVkIHRvIG1ha2UgdGhhdCBjaGVjayBpbnNpZGUgb2YgdGhlIGh0bWwgYW5kIHN2Z1xuICAgIC8vIGZ1bmN0aW9ucywgYmVjYXVzZSBwcmVjb21waWxlZCB0ZW1wbGF0ZXMgZG9uJ3QgY29tZSBpbiBhc1xuICAgIC8vIFRlbXBsYXRlU3RyaW5nQXJyYXkgb2JqZWN0cy5cbiAgICBpZiAoIWlzQXJyYXkodHNhKSB8fCAhdHNhLmhhc093blByb3BlcnR5KCdyYXcnKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICdpbnZhbGlkIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXknO1xuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgXG4gICAgICAgICAgSW50ZXJuYWwgRXJyb3I6IGV4cGVjdGVkIHRlbXBsYXRlIHN0cmluZ3MgdG8gYmUgYW4gYXJyYXlcbiAgICAgICAgICB3aXRoIGEgJ3JhdycgZmllbGQuIEZha2luZyBhIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXkgYnlcbiAgICAgICAgICBjYWxsaW5nIGh0bWwgb3Igc3ZnIGxpa2UgYW4gb3JkaW5hcnkgZnVuY3Rpb24gaXMgZWZmZWN0aXZlbHlcbiAgICAgICAgICB0aGUgc2FtZSBhcyBjYWxsaW5nIHVuc2FmZUh0bWwgYW5kIGNhbiBsZWFkIHRvIG1ham9yIHNlY3VyaXR5XG4gICAgICAgICAgaXNzdWVzLCBlLmcuIG9wZW5pbmcgeW91ciBjb2RlIHVwIHRvIFhTUyBhdHRhY2tzLlxuICAgICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgaHRtbCBvciBzdmcgdGFnZ2VkIHRlbXBsYXRlIGZ1bmN0aW9ucyBub3JtYWxseVxuICAgICAgICAgIGFuZCBzdGlsbCBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIGZpbGUgYSBidWcgYXRcbiAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9pc3N1ZXMvbmV3P3RlbXBsYXRlPWJ1Z19yZXBvcnQubWRcbiAgICAgICAgICBhbmQgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIGJ1aWxkIHRvb2xpbmcsIGlmIGFueS5cbiAgICAgICAgYFxuICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxuICovZywgJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbGljeSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gcG9saWN5LmNyZWF0ZUhUTUwoc3RyaW5nRnJvbVRTQSlcbiAgICAgICAgOiBzdHJpbmdGcm9tVFNBO1xufVxuLyoqXG4gKiBSZXR1cm5zIGFuIEhUTUwgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gVGVtcGxhdGVTdHJpbmdzQXJyYXkgYW5kIHJlc3VsdCB0eXBlXG4gKiAoSFRNTCBvciBTVkcpLCBhbG9uZyB3aXRoIHRoZSBjYXNlLXNlbnNpdGl2ZSBib3VuZCBhdHRyaWJ1dGUgbmFtZXMgaW5cbiAqIHRlbXBsYXRlIG9yZGVyLiBUaGUgSFRNTCBjb250YWlucyBjb21tZW50IG1hcmtlcnMgZGVub3RpbmcgdGhlIGBDaGlsZFBhcnRgc1xuICogYW5kIHN1ZmZpeGVzIG9uIGJvdW5kIGF0dHJpYnV0ZXMgZGVub3RpbmcgdGhlIGBBdHRyaWJ1dGVQYXJ0c2AuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgdGVtcGxhdGUgc3RyaW5ncyBhcnJheVxuICogQHBhcmFtIHR5cGUgSFRNTCBvciBTVkdcbiAqIEByZXR1cm4gQXJyYXkgY29udGFpbmluZyBgW2h0bWwsIGF0dHJOYW1lc11gIChhcnJheSByZXR1cm5lZCBmb3IgdGVyc2VuZXNzLFxuICogICAgIHRvIGF2b2lkIG9iamVjdCBmaWVsZHMgc2luY2UgdGhpcyBjb2RlIGlzIHNoYXJlZCB3aXRoIG5vbi1taW5pZmllZCBTU1JcbiAqICAgICBjb2RlKVxuICovXG5jb25zdCBnZXRUZW1wbGF0ZUh0bWwgPSAoc3RyaW5ncywgdHlwZSkgPT4ge1xuICAgIC8vIEluc2VydCBtYWtlcnMgaW50byB0aGUgdGVtcGxhdGUgSFRNTCB0byByZXByZXNlbnQgdGhlIHBvc2l0aW9uIG9mXG4gICAgLy8gYmluZGluZ3MuIFRoZSBmb2xsb3dpbmcgY29kZSBzY2FucyB0aGUgdGVtcGxhdGUgc3RyaW5ncyB0byBkZXRlcm1pbmUgdGhlXG4gICAgLy8gc3ludGFjdGljIHBvc2l0aW9uIG9mIHRoZSBiaW5kaW5ncy4gVGhleSBjYW4gYmUgaW4gdGV4dCBwb3NpdGlvbiwgd2hlcmVcbiAgICAvLyB3ZSBpbnNlcnQgYW4gSFRNTCBjb21tZW50LCBhdHRyaWJ1dGUgdmFsdWUgcG9zaXRpb24sIHdoZXJlIHdlIGluc2VydCBhXG4gICAgLy8gc2VudGluZWwgc3RyaW5nIGFuZCByZS13cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUsIG9yIGluc2lkZSBhIHRhZyB3aGVyZVxuICAgIC8vIHdlIGluc2VydCB0aGUgc2VudGluZWwgc3RyaW5nLlxuICAgIGNvbnN0IGwgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgLy8gU3RvcmVzIHRoZSBjYXNlLXNlbnNpdGl2ZSBib3VuZCBhdHRyaWJ1dGUgbmFtZXMgaW4gdGhlIG9yZGVyIG9mIHRoZWlyXG4gICAgLy8gcGFydHMuIEVsZW1lbnRQYXJ0cyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhpcyBhcnJheSBhcyB1bmRlZmluZWRcbiAgICAvLyByYXRoZXIgdGhhbiBhIHN0cmluZywgdG8gZGlzYW1iaWd1YXRlIGZyb20gYXR0cmlidXRlIGJpbmRpbmdzLlxuICAgIGNvbnN0IGF0dHJOYW1lcyA9IFtdO1xuICAgIGxldCBodG1sID0gdHlwZSA9PT0gU1ZHX1JFU1VMVCA/ICc8c3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzxtYXRoPicgOiAnJztcbiAgICAvLyBXaGVuIHdlJ3JlIGluc2lkZSBhIHJhdyB0ZXh0IHRhZyAobm90IGl0J3MgdGV4dCBjb250ZW50KSwgdGhlIHJlZ2V4XG4gICAgLy8gd2lsbCBzdGlsbCBiZSB0YWdSZWdleCBzbyB3ZSBjYW4gZmluZCBhdHRyaWJ1dGVzLCBidXQgd2lsbCBzd2l0Y2ggdG9cbiAgICAvLyB0aGlzIHJlZ2V4IHdoZW4gdGhlIHRhZyBlbmRzLlxuICAgIGxldCByYXdUZXh0RW5kUmVnZXg7XG4gICAgLy8gVGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZSwgcmVwcmVzZW50ZWQgYXMgYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZVxuICAgIC8vIHJlZ2V4ZXNcbiAgICBsZXQgcmVnZXggPSB0ZXh0RW5kUmVnZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcyA9IHN0cmluZ3NbaV07XG4gICAgICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIHRoZSBsYXN0IGF0dHJpYnV0ZSBuYW1lLiBXaGVuIHRoaXMgaXNcbiAgICAgICAgLy8gcG9zaXRpdmUgYXQgZW5kIG9mIGEgc3RyaW5nLCBpdCBtZWFucyB3ZSdyZSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgLy8gcG9zaXRpb24gYW5kIG5lZWQgdG8gcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUuXG4gICAgICAgIC8vIFdlIGFsc28gdXNlIGEgc3BlY2lhbCB2YWx1ZSBvZiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICAgIC8vIHRoZSBlbmQgb2YgYSBzdHJpbmcgaW4gYXR0cmlidXRlIG5hbWUgcG9zaXRpb24uXG4gICAgICAgIGxldCBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgIGxldCBhdHRyTmFtZTtcbiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgLy8gVGhlIGNvbmRpdGlvbnMgaW4gdGhpcyBsb29wIGhhbmRsZSB0aGUgY3VycmVudCBwYXJzZSBzdGF0ZSwgYW5kIHRoZVxuICAgICAgICAvLyBhc3NpZ25tZW50cyB0byB0aGUgYHJlZ2V4YCB2YXJpYWJsZSBhcmUgdGhlIHN0YXRlIHRyYW5zaXRpb25zLlxuICAgICAgICB3aGlsZSAobGFzdEluZGV4IDwgcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSB3aGVyZSB3ZSBwcmV2aW91c2x5IGxlZnQgb2ZmXG4gICAgICAgICAgICByZWdleC5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMocyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RJbmRleCA9IHJlZ2V4Lmxhc3RJbmRleDtcbiAgICAgICAgICAgIGlmIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoW0NPTU1FTlRfU1RBUlRdID09PSAnIS0tJykge1xuICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNvbW1lbnRFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBzdGFydGVkIGEgd2VpcmQgY29tbWVudCwgbGlrZSA8L3tcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjb21tZW50MkVuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtUQUdfTkFNRV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3VGV4dEVsZW1lbnQudGVzdChtYXRjaFtUQUdfTkFNRV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaWYgd2UgZW5jb3VudGVyIGEgcmF3LXRleHQgZWxlbWVudC4gV2UnbGwgc3dpdGNoIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlZ2V4IGF0IHRoZSBlbmQgb2YgdGhlIHRhZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd1RleHRFbmRSZWdleCA9IG5ldyBSZWdFeHAoYDwvJHttYXRjaFtUQUdfTkFNRV19YCwgJ2cnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtEWU5BTUlDX1RBR19OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaW5kaW5ncyBpbiB0YWcgbmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2Ugc3RhdGljIHRlbXBsYXRlcyBpbnN0ZWFkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jc3RhdGljLWV4cHJlc3Npb25zJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdleCA9PT0gdGFnRW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbRU5USVJFX01BVENIXSA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBhIHRhZy4gSWYgd2UgaGFkIHN0YXJ0ZWQgYSByYXctdGV4dCBlbGVtZW50LCB1c2UgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyByZWdleFxuICAgICAgICAgICAgICAgICAgICByZWdleCA9IHJhd1RleHRFbmRSZWdleCA/PyB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBiZSBlbmRpbmcgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLCBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYW55IHBlbmRpbmcgYXR0ck5hbWVFbmRJbmRleFxuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoW0FUVFJJQlVURV9OQU1FXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBuYW1lIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSByZWdleC5sYXN0SW5kZXggLSBtYXRjaFtTUEFDRVNfQU5EX0VRVUFMU10ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IG1hdGNoW0FUVFJJQlVURV9OQU1FXTtcbiAgICAgICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbUVVPVEVfQ0hBUl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnRW5kUmVnZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1hdGNoW1FVT1RFX0NIQVJdID09PSAnXCInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdleCA9PT0gZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggfHxcbiAgICAgICAgICAgICAgICByZWdleCA9PT0gc2luZ2xlUXVvdGVBdHRyRW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVnZXggPT09IGNvbW1lbnRFbmRSZWdleCB8fCByZWdleCA9PT0gY29tbWVudDJFbmRSZWdleCkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGV4dEVuZFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IG9uZSBvZiB0aGUgZml2ZSBzdGF0ZSByZWdleGVzLCBzbyBpdCBtdXN0IGJlIHRoZSBkeW5hbWljYWxseVxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQgcmF3IHRleHQgcmVnZXggYW5kIHdlJ3JlIGF0IHRoZSBjbG9zZSBvZiB0aGF0IGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgICAgICAgICByYXdUZXh0RW5kUmVnZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgYXR0ck5hbWVFbmRJbmRleCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSwgYXNzZXJ0IHRoYXQgd2UncmUgaW4gYSB2YWxpZCBhdHRyaWJ1dGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIC0gZWl0aGVyIGluIGEgdGFnLCBvciBhIHF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICAgICAgICBjb25zb2xlLmFzc2VydChhdHRyTmFtZUVuZEluZGV4ID09PSAtMSB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCwgJ3VuZXhwZWN0ZWQgcGFyc2Ugc3RhdGUgQicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgZm91ciBjYXNlczpcbiAgICAgICAgLy8gIDEuIFdlJ3JlIGluIHRleHQgcG9zaXRpb24sIGFuZCBub3QgaW4gYSByYXcgdGV4dCBlbGVtZW50XG4gICAgICAgIC8vICAgICAocmVnZXggPT09IHRleHRFbmRSZWdleCk6IGluc2VydCBhIGNvbW1lbnQgbWFya2VyLlxuICAgICAgICAvLyAgMi4gV2UgaGF2ZSBhIG5vbi1uZWdhdGl2ZSBhdHRyTmFtZUVuZEluZGV4IHdoaWNoIG1lYW5zIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gICAgIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGFkZCBhIGJvdW5kIGF0dHJpYnV0ZSBzdWZmaXguXG4gICAgICAgIC8vICAzLiBXZSdyZSBhdCB0aGUgbm9uLWZpcnN0IGJpbmRpbmcgaW4gYSBtdWx0aS1iaW5kaW5nIGF0dHJpYnV0ZSwgdXNlIGFcbiAgICAgICAgLy8gICAgIHBsYWluIG1hcmtlci5cbiAgICAgICAgLy8gIDQuIFdlJ3JlIHNvbWV3aGVyZSBlbHNlIGluc2lkZSB0aGUgdGFnLiBJZiB3ZSdyZSBpbiBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAvLyAgICAgcG9zaXRpb24gKGF0dHJOYW1lRW5kSW5kZXggPT09IC0yKSwgYWRkIGEgc2VxdWVudGlhbCBzdWZmaXggdG9cbiAgICAgICAgLy8gICAgIGdlbmVyYXRlIGEgdW5pcXVlIGF0dHJpYnV0ZSBuYW1lLlxuICAgICAgICAvLyBEZXRlY3QgYSBiaW5kaW5nIG5leHQgdG8gc2VsZi1jbG9zaW5nIHRhZyBlbmQgYW5kIGluc2VydCBhIHNwYWNlIHRvXG4gICAgICAgIC8vIHNlcGFyYXRlIHRoZSBtYXJrZXIgZnJvbSB0aGUgdGFnIGVuZDpcbiAgICAgICAgY29uc3QgZW5kID0gcmVnZXggPT09IHRhZ0VuZFJlZ2V4ICYmIHN0cmluZ3NbaSArIDFdLnN0YXJ0c1dpdGgoJy8+JykgPyAnICcgOiAnJztcbiAgICAgICAgaHRtbCArPVxuICAgICAgICAgICAgcmVnZXggPT09IHRleHRFbmRSZWdleFxuICAgICAgICAgICAgICAgID8gcyArIG5vZGVNYXJrZXJcbiAgICAgICAgICAgICAgICA6IGF0dHJOYW1lRW5kSW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICAgICA/IChhdHRyTmFtZXMucHVzaChhdHRyTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNsaWNlKDAsIGF0dHJOYW1lRW5kSW5kZXgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZEF0dHJpYnV0ZVN1ZmZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zbGljZShhdHRyTmFtZUVuZEluZGV4KSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICAgICAgICAgICAgICA6IHMgKyBtYXJrZXIgKyAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIgPyBpIDogZW5kKTtcbiAgICB9XG4gICAgY29uc3QgaHRtbFJlc3VsdCA9IGh0bWwgK1xuICAgICAgICAoc3RyaW5nc1tsXSB8fCAnPD8+JykgK1xuICAgICAgICAodHlwZSA9PT0gU1ZHX1JFU1VMVCA/ICc8L3N2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8L21hdGg+JyA6ICcnKTtcbiAgICAvLyBSZXR1cm5lZCBhcyBhbiBhcnJheSBmb3IgdGVyc2VuZXNzXG4gICAgcmV0dXJuIFt0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyhzdHJpbmdzLCBodG1sUmVzdWx0KSwgYXR0ck5hbWVzXTtcbn07XG5jbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICB7IHN0cmluZ3MsIFsnXyRsaXRUeXBlJCddOiB0eXBlIH0sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgICBsZXQgbm9kZTtcbiAgICAgICAgbGV0IG5vZGVJbmRleCA9IDA7XG4gICAgICAgIGxldCBhdHRyTmFtZUluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgcGFydENvdW50ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHRoaXMucGFydHM7XG4gICAgICAgIC8vIENyZWF0ZSB0ZW1wbGF0ZSBlbGVtZW50XG4gICAgICAgIGNvbnN0IFtodG1sLCBhdHRyTmFtZXNdID0gZ2V0VGVtcGxhdGVIdG1sKHN0cmluZ3MsIHR5cGUpO1xuICAgICAgICB0aGlzLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChodG1sLCBvcHRpb25zKTtcbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50O1xuICAgICAgICAvLyBSZS1wYXJlbnQgU1ZHIG9yIE1hdGhNTCBub2RlcyBpbnRvIHRlbXBsYXRlIHJvb3RcbiAgICAgICAgaWYgKHR5cGUgPT09IFNWR19SRVNVTFQgfHwgdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCkge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwuY29udGVudC5maXJzdENoaWxkO1xuICAgICAgICAgICAgd3JhcHBlci5yZXBsYWNlV2l0aCguLi53cmFwcGVyLmNoaWxkTm9kZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhbGsgdGhlIHRlbXBsYXRlIHRvIGZpbmQgYmluZGluZyBtYXJrZXJzIGFuZCBjcmVhdGUgVGVtcGxhdGVQYXJ0c1xuICAgICAgICB3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkgIT09IG51bGwgJiYgcGFydHMubGVuZ3RoIDwgcGFydENvdW50KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBub2RlLmxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FybiBpZiBgdGV4dGFyZWFgIGluY2x1ZGVzIGFuIGV4cHJlc3Npb24gYW5kIHRocm93IGlmIGB0ZW1wbGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBzaW5jZSB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZC4gV2UgZG8gdGhpcyBieSBjaGVja2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBpbm5lckhUTUwgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIG1hcmtlci4gVGhpcyBjYXRjaGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhc2VzIGxpa2UgYmluZGluZ3MgaW4gdGV4dGFyZWEgdGhlcmUgbWFya2VycyB0dXJuIGludG8gdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eKD86dGV4dGFyZWF8dGVtcGxhdGUpJC9pLnRlc3QodGFnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbm5lckhUTUwuaW5jbHVkZXMobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IGBFeHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgXFxgJHt0YWd9XFxgIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBlbGVtZW50cy4gU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvZXhwcmVzc2lvbi1pbi0ke3RhZ30gZm9yIG1vcmUgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGluZm9ybWF0aW9uLmA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygnJywgbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGZvciBhdHRlbXB0ZWQgZHluYW1pYyB0YWcgbmFtZXMsIHdlIGRvbid0XG4gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBiaW5kaW5nSW5kZXgsIGFuZCBpdCdsbCBiZSBvZmYgYnkgMSBpbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIC8vIGFuZCBvZmYgYnkgdHdvIGFmdGVyIGl0LlxuICAgICAgICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygbm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChib3VuZEF0dHJpYnV0ZVN1ZmZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFsTmFtZSA9IGF0dHJOYW1lc1thdHRyTmFtZUluZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljcyA9IHZhbHVlLnNwbGl0KG1hcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IC8oWy4/QF0pPyguKikvLmV4ZWMocmVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBVFRSSUJVVEVfUEFSVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG5vZGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbVsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nczogc3RhdGljcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RvcjogbVsxXSA9PT0gJy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFByb3BlcnR5UGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnPydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJvb2xlYW5BdHRyaWJ1dGVQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtWzFdID09PSAnQCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBFdmVudFBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBdHRyaWJ1dGVQYXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKG1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRUxFTUVOVF9QQVJULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBiZW5jaG1hcmsgdGhlIHJlZ2V4IGFnYWluc3QgdGVzdGluZyBmb3IgZWFjaFxuICAgICAgICAgICAgICAgIC8vIG9mIHRoZSAzIHJhdyB0ZXh0IGVsZW1lbnQgbmFtZXMuXG4gICAgICAgICAgICAgICAgaWYgKHJhd1RleHRFbGVtZW50LnRlc3Qobm9kZS50YWdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcmF3IHRleHQgZWxlbWVudHMgd2UgbmVlZCB0byBzcGxpdCB0aGUgdGV4dCBjb250ZW50IG9uXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hcmtlcnMsIGNyZWF0ZSBhIFRleHQgbm9kZSBmb3IgZWFjaCBzZWdtZW50LCBhbmQgY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgVGVtcGxhdGVQYXJ0IGZvciBlYWNoIG1hcmtlci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5ncyA9IG5vZGUudGV4dENvbnRlbnQuc3BsaXQobWFya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRydXN0ZWRUeXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHRleHQgbm9kZSBmb3IgZWFjaCBsaXRlcmFsIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIG5vZGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIG1hcmtlcnMgZm9yIGNoaWxkIHBhcnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoc3RyaW5nc1tpXSwgY3JlYXRlTWFya2VyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgcGFzdCB0aGUgbWFya2VyIG5vZGUgd2UganVzdCBhZGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyB0eXBlOiBDSElMRF9QQVJULCBpbmRleDogKytub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIGJlY2F1c2UgdGhpcyBtYXJrZXIgaXMgYWRkZWQgYWZ0ZXIgdGhlIHdhbGtlcidzIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGUsIGl0IHdpbGwgYmUgd2Fsa2VkIHRvIGluIHRoZSBvdXRlciBsb29wIChhbmQgaWdub3JlZCksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGFkanVzdCBub2RlSW5kZXggaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoc3RyaW5nc1tsYXN0SW5kZXhdLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vZGUuZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gbWFya2VyTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IHR5cGU6IENISUxEX1BBUlQsIGluZGV4OiBub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGkgPSBub2RlLmRhdGEuaW5kZXhPZihtYXJrZXIsIGkgKyAxKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21tZW50IG5vZGUgaGFzIGEgYmluZGluZyBtYXJrZXIgaW5zaWRlLCBtYWtlIGFuIGluYWN0aXZlIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiaW5kaW5nIHdvbid0IHdvcmssIGJ1dCBzdWJzZXF1ZW50IGJpbmRpbmdzIHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goeyB0eXBlOiBDT01NRU5UX1BBUlQsIGluZGV4OiBub2RlSW5kZXggfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IG1hcmtlci5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBkdXBsaWNhdGUgYXR0cmlidXRlIG9uIGEgdGFnLCB0aGVuIHdoZW4gdGhlIHRhZyBpc1xuICAgICAgICAgICAgLy8gcGFyc2VkIGludG8gYW4gZWxlbWVudCB0aGUgYXR0cmlidXRlIGdldHMgZGUtZHVwbGljYXRlZC4gV2UgY2FuIGRldGVjdFxuICAgICAgICAgICAgLy8gdGhpcyBtaXNtYXRjaCBpZiB3ZSBoYXZlbid0IHByZWNpc2VseSBjb25zdW1lZCBldmVyeSBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgLy8gd2hlbiBwcmVwYXJpbmcgdGhlIHRlbXBsYXRlLiBUaGlzIHdvcmtzIGJlY2F1c2UgYGF0dHJOYW1lc2AgaXMgYnVpbHRcbiAgICAgICAgICAgIC8vIGZyb20gdGhlIHRlbXBsYXRlIHN0cmluZyBhbmQgYGF0dHJOYW1lSW5kZXhgIGNvbWVzIGZyb20gcHJvY2Vzc2luZyB0aGVcbiAgICAgICAgICAgIC8vIHJlc3VsdGluZyBET00uXG4gICAgICAgICAgICBpZiAoYXR0ck5hbWVzLmxlbmd0aCAhPT0gYXR0ck5hbWVJbmRleCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGV0ZWN0ZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBiaW5kaW5ncy4gVGhpcyBvY2N1cnMgaWYgeW91ciB0ZW1wbGF0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYGhhcyBkdXBsaWNhdGUgYXR0cmlidXRlcyBvbiBhbiBlbGVtZW50IHRhZy4gRm9yIGV4YW1wbGUgYCArXG4gICAgICAgICAgICAgICAgICAgIGBcIjxpbnB1dCA/ZGlzYWJsZWQ9XFwke3RydWV9ID9kaXNhYmxlZD1cXCR7ZmFsc2V9PlwiIGNvbnRhaW5zIGEgYCArXG4gICAgICAgICAgICAgICAgICAgIGBkdXBsaWNhdGUgXCJkaXNhYmxlZFwiIGF0dHJpYnV0ZS4gVGhlIGVycm9yIHdhcyBkZXRlY3RlZCBpbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6IFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAnYCcgK1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmpvaW4oJyR7Li4ufScpICtcbiAgICAgICAgICAgICAgICAgICAgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBjb3VsZCBzZXQgd2Fsa2VyLmN1cnJlbnROb2RlIHRvIGFub3RoZXIgbm9kZSBoZXJlIHRvIHByZXZlbnQgYSBtZW1vcnlcbiAgICAgICAgLy8gbGVhaywgYnV0IGV2ZXJ5IHRpbWUgd2UgcHJlcGFyZSBhIHRlbXBsYXRlLCB3ZSBpbW1lZGlhdGVseSByZW5kZXIgaXRcbiAgICAgICAgLy8gYW5kIHJlLXVzZSB0aGUgd2Fsa2VyIGluIG5ldyBUZW1wbGF0ZUluc3RhbmNlLl9jbG9uZSgpLlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgcHJlcCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgY2xvbmFibGVUZW1wbGF0ZTogdGhpcy5lbCxcbiAgICAgICAgICAgICAgICBwYXJ0czogdGhpcy5wYXJ0cyxcbiAgICAgICAgICAgICAgICBzdHJpbmdzLFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIE92ZXJyaWRkZW4gdmlhIGBsaXRIdG1sUG9seWZpbGxTdXBwb3J0YCB0byBwcm92aWRlIHBsYXRmb3JtIHN1cHBvcnQuXG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbCwgX29wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKHBhcnQsIHZhbHVlLCBwYXJlbnQgPSBwYXJ0LCBhdHRyaWJ1dGVJbmRleCkge1xuICAgIC8vIEJhaWwgZWFybHkgaWYgdGhlIHZhbHVlIGlzIGV4cGxpY2l0bHkgbm9DaGFuZ2UuIE5vdGUsIHRoaXMgbWVhbnMgYW55XG4gICAgLy8gbmVzdGVkIGRpcmVjdGl2ZSBpcyBzdGlsbCBhdHRhY2hlZCBhbmQgaXMgbm90IHJ1bi5cbiAgICBpZiAodmFsdWUgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgbGV0IGN1cnJlbnREaXJlY3RpdmUgPSBhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gcGFyZW50Ll9fZGlyZWN0aXZlcz8uW2F0dHJpYnV0ZUluZGV4XVxuICAgICAgICA6IHBhcmVudC5fX2RpcmVjdGl2ZTtcbiAgICBjb25zdCBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IgPSBpc1ByaW1pdGl2ZSh2YWx1ZSlcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICAgICAgdmFsdWVbJ18kbGl0RGlyZWN0aXZlJCddO1xuICAgIGlmIChjdXJyZW50RGlyZWN0aXZlPy5jb25zdHJ1Y3RvciAhPT0gbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKSB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIGN1cnJlbnREaXJlY3RpdmU/LlsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPy4oZmFsc2UpO1xuICAgICAgICBpZiAobmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlID0gbmV3IG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvcihwYXJ0KTtcbiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmUuXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAocGFyZW50Ll9fZGlyZWN0aXZlcyA/Pz0gW10pW2F0dHJpYnV0ZUluZGV4XSA9XG4gICAgICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudC5fX2RpcmVjdGl2ZSA9IGN1cnJlbnREaXJlY3RpdmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnREaXJlY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUocGFydCwgY3VycmVudERpcmVjdGl2ZS5fJHJlc29sdmUocGFydCwgdmFsdWUudmFsdWVzKSwgY3VycmVudERpcmVjdGl2ZSwgYXR0cmlidXRlSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIEFuIHVwZGF0ZWFibGUgaW5zdGFuY2Ugb2YgYSBUZW1wbGF0ZS4gSG9sZHMgcmVmZXJlbmNlcyB0byB0aGUgUGFydHMgdXNlZCB0b1xuICogdXBkYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZS5cbiAqL1xuY2xhc3MgVGVtcGxhdGVJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IodGVtcGxhdGUsIHBhcmVudCkge1xuICAgICAgICB0aGlzLl8kcGFydHMgPSBbXTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fJHRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIC8vIENhbGxlZCBieSBDaGlsZFBhcnQgcGFyZW50Tm9kZSBnZXR0ZXJcbiAgICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIGFcbiAgICAvLyBEb2N1bWVudEZyYWdtZW50IGFuZCB3ZSBkb24ndCB3YW50IHRvIGhvbGQgb250byBpdCB3aXRoIGFuIGluc3RhbmNlIGZpZWxkLlxuICAgIF9jbG9uZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgZWw6IHsgY29udGVudCB9LCBwYXJ0czogcGFydHMsIH0gPSB0aGlzLl8kdGVtcGxhdGU7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gKG9wdGlvbnM/LmNyZWF0aW9uU2NvcGUgPz8gZCkuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKTtcbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZnJhZ21lbnQ7XG4gICAgICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgIGxldCBub2RlSW5kZXggPSAwO1xuICAgICAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICAgICAgbGV0IHRlbXBsYXRlUGFydCA9IHBhcnRzWzBdO1xuICAgICAgICB3aGlsZSAodGVtcGxhdGVQYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT09IHRlbXBsYXRlUGFydC5pbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0O1xuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gQ0hJTERfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChub2RlLCBub2RlLm5leHRTaWJsaW5nLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEFUVFJJQlVURV9QQVJUKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgdGVtcGxhdGVQYXJ0LmN0b3Iobm9kZSwgdGVtcGxhdGVQYXJ0Lm5hbWUsIHRlbXBsYXRlUGFydC5zdHJpbmdzLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEVMRU1FTlRfUEFSVCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IEVsZW1lbnRQYXJ0KG5vZGUsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl8kcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1srK3BhcnRJbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZUluZGV4ICE9PSB0ZW1wbGF0ZVBhcnQ/LmluZGV4KSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICAgIG5vZGVJbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBjdXJyZW50Tm9kZSBhd2F5IGZyb20gdGhlIGNsb25lZCB0cmVlIHNvIHRoYXQgd2VcbiAgICAgICAgLy8gZG9uJ3QgaG9sZCBvbnRvIHRoZSB0cmVlIGV2ZW4gaWYgdGhlIHRyZWUgaXMgZGV0YWNoZWQgYW5kIHNob3VsZCBiZVxuICAgICAgICAvLyBmcmVlZC5cbiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gZDtcbiAgICAgICAgcmV0dXJuIGZyYWdtZW50O1xuICAgIH1cbiAgICBfdXBkYXRlKHZhbHVlcykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiB0aGlzLl8kcGFydHMpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ3NldCBwYXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWVzLCBwYXJ0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgdGhlIHBhcnQgY29uc3VtZXMgaXMgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdmFsdWVzIGFyZSBpbiBiZXR3ZWVuIHRlbXBsYXRlIHNwYW5zLiBXZSBpbmNyZW1lbnQgaSBieSAxXG4gICAgICAgICAgICAgICAgICAgIC8vIGxhdGVyIGluIHRoZSBsb29wLCBzbyBpbmNyZW1lbnQgaXQgYnkgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDIgaGVyZVxuICAgICAgICAgICAgICAgICAgICBpICs9IHBhcnQuc3RyaW5ncy5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydC5fJHNldFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgQ2hpbGRQYXJ0IHtcbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIENoaWxkUGFydHMgdGhhdCBhcmUgbm90IGF0IHRoZSByb290IHNob3VsZCBhbHdheXMgYmUgY3JlYXRlZCB3aXRoIGFcbiAgICAgICAgLy8gcGFyZW50OyBvbmx5IFJvb3RDaGlsZE5vZGUncyB3b24ndCwgc28gdGhleSByZXR1cm4gdGhlIGxvY2FsIGlzQ29ubmVjdGVkXG4gICAgICAgIC8vIHN0YXRlXG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Py5fJGlzQ29ubmVjdGVkID8/IHRoaXMuX19pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3RhcnROb2RlLCBlbmROb2RlLCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQ0hJTERfUEFSVDtcbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0cyB3aGVuIHJlcXVpcmVkIGJ5XG4gICAgICAgIC8vIEFzeW5jRGlyZWN0aXZlXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuXyRzdGFydE5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuXyRlbmROb2RlID0gZW5kTm9kZTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgLy8gTm90ZSBfX2lzQ29ubmVjdGVkIGlzIG9ubHkgZXZlciBhY2Nlc3NlZCBvbiBSb290UGFydHMgKGkuZS4gd2hlbiB0aGVyZSBpc1xuICAgICAgICAvLyBubyBfJHBhcmVudCk7IHRoZSB2YWx1ZSBvbiBhIG5vbi1yb290LXBhcnQgaXMgXCJkb24ndCBjYXJlXCIsIGJ1dCBjaGVja2luZ1xuICAgICAgICAvLyBmb3IgcGFyZW50IHdvdWxkIGJlIG1vcmUgY29kZVxuICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBvcHRpb25zPy5pc0Nvbm5lY3RlZCA/PyB0cnVlO1xuICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGluaXRpYWxpemUgZm9yIGNvbnNpc3RlbnQgY2xhc3Mgc2hhcGUuXG4gICAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgbm9kZSBpbnRvIHdoaWNoIHRoZSBwYXJ0IHJlbmRlcnMgaXRzIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBBIENoaWxkUGFydCdzIGNvbnRlbnQgY29uc2lzdHMgb2YgYSByYW5nZSBvZiBhZGphY2VudCBjaGlsZCBub2RlcyBvZlxuICAgICAqIGAucGFyZW50Tm9kZWAsIHBvc3NpYmx5IGJvcmRlcmVkIGJ5ICdtYXJrZXIgbm9kZXMnIChgLnN0YXJ0Tm9kZWAgYW5kXG4gICAgICogYC5lbmROb2RlYCkuXG4gICAgICpcbiAgICAgKiAtIElmIGJvdGggYC5zdGFydE5vZGVgIGFuZCBgLmVuZE5vZGVgIGFyZSBub24tbnVsbCwgdGhlbiB0aGUgcGFydCdzIGNvbnRlbnRcbiAgICAgKiBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgYmV0d2VlbiBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAsIGV4Y2x1c2l2ZWx5LlxuICAgICAqXG4gICAgICogLSBJZiBgLnN0YXJ0Tm9kZWAgaXMgbm9uLW51bGwgYnV0IGAuZW5kTm9kZWAgaXMgbnVsbCwgdGhlbiB0aGUgcGFydCdzXG4gICAgICogY29udGVudCBjb25zaXN0cyBvZiBhbGwgc2libGluZ3MgZm9sbG93aW5nIGAuc3RhcnROb2RlYCwgdXAgdG8gYW5kXG4gICAgICogaW5jbHVkaW5nIHRoZSBsYXN0IGNoaWxkIG9mIGAucGFyZW50Tm9kZWAuIElmIGAuZW5kTm9kZWAgaXMgbm9uLW51bGwsIHRoZW5cbiAgICAgKiBgLnN0YXJ0Tm9kZWAgd2lsbCBhbHdheXMgYmUgbm9uLW51bGwuXG4gICAgICpcbiAgICAgKiAtIElmIGJvdGggYC5lbmROb2RlYCBhbmQgYC5zdGFydE5vZGVgIGFyZSBudWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgICAqIGNvbnNpc3RzIG9mIGFsbCBjaGlsZCBub2RlcyBvZiBgLnBhcmVudE5vZGVgLlxuICAgICAqL1xuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fJHBhcmVudDtcbiAgICAgICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBwYXJlbnROb2RlPy5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVCAqLykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHBhcmVudE5vZGUgaXMgYSBEb2N1bWVudEZyYWdtZW50LCBpdCBtYXkgYmUgYmVjYXVzZSB0aGUgRE9NIGlzXG4gICAgICAgICAgICAvLyBzdGlsbCBpbiB0aGUgY2xvbmVkIGZyYWdtZW50IGR1cmluZyBpbml0aWFsIHJlbmRlcjsgaWYgc28sIGdldCB0aGUgcmVhbFxuICAgICAgICAgICAgLy8gcGFyZW50Tm9kZSB0aGUgcGFydCB3aWxsIGJlIGNvbW1pdHRlZCBpbnRvIGJ5IGFza2luZyB0aGUgcGFyZW50LlxuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnROb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcGFydCdzIGxlYWRpbmcgbWFya2VyIG5vZGUsIGlmIGFueS4gU2VlIGAucGFyZW50Tm9kZWAgZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBnZXQgc3RhcnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHN0YXJ0Tm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnQncyB0cmFpbGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgICAqIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGdldCBlbmROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJGVuZE5vZGU7XG4gICAgfVxuICAgIF8kc2V0VmFsdWUodmFsdWUsIGRpcmVjdGl2ZVBhcmVudCA9IHRoaXMpIHtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGlzIFxcYENoaWxkUGFydFxcYCBoYXMgbm8gXFxgcGFyZW50Tm9kZVxcYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBhY2NlcHQgYSB2YWx1ZS4gVGhpcyBsaWtlbHkgbWVhbnMgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgcGFydCB3YXMgbWFuaXB1bGF0ZWQgaW4gYW4gdW5zdXBwb3J0ZWQgd2F5IG91dHNpZGUgb2YgTGl0J3MgY29udHJvbCBzdWNoIHRoYXQgdGhlIHBhcnQncyBtYXJrZXIgbm9kZXMgd2VyZSBlamVjdGVkIGZyb20gRE9NLiBGb3IgZXhhbXBsZSwgc2V0dGluZyB0aGUgZWxlbWVudCdzIFxcYGlubmVySFRNTFxcYCBvciBcXGB0ZXh0Q29udGVudFxcYCBjYW4gZG8gdGhpcy5gKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCk7XG4gICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIE5vbi1yZW5kZXJpbmcgY2hpbGQgdmFsdWVzLiBJdCdzIGltcG9ydGFudCB0aGF0IHRoZXNlIGRvIG5vdCByZW5kZXJcbiAgICAgICAgICAgIC8vIGVtcHR5IHRleHQgbm9kZXMgdG8gYXZvaWQgaXNzdWVzIHdpdGggcHJldmVudGluZyBkZWZhdWx0IDxzbG90PlxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgY29udGVudC5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZyB8fCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBub3RoaW5nIHRvIGNoaWxkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fJHN0YXJ0Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuXyRlbmROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fJHBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlICYmIHZhbHVlICE9PSBub0NoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZVsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRlbXBsYXRlUmVzdWx0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZS5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5vcHRpb25zPy5ob3N0ID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdFRleHQoYFtwcm9iYWJsZSBtaXN0YWtlOiByZW5kZXJlZCBhIHRlbXBsYXRlJ3MgaG9zdCBpbiBpdHNlbGYgYCArXG4gICAgICAgICAgICAgICAgICAgIGAoY29tbW9ubHkgY2F1c2VkIGJ5IHdyaXRpbmcgXFwke3RoaXN9IGluIGEgdGVtcGxhdGVdYCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBBdHRlbXB0ZWQgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZSBob3N0YCwgdmFsdWUsIGBpbnNpZGUgaXRzZWxmLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgYSBtaXN0YWtlLCBhbmQgaW4gZGV2IG1vZGUgYCwgYHdlIHJlbmRlciBzb21lIHdhcm5pbmcgdGV4dC4gSW4gcHJvZHVjdGlvbiBob3dldmVyLCB3ZSdsbCBgLCBgcmVuZGVyIGl0LCB3aGljaCB3aWxsIHVzdWFsbHkgcmVzdWx0IGluIGFuIGVycm9yLCBhbmQgc29tZXRpbWVzIGAsIGBpbiB0aGUgZWxlbWVudCBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgRE9NLmApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb21taXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjaywgd2lsbCByZW5kZXIgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgICAgICAgICAgdGhpcy5fY29tbWl0VGV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2luc2VydChub2RlKSB7XG4gICAgICAgIHJldHVybiB3cmFwKHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKG5vZGUsIHRoaXMuXyRlbmROb2RlKTtcbiAgICB9XG4gICAgX2NvbW1pdE5vZGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyAmJlxuICAgICAgICAgICAgICAgIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGVOYW1lID0gdGhpcy5fJHN0YXJ0Tm9kZS5wYXJlbnROb2RlPy5ub2RlTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScgfHwgcGFyZW50Tm9kZU5hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0ZvcmJpZGRlbic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGVOYW1lID09PSAnU1RZTEUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBMaXQgZG9lcyBub3Qgc3VwcG9ydCBiaW5kaW5nIGluc2lkZSBzdHlsZSBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIHN0eWxlIGluamVjdGlvbiBhdHRhY2tzIGNhbiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBleGZpbHRyYXRlIGRhdGEgYW5kIHNwb29mIFVJcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29uc2lkZXIgaW5zdGVhZCB1c2luZyBjc3NcXGAuLi5cXGAgbGl0ZXJhbHMgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdG8gY29tcG9zZSBzdHlsZXMsIGFuZCBkbyBkeW5hbWljIHN0eWxpbmcgd2l0aCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjc3MgY3VzdG9tIHByb3BlcnRpZXMsIDo6cGFydHMsIDxzbG90PnMsIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuZCBieSBtdXRhdGluZyB0aGUgRE9NIHJhdGhlciB0aGFuIHN0eWxlc2hlZXRzLmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHNjcmlwdCBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyBpcyBhIHNlY3VyaXR5IHJpc2ssIGFzIGl0IGNvdWxkIGFsbG93IGFyYml0cmFyeSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjb2RlIGV4ZWN1dGlvbi5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgbm9kZScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuXyRwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdGhpcy5faW5zZXJ0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfY29tbWl0VGV4dCh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB0aGUgY29tbWl0dGVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlIGl0IG1lYW5zIHdlIGNhbGxlZCBfY29tbWl0VGV4dCBvblxuICAgICAgICAvLyB0aGUgcHJldmlvdXMgcmVuZGVyLCBhbmQgd2Uga25vdyB0aGF0IHRoaXMuXyRzdGFydE5vZGUubmV4dFNpYmxpbmcgaXMgYVxuICAgICAgICAvLyBUZXh0IG5vZGUuIFdlIGNhbiBub3cganVzdCByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgKC5kYXRhKSBvZiB0aGUgbm9kZS5cbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gbm90aGluZyAmJlxuICAgICAgICAgICAgaXNQcmltaXRpdmUodGhpcy5fJGNvbW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRTYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKG5vZGUsICdkYXRhJywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fdGV4dFNhbml0aXplcih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUodGV4dE5vZGUpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gc2V0dGluZyB0ZXh0IGNvbnRlbnQsIGZvciBzZWN1cml0eSBwdXJwb3NlcyBpdCBtYXR0ZXJzIGEgbG90XG4gICAgICAgICAgICAgICAgLy8gd2hhdCB0aGUgcGFyZW50IGlzLiBGb3IgZXhhbXBsZSwgPHN0eWxlPiBhbmQgPHNjcmlwdD4gbmVlZCB0byBiZVxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgd2l0aCBjYXJlLCB3aGlsZSA8c3Bhbj4gZG9lcyBub3QuIFNvIGZpcnN0IHdlIG5lZWQgdG8gcHV0IGFcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUgaW50byB0aGUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHNhbml0aXplIGl0cyBjb250ZW50LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dFNhbml0aXplciA9IGNyZWF0ZVNhbml0aXplcih0ZXh0Tm9kZSwgJ2RhdGEnLCAncHJvcGVydHknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXh0U2FuaXRpemVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHRleHROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRleHROb2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbW1pdE5vZGUoZC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgX2NvbW1pdFRlbXBsYXRlUmVzdWx0KHJlc3VsdCkge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBjb25zdCB7IHZhbHVlcywgWydfJGxpdFR5cGUkJ106IHR5cGUgfSA9IHJlc3VsdDtcbiAgICAgICAgLy8gSWYgJGxpdFR5cGUkIGlzIGEgbnVtYmVyLCByZXN1bHQgaXMgYSBwbGFpbiBUZW1wbGF0ZVJlc3VsdCBhbmQgd2UgZ2V0XG4gICAgICAgIC8vIHRoZSB0ZW1wbGF0ZSBmcm9tIHRoZSB0ZW1wbGF0ZSBjYWNoZS4gSWYgbm90LCByZXN1bHQgaXMgYVxuICAgICAgICAvLyBDb21waWxlZFRlbXBsYXRlUmVzdWx0IGFuZCBfJGxpdFR5cGUkIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAvLyB0byBjcmVhdGUgdGhlIDx0ZW1wbGF0ZT4gZWxlbWVudCB0aGUgZmlyc3QgdGltZSB3ZSBzZWUgaXQuXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdHlwZW9mIHR5cGUgPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IHRoaXMuXyRnZXRUZW1wbGF0ZShyZXN1bHQpXG4gICAgICAgICAgICA6ICh0eXBlLmVsID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAodHlwZS5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQodHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcodHlwZS5oLCB0eXBlLmhbMF0pLCB0aGlzLm9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgICB0eXBlKTtcbiAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZT8uXyR0ZW1wbGF0ZSA9PT0gdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ3RlbXBsYXRlIHVwZGF0aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzOiB0aGlzLl8kY29tbWl0dGVkVmFsdWUuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGVtcGxhdGVJbnN0YW5jZSh0ZW1wbGF0ZSwgdGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGluc3RhbmNlLl9jbG9uZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW5zdGFuY2UuX3VwZGF0ZSh2YWx1ZXMpO1xuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkIGFuZCB1cGRhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShmcmFnbWVudCk7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJGdldFRlbXBsYXRlKHJlc3VsdCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNhY2hlLmdldChyZXN1bHQuc3RyaW5ncyk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZUNhY2hlLnNldChyZXN1bHQuc3RyaW5ncywgKHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJlc3VsdCkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuICAgIF9jb21taXRJdGVyYWJsZSh2YWx1ZSkge1xuICAgICAgICAvLyBGb3IgYW4gSXRlcmFibGUsIHdlIGNyZWF0ZSBhIG5ldyBJbnN0YW5jZVBhcnQgcGVyIGl0ZW0sIHRoZW4gc2V0IGl0c1xuICAgICAgICAvLyB2YWx1ZSB0byB0aGUgaXRlbS4gVGhpcyBpcyBhIGxpdHRsZSBiaXQgb2Ygb3ZlcmhlYWQgZm9yIGV2ZXJ5IGl0ZW0gaW5cbiAgICAgICAgLy8gYW4gSXRlcmFibGUsIGJ1dCBpdCBsZXRzIHVzIHJlY3Vyc2UgZWFzaWx5IGFuZCBlZmZpY2llbnRseSB1cGRhdGUgQXJyYXlzXG4gICAgICAgIC8vIG9mIFRlbXBsYXRlUmVzdWx0cyB0aGF0IHdpbGwgYmUgY29tbW9ubHkgcmV0dXJuZWQgZnJvbSBleHByZXNzaW9ucyBsaWtlOlxuICAgICAgICAvLyBhcnJheS5tYXAoKGkpID0+IGh0bWxgJHtpfWApLCBieSByZXVzaW5nIGV4aXN0aW5nIFRlbXBsYXRlSW5zdGFuY2VzLlxuICAgICAgICAvLyBJZiB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlbiB0aGUgcHJldmlvdXMgcmVuZGVyIHdhcyBvZiBhblxuICAgICAgICAvLyBpdGVyYWJsZSBhbmQgdmFsdWUgd2lsbCBjb250YWluIHRoZSBDaGlsZFBhcnRzIGZyb20gdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSWYgdmFsdWUgaXMgbm90IGFuIGFycmF5LCBjbGVhciB0aGlzIHBhcnQgYW5kIG1ha2UgYSBuZXdcbiAgICAgICAgLy8gYXJyYXkgZm9yIENoaWxkUGFydHMuXG4gICAgICAgIGlmICghaXNBcnJheSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIExldHMgdXMga2VlcCB0cmFjayBvZiBob3cgbWFueSBpdGVtcyB3ZSBzdGFtcGVkIHNvIHdlIGNhbiBjbGVhciBsZWZ0b3ZlclxuICAgICAgICAvLyBpdGVtcyBmcm9tIGEgcHJldmlvdXMgcmVuZGVyXG4gICAgICAgIGNvbnN0IGl0ZW1QYXJ0cyA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZTtcbiAgICAgICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgICAgIGxldCBpdGVtUGFydDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocGFydEluZGV4ID09PSBpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gZXhpc3RpbmcgcGFydCwgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiB0ZXN0IHBlcmYgaW1wYWN0IG9mIGFsd2F5cyBjcmVhdGluZyB0d28gcGFydHNcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHNoYXJpbmcgcGFydHMgYmV0d2VlbiBub2Rlc1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy8xMjY2XG4gICAgICAgICAgICAgICAgaXRlbVBhcnRzLnB1c2goKGl0ZW1QYXJ0ID0gbmV3IENoaWxkUGFydCh0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLCB0aGlzLl9pbnNlcnQoY3JlYXRlTWFya2VyKCkpLCB0aGlzLCB0aGlzLm9wdGlvbnMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBwYXJ0XG4gICAgICAgICAgICAgICAgaXRlbVBhcnQgPSBpdGVtUGFydHNbcGFydEluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1QYXJ0Ll8kc2V0VmFsdWUoaXRlbSk7XG4gICAgICAgICAgICBwYXJ0SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydEluZGV4IDwgaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gaXRlbVBhcnRzIGFsd2F5cyBoYXZlIGVuZCBub2Rlc1xuICAgICAgICAgICAgdGhpcy5fJGNsZWFyKGl0ZW1QYXJ0ICYmIHdyYXAoaXRlbVBhcnQuXyRlbmROb2RlKS5uZXh0U2libGluZywgcGFydEluZGV4KTtcbiAgICAgICAgICAgIC8vIFRydW5jYXRlIHRoZSBwYXJ0cyBhcnJheSBzbyBfdmFsdWUgcmVmbGVjdHMgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgICAgIGl0ZW1QYXJ0cy5sZW5ndGggPSBwYXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbm9kZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIFBhcnQgZnJvbSB0aGUgRE9NLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0IFN0YXJ0IG5vZGUgdG8gY2xlYXIgZnJvbSwgZm9yIGNsZWFyaW5nIGEgc3Vic2V0IG9mIHRoZSBwYXJ0J3NcbiAgICAgKiAgICAgRE9NICh1c2VkIHdoZW4gdHJ1bmNhdGluZyBpdGVyYWJsZXMpXG4gICAgICogQHBhcmFtIGZyb20gIFdoZW4gYHN0YXJ0YCBpcyBzcGVjaWZpZWQsIHRoZSBpbmRleCB3aXRoaW4gdGhlIGl0ZXJhYmxlIGZyb21cbiAgICAgKiAgICAgd2hpY2ggQ2hpbGRQYXJ0cyBhcmUgYmVpbmcgcmVtb3ZlZCwgdXNlZCBmb3IgZGlzY29ubmVjdGluZyBkaXJlY3RpdmVzXG4gICAgICogICAgIGluIHRob3NlIFBhcnRzLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgXyRjbGVhcihzdGFydCA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcsIGZyb20pIHtcbiAgICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oZmFsc2UsIHRydWUsIGZyb20pO1xuICAgICAgICB3aGlsZSAoc3RhcnQgIT09IHRoaXMuXyRlbmROb2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgbm9uLW51bGwgYXNzZXJ0aW9uIGlzIHNhZmUgYmVjYXVzZSBpZiBfJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpc1xuICAgICAgICAgICAgLy8gbnVsbCwgdGhlbiBfJGVuZE5vZGUgaXMgYWxzbyBudWxsLCBhbmQgd2Ugd291bGQgbm90IGhhdmUgZW50ZXJlZCB0aGlzXG4gICAgICAgICAgICAvLyBsb29wLlxuICAgICAgICAgICAgY29uc3QgbiA9IHdyYXAoc3RhcnQpLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgd3JhcChzdGFydCkucmVtb3ZlKCk7XG4gICAgICAgICAgICBzdGFydCA9IG47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50YXRpb24gb2YgUm9vdFBhcnQncyBgaXNDb25uZWN0ZWRgLiBOb3RlIHRoYXQgdGhpcyBtZXRob2RcbiAgICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYFJvb3RQYXJ0YHMgKHRoZSBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGFcbiAgICAgKiB0b3AtbGV2ZWwgYHJlbmRlcigpYCBjYWxsKS4gSXQgaGFzIG5vIGVmZmVjdCBvbiBub24tcm9vdCBDaGlsZFBhcnRzLlxuICAgICAqIEBwYXJhbSBpc0Nvbm5lY3RlZCBXaGV0aGVyIHRvIHNldFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZCkge1xuICAgICAgICBpZiAodGhpcy5fJHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9faXNDb25uZWN0ZWQgPSBpc0Nvbm5lY3RlZDtcbiAgICAgICAgICAgIHRoaXMuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8uKGlzQ29ubmVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0LnNldENvbm5lY3RlZCgpIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhICcgK1xuICAgICAgICAgICAgICAgICdSb290UGFydCByZXR1cm5lZCBmcm9tIHJlbmRlcigpLicpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgQXR0cmlidXRlUGFydCB7XG4gICAgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQudGFnTmFtZTtcbiAgICB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBuYW1lLCBzdHJpbmdzLCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gQVRUUklCVVRFX1BBUlQ7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID4gMiB8fCBzdHJpbmdzWzBdICE9PSAnJyB8fCBzdHJpbmdzWzFdICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3IEFycmF5KHN0cmluZ3MubGVuZ3RoIC0gMSkuZmlsbChuZXcgU3RyaW5nKCkpO1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5ncztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5vdGhpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFydCBieSByZXNvbHZpbmcgdGhlIHZhbHVlIGZyb20gcG9zc2libHkgbXVsdGlwbGVcbiAgICAgKiB2YWx1ZXMgYW5kIHN0YXRpYyBzdHJpbmdzIGFuZCBjb21taXR0aW5nIGl0IHRvIHRoZSBET00uXG4gICAgICogSWYgdGhpcyBwYXJ0IGlzIHNpbmdsZS12YWx1ZWQsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIHVuZGVmaW5lZCwgYW5kIHRoZVxuICAgICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIGFyZ3VtZW50LiBJZiB0aGlzIHBhcnQgaXNcbiAgICAgKiBtdWx0aS12YWx1ZSwgYHRoaXMuX3N0cmluZ3NgIHdpbGwgYmUgZGVmaW5lZCwgYW5kIHRoZSBtZXRob2QgaXMgY2FsbGVkXG4gICAgICogd2l0aCB0aGUgdmFsdWUgYXJyYXkgb2YgdGhlIHBhcnQncyBvd25pbmcgVGVtcGxhdGVJbnN0YW5jZSwgYW5kIGFuIG9mZnNldFxuICAgICAqIGludG8gdGhlIHZhbHVlIGFycmF5IGZyb20gd2hpY2ggdGhlIHZhbHVlcyBzaG91bGQgYmUgcmVhZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBvdmVybG9hZGVkIHRoaXMgd2F5IHRvIGVsaW1pbmF0ZSBzaG9ydC1saXZlZCBhcnJheSBzbGljZXNcbiAgICAgKiBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdmFsdWVzLCBhbmQgYWxsb3cgYSBmYXN0LXBhdGggZm9yIHNpbmdsZS12YWx1ZWRcbiAgICAgKiBwYXJ0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgcGFydCB2YWx1ZSwgb3IgYW4gYXJyYXkgb2YgdmFsdWVzIGZvciBtdWx0aS12YWx1ZWQgcGFydHNcbiAgICAgKiBAcGFyYW0gdmFsdWVJbmRleCB0aGUgaW5kZXggdG8gc3RhcnQgcmVhZGluZyB2YWx1ZXMgZnJvbS4gYHVuZGVmaW5lZGAgZm9yXG4gICAgICogICBzaW5nbGUtdmFsdWVkIHBhcnRzXG4gICAgICogQHBhcmFtIG5vQ29tbWl0IGNhdXNlcyB0aGUgcGFydCB0byBub3QgY29tbWl0IGl0cyB2YWx1ZSB0byB0aGUgRE9NLiBVc2VkXG4gICAgICogICBpbiBoeWRyYXRpb24gdG8gcHJpbWUgYXR0cmlidXRlIHBhcnRzIHdpdGggdGhlaXIgZmlyc3QtcmVuZGVyZWQgdmFsdWUsXG4gICAgICogICBidXQgbm90IHNldCB0aGUgYXR0cmlidXRlLCBhbmQgaW4gU1NSIHRvIG5vLW9wIHRoZSBET00gb3BlcmF0aW9uIGFuZFxuICAgICAqICAgY2FwdHVyZSB0aGUgdmFsdWUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQgPSB0aGlzLCB2YWx1ZUluZGV4LCBub0NvbW1pdCkge1xuICAgICAgICBjb25zdCBzdHJpbmdzID0gdGhpcy5zdHJpbmdzO1xuICAgICAgICAvLyBXaGV0aGVyIGFueSBvZiB0aGUgdmFsdWVzIGhhcyBjaGFuZ2VkLCBmb3IgZGlydHktY2hlY2tpbmdcbiAgICAgICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RyaW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUtdmFsdWUgYmluZGluZyBjYXNlXG4gICAgICAgICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCwgMCk7XG4gICAgICAgICAgICBjaGFuZ2UgPVxuICAgICAgICAgICAgICAgICFpc1ByaW1pdGl2ZSh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEludGVycG9sYXRpb24gY2FzZVxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHN0cmluZ3NbMF07XG4gICAgICAgICAgICBsZXQgaSwgdjtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIHYgPSByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlc1t2YWx1ZUluZGV4ICsgaV0sIGRpcmVjdGl2ZVBhcmVudCwgaSk7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIGlzIGBub0NoYW5nZWAsIHVzZSB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZVtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hhbmdlIHx8PVxuICAgICAgICAgICAgICAgICAgICAhaXNQcmltaXRpdmUodikgfHwgdiAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSBub3RoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbm90aGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gKHYgPz8gJycpICsgc3RyaW5nc1tpICsgMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyByZWNvcmQgZWFjaCB2YWx1ZSwgZXZlbiBpZiBvbmUgaXMgYG5vdGhpbmdgLCBmb3IgZnV0dXJlXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWVbaV0gPSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2UgJiYgIW5vQ29tbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb21taXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21taXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgIHdyYXAodGhpcy5lbGVtZW50KS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKHRoaXMuZWxlbWVudCwgdGhpcy5uYW1lLCAnYXR0cmlidXRlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlID8/ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBhdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdyYXAodGhpcy5lbGVtZW50KS5zZXRBdHRyaWJ1dGUodGhpcy5uYW1lLCAodmFsdWUgPz8gJycpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFByb3BlcnR5UGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSBQUk9QRVJUWV9QQVJUO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbW1pdFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCh0aGlzLmVsZW1lbnQsIHRoaXMubmFtZSwgJ3Byb3BlcnR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eScsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgdGhpcy5lbGVtZW50W3RoaXMubmFtZV0gPSB2YWx1ZSA9PT0gbm90aGluZyA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICAgIH1cbn1cbmNsYXNzIEJvb2xlYW5BdHRyaWJ1dGVQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9IEJPT0xFQU5fQVRUUklCVVRFX1BBUlQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tbWl0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBib29sZWFuIGF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogISEodmFsdWUgJiYgdmFsdWUgIT09IG5vdGhpbmcpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB3cmFwKHRoaXMuZWxlbWVudCkudG9nZ2xlQXR0cmlidXRlKHRoaXMubmFtZSwgISF2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyk7XG4gICAgfVxufVxuY2xhc3MgRXZlbnRQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGVsZW1lbnQsIG5hbWUsIHN0cmluZ3MsIHBhcmVudCwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMudHlwZSA9IEVWRU5UX1BBUlQ7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLnN0cmluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIFxcYDwke2VsZW1lbnQubG9jYWxOYW1lfT5cXGAgaGFzIGEgXFxgQCR7bmFtZX09Li4uXFxgIGxpc3RlbmVyIHdpdGggYCArXG4gICAgICAgICAgICAgICAgJ2ludmFsaWQgY29udGVudC4gRXZlbnQgbGlzdGVuZXJzIGluIHRlbXBsYXRlcyBtdXN0IGhhdmUgZXhhY3RseSAnICtcbiAgICAgICAgICAgICAgICAnb25lIGV4cHJlc3Npb24gYW5kIG5vIHN1cnJvdW5kaW5nIHRleHQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRXZlbnRQYXJ0IGRvZXMgbm90IHVzZSB0aGUgYmFzZSBfJHNldFZhbHVlL19yZXNvbHZlVmFsdWUgaW1wbGVtZW50YXRpb25cbiAgICAvLyBzaW5jZSB0aGUgZGlydHkgY2hlY2tpbmcgaXMgbW9yZSBjb21wbGV4XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kc2V0VmFsdWUobmV3TGlzdGVuZXIsIGRpcmVjdGl2ZVBhcmVudCA9IHRoaXMpIHtcbiAgICAgICAgbmV3TGlzdGVuZXIgPVxuICAgICAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCBuZXdMaXN0ZW5lciwgZGlyZWN0aXZlUGFyZW50LCAwKSA/PyBub3RoaW5nO1xuICAgICAgICBpZiAobmV3TGlzdGVuZXIgPT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkTGlzdGVuZXIgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90aGluZyBvciBhbnkgb3B0aW9ucyBjaGFuZ2Ugd2UgaGF2ZSB0byByZW1vdmUgdGhlXG4gICAgICAgIC8vIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlTGlzdGVuZXIgPSAobmV3TGlzdGVuZXIgPT09IG5vdGhpbmcgJiYgb2xkTGlzdGVuZXIgIT09IG5vdGhpbmcpIHx8XG4gICAgICAgICAgICBuZXdMaXN0ZW5lci5jYXB0dXJlICE9PVxuICAgICAgICAgICAgICAgIG9sZExpc3RlbmVyLmNhcHR1cmUgfHxcbiAgICAgICAgICAgIG5ld0xpc3RlbmVyLm9uY2UgIT09XG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIub25jZSB8fFxuICAgICAgICAgICAgbmV3TGlzdGVuZXIucGFzc2l2ZSAhPT1cbiAgICAgICAgICAgICAgICBvbGRMaXN0ZW5lci5wYXNzaXZlO1xuICAgICAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCBub3RoaW5nIGFuZCB3ZSByZW1vdmVkIHRoZSBsaXN0ZW5lciwgd2UgaGF2ZVxuICAgICAgICAvLyB0byBhZGQgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICAgICAgY29uc3Qgc2hvdWxkQWRkTGlzdGVuZXIgPSBuZXdMaXN0ZW5lciAhPT0gbm90aGluZyAmJlxuICAgICAgICAgICAgKG9sZExpc3RlbmVyID09PSBub3RoaW5nIHx8IHNob3VsZFJlbW92ZUxpc3RlbmVyKTtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBldmVudCBsaXN0ZW5lcicsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3TGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyOiBzaG91bGRSZW1vdmVMaXN0ZW5lcixcbiAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogc2hvdWxkQWRkTGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLm5hbWUsIHRoaXMsIG9sZExpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvdWxkQWRkTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgbmV3TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5ld0xpc3RlbmVyO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmNhbGwodGhpcy5vcHRpb25zPy5ob3N0ID8/IHRoaXMuZWxlbWVudCwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlLmhhbmRsZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEVsZW1lbnRQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy50eXBlID0gRUxFTUVOVF9QQVJUO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIF8kc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnLFxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBFTkQgVVNFUlMgU0hPVUxEIE5PVCBSRUxZIE9OIFRISVMgT0JKRUNULlxuICpcbiAqIFByaXZhdGUgZXhwb3J0cyBmb3IgdXNlIGJ5IG90aGVyIExpdCBwYWNrYWdlcywgbm90IGludGVuZGVkIGZvciB1c2UgYnlcbiAqIGV4dGVybmFsIHVzZXJzLlxuICpcbiAqIFdlIGN1cnJlbnRseSBkbyBub3QgbWFrZSBhIG1hbmdsZWQgcm9sbHVwIGJ1aWxkIG9mIHRoZSBsaXQtc3NyIGNvZGUuIEluIG9yZGVyXG4gKiB0byBrZWVwIGEgbnVtYmVyIG9mIChvdGhlcndpc2UgcHJpdmF0ZSkgdG9wLWxldmVsIGV4cG9ydHMgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEggb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtZWxlbWVudCwgd2hpY2ggcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEggPSB7XG4gICAgLy8gVXNlZCBpbiBsaXQtc3NyXG4gICAgX2JvdW5kQXR0cmlidXRlU3VmZml4OiBib3VuZEF0dHJpYnV0ZVN1ZmZpeCxcbiAgICBfbWFya2VyOiBtYXJrZXIsXG4gICAgX21hcmtlck1hdGNoOiBtYXJrZXJNYXRjaCxcbiAgICBfSFRNTF9SRVNVTFQ6IEhUTUxfUkVTVUxULFxuICAgIF9nZXRUZW1wbGF0ZUh0bWw6IGdldFRlbXBsYXRlSHRtbCxcbiAgICAvLyBVc2VkIGluIHRlc3RzIGFuZCBwcml2YXRlLXNzci1zdXBwb3J0XG4gICAgX1RlbXBsYXRlSW5zdGFuY2U6IFRlbXBsYXRlSW5zdGFuY2UsXG4gICAgX2lzSXRlcmFibGU6IGlzSXRlcmFibGUsXG4gICAgX3Jlc29sdmVEaXJlY3RpdmU6IHJlc29sdmVEaXJlY3RpdmUsXG4gICAgX0NoaWxkUGFydDogQ2hpbGRQYXJ0LFxuICAgIF9BdHRyaWJ1dGVQYXJ0OiBBdHRyaWJ1dGVQYXJ0LFxuICAgIF9Cb29sZWFuQXR0cmlidXRlUGFydDogQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gICAgX0V2ZW50UGFydDogRXZlbnRQYXJ0LFxuICAgIF9Qcm9wZXJ0eVBhcnQ6IFByb3BlcnR5UGFydCxcbiAgICBfRWxlbWVudFBhcnQ6IEVsZW1lbnRQYXJ0LFxufTtcbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gICAgPyBnbG9iYWwubGl0SHRtbFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgICA6IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oVGVtcGxhdGUsIENoaWxkUGFydCk7XG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIGxpdC1odG1sIHVzYWdlLlxuKGdsb2JhbC5saXRIdG1sVmVyc2lvbnMgPz89IFtdKS5wdXNoKCczLjMuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRIdG1sVmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdtdWx0aXBsZS12ZXJzaW9ucycsIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBgICtcbiAgICAgICAgICAgIGBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGlzIG5vdCByZWNvbW1lbmRlZC5gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogUmVuZGVycyBhIHZhbHVlLCB1c3VhbGx5IGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQsIHRvIHRoZSBjb250YWluZXIuXG4gKlxuICogVGhpcyBleGFtcGxlIHJlbmRlcnMgdGhlIHRleHQgXCJIZWxsbywgWm9lIVwiIGluc2lkZSBhIHBhcmFncmFwaCB0YWcsIGFwcGVuZGluZ1xuICogaXQgdG8gdGhlIGNvbnRhaW5lciBgZG9jdW1lbnQuYm9keWAuXG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7aHRtbCwgcmVuZGVyfSBmcm9tICdsaXQnO1xuICpcbiAqIGNvbnN0IG5hbWUgPSBcIlpvZVwiO1xuICogcmVuZGVyKGh0bWxgPHA+SGVsbG8sICR7bmFtZX0hPC9wPmAsIGRvY3VtZW50LmJvZHkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIEFueSBbcmVuZGVyYWJsZVxuICogICB2YWx1ZV0oaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNjaGlsZC1leHByZXNzaW9ucyksXG4gKiAgIHR5cGljYWxseSBhIHtAbGlua2NvZGUgVGVtcGxhdGVSZXN1bHR9IGNyZWF0ZWQgYnkgZXZhbHVhdGluZyBhIHRlbXBsYXRlIHRhZ1xuICogICBsaWtlIHtAbGlua2NvZGUgaHRtbH0gb3Ige0BsaW5rY29kZSBzdmd9LlxuICogQHBhcmFtIGNvbnRhaW5lciBBIERPTSBjb250YWluZXIgdG8gcmVuZGVyIHRvLiBUaGUgZmlyc3QgcmVuZGVyIHdpbGwgYXBwZW5kXG4gKiAgIHRoZSByZW5kZXJlZCB2YWx1ZSB0byB0aGUgY29udGFpbmVyLCBhbmQgc3Vic2VxdWVudCByZW5kZXJzIHdpbGxcbiAqICAgZWZmaWNpZW50bHkgdXBkYXRlIHRoZSByZW5kZXJlZCB2YWx1ZSBpZiB0aGUgc2FtZSByZXN1bHQgdHlwZSB3YXNcbiAqICAgcHJldmlvdXNseSByZW5kZXJlZCB0aGVyZS5cbiAqIEBwYXJhbSBvcHRpb25zIFNlZSB7QGxpbmtjb2RlIFJlbmRlck9wdGlvbnN9IGZvciBvcHRpb25zIGRvY3VtZW50YXRpb24uXG4gKiBAc2VlXG4gKiB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvbGlicmFyaWVzL3N0YW5kYWxvbmUtdGVtcGxhdGVzLyNyZW5kZXJpbmctbGl0LWh0bWwtdGVtcGxhdGVzfCBSZW5kZXJpbmcgTGl0IEhUTUwgVGVtcGxhdGVzfVxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyID0gKHZhbHVlLCBjb250YWluZXIsIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoREVWX01PREUgJiYgY29udGFpbmVyID09IG51bGwpIHtcbiAgICAgICAgLy8gR2l2ZSBhIGNsZWFyZXIgZXJyb3IgbWVzc2FnZSB0aGFuXG4gICAgICAgIC8vICAgICBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgbnVsbCAocmVhZGluZ1xuICAgICAgICAvLyAgICAgJ18kbGl0UGFydCQnKVxuICAgICAgICAvLyB3aGljaCByZWFkcyBsaWtlIGFuIGludGVybmFsIExpdCBlcnJvci5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlIGNvbnRhaW5lciB0byByZW5kZXIgaW50byBtYXkgbm90IGJlICR7Y29udGFpbmVyfWApO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJJZCA9IERFVl9NT0RFID8gZGVidWdMb2dSZW5kZXJJZCsrIDogMDtcbiAgICBjb25zdCBwYXJ0T3duZXJOb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IGNvbnRhaW5lcjtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IHBhcnQgPSBwYXJ0T3duZXJOb2RlWydfJGxpdFBhcnQkJ107XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdiZWdpbiByZW5kZXInLFxuICAgICAgICAgICAgaWQ6IHJlbmRlcklkLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcGFydCxcbiAgICAgICAgfSk7XG4gICAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlbmROb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IG51bGw7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHBhcnRPd25lck5vZGVbJ18kbGl0UGFydCQnXSA9IHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIGVuZE5vZGUpLCBlbmROb2RlLCB1bmRlZmluZWQsIG9wdGlvbnMgPz8ge30pO1xuICAgIH1cbiAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWUpO1xuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICBraW5kOiAnZW5kIHJlbmRlcicsXG4gICAgICAgICAgICBpZDogcmVuZGVySWQsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICB9KTtcbiAgICByZXR1cm4gcGFydDtcbn07XG5pZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgcmVuZGVyLnNldFNhbml0aXplciA9IHNldFNhbml0aXplcjtcbiAgICByZW5kZXIuY3JlYXRlU2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyO1xuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICByZW5kZXIuX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlID1cbiAgICAgICAgICAgIF90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXQtaHRtbC5qcy5tYXAiLCJsZXQgY3VycmVudDtcbmxldCBjdXJyZW50SWQgPSAwO1xuZnVuY3Rpb24gc2V0Q3VycmVudChzdGF0ZSkge1xuICAgIGN1cnJlbnQgPSBzdGF0ZTtcbn1cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGN1cnJlbnRJZCA9IDA7XG59XG5mdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRJZCsrO1xufVxuZXhwb3J0IHsgY2xlYXIsIGN1cnJlbnQsIHNldEN1cnJlbnQsIG5vdGlmeSB9O1xuIiwiY29uc3QgcGhhc2VTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLnBoYXNlXCIpO1xuY29uc3QgaG9va1N5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQuaG9va1wiKTtcbmNvbnN0IHVwZGF0ZVN5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQudXBkYXRlXCIpO1xuY29uc3QgY29tbWl0U3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5jb21taXRcIik7XG5jb25zdCBlZmZlY3RzU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5lZmZlY3RzXCIpO1xuY29uc3QgbGF5b3V0RWZmZWN0c1N5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQubGF5b3V0RWZmZWN0c1wiKTtcbmNvbnN0IGNvbnRleHRFdmVudCA9IFwiaGF1bnRlZC5jb250ZXh0XCI7XG5leHBvcnQgeyBwaGFzZVN5bWJvbCwgaG9va1N5bWJvbCwgdXBkYXRlU3ltYm9sLCBjb21taXRTeW1ib2wsIGVmZmVjdHNTeW1ib2wsIGxheW91dEVmZmVjdHNTeW1ib2wsIGNvbnRleHRFdmVudCwgfTtcbiIsImltcG9ydCB7IHNldEN1cnJlbnQsIGNsZWFyIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBob29rU3ltYm9sLCBlZmZlY3RzU3ltYm9sLCBsYXlvdXRFZmZlY3RzU3ltYm9sLCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmNsYXNzIFN0YXRlIHtcbiAgICB1cGRhdGU7XG4gICAgaG9zdDtcbiAgICB2aXJ0dWFsO1xuICAgIFtob29rU3ltYm9sXTtcbiAgICBbZWZmZWN0c1N5bWJvbF07XG4gICAgW2xheW91dEVmZmVjdHNTeW1ib2xdO1xuICAgIGNvbnN0cnVjdG9yKHVwZGF0ZSwgaG9zdCkge1xuICAgICAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICAgICAgdGhpc1tob29rU3ltYm9sXSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpc1tlZmZlY3RzU3ltYm9sXSA9IFtdO1xuICAgICAgICB0aGlzW2xheW91dEVmZmVjdHNTeW1ib2xdID0gW107XG4gICAgfVxuICAgIHJ1bihjYikge1xuICAgICAgICBzZXRDdXJyZW50KHRoaXMpO1xuICAgICAgICBsZXQgcmVzID0gY2IoKTtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgX3J1bkVmZmVjdHMocGhhc2UpIHtcbiAgICAgICAgbGV0IGVmZmVjdHMgPSB0aGlzW3BoYXNlXTtcbiAgICAgICAgc2V0Q3VycmVudCh0aGlzKTtcbiAgICAgICAgZm9yIChsZXQgZWZmZWN0IG9mIGVmZmVjdHMpIHtcbiAgICAgICAgICAgIGVmZmVjdC5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNsZWFyKCk7XG4gICAgfVxuICAgIHJ1bkVmZmVjdHMoKSB7XG4gICAgICAgIHRoaXMuX3J1bkVmZmVjdHMoZWZmZWN0c1N5bWJvbCk7XG4gICAgfVxuICAgIHJ1bkxheW91dEVmZmVjdHMoKSB7XG4gICAgICAgIHRoaXMuX3J1bkVmZmVjdHMobGF5b3V0RWZmZWN0c1N5bWJvbCk7XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBsZXQgaG9va3MgPSB0aGlzW2hvb2tTeW1ib2xdO1xuICAgICAgICBob29rcy5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhvb2sudGVhcmRvd24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGhvb2sudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IHsgU3RhdGUgfTtcbiIsImltcG9ydCB7IFN0YXRlIH0gZnJvbSBcIi4vc3RhdGVcIjtcbmltcG9ydCB7IGNvbW1pdFN5bWJvbCwgcGhhc2VTeW1ib2wsIHVwZGF0ZVN5bWJvbCwgZWZmZWN0c1N5bWJvbCwgbGF5b3V0RWZmZWN0c1N5bWJvbCwgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5jb25zdCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSk7XG5mdW5jdGlvbiBydW5uZXIoKSB7XG4gICAgbGV0IHRhc2tzID0gW107XG4gICAgbGV0IGlkO1xuICAgIGZ1bmN0aW9uIHJ1blRhc2tzKCkge1xuICAgICAgICBpZCA9IG51bGw7XG4gICAgICAgIGxldCB0ID0gdGFza3M7XG4gICAgICAgIHRhc2tzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0W2ldKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICAgIHRhc2tzLnB1c2godGFzayk7XG4gICAgICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZCA9IGRlZmVyKHJ1blRhc2tzKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5jb25zdCByZWFkID0gcnVubmVyKCk7XG5jb25zdCB3cml0ZSA9IHJ1bm5lcigpO1xuY2xhc3MgQmFzZVNjaGVkdWxlciB7XG4gICAgcmVuZGVyZXI7XG4gICAgaG9zdDtcbiAgICBzdGF0ZTtcbiAgICBbcGhhc2VTeW1ib2xdO1xuICAgIF91cGRhdGVRdWV1ZWQ7XG4gICAgY29uc3RydWN0b3IocmVuZGVyZXIsIGhvc3QpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKHRoaXMudXBkYXRlLmJpbmQodGhpcyksIGhvc3QpO1xuICAgICAgICB0aGlzW3BoYXNlU3ltYm9sXSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVF1ZXVlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVRdWV1ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHJlYWQoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuaGFuZGxlUGhhc2UodXBkYXRlU3ltYm9sKTtcbiAgICAgICAgICAgIHdyaXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBoYXNlKGNvbW1pdFN5bWJvbCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB3cml0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGhhc2UoZWZmZWN0c1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUXVldWVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaGFuZGxlUGhhc2UocGhhc2UsIGFyZykge1xuICAgICAgICB0aGlzW3BoYXNlU3ltYm9sXSA9IHBoYXNlO1xuICAgICAgICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgICAgICAgICBjYXNlIGNvbW1pdFN5bWJvbDpcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1pdChhcmcpO1xuICAgICAgICAgICAgICAgIHRoaXMucnVuRWZmZWN0cyhsYXlvdXRFZmZlY3RzU3ltYm9sKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIHVwZGF0ZVN5bWJvbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgICAgIGNhc2UgZWZmZWN0c1N5bWJvbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydW5FZmZlY3RzKGVmZmVjdHNTeW1ib2wpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucnVuKCgpID0+IHRoaXMucmVuZGVyZXIuY2FsbCh0aGlzLmhvc3QsIHRoaXMuaG9zdCkpO1xuICAgIH1cbiAgICBydW5FZmZlY3RzKHBoYXNlKSB7XG4gICAgICAgIHRoaXMuc3RhdGUuX3J1bkVmZmVjdHMocGhhc2UpO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS50ZWFyZG93bigpO1xuICAgIH1cbn1cbmV4cG9ydCB7IEJhc2VTY2hlZHVsZXIgfTtcbiIsImltcG9ydCB7IEJhc2VTY2hlZHVsZXIgfSBmcm9tIFwiLi9zY2hlZHVsZXJcIjtcbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHZhbCA9IFwiXCIpID0+IHZhbC5yZXBsYWNlKC8tKyhbYS16XSk/L2csIChfLCBjaGFyKSA9PiAoY2hhciA/IGNoYXIudG9VcHBlckNhc2UoKSA6IFwiXCIpKTtcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQocmVuZGVyKSB7XG4gICAgY2xhc3MgU2NoZWR1bGVyIGV4dGVuZHMgQmFzZVNjaGVkdWxlciB7XG4gICAgICAgIGZyYWc7XG4gICAgICAgIGNvbnN0cnVjdG9yKHJlbmRlcmVyLCBmcmFnLCBob3N0KSB7XG4gICAgICAgICAgICBzdXBlcihyZW5kZXJlciwgKGhvc3QgfHwgZnJhZykpO1xuICAgICAgICAgICAgdGhpcy5mcmFnID0gZnJhZztcbiAgICAgICAgfVxuICAgICAgICBjb21taXQocmVzdWx0KSB7XG4gICAgICAgICAgICByZW5kZXIocmVzdWx0LCB0aGlzLmZyYWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBvbmVudChyZW5kZXJlciwgYmFzZUVsZW1lbnRPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgQmFzZUVsZW1lbnQgPSAob3B0aW9ucyB8fCBiYXNlRWxlbWVudE9yT3B0aW9ucyB8fCB7fSkuYmFzZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCB7IG9ic2VydmVkQXR0cmlidXRlcyA9IFtdLCB1c2VTaGFkb3dET00gPSB0cnVlLCBzaGFkb3dSb290SW5pdCA9IHt9LCB9ID0gb3B0aW9ucyB8fCBiYXNlRWxlbWVudE9yT3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY2xhc3MgRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcbiAgICAgICAgICAgIF9zY2hlZHVsZXI7XG4gICAgICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzIHx8IG9ic2VydmVkQXR0cmlidXRlcyB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKHVzZVNoYWRvd0RPTSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcihyZW5kZXJlciwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiLCAuLi5zaGFkb3dSb290SW5pdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcihyZW5kZXJlciwgdGhpcy5zaGFkb3dSb290LCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIudXBkYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIudGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IG5ld1ZhbHVlID09PSBcIlwiID8gdHJ1ZSA6IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRoaXMsIHRvQ2FtZWxDYXNlKG5hbWUpLCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlZmxlY3RpdmVQcm9wKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgbGV0IGlzU2V0dXAgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIHVwZGF0ZSB3aGVuIHByb3AgdmFsdWUgaGFzbid0IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0dXAgJiYgdmFsdWUgPT09IG5ld1ZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpc1NldHVwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVyLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3RvID0gbmV3IFByb3h5KEJhc2VFbGVtZW50LnByb3RvdHlwZSwge1xuICAgICAgICAgICAgZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgIGxldCBkZXNjO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgfHwga2V5WzBdID09PSBcIl9cIikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZXNjID0gcmVmbGVjdGl2ZVByb3AodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVjZWl2ZXIsIGtleSwgZGVzYyk7XG4gICAgICAgICAgICAgICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEVsZW1lbnQucHJvdG90eXBlLCBwcm90byk7XG4gICAgICAgIHJldHVybiBFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZXhwb3J0IHsgbWFrZUNvbXBvbmVudCwgfTtcbiIsImltcG9ydCB7IGN1cnJlbnQsIG5vdGlmeSB9IGZyb20gXCIuL2ludGVyZmFjZVwiO1xuaW1wb3J0IHsgaG9va1N5bWJvbCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmNsYXNzIEhvb2sge1xuICAgIGlkO1xuICAgIHN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSkge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiB1c2UoSG9vaywgLi4uYXJncykge1xuICAgIGxldCBpZCA9IG5vdGlmeSgpO1xuICAgIGxldCBob29rcyA9IGN1cnJlbnRbaG9va1N5bWJvbF07XG4gICAgbGV0IGhvb2sgPSBob29rcy5nZXQoaWQpO1xuICAgIGlmICghaG9vaykge1xuICAgICAgICBob29rID0gbmV3IEhvb2soaWQsIGN1cnJlbnQsIC4uLmFyZ3MpO1xuICAgICAgICBob29rcy5zZXQoaWQsIGhvb2spO1xuICAgIH1cbiAgICByZXR1cm4gaG9vay51cGRhdGUoLi4uYXJncyk7XG59XG5mdW5jdGlvbiBob29rKEhvb2spIHtcbiAgICByZXR1cm4gdXNlLmJpbmQobnVsbCwgSG9vayk7XG59XG5leHBvcnQgeyBob29rLCBIb29rIH07XG4iLCJpbXBvcnQgeyBIb29rLCBob29rIH0gZnJvbSBcIi4vaG9va1wiO1xuZnVuY3Rpb24gY3JlYXRlRWZmZWN0KHNldEVmZmVjdHMpIHtcbiAgICByZXR1cm4gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgICAgICBjYWxsYmFjaztcbiAgICAgICAgbGFzdFZhbHVlcztcbiAgICAgICAgdmFsdWVzO1xuICAgICAgICBfdGVhcmRvd247XG4gICAgICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgaWdub3JlZDEsIGlnbm9yZWQyKSB7XG4gICAgICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICAgICAgc2V0RWZmZWN0cyhzdGF0ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlKGNhbGxiYWNrLCB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGNhbGwoKSB7XG4gICAgICAgICAgICBjb25zdCBoYXNDaGFuZ2VkID0gIXRoaXMudmFsdWVzIHx8IHRoaXMuaGFzQ2hhbmdlZCgpO1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVzID0gdGhpcy52YWx1ZXM7XG4gICAgICAgICAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcnVuKCkge1xuICAgICAgICAgICAgdGhpcy50ZWFyZG93bigpO1xuICAgICAgICAgICAgdGhpcy5fdGVhcmRvd24gPSB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGVhcmRvd24oKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3RlYXJkb3duID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZWFyZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGhhc0NoYW5nZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gKCF0aGlzLmxhc3RWYWx1ZXMgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zb21lKCh2YWx1ZSwgaSkgPT4gdGhpcy5sYXN0VmFsdWVzW2ldICE9PSB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnQgeyBjcmVhdGVFZmZlY3QgfTtcbiIsImltcG9ydCB7IGVmZmVjdHNTeW1ib2wgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVFZmZlY3QgfSBmcm9tIFwiLi9jcmVhdGUtZWZmZWN0XCI7XG5mdW5jdGlvbiBzZXRFZmZlY3RzKHN0YXRlLCBjYikge1xuICAgIHN0YXRlW2VmZmVjdHNTeW1ib2xdLnB1c2goY2IpO1xufVxuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gZWZmZWN0IC0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBydW5zIGVhY2ggdGltZSBkZXBlbmRlbmNpZXMgY2hhbmdlXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2RlcGVuZGVuY2llc10gLSBsaXN0IG9mIGRlcGVuZGVuY2llcyB0byB0aGUgZWZmZWN0XG4gKiBAcmV0dXJuIHt2b2lkfVxuICovXG5jb25zdCB1c2VFZmZlY3QgPSBjcmVhdGVFZmZlY3Qoc2V0RWZmZWN0cyk7XG5leHBvcnQgeyBzZXRFZmZlY3RzLCB1c2VFZmZlY3QgfTtcbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5pbXBvcnQgeyBjb250ZXh0RXZlbnQgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyBzZXRFZmZlY3RzIH0gZnJvbSBcIi4vdXNlLWVmZmVjdFwiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gICAge0NvbnRleHQ8VD59IGNvbnRleHRcbiAqIEByZXR1cm4gICB7VH1cbiAqL1xuY29uc3QgdXNlQ29udGV4dCA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICBDb250ZXh0O1xuICAgIHZhbHVlO1xuICAgIF9yYW5FZmZlY3Q7XG4gICAgX3Vuc3Vic2NyaWJlO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgXykge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLl91cGRhdGVyID0gdGhpcy5fdXBkYXRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9yYW5FZmZlY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgICBzZXRFZmZlY3RzKHN0YXRlLCB0aGlzKTtcbiAgICB9XG4gICAgdXBkYXRlKENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUudmlydHVhbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FuJ3QgYmUgdXNlZCB3aXRoIHZpcnR1YWwgY29tcG9uZW50c1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5Db250ZXh0ICE9PSBDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUoQ29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLkNvbnRleHQgPSBDb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICBjYWxsKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3JhbkVmZmVjdCkge1xuICAgICAgICAgICAgdGhpcy5fcmFuRWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bnN1YnNjcmliZSlcbiAgICAgICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHRoaXMuQ29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF91cGRhdGVyKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKTtcbiAgICB9XG4gICAgX3N1YnNjcmliZShDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IHsgQ29udGV4dCwgY2FsbGJhY2s6IHRoaXMuX3VwZGF0ZXIgfTtcbiAgICAgICAgdGhpcy5zdGF0ZS5ob3N0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGNvbnRleHRFdmVudCwge1xuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgICBjb21wb3NlZDogdHJ1ZSwgLy8gdG8gcGFzcyBTaGFkb3dET00gYm91bmRhcmllc1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHsgdW5zdWJzY3JpYmUgPSBudWxsLCB2YWx1ZSB9ID0gZGV0YWlsO1xuICAgICAgICB0aGlzLnZhbHVlID0gdW5zdWJzY3JpYmUgPyB2YWx1ZSA6IENvbnRleHQuZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IHVuc3Vic2NyaWJlO1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VDb250ZXh0IH07XG4iLCJpbXBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0gIHsoKSA9PiBUfSBmbiBmdW5jdGlvbiB0byBtZW1vaXplXG4gKiBAcGFyYW0gIHt1bmtub3duW119IHZhbHVlcyBkZXBlbmRlbmNpZXMgdG8gdGhlIG1lbW9pemVkIGNvbXB1dGF0aW9uXG4gKiBAcmV0dXJuIHtUfSBUaGUgbmV4dCBjb21wdXRlZCB2YWx1ZVxuICovXG5jb25zdCB1c2VNZW1vID0gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgIHZhbHVlO1xuICAgIHZhbHVlcztcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIGZuLCB2YWx1ZXMpIHtcbiAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZuKCk7XG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgIH1cbiAgICB1cGRhdGUoZm4sIHZhbHVlcykge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VkKHZhbHVlcykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQodmFsdWVzID0gW10pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcy5zb21lKCh2YWx1ZSwgaSkgPT4gdGhpcy52YWx1ZXNbaV0gIT09IHZhbHVlKTtcbiAgICB9XG59KTtcbmV4cG9ydCB7IHVzZU1lbW8gfTtcbiIsImltcG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwiLi91c2UtbWVtb1wiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7RnVuY3Rpb259IFRcbiAqIEBwYXJhbSAgICB7VH0gZm4gLSBjYWxsYmFjayB0byBtZW1vaXplXG4gKiBAcGFyYW0gICAge3Vua25vd25bXX0gaW5wdXRzIC0gZGVwZW5kZW5jaWVzIHRvIGNhbGxiYWNrIG1lbW9pemF0aW9uXG4gKiBAcmV0dXJuICAge1R9XG4gKi9cbmNvbnN0IHVzZUNhbGxiYWNrID0gKGZuLCBpbnB1dHMpID0+IHVzZU1lbW8oKCkgPT4gZm4sIGlucHV0cyk7XG5leHBvcnQgeyB1c2VDYWxsYmFjayB9O1xuIiwiaW1wb3J0IHsgbGF5b3V0RWZmZWN0c1N5bWJvbCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUVmZmVjdCB9IGZyb20gXCIuL2NyZWF0ZS1lZmZlY3RcIjtcbmZ1bmN0aW9uIHNldExheW91dEVmZmVjdHMoc3RhdGUsIGNiKSB7XG4gICAgc3RhdGVbbGF5b3V0RWZmZWN0c1N5bWJvbF0ucHVzaChjYik7XG59XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtICB7RWZmZWN0fSBjYWxsYmFjayBlZmZlY3RpbmcgY2FsbGJhY2tcbiAqIEBwYXJhbSAge3Vua25vd25bXX0gW3ZhbHVlc10gZGVwZW5kZW5jaWVzIHRvIHRoZSBlZmZlY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmNvbnN0IHVzZUxheW91dEVmZmVjdCA9IGNyZWF0ZUVmZmVjdChzZXRMYXlvdXRFZmZlY3RzKTtcbmV4cG9ydCB7IHVzZUxheW91dEVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgeyp9IFRcbiAqIEBwYXJhbSB7VH0gW2luaXRpYWxTdGF0ZV0gLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlXG4gKiBAcmV0dXJuIHtTdGF0ZVR1cGxlPFQ+fSBzdGF0ZVR1cGxlIC0gVHVwbGUgb2YgY3VycmVudCBzdGF0ZSBhbmQgc3RhdGUgdXBkYXRlciBmdW5jdGlvblxuICovXG5jb25zdCB1c2VTdGF0ZSA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICBhcmdzO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlciA9IHRoaXMudXBkYXRlci5iaW5kKHRoaXMpO1xuICAgICAgICBpZiAodHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0Rm4gPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBpbml0Rm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ha2VBcmdzKGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncztcbiAgICB9XG4gICAgdXBkYXRlcih2YWx1ZSkge1xuICAgICAgICBjb25zdCBbcHJldmlvdXNWYWx1ZV0gPSB0aGlzLmFyZ3M7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlckZuID0gdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHVwZGF0ZXJGbihwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFrZUFyZ3ModmFsdWUpO1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBtYWtlQXJncyh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFyZ3MgPSBPYmplY3QuZnJlZXplKFt2YWx1ZSwgdGhpcy51cGRhdGVyXSk7XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VTdGF0ZSB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogUG9ydGlvbnMgQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiLi91c2UtbGF5b3V0LWVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwiLi91c2Utc3RhdGVcIjtcbmNvbnN0IG1pY3JvdGFzayA9IFByb21pc2UucmVzb2x2ZSgpO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0IHRoYXQgaXMgZHJpdmVuIGJ5IEhhdW50ZWQgaG9va3NcbiAqIGFuZCBgdXNlQ29udHJvbGxlcigpYC5cbiAqL1xuY2xhc3MgSGF1bnRlZENvbnRyb2xsZXJIb3N0IHtcbiAgICBjb3VudDtcbiAgICBraWNrO1xuICAgIF9jb250cm9sbGVycyA9IFtdO1xuICAgIF91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICBfdXBkYXRlQ29tcGxldGVQcm9taXNlO1xuICAgIF9yZXNvbHZlVXBkYXRlO1xuICAgIGNvbnN0cnVjdG9yKGNvdW50LCBraWNrKSB7XG4gICAgICAgIHRoaXMuY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5raWNrID0ga2ljaztcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVVwZGF0ZSA9IHJlcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICByZW1vdmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgLy8gTm90ZSwgaWYgdGhlIGluZGV4T2YgaXMgLTEsIHRoZSA+Pj4gd2lsbCBmbGlwIHRoZSBzaWduIHdoaWNoIG1ha2VzIHRoZVxuICAgICAgICAvLyBzcGxpY2UgZG8gbm90aGluZy5cbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMgJiZcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLnNwbGljZSh0aGlzLl9jb250cm9sbGVycy5pbmRleE9mKGNvbnRyb2xsZXIpID4+PiAwLCAxKTtcbiAgICB9XG4gICAgcmVxdWVzdFVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl91cGRhdGVQZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIG1pY3JvdGFzay50aGVuKCgpID0+IHRoaXMua2ljaygodGhpcy5jb3VudCArPSAxKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB1cGRhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZTtcbiAgICB9XG4gICAgY29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3RDb25uZWN0ZWQgJiYgYy5ob3N0Q29ubmVjdGVkKCkpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLmZvckVhY2goKGMpID0+IGMuaG9zdERpc2Nvbm5lY3RlZCAmJiBjLmhvc3REaXNjb25uZWN0ZWQoKSk7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlICYmIGMuaG9zdFVwZGF0ZSgpKTtcbiAgICB9XG4gICAgdXBkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXNvbHZlID0gdGhpcy5fcmVzb2x2ZVVwZGF0ZTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHVwZGF0ZUNvbXBsZXRlIFByb21pc2UgZm9yIHRoZSBuZXh0IHVwZGF0ZSxcbiAgICAgICAgLy8gYmVmb3JlIHJlc29sdmluZyB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVVcGRhdGUgPSByZXM7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3RVcGRhdGVkICYmIGMuaG9zdFVwZGF0ZWQoKSk7XG4gICAgICAgIHJlc29sdmUodGhpcy5fdXBkYXRlUGVuZGluZyk7XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuZCBzdG9yZXMgYSBzdGF0ZWZ1bCBSZWFjdGl2ZUNvbnRyb2xsZXIgaW5zdGFuY2UgYW5kIHByb3ZpZGVzIGl0XG4gKiB3aXRoIGEgUmVhY3RpdmVDb250cm9sbGVySG9zdCB0aGF0IGRyaXZlcyB0aGUgY29udHJvbGxlciBsaWZlY3ljbGUuXG4gKlxuICogVXNlIHRoaXMgaG9vayB0byBjb252ZXJ0IGEgUmVhY3RpdmVDb250cm9sbGVyIGludG8gYSBIYXVudGVkIGhvb2suXG4gKlxuICogQHBhcmFtIHs8QyBleHRlbmRzIFJlYWN0aXZlQ29udHJvbGxlcj4oaG9zdDogUmVhY3RpdmVDb250cm9sbGVySG9zdCkgPT4gQ30gY3JlYXRlQ29udHJvbGxlciBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2UuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIGEgSGF1bnRlZENvbnRyb2xsZXJIb3N0IHRvIHBhc3MgdG8gdGhlIGNvbnRyb2xsZXIuIFRoZVxuICogY3JlYXRlIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGNvbXBvbmVudC5cbiAqIEByZXR1cm4ge1JlYWN0aXZlQ29udHJvbGxlcn0gdGhlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRyb2xsZXIoY3JlYXRlQ29udHJvbGxlcikge1xuICAgIGNvbnN0IFtjb3VudCwga2lja10gPSB1c2VTdGF0ZSgwKTtcbiAgICBjb25zdCBbaG9zdF0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBuZXcgSGF1bnRlZENvbnRyb2xsZXJIb3N0KGNvdW50LCBraWNrKTtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IGNyZWF0ZUNvbnRyb2xsZXIoaG9zdCk7XG4gICAgICAgIGhvc3QucHJpbWFyeUNvbnRyb2xsZXIgPSBjb250cm9sbGVyO1xuICAgICAgICBob3N0LmNvbm5lY3RlZCgpO1xuICAgICAgICByZXR1cm4gaG9zdDtcbiAgICB9KTtcbiAgICAvLyBXZSB1c2UgdXNlTGF5b3V0RWZmZWN0IGJlY2F1c2Ugd2UgbmVlZCB1cGRhdGVkKCkgY2FsbGVkIHN5bmNocm9ub3VzbHlcbiAgICAvLyBhZnRlciByZW5kZXJpbmcuXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IGhvc3QudXBkYXRlZCgpKTtcbiAgICAvLyBSZXR1cm5pbmcgYSBjbGVhbnVwIGZ1bmN0aW9uIHNpbXVsYXRlcyBob3N0RGlzY29ubmVjdGVkIHRpbWluZy4gQW4gZW1wdHlcbiAgICAvLyBkZXBzIGFycmF5IHRlbGxzIEhhdW50ZWQgdG8gb25seSBjYWxsIHRoaXMgb25jZTogb24gbW91bnQgd2l0aCB0aGUgY2xlYW51cFxuICAgIC8vIGNhbGxlZCBvbiB1bm1vdW50LlxuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiAoKSA9PiBob3N0LmRpc2Nvbm5lY3RlZCgpLCBbXSk7XG4gICAgaG9zdC51cGRhdGUoKTtcbiAgICByZXR1cm4gaG9zdC5wcmltYXJ5Q29udHJvbGxlcjtcbn1cbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG4vKipcbiAqIEdpdmVuIGEgcmVkdWNlciBmdW5jdGlvbiwgaW5pdGlhbCBzdGF0ZSwgYW5kIG9wdGlvbmFsIHN0YXRlIGluaXRpYWxpemVyIGZ1bmN0aW9uLCByZXR1cm5zIGEgdHVwbGUgb2Ygc3RhdGUgYW5kIGRpc3BhdGNoIGZ1bmN0aW9uLlxuICogQGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgUyBTdGF0ZVxuICogQHRlbXBsYXRlIEkgSW5pdGlhbCBTdGF0ZVxuICogQHRlbXBsYXRlIEEgQWN0aW9uXG4gKiBAcGFyYW0ge1JlZHVjZXI8UywgQT59IHJlZHVjZXIgLSByZWR1Y2VyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIG5leHQgc3RhdGUgZ2l2ZW4gdGhlIHByZXZpb3VzIHN0YXRlIGFuZCB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge0l9IGluaXRpYWxTdGF0ZSAtIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSByZWR1Y2VyXG4gKiBAcGFyYW0geyhpbml0OiBJKSA9PiBTfSBbaW5pdD11bmRlZmluZWRdIC0gT3B0aW9uYWwgaW5pdGlhbGl6ZXIgZnVuY3Rpb24sIGNhbGxlZCBvbiBpbml0aWFsU3RhdGUgaWYgcHJvdmlkZWRcbiAqIEByZXR1cm4ge3JlYWRvbmx5IFtTLCAoYWN0aW9uOiBBKSA9PiB2b2lkXX1cbiAqL1xuY29uc3QgdXNlUmVkdWNlciA9IGhvb2soY2xhc3MgZXh0ZW5kcyBIb29rIHtcbiAgICByZWR1Y2VyO1xuICAgIGN1cnJlbnRTdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihpZCwgc3RhdGUsIF8sIGluaXRpYWxTdGF0ZSwgaW5pdCkge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gdGhpcy5kaXNwYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9XG4gICAgICAgICAgICBpbml0ICE9PSB1bmRlZmluZWQgPyBpbml0KGluaXRpYWxTdGF0ZSkgOiBpbml0aWFsU3RhdGU7XG4gICAgfVxuICAgIHVwZGF0ZShyZWR1Y2VyKSB7XG4gICAgICAgIHRoaXMucmVkdWNlciA9IHJlZHVjZXI7XG4gICAgICAgIHJldHVybiBbdGhpcy5jdXJyZW50U3RhdGUsIHRoaXMuZGlzcGF0Y2hdO1xuICAgIH1cbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLnJlZHVjZXIodGhpcy5jdXJyZW50U3RhdGUsIGFjdGlvbik7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKCk7XG4gICAgfVxufSk7XG5leHBvcnQgeyB1c2VSZWR1Y2VyIH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0VHlwZSA9IHtcbiAgICBBVFRSSUJVVEU6IDEsXG4gICAgQ0hJTEQ6IDIsXG4gICAgUFJPUEVSVFk6IDMsXG4gICAgQk9PTEVBTl9BVFRSSUJVVEU6IDQsXG4gICAgRVZFTlQ6IDUsXG4gICAgRUxFTUVOVDogNixcbn07XG4vKipcbiAqIENyZWF0ZXMgYSB1c2VyLWZhY2luZyBkaXJlY3RpdmUgZnVuY3Rpb24gZnJvbSBhIERpcmVjdGl2ZSBjbGFzcy4gVGhpc1xuICogZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgdGhlIGRpcmVjdGl2ZSdzIHJlbmRlcigpIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZSA9IChjKSA9PiAoLi4udmFsdWVzKSA9PiAoe1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgWydfJGxpdERpcmVjdGl2ZSQnXTogYyxcbiAgICB2YWx1ZXMsXG59KTtcbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgY3VzdG9tIGRpcmVjdGl2ZXMuIFVzZXJzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyxcbiAqIGltcGxlbWVudCBgcmVuZGVyYCBhbmQvb3IgYHVwZGF0ZWAsIGFuZCB0aGVuIHBhc3MgdGhlaXIgc3ViY2xhc3MgdG9cbiAqIGBkaXJlY3RpdmVgLlxuICovXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlIHtcbiAgICBjb25zdHJ1Y3RvcihfcGFydEluZm8pIHsgfVxuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KSB7XG4gICAgICAgIHRoaXMuX19wYXJ0ID0gcGFydDtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID0gYXR0cmlidXRlSW5kZXg7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJHJlc29sdmUocGFydCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHBhcnQsIHByb3BzKTtcbiAgICB9XG4gICAgdXBkYXRlKF9wYXJ0LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIoLi4ucHJvcHMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcmVjdGl2ZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuLyoqXG4gKiBXaGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgYGFkb3B0ZWRTdHlsZVNoZWV0c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgPSBnbG9iYWwuU2hhZG93Um9vdCAmJlxuICAgIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAgICdhZG9wdGVkU3R5bGVTaGVldHMnIGluIERvY3VtZW50LnByb3RvdHlwZSAmJlxuICAgICdyZXBsYWNlJyBpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZTtcbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5jb25zdCBjc3NUYWdDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBhIHN0cmluZyBvZiBDU1MgdGV4dCwgdGhhdCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIENTU1Jlc3VsdCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBjc3NgLXRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFscyBhbmRcbiAqIGB1bnNhZmVDU1MoKWAuIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IENTU1Jlc3VsdHMgYXJlIG9ubHkgY3JlYXRlZCB2aWEgdGhlXG4gKiBgY3NzYCB0YWcgYW5kIGB1bnNhZmVDU1MoKWAsIENTU1Jlc3VsdCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDU1NSZXN1bHQge1xuICAgIGNvbnN0cnVjdG9yKGNzc1RleHQsIHN0cmluZ3MsIHNhZmVUb2tlbikge1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICB0aGlzWydfJGNzc1Jlc3VsdCQnXSA9IHRydWU7XG4gICAgICAgIGlmIChzYWZlVG9rZW4gIT09IGNvbnN0cnVjdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NTU1Jlc3VsdCBpcyBub3QgY29uc3RydWN0YWJsZS4gVXNlIGB1bnNhZmVDU1NgIG9yIGBjc3NgIGluc3RlYWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jc3NUZXh0ID0gY3NzVGV4dDtcbiAgICAgICAgdGhpcy5fc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgYSBnZXR0ZXIgc28gdGhhdCBpdCdzIGxhenkuIEluIHByYWN0aWNlLCB0aGlzIG1lYW5zIHN0eWxlc2hlZXRzXG4gICAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gICAgZ2V0IHN0eWxlU2hlZXQoKSB7XG4gICAgICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgICAgICAvLyBjb25zdHJ1Y3RhYmxlLlxuICAgICAgICBsZXQgc3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlU2hlZXQ7XG4gICAgICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgICAgICBpZiAoc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzICYmIHN0eWxlU2hlZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlID0gc3RyaW5ncyAhPT0gdW5kZWZpbmVkICYmIHN0cmluZ3MubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgaWYgKGNhY2hlYWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgKHRoaXMuX3N0eWxlU2hlZXQgPSBzdHlsZVNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKSkucmVwbGFjZVN5bmModGhpcy5jc3NUZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNzc1RhZ0NhY2hlLnNldChzdHJpbmdzLCBzdHlsZVNoZWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0eWxlU2hlZXQ7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICAgIH1cbn1cbmNvbnN0IHRleHRGcm9tQ1NTUmVzdWx0ID0gKHZhbHVlKSA9PiB7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBpZiAodmFsdWVbJ18kY3NzUmVzdWx0JCddID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5jc3NUZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6IGAgK1xuICAgICAgICAgICAgYCR7dmFsdWV9LiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dCB0YWtlIGNhcmUgYCArXG4gICAgICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYCk7XG4gICAgfVxufTtcbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWUpID0+IG5ldyBDU1NSZXN1bHQodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKSwgdW5kZWZpbmVkLCBjb25zdHJ1Y3Rpb25Ub2tlbik7XG4vKipcbiAqIEEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBMaXRFbGVtZW50J3NcbiAqIHtAbGlua2NvZGUgTGl0RWxlbWVudC5zdHlsZXN9IHByb3BlcnR5IHRvIHNldCBlbGVtZW50IHN0eWxlcy5cbiAqXG4gKiBGb3Igc2VjdXJpdHkgcmVhc29ucywgb25seSBsaXRlcmFsIHN0cmluZyB2YWx1ZXMgYW5kIG51bWJlciBtYXkgYmUgdXNlZCBpblxuICogZW1iZWRkZWQgZXhwcmVzc2lvbnMuIFRvIGluY29ycG9yYXRlIG5vbi1saXRlcmFsIHZhbHVlcyB7QGxpbmtjb2RlIHVuc2FmZUNTU31cbiAqIG1heSBiZSB1c2VkIGluc2lkZSBhbiBleHByZXNzaW9uLlxuICovXG5leHBvcnQgY29uc3QgY3NzID0gKHN0cmluZ3MsIC4uLnZhbHVlcykgPT4ge1xuICAgIGNvbnN0IGNzc1RleHQgPSBzdHJpbmdzLmxlbmd0aCA9PT0gMVxuICAgICAgICA/IHN0cmluZ3NbMF1cbiAgICAgICAgOiB2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKTtcbiAgICByZXR1cm4gbmV3IENTU1Jlc3VsdChjc3NUZXh0LCBzdHJpbmdzLCBjb25zdHJ1Y3Rpb25Ub2tlbik7XG59O1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHRoZSBuYXRpdmUgZmVhdHVyZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NoYWRvd1Jvb3QvYWRvcHRlZFN0eWxlU2hlZXRzKS5cbiAqIE5vdGUsIHdoZW4gc2hpbW1pbmcgaXMgdXNlZCwgYW55IHN0eWxlcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgcGxhY2VkIGludG9cbiAqIHRoZSBzaGFkb3dSb290IHNob3VsZCBiZSBwbGFjZWQgKmJlZm9yZSogYW55IHNoaW1tZWQgYWRvcHRlZCBzdHlsZXMuIFRoaXNcbiAqIHdpbGwgbWF0Y2ggc3BlYyBiZWhhdmlvciB0aGF0IGdpdmVzIGFkb3B0ZWQgc2hlZXRzIHByZWNlZGVuY2Ugb3ZlciBzdHlsZXMgaW5cbiAqIHNoYWRvd1Jvb3QuXG4gKi9cbmV4cG9ydCBjb25zdCBhZG9wdFN0eWxlcyA9IChyZW5kZXJSb290LCBzdHlsZXMpID0+IHtcbiAgICBpZiAoc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzKSB7XG4gICAgICAgIHJlbmRlclJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gc3R5bGVzLm1hcCgocykgPT4gcyBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQgPyBzIDogcy5zdHlsZVNoZWV0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBzdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBjb25zdCBub25jZSA9IGdsb2JhbFsnbGl0Tm9uY2UnXTtcbiAgICAgICAgICAgIGlmIChub25jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gcy5jc3NUZXh0O1xuICAgICAgICAgICAgcmVuZGVyUm9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuY29uc3QgY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQgPSAoc2hlZXQpID0+IHtcbiAgICBsZXQgY3NzVGV4dCA9ICcnO1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBzaGVldC5jc3NSdWxlcykge1xuICAgICAgICBjc3NUZXh0ICs9IHJ1bGUuY3NzVGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHVuc2FmZUNTUyhjc3NUZXh0KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tcGF0aWJsZVN0eWxlID0gc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIHx8XG4gICAgKE5PREVfTU9ERSAmJiBnbG9iYWwuQ1NTU3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKVxuICAgID8gKHMpID0+IHNcbiAgICA6IChzKSA9PiBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IGNzc1Jlc3VsdEZyb21TdHlsZVNoZWV0KHMpIDogcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNzcy10YWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG4vKipcbiAqIFVzZSB0aGlzIG1vZHVsZSBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gYmFzZSBjbGFzcyBleHRlbmRpbmdcbiAqIHtAbGluayBSZWFjdGl2ZUVsZW1lbnR9LlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cbmltcG9ydCB7IGdldENvbXBhdGlibGVTdHlsZSwgYWRvcHRTdHlsZXMsIH0gZnJvbSAnLi9jc3MtdGFnLmpzJztcbi8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGltcG9ydCB3aWxsIGJlIGluamVjdGVkIGJ5IFJvbGx1cDpcbi8vIGltcG9ydCB7SFRNTEVsZW1lbnQsIGN1c3RvbUVsZW1lbnRzfSBmcm9tICdAbGl0LWxhYnMvc3NyLWRvbS1zaGltJztcbmV4cG9ydCAqIGZyb20gJy4vY3NzLXRhZy5qcyc7XG4vLyBUT0RPIChqdXN0aW5mYWduYW5pKTogQWRkIGBoYXNPd25gIGhlcmUgd2hlbiB3ZSBzaGlwIEVTMjAyMlxuY29uc3QgeyBpcywgZGVmaW5lUHJvcGVydHksIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgZ2V0T3duUHJvcGVydHlOYW1lcywgZ2V0T3duUHJvcGVydHlTeW1ib2xzLCBnZXRQcm90b3R5cGVPZiwgfSA9IE9iamVjdDtcbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuLy8gTGV0cyBhIG1pbmlmaWVyIHJlcGxhY2UgZ2xvYmFsVGhpcyByZWZlcmVuY2VzIHdpdGggYSBtaW5pZmllZCBuYW1lXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuaWYgKE5PREVfTU9ERSkge1xuICAgIGdsb2JhbC5jdXN0b21FbGVtZW50cyA/Pz0gY3VzdG9tRWxlbWVudHM7XG59XG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG5sZXQgaXNzdWVXYXJuaW5nO1xuY29uc3QgdHJ1c3RlZFR5cGVzID0gZ2xvYmFsXG4gICAgLnRydXN0ZWRUeXBlcztcbi8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2NyYnVnLmNvbS85OTMyNjhcbi8vIEN1cnJlbnRseSwgYW55IGF0dHJpYnV0ZSBzdGFydGluZyB3aXRoIFwib25cIiBpcyBjb25zaWRlcmVkIHRvIGJlIGFcbi8vIFRydXN0ZWRTY3JpcHQgc291cmNlLiBTdWNoIGJvb2xlYW4gYXR0cmlidXRlcyBtdXN0IGJlIHNldCB0byB0aGUgZXF1aXZhbGVudFxuLy8gdHJ1c3RlZCBlbXB0eVNjcmlwdCB2YWx1ZS5cbmNvbnN0IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA9IHRydXN0ZWRUeXBlc1xuICAgID8gdHJ1c3RlZFR5cGVzLmVtcHR5U2NyaXB0XG4gICAgOiAnJztcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gICAgPyBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICAgIDogZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcbmlmIChERVZfTU9ERSkge1xuICAgIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gICAgLy8gYXJlIGxvYWRlZC5cbiAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICAgKi9cbiAgICBpc3N1ZVdhcm5pbmcgPSAoY29kZSwgd2FybmluZykgPT4ge1xuICAgICAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgICAgICBpZiAoIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykgJiZcbiAgICAgICAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKGNvZGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnZGV2LW1vZGUnLCBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYCk7XG4gICAgICAgIC8vIElzc3VlIHBvbHlmaWxsIHN1cHBvcnQgd2FybmluZy5cbiAgICAgICAgaWYgKGdsb2JhbC5TaGFkeURPTT8uaW5Vc2UgJiYgcG9seWZpbGxTdXBwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlzc3VlV2FybmluZygncG9seWZpbGwtc3VwcG9ydC1taXNzaW5nJywgYFNoYWRvdyBET00gaXMgYmVpbmcgcG9seWZpbGxlZCB2aWEgXFxgU2hhZHlET01cXGAgYnV0IGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgXFxgcG9seWZpbGwtc3VwcG9ydFxcYCBtb2R1bGUgaGFzIG5vdCBiZWVuIGxvYWRlZC5gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLyoqXG4gKiBVc2VmdWwgZm9yIHZpc3VhbGl6aW5nIGFuZCBsb2dnaW5nIGluc2lnaHRzIGludG8gd2hhdCB0aGUgTGl0IHRlbXBsYXRlIHN5c3RlbSBpcyBkb2luZy5cbiAqXG4gKiBDb21waWxlZCBvdXQgb2YgcHJvZCBtb2RlIGJ1aWxkcy5cbiAqL1xuY29uc3QgZGVidWdMb2dFdmVudCA9IERFVl9NT0RFXG4gICAgPyAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IGdsb2JhbFxuICAgICAgICAgICAgLmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cztcbiAgICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIDogdW5kZWZpbmVkO1xuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gKHByb3AsIF9vYmopID0+IHByb3A7XG5leHBvcnQgY29uc3QgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgICB0b0F0dHJpYnV0ZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlIDogbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICAgICAgY2FzZSBBcnJheTpcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIHBhc3MgdGhpcyB0aHJvdWdoXG4gICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgcmVtb3Zpbmcvbm8gY2hhbmdlIGJlaGF2aW9yLlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIGZyb21BdHRyaWJ1dGUodmFsdWUsIHR5cGUpIHtcbiAgICAgICAgbGV0IGZyb21WYWx1ZSA9IHZhbHVlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTnVtYmVyOlxuICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlID09PSBudWxsID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE9iamVjdDpcbiAgICAgICAgICAgIGNhc2UgQXJyYXk6XG4gICAgICAgICAgICAgICAgLy8gRG8gKm5vdCogZ2VuZXJhdGUgZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBKU09OIGlzIHNldCBhcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IG5vcm1hbGx5IGNvbXBsYWluIG9uIGJlaW5nIG1pcy1jb25maWd1cmVkLlxuICAgICAgICAgICAgICAgIC8vIFRPRE8oc29ydmVsbCk6IERvIGdlbmVyYXRlIGV4Y2VwdGlvbiBpbiAqZGV2IG1vZGUqLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydCB0byBhZGhlcmUgdG8gQmF6ZWwncyBcIm11c3QgdHlwZSBhc3NlcnQgSlNPTiBwYXJzZVwiIHJ1bGUuXG4gICAgICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbVZhbHVlO1xuICAgIH0sXG59O1xuLyoqXG4gKiBDaGFuZ2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBkaWZmZXJlbnQgZnJvbSBgb2xkVmFsdWVgLlxuICogVGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYSBwcm9wZXJ0eSdzIGBoYXNDaGFuZ2VkYCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdEVxdWFsID0gKHZhbHVlLCBvbGQpID0+ICFpcyh2YWx1ZSwgb2xkKTtcbmNvbnN0IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uID0ge1xuICAgIGF0dHJpYnV0ZTogdHJ1ZSxcbiAgICB0eXBlOiBTdHJpbmcsXG4gICAgY29udmVydGVyOiBkZWZhdWx0Q29udmVydGVyLFxuICAgIHJlZmxlY3Q6IGZhbHNlLFxuICAgIHVzZURlZmF1bHQ6IGZhbHNlLFxuICAgIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcbi8vIEVuc3VyZSBtZXRhZGF0YSBpcyBlbmFibGVkLiBUeXBlU2NyaXB0IGRvZXMgbm90IHBvbHlmaWxsXG4vLyBTeW1ib2wubWV0YWRhdGEsIHNvIHdlIG11c3QgZW5zdXJlIHRoYXQgaXQgZXhpc3RzLlxuU3ltYm9sLm1ldGFkYXRhID8/PSBTeW1ib2woJ21ldGFkYXRhJyk7XG4vLyBNYXAgZnJvbSBhIGNsYXNzJ3MgbWV0YWRhdGEgb2JqZWN0IHRvIHByb3BlcnR5IG9wdGlvbnNcbi8vIE5vdGUgdGhhdCB3ZSBtdXN0IHVzZSBudWxsaXNoLWNvYWxlc2NpbmcgYXNzaWdubWVudCBzbyB0aGF0IHdlIG9ubHkgdXNlIG9uZVxuLy8gbWFwIGV2ZW4gaWYgd2UgbG9hZCBtdWx0aXBsZSB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLlxuZ2xvYmFsLmxpdFByb3BlcnR5TWV0YWRhdGEgPz89IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEJhc2UgZWxlbWVudCBjbGFzcyB3aGljaCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gV2hlblxuICogcHJvcGVydGllcyBjaGFuZ2UsIHRoZSBgdXBkYXRlYCBtZXRob2QgaXMgYXN5bmNocm9ub3VzbHkgY2FsbGVkLiBUaGlzIG1ldGhvZFxuICogc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHN1YmNsYXNzZXMgdG8gcmVuZGVyIHVwZGF0ZXMgYXMgZGVzaXJlZC5cbiAqIEBub0luaGVyaXREb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlYWN0aXZlRWxlbWVudFxuLy8gSW4gdGhlIE5vZGUgYnVpbGQsIHRoaXMgYGV4dGVuZHNgIGNsYXVzZSB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGhcbi8vIGAoZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCA/PyBIVE1MRWxlbWVudClgLlxuLy9cbi8vIFRoaXMgd2F5LCB3ZSB3aWxsIGZpcnN0IHByZWZlciBhbnkgZ2xvYmFsIGBIVE1MRWxlbWVudGAgcG9seWZpbGwgdGhhdCB0aGVcbi8vIHVzZXIgaGFzIGFzc2lnbmVkLCBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gdGhlIGBIVE1MRWxlbWVudGAgc2hpbSB3aGljaCBoYXNcbi8vIGJlZW4gaW1wb3J0ZWQgKHNlZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlIGFib3V0IGhvdyB0aGlzIGltcG9ydCBpc1xuLy8gZ2VuZXJhdGVkIGJ5IFJvbGx1cCkuIE5vdGUgdGhhdCB0aGUgYEhUTUxFbGVtZW50YCB2YXJpYWJsZSBoYXMgYmVlblxuLy8gc2hhZG93ZWQgYnkgdGhpcyBpbXBvcnQsIHNvIGl0IG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGdsb2JhbC5cbiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHRoZSBjbGFzcyB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgaW5zdGFuY2VcbiAgICAgKiBjb25zdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHJ1bnMgYWdhaW5zdCBhIGBSZWFjdGl2ZUVsZW1lbnRgXG4gICAgICogc3ViY2xhc3MsIHN1Y2ggYXMgYSBkZWNvcmF0b3IsIHRoYXQgbmVlZHMgdG8gZG8gd29yayBmb3IgZWFjaFxuICAgICAqIGluc3RhbmNlLCBzdWNoIGFzIHNldHRpbmcgdXAgYSBgUmVhY3RpdmVDb250cm9sbGVyYC5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgbXlEZWNvcmF0b3IgPSAodGFyZ2V0OiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAqICAgdGFyZ2V0LmFkZEluaXRpYWxpemVyKChpbnN0YW5jZTogUmVhY3RpdmVFbGVtZW50KSA9PiB7XG4gICAgICogICAgIC8vIFRoaXMgaXMgcnVuIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIGVsZW1lbnRcbiAgICAgKiAgICAgbmV3IE15Q29udHJvbGxlcihpbnN0YW5jZSk7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBEZWNvcmF0aW5nIGEgZmllbGQgd2lsbCB0aGVuIGNhdXNlIGVhY2ggaW5zdGFuY2UgdG8gcnVuIGFuIGluaXRpYWxpemVyXG4gICAgICogdGhhdCBhZGRzIGEgY29udHJvbGxlcjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAgICogICBAbXlEZWNvcmF0b3IgZm9vO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluaXRpYWxpemVycyBhcmUgc3RvcmVkIHBlci1jb25zdHJ1Y3Rvci4gQWRkaW5nIGFuIGluaXRpYWxpemVyIHRvIGFcbiAgICAgKiBzdWJjbGFzcyBkb2VzIG5vdCBhZGQgaXQgdG8gYSBzdXBlcmNsYXNzLiBTaW5jZSBpbml0aWFsaXplcnMgYXJlIHJ1biBpblxuICAgICAqIGNvbnN0cnVjdG9ycywgaW5pdGlhbGl6ZXJzIHdpbGwgcnVuIGluIG9yZGVyIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHksXG4gICAgICogc3RhcnRpbmcgd2l0aCBzdXBlcmNsYXNzZXMgYW5kIHByb2dyZXNzaW5nIHRvIHRoZSBpbnN0YW5jZSdzIGNsYXNzLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAgICAgKHRoaXMuX2luaXRpYWxpemVycyA/Pz0gW10pLnB1c2goaW5pdGlhbGl6ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvcGVydGllcy5cbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIC8vIEVuc3VyZSB3ZSd2ZSBjcmVhdGVkIGFsbCBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuZmluYWxpemUoKTtcbiAgICAgICAgLy8gdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgaXMgb25seSB1bmRlZmluZWQgYWZ0ZXIgZmluYWxpemUoKSBpblxuICAgICAgICAvLyBSZWFjdGl2ZUVsZW1lbnQgaXRzZWxmLiBSZWFjdGl2ZUVsZW1lbnQub2JzZXJ2ZWRBdHRyaWJ1dGVzIGlzIG9ubHlcbiAgICAgICAgLy8gYWNjZXNzZWQgd2l0aCBSZWFjdGl2ZUVsZW1lbnQgYXMgdGhlIHJlY2VpdmVyIHdoZW4gYSBzdWJjbGFzcyBvciBtaXhpblxuICAgICAgICAvLyBjYWxscyBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXNcbiAgICAgICAgcmV0dXJuICh0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCAmJiBbLi4udGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAua2V5cygpXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUgaWYgb25lIGRvZXMgbm90IGV4aXN0XG4gICAgICogYW5kIHN0b3JlcyBhIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gZm9yIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZVxuICAgICAqIGdpdmVuIG9wdGlvbnMuIFRoZSBwcm9wZXJ0eSBzZXR0ZXIgY2FsbHMgdGhlIHByb3BlcnR5J3MgYGhhc0NoYW5nZWRgXG4gICAgICogcHJvcGVydHkgb3B0aW9uIG9yIHVzZXMgYSBzdHJpY3QgaWRlbnRpdHkgY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAgICogdG8gcmVxdWVzdCBhbiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemUgcHJvcGVydGllczsgaG93ZXZlcixcbiAgICAgKiB3aGVuIGRvaW5nIHNvLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlci5jcmVhdGVQcm9wZXJ0eWAgdG8gZW5zdXJlXG4gICAgICogdGhlIHByb3BlcnR5IGlzIHNldHVwIGNvcnJlY3RseS4gVGhpcyBtZXRob2QgY2FsbHNcbiAgICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYCBpbnRlcm5hbGx5IHRvIGdldCBhIGRlc2NyaXB0b3IgdG8gaW5zdGFsbC5cbiAgICAgKiBUbyBjdXN0b21pemUgd2hhdCBwcm9wZXJ0aWVzIGRvIHdoZW4gdGhleSBhcmUgZ2V0IG9yIHNldCwgb3ZlcnJpZGVcbiAgICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYC4gVG8gY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIHByb3BlcnR5LFxuICAgICAqIGltcGxlbWVudCBgY3JlYXRlUHJvcGVydHlgIGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogc3RhdGljIGNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgKiAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHtteU9wdGlvbjogdHJ1ZX0pO1xuICAgICAqICAgc3VwZXIuY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zID0gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24pIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXRlIHByb3BlcnR5LCBmb3JjZSB0aGUgYXR0cmlidXRlIHRvIGZhbHNlLlxuICAgICAgICBpZiAob3B0aW9ucy5zdGF0ZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5hdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgICAgICAvLyBXaGV0aGVyIHRoaXMgcHJvcGVydHkgaXMgd3JhcHBpbmcgYWNjZXNzb3JzLlxuICAgICAgICAvLyBIZWxwcyBjb250cm9sIHRoZSBpbml0aWFsIHZhbHVlIGNoYW5nZSBhbmQgcmVmbGVjdGlvbiBsb2dpYy5cbiAgICAgICAgaWYgKHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmNyZWF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIG9wdGlvbnMud3JhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcy5zZXQobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghb3B0aW9ucy5ub0FjY2Vzc29yKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICAgICAgICAgID8gLy8gVXNlIFN5bWJvbC5mb3IgaW4gZGV2IG1vZGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gbWFpbnRhaW4gc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkb2luZyBITVIuXG4gICAgICAgICAgICAgICAgICAgIFN5bWJvbC5mb3IoYCR7U3RyaW5nKG5hbWUpfSAoQHByb3BlcnR5KCkgY2FjaGUpYClcbiAgICAgICAgICAgICAgICA6IFN5bWJvbCgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHRvIGJlIGRlZmluZWQgb24gdGhlIGdpdmVuIG5hbWVkIHByb3BlcnR5LlxuICAgICAqIElmIG5vIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQsIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBiZWNvbWUgYW4gYWNjZXNzb3IuXG4gICAgICogRm9yIGV4YW1wbGUsXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgICAqICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICAgKiAgICAgY29uc3QgZGVmYXVsdERlc2NyaXB0b3IgPVxuICAgICAqICAgICAgICAgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAgICogICAgIGNvbnN0IHNldHRlciA9IGRlZmF1bHREZXNjcmlwdG9yLnNldDtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBnZXQ6IGRlZmF1bHREZXNjcmlwdG9yLmdldCxcbiAgICAgKiAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgKiAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgKiAgICAgICAgIC8vIGN1c3RvbSBhY3Rpb24uXG4gICAgICogICAgICAgfSxcbiAgICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgZ2V0LCBzZXQgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge1xuICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSB2O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmIGdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMucHJvdG90eXBlLCBuYW1lKSA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gb24gYCArXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICAgICAgICAgIGBidXQgaXQncyBhY3R1YWxseSBkZWNsYXJlZCBhcyBhIHZhbHVlIG9uIHRoZSBwcm90b3R5cGUuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgVXN1YWxseSB0aGlzIGlzIGR1ZSB0byB1c2luZyBAcHJvcGVydHkgb3IgQHN0YXRlIG9uIGEgbWV0aG9kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdyZWFjdGl2ZS1wcm9wZXJ0eS13aXRob3V0LWdldHRlcicsIGBGaWVsZCAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhuYW1lKSl9IG9uIGAgK1xuICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgICAgICAgYGJ1dCBpdCBkb2VzIG5vdCBoYXZlIGEgZ2V0dGVyLiBUaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gYSBgICtcbiAgICAgICAgICAgICAgICBgZnV0dXJlIHZlcnNpb24gb2YgTGl0LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXQsXG4gICAgICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGdldD8uY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBzZXQ/LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqIFRoZXNlIG9wdGlvbnMgYXJlIGRlZmluZWQgd2l0aCBhIGBQcm9wZXJ0eURlY2xhcmF0aW9uYCB2aWEgdGhlIGBwcm9wZXJ0aWVzYFxuICAgICAqIG9iamVjdCBvciB0aGUgYEBwcm9wZXJ0eWAgZGVjb3JhdG9yIGFuZCBhcmUgcmVnaXN0ZXJlZCBpblxuICAgICAqIGBjcmVhdGVQcm9wZXJ0eSguLi4pYC5cbiAgICAgKlxuICAgICAqIE5vdGUsIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjb25zaWRlcmVkIFwiZmluYWxcIiBhbmQgbm90IG92ZXJyaWRkZW4uIFRvXG4gICAgICogY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIGdpdmVuIHByb3BlcnR5LCBvdmVycmlkZVxuICAgICAqIHtAbGlua2NvZGUgY3JlYXRlUHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAZmluYWxcbiAgICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllcy5nZXQobmFtZSkgPz8gZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIHN0YXRpYyBvd24gcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgdXNlZCBpbiBib29ra2VlcGluZ1xuICAgICAqIGZvciBlbGVtZW50IHByb3BlcnRpZXMsIGluaXRpYWxpemVycywgZXRjLlxuICAgICAqXG4gICAgICogQ2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBieSBjb2RlIHRoYXQgbmVlZHMgdG8gZW5zdXJlIHRoZXNlXG4gICAgICogcHJvcGVydGllcyBleGlzdCBiZWZvcmUgdXNpbmcgdGhlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN1cGVyY2xhc3MgaXMgZmluYWxpemVkIHNvIHRoYXQgaW5oZXJpdGVkXG4gICAgICogcHJvcGVydHkgbWV0YWRhdGEgY2FuIGJlIGNvcGllZCBkb3duLlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgc3RhdGljIF9fcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZWxlbWVudFByb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgcHJlcGFyZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5hbGl6ZSBhbnkgc3VwZXJjbGFzc2VzXG4gICAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IGdldFByb3RvdHlwZU9mKHRoaXMpO1xuICAgICAgICBzdXBlckN0b3IuZmluYWxpemUoKTtcbiAgICAgICAgLy8gQ3JlYXRlIG93biBzZXQgb2YgaW5pdGlhbGl6ZXJzIGZvciB0aGlzIGNsYXNzIGlmIGFueSBleGlzdCBvbiB0aGVcbiAgICAgICAgLy8gc3VwZXJjbGFzcyBhbmQgY29weSB0aGVtIGRvd24uIE5vdGUsIGZvciBhIHNtYWxsIHBlcmYgYm9vc3QsIGF2b2lkXG4gICAgICAgIC8vIGNyZWF0aW5nIGluaXRpYWxpemVycyB1bmxlc3MgbmVlZGVkLlxuICAgICAgICBpZiAoc3VwZXJDdG9yLl9pbml0aWFsaXplcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZXJzID0gWy4uLnN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIGVsZW1lbnRQcm9wZXJ0aWVzIGZyb20gdGhlIHN1cGVyY2xhc3NcbiAgICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcyA9IG5ldyBNYXAoc3VwZXJDdG9yLmVsZW1lbnRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgc2V0dGluZyB1cCB0aGUgY2xhc3Mgc28gdGhhdCBpdCdzIHJlYWR5IHRvIGJlIHJlZ2lzdGVyZWRcbiAgICAgKiBhcyBhIGN1c3RvbSBlbGVtZW50IGFuZCBpbnN0YW50aWF0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFJlYWN0aXZlRWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXMgZ2V0dGVyLlxuICAgICAqIElmIHlvdSBvdmVycmlkZSB0aGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzIGdldHRlciwgeW91IG11c3QgZWl0aGVyIGNhbGxcbiAgICAgKiBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMgdG8gdHJpZ2dlciBmaW5hbGl6YXRpb24sIG9yIGNhbGwgZmluYWxpemUoKVxuICAgICAqIHlvdXJzZWxmLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZmluYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIHRoaXMpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fX3ByZXBhcmUoKTtcbiAgICAgICAgLy8gQ3JlYXRlIHByb3BlcnRpZXMgZnJvbSB0aGUgc3RhdGljIHByb3BlcnRpZXMgYmxvY2s6XG4gICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCB0aGlzKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgY29uc3QgcHJvcEtleXMgPSBbXG4gICAgICAgICAgICAgICAgLi4uZ2V0T3duUHJvcGVydHlOYW1lcyhwcm9wcyksXG4gICAgICAgICAgICAgICAgLi4uZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BzKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvcEtleXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnR5KHAsIHByb3BzW3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmcm9tIHN0YW5kYXJkIGRlY29yYXRvciBtZXRhZGF0YTpcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzW1N5bWJvbC5tZXRhZGF0YV07XG4gICAgICAgIGlmIChtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IGxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIGF0dHJpYnV0ZS10by1wcm9wZXJ0eSBtYXBcbiAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChhdHRyLCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnRTdHlsZXMgPSB0aGlzLmZpbmFsaXplU3R5bGVzKHRoaXMuc3R5bGVzKTtcbiAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRlUHJvcGVydHknKSkge1xuICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZygnbm8tb3ZlcnJpZGUtY3JlYXRlLXByb3BlcnR5JywgJ092ZXJyaWRpbmcgUmVhY3RpdmVFbGVtZW50LmNyZWF0ZVByb3BlcnR5KCkgaXMgZGVwcmVjYXRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFByb3BlcnR5RGVzY3JpcHRvcicpKSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCduby1vdmVycmlkZS1nZXQtcHJvcGVydHktZGVzY3JpcHRvcicsICdPdmVycmlkaW5nIFJlYWN0aXZlRWxlbWVudC5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGFrZXMgdGhlIHN0eWxlcyB0aGUgdXNlciBzdXBwbGllZCB2aWEgdGhlIGBzdGF0aWMgc3R5bGVzYCBwcm9wZXJ0eSBhbmRcbiAgICAgKiByZXR1cm5zIHRoZSBhcnJheSBvZiBzdHlsZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnQuXG4gICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW50ZWdyYXRlIGludG8gYSBzdHlsZSBtYW5hZ2VtZW50IHN5c3RlbS5cbiAgICAgKlxuICAgICAqIFN0eWxlcyBhcmUgZGVkdXBsaWNhdGVkIHByZXNlcnZpbmcgdGhlIF9sYXN0XyBpbnN0YW5jZSBpbiB0aGUgbGlzdC4gVGhpc1xuICAgICAqIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZWQgc3R5bGVzIHRoYXQgY2FuIG9jY3VyXG4gICAgICogZXNwZWNpYWxseSB3aGVuIGNvbXBvc2luZyB2aWEgc3ViY2xhc3NpbmcuIFRoZSBsYXN0IGl0ZW0gaXMga2VwdCB0byB0cnlcbiAgICAgKiB0byBwcmVzZXJ2ZSB0aGUgY2FzY2FkZSBvcmRlciB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQncyBtb3N0IGltcG9ydGFudFxuICAgICAqIHRoYXQgbGFzdCBhZGRlZCBzdHlsZXMgb3ZlcnJpZGUgcHJldmlvdXMgc3R5bGVzLlxuICAgICAqXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAgICovXG4gICAgc3RhdGljIGZpbmFsaXplU3R5bGVzKHN0eWxlcykge1xuICAgICAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gW107XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHtcbiAgICAgICAgICAgIC8vIERlZHVwZSB0aGUgZmxhdHRlbmVkIGFycmF5IGluIHJldmVyc2Ugb3JkZXIgdG8gcHJlc2VydmUgdGhlIGxhc3QgaXRlbXMuXG4gICAgICAgICAgICAvLyBDYXN0aW5nIHRvIEFycmF5PHVua25vd24+IHdvcmtzIGFyb3VuZCBUUyBlcnJvciB0aGF0XG4gICAgICAgICAgICAvLyBhcHBlYXJzIHRvIGNvbWUgZnJvbSB0cnlpbmcgdG8gZmxhdHRlbiBhIHR5cGUgQ1NTUmVzdWx0QXJyYXkuXG4gICAgICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KHN0eWxlcy5mbGF0KEluZmluaXR5KS5yZXZlcnNlKCkpO1xuICAgICAgICAgICAgLy8gVGhlbiBwcmVzZXJ2ZSBvcmlnaW5hbCBvcmRlciBieSBhZGRpbmcgdGhlIHNldCBpdGVtcyBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHNldCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRTdHlsZXMudW5zaGlmdChnZXRDb21wYXRpYmxlU3R5bGUocykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0eWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlbGVtZW50U3R5bGVzLnB1c2goZ2V0Q29tcGF0aWJsZVN0eWxlKHN0eWxlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50U3R5bGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGBuYW1lYC5cbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIHN0YXRpYyBfX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG9wdGlvbnMuYXR0cmlidXRlO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlID09PSBmYWxzZVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogdHlwZW9mIGF0dHJpYnV0ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRydWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIHVwZGF0ZSBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGByZXF1ZXN0VXBkYXRlKClgLlxuICAgICAgICAgKiBTaG91bGQgb25seSBiZSByZWFkLlxuICAgICAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHNldCB0byBgdHJ1ZWAgYWZ0ZXIgdGhlIGZpcnN0IHVwZGF0ZS4gVGhlIGVsZW1lbnQgY29kZSBjYW5ub3QgYXNzdW1lXG4gICAgICAgICAqIHRoYXQgYHJlbmRlclJvb3RgIGV4aXN0cyBiZWZvcmUgdGhlIGVsZW1lbnQgYGhhc1VwZGF0ZWRgLlxuICAgICAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXNVcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOYW1lIG9mIGN1cnJlbnRseSByZWZsZWN0aW5nIHByb3BlcnR5XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2luaXRpYWxpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgb25seSBvdmVycmlkZSBwb2ludCBmb3IgY3VzdG9taXppbmcgd29yayBkb25lIHdoZW4gZWxlbWVudHNcbiAgICAgKiBhcmUgY29uc3RydWN0ZWQuXG4gICAgICovXG4gICAgX19pbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLl9fdXBkYXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+ICh0aGlzLmVuYWJsZVVwZGF0aW5nID0gcmVzKSk7XG4gICAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gVGhpcyBlbnF1ZXVlcyBhIG1pY3JvdGFzayB0aGF0IG11c3QgcnVuIGJlZm9yZSB0aGUgZmlyc3QgdXBkYXRlLCBzbyBpdFxuICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgcmVxdWVzdFVwZGF0ZSgpXG4gICAgICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgICAgIC8vIGVuc3VyZXMgZmlyc3QgdXBkYXRlIHdpbGwgYmUgY2F1Z2h0IGJ5IGFuIGVhcmx5IGFjY2VzcyBvZlxuICAgICAgICAvLyBgdXBkYXRlQ29tcGxldGVgXG4gICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+IGkodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAgICogdXBkYXRlIGN5Y2xlLiBUaGUgZWxlbWVudCBhdXRvbWF0aWNhbGx5IGNhbGxzIGludG8gYW55IHJlZ2lzdGVyZWRcbiAgICAgKiBjb250cm9sbGVycyBkdXJpbmcgaXRzIGxpZmVjeWNsZSBjYWxsYmFja3MuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgd2hlbiBgYWRkQ29udHJvbGxlcigpYCBpcyBjYWxsZWQsIHRoZVxuICAgICAqIGNvbnRyb2xsZXIncyBgaG9zdENvbm5lY3RlZCgpYCBjYWxsYmFjayB3aWxsIGJlIGltbWVkaWF0ZWx5IGNhbGxlZC5cbiAgICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICAgKi9cbiAgICBhZGRDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgICAgIC8vIElmIGEgY29udHJvbGxlciBpcyBhZGRlZCBhZnRlciB0aGUgZWxlbWVudCBoYXMgYmVlbiBjb25uZWN0ZWQsXG4gICAgICAgIC8vIGNhbGwgaG9zdENvbm5lY3RlZC4gTm90ZSwgcmUtdXNpbmcgZXhpc3RlbmNlIG9mIGByZW5kZXJSb290YCBoZXJlXG4gICAgICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAgICAgLy8gZmlyc3QgY29ubmVjdGVkIHN0YXRlLlxuICAgICAgICBpZiAodGhpcy5yZW5kZXJSb290ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgY29udHJvbGxlci5ob3N0Q29ubmVjdGVkPy4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgYFJlYWN0aXZlQ29udHJvbGxlcmAgZnJvbSB0aGUgZWxlbWVudC5cbiAgICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpeGVzIGFueSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgaW5zdGFuY2UgYmVmb3JlIHVwZ3JhZGUgdGltZS5cbiAgICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKiBUaGUgcHJvcGVydGllcyBhcmUgc3RvcmVkIGluIGEgTWFwIHdoaWNoIGlzIHBsYXllZCBiYWNrIGFmdGVyIHRoZVxuICAgICAqIGNvbnN0cnVjdG9yIHJ1bnMuXG4gICAgICovXG4gICAgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgICAgICBjb25zdCBpbnN0YW5jZVByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgZWxlbWVudFByb3BlcnRpZXMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlUHJvcGVydGllcy5zZXQocCwgdGhpc1twXSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3RhbmNlUHJvcGVydGllcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IGluc3RhbmNlUHJvcGVydGllcztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub2RlIGludG8gd2hpY2ggdGhlIGVsZW1lbnQgc2hvdWxkIHJlbmRlciBhbmQgYnkgZGVmYXVsdFxuICAgICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgICAqIGVsZW1lbnQncyBET00gaXMgcmVuZGVyZWQuIEZvciBleGFtcGxlLCB0byByZW5kZXIgaW50byB0aGUgZWxlbWVudCdzXG4gICAgICogY2hpbGROb2RlcywgcmV0dXJuIGB0aGlzYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5vZGUgaW50byB3aGljaCB0byByZW5kZXIuXG4gICAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgICAqL1xuICAgIGNyZWF0ZVJlbmRlclJvb3QoKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlclJvb3QgPSB0aGlzLnNoYWRvd1Jvb3QgPz9cbiAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpO1xuICAgICAgICBhZG9wdFN0eWxlcyhyZW5kZXJSb290LCB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRTdHlsZXMpO1xuICAgICAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICAgKiBlbGVtZW50IHN0eWxpbmcsIGFuZCBlbmFibGVzIHVwZGF0aW5nLlxuICAgICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICAgKi9cbiAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICAgICB0aGlzLnJlbmRlclJvb3QgPz89XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAgICAgdGhpcy5lbmFibGVVcGRhdGluZyh0cnVlKTtcbiAgICAgICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3RDb25uZWN0ZWQ/LigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgICAqIG92ZXJyaWRkZW4gb24gdGhlIGVsZW1lbnQgaW5zdGFuY2Ugd2l0aCBhIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgdGhlIGZpcnN0XG4gICAgICogdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZSkgeyB9XG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgICAqIHJlc2VydmluZyB0aGUgcG9zc2liaWxpdHkgb2YgbWFraW5nIG5vbi1icmVha2luZyBmZWF0dXJlIGFkZGl0aW9uc1xuICAgICAqIHdoZW4gZGlzY29ubmVjdGluZyBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdERpc2Nvbm5lY3RlZD8uKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBTcGVjaWZpY2FsbHksIHdoZW4gYW4gYXR0cmlidXRlIGlzIHNldCwgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAgICogb3ZlcnJpZGRlbiwgYHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBfb2xkLCB2YWx1ZSlgIG11c3QgYmVcbiAgICAgKiBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBTZWUgW3Jlc3BvbmRpbmcgdG8gYXR0cmlidXRlIGNoYW5nZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfY29tcG9uZW50cy9Vc2luZ19jdXN0b21fZWxlbWVudHMjcmVzcG9uZGluZ190b19hdHRyaWJ1dGVfY2hhbmdlcylcbiAgICAgKiBvbiBNRE4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLlxuICAgICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIF9vbGQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgX19wcm9wZXJ0eVRvQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGVsZW1Qcm9wZXJ0aWVzID0gdGhpcy5jb25zdHJ1Y3Rvci5lbGVtZW50UHJvcGVydGllcztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGVsZW1Qcm9wZXJ0aWVzLmdldChuYW1lKTtcbiAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuY29uc3RydWN0b3IuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBvcHRpb25zLmNvbnZlcnRlcj8udG9BdHRyaWJ1dGUgIT09XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmNvbnZlcnRlclxuICAgICAgICAgICAgICAgIDogZGVmYXVsdENvbnZlcnRlcjtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNvbnZlcnRlci50b0F0dHJpYnV0ZSh2YWx1ZSwgb3B0aW9ucy50eXBlKTtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKCdtaWdyYXRpb24nKSAmJlxuICAgICAgICAgICAgICAgIGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCd1bmRlZmluZWQtYXR0cmlidXRlLXZhbHVlJywgYFRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSAke25hbWV9IHByb3BlcnR5IGlzIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdW5kZWZpbmVkIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0uIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYHJlbW92ZWQsIGJ1dCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiBcXGBSZWFjdGl2ZUVsZW1lbnRcXGAsIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGhlIGF0dHJpYnV0ZSB3b3VsZCBub3QgaGF2ZSBjaGFuZ2VkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhY2sgaWYgdGhlIHByb3BlcnR5IGlzIGJlaW5nIHJlZmxlY3RlZCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgcHJvcGVydHkgYWdhaW4gdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgLiBOb3RlOlxuICAgICAgICAgICAgLy8gMS4gdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgY2FsbGJhY2sgaXMgc3luY2hyb25vdXMuXG4gICAgICAgICAgICAvLyAyLiB3aWxsIGJlaGF2ZSBpbmNvcnJlY3RseSBpZiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBpbiB0aGUgcmVhY3Rpb25cbiAgICAgICAgICAgIC8vIHN0YWNrIGF0IHRpbWUgb2YgY2FsbGluZy4gSG93ZXZlciwgc2luY2Ugd2UgcHJvY2VzcyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAvLyBpbiBgdXBkYXRlYCB0aGlzIHNob3VsZCBub3QgYmUgcG9zc2libGUgKG9yIGFuIGV4dHJlbWUgY29ybmVyIGNhc2VcbiAgICAgICAgICAgIC8vIHRoYXQgd2UnZCBsaWtlIHRvIGRpc2NvdmVyKS5cbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG5hbWU7XG4gICAgICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBtYXJrIHN0YXRlIG5vdCByZWZsZWN0aW5nXG4gICAgICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAvLyBOb3RlLCBoaW50IHRoaXMgYXMgYW4gYEF0dHJpYnV0ZU1hcGAgc28gY2xvc3VyZSBjbGVhcmx5IHVuZGVyc3RhbmRzXG4gICAgICAgIC8vIHRoZSB0eXBlOyBpdCBoYXMgaXNzdWVzIHdpdGggdHJhY2tpbmcgdHlwZXMgdGhyb3VnaCBzdGF0aWNzXG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gY3Rvci5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAuZ2V0KG5hbWUpO1xuICAgICAgICAvLyBVc2UgdHJhY2tpbmcgaW5mbyB0byBhdm9pZCByZWZsZWN0aW5nIGEgcHJvcGVydHkgdmFsdWUgdG8gYW4gYXR0cmlidXRlXG4gICAgICAgIC8vIGlmIGl0IHdhcyBqdXN0IHNldCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGUgY2hhbmdlZC5cbiAgICAgICAgaWYgKHByb3BOYW1lICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gcHJvcE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhwcm9wTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5jb252ZXJ0ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICA/IHsgZnJvbUF0dHJpYnV0ZTogb3B0aW9ucy5jb252ZXJ0ZXIgfVxuICAgICAgICAgICAgICAgIDogb3B0aW9ucy5jb252ZXJ0ZXI/LmZyb21BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdENvbnZlcnRlcjtcbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IHByb3BOYW1lO1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0ZXIuZnJvbUF0dHJpYnV0ZSh2YWx1ZSwgb3B0aW9ucy50eXBlKTtcbiAgICAgICAgICAgIHRoaXNbcHJvcE5hbWVdID1cbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fZGVmYXVsdFZhbHVlcz8uZ2V0KHByb3BOYW1lKSA/P1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIGFuIHVwZGF0ZSB3aGljaCBpcyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBzaG91bGQgdXBkYXRlIGJhc2VkIG9uIHNvbWUgc3RhdGUgbm90IHRyaWdnZXJlZCBieSBzZXR0aW5nXG4gICAgICogYSByZWFjdGl2ZSBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlLCBwYXNzIG5vIGFyZ3VtZW50cy4gSXQgc2hvdWxkIGFsc28gYmVcbiAgICAgKiBjYWxsZWQgd2hlbiBtYW51YWxseSBpbXBsZW1lbnRpbmcgYSBwcm9wZXJ0eSBzZXR0ZXIuIEluIHRoaXMgY2FzZSwgcGFzcyB0aGVcbiAgICAgKiBwcm9wZXJ0eSBgbmFtZWAgYW5kIGBvbGRWYWx1ZWAgdG8gZW5zdXJlIHRoYXQgYW55IGNvbmZpZ3VyZWQgcHJvcGVydHlcbiAgICAgKiBvcHRpb25zIGFyZSBob25vcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAgICogQHBhcmFtIG9sZFZhbHVlIG9sZCB2YWx1ZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAgICogQHBhcmFtIG9wdGlvbnMgcHJvcGVydHkgb3B0aW9ucyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXNseVxuICAgICAqICAgICBjb25maWd1cmVkIG9wdGlvbnNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHByb3BlcnR5IGtleSwgcGVyZm9ybSBwcm9wZXJ0eSB1cGRhdGUgc3RlcHMuXG4gICAgICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJiBuYW1lIGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoYGAsIGBUaGUgcmVxdWVzdFVwZGF0ZSgpIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYW4gRXZlbnQgYXMgdGhlIHByb3BlcnR5IG5hbWUuIFRoaXMgaXMgcHJvYmFibHkgYSBtaXN0YWtlIGNhdXNlZCBieSBiaW5kaW5nIHRoaXMucmVxdWVzdFVwZGF0ZSBhcyBhbiBldmVudCBsaXN0ZW5lci4gSW5zdGVhZCBiaW5kIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNhbGwgaXQgd2l0aCBubyBhcmd1bWVudHM6ICgpID0+IHRoaXMucmVxdWVzdFVwZGF0ZSgpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1tuYW1lXTtcbiAgICAgICAgICAgIG9wdGlvbnMgPz89IGN0b3IuZ2V0UHJvcGVydHlPcHRpb25zKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlZCA9IChvcHRpb25zLmhhc0NoYW5nZWQgPz8gbm90RXF1YWwpKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGNoYW5nZSwgY2hlY2sgYSBjb3JuZXIgY2FzZSB0aGF0IGNhbiBvY2N1ciB3aGVuXG4gICAgICAgICAgICAgICAgLy8gMS4gdGhlcmUncyBhIGluaXRpYWwgdmFsdWUgd2hpY2ggd2FzIG5vdCByZWZsZWN0ZWRcbiAgICAgICAgICAgICAgICAvLyAyLiB0aGUgcHJvcGVydHkgaXMgc3Vic2VxdWVudGx5IHNldCB0byB0aGlzIHZhbHVlLlxuICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBgcHJvcDoge3VzZURlZmF1bHQ6IHRydWUsIHJlZmxlY3Q6IHRydWV9YFxuICAgICAgICAgICAgICAgIC8vIGFuZCBlbC5wcm9wID0gJ2ZvbycuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UgaWYgdGhlXG4gICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlIGlzIG5vdCBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5vdyByZWZsZWN0IHRoZSBwcm9wZXJ0eSB0byB0aGUgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgIChvcHRpb25zLnVzZURlZmF1bHQgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5yZWZsZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID09PSB0aGlzLl9fZGVmYXVsdFZhbHVlcz8uZ2V0KG5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmhhc0F0dHJpYnV0ZShjdG9yLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KG5hbWUsIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VQcm9wZXJ0eShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBYm9ydCB0aGUgcmVxdWVzdCBpZiB0aGUgcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzVXBkYXRlUGVuZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX191cGRhdGVQcm9taXNlID0gdGhpcy5fX2VucXVldWVVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCB7IHVzZURlZmF1bHQsIHJlZmxlY3QsIHdyYXBwZWQgfSwgaW5pdGlhbGl6ZVZhbHVlKSB7XG4gICAgICAgIC8vIFJlY29yZCBkZWZhdWx0IHZhbHVlIHdoZW4gdXNlRGVmYXVsdCBpcyB1c2VkLiBUaGlzIGFsbG93cyB1cyB0b1xuICAgICAgICAvLyByZXN0b3JlIHRoaXMgdmFsdWUgd2hlbiB0aGUgYXR0cmlidXRlIGlzIHJlbW92ZWQuXG4gICAgICAgIGlmICh1c2VEZWZhdWx0ICYmICEodGhpcy5fX2RlZmF1bHRWYWx1ZXMgPz89IG5ldyBNYXAoKSkuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLl9fZGVmYXVsdFZhbHVlcy5zZXQobmFtZSwgaW5pdGlhbGl6ZVZhbHVlID8/IG9sZFZhbHVlID8/IHRoaXNbbmFtZV0pO1xuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBub3Qgd3JhcHBpbmcgYW4gYWNjZXNzb3IsIGl0IG11c3QgYmUgYW4gaW5pdGlhbCBzZXR0aW5nXG4gICAgICAgICAgICAvLyBhbmQgaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIHJlY29yZCB0aGUgY2hhbmdlIG9yIHJlZmxlY3QuXG4gICAgICAgICAgICBpZiAod3JhcHBlZCAhPT0gdHJ1ZSB8fCBpbml0aWFsaXplVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogQ3JlYXRlIGEgYmVuY2htYXJrIG9mIE1hcC5oYXMoKSArIE1hcC5zZXQoXG4gICAgICAgIC8vIHZzIGp1c3QgTWFwLnNldCgpXG4gICAgICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgLy8gT24gdGhlIGluaXRpYWwgY2hhbmdlLCB0aGUgb2xkIHZhbHVlIHNob3VsZCBiZSBgdW5kZWZpbmVkYCwgZXhjZXB0XG4gICAgICAgICAgICAvLyB3aXRoIGB1c2VEZWZhdWx0YFxuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQgJiYgIXVzZURlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBvbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcy5zZXQobmFtZSwgb2xkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0byByZWZsZWN0aW5nIHByb3BlcnRpZXMgc2V0LlxuICAgICAgICAvLyBOb3RlLCBpdCdzIGltcG9ydGFudCB0aGF0IGV2ZXJ5IGNoYW5nZSBoYXMgYSBjaGFuY2UgdG8gYWRkIHRoZVxuICAgICAgICAvLyBwcm9wZXJ0eSB0byBgX19yZWZsZWN0aW5nUHJvcGVydGllc2AuIFRoaXMgZW5zdXJlcyBzZXR0aW5nXG4gICAgICAgIC8vIGF0dHJpYnV0ZSArIHByb3BlcnR5IHJlZmxlY3RzIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKHJlZmxlY3QgPT09IHRydWUgJiYgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSAhPT0gbmFtZSkge1xuICAgICAgICAgICAgKHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyA/Pz0gbmV3IFNldCgpKS5hZGQobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAgICovXG4gICAgYXN5bmMgX19lbnF1ZXVlVXBkYXRlKCkge1xuICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgYW55IHByZXZpb3VzIHVwZGF0ZSBoYXMgcmVzb2x2ZWQgYmVmb3JlIHVwZGF0aW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBgYXdhaXRgIGFsc28gZW5zdXJlcyB0aGF0IHByb3BlcnR5IGNoYW5nZXMgYXJlIGJhdGNoZWQuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gUmVmaXJlIGFueSBwcmV2aW91cyBlcnJvcnMgYXN5bmMgc28gdGhleSBkbyBub3QgZGlzcnVwdCB0aGUgdXBkYXRlXG4gICAgICAgICAgICAvLyBjeWNsZS4gRXJyb3JzIGFyZSByZWZpcmVkIHNvIGRldmVsb3BlcnMgaGF2ZSBhIGNoYW5jZSB0byBvYnNlcnZlXG4gICAgICAgICAgICAvLyB0aGVtLCBhbmQgdGhpcyBjYW4gYmUgZG9uZSBieSBpbXBsZW1lbnRpbmdcbiAgICAgICAgICAgIC8vIGB3aW5kb3cub251bmhhbmRsZWRyZWplY3Rpb25gLlxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICAvLyBJZiBgc2NoZWR1bGVVcGRhdGVgIHJldHVybnMgYSBQcm9taXNlLCB3ZSBhd2FpdCBpdC4gVGhpcyBpcyBkb25lIHRvXG4gICAgICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgICAgIC8vIGNoZWNrZWQgdG8gYXZvaWQgZGVsYXlpbmcgYW4gYWRkaXRpb25hbCBtaWNyb3Rhc2sgdW5sZXNzIHdlIG5lZWQgdG8uXG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgYXdhaXQgcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhdGhpcy5pc1VwZGF0ZVBlbmRpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhbiBlbGVtZW50IHVwZGF0ZS4gWW91IGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhlXG4gICAgICogdGltaW5nIG9mIHVwZGF0ZXMgYnkgcmV0dXJuaW5nIGEgUHJvbWlzZS4gVGhlIHVwZGF0ZSB3aWxsIGF3YWl0IHRoZVxuICAgICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgICAqIHRvIHByb2NlZWQuIElmIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIGBzdXBlci5zY2hlZHVsZVVwZGF0ZSgpYFxuICAgICAqIG11c3QgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogRm9yIGluc3RhbmNlLCB0byBzY2hlZHVsZSB1cGRhdGVzIHRvIG9jY3VyIGp1c3QgYmVmb3JlIHRoZSBuZXh0IGZyYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBvdmVycmlkZSBwcm90ZWN0ZWQgYXN5bmMgc2NoZWR1bGVVcGRhdGUoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICogICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc29sdmUoKSkpO1xuICAgICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBzY2hlZHVsZVVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgICAgIGlmIChERVZfTU9ERSAmJlxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMoJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJykgJiZcbiAgICAgICAgICAgIHR5cGVvZiByZXN1bHQ/LnRoZW4gPT09XG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdhc3luYy1wZXJmb3JtLXVwZGF0ZScsIGBFbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHJldHVybmVkIGEgUHJvbWlzZSBmcm9tIHBlcmZvcm1VcGRhdGUoKS4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgYmVoYXZpb3IgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGAgK1xuICAgICAgICAgICAgICAgIGB2ZXJzaW9uIG9mIFJlYWN0aXZlRWxlbWVudC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbiBlbGVtZW50IHVwZGF0ZS4gTm90ZSwgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGhlXG4gICAgICogdXBkYXRlLCBgZmlyc3RVcGRhdGVkYCBhbmQgYHVwZGF0ZWRgIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIENhbGwgYHBlcmZvcm1VcGRhdGUoKWAgdG8gaW1tZWRpYXRlbHkgcHJvY2VzcyBhIHBlbmRpbmcgdXBkYXRlLiBUaGlzIHNob3VsZFxuICAgICAqIGdlbmVyYWxseSBub3QgYmUgbmVlZGVkLCBidXQgaXQgY2FuIGJlIGRvbmUgaW4gcmFyZSBjYXNlcyB3aGVuIHlvdSBuZWVkIHRvXG4gICAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHBlcmZvcm1VcGRhdGUoKSB7XG4gICAgICAgIC8vIEFib3J0IGFueSB1cGRhdGUgaWYgb25lIGlzIG5vdCBwZW5kaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuXG4gICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgICAgICAvLyB0aGUgdXBkYXRlLlxuICAgICAgICBpZiAoIXRoaXMuaXNVcGRhdGVQZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdMb2dFdmVudD8uKHsga2luZDogJ3VwZGF0ZScgfSk7XG4gICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgcmVuZGVyUm9vdCBiZWZvcmUgZmlyc3QgdXBkYXRlLiBUaGlzIG9jY3VycyBpbiBgY29ubmVjdGVkQ2FsbGJhY2tgXG4gICAgICAgICAgICAvLyBidXQgaXMgZG9uZSBoZXJlIHRvIHN1cHBvcnQgb3V0IG9mIHRyZWUgY2FsbHMgdG8gYGVuYWJsZVVwZGF0aW5nYC9gcGVyZm9ybVVwZGF0ZWAuXG4gICAgICAgICAgICB0aGlzLnJlbmRlclJvb3QgPz89XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBQcm9kdWNlIHdhcm5pbmcgaWYgYW55IHJlYWN0aXZlIHByb3BlcnRpZXMgb24gdGhlIHByb3RvdHlwZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZCBieSB0aGlzIHBvaW50LCBzbyBhbnkgb3duIHByb3BlcnR5IGlzIGNhdXNlZCBieSBjbGFzcyBmaWVsZFxuICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcigocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hhZG93ZWRQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYHRyaWdnZXIgdXBkYXRlcyBhcyBleHBlY3RlZCBiZWNhdXNlIHRoZXkgYXJlIHNldCB1c2luZyBjbGFzcyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBmaWVsZHM6ICR7c2hhZG93ZWRQcm9wZXJ0aWVzLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhY2Nlc3NvcnMgdXNlZCBmb3IgZGV0ZWN0aW5nIGNoYW5nZXMuIFNlZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBodHRwczovL2xpdC5kZXYvbXNnL2NsYXNzLWZpZWxkLXNoYWRvd2luZyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNaXhpbiBpbnN0YW5jZSBwcm9wZXJ0aWVzIG9uY2UsIGlmIHRoZXkgZXhpc3QuXG4gICAgICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBzaG91bGQgd2UgdXNlIHRoZSBzdG9yZWQgdmFsdWU/IENvdWxkIGEgbmV3IHZhbHVlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwLCB2YWx1ZV0gb2YgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgICAgICAgIC8vIGBjaGFuZ2VkUHJvcGVydGllc2AgbWFwLCBidXQgb25seSBmb3IgdGhlIGNhc2Ugb2YgcHJvcGVydGllcyBjcmVhdGVkXG4gICAgICAgICAgICAvLyB2aWEgYGNyZWF0ZVByb3BlcnR5YCBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeVxuICAgICAgICAgICAgLy8gcG9wdWxhdGVkIHRoZSBgY2hhbmdlZFByb3BlcnRpZXNgIG1hcCBzaW5jZSB0aGV5IGFyZSBub3Qgc2V0LlxuICAgICAgICAgICAgLy8gV2UgY2FuJ3Qga25vdyBpZiB0aGVzZSBhY2Nlc3NvcnMgaGFkIGluaXRpYWxpemVycywgc28gd2UganVzdCBzZXRcbiAgICAgICAgICAgIC8vIHRoZW0gYW55d2F5IC0gYSBkaWZmZXJlbmNlIGZyb20gZXhwZXJpbWVudGFsIGRlY29yYXRvcnMgb24gZmllbGRzIGFuZFxuICAgICAgICAgICAgLy8gc3RhbmRhcmQgZGVjb3JhdG9ycyBvbiBhdXRvLWFjY2Vzc29ycy5cbiAgICAgICAgICAgIC8vIEZvciBjb250ZXh0IHNlZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L3B1bGwvNDE4MyNpc3N1ZWNvbW1lbnQtMTcxMTk1OTYzNVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRQcm9wZXJ0aWVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3cmFwcGVkIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3cmFwcGVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KHAsIHVuZGVmaW5lZCwgb3B0aW9ucywgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzaG91bGRVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgY2hhbmdlZFByb3BlcnRpZXMgPSB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzaG91bGRVcGRhdGUgPSB0aGlzLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZT8uKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgZnJvbSBydW5uaW5nIHdoZW4gdGhlcmUncyBhblxuICAgICAgICAgICAgLy8gdXBkYXRlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gRW5zdXJlIGVsZW1lbnQgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIHVwZGF0ZXMgYWZ0ZXIgYW4gZXhjZXB0aW9uLlxuICAgICAgICAgICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB1cGRhdGUgaXMgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgcGVuZGluZyBhbmQgZnVydGhlciB1cGRhdGVzIGFyZSBub3cgYWxsb3dlZC5cbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCBiZWZvcmUgYHVwZGF0ZSgpYCB0byBjb21wdXRlIHZhbHVlcyBuZWVkZWQgZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBJbXBsZW1lbnQgYHdpbGxVcGRhdGVgIHRvIGNvbXB1dGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIG90aGVyXG4gICAgICogcHJvcGVydGllcyBhbmQgYXJlIHVzZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZSBwcm9jZXNzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiB3aWxsVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICogICAvLyBvbmx5IG5lZWQgdG8gY2hlY2sgY2hhbmdlZCBwcm9wZXJ0aWVzIGZvciBhbiBleHBlbnNpdmUgY29tcHV0YXRpb24uXG4gICAgICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdmaXJzdE5hbWUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xhc3ROYW1lJykpIHtcbiAgICAgKiAgICAgdGhpcy5zaGEgPSBjb21wdXRlU0hBKGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogcmVuZGVyKCkge1xuICAgICAqICAgcmV0dXJuIGh0bWxgU0hBOiAke3RoaXMuc2hhfWA7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB3aWxsVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllcykgeyB9XG4gICAgLy8gTm90ZSwgdGhpcyBpcyBhbiBvdmVycmlkZSBwb2ludCBmb3IgcG9seWZpbGwtc3VwcG9ydC5cbiAgICAvLyBAaW50ZXJuYWxcbiAgICBfJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZWQ/LigpKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmXG4gICAgICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyAmJlxuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMoJ2NoYW5nZS1pbi11cGRhdGUnKSkge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdjaGFuZ2UtaW4tdXBkYXRlJywgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gc2NoZWR1bGVkIGFuIHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICBgKGdlbmVyYWxseSBiZWNhdXNlIGEgcHJvcGVydHkgd2FzIHNldCkgYCArXG4gICAgICAgICAgICAgICAgYGFmdGVyIGFuIHVwZGF0ZSBjb21wbGV0ZWQsIGNhdXNpbmcgYSBuZXcgdXBkYXRlIHRvIGJlIHNjaGVkdWxlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgaW5lZmZpY2llbnQgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHVubGVzcyB0aGUgbmV4dCB1cGRhdGUgYCArXG4gICAgICAgICAgICAgICAgYGNhbiBvbmx5IGJlIHNjaGVkdWxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyB1cGRhdGUuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX19tYXJrVXBkYXRlZCgpIHtcbiAgICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgaGFzIGNvbXBsZXRlZCB1cGRhdGluZy5cbiAgICAgKiBUaGUgUHJvbWlzZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgY29tcGxldGVkIHRoZVxuICAgICAqIHVwZGF0ZSB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuIFRoZSBQcm9taXNlIHJlc3VsdCBpcyBgZmFsc2VgIGlmXG4gICAgICogYSBwcm9wZXJ0eSB3YXMgc2V0IGluc2lkZSBgdXBkYXRlZCgpYC4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGFuXG4gICAgICogZXhjZXB0aW9uIHdhcyB0aHJvd24gZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBUbyBhd2FpdCBhZGRpdGlvbmFsIGFzeW5jaHJvbm91cyB3b3JrLCBvdmVycmlkZSB0aGUgYGdldFVwZGF0ZUNvbXBsZXRlYFxuICAgICAqIG1ldGhvZC4gRm9yIGV4YW1wbGUsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYXdhaXQgYSByZW5kZXJlZCBlbGVtZW50XG4gICAgICogYmVmb3JlIGZ1bGZpbGxpbmcgdGhpcyBQcm9taXNlLiBUbyBkbyB0aGlzLCBmaXJzdCBhd2FpdFxuICAgICAqIGBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpYCwgdGhlbiBhbnkgc3Vic2VxdWVudCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZ2V0IHVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBwb2ludCBmb3IgdGhlIGB1cGRhdGVDb21wbGV0ZWAgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCBzYWZlIHRvIG92ZXJyaWRlIHRoZSBgdXBkYXRlQ29tcGxldGVgIGdldHRlciBkaXJlY3RseSBkdWUgdG8gYVxuICAgICAqIGxpbWl0YXRpb24gaW4gVHlwZVNjcmlwdCB3aGljaCBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCBhXG4gICAgICogc3VwZXJjbGFzcyBnZXR0ZXIgKGUuZy4gYHN1cGVyLnVwZGF0ZUNvbXBsZXRlLnRoZW4oLi4uKWApIHdoZW4gdGhlIHRhcmdldFxuICAgICAqIGxhbmd1YWdlIGlzIEVTNSAoaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMzgpLlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGluc3RlYWQuIEZvciBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICAgKiAgIG92ZXJyaWRlIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgICAqICAgICBhd2FpdCB0aGlzLl9teUNoaWxkLnVwZGF0ZUNvbXBsZXRlO1xuICAgICAqICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICAgKiAgICAgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZ2V0VXBkYXRlQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fdXBkYXRlUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciBvciBub3QgYHVwZGF0ZSgpYCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgcmVxdWVzdHNcbiAgICAgKiBhbiB1cGRhdGUuIEJ5IGRlZmF1bHQsIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGB0cnVlYCwgYnV0IHRoaXMgY2FuIGJlXG4gICAgICogY3VzdG9taXplZCB0byBjb250cm9sIHdoZW4gdG8gdXBkYXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgc2hvdWxkVXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXMuXG4gICAgICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8gcmVuZGVyIGFuZCBrZWVwIHVwZGF0ZWQgZWxlbWVudCBET00uXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXJcbiAgICAgKiBhbm90aGVyIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVGhlIGZvckVhY2goKSBleHByZXNzaW9uIHdpbGwgb25seSBydW4gd2hlbiBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIGlzXG4gICAgICAgIC8vIGRlZmluZWQsIGFuZCBpdCByZXR1cm5zIHVuZGVmaW5lZCwgc2V0dGluZyBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIHRvXG4gICAgICAgIC8vIHVuZGVmaW5lZFxuICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgJiY9IHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcy5mb3JFYWNoKChwKSA9PiB0aGlzLl9fcHJvcGVydHlUb0F0dHJpYnV0ZShwLCB0aGlzW3BdKSk7XG4gICAgICAgIHRoaXMuX19tYXJrVXBkYXRlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW5ldmVyIHRoZSBlbGVtZW50IGlzIHVwZGF0ZWQuIEltcGxlbWVudCB0byBwZXJmb3JtXG4gICAgICogcG9zdC11cGRhdGluZyB0YXNrcyB2aWEgRE9NIEFQSXMsIGZvciBleGFtcGxlLCBmb2N1c2luZyBhbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpIHsgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBmaXJzdCB1cGRhdGVkLiBJbXBsZW1lbnQgdG8gcGVyZm9ybSBvbmUgdGltZVxuICAgICAqIHdvcmsgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgdXBkYXRlLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBmaXJzdFVwZGF0ZWQoKSB7XG4gICAgICogICB0aGlzLnJlbmRlclJvb3QuZ2V0RWxlbWVudEJ5SWQoJ215LXRleHQtYXJlYScpLmZvY3VzKCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgeyB9XG59XG4vKipcbiAqIE1lbW9pemVkIGxpc3Qgb2YgYWxsIGVsZW1lbnQgc3R5bGVzLlxuICogQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGUgY2xhc3MuXG4gKiBAbm9jb2xsYXBzZVxuICogQGNhdGVnb3J5IHN0eWxlc1xuICovXG5SZWFjdGl2ZUVsZW1lbnQuZWxlbWVudFN0eWxlcyA9IFtdO1xuLyoqXG4gKiBPcHRpb25zIHVzZWQgd2hlbiBjYWxsaW5nIGBhdHRhY2hTaGFkb3dgLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBjdXN0b21pemVcbiAqIHRoZSBvcHRpb25zIGZvciB0aGUgc2hhZG93Um9vdDsgZm9yIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGNsb3NlZFxuICogc2hhZG93Um9vdDogYHttb2RlOiAnY2xvc2VkJ31gLlxuICpcbiAqIE5vdGUsIHRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgaW4gYGNyZWF0ZVJlbmRlclJvb3RgLiBJZiB0aGlzIG1ldGhvZFxuICogaXMgY3VzdG9taXplZCwgb3B0aW9ucyBzaG91bGQgYmUgcmVzcGVjdGVkIGlmIHBvc3NpYmxlLlxuICogQG5vY29sbGFwc2VcbiAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAqL1xuUmVhY3RpdmVFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zID0geyBtb2RlOiAnb3BlbicgfTtcbi8vIEFzc2lnbmVkIGhlcmUgdG8gd29yayBhcm91bmQgYSBqc2NvbXBpbGVyIGJ1ZyB3aXRoIHN0YXRpYyBmaWVsZHNcbi8vIHdoZW4gY29tcGlsaW5nIHRvIEVTNS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMzE3N1xuUmVhY3RpdmVFbGVtZW50W0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgUmVhY3RpdmVFbGVtZW50KV0gPSBuZXcgTWFwKCk7XG5SZWFjdGl2ZUVsZW1lbnRbSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZmluYWxpemVkJywgUmVhY3RpdmVFbGVtZW50KV0gPSBuZXcgTWFwKCk7XG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5wb2x5ZmlsbFN1cHBvcnQ/Lih7IFJlYWN0aXZlRWxlbWVudCB9KTtcbi8vIERldiBtb2RlIHdhcm5pbmdzLi4uXG5pZiAoREVWX01PREUpIHtcbiAgICAvLyBEZWZhdWx0IHdhcm5pbmcgc2V0LlxuICAgIFJlYWN0aXZlRWxlbWVudC5lbmFibGVkV2FybmluZ3MgPSBbXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICBdO1xuICAgIGNvbnN0IGVuc3VyZU93bldhcm5pbmdzID0gZnVuY3Rpb24gKGN0b3IpIHtcbiAgICAgICAgaWYgKCFjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VuYWJsZWRXYXJuaW5ncycsIGN0b3IpKSkge1xuICAgICAgICAgICAgY3Rvci5lbmFibGVkV2FybmluZ3MgPSBjdG9yLmVuYWJsZWRXYXJuaW5ncy5zbGljZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlV2FybmluZyA9IGZ1bmN0aW9uICh3YXJuaW5nKSB7XG4gICAgICAgIGVuc3VyZU93bldhcm5pbmdzKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZFdhcm5pbmdzLmluY2x1ZGVzKHdhcm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZWRXYXJuaW5ncy5wdXNoKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmcgPSBmdW5jdGlvbiAod2FybmluZykge1xuICAgICAgICBlbnN1cmVPd25XYXJuaW5ncyh0aGlzKTtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuZW5hYmxlZFdhcm5pbmdzLmluZGV4T2Yod2FybmluZyk7XG4gICAgICAgIGlmIChpID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIFJlYWN0aXZlRWxlbWVudCB1c2FnZS5cbihnbG9iYWwucmVhY3RpdmVFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCcyLjEuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ211bHRpcGxlLXZlcnNpb25zJywgYE11bHRpcGxlIHZlcnNpb25zIG9mIExpdCBsb2FkZWQuIExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgYCArXG4gICAgICAgICAgICBgaXMgbm90IHJlY29tbWVuZGVkLmApO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3RpdmUtZWxlbWVudC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbi8qKlxuICogVGhlIG1haW4gTGl0RWxlbWVudCBtb2R1bGUsIHdoaWNoIGRlZmluZXMgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYmFzZVxuICogY2xhc3MgYW5kIHJlbGF0ZWQgQVBJcy5cbiAqXG4gKiBMaXRFbGVtZW50IGNvbXBvbmVudHMgY2FuIGRlZmluZSBhIHRlbXBsYXRlIGFuZCBhIHNldCBvZiBvYnNlcnZlZFxuICogcHJvcGVydGllcy4gQ2hhbmdpbmcgYW4gb2JzZXJ2ZWQgcHJvcGVydHkgdHJpZ2dlcnMgYSByZS1yZW5kZXIgb2YgdGhlXG4gKiBlbGVtZW50LlxuICpcbiAqIEltcG9ydCB7QGxpbmtjb2RlIExpdEVsZW1lbnR9IGFuZCB7QGxpbmtjb2RlIGh0bWx9IGZyb20gdGhpcyBtb2R1bGUgdG9cbiAqIGNyZWF0ZSBhIGNvbXBvbmVudDpcbiAqXG4gKiAgYGBganNcbiAqIGltcG9ydCB7TGl0RWxlbWVudCwgaHRtbH0gZnJvbSAnbGl0LWVsZW1lbnQnO1xuICpcbiAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICpcbiAqICAgLy8gRGVjbGFyZSBvYnNlcnZlZCBwcm9wZXJ0aWVzXG4gKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgYWRqZWN0aXZlOiB7fVxuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5hZGplY3RpdmUgPSAnYXdlc29tZSc7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIERlZmluZSB0aGUgZWxlbWVudCdzIHRlbXBsYXRlXG4gKiAgIHJlbmRlcigpIHtcbiAqICAgICByZXR1cm4gaHRtbGA8cD55b3VyICR7YWRqZWN0aXZlfSB0ZW1wbGF0ZSBoZXJlPC9wPmA7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWVsZW1lbnQnLCBNeUVsZW1lbnQpO1xuICogYGBgXG4gKlxuICogYExpdEVsZW1lbnRgIGV4dGVuZHMge0BsaW5rY29kZSBSZWFjdGl2ZUVsZW1lbnR9IGFuZCBhZGRzIGxpdC1odG1sXG4gKiB0ZW1wbGF0aW5nLiBUaGUgYFJlYWN0aXZlRWxlbWVudGAgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHVzZXJzIHRoYXQgd2FudCB0b1xuICogYnVpbGQgdGhlaXIgb3duIGN1c3RvbSBlbGVtZW50IGJhc2UgY2xhc3NlcyB0aGF0IGRvbid0IHVzZSBsaXQtaHRtbC5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuaW1wb3J0IHsgUmVhY3RpdmVFbGVtZW50IH0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcbmltcG9ydCB7IHJlbmRlciwgbm9DaGFuZ2UgfSBmcm9tICdsaXQtaHRtbCc7XG5leHBvcnQgKiBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnbGl0LWh0bWwnO1xuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gKHByb3AsIF9vYmopID0+IHByb3A7XG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5sZXQgaXNzdWVXYXJuaW5nO1xuaWYgKERFVl9NT0RFKSB7XG4gICAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgICAvLyBhcmUgbG9hZGVkLlxuICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuICAgIC8qKlxuICAgICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgICAqL1xuICAgIGlzc3VlV2FybmluZyA9IChjb2RlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMoY29kZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5hZGQod2FybmluZyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlIGVsZW1lbnQgY2xhc3MgdGhhdCBtYW5hZ2VzIGVsZW1lbnQgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcywgYW5kXG4gKiByZW5kZXJzIGEgbGl0LWh0bWwgdGVtcGxhdGUuXG4gKlxuICogVG8gZGVmaW5lIGEgY29tcG9uZW50LCBzdWJjbGFzcyBgTGl0RWxlbWVudGAgYW5kIGltcGxlbWVudCBhXG4gKiBgcmVuZGVyYCBtZXRob2QgdG8gcHJvdmlkZSB0aGUgY29tcG9uZW50J3MgdGVtcGxhdGUuIERlZmluZSBwcm9wZXJ0aWVzXG4gKiB1c2luZyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50LnByb3BlcnRpZXMgcHJvcGVydGllc30gcHJvcGVydHkgb3IgdGhlXG4gKiB7QGxpbmtjb2RlIHByb3BlcnR5fSBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXRFbGVtZW50IGV4dGVuZHMgUmVhY3RpdmVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVuZGVyT3B0aW9ucyA9IHsgaG9zdDogdGhpcyB9O1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICovXG4gICAgY3JlYXRlUmVuZGVyUm9vdCgpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyUm9vdCA9IHN1cGVyLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAgICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgIC8vIHNoYWRvd1Jvb3QgYnkgY3JlYXRlUmVuZGVyUm9vdC4gQWRqdXN0IHRoZSByZW5kZXJCZWZvcmUgbm9kZSBzbyB0aGF0XG4gICAgICAgIC8vIGFueSBzdHlsZXMgaW4gTGl0IGNvbnRlbnQgcmVuZGVyIGJlZm9yZSBhZG9wdGVkU3R5bGVTaGVldHMuIFRoaXMgaXNcbiAgICAgICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgICAgICAvLyB0aGUgc2hhZG93Um9vdC5cbiAgICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLnJlbmRlckJlZm9yZSA/Pz0gcmVuZGVyUm9vdC5maXJzdENoaWxkO1xuICAgICAgICByZXR1cm4gcmVuZGVyUm9vdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZWxlbWVudC4gVGhpcyBtZXRob2QgcmVmbGVjdHMgcHJvcGVydHkgdmFsdWVzIHRvIGF0dHJpYnV0ZXNcbiAgICAgKiBhbmQgY2FsbHMgYHJlbmRlcmAgdG8gcmVuZGVyIERPTSB2aWEgbGl0LWh0bWwuIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGVcbiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAgICogQHBhcmFtIGNoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB1cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gU2V0dGluZyBwcm9wZXJ0aWVzIGluIGByZW5kZXJgIHNob3VsZCBub3QgdHJpZ2dlciBhbiB1cGRhdGUuIFNpbmNlXG4gICAgICAgIC8vIHVwZGF0ZXMgYXJlIGFsbG93ZWQgYWZ0ZXIgc3VwZXIudXBkYXRlLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGByZW5kZXJgXG4gICAgICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGlmICghdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQgPSB0aGlzLmlzQ29ubmVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLnVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQgPSByZW5kZXIodmFsdWUsIHRoaXMucmVuZGVyUm9vdCwgdGhpcy5yZW5kZXJPcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgICAqXG4gICAgICogSW4gYGNvbm5lY3RlZENhbGxiYWNrKClgIHlvdSBzaG91bGQgc2V0dXAgdGFza3MgdGhhdCBzaG91bGQgb25seSBvY2N1ciB3aGVuXG4gICAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAgICogYWRkaW5nIGV2ZW50IGxpc3RlbmVycyB0byBub2RlcyBleHRlcm5hbCB0byB0aGUgZWxlbWVudCwgbGlrZSBhIGtleWRvd25cbiAgICAgKiBldmVudCBoYW5kbGVyIGFkZGVkIHRvIHRoZSB3aW5kb3cuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgKiAgIGFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUeXBpY2FsbHksIGFueXRoaW5nIGRvbmUgaW4gYGNvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBiZSB1bmRvbmUgd2hlbiB0aGVcbiAgICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgICAqXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLl9fY2hpbGRQYXJ0Py5zZXRDb25uZWN0ZWQodHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQncyBET00uXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICAgKiB1c2VkLiBgZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGVuc3VyZSB0aGF0IG5vdGhpbmcgaXMgaG9sZGluZyBhXG4gICAgICogcmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50IChzdWNoIGFzIGV2ZW50IGxpc3RlbmVycyBhZGRlZCB0byBub2RlcyBleHRlcm5hbFxuICAgICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgKiAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICogICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2hhbmRsZUtleWRvd24pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZChmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgb24gZWFjaCB1cGRhdGUgdG8gcGVyZm9ybSByZW5kZXJpbmcgdGFza3MuIFRoaXMgbWV0aG9kIG1heSByZXR1cm5cbiAgICAgKiBhbnkgdmFsdWUgcmVuZGVyYWJsZSBieSBsaXQtaHRtbCdzIGBDaGlsZFBhcnRgIC0gdHlwaWNhbGx5IGFcbiAgICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgICAqIHRoZSBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICovXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gbm9DaGFuZ2U7XG4gICAgfVxufVxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbkxpdEVsZW1lbnRbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG4vKipcbiAqIEVuc3VyZSB0aGlzIGNsYXNzIGlzIG1hcmtlZCBhcyBgZmluYWxpemVkYCBhcyBhbiBvcHRpbWl6YXRpb24gZW5zdXJpbmdcbiAqIGl0IHdpbGwgbm90IG5lZWRsZXNzbHkgdHJ5IHRvIGBmaW5hbGl6ZWAuXG4gKlxuICogTm90ZSB0aGlzIHByb3BlcnR5IG5hbWUgaXMgYSBzdHJpbmcgdG8gcHJldmVudCBicmVha2luZyBDbG9zdXJlIEpTIENvbXBpbGVyXG4gKiBvcHRpbWl6YXRpb25zLiBTZWUgQGxpdC9yZWFjdGl2ZS1lbGVtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5MaXRFbGVtZW50W0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIExpdEVsZW1lbnQpXSA9IHRydWU7XG4vLyBJbnN0YWxsIGh5ZHJhdGlvbiBpZiBhdmFpbGFibGVcbmdsb2JhbC5saXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQ/Lih7IExpdEVsZW1lbnQgfSk7XG4vLyBBcHBseSBwb2x5ZmlsbHMgaWYgYXZhaWxhYmxlXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICAgID8gZ2xvYmFsLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gICAgOiBnbG9iYWwubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcbnBvbHlmaWxsU3VwcG9ydD8uKHsgTGl0RWxlbWVudCB9KTtcbi8qKlxuICogRU5EIFVTRVJTIFNIT1VMRCBOT1QgUkVMWSBPTiBUSElTIE9CSkVDVC5cbiAqXG4gKiBQcml2YXRlIGV4cG9ydHMgZm9yIHVzZSBieSBvdGhlciBMaXQgcGFja2FnZXMsIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGJ5XG4gKiBleHRlcm5hbCB1c2Vycy5cbiAqXG4gKiBXZSBjdXJyZW50bHkgZG8gbm90IG1ha2UgYSBtYW5nbGVkIHJvbGx1cCBidWlsZCBvZiB0aGUgbGl0LXNzciBjb2RlLiBJbiBvcmRlclxuICogdG8ga2VlcCBhIG51bWJlciBvZiAob3RoZXJ3aXNlIHByaXZhdGUpIHRvcC1sZXZlbCBleHBvcnRzICBtYW5nbGVkIGluIHRoZVxuICogY2xpZW50IHNpZGUgY29kZSwgd2UgZXhwb3J0IGEgXyRMRSBvYmplY3QgY29udGFpbmluZyB0aG9zZSBtZW1iZXJzIChvclxuICogaGVscGVyIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBwcml2YXRlIGZpZWxkcyBvZiB0aG9zZSBtZW1iZXJzKSwgYW5kIHRoZW5cbiAqIHJlLWV4cG9ydCB0aGVtIGZvciB1c2UgaW4gbGl0LXNzci4gVGhpcyBrZWVwcyBsaXQtc3NyIGFnbm9zdGljIHRvIHdoZXRoZXIgdGhlXG4gKiBjbGllbnQtc2lkZSBjb2RlIGlzIGJlaW5nIHVzZWQgaW4gYGRldmAgbW9kZSBvciBgcHJvZGAgbW9kZS5cbiAqXG4gKiBUaGlzIGhhcyBhIHVuaXF1ZSBuYW1lLCB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBwcml2YXRlIGV4cG9ydHMgaW5cbiAqIGxpdC1odG1sLCBzaW5jZSB0aGlzIG1vZHVsZSByZS1leHBvcnRzIGFsbCBvZiBsaXQtaHRtbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgXyRMRSA9IHtcbiAgICBfJGF0dHJpYnV0ZVRvUHJvcGVydHk6IChlbCwgbmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIGVsLl8kYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgfSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBfJGNoYW5nZWRQcm9wZXJ0aWVzOiAoZWwpID0+IGVsLl8kY2hhbmdlZFByb3BlcnRpZXMsXG59O1xuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCc0LjIuMScpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdtdWx0aXBsZS12ZXJzaW9ucycsIGBNdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXQgbG9hZGVkLiBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGAgK1xuICAgICAgICAgICAgYGlzIG5vdCByZWNvbW1lbmRlZC5gKTtcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpdC1lbGVtZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgXyRMSCwgfSBmcm9tICcuL2xpdC1odG1sLmpzJztcbmNvbnN0IHsgX0NoaWxkUGFydDogQ2hpbGRQYXJ0IH0gPSBfJExIO1xuY29uc3QgRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggPSB0cnVlO1xuY29uc3Qgd3JhcCA9IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gICAgd2luZG93LlNoYWR5RE9NPy5pblVzZSAmJlxuICAgIHdpbmRvdy5TaGFkeURPTT8ubm9QYXRjaCA9PT0gdHJ1ZVxuICAgID8gd2luZG93LlNoYWR5RE9NLndyYXBcbiAgICA6IChub2RlKSA9PiBub2RlO1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgcHJpbWl0aXZlIHZhbHVlLlxuICpcbiAqIFNlZSBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlb2Ytb3BlcmF0b3JcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPSAnZnVuY3Rpb24nKTtcbmV4cG9ydCBjb25zdCBUZW1wbGF0ZVJlc3VsdFR5cGUgPSB7XG4gICAgSFRNTDogMSxcbiAgICBTVkc6IDIsXG4gICAgTUFUSE1MOiAzLFxufTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIFRlbXBsYXRlUmVzdWx0IG9yIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVGVtcGxhdGVSZXN1bHQgPSAodmFsdWUsIHR5cGUpID0+IHR5cGUgPT09IHVuZGVmaW5lZFxuICAgID8gLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgdmFsdWU/LlsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWRcbiAgICA6IHZhbHVlPy5bJ18kbGl0VHlwZSQnXSA9PT0gdHlwZTtcbi8qKlxuICogVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBpbGVkVGVtcGxhdGVSZXN1bHQgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWU/LlsnXyRsaXRUeXBlJCddPy5oICE9IG51bGw7XG59O1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgRGlyZWN0aXZlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNEaXJlY3RpdmVSZXN1bHQgPSAodmFsdWUpID0+IFxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbnZhbHVlPy5bJ18kbGl0RGlyZWN0aXZlJCddICE9PSB1bmRlZmluZWQ7XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgRGlyZWN0aXZlIGNsYXNzIGZvciBhIERpcmVjdGl2ZVJlc3VsdFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0aXZlQ2xhc3MgPSAodmFsdWUpID0+IFxuLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbnZhbHVlPy5bJ18kbGl0RGlyZWN0aXZlJCddO1xuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgcGFydCBoYXMgb25seSBhIHNpbmdsZS1leHByZXNzaW9uIHdpdGggbm8gc3RyaW5ncyB0b1xuICogaW50ZXJwb2xhdGUgYmV0d2Vlbi5cbiAqXG4gKiBPbmx5IEF0dHJpYnV0ZVBhcnQgYW5kIFByb3BlcnR5UGFydCBjYW4gaGF2ZSBtdWx0aXBsZSBleHByZXNzaW9ucy5cbiAqIE11bHRpLWV4cHJlc3Npb24gcGFydHMgaGF2ZSBhIGBzdHJpbmdzYCBwcm9wZXJ0eSBhbmQgc2luZ2xlLWV4cHJlc3Npb25cbiAqIHBhcnRzIGRvIG5vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzU2luZ2xlRXhwcmVzc2lvbiA9IChwYXJ0KSA9PiBwYXJ0LnN0cmluZ3MgPT09IHVuZGVmaW5lZDtcbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJycpO1xuLyoqXG4gKiBJbnNlcnRzIGEgQ2hpbGRQYXJ0IGludG8gdGhlIGdpdmVuIGNvbnRhaW5lciBDaGlsZFBhcnQncyBET00sIGVpdGhlciBhdCB0aGVcbiAqIGVuZCBvZiB0aGUgY29udGFpbmVyIENoaWxkUGFydCwgb3IgYmVmb3JlIHRoZSBvcHRpb25hbCBgcmVmUGFydGAuXG4gKlxuICogVGhpcyBkb2VzIG5vdCBhZGQgdGhlIHBhcnQgdG8gdGhlIGNvbnRhaW5lclBhcnQncyBjb21taXR0ZWQgdmFsdWUuIFRoYXQgbXVzdFxuICogYmUgZG9uZSBieSBjYWxsZXJzLlxuICpcbiAqIEBwYXJhbSBjb250YWluZXJQYXJ0IFBhcnQgd2l0aGluIHdoaWNoIHRvIGFkZCB0aGUgbmV3IENoaWxkUGFydFxuICogQHBhcmFtIHJlZlBhcnQgUGFydCBiZWZvcmUgd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0OyB3aGVuIG9taXR0ZWQgdGhlXG4gKiAgICAgcGFydCBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBgY29udGFpbmVyUGFydGBcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gaW5zZXJ0LCBvciB1bmRlZmluZWQgdG8gY3JlYXRlIGEgbmV3IHBhcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGluc2VydFBhcnQgPSAoY29udGFpbmVyUGFydCwgcmVmUGFydCwgcGFydCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHdyYXAoY29udGFpbmVyUGFydC5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZTtcbiAgICBjb25zdCByZWZOb2RlID0gcmVmUGFydCA9PT0gdW5kZWZpbmVkID8gY29udGFpbmVyUGFydC5fJGVuZE5vZGUgOiByZWZQYXJ0Ll8kc3RhcnROb2RlO1xuICAgIGlmIChwYXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0gd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgcmVmTm9kZSk7XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCByZWZOb2RlKTtcbiAgICAgICAgcGFydCA9IG5ldyBDaGlsZFBhcnQoc3RhcnROb2RlLCBlbmROb2RlLCBjb250YWluZXJQYXJ0LCBjb250YWluZXJQYXJ0Lm9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZW5kTm9kZSA9IHdyYXAocGFydC5fJGVuZE5vZGUpLm5leHRTaWJsaW5nO1xuICAgICAgICBjb25zdCBvbGRQYXJlbnQgPSBwYXJ0Ll8kcGFyZW50O1xuICAgICAgICBjb25zdCBwYXJlbnRDaGFuZ2VkID0gb2xkUGFyZW50ICE9PSBjb250YWluZXJQYXJ0O1xuICAgICAgICBpZiAocGFyZW50Q2hhbmdlZCkge1xuICAgICAgICAgICAgcGFydC5fJHJlcGFyZW50RGlzY29ubmVjdGFibGVzPy4oY29udGFpbmVyUGFydCk7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgYWx0aG91Z2ggYF8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXNgIHVwZGF0ZXMgdGhlIHBhcnQnc1xuICAgICAgICAgICAgLy8gYF8kcGFyZW50YCByZWZlcmVuY2UgYWZ0ZXIgdW5saW5raW5nIGZyb20gaXRzIGN1cnJlbnQgcGFyZW50LCB0aGF0XG4gICAgICAgICAgICAvLyBtZXRob2Qgb25seSBleGlzdHMgaWYgRGlzY29ubmVjdGFibGVzIGFyZSBwcmVzZW50LCBzbyB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0IGl0IGhlcmVcbiAgICAgICAgICAgIHBhcnQuXyRwYXJlbnQgPSBjb250YWluZXJQYXJ0O1xuICAgICAgICAgICAgLy8gU2luY2UgdGhlIF8kaXNDb25uZWN0ZWQgZ2V0dGVyIGlzIHNvbWV3aGF0IGNvc3RseSwgb25seVxuICAgICAgICAgICAgLy8gcmVhZCBpdCBvbmNlIHdlIGtub3cgdGhlIHN1YnRyZWUgaGFzIGRpcmVjdGl2ZXMgdGhhdCBuZWVkXG4gICAgICAgICAgICAvLyB0byBiZSBub3RpZmllZFxuICAgICAgICAgICAgbGV0IG5ld0Nvbm5lY3Rpb25TdGF0ZTtcbiAgICAgICAgICAgIGlmIChwYXJ0Ll8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIChuZXdDb25uZWN0aW9uU3RhdGUgPSBjb250YWluZXJQYXJ0Ll8kaXNDb25uZWN0ZWQpICE9PVxuICAgICAgICAgICAgICAgICAgICBvbGRQYXJlbnQuXyRpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZChuZXdDb25uZWN0aW9uU3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmROb2RlICE9PSByZWZOb2RlIHx8IHBhcmVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHBhcnQuXyRzdGFydE5vZGU7XG4gICAgICAgICAgICB3aGlsZSAoc3RhcnQgIT09IGVuZE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gd3JhcChzdGFydCkubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgd3JhcChjb250YWluZXIpLmluc2VydEJlZm9yZShzdGFydCwgcmVmTm9kZSk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0O1xufTtcbi8qKlxuICogU2V0cyB0aGUgdmFsdWUgb2YgYSBQYXJ0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gc2V0L3VwZGF0ZSB0aGUgdmFsdWUgb2YgdXNlci1jcmVhdGVkXG4gKiBwYXJ0cyAoaS5lLiB0aG9zZSBjcmVhdGVkIHVzaW5nIGBpbnNlcnRQYXJ0YCk7IGl0IHNob3VsZCBub3QgYmUgdXNlZFxuICogYnkgZGlyZWN0aXZlcyB0byBzZXQgdGhlIHZhbHVlIG9mIHRoZSBkaXJlY3RpdmUncyBjb250YWluZXIgcGFydC4gRGlyZWN0aXZlc1xuICogc2hvdWxkIHJldHVybiBhIHZhbHVlIGZyb20gYHVwZGF0ZWAvYHJlbmRlcmAgdG8gdXBkYXRlIHRoZWlyIHBhcnQgc3RhdGUuXG4gKlxuICogRm9yIGRpcmVjdGl2ZXMgdGhhdCByZXF1aXJlIHNldHRpbmcgdGhlaXIgcGFydCB2YWx1ZSBhc3luY2hyb25vdXNseSwgdGhleVxuICogc2hvdWxkIGV4dGVuZCBgQXN5bmNEaXJlY3RpdmVgIGFuZCBjYWxsIGB0aGlzLnNldFZhbHVlKClgLlxuICpcbiAqIEBwYXJhbSBwYXJ0IFBhcnQgdG8gc2V0XG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0XG4gKiBAcGFyYW0gaW5kZXggRm9yIGBBdHRyaWJ1dGVQYXJ0YHMsIHRoZSBpbmRleCB0byBzZXRcbiAqIEBwYXJhbSBkaXJlY3RpdmVQYXJlbnQgVXNlZCBpbnRlcm5hbGx5OyBzaG91bGQgbm90IGJlIHNldCBieSB1c2VyXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDaGlsZFBhcnRWYWx1ZSA9IChwYXJ0LCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50ID0gcGFydCkgPT4ge1xuICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgZGlyZWN0aXZlUGFyZW50KTtcbiAgICByZXR1cm4gcGFydDtcbn07XG4vLyBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgY2FuIG5ldmVyIGFwcGVhciBhcyBhIHBhcnQgdmFsdWUgZXhjZXB0IHdoZW4gc2V0IGJ5XG4vLyBsaXZlKCkuIFVzZWQgdG8gZm9yY2UgYSBkaXJ0eS1jaGVjayB0byBmYWlsIGFuZCBjYXVzZSBhIHJlLXJlbmRlci5cbmNvbnN0IFJFU0VUX1ZBTFVFID0ge307XG4vKipcbiAqIFNldHMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydCBkaXJlY3RseSB3aXRob3V0IHRyaWdnZXJpbmcgdGhlXG4gKiBjb21taXQgc3RhZ2Ugb2YgdGhlIHBhcnQuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgYSBkaXJlY3RpdmUgbmVlZHMgdG8gdXBkYXRlIHRoZSBwYXJ0IHN1Y2hcbiAqIHRoYXQgdGhlIG5leHQgdXBkYXRlIGRldGVjdHMgYSB2YWx1ZSBjaGFuZ2Ugb3Igbm90LiBXaGVuIHZhbHVlIGlzIG9taXR0ZWQsXG4gKiB0aGUgbmV4dCB1cGRhdGUgd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIGRldGVjdGVkIGFzIGEgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENvbW1pdHRlZFZhbHVlID0gKHBhcnQsIHZhbHVlID0gUkVTRVRfVkFMVUUpID0+IChwYXJ0Ll8kY29tbWl0dGVkVmFsdWUgPSB2YWx1ZSk7XG4vKipcbiAqIFJldHVybnMgdGhlIGNvbW1pdHRlZCB2YWx1ZSBvZiBhIENoaWxkUGFydC5cbiAqXG4gKiBUaGUgY29tbWl0dGVkIHZhbHVlIGlzIHVzZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGVmZmljaWVudCB1cGRhdGVzIG9mXG4gKiB0aGUgcGFydC4gSXQgY2FuIGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHRlbXBsYXRlIG9yIGRpcmVjdGl2ZSBpblxuICogY2FzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIHZhbHVlIGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBjb21taXR0ZWQuXG4gKlxuICogLSBgVGVtcGxhdGVSZXN1bHRgcyBhcmUgY29tbWl0dGVkIGFzIGEgYFRlbXBsYXRlSW5zdGFuY2VgXG4gKiAtIEl0ZXJhYmxlcyBhcmUgY29tbWl0dGVkIGFzIGBBcnJheTxDaGlsZFBhcnQ+YFxuICogLSBBbGwgb3RoZXIgdHlwZXMgYXJlIGNvbW1pdHRlZCBhcyB0aGUgdGVtcGxhdGUgdmFsdWUgb3IgdmFsdWUgcmV0dXJuZWQgb3JcbiAqICAgc2V0IGJ5IGEgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBwYXJ0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb21taXR0ZWRWYWx1ZSA9IChwYXJ0KSA9PiBwYXJ0Ll8kY29tbWl0dGVkVmFsdWU7XG4vKipcbiAqIFJlbW92ZXMgYSBDaGlsZFBhcnQgZnJvbSB0aGUgRE9NLCBpbmNsdWRpbmcgYW55IG9mIGl0cyBjb250ZW50IGFuZCBtYXJrZXJzLlxuICpcbiAqIE5vdGU6IFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBjbGVhclBhcnQoKSBpcyB0aGF0IHRoaXMgYWxzb1xuICogcmVtb3ZlcyB0aGUgcGFydCdzIHN0YXJ0IG5vZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgQ2hpbGRQYXJ0IG11c3Qgb3duIGl0c1xuICogc3RhcnQgbm9kZSwgaWUgaXQgbXVzdCBiZSBhIG1hcmtlciBub2RlIHNwZWNpZmljYWxseSBmb3IgdGhpcyBwYXJ0IGFuZCBub3QgYW5cbiAqIGFuY2hvciBmcm9tIHN1cnJvdW5kaW5nIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcnQgVGhlIFBhcnQgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVQYXJ0ID0gKHBhcnQpID0+IHtcbiAgICBwYXJ0Ll8kY2xlYXIoKTtcbiAgICBwYXJ0Ll8kc3RhcnROb2RlLnJlbW92ZSgpO1xufTtcbmV4cG9ydCBjb25zdCBjbGVhclBhcnQgPSAocGFydCkgPT4ge1xuICAgIHBhcnQuXyRjbGVhcigpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpcmVjdGl2ZS1oZWxwZXJzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHsgaXNTaW5nbGVFeHByZXNzaW9uIH0gZnJvbSAnLi9kaXJlY3RpdmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIFBhcnRUeXBlIH0gZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmUuanMnO1xuY29uc3QgREVWX01PREUgPSB0cnVlO1xuLyoqXG4gKiBSZWN1cnNpdmVseSB3YWxrcyBkb3duIHRoZSB0cmVlIG9mIFBhcnRzL1RlbXBsYXRlSW5zdGFuY2VzL0RpcmVjdGl2ZXMgdG8gc2V0XG4gKiB0aGUgY29ubmVjdGVkIHN0YXRlIG9mIGRpcmVjdGl2ZXMgYW5kIHJ1biBgZGlzY29ubmVjdGVkYC8gYHJlY29ubmVjdGVkYFxuICogY2FsbGJhY2tzLlxuICpcbiAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSB3ZXJlIGNoaWxkcmVuIHRvIGRpc2Nvbm5lY3Q7IGZhbHNlIG90aGVyd2lzZVxuICovXG5jb25zdCBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQgPSAocGFyZW50LCBpc0Nvbm5lY3RlZCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb2JqIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIC8vIFRoZSBleGlzdGVuY2Ugb2YgYF8kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWRgIGlzIHVzZWQgYXMgYSBcImJyYW5kXCIgdG9cbiAgICAgICAgLy8gZGlzYW1iaWd1YXRlIEFzeW5jRGlyZWN0aXZlcyBmcm9tIG90aGVyIERpc2Nvbm5lY3RhYmxlQ2hpbGRyZW5cbiAgICAgICAgLy8gKGFzIG9wcG9zZWQgdG8gdXNpbmcgYW4gaW5zdGFuY2VvZiBjaGVjayB0byBrbm93IHdoZW4gdG8gY2FsbCBpdCk7IHRoZVxuICAgICAgICAvLyByZWR1bmRhbmN5IG9mIFwiRGlyZWN0aXZlXCIgaW4gdGhlIEFQSSBuYW1lIGlzIHRvIGF2b2lkIGNvbmZsaWN0aW5nIHdpdGhcbiAgICAgICAgLy8gYF8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWRgLCB3aGljaCBleGlzdHMgYENoaWxkUGFydHNgIHdoaWNoIGFyZSBhbHNvIGluXG4gICAgICAgIC8vIHRoaXMgbGlzdFxuICAgICAgICAvLyBEaXNjb25uZWN0IERpcmVjdGl2ZSAoYW5kIGFueSBuZXN0ZWQgZGlyZWN0aXZlcyBjb250YWluZWQgd2l0aGluKVxuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICBvYmpbJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8uKGlzQ29ubmVjdGVkLCBmYWxzZSk7XG4gICAgICAgIC8vIERpc2Nvbm5lY3QgUGFydC9UZW1wbGF0ZUluc3RhbmNlXG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZChvYmosIGlzQ29ubmVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBjaGlsZCBmcm9tIGl0cyBwYXJlbnQgbGlzdCBvZiBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiwgYW5kXG4gKiBpZiB0aGUgcGFyZW50IGxpc3QgYmVjb21lcyBlbXB0eSBhcyBhIHJlc3VsdCwgcmVtb3ZlcyB0aGUgcGFyZW50IGZyb20gaXRzXG4gKiBwYXJlbnQsIGFuZCBzbyBmb3J0aCB1cCB0aGUgdHJlZSB3aGVuIHRoYXQgY2F1c2VzIHN1YnNlcXVlbnQgcGFyZW50IGxpc3RzIHRvXG4gKiBiZWNvbWUgZW1wdHkuXG4gKi9cbmNvbnN0IHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCA9IChvYmopID0+IHtcbiAgICBsZXQgcGFyZW50LCBjaGlsZHJlbjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgocGFyZW50ID0gb2JqLl8kcGFyZW50KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgICAgIGNoaWxkcmVuLmRlbGV0ZShvYmopO1xuICAgICAgICBvYmogPSBwYXJlbnQ7XG4gICAgfSB3aGlsZSAoY2hpbGRyZW4/LnNpemUgPT09IDApO1xufTtcbmNvbnN0IGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQgPSAob2JqKSA9PiB7XG4gICAgLy8gQ2xpbWIgdGhlIHBhcmVudCB0cmVlLCBjcmVhdGluZyBhIHNwYXJzZSB0cmVlIG9mIGNoaWxkcmVuIG5lZWRpbmdcbiAgICAvLyBkaXNjb25uZWN0aW9uXG4gICAgZm9yIChsZXQgcGFyZW50OyAocGFyZW50ID0gb2JqLl8kcGFyZW50KTsgb2JqID0gcGFyZW50KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgcmVhY2hlZCBhIHBhcmVudCB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhpcyBjaGlsZCwgd2VcbiAgICAgICAgICAgIC8vIGNhbiBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5hZGQob2JqKTtcbiAgICAgICAgaW5zdGFsbERpc2Nvbm5lY3RBUEkocGFyZW50KTtcbiAgICB9XG59O1xuLyoqXG4gKiBDaGFuZ2VzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBDaGlsZFBhcnQsIGFuZCB1cGRhdGVzIHRoZSBzcGFyc2UgdHJlZSBvZlxuICogRGlzY29ubmVjdGFibGUgY2hpbGRyZW4gYWNjb3JkaW5nbHkuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb21cbiAqIHRoZSBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgbW92ZWQgYmV0d2VlbiBkaWZmZXJlbnQgcGFyZW50cy5cbiAqL1xuZnVuY3Rpb24gcmVwYXJlbnREaXNjb25uZWN0YWJsZXMobmV3UGFyZW50KSB7XG4gICAgaWYgKHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICAgICAgICBhZGREaXNjb25uZWN0YWJsZVRvUGFyZW50KHRoaXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IG5ld1BhcmVudDtcbiAgICB9XG59XG4vKipcbiAqIFNldHMgdGhlIGNvbm5lY3RlZCBzdGF0ZSBvbiBhbnkgZGlyZWN0aXZlcyBjb250YWluZWQgd2l0aGluIHRoZSBjb21taXR0ZWRcbiAqIHZhbHVlIG9mIHRoaXMgcGFydCAoaS5lLiB3aXRoaW4gYSBUZW1wbGF0ZUluc3RhbmNlIG9yIGl0ZXJhYmxlIG9mXG4gKiBDaGlsZFBhcnRzKSBhbmQgcnVucyB0aGVpciBgZGlzY29ubmVjdGVkYC9gcmVjb25uZWN0ZWRgcywgYXMgd2VsbCBhcyB3aXRoaW5cbiAqIGFueSBkaXJlY3RpdmVzIHN0b3JlZCBvbiB0aGUgQ2hpbGRQYXJ0ICh3aGVuIGB2YWx1ZU9ubHlgIGlzIGZhbHNlKS5cbiAqXG4gKiBgaXNDbGVhcmluZ1ZhbHVlYCBzaG91bGQgYmUgcGFzc2VkIGFzIGB0cnVlYCBvbiBhIHRvcC1sZXZlbCBwYXJ0IHRoYXQgaXNcbiAqIGNsZWFyaW5nIGl0c2VsZiwgYW5kIG5vdCBhcyBhIHJlc3VsdCBvZiByZWN1cnNpdmVseSBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXNcbiAqIGFzIHBhcnQgb2YgYSBgY2xlYXJgIG9wZXJhdGlvbiBoaWdoZXIgdXAgdGhlIHRyZWUuIFRoaXMgYm90aCBlbnN1cmVzIHRoYXQgYW55XG4gKiBkaXJlY3RpdmUgb24gdGhpcyBDaGlsZFBhcnQgdGhhdCBwcm9kdWNlZCBhIHZhbHVlIHRoYXQgY2F1c2VkIHRoZSBjbGVhclxuICogb3BlcmF0aW9uIGlzIG5vdCBkaXNjb25uZWN0ZWQsIGFuZCBhbHNvIHNlcnZlcyBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICogdG8gYXZvaWQgbmVlZGxlc3MgYm9va2tlZXBpbmcgd2hlbiBhIHN1YnRyZWUgaXMgZ29pbmcgYXdheTsgd2hlbiBjbGVhcmluZyBhXG4gKiBzdWJ0cmVlLCBvbmx5IHRoZSB0b3AtbW9zdCBwYXJ0IG5lZWQgdG8gcmVtb3ZlIGl0c2VsZiBmcm9tIHRoZSBwYXJlbnQuXG4gKlxuICogYGZyb21QYXJ0SW5kZXhgIGlzIHBhc3NlZCBvbmx5IGluIHRoZSBjYXNlIG9mIGEgcGFydGlhbCBgX2NsZWFyYCBydW5uaW5nIGFzIGFcbiAqIHJlc3VsdCBvZiB0cnVuY2F0aW5nIGFuIGl0ZXJhYmxlLlxuICpcbiAqIE5vdGUsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydCBpbnN0YW5jZXMgYW5kIGNhbGxlZCBmcm9tIHRoZVxuICogY29yZSBjb2RlIHdoZW4gcGFydHMgYXJlIGNsZWFyZWQgb3IgdGhlIGNvbm5lY3Rpb24gc3RhdGUgaXMgY2hhbmdlZCBieSB0aGVcbiAqIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIG5vdGlmeUNoaWxkUGFydENvbm5lY3RlZENoYW5nZWQoaXNDb25uZWN0ZWQsIGlzQ2xlYXJpbmdWYWx1ZSA9IGZhbHNlLCBmcm9tUGFydEluZGV4ID0gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW47XG4gICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgY2hpbGRyZW4uc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0NsZWFyaW5nVmFsdWUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBJdGVyYWJsZSBjYXNlOiBBbnkgQ2hpbGRQYXJ0cyBjcmVhdGVkIGJ5IHRoZSBpdGVyYWJsZSBzaG91bGQgYmVcbiAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGVcbiAgICAgICAgICAgIC8vIGNoaWxkcmVuIChzdGFydGluZyBhdCBgZnJvbVBhcnRJbmRleGAgaW4gdGhlIGNhc2Ugb2YgdHJ1bmNhdGlvbilcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBmcm9tUGFydEluZGV4OyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWVbaV0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodmFsdWVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRlbXBsYXRlSW5zdGFuY2UgY2FzZTogSWYgdGhlIHZhbHVlIGhhcyBkaXNjb25uZWN0YWJsZSBjaGlsZHJlbiAod2lsbFxuICAgICAgICAgICAgLy8gb25seSBiZSBpbiB0aGUgY2FzZSB0aGF0IGl0IGlzIGEgVGVtcGxhdGVJbnN0YW5jZSksIHdlIGRpc2Nvbm5lY3QgaXRcbiAgICAgICAgICAgIC8vIGFuZCByZW1vdmUgaXQgZnJvbSB0aGlzIENoaWxkUGFydCdzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuXG4gICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh0aGlzLCBpc0Nvbm5lY3RlZCk7XG4gICAgfVxufVxuLyoqXG4gKiBQYXRjaGVzIGRpc2Nvbm5lY3Rpb24gQVBJIG9udG8gQ2hpbGRQYXJ0cy5cbiAqL1xuY29uc3QgaW5zdGFsbERpc2Nvbm5lY3RBUEkgPSAob2JqKSA9PiB7XG4gICAgaWYgKG9iai50eXBlID09IFBhcnRUeXBlLkNISUxEKSB7XG4gICAgICAgIG9iai5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkID8/PVxuICAgICAgICAgICAgbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZDtcbiAgICAgICAgb2JqLl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMgPz89IHJlcGFyZW50RGlzY29ubmVjdGFibGVzO1xuICAgIH1cbn07XG4vKipcbiAqIEFuIGFic3RyYWN0IGBEaXJlY3RpdmVgIGJhc2UgY2xhc3Mgd2hvc2UgYGRpc2Nvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmVcbiAqIGNhbGxlZCB3aGVuIHRoZSBwYXJ0IGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSBpcyBjbGVhcmVkIGFzIGEgcmVzdWx0IG9mXG4gKiByZS1yZW5kZXJpbmcsIG9yIHdoZW4gdGhlIHVzZXIgY2FsbHMgYHBhcnQuc2V0Q29ubmVjdGVkKGZhbHNlKWAgb25cbiAqIGEgcGFydCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZSAoYXMgaGFwcGVuc1xuICogd2hlbiBlLmcuIGEgTGl0RWxlbWVudCBkaXNjb25uZWN0cyBmcm9tIHRoZSBET00pLlxuICpcbiAqIElmIGBwYXJ0LnNldENvbm5lY3RlZCh0cnVlKWAgaXMgc3Vic2VxdWVudGx5IGNhbGxlZCBvbiBhXG4gKiBjb250YWluaW5nIHBhcnQsIHRoZSBkaXJlY3RpdmUncyBgcmVjb25uZWN0ZWRgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBwcmlvclxuICogdG8gaXRzIG5leHQgYHVwZGF0ZWAvYHJlbmRlcmAgY2FsbGJhY2tzLiBXaGVuIGltcGxlbWVudGluZyBgZGlzY29ubmVjdGVkYCxcbiAqIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHJlY29ubmVjdGlvbi5cbiAqXG4gKiBOb3RlIHRoYXQgdXBkYXRlcyBtYXkgb2NjdXIgd2hpbGUgdGhlIGRpcmVjdGl2ZSBpcyBkaXNjb25uZWN0ZWQuIEFzIHN1Y2gsXG4gKiBkaXJlY3RpdmVzIHNob3VsZCBnZW5lcmFsbHkgY2hlY2sgdGhlIGB0aGlzLmlzQ29ubmVjdGVkYCBmbGFnIGR1cmluZ1xuICogcmVuZGVyL3VwZGF0ZSB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBzYWZlIHRvIHN1YnNjcmliZSB0byByZXNvdXJjZXNcbiAqIHRoYXQgbWF5IHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNEaXJlY3RpdmUgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyBAaW50ZXJuYWxcbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIHBhcnQgd2l0aCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgKiBAcGFyYW0gcGFydFxuICAgICAqIEBwYXJhbSBwYXJlbnRcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlSW5kZXhcbiAgICAgKi9cbiAgICBfJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCkge1xuICAgICAgICBzdXBlci5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBwYXJ0Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGZyb20gdGhlIGNvcmUgY29kZSB3aGVuIGEgZGlyZWN0aXZlIGlzIGdvaW5nIGF3YXkgZnJvbSBhIHBhcnQgKGluXG4gICAgICogd2hpY2ggY2FzZSBgc2hvdWxkUmVtb3ZlRnJvbVBhcmVudGAgc2hvdWxkIGJlIHRydWUpLCBhbmQgZnJvbSB0aGVcbiAgICAgKiBgc2V0Q2hpbGRyZW5Db25uZWN0ZWRgIGhlbHBlciBmdW5jdGlvbiB3aGVuIHJlY3Vyc2l2ZWx5IGNoYW5naW5nIHRoZVxuICAgICAqIGNvbm5lY3Rpb24gc3RhdGUgb2YgYSB0cmVlIChpbiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGRcbiAgICAgKiBiZSBmYWxzZSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNDb25uZWN0ZWRcbiAgICAgKiBAcGFyYW0gaXNDbGVhcmluZ0RpcmVjdGl2ZSAtIFRydWUgd2hlbiB0aGUgZGlyZWN0aXZlIGl0c2VsZiBpcyBiZWluZ1xuICAgICAqICAgICByZW1vdmVkOyBmYWxzZSB3aGVuIHRoZSB0cmVlIGlzIGJlaW5nIGRpc2Nvbm5lY3RlZFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddKGlzQ29ubmVjdGVkLCBpc0NsZWFyaW5nRGlyZWN0aXZlID0gdHJ1ZSkge1xuICAgICAgICBpZiAoaXNDb25uZWN0ZWQgIT09IHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQgPSBpc0Nvbm5lY3RlZDtcbiAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0ZWQ/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQ/LigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NsZWFyaW5nRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICBub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQodGhpcywgaXNDb25uZWN0ZWQpO1xuICAgICAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBkaXJlY3RpdmUncyBQYXJ0IG91dHNpZGUgdGhlIG5vcm1hbCBgdXBkYXRlYC9gcmVuZGVyYFxuICAgICAqIGxpZmVjeWNsZSBvZiBhIGRpcmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgZnJvbSBhIGRpcmVjdGl2ZSdzIGB1cGRhdGVgXG4gICAgICogb3IgYHJlbmRlcmAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyZWN0aXZlIFRoZSBkaXJlY3RpdmUgdG8gdXBkYXRlXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXRcbiAgICAgKi9cbiAgICBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTaW5nbGVFeHByZXNzaW9uKHRoaXMuX19wYXJ0KSkge1xuICAgICAgICAgICAgdGhpcy5fX3BhcnQuXyRzZXRWYWx1ZSh2YWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9fYXR0cmlidXRlSW5kZXggd2lsbCBiZSBkZWZpbmVkIGluIHRoaXMgY2FzZSwgYnV0XG4gICAgICAgICAgICAvLyBhc3NlcnQgaXQgaW4gZGV2IG1vZGVcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLl9fYXR0cmlidXRlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGhpcy5fX2F0dHJpYnV0ZUluZGV4IHRvIGJlIGEgbnVtYmVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBbLi4udGhpcy5fX3BhcnQuXyRjb21taXR0ZWRWYWx1ZV07XG4gICAgICAgICAgICBuZXdWYWx1ZXNbdGhpcy5fX2F0dHJpYnV0ZUluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fX3BhcnQuXyRzZXRWYWx1ZShuZXdWYWx1ZXMsIHRoaXMsIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZXIgY2FsbGJhY2tzIGZvciBpbXBsZW1lbnRpbmcgbG9naWMgdG8gcmVsZWFzZSBhbnkgcmVzb3VyY2VzL3N1YnNjcmlwdGlvbnNcbiAgICAgKiB0aGF0IG1heSBoYXZlIGJlZW4gcmV0YWluZWQgYnkgdGhpcyBkaXJlY3RpdmUuIFNpbmNlIGRpcmVjdGl2ZXMgbWF5IGFsc28gYmVcbiAgICAgKiByZS1jb25uZWN0ZWQsIGByZWNvbm5lY3RlZGAgc2hvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcmVzdG9yZSB0aGVcbiAgICAgKiB3b3JraW5nIHN0YXRlIG9mIHRoZSBkaXJlY3RpdmUgcHJpb3IgdG8gdGhlIG5leHQgcmVuZGVyLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3RlZCgpIHsgfVxuICAgIHJlY29ubmVjdGVkKCkgeyB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3luYy1kaXJlY3RpdmUuanMubWFwIiwiaW1wb3J0IHsgaHRtbCwgcmVuZGVyIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgaGF1bnRlZCBmcm9tIFwiLi9jb3JlXCI7XG5pbXBvcnQgeyBtYWtlVmlydHVhbCB9IGZyb20gXCIuL3ZpcnR1YWxcIjtcbmNvbnN0IHsgY29tcG9uZW50LCBjcmVhdGVDb250ZXh0IH0gPSBoYXVudGVkKHsgcmVuZGVyIH0pO1xuY29uc3QgdmlydHVhbCA9IG1ha2VWaXJ0dWFsKCk7XG5leHBvcnQgeyBjb21wb25lbnQsIGNyZWF0ZUNvbnRleHQsIHZpcnR1YWwsIGh0bWwsIHJlbmRlciB9O1xuIiwiaW1wb3J0IHsgbWFrZUNvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgbWFrZUNvbnRleHQgfSBmcm9tIFwiLi9jcmVhdGUtY29udGV4dFwiO1xuZnVuY3Rpb24gaGF1bnRlZCh7IHJlbmRlciB9KSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbWFrZUNvbXBvbmVudChyZW5kZXIpO1xuICAgIGNvbnN0IGNyZWF0ZUNvbnRleHQgPSBtYWtlQ29udGV4dChjb21wb25lbnQpO1xuICAgIHJldHVybiB7IGNvbXBvbmVudCwgY3JlYXRlQ29udGV4dCB9O1xufVxuZXhwb3J0IHsgaGF1bnRlZCBhcyBkZWZhdWx0LCB9O1xuZXhwb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tIFwiLi91c2UtY2FsbGJhY2tcIjtcbmV4cG9ydCB7IHVzZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi91c2UtY29udHJvbGxlclwiO1xuZXhwb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcIi4vdXNlLWVmZmVjdFwiO1xuZXhwb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH0gZnJvbSBcIi4vdXNlLWxheW91dC1lZmZlY3RcIjtcbmV4cG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcIi4vdXNlLXN0YXRlXCI7XG5leHBvcnQgeyB1c2VSZWR1Y2VyIH0gZnJvbSBcIi4vdXNlLXJlZHVjZXJcIjtcbmV4cG9ydCB7IHVzZU1lbW8gfSBmcm9tIFwiLi91c2UtbWVtb1wiO1xuZXhwb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCIuL3VzZS1jb250ZXh0XCI7XG5leHBvcnQgeyB1c2VSZWYgfSBmcm9tIFwiLi91c2UtcmVmXCI7XG5leHBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuZXhwb3J0IHsgQmFzZVNjaGVkdWxlciB9IGZyb20gXCIuL3NjaGVkdWxlclwiO1xuZXhwb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuIiwiaW1wb3J0IHsgY29udGV4dEV2ZW50IH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuaW1wb3J0IHsgdXNlQ29udGV4dCB9IGZyb20gXCIuL3VzZS1jb250ZXh0XCI7XG5mdW5jdGlvbiBtYWtlQ29udGV4dChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gKGRlZmF1bHRWYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBDb250ZXh0ID0ge1xuICAgICAgICAgICAgUHJvdmlkZXI6IGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVycztcbiAgICAgICAgICAgICAgICBfdmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoY29udGV4dEV2ZW50LCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjb250ZXh0RXZlbnQsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWwuQ29udGV4dCA9PT0gQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbC51bnN1YnNjcmliZSA9IHRoaXMudW5zdWJzY3JpYmUuYmluZCh0aGlzLCBkZXRhaWwuY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGRldGFpbC5jYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgdGhpcy5saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQ29uc3VtZXI6IGNvbXBvbmVudChmdW5jdGlvbiAoeyByZW5kZXIgfSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbnRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSksXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBDb250ZXh0O1xuICAgIH07XG59XG5leHBvcnQgeyBtYWtlQ29udGV4dCB9O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyBub3RoaW5nIH0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHsgZGlyZWN0aXZlLCBBc3luY0RpcmVjdGl2ZSB9IGZyb20gJy4uL2FzeW5jLWRpcmVjdGl2ZS5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUmVmIG9iamVjdCwgd2hpY2ggaXMgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmID0gKCkgPT4gbmV3IFJlZigpO1xuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBob2xkcyBhIHJlZiB2YWx1ZS5cbiAqL1xuY2xhc3MgUmVmIHtcbn1cbi8vIFdoZW4gY2FsbGJhY2tzIGFyZSB1c2VkIGZvciByZWZzLCB0aGlzIG1hcCB0cmFja3MgdGhlIGxhc3QgdmFsdWUgdGhlIGNhbGxiYWNrXG4vLyB3YXMgY2FsbGVkIHdpdGgsIGZvciBlbnN1cmluZyBhIGRpcmVjdGl2ZSBkb2Vzbid0IGNsZWFyIHRoZSByZWYgaWYgdGhlIHJlZlxuLy8gaGFzIGFscmVhZHkgYmVlbiByZW5kZXJlZCB0byBhIG5ldyBzcG90LiBJdCBpcyBkb3VibGUta2V5ZWQgb24gYm90aCB0aGVcbi8vIGNvbnRleHQgKGBvcHRpb25zLmhvc3RgKSBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhdXRvLWJpbmQgY2xhc3MgbWV0aG9kc1xuLy8gdG8gYG9wdGlvbnMuaG9zdGAuXG5jb25zdCBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG5jbGFzcyBSZWZEaXJlY3RpdmUgZXh0ZW5kcyBBc3luY0RpcmVjdGl2ZSB7XG4gICAgcmVuZGVyKF9yZWYpIHtcbiAgICAgICAgcmV0dXJuIG5vdGhpbmc7XG4gICAgfVxuICAgIHVwZGF0ZShwYXJ0LCBbcmVmXSkge1xuICAgICAgICBjb25zdCByZWZDaGFuZ2VkID0gcmVmICE9PSB0aGlzLl9yZWY7XG4gICAgICAgIGlmIChyZWZDaGFuZ2VkICYmIHRoaXMuX3JlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBUaGUgcmVmIHBhc3NlZCB0byB0aGUgZGlyZWN0aXZlIGhhcyBjaGFuZ2VkO1xuICAgICAgICAgICAgLy8gdW5zZXQgdGhlIHByZXZpb3VzIHJlZidzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWZDaGFuZ2VkIHx8IHRoaXMuX2xhc3RFbGVtZW50Rm9yUmVmICE9PSB0aGlzLl9lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBXZSBlaXRoZXIgZ290IGEgbmV3IHJlZiBvciB0aGlzIGlzIHRoZSBmaXJzdCByZW5kZXI7XG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgcmVmL2VsZW1lbnQgJiB1cGRhdGUgdGhlIHJlZiB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5fcmVmID0gcmVmO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IHBhcnQub3B0aW9ucz8uaG9zdDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKCh0aGlzLl9lbGVtZW50ID0gcGFydC5lbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vdGhpbmc7XG4gICAgfVxuICAgIF91cGRhdGVSZWZWYWx1ZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3JlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcmVmIHdhcyBjYWxsZWQgd2l0aCBhIHByZXZpb3VzIHZhbHVlLCBjYWxsIHdpdGhcbiAgICAgICAgICAgIC8vIGB1bmRlZmluZWRgOyBXZSBkbyB0aGlzIHRvIGVuc3VyZSBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiBhIGNvbnNpc3RlbnRcbiAgICAgICAgICAgIC8vIHdheSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSByZWYgbWlnaHQgYmUgbW92aW5nIHVwIGluIHRoZSB0cmVlIChpblxuICAgICAgICAgICAgLy8gd2hpY2ggY2FzZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyB2YWx1ZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyBwcmV2aW91cyBvbmUgdW5zZXRzIGl0KSBhbmQgZG93biBpbiB0aGUgdHJlZSAod2hlcmUgaXQgd291bGQgYmUgdW5zZXRcbiAgICAgICAgICAgIC8vIGJlZm9yZSBiZWluZyBzZXQpLiBOb3RlIHRoYXQgZWxlbWVudCBsb29rdXAgaXMga2V5ZWQgYnlcbiAgICAgICAgICAgIC8vIGJvdGggdGhlIGNvbnRleHQgYW5kIHRoZSBjYWxsYmFjaywgc2luY2Ugd2UgYWxsb3cgcGFzc2luZyB1bmJvdW5kXG4gICAgICAgICAgICAvLyBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIG9uIG9wdGlvbnMuaG9zdCwgYW5kIHdlIHdhbnQgdG8gdHJlYXRcbiAgICAgICAgICAgIC8vIHRoZXNlIGFzIHVuaXF1ZSBcImluc3RhbmNlc1wiIG9mIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fY29udGV4dCA/PyBnbG9iYWxUaGlzO1xuICAgICAgICAgICAgbGV0IGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2sgPSBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjay5nZXQoY29udGV4dCk7XG4gICAgICAgICAgICBpZiAobGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2suc2V0KGNvbnRleHQsIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suZ2V0KHRoaXMuX3JlZikgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlZi5jYWxsKHRoaXMuX2NvbnRleHQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0RWxlbWVudEZvckNhbGxiYWNrLnNldCh0aGlzLl9yZWYsIGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVmIHdpdGggdGhlIG5ldyBlbGVtZW50IHZhbHVlXG4gICAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYudmFsdWUgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBfbGFzdEVsZW1lbnRGb3JSZWYoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrXG4gICAgICAgICAgICAgICAgLmdldCh0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXMpXG4gICAgICAgICAgICAgICAgPy5nZXQodGhpcy5fcmVmKVxuICAgICAgICAgICAgOiB0aGlzLl9yZWY/LnZhbHVlO1xuICAgIH1cbiAgICBkaXNjb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGJveCBpZiBvdXIgZWxlbWVudCBpcyBzdGlsbCB0aGUgb25lIGluIGl0IChpLmUuIGFub3RoZXJcbiAgICAgICAgLy8gZGlyZWN0aXZlIGluc3RhbmNlIGhhc24ndCByZW5kZXJlZCBpdHMgZWxlbWVudCB0byBpdCBiZWZvcmUgdXMpOyB0aGF0XG4gICAgICAgIC8vIG9ubHkgaGFwcGVucyBpbiB0aGUgZXZlbnQgb2YgdGhlIGRpcmVjdGl2ZSBiZWluZyBjbGVhcmVkIChub3QgdmlhIG1hbnVhbFxuICAgICAgICAvLyBkaXNjb25uZWN0aW9uKVxuICAgICAgICBpZiAodGhpcy5fbGFzdEVsZW1lbnRGb3JSZWYgPT09IHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVjb25uZWN0ZWQoKSB7XG4gICAgICAgIC8vIElmIHdlIHdlcmUgbWFudWFsbHkgZGlzY29ubmVjdGVkLCB3ZSBjYW4gc2FmZWx5IHB1dCBvdXIgZWxlbWVudCBiYWNrIGluXG4gICAgICAgIC8vIHRoZSBib3gsIHNpbmNlIG5vIHJlbmRlcmluZyBjb3VsZCBoYXZlIG9jY3VycmVkIHRvIGNoYW5nZSBpdHMgc3RhdGVcbiAgICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodGhpcy5fZWxlbWVudCk7XG4gICAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFJlZiBvYmplY3Qgb3IgY2FsbHMgYSByZWYgY2FsbGJhY2sgd2l0aCB0aGUgZWxlbWVudCBpdCdzXG4gKiBib3VuZCB0by5cbiAqXG4gKiBBIFJlZiBvYmplY3QgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3IgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC4gQSByZWZcbiAqIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBlbGVtZW50IGFzIGl0cyBvbmx5IGFyZ3VtZW50LlxuICpcbiAqIFRoZSByZWYgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBSZWYgb2JqZWN0IG9yIGNhbGxzIHRoZSByZWYgY2FsbGJhY2tcbiAqIGR1cmluZyByZW5kZXJpbmcsIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgY2hhbmdlZC5cbiAqXG4gKiBOb3RlOiBJZiBhIHJlZiBjYWxsYmFjayBpcyByZW5kZXJlZCB0byBhIGRpZmZlcmVudCBlbGVtZW50IHBvc2l0aW9uIG9yIGlzXG4gKiByZW1vdmVkIGluIGEgc3Vic2VxdWVudCByZW5kZXIsIGl0IHdpbGwgZmlyc3QgYmUgY2FsbGVkIHdpdGggYHVuZGVmaW5lZGAsXG4gKiBmb2xsb3dlZCBieSBhbm90aGVyIGNhbGwgd2l0aCB0aGUgbmV3IGVsZW1lbnQgaXQgd2FzIHJlbmRlcmVkIHRvIChpZiBhbnkpLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBVc2luZyBSZWYgb2JqZWN0XG4gKiBjb25zdCBpbnB1dFJlZiA9IGNyZWF0ZVJlZigpO1xuICogcmVuZGVyKGh0bWxgPGlucHV0ICR7cmVmKGlucHV0UmVmKX0+YCwgY29udGFpbmVyKTtcbiAqIGlucHV0UmVmLnZhbHVlLmZvY3VzKCk7XG4gKlxuICogLy8gVXNpbmcgY2FsbGJhY2tcbiAqIGNvbnN0IGNhbGxiYWNrID0gKGlucHV0RWxlbWVudCkgPT4gaW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoY2FsbGJhY2spfT5gLCBjb250YWluZXIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCByZWYgPSBkaXJlY3RpdmUoUmVmRGlyZWN0aXZlKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZi5qcy5tYXAiLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdoYXVudGVkJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcblxuLy8gRGVib3VuY2UgVXRpbGl0eVxuY29uc3QgZGVib3VuY2UgPSAoZnVuYywgZGVsYXkpID0+IHtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCBkZWxheSk7XG4gIH07XG59O1xuXG4vLyAtLS0gQ29tcG9uZW50IERlZmluaXRpb24gLS0tXG5mdW5jdGlvbiBBdXRvY29tcGxldGVTZWxlY3QoeyBcbiAgZGlzYWJsZWQsIFxuICBvcHRpb25zTWV0YWRhdGEgPSB7fSxcbiAgb3B0aW9ucyA9IFtdLCBcbiAgbGFiZWwgPSAnU2VhcmNoJywgaW5wdXRWYWx1ZSA9ICcnLFxuICBwYWdlU2l6ZSA9IDI1LFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRJdGVtLCBzZXRTZWxlY3RlZEl0ZW1dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFthY3RpdmVJbmRleCwgc2V0QWN0aXZlSW5kZXhdID0gdXNlU3RhdGUoLTEpO1xuICBjb25zdCBbaXNMaXN0T3Blbiwgc2V0SXNMaXN0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpbnB1dEVsZW1lbnQsIHNldElucHV0RWxlbWVudF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5wdXRWYWx1ZSkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIH1cbiAgfSwgW2lucHV0VmFsdWVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgIHNjcm9sbFRvQWN0aXZlSXRlbShhY3RpdmVJbmRleCk7XG4gICAgfVxuICB9LCBbYWN0aXZlSW5kZXhdKVxuXG4gIGNvbnN0IHRyaWdnZXJQYXJlbnRGZXRjaCA9IChpbnB1dCwgcGFnZSA9IDEpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IGlucHV0IHx8ICcnO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2ZldGNoLXN1Z2dlc3Rpb25zJywgeyBcbiAgICAgIGRldGFpbDogeyBxdWVyeSwgcGFnZSwgcGFnZVNpemUgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBzZXRBY3RpdmVJbmRleCgtMSk7XG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSk7XG4gIH07XG5cbiAgY29uc3QgZGVib3VuY2VkRmV0Y2ggPSB1c2VNZW1vKCgpID0+IGRlYm91bmNlKHRyaWdnZXJQYXJlbnRGZXRjaCwgMzAwKSwgW10pO1xuXG4gIC8vIC0tLSBTZWxlY3Rpb24gTG9naWMgLS0tXG4gIGNvbnN0IHNlbGVjdEl0ZW0gPSAoaXRlbSkgPT4ge1xuICAgIHNldFNlbGVjdGVkSXRlbShpdGVtKTtcbiAgICBzZXRJc0xpc3RPcGVuKGZhbHNlKTtcbiAgICBzZXRDdXJyZW50UGFnZSgxKTtcbiAgICBpZiAoaW5wdXRFbGVtZW50KSBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpdGVtLXNlbGVjdGVkJywgeyBcbiAgICAgIGRldGFpbDogaXRlbSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dC1jaGFuZ2UnLCB7IFxuICAgICAgZGV0YWlsOiB7IHZhbHVlOiBpdGVtLmxhYmVsLCBpdGVtIH0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gIH07XG5cbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBvcHRpb25zTWV0YWRhdGE/LmxpbmtzPy5wcmV2O1xuICBjb25zdCBoYXNOZXh0UGFnZSA9IG9wdGlvbnNNZXRhZGF0YT8ubGlua3M/Lm5leHQ7XG5cbiAgY29uc3QgaGFuZGxlUHJldlBhZ2UgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChoYXNQcmV2UGFnZSkge1xuICAgICAgdHJpZ2dlclBhcmVudEZldGNoKGlucHV0VmFsdWUsIGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdCBoYW5kbGVOZXh0UGFnZSA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGhhc05leHRQYWdlKSB7XG4gICAgICB0cmlnZ2VyUGFyZW50RmV0Y2goaW5wdXRWYWx1ZSwgY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIC0tLSBIYW5kbGVycyAtLS1cbiAgY29uc3QgaGFuZGxlSW5wdXQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIHNldEN1cnJlbnRQYWdlKDEpO1xuICAgIFxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0LWNoYW5nZScsIHsgXG4gICAgICBkZXRhaWw6IHsgdmFsdWUsIGl0ZW06IG51bGwgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICBkZWJvdW5jZWRGZXRjaCh2YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggKyAxKSAlIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggLSAxICsgb3B0aW9ucy5sZW5ndGgpICUgb3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID49IDAgJiYgaXNMaXN0T3Blbikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZWxlY3RJdGVtKG9wdGlvbnNbYWN0aXZlSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHNldElzTGlzdE9wZW4oZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG5cbiAgICAvLyBTY3JvbGwgYWN0aXZlIGl0ZW0gaW50byB2aWV3XG4gIGNvbnN0IHNjcm9sbFRvQWN0aXZlSXRlbSA9IChpbmRleCkgPT4ge1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBET00gaGFzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC5hdXRvY29tcGxldGUtb3B0aW9uW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdYCk7XG4gICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICBhY3RpdmVJdGVtLnNjcm9sbEludG9WaWV3KHsgXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLCBcbiAgICAgICAgICBibG9jazogJ25lYXJlc3QnIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVCdXR0b25DbGljayA9ICgpID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFpc0xpc3RPcGVuO1xuICAgIHNldElzTGlzdE9wZW4obmV3U3RhdGUpO1xuICAgIGlmIChuZXdTdGF0ZSAmJiBpbnB1dEVsZW1lbnQpIHtcbiAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWdnZXN0aW9uQ2xpY2sgPSAoaXRlbSkgPT4ge1xuICAgIHNlbGVjdEl0ZW0oaXRlbSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIGZpZWxkc2V0LmdyaWQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICBnYXA6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtaW5wdXQge1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtdG9nZ2xlIHtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgcGFkZGluZzogMC41cmVtIDAuNzVyZW07XG4gICAgICAgIG1pbi13aWR0aDogM3JlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtZHJvcGRvd24ge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMTAwJTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBpY28tYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlcjogdmFyKC0tcGljby1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcGljby1ib3JkZXItcmFkaXVzKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMC4yNXJlbTtcbiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7XG4gICAgICAgIHotaW5kZXg6IDk5O1xuICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1waWNvLWJveC1zaGFkb3cpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbnMge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtb3B0aW9uIHtcbiAgICAgICAgcGFkZGluZzogMC43NXJlbSAxcmVtO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xcyBlYXNlO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb246aG92ZXIsXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXNlY29uZGFyeS1iYWNrZ3JvdW5kKTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb25bYXJpYS1zZWxlY3RlZD1cInRydWVcIl0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktYmFja2dyb3VuZCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktaW52ZXJzZSk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW0gMXJlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLWNhcmQtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS1waWNvLWJvcmRlci1yYWRpdXMpIHZhcigtLXBpY28tYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24tY29udHJvbHMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uIGJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC43NXJlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24gYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXNlbGVjdGVkIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+IFxuXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPiR7bGFiZWx9PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXdyYXBwZXJcIj5cbiAgICAgIDxmaWVsZHNldCBjbGFzcz1cImdyaWRcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWlucHV0XCIgXG4gICAgICAgICAgdHlwZT1cInRleHRcIiBcbiAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIiBcbiAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImJvdGhcIiBcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPSR7aXNMaXN0T3BlbiA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgYXJpYS1sYWJlbD0ke2xhYmVsfVxuICAgICAgICAgIC52YWx1ZT0ke2lucHV0VmFsdWV9XG4gICAgICAgICAgQGlucHV0PSR7aGFuZGxlSW5wdXR9XG4gICAgICAgICAgQGtleWRvd249JHtoYW5kbGVLZXlEb3dufVxuICAgICAgICAgIEBibHVyPSR7KCkgPT4gc2V0SXNMaXN0T3BlbihmYWxzZSl9XG4gICAgICAgICAgQGZvY3VzPSR7KCkgPT4gc2V0SXNMaXN0T3Blbih0cnVlKX1cbiAgICAgICAgICAke3JlZihzZXRJbnB1dEVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgIFxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS10b2dnbGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJUb2dnbGUgc3VnZ2VzdGlvbnMgbGlzdFwiIFxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9JHtpc0xpc3RPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ31cbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICBAY2xpY2s9JHtoYW5kbGVCdXR0b25DbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgIDxwb2x5Z29uIFxuICAgICAgICAgICAgICBjbGFzcz1cImFycm93XCIgXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIiBcbiAgICAgICAgICAgICAgZmlsbC1vcGFjaXR5PVwiMC43NVwiIFxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudGNvbG9yXCIgXG4gICAgICAgICAgICAgIHBvaW50cz1cIjMsNiAxNSw2IDksMTRcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKCR7aXNMaXN0T3BlbiA/ICcxODBkZWcnIDogJzBkZWcnfSk7IHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzO1wiXG4gICAgICAgICAgICA+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgICBcbiAgICAgICR7aXNMaXN0T3BlbiAmJiBvcHRpb25zLmxlbmd0aCA+IDAgPyBodG1sYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLWRyb3Bkb3duXCI+XG4gICAgICAgICAgPHVsIFxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIiBcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtsYWJlbH1cbiAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLW9wdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7b3B0aW9ucy5tYXAoKGl0ZW0sIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICA8bGkgXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD0ke2luZGV4ID09PSBhY3RpdmVJbmRleCA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgICAgICAgQG1vdXNlZG93bj0keyhlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGl0ZW0pOyB9fVxuICAgICAgICAgICAgICAgIEBtb3VzZW92ZXI9JHsoKSA9PiBzZXRBY3RpdmVJbmRleChpbmRleCl9XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtb3B0aW9uICR7aW5kZXggPT09IGFjdGl2ZUluZGV4ID8gJ2FjdGl2ZScgOiAnJ31cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgYCl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICBcbiAgICAgICAgICAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXMgPiBwYWdlU2l6ZSA/IGh0bWxgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZyAke29wdGlvbnNNZXRhZGF0YT8ucGFnZX0tJHtvcHRpb25zTWV0YWRhdGE/LnRvdGFsX3BhZ2VzfSBvZiAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXN9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZVByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc1ByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFByZXZpb3VzXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZU5leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc05leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgcGFnZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTmV4dFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICBgIDogJyd9XG4gICAgICBcbiAgICAgICR7c2VsZWN0ZWRJdGVtID8gaHRtbGA8c21hbGwgY2xhc3M9XCJhdXRvY29tcGxldGUtc2VsZWN0ZWRcIj5TZWxlY3RlZDogJHtzZWxlY3RlZEl0ZW0ubGFiZWx9PC9zbWFsbD5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgJ2Npdi1hdXRvY29tcGxldGUtc2VsZWN0JyxcbiAgY29tcG9uZW50KEF1dG9jb21wbGV0ZVNlbGVjdCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIFBlb3BsZUxpc3QoeyBsb2NhbCA9IFtdIH0pIHtcbiAgICBjb25zdCBwZW9wbGUgPSBsb2NhbDtcblxuICAgIGNvbnN0IGhhc1N1YmRpdmlzaW9uID0gKHBlcnNvbikgPT4ge1xuICAgICAgICBjb25zdCBkaXZpc2lvbk9jZGlkID0gcGVyc29uLm9mZmljZS5kaXZpc2lvbl9vY2RpZCB8fCBcIlwiO1xuICAgICAgICBpZiAoZGl2aXNpb25PY2RpZC5pbmNsdWRlcyhcImRpc3RyaWN0XCIpIHx8IGRpdmlzaW9uT2NkaWQuaW5jbHVkZXMoXCJ3YXJkXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3ViZGl2aXNpb25MYWJlbCA9IChwZXJzb24pID0+IHtcbiAgICAgICAgY29uc3QgZGl2aXNpb25PY2RpZCA9IHBlcnNvbi5vZmZpY2UuZGl2aXNpb25fb2NkaWQgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgcGFydHMgPSBkaXZpc2lvbk9jZGlkLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKFwiY291bmNpbF9kaXN0cmljdDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYERpc3RyaWN0ICR7cGFydC5zcGxpdChcIjpcIilbMV19YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5zdGFydHNXaXRoKFwid2FyZDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFdhcmQgJHtwYXJ0LnNwbGl0KFwiOlwiKVsxXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgY29uc3Qgc3ViRGl2aXNpb24gPSAocGVyc29uKSA9PiB7XG4gICAgICAgIGlmIChoYXNTdWJkaXZpc2lvbihwZXJzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0U3ViZGl2aXNpb25MYWJlbChwZXJzb24pfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0U291cmNlcyA9IChzb3VyY2VzKSA9PiB7XG4gICAgICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHNtYWxsPk5vIFNvdXJjZXM8L3NtYWxsPmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICAgICR7c291cmNlcy5tYXAoKHNvdXJjZSwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgIDxhIFxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgWyR7aW5kZXggKyAxfV1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfTtcblxuICAgIGlmICghcGVvcGxlIHx8IHBlb3BsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgPHAgcm9sZT1cImFsZXJ0XCI+Tm8gcGVvcGxlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGlzIGp1cmlzZGljdGlvbi48L3A+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICA8ZmlndXJlPlxuICAgICAgICA8dGFibGUgcm9sZT1cImdyaWRcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxJTtcIj5QaG90bzwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxNSU7XCI+T2ZmaWNpYWw8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTUlXCI+Q29udGFjdDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgJHtwZW9wbGUubWFwKHBlcnNvbiA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1sYWJlbD1cIlBob3RvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uY2RuX2ltYWdlIHx8IHBlcnNvbi5pbWFnZSA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIke3BlcnNvbi5jZG5faW1hZ2UgfHwgcGVyc29uLmltYWdlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiUGhvdG8gb2YgJHtwZXJzb24ubmFtZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgYm9yZGVyLXJhZGl1czogNTAlOyBvYmplY3QtZml0OiBjb3ZlcjtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yPVwidGhpcy5vbmVycm9yPW51bGw7IHRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xvc2VzdCgndGQnKS5xdWVyeVNlbGVjdG9yKCcuZmFsbGJhY2staWNvbicpLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhbGxiYWNrLWljb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHdpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7IGxpbmUtaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IpOyBjb2xvcjogdmFyKC0tcGljby1zZWNvbmRhcnktaG92ZXItY29sb3IpO1wiPvCfkaQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGh0bWxgPHNwYW4gY2xhc3M9XCJmYWxsYmFjay1pY29uXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4OyBsaW5lLWhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTsgY29sb3I6IHZhcigtLXBpY28tc2Vjb25kYXJ5LWhvdmVyLWNvbG9yKTsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPvCfkaQ8L3NwYW4+YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWxhYmVsPVwiT2ZmaWNpYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiR7cGVyc29uLm5hbWV9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+JHtwZXJzb24ub2ZmaWNlICYmIHBlcnNvbi5vZmZpY2UubmFtZX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPiR7c3ViRGl2aXNpb24ocGVyc29uKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtbGFiZWw9XCJDb250YWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uZW1haWxzID8gaHRtbGA8YSBocmVmPVwibWFpbHRvOiR7cGVyc29uLmVtYWlscy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5lbWFpbHMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24ucGhvbmVzID8gaHRtbGA8YSBocmVmPVwidGVsOiR7cGVyc29uLnBob25lcy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5waG9uZXMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24udXJscyA/IGh0bWxgPGEgaHJlZj1cIiR7cGVyc29uLnVybHMuam9pbignLCcpfVwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwic2Vjb25kYXJ5XCI+TGluazwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2ZpZ3VyZT5cbiAgICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXBlb3BsZS1saXN0XCIsXG4gIGNvbXBvbmVudChQZW9wbGVMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UsIG9ic2VydmVkQXR0cmlidXRlczogW10gfSlcbik7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHJlZiB9IGZyb20gXCJsaXQtaHRtbC9kaXJlY3RpdmVzL3JlZi5qc1wiO1xuXG5mdW5jdGlvbiBNb2RhbCh7XG4gIHRpdGxlID0gXCJcIixcbiAgY29udGVudCA9IG51bGwsIC8vIGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQgb3IgbnVsbFxuICBmb290ZXIgPSBudWxsLCAvLyBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0IG9yIG51bGxcbiAgbW9kYWxQcm9wcyA9IHt9LCAvLyB7IG9wZW4sIG9uQ2xvc2UsIG1vZGFsUmVmLCBjbG9zZU9uQmFja2Ryb3BDbGljayA9IHRydWUsIGFyaWFMYWJlbCB9XG59KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKEJvb2xlYW4obW9kYWxQcm9wcy5vcGVuKSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0T3BlbihCb29sZWFuKG1vZGFsUHJvcHMub3BlbikpO1xuICB9LCBbbW9kYWxQcm9wcy5vcGVuXSk7XG5cbiAgbGV0IGRpYWxvZ0VsID0gbnVsbDtcbiAgY29uc3Qgc2V0RGlhbG9nUmVmID0gKGVsKSA9PiB7XG4gICAgZGlhbG9nRWwgPSBlbDtcbiAgICAvLyBwcm9wYWdhdGUgdG8gYW55IHJlZiBwYXNzZWQgaW4gbW9kYWxQcm9wcyAoc3VwcG9ydHMgY2FsbGJhY2sgb3Igb2JqZWN0IHJlZilcbiAgICBpZiAoIW1vZGFsUHJvcHMubW9kYWxSZWYpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwiZnVuY3Rpb25cIikgbW9kYWxQcm9wcy5tb2RhbFJlZihlbCk7XG4gICAgZWxzZSBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwib2JqZWN0XCIpIG1vZGFsUHJvcHMubW9kYWxSZWYudmFsdWUgPSBlbDtcbiAgfTtcblxuICBjb25zdCBvbktleSA9IChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gZm9jdXMgdGhlIGRpYWxvZyBzbyBpdCByZWNlaXZlcyBrZXkgZXZlbnRzIHdoZW4gb3BlbmVkXG4gICAgaWYgKG9wZW4gJiYgZGlhbG9nRWwgJiYgdHlwZW9mIGRpYWxvZ0VsLmZvY3VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRpYWxvZ0VsLmZvY3VzKCk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuXG4gIGNvbnN0IGJhY2tkcm9wQ2xpY2sgPSAoZSkgPT4ge1xuICAgIGlmICghbW9kYWxQcm9wcy5jbG9zZU9uQmFja2Ryb3BDbGljayAmJiBtb2RhbFByb3BzLmNsb3NlT25CYWNrZHJvcENsaWNrICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBjbGljayBvbiBkaWFsb2cgKGNoaWxkKSBzaG91bGRuJ3QgY2xvc2U7IGNsaWNrIG9uIGJhY2tkcm9wIChkaWFsb2cgZWxlbWVudCkgc2hvdWxkXG4gICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LnRhZ05hbWUgJiYgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxkaWFsb2dcbiAgICAgID9vcGVuPSR7b3Blbn1cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgYXJpYS1sYWJlbD0ke21vZGFsUHJvcHMuYXJpYUxhYmVsIHx8IHRpdGxlIHx8IFwiTW9kYWxcIn1cbiAgICAgIEBjbGljaz0ke2JhY2tkcm9wQ2xpY2t9XG4gICAgICBAa2V5ZG93bj0ke29uS2V5fVxuICAgICAgJHtyZWYoc2V0RGlhbG9nUmVmKX1cbiAgICA+XG4gICAgICA8YXJ0aWNsZSBAY2xpY2s9JHsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0+XG4gICAgICAgICR7dGl0bGVcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxoZWFkZXI+XG4gICAgICAgICAgICAgICAgPGgyPiR7dGl0bGV9PC9oMj5cbiAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiBudWxsfVxuXG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICR7Zm9vdGVyXG4gICAgICAgICAgPyBodG1sYCA8Zm9vdGVyPiR7Zm9vdGVyfTwvZm9vdGVyPiBgXG4gICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICA8Zm9vdGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7bW9kYWxQcm9wcy5vbkNsb3NlfSBjbGFzcz1cInNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgYH1cbiAgICAgIDwvYXJ0aWNsZT5cbiAgICA8L2RpYWxvZz5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1tb2RhbFwiLFxuICBjb21wb25lbnQoTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IFwiLi4vYmFzaWMvbW9kYWwuanNcIjtcblxuY29uc3QgRFVNTVlfREFUQSA9IFtcbiAgeyBpZDogMSwgbmFtZTogXCJTY3JhcGUgSm9iIDFcIiwgc3RhdHVzOiBcIkNvbXBsZXRlZFwiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDFcIiwgZHVyYXRpb25faW5fczogMTIwLCBcbiAgICAgICAgc291cmNlX3VybHM6IFtcImh0dHBzOi8vZXhhbXBsZS5jb21cIiwgXCJodHRwczovL2V4YW1wbGUuY29tLzJcIl0sIHByb2dyZXNzOiAxMDAgfSxcbiAgeyBpZDogMiwgbmFtZTogXCJTY3JhcGUgSm9iIDJcIiwgc3RhdHVzOiBcIkluIFByb2dyZXNzXCIsIHN0YXJ0X2RhdGU6IFwiMjAyNC0wMS0wMlwiLCBkdXJhdGlvbl9pbl9zOiAxNTAsIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUub3JnXCJdLCBwcm9ncmVzczogNTAgfSxcbiAgeyBpZDogMywgbmFtZTogXCJTY3JhcGUgSm9iIDNcIiwgc3RhdHVzOiBcIkZhaWxlZFwiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDNcIiwgZHVyYXRpb25faW5fczogOTAsIHNvdXJjZV91cmxzOiBbXSwgcHJvZ3Jlc3M6IDAgfSxcbl07XG5cbmZ1bmN0aW9uIHJlbmRlclByb2dyZXNzQmFyKHByb2dyZXNzKSB7XG4gIGlmIChwcm9ncmVzcyA9PT0gMTAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgIDxwcm9ncmVzcyB2YWx1ZT0ke3Byb2dyZXNzID8/IDB9IG1heD1cIjEwMFwiPlxuICAgICAgICAke3Byb2dyZXNzID8/IDB9JVxuICAgICAgPC9wcm9ncmVzcz5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuZnVuY3Rpb24gU2NyYXBlSGlzdG9yeUxpc3QoeyBoaXN0b3J5LCBqb2JTdGF0dXMgfSkge1xuICAvLyBVc2UgaGlzdG9yeSBhcyBhbiBvYmplY3QvYXJyYXkgZGlyZWN0bHkgKG5vIHBhcnNpbmcgaWYgcGFzc2VkIGFzIHByb3BlcnR5KVxuICBjb25zdCBoaXN0b3J5RGF0YSA9IEpTT04ucGFyc2UoaGlzdG9yeSlcbiAgbGV0IHBhcnNlZEhpc3RvcnkgPSBoaXN0b3J5RGF0YVtcImRhdGFcIl1cblxuICAvLyBJZiBqb2JTdGF0dXMgaXMgcHJlc2VudCBhbmQgbWF0Y2hlcyBhIGpvYiwgdXBkYXRlIHRoYXQgam9iJ3MgcHJvZ3Jlc3Mvc3RhdHVzXG4gIGlmIChqb2JTdGF0dXMgJiYgam9iU3RhdHVzLnJlcXVlc3RfaWQpIHtcbiAgICBwYXJzZWRIaXN0b3J5ID0gcGFyc2VkSGlzdG9yeS5tYXAoam9iID0+XG4gICAgICBqb2IucmVxdWVzdF9pZCA9PT0gam9iU3RhdHVzLnJlcXVlc3RfaWRcbiAgICAgICAgPyB7IC4uLmpvYiwgcHJvZ3Jlc3M6IGpvYlN0YXR1cy5wcm9ncmVzcywgc3RhdHVzOiBqb2JTdGF0dXMuc3RhdHVzIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW21vZGFsT3Blbiwgc2V0TW9kYWxPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NlbGVjdGVkSm9iLCBzZXRTZWxlY3RlZEpvYl0gPSB1c2VTdGF0ZShudWxsKTtcblxuICBjb25zdCBvcGVuRm9yID0gKGpvYikgPT4ge1xuICAgIHNldFNlbGVjdGVkSm9iKGpvYik7XG4gICAgc2V0TW9kYWxPcGVuKHRydWUpO1xuICB9O1xuICBjb25zdCBjbG9zZU1vZGFsID0gKCkgPT4ge1xuICAgIHNldE1vZGFsT3BlbihmYWxzZSk7XG4gICAgc2V0U2VsZWN0ZWRKb2IobnVsbCk7XG4gIH07XG5cbiAgY29uc3QgZm10RGF0ZSA9IChkKSA9PiB7XG4gICAgaWYgKCFkKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwID0gbmV3IERhdGUoZCk7XG4gICAgaWYgKGlzTmFOKHApKSByZXR1cm4gU3RyaW5nKGQpO1xuICAgIHJldHVybiBgJHtTdHJpbmcocC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpfS8ke1N0cmluZyhwLmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpfS8ke3AuZ2V0RnVsbFllYXIoKX1gO1xuICB9O1xuXG4gIGNvbnN0IGdldER1cmF0aW9uU3RyaW5nID0gKGNyZWF0ZWRfYXQsIHVwZGF0ZWRfYXQpID0+IHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IChuZXcgRGF0ZSh1cGRhdGVkX2F0KSAtIG5ldyBEYXRlKGNyZWF0ZWRfYXQpKSAvIDEwMDA7XG4gICAgLy8gRnJpZW5kbHkgZm9ybWF0dGluZyB0byBtaW51dGVzLCBzZWNvbmRzIHJvdW5kZWRcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwKTtcbiAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChkdXJhdGlvbiAlIDYwKTtcbiAgICByZXR1cm4gYCR7bWludXRlc31tICR7c2Vjb25kc31zYDtcbiAgfVxuXG4gIGNvbnN0IG1vZGFsQ29udGVudCA9IHNlbGVjdGVkSm9iXG4gICAgPyBodG1sYDxkaXY+XG4gICAgICAgIDxwPjxzdHJvbmc+RGF0ZSAvIFRpbWU6PC9zdHJvbmc+ICR7Zm10RGF0ZShzZWxlY3RlZEpvYi5jcmVhdGVkX2F0KX08L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiAke3NlbGVjdGVkSm9iLnN0YXR1c308L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+UHJvZ3Jlc3M6PC9zdHJvbmc+ICR7c2VsZWN0ZWRKb2IucHJvZ3Jlc3MgPz8gXCI/XCJ9JTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5UaW1lIHRvIHNjcmFwZTo8L3N0cm9uZz4gJHtnZXREdXJhdGlvblN0cmluZyhzZWxlY3RlZEpvYi5jcmVhdGVkX2F0LCBzZWxlY3RlZEpvYi51cGRhdGVkX2F0KX08L3A+XG4gICAgICAgIDxwPjxzdHJvbmc+VVJMcyBzY3JhcGVkOjwvc3Ryb25nPjwvcD5cbiAgICAgICAgPHVsPlxuICAgICAgICAgICR7c2VsZWN0ZWRKb2Iuc291cmNlX3VybHMgJiYgc2VsZWN0ZWRKb2Iuc291cmNlX3VybHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyBzZWxlY3RlZEpvYi5zb3VyY2VfdXJscy5tYXAoKHVybCkgPT4gaHRtbGA8bGk+PGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHt1cmx9PC9hPjwvbGk+YClcbiAgICAgICAgICAgIDogaHRtbGA8bGk+PGVtPk5vIHNvdXJjZSBVUkxzPC9lbT48L2xpPmB9XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5gXG4gICAgOiBudWxsO1xuXG4gIGlmICghcGFyc2VkSGlzdG9yeSB8fCBwYXJzZWRIaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBodG1sYDxwPk5vIHNjcmFwZSBoaXN0b3J5IGF2YWlsYWJsZS48L3A+YDtcbiAgfVxuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIHVsLmxpc3QgeyBcbiAgICAgICAgcGFkZGluZzogMDsgXG4gICAgICAgIG1hcmdpbjogMDsgXG4gICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OyAvKiBTZXQgeW91ciBkZXNpcmVkIG1heCBoZWlnaHQgKi9cbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsgIC8qIEVuYWJsZSB2ZXJ0aWNhbCBzY3JvbGxpbmcgKi9cbiAgICAgICAgcGFkZGluZy1yaWdodDogMXJlbTsgLyogQWRkIHNwYWNlIGJldHdlZW4gc2Nyb2xsYmFyIGFuZCBjb250ZW50ICovXG4gICAgICB9XG4gICAgICB1bCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgfVxuICAgICAgLml0ZW0geyBwYWRkaW5nOiAwLjVyZW0gMDsgfVxuICAgICAgLnJvdyB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIGF1dG87IGdhcDogMC43NXJlbTsgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuICAgICAgLmJ0biB7IGFsbDogdW5zZXQ7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgfVxuICAgICAgLnBpbGwgeyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTsgYm9yZGVyLXJhZGl1czogOTk5cHg7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4wNCk7IGZvbnQtc2l6ZTogMC45cmVtOyB9XG4gICAgICAucGlsbC5jb21wbGV0ZWQgeyBiYWNrZ3JvdW5kOiAjZTZmOWVhOyBjb2xvcjogIzExN2EyZDsgfVxuICAgICAgLnBpbGwuaW4tcHJvZ3Jlc3MgeyBiYWNrZ3JvdW5kOiAjZmZmN2U2OyBjb2xvcjogIzk5NjYwYjsgfVxuICAgICAgLnBpbGwuZmFpbGVkIHsgYmFja2dyb3VuZDogI2ZmZWNlYzsgY29sb3I6ICM5YjFmMWY7IH1cbiAgICAgIC5wcm9ncmVzcy1iYXItY29udGFpbmVyIHsgbWFyZ2luLXRvcDogMC41cmVtOyB9XG4gICAgICBwcm9ncmVzcyB7IHdpZHRoOiAxMDAlOyB9XG4gICAgPC9zdHlsZT5cblxuICAgIDx1bCBjbGFzcz1cImxpc3RcIj5cbiAgICAgICR7cGFyc2VkSGlzdG9yeS5tYXAoXG4gICAgICAgIChqb2IpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDbGFzcyA9IGpvYi5zdGF0dXMgPyBqb2Iuc3RhdHVzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIi1cIikgOiBcIlwiO1xuICAgICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGxpIGNsYXNzPVwiaXRlbVwiPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBAY2xpY2s9JHsoKSA9PiBvcGVuRm9yKGpvYil9PlxuICAgICAgICAgICAgICAgICAgJHtmbXREYXRlKGpvYi5jcmVhdGVkX2F0KX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIGNsYXNzPVwicGlsbCAke3N0YXR1c0NsYXNzfVwiPiR7am9iLnN0YXR1c308L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAke3JlbmRlclByb2dyZXNzQmFyKGpvYi5wcm9ncmVzcyl9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIGA7XG4gICAgICAgIH1cbiAgICAgICl9XG4gICAgPC91bD5cblxuICAgIDxociAvPlxuXG4gICAgPGNpdi1tb2RhbFxuICAgICAgLnRpdGxlPSR7XCJTY3JhcGUgRGV0YWlsc1wifVxuICAgICAgLmNvbnRlbnQ9JHttb2RhbENvbnRlbnR9XG4gICAgICAubW9kYWxQcm9wcz0ke3sgb3BlbjogbW9kYWxPcGVuLCBvbkNsb3NlOiBjbG9zZU1vZGFsLCBjbG9zZU9uQmFja2Ryb3BDbGljazogdHJ1ZSB9fVxuICAgID48L2Npdi1tb2RhbD5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwiY2l2LXNjcmFwZS1oaXN0b3J5LWxpc3RcIiwgY29tcG9uZW50KFNjcmFwZUhpc3RvcnlMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSkpOyIsImltcG9ydCB7IGNvbXBvbmVudCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmNvbnN0IER1bW15U2NyYXBlSm9iSW5mbyA9IHtcbiAgICBjcmVhdGVkX2F0OiBcIjIwMjQtMDYtMDFUMTI6MDA6MDBaXCIsXG4gICAgc3RhdHVzOiBcIkFjY2VwdGVkXCIsXG4gICAgZHVyYXRpb25faW5fczogMzYwLFxuICAgIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiaHR0cHM6Ly9leGFtcGxlLm9yZ1wiXSxcbn1cblxuZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24oc2Vjb25kcykge1xuICAgIGlmIChzZWNvbmRzID09IG51bGwpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKHNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigoc2Vjb25kcyAlIDM2MDApIC8gNjApO1xuICAgIGNvbnN0IHMgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaCA/IGAke2h9aGAgOiBudWxsLFxuICAgICAgICBtID8gYCR7bX1tYCA6IG51bGwsXG4gICAgICAgIGAke3N9c2BcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKTtcbn1cblxuZnVuY3Rpb24gU2NyYXBlRGV0YWlscyh7IGRldGFpbCA9IER1bW15U2NyYXBlSm9iSW5mbyB9KSB7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gZGV0YWlsPy5jcmVhdGVkX2F0ID8gbmV3IERhdGUoZGV0YWlsLmNyZWF0ZWRfYXQpIDogbnVsbDtcbiAgICBjb25zdCBmb3JtYXR0ZWRDcmVhdGVkQXQgPSBjcmVhdGVkQXQgPyBjcmVhdGVkQXQudG9Mb2NhbGVTdHJpbmcoKSA6IFwiXCI7XG4gICAgY29uc3QgZHVyYXRpb24gPSBmb3JtYXREdXJhdGlvbihkZXRhaWw/LmR1cmF0aW9uX2luX3MpO1xuICAgIGNvbnN0IHVybHMgPSBkZXRhaWw/LnNvdXJjZV91cmxzIHx8IFtdO1xuXG4gICAgcmV0dXJuIGh0bWxgXG4gICAgPGFydGljbGUgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgIDxmb3JtPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxzcGFuPkRhdGUgLyBUaW1lPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCIke2Zvcm1hdHRlZENyZWF0ZWRBdH1cIiByZWFkb25seSAvPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8c3Bhbj5TdGF0dXM8L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7ZGV0YWlsPy5zdGF0dXMgfHwgXCJcIn1cIiByZWFkb25seSAvPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8c3Bhbj5UaW1lIHRvIHNjcmFwZTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiJHtkdXJhdGlvbn0ke2RldGFpbD8uZHVyYXRpb25faW5fcyAhPSBudWxsID8gYCAoJHtkZXRhaWwuZHVyYXRpb25faW5fc31zKWAgOiBcIlwifVwiIHJlYWRvbmx5IC8+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNlY3Rpb24+XG4gICAgICAgICAgPGg0PlVSTHMgc2NyYXBlZDwvaDQ+XG4gICAgICAgICAgJHt1cmxzLmxlbmd0aFxuICAgICAgICAgICAgPyBodG1sYDx1bD5cbiAgICAgICAgICAgICAgICAke3VybHMubWFwKFxuICAgICAgICAgICAgICAgICAgdSA9PiBodG1sYDxsaT48YSBocmVmPVwiJHt1fVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHt1fTwvYT48L2xpPmBcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L3VsPmBcbiAgICAgICAgICAgIDogaHRtbGA8cD48ZW0+Tm8gc291cmNlIFVSTHM8L2VtPjwvcD5gfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9hcnRpY2xlPlxuICAgIGBcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdzY3JhcGUtZGV0YWlscycsIGNvbXBvbmVudChTY3JhcGVEZXRhaWxzKSk7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VSZWZ9ICBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBDaXZTZWxlY3RKdXJpc2RpY3Rpb24oKSB7XG4gIGNvbnN0IFtzdGF0ZXMsIHNldFN0YXRlc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtqdXJpc2RpY3Rpb25zLCBzZXRKdXJpc2RpY3Rpb25zXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2p1cmlzZGljdGlvbnNNZXRhZGF0YSwgc2V0SnVyaXNkaWN0aW9uc01ldGFkYXRhXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3QgW3NlbGVjdGVkU3RhdGUsIHNldFNlbGVjdGVkU3RhdGVdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtzZWxlY3RlZEp1cmlzZGljdGlvbiwgc2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25dID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtqdXJpc2RpY3Rpb25JbnB1dFZhbHVlLCBzZXRKdXJpc2RpY3Rpb25JbnB1dFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIGNvbnN0IGlzSW5pdGlhbE1vdW50ID0gdXNlUmVmKHRydWUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzSW5pdGlhbE1vdW50LmN1cnJlbnQpIHtcbiAgICAgIGlzSW5pdGlhbE1vdW50LmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjsgXG4gICAgfVxuICAgIC8vIENhbGwgdGhlIGhhbmRsZXIgd2l0aCB0aGUgY3VycmVudCBzZWxlY3Rpb25zXG4gICAgaGFuZGxlSW5wdXRDaGFuZ2Uoc2VsZWN0ZWRTdGF0ZSwgc2VsZWN0ZWRKdXJpc2RpY3Rpb24pO1xuICB9LCBbc2VsZWN0ZWRTdGF0ZSwgc2VsZWN0ZWRKdXJpc2RpY3Rpb25dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gRmV0Y2ggc3RhdGVzIGZyb20gYmFja2VuZCBwcm94eSAobm8gYXV0aCBoZWFkZXIgbmVlZGVkKVxuICAgIGZldGNoKFwiL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucy9zdGF0ZXNcIilcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4gc2V0U3RhdGVzKGRhdGEuZGF0YSB8fCBbXSkpO1xuICB9LCBbXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRKdXJpc2RpY3Rpb25zKFtdKTtcbiAgICBzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEoe30pO1xuICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKFwiXCIpO1xuICAgIHNldEp1cmlzZGljdGlvbklucHV0VmFsdWUoXCJcIik7XG5cbiAgICBpZiAoIXNlbGVjdGVkU3RhdGUpIHJldHVybjtcbiAgICBcbiAgICAvLyBGZXRjaCBqdXJpc2RpY3Rpb25zIGZvciBzZWxlY3RlZCBzdGF0ZSAobm8gYXV0aCBoZWFkZXIgbmVlZGVkKVxuICAgIGhhbmRsZUp1cmlzZGljdGlvblN1Z2dlc3Rpb25zKFwiXCIpO1xuICB9LCBbc2VsZWN0ZWRTdGF0ZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKHN0YXRlLCBqdXJpc2RpY3Rpb25PY2RpZCkgPT4ge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudChcInNlbGVjdC1qdXJpc2RpY3Rpb24tY2hhbmdlXCIsIHtcbiAgICAgICAgZGV0YWlsOiB7IHN0YXRlLCBqdXJpc2RpY3Rpb25fb2NkaWQ6IGp1cmlzZGljdGlvbk9jZGlkIH0sXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlSnVyaXNkaWN0aW9uU3VnZ2VzdGlvbnMgPSAoZGV0YWlsKSA9PiB7XG4gICAgY29uc3QgcXVlcnkgPSBkZXRhaWwucXVlcnkgfHwgXCJcIjtcbiAgICBjb25zdCBwYWdlID0gZGV0YWlsLnBhZ2UgfHwgMTtcbiAgICBjb25zdCBwYWdlU2l6ZSA9IGRldGFpbC5wYWdlU2l6ZSB8fCAyNTtcbiAgICBmZXRjaChgL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucy8ke3NlbGVjdGVkU3RhdGV9L3NlYXJjaD9zZWFyY2hfc3RyaW5nPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0mbGltaXQ9JHtwYWdlU2l6ZX0mcGFnZT0ke3BhZ2V9YClcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRKdXJpc2RpY3Rpb25zKGRhdGEuZGF0YSB8fCBbXSk7XG4gICAgICAgIHNldEp1cmlzZGljdGlvbnNNZXRhZGF0YSh7XG4gICAgICAgICAgdG90YWxfaXRlbXM6IGRhdGEudG90YWxfaXRlbXMsXG4gICAgICAgICAgdG90YWxfcGFnZXM6IGRhdGEudG90YWxfcGFnZXMsXG4gICAgICAgICAgcGFnZTogZGF0YS5wYWdlLFxuICAgICAgICAgIGxpbWl0OiBkYXRhLmxpbWl0LFxuICAgICAgICAgIGxpbmtzOiBkYXRhLmxpbmtzXG4gICAgICAgIH0pXG4gICAgICB9KTsgXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdWJtaXRDbGljayA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QganVyaXNkaWN0aW9uX2RhdGEgPSBqdXJpc2RpY3Rpb25zLmZpbmQoanVyID0+IGp1ci5pZCA9PT0gc2VsZWN0ZWRKdXJpc2RpY3Rpb24pO1xuICAgIGNvbnN0IGp1cmlzZGljdGlvbl9vY2RpZF9zbHVnID0ganVyaXNkaWN0aW9uX2RhdGFbXCJqdXJpc2RpY3Rpb25fb2NkaWRfc2x1Z1wiXTtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAvanVyaXNkaWN0aW9ucy8ke2p1cmlzZGljdGlvbl9vY2RpZF9zbHVnfWA7XG4gIH1cblxuICBjb25zdCBqdXJpc2RpY3Rpb25MaW5rID0gKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRKdXJpc2RpY3Rpb24pIHJldHVybiBcIlwiO1xuICAgIGlmICghanVyaXNkaWN0aW9ucykgcmV0dXJuIFwiXCI7XG5cbiAgICBjb25zdCBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA9IGVuY29kZVVSSUNvbXBvbmVudChzZWxlY3RlZEp1cmlzZGljdGlvbilcbiAgICByZXR1cm4ganVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWQgPyBgL2p1cmlzZGljdGlvbnM/anVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWR9YCA6IFwiXCI7XG4gIH1cblxuICByZXR1cm4gaHRtbGBcbiAgICA8Zm9ybSBcbiAgICAgIGNsYXNzPVwiZ3JpZFwiIFxuICAgICAgc3R5bGU9XCJncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmcjsgZ2FwOiAxcmVtO1wiXG4gICAgICBvbnN1Ym1pdD1cInJldHVybiBmYWxzZTtcIlxuICAgID5cbiAgICAgIDxsYWJlbCBmb3I9XCJzdGF0ZS1zZWxlY3RcIiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPlN0YXRlOjwvbGFiZWw+XG4gICAgICA8c2VsZWN0XG4gICAgICAgIGlkPVwic3RhdGUtc2VsZWN0XCJcbiAgICAgICAgLnZhbHVlPSR7c2VsZWN0ZWRTdGF0ZX1cbiAgICAgICAgQGNoYW5nZT0keyhlKSA9PiBzZXRTZWxlY3RlZFN0YXRlKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgcmVxdWlyZWRcbiAgICAgID5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBhIHN0YXRlPC9vcHRpb24+XG4gICAgICAgICR7c3RhdGVzLm1hcChcbiAgICAgICAgICAoc3RhdGUpID0+IGh0bWxgPG9wdGlvbiB2YWx1ZT0ke3N0YXRlfT4ke3N0YXRlfTwvb3B0aW9uPmBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuICAgICAgPGNpdi1hdXRvY29tcGxldGUtc2VsZWN0XG4gICAgICAgIGlkPVwianVyaXNkaWN0aW9uLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgIC5kaXNhYmxlZD0keyFzZWxlY3RlZFN0YXRlfVxuICAgICAgICAuaW5wdXRWYWx1ZT0ke2p1cmlzZGljdGlvbklucHV0VmFsdWV9XG4gICAgICAgIC5vcHRpb25zPSR7anVyaXNkaWN0aW9ucy5tYXAoanVyID0+ICh7IGxhYmVsOiBqdXIubmFtZSwgdmFsdWU6IGp1ci5pZCB9KSl9XG4gICAgICAgIC5vcHRpb25zTWV0YWRhdGE9JHtqdXJpc2RpY3Rpb25zTWV0YWRhdGF9XG4gICAgICAgIC5wYWdlU2l6ZT0kezI1fVxuICAgICAgICBAZmV0Y2gtc3VnZ2VzdGlvbnM9JHsoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRldGFpbCA9IGUuZGV0YWlsO1xuICAgICAgICAgIGhhbmRsZUp1cmlzZGljdGlvblN1Z2dlc3Rpb25zKGRldGFpbCk7XG4gICAgICAgIH19XG4gICAgICAgIEBpbnB1dC1jaGFuZ2U9JHsoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHt2YWx1ZSwgaXRlbX0gPSBlLmRldGFpbDtcbiAgICAgICAgICBzZXRKdXJpc2RpY3Rpb25JbnB1dFZhbHVlKHZhbHVlKVxuICAgICAgICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKGl0ZW0gPyBpdGVtLnZhbHVlIDogXCJcIik7XG4gICAgICAgIH19XG4gICAgICAgIEBpdGVtLXNlbGVjdGVkPSR7KGUpID0+IHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uKGUuZGV0YWlsLnZhbHVlKX1cbiAgICAgID48L2Npdi1hdXRvY29tcGxldGUtc2VsZWN0PlxuICAgICAgPCEtLSBjb21tZW50IG91dCBzdWJtaXQgYnV0dG9uIGZvciBub3cuXG4gICAgICA8YnV0dG9uIFxuICAgICAgICB0eXBlPVwic3VibWl0XCIgXG4gICAgICAgIEBjbGljaz0ke2hhbmRsZVN1Ym1pdENsaWNrfSBcbiAgICAgICAgP2Rpc2FibGVkPSR7IXNlbGVjdGVkSnVyaXNkaWN0aW9ufT5TdWJtaXQ8L2J1dHRvbj5cbiAgICAgIC0tPlxuICAgICAgPGEgaHJlZj1cIiR7anVyaXNkaWN0aW9uTGluaygpfVwiID9oaWRkZW49JHshc2VsZWN0ZWRKdXJpc2RpY3Rpb259PlxuICAgICAgICBHbyB0byBqdXJpc2RpY3Rpb24gcGFnZVxuICAgICAgPC9hPlxuICAgIDwvZm9ybT5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1zZWxlY3QtanVyaXNkaWN0aW9uXCIsXG4gIGNvbXBvbmVudChDaXZTZWxlY3RKdXJpc2RpY3Rpb24sIHsgdXNlU2hhZG93RE9NOiBmYWxzZSwgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBbXSB9KVxuKTtcblxuXG4iLCJpbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSBcIi4vdXNlLW1lbW9cIjtcbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gICAgcmV0dXJuIHVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgY3VycmVudDogaW5pdGlhbFZhbHVlLFxuICAgIH0pLCBbXSk7XG59XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBTZWFyY2hKdXJpc2RpY3Rpb25zKCkge1xuICBjb25zdCBbc2VsZWN0ZWRTdGF0ZSwgc2V0U2VsZWN0ZWRTdGF0ZV0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3NlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQsIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRdID1cbiAgICB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW3Blb3BsZSwgc2V0UGVvcGxlXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2dlb2pzb24sIHNldEdlb2pzb25dID0gdXNlU3RhdGUoW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkRW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIHNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQsXG4gICAgKTtcblxuICAgIGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L3Blb3BsZT9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkRW5jb2RlZH1gLFxuICAgIClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgc2V0UGVvcGxlKGRhdGEuZGF0YSk7XG4gICAgICB9KTtcbiAgfSwgW3NlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRdKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHN0YXRlLCBqdXJpc2RpY3Rpb25fb2NkaWQgfSA9IGV2ZW50LmRldGFpbDtcbiAgICBjb25zb2xlLmxvZyhcIlNlbGVjdGVkIFN0YXRlOlwiLCBzdGF0ZSk7XG4gICAgc2V0U2VsZWN0ZWRTdGF0ZShzdGF0ZSk7XG4gICAgLy8gVE9ETzogcGFuIHRoZSBtYXAgaWYgc3RhdGUgYnV0IG5vIGp1cmlzZGljdGlvblxuICAgIGNvbnNvbGUubG9nKFwiU2VsZWN0ZWQgSnVyaXNkaWN0aW9uOlwiLCBqdXJpc2RpY3Rpb25fb2NkaWQpO1xuICAgIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQoanVyaXNkaWN0aW9uX29jZGlkKTtcbiAgICAvLyBUT0RPOiBwYW4gdGhlIG1hcCAmIHpvb20gaWYgc3RhdGUgYW5kIGp1cmlzZGljdGlvblxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1hcENoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgbGF0bG5nLCB6b29tIH0gPSBldmVudC5kZXRhaWw7XG4gICAgaWYgKCFsYXRsbmcgfHwgIXpvb20pIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyhcIk1hcCBDaGFuZ2UgLSBMYXRMbmc6XCIsIGxhdGxuZywgXCJab29tOlwiLCB6b29tKTtcbiAgICBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9qdXJpc2RpY3Rpb25zL2dlb2pzb24/bGF0PSR7bGF0bG5nLmxhdH0mbG9uZz0ke2xhdGxuZy5sbmd9Jnpvb209JHt6b29tfWAsXG4gICAgKVxuICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBzZXRHZW9qc29uKGRhdGEpO1xuICAgICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMnJlbTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGNpdi1tYXBcbiAgICAgICAgICAgIEBvbi1tYXAtY2hhbmdlPSR7aGFuZGxlTWFwQ2hhbmdlfVxuICAgICAgICAgICAgQG9uLWp1cmlzZGljdGlvbi1jaGFuZ2U9JHtoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2V9XG4gICAgICAgICAgICAuZ2VvanNvbj0ke2dlb2pzb259XG4gICAgICAgICAgPjwvY2l2LW1hcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxjaXYtc2VsZWN0LWp1cmlzZGljdGlvblxuICAgICAgICAgIEBzZWxlY3QtanVyaXNkaWN0aW9uLWNoYW5nZT0ke2hhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZX1cbiAgICAgICAgPjwvY2l2LXNlbGVjdC1qdXJpc2RpY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxjaXYtcGVvcGxlLWxpc3QgLmxvY2FsPSR7cGVvcGxlfT48L2Npdi1wZW9wbGUtbGlzdD5cbiAgICA8L2Rpdj5cblxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNlYXJjaC1qdXJpc2RpY3Rpb25zXCIsXG4gIGNvbXBvbmVudChTZWFyY2hKdXJpc2RpY3Rpb25zLCB7XG4gICAgdXNlU2hhZG93RE9NOiBmYWxzZSxcbiAgICBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtdLFxuICB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuXG5mdW5jdGlvbiBQaWNvQ2hpcHNJbnB1dCh7IHZhbHVlID0gW10sIG9uQ2hhbmdlLCBwbGFjZWhvbGRlciA9IFwiQWRkLi4uXCIgfSkge1xuICBjb25zdCBbY2hpcHMsIHNldENoaXBzXSA9IHVzZVN0YXRlKHZhbHVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldENoaXBzKHZhbHVlKTtcbiAgfSwgW3ZhbHVlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkNoYW5nZSAmJiBvbkNoYW5nZShjaGlwcyk7XG4gIH0sIFtjaGlwc10pO1xuXG4gIGNvbnN0IGhhbmRsZUFkZCA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGlucHV0ID0gZS50YXJnZXQuZWxlbWVudHNbXCJjaGlwLWlucHV0XCJdO1xuICAgIGNvbnN0IHZhbCA9IGlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAodmFsICYmICFjaGlwcy5pbmNsdWRlcyh2YWwpKSB7XG4gICAgICBzZXRDaGlwcyhbLi4uY2hpcHMsIHZhbF0pO1xuICAgIH1cbiAgICBpbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmVtb3ZlID0gKGlkeCkgPT4ge1xuICAgIHNldENoaXBzKGNoaXBzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaWR4KSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgLnBpY28tY2hpcHMtcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBnYXA6IDAuNWVtO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTtcbiAgICAgIH1cbiAgICAgIC5waWNvLWNoaXAtYnRuIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBpY28tcHJpbWFyeS1iYWNrZ3JvdW5kLCAjZTBlOGYzKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcGljby1wcmltYXJ5LCAjMjY0NDc4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMmVtO1xuICAgICAgICBwYWRkaW5nOiAwLjE4ZW0gMC43ZW0gMC4xOGVtIDAuN2VtO1xuICAgICAgICBmb250LXNpemU6IDAuOTdlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgLnBpY28tY2hpcC1idG4gLmNsb3NlLXgge1xuICAgICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMS4xZW07XG4gICAgICAgIG9wYWNpdHk6IDAuNztcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG4gICAgICAucGljby1jaGlwLWJ0biAuY2xvc2UteDpob3ZlciB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG4gICAgICAucGljby1jaGlwcy1yb3cgaW5wdXRbdHlwZT1cInRleHRcIl0ge1xuICAgICAgICBtaW4td2lkdGg6IDEwMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvciwgI2UwZTBlMCk7XG4gICAgICAgIHBhZGRpbmc6IDAuMjVlbSAwLjc1ZW07XG4gICAgICAgIGZvbnQtc2l6ZTogMWVtO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXIgMC4ycztcbiAgICAgIH1cbiAgICAgIC5waWNvLWNoaXBzLXJvdyBpbnB1dFt0eXBlPVwidGV4dFwiXTpmb2N1cyB7XG4gICAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0tcGljby1wcmltYXJ5LCAjMGQ2ZWZkKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJwaWNvLWNoaXBzLXJvd1wiPlxuICAgICAgJHtjaGlwcy5tYXAoXG4gICAgICAgIChjaGlwLCBpKSA9PiBodG1sYFxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwaWNvLWNoaXAtYnRuXCJcbiAgICAgICAgICAgIEBjbGljaz0keygpID0+IGhhbmRsZVJlbW92ZShpKX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgJHtjaGlwfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+JHtjaGlwfTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2UteFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIGBcbiAgICAgICl9XG4gICAgICA8Zm9ybSBAc3VibWl0PSR7aGFuZGxlQWRkfSBzdHlsZT1cImRpc3BsYXk6IGlubGluZTtcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbmFtZT1cImNoaXAtaW5wdXRcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj0ke3BsYWNlaG9sZGVyfVxuICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIC8+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJwaWNvLWNoaXBzLWlucHV0XCIsXG4gIGNvbXBvbmVudChQaWNvQ2hpcHNJbnB1dCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgXCIuLi8uLi9iYXNpYy9jaGlwLmpzXCJcblxuZnVuY3Rpb24gTmFtZUNvbmZpZ0Zvcm0oeyBvbkNoYW5nZSwgaWRlbnRpdGllcyA9IHt9IH0pIHtcbiAgY29uc3QgW2NvbmZpZ3MsIHNldENvbmZpZ3NdID0gdXNlU3RhdGUoeyAuLi5pZGVudGl0aWVzIH0pO1xuICBjb25zdCBbbmV3SWRlbnRpdHksIHNldE5ld0lkZW50aXR5XSA9IHVzZVN0YXRlKFwiXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q29uZmlncyh7IC4uLmlkZW50aXRpZXMgfSk7XG4gIH0sIFtpZGVudGl0aWVzXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBvbkNoYW5nZShjb25maWdzKTtcbiAgfSwgW2NvbmZpZ3MsIG9uQ2hhbmdlXSk7XG5cbiAgY29uc3QgaGFuZGxlQWRkSWRlbnRpdHkgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBuYW1lID0gbmV3SWRlbnRpdHkudHJpbSgpO1xuICAgIGlmIChuYW1lICYmICFjb25maWdzW25hbWVdKSB7XG4gICAgICBzZXRDb25maWdzKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbbmFtZV06IFtdIH0pKTtcbiAgICAgIHNldE5ld0lkZW50aXR5KFwiXCIpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8ZGl2PlxuICAgICAgJHtPYmplY3Qua2V5cyhjb25maWdzKS5tYXAoXG4gICAgICAgIChpZGVudGl0eSkgPT4gaHRtbGBcbiAgICAgICAgICA8ZmllbGRzZXQgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxZW07XCI+XG4gICAgICAgICAgICA8bGFiZWw+JHtpZGVudGl0eX08L2xhYmVsPlxuICAgICAgICAgICAgPHBpY28tY2hpcHMtaW5wdXRcbiAgICAgICAgICAgICAgLnZhbHVlPSR7Y29uZmlnc1tpZGVudGl0eV0gfHwgW119XG4gICAgICAgICAgICAgIC5vbkNoYW5nZT0keyhjaGlwcykgPT4ge1xuICAgICAgICAgICAgICAgIHNldENvbmZpZ3MoKHByZXYpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICAgICAgW2lkZW50aXR5XTogY2hpcHMsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhbHRlcm5hdGUgbmFtZS4uLlwiXG4gICAgICAgICAgICA+PC9waWNvLWNoaXBzLWlucHV0PlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIGBcbiAgICAgICl9XG4gICAgICA8Zm9ybSBAc3VibWl0PSR7aGFuZGxlQWRkSWRlbnRpdHl9IHN0eWxlPVwibWFyZ2luLXRvcDogMWVtOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDAuNWVtO1wiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgLnZhbHVlPSR7bmV3SWRlbnRpdHl9XG4gICAgICAgICAgQGlucHV0PSR7KGUpID0+IHNldE5ld0lkZW50aXR5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBpZGVudGl0eSBuYW1lLi4uXCJcbiAgICAgICAgICBzdHlsZT1cImZsZXg6IDE7XCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzZWNvbmRhcnlcIj5BZGQgSWRlbnRpdHk8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcIm5hbWUtY29uZmlnLWZvcm1cIixcbiAgY29tcG9uZW50KE5hbWVDb25maWdGb3JtLCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSlcbik7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcbmltcG9ydCBcIi4uLy4uL2Jhc2ljL21vZGFsLmpzXCI7XG5cbmZ1bmN0aW9uIFNjcmFwZU1vZGFsKHsgb25TdGFydFNjcmFwZSwgdXJsID0gXCJcIiwgc291cmNlVXJscyA9IFtdLCBtb2RhbFByb3BzID0ge30sIGlkZW50aXRpZXMgPSB7fSB9KSB7XG4gIGNvbnN0IFtzY3JhcGVTY29wZSwgc2V0U2NyYXBlU2NvcGVdID0gdXNlU3RhdGUoXCJ0b3AtbGV2ZWwtdXJsXCIpO1xuICBjb25zdCBbY3VycmVudFVybCwgc2V0Q3VycmVudFVybF0gPSB1c2VTdGF0ZSh1cmwpO1xuICBjb25zdCBbY3VycmVudFNvdXJjZVVybHMsIHNldEN1cnJlbnRTb3VyY2VVcmxzXSA9IHVzZVN0YXRlKHNvdXJjZVVybHMpO1xuICBjb25zdCBbbmFtZUNvbmZpZ3MsIHNldE5hbWVDb25maWdzXSA9IHVzZVN0YXRlKHt9KTtcblxuICBjb25zdCBoYW5kbGVOYW1lQ29uZmlnc0NoYW5nZSA9IChjb25maWdzKSA9PiB7XG4gICAgc2V0TmFtZUNvbmZpZ3MoY29uZmlncyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2NvcGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBzZXRTY3JhcGVTY29wZShldmVudC50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0VXJsID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRVcmwodXJsKTtcbiAgfTtcblxuICBjb25zdCBhZGRTb3VyY2VVcmwgPSAoKSA9PiB7XG4gICAgc2V0Q3VycmVudFNvdXJjZVVybHMoWy4uLmN1cnJlbnRTb3VyY2VVcmxzLCBcIlwiXSk7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlU291cmNlVXJsID0gKGluZGV4KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFVybHMgPSBjdXJyZW50U291cmNlVXJscy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICBzZXRDdXJyZW50U291cmNlVXJscyh1cGRhdGVkVXJscyk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlVXJsQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudFVybChldmVudC50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNvdXJjZVVybENoYW5nZSA9IChpbmRleCwgZXZlbnQpID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVXJscyA9IFsuLi5jdXJyZW50U291cmNlVXJsc107XG4gICAgdXBkYXRlZFVybHNbaW5kZXhdID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHNldEN1cnJlbnRTb3VyY2VVcmxzKHVwZGF0ZWRVcmxzKTtcbiAgfTtcblxuICBjb25zdCBpc1ZhbGlkVXJsID0gKHVybFN0cmluZykgPT4ge1xuICAgIGlmICghdXJsU3RyaW5nIHx8IHVybFN0cmluZy50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgbmV3IFVSTCh1cmxTdHJpbmcpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRVcmxJc1ZhbGlkID0gKCkgPT4ge1xuICAgIHJldHVybiBpc1ZhbGlkVXJsKGN1cnJlbnRVcmwpO1xuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRTb3VyY2VVcmxzVmFsaWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGN1cnJlbnRTb3VyY2VVcmxzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGN1cnJlbnRTb3VyY2VVcmxzLmV2ZXJ5KCh1cmwpID0+IGlzVmFsaWRVcmwodXJsKSlcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGNhblN0YXJ0U2NyYXBlID1cbiAgICBzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgID8gY3VycmVudFVybElzVmFsaWQoKVxuICAgICAgOiBjdXJyZW50U291cmNlVXJsc1ZhbGlkKCk7XG5cbiAgY29uc3Qgc3VibWl0U2NyYXBlID0gKCkgPT4ge1xuICAgIGxldCBkYXRhID0ge307XG4gICAgaWYgKHNjcmFwZVNjb3BlID09IFwidG9wLWxldmVsLXVybFwiKSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICBzY3JhcGVTY29wZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHVybDogY3VycmVudFVybCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB7XG4gICAgICAgIHNjcmFwZVNjb3BlLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc291cmNlVXJsczogY3VycmVudFNvdXJjZVVybHMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICBkYXRhLmlkZW50aXRpZXMgPSBuYW1lQ29uZmlncztcbiAgICBvblN0YXJ0U2NyYXBlKGRhdGEpO1xuICB9O1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBodG1sYFxuICAgIDxmaWVsZHNldD5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICBpZD1cInRvcC1sZXZlbC11cmxcIlxuICAgICAgICBuYW1lPVwic2NyYXBlLXNjb3BlXCJcbiAgICAgICAgdmFsdWU9XCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJ9XG4gICAgICAgIEBjaGFuZ2U9JHtoYW5kbGVTY29wZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8bGFiZWwgZm9yPVwidG9wLWxldmVsLXVybFwiPlRvcC1sZXZlbCBVUkwgb25seTwvbGFiZWw+XG5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICBpZD1cInNwZWNpZmljLXVybHNcIlxuICAgICAgICBuYW1lPVwic2NyYXBlLXNjb3BlXCJcbiAgICAgICAgdmFsdWU9XCJzcGVjaWZpYy11cmxzXCJcbiAgICAgICAgP2NoZWNrZWQ9JHtzY3JhcGVTY29wZSA9PT0gXCJzcGVjaWZpYy11cmxzXCJ9XG4gICAgICAgIEBjaGFuZ2U9JHtoYW5kbGVTY29wZUNoYW5nZX1cbiAgICAgIC8+XG4gICAgICA8bGFiZWwgZm9yPVwic3BlY2lmaWMtdXJsc1wiPlNwZWNpZmljIFVSTHM8L2xhYmVsPlxuICAgIDwvZmllbGRzZXQ+XG5cbiAgICAke3NjcmFwZVNjb3BlID09PSBcInRvcC1sZXZlbC11cmxcIlxuICAgICAgPyBodG1sYFxuICAgICAgICAgIDxmaWVsZHNldCByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgLnZhbHVlPVwiJHtjdXJyZW50VXJsfVwiXG4gICAgICAgICAgICAgIEBpbnB1dD0ke2hhbmRsZVVybENoYW5nZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJzZWNvbmRhcnkgb3V0bGluZVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7cmVzZXRVcmx9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJlc2V0IFVSTFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGBcbiAgICAgIDogaHRtbGBcbiAgICAgICAgICAke2N1cnJlbnRTb3VyY2VVcmxzLm1hcChcbiAgICAgICAgICAgICh1cmwsIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICA8ZmllbGRzZXQgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIEBpbnB1dD0keyhlKSA9PiBoYW5kbGVTb3VyY2VVcmxDaGFuZ2UoaW5kZXgsIGUpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlY29uZGFyeSBvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IHJlbW92ZVNvdXJjZVVybChpbmRleCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICl9XG4gICAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHthZGRTb3VyY2VVcmx9PkFkZCBVUkw8L2J1dHRvbj5cbiAgICAgICAgYH1cblxuICAgIDxkZXRhaWxzIG5hbWU9XCJvdmVycmlkZS1uYW1lc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMS41ZW07XCI+XG4gICAgICA8c3VtbWFyeT5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEuMWVtO1wiPk5hbWUgQ29uZmlnczwvc3Bhbj5cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvciwgI2Y2ZjhmYSk7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IsICNlMGUwZTApO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNzVlbTtcbiAgICAgICAgICBwYWRkaW5nOiAxLjI1ZW0gMWVtIDFlbSAxZW07XG4gICAgICAgICAgbWFyZ2luLXRvcDogMWVtO1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCAwIHJnYmEoMCwwLDAsMC4wMyk7XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IsICM2NjYpOyBtYXJnaW4tYm90dG9tOiAxZW07XCI+XG4gICAgICAgICAgU29tZSBwZW9wbGUgZ28gYnkgbXVsdGlwbGUgbmFtZXMgdGhhdCBhcmVuJ3QgZWFzaWx5IGd1ZXNzYWJsZSB0byBiZVxuICAgICAgICAgIHRoZSBzYW1lIGlkZW50aXR5LiBTcGVjaWZ5IGFsdGVybmF0ZSBuYW1lcyBmb3IgaWRlbnRpdGllcyB0byBpbXByb3ZlXG4gICAgICAgICAgbWF0Y2hpbmcuXG4gICAgICAgIDwvcD5cbiAgICAgICAgPG5hbWUtY29uZmlnLWZvcm1cbiAgICAgICAgICAub25DaGFuZ2U9JHtoYW5kbGVOYW1lQ29uZmlnc0NoYW5nZX1cbiAgICAgICAgICAuaWRlbnRpdGllcz0ke2lkZW50aXRpZXN9XG4gICAgICAgID48L25hbWUtY29uZmlnLWZvcm0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2RldGFpbHM+XG4gIGA7XG5cbiAgY29uc3QgZm9vdGVyID0gaHRtbGBcbiAgICA8YnV0dG9uIEBjbGljaz0ke21vZGFsUHJvcHMub25DbG9zZX0gY2xhc3M9XCJzZWNvbmRhcnlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBAY2xpY2s9JHsoKSA9PiB7XG4gICAgICAgIHN1Ym1pdFNjcmFwZSgpO1xuICAgICAgICBtb2RhbFByb3BzLm9uQ2xvc2UoKTtcbiAgICAgIH19XG4gICAgICBjbGFzcz1cInByaW1hcnlcIlxuICAgICAgP2Rpc2FibGVkPSR7IWNhblN0YXJ0U2NyYXBlfVxuICAgID5cbiAgICAgIFN0YXJ0IFNjcmFwZVxuICAgIDwvYnV0dG9uPlxuICBgO1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxjaXYtbW9kYWxcbiAgICAgIC50aXRsZT0ke1wiVVJMcyB0byBTY3JhcGVcIn1cbiAgICAgIC5jb250ZW50PSR7Y29udGVudH1cbiAgICAgIC5mb290ZXI9JHtmb290ZXJ9XG4gICAgICAubW9kYWxQcm9wcz0ke21vZGFsUHJvcHN9XG4gICAgPjwvY2l2LW1vZGFsPlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXNjcmFwZS1tb2RhbFwiLFxuICBjb21wb25lbnQoU2NyYXBlTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrIH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHVzZVNTRSB9IGZyb20gXCIuLi9ob29rcy91c2VTc2UuanNcIjsgLy8gPC0tIEltcG9ydCB0aGUgaG9va1xuaW1wb3J0IFwiLi4vc2NyYXBlLWhpc3Rvcnkvc2NyYXBlLWhpc3RvcnktbGlzdC5qc1wiO1xuXG5jb25zdCBERUZBVUxUX0NFTlRFUiA9IFwiMzAuMjQxNzEsLTkxLjk5MTA0NFwiO1xuY29uc3QgQVBJX1VSTCA9IF9fQVBJX1VSTF9fO1xuXG5mdW5jdGlvbiBKdXJpc2RpY3Rpb25QYWdlKHsgXG4gIGp1cmlzZGljdGlvbl9vY2RpZCwgXG4gIGhpc3Rvcnlcbn0pIHtcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwZW9wbGUsIHNldFBlb3BsZV0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtzY3JhcGVNb2RhbE9wZW4sIHNldFNjcmFwZU1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7IFxuICBjb25zb2xlLmxvZyhcImRhdGFcIiwgZGF0YSk7XG4gIGNvbnN0IGlkZW50aXRpZXMgPSBwZW9wbGU/LnJlZHVjZSgoYWNjLCBwZXJzb24pID0+IHtcbiAgICBpZiAoYWNjW3BlcnNvbi5uYW1lXSkge1xuICAgICAgYWNjW3BlcnNvbi5uYW1lXSA9IFsuLi5uZXcgU2V0KFsuLi5hY2NbcGVyc29uLm5hbWVdLCAuLi4ocGVyc29uLm90aGVyX25hbWVzIHx8IFtdKV0pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW3BlcnNvbi5uYW1lXSA9IFsuLi5uZXcgU2V0KHBlcnNvbi5vdGhlcl9uYW1lcyB8fCBbXSldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG5cbiAgfSwge30pO1xuXG4gIGNvbnNvbGUubG9nKHtwZW9wbGUsIGlkZW50aXRpZXN9KVxuXG4gIGNvbnN0IHNzZVVybCA9IGp1cmlzZGljdGlvbl9vY2RpZFxuICAgID8gW2Ake0FQSV9VUkx9L2FwaS92MS9zc2Uvam9icy9zdGF0dXNgLFxuICAgICAgYD9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoanVyaXNkaWN0aW9uX29jZGlkKX1gLFxuICAgICAgYCZqb2JfdHlwZT1wZW9wbGVgXS5qb2luKFwiXCIpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IHtcbiAgICBkYXRhOiBqb2JTdGF0dXMsXG4gICAgaXNDb25uZWN0ZWQsXG4gICAgZXJyb3I6IHNzZUVycm9yLFxuICAgIC8vIGNvbm5lY3Q6IGNvbm5lY3RTdHJlYW0sXG4gICAgLy8gZGlzY29ubmVjdDogZGlzY29ubmVjdFN0cmVhbSxcbiAgfSA9IHVzZVNTRShzc2VVcmwsIHsgYXV0b0Nvbm5lY3Q6ICEhc3NlVXJsIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFqdXJpc2RpY3Rpb25fb2NkaWQpIHJldHVybjtcbiAgICBmZXRjaERhdGEoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbanVyaXNkaWN0aW9uRGF0YSwgcGVvcGxlRGF0YV0gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaEp1cmlzZGljdGlvbkRhdGEoanVyaXNkaWN0aW9uX29jZGlkKSxcbiAgICAgICAgZmV0Y2hQZW9wbGVEYXRhKGp1cmlzZGljdGlvbl9vY2RpZCksXG4gICAgICBdKTtcbiAgICBzZXREYXRhKGp1cmlzZGljdGlvbkRhdGEpO1xuICAgIHNldFBlb3BsZShwZW9wbGVEYXRhKTtcbiAgfTtcblxuICBjb25zdCBmZXRjaEp1cmlzZGljdGlvbkRhdGEgPSBhc3luYyAob2NkaWQpID0+IHtcbiAgICBjb25zdCBqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnM/anVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWR9JndpdGhfZ2VvbT10cnVlYCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogcmVzdWx0LmRhdGEsXG4gICAgICBnZW9fY2VudGVyOiByZXN1bHQuZ2VvX2NlbnRlcixcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGZldGNoUGVvcGxlRGF0YSA9IGFzeW5jIChvY2RpZCkgPT4ge1xuICAgIGNvbnN0IGVuY29kZWRPY2RpZCA9IGVuY29kZVVSSUNvbXBvbmVudChvY2RpZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9wZW9wbGU/anVyaXNkaWN0aW9uX29jZGlkPSR7ZW5jb2RlZE9jZGlkfWAsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjcmFwZU1vZGFsQ2xpY2sgPSAoKSA9PiBzZXRTY3JhcGVNb2RhbE9wZW4odHJ1ZSk7XG4gIGNvbnN0IGhhbmRsZVNjcmFwZU1vZGFsQ2xvc2UgPSAoKSA9PiBzZXRTY3JhcGVNb2RhbE9wZW4oZmFsc2UpO1xuXG4gIGNvbnN0IGhhbmRsZVNjcmFwZVN0YXJ0Q2xpY2sgPSBhc3luYyAoZGV0YWlscykgPT4ge1xuICAgIHNldFNjcmFwZU1vZGFsT3BlbihmYWxzZSk7IC8vIE9wdGlvbmFsbHkgY2xvc2UgbW9kYWwgb24gc3VibWl0XG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGp1cmlzZGljdGlvbl9vY2RpZDogZGF0YS5kYXRhLmlkLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHVybDogZGV0YWlscy5kYXRhLnVybCB8fCBkYXRhLmRhdGEudXJsLFxuICAgICAgICBuYW1lOiBkYXRhLmRhdGEubmFtZSxcbiAgICAgICAgc291cmNlX3VybHM6IGRldGFpbHMuZGF0YS5zb3VyY2VVcmxzLFxuICAgICAgICBpZGVudGl0aWVzOiBkZXRhaWxzLmRhdGEuaWRlbnRpdGllc1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvcGlwZWxpbmVzYCwge1xuICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNhblN0YXJ0U2NyYXBlID0gdHJ1ZTtcbiAgY29uc3Qgc2NyYXBlU3RhdHVzID0gZGF0YT8uZGF0YT8udXBkYXRlZF9hdCA/IGBTY3JhcGVkYCA6IGBVbnNjcmFwZWRgO1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJyZW07XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxjaXYtbWFwXG4gICAgICAgICAgICBjYW5tb3ZlPVwiZmFsc2VcIlxuICAgICAgICAgICAgLmxhdGxuZz0ke2RhdGEgJiYgZGF0YS5nZW9fY2VudGVyXG4gICAgICAgICAgICAgID8geyBsYXQ6IGRhdGEuZ2VvX2NlbnRlci5sYXQsIGxuZzogZGF0YS5nZW9fY2VudGVyLmxuZyB9XG4gICAgICAgICAgICAgIDogbnVsbH1cbiAgICAgICAgICA+PC9jaXYtbWFwPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICR7ZGF0YVxuICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgIDxoZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyO1wiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxoMiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDBcIj4ke2RhdGEuZGF0YS5uYW1lfTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjc1cmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA+U3RhdHVzOiAke3NjcmFwZVN0YXR1c308L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICAgICAgPGhyIC8+XG5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+SnVyaXNkaWN0aW9uIE9DRElEOjwvc3Ryb25nPiAke2RhdGEuZGF0YS5pZH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPldlYnNpdGU6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLnVybH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkdlb2lkOjwvc3Ryb25nPiAke2RhdGEuZGF0YS5nZW9pZH0gPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPlBvcHVsYXRpb246PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLnBvcHVsYXRpb24udG9Mb2NhbGVTdHJpbmcoKX1cbiAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgIDxoMz5TY3JhcGUgSGlzdG9yeTwvaDM+XG4gICAgICAgICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgICAgICAgPGNpdi1zY3JhcGUtaGlzdG9yeS1saXN0XG4gICAgICAgICAgICAgICAgICAuaGlzdG9yeT0ke2hpc3Rvcnl9XG4gICAgICAgICAgICAgICAgICAuam9iU3RhdHVzPSR7am9iU3RhdHVzfVxuICAgICAgICAgICAgICAgICAgLmlzQ29ubmVjdGVkPSR7aXNDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICAuc3NlRXJyb3I9JHtzc2VFcnJvcn1cbiAgICAgICAgICAgICAgICA+PC9jaXYtc2NyYXBlLWhpc3RvcnktbGlzdD5cblxuICAgICAgICAgICAgICAgIDxjaXYtc2NyYXBlLW1vZGFsXG4gICAgICAgICAgICAgICAgICAub25TdGFydFNjcmFwZT0ke2hhbmRsZVNjcmFwZVN0YXJ0Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAudXJsPSR7ZGF0YS5kYXRhLnVybH1cbiAgICAgICAgICAgICAgICAgIC5tb2RhbFByb3BzPSR7e1xuICAgICAgICAgICAgICAgICAgICBvcGVuOiBzY3JhcGVNb2RhbE9wZW4sXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGhhbmRsZVNjcmFwZU1vZGFsQ2xvc2UsXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlT25CYWNrZHJvcENsaWNrOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIC5pZGVudGl0aWVzPSR7aWRlbnRpdGllc31cbiAgICAgICAgICAgICAgICA+PC9jaXYtc2NyYXBlLW1vZGFsPiBcblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIEBjbGljaz0ke2hhbmRsZVNjcmFwZU1vZGFsQ2xpY2t9XG4gICAgICAgICAgICAgICAgICA/ZGlzYWJsZWQ9JHshY2FuU3RhcnRTY3JhcGV9XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFNjcmFwZSBEYXRhIGZvciBKdXJpc2RpY3Rpb25cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiBodG1sYCA8cD5Mb2FkaW5nIGp1cmlzZGljdGlvbiBkYXRhLi4uPC9wPiBgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aDI+RWxlY3RlZCBSZXByZXNlbnRhdGl2ZXM8L2gyPlxuICAgICAgPGNpdi1wZW9wbGUtbGlzdCAubG9jYWw9JHtwZW9wbGV9PjwvY2l2LXBlb3BsZS1saXN0PlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LWp1cmlzZGljdGlvbi1wYWdlXCIsXG4gIGNvbXBvbmVudChKdXJpc2RpY3Rpb25QYWdlLCB7XG4gICAgdXNlU2hhZG93RE9NOiBmYWxzZSxcbiAgICBvYnNlcnZlZEF0dHJpYnV0ZXM6IFtcbiAgICAgIFwianVyaXNkaWN0aW9uX29jZGlkXCIsIFxuICAgICAgXCJoaXN0b3J5XCJcbiAgICBdLFxuICB9KSxcbik7XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlRWZmZWN0LCB1c2VDYWxsYmFjayB9IGZyb20gXCJoYXVudGVkXCI7XG5cbi8qKlxuICogdXNlU1NFIC0gR2VuZXJhbGl6ZWQgU2VydmVyLVNlbnQgRXZlbnRzIGhvb2tcbiAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSBlbmRwb2ludCAtIFNTRSBlbmRwb2ludCBVUkwgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgVVJMXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlnIChlLmcuLCBhdXRvQ29ubmVjdClcbiAqIEByZXR1cm5zIHtvYmplY3R9IHsgZGF0YSwgaXNDb25uZWN0ZWQsIGVycm9yLCBjb25uZWN0LCBkaXNjb25uZWN0IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVNTRShlbmRwb2ludCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbaXNDb25uZWN0ZWQsIHNldElzQ29ubmVjdGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2V2ZW50U291cmNlLCBzZXRFdmVudFNvdXJjZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICBjb25zdCBnZXRVcmwgPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiAodHlwZW9mIGVuZHBvaW50ID09PSBcImZ1bmN0aW9uXCIgPyBlbmRwb2ludCgpIDogZW5kcG9pbnQpLFxuICAgIFtlbmRwb2ludF1cbiAgKTtcblxuICBjb25zdCBjb25uZWN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChldmVudFNvdXJjZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IGdldFVybCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlcyA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuICAgICAgc2V0RXZlbnRTb3VyY2UoZXMpO1xuICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgIGVzLm9ub3BlbiA9ICgpID0+IHNldElzQ29ubmVjdGVkKHRydWUpO1xuXG4gICAgICBlcy5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZXREYXRhKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc2V0RXJyb3IoXCJFcnJvciBwYXJzaW5nIFNTRSBkYXRhLlwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZXMub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTU0UgZXJyb3I6XCIsIGUpO1xuICAgICAgICBzZXRJc0Nvbm5lY3RlZChmYWxzZSk7XG4gICAgICAgIHNldEVycm9yKFwiU1NFIGNvbm5lY3Rpb24gZXJyb3IuXCIpO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRFcnJvcihcIkZhaWxlZCB0byBpbml0aWFsaXplIFNTRS5cIik7XG4gICAgfVxuICB9LCBbZXZlbnRTb3VyY2UsIGdldFVybF0pO1xuXG4gIGNvbnN0IGRpc2Nvbm5lY3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgc2V0RXZlbnRTb3VyY2UobnVsbCk7XG4gICAgICBzZXRJc0Nvbm5lY3RlZChmYWxzZSk7XG4gICAgfVxuICB9LCBbZXZlbnRTb3VyY2VdKTtcblxuICAvLyBBdXRvLWNvbm5lY3QgaWYgb3B0aW9ucy5hdXRvQ29ubmVjdCBpcyB0cnVlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuYXV0b0Nvbm5lY3QpIHtcbiAgICAgIGNvbm5lY3QoKTtcbiAgICB9XG4gICAgLy8gQ2xlYW51cCBvbiB1bm1vdW50XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChldmVudFNvdXJjZSkgZXZlbnRTb3VyY2UuY2xvc2UoKTtcbiAgICB9O1xuICB9LCBbb3B0aW9ucy5hdXRvQ29ubmVjdCwgY29ubmVjdCwgZXZlbnRTb3VyY2VdKTtcblxuICByZXR1cm4geyBkYXRhLCBpc0Nvbm5lY3RlZCwgZXJyb3IsIGNvbm5lY3QsIGRpc2Nvbm5lY3QgfTtcbn0iLCJpbXBvcnQgXCIuL2lucHV0cy9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9wZW9wbGUtbGlzdC5qc1wiXG5pbXBvcnQgXCIuL3NjcmFwZS1oaXN0b3J5L2luZGV4LmpzXCJcbmltcG9ydCBcIi4vc2VhcmNoLWp1cmlzZGljdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCBcIi4vanVyaXNkaWN0aW9uLXBhZ2UvaW5kZXguanNcIjtcblxuaW1wb3J0IHsgcmVnaXN0ZXJDaXZNYXAgfSBmcm9tIFwiQGNvbXBvbmVudHNcIjtcbnJlZ2lzdGVyQ2l2TWFwKCk7Il0sIm5hbWVzIjpbImdsb2JhbCIsImdsb2JhbFRoaXMiLCJkZWJ1Z0xvZ0V2ZW50IiwiZXZlbnQiLCJlbWl0TGl0RGVidWdMb2dFdmVudHMiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJpc3N1ZVdhcm5pbmciLCJkZWJ1Z0xvZ1JlbmRlcklkIiwibGl0SXNzdWVkV2FybmluZ3MiLCJTZXQiLCJjb2RlIiwid2FybmluZyIsImhhcyIsImNvbnNvbGUiLCJ3YXJuIiwiYWRkIiwicXVldWVNaWNyb3Rhc2siLCJ3cmFwIiwiU2hhZHlET00iLCJpblVzZSIsIm5vUGF0Y2giLCJub2RlIiwidHJ1c3RlZFR5cGVzIiwicG9saWN5IiwiY3JlYXRlUG9saWN5IiwiY3JlYXRlSFRNTCIsInMiLCJ1bmRlZmluZWQiLCJpZGVudGl0eUZ1bmN0aW9uIiwidmFsdWUiLCJub29wU2FuaXRpemVyIiwiX25vZGUiLCJfbmFtZSIsIl90eXBlIiwic2V0U2FuaXRpemVyIiwibmV3U2FuaXRpemVyIiwic2FuaXRpemVyRmFjdG9yeUludGVybmFsIiwiRXJyb3IiLCJfdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UiLCJjcmVhdGVTYW5pdGl6ZXIiLCJuYW1lIiwidHlwZSIsImJvdW5kQXR0cmlidXRlU3VmZml4IiwibWFya2VyIiwiTWF0aCIsInJhbmRvbSIsInRvRml4ZWQiLCJzbGljZSIsIm1hcmtlck1hdGNoIiwibm9kZU1hcmtlciIsImQiLCJkb2N1bWVudCIsImNyZWF0ZU1hcmtlciIsImNyZWF0ZUNvbW1lbnQiLCJpc1ByaW1pdGl2ZSIsImlzQXJyYXkiLCJBcnJheSIsIlNQQUNFX0NIQVIiLCJ0ZXh0RW5kUmVnZXgiLCJjb21tZW50RW5kUmVnZXgiLCJjb21tZW50MkVuZFJlZ2V4IiwidGFnRW5kUmVnZXgiLCJSZWdFeHAiLCJzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCIsImRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IiwicmF3VGV4dEVsZW1lbnQiLCJodG1sIiwic3RyaW5ncyIsInZhbHVlcyIsInNvbWUiLCJ2YWwiLCJfJGxpdFR5cGUkIiwibm9DaGFuZ2UiLCJTeW1ib2wiLCJmb3IiLCJub3RoaW5nIiwidGVtcGxhdGVDYWNoZSIsIldlYWtNYXAiLCJ3YWxrZXIiLCJjcmVhdGVUcmVlV2Fsa2VyIiwidHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmciLCJ0c2EiLCJzdHJpbmdGcm9tVFNBIiwiaGFzT3duUHJvcGVydHkiLCJtZXNzYWdlIiwidHJpbSIsInJlcGxhY2UiLCJUZW1wbGF0ZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInRoaXMiLCJwYXJ0cyIsIm5vZGVJbmRleCIsImF0dHJOYW1lSW5kZXgiLCJwYXJ0Q291bnQiLCJsZW5ndGgiLCJhdHRyTmFtZXMiLCJsIiwicmF3VGV4dEVuZFJlZ2V4IiwicmVnZXgiLCJpIiwiYXR0ck5hbWUiLCJtYXRjaCIsImF0dHJOYW1lRW5kSW5kZXgiLCJsYXN0SW5kZXgiLCJleGVjIiwidGVzdCIsImFzc2VydCIsImVuZCIsInN0YXJ0c1dpdGgiLCJwdXNoIiwiZ2V0VGVtcGxhdGVIdG1sIiwiZWwiLCJjcmVhdGVFbGVtZW50IiwiY3VycmVudE5vZGUiLCJjb250ZW50Iiwid3JhcHBlciIsImZpcnN0Q2hpbGQiLCJyZXBsYWNlV2l0aCIsImNoaWxkTm9kZXMiLCJuZXh0Tm9kZSIsIm5vZGVUeXBlIiwidGFnIiwibG9jYWxOYW1lIiwiaW5uZXJIVE1MIiwiaW5jbHVkZXMiLCJtIiwiaGFzQXR0cmlidXRlcyIsImdldEF0dHJpYnV0ZU5hbWVzIiwiZW5kc1dpdGgiLCJyZWFsTmFtZSIsInN0YXRpY3MiLCJnZXRBdHRyaWJ1dGUiLCJzcGxpdCIsImluZGV4IiwiY3RvciIsIlByb3BlcnR5UGFydCIsIkJvb2xlYW5BdHRyaWJ1dGVQYXJ0IiwiRXZlbnRQYXJ0IiwiQXR0cmlidXRlUGFydCIsInJlbW92ZUF0dHJpYnV0ZSIsInRhZ05hbWUiLCJ0ZXh0Q29udGVudCIsImVtcHR5U2NyaXB0IiwiYXBwZW5kIiwiZGF0YSIsImluZGV4T2YiLCJqb2luIiwia2luZCIsInRlbXBsYXRlIiwiY2xvbmFibGVUZW1wbGF0ZSIsIl9vcHRpb25zIiwicmVzb2x2ZURpcmVjdGl2ZSIsInBhcnQiLCJwYXJlbnQiLCJhdHRyaWJ1dGVJbmRleCIsImN1cnJlbnREaXJlY3RpdmUiLCJfX2RpcmVjdGl2ZXMiLCJfX2RpcmVjdGl2ZSIsIm5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciIsIl8kaW5pdGlhbGl6ZSIsIl8kcmVzb2x2ZSIsIlRlbXBsYXRlSW5zdGFuY2UiLCJfJHBhcnRzIiwiXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuIiwiXyR0ZW1wbGF0ZSIsIl8kcGFyZW50IiwicGFyZW50Tm9kZSIsIl8kaXNDb25uZWN0ZWQiLCJfY2xvbmUiLCJmcmFnbWVudCIsImNyZWF0aW9uU2NvcGUiLCJpbXBvcnROb2RlIiwicGFydEluZGV4IiwidGVtcGxhdGVQYXJ0IiwiQ2hpbGRQYXJ0IiwibmV4dFNpYmxpbmciLCJFbGVtZW50UGFydCIsIl91cGRhdGUiLCJ2YWx1ZUluZGV4IiwidGVtcGxhdGVJbnN0YW5jZSIsIl8kc2V0VmFsdWUiLCJfX2lzQ29ubmVjdGVkIiwic3RhcnROb2RlIiwiZW5kTm9kZSIsIl8kY29tbWl0dGVkVmFsdWUiLCJfJHN0YXJ0Tm9kZSIsIl8kZW5kTm9kZSIsImlzQ29ubmVjdGVkIiwiX3RleHRTYW5pdGl6ZXIiLCJkaXJlY3RpdmVQYXJlbnQiLCJzdGFydCIsIl8kY2xlYXIiLCJfY29tbWl0VGV4dCIsIl9jb21taXRUZW1wbGF0ZVJlc3VsdCIsImhvc3QiLCJfY29tbWl0Tm9kZSIsIml0ZXJhdG9yIiwiaXNJdGVyYWJsZSIsIl9jb21taXRJdGVyYWJsZSIsIl9pbnNlcnQiLCJpbnNlcnRCZWZvcmUiLCJwYXJlbnROb2RlTmFtZSIsIm5vZGVOYW1lIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSIsInJlc3VsdCIsIl8kZ2V0VGVtcGxhdGUiLCJoIiwiaW5zdGFuY2UiLCJnZXQiLCJzZXQiLCJpdGVtUGFydHMiLCJpdGVtUGFydCIsIml0ZW0iLCJmcm9tIiwiXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCIsIm4iLCJyZW1vdmUiLCJzZXRDb25uZWN0ZWQiLCJlbGVtZW50IiwiZmlsbCIsIlN0cmluZyIsIl9zYW5pdGl6ZXIiLCJub0NvbW1pdCIsImNoYW5nZSIsInYiLCJfY29tbWl0VmFsdWUiLCJzZXRBdHRyaWJ1dGUiLCJzdXBlciIsImFyZ3VtZW50cyIsInRvZ2dsZUF0dHJpYnV0ZSIsIm5ld0xpc3RlbmVyIiwib2xkTGlzdGVuZXIiLCJzaG91bGRSZW1vdmVMaXN0ZW5lciIsImNhcHR1cmUiLCJvbmNlIiwicGFzc2l2ZSIsInNob3VsZEFkZExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwiaGFuZGxlRXZlbnQiLCJjYWxsIiwicG9seWZpbGxTdXBwb3J0IiwibGl0SHRtbFBvbHlmaWxsU3VwcG9ydERldk1vZGUiLCJsaXRIdG1sVmVyc2lvbnMiLCJyZW5kZXIiLCJjb250YWluZXIiLCJUeXBlRXJyb3IiLCJyZW5kZXJJZCIsInBhcnRPd25lck5vZGUiLCJyZW5kZXJCZWZvcmUiLCJpZCIsImN1cnJlbnQiLCJjdXJyZW50SWQiLCJzZXRDdXJyZW50Iiwic3RhdGUiLCJjbGVhciIsInBoYXNlU3ltYm9sIiwiaG9va1N5bWJvbCIsInVwZGF0ZVN5bWJvbCIsImNvbW1pdFN5bWJvbCIsImVmZmVjdHNTeW1ib2wiLCJsYXlvdXRFZmZlY3RzU3ltYm9sIiwiY29udGV4dEV2ZW50IiwiU3RhdGUiLCJ1cGRhdGUiLCJ2aXJ0dWFsIiwiTWFwIiwicnVuIiwiY2IiLCJyZXMiLCJfcnVuRWZmZWN0cyIsInBoYXNlIiwiZWZmZWN0cyIsImVmZmVjdCIsInJ1bkVmZmVjdHMiLCJydW5MYXlvdXRFZmZlY3RzIiwidGVhcmRvd24iLCJmb3JFYWNoIiwiaG9vayIsImRlZmVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwiYmluZCIsInJ1bm5lciIsInRhc2tzIiwicnVuVGFza3MiLCJ0IiwibGVuIiwidGFzayIsInJlYWQiLCJ3cml0ZSIsIkJhc2VTY2hlZHVsZXIiLCJyZW5kZXJlciIsIl91cGRhdGVRdWV1ZWQiLCJoYW5kbGVQaGFzZSIsImFyZyIsImNvbW1pdCIsIm1ha2VDb21wb25lbnQiLCJTY2hlZHVsZXIiLCJmcmFnIiwiYmFzZUVsZW1lbnRPck9wdGlvbnMiLCJCYXNlRWxlbWVudCIsImJhc2VFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJ1c2VTaGFkb3dET00iLCJzaGFkb3dSb290SW5pdCIsIkVsZW1lbnQiLCJfc2NoZWR1bGVyIiwiYXR0YWNoU2hhZG93IiwibW9kZSIsInNoYWRvd1Jvb3QiLCJjb25uZWN0ZWRDYWxsYmFjayIsImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIlJlZmxlY3QiLCJfIiwiY2hhciIsInRvVXBwZXJDYXNlIiwidG9DYW1lbENhc2UiLCJwcm90byIsIlByb3h5IiwicHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJ0YXJnZXQiLCJrZXkiLCJyZWNlaXZlciIsImRlc2MiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpbml0aWFsVmFsdWUiLCJpc1NldHVwIiwiZnJlZXplIiwicmVmbGVjdGl2ZVByb3AiLCJkZWZpbmVQcm9wZXJ0eSIsInNldFByb3RvdHlwZU9mIiwiSG9vayIsInVzZSIsImFyZ3MiLCJob29rcyIsImNyZWF0ZUVmZmVjdCIsInNldEVmZmVjdHMiLCJjYWxsYmFjayIsImxhc3RWYWx1ZXMiLCJfdGVhcmRvd24iLCJpZ25vcmVkMSIsImlnbm9yZWQyIiwiaGFzQ2hhbmdlZCIsInVzZUVmZmVjdCIsInVzZUNvbnRleHQiLCJDb250ZXh0IiwiX3JhbkVmZmVjdCIsIl91bnN1YnNjcmliZSIsIl91cGRhdGVyIiwiX3N1YnNjcmliZSIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY29tcG9zZWQiLCJ1bnN1YnNjcmliZSIsImRlZmF1bHRWYWx1ZSIsInVzZU1lbW8iLCJmbiIsInVzZUNhbGxiYWNrIiwiaW5wdXRzIiwidXNlU3RhdGUiLCJ1cGRhdGVyIiwibWFrZUFyZ3MiLCJwcmV2aW91c1ZhbHVlIiwiaXMiLCJyZWR1Y2VyIiwiY3VycmVudFN0YXRlIiwiaW5pdGlhbFN0YXRlIiwiaW5pdCIsImRpc3BhdGNoIiwiYWN0aW9uIiwiUGFydFR5cGUiLCJEaXJlY3RpdmUiLCJfcGFydEluZm8iLCJfX3BhcnQiLCJfX2F0dHJpYnV0ZUluZGV4IiwicHJvcHMiLCJfcGFydCIsInN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyIsIlNoYWRvd1Jvb3QiLCJTaGFkeUNTUyIsIm5hdGl2ZVNoYWRvdyIsIkRvY3VtZW50IiwiQ1NTU3R5bGVTaGVldCIsImNvbnN0cnVjdGlvblRva2VuIiwiY3NzVGFnQ2FjaGUiLCJDU1NSZXN1bHQiLCJjc3NUZXh0Iiwic2FmZVRva2VuIiwiX3N0cmluZ3MiLCJzdHlsZVNoZWV0IiwiX3N0eWxlU2hlZXQiLCJjYWNoZWFibGUiLCJyZXBsYWNlU3luYyIsInRvU3RyaW5nIiwiY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQiLCJzaGVldCIsInJ1bGUiLCJjc3NSdWxlcyIsImdldENvbXBhdGlibGVTdHlsZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUiLCJyZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlIiwiSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSIsInByb3AiLCJfb2JqIiwiZGVmYXVsdENvbnZlcnRlciIsInRvQXR0cmlidXRlIiwiQm9vbGVhbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcm9tQXR0cmlidXRlIiwiZnJvbVZhbHVlIiwiTnVtYmVyIiwicGFyc2UiLCJlIiwibm90RXF1YWwiLCJvbGQiLCJkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbiIsImF0dHJpYnV0ZSIsImNvbnZlcnRlciIsInJlZmxlY3QiLCJ1c2VEZWZhdWx0IiwibWV0YWRhdGEiLCJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwiUmVhY3RpdmVFbGVtZW50IiwiYWRkSW5pdGlhbGl6ZXIiLCJpbml0aWFsaXplciIsIl9fcHJlcGFyZSIsIl9pbml0aWFsaXplcnMiLCJmaW5hbGl6ZSIsIl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCIsImtleXMiLCJjcmVhdGVQcm9wZXJ0eSIsImNyZWF0ZSIsIndyYXBwZWQiLCJlbGVtZW50UHJvcGVydGllcyIsIm5vQWNjZXNzb3IiLCJkZXNjcmlwdG9yIiwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiwicmVxdWVzdFVwZGF0ZSIsImdldFByb3BlcnR5T3B0aW9ucyIsInN1cGVyQ3RvciIsImZpbmFsaXplZCIsInByb3BlcnRpZXMiLCJwcm9wS2V5cyIsInAiLCJhdHRyIiwiX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkiLCJlbGVtZW50U3R5bGVzIiwiZmluYWxpemVTdHlsZXMiLCJzdHlsZXMiLCJmbGF0IiwiSW5maW5pdHkiLCJyZXZlcnNlIiwidW5zaGlmdCIsInRvTG93ZXJDYXNlIiwiX19pbnN0YW5jZVByb3BlcnRpZXMiLCJpc1VwZGF0ZVBlbmRpbmciLCJoYXNVcGRhdGVkIiwiX19yZWZsZWN0aW5nUHJvcGVydHkiLCJfX2luaXRpYWxpemUiLCJfX3VwZGF0ZVByb21pc2UiLCJlbmFibGVVcGRhdGluZyIsIl8kY2hhbmdlZFByb3BlcnRpZXMiLCJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCJhZGRDb250cm9sbGVyIiwiY29udHJvbGxlciIsIl9fY29udHJvbGxlcnMiLCJyZW5kZXJSb290IiwiaG9zdENvbm5lY3RlZCIsInJlbW92ZUNvbnRyb2xsZXIiLCJkZWxldGUiLCJpbnN0YW5jZVByb3BlcnRpZXMiLCJzaXplIiwiY3JlYXRlUmVuZGVyUm9vdCIsInNoYWRvd1Jvb3RPcHRpb25zIiwiYWRvcHRlZFN0eWxlU2hlZXRzIiwibWFwIiwic3R5bGUiLCJub25jZSIsImFwcGVuZENoaWxkIiwiYWRvcHRTdHlsZXMiLCJjIiwiX3JlcXVlc3RlZFVwZGF0ZSIsImhvc3REaXNjb25uZWN0ZWQiLCJfb2xkIiwiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwiX19wcm9wZXJ0eVRvQXR0cmlidXRlIiwiYXR0clZhbHVlIiwiZW5hYmxlZFdhcm5pbmdzIiwicHJvcE5hbWUiLCJjb252ZXJ0ZWRWYWx1ZSIsIl9fZGVmYXVsdFZhbHVlcyIsIkV2ZW50IiwiaGFzQXR0cmlidXRlIiwiXyRjaGFuZ2VQcm9wZXJ0eSIsIl9fZW5xdWV1ZVVwZGF0ZSIsImluaXRpYWxpemVWYWx1ZSIsIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCJyZWplY3QiLCJzY2hlZHVsZVVwZGF0ZSIsInBlcmZvcm1VcGRhdGUiLCJzaGFkb3dlZFByb3BlcnRpZXMiLCJmaWx0ZXIiLCJzaG91bGRVcGRhdGUiLCJjaGFuZ2VkUHJvcGVydGllcyIsIndpbGxVcGRhdGUiLCJob3N0VXBkYXRlIiwiX19tYXJrVXBkYXRlZCIsIl8kZGlkVXBkYXRlIiwiX2NoYW5nZWRQcm9wZXJ0aWVzIiwiaG9zdFVwZGF0ZWQiLCJmaXJzdFVwZGF0ZWQiLCJ1cGRhdGVkIiwidXBkYXRlQ29tcGxldGUiLCJnZXRVcGRhdGVDb21wbGV0ZSIsImVuc3VyZU93bldhcm5pbmdzIiwiZW5hYmxlV2FybmluZyIsImRpc2FibGVXYXJuaW5nIiwic3BsaWNlIiwicmVhY3RpdmVFbGVtZW50VmVyc2lvbnMiLCJMaXRFbGVtZW50IiwicmVuZGVyT3B0aW9ucyIsIl9fY2hpbGRQYXJ0IiwibGl0RWxlbWVudEh5ZHJhdGVTdXBwb3J0IiwibGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGUiLCJsaXRFbGVtZW50VmVyc2lvbnMiLCJ3aW5kb3ciLCJub3RpZnlDaGlsZHJlbkNvbm5lY3RlZENoYW5nZWQiLCJjaGlsZHJlbiIsIm9iaiIsInJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCIsImFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQiLCJpbnN0YWxsRGlzY29ubmVjdEFQSSIsInJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwibmV3UGFyZW50Iiwibm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZCIsImlzQ2xlYXJpbmdWYWx1ZSIsImZyb21QYXJ0SW5kZXgiLCJfJHJlcGFyZW50RGlzY29ubmVjdGFibGVzIiwiQXN5bmNEaXJlY3RpdmUiLCJpc0NsZWFyaW5nRGlyZWN0aXZlIiwicmVjb25uZWN0ZWQiLCJkaXNjb25uZWN0ZWQiLCJzZXRWYWx1ZSIsIm5ld1ZhbHVlcyIsImNvbXBvbmVudCIsImNyZWF0ZUNvbnRleHQiLCJQcm92aWRlciIsImxpc3RlbmVycyIsIl92YWx1ZSIsInN0b3BQcm9wYWdhdGlvbiIsIkNvbnN1bWVyIiwibWFrZUNvbnRleHQiLCJoYXVudGVkIiwibGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2siLCJyZWYiLCJfcmVmIiwicmVmQ2hhbmdlZCIsIl91cGRhdGVSZWZWYWx1ZSIsIl9sYXN0RWxlbWVudEZvclJlZiIsIl9lbGVtZW50IiwiX2NvbnRleHQiLCJjb250ZXh0IiwibGFzdEVsZW1lbnRGb3JDYWxsYmFjayIsIl8kbGl0RGlyZWN0aXZlJCIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIiwiZGlzYWJsZWQiLCJvcHRpb25zTWV0YWRhdGEiLCJsYWJlbCIsImlucHV0VmFsdWUiLCJwYWdlU2l6ZSIsInNlbGVjdGVkSXRlbSIsInNldFNlbGVjdGVkSXRlbSIsImFjdGl2ZUluZGV4Iiwic2V0QWN0aXZlSW5kZXgiLCJpc0xpc3RPcGVuIiwic2V0SXNMaXN0T3BlbiIsImlucHV0RWxlbWVudCIsInNldElucHV0RWxlbWVudCIsImN1cnJlbnRQYWdlIiwic2V0Q3VycmVudFBhZ2UiLCJzY3JvbGxUb0FjdGl2ZUl0ZW0iLCJ0cmlnZ2VyUGFyZW50RmV0Y2giLCJpbnB1dCIsInBhZ2UiLCJxdWVyeSIsImRlYm91bmNlZEZldGNoIiwiZnVuYyIsImRlbGF5IiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImFwcGx5IiwiZGVib3VuY2UiLCJzZWxlY3RJdGVtIiwiZm9jdXMiLCJoYXNQcmV2UGFnZSIsImxpbmtzIiwicHJldiIsImhhc05leHRQYWdlIiwibmV4dCIsImFjdGl2ZUl0ZW0iLCJxdWVyeVNlbGVjdG9yIiwic2Nyb2xsSW50b1ZpZXciLCJiZWhhdmlvciIsImJsb2NrIiwicHJldmVudERlZmF1bHQiLCJuZXdTdGF0ZSIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsInRvdGFsX2l0ZW1zIiwidG90YWxfcGFnZXMiLCJsb2NhbCIsInBlb3BsZSIsInBlcnNvbiIsImNkbl9pbWFnZSIsImltYWdlIiwib2ZmaWNlIiwiZGl2aXNpb25PY2RpZCIsImRpdmlzaW9uX29jZGlkIiwiaGFzU3ViZGl2aXNpb24iLCJnZXRTdWJkaXZpc2lvbkxhYmVsIiwic3ViRGl2aXNpb24iLCJlbWFpbHMiLCJwaG9uZXMiLCJ1cmxzIiwidGl0bGUiLCJmb290ZXIiLCJtb2RhbFByb3BzIiwib3BlbiIsInNldE9wZW4iLCJkaWFsb2dFbCIsImFyaWFMYWJlbCIsImNsb3NlT25CYWNrZHJvcENsaWNrIiwib25DbG9zZSIsIm1vZGFsUmVmIiwiaGlzdG9yeSIsImpvYlN0YXR1cyIsInBhcnNlZEhpc3RvcnkiLCJyZXF1ZXN0X2lkIiwiam9iIiwicHJvZ3Jlc3MiLCJzdGF0dXMiLCJtb2RhbE9wZW4iLCJzZXRNb2RhbE9wZW4iLCJzZWxlY3RlZEpvYiIsInNldFNlbGVjdGVkSm9iIiwiZm10RGF0ZSIsIkRhdGUiLCJpc05hTiIsImdldE1vbnRoIiwicGFkU3RhcnQiLCJnZXREYXRlIiwiZ2V0RnVsbFllYXIiLCJtb2RhbENvbnRlbnQiLCJjcmVhdGVkX2F0IiwidXBkYXRlZF9hdCIsImR1cmF0aW9uIiwiZmxvb3IiLCJyb3VuZCIsImdldER1cmF0aW9uU3RyaW5nIiwic291cmNlX3VybHMiLCJ1cmwiLCJzdGF0dXNDbGFzcyIsIm9wZW5Gb3IiLCJEdW1teVNjcmFwZUpvYkluZm8iLCJkdXJhdGlvbl9pbl9zIiwiY3JlYXRlZEF0IiwiZm9ybWF0dGVkQ3JlYXRlZEF0IiwidG9Mb2NhbGVTdHJpbmciLCJzZWNvbmRzIiwiZm9ybWF0RHVyYXRpb24iLCJ1Iiwic3RhdGVzIiwic2V0U3RhdGVzIiwianVyaXNkaWN0aW9ucyIsInNldEp1cmlzZGljdGlvbnMiLCJqdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEiLCJzZWxlY3RlZFN0YXRlIiwic2V0U2VsZWN0ZWRTdGF0ZSIsInNlbGVjdGVkSnVyaXNkaWN0aW9uIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb24iLCJqdXJpc2RpY3Rpb25JbnB1dFZhbHVlIiwic2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZSIsImlzSW5pdGlhbE1vdW50IiwiaGFuZGxlSW5wdXRDaGFuZ2UiLCJmZXRjaCIsImpzb24iLCJoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyIsImp1cmlzZGljdGlvbk9jZGlkIiwianVyaXNkaWN0aW9uX29jZGlkIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGltaXQiLCJqdXIiLCJqdXJpc2RpY3Rpb25fb2NkaWRfc2x1ZyIsImZpbmQiLCJsb2NhdGlvbiIsImhyZWYiLCJqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZCIsImp1cmlzZGljdGlvbkxpbmsiLCJzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkIiwic2V0U2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCIsInNldFBlb3BsZSIsImdlb2pzb24iLCJzZXRHZW9qc29uIiwic2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZEVuY29kZWQiLCJyZXNwb25zZSIsImhhbmRsZVNlbGVjdEp1cmlzZGljdGlvbkNoYW5nZSIsImxvZyIsImxhdGxuZyIsInpvb20iLCJsYXQiLCJsbmciLCJvbkNoYW5nZSIsInBsYWNlaG9sZGVyIiwiY2hpcHMiLCJzZXRDaGlwcyIsImNoaXAiLCJoYW5kbGVSZW1vdmUiLCJpZHgiLCJlbGVtZW50cyIsImlkZW50aXRpZXMiLCJjb25maWdzIiwic2V0Q29uZmlncyIsIm5ld0lkZW50aXR5Iiwic2V0TmV3SWRlbnRpdHkiLCJpZGVudGl0eSIsIm9uU3RhcnRTY3JhcGUiLCJzb3VyY2VVcmxzIiwic2NyYXBlU2NvcGUiLCJzZXRTY3JhcGVTY29wZSIsImN1cnJlbnRVcmwiLCJzZXRDdXJyZW50VXJsIiwiY3VycmVudFNvdXJjZVVybHMiLCJzZXRDdXJyZW50U291cmNlVXJscyIsIm5hbWVDb25maWdzIiwic2V0TmFtZUNvbmZpZ3MiLCJoYW5kbGVTY29wZUNoYW5nZSIsImlzVmFsaWRVcmwiLCJ1cmxTdHJpbmciLCJVUkwiLCJjYW5TdGFydFNjcmFwZSIsImV2ZXJ5IiwidXBkYXRlZFVybHMiLCJoYW5kbGVTb3VyY2VVcmxDaGFuZ2UiLCJyZW1vdmVTb3VyY2VVcmwiLCJzdWJtaXRTY3JhcGUiLCJzZXREYXRhIiwic2NyYXBlTW9kYWxPcGVuIiwic2V0U2NyYXBlTW9kYWxPcGVuIiwicmVkdWNlIiwiYWNjIiwib3RoZXJfbmFtZXMiLCJzc2VVcmwiLCJlcnJvciIsInNzZUVycm9yIiwiZW5kcG9pbnQiLCJzZXRJc0Nvbm5lY3RlZCIsInNldEVycm9yIiwiZXZlbnRTb3VyY2UiLCJzZXRFdmVudFNvdXJjZSIsImdldFVybCIsImNvbm5lY3QiLCJlcyIsIkV2ZW50U291cmNlIiwib25vcGVuIiwib25tZXNzYWdlIiwib25lcnJvciIsImRpc2Nvbm5lY3QiLCJjbG9zZSIsImF1dG9Db25uZWN0IiwidXNlU1NFIiwiZmV0Y2hEYXRhIiwiYXN5bmMiLCJqdXJpc2RpY3Rpb25EYXRhIiwicGVvcGxlRGF0YSIsImFsbCIsImZldGNoSnVyaXNkaWN0aW9uRGF0YSIsImZldGNoUGVvcGxlRGF0YSIsIm9jZGlkIiwiZ2VvX2NlbnRlciIsImVuY29kZWRPY2RpZCIsInNjcmFwZVN0YXR1cyIsImdlb2lkIiwicG9wdWxhdGlvbiIsImRldGFpbHMiLCJib2R5IiwiY29uZmlnIiwiaGVhZGVycyIsIm1ldGhvZCIsInJlZ2lzdGVyQ2l2TWFwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFVQSxNQUFNQSxFQUFTQyxXQU1UQyxFQUNDQyxJQUNvQkgsRUFDZEksdUJBSUxKLEVBQU9LLGNBQWMsSUFBSUMsWUFBWSxZQUFhLENBQzlDQyxPQUFRSixNQU9wQixJQUNJSyxFQURBQyxFQUFtQixFQUduQlQsRUFBT1Usb0JBQXNCLElBQUlDLElBTWpDSCxFQUFlLENBQUNJLEVBQU1DLEtBQ2xCQSxHQUFXRCxFQUNMLDRCQUE0QkEsMEJBQzVCLEdBQ0RaLEVBQU9VLGtCQUFrQkksSUFBSUQsSUFDN0JiLEVBQU9VLGtCQUFrQkksSUFBSUYsS0FDOUJHLFFBQVFDLEtBQUtILEdBQ2JiLEVBQU9VLGtCQUFrQk8sSUFBSUosS0FHckNLLGVBQWUsS0FDWFYsRUFBYSxXQUFZLHlEQUdqQyxNQUFNVyxFQUNGbkIsRUFBT29CLFVBQVVDLFFBQ1ksSUFBN0JyQixFQUFPb0IsVUFBVUUsUUFDZnRCLEVBQU9vQixTQUFTRCxLQUNmSSxHQUFTQSxFQUNWQyxFQUFleEIsRUFBT3dCLGFBU3RCQyxFQUFTRCxFQUNUQSxFQUFhRSxhQUFhLFdBQVksQ0FDcENDLFdBQWFDLEdBQU1BLFNBRXJCQyxFQUNBQyxFQUFvQkMsR0FBVUEsRUFDOUJDLEVBQWdCLENBQUNDLEVBQU9DLEVBQU9DLElBQVVMLEVBRXpDTSxFQUFnQkMsSUFJbEIsR0FBSUMsSUFBNkJOLEVBQzdCLE1BQU0sSUFBSU8sTUFBTSx1SEFHcEJELEVBQTJCRCxHQUt6QkcsRUFBZ0QsS0FDbERGLEVBQTJCTixHQUV6QlMsRUFBa0IsQ0FBQ2xCLEVBQU1tQixFQUFNQyxJQUMxQkwsRUFBeUJmLEVBQU1tQixFQUFNQyxH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REFBbURZLG9CQUUvQzlmLFFBQWVzZ0IsRUFBU25CLE9BQzlCLE1BQU8sQ0FDTGhqQixLQUFNNkQsRUFBTzdELEtBQ2I2b0IsV0FBWWhsQixFQUFPZ2xCLGFBSWpCRixFQUFrQkwsTUFBT00sSUFDN0IsTUFBTUUsRUFBZTFGLG1CQUFtQndGLEdBQ2xDekUsUUFBaUJwQixNQUNyQiw0Q0FBNEMrRixLQUc5QyxhQURxQjNFLEVBQVNuQixRQUNoQmhqQixNQXlCVitvQixFQUFlL29CLEdBQU1BLE1BQU1naEIsV0FBYSxVQUFZLFlBRTFELE9BQU8vbEIsQ0FBSTs7Ozs7O3NCQU1TK0UsR0FBUUEsRUFBSzZvQixXQUNuQixDQUFFckUsSUFBS3hrQixFQUFLNm9CLFdBQVdyRSxJQUFLQyxJQUFLemtCLEVBQUs2b0IsV0FBV3BFLEtBQ2pEOzs7OztZQUtKemtCLEVBQ0UvRSxDQUFJOzs7OzttREFLaUMrRSxFQUFLQSxLQUFLekc7O2lDQUU1Qnd2Qjs7Ozs7Ozt5REFPd0Ivb0IsRUFBS0EsS0FBSzZHOzhDQUNyQjdHLEVBQUtBLEtBQUtzaEI7NENBQ1p0aEIsRUFBS0EsS0FBS2dwQjtpREFDTGhwQixFQUFLQSxLQUFLaXBCLFdBQVdwSDs7Ozs7Ozs2QkFPekNqQzsrQkFDRUM7aUNBQ0VsZDs4QkFDSHlrQjs7OzttQ0E5REdrQixNQUFPWSxJQUNwQ3BDLEdBQW1CLEdBQ25CLE1BQU1xQyxFQUFPLENBQ1hoRyxtQkFBb0JuakIsRUFBS0EsS0FBSzZHLEdBQzlCdWlCLE9BQVEsQ0FDTjlILElBQUs0SCxFQUFRbHBCLEtBQUtzaEIsS0FBT3RoQixFQUFLQSxLQUFLc2hCLElBQ25DL25CLEtBQU15RyxFQUFLQSxLQUFLekcsS0FDaEI4bkIsWUFBYTZILEVBQVFscEIsS0FBS3lsQixXQUMxQlAsV0FBWWdFLEVBQVFscEIsS0FBS2tsQixtQkFHTG5DLE1BQU0saUJBQWtCLENBQzlDc0csUUFBUyxDQUFFLGVBQWdCLG9CQUMzQkMsT0FBUSxPQUNSSCxLQUFNNVgsS0FBS0MsVUFBVTJYO3lCQXFERm5wQixFQUFLQSxLQUFLc2hCO2dDQUNILENBQ1pqQyxLQUFNd0gsRUFDTm5ILFFBeEVhLElBQU1vSCxHQUFtQixHQXlFdENySCxzQkFBc0I7Z0NBRVZ5Rjs7OzsyQkE1RUMsSUFBTTRCLEdBQW1COytCQWlGNUI7Ozs7O2dCQU1oQjdyQixDQUFJOzs7OztnQ0FLY29qQjs7R0FHaEMsRUFJOEIsQ0FDMUJoVSxjQUFjLEVBQ2RELG1CQUFvQixDQUNsQixxQkFDQSxjRS9LTm1mIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMzJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvZGV2ZWxvcG1lbnQvbGl0LWh0bWwuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvaW50ZXJmYWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3N5bWJvbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc3RhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvc2NoZWR1bGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9ob29rLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL2NyZWF0ZS1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWVmZmVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtbWVtby5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtY2FsbGJhY2suanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLWxheW91dC1lZmZlY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvdXNlLXN0YXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1jb250cm9sbGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2hhdW50ZWQvbGliL3VzZS1yZWR1Y2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2xpdC1odG1sL2RldmVsb3BtZW50L2RpcmVjdGl2ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvY3NzLXRhZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvZGV2ZWxvcG1lbnQvcmVhY3RpdmUtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtZWxlbWVudC9kZXZlbG9wbWVudC9saXQtZWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmUtaGVscGVycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9hc3luYy1kaXJlY3RpdmUuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvbGl0LWhhdW50ZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvaGF1bnRlZC9saWIvY29yZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi9jcmVhdGUtY29udGV4dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9kZXZlbG9wbWVudC9kaXJlY3RpdmVzL3JlZi5qcyIsIi4uL2NvbXBvbmVudHMvZWRpdGFibGUtcGVvcGxlLWxpc3QuanMiLCIuLi9jb21wb25lbnRzL2lucHV0cy9hdXRvLWNvbXBsZXRlLXNlbGVjdC5qcyIsIi4uL2NvbXBvbmVudHMvcGVvcGxlLWxpc3QuanMiLCIuLi9jb21wb25lbnRzL2Jhc2ljL21vZGFsLmpzIiwiLi4vY29tcG9uZW50cy9zY3JhcGUtaGlzdG9yeS9zY3JhcGUtaGlzdG9yeS1tb2RhbC5qcyIsIi4uL2NvbXBvbmVudHMvc2NyYXBlLWhpc3Rvcnkvc2NyYXBlLWhpc3RvcnktbGlzdC5qcyIsIi4uL2NvbXBvbmVudHMvc2VhcmNoLWp1cmlzZGljdGlvbnMvc2VsZWN0LWp1cmlzZGljdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9oYXVudGVkL2xpYi91c2UtcmVmLmpzIiwiLi4vY29tcG9uZW50cy9zZWFyY2gtanVyaXNkaWN0aW9ucy9zZWFyY2gtanVyaXNkaWN0aW9ucy5qcyIsIi4uL2NvbXBvbmVudHMvYmFzaWMvY2hpcC5qcyIsIi4uL2NvbXBvbmVudHMvanVyaXNkaWN0aW9uLXBhZ2Uvc2NyYXBlLW1vZGFsL25hbWUtY29uZmlnLWZvcm0uanMiLCIuLi9jb21wb25lbnRzL2p1cmlzZGljdGlvbi1wYWdlL3NjcmFwZS1tb2RhbC9zY3JhcGUtbW9kYWwuanMiLCIuLi9jb21wb25lbnRzL2Jhc2ljL3BlcnNvbi1jYXJkLmpzIiwiLi4vY29tcG9uZW50cy9qdXJpc2RpY3Rpb24tcGFnZS9qdXJpc2RpY3Rpb24tcGFnZS5qcyIsIi4uL2NvbXBvbmVudHMvaG9va3MvdXNlU3NlLmpzIiwiLi4vY29tcG9uZW50cy9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuY29uc3QgREVWX01PREUgPSB0cnVlO1xuY29uc3QgRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9TSEFEWURPTV9OT1BBVENIID0gdHJ1ZTtcbmNvbnN0IE5PREVfTU9ERSA9IGZhbHNlO1xuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuLyoqXG4gKiBVc2VmdWwgZm9yIHZpc3VhbGl6aW5nIGFuZCBsb2dnaW5nIGluc2lnaHRzIGludG8gd2hhdCB0aGUgTGl0IHRlbXBsYXRlIHN5c3RlbSBpcyBkb2luZy5cbiAqXG4gKiBDb21waWxlZCBvdXQgb2YgcHJvZCBtb2RlIGJ1aWxkcy5cbiAqL1xuY29uc3QgZGVidWdMb2dFdmVudCA9IERFVl9NT0RFXG4gICAgPyAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IGdsb2JhbFxuICAgICAgICAgICAgLmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cztcbiAgICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2xvYmFsLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IGV2ZW50LFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIDogdW5kZWZpbmVkO1xuLy8gVXNlZCBmb3IgY29ubmVjdGluZyBiZWdpblJlbmRlciBhbmQgZW5kUmVuZGVyIGV2ZW50cyB3aGVuIHRoZXJlIGFyZSBuZXN0ZWRcbi8vIHJlbmRlcnMgd2hlbiBlcnJvcnMgYXJlIHRocm93biBwcmV2ZW50aW5nIGFuIGVuZFJlbmRlciBldmVudCBmcm9tIGJlaW5nXG4vLyBjYWxsZWQuXG5sZXQgZGVidWdMb2dSZW5kZXJJZCA9IDA7XG5sZXQgaXNzdWVXYXJuaW5nO1xuaWYgKERFVl9NT0RFKSB7XG4gICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAgICogV2FybmluZ3MgYXJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgb25seSBieSBgd2FybmluZ2A7IGRpc2FibGluZyB2aWEgYGNvZGVgXG4gICAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAgICovXG4gICAgaXNzdWVXYXJuaW5nID0gKGNvZGUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgd2FybmluZyArPSBjb2RlXG4gICAgICAgICAgICA/IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICBpZiAoIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMod2FybmluZykgJiZcbiAgICAgICAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKGNvZGUpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICAgICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuYWRkKHdhcm5pbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnZGV2LW1vZGUnLCBgTGl0IGlzIGluIGRldiBtb2RlLiBOb3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24hYCk7XG4gICAgfSk7XG59XG5jb25zdCB3cmFwID0gRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgICBnbG9iYWwuU2hhZHlET00/LmluVXNlICYmXG4gICAgZ2xvYmFsLlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyBnbG9iYWwuU2hhZHlET00ud3JhcFxuICAgIDogKG5vZGUpID0+IG5vZGU7XG5jb25zdCB0cnVzdGVkVHlwZXMgPSBnbG9iYWwudHJ1c3RlZFR5cGVzO1xuLyoqXG4gKiBPdXIgVHJ1c3RlZFR5cGVQb2xpY3kgZm9yIEhUTUwgd2hpY2ggaXMgZGVjbGFyZWQgdXNpbmcgdGhlIGh0bWwgdGVtcGxhdGVcbiAqIHRhZyBmdW5jdGlvbi5cbiAqXG4gKiBUaGF0IEhUTUwgaXMgYSBkZXZlbG9wZXItYXV0aG9yZWQgY29uc3RhbnQsIGFuZCBpcyBwYXJzZWQgd2l0aCBpbm5lckhUTUxcbiAqIGJlZm9yZSBhbnkgdW50cnVzdGVkIGV4cHJlc3Npb25zIGhhdmUgYmVlbiBtaXhlZCBpbi4gVGhlcmVmb3IgaXQgaXNcbiAqIGNvbnNpZGVyZWQgc2FmZSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmNvbnN0IHBvbGljeSA9IHRydXN0ZWRUeXBlc1xuICAgID8gdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnbGl0LWh0bWwnLCB7XG4gICAgICAgIGNyZWF0ZUhUTUw6IChzKSA9PiBzLFxuICAgIH0pXG4gICAgOiB1bmRlZmluZWQ7XG5jb25zdCBpZGVudGl0eUZ1bmN0aW9uID0gKHZhbHVlKSA9PiB2YWx1ZTtcbmNvbnN0IG5vb3BTYW5pdGl6ZXIgPSAoX25vZGUsIF9uYW1lLCBfdHlwZSkgPT4gaWRlbnRpdHlGdW5jdGlvbjtcbi8qKiBTZXRzIHRoZSBnbG9iYWwgc2FuaXRpemVyIGZhY3RvcnkuICovXG5jb25zdCBzZXRTYW5pdGl6ZXIgPSAobmV3U2FuaXRpemVyKSA9PiB7XG4gICAgaWYgKCFFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdGVkIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBsaXQtaHRtbCBzZWN1cml0eSBwb2xpY3kuYCArXG4gICAgICAgICAgICBgIHNldFNhbml0aXplRE9NVmFsdWVGYWN0b3J5IHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlLmApO1xuICAgIH1cbiAgICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgPSBuZXdTYW5pdGl6ZXI7XG59O1xuLyoqXG4gKiBPbmx5IHVzZWQgaW4gaW50ZXJuYWwgdGVzdHMsIG5vdCBhIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmNvbnN0IF90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSA9ICgpID0+IHtcbiAgICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgPSBub29wU2FuaXRpemVyO1xufTtcbmNvbnN0IGNyZWF0ZVNhbml0aXplciA9IChub2RlLCBuYW1lLCB0eXBlKSA9PiB7XG4gICAgcmV0dXJuIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChub2RlLCBuYW1lLCB0eXBlKTtcbn07XG4vLyBBZGRlZCB0byBhbiBhdHRyaWJ1dGUgbmFtZSB0byBtYXJrIHRoZSBhdHRyaWJ1dGUgYXMgYm91bmQgc28gd2UgY2FuIGZpbmRcbi8vIGl0IGVhc2lseS5cbmNvbnN0IGJvdW5kQXR0cmlidXRlU3VmZml4ID0gJyRsaXQkJztcbi8vIFRoaXMgbWFya2VyIGlzIHVzZWQgaW4gbWFueSBzeW50YWN0aWMgcG9zaXRpb25zIGluIEhUTUwsIHNvIGl0IG11c3QgYmVcbi8vIGEgdmFsaWQgZWxlbWVudCBuYW1lIGFuZCBhdHRyaWJ1dGUgbmFtZS4gV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIG5hbWVzICh5ZXQpXG4vLyBidXQgdGhpcyBhdCBsZWFzdCBlbnN1cmVzIHRoYXQgdGhlIHBhcnNlIHRyZWUgaXMgY2xvc2VyIHRvIHRoZSB0ZW1wbGF0ZVxuLy8gaW50ZW50aW9uLlxuY29uc3QgbWFya2VyID0gYGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYDtcbi8vIFN0cmluZyB1c2VkIHRvIHRlbGwgaWYgYSBjb21tZW50IGlzIGEgbWFya2VyIGNvbW1lbnRcbmNvbnN0IG1hcmtlck1hdGNoID0gJz8nICsgbWFya2VyO1xuLy8gVGV4dCB1c2VkIHRvIGluc2VydCBhIGNvbW1lbnQgbWFya2VyIG5vZGUuIFdlIHVzZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uXG4vLyBzeW50YXggYmVjYXVzZSBpdCdzIHNsaWdodGx5IHNtYWxsZXIsIGJ1dCBwYXJzZXMgYXMgYSBjb21tZW50IG5vZGUuXG5jb25zdCBub2RlTWFya2VyID0gYDwke21hcmtlck1hdGNofT5gO1xuY29uc3QgZCA9IE5PREVfTU9ERSAmJiBnbG9iYWwuZG9jdW1lbnQgPT09IHVuZGVmaW5lZFxuICAgID8ge1xuICAgICAgICBjcmVhdGVUcmVlV2Fsa2VyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9LFxuICAgIH1cbiAgICA6IGRvY3VtZW50O1xuLy8gQ3JlYXRlcyBhIGR5bmFtaWMgbWFya2VyLiBXZSBuZXZlciBoYXZlIHRvIHNlYXJjaCBmb3IgdGhlc2UgaW4gdGhlIERPTS5cbmNvbnN0IGNyZWF0ZU1hcmtlciA9ICgpID0+IGQuY3JlYXRlQ29tbWVudCgnJyk7XG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT0gJ2Z1bmN0aW9uJyk7XG5jb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmNvbnN0IGlzSXRlcmFibGUgPSAodmFsdWUpID0+IGlzQXJyYXkodmFsdWUpIHx8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0eXBlb2YgdmFsdWU/LltTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xuY29uc3QgU1BBQ0VfQ0hBUiA9IGBbIFxcdFxcblxcZlxccl1gO1xuY29uc3QgQVRUUl9WQUxVRV9DSEFSID0gYFteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV1gO1xuY29uc3QgTkFNRV9DSEFSID0gYFteXFxcXHNcIic+PS9dYDtcbi8vIFRoZXNlIHJlZ2V4ZXMgcmVwcmVzZW50IHRoZSBmaXZlIHBhcnNpbmcgc3RhdGVzIHRoYXQgd2UgY2FyZSBhYm91dCBpbiB0aGVcbi8vIFRlbXBsYXRlJ3MgSFRNTCBzY2FubmVyLiBUaGV5IG1hdGNoIHRoZSAqZW5kKiBvZiB0aGUgc3RhdGUgdGhleSdyZSBuYW1lZFxuLy8gYWZ0ZXIuXG4vLyBEZXBlbmRpbmcgb24gdGhlIG1hdGNoLCB3ZSB0cmFuc2l0aW9uIHRvIGEgbmV3IHN0YXRlLiBJZiB0aGVyZSdzIG5vIG1hdGNoLFxuLy8gd2Ugc3RheSBpbiB0aGUgc2FtZSBzdGF0ZS5cbi8vIE5vdGUgdGhhdCB0aGUgcmVnZXhlcyBhcmUgc3RhdGVmdWwuIFdlIHV0aWxpemUgbGFzdEluZGV4IGFuZCBzeW5jIGl0XG4vLyBhY3Jvc3MgdGhlIG11bHRpcGxlIHJlZ2V4ZXMgdXNlZC4gSW4gYWRkaXRpb24gdG8gdGhlIGZpdmUgcmVnZXhlcyBiZWxvd1xuLy8gd2UgYWxzbyBkeW5hbWljYWxseSBjcmVhdGUgYSByZWdleCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbmQgdGFncyBmb3IgcmF3XG4vLyB0ZXh0IGVsZW1lbnRzLlxuLyoqXG4gKiBFbmQgb2YgdGV4dCBpczogYDxgIGZvbGxvd2VkIGJ5OlxuICogICAoY29tbWVudCBzdGFydCkgb3IgKHRhZykgb3IgKGR5bmFtaWMgdGFnIGJpbmRpbmcpXG4gKi9cbmNvbnN0IHRleHRFbmRSZWdleCA9IC88KD86KCEtLXxcXC9bXmEtekEtWl0pfChcXC8/W2EtekEtWl1bXj5cXHNdKil8KFxcLz8kKSkvZztcbmNvbnN0IENPTU1FTlRfU1RBUlQgPSAxO1xuY29uc3QgVEFHX05BTUUgPSAyO1xuY29uc3QgRFlOQU1JQ19UQUdfTkFNRSA9IDM7XG5jb25zdCBjb21tZW50RW5kUmVnZXggPSAvLS0+L2c7XG4vKipcbiAqIENvbW1lbnRzIG5vdCBzdGFydGVkIHdpdGggPCEtLSwgbGlrZSA8L3ssIGNhbiBiZSBlbmRlZCBieSBhIHNpbmdsZSBgPmBcbiAqL1xuY29uc3QgY29tbWVudDJFbmRSZWdleCA9IC8+L2c7XG4vKipcbiAqIFRoZSB0YWdFbmQgcmVnZXggbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBcImluc2lkZSBhbiBvcGVuaW5nXCIgdGFnIHN5bnRheFxuICogcG9zaXRpb24uIEl0IGVpdGhlciBtYXRjaGVzIGEgYD5gLCBhbiBhdHRyaWJ1dGUtbGlrZSBzZXF1ZW5jZSwgb3IgdGhlIGVuZFxuICogb2YgdGhlIHN0cmluZyBhZnRlciBhIHNwYWNlIChhdHRyaWJ1dGUtbmFtZSBwb3NpdGlvbiBlbmRpbmcpLlxuICpcbiAqIFNlZSBhdHRyaWJ1dGVzIGluIHRoZSBIVE1MIHNwZWM6XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjZWxlbWVudHMtYXR0cmlidXRlc1xuICpcbiAqIFwiIFxcdFxcblxcZlxcclwiIGFyZSBIVE1MIHNwYWNlIGNoYXJhY3RlcnM6XG4gKiBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICpcbiAqIFNvIGFuIGF0dHJpYnV0ZSBpczpcbiAqICAqIFRoZSBuYW1lOiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCAoXCIpLCAoJyksIFwiPlwiLFxuICogICAgXCI9XCIsIG9yIFwiL1wiLiBOb3RlOiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBIVE1MIHNwZWMgd2hpY2ggYWxzbyBleGNsdWRlcyBjb250cm9sIGNoYXJhY3RlcnMuXG4gKiAgKiBGb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVyc1xuICogICogRm9sbG93ZWQgYnkgXCI9XCJcbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieTpcbiAqICAgICogQW55IGNoYXJhY3RlciBleGNlcHQgc3BhY2UsICgnKSwgKFwiKSwgXCI8XCIsIFwiPlwiLCBcIj1cIiwgKGApLCBvclxuICogICAgKiAoXCIpIHRoZW4gYW55IG5vbi0oXCIpLCBvclxuICogICAgKiAoJykgdGhlbiBhbnkgbm9uLSgnKVxuICovXG5jb25zdCB0YWdFbmRSZWdleCA9IG5ldyBSZWdFeHAoYD58JHtTUEFDRV9DSEFSfSg/Oigke05BTUVfQ0hBUn0rKSgke1NQQUNFX0NIQVJ9Kj0ke1NQQUNFX0NIQVJ9Kig/OiR7QVRUUl9WQUxVRV9DSEFSfXwoXCJ8Jyl8KSl8JClgLCAnZycpO1xuY29uc3QgRU5USVJFX01BVENIID0gMDtcbmNvbnN0IEFUVFJJQlVURV9OQU1FID0gMTtcbmNvbnN0IFNQQUNFU19BTkRfRVFVQUxTID0gMjtcbmNvbnN0IFFVT1RFX0NIQVIgPSAzO1xuY29uc3Qgc2luZ2xlUXVvdGVBdHRyRW5kUmVnZXggPSAvJy9nO1xuY29uc3QgZG91YmxlUXVvdGVBdHRyRW5kUmVnZXggPSAvXCIvZztcbi8qKlxuICogTWF0Y2hlcyB0aGUgcmF3IHRleHQgZWxlbWVudHMuXG4gKlxuICogQ29tbWVudHMgYXJlIG5vdCBwYXJzZWQgd2l0aGluIHJhdyB0ZXh0IGVsZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGVpclxuICogdGV4dCBjb250ZW50IGZvciBtYXJrZXIgc3RyaW5ncy5cbiAqL1xuY29uc3QgcmF3VGV4dEVsZW1lbnQgPSAvXig/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZSkkL2k7XG4vKiogVGVtcGxhdGVSZXN1bHQgdHlwZXMgKi9cbmNvbnN0IEhUTUxfUkVTVUxUID0gMTtcbmNvbnN0IFNWR19SRVNVTFQgPSAyO1xuY29uc3QgTUFUSE1MX1JFU1VMVCA9IDM7XG4vLyBUZW1wbGF0ZVBhcnQgdHlwZXNcbi8vIElNUE9SVEFOVDogdGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIFBhcnRUeXBlXG5jb25zdCBBVFRSSUJVVEVfUEFSVCA9IDE7XG5jb25zdCBDSElMRF9QQVJUID0gMjtcbmNvbnN0IFBST1BFUlRZX1BBUlQgPSAzO1xuY29uc3QgQk9PTEVBTl9BVFRSSUJVVEVfUEFSVCA9IDQ7XG5jb25zdCBFVkVOVF9QQVJUID0gNTtcbmNvbnN0IEVMRU1FTlRfUEFSVCA9IDY7XG5jb25zdCBDT01NRU5UX1BBUlQgPSA3O1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBUZW1wbGF0ZVJlc3VsdCB3aXRoXG4gKiB0aGUgZ2l2ZW4gcmVzdWx0IHR5cGUuXG4gKi9cbmNvbnN0IHRhZyA9ICh0eXBlKSA9PiAoc3RyaW5ncywgLi4udmFsdWVzKSA9PiB7XG4gICAgLy8gV2FybiBhZ2FpbnN0IHRlbXBsYXRlcyBvY3RhbCBlc2NhcGUgc2VxdWVuY2VzXG4gICAgLy8gV2UgZG8gdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluIHJlbmRlciBzbyB0aGF0IHRoZSB3YXJuaW5nIGlzIGNsb3NlciB0byB0aGVcbiAgICAvLyB0ZW1wbGF0ZSBkZWZpbml0aW9uLlxuICAgIGlmIChERVZfTU9ERSAmJiBzdHJpbmdzLnNvbWUoKHMpID0+IHMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTb21lIHRlbXBsYXRlIHN0cmluZ3MgYXJlIHVuZGVmaW5lZC5cXG4nICtcbiAgICAgICAgICAgICdUaGlzIGlzIHByb2JhYmx5IGNhdXNlZCBieSBpbGxlZ2FsIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZXMuJyk7XG4gICAgfVxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAvLyBJbXBvcnQgc3RhdGljLWh0bWwuanMgcmVzdWx0cyBpbiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hpY2ggZzMgZG9lc24ndFxuICAgICAgICAvLyBoYW5kbGUuIEluc3RlYWQgd2Uga25vdyB0aGF0IHN0YXRpYyB2YWx1ZXMgbXVzdCBoYXZlIHRoZSBmaWVsZFxuICAgICAgICAvLyBgXyRsaXRTdGF0aWMkYC5cbiAgICAgICAgaWYgKHZhbHVlcy5zb21lKCh2YWwpID0+IHZhbD8uWydfJGxpdFN0YXRpYyQnXSkpIHtcbiAgICAgICAgICAgIGlzc3VlV2FybmluZygnJywgYFN0YXRpYyB2YWx1ZXMgJ2xpdGVyYWwnIG9yICd1bnNhZmVTdGF0aWMnIGNhbm5vdCBiZSB1c2VkIGFzIHZhbHVlcyB0byBub24tc3RhdGljIHRlbXBsYXRlcy5cXG5gICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSB0aGUgc3RhdGljICdodG1sJyB0YWcgZnVuY3Rpb24uIFNlZSBodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI3N0YXRpYy1leHByZXNzaW9uc2ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIFsnXyRsaXRUeXBlJCddOiB0eXBlLFxuICAgICAgICBzdHJpbmdzLFxuICAgICAgICB2YWx1ZXMsXG4gICAgfTtcbn07XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGFuIEhUTUwgdGVtcGxhdGUgdGhhdCBjYW4gZWZmaWNpZW50bHlcbiAqIHJlbmRlciB0byBhbmQgdXBkYXRlIGEgY29udGFpbmVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBoZWFkZXIgPSAodGl0bGU6IHN0cmluZykgPT4gaHRtbGA8aDE+JHt0aXRsZX08L2gxPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYGh0bWxgIHRhZyByZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIERPTSB0byByZW5kZXIgYXMgYSB2YWx1ZS4gSXQgaXNcbiAqIGxhenksIG1lYW5pbmcgbm8gd29yayBpcyBkb25lIHVudGlsIHRoZSB0ZW1wbGF0ZSBpcyByZW5kZXJlZC4gV2hlbiByZW5kZXJpbmcsXG4gKiBpZiBhIHRlbXBsYXRlIGNvbWVzIGZyb20gdGhlIHNhbWUgZXhwcmVzc2lvbiBhcyBhIHByZXZpb3VzbHkgcmVuZGVyZWQgcmVzdWx0LFxuICogaXQncyBlZmZpY2llbnRseSB1cGRhdGVkIGluc3RlYWQgb2YgcmVwbGFjZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBodG1sID0gdGFnKEhUTUxfUkVTVUxUKTtcbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gU1ZHIGZyYWdtZW50IHRoYXQgY2FuIGVmZmljaWVudGx5IHJlbmRlclxuICogdG8gYW5kIHVwZGF0ZSBhIGNvbnRhaW5lci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVjdCA9IHN2Z2A8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIj48L3JlY3Q+YDtcbiAqXG4gKiBjb25zdCBteUltYWdlID0gaHRtbGBcbiAqICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwIDEwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICogICAgICR7cmVjdH1cbiAqICAgPC9zdmc+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgc3ZnYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBTVkcgZnJhZ21lbnRzLCBvciBlbGVtZW50c1xuICogdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhbiBgPHN2Zz5gIEhUTUwgZWxlbWVudC4gQSBjb21tb24gZXJyb3IgaXNcbiAqIHBsYWNpbmcgYW4gYDxzdmc+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYHN2Z2AgdGFnXG4gKiBmdW5jdGlvbi4gVGhlIGA8c3ZnPmAgZWxlbWVudCBpcyBhbiBIVE1MIGVsZW1lbnQgYW5kIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhXG4gKiB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUge0BsaW5rY29kZSBodG1sfSB0YWcgZnVuY3Rpb24uXG4gKlxuICogSW4gTGl0RWxlbWVudCB1c2FnZSwgaXQncyBpbnZhbGlkIHRvIHJldHVybiBhbiBTVkcgZnJhZ21lbnQgZnJvbSB0aGVcbiAqIGByZW5kZXIoKWAgbWV0aG9kLCBhcyB0aGUgU1ZHIGZyYWdtZW50IHdpbGwgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgZWxlbWVudCdzXG4gKiBzaGFkb3cgcm9vdCBhbmQgdGh1cyBub3QgYmUgcHJvcGVybHkgY29udGFpbmVkIHdpdGhpbiBhbiBgPHN2Zz5gIEhUTUxcbiAqIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBzdmcgPSB0YWcoU1ZHX1JFU1VMVCk7XG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIE1hdGhNTCBmcmFnbWVudCB0aGF0IGNhbiBlZmZpY2llbnRseSByZW5kZXJcbiAqIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG51bSA9IG1hdGhtbGA8bW4+MTwvbW4+YDtcbiAqXG4gKiBjb25zdCBlcSA9IGh0bWxgXG4gKiAgIDxtYXRoPlxuICogICAgICR7bnVtfVxuICogICA8L21hdGg+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgbWF0aG1sYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBNYXRoTUwgZnJhZ21lbnRzLCBvclxuICogZWxlbWVudHMgdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhIGA8bWF0aD5gIEhUTUwgZWxlbWVudC4gQSBjb21tb25cbiAqIGVycm9yIGlzIHBsYWNpbmcgYSBgPG1hdGg+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYG1hdGhtbGBcbiAqIHRhZyBmdW5jdGlvbi4gVGhlIGA8bWF0aD5gIGVsZW1lbnQgaXMgYW4gSFRNTCBlbGVtZW50IGFuZCBzaG91bGQgYmUgdXNlZFxuICogd2l0aGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIHtAbGlua2NvZGUgaHRtbH0gdGFnIGZ1bmN0aW9uLlxuICpcbiAqIEluIExpdEVsZW1lbnQgdXNhZ2UsIGl0J3MgaW52YWxpZCB0byByZXR1cm4gYW4gTWF0aE1MIGZyYWdtZW50IGZyb20gdGhlXG4gKiBgcmVuZGVyKClgIG1ldGhvZCwgYXMgdGhlIE1hdGhNTCBmcmFnbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlXG4gKiBlbGVtZW50J3Mgc2hhZG93IHJvb3QgYW5kIHRodXMgbm90IGJlIHByb3Blcmx5IGNvbnRhaW5lZCB3aXRoaW4gYSBgPG1hdGg+YFxuICogSFRNTCBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgbWF0aG1sID0gdGFnKE1BVEhNTF9SRVNVTFQpO1xuLyoqXG4gKiBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgc2lnbmFscyB0aGF0IGEgdmFsdWUgd2FzIGhhbmRsZWQgYnkgYSBkaXJlY3RpdmUgYW5kXG4gKiBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vQ2hhbmdlID0gU3ltYm9sLmZvcignbGl0LW5vQ2hhbmdlJyk7XG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIGEgQ2hpbGRQYXJ0IHRvIGZ1bGx5IGNsZWFyIGl0cyBjb250ZW50LlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBidXR0b24gPSBodG1sYCR7XG4gKiAgdXNlci5pc0FkbWluXG4gKiAgICA/IGh0bWxgPGJ1dHRvbj5ERUxFVEU8L2J1dHRvbj5gXG4gKiAgICA6IG5vdGhpbmdcbiAqIH1gO1xuICogYGBgXG4gKlxuICogUHJlZmVyIHVzaW5nIGBub3RoaW5nYCBvdmVyIG90aGVyIGZhbHN5IHZhbHVlcyBhcyBpdCBwcm92aWRlcyBhIGNvbnNpc3RlbnRcbiAqIGJlaGF2aW9yIGJldHdlZW4gdmFyaW91cyBleHByZXNzaW9uIGJpbmRpbmcgY29udGV4dHMuXG4gKlxuICogSW4gY2hpbGQgZXhwcmVzc2lvbnMsIGB1bmRlZmluZWRgLCBgbnVsbGAsIGAnJ2AsIGFuZCBgbm90aGluZ2AgYWxsIGJlaGF2ZSB0aGVcbiAqIHNhbWUgYW5kIHJlbmRlciBubyBub2Rlcy4gSW4gYXR0cmlidXRlIGV4cHJlc3Npb25zLCBgbm90aGluZ2AgX3JlbW92ZXNfIHRoZVxuICogYXR0cmlidXRlLCB3aGlsZSBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHdpbGwgcmVuZGVyIGFuIGVtcHR5IHN0cmluZy4gSW5cbiAqIHByb3BlcnR5IGV4cHJlc3Npb25zIGBub3RoaW5nYCBiZWNvbWVzIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IFN5bWJvbC5mb3IoJ2xpdC1ub3RoaW5nJyk7XG4vKipcbiAqIFRoZSBjYWNoZSBvZiBwcmVwYXJlZCB0ZW1wbGF0ZXMsIGtleWVkIGJ5IHRoZSB0YWdnZWQgVGVtcGxhdGVTdHJpbmdzQXJyYXlcbiAqIGFuZCBfbm90XyBhY2NvdW50aW5nIGZvciB0aGUgc3BlY2lmaWMgdGVtcGxhdGUgdGFnIHVzZWQuIFRoaXMgbWVhbnMgdGhhdFxuICogdGVtcGxhdGUgdGFncyBjYW5ub3QgYmUgZHluYW1pYyAtIHRoZXkgbXVzdCBzdGF0aWNhbGx5IGJlIG9uZSBvZiBodG1sLCBzdmcsXG4gKiBvciBhdHRyLiBUaGlzIHJlc3RyaWN0aW9uIHNpbXBsaWZpZXMgdGhlIGNhY2hlIGxvb2t1cCwgd2hpY2ggaXMgb24gdGhlIGhvdFxuICogcGF0aCBmb3IgcmVuZGVyaW5nLlxuICovXG5jb25zdCB0ZW1wbGF0ZUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHdhbGtlciA9IGQuY3JlYXRlVHJlZVdhbGtlcihkLCAxMjkgLyogTm9kZUZpbHRlci5TSE9XX3tFTEVNRU5UfENPTU1FTlR9ICovKTtcbmxldCBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgPSBub29wU2FuaXRpemVyO1xuZnVuY3Rpb24gdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcodHNhLCBzdHJpbmdGcm9tVFNBKSB7XG4gICAgLy8gQSBzZWN1cml0eSBjaGVjayB0byBwcmV2ZW50IHNwb29maW5nIG9mIExpdCB0ZW1wbGF0ZSByZXN1bHRzLlxuICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIG1heSBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyB3aXRoIEFycmF5LmlzVGVtcGxhdGVPYmplY3QsXG4gICAgLy8gdGhvdWdoIHdlIG1pZ2h0IG5lZWQgdG8gbWFrZSB0aGF0IGNoZWNrIGluc2lkZSBvZiB0aGUgaHRtbCBhbmQgc3ZnXG4gICAgLy8gZnVuY3Rpb25zLCBiZWNhdXNlIHByZWNvbXBpbGVkIHRlbXBsYXRlcyBkb24ndCBjb21lIGluIGFzXG4gICAgLy8gVGVtcGxhdGVTdHJpbmdBcnJheSBvYmplY3RzLlxuICAgIGlmICghaXNBcnJheSh0c2EpIHx8ICF0c2EuaGFzT3duUHJvcGVydHkoJ3JhdycpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ2ludmFsaWQgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSc7XG4gICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGBcbiAgICAgICAgICBJbnRlcm5hbCBFcnJvcjogZXhwZWN0ZWQgdGVtcGxhdGUgc3RyaW5ncyB0byBiZSBhbiBhcnJheVxuICAgICAgICAgIHdpdGggYSAncmF3JyBmaWVsZC4gRmFraW5nIGEgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSBieVxuICAgICAgICAgIGNhbGxpbmcgaHRtbCBvciBzdmcgbGlrZSBhbiBvcmRpbmFyeSBmdW5jdGlvbiBpcyBlZmZlY3RpdmVseVxuICAgICAgICAgIHRoZSBzYW1lIGFzIGNhbGxpbmcgdW5zYWZlSHRtbCBhbmQgY2FuIGxlYWQgdG8gbWFqb3Igc2VjdXJpdHlcbiAgICAgICAgICBpc3N1ZXMsIGUuZy4gb3BlbmluZyB5b3VyIGNvZGUgdXAgdG8gWFNTIGF0dGFja3MuXG4gICAgICAgICAgSWYgeW91J3JlIHVzaW5nIHRoZSBodG1sIG9yIHN2ZyB0YWdnZWQgdGVtcGxhdGUgZnVuY3Rpb25zIG5vcm1hbGx5XG4gICAgICAgICAgYW5kIHN0aWxsIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhIGJ1ZyBhdFxuICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy9uZXc/dGVtcGxhdGU9YnVnX3JlcG9ydC5tZFxuICAgICAgICAgIGFuZCBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgYnVpbGQgdG9vbGluZywgaWYgYW55LlxuICAgICAgICBgXG4gICAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4gKi9nLCAnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcG9saWN5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBwb2xpY3kuY3JlYXRlSFRNTChzdHJpbmdGcm9tVFNBKVxuICAgICAgICA6IHN0cmluZ0Zyb21UU0E7XG59XG4vKipcbiAqIFJldHVybnMgYW4gSFRNTCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBUZW1wbGF0ZVN0cmluZ3NBcnJheSBhbmQgcmVzdWx0IHR5cGVcbiAqIChIVE1MIG9yIFNWRyksIGFsb25nIHdpdGggdGhlIGNhc2Utc2Vuc2l0aXZlIGJvdW5kIGF0dHJpYnV0ZSBuYW1lcyBpblxuICogdGVtcGxhdGUgb3JkZXIuIFRoZSBIVE1MIGNvbnRhaW5zIGNvbW1lbnQgbWFya2VycyBkZW5vdGluZyB0aGUgYENoaWxkUGFydGBzXG4gKiBhbmQgc3VmZml4ZXMgb24gYm91bmQgYXR0cmlidXRlcyBkZW5vdGluZyB0aGUgYEF0dHJpYnV0ZVBhcnRzYC5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5XG4gKiBAcGFyYW0gdHlwZSBIVE1MIG9yIFNWR1xuICogQHJldHVybiBBcnJheSBjb250YWluaW5nIGBbaHRtbCwgYXR0ck5hbWVzXWAgKGFycmF5IHJldHVybmVkIGZvciB0ZXJzZW5lc3MsXG4gKiAgICAgdG8gYXZvaWQgb2JqZWN0IGZpZWxkcyBzaW5jZSB0aGlzIGNvZGUgaXMgc2hhcmVkIHdpdGggbm9uLW1pbmlmaWVkIFNTUlxuICogICAgIGNvZGUpXG4gKi9cbmNvbnN0IGdldFRlbXBsYXRlSHRtbCA9IChzdHJpbmdzLCB0eXBlKSA9PiB7XG4gICAgLy8gSW5zZXJ0IG1ha2VycyBpbnRvIHRoZSB0ZW1wbGF0ZSBIVE1MIHRvIHJlcHJlc2VudCB0aGUgcG9zaXRpb24gb2ZcbiAgICAvLyBiaW5kaW5ncy4gVGhlIGZvbGxvd2luZyBjb2RlIHNjYW5zIHRoZSB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGRldGVybWluZSB0aGVcbiAgICAvLyBzeW50YWN0aWMgcG9zaXRpb24gb2YgdGhlIGJpbmRpbmdzLiBUaGV5IGNhbiBiZSBpbiB0ZXh0IHBvc2l0aW9uLCB3aGVyZVxuICAgIC8vIHdlIGluc2VydCBhbiBIVE1MIGNvbW1lbnQsIGF0dHJpYnV0ZSB2YWx1ZSBwb3NpdGlvbiwgd2hlcmUgd2UgaW5zZXJ0IGFcbiAgICAvLyBzZW50aW5lbCBzdHJpbmcgYW5kIHJlLXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSwgb3IgaW5zaWRlIGEgdGFnIHdoZXJlXG4gICAgLy8gd2UgaW5zZXJ0IHRoZSBzZW50aW5lbCBzdHJpbmcuXG4gICAgY29uc3QgbCA9IHN0cmluZ3MubGVuZ3RoIC0gMTtcbiAgICAvLyBTdG9yZXMgdGhlIGNhc2Utc2Vuc2l0aXZlIGJvdW5kIGF0dHJpYnV0ZSBuYW1lcyBpbiB0aGUgb3JkZXIgb2YgdGhlaXJcbiAgICAvLyBwYXJ0cy4gRWxlbWVudFBhcnRzIGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGlzIGFycmF5IGFzIHVuZGVmaW5lZFxuICAgIC8vIHJhdGhlciB0aGFuIGEgc3RyaW5nLCB0byBkaXNhbWJpZ3VhdGUgZnJvbSBhdHRyaWJ1dGUgYmluZGluZ3MuXG4gICAgY29uc3QgYXR0ck5hbWVzID0gW107XG4gICAgbGV0IGh0bWwgPSB0eXBlID09PSBTVkdfUkVTVUxUID8gJzxzdmc+JyA6IHR5cGUgPT09IE1BVEhNTF9SRVNVTFQgPyAnPG1hdGg+JyA6ICcnO1xuICAgIC8vIFdoZW4gd2UncmUgaW5zaWRlIGEgcmF3IHRleHQgdGFnIChub3QgaXQncyB0ZXh0IGNvbnRlbnQpLCB0aGUgcmVnZXhcbiAgICAvLyB3aWxsIHN0aWxsIGJlIHRhZ1JlZ2V4IHNvIHdlIGNhbiBmaW5kIGF0dHJpYnV0ZXMsIGJ1dCB3aWxsIHN3aXRjaCB0b1xuICAgIC8vIHRoaXMgcmVnZXggd2hlbiB0aGUgdGFnIGVuZHMuXG4gICAgbGV0IHJhd1RleHRFbmRSZWdleDtcbiAgICAvLyBUaGUgY3VycmVudCBwYXJzaW5nIHN0YXRlLCByZXByZXNlbnRlZCBhcyBhIHJlZmVyZW5jZSB0byBvbmUgb2YgdGhlXG4gICAgLy8gcmVnZXhlc1xuICAgIGxldCByZWdleCA9IHRleHRFbmRSZWdleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb25zdCBzID0gc3RyaW5nc1tpXTtcbiAgICAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgdGhlIGxhc3QgYXR0cmlidXRlIG5hbWUuIFdoZW4gdGhpcyBpc1xuICAgICAgICAvLyBwb3NpdGl2ZSBhdCBlbmQgb2YgYSBzdHJpbmcsIGl0IG1lYW5zIHdlJ3JlIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgICAvLyBwb3NpdGlvbiBhbmQgbmVlZCB0byByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgICAgLy8gV2UgYWxzbyB1c2UgYSBzcGVjaWFsIHZhbHVlIG9mIC0yIHRvIGluZGljYXRlIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgICAgLy8gdGhlIGVuZCBvZiBhIHN0cmluZyBpbiBhdHRyaWJ1dGUgbmFtZSBwb3NpdGlvbi5cbiAgICAgICAgbGV0IGF0dHJOYW1lRW5kSW5kZXggPSAtMTtcbiAgICAgICAgbGV0IGF0dHJOYW1lO1xuICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICAvLyBUaGUgY29uZGl0aW9ucyBpbiB0aGlzIGxvb3AgaGFuZGxlIHRoZSBjdXJyZW50IHBhcnNlIHN0YXRlLCBhbmQgdGhlXG4gICAgICAgIC8vIGFzc2lnbm1lbnRzIHRvIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGFyZSB0aGUgc3RhdGUgdHJhbnNpdGlvbnMuXG4gICAgICAgIHdoaWxlIChsYXN0SW5kZXggPCBzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHN0YXJ0IHNlYXJjaGluZyBmcm9tIHdoZXJlIHdlIHByZXZpb3VzbHkgbGVmdCBvZmZcbiAgICAgICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhzKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdEluZGV4ID0gcmVnZXgubGFzdEluZGV4O1xuICAgICAgICAgICAgaWYgKHJlZ2V4ID09PSB0ZXh0RW5kUmVnZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbQ09NTUVOVF9TVEFSVF0gPT09ICchLS0nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gY29tbWVudEVuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXRjaFtDT01NRU5UX1NUQVJUXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0YXJ0ZWQgYSB3ZWlyZCBjb21tZW50LCBsaWtlIDwve1xuICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNvbW1lbnQyRW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoW1RBR19OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KG1hdGNoW1RBR19OQU1FXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY29yZCBpZiB3ZSBlbmNvdW50ZXIgYSByYXctdGV4dCBlbGVtZW50LiBXZSdsbCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVnZXggYXQgdGhlIGVuZCBvZiB0aGUgdGFnLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3VGV4dEVuZFJlZ2V4ID0gbmV3IFJlZ0V4cChgPC8ke21hdGNoW1RBR19OQU1FXX1gLCAnZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoW0RZTkFNSUNfVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpbmRpbmdzIGluIHRhZyBuYW1lcyBhcmUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSBzdGF0aWMgdGVtcGxhdGVzIGluc3RlYWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2V4ID09PSB0YWdFbmRSZWdleCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFtFTlRJUkVfTUFUQ0hdID09PSAnPicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGEgdGFnLiBJZiB3ZSBoYWQgc3RhcnRlZCBhIHJhdy10ZXh0IGVsZW1lbnQsIHVzZSB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2V4XG4gICAgICAgICAgICAgICAgICAgIHJlZ2V4ID0gcmF3VGV4dEVuZFJlZ2V4ID8/IHRleHRFbmRSZWdleDtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGJlIGVuZGluZyBhbiB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUsIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBhbnkgcGVuZGluZyBhdHRyTmFtZUVuZEluZGV4XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lRW5kSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbQVRUUklCVVRFX05BTUVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0cmlidXRlIG5hbWUgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVFbmRJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVFbmRJbmRleCA9IHJlZ2V4Lmxhc3RJbmRleCAtIG1hdGNoW1NQQUNFU19BTkRfRVFVQUxTXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gbWF0Y2hbQVRUUklCVVRFX05BTUVdO1xuICAgICAgICAgICAgICAgICAgICByZWdleCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtRVU9URV9DSEFSXSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0YWdFbmRSZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWF0Y2hbUVVPVEVfQ0hBUl0gPT09ICdcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkb3VibGVRdW90ZUF0dHJFbmRSZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZ2V4ID09PSBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCB8fFxuICAgICAgICAgICAgICAgIHJlZ2V4ID09PSBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWdleCA9PT0gY29tbWVudEVuZFJlZ2V4IHx8IHJlZ2V4ID09PSBjb21tZW50MkVuZFJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPSB0ZXh0RW5kUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3Qgb25lIG9mIHRoZSBmaXZlIHN0YXRlIHJlZ2V4ZXMsIHNvIGl0IG11c3QgYmUgdGhlIGR5bmFtaWNhbGx5XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlZCByYXcgdGV4dCByZWdleCBhbmQgd2UncmUgYXQgdGhlIGNsb3NlIG9mIHRoYXQgZWxlbWVudC5cbiAgICAgICAgICAgICAgICByZWdleCA9IHRhZ0VuZFJlZ2V4O1xuICAgICAgICAgICAgICAgIHJhd1RleHRFbmRSZWdleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBhdHRyTmFtZUVuZEluZGV4LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGRcbiAgICAgICAgICAgIC8vIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBhc3NlcnQgdGhhdCB3ZSdyZSBpbiBhIHZhbGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy8gcG9zaXRpb24gLSBlaXRoZXIgaW4gYSB0YWcsIG9yIGEgcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGF0dHJOYW1lRW5kSW5kZXggPT09IC0xIHx8XG4gICAgICAgICAgICAgICAgcmVnZXggPT09IHRhZ0VuZFJlZ2V4IHx8XG4gICAgICAgICAgICAgICAgcmVnZXggPT09IHNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgICAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4LCAndW5leHBlY3RlZCBwYXJzZSBzdGF0ZSBCJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSBmb3VyIGNhc2VzOlxuICAgICAgICAvLyAgMS4gV2UncmUgaW4gdGV4dCBwb3NpdGlvbiwgYW5kIG5vdCBpbiBhIHJhdyB0ZXh0IGVsZW1lbnRcbiAgICAgICAgLy8gICAgIChyZWdleCA9PT0gdGV4dEVuZFJlZ2V4KTogaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIuXG4gICAgICAgIC8vICAyLiBXZSBoYXZlIGEgbm9uLW5lZ2F0aXZlIGF0dHJOYW1lRW5kSW5kZXggd2hpY2ggbWVhbnMgd2UgbmVlZCB0b1xuICAgICAgICAvLyAgICAgcmV3cml0ZSB0aGUgYXR0cmlidXRlIG5hbWUgdG8gYWRkIGEgYm91bmQgYXR0cmlidXRlIHN1ZmZpeC5cbiAgICAgICAgLy8gIDMuIFdlJ3JlIGF0IHRoZSBub24tZmlyc3QgYmluZGluZyBpbiBhIG11bHRpLWJpbmRpbmcgYXR0cmlidXRlLCB1c2UgYVxuICAgICAgICAvLyAgICAgcGxhaW4gbWFya2VyLlxuICAgICAgICAvLyAgNC4gV2UncmUgc29tZXdoZXJlIGVsc2UgaW5zaWRlIHRoZSB0YWcuIElmIHdlJ3JlIGluIGF0dHJpYnV0ZSBuYW1lXG4gICAgICAgIC8vICAgICBwb3NpdGlvbiAoYXR0ck5hbWVFbmRJbmRleCA9PT0gLTIpLCBhZGQgYSBzZXF1ZW50aWFsIHN1ZmZpeCB0b1xuICAgICAgICAvLyAgICAgZ2VuZXJhdGUgYSB1bmlxdWUgYXR0cmlidXRlIG5hbWUuXG4gICAgICAgIC8vIERldGVjdCBhIGJpbmRpbmcgbmV4dCB0byBzZWxmLWNsb3NpbmcgdGFnIGVuZCBhbmQgaW5zZXJ0IGEgc3BhY2UgdG9cbiAgICAgICAgLy8gc2VwYXJhdGUgdGhlIG1hcmtlciBmcm9tIHRoZSB0YWcgZW5kOlxuICAgICAgICBjb25zdCBlbmQgPSByZWdleCA9PT0gdGFnRW5kUmVnZXggJiYgc3RyaW5nc1tpICsgMV0uc3RhcnRzV2l0aCgnLz4nKSA/ICcgJyA6ICcnO1xuICAgICAgICBodG1sICs9XG4gICAgICAgICAgICByZWdleCA9PT0gdGV4dEVuZFJlZ2V4XG4gICAgICAgICAgICAgICAgPyBzICsgbm9kZU1hcmtlclxuICAgICAgICAgICAgICAgIDogYXR0ck5hbWVFbmRJbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgICAgID8gKGF0dHJOYW1lcy5wdXNoKGF0dHJOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2xpY2UoMCwgYXR0ck5hbWVFbmRJbmRleCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kQXR0cmlidXRlU3VmZml4ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNsaWNlKGF0dHJOYW1lRW5kSW5kZXgpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgICAgICAgICAgIDogcyArIG1hcmtlciArIChhdHRyTmFtZUVuZEluZGV4ID09PSAtMiA/IGkgOiBlbmQpO1xuICAgIH1cbiAgICBjb25zdCBodG1sUmVzdWx0ID0gaHRtbCArXG4gICAgICAgIChzdHJpbmdzW2xdIHx8ICc8Pz4nKSArXG4gICAgICAgICh0eXBlID09PSBTVkdfUkVTVUxUID8gJzwvc3ZnPicgOiB0eXBlID09PSBNQVRITUxfUkVTVUxUID8gJzwvbWF0aD4nIDogJycpO1xuICAgIC8vIFJldHVybmVkIGFzIGFuIGFycmF5IGZvciB0ZXJzZW5lc3NcbiAgICByZXR1cm4gW3RydXN0RnJvbVRlbXBsYXRlU3RyaW5nKHN0cmluZ3MsIGh0bWxSZXN1bHQpLCBhdHRyTmFtZXNdO1xufTtcbmNsYXNzIFRlbXBsYXRlIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIHsgc3RyaW5ncywgWydfJGxpdFR5cGUkJ106IHR5cGUgfSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnBhcnRzID0gW107XG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBsZXQgbm9kZUluZGV4ID0gMDtcbiAgICAgICAgbGV0IGF0dHJOYW1lSW5kZXggPSAwO1xuICAgICAgICBjb25zdCBwYXJ0Q291bnQgPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cztcbiAgICAgICAgLy8gQ3JlYXRlIHRlbXBsYXRlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgW2h0bWwsIGF0dHJOYW1lc10gPSBnZXRUZW1wbGF0ZUh0bWwoc3RyaW5ncywgdHlwZSk7XG4gICAgICAgIHRoaXMuZWwgPSBUZW1wbGF0ZS5jcmVhdGVFbGVtZW50KGh0bWwsIG9wdGlvbnMpO1xuICAgICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSB0aGlzLmVsLmNvbnRlbnQ7XG4gICAgICAgIC8vIFJlLXBhcmVudCBTVkcgb3IgTWF0aE1MIG5vZGVzIGludG8gdGVtcGxhdGUgcm9vdFxuICAgICAgICBpZiAodHlwZSA9PT0gU1ZHX1JFU1VMVCB8fCB0eXBlID09PSBNQVRITUxfUkVTVUxUKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gdGhpcy5lbC5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICB3cmFwcGVyLnJlcGxhY2VXaXRoKC4uLndyYXBwZXIuY2hpbGROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FsayB0aGUgdGVtcGxhdGUgdG8gZmluZCBiaW5kaW5nIG1hcmtlcnMgYW5kIGNyZWF0ZSBUZW1wbGF0ZVBhcnRzXG4gICAgICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpKSAhPT0gbnVsbCAmJiBwYXJ0cy5sZW5ndGggPCBwYXJ0Q291bnQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IG5vZGUubG9jYWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyBXYXJuIGlmIGB0ZXh0YXJlYWAgaW5jbHVkZXMgYW4gZXhwcmVzc2lvbiBhbmQgdGhyb3cgaWYgYHRlbXBsYXRlYFxuICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIHNpbmNlIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkLiBXZSBkbyB0aGlzIGJ5IGNoZWNraW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGlubmVySFRNTCBmb3IgYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlIGEgbWFya2VyLiBUaGlzIGNhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FzZXMgbGlrZSBiaW5kaW5ncyBpbiB0ZXh0YXJlYSB0aGVyZSBtYXJrZXJzIHR1cm4gaW50byB0ZXh0IG5vZGVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoL14oPzp0ZXh0YXJlYXx0ZW1wbGF0ZSkkL2kudGVzdCh0YWcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmlubmVySFRNTC5pbmNsdWRlcyhtYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gYEV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBcXGAke3RhZ31cXGAgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGVsZW1lbnRzLiBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy9leHByZXNzaW9uLWluLSR7dGFnfSBmb3IgbW9yZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgaW5mb3JtYXRpb24uYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCcnLCBtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUT0RPIChqdXN0aW5mYWduYW5pKTogZm9yIGF0dGVtcHRlZCBkeW5hbWljIHRhZyBuYW1lcywgd2UgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIGJpbmRpbmdJbmRleCwgYW5kIGl0J2xsIGJlIG9mZiBieSAxIGluIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gYW5kIG9mZiBieSB0d28gYWZ0ZXIgaXQuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGJvdW5kQXR0cmlidXRlU3VmZml4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxOYW1lID0gYXR0ck5hbWVzW2F0dHJOYW1lSW5kZXgrK107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWNzID0gdmFsdWUuc3BsaXQobWFya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gLyhbLj9AXSk/KC4qKS8uZXhlYyhyZWFsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFUVFJJQlVURV9QQVJULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzOiBzdGF0aWNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdG9yOiBtWzFdID09PSAnLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUHJvcGVydHlQYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1bMV0gPT09ICc/J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQm9vbGVhbkF0dHJpYnV0ZVBhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1bMV0gPT09ICdAJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEV2ZW50UGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEF0dHJpYnV0ZVBhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgobWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBFTEVNRU5UX1BBUlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBub2RlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGJlbmNobWFyayB0aGUgcmVnZXggYWdhaW5zdCB0ZXN0aW5nIGZvciBlYWNoXG4gICAgICAgICAgICAgICAgLy8gb2YgdGhlIDMgcmF3IHRleHQgZWxlbWVudCBuYW1lcy5cbiAgICAgICAgICAgICAgICBpZiAocmF3VGV4dEVsZW1lbnQudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciByYXcgdGV4dCBlbGVtZW50cyB3ZSBuZWVkIHRvIHNwbGl0IHRoZSB0ZXh0IGNvbnRlbnQgb25cbiAgICAgICAgICAgICAgICAgICAgLy8gbWFya2VycywgY3JlYXRlIGEgVGV4dCBub2RlIGZvciBlYWNoIHNlZ21lbnQsIGFuZCBjcmVhdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBUZW1wbGF0ZVBhcnQgZm9yIGVhY2ggbWFya2VyLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdzID0gbm9kZS50ZXh0Q29udGVudC5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ID0gdHJ1c3RlZFR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgdGV4dCBub2RlIGZvciBlYWNoIGxpdGVyYWwgc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2Ugbm9kZXMgYXJlIGFsc28gdXNlZCBhcyB0aGUgbWFya2VycyBmb3IgY2hpbGQgcGFydHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFzdEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChzdHJpbmdzW2ldLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FsayBwYXN0IHRoZSBtYXJrZXIgbm9kZSB3ZSBqdXN0IGFkZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IHR5cGU6IENISUxEX1BBUlQsIGluZGV4OiArK25vZGVJbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgYmVjYXVzZSB0aGlzIG1hcmtlciBpcyBhZGRlZCBhZnRlciB0aGUgd2Fsa2VyJ3MgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZSwgaXQgd2lsbCBiZSB3YWxrZWQgdG8gaW4gdGhlIG91dGVyIGxvb3AgKGFuZCBpZ25vcmVkKSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gYWRqdXN0IG5vZGVJbmRleCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZChzdHJpbmdzW2xhc3RJbmRleF0sIGNyZWF0ZU1hcmtlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbm9kZS5kYXRhO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSBtYXJrZXJNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsgdHlwZTogQ0hJTERfUEFSVCwgaW5kZXg6IG5vZGVJbmRleCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoaSA9IG5vZGUuZGF0YS5pbmRleE9mKG1hcmtlciwgaSArIDEpKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbW1lbnQgbm9kZSBoYXMgYSBiaW5kaW5nIG1hcmtlciBpbnNpZGUsIG1ha2UgYW4gaW5hY3RpdmUgcGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd29uJ3Qgd29yaywgYnV0IHN1YnNlcXVlbnQgYmluZGluZ3Mgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCh7IHR5cGU6IENPTU1FTlRfUEFSVCwgaW5kZXg6IG5vZGVJbmRleCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gbWFya2VyLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gYSB0YWcsIHRoZW4gd2hlbiB0aGUgdGFnIGlzXG4gICAgICAgICAgICAvLyBwYXJzZWQgaW50byBhbiBlbGVtZW50IHRoZSBhdHRyaWJ1dGUgZ2V0cyBkZS1kdXBsaWNhdGVkLiBXZSBjYW4gZGV0ZWN0XG4gICAgICAgICAgICAvLyB0aGlzIG1pc21hdGNoIGlmIHdlIGhhdmVuJ3QgcHJlY2lzZWx5IGNvbnN1bWVkIGV2ZXJ5IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAgICAgICAvLyB3aGVuIHByZXBhcmluZyB0aGUgdGVtcGxhdGUuIFRoaXMgd29ya3MgYmVjYXVzZSBgYXR0ck5hbWVzYCBpcyBidWlsdFxuICAgICAgICAgICAgLy8gZnJvbSB0aGUgdGVtcGxhdGUgc3RyaW5nIGFuZCBgYXR0ck5hbWVJbmRleGAgY29tZXMgZnJvbSBwcm9jZXNzaW5nIHRoZVxuICAgICAgICAgICAgLy8gcmVzdWx0aW5nIERPTS5cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZXMubGVuZ3RoICE9PSBhdHRyTmFtZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXRlY3RlZCBkdXBsaWNhdGUgYXR0cmlidXRlIGJpbmRpbmdzLiBUaGlzIG9jY3VycyBpZiB5b3VyIHRlbXBsYXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgaGFzIGR1cGxpY2F0ZSBhdHRyaWJ1dGVzIG9uIGFuIGVsZW1lbnQgdGFnLiBGb3IgZXhhbXBsZSBgICtcbiAgICAgICAgICAgICAgICAgICAgYFwiPGlucHV0ID9kaXNhYmxlZD1cXCR7dHJ1ZX0gP2Rpc2FibGVkPVxcJHtmYWxzZX0+XCIgY29udGFpbnMgYSBgICtcbiAgICAgICAgICAgICAgICAgICAgYGR1cGxpY2F0ZSBcImRpc2FibGVkXCIgYXR0cmlidXRlLiBUaGUgZXJyb3Igd2FzIGRldGVjdGVkIGluIGAgK1xuICAgICAgICAgICAgICAgICAgICBgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZTogXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICdgJyArXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3Muam9pbignJHsuLi59JykgK1xuICAgICAgICAgICAgICAgICAgICAnYCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGNvdWxkIHNldCB3YWxrZXIuY3VycmVudE5vZGUgdG8gYW5vdGhlciBub2RlIGhlcmUgdG8gcHJldmVudCBhIG1lbW9yeVxuICAgICAgICAvLyBsZWFrLCBidXQgZXZlcnkgdGltZSB3ZSBwcmVwYXJlIGEgdGVtcGxhdGUsIHdlIGltbWVkaWF0ZWx5IHJlbmRlciBpdFxuICAgICAgICAvLyBhbmQgcmUtdXNlIHRoZSB3YWxrZXIgaW4gbmV3IFRlbXBsYXRlSW5zdGFuY2UuX2Nsb25lKCkuXG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGhpcyxcbiAgICAgICAgICAgICAgICBjbG9uYWJsZVRlbXBsYXRlOiB0aGlzLmVsLFxuICAgICAgICAgICAgICAgIHBhcnRzOiB0aGlzLnBhcnRzLFxuICAgICAgICAgICAgICAgIHN0cmluZ3MsXG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGRlbiB2aWEgYGxpdEh0bWxQb2x5ZmlsbFN1cHBvcnRgIHRvIHByb3ZpZGUgcGxhdGZvcm0gc3VwcG9ydC5cbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBzdGF0aWMgY3JlYXRlRWxlbWVudChodG1sLCBfb3B0aW9ucykge1xuICAgICAgICBjb25zdCBlbCA9IGQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUocGFydCwgdmFsdWUsIHBhcmVudCA9IHBhcnQsIGF0dHJpYnV0ZUluZGV4KSB7XG4gICAgLy8gQmFpbCBlYXJseSBpZiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBub0NoYW5nZS4gTm90ZSwgdGhpcyBtZWFucyBhbnlcbiAgICAvLyBuZXN0ZWQgZGlyZWN0aXZlIGlzIHN0aWxsIGF0dGFjaGVkIGFuZCBpcyBub3QgcnVuLlxuICAgIGlmICh2YWx1ZSA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBsZXQgY3VycmVudERpcmVjdGl2ZSA9IGF0dHJpYnV0ZUluZGV4ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBwYXJlbnQuX19kaXJlY3RpdmVzPy5bYXR0cmlidXRlSW5kZXhdXG4gICAgICAgIDogcGFyZW50Ll9fZGlyZWN0aXZlO1xuICAgIGNvbnN0IG5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciA9IGlzUHJpbWl0aXZlKHZhbHVlKVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgICAgICB2YWx1ZVsnXyRsaXREaXJlY3RpdmUkJ107XG4gICAgaWYgKGN1cnJlbnREaXJlY3RpdmU/LmNvbnN0cnVjdG9yICE9PSBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IpIHtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgY3VycmVudERpcmVjdGl2ZT8uWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10/LihmYWxzZSk7XG4gICAgICAgIGlmIChuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmUgPSBuZXcgbmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yKHBhcnQpO1xuICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZS5fJGluaXRpYWxpemUocGFydCwgcGFyZW50LCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIChwYXJlbnQuX19kaXJlY3RpdmVzID8/PSBbXSlbYXR0cmlidXRlSW5kZXhdID1cbiAgICAgICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50Ll9fZGlyZWN0aXZlID0gY3VycmVudERpcmVjdGl2ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VycmVudERpcmVjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZShwYXJ0LCBjdXJyZW50RGlyZWN0aXZlLl8kcmVzb2x2ZShwYXJ0LCB2YWx1ZS52YWx1ZXMpLCBjdXJyZW50RGlyZWN0aXZlLCBhdHRyaWJ1dGVJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKlxuICogQW4gdXBkYXRlYWJsZSBpbnN0YW5jZSBvZiBhIFRlbXBsYXRlLiBIb2xkcyByZWZlcmVuY2VzIHRvIHRoZSBQYXJ0cyB1c2VkIHRvXG4gKiB1cGRhdGUgdGhlIHRlbXBsYXRlIGluc3RhbmNlLlxuICovXG5jbGFzcyBUZW1wbGF0ZUluc3RhbmNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSwgcGFyZW50KSB7XG4gICAgICAgIHRoaXMuXyRwYXJ0cyA9IFtdO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl8kdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgLy8gQ2FsbGVkIGJ5IENoaWxkUGFydCBwYXJlbnROb2RlIGdldHRlclxuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIHNlcGFyYXRlIGZyb20gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2Ugd2UgbmVlZCB0byByZXR1cm4gYVxuICAgIC8vIERvY3VtZW50RnJhZ21lbnQgYW5kIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBvbnRvIGl0IHdpdGggYW4gaW5zdGFuY2UgZmllbGQuXG4gICAgX2Nsb25lKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBlbDogeyBjb250ZW50IH0sIHBhcnRzOiBwYXJ0cywgfSA9IHRoaXMuXyR0ZW1wbGF0ZTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSAob3B0aW9ucz8uY3JlYXRpb25TY29wZSA/PyBkKS5pbXBvcnROb2RlKGNvbnRlbnQsIHRydWUpO1xuICAgICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBmcmFnbWVudDtcbiAgICAgICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgICAgbGV0IG5vZGVJbmRleCA9IDA7XG4gICAgICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgICAgICBsZXQgdGVtcGxhdGVQYXJ0ID0gcGFydHNbMF07XG4gICAgICAgIHdoaWxlICh0ZW1wbGF0ZVBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PT0gdGVtcGxhdGVQYXJ0LmluZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnQ7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBDSElMRF9QQVJUKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KG5vZGUsIG5vZGUubmV4dFNpYmxpbmcsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gQVRUUklCVVRFX1BBUlQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5ldyB0ZW1wbGF0ZVBhcnQuY3Rvcihub2RlLCB0ZW1wbGF0ZVBhcnQubmFtZSwgdGVtcGxhdGVQYXJ0LnN0cmluZ3MsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gRUxFTUVOVF9QQVJUKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgRWxlbWVudFBhcnQobm9kZSwgdGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuXyRwYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFydCA9IHBhcnRzWysrcGFydEluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlSW5kZXggIT09IHRlbXBsYXRlUGFydD8uaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGN1cnJlbnROb2RlIGF3YXkgZnJvbSB0aGUgY2xvbmVkIHRyZWUgc28gdGhhdCB3ZVxuICAgICAgICAvLyBkb24ndCBob2xkIG9udG8gdGhlIHRyZWUgZXZlbiBpZiB0aGUgdHJlZSBpcyBkZXRhY2hlZCBhbmQgc2hvdWxkIGJlXG4gICAgICAgIC8vIGZyZWVkLlxuICAgICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBkO1xuICAgICAgICByZXR1cm4gZnJhZ21lbnQ7XG4gICAgfVxuICAgIF91cGRhdGUodmFsdWVzKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHRoaXMuXyRwYXJ0cykge1xuICAgICAgICAgICAgaWYgKHBhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnc2V0IHBhcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVJbnN0YW5jZTogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZXMsIHBhcnQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHZhbHVlcyB0aGUgcGFydCBjb25zdW1lcyBpcyBwYXJ0LnN0cmluZ3MubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB2YWx1ZXMgYXJlIGluIGJldHdlZW4gdGVtcGxhdGUgc3BhbnMuIFdlIGluY3JlbWVudCBpIGJ5IDFcbiAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXIgaW4gdGhlIGxvb3AsIHNvIGluY3JlbWVudCBpdCBieSBwYXJ0LnN0cmluZ3MubGVuZ3RoIC0gMiBoZXJlXG4gICAgICAgICAgICAgICAgICAgIGkgKz0gcGFydC5zdHJpbmdzLmxlbmd0aCAtIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWVzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDaGlsZFBhcnQge1xuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgLy8gQ2hpbGRQYXJ0cyB0aGF0IGFyZSBub3QgYXQgdGhlIHJvb3Qgc2hvdWxkIGFsd2F5cyBiZSBjcmVhdGVkIHdpdGggYVxuICAgICAgICAvLyBwYXJlbnQ7IG9ubHkgUm9vdENoaWxkTm9kZSdzIHdvbid0LCBzbyB0aGV5IHJldHVybiB0aGUgbG9jYWwgaXNDb25uZWN0ZWRcbiAgICAgICAgLy8gc3RhdGVcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQ/Ll8kaXNDb25uZWN0ZWQgPz8gdGhpcy5fX2lzQ29ubmVjdGVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihzdGFydE5vZGUsIGVuZE5vZGUsIHBhcmVudCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSBDSElMRF9QQVJUO1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnRzIHdoZW4gcmVxdWlyZWQgYnlcbiAgICAgICAgLy8gQXN5bmNEaXJlY3RpdmVcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fJHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICAgICAgdGhpcy5fJGVuZE5vZGUgPSBlbmROb2RlO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAvLyBOb3RlIF9faXNDb25uZWN0ZWQgaXMgb25seSBldmVyIGFjY2Vzc2VkIG9uIFJvb3RQYXJ0cyAoaS5lLiB3aGVuIHRoZXJlIGlzXG4gICAgICAgIC8vIG5vIF8kcGFyZW50KTsgdGhlIHZhbHVlIG9uIGEgbm9uLXJvb3QtcGFydCBpcyBcImRvbid0IGNhcmVcIiwgYnV0IGNoZWNraW5nXG4gICAgICAgIC8vIGZvciBwYXJlbnQgd291bGQgYmUgbW9yZSBjb2RlXG4gICAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IG9wdGlvbnM/LmlzQ29ubmVjdGVkID8/IHRydWU7XG4gICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgaW5pdGlhbGl6ZSBmb3IgY29uc2lzdGVudCBjbGFzcyBzaGFwZS5cbiAgICAgICAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCBub2RlIGludG8gd2hpY2ggdGhlIHBhcnQgcmVuZGVycyBpdHMgY29udGVudC5cbiAgICAgKlxuICAgICAqIEEgQ2hpbGRQYXJ0J3MgY29udGVudCBjb25zaXN0cyBvZiBhIHJhbmdlIG9mIGFkamFjZW50IGNoaWxkIG5vZGVzIG9mXG4gICAgICogYC5wYXJlbnROb2RlYCwgcG9zc2libHkgYm9yZGVyZWQgYnkgJ21hcmtlciBub2RlcycgKGAuc3RhcnROb2RlYCBhbmRcbiAgICAgKiBgLmVuZE5vZGVgKS5cbiAgICAgKlxuICAgICAqIC0gSWYgYm90aCBgLnN0YXJ0Tm9kZWAgYW5kIGAuZW5kTm9kZWAgYXJlIG5vbi1udWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgICAqIGNvbnNpc3RzIG9mIGFsbCBzaWJsaW5ncyBiZXR3ZWVuIGAuc3RhcnROb2RlYCBhbmQgYC5lbmROb2RlYCwgZXhjbHVzaXZlbHkuXG4gICAgICpcbiAgICAgKiAtIElmIGAuc3RhcnROb2RlYCBpcyBub24tbnVsbCBidXQgYC5lbmROb2RlYCBpcyBudWxsLCB0aGVuIHRoZSBwYXJ0J3NcbiAgICAgKiBjb250ZW50IGNvbnNpc3RzIG9mIGFsbCBzaWJsaW5ncyBmb2xsb3dpbmcgYC5zdGFydE5vZGVgLCB1cCB0byBhbmRcbiAgICAgKiBpbmNsdWRpbmcgdGhlIGxhc3QgY2hpbGQgb2YgYC5wYXJlbnROb2RlYC4gSWYgYC5lbmROb2RlYCBpcyBub24tbnVsbCwgdGhlblxuICAgICAqIGAuc3RhcnROb2RlYCB3aWxsIGFsd2F5cyBiZSBub24tbnVsbC5cbiAgICAgKlxuICAgICAqIC0gSWYgYm90aCBgLmVuZE5vZGVgIGFuZCBgLnN0YXJ0Tm9kZWAgYXJlIG51bGwsIHRoZW4gdGhlIHBhcnQncyBjb250ZW50XG4gICAgICogY29uc2lzdHMgb2YgYWxsIGNoaWxkIG5vZGVzIG9mIGAucGFyZW50Tm9kZWAuXG4gICAgICovXG4gICAgZ2V0IHBhcmVudE5vZGUoKSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5wYXJlbnROb2RlO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl8kcGFyZW50O1xuICAgICAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHBhcmVudE5vZGU/Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UICovKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50Tm9kZSBpcyBhIERvY3VtZW50RnJhZ21lbnQsIGl0IG1heSBiZSBiZWNhdXNlIHRoZSBET00gaXNcbiAgICAgICAgICAgIC8vIHN0aWxsIGluIHRoZSBjbG9uZWQgZnJhZ21lbnQgZHVyaW5nIGluaXRpYWwgcmVuZGVyOyBpZiBzbywgZ2V0IHRoZSByZWFsXG4gICAgICAgICAgICAvLyBwYXJlbnROb2RlIHRoZSBwYXJ0IHdpbGwgYmUgY29tbWl0dGVkIGludG8gYnkgYXNraW5nIHRoZSBwYXJlbnQuXG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudE5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0J3MgbGVhZGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgICAqIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIGdldCBzdGFydE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kc3RhcnROb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcGFydCdzIHRyYWlsaW5nIG1hcmtlciBub2RlLCBpZiBhbnkuIFNlZSBgLnBhcmVudE5vZGVgIGZvciBtb3JlXG4gICAgICogaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgZ2V0IGVuZE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kZW5kTm9kZTtcbiAgICB9XG4gICAgXyRzZXRWYWx1ZSh2YWx1ZSwgZGlyZWN0aXZlUGFyZW50ID0gdGhpcykge1xuICAgICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgXFxgQ2hpbGRQYXJ0XFxgIGhhcyBubyBcXGBwYXJlbnROb2RlXFxgIGFuZCB0aGVyZWZvcmUgY2Fubm90IGFjY2VwdCBhIHZhbHVlLiBUaGlzIGxpa2VseSBtZWFucyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBwYXJ0IHdhcyBtYW5pcHVsYXRlZCBpbiBhbiB1bnN1cHBvcnRlZCB3YXkgb3V0c2lkZSBvZiBMaXQncyBjb250cm9sIHN1Y2ggdGhhdCB0aGUgcGFydCdzIG1hcmtlciBub2RlcyB3ZXJlIGVqZWN0ZWQgZnJvbSBET00uIEZvciBleGFtcGxlLCBzZXR0aW5nIHRoZSBlbGVtZW50J3MgXFxgaW5uZXJIVE1MXFxgIG9yIFxcYHRleHRDb250ZW50XFxgIGNhbiBkbyB0aGlzLmApO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50KTtcbiAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gTm9uLXJlbmRlcmluZyBjaGlsZCB2YWx1ZXMuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlc2UgZG8gbm90IHJlbmRlclxuICAgICAgICAgICAgLy8gZW1wdHkgdGV4dCBub2RlcyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBwcmV2ZW50aW5nIGRlZmF1bHQgPHNsb3Q+XG4gICAgICAgICAgICAvLyBmYWxsYmFjayBjb250ZW50LlxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBub3RoaW5nIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fJGVuZE5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB0aGlzLl8kcGFyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWUgJiYgdmFsdWUgIT09IG5vQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbWl0VGV4dCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlWydfJGxpdFR5cGUkJ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY29tbWl0VGVtcGxhdGVSZXN1bHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLm5vZGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSAmJiB0aGlzLm9wdGlvbnM/Lmhvc3QgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbWl0VGV4dChgW3Byb2JhYmxlIG1pc3Rha2U6IHJlbmRlcmVkIGEgdGVtcGxhdGUncyBob3N0IGluIGl0c2VsZiBgICtcbiAgICAgICAgICAgICAgICAgICAgYChjb21tb25seSBjYXVzZWQgYnkgd3JpdGluZyBcXCR7dGhpc30gaW4gYSB0ZW1wbGF0ZV1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEF0dGVtcHRlZCB0byByZW5kZXIgdGhlIHRlbXBsYXRlIGhvc3RgLCB2YWx1ZSwgYGluc2lkZSBpdHNlbGYuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBhIG1pc3Rha2UsIGFuZCBpbiBkZXYgbW9kZSBgLCBgd2UgcmVuZGVyIHNvbWUgd2FybmluZyB0ZXh0LiBJbiBwcm9kdWN0aW9uIGhvd2V2ZXIsIHdlJ2xsIGAsIGByZW5kZXIgaXQsIHdoaWNoIHdpbGwgdXN1YWxseSByZXN1bHQgaW4gYW4gZXJyb3IsIGFuZCBzb21ldGltZXMgYCwgYGluIHRoZSBlbGVtZW50IGRpc2FwcGVhcmluZyBmcm9tIHRoZSBET00uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29tbWl0Tm9kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrLCB3aWxsIHJlbmRlciB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICAgICAgICB0aGlzLl9jb21taXRUZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaW5zZXJ0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAod3JhcCh0aGlzLl8kc3RhcnROb2RlKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUobm9kZSwgdGhpcy5fJGVuZE5vZGUpO1xuICAgIH1cbiAgICBfY29tbWl0Tm9kZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTICYmXG4gICAgICAgICAgICAgICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZU5hbWUgPSB0aGlzLl8kc3RhcnROb2RlLnBhcmVudE5vZGU/Lm5vZGVOYW1lO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlTmFtZSA9PT0gJ1NUWUxFJyB8fCBwYXJlbnROb2RlTmFtZSA9PT0gJ1NDUklQVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnRm9yYmlkZGVuJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHN0eWxlIG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgc3R5bGUgaW5qZWN0aW9uIGF0dGFja3MgY2FuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGV4ZmlsdHJhdGUgZGF0YSBhbmQgc3Bvb2YgVUlzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb25zaWRlciBpbnN0ZWFkIHVzaW5nIGNzc1xcYC4uLlxcYCBsaXRlcmFscyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB0byBjb21wb3NlIHN0eWxlcywgYW5kIGRvIGR5bmFtaWMgc3R5bGluZyB3aXRoIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNzcyBjdXN0b20gcHJvcGVydGllcywgOjpwYXJ0cywgPHNsb3Q+cywgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYW5kIGJ5IG11dGF0aW5nIHRoZSBET00gcmF0aGVyIHRoYW4gc3R5bGVzaGVldHMuYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTGl0IGRvZXMgbm90IHN1cHBvcnQgYmluZGluZyBpbnNpZGUgc2NyaXB0IG5vZGVzLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgaXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNvZGUgZXhlY3V0aW9uLmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBub2RlJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuXyRzdGFydE5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fJHBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSB0aGlzLl9pbnNlcnQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jb21taXRUZXh0KHZhbHVlKSB7XG4gICAgICAgIC8vIElmIHRoZSBjb21taXR0ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUgaXQgbWVhbnMgd2UgY2FsbGVkIF9jb21taXRUZXh0IG9uXG4gICAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIsIGFuZCB3ZSBrbm93IHRoYXQgdGhpcy5fJHN0YXJ0Tm9kZS5uZXh0U2libGluZyBpcyBhXG4gICAgICAgIC8vIFRleHQgbm9kZS4gV2UgY2FuIG5vdyBqdXN0IHJlcGxhY2UgdGhlIHRleHQgY29udGVudCAoLmRhdGEpIG9mIHRoZSBub2RlLlxuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlICE9PSBub3RoaW5nICYmXG4gICAgICAgICAgICBpc1ByaW1pdGl2ZSh0aGlzLl8kY29tbWl0dGVkVmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGV4dFNhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXIobm9kZSwgJ2RhdGEnLCAncHJvcGVydHknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXh0U2FuaXRpemVyKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5vZGUuZGF0YSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbWl0Tm9kZSh0ZXh0Tm9kZSk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBzZXR0aW5nIHRleHQgY29udGVudCwgZm9yIHNlY3VyaXR5IHB1cnBvc2VzIGl0IG1hdHRlcnMgYSBsb3RcbiAgICAgICAgICAgICAgICAvLyB3aGF0IHRoZSBwYXJlbnQgaXMuIEZvciBleGFtcGxlLCA8c3R5bGU+IGFuZCA8c2NyaXB0PiBuZWVkIHRvIGJlXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlZCB3aXRoIGNhcmUsIHdoaWxlIDxzcGFuPiBkb2VzIG5vdC4gU28gZmlyc3Qgd2UgbmVlZCB0byBwdXQgYVxuICAgICAgICAgICAgICAgIC8vIHRleHQgbm9kZSBpbnRvIHRoZSBkb2N1bWVudCwgdGhlbiB3ZSBjYW4gc2FuaXRpemUgaXRzIGNvbnRlbnQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRTYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKHRleHROb2RlLCAnZGF0YScsICdwcm9wZXJ0eScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3RleHRTYW5pdGl6ZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogdGV4dE5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGV4dE5vZGUuZGF0YSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tbWl0Tm9kZShkLmNyZWF0ZVRleHROb2RlKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlOiB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBfY29tbWl0VGVtcGxhdGVSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIGNvbnN0IHsgdmFsdWVzLCBbJ18kbGl0VHlwZSQnXTogdHlwZSB9ID0gcmVzdWx0O1xuICAgICAgICAvLyBJZiAkbGl0VHlwZSQgaXMgYSBudW1iZXIsIHJlc3VsdCBpcyBhIHBsYWluIFRlbXBsYXRlUmVzdWx0IGFuZCB3ZSBnZXRcbiAgICAgICAgLy8gdGhlIHRlbXBsYXRlIGZyb20gdGhlIHRlbXBsYXRlIGNhY2hlLiBJZiBub3QsIHJlc3VsdCBpcyBhXG4gICAgICAgIC8vIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQgYW5kIF8kbGl0VHlwZSQgaXMgYSBDb21waWxlZFRlbXBsYXRlIGFuZCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGNyZWF0ZSB0aGUgPHRlbXBsYXRlPiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lIHdlIHNlZSBpdC5cbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0eXBlb2YgdHlwZSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgID8gdGhpcy5fJGdldFRlbXBsYXRlKHJlc3VsdClcbiAgICAgICAgICAgIDogKHR5cGUuZWwgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICh0eXBlLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudCh0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyh0eXBlLmgsIHR5cGUuaFswXSksIHRoaXMub3B0aW9ucykpLFxuICAgICAgICAgICAgICAgIHR5cGUpO1xuICAgICAgICBpZiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlPy5fJHRlbXBsYXRlID09PSB0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGFydHM6IHRoaXMuXyRjb21taXR0ZWRWYWx1ZS5fJHBhcnRzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUluc3RhbmNlKHRlbXBsYXRlLCB0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gaW5zdGFuY2UuX2Nsb25lKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnN0YW5jZS5fdXBkYXRlKHZhbHVlcyk7XG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzOiBpbnN0YW5jZS5fJHBhcnRzLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9jb21taXROb2RlKGZyYWdtZW50KTtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IGluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE92ZXJyaWRkZW4gdmlhIGBsaXRIdG1sUG9seWZpbGxTdXBwb3J0YCB0byBwcm92aWRlIHBsYXRmb3JtIHN1cHBvcnQuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kZ2V0VGVtcGxhdGUocmVzdWx0KSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9IHRlbXBsYXRlQ2FjaGUuZ2V0KHJlc3VsdC5zdHJpbmdzKTtcbiAgICAgICAgaWYgKHRlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlQ2FjaGUuc2V0KHJlc3VsdC5zdHJpbmdzLCAodGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocmVzdWx0KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG4gICAgX2NvbW1pdEl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgICAgIC8vIEZvciBhbiBJdGVyYWJsZSwgd2UgY3JlYXRlIGEgbmV3IEluc3RhbmNlUGFydCBwZXIgaXRlbSwgdGhlbiBzZXQgaXRzXG4gICAgICAgIC8vIHZhbHVlIHRvIHRoZSBpdGVtLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBvdmVyaGVhZCBmb3IgZXZlcnkgaXRlbSBpblxuICAgICAgICAvLyBhbiBJdGVyYWJsZSwgYnV0IGl0IGxldHMgdXMgcmVjdXJzZSBlYXNpbHkgYW5kIGVmZmljaWVudGx5IHVwZGF0ZSBBcnJheXNcbiAgICAgICAgLy8gb2YgVGVtcGxhdGVSZXN1bHRzIHRoYXQgd2lsbCBiZSBjb21tb25seSByZXR1cm5lZCBmcm9tIGV4cHJlc3Npb25zIGxpa2U6XG4gICAgICAgIC8vIGFycmF5Lm1hcCgoaSkgPT4gaHRtbGAke2l9YCksIGJ5IHJldXNpbmcgZXhpc3RpbmcgVGVtcGxhdGVJbnN0YW5jZXMuXG4gICAgICAgIC8vIElmIHZhbHVlIGlzIGFuIGFycmF5LCB0aGVuIHRoZSBwcmV2aW91cyByZW5kZXIgd2FzIG9mIGFuXG4gICAgICAgIC8vIGl0ZXJhYmxlIGFuZCB2YWx1ZSB3aWxsIGNvbnRhaW4gdGhlIENoaWxkUGFydHMgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAgICAgLy8gcmVuZGVyLiBJZiB2YWx1ZSBpcyBub3QgYW4gYXJyYXksIGNsZWFyIHRoaXMgcGFydCBhbmQgbWFrZSBhIG5ld1xuICAgICAgICAvLyBhcnJheSBmb3IgQ2hpbGRQYXJ0cy5cbiAgICAgICAgaWYgKCFpc0FycmF5KHRoaXMuXyRjb21taXR0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGl0ZW1zIHdlIHN0YW1wZWQgc28gd2UgY2FuIGNsZWFyIGxlZnRvdmVyXG4gICAgICAgIC8vIGl0ZW1zIGZyb20gYSBwcmV2aW91cyByZW5kZXJcbiAgICAgICAgY29uc3QgaXRlbVBhcnRzID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlO1xuICAgICAgICBsZXQgcGFydEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZW1QYXJ0O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0SW5kZXggPT09IGl0ZW1QYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBubyBleGlzdGluZyBwYXJ0LCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgICAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHRlc3QgcGVyZiBpbXBhY3Qgb2YgYWx3YXlzIGNyZWF0aW5nIHR3byBwYXJ0c1xuICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2Ygc2hhcmluZyBwYXJ0cyBiZXR3ZWVuIG5vZGVzXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvaXNzdWVzLzEyNjZcbiAgICAgICAgICAgICAgICBpdGVtUGFydHMucHVzaCgoaXRlbVBhcnQgPSBuZXcgQ2hpbGRQYXJ0KHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksIHRoaXMsIHRoaXMub3B0aW9ucykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJldXNlIGFuIGV4aXN0aW5nIHBhcnRcbiAgICAgICAgICAgICAgICBpdGVtUGFydCA9IGl0ZW1QYXJ0c1twYXJ0SW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbVBhcnQuXyRzZXRWYWx1ZShpdGVtKTtcbiAgICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0SW5kZXggPCBpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpdGVtUGFydHMgYWx3YXlzIGhhdmUgZW5kIG5vZGVzXG4gICAgICAgICAgICB0aGlzLl8kY2xlYXIoaXRlbVBhcnQgJiYgd3JhcChpdGVtUGFydC5fJGVuZE5vZGUpLm5leHRTaWJsaW5nLCBwYXJ0SW5kZXgpO1xuICAgICAgICAgICAgLy8gVHJ1bmNhdGUgdGhlIHBhcnRzIGFycmF5IHNvIF92YWx1ZSByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZVxuICAgICAgICAgICAgaXRlbVBhcnRzLmxlbmd0aCA9IHBhcnRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBub2RlcyBjb250YWluZWQgd2l0aGluIHRoaXMgUGFydCBmcm9tIHRoZSBET00uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhcnQgU3RhcnQgbm9kZSB0byBjbGVhciBmcm9tLCBmb3IgY2xlYXJpbmcgYSBzdWJzZXQgb2YgdGhlIHBhcnQnc1xuICAgICAqICAgICBET00gKHVzZWQgd2hlbiB0cnVuY2F0aW5nIGl0ZXJhYmxlcylcbiAgICAgKiBAcGFyYW0gZnJvbSAgV2hlbiBgc3RhcnRgIGlzIHNwZWNpZmllZCwgdGhlIGluZGV4IHdpdGhpbiB0aGUgaXRlcmFibGUgZnJvbVxuICAgICAqICAgICB3aGljaCBDaGlsZFBhcnRzIGFyZSBiZWluZyByZW1vdmVkLCB1c2VkIGZvciBkaXNjb25uZWN0aW5nIGRpcmVjdGl2ZXNcbiAgICAgKiAgICAgaW4gdGhvc2UgUGFydHMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfJGNsZWFyKHN0YXJ0ID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5uZXh0U2libGluZywgZnJvbSkge1xuICAgICAgICB0aGlzLl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/LihmYWxzZSwgdHJ1ZSwgZnJvbSk7XG4gICAgICAgIHdoaWxlIChzdGFydCAhPT0gdGhpcy5fJGVuZE5vZGUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBub24tbnVsbCBhc3NlcnRpb24gaXMgc2FmZSBiZWNhdXNlIGlmIF8kc3RhcnROb2RlLm5leHRTaWJsaW5nIGlzXG4gICAgICAgICAgICAvLyBudWxsLCB0aGVuIF8kZW5kTm9kZSBpcyBhbHNvIG51bGwsIGFuZCB3ZSB3b3VsZCBub3QgaGF2ZSBlbnRlcmVkIHRoaXNcbiAgICAgICAgICAgIC8vIGxvb3AuXG4gICAgICAgICAgICBjb25zdCBuID0gd3JhcChzdGFydCkubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB3cmFwKHN0YXJ0KS5yZW1vdmUoKTtcbiAgICAgICAgICAgIHN0YXJ0ID0gbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBSb290UGFydCdzIGBpc0Nvbm5lY3RlZGAuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZFxuICAgICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBgUm9vdFBhcnRgcyAodGhlIGBDaGlsZFBhcnRgIHJldHVybmVkIGZyb20gYVxuICAgICAqIHRvcC1sZXZlbCBgcmVuZGVyKClgIGNhbGwpLiBJdCBoYXMgbm8gZWZmZWN0IG9uIG5vbi1yb290IENoaWxkUGFydHMuXG4gICAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgdG8gc2V0XG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc2V0Q29ubmVjdGVkKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgIGlmICh0aGlzLl8kcGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX19pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgICAgICAgdGhpcy5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkPy4oaXNDb25uZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcnQuc2V0Q29ubmVjdGVkKCkgbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgJyArXG4gICAgICAgICAgICAgICAgJ1Jvb3RQYXJ0IHJldHVybmVkIGZyb20gcmVuZGVyKCkuJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgICBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC50YWdOYW1lO1xuICAgIH1cbiAgICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gICAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIG5hbWUsIHN0cmluZ3MsIHBhcmVudCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSBBVFRSSUJVVEVfUEFSVDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPiAyIHx8IHN0cmluZ3NbMF0gIT09ICcnIHx8IHN0cmluZ3NbMV0gIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBuZXcgQXJyYXkoc3RyaW5ncy5sZW5ndGggLSAxKS5maWxsKG5ldyBTdHJpbmcoKSk7XG4gICAgICAgICAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBwYXJ0IGJ5IHJlc29sdmluZyB0aGUgdmFsdWUgZnJvbSBwb3NzaWJseSBtdWx0aXBsZVxuICAgICAqIHZhbHVlcyBhbmQgc3RhdGljIHN0cmluZ3MgYW5kIGNvbW1pdHRpbmcgaXQgdG8gdGhlIERPTS5cbiAgICAgKiBJZiB0aGlzIHBhcnQgaXMgc2luZ2xlLXZhbHVlZCwgYHRoaXMuX3N0cmluZ3NgIHdpbGwgYmUgdW5kZWZpbmVkLCBhbmQgdGhlXG4gICAgICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgdmFsdWUgYXJndW1lbnQuIElmIHRoaXMgcGFydCBpc1xuICAgICAqIG11bHRpLXZhbHVlLCBgdGhpcy5fc3RyaW5nc2Agd2lsbCBiZSBkZWZpbmVkLCBhbmQgdGhlIG1ldGhvZCBpcyBjYWxsZWRcbiAgICAgKiB3aXRoIHRoZSB2YWx1ZSBhcnJheSBvZiB0aGUgcGFydCdzIG93bmluZyBUZW1wbGF0ZUluc3RhbmNlLCBhbmQgYW4gb2Zmc2V0XG4gICAgICogaW50byB0aGUgdmFsdWUgYXJyYXkgZnJvbSB3aGljaCB0aGUgdmFsdWVzIHNob3VsZCBiZSByZWFkLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyB3YXkgdG8gZWxpbWluYXRlIHNob3J0LWxpdmVkIGFycmF5IHNsaWNlc1xuICAgICAqIG9mIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB2YWx1ZXMsIGFuZCBhbGxvdyBhIGZhc3QtcGF0aCBmb3Igc2luZ2xlLXZhbHVlZFxuICAgICAqIHBhcnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBwYXJ0IHZhbHVlLCBvciBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIG11bHRpLXZhbHVlZCBwYXJ0c1xuICAgICAqIEBwYXJhbSB2YWx1ZUluZGV4IHRoZSBpbmRleCB0byBzdGFydCByZWFkaW5nIHZhbHVlcyBmcm9tLiBgdW5kZWZpbmVkYCBmb3JcbiAgICAgKiAgIHNpbmdsZS12YWx1ZWQgcGFydHNcbiAgICAgKiBAcGFyYW0gbm9Db21taXQgY2F1c2VzIHRoZSBwYXJ0IHRvIG5vdCBjb21taXQgaXRzIHZhbHVlIHRvIHRoZSBET00uIFVzZWRcbiAgICAgKiAgIGluIGh5ZHJhdGlvbiB0byBwcmltZSBhdHRyaWJ1dGUgcGFydHMgd2l0aCB0aGVpciBmaXJzdC1yZW5kZXJlZCB2YWx1ZSxcbiAgICAgKiAgIGJ1dCBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiBTU1IgdG8gbm8tb3AgdGhlIERPTSBvcGVyYXRpb24gYW5kXG4gICAgICogICBjYXB0dXJlIHRoZSB2YWx1ZSBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF8kc2V0VmFsdWUodmFsdWUsIGRpcmVjdGl2ZVBhcmVudCA9IHRoaXMsIHZhbHVlSW5kZXgsIG5vQ29tbWl0KSB7XG4gICAgICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLnN0cmluZ3M7XG4gICAgICAgIC8vIFdoZXRoZXIgYW55IG9mIHRoZSB2YWx1ZXMgaGFzIGNoYW5nZWQsIGZvciBkaXJ0eS1jaGVja2luZ1xuICAgICAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGlmIChzdHJpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZS12YWx1ZSBiaW5kaW5nIGNhc2VcbiAgICAgICAgICAgIHZhbHVlID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZSwgZGlyZWN0aXZlUGFyZW50LCAwKTtcbiAgICAgICAgICAgIGNoYW5nZSA9XG4gICAgICAgICAgICAgICAgIWlzUHJpbWl0aXZlKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGlvbiBjYXNlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nc1swXTtcbiAgICAgICAgICAgIGxldCBpLCB2O1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdiA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWVzW3ZhbHVlSW5kZXggKyBpXSwgZGlyZWN0aXZlUGFyZW50LCBpKTtcbiAgICAgICAgICAgICAgICBpZiAodiA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXItcHJvdmlkZWQgdmFsdWUgaXMgYG5vQ2hhbmdlYCwgdXNlIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB2ID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGFuZ2UgfHw9XG4gICAgICAgICAgICAgICAgICAgICFpc1ByaW1pdGl2ZSh2KSB8fCB2ICE9PSB0aGlzLl8kY29tbWl0dGVkVmFsdWVbaV07XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IG5vdGhpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBub3RoaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gbm90aGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAodiA/PyAnJykgKyBzdHJpbmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIHJlY29yZCBlYWNoIHZhbHVlLCBldmVuIGlmIG9uZSBpcyBgbm90aGluZ2AsIGZvciBmdXR1cmVcbiAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgICAgICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZVtpXSA9IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZSAmJiAhbm9Db21taXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgX2NvbW1pdFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbm90aGluZykge1xuICAgICAgICAgICAgd3JhcCh0aGlzLmVsZW1lbnQpLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYW5pdGl6ZXIgPSBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwodGhpcy5lbGVtZW50LCB0aGlzLm5hbWUsICdhdHRyaWJ1dGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUgPz8gJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3JhcCh0aGlzLmVsZW1lbnQpLnNldEF0dHJpYnV0ZSh0aGlzLm5hbWUsICh2YWx1ZSA/PyAnJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgUHJvcGVydHlQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9IFBST1BFUlRZX1BBUlQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tbWl0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Nhbml0aXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKHRoaXMuZWxlbWVudCwgdGhpcy5uYW1lLCAncHJvcGVydHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fc2FuaXRpemVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHByb3BlcnR5JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICB0aGlzLmVsZW1lbnRbdGhpcy5uYW1lXSA9IHZhbHVlID09PSBub3RoaW5nID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxufVxuY2xhc3MgQm9vbGVhbkF0dHJpYnV0ZVBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gQk9PTEVBTl9BVFRSSUJVVEVfUEFSVDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21taXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAhISh2YWx1ZSAmJiB2YWx1ZSAhPT0gbm90aGluZyksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHdyYXAodGhpcy5lbGVtZW50KS50b2dnbGVBdHRyaWJ1dGUodGhpcy5uYW1lLCAhIXZhbHVlICYmIHZhbHVlICE9PSBub3RoaW5nKTtcbiAgICB9XG59XG5jbGFzcyBFdmVudFBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBuYW1lLCBzdHJpbmdzLCBwYXJlbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudCwgbmFtZSwgc3RyaW5ncywgcGFyZW50LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gRVZFTlRfUEFSVDtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgXFxgPCR7ZWxlbWVudC5sb2NhbE5hbWV9PlxcYCBoYXMgYSBcXGBAJHtuYW1lfT0uLi5cXGAgbGlzdGVuZXIgd2l0aCBgICtcbiAgICAgICAgICAgICAgICAnaW52YWxpZCBjb250ZW50LiBFdmVudCBsaXN0ZW5lcnMgaW4gdGVtcGxhdGVzIG11c3QgaGF2ZSBleGFjdGx5ICcgK1xuICAgICAgICAgICAgICAgICdvbmUgZXhwcmVzc2lvbiBhbmQgbm8gc3Vycm91bmRpbmcgdGV4dC4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBFdmVudFBhcnQgZG9lcyBub3QgdXNlIHRoZSBiYXNlIF8kc2V0VmFsdWUvX3Jlc29sdmVWYWx1ZSBpbXBsZW1lbnRhdGlvblxuICAgIC8vIHNpbmNlIHRoZSBkaXJ0eSBjaGVja2luZyBpcyBtb3JlIGNvbXBsZXhcbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRzZXRWYWx1ZShuZXdMaXN0ZW5lciwgZGlyZWN0aXZlUGFyZW50ID0gdGhpcykge1xuICAgICAgICBuZXdMaXN0ZW5lciA9XG4gICAgICAgICAgICByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIG5ld0xpc3RlbmVyLCBkaXJlY3RpdmVQYXJlbnQsIDApID8/IG5vdGhpbmc7XG4gICAgICAgIGlmIChuZXdMaXN0ZW5lciA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvbGRMaXN0ZW5lciA9IHRoaXMuXyRjb21taXR0ZWRWYWx1ZTtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3RoaW5nIG9yIGFueSBvcHRpb25zIGNoYW5nZSB3ZSBoYXZlIHRvIHJlbW92ZSB0aGVcbiAgICAgICAgLy8gcGFydCBhcyBhIGxpc3RlbmVyLlxuICAgICAgICBjb25zdCBzaG91bGRSZW1vdmVMaXN0ZW5lciA9IChuZXdMaXN0ZW5lciA9PT0gbm90aGluZyAmJiBvbGRMaXN0ZW5lciAhPT0gbm90aGluZykgfHxcbiAgICAgICAgICAgIG5ld0xpc3RlbmVyLmNhcHR1cmUgIT09XG4gICAgICAgICAgICAgICAgb2xkTGlzdGVuZXIuY2FwdHVyZSB8fFxuICAgICAgICAgICAgbmV3TGlzdGVuZXIub25jZSAhPT1cbiAgICAgICAgICAgICAgICBvbGRMaXN0ZW5lci5vbmNlIHx8XG4gICAgICAgICAgICBuZXdMaXN0ZW5lci5wYXNzaXZlICE9PVxuICAgICAgICAgICAgICAgIG9sZExpc3RlbmVyLnBhc3NpdmU7XG4gICAgICAgIC8vIElmIHRoZSBuZXcgdmFsdWUgaXMgbm90IG5vdGhpbmcgYW5kIHdlIHJlbW92ZWQgdGhlIGxpc3RlbmVyLCB3ZSBoYXZlXG4gICAgICAgIC8vIHRvIGFkZCB0aGUgcGFydCBhcyBhIGxpc3RlbmVyLlxuICAgICAgICBjb25zdCBzaG91bGRBZGRMaXN0ZW5lciA9IG5ld0xpc3RlbmVyICE9PSBub3RoaW5nICYmXG4gICAgICAgICAgICAob2xkTGlzdGVuZXIgPT09IG5vdGhpbmcgfHwgc2hvdWxkUmVtb3ZlTGlzdGVuZXIpO1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IGV2ZW50IGxpc3RlbmVyJyxcbiAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdMaXN0ZW5lcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IHNob3VsZFJlbW92ZUxpc3RlbmVyLFxuICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyOiBzaG91bGRBZGRMaXN0ZW5lcixcbiAgICAgICAgICAgICAgICBvbGRMaXN0ZW5lcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMubmFtZSwgdGhpcywgb2xkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5uYW1lLCB0aGlzLCBuZXdMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbmV3TGlzdGVuZXI7XG4gICAgfVxuICAgIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUuY2FsbCh0aGlzLm9wdGlvbnM/Lmhvc3QgPz8gdGhpcy5lbGVtZW50LCBldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUuaGFuZGxlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgRWxlbWVudFBhcnQge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHBhcmVudCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnR5cGUgPSBFTEVNRU5UX1BBUlQ7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgXyRzZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICBraW5kOiAnY29tbWl0IHRvIGVsZW1lbnQgYmluZGluZycsXG4gICAgICAgICAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlKTtcbiAgICB9XG59XG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyBtYW5nbGVkIGluIHRoZVxuICogY2xpZW50IHNpZGUgY29kZSwgd2UgZXhwb3J0IGEgXyRMSCBvYmplY3QgY29udGFpbmluZyB0aG9zZSBtZW1iZXJzIChvclxuICogaGVscGVyIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBwcml2YXRlIGZpZWxkcyBvZiB0aG9zZSBtZW1iZXJzKSwgYW5kIHRoZW5cbiAqIHJlLWV4cG9ydCB0aGVtIGZvciB1c2UgaW4gbGl0LXNzci4gVGhpcyBrZWVwcyBsaXQtc3NyIGFnbm9zdGljIHRvIHdoZXRoZXIgdGhlXG4gKiBjbGllbnQtc2lkZSBjb2RlIGlzIGJlaW5nIHVzZWQgaW4gYGRldmAgbW9kZSBvciBgcHJvZGAgbW9kZS5cbiAqXG4gKiBUaGlzIGhhcyBhIHVuaXF1ZSBuYW1lLCB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBwcml2YXRlIGV4cG9ydHMgaW5cbiAqIGxpdC1lbGVtZW50LCB3aGljaCByZS1leHBvcnRzIGFsbCBvZiBsaXQtaHRtbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgXyRMSCA9IHtcbiAgICAvLyBVc2VkIGluIGxpdC1zc3JcbiAgICBfYm91bmRBdHRyaWJ1dGVTdWZmaXg6IGJvdW5kQXR0cmlidXRlU3VmZml4LFxuICAgIF9tYXJrZXI6IG1hcmtlcixcbiAgICBfbWFya2VyTWF0Y2g6IG1hcmtlck1hdGNoLFxuICAgIF9IVE1MX1JFU1VMVDogSFRNTF9SRVNVTFQsXG4gICAgX2dldFRlbXBsYXRlSHRtbDogZ2V0VGVtcGxhdGVIdG1sLFxuICAgIC8vIFVzZWQgaW4gdGVzdHMgYW5kIHByaXZhdGUtc3NyLXN1cHBvcnRcbiAgICBfVGVtcGxhdGVJbnN0YW5jZTogVGVtcGxhdGVJbnN0YW5jZSxcbiAgICBfaXNJdGVyYWJsZTogaXNJdGVyYWJsZSxcbiAgICBfcmVzb2x2ZURpcmVjdGl2ZTogcmVzb2x2ZURpcmVjdGl2ZSxcbiAgICBfQ2hpbGRQYXJ0OiBDaGlsZFBhcnQsXG4gICAgX0F0dHJpYnV0ZVBhcnQ6IEF0dHJpYnV0ZVBhcnQsXG4gICAgX0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0OiBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgICBfRXZlbnRQYXJ0OiBFdmVudFBhcnQsXG4gICAgX1Byb3BlcnR5UGFydDogUHJvcGVydHlQYXJ0LFxuICAgIF9FbGVtZW50UGFydDogRWxlbWVudFBhcnQsXG59O1xuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgICA/IGdsb2JhbC5saXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZVxuICAgIDogZ2xvYmFsLmxpdEh0bWxQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/LihUZW1wbGF0ZSwgQ2hpbGRQYXJ0KTtcbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgbGl0LWh0bWwgdXNhZ2UuXG4oZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzMuMy4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEh0bWxWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ211bHRpcGxlLXZlcnNpb25zJywgYE11bHRpcGxlIHZlcnNpb25zIG9mIExpdCBsb2FkZWQuIGAgK1xuICAgICAgICAgICAgYExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgaXMgbm90IHJlY29tbWVuZGVkLmApO1xuICAgIH0pO1xufVxuLyoqXG4gKiBSZW5kZXJzIGEgdmFsdWUsIHVzdWFsbHkgYSBsaXQtaHRtbCBUZW1wbGF0ZVJlc3VsdCwgdG8gdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBUaGlzIGV4YW1wbGUgcmVuZGVycyB0aGUgdGV4dCBcIkhlbGxvLCBab2UhXCIgaW5zaWRlIGEgcGFyYWdyYXBoIHRhZywgYXBwZW5kaW5nXG4gKiBpdCB0byB0aGUgY29udGFpbmVyIGBkb2N1bWVudC5ib2R5YC5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHtodG1sLCByZW5kZXJ9IGZyb20gJ2xpdCc7XG4gKlxuICogY29uc3QgbmFtZSA9IFwiWm9lXCI7XG4gKiByZW5kZXIoaHRtbGA8cD5IZWxsbywgJHtuYW1lfSE8L3A+YCwgZG9jdW1lbnQuYm9keSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgQW55IFtyZW5kZXJhYmxlXG4gKiAgIHZhbHVlXShodHRwczovL2xpdC5kZXYvZG9jcy90ZW1wbGF0ZXMvZXhwcmVzc2lvbnMvI2NoaWxkLWV4cHJlc3Npb25zKSxcbiAqICAgdHlwaWNhbGx5IGEge0BsaW5rY29kZSBUZW1wbGF0ZVJlc3VsdH0gY3JlYXRlZCBieSBldmFsdWF0aW5nIGEgdGVtcGxhdGUgdGFnXG4gKiAgIGxpa2Uge0BsaW5rY29kZSBodG1sfSBvciB7QGxpbmtjb2RlIHN2Z30uXG4gKiBAcGFyYW0gY29udGFpbmVyIEEgRE9NIGNvbnRhaW5lciB0byByZW5kZXIgdG8uIFRoZSBmaXJzdCByZW5kZXIgd2lsbCBhcHBlbmRcbiAqICAgdGhlIHJlbmRlcmVkIHZhbHVlIHRvIHRoZSBjb250YWluZXIsIGFuZCBzdWJzZXF1ZW50IHJlbmRlcnMgd2lsbFxuICogICBlZmZpY2llbnRseSB1cGRhdGUgdGhlIHJlbmRlcmVkIHZhbHVlIGlmIHRoZSBzYW1lIHJlc3VsdCB0eXBlIHdhc1xuICogICBwcmV2aW91c2x5IHJlbmRlcmVkIHRoZXJlLlxuICogQHBhcmFtIG9wdGlvbnMgU2VlIHtAbGlua2NvZGUgUmVuZGVyT3B0aW9uc30gZm9yIG9wdGlvbnMgZG9jdW1lbnRhdGlvbi5cbiAqIEBzZWVcbiAqIHtAbGluayBodHRwczovL2xpdC5kZXYvZG9jcy9saWJyYXJpZXMvc3RhbmRhbG9uZS10ZW1wbGF0ZXMvI3JlbmRlcmluZy1saXQtaHRtbC10ZW1wbGF0ZXN8IFJlbmRlcmluZyBMaXQgSFRNTCBUZW1wbGF0ZXN9XG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXIgPSAodmFsdWUsIGNvbnRhaW5lciwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChERVZfTU9ERSAmJiBjb250YWluZXIgPT0gbnVsbCkge1xuICAgICAgICAvLyBHaXZlIGEgY2xlYXJlciBlcnJvciBtZXNzYWdlIHRoYW5cbiAgICAgICAgLy8gICAgIFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiBudWxsIChyZWFkaW5nXG4gICAgICAgIC8vICAgICAnXyRsaXRQYXJ0JCcpXG4gICAgICAgIC8vIHdoaWNoIHJlYWRzIGxpa2UgYW4gaW50ZXJuYWwgTGl0IGVycm9yLlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgY29udGFpbmVyIHRvIHJlbmRlciBpbnRvIG1heSBub3QgYmUgJHtjb250YWluZXJ9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlcklkID0gREVWX01PREUgPyBkZWJ1Z0xvZ1JlbmRlcklkKysgOiAwO1xuICAgIGNvbnN0IHBhcnRPd25lck5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gY29udGFpbmVyO1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgcGFydCA9IHBhcnRPd25lck5vZGVbJ18kbGl0UGFydCQnXTtcbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ2JlZ2luIHJlbmRlcicsXG4gICAgICAgICAgICBpZDogcmVuZGVySWQsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBwYXJ0LFxuICAgICAgICB9KTtcbiAgICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSBvcHRpb25zPy5yZW5kZXJCZWZvcmUgPz8gbnVsbDtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgcGFydE93bmVyTm9kZVsnXyRsaXRQYXJ0JCddID0gcGFydCA9IG5ldyBDaGlsZFBhcnQoY29udGFpbmVyLmluc2VydEJlZm9yZShjcmVhdGVNYXJrZXIoKSwgZW5kTm9kZSksIGVuZE5vZGUsIHVuZGVmaW5lZCwgb3B0aW9ucyA/PyB7fSk7XG4gICAgfVxuICAgIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZSk7XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdlbmQgcmVuZGVyJyxcbiAgICAgICAgICAgIGlkOiByZW5kZXJJZCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIHBhcnQsXG4gICAgICAgIH0pO1xuICAgIHJldHVybiBwYXJ0O1xufTtcbmlmIChFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICByZW5kZXIuc2V0U2FuaXRpemVyID0gc2V0U2FuaXRpemVyO1xuICAgIHJlbmRlci5jcmVhdGVTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXI7XG4gICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIHJlbmRlci5fdGVzdE9ubHlDbGVhclNhbml0aXplckZhY3RvcnlEb05vdENhbGxPckVsc2UgPVxuICAgICAgICAgICAgX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpdC1odG1sLmpzLm1hcCIsImxldCBjdXJyZW50O1xubGV0IGN1cnJlbnRJZCA9IDA7XG5mdW5jdGlvbiBzZXRDdXJyZW50KHN0YXRlKSB7XG4gICAgY3VycmVudCA9IHN0YXRlO1xufVxuZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgY3VycmVudCA9IG51bGw7XG4gICAgY3VycmVudElkID0gMDtcbn1cbmZ1bmN0aW9uIG5vdGlmeSgpIHtcbiAgICByZXR1cm4gY3VycmVudElkKys7XG59XG5leHBvcnQgeyBjbGVhciwgY3VycmVudCwgc2V0Q3VycmVudCwgbm90aWZ5IH07XG4iLCJjb25zdCBwaGFzZVN5bWJvbCA9IFN5bWJvbChcImhhdW50ZWQucGhhc2VcIik7XG5jb25zdCBob29rU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5ob29rXCIpO1xuY29uc3QgdXBkYXRlU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC51cGRhdGVcIik7XG5jb25zdCBjb21taXRTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLmNvbW1pdFwiKTtcbmNvbnN0IGVmZmVjdHNTeW1ib2wgPSBTeW1ib2woXCJoYXVudGVkLmVmZmVjdHNcIik7XG5jb25zdCBsYXlvdXRFZmZlY3RzU3ltYm9sID0gU3ltYm9sKFwiaGF1bnRlZC5sYXlvdXRFZmZlY3RzXCIpO1xuY29uc3QgY29udGV4dEV2ZW50ID0gXCJoYXVudGVkLmNvbnRleHRcIjtcbmV4cG9ydCB7IHBoYXNlU3ltYm9sLCBob29rU3ltYm9sLCB1cGRhdGVTeW1ib2wsIGNvbW1pdFN5bWJvbCwgZWZmZWN0c1N5bWJvbCwgbGF5b3V0RWZmZWN0c1N5bWJvbCwgY29udGV4dEV2ZW50LCB9O1xuIiwiaW1wb3J0IHsgc2V0Q3VycmVudCwgY2xlYXIgfSBmcm9tIFwiLi9pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGhvb2tTeW1ib2wsIGVmZmVjdHNTeW1ib2wsIGxheW91dEVmZmVjdHNTeW1ib2wsIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuY2xhc3MgU3RhdGUge1xuICAgIHVwZGF0ZTtcbiAgICBob3N0O1xuICAgIHZpcnR1YWw7XG4gICAgW2hvb2tTeW1ib2xdO1xuICAgIFtlZmZlY3RzU3ltYm9sXTtcbiAgICBbbGF5b3V0RWZmZWN0c1N5bWJvbF07XG4gICAgY29uc3RydWN0b3IodXBkYXRlLCBob3N0KSB7XG4gICAgICAgIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICB0aGlzW2hvb2tTeW1ib2xdID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzW2VmZmVjdHNTeW1ib2xdID0gW107XG4gICAgICAgIHRoaXNbbGF5b3V0RWZmZWN0c1N5bWJvbF0gPSBbXTtcbiAgICB9XG4gICAgcnVuKGNiKSB7XG4gICAgICAgIHNldEN1cnJlbnQodGhpcyk7XG4gICAgICAgIGxldCByZXMgPSBjYigpO1xuICAgICAgICBjbGVhcigpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBfcnVuRWZmZWN0cyhwaGFzZSkge1xuICAgICAgICBsZXQgZWZmZWN0cyA9IHRoaXNbcGhhc2VdO1xuICAgICAgICBzZXRDdXJyZW50KHRoaXMpO1xuICAgICAgICBmb3IgKGxldCBlZmZlY3Qgb2YgZWZmZWN0cykge1xuICAgICAgICAgICAgZWZmZWN0LmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXIoKTtcbiAgICB9XG4gICAgcnVuRWZmZWN0cygpIHtcbiAgICAgICAgdGhpcy5fcnVuRWZmZWN0cyhlZmZlY3RzU3ltYm9sKTtcbiAgICB9XG4gICAgcnVuTGF5b3V0RWZmZWN0cygpIHtcbiAgICAgICAgdGhpcy5fcnVuRWZmZWN0cyhsYXlvdXRFZmZlY3RzU3ltYm9sKTtcbiAgICB9XG4gICAgdGVhcmRvd24oKSB7XG4gICAgICAgIGxldCBob29rcyA9IHRoaXNbaG9va1N5bWJvbF07XG4gICAgICAgIGhvb2tzLmZvckVhY2goKGhvb2spID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaG9vay50ZWFyZG93biA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaG9vay50ZWFyZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgeyBTdGF0ZSB9O1xuIiwiaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuaW1wb3J0IHsgY29tbWl0U3ltYm9sLCBwaGFzZVN5bWJvbCwgdXBkYXRlU3ltYm9sLCBlZmZlY3RzU3ltYm9sLCBsYXlvdXRFZmZlY3RzU3ltYm9sLCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmNvbnN0IGRlZmVyID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTtcbmZ1bmN0aW9uIHJ1bm5lcigpIHtcbiAgICBsZXQgdGFza3MgPSBbXTtcbiAgICBsZXQgaWQ7XG4gICAgZnVuY3Rpb24gcnVuVGFza3MoKSB7XG4gICAgICAgIGlkID0gbnVsbDtcbiAgICAgICAgbGV0IHQgPSB0YXNrcztcbiAgICAgICAgdGFza3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHQubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRbaV0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgdGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgaWYgKGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIGlkID0gZGVmZXIocnVuVGFza3MpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmNvbnN0IHJlYWQgPSBydW5uZXIoKTtcbmNvbnN0IHdyaXRlID0gcnVubmVyKCk7XG5jbGFzcyBCYXNlU2NoZWR1bGVyIHtcbiAgICByZW5kZXJlcjtcbiAgICBob3N0O1xuICAgIHN0YXRlO1xuICAgIFtwaGFzZVN5bWJvbF07XG4gICAgX3VwZGF0ZVF1ZXVlZDtcbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlciwgaG9zdCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUodGhpcy51cGRhdGUuYmluZCh0aGlzKSwgaG9zdCk7XG4gICAgICAgIHRoaXNbcGhhc2VTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlUXVldWVkID0gZmFsc2U7XG4gICAgfVxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0ZVF1ZXVlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcmVhZCgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5oYW5kbGVQaGFzZSh1cGRhdGVTeW1ib2wpO1xuICAgICAgICAgICAgd3JpdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGhhc2UoY29tbWl0U3ltYm9sLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIHdyaXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQaGFzZShlZmZlY3RzU3ltYm9sKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl91cGRhdGVRdWV1ZWQgPSB0cnVlO1xuICAgIH1cbiAgICBoYW5kbGVQaGFzZShwaGFzZSwgYXJnKSB7XG4gICAgICAgIHRoaXNbcGhhc2VTeW1ib2xdID0gcGhhc2U7XG4gICAgICAgIHN3aXRjaCAocGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgY29tbWl0U3ltYm9sOlxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWl0KGFyZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5FZmZlY3RzKGxheW91dEVmZmVjdHNTeW1ib2wpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgdXBkYXRlU3ltYm9sOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgY2FzZSBlZmZlY3RzU3ltYm9sOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bkVmZmVjdHMoZWZmZWN0c1N5bWJvbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5ydW4oKCkgPT4gdGhpcy5yZW5kZXJlci5jYWxsKHRoaXMuaG9zdCwgdGhpcy5ob3N0KSk7XG4gICAgfVxuICAgIHJ1bkVmZmVjdHMocGhhc2UpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5fcnVuRWZmZWN0cyhwaGFzZSk7XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICB0aGlzLnN0YXRlLnRlYXJkb3duKCk7XG4gICAgfVxufVxuZXhwb3J0IHsgQmFzZVNjaGVkdWxlciB9O1xuIiwiaW1wb3J0IHsgQmFzZVNjaGVkdWxlciB9IGZyb20gXCIuL3NjaGVkdWxlclwiO1xuY29uc3QgdG9DYW1lbENhc2UgPSAodmFsID0gXCJcIikgPT4gdmFsLnJlcGxhY2UoLy0rKFthLXpdKT8vZywgKF8sIGNoYXIpID0+IChjaGFyID8gY2hhci50b1VwcGVyQ2FzZSgpIDogXCJcIikpO1xuZnVuY3Rpb24gbWFrZUNvbXBvbmVudChyZW5kZXIpIHtcbiAgICBjbGFzcyBTY2hlZHVsZXIgZXh0ZW5kcyBCYXNlU2NoZWR1bGVyIHtcbiAgICAgICAgZnJhZztcbiAgICAgICAgY29uc3RydWN0b3IocmVuZGVyZXIsIGZyYWcsIGhvc3QpIHtcbiAgICAgICAgICAgIHN1cGVyKHJlbmRlcmVyLCAoaG9zdCB8fCBmcmFnKSk7XG4gICAgICAgICAgICB0aGlzLmZyYWcgPSBmcmFnO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1pdChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlbmRlcihyZXN1bHQsIHRoaXMuZnJhZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcG9uZW50KHJlbmRlcmVyLCBiYXNlRWxlbWVudE9yT3B0aW9ucywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBCYXNlRWxlbWVudCA9IChvcHRpb25zIHx8IGJhc2VFbGVtZW50T3JPcHRpb25zIHx8IHt9KS5iYXNlRWxlbWVudCB8fFxuICAgICAgICAgICAgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHsgb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gW10sIHVzZVNoYWRvd0RPTSA9IHRydWUsIHNoYWRvd1Jvb3RJbml0ID0ge30sIH0gPSBvcHRpb25zIHx8IGJhc2VFbGVtZW50T3JPcHRpb25zIHx8IHt9O1xuICAgICAgICBjbGFzcyBFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICAgICAgICAgICAgX3NjaGVkdWxlcjtcbiAgICAgICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXJlci5vYnNlcnZlZEF0dHJpYnV0ZXMgfHwgb2JzZXJ2ZWRBdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlU2hhZG93RE9NID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKHJlbmRlcmVyLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIsIC4uLnNoYWRvd1Jvb3RJbml0IH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKHJlbmRlcmVyLCB0aGlzLnNoYWRvd1Jvb3QsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlci51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlci50ZWFyZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gbmV3VmFsdWUgPT09IFwiXCIgPyB0cnVlIDogbmV3VmFsdWU7XG4gICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQodGhpcywgdG9DYW1lbENhc2UobmFtZSksIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVmbGVjdGl2ZVByb3AoaW5pdGlhbFZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgICBsZXQgaXNTZXR1cCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIHNjaGVkdWxpbmcgdXBkYXRlIHdoZW4gcHJvcCB2YWx1ZSBoYXNuJ3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZXR1cCAmJiB2YWx1ZSA9PT0gbmV3VmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlzU2V0dXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZXIudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdG8gPSBuZXcgUHJveHkoQmFzZUVsZW1lbnQucHJvdG90eXBlLCB7XG4gICAgICAgICAgICBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlc2M7XG4gICAgICAgICAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCBrZXlbMF0gPT09IFwiX1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2MgPSByZWZsZWN0aXZlUHJvcCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwga2V5LCBkZXNjKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoRWxlbWVudC5wcm90b3R5cGUsIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5leHBvcnQgeyBtYWtlQ29tcG9uZW50LCB9O1xuIiwiaW1wb3J0IHsgY3VycmVudCwgbm90aWZ5IH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBob29rU3ltYm9sIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuY2xhc3MgSG9vayB7XG4gICAgaWQ7XG4gICAgc3RhdGU7XG4gICAgY29uc3RydWN0b3IoaWQsIHN0YXRlKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVzZShIb29rLCAuLi5hcmdzKSB7XG4gICAgbGV0IGlkID0gbm90aWZ5KCk7XG4gICAgbGV0IGhvb2tzID0gY3VycmVudFtob29rU3ltYm9sXTtcbiAgICBsZXQgaG9vayA9IGhvb2tzLmdldChpZCk7XG4gICAgaWYgKCFob29rKSB7XG4gICAgICAgIGhvb2sgPSBuZXcgSG9vayhpZCwgY3VycmVudCwgLi4uYXJncyk7XG4gICAgICAgIGhvb2tzLnNldChpZCwgaG9vayk7XG4gICAgfVxuICAgIHJldHVybiBob29rLnVwZGF0ZSguLi5hcmdzKTtcbn1cbmZ1bmN0aW9uIGhvb2soSG9vaykge1xuICAgIHJldHVybiB1c2UuYmluZChudWxsLCBIb29rKTtcbn1cbmV4cG9ydCB7IGhvb2ssIEhvb2sgfTtcbiIsImltcG9ydCB7IEhvb2ssIGhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5mdW5jdGlvbiBjcmVhdGVFZmZlY3Qoc2V0RWZmZWN0cykge1xuICAgIHJldHVybiBob29rKGNsYXNzIGV4dGVuZHMgSG9vayB7XG4gICAgICAgIGNhbGxiYWNrO1xuICAgICAgICBsYXN0VmFsdWVzO1xuICAgICAgICB2YWx1ZXM7XG4gICAgICAgIF90ZWFyZG93bjtcbiAgICAgICAgY29uc3RydWN0b3IoaWQsIHN0YXRlLCBpZ25vcmVkMSwgaWdub3JlZDIpIHtcbiAgICAgICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgICAgICBzZXRFZmZlY3RzKHN0YXRlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGUoY2FsbGJhY2ssIHZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0NoYW5nZWQgPSAhdGhpcy52YWx1ZXMgfHwgdGhpcy5oYXNDaGFuZ2VkKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICAgICAgICAgIGlmIChoYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBydW4oKSB7XG4gICAgICAgICAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgICAgICAgICB0aGlzLl90ZWFyZG93biA9IHRoaXMuY2FsbGJhY2suY2FsbCh0aGlzLnN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fdGVhcmRvd24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RlYXJkb3duKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ2hhbmdlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiAoIXRoaXMubGFzdFZhbHVlcyB8fFxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNvbWUoKHZhbHVlLCBpKSA9PiB0aGlzLmxhc3RWYWx1ZXNbaV0gIT09IHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCB7IGNyZWF0ZUVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgZWZmZWN0c1N5bWJvbCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUVmZmVjdCB9IGZyb20gXCIuL2NyZWF0ZS1lZmZlY3RcIjtcbmZ1bmN0aW9uIHNldEVmZmVjdHMoc3RhdGUsIGNiKSB7XG4gICAgc3RhdGVbZWZmZWN0c1N5bWJvbF0ucHVzaChjYik7XG59XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBlZmZlY3QgLSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJ1bnMgZWFjaCB0aW1lIGRlcGVuZGVuY2llcyBjaGFuZ2VcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBbZGVwZW5kZW5jaWVzXSAtIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIHRvIHRoZSBlZmZlY3RcbiAqIEByZXR1cm4ge3ZvaWR9XG4gKi9cbmNvbnN0IHVzZUVmZmVjdCA9IGNyZWF0ZUVmZmVjdChzZXRFZmZlY3RzKTtcbmV4cG9ydCB7IHNldEVmZmVjdHMsIHVzZUVmZmVjdCB9O1xuIiwiaW1wb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbmltcG9ydCB7IGNvbnRleHRFdmVudCB9IGZyb20gXCIuL3N5bWJvbHNcIjtcbmltcG9ydCB7IHNldEVmZmVjdHMgfSBmcm9tIFwiLi91c2UtZWZmZWN0XCI7XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSAgICB7Q29udGV4dDxUPn0gY29udGV4dFxuICogQHJldHVybiAgIHtUfVxuICovXG5jb25zdCB1c2VDb250ZXh0ID0gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgIENvbnRleHQ7XG4gICAgdmFsdWU7XG4gICAgX3JhbkVmZmVjdDtcbiAgICBfdW5zdWJzY3JpYmU7XG4gICAgY29uc3RydWN0b3IoaWQsIHN0YXRlLCBfKSB7XG4gICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZXIgPSB0aGlzLl91cGRhdGVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3JhbkVmZmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IG51bGw7XG4gICAgICAgIHNldEVmZmVjdHMoc3RhdGUsIHRoaXMpO1xuICAgIH1cbiAgICB1cGRhdGUoQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS52aXJ0dWFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW4ndCBiZSB1c2VkIHdpdGggdmlydHVhbCBjb21wb25lbnRzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLkNvbnRleHQgIT09IENvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuQ29udGV4dCA9IENvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIGNhbGwoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcmFuRWZmZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9yYW5FZmZlY3QgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Vuc3Vic2NyaWJlKVxuICAgICAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUodGhpcy5Db250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3VwZGF0ZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBfc3Vic2NyaWJlKENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0geyBDb250ZXh0LCBjYWxsYmFjazogdGhpcy5fdXBkYXRlciB9O1xuICAgICAgICB0aGlzLnN0YXRlLmhvc3QuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoY29udGV4dEV2ZW50LCB7XG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLCAvLyB0byBwYXNzIFNoYWRvd0RPTSBib3VuZGFyaWVzXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgeyB1bnN1YnNjcmliZSA9IG51bGwsIHZhbHVlIH0gPSBkZXRhaWw7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bnN1YnNjcmliZSA/IHZhbHVlIDogQ29udGV4dC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gdW5zdWJzY3JpYmU7XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBpZiAodGhpcy5fdW5zdWJzY3JpYmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmV4cG9ydCB7IHVzZUNvbnRleHQgfTtcbiIsImltcG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSAgeygpID0+IFR9IGZuIGZ1bmN0aW9uIHRvIG1lbW9pemVcbiAqIEBwYXJhbSAge3Vua25vd25bXX0gdmFsdWVzIGRlcGVuZGVuY2llcyB0byB0aGUgbWVtb2l6ZWQgY29tcHV0YXRpb25cbiAqIEByZXR1cm4ge1R9IFRoZSBuZXh0IGNvbXB1dGVkIHZhbHVlXG4gKi9cbmNvbnN0IHVzZU1lbW8gPSBob29rKGNsYXNzIGV4dGVuZHMgSG9vayB7XG4gICAgdmFsdWU7XG4gICAgdmFsdWVzO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgZm4sIHZhbHVlcykge1xuICAgICAgICBzdXBlcihpZCwgc3RhdGUpO1xuICAgICAgICB0aGlzLnZhbHVlID0gZm4oKTtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgfVxuICAgIHVwZGF0ZShmbiwgdmFsdWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gZm4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgaGFzQ2hhbmdlZCh2YWx1ZXMgPSBbXSkge1xuICAgICAgICByZXR1cm4gdmFsdWVzLnNvbWUoKHZhbHVlLCBpKSA9PiB0aGlzLnZhbHVlc1tpXSAhPT0gdmFsdWUpO1xuICAgIH1cbn0pO1xuZXhwb3J0IHsgdXNlTWVtbyB9O1xuIiwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCIuL3VzZS1tZW1vXCI7XG4vKipcbiAqIEBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtGdW5jdGlvbn0gVFxuICogQHBhcmFtICAgIHtUfSBmbiAtIGNhbGxiYWNrIHRvIG1lbW9pemVcbiAqIEBwYXJhbSAgICB7dW5rbm93bltdfSBpbnB1dHMgLSBkZXBlbmRlbmNpZXMgdG8gY2FsbGJhY2sgbWVtb2l6YXRpb25cbiAqIEByZXR1cm4gICB7VH1cbiAqL1xuY29uc3QgdXNlQ2FsbGJhY2sgPSAoZm4sIGlucHV0cykgPT4gdXNlTWVtbygoKSA9PiBmbiwgaW5wdXRzKTtcbmV4cG9ydCB7IHVzZUNhbGxiYWNrIH07XG4iLCJpbXBvcnQgeyBsYXlvdXRFZmZlY3RzU3ltYm9sIH0gZnJvbSBcIi4vc3ltYm9sc1wiO1xuaW1wb3J0IHsgY3JlYXRlRWZmZWN0IH0gZnJvbSBcIi4vY3JlYXRlLWVmZmVjdFwiO1xuZnVuY3Rpb24gc2V0TGF5b3V0RWZmZWN0cyhzdGF0ZSwgY2IpIHtcbiAgICBzdGF0ZVtsYXlvdXRFZmZlY3RzU3ltYm9sXS5wdXNoKGNiKTtcbn1cbi8qKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0gIHtFZmZlY3R9IGNhbGxiYWNrIGVmZmVjdGluZyBjYWxsYmFja1xuICogQHBhcmFtICB7dW5rbm93bltdfSBbdmFsdWVzXSBkZXBlbmRlbmNpZXMgdG8gdGhlIGVmZmVjdFxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuY29uc3QgdXNlTGF5b3V0RWZmZWN0ID0gY3JlYXRlRWZmZWN0KHNldExheW91dEVmZmVjdHMpO1xuZXhwb3J0IHsgdXNlTGF5b3V0RWZmZWN0IH07XG4iLCJpbXBvcnQgeyBob29rLCBIb29rIH0gZnJvbSBcIi4vaG9va1wiO1xuLyoqXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7Kn0gVFxuICogQHBhcmFtIHtUfSBbaW5pdGlhbFN0YXRlXSAtIE9wdGlvbmFsIGluaXRpYWwgc3RhdGVcbiAqIEByZXR1cm4ge1N0YXRlVHVwbGU8VD59IHN0YXRlVHVwbGUgLSBUdXBsZSBvZiBjdXJyZW50IHN0YXRlIGFuZCBzdGF0ZSB1cGRhdGVyIGZ1bmN0aW9uXG4gKi9cbmNvbnN0IHVzZVN0YXRlID0gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgIGFyZ3M7XG4gICAgY29uc3RydWN0b3IoaWQsIHN0YXRlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoaWQsIHN0YXRlKTtcbiAgICAgICAgdGhpcy51cGRhdGVyID0gdGhpcy51cGRhdGVyLmJpbmQodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5pdGlhbFZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRGbiA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IGluaXRGbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFrZUFyZ3MoaW5pdGlhbFZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzO1xuICAgIH1cbiAgICB1cGRhdGVyKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IFtwcmV2aW91c1ZhbHVlXSA9IHRoaXMuYXJncztcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVyRm4gPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlID0gdXBkYXRlckZuKHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QuaXMocHJldmlvdXNWYWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYWtlQXJncyh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKCk7XG4gICAgfVxuICAgIG1ha2VBcmdzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXJncyA9IE9iamVjdC5mcmVlemUoW3ZhbHVlLCB0aGlzLnVwZGF0ZXJdKTtcbiAgICB9XG59KTtcbmV4cG9ydCB7IHVzZVN0YXRlIH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBQb3J0aW9ucyBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmltcG9ydCB7IHVzZUxheW91dEVmZmVjdCB9IGZyb20gXCIuL3VzZS1sYXlvdXQtZWZmZWN0XCI7XG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCIuL3VzZS1zdGF0ZVwiO1xuY29uc3QgbWljcm90YXNrID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFJlYWN0aXZlQ29udHJvbGxlckhvc3QgdGhhdCBpcyBkcml2ZW4gYnkgSGF1bnRlZCBob29rc1xuICogYW5kIGB1c2VDb250cm9sbGVyKClgLlxuICovXG5jbGFzcyBIYXVudGVkQ29udHJvbGxlckhvc3Qge1xuICAgIGNvdW50O1xuICAgIGtpY2s7XG4gICAgX2NvbnRyb2xsZXJzID0gW107XG4gICAgX3VwZGF0ZVBlbmRpbmcgPSB0cnVlO1xuICAgIF91cGRhdGVDb21wbGV0ZVByb21pc2U7XG4gICAgX3Jlc29sdmVVcGRhdGU7XG4gICAgY29uc3RydWN0b3IoY291bnQsIGtpY2spIHtcbiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgICAgICB0aGlzLmtpY2sgPSBraWNrO1xuICAgICAgICB0aGlzLl91cGRhdGVDb21wbGV0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlVXBkYXRlID0gcmVzO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlcik7XG4gICAgfVxuICAgIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICAvLyBOb3RlLCBpZiB0aGUgaW5kZXhPZiBpcyAtMSwgdGhlID4+PiB3aWxsIGZsaXAgdGhlIHNpZ24gd2hpY2ggbWFrZXMgdGhlXG4gICAgICAgIC8vIHNwbGljZSBkbyBub3RoaW5nLlxuICAgICAgICB0aGlzLl9jb250cm9sbGVycyAmJlxuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuc3BsaWNlKHRoaXMuX2NvbnRyb2xsZXJzLmluZGV4T2YoY29udHJvbGxlcikgPj4+IDAsIDEpO1xuICAgIH1cbiAgICByZXF1ZXN0VXBkYXRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3VwZGF0ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVBlbmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgbWljcm90YXNrLnRoZW4oKCkgPT4gdGhpcy5raWNrKCh0aGlzLmNvdW50ICs9IDEpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHVwZGF0ZUNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlQ29tcGxldGVQcm9taXNlO1xuICAgIH1cbiAgICBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLmZvckVhY2goKGMpID0+IGMuaG9zdENvbm5lY3RlZCAmJiBjLmhvc3RDb25uZWN0ZWQoKSk7XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbGxlcnMuZm9yRWFjaCgoYykgPT4gYy5ob3N0RGlzY29ubmVjdGVkICYmIGMuaG9zdERpc2Nvbm5lY3RlZCgpKTtcbiAgICB9XG4gICAgdXBkYXRlKCkge1xuICAgICAgICB0aGlzLl9jb250cm9sbGVycy5mb3JFYWNoKChjKSA9PiBjLmhvc3RVcGRhdGUgJiYgYy5ob3N0VXBkYXRlKCkpO1xuICAgIH1cbiAgICB1cGRhdGVkKCkge1xuICAgICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSB0aGlzLl9yZXNvbHZlVXBkYXRlO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdXBkYXRlQ29tcGxldGUgUHJvbWlzZSBmb3IgdGhlIG5leHQgdXBkYXRlLFxuICAgICAgICAvLyBiZWZvcmUgcmVzb2x2aW5nIHRoZSBjdXJyZW50IG9uZS5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZVVwZGF0ZSA9IHJlcztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xsZXJzLmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZWQgJiYgYy5ob3N0VXBkYXRlZCgpKTtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl91cGRhdGVQZW5kaW5nKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW5kIHN0b3JlcyBhIHN0YXRlZnVsIFJlYWN0aXZlQ29udHJvbGxlciBpbnN0YW5jZSBhbmQgcHJvdmlkZXMgaXRcbiAqIHdpdGggYSBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0IHRoYXQgZHJpdmVzIHRoZSBjb250cm9sbGVyIGxpZmVjeWNsZS5cbiAqXG4gKiBVc2UgdGhpcyBob29rIHRvIGNvbnZlcnQgYSBSZWFjdGl2ZUNvbnRyb2xsZXIgaW50byBhIEhhdW50ZWQgaG9vay5cbiAqXG4gKiBAcGFyYW0gezxDIGV4dGVuZHMgUmVhY3RpdmVDb250cm9sbGVyPihob3N0OiBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0KSA9PiBDfSBjcmVhdGVDb250cm9sbGVyIEEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgY29udHJvbGxlciBpbnN0YW5jZS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgZ2l2ZW4gYSBIYXVudGVkQ29udHJvbGxlckhvc3QgdG8gcGFzcyB0byB0aGUgY29udHJvbGxlci4gVGhlXG4gKiBjcmVhdGUgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25jZSBwZXIgY29tcG9uZW50LlxuICogQHJldHVybiB7UmVhY3RpdmVDb250cm9sbGVyfSB0aGUgY29udHJvbGxlciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udHJvbGxlcihjcmVhdGVDb250cm9sbGVyKSB7XG4gICAgY29uc3QgW2NvdW50LCBraWNrXSA9IHVzZVN0YXRlKDApO1xuICAgIGNvbnN0IFtob3N0XSA9IHVzZVN0YXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgaG9zdCA9IG5ldyBIYXVudGVkQ29udHJvbGxlckhvc3QoY291bnQsIGtpY2spO1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gY3JlYXRlQ29udHJvbGxlcihob3N0KTtcbiAgICAgICAgaG9zdC5wcmltYXJ5Q29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgIGhvc3QuY29ubmVjdGVkKCk7XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH0pO1xuICAgIC8vIFdlIHVzZSB1c2VMYXlvdXRFZmZlY3QgYmVjYXVzZSB3ZSBuZWVkIHVwZGF0ZWQoKSBjYWxsZWQgc3luY2hyb25vdXNseVxuICAgIC8vIGFmdGVyIHJlbmRlcmluZy5cbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4gaG9zdC51cGRhdGVkKCkpO1xuICAgIC8vIFJldHVybmluZyBhIGNsZWFudXAgZnVuY3Rpb24gc2ltdWxhdGVzIGhvc3REaXNjb25uZWN0ZWQgdGltaW5nLiBBbiBlbXB0eVxuICAgIC8vIGRlcHMgYXJyYXkgdGVsbHMgSGF1bnRlZCB0byBvbmx5IGNhbGwgdGhpcyBvbmNlOiBvbiBtb3VudCB3aXRoIHRoZSBjbGVhbnVwXG4gICAgLy8gY2FsbGVkIG9uIHVubW91bnQuXG4gICAgdXNlTGF5b3V0RWZmZWN0KCgpID0+ICgpID0+IGhvc3QuZGlzY29ubmVjdGVkKCksIFtdKTtcbiAgICBob3N0LnVwZGF0ZSgpO1xuICAgIHJldHVybiBob3N0LnByaW1hcnlDb250cm9sbGVyO1xufVxuIiwiaW1wb3J0IHsgaG9vaywgSG9vayB9IGZyb20gXCIuL2hvb2tcIjtcbi8qKlxuICogR2l2ZW4gYSByZWR1Y2VyIGZ1bmN0aW9uLCBpbml0aWFsIHN0YXRlLCBhbmQgb3B0aW9uYWwgc3RhdGUgaW5pdGlhbGl6ZXIgZnVuY3Rpb24sIHJldHVybnMgYSB0dXBsZSBvZiBzdGF0ZSBhbmQgZGlzcGF0Y2ggZnVuY3Rpb24uXG4gKiBAZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBTIFN0YXRlXG4gKiBAdGVtcGxhdGUgSSBJbml0aWFsIFN0YXRlXG4gKiBAdGVtcGxhdGUgQSBBY3Rpb25cbiAqIEBwYXJhbSB7UmVkdWNlcjxTLCBBPn0gcmVkdWNlciAtIHJlZHVjZXIgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbmV4dCBzdGF0ZSBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSB7SX0gaW5pdGlhbFN0YXRlIC0gdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHJlZHVjZXJcbiAqIEBwYXJhbSB7KGluaXQ6IEkpID0+IFN9IFtpbml0PXVuZGVmaW5lZF0gLSBPcHRpb25hbCBpbml0aWFsaXplciBmdW5jdGlvbiwgY2FsbGVkIG9uIGluaXRpYWxTdGF0ZSBpZiBwcm92aWRlZFxuICogQHJldHVybiB7cmVhZG9ubHkgW1MsIChhY3Rpb246IEEpID0+IHZvaWRdfVxuICovXG5jb25zdCB1c2VSZWR1Y2VyID0gaG9vayhjbGFzcyBleHRlbmRzIEhvb2sge1xuICAgIHJlZHVjZXI7XG4gICAgY3VycmVudFN0YXRlO1xuICAgIGNvbnN0cnVjdG9yKGlkLCBzdGF0ZSwgXywgaW5pdGlhbFN0YXRlLCBpbml0KSB7XG4gICAgICAgIHN1cGVyKGlkLCBzdGF0ZSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID1cbiAgICAgICAgICAgIGluaXQgIT09IHVuZGVmaW5lZCA/IGluaXQoaW5pdGlhbFN0YXRlKSA6IGluaXRpYWxTdGF0ZTtcbiAgICB9XG4gICAgdXBkYXRlKHJlZHVjZXIpIHtcbiAgICAgICAgdGhpcy5yZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmN1cnJlbnRTdGF0ZSwgdGhpcy5kaXNwYXRjaF07XG4gICAgfVxuICAgIGRpc3BhdGNoKGFjdGlvbikge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMucmVkdWNlcih0aGlzLmN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKTtcbiAgICB9XG59KTtcbmV4cG9ydCB7IHVzZVJlZHVjZXIgfTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0IGNvbnN0IFBhcnRUeXBlID0ge1xuICAgIEFUVFJJQlVURTogMSxcbiAgICBDSElMRDogMixcbiAgICBQUk9QRVJUWTogMyxcbiAgICBCT09MRUFOX0FUVFJJQlVURTogNCxcbiAgICBFVkVOVDogNSxcbiAgICBFTEVNRU5UOiA2LFxufTtcbi8qKlxuICogQ3JlYXRlcyBhIHVzZXItZmFjaW5nIGRpcmVjdGl2ZSBmdW5jdGlvbiBmcm9tIGEgRGlyZWN0aXZlIGNsYXNzLiBUaGlzXG4gKiBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgZGlyZWN0aXZlJ3MgcmVuZGVyKCkgbWV0aG9kLlxuICovXG5leHBvcnQgY29uc3QgZGlyZWN0aXZlID0gKGMpID0+ICguLi52YWx1ZXMpID0+ICh7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBbJ18kbGl0RGlyZWN0aXZlJCddOiBjLFxuICAgIHZhbHVlcyxcbn0pO1xuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBjdXN0b20gZGlyZWN0aXZlcy4gVXNlcnMgc2hvdWxkIGV4dGVuZCB0aGlzIGNsYXNzLFxuICogaW1wbGVtZW50IGByZW5kZXJgIGFuZC9vciBgdXBkYXRlYCwgYW5kIHRoZW4gcGFzcyB0aGVpciBzdWJjbGFzcyB0b1xuICogYGRpcmVjdGl2ZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKF9wYXJ0SW5mbykgeyB9XG4gICAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICAgIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICAgIH1cbiAgICAvKiogQGludGVybmFsICovXG4gICAgXyRpbml0aWFsaXplKHBhcnQsIHBhcmVudCwgYXR0cmlidXRlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5fX3BhcnQgPSBwYXJ0O1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlSW5kZXggPSBhdHRyaWJ1dGVJbmRleDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF8kcmVzb2x2ZShwYXJ0LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUocGFydCwgcHJvcHMpO1xuICAgIH1cbiAgICB1cGRhdGUoX3BhcnQsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlciguLi5wcm9wcyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlyZWN0aXZlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG4vLyBBbGxvd3MgbWluaWZpZXJzIHRvIHJlbmFtZSByZWZlcmVuY2VzIHRvIGdsb2JhbFRoaXNcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyA9IGdsb2JhbC5TaGFkb3dSb290ICYmXG4gICAgKGdsb2JhbC5TaGFkeUNTUyA9PT0gdW5kZWZpbmVkIHx8IGdsb2JhbC5TaGFkeUNTUy5uYXRpdmVTaGFkb3cpICYmXG4gICAgJ2Fkb3B0ZWRTdHlsZVNoZWV0cycgaW4gRG9jdW1lbnQucHJvdG90eXBlICYmXG4gICAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuY29uc3QgY29uc3RydWN0aW9uVG9rZW4gPSBTeW1ib2woKTtcbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gICAgY29uc3RydWN0b3IoY3NzVGV4dCwgc3RyaW5ncywgc2FmZVRva2VuKSB7XG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIHRoaXNbJ18kY3NzUmVzdWx0JCddID0gdHJ1ZTtcbiAgICAgICAgaWYgKHNhZmVUb2tlbiAhPT0gY29uc3RydWN0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgICAgICB0aGlzLl9zdHJpbmdzID0gc3RyaW5ncztcbiAgICB9XG4gICAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgICAvLyBhcmUgbm90IGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IGVsZW1lbnQgaW5zdGFuY2UgaXMgbWFkZS5cbiAgICBnZXQgc3R5bGVTaGVldCgpIHtcbiAgICAgICAgLy8gSWYgYHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0c2AgaXMgdHJ1ZSB0aGVuIHdlIGFzc3VtZSBDU1NTdHlsZVNoZWV0IGlzXG4gICAgICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgICAgIGxldCBzdHlsZVNoZWV0ID0gdGhpcy5fc3R5bGVTaGVldDtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IHRoaXMuX3N0cmluZ3M7XG4gICAgICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVTaGVldCA9IGNzc1RhZ0NhY2hlLmdldChzdHJpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5fc3R5bGVTaGVldCA9IHN0eWxlU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpKS5yZXBsYWNlU3luYyh0aGlzLmNzc1RleHQpO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZWFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3R5bGVTaGVldDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNzc1RleHQ7XG4gICAgfVxufVxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWUpID0+IHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIGlmICh2YWx1ZVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmNzc1RleHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgICAgICBgJHt2YWx1ZX0uIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0IHRha2UgY2FyZSBgICtcbiAgICAgICAgICAgIGB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS5gKTtcbiAgICB9XG59O1xuLyoqXG4gKiBXcmFwIGEgdmFsdWUgZm9yIGludGVycG9sYXRpb24gaW4gYSB7QGxpbmtjb2RlIGNzc30gdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwuXG4gKlxuICogVGhpcyBpcyB1bnNhZmUgYmVjYXVzZSB1bnRydXN0ZWQgQ1NTIHRleHQgY2FuIGJlIHVzZWQgdG8gcGhvbmUgaG9tZVxuICogb3IgZXhmaWx0cmF0ZSBkYXRhIHRvIGFuIGF0dGFja2VyIGNvbnRyb2xsZWQgc2l0ZS4gVGFrZSBjYXJlIHRvIG9ubHkgdXNlXG4gKiB0aGlzIHdpdGggdHJ1c3RlZCBpbnB1dC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuc2FmZUNTUyA9ICh2YWx1ZSkgPT4gbmV3IENTU1Jlc3VsdCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpLCB1bmRlZmluZWQsIGNvbnN0cnVjdGlvblRva2VuKTtcbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoc3RyaW5ncywgLi4udmFsdWVzKSA9PiB7XG4gICAgY29uc3QgY3NzVGV4dCA9IHN0cmluZ3MubGVuZ3RoID09PSAxXG4gICAgICAgID8gc3RyaW5nc1swXVxuICAgICAgICA6IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PiBhY2MgKyB0ZXh0RnJvbUNTU1Jlc3VsdCh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pO1xuICAgIHJldHVybiBuZXcgQ1NTUmVzdWx0KGNzc1RleHQsIHN0cmluZ3MsIGNvbnN0cnVjdGlvblRva2VuKTtcbn07XG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHN0eWxlcyB0byBhIGBzaGFkb3dSb290YC4gV2hlbiBTaGFkb3cgRE9NIGlzXG4gKiBhdmFpbGFibGUgYnV0IGBhZG9wdGVkU3R5bGVTaGVldHNgIGlzIG5vdCwgc3R5bGVzIGFyZSBhcHBlbmRlZCB0byB0aGVcbiAqIGBzaGFkb3dSb290YCB0byBbbWltaWMgdGhlIG5hdGl2ZSBmZWF0dXJlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2hhZG93Um9vdC9hZG9wdGVkU3R5bGVTaGVldHMpLlxuICogTm90ZSwgd2hlbiBzaGltbWluZyBpcyB1c2VkLCBhbnkgc3R5bGVzIHRoYXQgYXJlIHN1YnNlcXVlbnRseSBwbGFjZWQgaW50b1xuICogdGhlIHNoYWRvd1Jvb3Qgc2hvdWxkIGJlIHBsYWNlZCAqYmVmb3JlKiBhbnkgc2hpbW1lZCBhZG9wdGVkIHN0eWxlcy4gVGhpc1xuICogd2lsbCBtYXRjaCBzcGVjIGJlaGF2aW9yIHRoYXQgZ2l2ZXMgYWRvcHRlZCBzaGVldHMgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICogc2hhZG93Um9vdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFkb3B0U3R5bGVzID0gKHJlbmRlclJvb3QsIHN0eWxlcykgPT4ge1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMpIHtcbiAgICAgICAgcmVuZGVyUm9vdC5hZG9wdGVkU3R5bGVTaGVldHMgPSBzdHlsZXMubWFwKChzKSA9PiBzIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCA/IHMgOiBzLnN0eWxlU2hlZXQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHN0eWxlcykge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGNvbnN0IG5vbmNlID0gZ2xvYmFsWydsaXROb25jZSddO1xuICAgICAgICAgICAgaWYgKG5vbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBzLmNzc1RleHQ7XG4gICAgICAgICAgICByZW5kZXJSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5jb25zdCBjc3NSZXN1bHRGcm9tU3R5bGVTaGVldCA9IChzaGVldCkgPT4ge1xuICAgIGxldCBjc3NUZXh0ID0gJyc7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgIGNzc1RleHQgKz0gcnVsZS5jc3NUZXh0O1xuICAgIH1cbiAgICByZXR1cm4gdW5zYWZlQ1NTKGNzc1RleHQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDb21wYXRpYmxlU3R5bGUgPSBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgfHxcbiAgICAoTk9ERV9NT0RFICYmIGdsb2JhbC5DU1NTdHlsZVNoZWV0ID09PSB1bmRlZmluZWQpXG4gICAgPyAocykgPT4gc1xuICAgIDogKHMpID0+IHMgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0ID8gY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQocykgOiBzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3NzLXRhZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbi8qKlxuICogVXNlIHRoaXMgbW9kdWxlIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIG93biBiYXNlIGNsYXNzIGV4dGVuZGluZ1xuICoge0BsaW5rIFJlYWN0aXZlRWxlbWVudH0uXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuaW1wb3J0IHsgZ2V0Q29tcGF0aWJsZVN0eWxlLCBhZG9wdFN0eWxlcywgfSBmcm9tICcuL2Nzcy10YWcuanMnO1xuLy8gSW4gdGhlIE5vZGUgYnVpbGQsIHRoaXMgaW1wb3J0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgUm9sbHVwOlxuLy8gaW1wb3J0IHtIVE1MRWxlbWVudCwgY3VzdG9tRWxlbWVudHN9IGZyb20gJ0BsaXQtbGFicy9zc3ItZG9tLXNoaW0nO1xuZXhwb3J0ICogZnJvbSAnLi9jc3MtdGFnLmpzJztcbi8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBBZGQgYGhhc093bmAgaGVyZSB3aGVuIHdlIHNoaXAgRVMyMDIyXG5jb25zdCB7IGlzLCBkZWZpbmVQcm9wZXJ0eSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLCBnZXRPd25Qcm9wZXJ0eU5hbWVzLCBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMsIGdldFByb3RvdHlwZU9mLCB9ID0gT2JqZWN0O1xuY29uc3QgTk9ERV9NT0RFID0gZmFsc2U7XG4vLyBMZXRzIGEgbWluaWZpZXIgcmVwbGFjZSBnbG9iYWxUaGlzIHJlZmVyZW5jZXMgd2l0aCBhIG1pbmlmaWVkIG5hbWVcbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5pZiAoTk9ERV9NT0RFKSB7XG4gICAgZ2xvYmFsLmN1c3RvbUVsZW1lbnRzID8/PSBjdXN0b21FbGVtZW50cztcbn1cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmxldCBpc3N1ZVdhcm5pbmc7XG5jb25zdCB0cnVzdGVkVHlwZXMgPSBnbG9iYWxcbiAgICAudHJ1c3RlZFR5cGVzO1xuLy8gVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vY3JidWcuY29tLzk5MzI2OFxuLy8gQ3VycmVudGx5LCBhbnkgYXR0cmlidXRlIHN0YXJ0aW5nIHdpdGggXCJvblwiIGlzIGNvbnNpZGVyZWQgdG8gYmUgYVxuLy8gVHJ1c3RlZFNjcmlwdCBzb3VyY2UuIFN1Y2ggYm9vbGVhbiBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0IHRvIHRoZSBlcXVpdmFsZW50XG4vLyB0cnVzdGVkIGVtcHR5U2NyaXB0IHZhbHVlLlxuY29uc3QgZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlID0gdHJ1c3RlZFR5cGVzXG4gICAgPyB0cnVzdGVkVHlwZXMuZW1wdHlTY3JpcHRcbiAgICA6ICcnO1xuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgICA/IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gICAgOiBnbG9iYWwucmVhY3RpdmVFbGVtZW50UG9seWZpbGxTdXBwb3J0O1xuaWYgKERFVl9NT0RFKSB7XG4gICAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgICAvLyBhcmUgbG9hZGVkLlxuICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuICAgIC8qKlxuICAgICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgICAqL1xuICAgIGlzc3VlV2FybmluZyA9IChjb2RlLCB3YXJuaW5nKSA9PiB7XG4gICAgICAgIHdhcm5pbmcgKz0gYCBTZWUgaHR0cHM6Ly9saXQuZGV2L21zZy8ke2NvZGV9IGZvciBtb3JlIGluZm9ybWF0aW9uLmA7XG4gICAgICAgIGlmICghZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5oYXMoY29kZSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgICAgICAgIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncy5hZGQod2FybmluZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaXNzdWVXYXJuaW5nKCdkZXYtbW9kZScsIGBMaXQgaXMgaW4gZGV2IG1vZGUuIE5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiFgKTtcbiAgICAgICAgLy8gSXNzdWUgcG9seWZpbGwgc3VwcG9ydCB3YXJuaW5nLlxuICAgICAgICBpZiAoZ2xvYmFsLlNoYWR5RE9NPy5pblVzZSAmJiBwb2x5ZmlsbFN1cHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCdwb2x5ZmlsbC1zdXBwb3J0LW1pc3NpbmcnLCBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgICAgICAgICAgYHRoZSBcXGBwb2x5ZmlsbC1zdXBwb3J0XFxgIG1vZHVsZSBoYXMgbm90IGJlZW4gbG9hZGVkLmApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIFVzZWZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIGxvZ2dpbmcgaW5zaWdodHMgaW50byB3aGF0IHRoZSBMaXQgdGVtcGxhdGUgc3lzdGVtIGlzIGRvaW5nLlxuICpcbiAqIENvbXBpbGVkIG91dCBvZiBwcm9kIG1vZGUgYnVpbGRzLlxuICovXG5jb25zdCBkZWJ1Z0xvZ0V2ZW50ID0gREVWX01PREVcbiAgICA/IChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzaG91bGRFbWl0ID0gZ2xvYmFsXG4gICAgICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgICBpZiAoIXNob3VsZEVtaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xpdC1kZWJ1ZycsIHtcbiAgICAgICAgICAgIGRldGFpbDogZXZlbnQsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgOiB1bmRlZmluZWQ7XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSAocHJvcCwgX29iaikgPT4gcHJvcDtcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29udmVydGVyID0ge1xuICAgIHRvQXR0cmlidXRlKHZhbHVlLCB0eXBlKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPyBlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUgOiBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICAgICAgICBjYXNlIEFycmF5OlxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgcGFzcyB0aGlzIHRocm91Z2hcbiAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyByZW1vdmluZy9ubyBjaGFuZ2UgYmVoYXZpb3IuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgZnJvbUF0dHJpYnV0ZSh2YWx1ZSwgdHlwZSkge1xuICAgICAgICBsZXQgZnJvbVZhbHVlID0gdmFsdWU7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBCb29sZWFuOlxuICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlICE9PSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOdW1iZXI6XG4gICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gdmFsdWUgPT09IG51bGwgPyBudWxsIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgICAgICAgY2FzZSBBcnJheTpcbiAgICAgICAgICAgICAgICAvLyBEbyAqbm90KiBnZW5lcmF0ZSBleGNlcHRpb24gd2hlbiBpbnZhbGlkIEpTT04gaXMgc2V0IGFzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgbm9ybWFsbHkgY29tcGxhaW4gb24gYmVpbmcgbWlzLWNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogRG8gZ2VuZXJhdGUgZXhjZXB0aW9uIGluICpkZXYgbW9kZSouXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzZXJ0IHRvIGFkaGVyZSB0byBCYXplbCdzIFwibXVzdCB0eXBlIGFzc2VydCBKU09OIHBhcnNlXCIgcnVsZS5cbiAgICAgICAgICAgICAgICAgICAgZnJvbVZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tVmFsdWU7XG4gICAgfSxcbn07XG4vKipcbiAqIENoYW5nZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGRpZmZlcmVudCBmcm9tIGBvbGRWYWx1ZWAuXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhIHByb3BlcnR5J3MgYGhhc0NoYW5nZWRgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPSAodmFsdWUsIG9sZCkgPT4gIWlzKHZhbHVlLCBvbGQpO1xuY29uc3QgZGVmYXVsdFByb3BlcnR5RGVjbGFyYXRpb24gPSB7XG4gICAgYXR0cmlidXRlOiB0cnVlLFxuICAgIHR5cGU6IFN0cmluZyxcbiAgICBjb252ZXJ0ZXI6IGRlZmF1bHRDb252ZXJ0ZXIsXG4gICAgcmVmbGVjdDogZmFsc2UsXG4gICAgdXNlRGVmYXVsdDogZmFsc2UsXG4gICAgaGFzQ2hhbmdlZDogbm90RXF1YWwsXG59O1xuLy8gRW5zdXJlIG1ldGFkYXRhIGlzIGVuYWJsZWQuIFR5cGVTY3JpcHQgZG9lcyBub3QgcG9seWZpbGxcbi8vIFN5bWJvbC5tZXRhZGF0YSwgc28gd2UgbXVzdCBlbnN1cmUgdGhhdCBpdCBleGlzdHMuXG5TeW1ib2wubWV0YWRhdGEgPz89IFN5bWJvbCgnbWV0YWRhdGEnKTtcbi8vIE1hcCBmcm9tIGEgY2xhc3MncyBtZXRhZGF0YSBvYmplY3QgdG8gcHJvcGVydHkgb3B0aW9uc1xuLy8gTm90ZSB0aGF0IHdlIG11c3QgdXNlIG51bGxpc2gtY29hbGVzY2luZyBhc3NpZ25tZW50IHNvIHRoYXQgd2Ugb25seSB1c2Ugb25lXG4vLyBtYXAgZXZlbiBpZiB3ZSBsb2FkIG11bHRpcGxlIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUuXG5nbG9iYWwubGl0UHJvcGVydHlNZXRhZGF0YSA/Pz0gbmV3IFdlYWtNYXAoKTtcbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHdoaWNoIG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiBXaGVuXG4gKiBwcm9wZXJ0aWVzIGNoYW5nZSwgdGhlIGB1cGRhdGVgIG1ldGhvZCBpcyBhc3luY2hyb25vdXNseSBjYWxsZWQuIFRoaXMgbWV0aG9kXG4gKiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgc3ViY2xhc3NlcyB0byByZW5kZXIgdXBkYXRlcyBhcyBkZXNpcmVkLlxuICogQG5vSW5oZXJpdERvY1xuICovXG5leHBvcnQgY2xhc3MgUmVhY3RpdmVFbGVtZW50XG4vLyBJbiB0aGUgTm9kZSBidWlsZCwgdGhpcyBgZXh0ZW5kc2AgY2xhdXNlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aFxuLy8gYChnbG9iYWxUaGlzLkhUTUxFbGVtZW50ID8/IEhUTUxFbGVtZW50KWAuXG4vL1xuLy8gVGhpcyB3YXksIHdlIHdpbGwgZmlyc3QgcHJlZmVyIGFueSBnbG9iYWwgYEhUTUxFbGVtZW50YCBwb2x5ZmlsbCB0aGF0IHRoZVxuLy8gdXNlciBoYXMgYXNzaWduZWQsIGFuZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgYEhUTUxFbGVtZW50YCBzaGltIHdoaWNoIGhhc1xuLy8gYmVlbiBpbXBvcnRlZCAoc2VlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUgYWJvdXQgaG93IHRoaXMgaW1wb3J0IGlzXG4vLyBnZW5lcmF0ZWQgYnkgUm9sbHVwKS4gTm90ZSB0aGF0IHRoZSBgSFRNTEVsZW1lbnRgIHZhcmlhYmxlIGhhcyBiZWVuXG4vLyBzaGFkb3dlZCBieSB0aGlzIGltcG9ydCwgc28gaXQgbm8gbG9uZ2VyIHJlZmVycyB0byB0aGUgZ2xvYmFsLlxuIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24gdG8gdGhlIGNsYXNzIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBpbnN0YW5jZVxuICAgICAqIGNvbnN0cnVjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjb2RlIHRoYXQgcnVucyBhZ2FpbnN0IGEgYFJlYWN0aXZlRWxlbWVudGBcbiAgICAgKiBzdWJjbGFzcywgc3VjaCBhcyBhIGRlY29yYXRvciwgdGhhdCBuZWVkcyB0byBkbyB3b3JrIGZvciBlYWNoXG4gICAgICogaW5zdGFuY2UsIHN1Y2ggYXMgc2V0dGluZyB1cCBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBteURlY29yYXRvciA9ICh0YXJnZXQ6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICogICB0YXJnZXQuYWRkSW5pdGlhbGl6ZXIoKGluc3RhbmNlOiBSZWFjdGl2ZUVsZW1lbnQpID0+IHtcbiAgICAgKiAgICAgLy8gVGhpcyBpcyBydW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgICAqICAgICBuZXcgTXlDb250cm9sbGVyKGluc3RhbmNlKTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIERlY29yYXRpbmcgYSBmaWVsZCB3aWxsIHRoZW4gY2F1c2UgZWFjaCBpbnN0YW5jZSB0byBydW4gYW4gaW5pdGlhbGl6ZXJcbiAgICAgKiB0aGF0IGFkZHMgYSBjb250cm9sbGVyOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICAgKiAgIEBteURlY29yYXRvciBmb287XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW5pdGlhbGl6ZXJzIGFyZSBzdG9yZWQgcGVyLWNvbnN0cnVjdG9yLiBBZGRpbmcgYW4gaW5pdGlhbGl6ZXIgdG8gYVxuICAgICAqIHN1YmNsYXNzIGRvZXMgbm90IGFkZCBpdCB0byBhIHN1cGVyY2xhc3MuIFNpbmNlIGluaXRpYWxpemVycyBhcmUgcnVuIGluXG4gICAgICogY29uc3RydWN0b3JzLCBpbml0aWFsaXplcnMgd2lsbCBydW4gaW4gb3JkZXIgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSxcbiAgICAgKiBzdGFydGluZyB3aXRoIHN1cGVyY2xhc3NlcyBhbmQgcHJvZ3Jlc3NpbmcgdG8gdGhlIGluc3RhbmNlJ3MgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIHN0YXRpYyBhZGRJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgICAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgICAgICAodGhpcy5faW5pdGlhbGl6ZXJzID8/PSBbXSkucHVzaChpbml0aWFsaXplcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVnaXN0ZXJlZCBwcm9wZXJ0aWVzLlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgLy8gRW5zdXJlIHdlJ3ZlIGNyZWF0ZWQgYWxsIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgICAgICAvLyB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCBpcyBvbmx5IHVuZGVmaW5lZCBhZnRlciBmaW5hbGl6ZSgpIGluXG4gICAgICAgIC8vIFJlYWN0aXZlRWxlbWVudCBpdHNlbGYuIFJlYWN0aXZlRWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXMgaXMgb25seVxuICAgICAgICAvLyBhY2Nlc3NlZCB3aXRoIFJlYWN0aXZlRWxlbWVudCBhcyB0aGUgcmVjZWl2ZXIgd2hlbiBhIHN1YmNsYXNzIG9yIG1peGluXG4gICAgICAgIC8vIGNhbGxzIHN1cGVyLm9ic2VydmVkQXR0cmlidXRlc1xuICAgICAgICByZXR1cm4gKHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwICYmIFsuLi50aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5rZXlzKCldKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHByb3BlcnR5IGFjY2Vzc29yIG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZSBpZiBvbmUgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBhbmQgc3RvcmVzIGEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlXG4gICAgICogZ2l2ZW4gb3B0aW9ucy4gVGhlIHByb3BlcnR5IHNldHRlciBjYWxscyB0aGUgcHJvcGVydHkncyBgaGFzQ2hhbmdlZGBcbiAgICAgKiBwcm9wZXJ0eSBvcHRpb24gb3IgdXNlcyBhIHN0cmljdCBpZGVudGl0eSBjaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3RcbiAgICAgKiB0byByZXF1ZXN0IGFuIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSBwcm9wZXJ0aWVzOyBob3dldmVyLFxuICAgICAqIHdoZW4gZG9pbmcgc28sIGl0J3MgaW1wb3J0YW50IHRvIGNhbGwgYHN1cGVyLmNyZWF0ZVByb3BlcnR5YCB0byBlbnN1cmVcbiAgICAgKiB0aGUgcHJvcGVydHkgaXMgc2V0dXAgY29ycmVjdGx5LiBUaGlzIG1ldGhvZCBjYWxsc1xuICAgICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgIGludGVybmFsbHkgdG8gZ2V0IGEgZGVzY3JpcHRvciB0byBpbnN0YWxsLlxuICAgICAqIFRvIGN1c3RvbWl6ZSB3aGF0IHByb3BlcnRpZXMgZG8gd2hlbiB0aGV5IGFyZSBnZXQgb3Igc2V0LCBvdmVycmlkZVxuICAgICAqIGBnZXRQcm9wZXJ0eURlc2NyaXB0b3JgLiBUbyBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgcHJvcGVydHksXG4gICAgICogaW1wbGVtZW50IGBjcmVhdGVQcm9wZXJ0eWAgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBzdGF0aWMgY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucykge1xuICAgICAqICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywge215T3B0aW9uOiB0cnVlfSk7XG4gICAgICogICBzdXBlci5jcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVByb3BlcnR5KG5hbWUsIG9wdGlvbnMgPSBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbikge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGUgcHJvcGVydHksIGZvcmNlIHRoZSBhdHRyaWJ1dGUgdG8gZmFsc2UuXG4gICAgICAgIGlmIChvcHRpb25zLnN0YXRlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19wcmVwYXJlKCk7XG4gICAgICAgIC8vIFdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyB3cmFwcGluZyBhY2Nlc3NvcnMuXG4gICAgICAgIC8vIEhlbHBzIGNvbnRyb2wgdGhlIGluaXRpYWwgdmFsdWUgY2hhbmdlIGFuZCByZWZsZWN0aW9uIGxvZ2ljLlxuICAgICAgICBpZiAodGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3QuY3JlYXRlKG9wdGlvbnMpO1xuICAgICAgICAgICAgb3B0aW9ucy53cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChuYW1lLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFvcHRpb25zLm5vQWNjZXNzb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IERFVl9NT0RFXG4gICAgICAgICAgICAgICAgPyAvLyBVc2UgU3ltYm9sLmZvciBpbiBkZXYgbW9kZSB0byBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbiBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGRvaW5nIEhNUi5cbiAgICAgICAgICAgICAgICAgICAgU3ltYm9sLmZvcihgJHtTdHJpbmcobmFtZSl9IChAcHJvcGVydHkoKSBjYWNoZSlgKVxuICAgICAgICAgICAgICAgIDogU3ltYm9sKCk7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gYmUgZGVmaW5lZCBvbiB0aGUgZ2l2ZW4gbmFtZWQgcHJvcGVydHkuXG4gICAgICogSWYgbm8gZGVzY3JpcHRvciBpcyByZXR1cm5lZCwgdGhlIHByb3BlcnR5IHdpbGwgbm90IGJlY29tZSBhbiBhY2Nlc3Nvci5cbiAgICAgKiBGb3IgZXhhbXBsZSxcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gICAgICogICBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucykge1xuICAgICAqICAgICBjb25zdCBkZWZhdWx0RGVzY3JpcHRvciA9XG4gICAgICogICAgICAgICBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwga2V5LCBvcHRpb25zKTtcbiAgICAgKiAgICAgY29uc3Qgc2V0dGVyID0gZGVmYXVsdERlc2NyaXB0b3Iuc2V0O1xuICAgICAqICAgICByZXR1cm4ge1xuICAgICAqICAgICAgIGdldDogZGVmYXVsdERlc2NyaXB0b3IuZ2V0LFxuICAgICAqICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAqICAgICAgICAgc2V0dGVyLmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAqICAgICAgICAgLy8gY3VzdG9tIGFjdGlvbi5cbiAgICAgKiAgICAgICB9LFxuICAgICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBnZXQsIHNldCB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMucHJvdG90eXBlLCBuYW1lKSA/PyB7XG4gICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodikge1xuICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IHY7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpZiAoREVWX01PREUgJiYgZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICgndmFsdWUnIGluIChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcy5wcm90b3R5cGUsIG5hbWUpID8/IHt9KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmllbGQgJHtKU09OLnN0cmluZ2lmeShTdHJpbmcobmFtZSkpfSBvbiBgICtcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5uYW1lfSB3YXMgZGVjbGFyZWQgYXMgYSByZWFjdGl2ZSBwcm9wZXJ0eSBgICtcbiAgICAgICAgICAgICAgICAgICAgYGJ1dCBpdCdzIGFjdHVhbGx5IGRlY2xhcmVkIGFzIGEgdmFsdWUgb24gdGhlIHByb3RvdHlwZS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBVc3VhbGx5IHRoaXMgaXMgZHVlIHRvIHVzaW5nIEBwcm9wZXJ0eSBvciBAc3RhdGUgb24gYSBtZXRob2QuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ3JlYWN0aXZlLXByb3BlcnR5LXdpdGhvdXQtZ2V0dGVyJywgYEZpZWxkICR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG5hbWUpKX0gb24gYCArXG4gICAgICAgICAgICAgICAgYCR7dGhpcy5uYW1lfSB3YXMgZGVjbGFyZWQgYXMgYSByZWFjdGl2ZSBwcm9wZXJ0eSBgICtcbiAgICAgICAgICAgICAgICBgYnV0IGl0IGRvZXMgbm90IGhhdmUgYSBnZXR0ZXIuIFRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBhIGAgK1xuICAgICAgICAgICAgICAgIGBmdXR1cmUgdmVyc2lvbiBvZiBMaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZ2V0Py5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIHNldD8uY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICogVGhlc2Ugb3B0aW9ucyBhcmUgZGVmaW5lZCB3aXRoIGEgYFByb3BlcnR5RGVjbGFyYXRpb25gIHZpYSB0aGUgYHByb3BlcnRpZXNgXG4gICAgICogb2JqZWN0IG9yIHRoZSBgQHByb3BlcnR5YCBkZWNvcmF0b3IgYW5kIGFyZSByZWdpc3RlcmVkIGluXG4gICAgICogYGNyZWF0ZVByb3BlcnR5KC4uLilgLlxuICAgICAqXG4gICAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgXCJmaW5hbFwiIGFuZCBub3Qgb3ZlcnJpZGRlbi4gVG9cbiAgICAgKiBjdXN0b21pemUgdGhlIG9wdGlvbnMgZm9yIGEgZ2l2ZW4gcHJvcGVydHksIG92ZXJyaWRlXG4gICAgICoge0BsaW5rY29kZSBjcmVhdGVQcm9wZXJ0eX0uXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBmaW5hbFxuICAgICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5T3B0aW9ucyhuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLmdldChuYW1lKSA/PyBkZWZhdWx0UHJvcGVydHlEZWNsYXJhdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgc3RhdGljIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBjbGFzcyB1c2VkIGluIGJvb2trZWVwaW5nXG4gICAgICogZm9yIGVsZW1lbnQgcHJvcGVydGllcywgaW5pdGlhbGl6ZXJzLCBldGMuXG4gICAgICpcbiAgICAgKiBDYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGJ5IGNvZGUgdGhhdCBuZWVkcyB0byBlbnN1cmUgdGhlc2VcbiAgICAgKiBwcm9wZXJ0aWVzIGV4aXN0IGJlZm9yZSB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGUgc3VwZXJjbGFzcyBpcyBmaW5hbGl6ZWQgc28gdGhhdCBpbmhlcml0ZWRcbiAgICAgKiBwcm9wZXJ0eSBtZXRhZGF0YSBjYW4gYmUgY29waWVkIGRvd24uXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgX19wcmVwYXJlKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIHRoaXMpKSkge1xuICAgICAgICAgICAgLy8gQWxyZWFkeSBwcmVwYXJlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmFsaXplIGFueSBzdXBlcmNsYXNzZXNcbiAgICAgICAgY29uc3Qgc3VwZXJDdG9yID0gZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpO1xuICAgICAgICAvLyBDcmVhdGUgb3duIHNldCBvZiBpbml0aWFsaXplcnMgZm9yIHRoaXMgY2xhc3MgaWYgYW55IGV4aXN0IG9uIHRoZVxuICAgICAgICAvLyBzdXBlcmNsYXNzIGFuZCBjb3B5IHRoZW0gZG93bi4gTm90ZSwgZm9yIGEgc21hbGwgcGVyZiBib29zdCwgYXZvaWRcbiAgICAgICAgLy8gY3JlYXRpbmcgaW5pdGlhbGl6ZXJzIHVubGVzcyBuZWVkZWQuXG4gICAgICAgIGlmIChzdXBlckN0b3IuX2luaXRpYWxpemVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplcnMgPSBbLi4uc3VwZXJDdG9yLl9pbml0aWFsaXplcnNdO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluaXRpYWxpemUgZWxlbWVudFByb3BlcnRpZXMgZnJvbSB0aGUgc3VwZXJjbGFzc1xuICAgICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzID0gbmV3IE1hcChzdXBlckN0b3IuZWxlbWVudFByb3BlcnRpZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyBzZXR0aW5nIHVwIHRoZSBjbGFzcyBzbyB0aGF0IGl0J3MgcmVhZHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAgICAqIGFzIGEgY3VzdG9tIGVsZW1lbnQgYW5kIGluc3RhbnRpYXRlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgUmVhY3RpdmVFbGVtZW50Lm9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIuXG4gICAgICogSWYgeW91IG92ZXJyaWRlIHRoZSBvYnNlcnZlZEF0dHJpYnV0ZXMgZ2V0dGVyLCB5b3UgbXVzdCBlaXRoZXIgY2FsbFxuICAgICAqIHN1cGVyLm9ic2VydmVkQXR0cmlidXRlcyB0byB0cmlnZ2VyIGZpbmFsaXphdGlvbiwgb3IgY2FsbCBmaW5hbGl6ZSgpXG4gICAgICogeW91cnNlbGYuXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIHN0YXRpYyBmaW5hbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZmluYWxpemVkJywgdGhpcykpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgICAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmcm9tIHRoZSBzdGF0aWMgcHJvcGVydGllcyBibG9jazpcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgncHJvcGVydGllcycsIHRoaXMpKSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BlcnRpZXM7XG4gICAgICAgICAgICBjb25zdCBwcm9wS2V5cyA9IFtcbiAgICAgICAgICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BzKSxcbiAgICAgICAgICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocHJvcHMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9wS2V5cykge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydHkocCwgcHJvcHNbcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBwcm9wZXJ0aWVzIGZyb20gc3RhbmRhcmQgZGVjb3JhdG9yIG1ldGFkYXRhOlxuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXNbU3ltYm9sLm1ldGFkYXRhXTtcbiAgICAgICAgaWYgKG1ldGFkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gbGl0UHJvcGVydHlNZXRhZGF0YS5nZXQobWV0YWRhdGEpO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UHJvcGVydGllcy5zZXQocCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgYXR0cmlidXRlLXRvLXByb3BlcnR5IG1hcFxuICAgICAgICB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgdGhpcy5lbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgYXR0ciA9IHRoaXMuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoYXR0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAuc2V0KGF0dHIsIHApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudFN0eWxlcyA9IHRoaXMuZmluYWxpemVTdHlsZXModGhpcy5zdHlsZXMpO1xuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjcmVhdGVQcm9wZXJ0eScpKSB7XG4gICAgICAgICAgICAgICAgaXNzdWVXYXJuaW5nKCduby1vdmVycmlkZS1jcmVhdGUtcHJvcGVydHknLCAnT3ZlcnJpZGluZyBSZWFjdGl2ZUVsZW1lbnQuY3JlYXRlUHJvcGVydHkoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1RoZSBvdmVycmlkZSB3aWxsIG5vdCBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBkZWNvcmF0b3JzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnZ2V0UHJvcGVydHlEZXNjcmlwdG9yJykpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ25vLW92ZXJyaWRlLWdldC1wcm9wZXJ0eS1kZXNjcmlwdG9yJywgJ092ZXJyaWRpbmcgUmVhY3RpdmVFbGVtZW50LmdldFByb3BlcnR5RGVzY3JpcHRvcigpIGlzIGRlcHJlY2F0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVGhlIG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIGRlY29yYXRvcnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUYWtlcyB0aGUgc3R5bGVzIHRoZSB1c2VyIHN1cHBsaWVkIHZpYSB0aGUgYHN0YXRpYyBzdHlsZXNgIHByb3BlcnR5IGFuZFxuICAgICAqIHJldHVybnMgdGhlIGFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC5cbiAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbnRlZ3JhdGUgaW50byBhIHN0eWxlIG1hbmFnZW1lbnQgc3lzdGVtLlxuICAgICAqXG4gICAgICogU3R5bGVzIGFyZSBkZWR1cGxpY2F0ZWQgcHJlc2VydmluZyB0aGUgX2xhc3RfIGluc3RhbmNlIGluIHRoZSBsaXN0LiBUaGlzXG4gICAgICogaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZHVwbGljYXRlZCBzdHlsZXMgdGhhdCBjYW4gb2NjdXJcbiAgICAgKiBlc3BlY2lhbGx5IHdoZW4gY29tcG9zaW5nIHZpYSBzdWJjbGFzc2luZy4gVGhlIGxhc3QgaXRlbSBpcyBrZXB0IHRvIHRyeVxuICAgICAqIHRvIHByZXNlcnZlIHRoZSBjYXNjYWRlIG9yZGVyIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCdzIG1vc3QgaW1wb3J0YW50XG4gICAgICogdGhhdCBsYXN0IGFkZGVkIHN0eWxlcyBvdmVycmlkZSBwcmV2aW91cyBzdHlsZXMuXG4gICAgICpcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZmluYWxpemVTdHlsZXMoc3R5bGVzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRTdHlsZXMgPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkge1xuICAgICAgICAgICAgLy8gRGVkdXBlIHRoZSBmbGF0dGVuZWQgYXJyYXkgaW4gcmV2ZXJzZSBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBpdGVtcy5cbiAgICAgICAgICAgIC8vIENhc3RpbmcgdG8gQXJyYXk8dW5rbm93bj4gd29ya3MgYXJvdW5kIFRTIGVycm9yIHRoYXRcbiAgICAgICAgICAgIC8vIGFwcGVhcnMgdG8gY29tZSBmcm9tIHRyeWluZyB0byBmbGF0dGVuIGEgdHlwZSBDU1NSZXN1bHRBcnJheS5cbiAgICAgICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoc3R5bGVzLmZsYXQoSW5maW5pdHkpLnJldmVyc2UoKSk7XG4gICAgICAgICAgICAvLyBUaGVuIHByZXNlcnZlIG9yaWdpbmFsIG9yZGVyIGJ5IGFkZGluZyB0aGUgc2V0IGl0ZW1zIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2V0KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFN0eWxlcy51bnNoaWZ0KGdldENvbXBhdGlibGVTdHlsZShzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3R5bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnRTdHlsZXMucHVzaChnZXRDb21wYXRpYmxlU3R5bGUoc3R5bGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRTdHlsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgYG5hbWVgLlxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgc3RhdGljIF9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGU7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGUgPT09IGZhbHNlXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiB0eXBlb2YgYXR0cmlidXRlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgOiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9faW5zdGFuY2VQcm9wZXJ0aWVzID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJ1ZSBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgdXBkYXRlIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgYHJlcXVlc3RVcGRhdGUoKWAuXG4gICAgICAgICAqIFNob3VsZCBvbmx5IGJlIHJlYWQuXG4gICAgICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSXMgc2V0IHRvIGB0cnVlYCBhZnRlciB0aGUgZmlyc3QgdXBkYXRlLiBUaGUgZWxlbWVudCBjb2RlIGNhbm5vdCBhc3N1bWVcbiAgICAgICAgICogdGhhdCBgcmVuZGVyUm9vdGAgZXhpc3RzIGJlZm9yZSB0aGUgZWxlbWVudCBgaGFzVXBkYXRlZGAuXG4gICAgICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhc1VwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5hbWUgb2YgY3VycmVudGx5IHJlZmxlY3RpbmcgcHJvcGVydHlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBvbmx5IG92ZXJyaWRlIHBvaW50IGZvciBjdXN0b21pemluZyB3b3JrIGRvbmUgd2hlbiBlbGVtZW50c1xuICAgICAqIGFyZSBjb25zdHJ1Y3RlZC5cbiAgICAgKi9cbiAgICBfX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX191cGRhdGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHRoaXMuZW5hYmxlVXBkYXRpbmcgPSByZXMpKTtcbiAgICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBUaGlzIGVucXVldWVzIGEgbWljcm90YXNrIHRoYXQgbXVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSByZXF1ZXN0VXBkYXRlKClcbiAgICAgICAgdGhpcy5fX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKTtcbiAgICAgICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgICAgIC8vIGB1cGRhdGVDb21wbGV0ZWBcbiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2luaXRpYWxpemVycz8uZm9yRWFjaCgoaSkgPT4gaSh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBlbGVtZW50J3MgcmVhY3RpdmVcbiAgICAgKiB1cGRhdGUgY3ljbGUuIFRoZSBlbGVtZW50IGF1dG9tYXRpY2FsbHkgY2FsbHMgaW50byBhbnkgcmVnaXN0ZXJlZFxuICAgICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB3aGVuIGBhZGRDb250cm9sbGVyKClgIGlzIGNhbGxlZCwgdGhlXG4gICAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgICAqIEBjYXRlZ29yeSBjb250cm9sbGVyc1xuICAgICAqL1xuICAgIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICAodGhpcy5fX2NvbnRyb2xsZXJzID8/PSBuZXcgU2V0KCkpLmFkZChjb250cm9sbGVyKTtcbiAgICAgICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAgICAgLy8gY2FsbCBob3N0Q29ubmVjdGVkLiBOb3RlLCByZS11c2luZyBleGlzdGVuY2Ugb2YgYHJlbmRlclJvb3RgIGhlcmVcbiAgICAgICAgLy8gKHdoaWNoIGlzIHNldCBpbiBjb25uZWN0ZWRDYWxsYmFjaykgdG8gYXZvaWQgdGhlIG5lZWQgdG8gdHJhY2sgYVxuICAgICAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnJlbmRlclJvb3QgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLmhvc3RDb25uZWN0ZWQ/LigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgICAqIEBjYXRlZ29yeSBjb250cm9sbGVyc1xuICAgICAqL1xuICAgIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmRlbGV0ZShjb250cm9sbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgICAqIE90aGVyd2lzZSB0aGVzZSB3b3VsZCBzaGFkb3cgdGhlIGFjY2Vzc29yIGFuZCBicmVhayB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqIFRoZSBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgaW4gYSBNYXAgd2hpY2ggaXMgcGxheWVkIGJhY2sgYWZ0ZXIgdGhlXG4gICAgICogY29uc3RydWN0b3IgcnVucy5cbiAgICAgKi9cbiAgICBfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSB0aGlzLmNvbnN0cnVjdG9yXG4gICAgICAgICAgICAuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdGFuY2VQcm9wZXJ0aWVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9faW5zdGFuY2VQcm9wZXJ0aWVzID0gaW5zdGFuY2VQcm9wZXJ0aWVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAgICogY3JlYXRlcyBhbmQgcmV0dXJucyBhbiBvcGVuIHNoYWRvd1Jvb3QuIEltcGxlbWVudCB0byBjdXN0b21pemUgd2hlcmUgdGhlXG4gICAgICogZWxlbWVudCdzIERPTSBpcyByZW5kZXJlZC4gRm9yIGV4YW1wbGUsIHRvIHJlbmRlciBpbnRvIHRoZSBlbGVtZW50J3NcbiAgICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgICAqXG4gICAgICogQHJldHVybiBSZXR1cm5zIGEgbm9kZSBpbnRvIHdoaWNoIHRvIHJlbmRlci5cbiAgICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAgICovXG4gICAgY3JlYXRlUmVuZGVyUm9vdCgpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyUm9vdCA9IHRoaXMuc2hhZG93Um9vdCA/P1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7XG4gICAgICAgIGFkb3B0U3R5bGVzKHJlbmRlclJvb3QsIHRoaXMuY29uc3RydWN0b3IuZWxlbWVudFN0eWxlcyk7XG4gICAgICAgIHJldHVybiByZW5kZXJSb290O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbiBmaXJzdCBjb25uZWN0aW9uLCBjcmVhdGVzIHRoZSBlbGVtZW50J3MgcmVuZGVyUm9vdCwgc2V0cyB1cFxuICAgICAqIGVsZW1lbnQgc3R5bGluZywgYW5kIGVuYWJsZXMgdXBkYXRpbmcuXG4gICAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgICAqL1xuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAvLyBDcmVhdGUgcmVuZGVyUm9vdCBiZWZvcmUgY29udHJvbGxlcnMgYGhvc3RDb25uZWN0ZWRgXG4gICAgICAgIHRoaXMucmVuZGVyUm9vdCA/Pz1cbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdENvbm5lY3RlZD8uKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaW5hbCBhbmQgbm90IG92ZXJyaWRkZW4uIEl0IGlzXG4gICAgICogb3ZlcnJpZGRlbiBvbiB0aGUgZWxlbWVudCBpbnN0YW5jZSB3aXRoIGEgZnVuY3Rpb24gdGhhdCB0cmlnZ2VycyB0aGUgZmlyc3RcbiAgICAgKiB1cGRhdGUuXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBlbmFibGVVcGRhdGluZyhfcmVxdWVzdGVkVXBkYXRlKSB7IH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgZm9yIGBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpYCBpbiBleHRlbnNpb25zIHdoaWxlXG4gICAgICogcmVzZXJ2aW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBtYWtpbmcgbm9uLWJyZWFraW5nIGZlYXR1cmUgYWRkaXRpb25zXG4gICAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0RGlzY29ubmVjdGVkPy4oKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN5bmNocm9uaXplcyBwcm9wZXJ0eSB2YWx1ZXMgd2hlbiBhdHRyaWJ1dGVzIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAgICogWW91IHNob3VsZCByYXJlbHkgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBjYWxsYmFjay4gSWYgdGhpcyBtZXRob2QgaXNcbiAgICAgKiBvdmVycmlkZGVuLCBgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIF9vbGQsIHZhbHVlKWAgbXVzdCBiZVxuICAgICAqIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIFNlZSBbcmVzcG9uZGluZyB0byBhdHRyaWJ1dGUgY2hhbmdlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYl9jb21wb25lbnRzL1VzaW5nX2N1c3RvbV9lbGVtZW50cyNyZXNwb25kaW5nX3RvX2F0dHJpYnV0ZV9jaGFuZ2VzKVxuICAgICAqIG9uIE1ETiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuXG4gICAgICogQGNhdGVnb3J5IGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBfX3Byb3BlcnR5VG9BdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZWxlbVByb3BlcnRpZXMgPSB0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZWxlbVByb3BlcnRpZXMuZ2V0KG5hbWUpO1xuICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5fX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnJlZmxlY3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IG9wdGlvbnMuY29udmVydGVyPy50b0F0dHJpYnV0ZSAhPT1cbiAgICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMuY29udmVydGVyXG4gICAgICAgICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gY29udmVydGVyLnRvQXR0cmlidXRlKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgaWYgKERFVl9NT0RFICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMoJ21pZ3JhdGlvbicpICYmXG4gICAgICAgICAgICAgICAgYXR0clZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ3VuZGVmaW5lZC1hdHRyaWJ1dGUtdmFsdWUnLCBgVGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgdGhlICR7bmFtZX0gcHJvcGVydHkgaXMgYCArXG4gICAgICAgICAgICAgICAgICAgIGB1bmRlZmluZWQgb24gZWxlbWVudCAke3RoaXMubG9jYWxOYW1lfS4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICAgICBgcmVtb3ZlZCwgYnV0IGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIFxcYFJlYWN0aXZlRWxlbWVudFxcYCwgYCArXG4gICAgICAgICAgICAgICAgICAgIGB0aGUgYXR0cmlidXRlIHdvdWxkIG5vdCBoYXZlIGNoYW5nZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcmFjayBpZiB0aGUgcHJvcGVydHkgaXMgYmVpbmcgcmVmbGVjdGVkIHRvIGF2b2lkXG4gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBhZ2FpbiB2aWEgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuIE5vdGU6XG4gICAgICAgICAgICAvLyAxLiB0aGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBjYWxsYmFjayBpcyBzeW5jaHJvbm91cy5cbiAgICAgICAgICAgIC8vIDIuIHdpbGwgYmVoYXZlIGluY29ycmVjdGx5IGlmIG11bHRpcGxlIGF0dHJpYnV0ZXMgYXJlIGluIHRoZSByZWFjdGlvblxuICAgICAgICAgICAgLy8gc3RhY2sgYXQgdGltZSBvZiBjYWxsaW5nLiBIb3dldmVyLCBzaW5jZSB3ZSBwcm9jZXNzIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIC8vIGluIGB1cGRhdGVgIHRoaXMgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSAob3IgYW4gZXh0cmVtZSBjb3JuZXIgY2FzZVxuICAgICAgICAgICAgLy8gdGhhdCB3ZSdkIGxpa2UgdG8gZGlzY292ZXIpLlxuICAgICAgICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbmFtZTtcbiAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG1hcmsgc3RhdGUgbm90IHJlZmxlY3RpbmdcbiAgICAgICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgY3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIC8vIE5vdGUsIGhpbnQgdGhpcyBhcyBhbiBgQXR0cmlidXRlTWFwYCBzbyBjbG9zdXJlIGNsZWFybHkgdW5kZXJzdGFuZHNcbiAgICAgICAgLy8gdGhlIHR5cGU7IGl0IGhhcyBpc3N1ZXMgd2l0aCB0cmFja2luZyB0eXBlcyB0aHJvdWdoIHN0YXRpY3NcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBjdG9yLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5nZXQobmFtZSk7XG4gICAgICAgIC8vIFVzZSB0cmFja2luZyBpbmZvIHRvIGF2b2lkIHJlZmxlY3RpbmcgYSBwcm9wZXJ0eSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGVcbiAgICAgICAgLy8gaWYgaXQgd2FzIGp1c3Qgc2V0IGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBjaGFuZ2VkLlxuICAgICAgICBpZiAocHJvcE5hbWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ICE9PSBwcm9wTmFtZSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGN0b3IuZ2V0UHJvcGVydHlPcHRpb25zKHByb3BOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IHR5cGVvZiBvcHRpb25zLmNvbnZlcnRlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8geyBmcm9tQXR0cmlidXRlOiBvcHRpb25zLmNvbnZlcnRlciB9XG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmNvbnZlcnRlcj8uZnJvbUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5jb252ZXJ0ZXJcbiAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICAgICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IGNvbnZlcnRlci5mcm9tQXR0cmlidXRlKHZhbHVlLCBvcHRpb25zLnR5cGUpO1xuICAgICAgICAgICAgdGhpc1twcm9wTmFtZV0gPVxuICAgICAgICAgICAgICAgIGNvbnZlcnRlZFZhbHVlID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19kZWZhdWx0VmFsdWVzPy5nZXQocHJvcE5hbWUpID8/XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFZhbHVlO1xuICAgICAgICAgICAgLy8gbWFyayBzdGF0ZSBub3QgcmVmbGVjdGluZ1xuICAgICAgICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdHMgYW4gdXBkYXRlIHdoaWNoIGlzIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkXG4gICAgICogd2hlbiBhbiBlbGVtZW50IHNob3VsZCB1cGRhdGUgYmFzZWQgb24gc29tZSBzdGF0ZSBub3QgdHJpZ2dlcmVkIGJ5IHNldHRpbmdcbiAgICAgKiBhIHJlYWN0aXZlIHByb3BlcnR5LiBJbiB0aGlzIGNhc2UsIHBhc3Mgbm8gYXJndW1lbnRzLiBJdCBzaG91bGQgYWxzbyBiZVxuICAgICAqIGNhbGxlZCB3aGVuIG1hbnVhbGx5IGltcGxlbWVudGluZyBhIHByb3BlcnR5IHNldHRlci4gSW4gdGhpcyBjYXNlLCBwYXNzIHRoZVxuICAgICAqIHByb3BlcnR5IGBuYW1lYCBhbmQgYG9sZFZhbHVlYCB0byBlbnN1cmUgdGhhdCBhbnkgY29uZmlndXJlZCBwcm9wZXJ0eVxuICAgICAqIG9wdGlvbnMgYXJlIGhvbm9yZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gb2xkVmFsdWUgb2xkIHZhbHVlIG9mIHJlcXVlc3RpbmcgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBwcm9wZXJ0eSBvcHRpb25zIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91c2x5XG4gICAgICogICAgIGNvbmZpZ3VyZWQgb3B0aW9uc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgcmVxdWVzdFVwZGF0ZShuYW1lLCBvbGRWYWx1ZSwgb3B0aW9ucykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcHJvcGVydHkga2V5LCBwZXJmb3JtIHByb3BlcnR5IHVwZGF0ZSBzdGVwcy5cbiAgICAgICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKERFVl9NT0RFICYmIG5hbWUgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICAgICAgICAgIGlzc3VlV2FybmluZyhgYCwgYFRoZSByZXF1ZXN0VXBkYXRlKCkgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBhbiBFdmVudCBhcyB0aGUgcHJvcGVydHkgbmFtZS4gVGhpcyBpcyBwcm9iYWJseSBhIG1pc3Rha2UgY2F1c2VkIGJ5IGJpbmRpbmcgdGhpcy5yZXF1ZXN0VXBkYXRlIGFzIGFuIGV2ZW50IGxpc3RlbmVyLiBJbnN0ZWFkIGJpbmQgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBpdCB3aXRoIG5vIGFyZ3VtZW50czogKCkgPT4gdGhpcy5yZXF1ZXN0VXBkYXRlKClgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW25hbWVdO1xuICAgICAgICAgICAgb3B0aW9ucyA/Pz0gY3Rvci5nZXRQcm9wZXJ0eU9wdGlvbnMobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gKG9wdGlvbnMuaGFzQ2hhbmdlZCA/PyBub3RFcXVhbCkobmV3VmFsdWUsIG9sZFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlLCBjaGVjayBhIGNvcm5lciBjYXNlIHRoYXQgY2FuIG9jY3VyIHdoZW5cbiAgICAgICAgICAgICAgICAvLyAxLiB0aGVyZSdzIGEgaW5pdGlhbCB2YWx1ZSB3aGljaCB3YXMgbm90IHJlZmxlY3RlZFxuICAgICAgICAgICAgICAgIC8vIDIuIHRoZSBwcm9wZXJ0eSBpcyBzdWJzZXF1ZW50bHkgc2V0IHRvIHRoaXMgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9wOiB7dXNlRGVmYXVsdDogdHJ1ZSwgcmVmbGVjdDogdHJ1ZX1gXG4gICAgICAgICAgICAgICAgLy8gYW5kIGVsLnByb3AgPSAnZm9vJy4gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZSBpZiB0aGVcbiAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgaXMgbm90IHNldCBiZWNhdXNlIHdlIHdpbGwgbm93IHJlZmxlY3QgdGhlIHByb3BlcnR5IHRvIHRoZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICAgICAgKG9wdGlvbnMudXNlRGVmYXVsdCAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJlZmxlY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgPT09IHRoaXMuX19kZWZhdWx0VmFsdWVzPy5nZXQobmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaGFzQXR0cmlidXRlKGN0b3IuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucykpKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFib3J0IHRoZSByZXF1ZXN0IGlmIHRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNVcGRhdGVQZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5fX3VwZGF0ZVByb21pc2UgPSB0aGlzLl9fZW5xdWV1ZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF8kY2hhbmdlUHJvcGVydHkobmFtZSwgb2xkVmFsdWUsIHsgdXNlRGVmYXVsdCwgcmVmbGVjdCwgd3JhcHBlZCB9LCBpbml0aWFsaXplVmFsdWUpIHtcbiAgICAgICAgLy8gUmVjb3JkIGRlZmF1bHQgdmFsdWUgd2hlbiB1c2VEZWZhdWx0IGlzIHVzZWQuIFRoaXMgYWxsb3dzIHVzIHRvXG4gICAgICAgIC8vIHJlc3RvcmUgdGhpcyB2YWx1ZSB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC5cbiAgICAgICAgaWYgKHVzZURlZmF1bHQgJiYgISh0aGlzLl9fZGVmYXVsdFZhbHVlcyA/Pz0gbmV3IE1hcCgpKS5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX19kZWZhdWx0VmFsdWVzLnNldChuYW1lLCBpbml0aWFsaXplVmFsdWUgPz8gb2xkVmFsdWUgPz8gdGhpc1tuYW1lXSk7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCB3cmFwcGluZyBhbiBhY2Nlc3NvciwgaXQgbXVzdCBiZSBhbiBpbml0aWFsIHNldHRpbmdcbiAgICAgICAgICAgIC8vIGFuZCBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gcmVjb3JkIHRoZSBjaGFuZ2Ugb3IgcmVmbGVjdC5cbiAgICAgICAgICAgIGlmICh3cmFwcGVkICE9PSB0cnVlIHx8IGluaXRpYWxpemVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAgICAgLy8gdnMganVzdCBNYXAuc2V0KClcbiAgICAgICAgaWYgKCF0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAvLyBPbiB0aGUgaW5pdGlhbCBjaGFuZ2UsIHRoZSBvbGQgdmFsdWUgc2hvdWxkIGJlIGB1bmRlZmluZWRgLCBleGNlcHRcbiAgICAgICAgICAgIC8vIHdpdGggYHVzZURlZmF1bHRgXG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCAmJiAhdXNlRGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIG9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLnNldChuYW1lLCBvbGRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRvIHJlZmxlY3RpbmcgcHJvcGVydGllcyBzZXQuXG4gICAgICAgIC8vIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgZXZlcnkgY2hhbmdlIGhhcyBhIGNoYW5jZSB0byBhZGQgdGhlXG4gICAgICAgIC8vIHByb3BlcnR5IHRvIGBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzYC4gVGhpcyBlbnN1cmVzIHNldHRpbmdcbiAgICAgICAgLy8gYXR0cmlidXRlICsgcHJvcGVydHkgcmVmbGVjdHMgY29ycmVjdGx5LlxuICAgICAgICBpZiAocmVmbGVjdCA9PT0gdHJ1ZSAmJiB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAodGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzID8/PSBuZXcgU2V0KCkpLmFkZChuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSBlbGVtZW50IHRvIGFzeW5jaHJvbm91c2x5IHVwZGF0ZS5cbiAgICAgKi9cbiAgICBhc3luYyBfX2VucXVldWVVcGRhdGUoKSB7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAgICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBSZWZpcmUgYW55IHByZXZpb3VzIGVycm9ycyBhc3luYyBzbyB0aGV5IGRvIG5vdCBkaXNydXB0IHRoZSB1cGRhdGVcbiAgICAgICAgICAgIC8vIGN5Y2xlLiBFcnJvcnMgYXJlIHJlZmlyZWQgc28gZGV2ZWxvcGVycyBoYXZlIGEgY2hhbmNlIHRvIG9ic2VydmVcbiAgICAgICAgICAgIC8vIHRoZW0sIGFuZCB0aGlzIGNhbiBiZSBkb25lIGJ5IGltcGxlbWVudGluZ1xuICAgICAgICAgICAgLy8gYHdpbmRvdy5vbnVuaGFuZGxlZHJlamVjdGlvbmAuXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIC8vIElmIGBzY2hlZHVsZVVwZGF0ZWAgcmV0dXJucyBhIFByb21pc2UsIHdlIGF3YWl0IGl0LiBUaGlzIGlzIGRvbmUgdG9cbiAgICAgICAgLy8gZW5hYmxlIGNvb3JkaW5hdGluZyB1cGRhdGVzIHdpdGggYSBzY2hlZHVsZXIuIE5vdGUsIHRoZSByZXN1bHQgaXNcbiAgICAgICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2NoZWR1bGVzIGFuIGVsZW1lbnQgdXBkYXRlLiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNoYW5nZSB0aGVcbiAgICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAgICogcmV0dXJuZWQgUHJvbWlzZSwgYW5kIHlvdSBzaG91bGQgcmVzb2x2ZSB0aGUgUHJvbWlzZSB0byBhbGxvdyB0aGUgdXBkYXRlXG4gICAgICogdG8gcHJvY2VlZC4gSWYgdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgYHN1cGVyLnNjaGVkdWxlVXBkYXRlKClgXG4gICAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBGb3IgaW5zdGFuY2UsIHRvIHNjaGVkdWxlIHVwZGF0ZXMgdG8gb2NjdXIganVzdCBiZWZvcmUgdGhlIG5leHQgZnJhbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIG92ZXJyaWRlIHByb3RlY3RlZCBhc3luYyBzY2hlZHVsZVVwZGF0ZSgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAgICogICBzdXBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHNjaGVkdWxlVXBkYXRlKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcmZvcm1VcGRhdGUoKTtcbiAgICAgICAgaWYgKERFVl9NT0RFICYmXG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmVuYWJsZWRXYXJuaW5ncy5pbmNsdWRlcygnYXN5bmMtcGVyZm9ybS11cGRhdGUnKSAmJlxuICAgICAgICAgICAgdHlwZW9mIHJlc3VsdD8udGhlbiA9PT1cbiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJywgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFuIGVsZW1lbnQgdXBkYXRlLiBOb3RlLCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyB0aGVcbiAgICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogQ2FsbCBgcGVyZm9ybVVwZGF0ZSgpYCB0byBpbW1lZGlhdGVseSBwcm9jZXNzIGEgcGVuZGluZyB1cGRhdGUuIFRoaXMgc2hvdWxkXG4gICAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICAgKiB1cGRhdGUgc3luY2hyb25vdXNseS5cbiAgICAgKlxuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgcGVyZm9ybVVwZGF0ZSgpIHtcbiAgICAgICAgLy8gQWJvcnQgYW55IHVwZGF0ZSBpZiBvbmUgaXMgbm90IHBlbmRpbmcgd2hlbiB0aGlzIGlzIGNhbGxlZC5cbiAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGBwZXJmb3JtVXBkYXRlYCBpcyBjYWxsZWQgZWFybHkgdG8gXCJmbHVzaFwiXG4gICAgICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgICAgIGlmICghdGhpcy5pc1VwZGF0ZVBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50Py4oeyBraW5kOiAndXBkYXRlJyB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgICAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyUm9vdCA/Pz1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICAgICAgICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgICAgICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAgICAgICAgIC8vIHNoYWRvd2VkIGJ5IGNsYXNzIGZpZWxkcy4gSW5zdGFuY2UgZmllbGRzIHNldCBiZWZvcmUgdXBncmFkZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkIGJ5IHRoaXMgcG9pbnQsIHNvIGFueSBvd24gcHJvcGVydHkgaXMgY2F1c2VkIGJ5IGNsYXNzIGZpZWxkXG4gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICAgICAgICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYWRvd2VkUHJvcGVydGllcyA9IFsuLi5jdG9yLmVsZW1lbnRQcm9wZXJ0aWVzLmtleXMoKV0uZmlsdGVyKChwKSA9PiB0aGlzLmhhc093blByb3BlcnR5KHApICYmIHAgaW4gZ2V0UHJvdG90eXBlT2YodGhpcykpO1xuICAgICAgICAgICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9uIGVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gd2lsbCBub3QgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZpZWxkczogJHtzaGFkb3dlZFByb3BlcnRpZXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYE5hdGl2ZSBjbGFzcyBmaWVsZHMgYW5kIHNvbWUgY29tcGlsZWQgb3V0cHV0IHdpbGwgb3ZlcndyaXRlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGh0dHBzOi8vbGl0LmRldi9tc2cvY2xhc3MtZmllbGQtc2hhZG93aW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYGZvciBtb3JlIGluZm9ybWF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1peGluIGluc3RhbmNlIHByb3BlcnRpZXMgb25jZSwgaWYgdGhleSBleGlzdC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2VQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGJlZW4gc2V0IHNpbmNlIHdlIHN0b3JlZCB0aGUgb3duIHByb3BlcnR5IHZhbHVlP1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3AsIHZhbHVlXSBvZiB0aGlzLl9faW5zdGFuY2VQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fX2luc3RhbmNlUHJvcGVydGllcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRyaWdnZXIgaW5pdGlhbCB2YWx1ZSByZWZsZWN0aW9uIGFuZCBwb3B1bGF0ZSB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgLy8gYGNoYW5nZWRQcm9wZXJ0aWVzYCBtYXAsIGJ1dCBvbmx5IGZvciB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIGNyZWF0ZWRcbiAgICAgICAgICAgIC8vIHZpYSBgY3JlYXRlUHJvcGVydHlgIG9uIGFjY2Vzc29ycywgd2hpY2ggd2lsbCBub3QgaGF2ZSBhbHJlYWR5XG4gICAgICAgICAgICAvLyBwb3B1bGF0ZWQgdGhlIGBjaGFuZ2VkUHJvcGVydGllc2AgbWFwIHNpbmNlIHRoZXkgYXJlIG5vdCBzZXQuXG4gICAgICAgICAgICAvLyBXZSBjYW4ndCBrbm93IGlmIHRoZXNlIGFjY2Vzc29ycyBoYWQgaW5pdGlhbGl6ZXJzLCBzbyB3ZSBqdXN0IHNldFxuICAgICAgICAgICAgLy8gdGhlbSBhbnl3YXkgLSBhIGRpZmZlcmVuY2UgZnJvbSBleHBlcmltZW50YWwgZGVjb3JhdG9ycyBvbiBmaWVsZHMgYW5kXG4gICAgICAgICAgICAvLyBzdGFuZGFyZCBkZWNvcmF0b3JzIG9uIGF1dG8tYWNjZXNzb3JzLlxuICAgICAgICAgICAgLy8gRm9yIGNvbnRleHQgc2VlOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpdC9saXQvcHVsbC80MTgzI2lzc3VlY29tbWVudC0xNzExOTU5NjM1XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50UHJvcGVydGllcyA9IHRoaXMuY29uc3RydWN0b3JcbiAgICAgICAgICAgICAgICAuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwLCBvcHRpb25zXSBvZiBlbGVtZW50UHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdyYXBwZWQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXBwZWQgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuaGFzKHApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdW5kZWZpbmVkLCBvcHRpb25zLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjaGFuZ2VkUHJvcGVydGllcyA9IHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IHRoaXMuc2hvdWxkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlPy4oKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgYGZpcnN0VXBkYXRlZGAgYW5kIGB1cGRhdGVkYCBmcm9tIHJ1bm5pbmcgd2hlbiB0aGVyZSdzIGFuXG4gICAgICAgICAgICAvLyB1cGRhdGUgZXhjZXB0aW9uLlxuICAgICAgICAgICAgc2hvdWxkVXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBFbnN1cmUgZWxlbWVudCBjYW4gYWNjZXB0IGFkZGl0aW9uYWwgdXBkYXRlcyBhZnRlciBhbiBleGNlcHRpb24uXG4gICAgICAgICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHVwZGF0ZSBpcyBubyBsb25nZXIgY29uc2lkZXJlZCBwZW5kaW5nIGFuZCBmdXJ0aGVyIHVwZGF0ZXMgYXJlIG5vdyBhbGxvd2VkLlxuICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIGJlZm9yZSBgdXBkYXRlKClgIHRvIGNvbXB1dGUgdmFsdWVzIG5lZWRlZCBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEltcGxlbWVudCBgd2lsbFVwZGF0ZWAgdG8gY29tcHV0ZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBkZXBlbmQgb24gb3RoZXJcbiAgICAgKiBwcm9wZXJ0aWVzIGFuZCBhcmUgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlIHByb2Nlc3MuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIHdpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICAgKiAgIC8vIG9ubHkgbmVlZCB0byBjaGVjayBjaGFuZ2VkIHByb3BlcnRpZXMgZm9yIGFuIGV4cGVuc2l2ZSBjb21wdXRhdGlvbi5cbiAgICAgKiAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2ZpcnN0TmFtZScpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnbGFzdE5hbWUnKSkge1xuICAgICAqICAgICB0aGlzLnNoYSA9IGNvbXB1dGVTSEEoYCR7dGhpcy5maXJzdE5hbWV9ICR7dGhpcy5sYXN0TmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiByZW5kZXIoKSB7XG4gICAgICogICByZXR1cm4gaHRtbGBTSEE6ICR7dGhpcy5zaGF9YDtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHdpbGxVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7IH1cbiAgICAvLyBOb3RlLCB0aGlzIGlzIGFuIG92ZXJyaWRlIHBvaW50IGZvciBwb2x5ZmlsbC1zdXBwb3J0LlxuICAgIC8vIEBpbnRlcm5hbFxuICAgIF8kZGlkVXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0VXBkYXRlZD8uKCkpO1xuICAgICAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5oYXNVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICBpZiAoREVWX01PREUgJiZcbiAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nICYmXG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmVuYWJsZWRXYXJuaW5ncy5pbmNsdWRlcygnY2hhbmdlLWluLXVwZGF0ZScpKSB7XG4gICAgICAgICAgICBpc3N1ZVdhcm5pbmcoJ2NoYW5nZS1pbi11cGRhdGUnLCBgRWxlbWVudCAke3RoaXMubG9jYWxOYW1lfSBzY2hlZHVsZWQgYW4gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICAgIGAoZ2VuZXJhbGx5IGJlY2F1c2UgYSBwcm9wZXJ0eSB3YXMgc2V0KSBgICtcbiAgICAgICAgICAgICAgICBgYWZ0ZXIgYW4gdXBkYXRlIGNvbXBsZXRlZCwgY2F1c2luZyBhIG5ldyB1cGRhdGUgdG8gYmUgc2NoZWR1bGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBpbmVmZmljaWVudCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgdW5sZXNzIHRoZSBuZXh0IHVwZGF0ZSBgICtcbiAgICAgICAgICAgICAgICBgY2FuIG9ubHkgYmUgc2NoZWR1bGVkIGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhlIHByZXZpb3VzIHVwZGF0ZS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfX21hcmtVcGRhdGVkKCkge1xuICAgICAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIHVwZGF0aW5nLlxuICAgICAqIFRoZSBQcm9taXNlIHZhbHVlIGlzIGEgYm9vbGVhbiB0aGF0IGlzIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBjb21wbGV0ZWQgdGhlXG4gICAgICogdXBkYXRlIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS4gVGhlIFByb21pc2UgcmVzdWx0IGlzIGBmYWxzZWAgaWZcbiAgICAgKiBhIHByb3BlcnR5IHdhcyBzZXQgaW5zaWRlIGB1cGRhdGVkKClgLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgYW5cbiAgICAgKiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIFRvIGF3YWl0IGFkZGl0aW9uYWwgYXN5bmNocm9ub3VzIHdvcmssIG92ZXJyaWRlIHRoZSBgZ2V0VXBkYXRlQ29tcGxldGVgXG4gICAgICogbWV0aG9kLiBGb3IgZXhhbXBsZSwgaXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBhd2FpdCBhIHJlbmRlcmVkIGVsZW1lbnRcbiAgICAgKiBiZWZvcmUgZnVsZmlsbGluZyB0aGlzIFByb21pc2UuIFRvIGRvIHRoaXMsIGZpcnN0IGF3YWl0XG4gICAgICogYHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKClgLCB0aGVuIGFueSBzdWJzZXF1ZW50IHN0YXRlLlxuICAgICAqXG4gICAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgICAqICAgICB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBnZXQgdXBkYXRlQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciB0aGUgYHVwZGF0ZUNvbXBsZXRlYCBwcm9taXNlLlxuICAgICAqXG4gICAgICogSXQgaXMgbm90IHNhZmUgdG8gb3ZlcnJpZGUgdGhlIGB1cGRhdGVDb21wbGV0ZWAgZ2V0dGVyIGRpcmVjdGx5IGR1ZSB0byBhXG4gICAgICogbGltaXRhdGlvbiBpbiBUeXBlU2NyaXB0IHdoaWNoIG1lYW5zIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxsIGFcbiAgICAgKiBzdXBlcmNsYXNzIGdldHRlciAoZS5nLiBgc3VwZXIudXBkYXRlQ29tcGxldGUudGhlbiguLi4pYCkgd2hlbiB0aGUgdGFyZ2V0XG4gICAgICogbGFuZ3VhZ2UgaXMgRVM1IChodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMzOCkuXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICAgICAqICAgb3ZlcnJpZGUgYXN5bmMgZ2V0VXBkYXRlQ29tcGxldGUoKSB7XG4gICAgICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgICogICAgIGF3YWl0IHRoaXMuX215Q2hpbGQudXBkYXRlQ29tcGxldGU7XG4gICAgICogICAgIHJldHVybiByZXN1bHQ7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybiBBIHByb21pc2Ugb2YgYSBib29sZWFuIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgdXBkYXRlIGNvbXBsZXRlZFxuICAgICAqICAgICB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCBgdXBkYXRlKClgIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCByZXF1ZXN0c1xuICAgICAqIGFuIHVwZGF0ZS4gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgYHRydWVgLCBidXQgdGhpcyBjYW4gYmVcbiAgICAgKiBjdXN0b21pemVkIHRvIGNvbnRyb2wgd2hlbiB0byB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBzaG91bGRVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBlbGVtZW50LiBUaGlzIG1ldGhvZCByZWZsZWN0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gYXR0cmlidXRlcy5cbiAgICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiB0byByZW5kZXIgYW5kIGtlZXAgdXBkYXRlZCBlbGVtZW50IERPTS5cbiAgICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgICAqIGFub3RoZXIgdXBkYXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAgICovXG4gICAgdXBkYXRlKF9jaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICAvLyBUaGUgZm9yRWFjaCgpIGV4cHJlc3Npb24gd2lsbCBvbmx5IHJ1biB3aGVuIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgaXNcbiAgICAgICAgLy8gZGVmaW5lZCwgYW5kIGl0IHJldHVybnMgdW5kZWZpbmVkLCBzZXR0aW5nIF9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgdG9cbiAgICAgICAgLy8gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydGllcyAmJj0gdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLmZvckVhY2goKHApID0+IHRoaXMuX19wcm9wZXJ0eVRvQXR0cmlidXRlKHAsIHRoaXNbcF0pKTtcbiAgICAgICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbmV2ZXIgdGhlIGVsZW1lbnQgaXMgdXBkYXRlZC4gSW1wbGVtZW50IHRvIHBlcmZvcm1cbiAgICAgKiBwb3N0LXVwZGF0aW5nIHRhc2tzIHZpYSBET00gQVBJcywgZm9yIGV4YW1wbGUsIGZvY3VzaW5nIGFuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZWxlbWVudCB0byB1cGRhdGVcbiAgICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICB1cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcykgeyB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGZpcnN0IHVwZGF0ZWQuIEltcGxlbWVudCB0byBwZXJmb3JtIG9uZSB0aW1lXG4gICAgICogd29yayBvbiB0aGUgZWxlbWVudCBhZnRlciB1cGRhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGZpcnN0VXBkYXRlZCgpIHtcbiAgICAgKiAgIHRoaXMucmVuZGVyUm9vdC5nZXRFbGVtZW50QnlJZCgnbXktdGV4dC1hcmVhJykuZm9jdXMoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZWxlbWVudCB0byB1cGRhdGVcbiAgICAgKiBhZ2FpbiBhZnRlciB0aGlzIHVwZGF0ZSBjeWNsZSBjb21wbGV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICAgKi9cbiAgICBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKSB7IH1cbn1cbi8qKlxuICogTWVtb2l6ZWQgbGlzdCBvZiBhbGwgZWxlbWVudCBzdHlsZXMuXG4gKiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZSBjbGFzcy5cbiAqIEBub2NvbGxhcHNlXG4gKiBAY2F0ZWdvcnkgc3R5bGVzXG4gKi9cblJlYWN0aXZlRWxlbWVudC5lbGVtZW50U3R5bGVzID0gW107XG4vKipcbiAqIE9wdGlvbnMgdXNlZCB3aGVuIGNhbGxpbmcgYGF0dGFjaFNoYWRvd2AuIFNldCB0aGlzIHByb3BlcnR5IHRvIGN1c3RvbWl6ZVxuICogdGhlIG9wdGlvbnMgZm9yIHRoZSBzaGFkb3dSb290OyBmb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgY2xvc2VkXG4gKiBzaGFkb3dSb290OiBge21vZGU6ICdjbG9zZWQnfWAuXG4gKlxuICogTm90ZSwgdGhlc2Ugb3B0aW9ucyBhcmUgdXNlZCBpbiBgY3JlYXRlUmVuZGVyUm9vdGAuIElmIHRoaXMgbWV0aG9kXG4gKiBpcyBjdXN0b21pemVkLCBvcHRpb25zIHNob3VsZCBiZSByZXNwZWN0ZWQgaWYgcG9zc2libGUuXG4gKiBAbm9jb2xsYXBzZVxuICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICovXG5SZWFjdGl2ZUVsZW1lbnQuc2hhZG93Um9vdE9wdGlvbnMgPSB7IG1vZGU6ICdvcGVuJyB9O1xuLy8gQXNzaWduZWQgaGVyZSB0byB3b3JrIGFyb3VuZCBhIGpzY29tcGlsZXIgYnVnIHdpdGggc3RhdGljIGZpZWxkc1xuLy8gd2hlbiBjb21waWxpbmcgdG8gRVM1LlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMTc3XG5SZWFjdGl2ZUVsZW1lbnRbSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZWxlbWVudFByb3BlcnRpZXMnLCBSZWFjdGl2ZUVsZW1lbnQpXSA9IG5ldyBNYXAoKTtcblJlYWN0aXZlRWxlbWVudFtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBSZWFjdGl2ZUVsZW1lbnQpXSA9IG5ldyBNYXAoKTtcbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbnBvbHlmaWxsU3VwcG9ydD8uKHsgUmVhY3RpdmVFbGVtZW50IH0pO1xuLy8gRGV2IG1vZGUgd2FybmluZ3MuLi5cbmlmIChERVZfTU9ERSkge1xuICAgIC8vIERlZmF1bHQgd2FybmluZyBzZXQuXG4gICAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZWRXYXJuaW5ncyA9IFtcbiAgICAgICAgJ2NoYW5nZS1pbi11cGRhdGUnLFxuICAgICAgICAnYXN5bmMtcGVyZm9ybS11cGRhdGUnLFxuICAgIF07XG4gICAgY29uc3QgZW5zdXJlT3duV2FybmluZ3MgPSBmdW5jdGlvbiAoY3Rvcikge1xuICAgICAgICBpZiAoIWN0b3IuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZW5hYmxlZFdhcm5pbmdzJywgY3RvcikpKSB7XG4gICAgICAgICAgICBjdG9yLmVuYWJsZWRXYXJuaW5ncyA9IGN0b3IuZW5hYmxlZFdhcm5pbmdzLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aXZlRWxlbWVudC5lbmFibGVXYXJuaW5nID0gZnVuY3Rpb24gKHdhcm5pbmcpIHtcbiAgICAgICAgZW5zdXJlT3duV2FybmluZ3ModGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkV2FybmluZ3MuaW5jbHVkZXMod2FybmluZykpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZFdhcm5pbmdzLnB1c2god2FybmluZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0aXZlRWxlbWVudC5kaXNhYmxlV2FybmluZyA9IGZ1bmN0aW9uICh3YXJuaW5nKSB7XG4gICAgICAgIGVuc3VyZU93bldhcm5pbmdzKHRoaXMpO1xuICAgICAgICBjb25zdCBpID0gdGhpcy5lbmFibGVkV2FybmluZ3MuaW5kZXhPZih3YXJuaW5nKTtcbiAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVkV2FybmluZ3Muc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgUmVhY3RpdmVFbGVtZW50IHVzYWdlLlxuKGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzIuMS4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zLmxlbmd0aCA+IDEpIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIGlzc3VlV2FybmluZygnbXVsdGlwbGUtdmVyc2lvbnMnLCBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgICAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdGl2ZS1lbGVtZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuLyoqXG4gKiBUaGUgbWFpbiBMaXRFbGVtZW50IG1vZHVsZSwgd2hpY2ggZGVmaW5lcyB0aGUge0BsaW5rY29kZSBMaXRFbGVtZW50fSBiYXNlXG4gKiBjbGFzcyBhbmQgcmVsYXRlZCBBUElzLlxuICpcbiAqIExpdEVsZW1lbnQgY29tcG9uZW50cyBjYW4gZGVmaW5lIGEgdGVtcGxhdGUgYW5kIGEgc2V0IG9mIG9ic2VydmVkXG4gKiBwcm9wZXJ0aWVzLiBDaGFuZ2luZyBhbiBvYnNlcnZlZCBwcm9wZXJ0eSB0cmlnZ2VycyBhIHJlLXJlbmRlciBvZiB0aGVcbiAqIGVsZW1lbnQuXG4gKlxuICogSW1wb3J0IHtAbGlua2NvZGUgTGl0RWxlbWVudH0gYW5kIHtAbGlua2NvZGUgaHRtbH0gZnJvbSB0aGlzIG1vZHVsZSB0b1xuICogY3JlYXRlIGEgY29tcG9uZW50OlxuICpcbiAqICBgYGBqc1xuICogaW1wb3J0IHtMaXRFbGVtZW50LCBodG1sfSBmcm9tICdsaXQtZWxlbWVudCc7XG4gKlxuICogY2xhc3MgTXlFbGVtZW50IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gKlxuICogICAvLyBEZWNsYXJlIG9ic2VydmVkIHByb3BlcnRpZXNcbiAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICBhZGplY3RpdmU6IHt9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICB0aGlzLmFkamVjdGl2ZSA9ICdhd2Vzb21lJztcbiAqICAgfVxuICpcbiAqICAgLy8gRGVmaW5lIHRoZSBlbGVtZW50J3MgdGVtcGxhdGVcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiBodG1sYDxwPnlvdXIgJHthZGplY3RpdmV9IHRlbXBsYXRlIGhlcmU8L3A+YDtcbiAqICAgfVxuICogfVxuICpcbiAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgnbXktZWxlbWVudCcsIE15RWxlbWVudCk7XG4gKiBgYGBcbiAqXG4gKiBgTGl0RWxlbWVudGAgZXh0ZW5kcyB7QGxpbmtjb2RlIFJlYWN0aXZlRWxlbWVudH0gYW5kIGFkZHMgbGl0LWh0bWxcbiAqIHRlbXBsYXRpbmcuIFRoZSBgUmVhY3RpdmVFbGVtZW50YCBjbGFzcyBpcyBwcm92aWRlZCBmb3IgdXNlcnMgdGhhdCB3YW50IHRvXG4gKiBidWlsZCB0aGVpciBvd24gY3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlIGxpdC1odG1sLlxuICpcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5pbXBvcnQgeyBSZWFjdGl2ZUVsZW1lbnQgfSBmcm9tICdAbGl0L3JlYWN0aXZlLWVsZW1lbnQnO1xuaW1wb3J0IHsgcmVuZGVyLCBub0NoYW5nZSB9IGZyb20gJ2xpdC1odG1sJztcbmV4cG9ydCAqIGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5leHBvcnQgKiBmcm9tICdsaXQtaHRtbCc7XG4vKlxuICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzXG4gKiByZXBsYWNlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIG11bmdlZCBuYW1lIGZvciBvYmplY3RbcHJvcGVydHldLiBXZSBjYW5ub3RcbiAqIGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZVxuICogYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLlxuICovXG4vKkBfX0lOTElORV9fKi9cbmNvbnN0IEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSAocHJvcCwgX29iaikgPT4gcHJvcDtcbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbi8vIEFsbG93cyBtaW5pZmllcnMgdG8gcmVuYW1lIHJlZmVyZW5jZXMgdG8gZ2xvYmFsVGhpc1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcbmxldCBpc3N1ZVdhcm5pbmc7XG5pZiAoREVWX01PREUpIHtcbiAgICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAgIC8vIGFyZSBsb2FkZWQuXG4gICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAgICogV2FybmluZ3MgYXJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgb25seSBieSBgd2FybmluZ2A7IGRpc2FibGluZyB2aWEgYGNvZGVgXG4gICAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAgICovXG4gICAgaXNzdWVXYXJuaW5nID0gKGNvZGUsIHdhcm5pbmcpID0+IHtcbiAgICAgICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICAgICAgaWYgKCFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MuaGFzKHdhcm5pbmcpICYmXG4gICAgICAgICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmhhcyhjb2RlKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzLmFkZCh3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIEJhc2UgZWxlbWVudCBjbGFzcyB0aGF0IG1hbmFnZXMgZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLCBhbmRcbiAqIHJlbmRlcnMgYSBsaXQtaHRtbCB0ZW1wbGF0ZS5cbiAqXG4gKiBUbyBkZWZpbmUgYSBjb21wb25lbnQsIHN1YmNsYXNzIGBMaXRFbGVtZW50YCBhbmQgaW1wbGVtZW50IGFcbiAqIGByZW5kZXJgIG1ldGhvZCB0byBwcm92aWRlIHRoZSBjb21wb25lbnQncyB0ZW1wbGF0ZS4gRGVmaW5lIHByb3BlcnRpZXNcbiAqIHVzaW5nIHRoZSB7QGxpbmtjb2RlIExpdEVsZW1lbnQucHJvcGVydGllcyBwcm9wZXJ0aWVzfSBwcm9wZXJ0eSBvciB0aGVcbiAqIHtAbGlua2NvZGUgcHJvcGVydHl9IGRlY29yYXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIExpdEVsZW1lbnQgZXh0ZW5kcyBSZWFjdGl2ZUVsZW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGNhdGVnb3J5IHJlbmRlcmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZW5kZXJPcHRpb25zID0geyBob3N0OiB0aGlzIH07XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICAgKi9cbiAgICBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgICAgICBjb25zdCByZW5kZXJSb290ID0gc3VwZXIuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgICAvLyBXaGVuIGFkb3B0ZWRTdHlsZVNoZWV0cyBhcmUgc2hpbW1lZCwgdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAgICAgLy8gYW55IHN0eWxlcyBpbiBMaXQgY29udGVudCByZW5kZXIgYmVmb3JlIGFkb3B0ZWRTdHlsZVNoZWV0cy4gVGhpcyBpc1xuICAgICAgICAvLyBpbXBvcnRhbnQgc28gdGhhdCBhZG9wdGVkU3R5bGVTaGVldHMgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgc3R5bGVzIGluXG4gICAgICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgICAgICB0aGlzLnJlbmRlck9wdGlvbnMucmVuZGVyQmVmb3JlID8/PSByZW5kZXJSb290LmZpcnN0Q2hpbGQ7XG4gICAgICAgIHJldHVybiByZW5kZXJSb290O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBlbGVtZW50LiBUaGlzIG1ldGhvZCByZWZsZWN0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gYXR0cmlidXRlc1xuICAgICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlciBhbm90aGVyIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgICAqL1xuICAgIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgICAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAgICAgLy8gdXBkYXRlcyBhcmUgYWxsb3dlZCBhZnRlciBzdXBlci51cGRhdGUsIGl0J3MgaW1wb3J0YW50IHRvIGNhbGwgYHJlbmRlcmBcbiAgICAgICAgLy8gYmVmb3JlIHRoYXQuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyT3B0aW9ucy5pc0Nvbm5lY3RlZCA9IHRoaXMuaXNDb25uZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5fX2NoaWxkUGFydCA9IHJlbmRlcih2YWx1ZSwgdGhpcy5yZW5kZXJSb290LCB0aGlzLnJlbmRlck9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhZGRlZCB0byB0aGUgZG9jdW1lbnQncyBET00uXG4gICAgICpcbiAgICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICAgKiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIGRvY3VtZW50LiBUaGUgbW9zdCBjb21tb24gb2YgdGhlc2UgaXNcbiAgICAgKiBhZGRpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIG5vZGVzIGV4dGVybmFsIHRvIHRoZSBlbGVtZW50LCBsaWtlIGEga2V5ZG93blxuICAgICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICogICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAqICAgYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2hhbmRsZUtleWRvd24pO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgICAqIGVsZW1lbnQgaXMgZGlzY29ubmVjdGVkLCBpbiBgZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAuXG4gICAgICpcbiAgICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAgICovXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCdzIERPTS5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgdGhlIG1haW4gc2lnbmFsIHRvIHRoZSBlbGVtZW50IHRoYXQgaXQgbWF5IG5vIGxvbmdlciBiZVxuICAgICAqIHVzZWQuIGBkaXNjb25uZWN0ZWRDYWxsYmFjaygpYCBzaG91bGQgZW5zdXJlIHRoYXQgbm90aGluZyBpcyBob2xkaW5nIGFcbiAgICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAgICogdG8gdGhlIGVsZW1lbnQpLCBzbyB0aGF0IGl0IGlzIGZyZWUgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAqICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW4gZWxlbWVudCBtYXkgYmUgcmUtY29ubmVjdGVkIGFmdGVyIGJlaW5nIGRpc2Nvbm5lY3RlZC5cbiAgICAgKlxuICAgICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICAgKi9cbiAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlZCBvbiBlYWNoIHVwZGF0ZSB0byBwZXJmb3JtIHJlbmRlcmluZyB0YXNrcy4gVGhpcyBtZXRob2QgbWF5IHJldHVyblxuICAgICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgICAqIGBUZW1wbGF0ZVJlc3VsdGAuIFNldHRpbmcgcHJvcGVydGllcyBpbnNpZGUgdGhpcyBtZXRob2Qgd2lsbCAqbm90KiB0cmlnZ2VyXG4gICAgICogdGhlIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICAgKi9cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBub0NoYW5nZTtcbiAgICB9XG59XG4vLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuTGl0RWxlbWVudFsnXyRsaXRFbGVtZW50JCddID0gdHJ1ZTtcbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbkxpdEVsZW1lbnRbSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZmluYWxpemVkJywgTGl0RWxlbWVudCldID0gdHJ1ZTtcbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHsgTGl0RWxlbWVudCB9KTtcbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gICAgPyBnbG9iYWwubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgICA6IGdsb2JhbC5saXRFbGVtZW50UG9seWZpbGxTdXBwb3J0O1xucG9seWZpbGxTdXBwb3J0Py4oeyBMaXRFbGVtZW50IH0pO1xuLyoqXG4gKiBFTkQgVVNFUlMgU0hPVUxEIE5PVCBSRUxZIE9OIFRISVMgT0JKRUNULlxuICpcbiAqIFByaXZhdGUgZXhwb3J0cyBmb3IgdXNlIGJ5IG90aGVyIExpdCBwYWNrYWdlcywgbm90IGludGVuZGVkIGZvciB1c2UgYnlcbiAqIGV4dGVybmFsIHVzZXJzLlxuICpcbiAqIFdlIGN1cnJlbnRseSBkbyBub3QgbWFrZSBhIG1hbmdsZWQgcm9sbHVwIGJ1aWxkIG9mIHRoZSBsaXQtc3NyIGNvZGUuIEluIG9yZGVyXG4gKiB0byBrZWVwIGEgbnVtYmVyIG9mIChvdGhlcndpc2UgcHJpdmF0ZSkgdG9wLWxldmVsIGV4cG9ydHMgIG1hbmdsZWQgaW4gdGhlXG4gKiBjbGllbnQgc2lkZSBjb2RlLCB3ZSBleHBvcnQgYSBfJExFIG9iamVjdCBjb250YWluaW5nIHRob3NlIG1lbWJlcnMgKG9yXG4gKiBoZWxwZXIgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgZmllbGRzIG9mIHRob3NlIG1lbWJlcnMpLCBhbmQgdGhlblxuICogcmUtZXhwb3J0IHRoZW0gZm9yIHVzZSBpbiBsaXQtc3NyLiBUaGlzIGtlZXBzIGxpdC1zc3IgYWdub3N0aWMgdG8gd2hldGhlciB0aGVcbiAqIGNsaWVudC1zaWRlIGNvZGUgaXMgYmVpbmcgdXNlZCBpbiBgZGV2YCBtb2RlIG9yIGBwcm9kYCBtb2RlLlxuICpcbiAqIFRoaXMgaGFzIGEgdW5pcXVlIG5hbWUsIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHByaXZhdGUgZXhwb3J0cyBpblxuICogbGl0LWh0bWwsIHNpbmNlIHRoaXMgbW9kdWxlIHJlLWV4cG9ydHMgYWxsIG9mIGxpdC1odG1sLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfJExFID0ge1xuICAgIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKGVsLCBuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgZWwuXyRhdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIF8kY2hhbmdlZFByb3BlcnRpZXM6IChlbCkgPT4gZWwuXyRjaGFuZ2VkUHJvcGVydGllcyxcbn07XG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIExpdEVsZW1lbnQgdXNhZ2UuXG4oZ2xvYmFsLmxpdEVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzQuMi4xJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLmxpdEVsZW1lbnRWZXJzaW9ucy5sZW5ndGggPiAxKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoJ211bHRpcGxlLXZlcnNpb25zJywgYE11bHRpcGxlIHZlcnNpb25zIG9mIExpdCBsb2FkZWQuIExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgYCArXG4gICAgICAgICAgICBgaXMgbm90IHJlY29tbWVuZGVkLmApO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGl0LWVsZW1lbnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyBfJExILCB9IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuY29uc3QgeyBfQ2hpbGRQYXJ0OiBDaGlsZFBhcnQgfSA9IF8kTEg7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCB3cmFwID0gRU5BQkxFX1NIQURZRE9NX05PUEFUQ0ggJiZcbiAgICB3aW5kb3cuU2hhZHlET00/LmluVXNlICYmXG4gICAgd2luZG93LlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyB3aW5kb3cuU2hhZHlET00ud3JhcFxuICAgIDogKG5vZGUpID0+IG5vZGU7XG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBwcmltaXRpdmUgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGVvZi1vcGVyYXRvclxuICovXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9ICdmdW5jdGlvbicpO1xuZXhwb3J0IGNvbnN0IFRlbXBsYXRlUmVzdWx0VHlwZSA9IHtcbiAgICBIVE1MOiAxLFxuICAgIFNWRzogMixcbiAgICBNQVRITUw6IDMsXG59O1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgVGVtcGxhdGVSZXN1bHQgb3IgYSBDb21waWxlZFRlbXBsYXRlUmVzdWx0LlxuICovXG5leHBvcnQgY29uc3QgaXNUZW1wbGF0ZVJlc3VsdCA9ICh2YWx1ZSwgdHlwZSkgPT4gdHlwZSA9PT0gdW5kZWZpbmVkXG4gICAgPyAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgICB2YWx1ZT8uWydfJGxpdFR5cGUkJ10gIT09IHVuZGVmaW5lZFxuICAgIDogdmFsdWU/LlsnXyRsaXRUeXBlJCddID09PSB0eXBlO1xuLyoqXG4gKiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdCA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZT8uWydfJGxpdFR5cGUkJ10/LmggIT0gbnVsbDtcbn07XG4vKipcbiAqIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBEaXJlY3RpdmVSZXN1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0RpcmVjdGl2ZVJlc3VsdCA9ICh2YWx1ZSkgPT4gXG4vLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxudmFsdWU/LlsnXyRsaXREaXJlY3RpdmUkJ10gIT09IHVuZGVmaW5lZDtcbi8qKlxuICogUmV0cmlldmVzIHRoZSBEaXJlY3RpdmUgY2xhc3MgZm9yIGEgRGlyZWN0aXZlUmVzdWx0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXREaXJlY3RpdmVDbGFzcyA9ICh2YWx1ZSkgPT4gXG4vLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxudmFsdWU/LlsnXyRsaXREaXJlY3RpdmUkJ107XG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBwYXJ0IGhhcyBvbmx5IGEgc2luZ2xlLWV4cHJlc3Npb24gd2l0aCBubyBzdHJpbmdzIHRvXG4gKiBpbnRlcnBvbGF0ZSBiZXR3ZWVuLlxuICpcbiAqIE9ubHkgQXR0cmlidXRlUGFydCBhbmQgUHJvcGVydHlQYXJ0IGNhbiBoYXZlIG11bHRpcGxlIGV4cHJlc3Npb25zLlxuICogTXVsdGktZXhwcmVzc2lvbiBwYXJ0cyBoYXZlIGEgYHN0cmluZ3NgIHByb3BlcnR5IGFuZCBzaW5nbGUtZXhwcmVzc2lvblxuICogcGFydHMgZG8gbm90LlxuICovXG5leHBvcnQgY29uc3QgaXNTaW5nbGVFeHByZXNzaW9uID0gKHBhcnQpID0+IHBhcnQuc3RyaW5ncyA9PT0gdW5kZWZpbmVkO1xuY29uc3QgY3JlYXRlTWFya2VyID0gKCkgPT4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnJyk7XG4vKipcbiAqIEluc2VydHMgYSBDaGlsZFBhcnQgaW50byB0aGUgZ2l2ZW4gY29udGFpbmVyIENoaWxkUGFydCdzIERPTSwgZWl0aGVyIGF0IHRoZVxuICogZW5kIG9mIHRoZSBjb250YWluZXIgQ2hpbGRQYXJ0LCBvciBiZWZvcmUgdGhlIG9wdGlvbmFsIGByZWZQYXJ0YC5cbiAqXG4gKiBUaGlzIGRvZXMgbm90IGFkZCB0aGUgcGFydCB0byB0aGUgY29udGFpbmVyUGFydCdzIGNvbW1pdHRlZCB2YWx1ZS4gVGhhdCBtdXN0XG4gKiBiZSBkb25lIGJ5IGNhbGxlcnMuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lclBhcnQgUGFydCB3aXRoaW4gd2hpY2ggdG8gYWRkIHRoZSBuZXcgQ2hpbGRQYXJ0XG4gKiBAcGFyYW0gcmVmUGFydCBQYXJ0IGJlZm9yZSB3aGljaCB0byBhZGQgdGhlIG5ldyBDaGlsZFBhcnQ7IHdoZW4gb21pdHRlZCB0aGVcbiAqICAgICBwYXJ0IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGBjb250YWluZXJQYXJ0YFxuICogQHBhcmFtIHBhcnQgUGFydCB0byBpbnNlcnQsIG9yIHVuZGVmaW5lZCB0byBjcmVhdGUgYSBuZXcgcGFydFxuICovXG5leHBvcnQgY29uc3QgaW5zZXJ0UGFydCA9IChjb250YWluZXJQYXJ0LCByZWZQYXJ0LCBwYXJ0KSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gd3JhcChjb250YWluZXJQYXJ0Ll8kc3RhcnROb2RlKS5wYXJlbnROb2RlO1xuICAgIGNvbnN0IHJlZk5vZGUgPSByZWZQYXJ0ID09PSB1bmRlZmluZWQgPyBjb250YWluZXJQYXJ0Ll8kZW5kTm9kZSA6IHJlZlBhcnQuXyRzdGFydE5vZGU7XG4gICAgaWYgKHBhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzdGFydE5vZGUgPSB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKGNyZWF0ZU1hcmtlcigpLCByZWZOb2RlKTtcbiAgICAgICAgY29uc3QgZW5kTm9kZSA9IHdyYXAoY29udGFpbmVyKS5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIHJlZk5vZGUpO1xuICAgICAgICBwYXJ0ID0gbmV3IENoaWxkUGFydChzdGFydE5vZGUsIGVuZE5vZGUsIGNvbnRhaW5lclBhcnQsIGNvbnRhaW5lclBhcnQub3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBlbmROb2RlID0gd3JhcChwYXJ0Ll8kZW5kTm9kZSkubmV4dFNpYmxpbmc7XG4gICAgICAgIGNvbnN0IG9sZFBhcmVudCA9IHBhcnQuXyRwYXJlbnQ7XG4gICAgICAgIGNvbnN0IHBhcmVudENoYW5nZWQgPSBvbGRQYXJlbnQgIT09IGNvbnRhaW5lclBhcnQ7XG4gICAgICAgIGlmIChwYXJlbnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICBwYXJ0Ll8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXM/Lihjb250YWluZXJQYXJ0KTtcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbHRob3VnaCBgXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlc2AgdXBkYXRlcyB0aGUgcGFydCdzXG4gICAgICAgICAgICAvLyBgXyRwYXJlbnRgIHJlZmVyZW5jZSBhZnRlciB1bmxpbmtpbmcgZnJvbSBpdHMgY3VycmVudCBwYXJlbnQsIHRoYXRcbiAgICAgICAgICAgIC8vIG1ldGhvZCBvbmx5IGV4aXN0cyBpZiBEaXNjb25uZWN0YWJsZXMgYXJlIHByZXNlbnQsIHNvIHdlIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgaXQgaGVyZVxuICAgICAgICAgICAgcGFydC5fJHBhcmVudCA9IGNvbnRhaW5lclBhcnQ7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgXyRpc0Nvbm5lY3RlZCBnZXR0ZXIgaXMgc29tZXdoYXQgY29zdGx5LCBvbmx5XG4gICAgICAgICAgICAvLyByZWFkIGl0IG9uY2Ugd2Uga25vdyB0aGUgc3VidHJlZSBoYXMgZGlyZWN0aXZlcyB0aGF0IG5lZWRcbiAgICAgICAgICAgIC8vIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgICAgICBsZXQgbmV3Q29ubmVjdGlvblN0YXRlO1xuICAgICAgICAgICAgaWYgKHBhcnQuXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgKG5ld0Nvbm5lY3Rpb25TdGF0ZSA9IGNvbnRhaW5lclBhcnQuXyRpc0Nvbm5lY3RlZCkgIT09XG4gICAgICAgICAgICAgICAgICAgIG9sZFBhcmVudC5fJGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcGFydC5fJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkKG5ld0Nvbm5lY3Rpb25TdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZE5vZGUgIT09IHJlZk5vZGUgfHwgcGFyZW50Q2hhbmdlZCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcGFydC5fJHN0YXJ0Tm9kZTtcbiAgICAgICAgICAgIHdoaWxlIChzdGFydCAhPT0gZW5kTm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB3cmFwKHN0YXJ0KS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB3cmFwKGNvbnRhaW5lcikuaW5zZXJ0QmVmb3JlKHN0YXJ0LCByZWZOb2RlKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnQ7XG59O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIFBhcnQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBzZXQvdXBkYXRlIHRoZSB2YWx1ZSBvZiB1c2VyLWNyZWF0ZWRcbiAqIHBhcnRzIChpLmUuIHRob3NlIGNyZWF0ZWQgdXNpbmcgYGluc2VydFBhcnRgKTsgaXQgc2hvdWxkIG5vdCBiZSB1c2VkXG4gKiBieSBkaXJlY3RpdmVzIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIGNvbnRhaW5lciBwYXJ0LiBEaXJlY3RpdmVzXG4gKiBzaG91bGQgcmV0dXJuIGEgdmFsdWUgZnJvbSBgdXBkYXRlYC9gcmVuZGVyYCB0byB1cGRhdGUgdGhlaXIgcGFydCBzdGF0ZS5cbiAqXG4gKiBGb3IgZGlyZWN0aXZlcyB0aGF0IHJlcXVpcmUgc2V0dGluZyB0aGVpciBwYXJ0IHZhbHVlIGFzeW5jaHJvbm91c2x5LCB0aGV5XG4gKiBzaG91bGQgZXh0ZW5kIGBBc3luY0RpcmVjdGl2ZWAgYW5kIGNhbGwgYHRoaXMuc2V0VmFsdWUoKWAuXG4gKlxuICogQHBhcmFtIHBhcnQgUGFydCB0byBzZXRcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXRcbiAqIEBwYXJhbSBpbmRleCBGb3IgYEF0dHJpYnV0ZVBhcnRgcywgdGhlIGluZGV4IHRvIHNldFxuICogQHBhcmFtIGRpcmVjdGl2ZVBhcmVudCBVc2VkIGludGVybmFsbHk7IHNob3VsZCBub3QgYmUgc2V0IGJ5IHVzZXJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENoaWxkUGFydFZhbHVlID0gKHBhcnQsIHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQgPSBwYXJ0KSA9PiB7XG4gICAgcGFydC5fJHNldFZhbHVlKHZhbHVlLCBkaXJlY3RpdmVQYXJlbnQpO1xuICAgIHJldHVybiBwYXJ0O1xufTtcbi8vIEEgc2VudGluZWwgdmFsdWUgdGhhdCBjYW4gbmV2ZXIgYXBwZWFyIGFzIGEgcGFydCB2YWx1ZSBleGNlcHQgd2hlbiBzZXQgYnlcbi8vIGxpdmUoKS4gVXNlZCB0byBmb3JjZSBhIGRpcnR5LWNoZWNrIHRvIGZhaWwgYW5kIGNhdXNlIGEgcmUtcmVuZGVyLlxuY29uc3QgUkVTRVRfVkFMVUUgPSB7fTtcbi8qKlxuICogU2V0cyB0aGUgY29tbWl0dGVkIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0IGRpcmVjdGx5IHdpdGhvdXQgdHJpZ2dlcmluZyB0aGVcbiAqIGNvbW1pdCBzdGFnZSBvZiB0aGUgcGFydC5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSBhIGRpcmVjdGl2ZSBuZWVkcyB0byB1cGRhdGUgdGhlIHBhcnQgc3VjaFxuICogdGhhdCB0aGUgbmV4dCB1cGRhdGUgZGV0ZWN0cyBhIHZhbHVlIGNoYW5nZSBvciBub3QuIFdoZW4gdmFsdWUgaXMgb21pdHRlZCxcbiAqIHRoZSBuZXh0IHVwZGF0ZSB3aWxsIGJlIGd1YXJhbnRlZWQgdG8gYmUgZGV0ZWN0ZWQgYXMgYSBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHBhcnRcbiAqIEBwYXJhbSB2YWx1ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0Q29tbWl0dGVkVmFsdWUgPSAocGFydCwgdmFsdWUgPSBSRVNFVF9WQUxVRSkgPT4gKHBhcnQuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlKTtcbi8qKlxuICogUmV0dXJucyB0aGUgY29tbWl0dGVkIHZhbHVlIG9mIGEgQ2hpbGRQYXJ0LlxuICpcbiAqIFRoZSBjb21taXR0ZWQgdmFsdWUgaXMgdXNlZCBmb3IgY2hhbmdlIGRldGVjdGlvbiBhbmQgZWZmaWNpZW50IHVwZGF0ZXMgb2ZcbiAqIHRoZSBwYXJ0LiBJdCBjYW4gZGlmZmVyIGZyb20gdGhlIHZhbHVlIHNldCBieSB0aGUgdGVtcGxhdGUgb3IgZGlyZWN0aXZlIGluXG4gKiBjYXNlcyB3aGVyZSB0aGUgdGVtcGxhdGUgdmFsdWUgaXMgdHJhbnNmb3JtZWQgYmVmb3JlIGJlaW5nIGNvbW1pdHRlZC5cbiAqXG4gKiAtIGBUZW1wbGF0ZVJlc3VsdGBzIGFyZSBjb21taXR0ZWQgYXMgYSBgVGVtcGxhdGVJbnN0YW5jZWBcbiAqIC0gSXRlcmFibGVzIGFyZSBjb21taXR0ZWQgYXMgYEFycmF5PENoaWxkUGFydD5gXG4gKiAtIEFsbCBvdGhlciB0eXBlcyBhcmUgY29tbWl0dGVkIGFzIHRoZSB0ZW1wbGF0ZSB2YWx1ZSBvciB2YWx1ZSByZXR1cm5lZCBvclxuICogICBzZXQgYnkgYSBkaXJlY3RpdmUuXG4gKlxuICogQHBhcmFtIHBhcnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldENvbW1pdHRlZFZhbHVlID0gKHBhcnQpID0+IHBhcnQuXyRjb21taXR0ZWRWYWx1ZTtcbi8qKlxuICogUmVtb3ZlcyBhIENoaWxkUGFydCBmcm9tIHRoZSBET00sIGluY2x1ZGluZyBhbnkgb2YgaXRzIGNvbnRlbnQgYW5kIG1hcmtlcnMuXG4gKlxuICogTm90ZTogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGNsZWFyUGFydCgpIGlzIHRoYXQgdGhpcyBhbHNvXG4gKiByZW1vdmVzIHRoZSBwYXJ0J3Mgc3RhcnQgbm9kZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBDaGlsZFBhcnQgbXVzdCBvd24gaXRzXG4gKiBzdGFydCBub2RlLCBpZSBpdCBtdXN0IGJlIGEgbWFya2VyIG5vZGUgc3BlY2lmaWNhbGx5IGZvciB0aGlzIHBhcnQgYW5kIG5vdCBhblxuICogYW5jaG9yIGZyb20gc3Vycm91bmRpbmcgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gcGFydCBUaGUgUGFydCB0byByZW1vdmVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZVBhcnQgPSAocGFydCkgPT4ge1xuICAgIHBhcnQuXyRjbGVhcigpO1xuICAgIHBhcnQuXyRzdGFydE5vZGUucmVtb3ZlKCk7XG59O1xuZXhwb3J0IGNvbnN0IGNsZWFyUGFydCA9IChwYXJ0KSA9PiB7XG4gICAgcGFydC5fJGNsZWFyKCk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGlyZWN0aXZlLWhlbHBlcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5pbXBvcnQgeyBpc1NpbmdsZUV4cHJlc3Npb24gfSBmcm9tICcuL2RpcmVjdGl2ZS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IERpcmVjdGl2ZSwgUGFydFR5cGUgfSBmcm9tICcuL2RpcmVjdGl2ZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdGl2ZS5qcyc7XG5jb25zdCBERVZfTU9ERSA9IHRydWU7XG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGtzIGRvd24gdGhlIHRyZWUgb2YgUGFydHMvVGVtcGxhdGVJbnN0YW5jZXMvRGlyZWN0aXZlcyB0byBzZXRcbiAqIHRoZSBjb25uZWN0ZWQgc3RhdGUgb2YgZGlyZWN0aXZlcyBhbmQgcnVuIGBkaXNjb25uZWN0ZWRgLyBgcmVjb25uZWN0ZWRgXG4gKiBjYWxsYmFja3MuXG4gKlxuICogQHJldHVybiBUcnVlIGlmIHRoZXJlIHdlcmUgY2hpbGRyZW4gdG8gZGlzY29ubmVjdDsgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmNvbnN0IG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCA9IChwYXJlbnQsIGlzQ29ubmVjdGVkKSA9PiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnQuXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuO1xuICAgIGlmIChjaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYmogb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgLy8gVGhlIGV4aXN0ZW5jZSBvZiBgXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZGAgaXMgdXNlZCBhcyBhIFwiYnJhbmRcIiB0b1xuICAgICAgICAvLyBkaXNhbWJpZ3VhdGUgQXN5bmNEaXJlY3RpdmVzIGZyb20gb3RoZXIgRGlzY29ubmVjdGFibGVDaGlsZHJlblxuICAgICAgICAvLyAoYXMgb3Bwb3NlZCB0byB1c2luZyBhbiBpbnN0YW5jZW9mIGNoZWNrIHRvIGtub3cgd2hlbiB0byBjYWxsIGl0KTsgdGhlXG4gICAgICAgIC8vIHJlZHVuZGFuY3kgb2YgXCJEaXJlY3RpdmVcIiBpbiB0aGUgQVBJIG5hbWUgaXMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aFxuICAgICAgICAvLyBgXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZGAsIHdoaWNoIGV4aXN0cyBgQ2hpbGRQYXJ0c2Agd2hpY2ggYXJlIGFsc28gaW5cbiAgICAgICAgLy8gdGhpcyBsaXN0XG4gICAgICAgIC8vIERpc2Nvbm5lY3QgRGlyZWN0aXZlIChhbmQgYW55IG5lc3RlZCBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4pXG4gICAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICAgIG9ialsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPy4oaXNDb25uZWN0ZWQsIGZhbHNlKTtcbiAgICAgICAgLy8gRGlzY29ubmVjdCBQYXJ0L1RlbXBsYXRlSW5zdGFuY2VcbiAgICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKG9iaiwgaXNDb25uZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbiAqIFJlbW92ZXMgdGhlIGdpdmVuIGNoaWxkIGZyb20gaXRzIHBhcmVudCBsaXN0IG9mIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuLCBhbmRcbiAqIGlmIHRoZSBwYXJlbnQgbGlzdCBiZWNvbWVzIGVtcHR5IGFzIGEgcmVzdWx0LCByZW1vdmVzIHRoZSBwYXJlbnQgZnJvbSBpdHNcbiAqIHBhcmVudCwgYW5kIHNvIGZvcnRoIHVwIHRoZSB0cmVlIHdoZW4gdGhhdCBjYXVzZXMgc3Vic2VxdWVudCBwYXJlbnQgbGlzdHMgdG9cbiAqIGJlY29tZSBlbXB0eS5cbiAqL1xuY29uc3QgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50ID0gKG9iaikgPT4ge1xuICAgIGxldCBwYXJlbnQsIGNoaWxkcmVuO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKChwYXJlbnQgPSBvYmouXyRwYXJlbnQpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICAgICAgY2hpbGRyZW4uZGVsZXRlKG9iaik7XG4gICAgICAgIG9iaiA9IHBhcmVudDtcbiAgICB9IHdoaWxlIChjaGlsZHJlbj8uc2l6ZSA9PT0gMCk7XG59O1xuY29uc3QgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCA9IChvYmopID0+IHtcbiAgICAvLyBDbGltYiB0aGUgcGFyZW50IHRyZWUsIGNyZWF0aW5nIGEgc3BhcnNlIHRyZWUgb2YgY2hpbGRyZW4gbmVlZGluZ1xuICAgIC8vIGRpc2Nvbm5lY3Rpb25cbiAgICBmb3IgKGxldCBwYXJlbnQ7IChwYXJlbnQgPSBvYmouXyRwYXJlbnQpOyBvYmogPSBwYXJlbnQpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcGFyZW50Ll8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICAgICAgaWYgKGNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcmVudC5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgLy8gT25jZSB3ZSd2ZSByZWFjaGVkIGEgcGFyZW50IHRoYXQgYWxyZWFkeSBjb250YWlucyB0aGlzIGNoaWxkLCB3ZVxuICAgICAgICAgICAgLy8gY2FuIHNob3J0LWNpcmN1aXRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmFkZChvYmopO1xuICAgICAgICBpbnN0YWxsRGlzY29ubmVjdEFQSShwYXJlbnQpO1xuICAgIH1cbn07XG4vKipcbiAqIENoYW5nZXMgdGhlIHBhcmVudCByZWZlcmVuY2Ugb2YgdGhlIENoaWxkUGFydCwgYW5kIHVwZGF0ZXMgdGhlIHNwYXJzZSB0cmVlIG9mXG4gKiBEaXNjb25uZWN0YWJsZSBjaGlsZHJlbiBhY2NvcmRpbmdseS5cbiAqXG4gKiBOb3RlLCB0aGlzIG1ldGhvZCB3aWxsIGJlIHBhdGNoZWQgb250byBDaGlsZFBhcnQgaW5zdGFuY2VzIGFuZCBjYWxsZWQgZnJvbVxuICogdGhlIGNvcmUgY29kZSB3aGVuIHBhcnRzIGFyZSBtb3ZlZCBiZXR3ZWVuIGRpZmZlcmVudCBwYXJlbnRzLlxuICovXG5mdW5jdGlvbiByZXBhcmVudERpc2Nvbm5lY3RhYmxlcyhuZXdQYXJlbnQpIHtcbiAgICBpZiAodGhpcy5fJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodGhpcyk7XG4gICAgICAgIHRoaXMuXyRwYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgICAgIGFkZERpc2Nvbm5lY3RhYmxlVG9QYXJlbnQodGhpcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl8kcGFyZW50ID0gbmV3UGFyZW50O1xuICAgIH1cbn1cbi8qKlxuICogU2V0cyB0aGUgY29ubmVjdGVkIHN0YXRlIG9uIGFueSBkaXJlY3RpdmVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvbW1pdHRlZFxuICogdmFsdWUgb2YgdGhpcyBwYXJ0IChpLmUuIHdpdGhpbiBhIFRlbXBsYXRlSW5zdGFuY2Ugb3IgaXRlcmFibGUgb2ZcbiAqIENoaWxkUGFydHMpIGFuZCBydW5zIHRoZWlyIGBkaXNjb25uZWN0ZWRgL2ByZWNvbm5lY3RlZGBzLCBhcyB3ZWxsIGFzIHdpdGhpblxuICogYW55IGRpcmVjdGl2ZXMgc3RvcmVkIG9uIHRoZSBDaGlsZFBhcnQgKHdoZW4gYHZhbHVlT25seWAgaXMgZmFsc2UpLlxuICpcbiAqIGBpc0NsZWFyaW5nVmFsdWVgIHNob3VsZCBiZSBwYXNzZWQgYXMgYHRydWVgIG9uIGEgdG9wLWxldmVsIHBhcnQgdGhhdCBpc1xuICogY2xlYXJpbmcgaXRzZWxmLCBhbmQgbm90IGFzIGEgcmVzdWx0IG9mIHJlY3Vyc2l2ZWx5IGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlc1xuICogYXMgcGFydCBvZiBhIGBjbGVhcmAgb3BlcmF0aW9uIGhpZ2hlciB1cCB0aGUgdHJlZS4gVGhpcyBib3RoIGVuc3VyZXMgdGhhdCBhbnlcbiAqIGRpcmVjdGl2ZSBvbiB0aGlzIENoaWxkUGFydCB0aGF0IHByb2R1Y2VkIGEgdmFsdWUgdGhhdCBjYXVzZWQgdGhlIGNsZWFyXG4gKiBvcGVyYXRpb24gaXMgbm90IGRpc2Nvbm5lY3RlZCwgYW5kIGFsc28gc2VydmVzIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiB0byBhdm9pZCBuZWVkbGVzcyBib29ra2VlcGluZyB3aGVuIGEgc3VidHJlZSBpcyBnb2luZyBhd2F5OyB3aGVuIGNsZWFyaW5nIGFcbiAqIHN1YnRyZWUsIG9ubHkgdGhlIHRvcC1tb3N0IHBhcnQgbmVlZCB0byByZW1vdmUgaXRzZWxmIGZyb20gdGhlIHBhcmVudC5cbiAqXG4gKiBgZnJvbVBhcnRJbmRleGAgaXMgcGFzc2VkIG9ubHkgaW4gdGhlIGNhc2Ugb2YgYSBwYXJ0aWFsIGBfY2xlYXJgIHJ1bm5pbmcgYXMgYVxuICogcmVzdWx0IG9mIHRydW5jYXRpbmcgYW4gaXRlcmFibGUuXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXRjaGVkIG9udG8gQ2hpbGRQYXJ0IGluc3RhbmNlcyBhbmQgY2FsbGVkIGZyb20gdGhlXG4gKiBjb3JlIGNvZGUgd2hlbiBwYXJ0cyBhcmUgY2xlYXJlZCBvciB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpcyBjaGFuZ2VkIGJ5IHRoZVxuICogdXNlci5cbiAqL1xuZnVuY3Rpb24gbm90aWZ5Q2hpbGRQYXJ0Q29ubmVjdGVkQ2hhbmdlZChpc0Nvbm5lY3RlZCwgaXNDbGVhcmluZ1ZhbHVlID0gZmFsc2UsIGZyb21QYXJ0SW5kZXggPSAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbjtcbiAgICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBjaGlsZHJlbi5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzQ2xlYXJpbmdWYWx1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhYmxlIGNhc2U6IEFueSBDaGlsZFBhcnRzIGNyZWF0ZWQgYnkgdGhlIGl0ZXJhYmxlIHNob3VsZCBiZVxuICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIGFuZCByZW1vdmVkIGZyb20gdGhpcyBDaGlsZFBhcnQncyBkaXNjb25uZWN0YWJsZVxuICAgICAgICAgICAgLy8gY2hpbGRyZW4gKHN0YXJ0aW5nIGF0IGBmcm9tUGFydEluZGV4YCBpbiB0aGUgY2FzZSBvZiB0cnVuY2F0aW9uKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZyb21QYXJ0SW5kZXg7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZVtpXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJlbW92ZURpc2Nvbm5lY3RhYmxlRnJvbVBhcmVudCh2YWx1ZVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZSBjYXNlOiBJZiB0aGUgdmFsdWUgaGFzIGRpc2Nvbm5lY3RhYmxlIGNoaWxkcmVuICh3aWxsXG4gICAgICAgICAgICAvLyBvbmx5IGJlIGluIHRoZSBjYXNlIHRoYXQgaXQgaXMgYSBUZW1wbGF0ZUluc3RhbmNlKSwgd2UgZGlzY29ubmVjdCBpdFxuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZSBpdCBmcm9tIHRoaXMgQ2hpbGRQYXJ0J3MgZGlzY29ubmVjdGFibGUgY2hpbGRyZW5cbiAgICAgICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh2YWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgcmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbm90aWZ5Q2hpbGRyZW5Db25uZWN0ZWRDaGFuZ2VkKHRoaXMsIGlzQ29ubmVjdGVkKTtcbiAgICB9XG59XG4vKipcbiAqIFBhdGNoZXMgZGlzY29ubmVjdGlvbiBBUEkgb250byBDaGlsZFBhcnRzLlxuICovXG5jb25zdCBpbnN0YWxsRGlzY29ubmVjdEFQSSA9IChvYmopID0+IHtcbiAgICBpZiAob2JqLnR5cGUgPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAgICAgb2JqLl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQgPz89XG4gICAgICAgICAgICBub3RpZnlDaGlsZFBhcnRDb25uZWN0ZWRDaGFuZ2VkO1xuICAgICAgICBvYmouXyRyZXBhcmVudERpc2Nvbm5lY3RhYmxlcyA/Pz0gcmVwYXJlbnREaXNjb25uZWN0YWJsZXM7XG4gICAgfVxufTtcbi8qKlxuICogQW4gYWJzdHJhY3QgYERpcmVjdGl2ZWAgYmFzZSBjbGFzcyB3aG9zZSBgZGlzY29ubmVjdGVkYCBtZXRob2Qgd2lsbCBiZVxuICogY2FsbGVkIHdoZW4gdGhlIHBhcnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIGlzIGNsZWFyZWQgYXMgYSByZXN1bHQgb2ZcbiAqIHJlLXJlbmRlcmluZywgb3Igd2hlbiB0aGUgdXNlciBjYWxscyBgcGFydC5zZXRDb25uZWN0ZWQoZmFsc2UpYCBvblxuICogYSBwYXJ0IHRoYXQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlIChhcyBoYXBwZW5zXG4gKiB3aGVuIGUuZy4gYSBMaXRFbGVtZW50IGRpc2Nvbm5lY3RzIGZyb20gdGhlIERPTSkuXG4gKlxuICogSWYgYHBhcnQuc2V0Q29ubmVjdGVkKHRydWUpYCBpcyBzdWJzZXF1ZW50bHkgY2FsbGVkIG9uIGFcbiAqIGNvbnRhaW5pbmcgcGFydCwgdGhlIGRpcmVjdGl2ZSdzIGByZWNvbm5lY3RlZGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHByaW9yXG4gKiB0byBpdHMgbmV4dCBgdXBkYXRlYC9gcmVuZGVyYCBjYWxsYmFja3MuIFdoZW4gaW1wbGVtZW50aW5nIGBkaXNjb25uZWN0ZWRgLFxuICogYHJlY29ubmVjdGVkYCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggcmVjb25uZWN0aW9uLlxuICpcbiAqIE5vdGUgdGhhdCB1cGRhdGVzIG1heSBvY2N1ciB3aGlsZSB0aGUgZGlyZWN0aXZlIGlzIGRpc2Nvbm5lY3RlZC4gQXMgc3VjaCxcbiAqIGRpcmVjdGl2ZXMgc2hvdWxkIGdlbmVyYWxseSBjaGVjayB0aGUgYHRoaXMuaXNDb25uZWN0ZWRgIGZsYWcgZHVyaW5nXG4gKiByZW5kZXIvdXBkYXRlIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHNhZmUgdG8gc3Vic2NyaWJlIHRvIHJlc291cmNlc1xuICogdGhhdCBtYXkgcHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0RpcmVjdGl2ZSBleHRlbmRzIERpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIEBpbnRlcm5hbFxuICAgICAgICB0aGlzLl8kZGlzY29ubmVjdGFibGVDaGlsZHJlbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgcGFydCB3aXRoIGludGVybmFsIGZpZWxkc1xuICAgICAqIEBwYXJhbSBwYXJ0XG4gICAgICogQHBhcmFtIHBhcmVudFxuICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVJbmRleFxuICAgICAqL1xuICAgIF8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KSB7XG4gICAgICAgIHN1cGVyLl8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KTtcbiAgICAgICAgYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IHBhcnQuXyRpc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgZnJvbSB0aGUgY29yZSBjb2RlIHdoZW4gYSBkaXJlY3RpdmUgaXMgZ29pbmcgYXdheSBmcm9tIGEgcGFydCAoaW5cbiAgICAgKiB3aGljaCBjYXNlIGBzaG91bGRSZW1vdmVGcm9tUGFyZW50YCBzaG91bGQgYmUgdHJ1ZSksIGFuZCBmcm9tIHRoZVxuICAgICAqIGBzZXRDaGlsZHJlbkNvbm5lY3RlZGAgaGVscGVyIGZ1bmN0aW9uIHdoZW4gcmVjdXJzaXZlbHkgY2hhbmdpbmcgdGhlXG4gICAgICogY29ubmVjdGlvbiBzdGF0ZSBvZiBhIHRyZWUgKGluIHdoaWNoIGNhc2UgYHNob3VsZFJlbW92ZUZyb21QYXJlbnRgIHNob3VsZFxuICAgICAqIGJlIGZhbHNlKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc0Nvbm5lY3RlZFxuICAgICAqIEBwYXJhbSBpc0NsZWFyaW5nRGlyZWN0aXZlIC0gVHJ1ZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXRzZWxmIGlzIGJlaW5nXG4gICAgICogICAgIHJlbW92ZWQ7IGZhbHNlIHdoZW4gdGhlIHRyZWUgaXMgYmVpbmcgZGlzY29ubmVjdGVkXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgWydfJG5vdGlmeURpcmVjdGl2ZUNvbm5lY3Rpb25DaGFuZ2VkJ10oaXNDb25uZWN0ZWQsIGlzQ2xlYXJpbmdEaXJlY3RpdmUgPSB0cnVlKSB7XG4gICAgICAgIGlmIChpc0Nvbm5lY3RlZCAhPT0gdGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGlzQ29ubmVjdGVkO1xuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RlZD8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZD8uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ2xlYXJpbmdEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIG5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCh0aGlzLCBpc0Nvbm5lY3RlZCk7XG4gICAgICAgICAgICByZW1vdmVEaXNjb25uZWN0YWJsZUZyb21QYXJlbnQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRpcmVjdGl2ZSdzIFBhcnQgb3V0c2lkZSB0aGUgbm9ybWFsIGB1cGRhdGVgL2ByZW5kZXJgXG4gICAgICogbGlmZWN5Y2xlIG9mIGEgZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIGEgZGlyZWN0aXZlJ3MgYHVwZGF0ZWBcbiAgICAgKiBvciBgcmVuZGVyYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXJlY3RpdmUgVGhlIGRpcmVjdGl2ZSB0byB1cGRhdGVcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldFxuICAgICAqL1xuICAgIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1NpbmdsZUV4cHJlc3Npb24odGhpcy5fX3BhcnQpKSB7XG4gICAgICAgICAgICB0aGlzLl9fcGFydC5fJHNldFZhbHVlKHZhbHVlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoaXMuX19hdHRyaWJ1dGVJbmRleCB3aWxsIGJlIGRlZmluZWQgaW4gdGhpcyBjYXNlLCBidXRcbiAgICAgICAgICAgIC8vIGFzc2VydCBpdCBpbiBkZXYgbW9kZVxuICAgICAgICAgICAgaWYgKERFVl9NT0RFICYmIHRoaXMuX19hdHRyaWJ1dGVJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB0aGlzLl9fYXR0cmlidXRlSW5kZXggdG8gYmUgYSBudW1iZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IFsuLi50aGlzLl9fcGFydC5fJGNvbW1pdHRlZFZhbHVlXTtcbiAgICAgICAgICAgIG5ld1ZhbHVlc1t0aGlzLl9fYXR0cmlidXRlSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9fcGFydC5fJHNldFZhbHVlKG5ld1ZhbHVlcywgdGhpcywgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlciBjYWxsYmFja3MgZm9yIGltcGxlbWVudGluZyBsb2dpYyB0byByZWxlYXNlIGFueSByZXNvdXJjZXMvc3Vic2NyaXB0aW9uc1xuICAgICAqIHRoYXQgbWF5IGhhdmUgYmVlbiByZXRhaW5lZCBieSB0aGlzIGRpcmVjdGl2ZS4gU2luY2UgZGlyZWN0aXZlcyBtYXkgYWxzbyBiZVxuICAgICAqIHJlLWNvbm5lY3RlZCwgYHJlY29ubmVjdGVkYCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCB0byByZXN0b3JlIHRoZVxuICAgICAqIHdvcmtpbmcgc3RhdGUgb2YgdGhlIGRpcmVjdGl2ZSBwcmlvciB0byB0aGUgbmV4dCByZW5kZXIuXG4gICAgICovXG4gICAgZGlzY29ubmVjdGVkKCkgeyB9XG4gICAgcmVjb25uZWN0ZWQoKSB7IH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jLWRpcmVjdGl2ZS5qcy5tYXAiLCJpbXBvcnQgeyBodG1sLCByZW5kZXIgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCBoYXVudGVkIGZyb20gXCIuL2NvcmVcIjtcbmltcG9ydCB7IG1ha2VWaXJ0dWFsIH0gZnJvbSBcIi4vdmlydHVhbFwiO1xuY29uc3QgeyBjb21wb25lbnQsIGNyZWF0ZUNvbnRleHQgfSA9IGhhdW50ZWQoeyByZW5kZXIgfSk7XG5jb25zdCB2aXJ0dWFsID0gbWFrZVZpcnR1YWwoKTtcbmV4cG9ydCB7IGNvbXBvbmVudCwgY3JlYXRlQ29udGV4dCwgdmlydHVhbCwgaHRtbCwgcmVuZGVyIH07XG4iLCJpbXBvcnQgeyBtYWtlQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBtYWtlQ29udGV4dCB9IGZyb20gXCIuL2NyZWF0ZS1jb250ZXh0XCI7XG5mdW5jdGlvbiBoYXVudGVkKHsgcmVuZGVyIH0pIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBtYWtlQ29tcG9uZW50KHJlbmRlcik7XG4gICAgY29uc3QgY3JlYXRlQ29udGV4dCA9IG1ha2VDb250ZXh0KGNvbXBvbmVudCk7XG4gICAgcmV0dXJuIHsgY29tcG9uZW50LCBjcmVhdGVDb250ZXh0IH07XG59XG5leHBvcnQgeyBoYXVudGVkIGFzIGRlZmF1bHQsIH07XG5leHBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gXCIuL3VzZS1jYWxsYmFja1wiO1xuZXhwb3J0IHsgdXNlQ29udHJvbGxlciB9IGZyb20gXCIuL3VzZS1jb250cm9sbGVyXCI7XG5leHBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tIFwiLi91c2UtZWZmZWN0XCI7XG5leHBvcnQgeyB1c2VMYXlvdXRFZmZlY3QgfSBmcm9tIFwiLi91c2UtbGF5b3V0LWVmZmVjdFwiO1xuZXhwb3J0IHsgdXNlU3RhdGUgfSBmcm9tIFwiLi91c2Utc3RhdGVcIjtcbmV4cG9ydCB7IHVzZVJlZHVjZXIgfSBmcm9tIFwiLi91c2UtcmVkdWNlclwiO1xuZXhwb3J0IHsgdXNlTWVtbyB9IGZyb20gXCIuL3VzZS1tZW1vXCI7XG5leHBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSBcIi4vdXNlLWNvbnRleHRcIjtcbmV4cG9ydCB7IHVzZVJlZiB9IGZyb20gXCIuL3VzZS1yZWZcIjtcbmV4cG9ydCB7IGhvb2ssIEhvb2sgfSBmcm9tIFwiLi9ob29rXCI7XG5leHBvcnQgeyBCYXNlU2NoZWR1bGVyIH0gZnJvbSBcIi4vc2NoZWR1bGVyXCI7XG5leHBvcnQgeyBTdGF0ZSB9IGZyb20gXCIuL3N0YXRlXCI7XG4iLCJpbXBvcnQgeyBjb250ZXh0RXZlbnQgfSBmcm9tIFwiLi9zeW1ib2xzXCI7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSBcIi4vdXNlLWNvbnRleHRcIjtcbmZ1bmN0aW9uIG1ha2VDb250ZXh0KGNvbXBvbmVudCkge1xuICAgIHJldHVybiAoZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IENvbnRleHQgPSB7XG4gICAgICAgICAgICBQcm92aWRlcjogY2xhc3MgZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzO1xuICAgICAgICAgICAgICAgIF92YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihjb250ZXh0RXZlbnQsIHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGNvbnRleHRFdmVudCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZGV0YWlsIH0gPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFpbC5Db250ZXh0ID09PSBDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwudmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnVuc3Vic2NyaWJlID0gdGhpcy51bnN1YnNjcmliZS5iaW5kKHRoaXMsIGRldGFpbC5jYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGQoZGV0YWlsLmNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldCB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiB0aGlzLmxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBDb25zdW1lcjogY29tcG9uZW50KGZ1bmN0aW9uICh7IHJlbmRlciB9KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlcihjb250ZXh0KTtcbiAgICAgICAgICAgIH0sIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIENvbnRleHQ7XG4gICAgfTtcbn1cbmV4cG9ydCB7IG1ha2VDb250ZXh0IH07XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmltcG9ydCB7IG5vdGhpbmcgfSBmcm9tICcuLi9saXQtaHRtbC5qcyc7XG5pbXBvcnQgeyBkaXJlY3RpdmUsIEFzeW5jRGlyZWN0aXZlIH0gZnJvbSAnLi4vYXN5bmMtZGlyZWN0aXZlLmpzJztcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWYgb2JqZWN0LCB3aGljaCBpcyBjb250YWluZXIgZm9yIGEgcmVmZXJlbmNlIHRvIGFuIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWYgPSAoKSA9PiBuZXcgUmVmKCk7XG4vKipcbiAqIEFuIG9iamVjdCB0aGF0IGhvbGRzIGEgcmVmIHZhbHVlLlxuICovXG5jbGFzcyBSZWYge1xufVxuLy8gV2hlbiBjYWxsYmFja3MgYXJlIHVzZWQgZm9yIHJlZnMsIHRoaXMgbWFwIHRyYWNrcyB0aGUgbGFzdCB2YWx1ZSB0aGUgY2FsbGJhY2tcbi8vIHdhcyBjYWxsZWQgd2l0aCwgZm9yIGVuc3VyaW5nIGEgZGlyZWN0aXZlIGRvZXNuJ3QgY2xlYXIgdGhlIHJlZiBpZiB0aGUgcmVmXG4vLyBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIHRvIGEgbmV3IHNwb3QuIEl0IGlzIGRvdWJsZS1rZXllZCBvbiBib3RoIHRoZVxuLy8gY29udGV4dCAoYG9wdGlvbnMuaG9zdGApIGFuZCB0aGUgY2FsbGJhY2ssIHNpbmNlIHdlIGF1dG8tYmluZCBjbGFzcyBtZXRob2RzXG4vLyB0byBgb3B0aW9ucy5ob3N0YC5cbmNvbnN0IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrID0gbmV3IFdlYWtNYXAoKTtcbmNsYXNzIFJlZkRpcmVjdGl2ZSBleHRlbmRzIEFzeW5jRGlyZWN0aXZlIHtcbiAgICByZW5kZXIoX3JlZikge1xuICAgICAgICByZXR1cm4gbm90aGluZztcbiAgICB9XG4gICAgdXBkYXRlKHBhcnQsIFtyZWZdKSB7XG4gICAgICAgIGNvbnN0IHJlZkNoYW5nZWQgPSByZWYgIT09IHRoaXMuX3JlZjtcbiAgICAgICAgaWYgKHJlZkNoYW5nZWQgJiYgdGhpcy5fcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWYgcGFzc2VkIHRvIHRoZSBkaXJlY3RpdmUgaGFzIGNoYW5nZWQ7XG4gICAgICAgICAgICAvLyB1bnNldCB0aGUgcHJldmlvdXMgcmVmJ3MgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlZlZhbHVlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZkNoYW5nZWQgfHwgdGhpcy5fbGFzdEVsZW1lbnRGb3JSZWYgIT09IHRoaXMuX2VsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFdlIGVpdGhlciBnb3QgYSBuZXcgcmVmIG9yIHRoaXMgaXMgdGhlIGZpcnN0IHJlbmRlcjtcbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSByZWYvZWxlbWVudCAmIHVwZGF0ZSB0aGUgcmVmIHZhbHVlXG4gICAgICAgICAgICB0aGlzLl9yZWYgPSByZWY7XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gcGFydC5vcHRpb25zPy5ob3N0O1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUoKHRoaXMuX2VsZW1lbnQgPSBwYXJ0LmVsZW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm90aGluZztcbiAgICB9XG4gICAgX3VwZGF0ZVJlZlZhbHVlKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCByZWYgd2FzIGNhbGxlZCB3aXRoIGEgcHJldmlvdXMgdmFsdWUsIGNhbGwgd2l0aFxuICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGA7IFdlIGRvIHRoaXMgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGluIGEgY29uc2lzdGVudFxuICAgICAgICAgICAgLy8gd2F5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIHJlZiBtaWdodCBiZSBtb3ZpbmcgdXAgaW4gdGhlIHRyZWUgKGluXG4gICAgICAgICAgICAvLyB3aGljaCBjYXNlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IHZhbHVlIGJlZm9yZSB0aGVcbiAgICAgICAgICAgIC8vIHByZXZpb3VzIG9uZSB1bnNldHMgaXQpIGFuZCBkb3duIGluIHRoZSB0cmVlICh3aGVyZSBpdCB3b3VsZCBiZSB1bnNldFxuICAgICAgICAgICAgLy8gYmVmb3JlIGJlaW5nIHNldCkuIE5vdGUgdGhhdCBlbGVtZW50IGxvb2t1cCBpcyBrZXllZCBieVxuICAgICAgICAgICAgLy8gYm90aCB0aGUgY29udGV4dCBhbmQgdGhlIGNhbGxiYWNrLCBzaW5jZSB3ZSBhbGxvdyBwYXNzaW5nIHVuYm91bmRcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgb24gb3B0aW9ucy5ob3N0LCBhbmQgd2Ugd2FudCB0byB0cmVhdFxuICAgICAgICAgICAgLy8gdGhlc2UgYXMgdW5pcXVlIFwiaW5zdGFuY2VzXCIgb2YgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9jb250ZXh0ID8/IGdsb2JhbFRoaXM7XG4gICAgICAgICAgICBsZXQgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayA9IGxhc3RFbGVtZW50Rm9yQ29udGV4dEFuZENhbGxiYWNrLmdldChjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudEZvckNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsYXN0RWxlbWVudEZvckNhbGxiYWNrID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgICAgICAgICBsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjay5zZXQoY29udGV4dCwgbGFzdEVsZW1lbnRGb3JDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGFzdEVsZW1lbnRGb3JDYWxsYmFjay5nZXQodGhpcy5fcmVmKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmLmNhbGwodGhpcy5fY29udGV4dCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RFbGVtZW50Rm9yQ2FsbGJhY2suc2V0KHRoaXMuX3JlZiwgZWxlbWVudCk7XG4gICAgICAgICAgICAvLyBDYWxsIHRoZSByZWYgd2l0aCB0aGUgbmV3IGVsZW1lbnQgdmFsdWVcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYuY2FsbCh0aGlzLl9jb250ZXh0LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZi52YWx1ZSA9IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IF9sYXN0RWxlbWVudEZvclJlZigpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9yZWYgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gbGFzdEVsZW1lbnRGb3JDb250ZXh0QW5kQ2FsbGJhY2tcbiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMuX2NvbnRleHQgPz8gZ2xvYmFsVGhpcylcbiAgICAgICAgICAgICAgICA/LmdldCh0aGlzLl9yZWYpXG4gICAgICAgICAgICA6IHRoaXMuX3JlZj8udmFsdWU7XG4gICAgfVxuICAgIGRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgICAgLy8gT25seSBjbGVhciB0aGUgYm94IGlmIG91ciBlbGVtZW50IGlzIHN0aWxsIHRoZSBvbmUgaW4gaXQgKGkuZS4gYW5vdGhlclxuICAgICAgICAvLyBkaXJlY3RpdmUgaW5zdGFuY2UgaGFzbid0IHJlbmRlcmVkIGl0cyBlbGVtZW50IHRvIGl0IGJlZm9yZSB1cyk7IHRoYXRcbiAgICAgICAgLy8gb25seSBoYXBwZW5zIGluIHRoZSBldmVudCBvZiB0aGUgZGlyZWN0aXZlIGJlaW5nIGNsZWFyZWQgKG5vdCB2aWEgbWFudWFsXG4gICAgICAgIC8vIGRpc2Nvbm5lY3Rpb24pXG4gICAgICAgIGlmICh0aGlzLl9sYXN0RWxlbWVudEZvclJlZiA9PT0gdGhpcy5fZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVmVmFsdWUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWNvbm5lY3RlZCgpIHtcbiAgICAgICAgLy8gSWYgd2Ugd2VyZSBtYW51YWxseSBkaXNjb25uZWN0ZWQsIHdlIGNhbiBzYWZlbHkgcHV0IG91ciBlbGVtZW50IGJhY2sgaW5cbiAgICAgICAgLy8gdGhlIGJveCwgc2luY2Ugbm8gcmVuZGVyaW5nIGNvdWxkIGhhdmUgb2NjdXJyZWQgdG8gY2hhbmdlIGl0cyBzdGF0ZVxuICAgICAgICB0aGlzLl91cGRhdGVSZWZWYWx1ZSh0aGlzLl9lbGVtZW50KTtcbiAgICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgUmVmIG9iamVjdCBvciBjYWxscyBhIHJlZiBjYWxsYmFjayB3aXRoIHRoZSBlbGVtZW50IGl0J3NcbiAqIGJvdW5kIHRvLlxuICpcbiAqIEEgUmVmIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmVyIGZvciBhIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50LiBBIHJlZlxuICogY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGFuIGVsZW1lbnQgYXMgaXRzIG9ubHkgYXJndW1lbnQuXG4gKlxuICogVGhlIHJlZiBkaXJlY3RpdmUgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIFJlZiBvYmplY3Qgb3IgY2FsbHMgdGhlIHJlZiBjYWxsYmFja1xuICogZHVyaW5nIHJlbmRlcmluZywgaWYgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBjaGFuZ2VkLlxuICpcbiAqIE5vdGU6IElmIGEgcmVmIGNhbGxiYWNrIGlzIHJlbmRlcmVkIHRvIGEgZGlmZmVyZW50IGVsZW1lbnQgcG9zaXRpb24gb3IgaXNcbiAqIHJlbW92ZWQgaW4gYSBzdWJzZXF1ZW50IHJlbmRlciwgaXQgd2lsbCBmaXJzdCBiZSBjYWxsZWQgd2l0aCBgdW5kZWZpbmVkYCxcbiAqIGZvbGxvd2VkIGJ5IGFub3RoZXIgY2FsbCB3aXRoIHRoZSBuZXcgZWxlbWVudCBpdCB3YXMgcmVuZGVyZWQgdG8gKGlmIGFueSkuXG4gKlxuICogYGBganNcbiAqIC8vIFVzaW5nIFJlZiBvYmplY3RcbiAqIGNvbnN0IGlucHV0UmVmID0gY3JlYXRlUmVmKCk7XG4gKiByZW5kZXIoaHRtbGA8aW5wdXQgJHtyZWYoaW5wdXRSZWYpfT5gLCBjb250YWluZXIpO1xuICogaW5wdXRSZWYudmFsdWUuZm9jdXMoKTtcbiAqXG4gKiAvLyBVc2luZyBjYWxsYmFja1xuICogY29uc3QgY2FsbGJhY2sgPSAoaW5wdXRFbGVtZW50KSA9PiBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAqIHJlbmRlcihodG1sYDxpbnB1dCAke3JlZihjYWxsYmFjayl9PmAsIGNvbnRhaW5lcik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHJlZiA9IGRpcmVjdGl2ZShSZWZEaXJlY3RpdmUpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVmLmpzLm1hcCIsImltcG9ydCB7IGh0bWwsIGNvbXBvbmVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ2hhdW50ZWQnO1xuaW1wb3J0ICcuL2Jhc2ljL3BlcnNvbi1jYXJkLmpzJztcblxuLy8gSGVscGVyIHRvIGdlbmVyYXRlIGEgcmFuZG9tIGtleVxuZnVuY3Rpb24gZ2VuS2V5KCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpICsgRGF0ZS5ub3coKTtcbn1cblxuZnVuY3Rpb24gRWRpdGFibGVQZW9wbGVMaXN0KHsganVyaXNkaWN0aW9uX29jZGlkIH0pIHtcbiAgY29uc3QgW3Blb3BsZSwgc2V0UGVvcGxlXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtzZWxlY3RlZCwgc2V0U2VsZWN0ZWRdID0gdXNlU3RhdGUoW10pO1xuICBcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWp1cmlzZGljdGlvbl9vY2RpZCkgcmV0dXJuO1xuICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgZmV0Y2goYC9hcGkvYXBpX3Byb3h5L3Blb3BsZT9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoanVyaXNkaWN0aW9uX29jZGlkKX1gKVxuICAgICAgLnRoZW4ociA9PiByLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAvLyBBc3NpZ24gYSB0ZW1wb3Jhcnkga2V5IHRvIGVhY2ggcGVyc29uXG4gICAgICAgIGNvbnN0IHdpdGhLZXlzID0gKGRhdGEuZGF0YSB8fCBbXSkubWFwKHBlcnNvbiA9PiAoe1xuICAgICAgICAgIC4uLnBlcnNvbixcbiAgICAgICAgICBfdGVtcEtleTogZ2VuS2V5KCksXG4gICAgICAgIH0pKTtcbiAgICAgICAgc2V0UGVvcGxlKHdpdGhLZXlzKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICBzZXRFcnJvcihlKTtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9KTtcbiAgfSwgW2p1cmlzZGljdGlvbl9vY2RpZF0pO1xuXG4gIGZ1bmN0aW9uIHRvZ2dsZVNlbGVjdChrZXkpIHtcbiAgICBjb25zb2xlLmxvZyhcInRvZ2dsaW5nXCIsIGtleSk7XG4gICAgc2V0U2VsZWN0ZWQoc2VsID0+XG4gICAgICBzZWwuaW5jbHVkZXMoa2V5KSA/IHNlbC5maWx0ZXIoeCA9PiB4ICE9PSBrZXkpIDogWy4uLnNlbCwga2V5XVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBZGRQZXJzb24oKSB7XG4gICAgY29uc3QgbmFtZSA9IHByb21wdCgnRW50ZXIgbmFtZSBmb3IgbmV3IHBlcnNvbjonKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICAvLyBSZXBsYWNlIHdpdGggeW91ciBhY3R1YWwgQVBJIGNhbGxcbiAgICBmZXRjaCgnL2FwaS9hcGlfcHJveHkvcGVvcGxlJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwganVyaXNkaWN0aW9uX29jZGlkIH0pLFxuICAgIH0pXG4gICAgICAudGhlbihyID0+IHIuanNvbigpKVxuICAgICAgLnRoZW4obmV3UGVyc29uID0+IHNldFBlb3BsZShwID0+IFsuLi5wLCB7IC4uLm5ld1BlcnNvbiwgX3RlbXBLZXk6IGdlbktleSgpIH1dKSlcbiAgICAgIC5jYXRjaChlID0+IGFsZXJ0KCdGYWlsZWQgdG8gYWRkIHBlcnNvbicpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURlbGV0ZShrZXkpIHtcbiAgICBpZiAoIWNvbmZpcm0oJ0RlbGV0ZSB0aGlzIHBlcnNvbj8nKSkgcmV0dXJuO1xuICAgIHNldFBlb3BsZShwID0+IHAuZmlsdGVyKHBlcnNvbiA9PiBwZXJzb24uX3RlbXBLZXkgIT09IGtleSkpO1xuICAgIC8vIE9wdGlvbmFsbHksIGNhbGwgeW91ciBBUEkgaGVyZSBpZiB5b3UgY2FuIGlkZW50aWZ5IHRoZSBwZXJzb24gYW5vdGhlciB3YXlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU1lcmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUGVvcGxlID0gZ2V0U2VsZWN0ZWRQZW9wbGUoKTtcbiAgICBhbGVydChgTWVyZ2luZyBwZW9wbGU6XFxuJHtzZWxlY3RlZFBlb3BsZS5tYXAocCA9PiBwLm5hbWUpLmpvaW4oJywgJyl9YCk7XG4gICAgc2V0U2VsZWN0ZWQoW10pO1xuICB9XG5cbiAgLy8gRXhhbXBsZSB1c2FnZSBpbiBoYW5kbGVCdWxrRGVsZXRlOlxuICBmdW5jdGlvbiBoYW5kbGVCdWxrRGVsZXRlKCkge1xuICAgIGlmICghY29uZmlybShgRGVsZXRlICR7c2VsZWN0ZWQubGVuZ3RofSBwZW9wbGU/YCkpIHJldHVybjtcbiAgICBzZXRQZW9wbGUocCA9PiBwLmZpbHRlcihwZXJzb24gPT4gIXNlbGVjdGVkLmluY2x1ZGVzKHBlcnNvbi5fdGVtcEtleSkpKTtcbiAgICBzZXRTZWxlY3RlZChbXSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZWxlY3RBY3Rpb25zKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHtoYW5kbGVNZXJnZX0+TWVyZ2UgKCR7c2VsZWN0ZWQubGVuZ3RofSk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBAY2xpY2s9JHtoYW5kbGVCdWxrRGVsZXRlfT5EZWxldGUgKCR7c2VsZWN0ZWQubGVuZ3RofSk8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICBpZiAobG9hZGluZykgcmV0dXJuIGh0bWxgPHA+TG9hZGluZyBwZW9wbGUuLi48L3A+YDtcbiAgaWYgKGVycm9yKSByZXR1cm4gaHRtbGA8cD5FcnJvciBsb2FkaW5nIHBlb3BsZS48L3A+YDtcblxuICByZXR1cm4gaHRtbGBcbiAgICBcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMXJlbTtcIj5cbiAgICAgIDwhLS0gPGJ1dHRvbiBAY2xpY2s9JHtoYW5kbGVBZGRQZXJzb259PkFkZCBQZXJzb248L2J1dHRvbj4gLS0+XG4gICAgICAke3NlbGVjdGVkLmxlbmd0aCA+IDFcbiAgICAgICAgPyBodG1sYDxidXR0b24gQGNsaWNrPSR7aGFuZGxlTWVyZ2V9IHN0eWxlPVwibWFyZ2luLWxlZnQ6MXJlbTtcIj5NZXJnZSAoJHtzZWxlY3RlZC5sZW5ndGh9KTwvYnV0dG9uPmBcbiAgICAgICAgOiAnJ31cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImdyaWRcIlxuICAgICAgc3R5bGU9XCJcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzNDBweCwgMWZyKSk7XG4gICAgICAgIGdhcDogMXJlbTtcbiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgXCJcbiAgICA+XG4gICAgICAke3Blb3BsZS5tYXAoXG4gICAgICAgIHBlcnNvbiA9PiBodG1sYFxuICAgICAgICAgIDxwZXJzb24tY2FyZFxuICAgICAgICAgICAgLnBlcnNvbj0ke3BlcnNvbn1cbiAgICAgICAgICAgIC5zZWxlY3RlZD0ke3NlbGVjdGVkLmluY2x1ZGVzKHBlcnNvbi5fdGVtcEtleSl9XG4gICAgICAgICAgICAub25TZWxlY3Q9JHsoKSA9PiB0b2dnbGVTZWxlY3QocGVyc29uLl90ZW1wS2V5KX1cbiAgICAgICAgICAgIC5vbkRlbGV0ZT0keygpID0+IGhhbmRsZURlbGV0ZShwZXJzb24uX3RlbXBLZXkpfVxuICAgICAgICAgID48L3BlcnNvbi1jYXJkPlxuICAgICAgICBgXG4gICAgICApfVxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICdjaXYtZWRpdGFibGUtcGVvcGxlLWxpc3QnLCBcbiAgY29tcG9uZW50KFxuICAgIEVkaXRhYmxlUGVvcGxlTGlzdCwgeyBcbiAgICAgIHVzZVNoYWRvd0RPTTogZmFsc2UsIG9ic2VydmVkQXR0cmlidXRlczogWydqdXJpc2RpY3Rpb25fb2NkaWQnXSBcbiAgICB9XG4gIClcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZU1lbW8gfSBmcm9tICdoYXVudGVkJztcbmltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQtaHRtbCc7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwibGl0LWh0bWwvZGlyZWN0aXZlcy9yZWYuanNcIjtcblxuLy8gRGVib3VuY2UgVXRpbGl0eVxuY29uc3QgZGVib3VuY2UgPSAoZnVuYywgZGVsYXkpID0+IHtcbiAgbGV0IHRpbWVvdXRJZDtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCBkZWxheSk7XG4gIH07XG59O1xuXG4vLyAtLS0gQ29tcG9uZW50IERlZmluaXRpb24gLS0tXG5mdW5jdGlvbiBBdXRvY29tcGxldGVTZWxlY3QoeyBcbiAgZGlzYWJsZWQsIFxuICBvcHRpb25zTWV0YWRhdGEgPSB7fSxcbiAgb3B0aW9ucyA9IFtdLCBcbiAgbGFiZWwgPSAnU2VhcmNoJywgaW5wdXRWYWx1ZSA9ICcnLFxuICBwYWdlU2l6ZSA9IDI1LFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRJdGVtLCBzZXRTZWxlY3RlZEl0ZW1dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFthY3RpdmVJbmRleCwgc2V0QWN0aXZlSW5kZXhdID0gdXNlU3RhdGUoLTEpO1xuICBjb25zdCBbaXNMaXN0T3Blbiwgc2V0SXNMaXN0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpbnB1dEVsZW1lbnQsIHNldElucHV0RWxlbWVudF0gPSB1c2VTdGF0ZShudWxsKTtcbiAgY29uc3QgW2N1cnJlbnRQYWdlLCBzZXRDdXJyZW50UGFnZV0gPSB1c2VTdGF0ZSgxKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaW5wdXRWYWx1ZSkge1xuICAgICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIH1cbiAgfSwgW2lucHV0VmFsdWVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgIHNjcm9sbFRvQWN0aXZlSXRlbShhY3RpdmVJbmRleCk7XG4gICAgfVxuICB9LCBbYWN0aXZlSW5kZXhdKVxuXG4gIGNvbnN0IHRyaWdnZXJQYXJlbnRGZXRjaCA9IChpbnB1dCwgcGFnZSA9IDEpID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IGlucHV0IHx8ICcnO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2ZldGNoLXN1Z2dlc3Rpb25zJywgeyBcbiAgICAgIGRldGFpbDogeyBxdWVyeSwgcGFnZSwgcGFnZVNpemUgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBzZXRBY3RpdmVJbmRleCgtMSk7XG4gICAgc2V0Q3VycmVudFBhZ2UocGFnZSk7XG4gIH07XG5cbiAgY29uc3QgZGVib3VuY2VkRmV0Y2ggPSB1c2VNZW1vKCgpID0+IGRlYm91bmNlKHRyaWdnZXJQYXJlbnRGZXRjaCwgMzAwKSwgW10pO1xuXG4gIC8vIC0tLSBTZWxlY3Rpb24gTG9naWMgLS0tXG4gIGNvbnN0IHNlbGVjdEl0ZW0gPSAoaXRlbSkgPT4ge1xuICAgIHNldFNlbGVjdGVkSXRlbShpdGVtKTtcbiAgICBzZXRJc0xpc3RPcGVuKGZhbHNlKTtcbiAgICBzZXRDdXJyZW50UGFnZSgxKTtcbiAgICBpZiAoaW5wdXRFbGVtZW50KSBpbnB1dEVsZW1lbnQuZm9jdXMoKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpdGVtLXNlbGVjdGVkJywgeyBcbiAgICAgIGRldGFpbDogaXRlbSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdpbnB1dC1jaGFuZ2UnLCB7IFxuICAgICAgZGV0YWlsOiB7IHZhbHVlOiBpdGVtLmxhYmVsLCBpdGVtIH0sIFxuICAgICAgYnViYmxlczogdHJ1ZSwgXG4gICAgICBjb21wb3NlZDogdHJ1ZSBcbiAgICB9KSk7XG4gIH07XG5cbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBvcHRpb25zTWV0YWRhdGE/LmxpbmtzPy5wcmV2O1xuICBjb25zdCBoYXNOZXh0UGFnZSA9IG9wdGlvbnNNZXRhZGF0YT8ubGlua3M/Lm5leHQ7XG5cbiAgY29uc3QgaGFuZGxlUHJldlBhZ2UgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmIChoYXNQcmV2UGFnZSkge1xuICAgICAgdHJpZ2dlclBhcmVudEZldGNoKGlucHV0VmFsdWUsIGN1cnJlbnRQYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdCBoYW5kbGVOZXh0UGFnZSA9IChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGhhc05leHRQYWdlKSB7XG4gICAgICB0cmlnZ2VyUGFyZW50RmV0Y2goaW5wdXRWYWx1ZSwgY3VycmVudFBhZ2UgKyAxKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIC0tLSBIYW5kbGVycyAtLS1cbiAgY29uc3QgaGFuZGxlSW5wdXQgPSAoZSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZS50YXJnZXQudmFsdWU7XG4gICAgc2V0U2VsZWN0ZWRJdGVtKG51bGwpO1xuICAgIHNldEN1cnJlbnRQYWdlKDEpO1xuICAgIFxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2lucHV0LWNoYW5nZScsIHsgXG4gICAgICBkZXRhaWw6IHsgdmFsdWUsIGl0ZW06IG51bGwgfSwgXG4gICAgICBidWJibGVzOiB0cnVlLCBcbiAgICAgIGNvbXBvc2VkOiB0cnVlIFxuICAgIH0pKTtcbiAgICBcbiAgICBkZWJvdW5jZWRGZXRjaCh2YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlKSA9PiB7XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgXG4gICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggKyAxKSAlIG9wdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRJc0xpc3RPcGVuKHRydWUpO1xuICAgICAgICBzZXRBY3RpdmVJbmRleChpbmRleCA9PiAoaW5kZXggLSAxICsgb3B0aW9ucy5sZW5ndGgpICUgb3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGFjdGl2ZUluZGV4ID49IDAgJiYgaXNMaXN0T3Blbikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBzZWxlY3RJdGVtKG9wdGlvbnNbYWN0aXZlSW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHNldElzTGlzdE9wZW4oZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH07XG5cbiAgICAvLyBTY3JvbGwgYWN0aXZlIGl0ZW0gaW50byB2aWV3XG4gIGNvbnN0IHNjcm9sbFRvQWN0aXZlSXRlbSA9IChpbmRleCkgPT4ge1xuICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBET00gaGFzIHVwZGF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZUl0ZW0gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC5hdXRvY29tcGxldGUtb3B0aW9uW2FyaWEtc2VsZWN0ZWQ9XCJ0cnVlXCJdYCk7XG4gICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICBhY3RpdmVJdGVtLnNjcm9sbEludG9WaWV3KHsgXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLCBcbiAgICAgICAgICBibG9jazogJ25lYXJlc3QnIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVCdXR0b25DbGljayA9ICgpID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFpc0xpc3RPcGVuO1xuICAgIHNldElzTGlzdE9wZW4obmV3U3RhdGUpO1xuICAgIGlmIChuZXdTdGF0ZSAmJiBpbnB1dEVsZW1lbnQpIHtcbiAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdWdnZXN0aW9uQ2xpY2sgPSAoaXRlbSkgPT4ge1xuICAgIHNlbGVjdEl0ZW0oaXRlbSk7XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPHN0eWxlPlxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS13cmFwcGVyIGZpZWxkc2V0LmdyaWQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICBnYXA6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtaW5wdXQge1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtdG9nZ2xlIHtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgcGFkZGluZzogMC41cmVtIDAuNzVyZW07XG4gICAgICAgIG1pbi13aWR0aDogM3JlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtZHJvcGRvd24ge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMTAwJTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBpY28tYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlcjogdmFyKC0tcGljby1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcGljby1ib3JkZXItcmFkaXVzKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMC4yNXJlbTtcbiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7XG4gICAgICAgIHotaW5kZXg6IDk5O1xuICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1waWNvLWJveC1zaGFkb3cpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbnMge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtb3B0aW9uIHtcbiAgICAgICAgcGFkZGluZzogMC43NXJlbSAxcmVtO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xcyBlYXNlO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb246aG92ZXIsXG4gICAgICAuYXV0b2NvbXBsZXRlLW9wdGlvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXNlY29uZGFyeS1iYWNrZ3JvdW5kKTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1vcHRpb25bYXJpYS1zZWxlY3RlZD1cInRydWVcIl0ge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktYmFja2dyb3VuZCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1waWNvLXByaW1hcnktaW52ZXJzZSk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1waWNvLW11dGVkLWJvcmRlci1jb2xvcik7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW0gMXJlbTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLWNhcmQtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCB2YXIoLS1waWNvLWJvcmRlci1yYWRpdXMpIHZhcigtLXBpY28tYm9yZGVyLXJhZGl1cyk7XG4gICAgICB9XG5cbiAgICAgIC5hdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24tY29udHJvbHMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgLmF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uIGJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAuMjVyZW0gMC43NXJlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXBhZ2luYXRpb24gYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgfVxuXG4gICAgICAuYXV0b2NvbXBsZXRlLXNlbGVjdGVkIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbi10b3A6IDAuNXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBpY28tbXV0ZWQtY29sb3IpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+IFxuXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPiR7bGFiZWx9PC9sYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXdyYXBwZXJcIj5cbiAgICAgIDxmaWVsZHNldCBjbGFzcz1cImdyaWRcIiByb2xlPVwiZ3JvdXBcIj5cbiAgICAgICAgPGlucHV0IFxuICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWlucHV0XCIgXG4gICAgICAgICAgdHlwZT1cInRleHRcIiBcbiAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIiBcbiAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImJvdGhcIiBcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPSR7aXNMaXN0T3BlbiA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgYXJpYS1sYWJlbD0ke2xhYmVsfVxuICAgICAgICAgIC52YWx1ZT0ke2lucHV0VmFsdWV9XG4gICAgICAgICAgQGlucHV0PSR7aGFuZGxlSW5wdXR9XG4gICAgICAgICAgQGtleWRvd249JHtoYW5kbGVLZXlEb3dufVxuICAgICAgICAgIEBibHVyPSR7KCkgPT4gc2V0SXNMaXN0T3BlbihmYWxzZSl9XG4gICAgICAgICAgQGZvY3VzPSR7KCkgPT4gc2V0SXNMaXN0T3Blbih0cnVlKX1cbiAgICAgICAgICAke3JlZihzZXRJbnB1dEVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgIFxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS10b2dnbGVcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJUb2dnbGUgc3VnZ2VzdGlvbnMgbGlzdFwiIFxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9JHtpc0xpc3RPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ31cbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICBAY2xpY2s9JHtoYW5kbGVCdXR0b25DbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgIDxwb2x5Z29uIFxuICAgICAgICAgICAgICBjbGFzcz1cImFycm93XCIgXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIiBcbiAgICAgICAgICAgICAgZmlsbC1vcGFjaXR5PVwiMC43NVwiIFxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudGNvbG9yXCIgXG4gICAgICAgICAgICAgIHBvaW50cz1cIjMsNiAxNSw2IDksMTRcIlxuICAgICAgICAgICAgICBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKCR7aXNMaXN0T3BlbiA/ICcxODBkZWcnIDogJzBkZWcnfSk7IHRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7IHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzO1wiXG4gICAgICAgICAgICA+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZmllbGRzZXQ+XG4gICAgICBcbiAgICAgICR7aXNMaXN0T3BlbiAmJiBvcHRpb25zLmxlbmd0aCA+IDAgPyBodG1sYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLWRyb3Bkb3duXCI+XG4gICAgICAgICAgPHVsIFxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIiBcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9JHtsYWJlbH1cbiAgICAgICAgICAgIGNsYXNzPVwiYXV0b2NvbXBsZXRlLW9wdGlvbnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgICR7b3B0aW9ucy5tYXAoKGl0ZW0sIGluZGV4KSA9PiBodG1sYFxuICAgICAgICAgICAgICA8bGkgXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD0ke2luZGV4ID09PSBhY3RpdmVJbmRleCA/ICd0cnVlJyA6ICdmYWxzZSd9XG4gICAgICAgICAgICAgICAgQG1vdXNlZG93bj0keyhlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKGl0ZW0pOyB9fVxuICAgICAgICAgICAgICAgIEBtb3VzZW92ZXI9JHsoKSA9PiBzZXRBY3RpdmVJbmRleChpbmRleCl9XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtb3B0aW9uICR7aW5kZXggPT09IGFjdGl2ZUluZGV4ID8gJ2FjdGl2ZScgOiAnJ31cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgJHtpdGVtLmxhYmVsfVxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgYCl9XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgICBcbiAgICAgICAgICAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXMgPiBwYWdlU2l6ZSA/IGh0bWxgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXV0b2NvbXBsZXRlLXBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtcGFnaW5hdGlvbi1pbmZvXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZyAke29wdGlvbnNNZXRhZGF0YT8ucGFnZX0tJHtvcHRpb25zTWV0YWRhdGE/LnRvdGFsX3BhZ2VzfSBvZiAke29wdGlvbnNNZXRhZGF0YT8udG90YWxfaXRlbXN9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZS1wYWdpbmF0aW9uLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZVByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc1ByZXZQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHBhZ2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFByZXZpb3VzXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgQG1vdXNlZG93bj0ke2hhbmRsZU5leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPSR7IWhhc05leHRQYWdlfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgcGFnZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTmV4dFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICBgIDogJyd9XG4gICAgICBcbiAgICAgICR7c2VsZWN0ZWRJdGVtID8gaHRtbGA8c21hbGwgY2xhc3M9XCJhdXRvY29tcGxldGUtc2VsZWN0ZWRcIj5TZWxlY3RlZDogJHtzZWxlY3RlZEl0ZW0ubGFiZWx9PC9zbWFsbD5gIDogJyd9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgJ2Npdi1hdXRvY29tcGxldGUtc2VsZWN0JyxcbiAgY29tcG9uZW50KEF1dG9jb21wbGV0ZVNlbGVjdCwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5cbmZ1bmN0aW9uIFBlb3BsZUxpc3QoeyBsb2NhbCA9IFtdIH0pIHtcbiAgICBjb25zdCBwZW9wbGUgPSBsb2NhbDtcblxuICAgIGNvbnN0IGhhc1N1YmRpdmlzaW9uID0gKHBlcnNvbikgPT4ge1xuICAgICAgICBjb25zdCBkaXZpc2lvbk9jZGlkID0gcGVyc29uLm9mZmljZS5kaXZpc2lvbl9vY2RpZCB8fCBcIlwiO1xuICAgICAgICBpZiAoZGl2aXNpb25PY2RpZC5pbmNsdWRlcyhcImRpc3RyaWN0XCIpIHx8IGRpdmlzaW9uT2NkaWQuaW5jbHVkZXMoXCJ3YXJkXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0U3ViZGl2aXNpb25MYWJlbCA9IChwZXJzb24pID0+IHtcbiAgICAgICAgY29uc3QgZGl2aXNpb25PY2RpZCA9IHBlcnNvbi5vZmZpY2UuZGl2aXNpb25fb2NkaWQgfHwgXCJcIjtcbiAgICAgICAgY29uc3QgcGFydHMgPSBkaXZpc2lvbk9jZGlkLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKFwiY291bmNpbF9kaXN0cmljdDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYERpc3RyaWN0ICR7cGFydC5zcGxpdChcIjpcIilbMV19YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5zdGFydHNXaXRoKFwid2FyZDpcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFdhcmQgJHtwYXJ0LnNwbGl0KFwiOlwiKVsxXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgY29uc3Qgc3ViRGl2aXNpb24gPSAocGVyc29uKSA9PiB7XG4gICAgICAgIGlmIChoYXNTdWJkaXZpc2lvbihwZXJzb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7Z2V0U3ViZGl2aXNpb25MYWJlbChwZXJzb24pfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0U291cmNlcyA9IChzb3VyY2VzKSA9PiB7XG4gICAgICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHNtYWxsPk5vIFNvdXJjZXM8L3NtYWxsPmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICAgICR7c291cmNlcy5tYXAoKHNvdXJjZSwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgIDxhIFxuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7c291cmNlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuMjVyZW07XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgWyR7aW5kZXggKyAxfV1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfTtcblxuICAgIGlmICghcGVvcGxlIHx8IHBlb3BsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGh0bWxgPHAgcm9sZT1cImFsZXJ0XCI+Tm8gcGVvcGxlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGlzIGp1cmlzZGljdGlvbi48L3A+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICA8ZmlndXJlPlxuICAgICAgICA8dGFibGUgcm9sZT1cImdyaWRcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxJTtcIj5QaG90bzwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAxNSU7XCI+T2ZmaWNpYWw8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogMTUlXCI+Q29udGFjdDwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgJHtwZW9wbGUubWFwKHBlcnNvbiA9PiBodG1sYFxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1sYWJlbD1cIlBob3RvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uY2RuX2ltYWdlIHx8IHBlcnNvbi5pbWFnZSA/IGh0bWxgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIke3BlcnNvbi5jZG5faW1hZ2UgfHwgcGVyc29uLmltYWdlfVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiUGhvdG8gb2YgJHtwZXJzb24ubmFtZX1cIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgYm9yZGVyLXJhZGl1czogNTAlOyBvYmplY3QtZml0OiBjb3ZlcjtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yPVwidGhpcy5vbmVycm9yPW51bGw7IHRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSc7IHRoaXMuY2xvc2VzdCgndGQnKS5xdWVyeVNlbGVjdG9yKCcuZmFsbGJhY2staWNvbicpLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhbGxiYWNrLWljb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHdpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7IGxpbmUtaGVpZ2h0OiA1MHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IpOyBjb2xvcjogdmFyKC0tcGljby1zZWNvbmRhcnktaG92ZXItY29sb3IpO1wiPvCfkaQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCA6IGh0bWxgPHNwYW4gY2xhc3M9XCJmYWxsYmFjay1pY29uXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4OyBsaW5lLWhlaWdodDogNTBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItcmFkaXVzOiA1MCU7IGJhY2tncm91bmQ6IHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yKTsgY29sb3I6IHZhcigtLXBpY28tc2Vjb25kYXJ5LWhvdmVyLWNvbG9yKTsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPvCfkaQ8L3NwYW4+YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWxhYmVsPVwiT2ZmaWNpYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiR7cGVyc29uLm5hbWV9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+JHtwZXJzb24ub2ZmaWNlICYmIHBlcnNvbi5vZmZpY2UubmFtZX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPiR7c3ViRGl2aXNpb24ocGVyc29uKX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtbGFiZWw9XCJDb250YWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24uZW1haWxzID8gaHRtbGA8YSBocmVmPVwibWFpbHRvOiR7cGVyc29uLmVtYWlscy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5lbWFpbHMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24ucGhvbmVzID8gaHRtbGA8YSBocmVmPVwidGVsOiR7cGVyc29uLnBob25lcy5qb2luKCcsJyl9XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4ke3BlcnNvbi5waG9uZXMuam9pbignLCcpfTwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwZXJzb24udXJscyA/IGh0bWxgPGEgaHJlZj1cIiR7cGVyc29uLnVybHMuam9pbignLCcpfVwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwic2Vjb25kYXJ5XCI+TGluazwvYT5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIGApfVxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICA8L2ZpZ3VyZT5cbiAgICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwiY2l2LXBlb3BsZS1saXN0XCIsXG4gIGNvbXBvbmVudChQZW9wbGVMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UsIG9ic2VydmVkQXR0cmlidXRlczogW10gfSlcbik7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcbmltcG9ydCB7IHJlZiB9IGZyb20gXCJsaXQtaHRtbC9kaXJlY3RpdmVzL3JlZi5qc1wiO1xuXG5mdW5jdGlvbiBNb2RhbCh7XG4gIHRpdGxlID0gXCJcIixcbiAgY29udGVudCA9IG51bGwsIC8vIGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQgb3IgbnVsbFxuICBmb290ZXIgPSBudWxsLCAvLyBhIGxpdC1odG1sIFRlbXBsYXRlUmVzdWx0IG9yIG51bGxcbiAgbW9kYWxQcm9wcyA9IHt9LCAvLyB7IG9wZW4sIG9uQ2xvc2UsIG1vZGFsUmVmLCBjbG9zZU9uQmFja2Ryb3BDbGljayA9IHRydWUsIGFyaWFMYWJlbCB9XG59KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKEJvb2xlYW4obW9kYWxQcm9wcy5vcGVuKSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0T3BlbihCb29sZWFuKG1vZGFsUHJvcHMub3BlbikpO1xuICB9LCBbbW9kYWxQcm9wcy5vcGVuXSk7XG5cbiAgbGV0IGRpYWxvZ0VsID0gbnVsbDtcbiAgY29uc3Qgc2V0RGlhbG9nUmVmID0gKGVsKSA9PiB7XG4gICAgZGlhbG9nRWwgPSBlbDtcbiAgICAvLyBwcm9wYWdhdGUgdG8gYW55IHJlZiBwYXNzZWQgaW4gbW9kYWxQcm9wcyAoc3VwcG9ydHMgY2FsbGJhY2sgb3Igb2JqZWN0IHJlZilcbiAgICBpZiAoIW1vZGFsUHJvcHMubW9kYWxSZWYpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwiZnVuY3Rpb25cIikgbW9kYWxQcm9wcy5tb2RhbFJlZihlbCk7XG4gICAgZWxzZSBpZiAodHlwZW9mIG1vZGFsUHJvcHMubW9kYWxSZWYgPT09IFwib2JqZWN0XCIpIG1vZGFsUHJvcHMubW9kYWxSZWYudmFsdWUgPSBlbDtcbiAgfTtcblxuICBjb25zdCBvbktleSA9IChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gZm9jdXMgdGhlIGRpYWxvZyBzbyBpdCByZWNlaXZlcyBrZXkgZXZlbnRzIHdoZW4gb3BlbmVkXG4gICAgaWYgKG9wZW4gJiYgZGlhbG9nRWwgJiYgdHlwZW9mIGRpYWxvZ0VsLmZvY3VzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRpYWxvZ0VsLmZvY3VzKCk7XG4gICAgfVxuICB9LCBbb3Blbl0pO1xuXG4gIGNvbnN0IGJhY2tkcm9wQ2xpY2sgPSAoZSkgPT4ge1xuICAgIGlmICghbW9kYWxQcm9wcy5jbG9zZU9uQmFja2Ryb3BDbGljayAmJiBtb2RhbFByb3BzLmNsb3NlT25CYWNrZHJvcENsaWNrICE9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBjbGljayBvbiBkaWFsb2cgKGNoaWxkKSBzaG91bGRuJ3QgY2xvc2U7IGNsaWNrIG9uIGJhY2tkcm9wIChkaWFsb2cgZWxlbWVudCkgc2hvdWxkXG4gICAgaWYgKGUudGFyZ2V0ICYmIGUudGFyZ2V0LnRhZ05hbWUgJiYgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRpYWxvZ1wiKSB7XG4gICAgICBtb2RhbFByb3BzLm9uQ2xvc2UgJiYgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICBkaWFsb2dbb3Blbl0ge1xuICAgICAgei1pbmRleDogOTk5OSAhaW1wb3J0YW50O1xuICAgICAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XG4gICAgICBsZWZ0OiAwOyB0b3A6IDA7IHJpZ2h0OiAwOyBib3R0b206IDA7XG4gICAgICBtYXJnaW46IGF1dG87XG4gICAgICAvKiBPcHRpb25hbDogYWRkIGEgc2VtaS10cmFuc3BhcmVudCBiYWNrZ3JvdW5kICovXG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTgpO1xuICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaWFsb2dcbiAgICAgID9vcGVuPSR7b3Blbn1cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgYXJpYS1sYWJlbD0ke21vZGFsUHJvcHMuYXJpYUxhYmVsIHx8IHRpdGxlIHx8IFwiTW9kYWxcIn1cbiAgICAgIEBjbGljaz0ke2JhY2tkcm9wQ2xpY2t9XG4gICAgICBAa2V5ZG93bj0ke29uS2V5fVxuICAgICAgJHtyZWYoc2V0RGlhbG9nUmVmKX1cbiAgICA+XG4gICAgICA8YXJ0aWNsZSBAY2xpY2s9JHsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX0+XG4gICAgICAgICR7dGl0bGVcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxoZWFkZXI+XG4gICAgICAgICAgICAgICAgPGgyPiR7dGl0bGV9PC9oMj5cbiAgICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiBudWxsfVxuXG4gICAgICAgIDxzZWN0aW9uPlxuICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICR7Zm9vdGVyXG4gICAgICAgICAgPyBodG1sYCA8Zm9vdGVyPiR7Zm9vdGVyfTwvZm9vdGVyPiBgXG4gICAgICAgICAgOiBodG1sYFxuICAgICAgICAgICAgICA8Zm9vdGVyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7bW9kYWxQcm9wcy5vbkNsb3NlfSBjbGFzcz1cInNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgYH1cbiAgICAgIDwvYXJ0aWNsZT5cbiAgICA8L2RpYWxvZz5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1tb2RhbFwiLFxuICBjb21wb25lbnQoTW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSxcbik7XG4iLCJpbXBvcnQgeyBjb21wb25lbnQgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IFwiLi4vYmFzaWMvbW9kYWwuanNcIjtcblxuZnVuY3Rpb24gZm10RGF0ZShkKSB7XG4gIGlmICghZCkgcmV0dXJuIFwiXCI7XG4gIGNvbnN0IHAgPSBuZXcgRGF0ZShkKTtcbiAgaWYgKGlzTmFOKHApKSByZXR1cm4gU3RyaW5nKGQpO1xuICByZXR1cm4gYCR7U3RyaW5nKHAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtTdHJpbmcocC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtwLmdldEZ1bGxZZWFyKCl9YDtcbn1cblxuZnVuY3Rpb24gZ2V0RHVyYXRpb25TdHJpbmcoY3JlYXRlZF9hdCwgdXBkYXRlZF9hdCkge1xuICBjb25zdCBkdXJhdGlvbiA9IChuZXcgRGF0ZSh1cGRhdGVkX2F0KSAtIG5ldyBEYXRlKGNyZWF0ZWRfYXQpKSAvIDEwMDA7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKGR1cmF0aW9uIC8gNjApO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5yb3VuZChkdXJhdGlvbiAlIDYwKTtcbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHN9c2A7XG59XG5cbmZ1bmN0aW9uIFNjcmFwZUhpc3RvcnlNb2RhbCh7IG9wZW4sIGpvYiwgb25DbG9zZSB9KSB7XG4gIGlmICgham9iKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8Y2l2LW1vZGFsXG4gICAgICAudGl0bGU9JHtcIlNjcmFwZSBEZXRhaWxzXCJ9XG4gICAgICAuY29udGVudD0ke2h0bWxgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+PHN0cm9uZz5EYXRlIC8gVGltZTo8L3N0cm9uZz4gJHtmbXREYXRlKGpvYi5jcmVhdGVkX2F0KX08L3A+XG4gICAgICAgICAgPHA+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+ICR7am9iLnN0YXR1c308L3A+XG4gICAgICAgICAgPHA+PHN0cm9uZz5Qcm9ncmVzczo8L3N0cm9uZz4gJHtqb2IucHJvZ3Jlc3MgPz8gXCI/XCJ9JTwvcD5cbiAgICAgICAgICA8cD48c3Ryb25nPlRpbWUgdG8gc2NyYXBlOjwvc3Ryb25nPiAke2dldER1cmF0aW9uU3RyaW5nKGpvYi5jcmVhdGVkX2F0LCBqb2IudXBkYXRlZF9hdCl9PC9wPlxuICAgICAgICAgIDxwPjxzdHJvbmc+VVJMcyBzY3JhcGVkOjwvc3Ryb25nPjwvcD5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAke2pvYi5zb3VyY2VfdXJscyAmJiBqb2Iuc291cmNlX3VybHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGpvYi5zb3VyY2VfdXJscy5tYXAoKHVybCkgPT4gaHRtbGA8bGk+PGEgaHJlZj1cIiR7dXJsfVwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyXCI+JHt1cmx9PC9hPjwvbGk+YClcbiAgICAgICAgICAgICAgOiBodG1sYDxsaT48ZW0+Tm8gc291cmNlIFVSTHM8L2VtPjwvbGk+YH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwhLS0gT3B0aW9uYWxseSwgcmVuZGVyIGEgbmV3IGNvbXBvbmVudCBoZXJlIGFuZCBwYXNzIGpvYi5yZXF1ZXN0X2lkIC0tPlxuICAgICAgICAgIDwhLS0gPHB1bGwtcmVxdWVzdC1kZXRhaWxzIC5yZXF1ZXN0SWQ9JHtqb2IucmVxdWVzdF9pZH0+PC9wdWxsLXJlcXVlc3QtZGV0YWlscz4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYH1cbiAgICAgIC5tb2RhbFByb3BzPSR7eyBvcGVuLCBvbkNsb3NlLCBjbG9zZU9uQmFja2Ryb3BDbGljazogdHJ1ZSB9fVxuICAgID48L2Npdi1tb2RhbD5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwiY2l2LXNjcmFwZS1oaXN0b3J5LW1vZGFsXCIsIGNvbXBvbmVudChTY3JhcGVIaXN0b3J5TW9kYWwsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSk7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgXCIuL3NjcmFwZS1oaXN0b3J5LW1vZGFsLmpzXCI7XG5cbmNvbnN0IERVTU1ZX0RBVEEgPSBbXG4gIHsgaWQ6IDEsIG5hbWU6IFwiU2NyYXBlIEpvYiAxXCIsIHN0YXR1czogXCJDb21wbGV0ZWRcIiwgc3RhcnRfZGF0ZTogXCIyMDI0LTAxLTAxXCIsIGR1cmF0aW9uX2luX3M6IDEyMCwgXG4gICAgICAgIHNvdXJjZV91cmxzOiBbXCJodHRwczovL2V4YW1wbGUuY29tXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS8yXCJdLCBwcm9ncmVzczogMTAwIH0sXG4gIHsgaWQ6IDIsIG5hbWU6IFwiU2NyYXBlIEpvYiAyXCIsIHN0YXR1czogXCJJbiBQcm9ncmVzc1wiLCBzdGFydF9kYXRlOiBcIjIwMjQtMDEtMDJcIiwgZHVyYXRpb25faW5fczogMTUwLCBzb3VyY2VfdXJsczogW1wiaHR0cHM6Ly9leGFtcGxlLm9yZ1wiXSwgcHJvZ3Jlc3M6IDUwIH0sXG4gIHsgaWQ6IDMsIG5hbWU6IFwiU2NyYXBlIEpvYiAzXCIsIHN0YXR1czogXCJGYWlsZWRcIiwgc3RhcnRfZGF0ZTogXCIyMDI0LTAxLTAzXCIsIGR1cmF0aW9uX2luX3M6IDkwLCBzb3VyY2VfdXJsczogW10sIHByb2dyZXNzOiAwIH0sXG5dO1xuXG5mdW5jdGlvbiByZW5kZXJQcm9ncmVzc0Jhcihwcm9ncmVzcykge1xuICBpZiAocHJvZ3Jlc3MgPT09IDEwMCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBodG1sYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICA8cHJvZ3Jlc3MgdmFsdWU9JHtwcm9ncmVzcyA/PyAwfSBtYXg9XCIxMDBcIj5cbiAgICAgICAgJHtwcm9ncmVzcyA/PyAwfSVcbiAgICAgIDwvcHJvZ3Jlc3M+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmZ1bmN0aW9uIFNjcmFwZUhpc3RvcnlMaXN0KHsgaGlzdG9yeSwgam9iU3RhdHVzIH0pIHtcbiAgLy8gVXNlIGhpc3RvcnkgYXMgYW4gb2JqZWN0L2FycmF5IGRpcmVjdGx5IChubyBwYXJzaW5nIGlmIHBhc3NlZCBhcyBwcm9wZXJ0eSlcbiAgY29uc3QgaGlzdG9yeURhdGEgPSBKU09OLnBhcnNlKGhpc3RvcnkpXG4gIGxldCBwYXJzZWRIaXN0b3J5ID0gaGlzdG9yeURhdGFbXCJkYXRhXCJdXG5cbiAgLy8gSWYgam9iU3RhdHVzIGlzIHByZXNlbnQgYW5kIG1hdGNoZXMgYSBqb2IsIHVwZGF0ZSB0aGF0IGpvYidzIHByb2dyZXNzL3N0YXR1c1xuICBpZiAoam9iU3RhdHVzICYmIGpvYlN0YXR1cy5yZXF1ZXN0X2lkKSB7XG4gICAgcGFyc2VkSGlzdG9yeSA9IHBhcnNlZEhpc3RvcnkubWFwKGpvYiA9PlxuICAgICAgam9iLnJlcXVlc3RfaWQgPT09IGpvYlN0YXR1cy5yZXF1ZXN0X2lkXG4gICAgICAgID8geyAuLi5qb2IsIHByb2dyZXNzOiBqb2JTdGF0dXMucHJvZ3Jlc3MsIHN0YXR1czogam9iU3RhdHVzLnN0YXR1cyB9XG4gICAgICAgIDogam9iXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzZWxlY3RlZEpvYiwgc2V0U2VsZWN0ZWRKb2JdID0gdXNlU3RhdGUobnVsbCk7XG5cbiAgY29uc3Qgb3BlbkZvciA9IChqb2IpID0+IHtcbiAgICBzZXRTZWxlY3RlZEpvYihqb2IpO1xuICAgIHNldE1vZGFsT3Blbih0cnVlKTtcbiAgfTtcbiAgY29uc3QgY2xvc2VNb2RhbCA9ICgpID0+IHtcbiAgICBzZXRNb2RhbE9wZW4oZmFsc2UpO1xuICAgIHNldFNlbGVjdGVkSm9iKG51bGwpO1xuICB9O1xuXG4gIGNvbnN0IGZtdERhdGUgPSAoZCkgPT4ge1xuICAgIGlmICghZCkgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgcCA9IG5ldyBEYXRlKGQpO1xuICAgIGlmIChpc05hTihwKSkgcmV0dXJuIFN0cmluZyhkKTtcbiAgICByZXR1cm4gYCR7U3RyaW5nKHAuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtTdHJpbmcocC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHtwLmdldEZ1bGxZZWFyKCl9YDtcbiAgfTtcblxuICBjb25zdCBnZXREdXJhdGlvblN0cmluZyA9IChjcmVhdGVkX2F0LCB1cGRhdGVkX2F0KSA9PiB7XG4gICAgY29uc3QgZHVyYXRpb24gPSAobmV3IERhdGUodXBkYXRlZF9hdCkgLSBuZXcgRGF0ZShjcmVhdGVkX2F0KSkgLyAxMDAwO1xuICAgIC8vIEZyaWVuZGx5IGZvcm1hdHRpbmcgdG8gbWludXRlcywgc2Vjb25kcyByb3VuZGVkXG4gICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoZHVyYXRpb24gLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IE1hdGgucm91bmQoZHVyYXRpb24gJSA2MCk7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3NlY29uZHN9c2A7XG4gIH1cblxuICBpZiAoIXBhcnNlZEhpc3RvcnkgfHwgcGFyc2VkSGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaHRtbGA8cD5ObyBzY3JhcGUgaGlzdG9yeSBhdmFpbGFibGUuPC9wPmA7XG4gIH1cblxuICByZXR1cm4gaHRtbGBcbiAgICA8c3R5bGU+XG4gICAgICB1bC5saXN0IHsgXG4gICAgICAgIHBhZGRpbmc6IDA7IFxuICAgICAgICBtYXJnaW46IDA7IFxuICAgICAgICBtYXgtaGVpZ2h0OiAzMDBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgcGFkZGluZy1yaWdodDogMXJlbTtcbiAgICAgIH1cbiAgICAgIHVsIGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyB9XG4gICAgICAuaXRlbSB7IHBhZGRpbmc6IDAuNXJlbSAwOyB9XG4gICAgICAucm93IHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bzsgZ2FwOiAwLjc1cmVtOyBhbGlnbi1pdGVtczogY2VudGVyOyB9XG4gICAgICAuYnRuIHsgYWxsOiB1bnNldDsgY3Vyc29yOiBwb2ludGVyOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9XG4gICAgICAucGlsbCB7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtOyBib3JkZXItcmFkaXVzOiA5OTlweDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjA0KTsgZm9udC1zaXplOiAwLjlyZW07IH1cbiAgICAgIC5waWxsLmNvbXBsZXRlZCB7IGJhY2tncm91bmQ6ICNlNmY5ZWE7IGNvbG9yOiAjMTE3YTJkOyB9XG4gICAgICAucGlsbC5pbi1wcm9ncmVzcyB7IGJhY2tncm91bmQ6ICNmZmY3ZTY7IGNvbG9yOiAjOTk2NjBiOyB9XG4gICAgICAucGlsbC5mYWlsZWQgeyBiYWNrZ3JvdW5kOiAjZmZlY2VjOyBjb2xvcjogIzliMWYxZjsgfVxuICAgICAgLnByb2dyZXNzLWJhci1jb250YWluZXIgeyBtYXJnaW4tdG9wOiAwLjVyZW07IH1cbiAgICAgIHByb2dyZXNzIHsgd2lkdGg6IDEwMCU7IH1cbiAgICA8L3N0eWxlPlxuXG4gICAgPHVsIGNsYXNzPVwibGlzdFwiPlxuICAgICAgJHtwYXJzZWRIaXN0b3J5Lm1hcChcbiAgICAgICAgKGpvYikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NsYXNzID0gam9iLnN0YXR1cyA/IGpvYi5zdGF0dXMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKSA6IFwiXCI7XG4gICAgICAgICAgcmV0dXJuIGh0bWxgXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJpdGVtXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgQGNsaWNrPSR7KCkgPT4gb3BlbkZvcihqb2IpfT5cbiAgICAgICAgICAgICAgICAgICR7Zm10RGF0ZShqb2IuY3JlYXRlZF9hdCl9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdj48c3BhbiBjbGFzcz1cInBpbGwgJHtzdGF0dXNDbGFzc31cIj4ke2pvYi5zdGF0dXN9PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgJHtyZW5kZXJQcm9ncmVzc0Jhcihqb2IucHJvZ3Jlc3MpfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICApfVxuICAgIDwvdWw+XG5cbiAgICA8aHIgLz5cblxuICAgIDxjaXYtc2NyYXBlLWhpc3RvcnktbW9kYWxcbiAgICAgIC5vcGVuPSR7bW9kYWxPcGVufVxuICAgICAgLmpvYj0ke3NlbGVjdGVkSm9ifVxuICAgICAgLm9uQ2xvc2U9JHtjbG9zZU1vZGFsfVxuICAgID48L2Npdi1zY3JhcGUtaGlzdG9yeS1tb2RhbD5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwiY2l2LXNjcmFwZS1oaXN0b3J5LWxpc3RcIiwgY29tcG9uZW50KFNjcmFwZUhpc3RvcnlMaXN0LCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSkpOyIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgdXNlUmVmfSAgZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcblxuZnVuY3Rpb24gQ2l2U2VsZWN0SnVyaXNkaWN0aW9uKCkge1xuICBjb25zdCBbc3RhdGVzLCBzZXRTdGF0ZXNdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbanVyaXNkaWN0aW9ucywgc2V0SnVyaXNkaWN0aW9uc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtqdXJpc2RpY3Rpb25zTWV0YWRhdGEsIHNldEp1cmlzZGljdGlvbnNNZXRhZGF0YV0gPSB1c2VTdGF0ZSh7fSk7XG4gIGNvbnN0IFtzZWxlY3RlZFN0YXRlLCBzZXRTZWxlY3RlZFN0YXRlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbc2VsZWN0ZWRKdXJpc2RpY3Rpb24sIHNldFNlbGVjdGVkSnVyaXNkaWN0aW9uXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbanVyaXNkaWN0aW9uSW5wdXRWYWx1ZSwgc2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICBjb25zdCBpc0luaXRpYWxNb3VudCA9IHVzZVJlZih0cnVlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0luaXRpYWxNb3VudC5jdXJyZW50KSB7XG4gICAgICBpc0luaXRpYWxNb3VudC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICByZXR1cm47IFxuICAgIH1cbiAgICAvLyBDYWxsIHRoZSBoYW5kbGVyIHdpdGggdGhlIGN1cnJlbnQgc2VsZWN0aW9uc1xuICAgIGhhbmRsZUlucHV0Q2hhbmdlKHNlbGVjdGVkU3RhdGUsIHNlbGVjdGVkSnVyaXNkaWN0aW9uKTtcbiAgfSwgW3NlbGVjdGVkU3RhdGUsIHNlbGVjdGVkSnVyaXNkaWN0aW9uXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIEZldGNoIHN0YXRlcyBmcm9tIGJhY2tlbmQgcHJveHkgKG5vIGF1dGggaGVhZGVyIG5lZWRlZClcbiAgICBmZXRjaChcIi9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnMvc3RhdGVzXCIpXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHNldFN0YXRlcyhkYXRhLmRhdGEgfHwgW10pKTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0SnVyaXNkaWN0aW9ucyhbXSk7XG4gICAgc2V0SnVyaXNkaWN0aW9uc01ldGFkYXRhKHt9KTtcbiAgICBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbihcIlwiKTtcbiAgICBzZXRKdXJpc2RpY3Rpb25JbnB1dFZhbHVlKFwiXCIpO1xuXG4gICAgaWYgKCFzZWxlY3RlZFN0YXRlKSByZXR1cm47XG4gICAgXG4gICAgLy8gRmV0Y2gganVyaXNkaWN0aW9ucyBmb3Igc2VsZWN0ZWQgc3RhdGUgKG5vIGF1dGggaGVhZGVyIG5lZWRlZClcbiAgICBoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyhcIlwiKTtcbiAgfSwgW3NlbGVjdGVkU3RhdGVdKTtcblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChzdGF0ZSwganVyaXNkaWN0aW9uT2NkaWQpID0+IHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoXCJzZWxlY3QtanVyaXNkaWN0aW9uLWNoYW5nZVwiLCB7XG4gICAgICAgIGRldGFpbDogeyBzdGF0ZSwganVyaXNkaWN0aW9uX29jZGlkOiBqdXJpc2RpY3Rpb25PY2RpZCB9LFxuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUp1cmlzZGljdGlvblN1Z2dlc3Rpb25zID0gKGRldGFpbCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gZGV0YWlsLnF1ZXJ5IHx8IFwiXCI7XG4gICAgY29uc3QgcGFnZSA9IGRldGFpbC5wYWdlIHx8IDE7XG4gICAgY29uc3QgcGFnZVNpemUgPSBkZXRhaWwucGFnZVNpemUgfHwgMjU7XG4gICAgZmV0Y2goYC9hcGkvYXBpX3Byb3h5L2p1cmlzZGljdGlvbnMvJHtzZWxlY3RlZFN0YXRlfS9zZWFyY2g/c2VhcmNoX3N0cmluZz0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmxpbWl0PSR7cGFnZVNpemV9JnBhZ2U9JHtwYWdlfWApXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgc2V0SnVyaXNkaWN0aW9ucyhkYXRhLmRhdGEgfHwgW10pO1xuICAgICAgICBzZXRKdXJpc2RpY3Rpb25zTWV0YWRhdGEoe1xuICAgICAgICAgIHRvdGFsX2l0ZW1zOiBkYXRhLnRvdGFsX2l0ZW1zLFxuICAgICAgICAgIHRvdGFsX3BhZ2VzOiBkYXRhLnRvdGFsX3BhZ2VzLFxuICAgICAgICAgIHBhZ2U6IGRhdGEucGFnZSxcbiAgICAgICAgICBsaW1pdDogZGF0YS5saW1pdCxcbiAgICAgICAgICBsaW5rczogZGF0YS5saW5rc1xuICAgICAgICB9KVxuICAgICAgfSk7IFxuICB9XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0Q2xpY2sgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGp1cmlzZGljdGlvbl9kYXRhID0ganVyaXNkaWN0aW9ucy5maW5kKGp1ciA9PiBqdXIuaWQgPT09IHNlbGVjdGVkSnVyaXNkaWN0aW9uKTtcbiAgICBjb25zdCBqdXJpc2RpY3Rpb25fb2NkaWRfc2x1ZyA9IGp1cmlzZGljdGlvbl9kYXRhW1wianVyaXNkaWN0aW9uX29jZGlkX3NsdWdcIl07XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgL2p1cmlzZGljdGlvbnMvJHtqdXJpc2RpY3Rpb25fb2NkaWRfc2x1Z31gO1xuICB9XG5cbiAgY29uc3QganVyaXNkaWN0aW9uTGluayA9ICgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkSnVyaXNkaWN0aW9uKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoIWp1cmlzZGljdGlvbnMpIHJldHVybiBcIlwiO1xuXG4gICAgY29uc3QganVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWQgPSBlbmNvZGVVUklDb21wb25lbnQoc2VsZWN0ZWRKdXJpc2RpY3Rpb24pXG4gICAgcmV0dXJuIGp1cmlzZGljdGlvbk9jZGlkRm9ybWF0dGVkID8gYC9qdXJpc2RpY3Rpb25zP2p1cmlzZGljdGlvbl9vY2RpZD0ke2p1cmlzZGljdGlvbk9jZGlkRm9ybWF0dGVkfWAgOiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGZvcm0gXG4gICAgICBjbGFzcz1cImdyaWRcIiBcbiAgICAgIHN0eWxlPVwiZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAyZnI7IGdhcDogMXJlbTtcIlxuICAgICAgb25zdWJtaXQ9XCJyZXR1cm4gZmFsc2U7XCJcbiAgICA+XG4gICAgICA8bGFiZWwgZm9yPVwic3RhdGUtc2VsZWN0XCIgY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj5TdGF0ZTo8L2xhYmVsPlxuICAgICAgPHNlbGVjdFxuICAgICAgICBpZD1cInN0YXRlLXNlbGVjdFwiXG4gICAgICAgIC52YWx1ZT0ke3NlbGVjdGVkU3RhdGV9XG4gICAgICAgIEBjaGFuZ2U9JHsoZSkgPT4gc2V0U2VsZWN0ZWRTdGF0ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgIHJlcXVpcmVkXG4gICAgICA+XG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBzdGF0ZTwvb3B0aW9uPlxuICAgICAgICAke3N0YXRlcy5tYXAoXG4gICAgICAgICAgKHN0YXRlKSA9PiBodG1sYDxvcHRpb24gdmFsdWU9JHtzdGF0ZX0+JHtzdGF0ZX08L29wdGlvbj5gXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cbiAgICAgIDxjaXYtYXV0b2NvbXBsZXRlLXNlbGVjdFxuICAgICAgICBpZD1cImp1cmlzZGljdGlvbi1hdXRvY29tcGxldGVcIlxuICAgICAgICAuZGlzYWJsZWQ9JHshc2VsZWN0ZWRTdGF0ZX1cbiAgICAgICAgLmlucHV0VmFsdWU9JHtqdXJpc2RpY3Rpb25JbnB1dFZhbHVlfVxuICAgICAgICAub3B0aW9ucz0ke2p1cmlzZGljdGlvbnMubWFwKGp1ciA9PiAoeyBsYWJlbDoganVyLm5hbWUsIHZhbHVlOiBqdXIuaWQgfSkpfVxuICAgICAgICAub3B0aW9uc01ldGFkYXRhPSR7anVyaXNkaWN0aW9uc01ldGFkYXRhfVxuICAgICAgICAucGFnZVNpemU9JHsyNX1cbiAgICAgICAgQGZldGNoLXN1Z2dlc3Rpb25zPSR7KGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSBlLmRldGFpbDtcbiAgICAgICAgICBoYW5kbGVKdXJpc2RpY3Rpb25TdWdnZXN0aW9ucyhkZXRhaWwpO1xuICAgICAgICB9fVxuICAgICAgICBAaW5wdXQtY2hhbmdlPSR7KGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7dmFsdWUsIGl0ZW19ID0gZS5kZXRhaWw7XG4gICAgICAgICAgc2V0SnVyaXNkaWN0aW9uSW5wdXRWYWx1ZSh2YWx1ZSlcbiAgICAgICAgICBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbihpdGVtID8gaXRlbS52YWx1ZSA6IFwiXCIpO1xuICAgICAgICB9fVxuICAgICAgICBAaXRlbS1zZWxlY3RlZD0keyhlKSA9PiBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbihlLmRldGFpbC52YWx1ZSl9XG4gICAgICA+PC9jaXYtYXV0b2NvbXBsZXRlLXNlbGVjdD5cbiAgICAgIDwhLS0gY29tbWVudCBvdXQgc3VibWl0IGJ1dHRvbiBmb3Igbm93LlxuICAgICAgPGJ1dHRvbiBcbiAgICAgICAgdHlwZT1cInN1Ym1pdFwiIFxuICAgICAgICBAY2xpY2s9JHtoYW5kbGVTdWJtaXRDbGlja30gXG4gICAgICAgID9kaXNhYmxlZD0keyFzZWxlY3RlZEp1cmlzZGljdGlvbn0+U3VibWl0PC9idXR0b24+XG4gICAgICAtLT5cbiAgICAgIDxhIGhyZWY9XCIke2p1cmlzZGljdGlvbkxpbmsoKX1cIiA/aGlkZGVuPSR7IXNlbGVjdGVkSnVyaXNkaWN0aW9ufT5cbiAgICAgICAgR28gdG8ganVyaXNkaWN0aW9uIHBhZ2VcbiAgICAgIDwvYT5cbiAgICA8L2Zvcm0+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJjaXYtc2VsZWN0LWp1cmlzZGljdGlvblwiLFxuICBjb21wb25lbnQoQ2l2U2VsZWN0SnVyaXNkaWN0aW9uLCB7IHVzZVNoYWRvd0RPTTogZmFsc2UsIG9ic2VydmVkQXR0cmlidXRlczogW10gfSlcbik7XG5cblxuIiwiaW1wb3J0IHsgdXNlTWVtbyB9IGZyb20gXCIuL3VzZS1tZW1vXCI7XG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICAgIHJldHVybiB1c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIGN1cnJlbnQ6IGluaXRpYWxWYWx1ZSxcbiAgICB9KSwgW10pO1xufVxuIiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcblxuZnVuY3Rpb24gU2VhcmNoSnVyaXNkaWN0aW9ucygpIHtcbiAgY29uc3QgW3NlbGVjdGVkU3RhdGUsIHNldFNlbGVjdGVkU3RhdGVdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkLCBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkXSA9XG4gICAgdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwZW9wbGUsIHNldFBlb3BsZV0gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtnZW9qc29uLCBzZXRHZW9qc29uXSA9IHVzZVN0YXRlKFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZEVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICBzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkLFxuICAgICk7XG5cbiAgICBmZXRjaChcbiAgICAgIGAvYXBpL2FwaV9wcm94eS9wZW9wbGU/anVyaXNkaWN0aW9uX29jZGlkPSR7c2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZEVuY29kZWR9YCxcbiAgICApXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIHNldFBlb3BsZShkYXRhLmRhdGEpO1xuICAgICAgfSk7XG4gIH0sIFtzZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0SnVyaXNkaWN0aW9uQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSwganVyaXNkaWN0aW9uX29jZGlkIH0gPSBldmVudC5kZXRhaWw7XG4gICAgY29uc29sZS5sb2coXCJTZWxlY3RlZCBTdGF0ZTpcIiwgc3RhdGUpO1xuICAgIHNldFNlbGVjdGVkU3RhdGUoc3RhdGUpO1xuICAgIC8vIFRPRE86IHBhbiB0aGUgbWFwIGlmIHN0YXRlIGJ1dCBubyBqdXJpc2RpY3Rpb25cbiAgICBjb25zb2xlLmxvZyhcIlNlbGVjdGVkIEp1cmlzZGljdGlvbjpcIiwganVyaXNkaWN0aW9uX29jZGlkKTtcbiAgICBzZXRTZWxlY3RlZEp1cmlzZGljdGlvbk9jZGlkKGp1cmlzZGljdGlvbl9vY2RpZCk7XG4gICAgLy8gVE9ETzogcGFuIHRoZSBtYXAgJiB6b29tIGlmIHN0YXRlIGFuZCBqdXJpc2RpY3Rpb25cbiAgfTtcblxuICBjb25zdCBoYW5kbGVNYXBDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGxhdGxuZywgem9vbSB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGlmICghbGF0bG5nIHx8ICF6b29tKSByZXR1cm47XG4gICAgY29uc29sZS5sb2coXCJNYXAgQ2hhbmdlIC0gTGF0TG5nOlwiLCBsYXRsbmcsIFwiWm9vbTpcIiwgem9vbSk7XG4gICAgZmV0Y2goXG4gICAgICBgL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucy9nZW9qc29uP2xhdD0ke2xhdGxuZy5sYXR9Jmxvbmc9JHtsYXRsbmcubG5nfSZ6b29tPSR7em9vbX1gLFxuICAgIClcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgc2V0R2VvanNvbihkYXRhKTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJyZW07XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxjaXYtbWFwXG4gICAgICAgICAgICBAb24tbWFwLWNoYW5nZT0ke2hhbmRsZU1hcENoYW5nZX1cbiAgICAgICAgICAgIEBvbi1qdXJpc2RpY3Rpb24tY2hhbmdlPSR7aGFuZGxlU2VsZWN0SnVyaXNkaWN0aW9uQ2hhbmdlfVxuICAgICAgICAgICAgLmdlb2pzb249JHtnZW9qc29ufVxuICAgICAgICAgID48L2Npdi1tYXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Y2l2LXNlbGVjdC1qdXJpc2RpY3Rpb25cbiAgICAgICAgICBAc2VsZWN0LWp1cmlzZGljdGlvbi1jaGFuZ2U9JHtoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2V9XG4gICAgICAgID48L2Npdi1zZWxlY3QtanVyaXNkaWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8Y2l2LXBlb3BsZS1saXN0IC5sb2NhbD0ke3Blb3BsZX0+PC9jaXYtcGVvcGxlLWxpc3Q+XG4gICAgPC9kaXY+XG5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1zZWFyY2gtanVyaXNkaWN0aW9uc1wiLFxuICBjb21wb25lbnQoU2VhcmNoSnVyaXNkaWN0aW9ucywge1xuICAgIHVzZVNoYWRvd0RPTTogZmFsc2UsXG4gICAgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBbXSxcbiAgfSksXG4pO1xuIiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcImhhdW50ZWRcIjtcbmltcG9ydCB7IGh0bWwgfSBmcm9tIFwibGl0LWh0bWxcIjtcblxuZnVuY3Rpb24gUGljb0NoaXBzSW5wdXQoeyB2YWx1ZSA9IFtdLCBvbkNoYW5nZSwgcGxhY2Vob2xkZXIgPSBcIkFkZC4uLlwiIH0pIHtcbiAgY29uc3QgW2NoaXBzLCBzZXRDaGlwc10gPSB1c2VTdGF0ZSh2YWx1ZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRDaGlwcyh2YWx1ZSk7XG4gIH0sIFt2YWx1ZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25DaGFuZ2UgJiYgb25DaGFuZ2UoY2hpcHMpO1xuICB9LCBbY2hpcHNdKTtcblxuICBjb25zdCBoYW5kbGVBZGQgPSAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBpbnB1dCA9IGUudGFyZ2V0LmVsZW1lbnRzW1wiY2hpcC1pbnB1dFwiXTtcbiAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKHZhbCAmJiAhY2hpcHMuaW5jbHVkZXModmFsKSkge1xuICAgICAgc2V0Q2hpcHMoWy4uLmNoaXBzLCB2YWxdKTtcbiAgICB9XG4gICAgaW5wdXQudmFsdWUgPSBcIlwiO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJlbW92ZSA9IChpZHgpID0+IHtcbiAgICBzZXRDaGlwcyhjaGlwcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGlkeCkpO1xuICB9O1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIC5waWNvLWNoaXBzLXJvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgICAgZ2FwOiAwLjVlbTtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07XG4gICAgICB9XG4gICAgICAucGljby1jaGlwLWJ0biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1waWNvLXByaW1hcnktYmFja2dyb3VuZCwgI2UwZThmMyk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXBpY28tcHJpbWFyeSwgIzI2NDQ3OCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJlbTtcbiAgICAgICAgcGFkZGluZzogMC4xOGVtIDAuN2VtIDAuMThlbSAwLjdlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjk3ZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5waWNvLWNoaXAtYnRuIC5jbG9zZS14IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDAuNWVtO1xuICAgICAgICBmb250LXNpemU6IDEuMWVtO1xuICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuICAgICAgLnBpY28tY2hpcC1idG4gLmNsb3NlLXg6aG92ZXIge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgfVxuICAgICAgLnBpY28tY2hpcHMtcm93IGlucHV0W3R5cGU9XCJ0ZXh0XCJdIHtcbiAgICAgICAgbWluLXdpZHRoOiAxMDBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IsICNlMGUwZTApO1xuICAgICAgICBwYWRkaW5nOiAwLjI1ZW0gMC43NWVtO1xuICAgICAgICBmb250LXNpemU6IDFlbTtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyIDAuMnM7XG4gICAgICB9XG4gICAgICAucGljby1jaGlwcy1yb3cgaW5wdXRbdHlwZT1cInRleHRcIl06Zm9jdXMge1xuICAgICAgICBib3JkZXI6IDEuNXB4IHNvbGlkIHZhcigtLXBpY28tcHJpbWFyeSwgIzBkNmVmZCk7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwicGljby1jaGlwcy1yb3dcIj5cbiAgICAgICR7Y2hpcHMubWFwKFxuICAgICAgICAoY2hpcCwgaSkgPT4gaHRtbGBcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGljby1jaGlwLWJ0blwiXG4gICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBoYW5kbGVSZW1vdmUoaSl9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlICR7Y2hpcH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuPiR7Y2hpcH08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLXhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICBgXG4gICAgICApfVxuICAgICAgPGZvcm0gQHN1Ym1pdD0ke2hhbmRsZUFkZH0gc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmU7XCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG5hbWU9XCJjaGlwLWlucHV0XCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9JHtwbGFjZWhvbGRlcn1cbiAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAvPlxuICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICBgO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gIFwicGljby1jaGlwcy1pbnB1dFwiLFxuICBjb21wb25lbnQoUGljb0NoaXBzSW5wdXQsIHsgdXNlU2hhZG93RE9NOiBmYWxzZSB9KVxuKTsiLCJpbXBvcnQgeyBjb21wb25lbnQsIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IFwiLi4vLi4vYmFzaWMvY2hpcC5qc1wiXG5cbmZ1bmN0aW9uIE5hbWVDb25maWdGb3JtKHsgb25DaGFuZ2UsIGlkZW50aXRpZXMgPSB7fSB9KSB7XG4gIGNvbnN0IFtjb25maWdzLCBzZXRDb25maWdzXSA9IHVzZVN0YXRlKHsgLi4uaWRlbnRpdGllcyB9KTtcbiAgY29uc3QgW25ld0lkZW50aXR5LCBzZXROZXdJZGVudGl0eV0gPSB1c2VTdGF0ZShcIlwiKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldENvbmZpZ3MoeyAuLi5pZGVudGl0aWVzIH0pO1xuICB9LCBbaWRlbnRpdGllc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgb25DaGFuZ2UoY29uZmlncyk7XG4gIH0sIFtjb25maWdzLCBvbkNoYW5nZV0pO1xuXG4gIGNvbnN0IGhhbmRsZUFkZElkZW50aXR5ID0gKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgbmFtZSA9IG5ld0lkZW50aXR5LnRyaW0oKTtcbiAgICBpZiAobmFtZSAmJiAhY29uZmlnc1tuYW1lXSkge1xuICAgICAgc2V0Q29uZmlncygocHJldikgPT4gKHsgLi4ucHJldiwgW25hbWVdOiBbXSB9KSk7XG4gICAgICBzZXROZXdJZGVudGl0eShcIlwiKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdj5cbiAgICAgICR7T2JqZWN0LmtleXMoY29uZmlncykubWFwKFxuICAgICAgICAoaWRlbnRpdHkpID0+IGh0bWxgXG4gICAgICAgICAgPGZpZWxkc2V0IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMWVtO1wiPlxuICAgICAgICAgICAgPGxhYmVsPiR7aWRlbnRpdHl9PC9sYWJlbD5cbiAgICAgICAgICAgIDxwaWNvLWNoaXBzLWlucHV0XG4gICAgICAgICAgICAgIC52YWx1ZT0ke2NvbmZpZ3NbaWRlbnRpdHldIHx8IFtdfVxuICAgICAgICAgICAgICAub25DaGFuZ2U9JHsoY2hpcHMpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRDb25maWdzKChwcmV2KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgICAgIFtpZGVudGl0eV06IGNoaXBzLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBZGQgYWx0ZXJuYXRlIG5hbWUuLi5cIlxuICAgICAgICAgICAgPjwvcGljby1jaGlwcy1pbnB1dD5cbiAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICBgXG4gICAgICApfVxuICAgICAgPGZvcm0gQHN1Ym1pdD0ke2hhbmRsZUFkZElkZW50aXR5fSBzdHlsZT1cIm1hcmdpbi10b3A6IDFlbTsgZGlzcGxheTogZmxleDsgZ2FwOiAwLjVlbTtcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgIC52YWx1ZT0ke25ld0lkZW50aXR5fVxuICAgICAgICAgIEBpbnB1dD0keyhlKSA9PiBzZXROZXdJZGVudGl0eShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJBZGQgaWRlbnRpdHkgbmFtZS4uLlwiXG4gICAgICAgICAgc3R5bGU9XCJmbGV4OiAxO1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwic2Vjb25kYXJ5XCI+QWRkIElkZW50aXR5PC9idXR0b24+XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJuYW1lLWNvbmZpZy1mb3JtXCIsXG4gIGNvbXBvbmVudChOYW1lQ29uZmlnRm9ybSwgeyB1c2VTaGFkb3dET006IGZhbHNlIH0pXG4pOyIsImltcG9ydCB7IGNvbXBvbmVudCwgdXNlU3RhdGUgfSBmcm9tIFwiaGF1bnRlZFwiO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gXCJsaXQtaHRtbFwiO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSBcImxpdC1odG1sL2RpcmVjdGl2ZXMvcmVmLmpzXCI7XG5pbXBvcnQgXCIuLi8uLi9iYXNpYy9tb2RhbC5qc1wiO1xuXG5mdW5jdGlvbiBTY3JhcGVNb2RhbCh7IG9uU3RhcnRTY3JhcGUsIHVybCA9IFwiXCIsIHNvdXJjZVVybHMgPSBbXSwgbW9kYWxQcm9wcyA9IHt9LCBpZGVudGl0aWVzID0ge30gfSkge1xuICBjb25zdCBbc2NyYXBlU2NvcGUsIHNldFNjcmFwZVNjb3BlXSA9IHVzZVN0YXRlKFwidG9wLWxldmVsLXVybFwiKTtcbiAgY29uc3QgW2N1cnJlbnRVcmwsIHNldEN1cnJlbnRVcmxdID0gdXNlU3RhdGUodXJsKTtcbiAgY29uc3QgW2N1cnJlbnRTb3VyY2VVcmxzLCBzZXRDdXJyZW50U291cmNlVXJsc10gPSB1c2VTdGF0ZShzb3VyY2VVcmxzKTtcbiAgY29uc3QgW25hbWVDb25maWdzLCBzZXROYW1lQ29uZmlnc10gPSB1c2VTdGF0ZSh7fSk7XG5cbiAgY29uc3QgaGFuZGxlTmFtZUNvbmZpZ3NDaGFuZ2UgPSAoY29uZmlncykgPT4ge1xuICAgIHNldE5hbWVDb25maWdzKGNvbmZpZ3MpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjb3BlQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgc2V0U2NyYXBlU2NvcGUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCByZXNldFVybCA9ICgpID0+IHtcbiAgICBzZXRDdXJyZW50VXJsKHVybCk7XG4gIH07XG5cbiAgY29uc3QgYWRkU291cmNlVXJsID0gKCkgPT4ge1xuICAgIHNldEN1cnJlbnRTb3VyY2VVcmxzKFsuLi5jdXJyZW50U291cmNlVXJscywgXCJcIl0pO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZVNvdXJjZVVybCA9IChpbmRleCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRVcmxzID0gY3VycmVudFNvdXJjZVVybHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgc2V0Q3VycmVudFNvdXJjZVVybHModXBkYXRlZFVybHMpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVVybENoYW5nZSA9IChldmVudCkgPT4ge1xuICAgIHNldEN1cnJlbnRVcmwoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTb3VyY2VVcmxDaGFuZ2UgPSAoaW5kZXgsIGV2ZW50KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFVybHMgPSBbLi4uY3VycmVudFNvdXJjZVVybHNdO1xuICAgIHVwZGF0ZWRVcmxzW2luZGV4XSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICBzZXRDdXJyZW50U291cmNlVXJscyh1cGRhdGVkVXJscyk7XG4gIH07XG5cbiAgY29uc3QgaXNWYWxpZFVybCA9ICh1cmxTdHJpbmcpID0+IHtcbiAgICBpZiAoIXVybFN0cmluZyB8fCB1cmxTdHJpbmcudHJpbSgpID09PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwodXJsU3RyaW5nKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjdXJyZW50VXJsSXNWYWxpZCA9ICgpID0+IHtcbiAgICByZXR1cm4gaXNWYWxpZFVybChjdXJyZW50VXJsKTtcbiAgfTtcblxuICBjb25zdCBjdXJyZW50U291cmNlVXJsc1ZhbGlkID0gKCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjdXJyZW50U291cmNlVXJscy5sZW5ndGggPiAwICYmXG4gICAgICBjdXJyZW50U291cmNlVXJscy5ldmVyeSgodXJsKSA9PiBpc1ZhbGlkVXJsKHVybCkpXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBjYW5TdGFydFNjcmFwZSA9XG4gICAgc2NyYXBlU2NvcGUgPT09IFwidG9wLWxldmVsLXVybFwiXG4gICAgICA/IGN1cnJlbnRVcmxJc1ZhbGlkKClcbiAgICAgIDogY3VycmVudFNvdXJjZVVybHNWYWxpZCgpO1xuXG4gIGNvbnN0IHN1Ym1pdFNjcmFwZSA9ICgpID0+IHtcbiAgICBsZXQgZGF0YSA9IHt9O1xuICAgIGlmIChzY3JhcGVTY29wZSA9PSBcInRvcC1sZXZlbC11cmxcIikge1xuICAgICAgZGF0YSA9IHtcbiAgICAgICAgc2NyYXBlU2NvcGUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB1cmw6IGN1cnJlbnRVcmwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0ge1xuICAgICAgICBzY3JhcGVTY29wZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHNvdXJjZVVybHM6IGN1cnJlbnRTb3VyY2VVcmxzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgZGF0YS5pZGVudGl0aWVzID0gbmFtZUNvbmZpZ3M7XG4gICAgb25TdGFydFNjcmFwZShkYXRhKTtcbiAgfTtcblxuICBjb25zdCBjb250ZW50ID0gaHRtbGBcbiAgICA8ZmllbGRzZXQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgaWQ9XCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgICAgbmFtZT1cInNjcmFwZS1zY29wZVwiXG4gICAgICAgIHZhbHVlPVwidG9wLWxldmVsLXVybFwiXG4gICAgICAgID9jaGVja2VkPSR7c2NyYXBlU2NvcGUgPT09IFwidG9wLWxldmVsLXVybFwifVxuICAgICAgICBAY2hhbmdlPSR7aGFuZGxlU2NvcGVDaGFuZ2V9XG4gICAgICAvPlxuICAgICAgPGxhYmVsIGZvcj1cInRvcC1sZXZlbC11cmxcIj5Ub3AtbGV2ZWwgVVJMIG9ubHk8L2xhYmVsPlxuXG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgaWQ9XCJzcGVjaWZpYy11cmxzXCJcbiAgICAgICAgbmFtZT1cInNjcmFwZS1zY29wZVwiXG4gICAgICAgIHZhbHVlPVwic3BlY2lmaWMtdXJsc1wiXG4gICAgICAgID9jaGVja2VkPSR7c2NyYXBlU2NvcGUgPT09IFwic3BlY2lmaWMtdXJsc1wifVxuICAgICAgICBAY2hhbmdlPSR7aGFuZGxlU2NvcGVDaGFuZ2V9XG4gICAgICAvPlxuICAgICAgPGxhYmVsIGZvcj1cInNwZWNpZmljLXVybHNcIj5TcGVjaWZpYyBVUkxzPC9sYWJlbD5cbiAgICA8L2ZpZWxkc2V0PlxuXG4gICAgJHtzY3JhcGVTY29wZSA9PT0gXCJ0b3AtbGV2ZWwtdXJsXCJcbiAgICAgID8gaHRtbGBcbiAgICAgICAgICA8ZmllbGRzZXQgcm9sZT1cImdyb3VwXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgICAgIC52YWx1ZT1cIiR7Y3VycmVudFVybH1cIlxuICAgICAgICAgICAgICBAaW5wdXQ9JHtoYW5kbGVVcmxDaGFuZ2V9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vjb25kYXJ5IG91dGxpbmVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiBhdXRvO1wiXG4gICAgICAgICAgICAgIEBjbGljaz0ke3Jlc2V0VXJsfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXNldCBVUkxcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgXG4gICAgICA6IGh0bWxgXG4gICAgICAgICAgJHtjdXJyZW50U291cmNlVXJscy5tYXAoXG4gICAgICAgICAgICAodXJsLCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPGZpZWxkc2V0IHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgICAgICAgICBAaW5wdXQ9JHsoZSkgPT4gaGFuZGxlU291cmNlVXJsQ2hhbmdlKGluZGV4LCBlKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWNvbmRhcnkgb3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiByZW1vdmVTb3VyY2VVcmwoaW5kZXgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICApfVxuICAgICAgICAgIDxidXR0b24gQGNsaWNrPSR7YWRkU291cmNlVXJsfT5BZGQgVVJMPC9idXR0b24+XG4gICAgICAgIGB9XG5cbiAgICA8ZGV0YWlscyBuYW1lPVwib3ZlcnJpZGUtbmFtZXNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEuNWVtO1wiPlxuICAgICAgPHN1bW1hcnk+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxLjFlbTtcIj5OYW1lIENvbmZpZ3M8L3NwYW4+XG4gICAgICA8L3N1bW1hcnk+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGljby1tdXRlZC1ib3JkZXItY29sb3IsICNmNmY4ZmEpO1xuICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXBpY28tbXV0ZWQtYm9yZGVyLWNvbG9yLCAjZTBlMGUwKTtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1ZW07XG4gICAgICAgICAgcGFkZGluZzogMS4yNWVtIDFlbSAxZW0gMWVtO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDFlbTtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA4cHggMCByZ2JhKDAsMCwwLDAuMDMpO1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8cCBzdHlsZT1cImNvbG9yOiB2YXIoLS1waWNvLW11dGVkLWNvbG9yLCAjNjY2KTsgbWFyZ2luLWJvdHRvbTogMWVtO1wiPlxuICAgICAgICAgIFNvbWUgcGVvcGxlIGdvIGJ5IG11bHRpcGxlIG5hbWVzIHRoYXQgYXJlbid0IGVhc2lseSBndWVzc2FibGUgdG8gYmVcbiAgICAgICAgICB0aGUgc2FtZSBpZGVudGl0eS4gU3BlY2lmeSBhbHRlcm5hdGUgbmFtZXMgZm9yIGlkZW50aXRpZXMgdG8gaW1wcm92ZVxuICAgICAgICAgIG1hdGNoaW5nLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxuYW1lLWNvbmZpZy1mb3JtXG4gICAgICAgICAgLm9uQ2hhbmdlPSR7aGFuZGxlTmFtZUNvbmZpZ3NDaGFuZ2V9XG4gICAgICAgICAgLmlkZW50aXRpZXM9JHtpZGVudGl0aWVzfVxuICAgICAgICA+PC9uYW1lLWNvbmZpZy1mb3JtPlxuICAgICAgPC9kaXY+XG4gICAgPC9kZXRhaWxzPlxuICBgO1xuXG4gIGNvbnN0IGZvb3RlciA9IGh0bWxgXG4gICAgPGJ1dHRvbiBAY2xpY2s9JHttb2RhbFByb3BzLm9uQ2xvc2V9IGNsYXNzPVwic2Vjb25kYXJ5XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgQGNsaWNrPSR7KCkgPT4ge1xuICAgICAgICBzdWJtaXRTY3JhcGUoKTtcbiAgICAgICAgbW9kYWxQcm9wcy5vbkNsb3NlKCk7XG4gICAgICB9fVxuICAgICAgY2xhc3M9XCJwcmltYXJ5XCJcbiAgICAgID9kaXNhYmxlZD0keyFjYW5TdGFydFNjcmFwZX1cbiAgICA+XG4gICAgICBTdGFydCBTY3JhcGVcbiAgICA8L2J1dHRvbj5cbiAgYDtcblxuICByZXR1cm4gaHRtbGBcbiAgICA8Y2l2LW1vZGFsXG4gICAgICAudGl0bGU9JHtcIlVSTHMgdG8gU2NyYXBlXCJ9XG4gICAgICAuY29udGVudD0ke2NvbnRlbnR9XG4gICAgICAuZm9vdGVyPSR7Zm9vdGVyfVxuICAgICAgLm1vZGFsUHJvcHM9JHttb2RhbFByb3BzfVxuICAgID48L2Npdi1tb2RhbD5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICBcImNpdi1zY3JhcGUtbW9kYWxcIixcbiAgY29tcG9uZW50KFNjcmFwZU1vZGFsLCB7IHVzZVNoYWRvd0RPTTogZmFsc2UgfSksXG4pO1xuIiwiaW1wb3J0IHsgaHRtbCwgY29tcG9uZW50LCB1c2VTdGF0ZSB9IGZyb20gJ2hhdW50ZWQnO1xuXG5mdW5jdGlvbiBQZXJzb25DYXJkKHsgcGVyc29uLCBzZWxlY3RlZCA9IGZhbHNlLCBvblNlbGVjdCwgb25DaGFuZ2UsIG9uRGVsZXRlIH0pIHtcbiAgY29uc3QgW2lzU2VsZWN0ZWQsIHNldElzU2VsZWN0ZWRdID0gdXNlU3RhdGUoc2VsZWN0ZWQpO1xuICBjb25zdCBbZWRpdFBlcnNvbiwgc2V0RWRpdFBlcnNvbl0gPSB1c2VTdGF0ZSh7IC4uLnBlcnNvbiB9KTtcblxuICAvLyBIZWxwZXIgZm9yIGFycmF5IGZpZWxkc1xuICBjb25zdCBoYW5kbGVBcnJheUNoYW5nZSA9IChmaWVsZCwgaWR4LCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IGFyciA9IFsuLi4oZWRpdFBlcnNvbltmaWVsZF0gfHwgW10pXTtcbiAgICBhcnJbaWR4XSA9IHZhbHVlO1xuICAgIHNldEVkaXRQZXJzb24oeyAuLi5lZGl0UGVyc29uLCBbZmllbGRdOiBhcnIgfSk7XG4gICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh7IC4uLmVkaXRQZXJzb24sIFtmaWVsZF06IGFyciB9KTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlQXJyYXlBZGQgPSAoZmllbGQpID0+IHtcbiAgICBjb25zdCBhcnIgPSBbLi4uKGVkaXRQZXJzb25bZmllbGRdIHx8IFtdKV07XG4gICAgYXJyLnB1c2goJycpO1xuICAgIHNldEVkaXRQZXJzb24oeyAuLi5lZGl0UGVyc29uLCBbZmllbGRdOiBhcnIgfSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUFycmF5UmVtb3ZlID0gKGZpZWxkLCBpZHgpID0+IHtcbiAgICBjb25zdCBhcnIgPSBbLi4uKGVkaXRQZXJzb25bZmllbGRdIHx8IFtdKV07XG4gICAgYXJyLnNwbGljZShpZHgsIDEpO1xuICAgIHNldEVkaXRQZXJzb24oeyAuLi5lZGl0UGVyc29uLCBbZmllbGRdOiBhcnIgfSk7XG4gICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh7IC4uLmVkaXRQZXJzb24sIFtmaWVsZF06IGFyciB9KTtcbiAgfTtcblxuICAvLyBIZWxwZXIgZm9yIHNpbmdsZSBmaWVsZHNcbiAgY29uc3QgaGFuZGxlRmllbGRDaGFuZ2UgPSAoZmllbGQsIHZhbHVlKSA9PiB7XG4gICAgc2V0RWRpdFBlcnNvbih7IC4uLmVkaXRQZXJzb24sIFtmaWVsZF06IHZhbHVlIH0pO1xuICAgIGlmIChvbkNoYW5nZSkgb25DaGFuZ2UoeyAuLi5lZGl0UGVyc29uLCBbZmllbGRdOiB2YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDaGVja2JveENoYW5nZSA9IChlKSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBzZXRJc1NlbGVjdGVkKGUudGFyZ2V0LmNoZWNrZWQpO1xuICAgIGlmIChvblNlbGVjdCkgb25TZWxlY3QoZS50YXJnZXQuY2hlY2tlZCk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoZSkgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKG9uRGVsZXRlKSBvbkRlbGV0ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGltYWdlVXJsID0gZWRpdFBlcnNvbi5pbWFnZSB8fCBlZGl0UGVyc29uLmNkbl9pbWFnZSB8fCBudWxsO1xuXG4gIHJldHVybiBodG1sYFxuICAgIDxzdHlsZT5cbiAgICAgIC5wZXJzb24tY2FyZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAke2lzU2VsZWN0ZWQgPyAnIzAwNjZjYycgOiAnI2U1ZTdlYid9O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB9XG4gICAgICAucGVyc29uLWNhcmQ6aG92ZXIge1xuICAgICAgICBib3JkZXItY29sb3I6ICR7aXNTZWxlY3RlZCA/ICcjMDA1MmEzJyA6ICcjY2JkNWUxJ307XG4gICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8qIEhlYWRlciAqL1xuICAgICAgLmNhcmQtaGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTJweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmM2Y0ZjY7XG4gICAgICB9XG4gICAgICAuY2FyZC1jaGVja2JveCB7XG4gICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgfVxuICAgICAgLmNhcmQtYXZhdGFyIHtcbiAgICAgICAgd2lkdGg6IDQ4cHg7XG4gICAgICAgIGhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2YzZjRmNjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG4gICAgICAuY2FyZC1uYW1lLWlucHV0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzO1xuICAgICAgfVxuICAgICAgLmNhcmQtbmFtZS1pbnB1dDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlci1jb2xvcjogI2U1ZTdlYjtcbiAgICAgIH1cbiAgICAgIC5jYXJkLW5hbWUtaW5wdXQ6Zm9jdXMge1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjMDA2NmNjO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgfVxuICAgICAgXG5cbiAgICAgIC8qIEZvcm0gc2VjdGlvbnMgKi9cbiAgICAgIC5mb3JtLXNlY3Rpb24ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgfVxuICAgICAgLmZvcm0tc2VjdGlvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWxhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuXG4gICAgICAvKiBPZmZpY2UgYW5kIGRhdGVzIGdyaWQgKi9cbiAgICAgIC5vZmZpY2UtZ3JpZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmciAxZnI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuXG4gICAgICAvKiBJbnB1dCBzdHlsaW5nICovXG4gICAgICBpbnB1dFt0eXBlPVwidGV4dFwiXSxcbiAgICAgIGlucHV0W3R5cGU9XCJkYXRlXCJdLFxuICAgICAgaW5wdXRbdHlwZT1cInRlbFwiXSxcbiAgICAgIGlucHV0W3R5cGU9XCJlbWFpbFwiXSxcbiAgICAgIGlucHV0W3R5cGU9XCJ1cmxcIl0ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlNWU3ZWI7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cbiAgICAgIGlucHV0OmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjY2JkNWUxO1xuICAgICAgfVxuICAgICAgaW5wdXQ6Zm9jdXMge1xuICAgICAgICBib3JkZXItY29sb3I6ICMwMDY2Y2M7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDAsIDEwMiwgMjA0LCAwLjEpO1xuICAgICAgfVxuICAgICAgaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgICAgICAgY29sb3I6ICM5Y2EzYWY7XG4gICAgICB9XG5cbiAgICAgIC8qIEFycmF5IGl0ZW1zIChwaG9uZXMsIGVtYWlscywgZXRjKSAqL1xuICAgICAgLmFycmF5LWl0ZW1zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG4gICAgICAuYXJyYXktaXRlbSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsgLyogQ2hhbmdlZCBmcm9tIGNlbnRlciAqL1xuICAgICAgfVxuICAgICAgLmFycmF5LWl0ZW0gaW5wdXQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuICAgICAgLnJlbW92ZS1idG4ge1xuICAgICAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgaGVpZ2h0OiAzNHB4OyAvKiBNYXRjaCB0aGUgaW5wdXQgaGVpZ2h0ICg4cHggdG9wICsgOHB4IGJvdHRvbSBwYWRkaW5nICsgfjE4cHggbGluZSBoZWlnaHQpICovXG4gICAgICB9IFxuICAgICAgLnJlbW92ZS1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgICBib3JkZXItY29sb3I6ICNmZWNhY2E7XG4gICAgICAgIGNvbG9yOiAjZWY0NDQ0O1xuICAgICAgfVxuICAgICAgLmFkZC1idG4ge1xuICAgICAgICBwYWRkaW5nOiA4cHggMTJweDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCAjY2JkNWUxO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGNvbG9yOiAjNmI3MjgwO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG4gICAgICAuYWRkLWJ0bjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmOWZhZmI7XG4gICAgICAgIGJvcmRlci1jb2xvcjogIzAwNjZjYztcbiAgICAgICAgY29sb3I6ICMwMDY2Y2M7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cblxuICAgIDxhcnRpY2xlIGNsYXNzPVwicGVyc29uLWNhcmRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgIDwhLS0gSGVhZGVyIHdpdGggbmFtZSBhbmQgY29udHJvbHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPCEtLSBTcGxpdCBpbnRvIHR3byBjb2x1bW5zOiBjaGVja2JveCBvbiBsZWZ0LCBkZWxldGUgYnV0dG9uIG9uIHJpZ2h0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXItbGVmdFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1jaGVja2JveFwiXG4gICAgICAgICAgICAuY2hlY2tlZD0ke2lzU2VsZWN0ZWR9XG4gICAgICAgICAgICBAY2hhbmdlPSR7aGFuZGxlQ2hlY2tib3hDaGFuZ2V9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0ICR7ZWRpdFBlcnNvbi5uYW1lfVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlci1yaWdodFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIFxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZWxldGUtYnRuIGNvbnRyYXN0IG91dGxpbmVcIiB0aXRsZT1cIkRlbGV0ZSBwZXJzb25cIiBAY2xpY2s9JHtoYW5kbGVEZWxldGVDbGlja30+RGVsZXRlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOYW1lIGlucHV0IGFuZCBhdmF0YXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYXZhdGFyXCI+XG4gICAgICAgICAgJHtpbWFnZVVybFxuICAgICAgICAgICAgPyBodG1sYDxpbWcgc3JjPSR7aW1hZ2VVcmx9IGFsdD1cIkF2YXRhciBvZiAke2VkaXRQZXJzb24ubmFtZX1cIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7XCIgLz5gXG4gICAgICAgICAgICA6IGh0bWxgJHtlZGl0UGVyc29uLm5hbWUgPyBlZGl0UGVyc29uLm5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgOiAnPyd9YH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBjbGFzcz1cImNhcmQtbmFtZS1pbnB1dFwiXG4gICAgICAgICAgLnZhbHVlPSR7ZWRpdFBlcnNvbi5uYW1lIHx8ICcnfVxuICAgICAgICAgIEBpbnB1dD0ke2UgPT4gaGFuZGxlRmllbGRDaGFuZ2UoJ25hbWUnLCBlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJGdWxsIE5hbWVcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gT2ZmaWNlIGFuZCBkYXRlcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWN0aW9uLWxhYmVsXCI+T2ZmaWNlICYgVGVybTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9mZmljZS1ncmlkXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICB2YWx1ZT0ke2VkaXRQZXJzb24ub2ZmaWNlPy5uYW1lIHx8ICcnfVxuICAgICAgICAgICAgQGlucHV0PSR7ZSA9PiB7XG4gICAgICAgICAgICAgIHNldEVkaXRQZXJzb24oe1xuICAgICAgICAgICAgICAgIC4uLmVkaXRQZXJzb24sXG4gICAgICAgICAgICAgICAgb2ZmaWNlOiB7IC4uLihlZGl0UGVyc29uLm9mZmljZSB8fCB7fSksIG5hbWU6IGUudGFyZ2V0LnZhbHVlIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkgb25DaGFuZ2Uoe1xuICAgICAgICAgICAgICAgIC4uLmVkaXRQZXJzb24sXG4gICAgICAgICAgICAgICAgb2ZmaWNlOiB7IC4uLihlZGl0UGVyc29uLm9mZmljZSB8fCB7fSksIG5hbWU6IGUudGFyZ2V0LnZhbHVlIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPZmZpY2VcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXG4gICAgICAgICAgICB2YWx1ZT0ke2VkaXRQZXJzb24uc3RhcnRfZGF0ZSB8fCAnJ31cbiAgICAgICAgICAgIEBpbnB1dD0ke2UgPT4gaGFuZGxlRmllbGRDaGFuZ2UoJ3N0YXJ0X2RhdGUnLCBlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlN0YXJ0XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImRhdGVcIlxuICAgICAgICAgICAgdmFsdWU9JHtlZGl0UGVyc29uLmVuZF9kYXRlIHx8ICcnfVxuICAgICAgICAgICAgQGlucHV0PSR7ZSA9PiBoYW5kbGVGaWVsZENoYW5nZSgnZW5kX2RhdGUnLCBlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVuZFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaG9uZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1sYWJlbFwiPlBob25lIE51bWJlcnM8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnJheS1pdGVtc1wiPlxuICAgICAgICAgICR7KGVkaXRQZXJzb24ucGhvbmVzIHx8IFtdKS5tYXAoKHBob25lLCBpZHgpID0+IGh0bWxgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktaXRlbVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGVsXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT0ke3Bob25lfVxuICAgICAgICAgICAgICAgIEBpbnB1dD0ke2UgPT4gaGFuZGxlQXJyYXlDaGFuZ2UoJ3Bob25lcycsIGlkeCwgZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiKDU1NSkgMTIzLTQ1NjdcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtYnRuXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBoYW5kbGVBcnJheVJlbW92ZSgncGhvbmVzJywgaWR4KX1cbiAgICAgICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSBwaG9uZVwiXG4gICAgICAgICAgICAgID7inJU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGApfVxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnRuXCIgQGNsaWNrPSR7KCkgPT4gaGFuZGxlQXJyYXlBZGQoJ3Bob25lcycpfT4rIEFkZCBQaG9uZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVtYWlscyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWN0aW9uLWxhYmVsXCI+RW1haWwgQWRkcmVzc2VzPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktaXRlbXNcIj5cbiAgICAgICAgICAkeyhlZGl0UGVyc29uLmVtYWlscyB8fCBbXSkubWFwKChlbWFpbCwgaWR4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImVtYWlsXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT0ke2VtYWlsfVxuICAgICAgICAgICAgICAgIEBpbnB1dD0ke2UgPT4gaGFuZGxlQXJyYXlDaGFuZ2UoJ2VtYWlscycsIGlkeCwgZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZW1haWxAZXhhbXBsZS5jb21cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtYnRuXCJcbiAgICAgICAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBoYW5kbGVBcnJheVJlbW92ZSgnZW1haWxzJywgaWR4KX1cbiAgICAgICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSBlbWFpbFwiXG4gICAgICAgICAgICAgID7inJU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGApfVxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnRuXCIgQGNsaWNrPSR7KCkgPT4gaGFuZGxlQXJyYXlBZGQoJ2VtYWlscycpfT4rIEFkZCBFbWFpbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExpbmtzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tbGFiZWxcIj5MaW5rczwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWl0ZW1zXCI+XG4gICAgICAgICAgJHsoZWRpdFBlcnNvbi51cmxzIHx8IFtdKS5tYXAoKHVybCwgaWR4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9JHt1cmx9XG4gICAgICAgICAgICAgICAgQGlucHV0PSR7ZSA9PiBoYW5kbGVBcnJheUNoYW5nZSgndXJscycsIGlkeCwgZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IGhhbmRsZUFycmF5UmVtb3ZlKCd1cmxzJywgaWR4KX1cbiAgICAgICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSBsaW5rXCJcbiAgICAgICAgICAgICAgPuKclTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgYCl9XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFkZC1idG5cIiBAY2xpY2s9JHsoKSA9PiBoYW5kbGVBcnJheUFkZCgndXJscycpfT4rIEFkZCBMaW5rPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU291cmNlIFVSTHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VjdGlvbi1sYWJlbFwiPlNvdXJjZSBVUkxzPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktaXRlbXNcIj5cbiAgICAgICAgICAkeyhlZGl0UGVyc29uLnNvdXJjZV91cmxzIHx8IFtdKS5tYXAoKHVybCwgaWR4KSA9PiBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9JHt1cmx9XG4gICAgICAgICAgICAgICAgQGlucHV0PSR7ZSA9PiBoYW5kbGVBcnJheUNoYW5nZSgnc291cmNlX3VybHMnLCBpZHgsIGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc291cmNlLmNvbVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgIEBjbGljaz0keygpID0+IGhhbmRsZUFycmF5UmVtb3ZlKCdzb3VyY2VfdXJscycsIGlkeCl9XG4gICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgc291cmNlIFVSTFwiXG4gICAgICAgICAgICAgID7inJU8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGApfVxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhZGQtYnRuXCIgQGNsaWNrPSR7KCkgPT4gaGFuZGxlQXJyYXlBZGQoJ3NvdXJjZV91cmxzJyl9PisgQWRkIFNvdXJjZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXJ0aWNsZT5cbiAgYDtcbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdwZXJzb24tY2FyZCcsIGNvbXBvbmVudChQZXJzb25DYXJkLCB7IG9ic2VydmVkQXR0cmlidXRlczogWydwZXJzb24nXSwgdXNlU2hhZG93RE9NOiBmYWxzZSB9KSk7IiwiaW1wb3J0IHsgY29tcG9uZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VDYWxsYmFjayB9IGZyb20gXCJoYXVudGVkXCI7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSBcImxpdC1odG1sXCI7XG5pbXBvcnQgeyB1c2VTU0UgfSBmcm9tIFwiLi4vaG9va3MvdXNlU3NlLmpzXCI7IC8vIDwtLSBJbXBvcnQgdGhlIGhvb2tcbmltcG9ydCBcIi4uL3NjcmFwZS1oaXN0b3J5L3NjcmFwZS1oaXN0b3J5LWxpc3QuanNcIjtcbmltcG9ydCBcIi4uL2Jhc2ljL3BlcnNvbi1jYXJkLmpzXCI7IC8vIE1ha2Ugc3VyZSB0aGlzIGlzIGltcG9ydGVkXG5pbXBvcnQgXCIuLi9lZGl0YWJsZS1wZW9wbGUtbGlzdC5qc1wiO1xuY29uc3QgREVGQVVMVF9DRU5URVIgPSBcIjMwLjI0MTcxLC05MS45OTEwNDRcIjtcbmNvbnN0IEFQSV9VUkwgPSBfX0FQSV9VUkxfXztcblxuZnVuY3Rpb24gSnVyaXNkaWN0aW9uUGFnZSh7IFxuICBqdXJpc2RpY3Rpb25fb2NkaWQsIFxuICBoaXN0b3J5XG59KSB7XG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbcGVvcGxlLCBzZXRQZW9wbGVdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbcHVsbFJlcXVlc3RzLCBzZXRQdWxsUmVxdWVzdHNdID0gdXNlU3RhdGUoW10pOyAvLyA8LS0gQWRkIHN0YXRlXG4gIGNvbnN0IFtzY3JhcGVNb2RhbE9wZW4sIHNldFNjcmFwZU1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7IFxuICBjb25zdCBbcGVvcGxlTW9kZSwgc2V0UGVvcGxlTW9kZV0gPSB1c2VTdGF0ZShcInJlYWRcIik7IC8vIEFkZCBtb2RlIHN0YXRlXG4gIGNvbnNvbGUubG9nKFwiZGF0YVwiLCBkYXRhKTtcbiAgY29uc3QgaWRlbnRpdGllcyA9IHBlb3BsZT8ucmVkdWNlKChhY2MsIHBlcnNvbikgPT4ge1xuICAgIGlmIChhY2NbcGVyc29uLm5hbWVdKSB7XG4gICAgICBhY2NbcGVyc29uLm5hbWVdID0gWy4uLm5ldyBTZXQoWy4uLmFjY1twZXJzb24ubmFtZV0sIC4uLihwZXJzb24ub3RoZXJfbmFtZXMgfHwgW10pXSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2NbcGVyc29uLm5hbWVdID0gWy4uLm5ldyBTZXQocGVyc29uLm90aGVyX25hbWVzIHx8IFtdKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcblxuICB9LCB7fSk7XG5cbiAgY29uc29sZS5sb2coe3Blb3BsZSwgaWRlbnRpdGllc30pXG5cbiAgY29uc3Qgc3NlVXJsID0ganVyaXNkaWN0aW9uX29jZGlkXG4gICAgPyBbYCR7QVBJX1VSTH0vYXBpL3YxL3NzZS9qb2JzL3N0YXR1c2AsXG4gICAgICBgP2p1cmlzZGljdGlvbl9vY2RpZD0ke2VuY29kZVVSSUNvbXBvbmVudChqdXJpc2RpY3Rpb25fb2NkaWQpfWAsXG4gICAgICBgJmpvYl90eXBlPXBlb3BsZWBdLmpvaW4oXCJcIilcbiAgICA6IG51bGw7XG5cbiAgY29uc3Qge1xuICAgIGRhdGE6IGpvYlN0YXR1cyxcbiAgICBpc0Nvbm5lY3RlZCxcbiAgICBlcnJvcjogc3NlRXJyb3IsXG4gICAgLy8gY29ubmVjdDogY29ubmVjdFN0cmVhbSxcbiAgICAvLyBkaXNjb25uZWN0OiBkaXNjb25uZWN0U3RyZWFtLFxuICB9ID0gdXNlU1NFKHNzZVVybCwgeyBhdXRvQ29ubmVjdDogISFzc2VVcmwgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWp1cmlzZGljdGlvbl9vY2RpZCkgcmV0dXJuO1xuICAgIGZldGNoRGF0YSgpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgZmV0Y2hEYXRhID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtqdXJpc2RpY3Rpb25EYXRhLCBwZW9wbGVEYXRhXSA9XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoSnVyaXNkaWN0aW9uRGF0YShqdXJpc2RpY3Rpb25fb2NkaWQpLFxuICAgICAgICBmZXRjaFBlb3BsZURhdGEoanVyaXNkaWN0aW9uX29jZGlkKSxcbiAgICAgIF0pO1xuICAgIHNldERhdGEoanVyaXNkaWN0aW9uRGF0YSk7XG4gICAgc2V0UGVvcGxlKHBlb3BsZURhdGEpO1xuICB9O1xuXG4gIGNvbnN0IGZldGNoSnVyaXNkaWN0aW9uRGF0YSA9IGFzeW5jIChvY2RpZCkgPT4ge1xuICAgIGNvbnN0IGp1cmlzZGljdGlvbk9jZGlkRm9ybWF0dGVkID0gZW5jb2RlVVJJQ29tcG9uZW50KG9jZGlkKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgL2FwaS9hcGlfcHJveHkvanVyaXNkaWN0aW9ucz9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtqdXJpc2RpY3Rpb25PY2RpZEZvcm1hdHRlZH0md2l0aF9nZW9tPXRydWVgLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiByZXN1bHQuZGF0YSxcbiAgICAgIGdlb19jZW50ZXI6IHJlc3VsdC5nZW9fY2VudGVyLFxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZmV0Y2hQZW9wbGVEYXRhID0gYXN5bmMgKG9jZGlkKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZE9jZGlkID0gZW5jb2RlVVJJQ29tcG9uZW50KG9jZGlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYC9hcGkvYXBpX3Byb3h5L3Blb3BsZT9qdXJpc2RpY3Rpb25fb2NkaWQ9JHtlbmNvZGVkT2NkaWR9YCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2NyYXBlTW9kYWxDbGljayA9ICgpID0+IHNldFNjcmFwZU1vZGFsT3Blbih0cnVlKTtcbiAgY29uc3QgaGFuZGxlU2NyYXBlTW9kYWxDbG9zZSA9ICgpID0+IHNldFNjcmFwZU1vZGFsT3BlbihmYWxzZSk7XG5cbiAgY29uc3QgaGFuZGxlU2NyYXBlU3RhcnRDbGljayA9IGFzeW5jIChkZXRhaWxzKSA9PiB7XG4gICAgc2V0U2NyYXBlTW9kYWxPcGVuKGZhbHNlKTsgLy8gT3B0aW9uYWxseSBjbG9zZSBtb2RhbCBvbiBzdWJtaXRcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAganVyaXNkaWN0aW9uX29jZGlkOiBkYXRhLmRhdGEuaWQsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdXJsOiBkZXRhaWxzLmRhdGEudXJsIHx8IGRhdGEuZGF0YS51cmwsXG4gICAgICAgIG5hbWU6IGRhdGEuZGF0YS5uYW1lLFxuICAgICAgICBzb3VyY2VfdXJsczogZGV0YWlscy5kYXRhLnNvdXJjZVVybHMsXG4gICAgICAgIGlkZW50aXRpZXM6IGRldGFpbHMuZGF0YS5pZGVudGl0aWVzXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9waXBlbGluZXNgLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY2FuU3RhcnRTY3JhcGUgPSB0cnVlO1xuICBjb25zdCBzY3JhcGVTdGF0dXMgPSBkYXRhPy5kYXRhPy51cGRhdGVkX2F0ID8gYFNjcmFwZWRgIDogYFVuc2NyYXBlZGA7XG5cbiAgcmV0dXJuIGh0bWxgXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMnJlbTtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGNpdi1tYXBcbiAgICAgICAgICAgIGNhbm1vdmU9XCJmYWxzZVwiXG4gICAgICAgICAgICAubGF0bG5nPSR7ZGF0YSAmJiBkYXRhLmdlb19jZW50ZXJcbiAgICAgICAgICAgICAgPyB7IGxhdDogZGF0YS5nZW9fY2VudGVyLmxhdCwgbG5nOiBkYXRhLmdlb19jZW50ZXIubG5nIH1cbiAgICAgICAgICAgICAgOiBudWxsfVxuICAgICAgICAgID48L2Npdi1tYXA+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgJHtkYXRhXG4gICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPGhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGgyIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMFwiPiR7ZGF0YS5kYXRhLm5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuNzVyZW1cIlxuICAgICAgICAgICAgICAgICAgICAgID5TdGF0dXM6ICR7c2NyYXBlU3RhdHVzfTwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICAgICAgICA8aHIgLz5cblxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5KdXJpc2RpY3Rpb24gT0NESUQ6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLmlkfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+V2Vic2l0ZTo8L3N0cm9uZz4gJHtkYXRhLmRhdGEudXJsfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+R2VvaWQ6PC9zdHJvbmc+ICR7ZGF0YS5kYXRhLmdlb2lkfSA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxzdHJvbmc+UG9wdWxhdGlvbjo8L3N0cm9uZz4gJHtkYXRhLmRhdGEucG9wdWxhdGlvbi50b0xvY2FsZVN0cmluZygpfVxuICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICAgICAgPGgzPlNjcmFwZSBIaXN0b3J5PC9oMz5cbiAgICAgICAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICAgICAgICA8Y2l2LXNjcmFwZS1oaXN0b3J5LWxpc3RcbiAgICAgICAgICAgICAgICAgIC5oaXN0b3J5PSR7aGlzdG9yeX1cbiAgICAgICAgICAgICAgICAgIC5qb2JTdGF0dXM9JHtqb2JTdGF0dXN9XG4gICAgICAgICAgICAgICAgICAuaXNDb25uZWN0ZWQ9JHtpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIC5zc2VFcnJvcj0ke3NzZUVycm9yfVxuICAgICAgICAgICAgICAgID48L2Npdi1zY3JhcGUtaGlzdG9yeS1saXN0PlxuXG4gICAgICAgICAgICAgICAgPGNpdi1zY3JhcGUtbW9kYWxcbiAgICAgICAgICAgICAgICAgIC5vblN0YXJ0U2NyYXBlPSR7aGFuZGxlU2NyYXBlU3RhcnRDbGlja31cbiAgICAgICAgICAgICAgICAgIC51cmw9JHtkYXRhLmRhdGEudXJsfVxuICAgICAgICAgICAgICAgICAgLm1vZGFsUHJvcHM9JHt7XG4gICAgICAgICAgICAgICAgICAgIG9wZW46IHNjcmFwZU1vZGFsT3BlbixcbiAgICAgICAgICAgICAgICAgICAgb25DbG9zZTogaGFuZGxlU2NyYXBlTW9kYWxDbG9zZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkJhY2tkcm9wQ2xpY2s6IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgLmlkZW50aXRpZXM9JHtpZGVudGl0aWVzfVxuICAgICAgICAgICAgICAgID48L2Npdi1zY3JhcGUtbW9kYWw+IFxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7aGFuZGxlU2NyYXBlTW9kYWxDbGlja31cbiAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD0keyFjYW5TdGFydFNjcmFwZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgU2NyYXBlIERhdGEgZm9yIEp1cmlzZGljdGlvblxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICBgXG4gICAgICAgICAgICA6IGh0bWxgIDxwPkxvYWRpbmcganVyaXNkaWN0aW9uIGRhdGEuLi48L3A+IGB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxoMj5FbGVjdGVkIFJlcHJlc2VudGF0aXZlczwvaDI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxcmVtO1wiPlxuICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgIGNsYXNzPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICBAY2xpY2s9JHsoKSA9PiBzZXRQZW9wbGVNb2RlKHBlb3BsZU1vZGUgPT09IFwicmVhZFwiID8gXCJlZGl0XCIgOiBcInJlYWRcIil9XG4gICAgICAgICAgYXJpYS1wcmVzc2VkPSR7cGVvcGxlTW9kZSA9PT0gXCJlZGl0XCJ9XG4gICAgICAgID5cbiAgICAgICAgICAke3Blb3BsZU1vZGUgPT09IFwicmVhZFwiID8gXCJFZGl0XCIgOiBcIlJlYWRcIn1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxcmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQtY29sb3IpO1wiPlxuICAgICAgICAgIE1vZGU6ICR7cGVvcGxlTW9kZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHBlb3BsZU1vZGUuc2xpY2UoMSl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHtcbiAgICAgICAgcGVvcGxlTW9kZSA9PT0gXCJyZWFkXCJcbiAgICAgICAgICA/IGh0bWxgPGNpdi1wZW9wbGUtbGlzdCAubG9jYWw9JHtwZW9wbGV9PjwvY2l2LXBlb3BsZS1saXN0PmBcbiAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWRcIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNjBweCwgMWZyKSk7XG4gICAgICAgICAgICAgICAgICBnYXA6IDEuNXJlbTtcbiAgICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjaXYtZWRpdGFibGUtcGVvcGxlLWxpc3QganVyaXNkaWN0aW9uX29jZGlkPSR7anVyaXNkaWN0aW9uX29jZGlkfT48L2Npdi1lZGl0YWJsZS1wZW9wbGUtbGlzdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgXG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgXCJjaXYtanVyaXNkaWN0aW9uLXBhZ2VcIixcbiAgY29tcG9uZW50KEp1cmlzZGljdGlvblBhZ2UsIHtcbiAgICB1c2VTaGFkb3dET006IGZhbHNlLFxuICAgIG9ic2VydmVkQXR0cmlidXRlczogW1xuICAgICAgXCJqdXJpc2RpY3Rpb25fb2NkaWRcIiwgXG4gICAgICBcImhpc3RvcnlcIlxuICAgIF0sXG4gIH0pLFxuKTtcbiIsImltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZUNhbGxiYWNrIH0gZnJvbSBcImhhdW50ZWRcIjtcblxuLyoqXG4gKiB1c2VTU0UgLSBHZW5lcmFsaXplZCBTZXJ2ZXItU2VudCBFdmVudHMgaG9va1xuICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb259IGVuZHBvaW50IC0gU1NFIGVuZHBvaW50IFVSTCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBVUkxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWcgKGUuZy4sIGF1dG9Db25uZWN0KVxuICogQHJldHVybnMge29iamVjdH0geyBkYXRhLCBpc0Nvbm5lY3RlZCwgZXJyb3IsIGNvbm5lY3QsIGRpc2Nvbm5lY3QgfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU1NFKGVuZHBvaW50LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtpc0Nvbm5lY3RlZCwgc2V0SXNDb25uZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbZXZlbnRTb3VyY2UsIHNldEV2ZW50U291cmNlXSA9IHVzZVN0YXRlKG51bGwpO1xuXG4gIGNvbnN0IGdldFVybCA9IHVzZUNhbGxiYWNrKFxuICAgICgpID0+ICh0eXBlb2YgZW5kcG9pbnQgPT09IFwiZnVuY3Rpb25cIiA/IGVuZHBvaW50KCkgOiBlbmRwb2ludCksXG4gICAgW2VuZHBvaW50XVxuICApO1xuXG4gIGNvbnN0IGNvbm5lY3QgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGV2ZW50U291cmNlKSByZXR1cm47XG4gICAgY29uc3QgdXJsID0gZ2V0VXJsKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVzID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG4gICAgICBzZXRFdmVudFNvdXJjZShlcyk7XG4gICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgZXMub25vcGVuID0gKCkgPT4gc2V0SXNDb25uZWN0ZWQodHJ1ZSk7XG5cbiAgICAgIGVzLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldERhdGEoSlNPTi5wYXJzZShldmVudC5kYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBzZXRFcnJvcihcIkVycm9yIHBhcnNpbmcgU1NFIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBlcy5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNTRSBlcnJvcjpcIiwgZSk7XG4gICAgICAgIHNldElzQ29ubmVjdGVkKGZhbHNlKTtcbiAgICAgICAgc2V0RXJyb3IoXCJTU0UgY29ubmVjdGlvbiBlcnJvci5cIik7XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldEVycm9yKFwiRmFpbGVkIHRvIGluaXRpYWxpemUgU1NFLlwiKTtcbiAgICB9XG4gIH0sIFtldmVudFNvdXJjZSwgZ2V0VXJsXSk7XG5cbiAgY29uc3QgZGlzY29ubmVjdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBzZXRFdmVudFNvdXJjZShudWxsKTtcbiAgICAgIHNldElzQ29ubmVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtldmVudFNvdXJjZV0pO1xuXG4gIC8vIEF1dG8tY29ubmVjdCBpZiBvcHRpb25zLmF1dG9Db25uZWN0IGlzIHRydWVcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAob3B0aW9ucy5hdXRvQ29ubmVjdCkge1xuICAgICAgY29ubmVjdCgpO1xuICAgIH1cbiAgICAvLyBDbGVhbnVwIG9uIHVubW91bnRcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGV2ZW50U291cmNlKSBldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgIH07XG4gIH0sIFtvcHRpb25zLmF1dG9Db25uZWN0LCBjb25uZWN0LCBldmVudFNvdXJjZV0pO1xuXG4gIHJldHVybiB7IGRhdGEsIGlzQ29ubmVjdGVkLCBlcnJvciwgY29ubmVjdCwgZGlzY29ubmVjdCB9O1xufSIsImltcG9ydCBcIi4vaW5wdXRzL2luZGV4LmpzXCI7XG5pbXBvcnQgXCIuL3Blb3BsZS1saXN0LmpzXCJcbmltcG9ydCBcIi4vc2NyYXBlLWhpc3RvcnkvaW5kZXguanNcIlxuaW1wb3J0IFwiLi9zZWFyY2gtanVyaXNkaWN0aW9ucy9pbmRleC5qc1wiO1xuaW1wb3J0IFwiLi9qdXJpc2RpY3Rpb24tcGFnZS9pbmRleC5qc1wiO1xuXG5pbXBvcnQgeyByZWdpc3RlckNpdk1hcCB9IGZyb20gXCJAY29tcG9uZW50c1wiO1xucmVnaXN0ZXJDaXZNYXAoKTsiXSwibmFtZXMiOlsiZ2xvYmFsIiwiZ2xvYmFsVGhpcyIsImRlYnVnTG9nRXZlbnQiLCJldmVudCIsImVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsImRldGFpbCIsImlzc3VlV2FybmluZyIsImRlYnVnTG9nUmVuZGVySWQiLCJsaXRJc3N1ZWRXYXJuaW5ncyIsIlNldCIsImNvZGUiLCJ3YXJuaW5nIiwiaGFzIiwiY29uc29sZSIsIndhcm4iLCJhZGQiLCJxdWV1ZU1pY3JvdGFzayIsIndyYXAiLCJTaGFkeURPTSIsImluVXNlIiwibm9QYXRjaCIsIm5vZGUiLCJ0cnVzdGVkVHlwZXMiLCJwb2xpY3kiLCJjcmVhdGVQb2xpY3kiLCJjcmVhdGVIVE1MIiwicyIsInVuZGVmaW5lZCIsImlkZW50aXR5RnVuY3Rpb24iLCJ2YWx1ZSIsIm5vb3BTYW5pdGl6ZXIiLCJfbm9kZSIsIl9uYW1lIiwiX3R5cGUiLCJzZXRTYW5pdGl6ZXIiLCJuZXdTYW5pdGl6ZXIiLCJzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwiLCJFcnJvciIsIl90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZSIsImNyZWF0ZVNhbml0aXplciIsIm5hbWUiLCJ0eXBlIiwiYm91bmRBdHRyaWJ1dGVTdWZmaXgiLCJtYXJrZXIiLCJNYXRoIiwicmFuZG9tIiwidG9GaXhlZCIsInNsaWNlIiwibWFya2VyTWF0Y2giLCJub2RlTWFya2VyIiwiZCIsImRvY3VtZW50IiwiY3JlYXRlTWFya2VyIiwiY3JlYXRlQ29tbWVudCIsImlzUHJpbWl0aXZlIiwiaXNBcnJheSIsIkFycmF5IiwiU1BBQ0VfQ0hBUiIsInRleHRFbmRSZWdleCIsImNvbW1lbnRFbmRSZWdleCIsImNvbW1lbnQyRW5kUmVnZXgiLCJ0YWdFbmRSZWdleCIsIlJlZ0V4cCIsInNpbmdsZVF1b3RlQXR0ckVuZFJlZ2V4IiwiZG91YmxlUXVvdGVBdHRyRW5kUmVnZXgiLCJyYXdUZXh0RWxlbWVudCIsImh0bWwiLCJzdHJpbmdzIiwidmFsdWVzIiwic29tZSIsInZhbCIsIl8kbGl0VHlwZSQiLCJub0NoYW5nZSIsIlN5bWJvbCIsImZvciIsIm5vdGhpbmciLCJ0ZW1wbGF0ZUNhY2hlIiwiV2Vha01hcCIsIndhbGtlciIsImNyZWF0ZVRyZWVXYWxrZXIiLCJ0cnVzdEZyb21UZW1wbGF0ZVN0cmluZyIsInRzYSIsInN0cmluZ0Zyb21UU0EiLCJoYXNPd25Qcm9wZXJ0eSIsIm1lc3NhZ2UiLCJ0cmltIiwicmVwbGFjZSIsIlRlbXBsYXRlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGhpcyIsInBhcnRzIiwibm9kZUluZGV4IiwiYXR0ck5hbWVJbmRleCIsInBhcnRDb3VudCIsImxlbmd0aCIsImF0dHJOYW1lcyIsImwiLCJyYXdUZXh0RW5kUmVnZXgiLCJyZWdleCIsImkiLCJhdHRyTmFtZSIsIm1hdGNoIiwiYXR0ck5hbWVFbmRJbmRleCIsImxhc3RJbmRleCIsImV4ZWMiLCJ0ZXN0IiwiYXNzZXJ0IiwiZW5kIiwic3RhcnRzV2l0aCIsInB1c2giLCJnZXRUZW1wbGF0ZUh0bWwiLCJlbCIsImNyZWF0ZUVsZW1lbnQiLCJjdXJyZW50Tm9kZSIsImNvbnRlbnQiLCJ3cmFwcGVyIiwiZmlyc3RDaGlsZCIsInJlcGxhY2VXaXRoIiwiY2hpbGROb2RlcyIsIm5leHROb2RlIiwibm9kZVR5cGUiLCJ0YWciLCJsb2NhbE5hbWUiLCJpbm5lckhUTUwiLCJpbmNsdWRlcyIsIm0iLCJoYXNBdHRyaWJ1dGVzIiwiZ2V0QXR0cmlidXRlTmFtZXMiLCJlbmRzV2l0aCIsInJlYWxOYW1lIiwic3RhdGljcyIsImdldEF0dHJpYnV0ZSIsInNwbGl0IiwiaW5kZXgiLCJjdG9yIiwiUHJvcGVydHlQYXJ0IiwiQm9vbGVhbkF0dHJpYnV0ZVBhcnQiLCJFdmVudFBhcnQiLCJBdHRyaWJ1dGVQYXJ0IiwicmVtb3ZlQXR0cmlidXRlIiwidGFnTmFtZSIsInRleHRDb250ZW50IiwiZW1wdHlTY3JpcHQiLCJhcHBlbmQiLCJkYXRhIiwiaW5kZXhPZiIsImpvaW4iLCJraW5kIiwidGVtcGxhdGUiLCJjbG9uYWJsZVRlbXBsYXRlIiwiX29wdGlvbnMiLCJyZXNvbHZlRGlyZWN0aXZlIiwicGFydCIsInBhcmVudCIsImF0dHJpYnV0ZUluZGV4IiwiY3VycmVudERpcmVjdGl2ZSIsIl9fZGlyZWN0aXZlcyIsIl9fZGlyZWN0aXZlIiwibmV4dERpcmVjdGl2ZUNvbnN0cnVjdG9yIiwiXyRpbml0aWFsaXplIiwiXyRyZXNvbHZlIiwiVGVtcGxhdGVJbnN0YW5jZSIsIl8kcGFydHMiLCJfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4iLCJfJHRlbXBsYXRlIiwiXyRwYXJlbnQiLCJwYXJlbnROb2RlIiwiXyRpc0Nvbm5lY3RlZCIsIl9jbG9uZSIsImZyYWdtZW50IiwiY3JlYXRpb25TY29wZSIsImltcG9ydE5vZGUiLCJwYXJ0SW5kZXgiLCJ0ZW1wbGF0ZVBhcnQiLCJDaGlsZFBhcnQiLCJuZXh0U2libGluZyIsIkVsZW1lbnRQYXJ0IiwiX3VwZGF0ZSIsInZhbHVlSW5kZXgiLCJ0ZW1wbGF0ZUluc3RhbmNlIiwiXyRzZXRWYWx1ZSIsIl9faXNDb25uZWN0ZWQiLCJzdGFydE5vZGUiLCJlbmROb2RlIiwiXyRjb21taXR0ZWRWYWx1ZSIsIl8kc3RhcnROb2RlIiwiXyRlbmROb2RlIiwiaXNDb25uZWN0ZWQiLCJfdGV4dFNhbml0aXplciIsImRpcmVjdGl2ZVBhcmVudCIsInN0YXJ0IiwiXyRjbGVhciIsIl9jb21taXRUZXh0IiwiX2NvbW1pdFRlbXBsYXRlUmVzdWx0IiwiaG9zdCIsIl9jb21taXROb2RlIiwiaXRlcmF0b3IiLCJpc0l0ZXJhYmxlIiwiX2NvbW1pdEl0ZXJhYmxlIiwiX2luc2VydCIsImluc2VydEJlZm9yZSIsInBhcmVudE5vZGVOYW1lIiwibm9kZU5hbWUiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwicmVzdWx0IiwiXyRnZXRUZW1wbGF0ZSIsImgiLCJpbnN0YW5jZSIsImdldCIsInNldCIsIml0ZW1QYXJ0cyIsIml0ZW1QYXJ0IiwiaXRlbSIsImZyb20iLCJfJG5vdGlmeUNvbm5lY3Rpb25DaGFuZ2VkIiwibiIsInJlbW92ZSIsInNldENvbm5lY3RlZCIsImVsZW1lbnQiLCJmaWxsIiwiU3RyaW5nIiwiX3Nhbml0aXplciIsIm5vQ29tbWl0IiwiY2hhbmdlIiwidiIsIl9jb21taXRWYWx1ZSIsInNldEF0dHJpYnV0ZSIsInN1cGVyIiwiYXJndW1lbnRzIiwidG9nZ2xlQXR0cmlidXRlIiwibmV3TGlzdGVuZXIiLCJvbGRMaXN0ZW5lciIsInNob3VsZFJlbW92ZUxpc3RlbmVyIiwiY2FwdHVyZSIsIm9uY2UiLCJwYXNzaXZlIiwic2hvdWxkQWRkTGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImFkZExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJoYW5kbGVFdmVudCIsImNhbGwiLCJwb2x5ZmlsbFN1cHBvcnQiLCJsaXRIdG1sUG9seWZpbGxTdXBwb3J0RGV2TW9kZSIsImxpdEh0bWxWZXJzaW9ucyIsInJlbmRlciIsImNvbnRhaW5lciIsIlR5cGVFcnJvciIsInJlbmRlcklkIiwicGFydE93bmVyTm9kZSIsInJlbmRlckJlZm9yZSIsImlkIiwiY3VycmVudCIsImN1cnJlbnRJZCIsInNldEN1cnJlbnQiLCJzdGF0ZSIsImNsZWFyIiwicGhhc2VTeW1ib2wiLCJob29rU3ltYm9sIiwidXBkYXRlU3ltYm9sIiwiY29tbWl0U3ltYm9sIiwiZWZmZWN0c1N5bWJvbCIsImxheW91dEVmZmVjdHNTeW1ib2wiLCJjb250ZXh0RXZlbnQiLCJTdGF0ZSIsInVwZGF0ZSIsInZpcnR1YWwiLCJNYXAiLCJydW4iLCJjYiIsInJlcyIsIl9ydW5FZmZlY3RzIiwicGhhc2UiLCJlZmZlY3RzIiwiZWZmZWN0IiwicnVuRWZmZWN0cyIsInJ1bkxheW91dEVmZmVjdHMiLCJ0ZWFyZG93biIsImZvckVhY2giLCJob29rIiwiZGVmZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJiaW5kIiwicnVubmVyIiwidGFza3MiLCJydW5UYXNrcyIsInQiLCJsZW4iLCJ0YXNrIiwicmVhZCIsIndyaXRlIiwiQmFzZVNjaGVkdWxlciIsInJlbmRlcmVyIiwiX3VwZGF0ZVF1ZXVlZCIsImhhbmRsZVBoYXNlIiwiYXJnIiwiY29tbWl0IiwibWFrZUNvbXBvbmVudCIsIlNjaGVkdWxlciIsImZyYWciLCJiYXNlRWxlbWVudE9yT3B0aW9ucyIsIkJhc2VFbGVtZW50IiwiYmFzZUVsZW1lbnQiLCJIVE1MRWxlbWVudCIsIm9ic2VydmVkQXR0cmlidXRlcyIsInVzZVNoYWRvd0RPTSIsInNoYWRvd1Jvb3RJbml0IiwiRWxlbWVudCIsIl9zY2hlZHVsZXIiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwic2hhZG93Um9vdCIsImNvbm5lY3RlZENhbGxiYWNrIiwiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCJhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2siLCJvbGRWYWx1ZSIsIm5ld1ZhbHVlIiwiUmVmbGVjdCIsIl8iLCJjaGFyIiwidG9VcHBlckNhc2UiLCJ0b0NhbWVsQ2FzZSIsInByb3RvIiwiUHJveHkiLCJwcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsInRhcmdldCIsImtleSIsInJlY2VpdmVyIiwiZGVzYyIsIk9iamVjdCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImluaXRpYWxWYWx1ZSIsImlzU2V0dXAiLCJmcmVlemUiLCJyZWZsZWN0aXZlUHJvcCIsImRlZmluZVByb3BlcnR5Iiwic2V0UHJvdG90eXBlT2YiLCJIb29rIiwidXNlIiwiYXJncyIsImhvb2tzIiwiY3JlYXRlRWZmZWN0Iiwic2V0RWZmZWN0cyIsImNhbGxiYWNrIiwibGFzdFZhbHVlcyIsIl90ZWFyZG93biIsImlnbm9yZWQxIiwiaWdub3JlZDIiLCJoYXNDaGFuZ2VkIiwidXNlRWZmZWN0IiwidXNlQ29udGV4dCIsIkNvbnRleHQiLCJfcmFuRWZmZWN0IiwiX3Vuc3Vic2NyaWJlIiwiX3VwZGF0ZXIiLCJfc3Vic2NyaWJlIiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJjb21wb3NlZCIsInVuc3Vic2NyaWJlIiwiZGVmYXVsdFZhbHVlIiwidXNlTWVtbyIsImZuIiwidXNlQ2FsbGJhY2siLCJpbnB1dHMiLCJ1c2VTdGF0ZSIsInVwZGF0ZXIiLCJtYWtlQXJncyIsInByZXZpb3VzVmFsdWUiLCJpcyIsInJlZHVjZXIiLCJjdXJyZW50U3RhdGUiLCJpbml0aWFsU3RhdGUiLCJpbml0IiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJQYXJ0VHlwZSIsIkRpcmVjdGl2ZSIsIl9wYXJ0SW5mbyIsIl9fcGFydCIsIl9fYXR0cmlidXRlSW5kZXgiLCJwcm9wcyIsIl9wYXJ0Iiwic3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzIiwiU2hhZG93Um9vdCIsIlNoYWR5Q1NTIiwibmF0aXZlU2hhZG93IiwiRG9jdW1lbnQiLCJDU1NTdHlsZVNoZWV0IiwiY29uc3RydWN0aW9uVG9rZW4iLCJjc3NUYWdDYWNoZSIsIkNTU1Jlc3VsdCIsImNzc1RleHQiLCJzYWZlVG9rZW4iLCJfc3RyaW5ncyIsInN0eWxlU2hlZXQiLCJfc3R5bGVTaGVldCIsImNhY2hlYWJsZSIsInJlcGxhY2VTeW5jIiwidG9TdHJpbmciLCJjc3NSZXN1bHRGcm9tU3R5bGVTaGVldCIsInNoZWV0IiwicnVsZSIsImNzc1J1bGVzIiwiZ2V0Q29tcGF0aWJsZVN0eWxlIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSIsInJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydERldk1vZGUiLCJKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5IiwicHJvcCIsIl9vYmoiLCJkZWZhdWx0Q29udmVydGVyIiwidG9BdHRyaWJ1dGUiLCJCb29sZWFuIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21BdHRyaWJ1dGUiLCJmcm9tVmFsdWUiLCJOdW1iZXIiLCJwYXJzZSIsImUiLCJub3RFcXVhbCIsIm9sZCIsImRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uIiwiYXR0cmlidXRlIiwiY29udmVydGVyIiwicmVmbGVjdCIsInVzZURlZmF1bHQiLCJtZXRhZGF0YSIsImxpdFByb3BlcnR5TWV0YWRhdGEiLCJSZWFjdGl2ZUVsZW1lbnQiLCJhZGRJbml0aWFsaXplciIsImluaXRpYWxpemVyIiwiX19wcmVwYXJlIiwiX2luaXRpYWxpemVycyIsImZpbmFsaXplIiwiX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIiwia2V5cyIsImNyZWF0ZVByb3BlcnR5IiwiY3JlYXRlIiwid3JhcHBlZCIsImVsZW1lbnRQcm9wZXJ0aWVzIiwibm9BY2Nlc3NvciIsImRlc2NyaXB0b3IiLCJnZXRQcm9wZXJ0eURlc2NyaXB0b3IiLCJyZXF1ZXN0VXBkYXRlIiwiZ2V0UHJvcGVydHlPcHRpb25zIiwic3VwZXJDdG9yIiwiZmluYWxpemVkIiwicHJvcGVydGllcyIsInByb3BLZXlzIiwicCIsImF0dHIiLCJfX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSIsImVsZW1lbnRTdHlsZXMiLCJmaW5hbGl6ZVN0eWxlcyIsInN0eWxlcyIsImZsYXQiLCJJbmZpbml0eSIsInJldmVyc2UiLCJ1bnNoaWZ0IiwidG9Mb3dlckNhc2UiLCJfX2luc3RhbmNlUHJvcGVydGllcyIsImlzVXBkYXRlUGVuZGluZyIsImhhc1VwZGF0ZWQiLCJfX3JlZmxlY3RpbmdQcm9wZXJ0eSIsIl9faW5pdGlhbGl6ZSIsIl9fdXBkYXRlUHJvbWlzZSIsImVuYWJsZVVwZGF0aW5nIiwiXyRjaGFuZ2VkUHJvcGVydGllcyIsIl9fc2F2ZUluc3RhbmNlUHJvcGVydGllcyIsImFkZENvbnRyb2xsZXIiLCJjb250cm9sbGVyIiwiX19jb250cm9sbGVycyIsInJlbmRlclJvb3QiLCJob3N0Q29ubmVjdGVkIiwicmVtb3ZlQ29udHJvbGxlciIsImRlbGV0ZSIsImluc3RhbmNlUHJvcGVydGllcyIsInNpemUiLCJjcmVhdGVSZW5kZXJSb290Iiwic2hhZG93Um9vdE9wdGlvbnMiLCJhZG9wdGVkU3R5bGVTaGVldHMiLCJtYXAiLCJzdHlsZSIsIm5vbmNlIiwiYXBwZW5kQ2hpbGQiLCJhZG9wdFN0eWxlcyIsImMiLCJfcmVxdWVzdGVkVXBkYXRlIiwiaG9zdERpc2Nvbm5lY3RlZCIsIl9vbGQiLCJfJGF0dHJpYnV0ZVRvUHJvcGVydHkiLCJfX3Byb3BlcnR5VG9BdHRyaWJ1dGUiLCJhdHRyVmFsdWUiLCJlbmFibGVkV2FybmluZ3MiLCJwcm9wTmFtZSIsImNvbnZlcnRlZFZhbHVlIiwiX19kZWZhdWx0VmFsdWVzIiwiRXZlbnQiLCJoYXNBdHRyaWJ1dGUiLCJfJGNoYW5nZVByb3BlcnR5IiwiX19lbnF1ZXVlVXBkYXRlIiwiaW5pdGlhbGl6ZVZhbHVlIiwiX19yZWZsZWN0aW5nUHJvcGVydGllcyIsInJlamVjdCIsInNjaGVkdWxlVXBkYXRlIiwicGVyZm9ybVVwZGF0ZSIsInNoYWRvd2VkUHJvcGVydGllcyIsImZpbHRlciIsInNob3VsZFVwZGF0ZSIsImNoYW5nZWRQcm9wZXJ0aWVzIiwid2lsbFVwZGF0ZSIsImhvc3RVcGRhdGUiLCJfX21hcmtVcGRhdGVkIiwiXyRkaWRVcGRhdGUiLCJfY2hhbmdlZFByb3BlcnRpZXMiLCJob3N0VXBkYXRlZCIsImZpcnN0VXBkYXRlZCIsInVwZGF0ZWQiLCJ1cGRhdGVDb21wbGV0ZSIsImdldFVwZGF0ZUNvbXBsZXRlIiwiZW5zdXJlT3duV2FybmluZ3MiLCJlbmFibGVXYXJuaW5nIiwiZGlzYWJsZVdhcm5pbmciLCJzcGxpY2UiLCJyZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucyIsIkxpdEVsZW1lbnQiLCJyZW5kZXJPcHRpb25zIiwiX19jaGlsZFBhcnQiLCJsaXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQiLCJsaXRFbGVtZW50UG9seWZpbGxTdXBwb3J0RGV2TW9kZSIsImxpdEVsZW1lbnRWZXJzaW9ucyIsIndpbmRvdyIsIm5vdGlmeUNoaWxkcmVuQ29ubmVjdGVkQ2hhbmdlZCIsImNoaWxkcmVuIiwib2JqIiwicmVtb3ZlRGlzY29ubmVjdGFibGVGcm9tUGFyZW50IiwiYWRkRGlzY29ubmVjdGFibGVUb1BhcmVudCIsImluc3RhbGxEaXNjb25uZWN0QVBJIiwicmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCJuZXdQYXJlbnQiLCJub3RpZnlDaGlsZFBhcnRDb25uZWN0ZWRDaGFuZ2VkIiwiaXNDbGVhcmluZ1ZhbHVlIiwiZnJvbVBhcnRJbmRleCIsIl8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXMiLCJBc3luY0RpcmVjdGl2ZSIsImlzQ2xlYXJpbmdEaXJlY3RpdmUiLCJyZWNvbm5lY3RlZCIsImRpc2Nvbm5lY3RlZCIsInNldFZhbHVlIiwibmV3VmFsdWVzIiwiY29tcG9uZW50IiwiY3JlYXRlQ29udGV4dCIsIlByb3ZpZGVyIiwibGlzdGVuZXJzIiwiX3ZhbHVlIiwic3RvcFByb3BhZ2F0aW9uIiwiQ29uc3VtZXIiLCJtYWtlQ29udGV4dCIsImhhdW50ZWQiLCJsYXN0RWxlbWVudEZvckNvbnRleHRBbmRDYWxsYmFjayIsInJlZiIsIl9yZWYiLCJyZWZDaGFuZ2VkIiwiX3VwZGF0ZVJlZlZhbHVlIiwiX2xhc3RFbGVtZW50Rm9yUmVmIiwiX2VsZW1lbnQiLCJfY29udGV4dCIsImNvbnRleHQiLCJsYXN0RWxlbWVudEZvckNhbGxiYWNrIiwiXyRsaXREaXJlY3RpdmUkIiwiZ2VuS2V5Iiwic3Vic3RyIiwiRGF0ZSIsIm5vdyIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIiwiZGlzYWJsZWQiLCJvcHRpb25zTWV0YWRhdGEiLCJsYWJlbCIsImlucHV0VmFsdWUiLCJwYWdlU2l6ZSIsInNlbGVjdGVkSXRlbSIsInNldFNlbGVjdGVkSXRlbSIsImFjdGl2ZUluZGV4Iiwic2V0QWN0aXZlSW5kZXgiLCJpc0xpc3RPcGVuIiwic2V0SXNMaXN0T3BlbiIsImlucHV0RWxlbWVudCIsInNldElucHV0RWxlbWVudCIsImN1cnJlbnRQYWdlIiwic2V0Q3VycmVudFBhZ2UiLCJzY3JvbGxUb0FjdGl2ZUl0ZW0iLCJ0cmlnZ2VyUGFyZW50RmV0Y2giLCJpbnB1dCIsInBhZ2UiLCJxdWVyeSIsImRlYm91bmNlZEZldGNoIiwiZnVuYyIsImRlbGF5IiwidGltZW91dElkIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImFwcGx5IiwiZGVib3VuY2UiLCJzZWxlY3RJdGVtIiwiZm9jdXMiLCJoYXNQcmV2UGFnZSIsImxpbmtzIiwicHJldiIsImhhc05leHRQYWdlIiwibmV4dCIsImFjdGl2ZUl0ZW0iLCJxdWVyeVNlbGVjdG9yIiwic2Nyb2xsSW50b1ZpZXciLCJiZWhhdmlvciIsImJsb2NrIiwicHJldmVudERlZmF1bHQiLCJuZXdTdGF0ZSIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsInRvdGFsX2l0ZW1zIiwidG90YWxfcGFnZXMiLCJsb2NhbCIsInBlb3BsZSIsInBlcnNvbiIsImNkbl9pbWFnZSIsImltYWdlIiwib2ZmaWNlIiwiZGl2aXNpb25PY2RpZCIsImRpdmlzaW9uX29jZGlkIiwiaGFzU3ViZGl2aXNpb24iLCJnZXRTdWJkaXZpc2lvbkxhYmVsIiwic3ViRGl2aXNpb24iLCJlbWFpbHMiLCJwaG9uZXMiLCJ1cmxzIiwidGl0bGUiLCJmb290ZXIiLCJtb2RhbFByb3BzIiwib3BlbiIsInNldE9wZW4iLCJkaWFsb2dFbCIsImFyaWFMYWJlbCIsImNsb3NlT25CYWNrZHJvcENsaWNrIiwib25DbG9zZSIsIm1vZGFsUmVmIiwiam9iIiwiaXNOYU4iLCJnZXRNb250aCIsInBhZFN0YXJ0IiwiZ2V0RGF0ZSIsImdldEZ1bGxZZWFyIiwiZm10RGF0ZSIsImNyZWF0ZWRfYXQiLCJzdGF0dXMiLCJwcm9ncmVzcyIsInVwZGF0ZWRfYXQiLCJkdXJhdGlvbiIsImZsb29yIiwicm91bmQiLCJnZXREdXJhdGlvblN0cmluZyIsInNvdXJjZV91cmxzIiwidXJsIiwicmVxdWVzdF9pZCIsImhpc3RvcnkiLCJqb2JTdGF0dXMiLCJwYXJzZWRIaXN0b3J5IiwibW9kYWxPcGVuIiwic2V0TW9kYWxPcGVuIiwic2VsZWN0ZWRKb2IiLCJzZXRTZWxlY3RlZEpvYiIsInN0YXR1c0NsYXNzIiwib3BlbkZvciIsInN0YXRlcyIsInNldFN0YXRlcyIsImp1cmlzZGljdGlvbnMiLCJzZXRKdXJpc2RpY3Rpb25zIiwianVyaXNkaWN0aW9uc01ldGFkYXRhIiwic2V0SnVyaXNkaWN0aW9uc01ldGFkYXRhIiwic2VsZWN0ZWRTdGF0ZSIsInNldFNlbGVjdGVkU3RhdGUiLCJzZWxlY3RlZEp1cmlzZGljdGlvbiIsInNldFNlbGVjdGVkSnVyaXNkaWN0aW9uIiwianVyaXNkaWN0aW9uSW5wdXRWYWx1ZSIsInNldEp1cmlzZGljdGlvbklucHV0VmFsdWUiLCJpc0luaXRpYWxNb3VudCIsImhhbmRsZUlucHV0Q2hhbmdlIiwiZmV0Y2giLCJqc29uIiwiaGFuZGxlSnVyaXNkaWN0aW9uU3VnZ2VzdGlvbnMiLCJqdXJpc2RpY3Rpb25PY2RpZCIsImp1cmlzZGljdGlvbl9vY2RpZCIsImVuY29kZVVSSUNvbXBvbmVudCIsImxpbWl0IiwianVyIiwianVyaXNkaWN0aW9uX29jZGlkX3NsdWciLCJmaW5kIiwibG9jYXRpb24iLCJocmVmIiwianVyaXNkaWN0aW9uT2NkaWRGb3JtYXR0ZWQiLCJqdXJpc2RpY3Rpb25MaW5rIiwic2VsZWN0ZWRKdXJpc2RpY3Rpb25PY2RpZCIsInNldFNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWQiLCJzZXRQZW9wbGUiLCJnZW9qc29uIiwic2V0R2VvanNvbiIsInNlbGVjdGVkSnVyaXNkaWN0aW9uT2NkaWRFbmNvZGVkIiwicmVzcG9uc2UiLCJoYW5kbGVTZWxlY3RKdXJpc2RpY3Rpb25DaGFuZ2UiLCJsb2ciLCJsYXRsbmciLCJ6b29tIiwibGF0IiwibG5nIiwib25DaGFuZ2UiLCJwbGFjZWhvbGRlciIsImNoaXBzIiwic2V0Q2hpcHMiLCJjaGlwIiwiaGFuZGxlUmVtb3ZlIiwiaWR4IiwiZWxlbWVudHMiLCJpZGVudGl0aWVzIiwiY29uZmlncyIsInNldENvbmZpZ3MiLCJuZXdJZGVudGl0eSIsInNldE5ld0lkZW50aXR5IiwiaWRlbnRpdHkiLCJvblN0YXJ0U2NyYXBlIiwic291cmNlVXJscyIsInNjcmFwZVNjb3BlIiwic2V0U2NyYXBlU2NvcGUiLCJjdXJyZW50VXJsIiwic2V0Q3VycmVudFVybCIsImN1cnJlbnRTb3VyY2VVcmxzIiwic2V0Q3VycmVudFNvdXJjZVVybHMiLCJuYW1lQ29uZmlncyIsInNldE5hbWVDb25maWdzIiwiaGFuZGxlU2NvcGVDaGFuZ2UiLCJpc1ZhbGlkVXJsIiwidXJsU3RyaW5nIiwiVVJMIiwiY2FuU3RhcnRTY3JhcGUiLCJldmVyeSIsInVwZGF0ZWRVcmxzIiwiaGFuZGxlU291cmNlVXJsQ2hhbmdlIiwicmVtb3ZlU291cmNlVXJsIiwic3VibWl0U2NyYXBlIiwic2VsZWN0ZWQiLCJvblNlbGVjdCIsIm9uRGVsZXRlIiwiaXNTZWxlY3RlZCIsInNldElzU2VsZWN0ZWQiLCJlZGl0UGVyc29uIiwic2V0RWRpdFBlcnNvbiIsImhhbmRsZUFycmF5Q2hhbmdlIiwiZmllbGQiLCJhcnIiLCJoYW5kbGVBcnJheUFkZCIsImhhbmRsZUFycmF5UmVtb3ZlIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJpbWFnZVVybCIsImNoZWNrZWQiLCJjaGFyQXQiLCJzdGFydF9kYXRlIiwiZW5kX2RhdGUiLCJwaG9uZSIsImVtYWlsIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwic2V0U2VsZWN0ZWQiLCJyIiwid2l0aEtleXMiLCJfdGVtcEtleSIsImNhdGNoIiwicHJvbXB0IiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJuZXdQZXJzb24iLCJhbGVydCIsInNlbGVjdGVkUGVvcGxlIiwiZ2V0U2VsZWN0ZWRQZW9wbGUiLCJ0b2dnbGVTZWxlY3QiLCJzZWwiLCJ4IiwiaGFuZGxlRGVsZXRlIiwiY29uZmlybSIsInNldERhdGEiLCJwdWxsUmVxdWVzdHMiLCJzZXRQdWxsUmVxdWVzdHMiLCJzY3JhcGVNb2RhbE9wZW4iLCJzZXRTY3JhcGVNb2RhbE9wZW4iLCJwZW9wbGVNb2RlIiwic2V0UGVvcGxlTW9kZSIsInJlZHVjZSIsImFjYyIsIm90aGVyX25hbWVzIiwic3NlVXJsIiwic3NlRXJyb3IiLCJlbmRwb2ludCIsInNldElzQ29ubmVjdGVkIiwiZXZlbnRTb3VyY2UiLCJzZXRFdmVudFNvdXJjZSIsImdldFVybCIsImNvbm5lY3QiLCJlcyIsIkV2ZW50U291cmNlIiwib25vcGVuIiwib25tZXNzYWdlIiwib25lcnJvciIsImRpc2Nvbm5lY3QiLCJjbG9zZSIsImF1dG9Db25uZWN0IiwidXNlU1NFIiwiZmV0Y2hEYXRhIiwiYXN5bmMiLCJqdXJpc2RpY3Rpb25EYXRhIiwicGVvcGxlRGF0YSIsImFsbCIsImZldGNoSnVyaXNkaWN0aW9uRGF0YSIsImZldGNoUGVvcGxlRGF0YSIsIm9jZGlkIiwiZ2VvX2NlbnRlciIsImVuY29kZWRPY2RpZCIsInNjcmFwZVN0YXR1cyIsImdlb2lkIiwicG9wdWxhdGlvbiIsInRvTG9jYWxlU3RyaW5nIiwiZGV0YWlscyIsImNvbmZpZyIsInJlZ2lzdGVyQ2l2TWFwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFVQSxNQUFNQSxFQUFTQyxXQU1UQyxFQUNDQyxJQUNvQkgsRUFDZEksdUJBSUxKLEVBQU9LLGNBQWMsSUFBSUMsWUFBWSxZQUFhLENBQzlDQyxPQUFRSixNQU9wQixJQUNJSyxFQURBQyxFQUFtQixFQUduQlQsRUFBT1Usb0JBQXNCLElBQUlDLElBTWpDSCxFQUFlLENBQUNJLEVB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 diff --git a/civicpatch/src/frontend/components/basic/modal.js b/civicpatch/src/frontend/components/basic/modal.js index e626f7263..370469df9 100644 --- a/civicpatch/src/frontend/components/basic/modal.js +++ b/civicpatch/src/frontend/components/basic/modal.js @@ -44,6 +44,16 @@ function Modal({ }; return html` + { + const arr = [...(editPerson[field] || [])]; + arr[idx] = value; + setEditPerson({ ...editPerson, [field]: arr }); + if (onChange) onChange({ ...editPerson, [field]: arr }); + }; + const handleArrayAdd = (field) => { + const arr = [...(editPerson[field] || [])]; + arr.push(''); + setEditPerson({ ...editPerson, [field]: arr }); + }; + const handleArrayRemove = (field, idx) => { + const arr = [...(editPerson[field] || [])]; + arr.splice(idx, 1); + setEditPerson({ ...editPerson, [field]: arr }); + if (onChange) onChange({ ...editPerson, [field]: arr }); + }; + + // Helper for single fields + const handleFieldChange = (field, value) => { + setEditPerson({ ...editPerson, [field]: value }); + if (onChange) onChange({ ...editPerson, [field]: value }); + }; + + const handleCheckboxChange = (e) => { + e.stopPropagation(); + setIsSelected(e.target.checked); + if (onSelect) onSelect(e.target.checked); + }; + + const handleDeleteClick = (e) => { + e.stopPropagation(); + if (onDelete) onDelete(); + }; + + const imageUrl = editPerson.image || editPerson.cdn_image || null; + + return html` + + +
      + +
      + +
      + +
      +
      + + +
      + +
      + + +
      +
      + ${imageUrl + ? html`Avatar of ${editPerson.name}` + : html`${editPerson.name ? editPerson.name.charAt(0).toUpperCase() : '?'}`} +
      + handleFieldChange('name', e.target.value)} + placeholder="Full Name" + /> +
      + + +
      + +
      + { + setEditPerson({ + ...editPerson, + office: { ...(editPerson.office || {}), name: e.target.value } + }); + if (onChange) onChange({ + ...editPerson, + office: { ...(editPerson.office || {}), name: e.target.value } + }); + }} + placeholder="Office" + /> + handleFieldChange('start_date', e.target.value)} + placeholder="Start" + /> + handleFieldChange('end_date', e.target.value)} + placeholder="End" + /> +
      +
      + + +
      + +
      + ${(editPerson.phones || []).map((phone, idx) => html` +
      + handleArrayChange('phones', idx, e.target.value)} + placeholder="(555) 123-4567" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(editPerson.emails || []).map((email, idx) => html` +
      + handleArrayChange('emails', idx, e.target.value)} + placeholder="email@example.com" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(editPerson.urls || []).map((url, idx) => html` +
      + handleArrayChange('urls', idx, e.target.value)} + placeholder="https://example.com" + /> + +
      + `)} + +
      +
      + + +
      + +
      + ${(editPerson.source_urls || []).map((url, idx) => html` +
      + handleArrayChange('source_urls', idx, e.target.value)} + placeholder="https://source.com" + /> + +
      + `)} + +
      +
      +
      + `; +} + +customElements.define('person-card', component(PersonCard, { observedAttributes: ['person'], useShadowDOM: false })); \ No newline at end of file diff --git a/civicpatch/src/frontend/components/editable-people-list.js b/civicpatch/src/frontend/components/editable-people-list.js new file mode 100644 index 000000000..23c41c279 --- /dev/null +++ b/civicpatch/src/frontend/components/editable-people-list.js @@ -0,0 +1,126 @@ +import { html, component, useEffect, useState } from 'haunted'; +import './basic/person-card.js'; + +// Helper to generate a random key +function genKey() { + return Math.random().toString(36).substr(2, 9) + Date.now(); +} + +function EditablePeopleList({ jurisdiction_ocdid }) { + const [people, setPeople] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [selected, setSelected] = useState([]); + + useEffect(() => { + if (!jurisdiction_ocdid) return; + setLoading(true); + fetch(`/api/api_proxy/people?jurisdiction_ocdid=${encodeURIComponent(jurisdiction_ocdid)}`) + .then(r => r.json()) + .then(data => { + // Assign a temporary key to each person + const withKeys = (data.data || []).map(person => ({ + ...person, + _tempKey: genKey(), + })); + setPeople(withKeys); + setLoading(false); + }) + .catch(e => { + setError(e); + setLoading(false); + }); + }, [jurisdiction_ocdid]); + + function toggleSelect(key) { + console.log("toggling", key); + setSelected(sel => + sel.includes(key) ? sel.filter(x => x !== key) : [...sel, key] + ); + } + + function handleAddPerson() { + const name = prompt('Enter name for new person:'); + if (!name) return; + // Replace with your actual API call + fetch('/api/api_proxy/people', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, jurisdiction_ocdid }), + }) + .then(r => r.json()) + .then(newPerson => setPeople(p => [...p, { ...newPerson, _tempKey: genKey() }])) + .catch(e => alert('Failed to add person')); + } + + function handleDelete(key) { + if (!confirm('Delete this person?')) return; + setPeople(p => p.filter(person => person._tempKey !== key)); + // Optionally, call your API here if you can identify the person another way + } + + function handleMerge() { + const selectedPeople = getSelectedPeople(); + alert(`Merging people:\n${selectedPeople.map(p => p.name).join(', ')}`); + setSelected([]); + } + + // Example usage in handleBulkDelete: + function handleBulkDelete() { + if (!confirm(`Delete ${selected.length} people?`)) return; + setPeople(p => p.filter(person => !selected.includes(person._tempKey))); + setSelected([]); + } + + function selectActions() { + return html` +
      + + +
      + `; + } + + if (loading) return html`

      Loading people...

      `; + if (error) return html`

      Error loading people.

      `; + + return html` + +
      + + ${selected.length > 1 + ? html`` + : ''} +
      +
      + ${people.map( + person => html` + toggleSelect(person._tempKey)} + .onDelete=${() => handleDelete(person._tempKey)} + > + ` + )} +
      + `; +} + +customElements.define( + 'civ-editable-people-list', + component( + EditablePeopleList, { + useShadowDOM: false, observedAttributes: ['jurisdiction_ocdid'] + } + ) +); diff --git a/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js b/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js index e3af67a15..d28ad614f 100644 --- a/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js +++ b/civicpatch/src/frontend/components/jurisdiction-page/jurisdiction-page.js @@ -2,7 +2,8 @@ import { component, useEffect, useState, useCallback } from "haunted"; import { html } from "lit-html"; import { useSSE } from "../hooks/useSse.js"; // <-- Import the hook import "../scrape-history/scrape-history-list.js"; - +import "../basic/person-card.js"; // Make sure this is imported +import "../editable-people-list.js"; const DEFAULT_CENTER = "30.24171,-91.991044"; const API_URL = __API_URL__; @@ -12,7 +13,9 @@ function JurisdictionPage({ }) { const [data, setData] = useState(null); const [people, setPeople] = useState([]); + const [pullRequests, setPullRequests] = useState([]); // <-- Add state const [scrapeModalOpen, setScrapeModalOpen] = useState(false); + const [peopleMode, setPeopleMode] = useState("read"); // Add mode state console.log("data", data); const identities = people?.reduce((acc, person) => { if (acc[person.name]) { @@ -169,7 +172,36 @@ function JurisdictionPage({

      Elected Representatives

      - +
      + + + Mode: ${peopleMode.charAt(0).toUpperCase() + peopleMode.slice(1)} + +
      + ${ + peopleMode === "read" + ? html`` + : html` +
      + +
      + ` + } `; } diff --git a/civicpatch/src/frontend/components/scrape-history/index.js b/civicpatch/src/frontend/components/scrape-history/index.js index 1c3f4902a..d7d0f467d 100644 --- a/civicpatch/src/frontend/components/scrape-history/index.js +++ b/civicpatch/src/frontend/components/scrape-history/index.js @@ -1,2 +1 @@ -export * from './scrape-history-list.js'; -export * from './scrape-details.js'; \ No newline at end of file +export * from './scrape-history-list.js'; \ No newline at end of file diff --git a/civicpatch/src/frontend/components/scrape-history/scrape-details.js b/civicpatch/src/frontend/components/scrape-history/scrape-details.js deleted file mode 100644 index 707fa6fc5..000000000 --- a/civicpatch/src/frontend/components/scrape-history/scrape-details.js +++ /dev/null @@ -1,64 +0,0 @@ -import { component } from "haunted"; -import { html } from "lit-html"; - -const DummyScrapeJobInfo = { - created_at: "2024-06-01T12:00:00Z", - status: "Accepted", - duration_in_s: 360, - source_urls: ["https://example.com", "https://example.org"], -} - -function formatDuration(seconds) { - if (seconds == null) return ""; - const h = Math.floor(seconds / 3600); - const m = Math.floor((seconds % 3600) / 60); - const s = seconds % 60; - return [ - h ? `${h}h` : null, - m ? `${m}m` : null, - `${s}s` - ].filter(Boolean).join(" "); -} - -function ScrapeDetails({ detail = DummyScrapeJobInfo }) { - const createdAt = detail?.created_at ? new Date(detail.created_at) : null; - const formattedCreatedAt = createdAt ? createdAt.toLocaleString() : ""; - const duration = formatDuration(detail?.duration_in_s); - const urls = detail?.source_urls || []; - - return html` -
      - -
      - - - - - -
      - -
      -

      URLs scraped

      - ${urls.length - ? html`
        - ${urls.map( - u => html`
      • ${u}
      • ` - )} -
      ` - : html`

      No source URLs

      `} -
      - -
      - ` -} - -customElements.define('scrape-details', component(ScrapeDetails)); \ No newline at end of file diff --git a/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js b/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js index b72a05d97..c6804ec10 100644 --- a/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js +++ b/civicpatch/src/frontend/components/scrape-history/scrape-history-list.js @@ -1,6 +1,6 @@ -import { component, useState, useEffect } from "haunted"; +import { component, useState } from "haunted"; import { html } from "lit-html"; -import "../basic/modal.js"; +import "./scrape-history-modal.js"; const DUMMY_DATA = [ { id: 1, name: "Scrape Job 1", status: "Completed", start_date: "2024-01-01", duration_in_s: 120, @@ -61,21 +61,6 @@ function ScrapeHistoryList({ history, jobStatus }) { return `${minutes}m ${seconds}s`; } - const modalContent = selectedJob - ? html`
      -

      Date / Time: ${fmtDate(selectedJob.created_at)}

      -

      Status: ${selectedJob.status}

      -

      Progress: ${selectedJob.progress ?? "?"}%

      -

      Time to scrape: ${getDurationString(selectedJob.created_at, selectedJob.updated_at)}

      -

      URLs scraped:

      -
        - ${selectedJob.source_urls && selectedJob.source_urls.length > 0 - ? selectedJob.source_urls.map((url) => html`
      • ${url}
      • `) - : html`
      • No source URLs
      • `} -
      -
      ` - : null; - if (!parsedHistory || parsedHistory.length === 0) { return html`

      No scrape history available.

      `; } @@ -85,9 +70,9 @@ function ScrapeHistoryList({ history, jobStatus }) { ul.list { padding: 0; margin: 0; - max-height: 300px; /* Set your desired max height */ - overflow-y: auto; /* Enable vertical scrolling */ - padding-right: 1rem; /* Add space between scrollbar and content */ + max-height: 300px; + overflow-y: auto; + padding-right: 1rem; } ul li { list-style: none; margin: 0; } .item { padding: 0.5rem 0; } @@ -107,7 +92,6 @@ function ScrapeHistoryList({ history, jobStatus }) { const statusClass = job.status ? job.status.toLowerCase().replace(/\s+/g, "-") : ""; return html`
    • -
      + `} + .modalProps=${{ open, onClose, closeOnBackdropClick: true }} + > + `; +} + +customElements.define("civ-scrape-history-modal", component(ScrapeHistoryModal, { useShadowDOM: false })); \ No newline at end of file diff --git a/civicpatch/src/frontend/hooks/useRovingFocus.js b/civicpatch/src/frontend/hooks/useRovingFocus.js new file mode 100644 index 000000000..5a742ec42 --- /dev/null +++ b/civicpatch/src/frontend/hooks/useRovingFocus.js @@ -0,0 +1,28 @@ +import { useEffect, useRef } from 'haunted'; + +/** + * useRovingFocus - Keyboard navigation for a list/grid of focusable cards. + * @param {Object} options + * @param {Function} options.onArrow - Called with direction ('left'|'right'|'up'|'down') when arrow key pressed. + * @returns {Object} { ref } + */ +export function useRovingFocus({ onArrow } = {}) { + const ref = useRef(null); + + useEffect(() => { + const node = ref.current; + if (!node) return; + const handleKeyDown = (e) => { + if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key)) { + e.preventDefault(); + if (onArrow) { + onArrow(e.key.replace('Arrow', '').toLowerCase()); + } + } + }; + node.addEventListener('keydown', handleKeyDown); + return () => node.removeEventListener('keydown', handleKeyDown); + }, [onArrow]); + + return { ref }; +} \ No newline at end of file diff --git a/civicpatch/src/frontend/templates/pages/jurisdiction.html b/civicpatch/src/frontend/templates/pages/jurisdiction.html index 2778ef423..40e8e4234 100644 --- a/civicpatch/src/frontend/templates/pages/jurisdiction.html +++ b/civicpatch/src/frontend/templates/pages/jurisdiction.html @@ -3,6 +3,5 @@ {% endblock %} diff --git a/shared/utils/data_path_utils.py b/shared/utils/data_path_utils.py index e5683cd13..1c801ad8f 100644 --- a/shared/utils/data_path_utils.py +++ b/shared/utils/data_path_utils.py @@ -14,9 +14,6 @@ def get_data_path(): """ data_path = os.path.join(ROOT_DIR, "data") - if not os.path.exists(data_path): - raise FileNotFoundError(f"'data' directory not found at {data_path}") - return data_path